diff --git a/analysis/mars/io/common.py b/analysis/mars/io/common.py new file mode 100644 index 0000000..032f914 --- /dev/null +++ b/analysis/mars/io/common.py @@ -0,0 +1,89 @@ +""" +Class for performing command line arg parsing, tokenizing, etc. +""" + +__author__ = 'Vyassa Baratham ' + +import argparse +import os + +from mars import NSE_DATAROOT +from mars.io.tokenizer import Tokenizer +from mars.configs.block_directory import bl +from mars.io import NSENWB + +class MarsBaseArgParser(argparse.ArgumentParser): + def __init__(self, *args, **kwargs): + super(MarsBaseArgParser, self).__init__(*args, **kwargs) + + self.add_argument('--block', '--blockname', type=str, required=True, + help="Block whose configuration to use " + \ + "(see block_directory.py)") + self.add_argument('--nwb', type=str, required=False, default=None, + help="use this .nwb file instead of looking for one " + \ + "within the block directory. Required if not passing" + \ + "--droot") + self.add_argument('--droot', type=str, required=False, default=NSE_DATAROOT, + help="root data directory. Required if not passing --nwb") + + self._args = None + + @property + def args(self): + if not self._args: + self.parse_args() + return self._args + + def parse_args(self): + self._args = super(MarsBaseArgParser, self).parse_args() + return self._args + + def nwb_filename(self): + if self.args.nwb: + return self.args.nwb + + return os.path.join( + self.args.droot, + self.args.block.split('_')[0], + self.args.block, + '{}.nwb'.format(self.args.block) + ) + + def block_info(self): + return bl[self.args.block] + + def reader(self): + # return NWBReader(self.nwb_filename(), block_name=self.args.block) + return NSENWB.from_existing_nwb(self.args.block, self.nwb_filename()) + + def tokenizer(self): + # TODO: Load the right one based on block directory (when we put that info there) + return Tokenizer(self.reader()) + + +class MarsArgParser(MarsBaseArgParser): + def __init__(self, *args, **kwargs): + super(MarsArgParser, self).__init__(*args, **kwargs) + + self.add_argument('--device', type=str, required=True, + help="eg 'Poly' or 'ECoG'") + + +class MarsProcessedArgParser(MarsArgParser): + def __init__(self, *args, **kwargs): + super(MarsProcessedArgParser, self).__init__(*args, **kwargs) + + self.add_argument('--processed', type=str, required=False, default='Hilb_54bands', + help="which preprocessed data to use, " + \ + "eg. 'Wvlt_4to1200_54band_CAR1' (must be a key " + \ + "in processing/preprocessed/ in the .nwb file)") + +# class MarsRawArgParser(MarsArgParser): +# def __init__(self, *args, **kwargs): +# super(MarsArgParser, self).__init__(*args, **kwargs) + +# self.add_argument('--raw', type=str, required=True, +# help="which raw data to use, " + \ +# "eg. 'Wvlt_4to1200_54band_CAR1' (must be a key " + \ +# "in acquisition/Raw/ in the .nwb file)") + diff --git a/analysis/mars/io/nsenwb.py b/analysis/mars/io/nsenwb.py new file mode 100644 index 0000000..4f85de1 --- /dev/null +++ b/analysis/mars/io/nsenwb.py @@ -0,0 +1,499 @@ +""" +Write NSE Lab rodent electrophysiological response recordings to NWB +""" + +__author__ = 'Max Dougherty 1: + raise ValueError("Choose one time index method only") + + if time_idx: + time_idx = time_idx + elif time_range: + time_idx = self._index_for_time_range(time_range, dset.rate, dset.starting_time) + elif trial_query: + time_idx = self._index_for_trials(dset.rate, trial_query, pre_dur, post_dur) + else: + time_idx = slice(None) + + + # INDEX BY CHANNELS: + if dset_channels and device_channels: + raise ValueError("Choose one channel index method only") + + if dset_channels is not None: + ch_idx = dset_channels + elif device_channels is not None: + ch_idx = self._index_for_device_channels(dset, device_channels) + else: + ch_idx = slice(None) + + if dset.data.ndim < 2: + return dset.data[time_idx] + + # Prepare to zscore: + if zscore: + bl_data = np.concatenate( + list(self.index_dset(dset, dset_channels=ch_idx, trial_query="sb == 'b'")), + axis=0 + ) + bl_mean = np.mean(bl_data, axis=0) + bl_std = np.std(bl_data, axis=0) + maybe_zscore = lambda x: (x - bl_mean) / bl_std + else: + maybe_zscore = lambda x: x + + if isinstance(time_idx, types.GeneratorType): + def _iter(): + for t_idx in time_idx: + yield maybe_zscore(np.atleast_2d(dset.data[t_idx, ch_idx, ...])) + return _iter() + else: + return maybe_zscore(np.atleast_2d(dset.data[time_idx, ch_idx, ...])) + + @classmethod + def _index_for_time_range(cls, time_range, rate, starting_time=0.0): + # TODO: Allow for selecting multiple timeranges + start = int(np.round((time_range[0]-starting_time) * rate)) + stop = int(np.round((time_range[1]-starting_time) * rate)) + return slice(start, stop) + + @classmethod + def _index_for_device_channels(cls, dset, channels): + device = dset.name # TODO: is dset.name always the device name? + try: + # processed dset + electrodes_df = dset.source_timeseries.electrodes.table.to_dataframe().query('group_name == @device') + except AttributeError: + # raw dset + electrodes_df = dset.electrodes.table.to_dataframe().query('group_name == @device') + chs = {elec.location: i for i, elec in enumerate(electrodes_df.itertuples())} + return [chs[str(chnum)] for chnum in channels] + + def _index_for_trials(self, rate, trial_query=None, pre_dur=0.0, post_dur=0.0): + # Returns a generator + table = self.nwb.trials.to_dataframe() + if trial_query: + table = table.query(trial_query) + + for s in table.itertuples(): + yield self._index_for_time_range((s.start_time-pre_dur, s.stop_time+post_dur), rate) + + # def electrode_order(self, device_name, device_channels, axis='z'): + # # Get the channel order + # device_raw = self.read_raw(device_name) #TODO: Can we read electrodes without needing to go through a dataset? + # channel_positions = [] + # for ch in device_channels: + # query = 'group_name == "%s" & location == "%s"'%(device_name,ch) + # channel_positions.append(float(device_raw.electrodes.table.to_dataframe().query(query)[axis])) + # channel_positions = np.array(channel_positions) + # channel_order = np.arange(len(device_channels))[np.argsort(channel_positions)] + # return channel_order, np.sort(channel_positions) + + def has_analysis_dataset(self,device_path,device_name,dataset_name): + # Check if NWB analysis dataset exists + carr_path = path.join(self.nwb_directory,self.block_name+'.h5') + dset_path = device_path + '/' + device_name + '/' + dataset_name + if not path.exists(carr_path): + return False + with h5py.File(carr_path,'r') as f: + if not dset_path in f: + return False + return True + + def read_analysis_dataset(self,device_path,device_name,dataset_name): + # Read an NWB analysis dataset + carr_path = path.join(self.nwb_directory,self.block_name+'.h5') + dset_path = device_path + '/' + device_name + '/' + dataset_name + if not path.exists(carr_path): + return False + with h5py.File(carr_path,'r') as f: + if not dset_path in f: + return False + data = np.array(f[dset_path]) + return data + + # These functions are much less capable than index_dset() but are here for backwards compatibility + def read_trials(self, dset, pre_dur=0.0, post_dur=0.0, trial_query=None): + """ + Read data associated with a particular stimulus + """ + return self.index_dset(dset, trial_query=trial_query, pre_dur=pre_dur, post_dur=post_dur) + + def index_by_device_channels(self, dset, channels, timerange=None): + """ + dset - nwb Timeseries object + channels - device-defined channel numbers + """ + return self.index_dset(dset, device_channels=channels, time_range=timerange) + + ################### + ## OTHER METHODS ## + ################### + def device_channels(self, device, remove_bad=False): + """ + Return the device channel IDs. + """ + elec = self.nwb.electrodes + device_idx = elec['group_name'].data[:] == device + device_chs = elec['location'].data[device_idx] + if remove_bad: + bad_chs = np.array(self.block_params['bad_chs'][device]).astype('str') + device_chs = np.array([c for c in device_chs if not c in bad_chs]) + return device_chs + + def channel_positions(self, device, remove_bad=False): + """ + Return an 3 column array containing the x,y,z positions of each electrode in device + """ + elec = self.nwb.electrodes + device_idx = elec['group_name'].data[:] == device + device_chs = elec['location'].data[device_idx] + return np.array([elec['x'].data[device_idx], + elec['y'].data[device_idx], + elec['z'].data[device_idx]]) + + def ordered_channels(self, device='Poly', reverse=False): + """ + Return a list of device channel IDs (starting from 1) and dset indexes (starting from 0), + sorted by z coordinate. + Also return the corresponding z coordinates + """ + elec = self.nwb.electrodes + device_idx = elec['group_name'].data[:] == device + z = elec['z'].data[device_idx] + ch_ids = np.array([int(ch) for ch in elec['location'].data[device_idx]]) + + sort_idx = np.argsort(z) # in mars, z coordinates are positive + if reverse: + return ch_ids[sort_idx][::-1], sort_idx[::-1], np.sort(z)[::-1] + else: + return ch_ids[sort_idx], sort_idx, np.sort(z) + + def write(self, save_path=None, time=False): + tstart = datetime.now() + self.io = NWBHDF5IO(save_path, 'w') if save_path else self.io + self.io.write(self.nwb) + if time: + print('Write time for {}: {}s'.format(self.block_name,datetime.now()-tstart)) + + def close(self): + # check for self.io without throwing error + if getattr(self, 'io'): + self.io.close() + + diff --git a/analysis/mars/preprocess.py b/analysis/mars/preprocess.py new file mode 100755 index 0000000..8dd2f33 --- /dev/null +++ b/analysis/mars/preprocess.py @@ -0,0 +1,365 @@ +#!/usr/bin/env python +from __future__ import print_function + +import argparse +import h5py +import time +import sys +import os +import logging + +import numpy as np + +from hdmf.data_utils import AbstractDataChunkIterator, DataChunk + +try: + from tqdm import tqdm +except: + def tqdm(x, *args, **kwargs): + return x + +from mars.signal_processing import resample +from mars.signal_processing import subtract_CAR +from mars.signal_processing import linenoise_notch +from mars.signal_processing import hilbert_transform +from mars.signal_processing import gaussian +from mars.utils import bands +from mars.wn import mua_signal, mua_rate +from mars.io import NSENWB + +log = logging.getLogger('mars_preprocess') +log.setLevel(logging.DEBUG) +formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') +ch = logging.StreamHandler(stream=sys.stdout) +ch.setFormatter(formatter) +ch.setLevel(logging.DEBUG) +log.addHandler(ch) + + +def _get_cfs(_cfs): + # Default: use precomputed wavelet cfs + if _cfs is None: + return bands.wavelet['cfs'] + + # Case 1: use precomputed cfs for Chang Lab or wavelet + if _cfs[0].lower() in ('chang', 'changlab'): + return bands.chang_lab['cfs'] + elif _cfs[0].lower() in ('wavelet', 'wave', 'wvlt'): + return bands.wavelet['cfs'] + + # Case 2: call to a function in bands.py + elif _cfs[0].lower() in ('log', 'logspace', 'logspaced'): + return bands.log_spaced_cfs(*[float(arg) for arg in _cfs[1:]]) + + # Case 3: list of numbers + else: + return np.array([float(cf) for cf in _cfs]) + + +def _get_sds(cfs, _sds): + # Default: use precomputed wavelet cfs + if _sds is None: + return bands.wavelet['sds'] + + # Case 1: use precomputed sds for Chang Lab or wavelet + if _sds[0].lower() in ('chang', 'changlab'): + return bands.chang_lab['sds'] + elif _sds[0].lower() in ('wavelet', 'wave', 'wvlt'): + return bands.wavelet['sds'] + + # Case 2: Call to a function in bands.py + elif _sds[0] in ('q', 'constq', 'cqt'): + return bands.const_Q_sds(cfs, *[float(arg) for arg in _sds[1:]]) + elif _sds[0] in ('sqrt', 'scaledsqrt'): + return bands.scaled_sqrt_sds(cfs, *[float(arg) for arg in _sds[1:]]) + + # Case 3: list of numbers + else: + return np.array([float(sd) for sd in _sds]) + + +def __resample(X, new_freq, old_freq, axis=-1): + assert new_freq < old_freq + n_timepts, n_ch = X.shape + if not np.allclose(new_freq, old_freq): + for ch in range(n_ch): + ch_X = X[:, ch] + yield resample(ch_X, new_freq, old_freq, axis=axis) + log.info("resampled channel {} of {}".format(ch+1, n_ch)) + +def _resample(X, new_freq, old_freq, axis=-1): + return np.stack(__resample(X, new_freq, old_freq, axis=-1)).T + +# def _resample_iterator(X, new_freq, old_freq, axis=-1): +# assert new_freq < old_freq +# n_timepts, n_ch = X.shape +# if not np.allclose(new_freq, old_freq): +# for ch in range(n_ch): +# ch_X = X[:, ch] +# yield DataChunk(data=resample(ch_x, new_freq, old_freq, axis=axis), +# selection=np.s_[:, ch]) + +class MyDataChunkIterator(AbstractDataChunkIterator): + def __init__(self, it, dtype, n_ch, n_bands, approx_timepts=200000): + self.it = it + self._dtype = dtype + self._maxshape = (None, n_ch, n_bands) + self._approx_timepts = approx_timepts + self._chunkshape = self._approx_timepts, 1, 1 + self._n_bands = n_bands + self._i = 0 + + def __iter__(self): + return self + + def __next__(self): + data = next(self.it) + ch = self._i / self._n_bands + band = self._i % self._n_bands + self._i += 1 + + return DataChunk(data=data, selection=np.s_[:data.shape[0], ch, band]) + + next = __next__ + + @property + def dtype(self): + return self._dtype + + @property + def maxshape(self): + return self._maxshape + + def recommended_chunk_shape(self): + return self._chunkshape + + def recommended_data_shape(self): + return (self._approx_timepts, self.maxshape[1], self.maxshape[2]) + +def _notch_filter(X, rate): + return linenoise_notch(X, rate) + +def _subtract_CAR(X): + subtract_CAR(X) + return X + +def _hilbert_onech(ch_X, rate, cfs, sds, final_resample): + """ + Hilbert transform one channel, band by band + First resample already performed. Rate == first_resample + """ + for i, (cf, sd) in enumerate(zip(cfs, sds)): + kernel = gaussian(ch_X, rate, cf, sd) + transform = np.abs(hilbert_transform(ch_X, rate, kernel)) + final_data = resample(transform, final_resample, rate) + log.info("done band {}".format(i)) + yield np.squeeze(final_data) + # yield DataChunk(data=final_data, selection=np.s_[:, ch, i]) + +def _hilbert_iterator(X, rate, cfs, sds, first_resample, final_resample): + n_timepts, n_ch = X.shape + for ch in range(n_ch): + # ch_X = resample(np.atleast_2d(X[:, ch]).T, first_resample, rate).T + ch_X = np.atleast_2d(resample(np.squeeze(X[:, ch]), first_resample, rate)) # HACK + yield np.stack(_hilbert_onech(ch_X, first_resample, cfs, sds, final_resample), axis=-1) + log.info("done Hilbert on channel {} of {}".format(ch+1, n_ch)) + +def _hilbert_one_by_one(X, rate, cfs, sds, first_resample, final_resample): + n_timepts, n_ch = X.shape + for ch in range(n_ch): + ch_X = _resample(np.atleast_2d(X[:, ch]).T, first_resample, rate).T + for one_band_done in _hilbert_onech(ch_X, first_resample, cfs, sds, final_resample): + yield one_band_done + log.info("done Hilbert on channel {} of {}".format(ch+1, n_ch)) + +def _hilbert_transform(X, rate, cfs, sds, first_resample, final_resample): + n_timepts, n_ch = X.shape + approx_timepts_final = float(n_timepts) * final_resample / rate + # final = None #np.zeros(shape=(n_timepts, n_ch, len(cfs)), dtype=np.float32) + # for datachunk in _hilbert_iterator(X, rate, cfs, sds, final_resample=final_resample): + # import ipdb; ipdb.set_trace() + # if final is None: + # pass + # final[datachunk.selection] = datachunk.data + + + # return np.stack(_hilbert_iterator(X, rate, cfs, sds, first_resample, final_resample), axis=1) + it = _hilbert_one_by_one(X, rate, cfs, sds, first_resample, final_resample) + return MyDataChunkIterator(it, X.dtype, n_ch, 54, approx_timepts=approx_timepts_final) + # return DataChunkIterator(data=it, maxshape=(None, n_ch, 54), dtype=np.dtype(float)) + + # x = np.stack(_hilbert_iterator(X, rate, cfs, sds, first_resample, final_resample), axis=-1) + # return x + +def _mua(X_raw, fs, lowcut, highcut, order): + mua = mua_signal(X_raw[:], fs, lowcut, highcut, order) + return mua, mua_rate(mua, fs) + +def _write_data(nsenwb, outfile, device, rate, raw_rate, X, Y, mua, mua_rate, decomp_type, cfs, sds, postfix): + def postfixed(s): + return '{}_{}'.format(s, postfix) if postfix else s + + nsenwb.add_proc(X, device, postfixed(device), rate) + nsenwb.add_proc(Y, device, postfixed('Hilb_54bands'), rate, cfs=cfs, sds=sds) + nsenwb.add_proc(mua, device, postfixed('tMUA'), raw_rate) + nsenwb.add_proc(mua_rate, device, postfixed('tMUA_rate'), rate) + + if outfile and os.path.exists(outfile): + os.remove(outfile) + nsenwb.write(save_path=outfile) + nsenwb.close() + + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Preprocessing ecog data from nwb.') + parser.add_argument('datafile', type=str, help="Input .nwb file") + parser.add_argument('--outfile', type=str, default=None, + help="Output file. Default = write to input file") + parser.add_argument('--block', type=str, required=True) + parser.add_argument('--device', '--device-name', type=str, default='ECoG') + parser.add_argument('--acquisition', '--acq', type=str, default='Raw') + parser.add_argument('--first-resample', type=float, default=None, + help='Resample data to this rate before processing. ' + + 'Omit to skip resampling before processing.') + parser.add_argument('--final-resample', type=float, default=400., + help='Resample data to this rate after processing. ' + + 'Omit to skip resampling after processing.') + parser.add_argument('--cfs', type=str, nargs='+', default=None, + help="Center frequency of the Gaussian filter. " + +""" +Must be one of the following: +1.) The name of a precomputed set of filters (choices: 'changlab', 'wavelet') +2.) The name of a function (choices: 'logspaced') followed by + args to that function (usually fmin, fmax, but see bands.py) +3.) A list of floats specifying the center frequencies +Default = precomputed wavelet 4-1200hz cfs +eg. to use the precomputed Chang lab filters, use `--cfs changlab` +eg. to use log spaced frequencies from 10-200hz, use `--cfs logspaced 10 200` +eg. to use your own list of center frequencies, use `--cfs 2 4 8 16 [...]` +""" + ) + parser.add_argument('--sds', type=str, nargs='+', default=None, + help="Standard deviation of the Gaussian filter. " + +""" +Must be one of the following: +1.) The name of a precomputed set of filters (choices: 'changlab', 'wavelet') +2.) The name of a function (choices: 'constq', 'scaledsqrt') followed by + args to that function (q-factor, or scale, etc. See bands.py) +3.) A list of floats specifying the center frequencies +Default = precomputed wavelet 4-1200hz sds +eg. to use the precomputed Chang lab filters, use `--sds changlab` +eg. to use constant Q filters with Q=4, use `--sds constq 4` +eg. to use constant filter widths of 10hz, use `--sds 10 10 10 10 [...]` +""" + ) + parser.add_argument('--no-notch', default=False, action='store_true', + help="Do not perform notch filtering") + parser.add_argument('--no-car', default=False, action='store_true', + help="Do not perform common avg reference subtraction") + parser.add_argument('--decomp-type', type=str, default='hilbert', + choices=['hilbert', 'hil'], + help="frequency decomposition method") + parser.add_argument('--no-magnitude', default=False, action='store_true', + help="Do not take the magnitude of the frequency decomp") + parser.add_argument('--no-mua', default=False, action='store_true', + help="Do not compute MUA") + parser.add_argument('--mua-range', type=float, nargs=2, default=(500, 5000), + help="critical frequencies for MUA bandpass filter") + parser.add_argument('--mua-order', type=int, default=8, + help="order for butterworth bandpass filter for MUA") + parser.add_argument('--dset-postfix', default=None, required=False, + help="String to append to nwb dset names") + # parser.add_argument('--luigi', action='store_true', required=False, default=False, + # help="use luigi logger, which doesn't go to console") + parser.add_argument('--logfile', type=str, default=None, required=False) + + args = parser.parse_args() + + if args.logfile: + fh = logging.FileHandler(args.logfile) + formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + fh.setFormatter(formatter) + fh.setLevel(logging.DEBUG) + log.addHandler(fh) + + # PARSE ARGS + if args.decomp_type in ('hilbert', 'hil'): + decomp_type = 'hilbert' + else: + raise NotImplementedError() + + cfs = _get_cfs(args.cfs) + sds = _get_sds(cfs, args.sds) + + if args.outfile and (args.outfile != args.infile): + raise NotImplementedError("Cannot write to different outfile until pynwb issue #668 is addressed") + + # LOAD DATA + start = time.time() + nsenwb = NSENWB.from_existing_nwb(args.block, args.datafile) + raw_dset = nsenwb.read_raw(args.device, acq_name=args.acquisition) + raw_freq = raw_dset.rate + + X = raw_dset.data + + log.info("Time to load: {} sec".format(time.time()-start)) + + # TODO: remove bad electrodes. Or maybe keep them in the file but mark them bad? + + # CAR REMOVAL + if not args.no_car: + start = time.time() + X = _subtract_CAR(X) + log.info("Time to subtract CAR: {} sec".format(time.time()-start)) + + # NOTCH FILTER + if not args.no_notch: + start = time.time() + X = _notch_filter(X, raw_dset.rate) + log.info("Time to notch filter: {} sec".format(time.time()-start)) + + # MUA RATE + if not args.no_mua: + start = time.time() + mua, mua_rate = _mua(X, raw_freq, args.mua_range[0], args.mua_range[1], args.mua_order) + log.info("Time to compute MUA rate: {} sec".format(time.time()-start)) + else: + mua, mua_rate = None, None + + # FREQUENCY DECOMPOSITION + if decomp_type == 'hilbert': + start = time.time() + Y = _hilbert_transform(X, raw_freq, cfs, sds, args.first_resample, args.final_resample) + log.info("Time to Hilbert transform: {} sec".format(time.time()-start)) + else: + raise NotImplementedError() + + # FINAL RESAMPLE + if args.final_resample: + start = time.time() + # Y = _resample(Y, args.final_resample, rate, axis=0) # Done in Hilbert + # X = _resample(X, args.final_resample, rate, axis=0) # TODO: uncomment + if mua_rate is not None: + mua_rate = _resample(mua_rate, args.final_resample, raw_freq, axis=0) + log.info("Time to resample: {} sec".format(time.time()-start)) + + # TOKENIZE + # TODO: store tokenizer class in block directory and load it here. + # For now, just assume white noise tokenizer, which may become some sort of default + import mars.tokenizers + try: + tokenizer_name = nsenwb.stim['tokenizer'] + tokenize = getattr(mars.tokenizers, tokenizer_name) + except KeyError: + log.error('no tokenizer specified in block directory') + except AttributeError: + log.error('tokenizer {} not found'.format(tokenizer_name)) + else: + tokenize(nsenwb) + + # WRITE DATA + start = time.time() + _write_data(nsenwb, args.outfile, args.device, args.final_resample, raw_freq, X, Y, mua, mua_rate, + decomp_type, cfs, sds, args.dset_postfix) + log.info("Time to write {}: {} sec".format(args.datafile, time.time()-start)) diff --git a/analysis/mars/preprocess_100um.sh b/analysis/mars/preprocess_100um.sh new file mode 100755 index 0000000..b805b91 --- /dev/null +++ b/analysis/mars/preprocess_100um.sh @@ -0,0 +1,19 @@ +infile=$1 +block=Simulation_v0 + +if [ $# -eq 0 ] + then + echo "pass input ECP nwb file as argument to this script" + exit +fi + +python scripts/preprocess.py $infile --block $block --device ECoG --acquisition Raw --first-resample 3200 --final-resample 400 --no-notch --no-car +python scripts/preprocess.py $infile --block $block --device Poly --acquisition Raw --first-resample 3200 --final-resample 400 --no-notch --no-car + +for i in `seq 0 20`; +do + python scripts/preprocess.py $infile --block $block --device ECoG --acquisition $i --first-resample 3200 \ + --final-resample 400 --no-notch --no-car --dset-postfix $i + python scripts/preprocess.py $infile --block $block --device Poly --acquisition $i --first-resample 3200 \ + --final-resample 400 --no-notch --no-car --dset-postfix $i +done diff --git a/analysis/mars/preprocess_layer_ei.py b/analysis/mars/preprocess_layer_ei.py new file mode 100644 index 0000000..e194b21 --- /dev/null +++ b/analysis/mars/preprocess_layer_ei.py @@ -0,0 +1,69 @@ +"""Script to preprocess a layer_ei contributions file so it has +processed contributions and lesions """ +import sys + +from pynwb import NWBHDF5IO + +from mars.io import NSENWB +from mars.wn import tokenize +from preprocess import _hilbert_transform, _get_cfs, _get_sds +from layer_reader import LayerReader + +FIRST_RESAMPLE = 3200.0 +FINAL_RESAMPLE = 400.0 +BLOCK = 'Simulation_v1' + +if __name__ == '__main__': + nwbfile = sys.argv[1] + cfs = _get_cfs(None) + sds = _get_sds(cfs, None) + + nsenwb = NSENWB.from_existing_nwb(BLOCK, nwbfile) + reader = LayerReader(nsenwb.nwb) + + # full CSEP: + X = reader.raw_full() + X = _hilbert_transform(X, reader.raw_rate(), cfs, sds, + FIRST_RESAMPLE, FINAL_RESAMPLE) + nsenwb.add_proc(X, 'ECoG', 'Hilb_54bands', + FINAL_RESAMPLE, cfs=cfs, sds=sds) + + for layer in [1, 2, 3, 4, 5, 6]: + for ei in 'ei': + if layer == 1 and ei == 'e': + continue + + # contribution: + X = reader.raw_contrib(layer, ei) + X = _hilbert_transform(X, reader.raw_rate(), cfs, sds, + FIRST_RESAMPLE, FINAL_RESAMPLE) + nsenwb.add_proc(X, 'ECoG', 'Hilb_54bands_{}{}'.format(layer, ei), + FINAL_RESAMPLE, cfs=cfs, sds=sds) + + # lesion: + X = reader.raw_lesion(layer, ei) + X = _hilbert_transform(X, reader.raw_rate(), cfs, sds, + FIRST_RESAMPLE, FINAL_RESAMPLE) + nsenwb.add_proc(X, 'ECoG', 'Hilb_54bands_l{}{}'.format(layer, ei), + FINAL_RESAMPLE, cfs=cfs, sds=sds) + + # combined e/i contribution: + X = reader.raw_contrib(layer) + X = _hilbert_transform(X, reader.raw_rate(), cfs, sds, + FIRST_RESAMPLE, FINAL_RESAMPLE) + nsenwb.add_proc(X, 'ECoG', 'Hilb_54bands_{}'.format(layer), + FINAL_RESAMPLE, cfs=cfs, sds=sds) + + # combined e/i lesion: + X = reader.raw_lesion(layer) + X = _hilbert_transform(X, reader.raw_rate(), cfs, sds, + FIRST_RESAMPLE, FINAL_RESAMPLE) + nsenwb.add_proc(X, 'ECoG', 'Hilb_54bands_l{}'.format(layer), + FINAL_RESAMPLE, cfs=cfs, sds=sds) + + + tokenize(nsenwb) + nsenwb.write() + + + diff --git a/analysis/mars/preprocess_layers.sh b/analysis/mars/preprocess_layers.sh new file mode 100644 index 0000000..d2dda91 --- /dev/null +++ b/analysis/mars/preprocess_layers.sh @@ -0,0 +1,19 @@ +infile=$1 +block=Simulation_v0 + +if [ $# -eq 0 ] + then + echo "pass input ECP nwb file as argument to this script" + exit +fi + +python scripts/preprocess.py $infile --block $block --device ECoG --acquisition Raw --first-resample 3200 --final-resample 400 --no-notch --no-car +python scripts/preprocess.py $infile --block $block --device Poly --acquisition Raw --first-resample 3200 --final-resample 400 --no-notch --no-car + +for i in `seq 1 6`; +do + python scripts/preprocess.py $infile --block $block --device ECoG --acquisition L$i --first-resample 3200 \ + --final-resample 400 --no-notch --no-car --dset-postfix L$i + python scripts/preprocess.py $infile --block $block --device Poly --acquisition L$i --first-resample 3200 \ + --final-resample 400 --no-notch --no-car --dset-postfix L$i +done diff --git a/analysis/mars/preprocess_slices.py b/analysis/mars/preprocess_slices.py new file mode 100644 index 0000000..27a5d70 --- /dev/null +++ b/analysis/mars/preprocess_slices.py @@ -0,0 +1,50 @@ +"""Script to preprocess a 100um slice contributions file so it has +processed contributions and lesions """ +import sys + +from pynwb import NWBHDF5IO + +from mars.io import NSENWB +from mars.wn import tokenize +from preprocess import _hilbert_transform, _get_cfs, _get_sds +from layer_reader import LayerReader + +FIRST_RESAMPLE = 3200.0 +FINAL_RESAMPLE = 400.0 +BLOCK = 'Simulation_v1' +THICKNESS = 200 +NSLICES = 11 + +if __name__ == '__main__': + nwbfile = sys.argv[1] + cfs = _get_cfs(None) + sds = _get_sds(cfs, None) + + nsenwb = NSENWB.from_existing_nwb(BLOCK, nwbfile) + reader = LayerReader(nsenwb.nwb) + + # full CSEP: + X = reader.raw_full() + X = _hilbert_transform(X, reader.raw_rate(), cfs, sds, + FIRST_RESAMPLE, FINAL_RESAMPLE) + nsenwb.add_proc(X, 'ECoG', 'Hilb_54bands', + FINAL_RESAMPLE, cfs=cfs, sds=sds) + + for slice_i in range(NSLICES): + # contrirbution: + X = reader.raw_slice(slice_i, thickness=THICKNESS) + X = _hilbert_transform(X, reader.raw_rate(), cfs, sds, + FIRST_RESAMPLE, FINAL_RESAMPLE) + nsenwb.add_proc(X, 'ECoG', 'Hilb_54bands_{}'.format(slice_i), + FINAL_RESAMPLE, cfs=cfs, sds=sds) + + # lesion: + X = reader.raw_slice_lesion(slice_i, thickness=THICKNESS) + X = _hilbert_transform(X, reader.raw_rate(), cfs, sds, + FIRST_RESAMPLE, FINAL_RESAMPLE) + nsenwb.add_proc(X, 'ECoG', 'Hilb_54bands_l{}'.format(slice_i), + FINAL_RESAMPLE, cfs=cfs, sds=sds) + + tokenize(nsenwb) + nsenwb.write() + diff --git a/analysis/mars/signal_processing/__init__.py b/analysis/mars/signal_processing/__init__.py new file mode 100644 index 0000000..1a1052d --- /dev/null +++ b/analysis/mars/signal_processing/__init__.py @@ -0,0 +1,6 @@ +from .hilbert_transform import * +from .resample import * +from .linenoise_notch import * +from .common_referencing import * +from .bandpass import * +from .smooth import * diff --git a/analysis/mars/signal_processing/bandpass.py b/analysis/mars/signal_processing/bandpass.py new file mode 100644 index 0000000..506aef2 --- /dev/null +++ b/analysis/mars/signal_processing/bandpass.py @@ -0,0 +1,23 @@ +# Taken from https://scipy-cookbook.readthedocs.io/items/ButterworthBandpass.html + +from __future__ import print_function + +from scipy.signal import butter, filtfilt, sosfilt, sosfiltfilt + +__all__ = ['butter_bandpass'] + + + +def butter_bandpass(data, fs, lowcut, highcut, order=8, filter_fcn=sosfiltfilt): + nyq = 0.5 * fs + low = lowcut / nyq + + if nyq > highcut: + high = highcut / nyq + sos = butter(order, [low, high], btype='bandpass', output='sos') + else: + print("WARNING: Requested filter abovve nyquist frequency") + sos = butter(order, [low], btype='highpass', output='sos') + + y = filter_fcn(sos, data) + return y \ No newline at end of file diff --git a/analysis/mars/signal_processing/common_referencing.py b/analysis/mars/signal_processing/common_referencing.py new file mode 100644 index 0000000..bf3bacd --- /dev/null +++ b/analysis/mars/signal_processing/common_referencing.py @@ -0,0 +1,39 @@ +from __future__ import division +import numpy as np + + +__all__ = ['subtract_CAR', + 'subtract_common_median_reference'] + +def subtract_CAR(X, mean_frac=0.95, round_fcn=np.ceil): + """ + Compute and subtract common average reference + mean_frac - average is calculated over the middle X percent. This is X. + """ + timepts, channels = X.shape + nchs_excl = int(round_fcn(channels*(1-mean_frac)/2.0)) + avg = np.mean(np.sort(X)[:, nchs_excl:-nchs_excl], axis=1) + + return X - np.tile(avg, (channels, 1)).T + + +def subtract_common_median_reference(X, channel_axis=-2): + """ + Compute and subtract common median reference + for the entire grid. + + Parameters + ---------- + X : ndarray (..., n_channels, n_time) + Data to common median reference. + + Returns + ------- + Xp : ndarray (..., n_channels, n_time) + Common median referenced data. + """ + + median = np.nanmedian(X, axis=channel_axis, keepdims=True) + Xp = X - median + + return Xp diff --git a/analysis/mars/signal_processing/fft.py b/analysis/mars/signal_processing/fft.py new file mode 100644 index 0000000..8fc9d3d --- /dev/null +++ b/analysis/mars/signal_processing/fft.py @@ -0,0 +1,14 @@ +import numpy as np + +from numpy.fft import rfftfreq, fftfreq + +try: + from mkl_fft._numpy_fft import rfft, irfft, fft, ifft +except ImportError: + try: + from accelerate.mkl.fftpack import rfft, irfft, fft, ifft + except ImportError: + try: + from pyfftw.interfaces.numpy_fft import rfft, irfft, fft, ifft + except ImportError: + from numpy.fft import rfft, irfft, fft, ifft diff --git a/analysis/mars/signal_processing/hilbert_transform.py b/analysis/mars/signal_processing/hilbert_transform.py new file mode 100644 index 0000000..a2450b4 --- /dev/null +++ b/analysis/mars/signal_processing/hilbert_transform.py @@ -0,0 +1,84 @@ +from __future__ import division +import numpy as np +from numpy.fft import fftfreq + +from .fft import fft, ifft + +__authors__ = "Alex Bujan, Jesse Livezey" + + +__all__ = ['gaussian', 'hamming', 'hilbert_transform'] + + +def gaussian(X, rate, center, sd): + n_channels, time = X.shape + freq = fftfreq(time, 1./rate) + + k = np.exp((-(np.abs(freq) - center)**2)/(2 * (sd**2))) + + return k / k.sum() + + +def hamming(X, rate, min_freq, max_freq): + n_channels, time = X.shape + freq = fftfreq(time, 1./rate) + + pos_in_window = np.logical_and(freq >= min_freq, freq <= max_freq) + neg_in_window = np.logical_and(freq <= -min_freq, freq >= -max_freq) + + k = np.zeros(len(freq)) + window_size = np.count_nonzero(pos_in_window) + window = np.hamming(window_size) + k[pos_in_window] = window + window_size = np.count_nonzero(neg_in_window) + window = np.hamming(window_size) + k[neg_in_window] = window + + return k / k.sum() + + +def hilbert_transform(X, rate, filters=None, normalize_filters=True): + """ + Apply bandpass filtering with Hilbert transform using + a prespecified set of filters. + + Parameters + ---------- + X : ndarray (n_channels, n_time) + Input data, dimensions + rate : float + Number of samples per second. + filters : filter or list of filters (optional) + One or more bandpass filters + normalize_filters : bool + If true, normalize each filter so that its entries sum to 1 + + Returns + ------- + Xc : array + Bandpassed analytical signal (dtype: complex) + """ + if not isinstance(filters, list): + filters = [filters] + time = X.shape[-1] + freq = fftfreq(time, 1. / rate) + + # Heavyside filter + h = np.zeros(len(freq)) + h[freq > 0] = 2. + h[0] = 1. + h = h[np.newaxis, :] + + Xh = np.zeros((len(filters),) + X.shape, dtype=np.complex) + X_fft_h = fft(X) * h + for ii, f in enumerate(filters): + if f is None: + Xh[ii] = ifft(X_fft_h) + else: + if normalize_filters: + f = f / f.sum() + Xh[ii] = ifft(X_fft_h * f) + if Xh.shape[0] == 1: + return Xh[0] + + return Xh diff --git a/analysis/mars/signal_processing/linenoise_notch.py b/analysis/mars/signal_processing/linenoise_notch.py new file mode 100644 index 0000000..d811084 --- /dev/null +++ b/analysis/mars/signal_processing/linenoise_notch.py @@ -0,0 +1,68 @@ +from __future__ import division +import numpy as np +from scipy.signal import firwin2, filtfilt +from numpy.fft import rfftfreq + +try: + from accelerate.mkl.fftpack import rfft, irfft +except ImportError: + try: + from pyfftw.interfaces.numpy_fft import rfft, irfft + except ImportError: + from numpy.fft import rfft, irfft + + +__all__ = ['linenoise_notch'] + + +__authors__ = "Alex Bujan" + + +def apply_notches(X, notches, rate, fft=True): + if fft: + fs = rfftfreq(X.shape[-1], 1./rate) + delta = 1. + fd = rfft(X) + else: + nyquist = rate/2. + n_taps = 1001 + gain = [1, 1, 0, 0, 1, 1] + for notch in notches: + if fft: + window_mask = np.logical_and(fs > notch-delta, fs < notch+delta) + window_size = window_mask.sum() + window = np.hamming(window_size) + fd[:, window_mask] = (fd[:, window_mask] * + (1.-window)[np.newaxis, :]) + else: + freq = np.array([0, notch-1, notch-.5, + notch+.5, notch+1, nyquist]) / nyquist + filt = firwin2(n_taps, freq, gain) + X = filtfilt(filt, np.array([1]), X) + if fft: + X = irfft(fd) + return X + + +def linenoise_notch(X, rate): + """ + Apply Notch filter at 60 Hz and its harmonics + + Parameters + ---------- + X : array + Input data, dimensions (n_channels, n_timePoints) + rate : float + Number of samples per second + + Returns + ------- + X : array + Denoised data, dimensions (n_channels, n_timePoints) + """ + + nyquist = rate / 2 + noise_hz = 60. + notches = np.arange(noise_hz, nyquist, noise_hz) + + return apply_notches(X, notches, rate) diff --git a/analysis/mars/signal_processing/resample.py b/analysis/mars/signal_processing/resample.py new file mode 100644 index 0000000..4bfa799 --- /dev/null +++ b/analysis/mars/signal_processing/resample.py @@ -0,0 +1,156 @@ +# Clone of scipy resample w/ various fft bindings +""" +Copyright (c) 2001, 2002 Enthought, Inc. +All rights reserved. + +Copyright (c) 2003-2016 SciPy Developers. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + c. Neither the name of Enthought nor the names of the SciPy Developers + may be used to endorse or promote products derived from this software + without specific prior written permission. + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. +""" +import numpy as np +from scipy.fftpack import ifftshift, fftfreq +from scipy.signal import get_window +from scipy._lib.six import callable + +from .fft import fft, ifft + +__all__ = ['resample'] + + +def _resample(x, num, t=None, axis=0, window=None): + """ + Resample `x` to `num` samples using Fourier method along the given axis. + The resampled signal starts at the same value as `x` but is sampled + with a spacing of ``len(x) / num * (spacing of x)``. Because a + Fourier method is used, the signal is assumed to be periodic. + Parameters + ---------- + x : array_like + The data to be resampled. + num : int + The number of samples in the resampled signal. + t : array_like, optional + If `t` is given, it is assumed to be the sample positions + associated with the signal data in `x`. + axis : int, optional + The axis of `x` that is resampled. Default is 0. + window : array_like, callable, string, float, or tuple, optional + Specifies the window applied to the signal in the Fourier + domain. See below for details. + Returns + ------- + resampled_x or (resampled_x, resampled_t) + Either the resampled array, or, if `t` was given, a tuple + containing the resampled array and the corresponding resampled + positions. + Notes + ----- + The argument `window` controls a Fourier-domain window that tapers + the Fourier spectrum before zero-padding to alleviate ringing in + the resampled values for sampled signals you didn't intend to be + interpreted as band-limited. + If `window` is a function, then it is called with a vector of inputs + indicating the frequency bins (i.e. fftfreq(x.shape[axis]) ). + If `window` is an array of the same length as `x.shape[axis]` it is + assumed to be the window to be applied directly in the Fourier + domain (with dc and low-frequency first). + For any other type of `window`, the function `scipy.signal.get_window` + is called to generate the window. + The first sample of the returned vector is the same as the first + sample of the input vector. The spacing between samples is changed + from ``dx`` to ``dx * len(x) / num``. + If `t` is not None, then it represents the old sample positions, + and the new sample positions will be returned as well as the new + samples. + As noted, `resample` uses FFT transformations, which can be very + slow if the number of input samples is large and prime, see + `scipy.fftpack.fft`. + """ + x = np.asarray(x) + X = fft(x, axis=axis) + Nx = x.shape[axis] + if window is not None: + if callable(window): + W = window(fftfreq(Nx)) + elif isinstance(window, np.ndarray): + if window.shape != (Nx,): + raise ValueError('window must have the same length as data') + W = window + else: + W = ifftshift(get_window(window, Nx)) + newshape = [1] * x.ndim + newshape[axis] = len(W) + W.shape = newshape + X = X * W + sl = [slice(None)] * len(x.shape) + newshape = list(x.shape) + newshape[axis] = num + N = int(np.minimum(num, Nx)) + Y = np.zeros(newshape, 'D') + sl[axis] = slice(0, (N + 1) // 2) + Y[sl] = X[sl] + sl[axis] = slice(-(N - 1) // 2, None) + Y[sl] = X[sl] + y = ifft(Y, axis=axis) * (float(num) / float(Nx)) + + if x.dtype.char not in ['F', 'D']: + y = y.real + + if t is None: + return y + else: + new_t = np.arange(0, num) * (t[1] - t[0]) * Nx / float(num) + t[0] + return y, new_t + +def resample(X, new_freq, old_freq, axis=-1): + """ + Resamples the ECoG signal from the original + sampling frequency to a new frequency. + + Parameters + ---------- + X : array + Input data, dimensions (n_channels, ..., n_timePoints) + new_freq : float + New sampling frequency + old_freq : float + Original sampling frequency + axis : int (optional) + Axis along which to resample the data + + Returns + ------- + Xds : array + Downsampled data, dimensions (n_channels, ..., n_timePoints_new) + """ + time = X.shape[axis] + new_time = int(np.ceil(time * new_freq / old_freq)) + + Xds = _resample(X, new_time, axis=axis) + + return Xds + diff --git a/analysis/mars/signal_processing/smooth.py b/analysis/mars/signal_processing/smooth.py new file mode 100644 index 0000000..853d52c --- /dev/null +++ b/analysis/mars/signal_processing/smooth.py @@ -0,0 +1,62 @@ +# Adapted from https://scipy-cookbook.readthedocs.io/items/SignalSmooth.html + +import scipy +import numpy + +__all__ = ['smooth'] + +def smooth(x,window_len=11,window='hanning', mode='full'): + """smooth the data using a window with requested size. + + This method is based on the convolution of a scaled window with the signal. + The signal is prepared by introducing reflected copies of the signal + (with the window size) in both ends so that transient parts are minimized + in the begining and end part of the output signal. + + input: + x: the input signal + window_len: the dimension of the smoothing window; should be an odd integer + window: the type of window from 'flat', 'hanning', 'hamming', 'bartlett', 'blackman' + flat window will produce a moving average smoothing. + mode: see argument to fftconvolve + output: + the smoothed signal + + example: + t=linspace(-2,2,0.1) + x=sin(t)+randn(len(t))*0.1 + y=smooth(x) + + see also: + + numpy.hanning, numpy.hamming, numpy.bartlett, numpy.blackman, numpy.convolve + scipy.signal.lfilter + + TODO: the window parameter could be the window itself if an array instead of a string + NOTE: length(output) != length(input), to correct this: return y[(window_len/2-1):-(window_len/2)] instead of just y. + """ + + if x.ndim != 1: + raise ValueError("smooth only accepts 1 dimension arrays.") + + if x.size < window_len: + raise ValueError("Input vector needs to be bigger than window size.") + + + if window_len<3: + return x + + + if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']: + raise ValueError("Window is on of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'") + + + s=numpy.r_[x[window_len-1:0:-1],x,x[-2:-window_len-1:-1]] + #print(len(s)) + if window == 'flat': #moving average + w=numpy.ones(window_len,'d') + else: + w=eval('numpy.'+window+'(window_len)') + + y=scipy.signal.fftconvolve(w/w.sum(),s,mode=mode) + return y diff --git a/analysis/mars/utils/bands.py b/analysis/mars/utils/bands.py new file mode 100644 index 0000000..b96bb8f --- /dev/null +++ b/analysis/mars/utils/bands.py @@ -0,0 +1,74 @@ +""" +Frequency band information for different types of data processing. +""" +import os + +from scipy.io import loadmat +import numpy as np + +class DataFormat(object): + def write_preprocessed(self): + raise NotImplementedError + def read_preprocessed(self): + raise NotImplementedError + +def log_spaced_cfs(fmin, fmax, nbin=6): + """ + Center frequencies that are uniform in log space + """ + noct = np.ceil(np.log2(fmax/fmin)) + return fmin * 2**(np.arange(noct*nbin)/nbin) + +def const_Q_sds(cfs, Q=8): + return cfs/Q + +def scaled_sqrt_sds(cfs, scale=0.39): + # equivalent to: + # return scale * np.sqrt(cfs) + return 10 ** ( np.log10(scale) + .5 * (np.log10(cfs))) * np.sqrt(2.) + + +# Chang lab frequencies +fq_min = 4.0749286538265 +fq_max = 200. +scale = 7. +cfs = 2 ** (np.arange(np.log2(fq_min) * scale, np.log2(fq_max) * scale) / scale) +sds = scaled_sqrt_sds(cfs) +chang_lab = {'fq_min': fq_min, + 'fq_max': fq_max, + 'scale': scale, + 'cfs': cfs, + 'sds': sds, + 'block_path': '{}_Hilb.h5'} + +# Standard neuro bands +bands = ['theta', 'alpha', 'beta', 'high beta', 'gamma', 'high gamma', 'ultra high gamma', 'multiunit activity range'] +abrev = ['T','A','B','HB','G','HG','UHG','MUAR'] +min_freqs = [4., 9., 15., 21., 30., 70.,180.,500] +max_freqs = [8., 14., 20., 29., 59., 170.,450.,1200] +HG_freq = 200. +neuro = {'bands': bands, + 'abrev': abrev, + 'min_freqs': min_freqs, + 'max_freqs': max_freqs, + 'HG_freq': HG_freq, + 'block_path': '{}_neuro_Hilb.h5'} + +def frequency_range(abrev): + frq_ind = neuro['abrev'].index(abrev) + return [neuro['min_freqs'][frq_ind],neuro['max_freqs'][frq_ind]] + +# Wavelet 4-1200hz 54 bands +# which actually start at 2.6308 hz +wavelet_cfs = log_spaced_cfs(2.6308, 1200.0) +wavelet_sds = const_Q_sds(wavelet_cfs) +wavelet = {'cfs': wavelet_cfs, 'sds': wavelet_sds} + +if __name__ == '__main__': + # with open(os.path.join(os.path.dirname(__file__), 'cfs.4_1200.54Wvl.mat'), 'r') as matfile: + # mat = loadmat(matfile) + # cfs = np.squeeze(mat['cfs']) + # sds = 10 ** ( np.log10(.39) + .5 * (np.log10(cfs))) + # sds = np.array(sds) + # print cfs + pass diff --git a/analysis/mars/wn/wn_tokenize.py b/analysis/mars/wn/wn_tokenize.py new file mode 100644 index 0000000..7bffae2 --- /dev/null +++ b/analysis/mars/wn/wn_tokenize.py @@ -0,0 +1,83 @@ +""" +Tokenize white noise stimulus data +""" + +__author__ = 'Vyassa Baratham ' + +import numpy as np +from mars.io import NSENWB +from mars.signal_processing import smooth + +def get_stim_onsets(nsenwb, mark_name): + if 'Simulation' in nsenwb.block_name: + raw_dset = nsenwb.read_raw('ECoG') + end_time = raw_dset.data.shape[0] / raw_dset.rate + return np.arange(0.5, end_time, 0.3) + + mark_dset = nsenwb.read_mark(mark_name) + mark_fs = mark_dset.rate + mark_offset = nsenwb.stim['mark_offset'] + stim_dur = nsenwb.stim['duration'] + stim_dur_samp = stim_dur*mark_fs + + mark_threshold = 0.25 if nsenwb.stim.get('mark_is_stim') else nsenwb.stim['mark_threshold'] + thresh_crossings = np.diff( (mark_dset.data[:] > mark_threshold).astype('int'), axis=0 ) + stim_onsets = np.where(thresh_crossings > 0.5)[0] + 1 # +1 b/c diff gets rid of 1st datapoint + + real_stim_onsets = [stim_onsets[0]] + for stim_onset in stim_onsets[1:]: + # Check that each stim onset is more than 2x the stimulus duration since the previous + if stim_onset > real_stim_onsets[-1] + 2*stim_dur_samp: + real_stim_onsets.append(stim_onset) + + if len(real_stim_onsets) != nsenwb.stim['nsamples']: + print("WARNING: found {} stim onsets in block {}, but supposed to have {} samples".format( + len(real_stim_onsets), nsenwb.block_name, nsenwb.stim['nsamples'])) + + return (real_stim_onsets / mark_fs) + mark_offset + +def get_end_time(nsenwb, mark_name): + mark_dset = nsenwb.read_mark(mark_name) + end_time = mark_dset.num_samples/mark_dset.rate + return end_time + +def already_tokenized(nsenwb): + return nsenwb.nwb.trials and 'sb' in nsenwb.nwb.trials.colnames + +def tokenize(nsenwb, mark_name='recorded_mark'): + """ + Required: mark track + + Output: stim on/off as "wn" + baseline as "baseline" + """ + if already_tokenized(nsenwb): + return + + stim_onsets = get_stim_onsets(nsenwb, mark_name) + stim_dur = nsenwb.stim['duration'] + bl_start = nsenwb.stim['baseline_start'] + bl_end = nsenwb.stim['baseline_end'] + + nsenwb.add_trial_column('sb', 'Stimulus (s) or baseline (b) period') + + # Add the pre-stimulus period to baseline + # nsenwb.add_trial(start_time=0.0, stop_time=stim_onsets[0]-stim_dur, sb='b') + + for onset in stim_onsets: + nsenwb.add_trial(start_time=onset, stop_time=onset+stim_dur, sb='s') + if bl_start==bl_end: + continue + nsenwb.add_trial(start_time=onset+bl_start, stop_time=onset+bl_end, sb='b') + + # Add the period after the last stimulus to baseline + # rec_end_time = get_end_time(nsenwb,mark_name) + # nsenwb.add_trial(start_time=stim_onsets[-1]+bl_end, stop_time=rec_end_time, sb='b') + + +if __name__ == '__main__': + fn = '/data/ECoGData/R32_B6_tokenizetest.nwb' + + nsenwb = NSENWB.from_existing_nwb('R32_B6', fn) + + tokenize(nsenwb) diff --git a/analysis/simulation_analysis/ampl_vary.py b/analysis/simulation_analysis/ampl_vary.py new file mode 100644 index 0000000..467911d --- /dev/null +++ b/analysis/simulation_analysis/ampl_vary.py @@ -0,0 +1,60 @@ +""" +Plots of thalamic amplitude variations +""" + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.colors as colors +import matplotlib.cm as cmx + +from utils import find_layer_ei_ecp_file +from power_spectrum import PowerSpectrum, PowerSpectrumRatio + +JOBNUMS = ( + (20, '30103194'), + (23, '30103187'), + (26, '30034900'), + (29, '30034918'), + (32, '30034921'), + (35, '29812500'), + (38, '30034922'), + (44, '30034925'), +) + +def get_colors(cmap='Reds', n=len(JOBNUMS)): + color_norm = colors.Normalize(vmin=0, vmax=n+1) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap=cmap) + cmap = [scalar_map.to_rgba(i+1) for i in range(n)] + return cmap + +def plot(ps_ax, peak_ax, PS_cls=PowerSpectrum): + for color, (thal_freq, jobnum) in zip(get_colors(), JOBNUMS): + nwbfile = find_layer_ei_ecp_file(jobnum) + plt.sca(ps_ax) + plotter = PS_cls(nwbfile, '', nosave=True, color=color) + f, spectrum, errs = plotter.plot_one(0) + max_f = f[np.argmax(spectrum)] + max_resp = np.max(spectrum) + alpha = (thal_freq-18.0)/26.0 + peak_ax.scatter(max_resp, max_f, c=color, #alpha=alpha, + marker='s', s=48, edgecolors='none') + if thal_freq == 35: + peak_ax.plot(max_resp, max_f, 'ro', fillstyle='none', markersize=16, alpha=alpha) + +if __name__ == '__main__': + fig, axs = plt.subplots(2, 2, figsize=(6, 6)) + + axs[0, 0].set_xlabel('Neural freq (Hz)') + axs[0, 0].set_ylabel('Z-score') + axs[0, 1].set_xlabel('Resp. magnitude (Z-score)') + axs[0, 1].set_ylabel('Resp. peak freq (Hz)') + plot(axs[0, 0], axs[0, 1], PS_cls=PowerSpectrum) + + axs[1, 0].set_xlabel('Neural freq (Hz)') + axs[1, 0].set_ylabel('Stim/bl ratio') + axs[1, 1].set_xlabel('Resp. magnitude (ratio)') + axs[1, 1].set_ylabel('Resp. peak freq (Hz)') + plot(axs[1, 0], axs[1, 1], PS_cls=PowerSpectrumRatio) + + plt.tight_layout() + plt.savefig("ampl_vary.pdf") diff --git a/analysis/simulation_analysis/analysis.py b/analysis/simulation_analysis/analysis.py new file mode 100644 index 0000000..6430309 --- /dev/null +++ b/analysis/simulation_analysis/analysis.py @@ -0,0 +1,184 @@ +""" +Base classes for analysis objects +""" +import os +import h5py +from pynwb import NWBHDF5IO +from argparse import ArgumentParser + +import numpy as np +import matplotlib.pyplot as plt + +class BasePlotter(object): + def __init__( + # TODO: remove outdir as an arg (saving should happen manually in the calling script) + self, nwbfile, outdir, mode='r', device='ECoG', auxfile=None, + raw_dset_name='Raw', proc_dset_name='Hilb_54bands', block=None, + filetype='pdf', identifier='', no_baseline_stats=False, + channel=None, stim_i=None, tstart=None, tstop=None, + figsize=None, ax=None, + color=None, linewidth=None, label=None, nosave=False, show=False, + is_expt=False, nwb=None, + ): + """ + identifier - appended to filename + """ + self.nwbfile = nwbfile + self.auxfile = auxfile + self.device = device + self.channel = channel + self.block = block + self.raw_dset_name = raw_dset_name + self.proc_dset_name = proc_dset_name + self.outdir = outdir + self.filetype = filetype + self.identifier = identifier + self.stim_i = stim_i if stim_i is not None else 'avg' + self.tstart = tstart + self.tstop = tstop + self.is_expt = is_expt + + # TODO: remove? + self.nosave = nosave + self.show = show + + if figsize and not ax: + plt.figure(figsize=figsize) + + self.linewidth = linewidth + self.color = color + self.label = label + + if nwb: + self.nwb = nwb + else: + self.io = NWBHDF5IO(self.nwbfile, mode) + self.nwb = self.io.read() + + + if not no_baseline_stats: + self.raw_bl_stats = self._compute_raw_baseline_stats() + self.proc_bl_stats = self._compute_proc_baseline_stats() + + @property + def proc_dset(self): + try: + return self.nwb.modules[self.proc_dset_name].data_interfaces[self.device] + except KeyError: + raise KeyError("Unable to read processed data from {} (probably needs to be preprocessed)".format(self.nwbfile)) + + @property + def raw_dset(self): + return self.nwb.acquisition[self.raw_dset_name].electrical_series[self.device] + + @property + def n_ch(self): + return self.raw_dset.data.shape[1] + + def do_plots(self): + """subclasses override""" + dset = self.proc_dset + n_timepts, n_ch = dset.data.shape[:2] + for i in range(n_ch): + self.plot_one(i) + plt.clf() + + def fix_len_off_by_one(self, x, y): + """ + In case a timeseries doesn't line up with its t-axis, fix by cutting off one timepoint + from the end of whichever series is shorter + """ + if len(x) == len(y) + 1: + x = x[:-1] + elif len(x) == len(y) - 1: + y = y[:-1] + return x, y + + def get_stim_periods(self, rate=None, pre_dur=0.1, post_dur=0.1): + """ + Return stim-on times in seconds, unless rate is passed, in which case + in samples at the given sampling rate + """ + trials = self.nwb.trials + idxs = trials['sb'][:] == 's' + times = zip(trials['start_time'][idxs]-pre_dur, trials['stop_time'][idxs]+post_dur) + + if rate: + return [(int(t[0]*rate), int(t[1]*rate)) for t in times] + else: + return times + + def get_baseline_periods(self, rate=None): + """ + Return baseline period times in seconds, unless rate is passed, in which case + in samples at the given sampling rate + """ + trials = self.nwb.trials + bl_idxs = trials['sb'][:] == 'b' + times = zip(trials['start_time'][bl_idxs], trials['stop_time'][bl_idxs]) + + if rate: + return [(int(t[0]*rate), int(t[1]*rate)) for t in times] + else: + return times + + def _compute_raw_baseline_stats(self): + # TODO + return None, None + + def _compute_proc_baseline_stats(self): + """ + Compute baseline stats per frequency band for the given channel data + """ + if self.auxfile and os.path.exists(self.auxfile): + print("Using saved baseline stats") + with h5py.File(self.auxfile) as infile: + return infile['/bl_mu'][:], infile['/bl_std'][:] + else: + print("Computing baseline stats") + full_data = self.proc_dset.data + rate = self.proc_dset.rate + bl_periods = self.get_baseline_periods(rate=rate) + idx = np.zeros(full_data.shape[0], dtype=bool) + for t1, t2 in bl_periods: + idx[t1:t2] = True + bl_data = full_data[idx, ...] + bl_mean = np.average(bl_data, axis=0) + bl_std = np.std(bl_data, axis=0) + return (bl_mean, bl_std) + + def get_bfs(self): + with h5py.File(self.auxfile) as infile: + return infile['/bf'][:] + + + def run(self): + self.do_plots() + + +class PlotterArgParser(ArgumentParser): + kwarg_fields = [ + 'tstart', 'tstop', 'stim_i', 'identifier', 'filetype', 'nosave', 'show', + 'proc_dset_name', 'auxfile', + ] + def __init__(self, *args, **kwargs): + super(PlotterArgParser, self).__init__(*args, **kwargs) + self.add_argument('--nwbfile', '--nwb', type=str, required=True) + self.add_argument('--auxfile', '--aux', type=str, required=False, default=None) + self.add_argument('--outdir', type=str, required=False, default='.') + self.add_argument('--proc-dset-name', '--proc-dset', '--proc', type=str, required=False, + default='Hilb_54bands') + self.add_argument('--tstart', type=float, required=False, default=None) + self.add_argument('--tstop', type=float, required=False, default=None) + self.add_argument('--stim-i', type=int, required=False, default=None) + self.add_argument('--channel', type=int, required=False, default=None) + self.add_argument('--identifier', type=str, required=False, default='', + help='append this string to filename') + self.add_argument('--filetype', '--extension', '--ext', required=False, default='pdf') + self.add_argument('--nosave', default=False, action='store_true') + self.add_argument('--show', default=False, action='store_true') + + @property + def kwargs(self): + args = self.parse_args() + return {f: getattr(args, f) for f in PlotterArgParser.kwarg_fields} diff --git a/analysis/simulation_analysis/layer_reader.py b/analysis/simulation_analysis/layer_reader.py new file mode 100644 index 0000000..26b2a80 --- /dev/null +++ b/analysis/simulation_analysis/layer_reader.py @@ -0,0 +1,97 @@ +from pynwb import NWBHDF5IO + +class LayerReader(object): + def __init__(self, nwb=None, nwbfile=None, device='ECoG', + raw_dset_name='Raw', proc_dset_name='Hilb_54bands'): + """ + nwb = an ecp_layer_ei nwb file object + nwbfile = pointer to an nwb file + """ + + if nwb: + self.nwb = nwb + elif nwbfile: + self.nwbfile = nwbfile + self.io = NWBHDF5IO(nwbfile, 'r') + self.nwb = self.io.read() + else: + raise ValueError('Must specify either nwb or nwbfile') + + self.device = device + self.raw_dset_name = raw_dset_name + self.proc_dset_name = proc_dset_name + + self.raw_dset = self.nwb.acquisition[raw_dset_name].electrical_series[device] + + def raw_rate(self): + return self.raw_dset.rate + + def raw_full(self): + return self.raw_dset.data[:] + + def raw_contrib_dset_name(self, layer, ei): + return '{}{}'.format(layer, ei) + + def raw_contrib(self, layer=None, ei=None): + if layer and ei: + return self.nwb.acquisition[self.raw_contrib_dset_name(layer, ei)] \ + .electrical_series[self.device].data[:] + elif layer and not ei: + if layer == 1: + return self.raw_contrib(1, 'i') + return self.raw_contrib(layer, 'e') + self.raw_contrib(layer, 'i') + elif ei and not layer: + raise NotImplementedError("Total e/i across all layers not implemented yet") + else: + raise ValueError("Must specify layer or ei") + + def raw_lesion(self, layer=None, ei=None): + return self.raw_full() - self.raw_contrib(layer, ei) + + def raw_slice(self, slice_i, thickness=100): + if thickness == 100: + return self.nwb.acquisition[str(slice_i)].electrical_series[self.device].data[:] + elif thickness == 200: + if slice_i == 10: + return self.raw_slice(2*slice_i) # slice_i = 21 does not exist + else: + return self.raw_slice(2*slice_i) + self.raw_slice(2*slice_i + 1) + else: + raise ValueError("Can only take 100 or 200um slices") + + def raw_slice_lesion(self, slice_i, thickness=100): + return self.raw_full() - self.raw_slice(slice_i, thickness=thickness) + + ############################################################### + """Hilbert (processed) data, which must be preprocessed into + contributions, not calculated on the fly. Most scripts that need + this data will just grab it directly from the nwb, but here's a + convenient way to do that""" + ############################################################### + + @property + def proc_dset(self): + return self.nwb.modules[self.proc_dset_name].data_interfaces[self.device] + + def proc_rate(self): + return self.proc_dset.rate + + def proc_contrib(self, layer=None, ei=None): + if layer and ei: + return self.get_proc_dset('{}_{}{}'.format(self.proc_dset_name, layer, ei)) + elif layer and not ei: + return self.get_proc_dset('{}_{}'.format(self.proc_dset_name, layer)) + elif ei and not layer: + raise NotImplementedError("Total e/i across all layers not implemented yet") + else: + raise ValueError("Must specify layer or ei") + + def proc_lesion(self, layer=None, ei=None): + if layer and ei: + return self.get_proc_dset('{}_l{}{}'.format(self.proc_dset_name, layer, ei)) + elif layer and not ei: + return self.get_proc_dset('{}_l{}'.format(self.proc_dset_name, layer)) + elif ei and not layer: + raise NotImplementedError("Total e/i across all layers not implemented yet") + else: + raise ValueError("Must specify layer or ei") diff --git a/analysis/simulation_analysis/power_spectrum.py b/analysis/simulation_analysis/power_spectrum.py new file mode 100644 index 0000000..5da99e0 --- /dev/null +++ b/analysis/simulation_analysis/power_spectrum.py @@ -0,0 +1,316 @@ +""" +z-scored power spectrum during peak Hg response +""" + +import os +import numpy as np +import matplotlib.pyplot as plt + +from analysis import BasePlotter, PlotterArgParser + +def find_peak_signal(stim_data, rate, search_window=.005, avg_window=1, time_shift_samp=0): + """ + Average the signal on each channel/band around the peak, + where peak is defined as the maximum within some time (search_window) + of the peak response (across ALL times) of the high gamma signal + + stim_data: data during the stimulus period + shape (n_stims, n_timepts, n_channels, n_bands) + search_window: number of SECONDS to search around the high gamma peak + avg_window: number of SAMPLES around the high gamma peak to avg over + """ + n_stims, n_timepts, n_ch, n_bands = stim_data.shape + + # Average across stimulus presentations + stim_spectra = np.mean(stim_data, axis=0) + + # Compute the max in the high gamma range across all timepoints + search = int(search_window * rate) # samples + hg_signal = np.mean(stim_spectra[search+avg_window:-search-avg_window, :, 30:37], axis=-1) # 29:36? + hg_maxes = np.argmax(hg_signal, axis=0) + search + avg_window # Max of the hg signal on each electrode + print("hg maxes", hg_maxes) + + # Compute the average within the search window of the hg peaks + avg_ampl_during_peak = np.zeros(shape=stim_spectra.shape[1:]) + for i in range(n_ch): + hg_max = hg_maxes[i] + time_shift_samp + for j in range(n_bands): + maxidx = np.argmax(stim_spectra[hg_max-search:hg_max+search+1, i, j]) + hg_max - search + x = np.mean(stim_spectra[maxidx-avg_window:maxidx+avg_window+1, i, j]) + avg_ampl_during_peak[i, j] = x + + return avg_ampl_during_peak + + +class PowerSpectrum(BasePlotter): + ylabel = 'Z-score' + + def __init__(self, nwbfile, outdir, **kwargs): + self.half_width = kwargs.pop('half_width', .0025) + self.normalize = kwargs.pop('normalize', False) + self.time_shift_samp = kwargs.pop('time_shift_samp', 0) + self.errors = kwargs.pop('errors', False) + self.elinewidth = kwargs.pop('elinewidth', 0.5) + + super(PowerSpectrum, self).__init__(nwbfile, outdir, **kwargs) + + def set_normalize(self, normalize): + self.normalize = normalize + + def transform_data(self, data, bl_mean, bl_std): + """Z-score""" + return (data - bl_mean) / bl_std + + def get_spectrum(self, channel): + """ + Return the z-scored power spectrum + """ + ch_data = self.proc_dset.data[:, channel, :] + n_timepts, n_bands = ch_data.shape + rate = self.proc_dset.rate + + hw = int(self.half_width * rate) + + # Rescale to baseline mean/stdev + bl_mean, bl_std = self.proc_bl_stats + bl_mean, bl_std = bl_mean[channel, :], bl_std[channel, :] + ch_data = self.transform_data(ch_data, bl_mean, bl_std) + + # Grab center frequencies from bands table + # def log_spaced_cfs(fmin, fmax, nbin=6): + # noct = np.ceil(np.log2(fmax/fmin)) + # return fmin * 2**(np.arange(noct*nbin)/nbin) + # band_means = log_spaced_cfs(2.6308, 1200.0) + band_means = self.proc_dset.bands['band_mean'][:] + hg_band_idx = np.logical_and(band_means > 65, band_means < 170) + + # Grab stim-on data, trial average if requested + stim_periods = self.get_stim_periods(rate=rate, pre_dur=0, post_dur=0) + if self.stim_i == 'avg': + n_stim_timepts = stim_periods[0][1] - stim_periods[0][0] + stim_data = np.zeros(shape=(len(stim_periods), n_stim_timepts, n_bands)) + for i, (t1, t2) in enumerate(stim_periods): + stim_data[i, :, :] = ch_data[t1:t1+n_stim_timepts, :] + + # Calculate max of average high gamma response + # Average over stims, bands in hg range: time axis remains + hg_data = np.average(stim_data[:, :, hg_band_idx], axis=(0,2)) + max_i = np.argmax(hg_data) + self.max_i = max_i + print(max_i) + max_i += self.time_shift_samp + assert max_i - hw > 0 + + # Average over stims, time: freq (bands) axis remainds + spectrum = np.average(stim_data[:, max_i-hw:max_i+hw, :], axis=(0,1)) + errors = np.std(stim_data[:, max_i-hw:max_i+hw, :], axis=(0,1)) + else: # self.stim_i is an integer index + tstart, tstop = stim_periods[self.stim_i] + stim_data = ch_data[tstart:tstop, :] + hg_data = np.average(ch_data[tstart:tstop, hg_band_idx], axis=1) + max_i = np.argmax(hg_data) + self.max_i = max_i + spectrum = np.average(stim_data[max_i-hw:max_i+hw+1, :], axis=0) + errors = np.zeros(len(spectrum)) + + return band_means, spectrum, errors + + def get_data(self): + """ + Return all data during the stimulus period + shape (n_stims, n_timepts, n_channels, n_bands) + """ + n_timepts, n_ch, n_bands = self.proc_dset.data.shape + rate = self.proc_dset.rate + stim_periods = self.get_stim_periods(rate=rate, pre_dur=0.0, post_dur=0.0) + n_stim_timepts = stim_periods[0][1] - stim_periods[0][0] + stim_data = np.zeros(shape=(len(stim_periods), n_stim_timepts, n_ch, n_bands)) + for i, (t1, t2) in enumerate(stim_periods): + stim_data[i, ...] = self.proc_dset.data[t1:t1+n_stim_timepts, ...] + return stim_data + + def save_spectra(self): + all_ch_spectra = np.stack([self.get_spectrum(ch)[1] for ch in range(n_ch)]) + self.nwb.add_scratch(all_ch_spectra, name='power_spectrum', notes='power spectrum') + + def get_avg_spectrum(self): + """ + Channel average z-score. + This should really only be used for experimental blocks. + Does not support errorbars + """ + bl_mean, bl_std = self.proc_bl_stats + def log_spaced_cfs(fmin, fmax, nbin=6): + noct = np.ceil(np.log2(fmax/fmin)) + return fmin * 2**(np.arange(noct*nbin)/nbin) + band_means = log_spaced_cfs(2.6308, 1200.0) if self.is_expt else self.proc_dset.bands['band_mean'][:] + stim_data = self.get_data() + n_stims, n_timepts, n_ch, n_bands = stim_data.shape + bl_mean = np.tile(bl_mean, (n_stims, n_timepts, 1, 1)) + bl_std = np.tile(bl_std, (n_stims, n_timepts, 1, 1)) + stim_data = self.transform_data(stim_data, bl_mean, bl_std) + stim_peak_spectra = find_peak_signal(stim_data, self.proc_dset.rate, time_shift_samp=self.time_shift_samp) + avg_spectrum = np.average(stim_peak_spectra, axis=0) + return band_means, avg_spectrum + + def prepare_axes(self): + plt.gca().set_xscale('log') + plt.xlim([10, 1200]) + plt.xscale('log') + plt.xlabel('Frequency (Hz)') + ylabel = self.ylabel + '/max' if self.normalize else self.ylabel + plt.ylabel(ylabel) + + def plot_avg(self, **plot_args): + """channel average""" + f, avg_spectrum = self.get_avg_spectrum() + if self.normalize: + avg_spectrum = avg_spectrum / np.max(avg_spectrum) + self.prepare_axes() + plt.gca().plot(f, avg_spectrum, color=self.color, **plot_args) + + + def plot_one(self, channel, **plot_args): + """ + Make one channel's power spectrum and save it to file + """ + + band_means, spectrum, errors = self.get_spectrum(channel) + + if self.normalize: + errors = errors / max(spectrum) + spectrum = spectrum / max(spectrum) + + final_plot_args = { + 'label': self.label, + 'color': self.color, + 'linewidth': self.linewidth, + 'elinewidth': self.elinewidth, + 'capsize': 1, + } + final_plot_args.update(plot_args) + + self.prepare_axes() + plt.errorbar( + band_means, spectrum, yerr=(errors if self.errors else None), + **final_plot_args + ) + self.label = None # Prevent the label from being applied multiple times + plt.tight_layout() + + if not self.nosave: + fn = 'power_spectrum_{}_ch{:02d}_{}.{}'.format( + self.device, channel, self.identifier, self.filetype + ) + full_fn = os.path.join(self.outdir, fn) + plt.savefig(full_fn) + + if self.show: + plt.show() + + return band_means, spectrum, errors + + + def plot_one_layer_ei(self, layer, ei, contrib_or_lesion, **plot_args): + """Only valid for simulation, so channel must be 0""" + old_proc_dset_name = self.proc_dset_name # "Hilb_54bands" + old_proc_bl_stats = self.proc_bl_stats + lesion = 'l' if contrib_or_lesion in ('lesion', 'removal') else '' + self.proc_dset_name = '{}_{}{}{}'.format(old_proc_dset_name, lesion, layer, ei) + self.proc_bl_stats = self._compute_proc_baseline_stats() + + self.plot_one(0, **plot_args) + + self.proc_dset_name = old_proc_dset_name + self.proc_bl_stats = old_proc_bl_stats + + def plot_one_slice(self, slice_i, contrib_or_lesion, **plot_args): + old_proc_dset_name = self.proc_dset_name # "Hilb_54bands" + old_proc_bl_stats = self.proc_bl_stats + lesion = 'l' if contrib_or_lesion in ('lesion', 'removal') else '' + self.proc_dset_name = '{}_{}{}'.format(old_proc_dset_name, lesion, slice_i) + self.proc_bl_stats = self._compute_proc_baseline_stats() + + self.plot_one(0, **plot_args) + + self.proc_dset_name = old_proc_dset_name + self.proc_bl_stats = old_proc_bl_stats + + def plot_diff_layer_ei(self, layer, ei, contrib_or_lesion, **plot_args): + """ + Plot the difference between layer contribution/lesion and full power spectrum + """ + f, full_spectrum, full_errors = self.get_spectrum(0) + + old_proc_dset_name = self.proc_dset_name # "Hilb_54bands" + old_proc_bl_stats = self.proc_bl_stats + lesion = 'l' if contrib_or_lesion in ('lesion', 'removal') else '' + self.proc_dset_name = '{}_{}{}{}'.format(old_proc_dset_name, lesion, layer, ei) + self.proc_bl_stats = self._compute_proc_baseline_stats() + + f, layer_spectrum, layer_errors = self.get_spectrum(0) + + self.proc_dset_name = old_proc_dset_name + self.proc_bl_stats = old_proc_bl_stats + + diff = full_spectrum - layer_spectrum + + self.prepare_axes() + final_plot_args = { + 'label': self.label, + 'color': self.color, + 'linewidth': self.linewidth, + } + final_plot_args.update(plot_args) + plt.plot(f, diff, **final_plot_args) + + + +class PowerSpectrumRatio(PowerSpectrum): + ylabel = 'Stim/baseline ratio' + + def transform_data(self, data, bl_mean, bl_std): + """Ratio""" + return data / bl_mean + + def plot_one_layer_ei(self, layer, ei, contrib_or_lesion, **plot_args): + """Only valid for simulation, so channel must be 0""" + old_proc_dset_name = self.proc_dset_name # "Hilb_54bands" + lesion = 'l' if contrib_or_lesion in ('lesion', 'removal') else '' + self.proc_dset_name = '{}_{}{}{}'.format(old_proc_dset_name, lesion, layer, ei) + self.plot_one(0, **plot_args) + self.proc_dset_name = old_proc_dset_name + + def plot_one_slice(self, slice_i, contrib_or_lesion, **plot_args): + old_proc_dset_name = self.proc_dset_name # "Hilb_54bands" + lesion = 'l' if contrib_or_lesion in ('lesion', 'removal') else '' + self.proc_dset_name = '{}_{}{}'.format(old_proc_dset_name, lesion, slice_i) + self.plot_one(0, **plot_args) + self.proc_dset_name = old_proc_dset_name + + def plot_diff_layer_ei(self, layer, ei, contrib_or_lesion, **plot_args): + f, full_spectrum, full_errors = self.get_spectrum(0) + + old_proc_dset_name = self.proc_dset_name # "Hilb_54bands" + lesion = 'l' if contrib_or_lesion in ('lesion', 'removal') else '' + self.proc_dset_name = '{}_{}{}{}'.format(old_proc_dset_name, lesion, layer, ei) + f, layer_spectrum, layer_errors = self.get_spectrum(0) + self.proc_dset_name = old_proc_dset_name + + diff = full_spectrum - layer_spectrum + + self.prepare_axes() + final_plot_args = { + 'label': self.label, + 'color': self.color, + 'linewidth': self.linewidth, + } + final_plot_args.update(plot_args) + plt.plot(f, diff, **final_plot_args) + +if __name__ == '__main__': + parser = PlotterArgParser() + args = parser.parse_args() + + analysis = PowerSpectrumRatio(args.nwbfile, args.outdir, **parser.kwargs) + analysis.run() diff --git a/analysis/simulation_analysis/power_spectrum_100um.py b/analysis/simulation_analysis/power_spectrum_100um.py new file mode 100644 index 0000000..0aaafc3 --- /dev/null +++ b/analysis/simulation_analysis/power_spectrum_100um.py @@ -0,0 +1,141 @@ +"""Plot of power spectrum in each 100um slice, along with 6 graphs +showing the # of segments in layer i in each slice + +""" +import numpy as np +import json +import matplotlib.pyplot as plt +from matplotlib.gridspec import GridSpec, GridSpecFromSubplotSpec +import matplotlib.colors as colors +import matplotlib.cm as cmx + +from layer_reader import LayerReader +from power_spectrum import PowerSpectrum, PowerSpectrumRatio +from utils import find_slice_ecp_file, get_layer_slice_counts, numerals + +TSTART, TSTOP, TSTIM = 2400, 2700, 2500 +JOBNUM = '29812500' +TYPE = 'zscore' +# COLOR = 'Greys' +# COLOR = 'gist_rainbow' +COLOR = 'gist_heat' +THICKNESS = 200 +NSLICES = 11 +nwbfile = find_slice_ecp_file(JOBNUM, thickness=THICKNESS) + +if TYPE == 'zscore': + PS_cls = PowerSpectrum +else: + PS_cls = PowerSpectrumRatio + +def plot_contribs(reader, ax): + rate = reader.raw_rate() + istart, istop = int(round(TSTART/1000.0*rate)), int(round(TSTOP/1000.0*rate)) + offset = 0 + for slice_i, color in zip(range(NSLICES), get_colors()): + offset += .1 + ecp = reader.raw_slice(slice_i, thickness=THICKNESS)[istart:istop] + t = np.linspace(TSTART, TSTOP, len(ecp)) + ax.plot(t-TSTIM, ecp-offset, linewidth=0.5, color=color) + +def get_colors(cmap=COLOR, n=NSLICES, skipfirst=4 if COLOR=='Greys' else 1): + color_norm = colors.Normalize(vmin=0, vmax=n+skipfirst) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap=cmap) + cmap = [scalar_map.to_rgba(n-(i+skipfirst)) for i in range(n)] + return cmap + +def plot_counts(ax, slice_counts, halfgap=8): + for (slice_i, count), color in zip(slice_counts.items(), get_colors()): + top = slice_i * THICKNESS + halfgap + bottom = (slice_i + 1) * THICKNESS - halfgap + mid = (top + bottom) / 2.0 + ax.plot([count, count], [top, bottom], color=color) + # if count > 0: + # ax.text(count, mid, str(count), rotation=90, fontsize=4, + # horizontalalignment='right', verticalalignment='center') + +fig = plt.figure(figsize=(11, 4)) +gs = GridSpec(1, 20, figure=fig) + +# Raw traces +ax = plt.subplot(gs[0, 0:3]) +ax.get_yaxis().set_visible(False) +ax.set_xticks([-100, 0, 100, 200]) +ax.set_xlabel("Time (ms)") +reader = LayerReader(nwbfile=nwbfile) +plot_contribs(reader, ax) + +# Power spectra +plotter = PS_cls(nwbfile, '', device='ECoG', nosave=True) +ax = plt.subplot(gs[0, 4:10]) +plt.sca(ax) +# plt.title("Power spectra, {}um slices".format(THICKNESS)) +for slice_i, color in zip(range(NSLICES), get_colors()): + plotter.plot_one_slice(slice_i, 'contrib', color=color) + +layer_slice_counts = get_layer_slice_counts(JOBNUM, thickness=THICKNESS) +print(json.dumps(layer_slice_counts, indent=4, sort_keys=True)) +layers = [1, 2, 3, 4, 5, 6] + +# Num layer segments in each slice +for layer, slice_counts in layer_slice_counts.items(): + ax = plt.subplot(gs[0, 11+layer-1:11+layer]) + ax.set_title(numerals[layer]) + plt.sca(ax) + ax.set_ylim([2100, 0]) + if layer in (1, 2): + xlim = 14000 if THICKNESS == 100 else 25000 + ax.set_xlim([0, xlim]) + plt.xticks([xlim], rotation='vertical') + else: + xlim = 135000 if THICKNESS == 100 else 265000 + ax.set_xlim([0, xlim]) + plt.xticks([xlim], rotation='vertical') + + if layer == 1: + ax.set_ylabel("Depth (um)") + else: + ax.get_yaxis().set_visible(False) + plot_counts(ax, slice_counts) +# depth axis on L1 + +# Num total segments in each slice +ax = plt.subplot(gs[0, 17]) +plt.sca(ax) +ax.set_title("Total") +ax.set_ylim([NSLICES-0.5, -0.5]) +ax.get_yaxis().set_visible(False) +# ax.get_xaxis().set_visible(False) +xlim = 200000 if THICKNESS == 100 else 350000 +ax.set_xlim([0, xlim]) +plt.xticks([xlim], rotation='vertical') +# for spine in ['left', 'right', 'top', 'bottom']: +# ax.spines[spine].set_visible(False) +total_counts = [sum(layer_slice_counts[layer][slice_i] for layer in layers) for slice_i in range(NSLICES)] +print(total_counts) +ax.barh( + range(NSLICES), + total_counts, + color=get_colors(), + height=0.8 +) + +# Fraction of segments in each layer +subgs = GridSpecFromSubplotSpec(NSLICES, 1, subplot_spec=gs[0, 18:20]) +for slice_i, color in zip(range(NSLICES), get_colors()): + ax = plt.subplot(subgs[slice_i, 0]) + ax.axis('off') + plt.bar(layers, [layer_slice_counts[l][slice_i] for l in layers], width=0.7, color=color) +# Label layers on bottom subplot only +ax = plt.subplot(subgs[-1, 0]) +ax.axis('on') +ax.get_yaxis().set_visible(False) +for spine in ['left', 'right', 'top', 'bottom']: + ax.spines[spine].set_visible(False) +ax.set_xticks(layers) +ax.set_xticklabels([numerals[l] for l in layers]) + +col = '' if COLOR == 'Greys' else ('_'+COLOR) +plt.tight_layout() +plt.savefig('power_spectrum_{}um_{}_{}{}.pdf'.format(THICKNESS, JOBNUM, TYPE, col)) +plt.savefig('power_spectrum_100um_latest.pdf'.format(THICKNESS, JOBNUM, TYPE, col)) diff --git a/analysis/simulation_analysis/power_spectrum_layers.py b/analysis/simulation_analysis/power_spectrum_layers.py new file mode 100644 index 0000000..6ffff51 --- /dev/null +++ b/analysis/simulation_analysis/power_spectrum_layers.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- + +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.gridspec import GridSpec +import matplotlib.colors as colors +import matplotlib.cm as cmx + +from layer_reader import LayerReader +from power_spectrum import PowerSpectrum, PowerSpectrumRatio +from utils import find_layer_ei_ecp_file + +TSTART, TSTOP, TSTIM = 2400, 2700, 2500 +JOBNUM = '29812500' +TYPE = 'ratio' +nwbfile = find_layer_ei_ecp_file(JOBNUM) +expt_nwbfile = "/Users/vbaratham/src/simulation_analysis/R32_B6_notch_filtered.nwb" + +def get_colors(n=6): + color_norm_e = colors.Normalize(vmin=0, vmax=n+1) + scalar_map_e = cmx.ScalarMappable(norm=color_norm_e, cmap='Greys') + cmap = [scalar_map_e.to_rgba(i+1) for i in range(0, n+1)][1:] + + return cmap + +def plot_ecp(reader, ax, layer, offset=0, color='red'): + data = reader.raw_contrib(layer=layer) + rate = reader.raw_rate() + istart, istop = int(round(TSTART/1000.0*rate)), int(round(TSTOP/1000.0*rate)) + ecp = data[istart:istop] + t = np.linspace(TSTART, TSTOP, len(ecp)) + ax.plot(t-TSTIM, ecp-offset, linewidth=0.5, color=color) + +def plot_contribs(nwb, ax): + layers = [1, 2, 3, 4, 5, 6] + colors = get_colors() + offset_per_layer = .15 + reader = LayerReader(nwb=nwb) + for layer, color in zip(layers, colors): + offset = layer * offset_per_layer + plot_ecp(reader, ax, layer, offset=offset, color=color) + +def plot_power_spectra_contrib(plotter, ax, _type='contrib'): + layers = [1, 2, 3, 4, 5, 6] + colors = get_colors() + plt.sca(ax) + y = .95 + label = 'Contribution' if _type == 'contrib' else 'Lesion' + for layer, color in zip(layers, colors): + plotter.plot_one_layer_ei(layer, '', _type, color=color) + ax.text(.95, y, "L{} {}".format(layer, label), fontsize=7, color=color, + horizontalalignment='right', verticalalignment='top', transform=ax.transAxes) + y -= 0.07 + print("done layer {}".format(layer)) + +fig = plt.figure(figsize=(9, 3)) +gs = GridSpec(1, 3, figure=fig) + +PS_cls = PowerSpectrum if TYPE == 'zscore' else PowerSpectrumRatio +sim_plotter = PS_cls(nwbfile, '', device='ECoG', stim_i='avg', nosave=True, + color='red', label='In silico') + +# Raw contribs +ax = plt.subplot(gs[0, 0]) +plot_contribs(sim_plotter.nwb, ax) +ax.get_yaxis().set_visible(False) +ax.set_xlabel("Time (ms)") +ax.set_title("a", loc='left') + +ax = plt.subplot(gs[0, 1]) +plot_power_spectra_contrib(sim_plotter, ax, _type='contrib') +ax.set_title("b", loc='left') + +ax = plt.subplot(gs[0, 2]) +plot_power_spectra_contrib(sim_plotter, ax, _type='lesion') +ax.set_title("c", loc='left') + +plt.tight_layout() +plt.savefig('power_spectrum_layers_{}_{}.png'.format(TYPE, JOBNUM)) +plt.savefig('power_spectrum_layers_{}_latest.pdf'.format(TYPE)) diff --git a/analysis/simulation_analysis/raw_ecp.py b/analysis/simulation_analysis/raw_ecp.py new file mode 100644 index 0000000..732a691 --- /dev/null +++ b/analysis/simulation_analysis/raw_ecp.py @@ -0,0 +1,77 @@ +import os +import numpy as np +import matplotlib.pyplot as plt + +from utils import bandpass +from analysis import BasePlotter, PlotterArgParser + +class RawECP(BasePlotter): + def __init__(self, nwbfile, outdir, **kwargs): + self.bandpass = kwargs.pop('bandpass', None) + + super(RawECP, self).__init__(nwbfile, outdir, **kwargs) + + def add_stim_line(self, where='top'): + tr = self.nwb.trials + stim_idx = tr['sb'][:] == 's' + start_times = tr['start_time'][stim_idx] + stop_times = tr['stop_time'][stim_idx] + top = plt.ylim()[1 if where=='top' else 0] + + for (start, stop) in zip(start_times, stop_times): + if start > self.tstop or stop < self.tstart: + continue + plt.plot([start, stop], [top, top], color='blue') + + + def plot_one(self, channel): + if args.tstart is None or args.tstop is None: + raise ValueError('Must specify --tstart and --tstop for RawECP') + + fig = plt.figure(figsize=(8, 2)) + rate = self.raw_dset.rate + istart, istop = int(self.tstart*rate), int(self.tstop*rate) + ch_data = self.raw_dset.data[istart:istop, channel] + + # TODO: axis labels + t = np.arange(self.tstart, self.tstop, 1.0/rate) + + # fix off-by-one time round errors + t, ch_data = self.fix_len_off_by_one(t, ch_data) + + if self.bandpass: + print('bandpassing from {} to {}'.format(self.bandpass[0], self.bandpass[1])) + ch_data = bandpass(ch_data, rate, lowcut=self.bandpass[0], highcut=self.bandpass[1]) + + plt.plot(t, ch_data, linewidth=0.5, color='red') + self.add_stim_line() + plt.xlabel('Time (s)') + plt.tight_layout() + + if not self.nosave: + fn = 'rawECP_{}_ch{:02d}_{}.{}'.format( + self.device, channel, self.identifier, self.filetype + ) + full_fn = os.path.join(self.outdir, fn) + plt.savefig(full_fn) + + if self.show: + plt.show() + + fig.clear() + + def do_plots(self): + dset = self.raw_dset + n_timepts, n_ch = dset.data.shape[:2] + for i in range(n_ch): + self.plot_one(i) + + +if __name__ == '__main__': + parser = PlotterArgParser() + parser.add_argument('--bandpass', nargs=2, type=float, required=False, default=None, + help='low/high cutoffs to bandpass before running') + args = parser.parse_args() + + analysis = RawECP(args.nwbfile, args.outdir, tstart=args.tstart, tstop=args.tstop, filetype=args.filetype, bandpass=args.bandpass) + analysis.run() diff --git a/analysis/simulation_analysis/tone_avg_ecp.py b/analysis/simulation_analysis/tone_avg_ecp.py new file mode 100644 index 0000000..de701e0 --- /dev/null +++ b/analysis/simulation_analysis/tone_avg_ecp.py @@ -0,0 +1,86 @@ +""" +Plot the avg raw response to the BF on a given electrode +""" + +import numpy as np +import matplotlib.pyplot as plt +import h5py + +from analysis import BasePlotter, PlotterArgParser +from utils import bandpass, highpass + +class ToneAvgECP(BasePlotter): + def plot(self, channel): + rate = self.raw_dset.rate + bf = self.get_bfs()[channel] + trials = self.nwb.trials + trial_idxs = np.logical_and(np.logical_and(trials['sb'][:] == 's', trials['frq'][:] == str(bf)), trials['amp'][:] == '7') + # trial_idxs = trials['sb'][:] == 's' + start_times = trials['start_time'][trial_idxs]-0.05 + window_len_samp = int(0.15 * rate) + stim_periods = [(int(t*rate), int(t*rate) + window_len_samp) for t in start_times] + ch_data = self.raw_dset.data[:, channel] * 1000 + # ch_data = bandpass(ch_data, rate, 2, 3000) + # ch_data = highpass(ch_data, rate, 800) + all_stim_data = [ch_data[istart:istop] for istart, istop in stim_periods] + stim_data = np.stack(all_stim_data) + avg_waveform = np.average(stim_data, axis=0) + std_waveform = np.std(stim_data, axis=0) + t = np.linspace(-50, 100, len(avg_waveform)) + + # DEBUG + # for i in range(len(start_times)): + # plt.plot(t, stim_data[i, :], color='k', linewidth=0.3, alpha=0.3) + # END DEBUG + plt.fill_between(t, avg_waveform+std_waveform, avg_waveform-std_waveform, color='grey') + plt.plot(t, avg_waveform, color='black') + + # Draw stim bars + ymin, ymax = plt.ylim() + plt.plot([0, 0], [ymin, ymax], linestyle='--', linewidth=0.5, color='k') + plt.plot([50, 50], [ymin, ymax], linestyle='--', linewidth=0.5, color='k') + + # Draw peak bars + center_samp = 10 + center_time = center_samp / self.proc_dset.rate + t1, t2 = (center_time - .005) * 1000, (center_time + .005) * 1000 + plt.plot([t1, t1], [ymin, ymax], linewidth=0.3, color='red') + plt.plot([t2, t2], [ymin, ymax], linewidth=0.3, color='red') + + plt.xlim([-50, 100]) + plt.ylim([ymin, ymax]) + + plt.xlabel("Time (ms)") + plt.ylabel("Voltage (mV)") + plt.tight_layout() + + +if __name__ == '__main__': + # TONE150 (not used) + # rat = 'R72' + # block = 'R72_B6' + # rat = 'R73' + # block = 'R73_B2' + rat = 'R70' + block = 'R70_B8' + # rat = 'R75' + # block = 'R75_B8' + my_preproc = ['R70', 'R67'] + + rat = 'R32' + block = 'R32_B7' + + nwbfile = '/data/{}/{}.nwb'.format(rat, block) + auxfile = '/data/{}/{}_aux.h5'.format(rat, block) + + # Not used - all tone blocks are preprocessed by me + # proc_dset_name = 'Hilb_54bands' if rat in my_preproc else 'Wvlt_4to1200_54band_CAR0' + + for channel in range(128): + plotter = ToneAvgECP(nwbfile, '.', no_baseline_stats=True, auxfile=auxfile) + plt.figure(figsize=(4.2, 4)) + plotter.plot(channel) + plt.savefig('plots/tone_raw_{}_ch{}.pdf'.format(block, channel)) + plt.close() + print("done channel {}".format(channel)) + diff --git a/analysis/simulation_analysis/tone_figure.py b/analysis/simulation_analysis/tone_figure.py new file mode 100644 index 0000000..5b46e6e --- /dev/null +++ b/analysis/simulation_analysis/tone_figure.py @@ -0,0 +1,205 @@ +# -*- coding: utf-8 -*- +""" +Figure 1 of the High gamma ECoG paper +""" +import os, sys +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.gridspec import GridSpec +import matplotlib.patches as patches +import matplotlib.cm as cmx +import matplotlib.colors as colors + +from tone_avg_ecp import ToneAvgECP +from tone_spectrogram import ToneSpectrogram +from tone_power_spectrum import TonePowerSpectrum +from tone_spectrogram import ToneSpectrogram + +rat = 'R18' +block = 'R18_B12' +tstart, tstop = 40, 42.5 +# channel = 109 # for single channel plots +# channels = [10, 20, 30, 40, 50, 60, 70, 80, 124, 100, 109] # for Hg plot +if len(sys.argv) > 1: + channel = int(sys.argv[-1]) + channels = [] +else: + channel = np.random.randint(128) + channels = list(np.random.randint(128, size=10)) +channels.append(channel) +print("Channel = {}".format(channel)) +print("Channels = {}".format(channels)) +if os.path.exists("fig1_ch{}.pdf".format(channel)): + exit("Already done channel") + +nwbfile = '/data/{}/{}.nwb'.format(rat, block) +auxfile = '/data/{}/{}_aux.h5'.format(rat, block) +specfile = '/data/{}/{}_spectra.h5'.format(rat, block) + +fig = plt.figure(figsize=(7, 7)) +# gs = GridSpec(4, 3, height_ratios=(1, 2, 2, 3.8)) + +######## +# AXES +######## + +# ECoG micrograph (not produced here) + +CBAR_WD = .015 +CBAR_GAP = .005 +LEN = .5 + +# Stimulus +# stim_ax = plt.subplot(gs[0, 1:]) +stim_ax = fig.add_axes([.4, 1-.08, LEN, .08]) +stim_ax.get_xaxis().set_visible(False) +stim_ax.get_yaxis().set_visible(False) + +# Z-scored High gamma response +# hg_ax = plt.subplot(gs[1, 1:], sharex=stim_ax) +hg_ax = fig.add_axes([.4, 1-.08-.16, LEN, .16], sharex=stim_ax) +hg_ax.get_xaxis().set_visible(False) +hg_ax.set_ylabel("Hγ (Z-score)") + +freq_colorbar_ax = fig.add_axes([.4+LEN+CBAR_GAP, 1-.08-.16+.005, CBAR_WD, .23]) + +# Spectrogram +# spect_ax = plt.subplot(gs[2, 1:], sharex=stim_ax) +bottom = 1-.08-.16-.16 +spect_ax = fig.add_axes([.4, bottom, LEN, .16], sharex=stim_ax) +spect_colorbar_ax = fig.add_axes([.4+LEN+CBAR_GAP, bottom, CBAR_WD, .16]) + +SQ = .25 + +# Trial-avg raw trace +# raw_ax = plt.subplot(gs[3, 0]) +raw_ax = fig.add_axes([.08, 1-.08-.16-.16-SQ, SQ, SQ]) +raw_ax.get_xaxis().set_visible(False) + +# Trial-avg spectrogram +# avg_spect_ax = plt.subplot(gs[3, 1]) +bottom = 1-.08-.16-.16-SQ-.02-SQ +avg_spect_ax = fig.add_axes([.08, bottom, SQ, SQ]) +avg_colorbar_ax = fig.add_axes([.08+SQ+CBAR_GAP, bottom, CBAR_WD, SQ]) + +# Power spectrum +# ps_ax = plt.subplot(gs[3, 2]) +ps_ax = fig.add_axes([.5, .08, .45, .45]) + + +######## +# PLOTS +######## + + +# Trial-avg raw trace +plt.sca(raw_ax) +plotter = ToneAvgECP(nwbfile, '.', no_baseline_stats=True, auxfile=auxfile, nosave=True) +plotter.plot(channel) + +# Trial-avg spectrogram +plt.sca(avg_spect_ax) +plotter = ToneSpectrogram(nwbfile, '.', auxfile=auxfile, nosave=True) +im = plotter.plot_one(channel) +cbar = fig.colorbar(im, cax=avg_colorbar_ax) +avg_colorbar_ax.tick_params(labelsize=6) +cbar.set_label("Z-score", size=8) + +# Power spectrum +plt.sca(ps_ax) +plotter = TonePowerSpectrum(nwbfile, '.', auxfile=auxfile, half_width=.005, nosave=True) +plotter.prepare_axes() +plotter.plot_all_and_avg(specfile=specfile) + +# Stimulus +nwb = plotter.nwb +bfs = plotter.get_bfs() +trial_idxs = np.logical_and(nwb.trials['start_time'][:] > tstart, + nwb.trials['stop_time'][:] < tstop) +trial_idxs = np.logical_and(trial_idxs, nwb.trials['sb'][:] == 's') +start_times = nwb.trials['start_time'][trial_idxs] +freqs = np.array([float(f) for f in nwb.trials['frq'][trial_idxs]]) +ampls = np.array([float(f) for f in nwb.trials['amp'][trial_idxs]]) +all_freqs = np.array([float(f) for f in nwb.trials['frq'][::2]]) +fmin, fmax = np.min(all_freqs), np.max(all_freqs) +nfreqs = len(np.unique(all_freqs)) +print(bfs) +print([bfs[ch] for ch in channels]) +print(freqs) +print(ampls) + +color_norm = colors.LogNorm(vmin=fmin, vmax=fmax) +cmap = cmx.ScalarMappable(norm=color_norm, cmap='jet') +# use scalar_map.to_rgba(freq) for each freq's color +cbar = fig.colorbar(cmap, cax=freq_colorbar_ax) +cmin, cmax = freq_colorbar_ax.get_xlim() +cbar_mid = np.exp((np.log(cmin) + np.log(cmax)) / 2.0) +freq_colorbar_ax.plot(cbar_mid, bfs[channel], marker='.', color='k') +freq_colorbar_ax.tick_params(labelsize=6) +cbar.set_label("Freq (Hz)", size=8) + +for start_time, freq, ampl in zip(start_times, freqs, ampls): + stim_ax.add_patch(patches.Rectangle((start_time, 0), .05, ampl, color=cmap.to_rgba(freq))) + +stim_ax.set_xlim([tstart, tstop]) +stim_ax.set_ylim([0, 8]) + + +# Hg +bands = plotter.proc_dset.bands['band_mean'][:] +f_idx = np.logical_and(bands > 65, bands < 170) +rate = plotter.proc_dset.rate +istart, istop = int(tstart*rate), int(tstop*rate) +t = np.linspace(tstart, tstop, istop-istart) +bl_mu, bl_std = plotter.proc_bl_stats +for ch in channels: + mu = np.average(bl_mu[ch, f_idx]) + std = np.average(bl_std[ch, f_idx]) + ch_hg = plotter.proc_dset.data[istart:istop, ch, f_idx] + ch_hg = np.average(ch_hg, axis=-1) + ch_hg = (ch_hg - mu) / std + hg_ax.plot(t, ch_hg, linewidth=0.5, color=cmap.to_rgba(bfs[ch])) + +ymin, ymax = hg_ax.get_ylim() +for start_time in start_times: + hg_ax.plot([start_time, start_time], (ymin, ymax), + linestyle='--', color='grey', linewidth=0.5) + hg_ax.plot([start_time+.05, start_time+.05], (ymin, ymax), + linestyle='--', color='grey', linewidth=0.5) +hg_ax.set_ylim([ymin, ymax]) +hg_ax.set_xlim([tstart, tstop]) + + +# Spectrogram +class ToneSpectrogramLong(ToneSpectrogram): + def get_t_extent(self): + t = np.arange(tstart, tstop, 1.0/self.proc_dset.rate) + extent = [tstart, tstop, 0, 1] + return t, extent + + def draw_stim_bars(self): + pass + def draw_peak_bars(self): + pass + +plt.sca(spect_ax) +plotter = ToneSpectrogramLong(nwbfile, '.', tstart=tstart, tstop=tstop, stim_i='', auxfile=auxfile) +im = plotter.plot_one(channel, vmin=0, vmax=7) +cbar = fig.colorbar(im, cax=spect_colorbar_ax) +spect_colorbar_ax.tick_params(labelsize=6) +cbar.set_label("Z-score", size=8) + +ymin, ymax = spect_ax.get_ylim() +for start_time in start_times: + spect_ax.plot([start_time, start_time], (ymin, ymax), + linestyle='--', color='grey', linewidth=0.5) + spect_ax.plot([start_time+.05, start_time+.05], (ymin, ymax), + linestyle='--', color='grey', linewidth=0.5) +spect_ax.set_ylim([ymin, ymax]) +spect_ax.set_xlim([tstart, tstop]) + + + + +# plt.show() +plt.savefig("fig1_ch{}.pdf".format(channel)) diff --git a/analysis/simulation_analysis/tone_power_spectrum.py b/analysis/simulation_analysis/tone_power_spectrum.py new file mode 100644 index 0000000..3f79e2b --- /dev/null +++ b/analysis/simulation_analysis/tone_power_spectrum.py @@ -0,0 +1,169 @@ +"""Generate power spectrum from tone150 experimental block. Overlays +channels. Uses best frequency at each channel only. """ +import os + +import numpy as np +import h5py +import matplotlib.pyplot as plt + +from power_spectrum import PowerSpectrum +from utils import wavelet_cfs + +def bf_tone(plotter, auxfile, hg_min=65, hg_max=170): + """ + Compute and store the baseline stats and best frequencies on each channel + """ + nwb = plotter.nwb + bl_mu, bl_std = plotter.proc_bl_stats + + # Grab list of all frequencies presented + all_stim_freq = [int(x) for x in np.unique(nwb.trials['frq'][:])] + n_stim_freq = len(all_stim_freq) + + # Grab Z-scored high gamma data for each stim freq individually, + # compute max within each trial, and average across trials + proc_dset = plotter.proc_dset + _, n_ch, _ = proc_dset.data.shape + trials = plotter.nwb.trials + f_idx = np.logical_and(wavelet_cfs > hg_min, wavelet_cfs < hg_max) + + freq_maxes = np.empty(shape=(n_stim_freq, n_ch)) # trial-avg of max Hg amplitude per ch + for stim_freq_i, stim_freq in enumerate(all_stim_freq): + trial_idxs = np.logical_and(trials['sb'][:] == 's', trials['frq'][:] == str(stim_freq)) + times = zip(trials['start_time'][trial_idxs], trials['stop_time'][trial_idxs]) + time_idxs = [(int(t[0]*proc_dset.rate), int(t[1]*proc_dset.rate)) for t in times] + ch_maxes = np.empty(shape=(len(time_idxs), n_ch)) + for trial_i, (istart, istop) in enumerate(time_idxs): + trial_data = proc_dset.data[istart:istop, :, f_idx] + trial_data = (trial_data - bl_mu[:, f_idx]) / bl_std[:, f_idx] + trial_data = np.average(trial_data, axis=-1) + ch_maxes[trial_i, :] = np.max(trial_data, axis=0) + freq_maxes[stim_freq_i, :] = np.average(ch_maxes, axis=0) + bf_idxs = np.argmax(freq_maxes, axis=0) + bf = np.array([all_stim_freq[bf_i] for bf_i in bf_idxs]) + + with h5py.File(auxfile) as h5file: + h5file.create_dataset('/bl_mu', data=bl_mu) + h5file.create_dataset('/bl_std', data=bl_std) + h5file.create_dataset('/freq_maxes', data=freq_maxes) + h5file.create_dataset('/bf', data=bf) + + +class TonePowerSpectrum(PowerSpectrum): + def get_bfs(self): + with h5py.File(self.auxfile) as infile: + return infile['/bf'][:] + + + def get_spectrum(self, channel): + ch_data = self.proc_dset.data[:, channel, :] + n_timepts, n_bands = ch_data.shape + rate = self.proc_dset.rate + + hw = int(self.half_width * rate) + + # Rescale to baseline mean/stdev + bl_mean, bl_std = self.proc_bl_stats + bl_mean, bl_std = bl_mean[channel, :], bl_std[channel, :] + ch_data = (ch_data - bl_mean) / bl_std + + # Grab center frequencies from bands table + # def log_spaced_cfs(fmin, fmax, nbin=6): + # noct = np.ceil(np.log2(fmax/fmin)) + # return fmin * 2**(np.arange(noct*nbin)/nbin) + # band_means = log_spaced_cfs(2.6308, 1200.0) + # band_means = self.proc_dset.bands['band_mean'][:] + band_means = wavelet_cfs + hg_band_idx = np.logical_and(band_means > 65, band_means < 170) + + # Grab stim-on data for best freq + bf = self.get_bfs()[channel] + trials = self.nwb.trials + trial_idxs = np.logical_and(np.logical_and(trials['sb'][:] == 's', trials['frq'][:] == str(bf)), trials['amp'][:] == '7') + times = zip(trials['start_time'][trial_idxs], trials['stop_time'][trial_idxs]) + stim_periods = [(int(t[0]*self.proc_dset.rate), int(t[1]*self.proc_dset.rate)) for t in times] + + n_stim_timepts = stim_periods[0][1] - stim_periods[0][0] + stim_data = np.zeros(shape=(len(stim_periods), n_stim_timepts, n_bands)) + for i, (t1, t2) in enumerate(stim_periods): + stim_data[i, :, :] = ch_data[t1:t1+n_stim_timepts, :] + + # Calculate max of average high gamma response + # Average over stims, bands in hg range: time axis remains + hg_data = np.average(stim_data[:, :, hg_band_idx], axis=(0,2)) + max_i = np.argmax(hg_data) + self.max_i = max_i + print(channel, max_i) + max_i += self.time_shift_samp + if max_i - hw <= 0: + spectrum = np.zeros(shape=(54,)) + errors = np.zeros(shape=(54,)) + else: + # Average over stims, time: freq (bands) axis remainds + spectrum = np.average(stim_data[:, max_i-hw:max_i+hw, :], axis=(0,1)) + errors = np.std(stim_data[:, max_i-hw:max_i+hw, :], axis=(0,1)) + + return band_means, spectrum, errors + + def plot_all_and_avg(self, specfile=None): + if specfile and os.path.exists(specfile): + print("using saved spectra") + with h5py.File(specfile) as infile: + all_spectra = infile['power_spectra'][:] + else: + print("Computing spectra") + all_spectra = [self.get_spectrum(ch)[1] for ch in range(self.n_ch)] + + # if specfile and os.path.exists(specfile): + # os.remove(specfile) + if specfile and not os.path.exists(specfile): + with h5py.File(specfile) as outfile: + outfile.create_dataset('f', data=wavelet_cfs) + outfile.create_dataset('power_spectra', data=np.stack(all_spectra)) + + ch_spectra = [] + for ch in range(self.n_ch): + # f, spectrum, errors = self.get_spectrum(ch) + spectrum = all_spectra[ch] + if np.any(spectrum > 3.0): + ch_spectra.append(spectrum) + plt.plot(wavelet_cfs, spectrum, color='k', alpha=0.3, linewidth=0.3) + avg_spectrum = np.average(np.stack(ch_spectra), axis=0) + plt.plot(wavelet_cfs, avg_spectrum, color='red', alpha=1, linewidth=2) + print("plotted {} spectra".format(len(ch_spectra))) + + + +if __name__ == '__main__': + # TONE150: + # rat = 'R72' + # block = 'R72_B6' + # rat = 'R73' + # block = 'R73_B2' + # rat = 'R75' + # block = 'R75_B8' + # rat = 'R70' + # block = 'R70_B8' + + # rat = 'R32' + # block = 'R32_B7' + rat = 'R18' + block = 'R18_B12' + + nwbfile = '/data/{}/{}.nwb'.format(rat, block) + auxfile = '/data/{}/{}_aux.h5'.format(rat, block) + specfile = '/data/{}/{}_spectra.h5'.format(rat, block) + + plotter = TonePowerSpectrum(nwbfile, '.', + # proc_dset_name='Wvlt_4to1200_54band_CAR0', + auxfile=auxfile, half_width=0.005) + + if not os.path.exists(auxfile): + bf_tone(plotter, auxfile) + + plt.figure(figsize=(4, 4)) + plotter.prepare_axes() + plotter.plot_all_and_avg(specfile=specfile) + + plt.savefig("plots/tone_ps_{}.pdf".format(block)) + diff --git a/analysis/simulation_analysis/tone_spectrogram.py b/analysis/simulation_analysis/tone_spectrogram.py new file mode 100644 index 0000000..16c410d --- /dev/null +++ b/analysis/simulation_analysis/tone_spectrogram.py @@ -0,0 +1,133 @@ +import os +import numpy as np +import matplotlib.pyplot as plt + +from analysis import BasePlotter, PlotterArgParser + +class ToneSpectrogram(BasePlotter): + + def get_t_extent(self): + t = np.arange(-100, 150, 1/self.proc_dset.rate) + extent = [-100, 150, 0, 1] + return t, extent + + def draw_stim_bars(self): + ymax, ymin = plt.ylim() + plt.plot([0, 0], [ymin, ymax], linestyle='--', linewidth=0.5, color='k') + plt.plot([50, 50], [ymin, ymax], linestyle='--', linewidth=0.5, color='k') + plt.ylim([ymax, ymin]) + + def draw_peak_bars(self): + ymax, ymin = plt.ylim() + center_samp = 10 + center_time = center_samp / self.proc_dset.rate + t1, t2 = (center_time - .005) * 1000, (center_time + .005) * 1000 + plt.plot([t1, t1], [ymin, ymax], linewidth=0.3, color='red') + plt.plot([t2, t2], [ymin, ymax], linewidth=0.3, color='red') + plt.ylim([ymax, ymin]) + + def plot_one(self, channel, **plot_kwargs): + """ + Make one spectrogram and save it to file + """ + ch_data = self.proc_dset.data[:, channel, :] + rate = self.proc_dset.rate + + # Grab stim-on data, trial average if requested + bf = self.get_bfs()[channel] + trials = self.nwb.trials + trial_idxs = np.logical_and(np.logical_and(trials['sb'][:] == 's', trials['frq'][:] == str(bf)), trials['amp'][:] == '7') + times = zip(trials['start_time'][trial_idxs]-.1, trials['stop_time'][trial_idxs]+.1) + stim_periods = [(int(t[0]*self.proc_dset.rate), int(t[1]*self.proc_dset.rate)) for t in times] + if self.stim_i == 'avg': + print("doing stim avg") + n_stim_timepts = stim_periods[0][1] - stim_periods[0][0] + stim_data = np.average( + np.stack([ch_data[t[0]:t[0]+n_stim_timepts] for t in stim_periods]), + axis=0 + ) + elif self.tstart is not None and self.tstop is not None: + print("using tstart, tstop") + istart, istop = int(self.tstart*rate), int(self.tstop*rate) + stim_data = ch_data[istart:istop, :] + else: # self.stim_i is an integer index + print("doing stim {}".format(self.stim_i)) + tstart, tstop = stim_periods[self.stim_i] + stim_data = ch_data[tstart:tstop, :] + + # Rescale to baseline mean/stdev + bl_mean, bl_std = self.proc_bl_stats + bl_mean, bl_std = bl_mean[channel, :], bl_std[channel, :] + stim_data = (stim_data - bl_mean) / bl_std + # stim_data = stim_data / bl_mean + + # Get band info for axis labels + bands = self.proc_dset.bands['band_mean'][:] + + # Make plot + t, extent = self.get_t_extent() + ax = plt.gca() + im = ax.imshow(stim_data.T, origin='lower', cmap='Greys', aspect='auto', + extent=extent, **plot_kwargs) # , vmin=0, vmax=5) + + + plt.xlabel('Time (ms)') + plt.ylabel("Frequency (Hz)") + ticks, ticklabels = [], [] + for i in range(0, len(bands), 8): + ticks.append(float(i)/len(bands)) + ticklabels.append(int(bands[i])) + ax.set_yticks(ticks) + ax.set_yticklabels(ticklabels) + # plt.colorbar(label="Stim/baseline ratio") + # plt.colorbar().set_label(label="Z-score Amplitude", size=8) + plt.tight_layout() + + # Draw stim bars + self.draw_stim_bars() + + # Draw peak bars + self.draw_peak_bars() + + if not self.nosave: + fn = 'spectrogram_{}_ch{:02d}_{}.{}'.format( + self.device, channel, self.identifier, self.filetype + ) + full_fn = os.path.join(self.outdir, fn) + plt.savefig(full_fn) + + if self.show: + plt.show() + + return im + + +if __name__ == '__main__': + # TONE150 (not used) + # rat = 'R72' + # block = 'R72_B6' + # rat = 'R73' + # block = 'R73_B2' + # rat = 'R70' + # block = 'R70_B8' + # rat = 'R75' + # block = 'R75_B8' + my_preproc = ['R70', 'R67'] + + rat = 'R32' + block = 'R32_B7' + + nwbfile = '/data/{}/{}.nwb'.format(rat, block) + auxfile = '/data/{}/{}_aux.h5'.format(rat, block) + + # Not used - all tone blocks are preprocessed by me + # proc_dset_name = 'Hilb_54bands' if rat in my_preproc else 'Wvlt_4to1200_54band_CAR0' + + plotter = ToneSpectrogram(nwbfile, '.', auxfile=auxfile) + for channel in range(128): + plt.figure(figsize=(5, 4)) + plotter.plot_one(channel) + plt.savefig('plots/tone_spect_{}_ch{}.pdf'.format(block, channel)) + plt.close() + print("done channel {}".format(channel)) + diff --git a/analysis/simulation_analysis/utils.py b/analysis/simulation_analysis/utils.py new file mode 100644 index 0000000..945df77 --- /dev/null +++ b/analysis/simulation_analysis/utils.py @@ -0,0 +1,91 @@ +import glob +import os +import json + +import numpy as np +from scipy.signal import butter, lfilter + +def butter_bandpass(lowcut, highcut, fs, order=5): + nyq = 0.5 * fs + low = lowcut / nyq + high = highcut / nyq + b, a = butter(order, [low, high], btype='band') + return b, a + + +def bandpass(data, fs, lowcut=20, highcut=5000, order=5): + b, a = butter_bandpass(lowcut, highcut, fs, order=order) + y = lfilter(b, a, data) + return y + +def butter_highpass(lowcut, fs, order=5): + nyq = 0.5 * fs + low = lowcut / nyq + b, a = butter(order, low, btype='highpass') + return b, a + +def highpass(data, fs, lowcut, order=5): + b, a = butter_highpass(lowcut, fs, order=order) + y = lfilter(b, a, data) + return y + +def log_spaced_cfs(fmin, fmax, nbin=6): + """ + Center frequencies that are uniform in log space + """ + noct = np.ceil(np.log2(fmax/fmin)) + return fmin * 2**(np.arange(noct*nbin)/nbin) + +wavelet_cfs = log_spaced_cfs(2.6308, 1200.0) + +CCROOT = '/Users/vbaratham/src/cortical-column' + +def find_layer_ei_ecp_file(jobnum): + output_dir = os.path.join(CCROOT, 'runs', jobnum, '1', 'output') + ecp_files = glob.glob(os.path.join(output_dir, 'ecp*layer_ei*.nwb')) + if len(ecp_files) == 0: + raise ValueError('No layer_ei ECP file found') + elif len(ecp_files) == 1: + return ecp_files[0] + else: + log.info( + 'Found multiple layer_ei ECP files: \n{}\n'.format('\n'.join(ecp_files)) + + '\nUsing {}\n'.format(ecp_files[-1]) + ) + return ecp_files[-1] + +def find_slice_ecp_file(jobnum, thickness=100): + output_dir = os.path.join(CCROOT, 'runs', jobnum, '1', 'output') + ecp_files = glob.glob(os.path.join(output_dir, 'ecp*{}um*.nwb'.format(thickness))) + if len(ecp_files) == 0: + raise ValueError('No 100um slice ECP file found') + elif len(ecp_files) == 1: + return ecp_files[0] + else: + log.info( + 'Found multiple 100um slice ECP files: \n{}\n'.format('\n'.join(ecp_files)) + + '\nUsing {}\n'.format(ecp_files[-1]) + ) + return ecp_files[-1] + +def get_layer_slice_counts(jobnum, thickness=100): + fn = os.path.join(CCROOT, 'runs', jobnum, '1', 'output', 'layer_slice_counts.json') + with open(fn, 'r') as infile: + orig = json.load(infile) + counts = { + int(layer): {int(slice_i): count for slice_i, count in slice_counts.items()} + for layer, slice_counts in orig.items() + } + if thickness == 100: + return counts + elif thickness == 200: + def convert(layercounts): + return {slice_i: layercounts[slice_i*2] + layercounts.get(slice_i*2 + 1, 0) + for slice_i in range(11)} + for layer in counts.keys(): + counts[layer] = convert(counts[layer]) + return counts + else: + raise ValueError("Can only do 100 or 200um slices") + +numerals = {1: 'I', 2: 'II', 3: 'III', 4: 'IV', 5: 'V', 6: 'VI'} diff --git a/bmtk-vb/CONTRIBUTING.md b/bmtk-vb/CONTRIBUTING.md new file mode 100644 index 0000000..e55867f --- /dev/null +++ b/bmtk-vb/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# Allen Institute Contribution Agreement + +This document describes the terms under which you may make “Contributions” — +which may include without limitation, software additions, revisions, bug fixes, configuration changes, +documentation, or any other materials — to any of the projects owned or managed by the Allen Institute. +If you have questions about these terms, please contact us at terms@alleninstitute.org. + +You certify that: + +• Your Contributions are either: + +1. Created in whole or in part by you and you have the right to submit them under the designated license +(described below); or +2. Based upon previous work that, to the best of your knowledge, is covered under an appropriate +open source license and you have the right under that license to submit that work with modifications, +whether created in whole or in part by you, under the designated license; or + +3. Provided directly to you by some other person who certified (1) or (2) and you have not modified them. + +• You are granting your Contributions to the Allen Institute under the terms of the [2-Clause BSD license](https://opensource.org/licenses/BSD-2-Clause) +(the “designated license”). + +• You understand and agree that the Allen Institute projects and your Contributions are public and that +a record of the Contributions (including all metadata and personal information you submit with them) is +maintained indefinitely and may be redistributed consistent with the Allen Institute’s mission and the +2-Clause BSD license. diff --git a/bmtk-vb/LICENSE.txt b/bmtk-vb/LICENSE.txt new file mode 100644 index 0000000..280f59d --- /dev/null +++ b/bmtk-vb/LICENSE.txt @@ -0,0 +1,21 @@ +Copyright 2017. Allen Institute. All rights reserved + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/bmtk-vb/README.md b/bmtk-vb/README.md new file mode 100644 index 0000000..29d5b8b --- /dev/null +++ b/bmtk-vb/README.md @@ -0,0 +1,32 @@ +# The Brain Modeling Toolkit + +A software development package for building, simulating and analyzing large-scale networks of different levels of resolution. + +## Level of Support +We are releasing this code to the public as a tool we expect others to use. Questions concerning bugs and related issues are welcomed. We expect to address them promptly, pull requests will vetted by our staff before inclusion. + + +## Quickstart +bmtk requires Python 2.7 plus [additional python dependicies](https://alleninstitute.github.io/bmtk/index.html#base-installation). To install with +base requirements from a command-line: + +```bash + $ git clone https://github.com/AllenInstitute/bmtk.git + $ cd bmtk + $ python setup.py install +``` + +There are examples of building models and running simulations located in docs/examples/. Some of the simulation engines may require additonal requirements to run. + + +## Documentation + +[User Guide](https://alleninstitute.github.io/bmtk/) +* [Building network models](https://alleninstitute.github.io/bmtk/builder.html) +* [Running biophysical simulations](https://alleninstitute.github.io/bmtk/bionet.html) +* [Running point-neuron simulations](https://alleninstitute.github.io/bmtk/pointnet.html) +* [Running population-level simulations](https://alleninstitute.github.io/bmtk/popnet.html) + + + +Copyright 2017 Allen Institute diff --git a/bmtk-vb/bmtk.egg-info/PKG-INFO b/bmtk-vb/bmtk.egg-info/PKG-INFO new file mode 100644 index 0000000..ad0b5ba --- /dev/null +++ b/bmtk-vb/bmtk.egg-info/PKG-INFO @@ -0,0 +1,57 @@ +Metadata-Version: 2.1 +Name: bmtk +Version: 0.0.6 +Summary: Brain Modeling Toolkit +Home-page: https://github.com/AllenInstitute/bmtk +Author: Kael Dai +Author-email: kaeld@alleninstitute.org +License: UNKNOWN +Description: # The Brain Modeling Toolkit + + A software development package for building, simulating and analyzing large-scale networks of different levels of resolution. + + ## Level of Support + We are releasing this code to the public as a tool we expect others to use. Questions concerning bugs and related issues are welcomed. We expect to address them promptly, pull requests will vetted by our staff before inclusion. + + + ## Quickstart + bmtk requires Python 2.7 plus [additional python dependicies](https://alleninstitute.github.io/bmtk/index.html#base-installation). To install with + base requirements from a command-line: + + ```bash + $ git clone https://github.com/AllenInstitute/bmtk.git + $ cd bmtk + $ python setup.py install + ``` + + There are examples of building models and running simulations located in docs/examples/. Some of the simulation engines may require additonal requirements to run. + + + ## Documentation + + [User Guide](https://alleninstitute.github.io/bmtk/) + * [Building network models](https://alleninstitute.github.io/bmtk/builder.html) + * [Running biophysical simulations](https://alleninstitute.github.io/bmtk/bionet.html) + * [Running point-neuron simulations](https://alleninstitute.github.io/bmtk/pointnet.html) + * [Running population-level simulations](https://alleninstitute.github.io/bmtk/popnet.html) + + + + Copyright 2017 Allen Institute + +Keywords: neuroscience,scientific,modeling,simulation +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: BSD License +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Scientific/Engineering :: Bio-Informatics +Description-Content-Type: text/markdown +Provides-Extra: mintnet +Provides-Extra: popnet +Provides-Extra: pointnet +Provides-Extra: bionet diff --git a/bmtk-vb/bmtk.egg-info/SOURCES.txt b/bmtk-vb/bmtk.egg-info/SOURCES.txt new file mode 100644 index 0000000..9b37b58 --- /dev/null +++ b/bmtk-vb/bmtk.egg-info/SOURCES.txt @@ -0,0 +1,215 @@ +README.md +setup.py +bmtk/__init__.py +bmtk.egg-info/PKG-INFO +bmtk.egg-info/SOURCES.txt +bmtk.egg-info/dependency_links.txt +bmtk.egg-info/requires.txt +bmtk.egg-info/top_level.txt +bmtk/analyzer/__init__.py +bmtk/analyzer/cell_vars.py +bmtk/analyzer/firing_rates.py +bmtk/analyzer/io_tools.py +bmtk/analyzer/spike_trains.py +bmtk/analyzer/spikes_analyzer.py +bmtk/analyzer/spikes_loader.py +bmtk/analyzer/utils.py +bmtk/analyzer/visualization/__init__.py +bmtk/analyzer/visualization/rasters.py +bmtk/analyzer/visualization/spikes.py +bmtk/analyzer/visualization/widgets.py +bmtk/builder/__init__.py +bmtk/builder/connection_map.py +bmtk/builder/connector.py +bmtk/builder/edge.py +bmtk/builder/functor_cache.py +bmtk/builder/id_generator.py +bmtk/builder/iterator.py +bmtk/builder/network.py +bmtk/builder/node.py +bmtk/builder/node_pool.py +bmtk/builder/node_set.py +bmtk/builder/aux/__init__.py +bmtk/builder/aux/edge_connectors.py +bmtk/builder/aux/node_params.py +bmtk/builder/bionet/__init__.py +bmtk/builder/bionet/swc_reader.py +bmtk/builder/formats/__init__.py +bmtk/builder/formats/hdf5_format.py +bmtk/builder/formats/iformats.py +bmtk/builder/io/__init__.py +bmtk/builder/networks/__init__.py +bmtk/builder/networks/dm_network.py +bmtk/builder/networks/input_network.py +bmtk/builder/networks/mpi_network.py +bmtk/builder/networks/nxnetwork.py +bmtk/builder/networks/sparse_network.py +bmtk/simulator/__init__.py +bmtk/simulator/bionet/__init__.py +bmtk/simulator/bionet/biocell.py +bmtk/simulator/bionet/bionetwork.py +bmtk/simulator/bionet/biosimulator.py +bmtk/simulator/bionet/cell.py +bmtk/simulator/bionet/config.py +bmtk/simulator/bionet/iclamp.py +bmtk/simulator/bionet/io_tools.py +bmtk/simulator/bionet/morphology.py +bmtk/simulator/bionet/nml_reader.py +bmtk/simulator/bionet/nrn.py +bmtk/simulator/bionet/pointprocesscell.py +bmtk/simulator/bionet/pointsomacell.py +bmtk/simulator/bionet/pyfunction_cache.py +bmtk/simulator/bionet/sonata_adaptors.py +bmtk/simulator/bionet/utils.py +bmtk/simulator/bionet/virtualcell.py +bmtk/simulator/bionet/default_setters/__init__.py +bmtk/simulator/bionet/default_setters/cell_models.py +bmtk/simulator/bionet/default_setters/synapse_models.py +bmtk/simulator/bionet/default_setters/synaptic_weights.py +bmtk/simulator/bionet/modules/__init__.py +bmtk/simulator/bionet/modules/ecp.py +bmtk/simulator/bionet/modules/record_cellvars.py +bmtk/simulator/bionet/modules/record_spikes.py +bmtk/simulator/bionet/modules/save_synapses.py +bmtk/simulator/bionet/modules/sim_module.py +bmtk/simulator/bionet/modules/xstim.py +bmtk/simulator/bionet/modules/xstim_waveforms.py +bmtk/simulator/core/__init__.py +bmtk/simulator/core/config.py +bmtk/simulator/core/edge_population.py +bmtk/simulator/core/graph.py +bmtk/simulator/core/io_tools.py +bmtk/simulator/core/network_reader.py +bmtk/simulator/core/node_population.py +bmtk/simulator/core/node_sets.py +bmtk/simulator/core/simulator.py +bmtk/simulator/core/simulator_network.py +bmtk/simulator/core/sonata_reader/__init__.py +bmtk/simulator/core/sonata_reader/edge_adaptor.py +bmtk/simulator/core/sonata_reader/network_reader.py +bmtk/simulator/core/sonata_reader/node_adaptor.py +bmtk/simulator/filternet/__init__.py +bmtk/simulator/filternet/cell.py +bmtk/simulator/filternet/cell_models.py +bmtk/simulator/filternet/config.py +bmtk/simulator/filternet/filternetwork.py +bmtk/simulator/filternet/filters.py +bmtk/simulator/filternet/filtersimulator.py +bmtk/simulator/filternet/io_tools.py +bmtk/simulator/filternet/pyfunction_cache.py +bmtk/simulator/filternet/transfer_functions.py +bmtk/simulator/filternet/utils.py +bmtk/simulator/filternet/default_setters/__init__.py +bmtk/simulator/filternet/default_setters/cell_loaders.py +bmtk/simulator/filternet/lgnmodel/__init__.py +bmtk/simulator/filternet/lgnmodel/cellmodel.py +bmtk/simulator/filternet/lgnmodel/cursor.py +bmtk/simulator/filternet/lgnmodel/fitfuns.py +bmtk/simulator/filternet/lgnmodel/kernel.py +bmtk/simulator/filternet/lgnmodel/lattice_unit_constructor.py +bmtk/simulator/filternet/lgnmodel/lgnmodel1.py +bmtk/simulator/filternet/lgnmodel/linearfilter.py +bmtk/simulator/filternet/lgnmodel/lnunit.py +bmtk/simulator/filternet/lgnmodel/make_cell_list.py +bmtk/simulator/filternet/lgnmodel/movie.py +bmtk/simulator/filternet/lgnmodel/poissongeneration.py +bmtk/simulator/filternet/lgnmodel/singleunitcell.py +bmtk/simulator/filternet/lgnmodel/spatialfilter.py +bmtk/simulator/filternet/lgnmodel/temporalfilter.py +bmtk/simulator/filternet/lgnmodel/transferfunction.py +bmtk/simulator/filternet/lgnmodel/util_fns.py +bmtk/simulator/filternet/lgnmodel/utilities.py +bmtk/simulator/filternet/modules/__init__.py +bmtk/simulator/filternet/modules/base.py +bmtk/simulator/filternet/modules/create_spikes.py +bmtk/simulator/filternet/modules/record_rates.py +bmtk/simulator/mintnet/Image_Library.py +bmtk/simulator/mintnet/Image_Library_Supervised.py +bmtk/simulator/mintnet/__init__.py +bmtk/simulator/mintnet/analysis/LocallySparseNoise.py +bmtk/simulator/mintnet/analysis/StaticGratings.py +bmtk/simulator/mintnet/analysis/__init__.py +bmtk/simulator/mintnet/hmax/C_Layer.py +bmtk/simulator/mintnet/hmax/Readout_Layer.py +bmtk/simulator/mintnet/hmax/S1_Layer.py +bmtk/simulator/mintnet/hmax/S_Layer.py +bmtk/simulator/mintnet/hmax/Sb_Layer.py +bmtk/simulator/mintnet/hmax/ViewTunedLayer.py +bmtk/simulator/mintnet/hmax/__init__.py +bmtk/simulator/mintnet/hmax/hmax.py +bmtk/simulator/pointnet/__init__.py +bmtk/simulator/pointnet/config.py +bmtk/simulator/pointnet/io_tools.py +bmtk/simulator/pointnet/pointnetwork.py +bmtk/simulator/pointnet/pointsimulator.py +bmtk/simulator/pointnet/property_map.py +bmtk/simulator/pointnet/pyfunction_cache.py +bmtk/simulator/pointnet/sonata_adaptors.py +bmtk/simulator/pointnet/utils.py +bmtk/simulator/pointnet/default_setters/__init__.py +bmtk/simulator/pointnet/default_setters/synapse_models.py +bmtk/simulator/pointnet/default_setters/synaptic_weights.py +bmtk/simulator/pointnet/modules/__init__.py +bmtk/simulator/pointnet/modules/multimeter_reporter.py +bmtk/simulator/pointnet/modules/record_spikes.py +bmtk/simulator/popnet/__init__.py +bmtk/simulator/popnet/config.py +bmtk/simulator/popnet/popedge.py +bmtk/simulator/popnet/popnetwork.py +bmtk/simulator/popnet/popnetwork_OLD.py +bmtk/simulator/popnet/popnode.py +bmtk/simulator/popnet/popsimulator.py +bmtk/simulator/popnet/sonata_adaptors.py +bmtk/simulator/popnet/utils.py +bmtk/simulator/popnet/property_schemas/__init__.py +bmtk/simulator/popnet/property_schemas/base_schema.py +bmtk/simulator/popnet/property_schemas/property_schema_ver0.py +bmtk/simulator/popnet/property_schemas/property_schema_ver1.py +bmtk/simulator/utils/__init__.py +bmtk/simulator/utils/config.py +bmtk/simulator/utils/graph.py +bmtk/simulator/utils/io.py +bmtk/simulator/utils/load_spikes.py +bmtk/simulator/utils/nwb.py +bmtk/simulator/utils/property_maps.py +bmtk/simulator/utils/sim_validator.py +bmtk/simulator/utils/simulation_inputs.py +bmtk/simulator/utils/simulation_reports.py +bmtk/simulator/utils/stimulus/LocallySparseNoise.py +bmtk/simulator/utils/stimulus/NaturalScenes.py +bmtk/simulator/utils/stimulus/StaticGratings.py +bmtk/simulator/utils/stimulus/__init__.py +bmtk/simulator/utils/tools/__init__.py +bmtk/simulator/utils/tools/process_spikes.py +bmtk/simulator/utils/tools/spatial.py +bmtk/utils/__init__.py +bmtk/utils/property_schema.py +bmtk/utils/sim_setup.py +bmtk/utils/cell_vars/__init__.py +bmtk/utils/cell_vars/var_reader.py +bmtk/utils/converters/__init__.py +bmtk/utils/converters/hoc_converter.py +bmtk/utils/converters/sonata/__init__.py +bmtk/utils/converters/sonata/edge_converters.py +bmtk/utils/converters/sonata/node_converters.py +bmtk/utils/io/__init__.py +bmtk/utils/io/cell_vars.py +bmtk/utils/io/firing_rates.py +bmtk/utils/io/spike_trains.py +bmtk/utils/io/tabular_network.py +bmtk/utils/io/tabular_network_v0.py +bmtk/utils/io/tabular_network_v1.py +bmtk/utils/sonata/__init__.py +bmtk/utils/sonata/column_property.py +bmtk/utils/sonata/config.py +bmtk/utils/sonata/edge.py +bmtk/utils/sonata/file.py +bmtk/utils/sonata/file_root.py +bmtk/utils/sonata/group.py +bmtk/utils/sonata/node.py +bmtk/utils/sonata/population.py +bmtk/utils/sonata/types_table.py +bmtk/utils/sonata/utils.py +bmtk/utils/spike_trains/__init__.py +bmtk/utils/spike_trains/spikes_csv.py +bmtk/utils/spike_trains/spikes_file.py \ No newline at end of file diff --git a/bmtk-vb/bmtk.egg-info/dependency_links.txt b/bmtk-vb/bmtk.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/bmtk-vb/bmtk.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/bmtk-vb/bmtk.egg-info/requires.txt b/bmtk-vb/bmtk.egg-info/requires.txt new file mode 100644 index 0000000..582dcee --- /dev/null +++ b/bmtk-vb/bmtk.egg-info/requires.txt @@ -0,0 +1,18 @@ +jsonschema +pandas +numpy +six +h5py +matplotlib + +[bionet] +NEURON + +[mintnet] +tensorflow + +[pointnet] +NEST + +[popnet] +DiPDE diff --git a/bmtk-vb/bmtk.egg-info/top_level.txt b/bmtk-vb/bmtk.egg-info/top_level.txt new file mode 100644 index 0000000..8ea5840 --- /dev/null +++ b/bmtk-vb/bmtk.egg-info/top_level.txt @@ -0,0 +1 @@ +bmtk diff --git a/bmtk-vb/bmtk/__init__.py b/bmtk-vb/bmtk/__init__.py new file mode 100644 index 0000000..f4f772b --- /dev/null +++ b/bmtk-vb/bmtk/__init__.py @@ -0,0 +1,23 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +__version__ = '0.0.6' diff --git a/bmtk-vb/bmtk/__init__.pyc b/bmtk-vb/bmtk/__init__.pyc new file mode 100644 index 0000000..98acade Binary files /dev/null and b/bmtk-vb/bmtk/__init__.pyc differ diff --git a/bmtk-vb/bmtk/__pycache__/__init__.cpython-35.pyc b/bmtk-vb/bmtk/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..cf5af18 Binary files /dev/null and b/bmtk-vb/bmtk/__pycache__/__init__.cpython-35.pyc differ diff --git a/bmtk-vb/bmtk/__pycache__/__init__.cpython-36.pyc b/bmtk-vb/bmtk/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..ce229e6 Binary files /dev/null and b/bmtk-vb/bmtk/__pycache__/__init__.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..d3311ea Binary files /dev/null and b/bmtk-vb/bmtk/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/analyzer/__init__.py b/bmtk-vb/bmtk/analyzer/__init__.py new file mode 100644 index 0000000..7b04c40 --- /dev/null +++ b/bmtk-vb/bmtk/analyzer/__init__.py @@ -0,0 +1,189 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +from six import string_types +import h5py +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np + +import bmtk.simulator.utils.config as cfg + + +def _get_config(config): + if isinstance(config, string_types): + return cfg.from_json(config) + elif isinstance(config, dict): + return config + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(config, type(config))) + +def plot_potential(cell_vars_h5=None, config_file=None, gids=None, show_plot=True, save=False): + if (cell_vars_h5 or config_file) is None: + raise Exception('Please specify a cell_vars hdf5 file or a simulation config.') + + if cell_vars_h5 is not None: + plot_potential_hdf5(cell_vars_h5, gids=gids, show_plot=show_plot, + save_as='sim_potential.jpg' if save else None) + + else: + # load the json file or object + if isinstance(config_file, string_types): + config = cfg.from_json(config_file) + elif isinstance(config_file, dict): + config = config_file + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(config_file, type(config_file))) + + gid_list = gids or config['node_id_selections']['save_cell_vars'] + for gid in gid_list: + save_as = '{}_v.jpg'.format(gid) if save else None + title = 'cell gid {}'.format(gid) + var_h5 = os.path.join(config['output']['cell_vars_dir'], '{}.h5'.format(gid)) + plot_potential_hdf5(var_h5, title, show_plot, save_as) + + +def plot_potential_hdf5(cell_vars_h5, gids, title='membrane potential', show_plot=True, save_as=None): + data_h5 = h5py.File(cell_vars_h5, 'r') + membrane_trace = data_h5['data'] + + time_ds = data_h5['/mapping/time'] + tstart = time_ds[0] + tstop = time_ds[1] + x_axis = np.linspace(tstart, tstop, len(membrane_trace), endpoint=True) + + gids_ds = data_h5['/mapping/gids'] + index_ds = data_h5['/mapping/index_pointer'] + index_lookup = {gids_ds[i]: (index_ds[i], index_ds[i+1]) for i in range(len(gids_ds))} + gids = gids_ds.keys() if gids_ds is None else gids + for gid in gids: + var_indx = index_lookup[gid][0] + plt.plot(x_axis, membrane_trace[:, var_indx], label=gid) + + plt.xlabel('time (ms)') + plt.ylabel('membrane (mV)') + plt.title(title) + plt.legend(markerscale=2, scatterpoints=1) + + if save_as is not None: + plt.savefig(save_as) + + if show_plot: + plt.show() + + +def plot_calcium(cell_vars_h5=None, config_file=None, gids=None, show_plot=True, save=False): + if (cell_vars_h5 or config_file) is None: + raise Exception('Please specify a cell_vars hdf5 file or a simulation config.') + + if cell_vars_h5 is not None: + plot_calcium_hdf5(cell_vars_h5, gids, show_plot=show_plot, save_as='sim_ca.jpg' if save else None) + + else: + # load the json file or object + if isinstance(config_file, string_types): + config = cfg.from_json(config_file) + elif isinstance(config_file, dict): + config = config_file + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(config_file, type(config_file))) + + gid_list = gids or config['node_id_selections']['save_cell_vars'] + for gid in gid_list: + save_as = '{}_v.jpg'.format(gid) if save else None + title = 'cell gid {}'.format(gid) + var_h5 = os.path.join(config['output']['cell_vars_dir'], '{}.h5'.format(gid)) + plot_calcium_hdf5(var_h5, title, show_plot, save_as) + + +def plot_calcium_hdf5(cell_vars_h5, gids, title='Ca2+ influx', show_plot=True, save_as=None): + data_h5 = h5py.File(cell_vars_h5, 'r') + cai_trace = data_h5['cai/data'] + + time_ds = data_h5['/mapping/time'] + tstart = time_ds[0] + tstop = time_ds[1] + x_axis = np.linspace(tstart, tstop, len(cai_trace), endpoint=True) + + gids_ds = data_h5['/mapping/gids'] + index_ds = data_h5['/mapping/index_pointer'] + index_lookup = {gids_ds[i]: (index_ds[i], index_ds[i+1]) for i in range(len(gids_ds))} + gids = gids_ds.keys() if gids_ds is None else gids + for gid in gids: + var_indx = index_lookup[gid][0] + plt.plot(x_axis, cai_trace[:, var_indx], label=gid) + + #plt.plot(x_axis, cai_trace) + plt.xlabel('time (ms)') + plt.ylabel('calcium [Ca2+]') + plt.title(title) + plt.legend(markerscale=2, scatterpoints=1) + + if save_as is not None: + plt.savefig(save_as) + + if show_plot: + plt.show() + + +def spikes_table(config_file, spikes_file=None): + config = _get_config(config_file) + spikes_file = config['output']['spikes_file'] + spikes_h5 = h5py.File(spikes_file, 'r') + gids = np.array(spikes_h5['/spikes/gids'], dtype=np.uint) + times = np.array(spikes_h5['/spikes/timestamps'], dtype=np.float) + return pd.DataFrame(data={'gid': gids, 'spike time (ms)': times}) + #return pd.read_csv(spikes_ascii, names=['time (ms)', 'cell gid'], sep=' ') + + +def nodes_table(nodes_file, population): + # TODO: Integrate into sonata api + nodes_h5 = h5py.File(nodes_file, 'r') + nodes_pop = nodes_h5['/nodes'][population] + root_df = pd.DataFrame(data={'node_id': nodes_pop['node_id'], 'node_type_id': nodes_pop['node_type_id'], + 'node_group_id': nodes_pop['node_group_id'], + 'node_group_index': nodes_pop['node_group_index']}) #, + #index=[nodes_pop['node_group_id'], nodes_pop['node_group_index']]) + root_df = root_df.set_index(['node_group_id', 'node_group_index']) + + node_grps = np.unique(nodes_pop['node_group_id']) + for grp_id in node_grps: + sub_group = nodes_pop[str(grp_id)] + grp_df = pd.DataFrame() + for hf_key in sub_group: + hf_obj = sub_group[hf_key] + if isinstance(hf_obj, h5py.Dataset): + grp_df[hf_key] = hf_obj + + subgrp_len = len(grp_df) + if subgrp_len > 0: + grp_df['node_group_id'] = [grp_id]*subgrp_len + grp_df['node_group_index'] = range(subgrp_len) + grp_df = grp_df.set_index(['node_group_id', 'node_group_index']) + root_df = root_df.join(other=grp_df, how='left') + + return root_df.reset_index(drop=True) + + +def node_types_table(node_types_file, population): + return pd.read_csv(node_types_file, sep=' ') \ No newline at end of file diff --git a/bmtk-vb/bmtk/analyzer/__init__.pyc b/bmtk-vb/bmtk/analyzer/__init__.pyc new file mode 100644 index 0000000..bf540e6 Binary files /dev/null and b/bmtk-vb/bmtk/analyzer/__init__.pyc differ diff --git a/bmtk-vb/bmtk/analyzer/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/analyzer/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..e5e45c9 Binary files /dev/null and b/bmtk-vb/bmtk/analyzer/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/analyzer/cell_vars.py b/bmtk-vb/bmtk/analyzer/cell_vars.py new file mode 100644 index 0000000..da2e719 --- /dev/null +++ b/bmtk-vb/bmtk/analyzer/cell_vars.py @@ -0,0 +1,95 @@ +import os +import matplotlib.pyplot as plt + +from .io_tools import load_config +from .utils import listify +from bmtk.utils.cell_vars import CellVarsFile + +# In the case reports are missing units, try to guess based on +missing_units = { + 'V_m': 'mV', + 'cai': 'mM', + 'v': 'mV' +} + + +def _get_cell_report(config_file, report_name): + cfg = load_config(config_file) + if report_name is not None: + return cfg.reports[report_name], report_name + + else: + cell_var_reports = [(r_name, r_dict) for r_name, r_dict in cfg.reports.items() + if r_dict['module'] == 'membrane_report'] + if len(cell_var_reports) == 0: + raise Exception('Could not find any membrane_reports in {}'.format(config_file)) + + elif len(cell_var_reports) > 1: + raise Exception('Found more than one membrane_report, please specify report_name') + + else: + report_name = cell_var_reports[0][0] + report = cell_var_reports[0][1] + report_fname = report['file_name'] if 'file_name' in report else '{}.h5'.format(report_name) + return report_name, os.path.join(cfg.output_dir, report_fname) + + +def plot_report(config_file=None, report_file=None, report_name=None, variables=None, gids=None): + if report_file is None: + report_name, report_file = _get_cell_report(config_file, report_name) + + var_report = CellVarsFile(report_file) + variables = listify(variables) if variables is not None else var_report.variables + gids = listify(gids) if gids is not None else var_report.gids + time_steps = var_report.time_trace + + def __units_str(var): + units = var_report.units(var) + if units == CellVarsFile.UNITS_UNKNOWN: + units = missing_units.get(var, '') + return '({})'.format(units) if units else '' + + n_plots = len(variables) + if n_plots > 1: + # If more than one variale to plot do so in different subplots + f, axarr = plt.subplots(n_plots, 1) + for i, var in enumerate(variables): + for gid in gids: + axarr[i].plot(time_steps, var_report.data(gid=gid, var_name=var), label='gid {}'.format(gid)) + + axarr[i].legend() + axarr[i].set_ylabel('{} {}'.format(var, __units_str(var))) + if i < n_plots - 1: + axarr[i].set_xticklabels([]) + + axarr[i].set_xlabel('time (ms)') + + elif n_plots == 1: + # For plotting a single variable + plt.figure() + for gid in gids: + plt.plot(time_steps, var_report.data(gid=0, var_name=variables[0]), label='gid {}'.format(gid)) + plt.ylabel('{} {}'.format(variables[0], __units_str(variables[0]))) + plt.xlabel('time (ms)') + + else: + return + + plt.show() + + #for gid in gids: + # plt.plot(times, var_report.data(gid=0, var_name='v'), label='gid {}'.format(gid)) + + + ''' + + + + plt.ylabel('{} {}'.format('v', units_str)) + plt.xlabel('time (ms)') + plt.legend() + plt.show() + ''' + + + diff --git a/bmtk-vb/bmtk/analyzer/firing_rates.py b/bmtk-vb/bmtk/analyzer/firing_rates.py new file mode 100644 index 0000000..bca785c --- /dev/null +++ b/bmtk-vb/bmtk/analyzer/firing_rates.py @@ -0,0 +1,55 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import numpy as np + +def convert_rates(rates_file): + rates_df = pd.read_csv(rates_file, sep=' ', names=['gid', 'time', 'rate']) + rates_sorted_df = rates_df.sort_values(['gid', 'time']) + rates_dict = {} + for gid, rates in rates_sorted_df.groupby('gid'): + start = rates['time'].iloc[0] + #start = rates['rate'][0] + end = rates['time'].iloc[-1] + dt = float(end - start)/len(rates) + rates_dict[gid] = {'start': start, 'end': end, 'dt': dt, 'rates': np.array(rates['rate'])} + + return rates_dict + + +def firing_rates_equal(rates_file1, rates_file2, err=0.0001): + trial_1 = convert_rates(rates_file1) + trial_2 = convert_rates(rates_file2) + if set(trial_1.keys()) != set(trial_2.keys()): + return False + + for gid, rates_data1 in trial_1.items(): + rates_data2 = trial_2[gid] + if rates_data1['dt'] != rates_data2['dt'] or rates_data1['start'] != rates_data2['start'] or rates_data1['end'] != rates_data2['end']: + return False + + for r1, r2 in zip(rates_data1['rates'], rates_data2['rates']): + if abs(r1 - r2) > err: + return False + + return True \ No newline at end of file diff --git a/bmtk-vb/bmtk/analyzer/io_tools.py b/bmtk-vb/bmtk/analyzer/io_tools.py new file mode 100644 index 0000000..326389b --- /dev/null +++ b/bmtk-vb/bmtk/analyzer/io_tools.py @@ -0,0 +1,11 @@ +from six import string_types +from bmtk.simulator.utils.config import ConfigDict + + +def load_config(config): + if isinstance(config, string_types): + return ConfigDict.from_json(config) + elif isinstance(config, dict): + return ConfigDict.from_dict(config) + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(config, type(config))) \ No newline at end of file diff --git a/bmtk-vb/bmtk/analyzer/spike_trains.py b/bmtk-vb/bmtk/analyzer/spike_trains.py new file mode 100644 index 0000000..a7f6c8d --- /dev/null +++ b/bmtk-vb/bmtk/analyzer/spike_trains.py @@ -0,0 +1,16 @@ +import numpy as np +import pandas as pd +import h5py + + +from bmtk.analyzer.visualization.spikes import plot_spikes as raster_plot +from bmtk.analyzer.visualization.spikes import plot_rates as rates_plot +from .io_tools import load_config +from bmtk.utils.spike_trains import SpikesFile + + +def to_dataframe(config_file, spikes_file=None): + config = load_config(config_file) + spikes_file = SpikesFile(config.spikes_file) + return spikes_file.to_dataframe() + diff --git a/bmtk-vb/bmtk/analyzer/spikes_analyzer.py b/bmtk-vb/bmtk/analyzer/spikes_analyzer.py new file mode 100644 index 0000000..af77187 --- /dev/null +++ b/bmtk-vb/bmtk/analyzer/spikes_analyzer.py @@ -0,0 +1,127 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import numpy as np + +try: + from distutils.version import LooseVersion + use_sort_values = LooseVersion(pd.__version__) >= LooseVersion('0.19.0') + +except: + use_sort_values = False + + +def spikes2dict(spikes_file): + spikes_df = pd.read_csv(spikes_file, sep=' ', names=['time', 'gid']) + + if use_sort_values: + spikes_sorted = spikes_df.sort_values(['gid', 'time']) + else: + spikes_sorted = spikes_df.sort(['gid', 'time']) + + spike_dict = {} + for gid, spike_train in spikes_sorted.groupby('gid'): + spike_dict[gid] = np.array(spike_train['time']) + return spike_dict + + +def spike_files_equal(spikes_txt_1, spikes_txt_2, err=0.0001): + trial_1 = spikes2dict(spikes_txt_1) + trial_2 = spikes2dict(spikes_txt_2) + if set(trial_1.keys()) != set(trial_2.keys()): + return False + + for gid, spike_train1 in trial_1.items(): + spike_train2 = trial_2[gid] + if len(spike_train1) != len(spike_train2): + return False + + for s1, s2 in zip(spike_train1, spike_train2): + if abs(s1 - s2) > err: + return False + + return True + + +def get_mean_firing_rates(spike_gids, node_ids, tstop_msec): + + """ + Compute mean firing rate over the duration of the simulation + + :param spike_gids: gids of cells which spiked + :param node_ids: np.array of node_ids + + :return mean_firing_rate: np.array mean firing rates + + """ + + min_gid = np.min(node_ids) + max_gid = np.max(node_ids) + + gid_bins = np.arange(min_gid-0.5,max_gid+1.5,1) + hist,bins = np.histogram(spike_gids, bins=gid_bins) + + tstop_sec = tstop_msec*1E-3 + mean_firing_rates = hist/tstop_sec + + return mean_firing_rates + + + +def spikes_equal_in_window(spikes1,spikes2,twindow): + """ + Compare spikes within a time window + :param spikes1: dict with "time" and "gid" arrays for raster 1 + :param spikes2: dict with "time" and "gid" arrays for raster 2 + :param twindow: [tstart,tend] time window + + :return boolean: True if equal, False if different + """ + + ix1_window0=np.where(spikes1["time"]>twindow[0]) + ix1_window1=np.where(spikes1["time"]twindow[0]) + ix2_window1=np.where(spikes2["time"] tstart) & (spikes[0] < tend)) + + spike_times = spikes[0][ix_t] + spike_gids = spikes[1][ix_t] + + for query, col in cmap.items(): + query_df = nodes_df.query(query) + gids_query = query_df.index + print("{} ncells: {} {}".format(query, len(gids_query), col)) + + ix_g = np.in1d(spike_gids, gids_query) + ax.scatter(spike_times[ix_g], spike_gids[ix_g], + marker=marker, + # facecolors='none', + facecolors=col, + # edgecolors=col, + s=s, + label=query, + lw=lw) diff --git a/bmtk-vb/bmtk/analyzer/visualization/spikes.py b/bmtk-vb/bmtk/analyzer/visualization/spikes.py new file mode 100644 index 0000000..e7b34e9 --- /dev/null +++ b/bmtk-vb/bmtk/analyzer/visualization/spikes.py @@ -0,0 +1,499 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import csv +import h5py +from six import string_types +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.cm as cmx +import matplotlib.colors as colors +import matplotlib.gridspec as gridspec + +import bmtk.simulator.utils.config as config + +from mpl_toolkits.axes_grid1 import make_axes_locatable + +def _create_node_table(node_file, node_type_file, group_key=None, exclude=[]): + """Creates a merged nodes.csv and node_types.csv dataframe with excluded items removed. Returns a dataframe.""" + node_types_df = pd.read_csv(node_type_file, sep=' ', index_col='node_type_id') + nodes_h5 = h5py.File(node_file) + # TODO: Use utils.spikesReader + node_pop_name = nodes_h5['/nodes'].keys()[0] + + nodes_grp = nodes_h5['/nodes'][node_pop_name] + # TODO: Need to be able to handle gid or node_id + nodes_df = pd.DataFrame({'node_id': nodes_grp['node_id'], 'node_type_id': nodes_grp['node_type_id']}) + #nodes_df = pd.DataFrame({'node_id': nodes_h5['/nodes/node_gid'], 'node_type_id': nodes_h5['/nodes/node_type_id']}) + nodes_df.set_index('node_id', inplace=True) + + # nodes_df = pd.read_csv(node_file, sep=' ', index_col='node_id') + full_df = pd.merge(left=nodes_df, right=node_types_df, how='left', left_on='node_type_id', right_index=True) + + if group_key is not None and len(exclude) > 0: + # Make sure sure we group-key exists as column + if group_key not in full_df: + raise Exception('Could not find column {}'.format(group_key)) + + group_keys = set(nodes_df[group_key].unique()) - set(exclude) + groupings = nodes_df.groupby(group_key) + # remove any rows with matching column value + for cond in exclude: + full_df = full_df[full_df[group_key] != cond] + + return full_df + +def _count_spikes(spikes_file, max_gid, interval=None): + def parse_line(line): + ts, gid = line.strip().split(' ') + return float(ts), int(gid) + + if interval is None: + t_max = t_bounds_low = -1.0 + t_min = t_bounds_high = 1e16 + elif hasattr(interval, "__getitem__") and len(interval) == 2: + t_min = t_bounds_low = interval[0] + t_max = t_bounds_high = interval[1] + elif isinstance(interval, float): + t_max = t_min = t_bounds_low = interval[0] + t_bounds_high = 1e16 + else: + raise Exception("Unable to determine interval.") + + max_gid = int(max_gid) # strange bug where max_gid was being returned as a float. + spikes = [[] for _ in xrange(max_gid+1)] + spike_sums = np.zeros(max_gid+1) + # TODO: Use utils.spikesReader + spikes_h5 = h5py.File(spikes_file, 'r') + #print spikes_h5['/spikes'].keys() + gid_ds = spikes_h5['/spikes/gids'] + ts_ds = spikes_h5['/spikes/timestamps'] + + for i in range(len(gid_ds)): + ts = ts_ds[i] + gid = gid_ds[i] + + if gid <= max_gid and t_bounds_low <= ts <= t_bounds_high: + spikes[gid].append(ts) + spike_sums[gid] += 1 + t_min = ts if ts < t_min else t_min + t_max = ts if ts > t_max else t_max + + """ + with open(spikes_file, 'r') as fspikes: + for line in fspikes: + ts, gid = parse_line(line) + if gid <= max_gid and t_bounds_low <= ts <= t_bounds_high: + spikes[gid].append(ts) + spike_sums[gid] += 1 + t_min = ts if ts < t_min else t_min + t_max = ts if ts > t_max else t_max + """ + return spikes, spike_sums/(float(t_max-t_min)*1e-3) + + + +def plot_spikes_config(configure, group_key=None, exclude=[], save_as=None, show_plot=True): + if isinstance(configure, string_types): + conf = config.from_json(configure) + elif isinstance(configure, dict): + conf = configure + else: + raise Exception("configure variable must be either a json dictionary or json file name.") + + cells_file_name = conf['internal']['nodes'] + cell_models_file_name = conf['internal']['node_types'] + spikes_file = conf['output']['spikes_ascii'] + + plot_spikes(cells_file_name, cell_models_file_name, spikes_file, group_key, exclude, save_as, show_plot) + + +def plot_spikes(cells_file, cell_models_file, spikes_file, population=None, group_key=None, exclude=[], save_as=None, + show=True, title=None): + # check if can be shown and/or saved + #if save_as is not None: + # if os.path.exists(save_as): + # raise Exception('file {} already exists. Cannot save.'.format(save_as)) + + cm_df = pd.read_csv(cell_models_file, sep=' ') + cm_df.set_index('node_type_id', inplace=True) + + cells_h5 = h5py.File(cells_file, 'r') + # TODO: Use sonata api + if population is None: + if len(cells_h5['/nodes']) > 1: + raise Exception('Multiple populations in nodes file. Please specify one to plot using population param') + else: + population = cells_h5['/nodes'].keys()[0] + + nodes_grp = cells_h5['/nodes'][population] + c_df = pd.DataFrame({'node_id': nodes_grp['node_id'], 'node_type_id': nodes_grp['node_type_id']}) + # c_df = pd.read_csv(cells_file, sep=' ') + c_df.set_index('node_id', inplace=True) + nodes_df = pd.merge(left=c_df, + right=cm_df, + how='left', + left_on='node_type_id', + right_index=True) # use 'model_id' key to merge, for right table the "model_id" is an index + + # TODO: Uses utils.SpikesReader to open + spikes_h5 = h5py.File(spikes_file, 'r') + spike_gids = np.array(spikes_h5['/spikes/gids'], dtype=np.uint) + spike_times = np.array(spikes_h5['/spikes/timestamps'], dtype=np.float) + # spike_times, spike_gids = np.loadtxt(spikes_file, dtype='float32,int', unpack=True) + # spike_gids, spike_times = np.loadtxt(spikes_file, dtype='int,float32', unpack=True) + + spike_times = spike_times * 1.0e-3 + + if group_key is not None: + if group_key not in nodes_df: + raise Exception('Could not find column {}'.format(group_key)) + groupings = nodes_df.groupby(group_key) + + n_colors = nodes_df[group_key].nunique() + color_norm = colors.Normalize(vmin=0, vmax=(n_colors-1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + else: + groupings = [(None, nodes_df)] + color_map = ['blue'] + + #marker = '.' if len(nodes_df) > 1000 else 'o' + marker = 'o' + + # Create plot + gs = gridspec.GridSpec(2, 1, height_ratios=[7, 1]) + ax1 = plt.subplot(gs[0]) + gid_min = 10**10 + gid_max = -1 + for color, (group_name, group_df) in zip(color_map, groupings): + if group_name in exclude: + continue + group_min_gid = min(group_df.index.tolist()) + group_max_gid = max(group_df.index.tolist()) + gid_min = group_min_gid if group_min_gid <= gid_min else gid_min + gid_max = group_max_gid if group_max_gid > gid_max else gid_max + + gids_group = group_df.index + indexes = np.in1d(spike_gids, gids_group) + ax1.scatter(spike_times[indexes], spike_gids[indexes], marker=marker, facecolors=color, label=group_name, lw=0, s=5) + + #ax1.set_xlabel('time (s)') + ax1.axes.get_xaxis().set_visible(False) + ax1.set_ylabel('cell_id') + ax1.set_xlim([0, max(spike_times)]) + ax1.set_ylim([gid_min, gid_max]) + plt.legend(markerscale=2, scatterpoints=1) + + ax2 = plt.subplot(gs[1]) + plt.hist(spike_times, 100) + ax2.set_xlabel('time (s)') + ax2.set_xlim([0, max(spike_times)]) + ax2.axes.get_yaxis().set_visible(False) + if title is not None: + ax1.set_title(title) + + if save_as is not None: + plt.savefig(save_as) + + if show: + plt.show() + + +def plot_ratess(cells_file, cell_models_file, spikes_file, group_key='pop_name', exclude=['LIF_inh', 'LIF_exc'], save_as=None, show_plot=True): + #if save_as is not None: + # if os.path.exists(save_as): + # raise Exception('file {} already exists. Cannot save.'.format(save_as)) + + cm_df = pd.read_csv(cell_models_file, sep=' ') + cm_df.set_index('node_type_id', inplace=True) + + c_df = pd.read_csv(cells_file, sep=' ') + c_df.set_index('node_id', inplace=True) + nodes_df = pd.merge(left=c_df, + right=cm_df, + how='left', + left_on='node_type_id', + right_index=True) # use 'model_id' key to merge, for right table the "model_id" is an index + + for cond in exclude: + nodes_df = nodes_df[nodes_df[group_key] != cond] + + groupings = nodes_df.groupby(group_key) + n_colors = nodes_df[group_key].nunique() + color_norm = colors.Normalize(vmin=0, vmax=(n_colors - 1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + + + spike_times, spike_gids = np.loadtxt(spikes_file, dtype='float32,int', unpack=True) + rates = np.zeros(max(spike_gids) + 1) + for ts, gid in zip(spike_times, spike_gids): + if ts < 500.0: + continue + rates[gid] += 1 + + for color, (group_name, group_df) in zip(color_map, groupings): + print(group_name) + print(group_df.index) + print(rates[group_df.index]) + plt.plot(group_df.index, rates[group_df.index], '.', color=color) + + plt.show() + + print(n_colors) + exit() + + + + group_keys = set(nodes_df[group_key].unique()) - set(exclude) + groupings = nodes_df.groupby(group_key) + + n_colors = len(group_keys) + color_norm = colors.Normalize(vmin=0, vmax=(n_colors - 1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + + for color, (group_name, group_df) in zip(color_map, groupings): + print(group_name) + print(group_df.index) + + exit() + + + """ + print color_map + exit() + + n_colors = nodes_df[group_key].nunique() + color_norm = colors.Normalize(vmin=0, vmax=(n_colors - 1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + """ + + spike_times, spike_gids = np.loadtxt(spikes_file, dtype='float32,int', unpack=True) + rates = np.zeros(max(spike_gids)+1) + + for ts, gid in zip(spike_times, spike_gids): + if ts < 500.0: + continue + + rates[gid] += 1 + + rates = rates / 3.0 + + plt.plot(xrange(max(spike_gids)+1), rates, '.') + plt.show() + + +def plot_rates(cells_file, cell_models_file, spikes_file, group_key=None, exclude=[], interval=None, show=True, + title=None, save_as=None, smoothed=False): + def smooth(data, window=100): + h = int(window/2) + x_max = len(data) + return [np.mean(data[max(0, x-h):min(x_max, x+h)]) for x in xrange(0, x_max)] + + nodes_df = _create_node_table(cells_file, cell_models_file, group_key, exclude) + _, spike_rates = _count_spikes(spikes_file, max(nodes_df.index), interval) + + if group_key is not None: + groupings = nodes_df.groupby(group_key) + group_order = {k: i for i, k in enumerate(nodes_df[group_key].unique())} + + n_colors = len(group_order) + color_norm = colors.Normalize(vmin=0, vmax=(n_colors-1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + ordered_groupings = [(group_order[name], c, name, df) for c, (name, df) in zip(color_map, groupings)] + + else: + ordered_groupings = [(0, 'blue', None, nodes_df)] + + keys = ['' for _ in xrange(len(group_order))] + means = [0 for _ in xrange(len(group_order))] + stds = [0 for _ in xrange(len(group_order))] + fig = plt.figure() + ax1 = fig.add_subplot(111) + for indx, color, group_name, group_df in ordered_groupings: + keys[indx] = group_name + means[indx] = np.mean(spike_rates[group_df.index]) + stds[indx] = np.std(spike_rates[group_df.index]) + y = smooth(spike_rates[group_df.index]) if smoothed else spike_rates[group_df.index] + ax1.plot(group_df.index, y, '.', color=color, label=group_name) + + max_rate = np.max(spike_rates) + ax1.set_ylim(0, 50)#max_rate*1.3) + ax1.set_ylabel('Hz') + ax1.set_xlabel('gid') + ax1.legend(fontsize='x-small') + if title is not None: + ax1.set_title(title) + if save_as is not None: + plt.savefig(save_as) + + plt.figure() + plt.errorbar(xrange(len(means)), means, stds, linestyle='None', marker='o') + plt.xlim(-0.5, len(color_map)-0.5) # len(color_map) == last_index + 1 + plt.ylim(0, 50.0)# max_rate*1.3) + plt.xticks(xrange(len(means)), keys) + if title is not None: + plt.title(title) + if save_as is not None: + if save_as.endswith('.jpg'): + base = save_as[0:-4] + elif save_as.endswith('.jpeg'): + base = save_as[0:-5] + else: + base = save_as + + plt.savefig('{}.summary.jpg'.format(base)) + with open('{}.summary.csv'.format(base), 'w') as f: + f.write('population mean stddev\n') + for i, key in enumerate(keys): + f.write('{} {} {}\n'.format(key, means[i], stds[i])) + + if show: + plt.show() + +def plot_rates_popnet(cell_models_file, rates_file, model_keys=None, save_as=None, show_plot=True): + """Initial method for plotting popnet output + + :param cell_models_file: + :param rates_file: + :param model_keys: + :param save_as: + :param show_plot: + :return: + """ + + pops_df = pd.read_csv(cell_models_file, sep=' ') + lookup_col = model_keys if model_keys is not None else 'node_type_id' + pop_keys = {str(r['node_type_id']): r[lookup_col] for _, r in pops_df.iterrows()} + + # organize the rates file by population + # rates = {pop_name: ([], []) for pop_name in pop_keys.keys()} + rates_df = pd.read_csv(rates_file, sep=' ', names=['id', 'times', 'rates']) + for grp_key, grp_df in rates_df.groupby('id'): + grp_label = pop_keys[str(grp_key)] + plt.plot(grp_df['times'], grp_df['rates'], label=grp_label) + + plt.legend(fontsize='x-small') + plt.xlabel('time (s)') + plt.ylabel('firing rates (Hz)') + + if save_as is not None: + plt.savefig(save_as) + + if show_plot: + plt.show() + +def plot_avg_rates(cell_models_file, rates_file, model_keys=None, save_as=None, show_plot=True): + pops_df = pd.read_csv(cell_models_file, sep=' ') + lookup_col = model_keys if model_keys is not None else 'node_type_id' + pop_keys = {str(r['node_type_id']): r[lookup_col] for _, r in pops_df.iterrows()} + + # organize the rates file by population + rates = {pop_name: [] for pop_name in pop_keys.keys()} + with open(rates_file, 'r') as f: + reader = csv.reader(f, delimiter=' ') + for row in reader: + if row[0] in rates: + #rates[row[0]][0].append(row[1]) + rates[row[0]].append(float(row[2])) + + labels = [] + means = [] + stds = [] + #print rates + for pop_name in pops_df['node_type_id'].unique(): + r = rates[str(pop_name)] + if len(r) == 0: + continue + + labels.append(pop_keys.get(str(pop_name), str(pop_name))) + means.append(np.mean(r)) + stds.append(np.std(r)) + + plt.figure() + plt.errorbar(xrange(len(means)), means, stds, linestyle='None', marker='o') + plt.xlim(-0.5, len(means) - 0.5) + plt.xticks(xrange(len(means)), labels) + plt.ylabel('firing rates (Hz)') + + if save_as is not None: + plt.savefig(save_as) + + if show_plot: + plt.show() + + +def plot_tuning(sg_analysis, node, band, Freq=0, show=True, save_as=None): + def index_for_node(node, band): + if node == 's4': + mask = sg_analysis.node_table.node == node + else: + mask = (sg_analysis.node_table.node == node) & (sg_analysis.node_table.band == band) + return str(sg_analysis.node_table[mask].index[0]) + + index = index_for_node(node, band) + + key = index + '/sg/tuning' + analysis_file = sg_analysis.get_tunings_file() + + tuning_matrix = analysis_file[key].value[:, :, :, Freq] + + n_or, n_sf, n_ph = tuning_matrix.shape + + vmax = np.max(tuning_matrix[:, :, :]) + vmin = np.min(tuning_matrix[:, :, :]) + + #fig, ax = plt.subplots(1, n_ph, figsize=(12, 16), sharex=True, sharey=True) + fig, ax = plt.subplots(1, n_ph, figsize=(13.9, 4.3), sharex=False, sharey=True) + + print(sg_analysis.orientations) + for phase in range(n_ph): + tuning_to_plot = tuning_matrix[:, :, phase] + + im = ax[phase].imshow(tuning_to_plot, interpolation='nearest', vmax=vmax, vmin=vmin) + ax[phase].set_xticklabels([0] + list(sg_analysis.spatial_frequencies)) + ax[phase].set_yticklabels([0] + list(sg_analysis.orientations)) + + ax[phase].set_title('phase = {}'.format(sg_analysis.phases[phase])) + ax[phase].set_xlabel('spatial_frequency') + if phase == 0: + ax[phase].set_ylabel('orientation') + + fig.subplots_adjust(right=0.90) + cbar_ax = fig.add_axes([0.92, 0.10, 0.02, 0.75]) + cbar = fig.colorbar(im, cax=cbar_ax, ticks=[vmin, 0.0, vmax]) + + if save_as is not None: + plt.savefig(save_as) + + if show: + plt.show() + + + #config_file = +# plot_spikes('../../examples/pointnet/example2/config.json', 'pop_name') diff --git a/bmtk-vb/bmtk/analyzer/visualization/spikes.pyc b/bmtk-vb/bmtk/analyzer/visualization/spikes.pyc new file mode 100644 index 0000000..d07cf0c Binary files /dev/null and b/bmtk-vb/bmtk/analyzer/visualization/spikes.pyc differ diff --git a/bmtk-vb/bmtk/analyzer/visualization/widgets.py b/bmtk-vb/bmtk/analyzer/visualization/widgets.py new file mode 100644 index 0000000..bb9c909 --- /dev/null +++ b/bmtk-vb/bmtk/analyzer/visualization/widgets.py @@ -0,0 +1,114 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import matplotlib.pyplot as plt +import scipy.interpolate as spinterp +import numpy as np + +class PlotWidget(object): + + def __init__(self, t_range, y_range, rate_ax=None, position_ax=None, metadata={}, location_markersize=5): + + if rate_ax is None: + self.fig = plt.figure() + self.ax = self.fig.add_subplot(111) + else: + self.ax = rate_ax + self.position_ax = position_ax + + self.t_range = t_range + self.y_range = y_range + self.interp_fcn = spinterp.interp1d(self.t_range, self.y_range) + self._t = None + self.metadata=metadata + self.artist_list = [] + self.location_markersize = location_markersize + + @property + def y(self): + return self.interp_fcn(self._t) + + def initialize(self, t0, **kwargs): + + self._t = t0 + self.plot_data, = self.ax.plot(self.t_range,self.y_range,**kwargs) + self.vertical_rule_data, = self.ax.plot([self._t, self._t],self.ax.get_ylim(),'--r') + self.point_data, = self.ax.plot([self._t],[self.y],'*r') + + self.artist_list = [self.plot_data, self.vertical_rule_data, self.point_data] + + if (not self.position_ax is None) and 'position' in self.metadata: + x = self.metadata['position'][0] + y = self.metadata['position'][1] + self.location_point_data, = self.position_ax.plot([x],[y],'*r', markersize=self.location_markersize) + self.artist_list.append(self.location_point_data) + + + def update(self, t): + + self._t = t + self.point_data + self.point_data.set_xdata([self._t]) + self.vertical_rule_data.set_xdata([self._t, self._t]) + self.vertical_rule_data.set_ydata(self.ax.get_ylim()) + + for data in self.artist_list: + self.ax.figure.canvas.blit(data) + + def set_visible(self, visible_or_not): + + + for data in self.artist_list: + data.set_visible(visible_or_not) + self.ax.figure.canvas.blit(data) + + +class MovieWidget(object): + + def __init__(self, t_range, data, ax=None, metadata={}): + + if ax is None: + self.fig = plt.figure() + self.ax = self.fig.add_subplot(111) + else: + self.ax = ax + + self.t_range = t_range + self.frame_rate = 1./np.mean(np.diff(t_range)) + self.data = data + self.ax.get_xaxis().set_visible(False) + self.ax.get_yaxis().set_visible(False) + self.metadata=metadata + + def initialize(self, t0, vmin=-1, vmax=1, cmap=plt.cm.gray): + + data = self.data[self.ti(t0),:,:] + self.im = self.ax.imshow(data, vmin=vmin, vmax=vmax, cmap=cmap) + + def update(self, t): + + data = self.data[self.ti(t),:,:] + self.im.set_data(data) + self.ax.figure.canvas.draw() + + def ti(self, t): + return int(t*self.frame_rate) - int(self.t_range[0]*self.frame_rate) \ No newline at end of file diff --git a/bmtk-vb/bmtk/builder/__init__.py b/bmtk-vb/bmtk/builder/__init__.py new file mode 100644 index 0000000..1f7a3ed --- /dev/null +++ b/bmtk-vb/bmtk/builder/__init__.py @@ -0,0 +1,23 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .networks import DenseNetwork, NetworkBuilder diff --git a/bmtk-vb/bmtk/builder/__init__.pyc b/bmtk-vb/bmtk/builder/__init__.pyc new file mode 100644 index 0000000..a7e2b0b Binary files /dev/null and b/bmtk-vb/bmtk/builder/__init__.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..e3807c1 Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/connection_map.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/connection_map.cpython-37.pyc new file mode 100644 index 0000000..b21f72c Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/connection_map.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/connector.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/connector.cpython-37.pyc new file mode 100644 index 0000000..2234a88 Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/connector.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/edge.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/edge.cpython-37.pyc new file mode 100644 index 0000000..3c5edfc Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/edge.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/functor_cache.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/functor_cache.cpython-37.pyc new file mode 100644 index 0000000..0068c8a Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/functor_cache.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/id_generator.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/id_generator.cpython-37.pyc new file mode 100644 index 0000000..2162f3c Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/id_generator.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/iterator.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/iterator.cpython-37.pyc new file mode 100644 index 0000000..48cf404 Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/iterator.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/network.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/network.cpython-37.pyc new file mode 100644 index 0000000..25dbaff Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/network.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/node.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/node.cpython-37.pyc new file mode 100644 index 0000000..b2b4559 Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/node.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/node_pool.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/node_pool.cpython-37.pyc new file mode 100644 index 0000000..1a7e2dc Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/node_pool.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/__pycache__/node_set.cpython-37.pyc b/bmtk-vb/bmtk/builder/__pycache__/node_set.cpython-37.pyc new file mode 100644 index 0000000..fb80359 Binary files /dev/null and b/bmtk-vb/bmtk/builder/__pycache__/node_set.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/aux/__init__.py b/bmtk-vb/bmtk/builder/aux/__init__.py new file mode 100644 index 0000000..2d56a26 --- /dev/null +++ b/bmtk-vb/bmtk/builder/aux/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/bmtk-vb/bmtk/builder/aux/__init__.pyc b/bmtk-vb/bmtk/builder/aux/__init__.pyc new file mode 100644 index 0000000..581d2e2 Binary files /dev/null and b/bmtk-vb/bmtk/builder/aux/__init__.pyc differ diff --git a/bmtk-vb/bmtk/builder/aux/edge_connectors.py b/bmtk-vb/bmtk/builder/aux/edge_connectors.py new file mode 100644 index 0000000..7abba26 --- /dev/null +++ b/bmtk-vb/bmtk/builder/aux/edge_connectors.py @@ -0,0 +1,56 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import random + + +def distance_connector(source, target, d_weight_min, d_weight_max, d_max, nsyn_min, nsyn_max): + # Avoid self-connections. + sid = source.node_id + tid = target.node_id + if sid == tid: + return None + + # first create weights by euclidean distance between cells + r = np.linalg.norm(np.array(source['positions']) - np.array(target['positions'])) + if r > d_max: + dw = 0.0 + else: + t = r / d_max + dw = d_weight_max * (1.0 - t) + d_weight_min * t + + # drop the connection if the weight is too low + if dw <= 0: + return None + + # filter out nodes by treating the weight as a probability of connection + if random.random() > dw: + return None + + # Add the number of synapses for every connection. + tmp_nsyn = random.randint(nsyn_min, nsyn_max) + return tmp_nsyn + + +def connect_random(source, target, nsyn_min=0, nsyn_max=10, distribution=None): + return np.random.randint(nsyn_min, nsyn_max) \ No newline at end of file diff --git a/bmtk-vb/bmtk/builder/aux/edge_connectors.pyc b/bmtk-vb/bmtk/builder/aux/edge_connectors.pyc new file mode 100644 index 0000000..71f9849 Binary files /dev/null and b/bmtk-vb/bmtk/builder/aux/edge_connectors.pyc differ diff --git a/bmtk-vb/bmtk/builder/aux/node_params.py b/bmtk-vb/bmtk/builder/aux/node_params.py new file mode 100644 index 0000000..0ce1f4f --- /dev/null +++ b/bmtk-vb/bmtk/builder/aux/node_params.py @@ -0,0 +1,38 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import math + + +def positions_columinar(N=1, center=[0.0, 50.0, 0.0], height=100.0, min_radius=0.0, max_radius=1.0, distribution='uniform'): + phi = 2.0 * math.pi * np.random.random([N]) + r = np.sqrt((min_radius**2 - max_radius**2) * np.random.random([N]) + max_radius**2) + x = center[0] + r * np.cos(phi) + z = center[2] + r * np.sin(phi) + y = center[1] + height * (np.random.random([N]) - 0.5) + + return np.column_stack((x, y, z)) + + +def xiter_random(N=1, min_x=0.0, max_x=1.0): + return np.random.uniform(low=min_x, high=max_x, size=(N,)) \ No newline at end of file diff --git a/bmtk-vb/bmtk/builder/aux/node_params.pyc b/bmtk-vb/bmtk/builder/aux/node_params.pyc new file mode 100644 index 0000000..428a4ba Binary files /dev/null and b/bmtk-vb/bmtk/builder/aux/node_params.pyc differ diff --git a/bmtk-vb/bmtk/builder/bionet/__init__.py b/bmtk-vb/bmtk/builder/bionet/__init__.py new file mode 100644 index 0000000..324aace --- /dev/null +++ b/bmtk-vb/bmtk/builder/bionet/__init__.py @@ -0,0 +1 @@ +from swc_reader import SWCReader \ No newline at end of file diff --git a/bmtk-vb/bmtk/builder/bionet/swc_reader.py b/bmtk-vb/bmtk/builder/bionet/swc_reader.py new file mode 100644 index 0000000..4833a1d --- /dev/null +++ b/bmtk-vb/bmtk/builder/bionet/swc_reader.py @@ -0,0 +1,81 @@ +import numpy as np +from neuron import h + +from bmtk.simulator.bionet import nrn +from bmtk.simulator.bionet.morphology import Morphology + + +class SWCReader(object): + def __init__(self, swc_file, random_seed=10, fix_axon=True): + nrn.load_neuron_modules(None, None) + self._swc_file = swc_file + self._hobj = h.Biophys1(swc_file) + if fix_axon: + self._fix_axon() + + self._morphology = Morphology(self._hobj) + self._morphology.set_seg_props() + self._morphology.calc_seg_coords() + self._prng = np.random.RandomState(random_seed) + + self._secs = [] + self._save_sections() + + def _save_sections(self): + for sec in self._hobj.all: + for _ in sec: + self._secs.append(sec) + + def _fix_axon(self): + """Removes and refixes axon""" + axon_diams = [self._hobj.axon[0].diam, self._hobj.axon[0].diam] + for sec in self._hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name == 'axon': + axon_diams[1] = sec.diam + + for sec in self._hobj.axon: + h.delete_section(sec=sec) + + h.execute('create axon[2]', self._hobj) + for index, sec in enumerate(self._hobj.axon): + sec.L = 30 + sec.diam = 1 + + self._hobj.axonal.append(sec=sec) + self._hobj.all.append(sec=sec) # need to remove this comment + + self._hobj.axon[0].connect(self._hobj.soma[0], 1.0, 0) + self._hobj.axon[1].connect(self._hobj.axon[0], 1.0, 0) + + h.define_shape() + + def find_sections(self, section_names, distance_range): + return self._morphology.find_sections(section_names, distance_range) + + def choose_sections(self, section_names, distance_range, n_sections=1): + secs, probs = self.find_sections(section_names, distance_range) + secs_ix = self._prng.choice(secs, n_sections, p=probs) + return secs_ix, self._morphology.seg_prop['x'][secs_ix] + + def get_coord(self, sec_ids, sec_xs, soma_center=(0.0, 0.0, 0.0), rotations=None): + adjusted = self._morphology.get_soma_pos() - np.array(soma_center) + absolute_coords = [] + for sec_id, sec_x in zip(sec_ids, sec_xs): + sec = self._secs[sec_id] + n_coords = int(h.n3d(sec=sec)) + coord_indx = int(sec_x*(n_coords - 1)) + swc_coords = np.array([h.x3d(coord_indx, sec=sec), h.y3d(coord_indx, sec=sec), h.x3d(coord_indx, sec=sec)]) + absolute_coords.append(swc_coords - adjusted) + + if rotations is not None: + raise NotImplementedError + + return absolute_coords + + def get_dist(self, sec_ids): + return [self._morphology.seg_prop['dist'][sec_id] for sec_id in sec_ids] + + def get_type(self, sec_ids): + return [self._morphology.seg_prop['type'][sec_id] for sec_id in sec_ids] + diff --git a/bmtk-vb/bmtk/builder/connection_map.py b/bmtk-vb/bmtk/builder/connection_map.py new file mode 100644 index 0000000..863cf26 --- /dev/null +++ b/bmtk-vb/bmtk/builder/connection_map.py @@ -0,0 +1,153 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import connector +from . import iterator + + +class ConnectionMap(object): + """Class for keeping track of connection rules. + + For every connection from source --> target this keeps track of rules (functions, literals, lists) for + 1. the number of synapses between source and target + 2. Used defined parameters (syn-weight, synaptic-location) for every synapse. + + The number of synapses rule (1) is stored as a connector. Individual synaptic parameters, if they exists, are stored + as ParamsRules. + """ + + class ParamsRules(object): + """A subclass to store indvidiual synpatic parameter rules""" + def __init__(self, names, rule, rule_params, dtypes): + self._names = names + self._rule = rule + self._rule_params = rule_params + self._dtypes = self.__create_dtype_dict(names, dtypes) + + def __create_dtype_dict(self, names, dtypes): + if isinstance(names, list): + # TODO: compare size of names and dtypes + return {n: dt for n, dt in zip(names, dtypes)} + else: + return {names: dtypes} + + @property + def names(self): + return self._names + + @property + def rule(self): + return connector.create(self._rule, **(self._rule_params or {})) + + @property + def dtypes(self): + return self._dtypes + + def get_prop_dtype(self, prop_name): + return self._dtypes[prop_name] + + def __init__(self, sources=None, targets=None, connector=None, connector_params=None, iterator='one_to_one', + edge_type_properties=None): + self._source_nodes = sources # source nodes + self._target_nodes = targets # target nodes + self._connector = connector # function, list or value that determines connection between sources and targets + self._connector_params = connector_params # parameters passed into connector + self._iterator = iterator # rule for iterating between sources and targets + self._edge_type_properties = edge_type_properties + + self._params = [] + self._param_keys = [] + + @property + def params(self): + return self._params + + @property + def source_nodes(self): + return self._source_nodes + + @property + def source_network_name(self): + return self._source_nodes.network_name + + @property + def target_nodes(self): + return self._target_nodes + + @property + def target_network_name(self): + return self._target_nodes.network_name + + @property + def connector(self): + return self._connector + + @property + def connector_params(self): + return self._connector_params + + @property + def iterator(self): + return self._iterator + + @property + def edge_type_properties(self): + return self._edge_type_properties or {} + + @property + def edge_type_id(self): + # TODO: properly implement edge_type + return self._edge_type_properties['edge_type_id'] + + @property + def property_names(self): + if len(self._param_keys) == 0: + return ['nsyns'] + else: + return self._param_keys + + def properties_keys(self): + ordered_keys = sorted(self.property_names) + return str(ordered_keys) + + + def max_connections(self): + return len(self._source_nodes) * len(self._target_nodes) + + def add_properties(self, names, rule, rule_params=None, dtypes=None): + """A a synaptic property + + :param names: list, or single string, of the property + :param rule: function, list or value of property + :param rule_params: when rule is a function, rule_params will be passed into function when called. + :param dtypes: expected property type + """ + self._params.append(self.ParamsRules(names, rule, rule_params, dtypes)) + self._param_keys += names + + def connection_itr(self): + """Returns a generator that will iterate through the source/target pairs (as specified by the iterator function, + and create a connection rule based on the connector. + """ + conr = connector.create(self.connector, **(self.connector_params or {})) + itr = iterator.create(self.iterator, conr, **({})) + return itr(self.source_nodes, self.target_nodes, conr) diff --git a/bmtk-vb/bmtk/builder/connection_map.pyc b/bmtk-vb/bmtk/builder/connection_map.pyc new file mode 100644 index 0000000..222a2ff Binary files /dev/null and b/bmtk-vb/bmtk/builder/connection_map.pyc differ diff --git a/bmtk-vb/bmtk/builder/connector.py b/bmtk-vb/bmtk/builder/connector.py new file mode 100644 index 0000000..0d2cfd6 --- /dev/null +++ b/bmtk-vb/bmtk/builder/connector.py @@ -0,0 +1,35 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import functor_cache + + +def create(connector, **params): + return CONNECTOR_CACHE.create(connector, **params) + + +def register(name, func): + CONNECTOR_CACHE.register(name, func) + + +CONNECTOR_CACHE = functor_cache.FunctorCache() +register('passthrough', lambda *_: {}) diff --git a/bmtk-vb/bmtk/builder/connector.pyc b/bmtk-vb/bmtk/builder/connector.pyc new file mode 100644 index 0000000..28b9932 Binary files /dev/null and b/bmtk-vb/bmtk/builder/connector.pyc differ diff --git a/bmtk-vb/bmtk/builder/edge.py b/bmtk-vb/bmtk/builder/edge.py new file mode 100644 index 0000000..31265a9 --- /dev/null +++ b/bmtk-vb/bmtk/builder/edge.py @@ -0,0 +1,66 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + + +class Edge(object): + def __init__(self, src_gid, trg_gid, edge_type_props, syn_props): + self.__src_gid = src_gid + self.__trg_gid = trg_gid + self.__edge_type_props = edge_type_props + self.__syn_props = syn_props + + @property + def source_gid(self): + return self.__src_gid + + @property + def target_gid(self): + return self.__trg_gid + + @property + def edge_type_properties(self): + return self.__edge_type_props + + @property + def edge_type_id(self): + return self.edge_type_properties['edge_type_id'] + + @property + def synaptic_properties(self): + return self.__syn_props + + def __contains__(self, item): + return item in self.edge_type_properties or item in self.synaptic_properties + + def __getitem__(self, item): + if item in self.edge_type_properties: + return self.edge_type_properties[item] + elif item in self.synaptic_properties: + return self.synaptic_properties[item] + else: + return None + + def __repr__(self): + rstr = "{} --> {} ('edge_type_id': {}, ".format(self.source_gid, self.target_gid, self.edge_type_id) + rstr += "{}: {}" ', '.join("'{}': {}".format(k, v) for k, v in self.synaptic_properties.items()) + return rstr + ")" diff --git a/bmtk-vb/bmtk/builder/edge.pyc b/bmtk-vb/bmtk/builder/edge.pyc new file mode 100644 index 0000000..860eab3 Binary files /dev/null and b/bmtk-vb/bmtk/builder/edge.pyc differ diff --git a/bmtk-vb/bmtk/builder/formats/__init__.py b/bmtk-vb/bmtk/builder/formats/__init__.py new file mode 100644 index 0000000..6480e34 --- /dev/null +++ b/bmtk-vb/bmtk/builder/formats/__init__.py @@ -0,0 +1,246 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +""" network2.format + +The XFormat classes are implemented within Network class to allow network objects to handle different data types. +Each class should be able to control both input and output file format (json, csv, h5, etc) and the expected parameters, +including their corresponding order. + +Example: + net = Network(format=ISeeFormat) + ... + net.save(cells="cells.csv", models="cell_models.csv", connections="connections.h5") + +Todo: + * change network.load(cls) to be format specific. +""" +import csv +import h5py +import numpy as np +import json +import pandas as pd + +from ..node import Node + +from iformats import IFormat + + +class DefaultFormat(IFormat): + def save_nodes(self, file_name): + raise NotImplementedError() + + def save_edges(self, file_name): + raise NotImplementedError() + + def save(self, file_name): + raise NotImplementedError() + + +class ISeeFormat(IFormat): + """Controls the output of networks that will be used in the isee_engine simulator. + + The nodes are saved in a cells and cell_model csv files with predefined format. the edges/connections are + saved in a connections h5 format. + """ + def save_cells(self, filename, columns, position_labels=None): + """Saves nodes/cell information and their model type metadata. + + :param cells_csv: name of csv file where cell information will be saved. + :param models_csv: name of csv file where cell model information will be saved. + """ + # TODO: add checks and warnings if parameters are missing. + with open(filename, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=' ') + header = [] + for col in columns: + if col == 'position': + for label in position_labels: + if label: + header.append(label) + else: + header.append(col) + csvw.writerow(header) + for nid, params in self._network.nodes(): + row_array = [] + for col in columns: + if col == 'position': + for i, label in enumerate(position_labels): + if label: + row_array.append(params['position'][i]) + else: + row_array.append(params[col]) + + csvw.writerow(row_array) + + def save_types(self, filename, columns, key=None): + seen_types = set() + + with open(filename, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=' ') + csvw.writerow(columns) + #csvw.writerow(['model_id', 'electrophysiology' 'level_of_detail', 'morphology', 'rotation_angle_zaxis']) + for node_set in self._network._node_sets: + props = node_set.properties#['properties'] + + if key is not None: + key_val = props.get(key, None) + if key_val is not None and key_val in seen_types: + continue + else: + seen_types.add(key_val) + + row_array = [] + for col in columns: + row_array.append(props.get(col, 'NA')) + csvw.writerow(row_array) + + def save_edges(self, filename, include_nsyns=True): + """Saves connection information into h5 format + + :param filename: Name of h5 file where connection information will be stored. + :param include_nsyns: setting to false will omit the nsyns table in the h5 file, default + true (nsyn table included). + """ + print("save_edges") + + n_nodes = self._network.nnodes + n_edges = self._network.nedges + + # TODO: check the order of the node list + + print("> building tables with %d nodes and %d edges" % (self._network.nnodes, self._network.nedges)) + indptr_table = [0] + nsyns_table = [] + src_gids_table = [] + edge_types_table = [] + for trg in self._network.nodes(): + tid = trg[1]['id'] + for edges in self._network.edges([tid], rank=1): + src_gids_table.append(edges[0]) + nsyns_table.append(edges[2]) + edge_types_table.append(edges[3]) + + #if len(src_gids_table) == indptr_table[-1]: + # print "node %d doesn't have any edges" % (tid) + indptr_table.append(len(src_gids_table)) + + + print("> saving tables to %s" % (filename)) + + with h5py.File(filename, 'w') as hf: + hf.create_dataset('edge_ptr', data=indptr_table) + if include_nsyns: + hf.create_dataset('num_syns', data=nsyns_table) + hf.create_dataset('src_gids', data=src_gids_table) + hf.create_dataset('edge_types', data=edge_types_table) + hf.attrs["shape"] = (n_nodes, n_nodes) + + + """ + temp = np.empty([n_edges, 3]) + for i, edge in enumerate(self._network.edges()): + temp[i, 0] = edge[0] + temp[i, 1] = edge[1] + temp[i, 2] = edge[2] + + src_gids_new = np.array([]) + nsyns_new = np.array([]) + indptr_new = [] + counter = 0 + indptr_new.append(counter) + print "Building database" + for i in range(n_nodes): + indicies = np.where(temp[:, 1] == i) + + src_gids_new = np.concatenate([src_gids_new, np.array(temp[indicies[0], 0])]) + nsyns_new = np.concatenate([nsyns_new, np.array(temp[indicies[0], 2])]) + + counter += np.size(indicies[0]) + indptr_new.append(counter) + + print "Writing to h5" + + indptr_new = np.array(indptr_new) + + src_gids_new = src_gids_new.astype(int) + print src_gids_new + exit() + + nsyns_new = nsyns_new.astype(int) + indptr_new = indptr_new.astype(int) + + with h5py.File(filename, 'w') as hf: + hf.create_dataset('indptr', data=indptr_new) + if include_nsyns: + hf.create_dataset('nsyns', data=nsyns_new) + hf.create_dataset('src_gids', data=src_gids_new) + hf.attrs["shape"] = (n_nodes, n_nodes) + """ + + def save(self, cells_fname, cell_models_fname, connections_fname, include_nsyns=True): + """Saves node (cells) and connection information to files. + + :param cells_fname: name of csv file where cell information will be saved. + :param cell_models_fname: name of csv file where cell model information will be saved. + :param connections_fname: Name of h5 file where connection information will be stored. + :param include_nsyns: set to False to build h5 without nsyn table. + """ + #self.save_nodes(cells_fname, cell_models_fname) + self.save_edges(connections_fname, include_nsyns) + + def load(self, nodes, edge_types=None, node_types=None, edges=None, positions=None): + # TODO: check imported ids + + df = pd.read_csv(nodes, sep=' ') + if node_types is not None: + types_df = pd.read_csv(node_types, sep=' ', index_col='node_type_id') + df = pd.merge(left=df, right=types_df, how='left', left_on='node_type_id', right_index=True) + + gids_df = df['node_id'] if 'node_id' in df.columns else df['id'] + #df = df.drop(['id'], axis=1) + + positions_df = None + if positions: + positions_df = df[positions] + df = df.drop(positions, axis=1) + + node_params = df.to_dict(orient='records') + node_tuples = [Node(gids_df[i], gids_df[i], None, array_params=node_params[i]) + for i in xrange(df.shape[0])] + + + if positions: + self._network.positions = position_set.PositionSet() + posr = positioner.create('points', location=positions_df.as_matrix()) + #self._network.positions.add(posr(df.shape[0]), gids_df.tolist()) + self._network.positions.add(positions_df.values, gids_df.tolist()) + + for i in xrange(df.shape[0]): + node_tuples[i]['position'] = np.array(positions_df.loc[i]) + + self._network.positions.finalize() + + self._network._initialize() + self._network._add_nodes(node_tuples) + self._network.nodes_built = True + diff --git a/bmtk-vb/bmtk/builder/formats/hdf5_format.py b/bmtk-vb/bmtk/builder/formats/hdf5_format.py new file mode 100644 index 0000000..a0227ca --- /dev/null +++ b/bmtk-vb/bmtk/builder/formats/hdf5_format.py @@ -0,0 +1,423 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import csv +import json +import math +import h5py +import pandas as pd +from ast import literal_eval + +import bmtk +from .iformats import IFormat +from bmtk.builder.node_pool import NodePool +from time import gmtime, strftime + + +class HDF5Format(IFormat): + """ + Format prior to Blue-brain project collaboration. + Saves as: + nodes (csv) + node_types (csv) + edge_types (csv) + edges (h5) + """ + + CSV_DELIMITER = ' ' + COL_NODE_TYPE_ID = 'node_type_id' + COL_EDGE_TYPE_ID = 'edge_type_id' + COL_TARGET_QUERY = 'target_query' + COL_SOURCE_QUERY = 'source_query' + COL_NODE_ID = 'node_id' + BASE_DIR = 'network' + + @property + def format(self): + return 'msdk.HDF5Format' + + def save(self, directory, **kwargs): + """ saves nodes.csv, node_types.csv, edges.h5, edge_types.csv and .metadata.json. Will overwrite existing files. + + :param directory: Directory where all the files will be saved, creating dir if it doesn't exists. + :param kwargs: + """ + if directory is None: + base_path = os.path.join(self.BASE_DIR, self._network.name) + else: + base_path = directory + + metadata = { + 'version': bmtk.__version__, + 'name': self._network.name, + 'date_created': strftime("%Y-%m-%d %H:%M:%S", gmtime()), + 'file_format': self.format, + 'network_class': self._network.__class__.__name__ + } + + # save node-types. + node_types_path = os.path.join(base_path, 'node_types.csv') + self.save_node_types(node_types_path, **kwargs) + metadata['node_types_file'] = 'node_types.csv' + + # save individual nodes. + if self._network.nodes_built: + # make sure nodes have been built + nodes_path = os.path.join(base_path, 'nodes.csv') + self.save_nodes(nodes_path, **kwargs) + metadata['nodes_file'] = 'nodes.csv' + else: + print('Nodes not built. Unable to save to nodes.csv.') + + # save edge-types. + edge_types_path = os.path.join(base_path, 'edge_types.csv') + self.save_edge_types(edge_types_path, **kwargs) + metadata['edge_types_file'] = 'edge_types.csv' + + # save edges if they have been built + if self._network.edges_built: + edges_path = os.path.join(base_path, 'edges.h5') + self.save_edges(edges_path, **kwargs) + metadata['edges_file'] = 'edges.h5' + else: + print('Edges not built. Unable to save to edges.h5.') + + # save the metadata file + metadata_path = os.path.join(base_path, '.metadata.json') + with open(metadata_path, 'w') as mdfile: + json.dump(metadata, mdfile, indent=2) + + def save_node_types(self, file_name, columns=None, **kwargs): + """Write node_types to csv. + + :param file_name: path to csv file. Will be overwritten if it exists + :param columns: optional columns (not incl. manditory ones). If None then will use all node properties. + :param kwargs: optional + """ + self.__checkpath(file_name, **kwargs) + + # csv should always start with node_type_id + manditory_cols = [self.COL_NODE_TYPE_ID] + + # Determine which columns are in the node_types file and their order + nt_properties = self._network.node_type_properties + opt_cols = [] + if columns is None: + # use all node type properties + opt_cols = list(nt_properties) + else: + # check that columns specified by user exists + for col_name in columns: + if col_name not in nt_properties: + raise Exception('No node property {} found in network, cannot save {}.'.format(col_name, file_name)) + else: + opt_cols.append(col_name) + + # write to csv iteratively + cols = manditory_cols + opt_cols + with open(file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=self.CSV_DELIMITER) + csvw.writerow(cols) + for node_set in self._network._node_sets: + props = node_set.properties + row = [] + for cname in cols: + # TODO: determine dtype of parameters so we can use the appropiate none value + row.append(props.get(cname, 'NA')) # get column name or NA if it doesn't exists for this node + csvw.writerow(row) + + def save_nodes(self, file_name, columns=None, **kwargs): + """Write nodes to csv. + + :param file_name: path to csv file. Will be overwritten if it exists + :param columns: optional columns (not incl. manditory ones). If None then will use all node properties. + :param kwargs: optional + """ + self.__checkpath(file_name, **kwargs) + + # csv will start with node_id and node_type_id + manditory_columns = [self.COL_NODE_ID, self.COL_NODE_TYPE_ID] + + # optional columns from either node params or node-type properties + opt_columns = [] + if columns is None: + opt_columns = list(self._network.node_params) + else: + all_cols = self._network.node_params | self._network.node_type_properties + for col_name in columns: + if col_name not in all_cols: + # verify params/properties exist + raise Exception('No edge property {} found in network, cannot save {}.'.format(col_name, file_name)) + else: + opt_columns.append(col_name) + + # write to csv + with open(file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=self.CSV_DELIMITER) + csvw.writerow(manditory_columns + opt_columns) + for nid, node in self._network.nodes(): + row = [node.node_id, node.node_type_id] + for cname in opt_columns: + row.append(node.get(cname, 'NA')) + csvw.writerow(row) + + def save_edge_types(self, file_name, columns=None, **kwargs): + """Write edge-types to csv. + + :param file_name: path to csv file. Will be overwritten if it exists + :param columns: optional columns (not incl. manditory ones). If None then will use all node properties. + :param kwargs: optional + """ + self.__checkpath(file_name, **kwargs) + + # start with edge_type_id, target_query and source_query + manditory_cols = [self.COL_EDGE_TYPE_ID, self.COL_TARGET_QUERY, self.COL_SOURCE_QUERY] + + # optional columns + edge_props = self._network.edge_type_properties + opt_cols = [] + if columns is None: + opt_cols = list(edge_props) + else: + for col_name in columns: + if col_name not in edge_props: + raise Exception('No edge property {} found in network, cannot save {}.'.format(col_name, file_name)) + else: + opt_cols.append(col_name) + + # write to csv by iteratively going through all edge-types + with open(file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=self.CSV_DELIMITER) + csvw.writerow(manditory_cols + opt_cols) + for et in self._network._edge_sets: + edge = et['edge'] + targetnodes = edge.targets # get source as NodePools to get the source_query strings + sourcenodes = edge.sources # same with target + row_array = [edge.id, targetnodes.filter_str, sourcenodes.filter_str] + edge_params = edge.parameters + for col in opt_cols: + row_array.append(edge_params.get(col, 'NA')) + csvw.writerow(row_array) + + def save_edges(self, file_name, **kwargs): + """Saves edges to edges.h5 + + :param file_name: path to hdf5 file. Will be overwritten if it exists + :param kwargs: optional + """ + self.__checkpath(file_name, **kwargs) + + # Get sources, targets, nsyns and edge_type_id for all edges. + print("> building tables with %d nodes and %d edges" % (self._network.nnodes, self._network.nedges)) + indptr_table = [0] + nsyns_table = [] + src_gids_table = [] + edge_types_table = [] + for trg in self._network.nodes(): + # the targets have to be ordered. + tid = trg[1].node_id + for edges in self._network.edges([tid], rank=1): + src_gids_table.append(edges[0]) + nsyns_table.append(edges[2]) + edge_types_table.append(edges[3]) + + indptr_table.append(len(src_gids_table)) + + # save to h5 + print("> saving tables to %s" % (file_name)) + with h5py.File(file_name, 'w') as hf: + hf.create_dataset('edge_ptr', data=indptr_table) + hf.create_dataset('num_syns', data=nsyns_table) + hf.create_dataset('src_gids', data=src_gids_table) + hf.create_dataset('edge_types', data=edge_types_table) + + def __checkpath(self, file_name, **kwargs): + """Makes sure file_name is a valid file path and can be written.""" + dir_path = os.path.dirname(file_name) + if not os.path.exists(dir_path): + # create file's directory if it doesn't exist + os.makedirs(dir_path) + + def __load_nodes(self, nodes_file, node_types_file): + """Loads nodes and node_types from exists files + + :param nodes_file: path to nodes csv + :param node_types_file: path to node_types csv + """ + def eval(val): + # Helper function that can convert csv to an appropiate type. Helpful for cells of lists (positions, etc) + # TODO: keep column dtypes in metadata and use that for converting each column + if isinstance(val, float) and math.isnan(val): + return None + elif isinstance(val, basestring): + try: + # this will be helpful for turning strings into lists where appropiate "(0, 1, 2)" --> (0, 1, 2) + return literal_eval(val) + except ValueError: + return val + return val + + if nodes_file is None and node_types_file is None: + return None + + elif nodes_file is not None and node_types_file is not None: + # Get the array_params from nodes_file and properties from nodes_types_file, combine them to call + # add_nodes() function and rebuilt the nodes. + nt_df = pd.read_csv(node_types_file, self.CSV_DELIMITER) #, index_col=self.COL_NODE_TYPE_ID) + n_df = pd.read_csv(nodes_file, self.CSV_DELIMITER) + + for _, row in nt_df.iterrows(): + # iterate through the node_types, find all nodes with matching node_type_id and get those node's + # parameters as a dictionary of lists + node_type_props = {l: eval(row[l]) for l in nt_df.columns if eval(row[l]) is not None} + selected_nodes = n_df[n_df[self.COL_NODE_TYPE_ID] == row[self.COL_NODE_TYPE_ID]] + N = len(selected_nodes.axes[0]) + array_params = {l: list(selected_nodes[l]) for l in selected_nodes.columns + if l not in ['node_type_id', 'position']} + + # Special function for position_params + position = None + position_params = None + if 'position' in selected_nodes.columns: + position_params = {'location': [eval(p) for p in selected_nodes['position']]} + position = 'points' + + self._network.add_nodes(N, position=position, position_params=position_params, + array_params=array_params, **node_type_props) + + self._network._build_nodes() + + elif node_types_file is not None: + # nodes_types exists but nodes doesn't. We convert each row (node_type) in the csv to a collection + # of nodes with N=1, no array_params. + nt_df = pd.read_csv(node_types_file, self.CSV_DELIMITER) + for _, row in nt_df.iterrows(): + node_type_props = {l: eval(row[l]) for l in nt_df.columns if eval(row[l]) is not None} + self._network.add_nodes(N=1, **node_type_props) + self._network._build_nodes() + + elif nodes_file is not None: + # nodes exists but node_types doesn't. In this case group together all nodes by node_type_id and add them + # as a single population (with no node_params) + n_df = pd.read_csv(nodes_file, self.CSV_DELIMITER) + for nt_id, df in n_df.groupby(self.COL_NODE_TYPE_ID): + N = len(df.axes[0]) + array_params = {l: list(df[l]) for l in df.columns + if l not in ['node_type_id', 'position']} + + position = None + position_params = None + if 'position' in df.columns: + position_params = {'location': [eval(p) for p in df['position']]} + position = 'points' + + self._network.add_nodes(N, position=position, position_params=position_params, + array_params=array_params, node_type_id=nt_id) + self._network._build_nodes() + + def __load_edge_types(self, edges_file, edge_types_file): + """Loads edges and edge_types + + :param edges_file: path to edges hdf5 + :param edge_types_file: path to edge_types csv + """ + if edge_types_file is None and edges_file is None: + return + + if edge_types_file is not None: + # load in the edge-types. iterate through all the rows of edge_types.csv and call connect() function. + et_pd = pd.read_csv(edge_types_file, self.CSV_DELIMITER) + prop_cols = [label for label in et_pd.columns + if label not in [self.COL_SOURCE_QUERY, self.COL_TARGET_QUERY]] + + for _, row in et_pd.iterrows(): + # the connect function requires a Pool of nodes (like net.nodes()) or a dictionary filter. + source_nodes = NodePool.from_filter(self._network, row[self.COL_SOURCE_QUERY]) + target_nodes = NodePool.from_filter(self._network, row[self.COL_TARGET_QUERY]) + # TODO: evaluate edge-properties and exclude any that are None. + edge_params = {label: row[label] for label in prop_cols} + + # don't try to guess connection rule + self._network.connect(source=source_nodes, target=target_nodes, edge_params=edge_params) + + if edges_file is not None: + # Create edges from h5. + if not self._network.nodes_built: + print('The nodes have not been built. Cannot load edges file.') + return + + # load h5 tables + edges_h5 = h5py.File(edges_file, 'r') + edge_types_ds = edges_h5['edge_types'] + num_syns_ds = edges_h5['num_syns'] + src_gids_ds = edges_h5['src_gids'] + edge_ptr_ds = edges_h5['edge_ptr'] + n_edge_ptr = len(edge_ptr_ds) + + # the network needs edge-types objects while building the edges. If the edge_types_file exists then they + # would have been added in the previous section of code. If edge_types_file is missing we will create + # filler edge types based on the edge_type_id's found in edge_ptr dataset + if edge_types_file is None: + for et_id in set(edges_h5['edge_types'][:]): + self._network.connect(edge_params={self.COL_NODE_TYPE_ID: et_id}) + + # TODO: if edge_types.csv does exists we should check it has matching edge_type_ids with edges.h5/edge_ptr + + def itr_fnc(et): + # Creates a generator that will iteratively go through h5 file and return (source_gid, target_gid, + # nsyn) values for connections with matching edge_type.edge_type_id + edge_type_id = et.id + for ep_indx in xrange(n_edge_ptr - 1): + trg_gid = ep_indx + for syn_indx in xrange(edge_ptr_ds[ep_indx], edge_ptr_ds[ep_indx + 1]): + if edge_types_ds[syn_indx] == edge_type_id: + src_gid = src_gids_ds[syn_indx] + n_syn = num_syns_ds[syn_indx] + yield (src_gid, trg_gid, n_syn) + + for edge in self._network.edge_types(): + # create iterator and directly add edges + itr = itr_fnc(edge) + self._network._add_edges(edge, itr) + + self.edges_built = True + + def load_dir(self, directory, metadata): + def get_path(f): + if f not in metadata: + return None + file_name = metadata[f] + if directory is None or os.path.isabs(file_name): + return file + return os.path.join(directory, file_name) + + nodes_file = get_path('nodes_file') + node_types_file = get_path('node_types_file') + self.__load_nodes(nodes_file, node_types_file) + + edge_types_file = get_path('edge_types_file') + edges_file = get_path('edges_file') + self.__load_edge_types(edges_file, edge_types_file) + + def load(self, nodes_file=None, node_types_file=None, edges_file=None, edge_types_file=None): + self.__load_nodes(nodes_file, node_types_file) diff --git a/bmtk-vb/bmtk/builder/formats/iformats.py b/bmtk-vb/bmtk/builder/formats/iformats.py new file mode 100644 index 0000000..a29261e --- /dev/null +++ b/bmtk-vb/bmtk/builder/formats/iformats.py @@ -0,0 +1,29 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class IFormat(object): + def __init__(self, network): + self._network = network + + @property + def format(self): + raise NotImplementedError() \ No newline at end of file diff --git a/bmtk-vb/bmtk/builder/functor_cache.py b/bmtk-vb/bmtk/builder/functor_cache.py new file mode 100644 index 0000000..0da8fc1 --- /dev/null +++ b/bmtk-vb/bmtk/builder/functor_cache.py @@ -0,0 +1,55 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from six import string_types +import functools + + +class FunctorCache(object): + def __init__(self): + self.cache = {} + + def create(self, connector, **params): + if params is None: + params = {} + + if isinstance(connector, string_types): + # TODO: don't do this, a user may want to return a string in connection_map params + func = self.cache[connector] + return functools.partial(func, **params) + + elif isinstance(connector, dict): + return lambda *args: connector + + elif isinstance(connector, list): + # for the iterator we want to pass backs lists as they are + return connector + + elif callable(connector): + return functools.partial(connector, **params) + + else: + # should include all numericals, non-callable objects and tuples + return lambda *args: connector + + def register(self, name, func): + self.cache[name] = func diff --git a/bmtk-vb/bmtk/builder/functor_cache.pyc b/bmtk-vb/bmtk/builder/functor_cache.pyc new file mode 100644 index 0000000..69e7056 Binary files /dev/null and b/bmtk-vb/bmtk/builder/functor_cache.pyc differ diff --git a/bmtk-vb/bmtk/builder/id_generator.py b/bmtk-vb/bmtk/builder/id_generator.py new file mode 100644 index 0000000..9d7b798 --- /dev/null +++ b/bmtk-vb/bmtk/builder/id_generator.py @@ -0,0 +1,71 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import threading +import numpy as np +import six + + + +class IDGenerator(object): + """ A simple class for fetching global ids. To get a unqiue global ID class next(), which should be thread-safe. It + Also has a remove_id(gid) in which case next() will never return the gid. The remove_id function is used for cases + when using imported networks and we want to elimnate previously created id. + + TODO: + * Implement a bit array to keep track of already existing gids + * It might be necessary to implement with MPI support? + """ + def __init__(self, init_val=0): + self.__counter = init_val + self.__taken = set() + self.__lock = threading.Lock() + + def remove_id(self, gid): + assert(np.issubdtype(type(gid), np.integer)) + if gid >= self.__counter: + self.__taken.add(gid) + + def next(self): + self.__lock.acquire() + while self.__counter in self.__taken: + self.__taken.remove(self.__counter) + self.__counter += 1 + + nid = self.__counter + self.__counter += 1 + self.__lock.release() + + return nid + + def __contains__(self, gid): + return gid < self.__counter + + def __call__(self, *args, **kwargs): + if len(args) == 1: + N = args[0] + elif 'N' in 'kwargs': + N = args['N'] + + assert(isinstance(N, (int, long))) + return [self.next() for _ in six.moves.range(N)] + diff --git a/bmtk-vb/bmtk/builder/id_generator.pyc b/bmtk-vb/bmtk/builder/id_generator.pyc new file mode 100644 index 0000000..5114175 Binary files /dev/null and b/bmtk-vb/bmtk/builder/id_generator.pyc differ diff --git a/bmtk-vb/bmtk/builder/io/__init__.py b/bmtk-vb/bmtk/builder/io/__init__.py new file mode 100644 index 0000000..00a458f --- /dev/null +++ b/bmtk-vb/bmtk/builder/io/__init__.py @@ -0,0 +1,66 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +from ..network import Network + +def write_edges_to_h5(network, filename, synapse_key=None, verbose=True): + assert(isinstance(network, Network)) + + # The network edges may either be a raw value, dictionary or list + if synapse_key == None: + lookup = lambda x: x + + elif isinstance(synapse_key, str): + lookup = lambda x: x[synapse_key] + + elif isinstance(synapse_key, int): + lookup = lambda x: x[synapse_key] + + else: + raise Exception("Unable to resolve the synapse_key type.") + + # Create the tables for indptr, nsyns and src_gids + if verbose: + print("> building tables with {} nodes and {} edges.".format(network.nnodes, network.nedges)) + indptr_table = [0] + nsyns_table = [] + src_gids_table = [] + for trg in network.nodes(): + # TODO: check the order of the node list + tid = trg[1]['id'] + for edges in network.edges([tid], rank=1): + src_gids_table.append(edges[0]) + nsyns_table.append(lookup(edges[2])) + + if len(src_gids_table) == indptr_table[-1]: + print("node %d doesn't have any edges {}".format(tid)) + indptr_table.append(len(src_gids_table)) + + # Save the tables in h5 format + if verbose: + print("> Saving table to {}.".format(filename)) + with h5py.File(filename, 'w') as hf: + hf.create_dataset('indptr', data=indptr_table) + hf.create_dataset('nsyns', data=nsyns_table) + hf.create_dataset('src_gids', data=src_gids_table, dtype=int32) + hf.attrs["shape"] = (network.nnodes, network.nnodes) diff --git a/bmtk-vb/bmtk/builder/iterator.py b/bmtk-vb/bmtk/builder/iterator.py new file mode 100644 index 0000000..1469cfa --- /dev/null +++ b/bmtk-vb/bmtk/builder/iterator.py @@ -0,0 +1,124 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import itertools +import functools +import types + + +class IteratorCache(object): + def __init__(self): + self.cache = {} + + def create(self, itr_name, itr_type, **params): + if params is None: + params = {} + + if (itr_name, itr_type) in self.cache: + func = self.cache[(itr_name, itr_type)] + return functools.partial(func, **params) + + else: + raise Exception("Couldn't find iterator for ({}, {}).".format(itr_name, itr_type)) + + def register(self, name, itr_type, func): + self.cache[(name, itr_type)] = func + + +def create(iterator, connector, **params): + return ITERATOR_CACHE.create(iterator, type(connector), **params) + + +def register(name, dtype, func): + ITERATOR_CACHE.register(name, dtype, func) + + +######################################################################## +# Pre-defined iterators +######################################################################## +def one_to_all_iterator(source_nodes, target_nodes, connector): + """Calls the connector function with (1 source, all targets), iterated for each source""" + target_list = list(target_nodes) # list of all targets + target_node_ids = [t.node_id for t in target_list] # slight improvement than calling node_id S*T times + for source in source_nodes: + source_node_id = source.node_id + edge_vals = connector(source, target_list) + for i, target in enumerate(target_list): + yield (source_node_id, target_node_ids[i], edge_vals[i]) + + +def all_to_one_iterator(source_nodes, target_nodes, connector): + """Iterate through all the target nodes and return target node + list of all sources""" + source_list = list(source_nodes) + for target in target_nodes: + val = connector(source_list, target) + for i, source in enumerate(source_list): + yield (source.node_id, target.node_id, val[i]) + + +def one_to_one_iterator(source_nodes, target_nodes, connector): + # TODO: may be faster to pull out the node_ids, don't user itertools + for source, target in itertools.product(source_nodes, target_nodes): + val = connector(source, target) + yield (source.node_id, target.node_id, val) + + +def one_to_one_list_iterator(source_nodes, target_nodes, vals): + assert(len(vals) == len(source_nodes)*len(target_nodes)) + for i, (source, target) in enumerate(itertools.product(source_nodes, target_nodes)): + yield (source.node_id, target.node_id, vals[i]) + + +def one_to_all_list_iterator(source_nodes, target_nodes, vals): + assert(len(vals) == len(target_nodes)) + source_ids = [s.node_id for s in list(source_nodes)] + target_ids = [t.node_id for t in list(target_nodes)] + for src_id in source_ids: + for i, trg_id in enumerate(target_ids): + yield (src_id, trg_id, vals[i]) + + +def all_to_one_list_iterator(source_nodes, target_nodes, vals): + assert(len(vals) == len(source_nodes)) + source_ids = [s.node_id for s in list(source_nodes)] + target_ids = [t.node_id for t in list(target_nodes)] + for trg_id in target_ids: + for i, src_id in enumerate(source_ids): + yield (src_id, trg_id, vals[i]) + + +def lambda_iterator(source_nodes, target_nodes, lambda_val): + for source, target in itertools.product(source_nodes, target_nodes): + yield (source.node_id, target.node_id, lambda_val()) + + +ITERATOR_CACHE = IteratorCache() +register('one_to_one', functools.partial, one_to_one_iterator) +register('all_to_one', functools.partial, all_to_one_iterator) +register('one_to_all', functools.partial, one_to_all_iterator) + +register('one_to_one', list, one_to_one_list_iterator) +register('one_to_all', list, one_to_all_list_iterator) +register('all_to_one', list, all_to_one_list_iterator) + + +register('one_to_one', types.FunctionType, lambda_iterator) diff --git a/bmtk-vb/bmtk/builder/iterator.pyc b/bmtk-vb/bmtk/builder/iterator.pyc new file mode 100644 index 0000000..b642e62 Binary files /dev/null and b/bmtk-vb/bmtk/builder/iterator.pyc differ diff --git a/bmtk-vb/bmtk/builder/network.py b/bmtk-vb/bmtk/builder/network.py new file mode 100644 index 0000000..90d3ac1 --- /dev/null +++ b/bmtk-vb/bmtk/builder/network.py @@ -0,0 +1,478 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import numpy as np +import types +import csv +import six + +from .node_pool import NodePool +from .connection_map import ConnectionMap +from .node_set import NodeSet +from .id_generator import IDGenerator + + +class Network (object): + def __init__(self, name, **network_props): + if len(name) == 0: + raise Exception('Network name missing.') + + self._network_name = name + + self._nnodes = 0 + self._nodes_built = False + self._nedges = 0 + self._edges_built = False + + self._node_sets = [] + self.__external_node_sets = [] + self.__node_id_counter = 0 + + self._node_types_properties = {} + self._node_types_columns = set(['node_type_id']) + # self._edge_type_properties = {} + # self._edge_types_columns = set(['edge_type_id']) + self._connection_maps = [] + #self._connection_maps = ConnectionTable() + + self._node_id_gen = IDGenerator() + self._node_type_id_gen = IDGenerator(100) + self._edge_type_id_gen = IDGenerator(100) + + #self._connection_table = [] + #self._source_networks = [] + #self._target_networks = [] + self._network_conns = set() + self._connected_networks = {} + + @property + def name(self): + return self._network_name + + @property + def nodes_built(self): + return self._nodes_built + + @property + def edges_built(self): + return self._edges_built + + @property + def nnodes(self): + raise NotImplementedError + + @property + def nedges(self): + raise NotImplementedError + + def get_connections(self): + return self._connection_maps + + def _add_node_type(self, props): + node_type_id = props.get('node_type_id', None) + if node_type_id is None: + node_type_id = self._node_type_id_gen.next() + else: + if node_type_id in self._node_types_properties: + raise Exception('node_type_id {} already exists.'.format(node_type_id)) + self._node_type_id_gen.remove_id(node_type_id) + + props['node_type_id'] = node_type_id + self._node_types_properties[node_type_id] = props + + def add_nodes(self, N=1, **properties): + self._clear() + + # categorize properties as either a node-params (for nodes file) or node-type-property (for node_types files) + node_params = {} + node_properties = {} + for prop_name, prop_value in properties.items(): + if isinstance(prop_value, (list, np.ndarray)): # TODO: what about pandas series + n_props = len(prop_value) + if n_props != N: + raise Exception('Trying to pass in array of length {} into N={} nodes'.format(n_props, N)) + node_params[prop_name] = prop_value + + elif isinstance(prop_value, types.GeneratorType): + vals = list(prop_value) + assert(len(vals) == N) + node_params[prop_name] = vals + + else: + node_properties[prop_name] = prop_value + self._node_types_columns.add(prop_name) + + # If node-type-id exists, make sure there is no clash, otherwise generate a new id. + if 'node_type_id' in node_params: + raise Exception('There can be only one "node_type_id" per set of nodes.') + + self._add_node_type(node_properties) + self._node_sets.append(NodeSet(N, node_params, node_properties)) + + def add_edges(self, source=None, target=None, connection_rule=1, connection_params=None, iterator='one_to_one', + **edge_type_properties): + # TODO: check edge_type_properties for 'edge_type_id' and make sure there isn't a collision. Otherwise create + # a new id. + if not isinstance(source, NodePool): + source = NodePool(self, **source or {}) + + if not isinstance(target, NodePool): + target = NodePool(self, **target or {}) + + self._network_conns.add((source.network_name, target.network_name)) + self._connected_networks[source.network_name] = source.network + self._connected_networks[target.network_name] = target.network + + # TODO: make sure that they don't add a dictionary or some other wried property type. + edge_type_id = edge_type_properties.get('edge_type_id', None) + if edge_type_id is None: + edge_type_id = self._edge_type_id_gen.next() + edge_type_properties['edge_type_id'] = edge_type_id + elif edge_type_id in self._edge_type_id_gen: + raise Exception('edge_type_id {} already exists.'.format(edge_type_id)) + else: + self._edge_type_id_gen.remove_id(edge_type_id) + + edge_type_properties['source_query'] = source.filter_str + edge_type_properties['target_query'] = target.filter_str + + if 'nsyns' in edge_type_properties: + connection_rule = edge_type_properties['nsyns'] + del edge_type_properties['nsyns'] + + # self._edge_types_columns.update(edge_type_properties.keys()) + connection = ConnectionMap(source, target, connection_rule, connection_params, iterator, edge_type_properties) + self._connection_maps.append(connection) + # self._connection_maps.add(source.network_name, target.network_name, connection) + return connection + + def nodes(self, **properties): + if not self.nodes_built: + self._build_nodes() + + return NodePool(self, **properties) + + def nodes_iter(self, nids=None): + raise NotImplementedError + + def edges(self, target_nodes=None, source_nodes=None, target_network=None, source_network=None, **properties): + """Returns a list of dictionary-like Edge objects, given filter parameters. + + To get all edges from a network + edges = net.edges() + + To specify the target and/or source node-set + edges = net.edges(target_nodes=net.nodes(type='biophysical'), source_nodes=net.nodes(ei='i')) + + To only get edges with a given edge_property + edges = net.edges(weight=100, syn_type='AMPA_Exc2Exc') + + :param target_nodes: gid, list of gid, dict or node-pool. Set of target nodes for a given edge. + :param source_nodes: gid, list of gid, dict or node-pool. Set of source nodes for a given edge. + :param target_network: name of network containing target nodes. + :param source_network: name of network containing source nodes. + :param properties: edge-properties used to filter out only certain edges. + :return: list of bmtk.builder.edge.Edge properties. + """ + def nodes2gids(nodes, network): + """helper function for converting target and source nodes into list of gids""" + if nodes is None or isinstance(nodes, list): + return nodes, network + if isinstance(nodes, int): + return [nodes], network + if isinstance(nodes, dict): + network = network or self._network_name + nodes = self._connected_networks[network].nodes(**nodes) + if isinstance(nodes, NodePool): + if network is not None and nodes.network_name != network: + print('Warning. nodes and network don not match') + return [n.node_id for n in nodes], nodes.network_name + else: + raise Exception('Couldnt convert nodes') + + def filter_edges(e): + """Returns true only if all the properities match for a given edge""" + for k, v in properties.items(): + if k not in e: + return False + if e[k] != v: + return False + return True + + if not self.edges_built: + self.build() + + # trg_gids can't be none for edges_itr. if target-nodes is not explicity states get all target_gids that + # synapse onto or from current network. + if target_nodes is None: + trg_gid_set = set(n.node_id for cm in self._connection_maps for n in cm.target_nodes) + target_nodes = sorted(trg_gid_set) + + # convert target/source nodes into a list of their gids + trg_gids, trg_net = nodes2gids(target_nodes, target_network) + src_gids, src_net = nodes2gids(source_nodes, source_network) + + # use the iterator to get edges and return as a list + if properties is None: + edges = list(self.edges_iter(trg_gids=trg_gids, trg_network=trg_net, src_network=src_net)) + else: + # filter out certain edges using the properties parameters + edges = [e for e in self.edges_iter(trg_gids=trg_gids, trg_network=trg_net, src_network=src_net) + if filter_edges(e)] + + if src_gids is not None: + # if src_gids are set filter out edges some more + edges = [e for e in edges if e.source_gid in src_gids] + + return edges + + def edges_iter(self, trg_gids, src_network=None, trg_network=None): + """Given a list of target gids, returns a generator for iteratoring over all possible edges. + + It is preferable to use edges() method instead, it allows more flexibibility in the input and can better + indicate if their is a problem. + + The order of the edges returned will be in the same order as the trg_gids list, but does not guarentee any + secondary ordering by source-nodes and/or edge-type. If their isn't a edge with a matching target-id then + it will skip that gid in the list, the size of the generator can 0 to arbitrarly large. + + :param trg_gids: list of gids to match with an edge's target. + :param src_network: str, only returns edges coming from the specified source network. + :param trg_network: str, only returns edges coming from the specified target network. + :return: iteration of bmtk.build.edge.Edge objects representing given edge. + """ + raise NotImplementedError + + def clear(self): + self._nodes_built = False + self._edges_built = False + self._clear() + + def _node_id(self, N): + for i in six.moves.range(N): + yield self.__node_id_counter + self.__node_id_counter += 1 + + def _build_nodes(self): + """Builds or rebuilds all the nodes, clear out both node and edge sets.""" + # print 'build_nodes' + self._clear() + self._initialize() + + for ns in self._node_sets: + nodes = ns.build(nid_generator=self._node_id) + self._add_nodes(nodes) + self._nodes_built = True + + def __build_edges(self): + """Builds network edges""" + if not self.nodes_built: + # only rebuild nodes if necessary. + self._build_nodes() + + for i, conn_map in enumerate(self._connection_maps): + # print conn_map + self._add_edges(conn_map, i) + + self._edges_built = True + + def build(self, force=False): + """ Builds nodes (assigns gids) and edges. + + Args: + force (bool): set true to force complete rebuilding of nodes and edges, if nodes() or save_nodes() has been + called before then forcing a rebuild may change gids of each node. + """ + + # if nodes() or save_nodes() is called by user prior to calling build() - make sure the nodes + # are completely rebuilt (unless a node set has been added). + if force: + self._clear() + self._initialize() + self._build_nodes() + + # always build the edges. + self.__build_edges() + + def __get_path(self, filename, path_dir, ftype): + if filename is None: + fname = '{}_{}'.format(self.name, ftype) + return os.path.join(path_dir, fname) + elif os.path.isabs(filename): + return filename + else: + return os.path.join(path_dir, filename) + + def save(self, output_dir='.'): + self.save_nodes(output_dir=output_dir) + self.save_edges(output_dir=output_dir) + + def save_nodes(self, nodes_file_name=None, node_types_file_name=None, output_dir='.', force_overwrite=True): + nodes_file = self.__get_path(nodes_file_name, output_dir, 'nodes.h5') + if not force_overwrite and os.path.exists(nodes_file): + raise Exception('File {} exists. Please use different name or use force_overwrite'.format(nodes_file)) + nf_dir = os.path.dirname(nodes_file) + if not os.path.exists(nf_dir): + os.makedirs(nf_dir) + + node_types_file = self.__get_path(node_types_file_name, output_dir, 'node_types.csv') + if not force_overwrite and os.path.exists(node_types_file): + raise Exception('File {} exists. Please use different name or use force_overwrite'.format(node_types_file)) + ntf_dir = os.path.dirname(node_types_file) + if not os.path.exists(ntf_dir): + os.makedirs(ntf_dir) + + self._save_nodes(nodes_file) + self._save_node_types(node_types_file) + + def _save_nodes(self, nodes_file_name): + raise NotImplementedError + + def _save_node_types(self, node_types_file_name): + node_types_cols = ['node_type_id'] + [col for col in self._node_types_columns if col != 'node_type_id'] + with open(node_types_file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=' ') + csvw.writerow(node_types_cols) + for node_type in self._node_types_properties.values(): + csvw.writerow([node_type.get(cname, 'NULL') for cname in node_types_cols]) + + def import_nodes(self, nodes_file_name, node_types_file_name): + raise NotImplementedError + + def save_edges(self, edges_file_name=None, edge_types_file_name=None, output_dir='.', src_network=None, + trg_network=None, name=None, force_build=True, force_overwrite=False): + # Make sure edges exists and are built + if len(self._connection_maps) == 0: + print("Warning: no edges have been made for this network, skipping saving.") + return + + if self._edges_built is False: + if force_build: + print("Message: building edges") + self.__build_edges() + else: + print("Warning: Edges are not built. Either call build() or use force_build parameter. Skip saving.") + return + + network_params = [(s, t, s+'_'+t+'_edges.h5', s+'_'+t+'_edge_types.csv') for s, t in list(self._network_conns)] + if src_network is not None: + network_params = [p for p in network_params if p[0] == src_network] + + if trg_network is not None: + network_params = [p for p in network_params if p[1] == trg_network] + + if len(network_params) == 0: + print("Warning: couldn't find connections. Skip saving.") + return + + if (edges_file_name or edge_types_file_name) is not None: + network_params = [(network_params[0][0], network_params[0][1], edges_file_name, edge_types_file_name)] + + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + for p in network_params: + if p[3] is not None: + self._save_edge_types(os.path.join(output_dir, p[3]), p[0], p[1]) + + if p[2] is not None: + self._save_edges(os.path.join(output_dir, p[2]), p[0], p[1], name) + + def _save_edge_types(self, edge_types_file_name, src_network, trg_network): + + # Get edge-type properties for connections with matching source/target networks + matching_et = [c.edge_type_properties for c in self._connection_maps + if c.source_network_name == src_network and c.target_network_name == trg_network] + + # Get edge-type properties that are only relevant for this source-target network pair + cols = ['edge_type_id', 'target_query', 'source_query'] # manditory and should come first + merged_keys = [k for et in matching_et for k in et.keys() if k not in cols] + cols += list(set(merged_keys)) + + # Write to csv + with open(edge_types_file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=' ') + csvw.writerow(cols) + for edge_type in matching_et: + csvw.writerow([edge_type.get(cname, 'NULL') if edge_type.get(cname, 'NULL') is not None else 'NULL' + for cname in cols]) + + def _save_edges(self, edges_file_name, src_network, trg_network): + raise NotImplementedError + + def _initialize(self): + raise NotImplementedError + + def _add_nodes(self, node_tuples): + raise NotImplementedError + + def _add_edges(self, edge_tuples, i): + raise NotImplementedError + + def _clear(self): + raise NotImplementedError + + """ + def _edges_iter(targets=None, sources=None): + raise NotImplementedError + """ + +""" +class ConnectionTable(object): + def __init__(self): + self.__targets = {} + self.__sources = {} + self.__connections = [] + + def add(self, source_network, target_network, connection_map): + # TODO: If the source/target are network objects we can get the network_name + assert(isinstance(source_network, basestring)) + assert(isinstance(target_network, basestring)) + assert(isinstance(connection_map, ConnectionMap)) + + if source_network not in self.__sources: + self.__sources[source_network] = [] + if target_network not in self.__targets: + self.__targets[target_network] = [] + + cm_index = len(self.__connections) + self.__connections.append(connection_map) + self.__sources[source_network].append(cm_index) + self.__targets[target_network].append(cm_index) + + def get(self, source_network=None, target_network=None): + # TODO: Add warning if source/target network is not found + cm_indicies = set(range(len(self.__connections))) + if source_network is not None: + cm_indicies &= set(self.__sources.get(source_network, [])) + + if target_network is not None: + cm_indicies &= set(self.__targets.get(target_network, [])) + + return self.__connections[cm_indicies] +""" + + + + + diff --git a/bmtk-vb/bmtk/builder/network.pyc b/bmtk-vb/bmtk/builder/network.pyc new file mode 100644 index 0000000..934a435 Binary files /dev/null and b/bmtk-vb/bmtk/builder/network.pyc differ diff --git a/bmtk-vb/bmtk/builder/networks/__init__.py b/bmtk-vb/bmtk/builder/networks/__init__.py new file mode 100644 index 0000000..45b0922 --- /dev/null +++ b/bmtk-vb/bmtk/builder/networks/__init__.py @@ -0,0 +1,30 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .dm_network import DenseNetwork +NetworkBuilder = dm_network.DenseNetwork + +try: + # If mpi4py is installed let users access MPIBuilder for parallel building networks + from .mpi_network import MPINetwork, MPINetwork as MPIBuilder +except ImportError as err: + pass diff --git a/bmtk-vb/bmtk/builder/networks/__init__.pyc b/bmtk-vb/bmtk/builder/networks/__init__.pyc new file mode 100644 index 0000000..4fad6a5 Binary files /dev/null and b/bmtk-vb/bmtk/builder/networks/__init__.pyc differ diff --git a/bmtk-vb/bmtk/builder/networks/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/builder/networks/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..9b5d19f Binary files /dev/null and b/bmtk-vb/bmtk/builder/networks/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/networks/__pycache__/dm_network.cpython-37.pyc b/bmtk-vb/bmtk/builder/networks/__pycache__/dm_network.cpython-37.pyc new file mode 100644 index 0000000..6f50aa6 Binary files /dev/null and b/bmtk-vb/bmtk/builder/networks/__pycache__/dm_network.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/networks/__pycache__/mpi_network.cpython-37.pyc b/bmtk-vb/bmtk/builder/networks/__pycache__/mpi_network.cpython-37.pyc new file mode 100644 index 0000000..68baa18 Binary files /dev/null and b/bmtk-vb/bmtk/builder/networks/__pycache__/mpi_network.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/builder/networks/dm_network.py b/bmtk-vb/bmtk/builder/networks/dm_network.py new file mode 100644 index 0000000..b6547dc --- /dev/null +++ b/bmtk-vb/bmtk/builder/networks/dm_network.py @@ -0,0 +1,487 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import numpy as np +import h5py +import six +import csv + +from ..network import Network +from bmtk.builder.node import Node +from bmtk.builder.edge import Edge +from bmtk.utils import sonata + + +class DenseNetwork(Network): + def __init__(self, name, **network_props): + super(DenseNetwork, self).__init__(name, **network_props or {}) + + self.__edges_types = {} + self.__src_mapping = {} + + self.__networks = {} + self.__node_count = 0 + self._nodes = [] + + self.__edges_tables = [] + self._target_networks = {} + + def _initialize(self): + self.__id_map = [] + self.__lookup = [] + + def _add_nodes(self, nodes): + self._nodes.extend(nodes) + self._nnodes = len(self._nodes) + + """ + id_label = 'node_id' if 'node_id' in nodes[0].keys() else 'id' + + start_idx = len(self.__id_map) # + self.__id_map += [n[id_label] for n in nodes] + self.__nodes += [(interal_id, nodes[node_idx]) + for node_idx, interal_id in enumerate(xrange(start_idx, len(self.__id_map)))] + + assert(len(self.__id_map) == len(self.__nodes)) + """ + + def edges_table(self): + return self.__edges_tables + + def _save_nodes(self, nodes_file_name): + if not self._nodes_built: + self._build_nodes() + + # save the node_types file + # TODO: how do we add attributes to the h5 + group_indx = 0 + groups_lookup = {} + group_indicies = {} + group_props = {} + for ns in self._node_sets: + if ns.params_hash in groups_lookup: + continue + else: + groups_lookup[ns.params_hash] = group_indx + group_indicies[group_indx] = 0 + group_props[group_indx] = {k: [] for k in ns.params_keys if k != 'node_id'} + group_indx += 1 + + node_gid_table = np.zeros(self._nnodes) # todo: set dtypes + node_type_id_table = np.zeros(self._nnodes) + node_group_table = np.zeros(self._nnodes) + node_group_index_tables = np.zeros(self._nnodes) + + for i, node in enumerate(self.nodes()): + node_gid_table[i] = node.node_id + node_type_id_table[i] = node.node_type_id + group_id = groups_lookup[node.params_hash] + node_group_table[i] = group_id + node_group_index_tables[i] = group_indicies[group_id] + group_indicies[group_id] += 1 + + group_dict = group_props[group_id] + for key, prop_ds in group_dict.items(): + prop_ds.append(node.params[key]) + + # TODO: open in append mode + with h5py.File(nodes_file_name, 'w') as hf: + # Add magic and version attribute + add_hdf5_attrs(hf) + + pop_grp = hf.create_group('/nodes/{}'.format(self.name)) + pop_grp.create_dataset('node_id', data=node_gid_table, dtype='uint64') + pop_grp.create_dataset('node_type_id', data=node_type_id_table, dtype='uint64') + pop_grp.create_dataset('node_group_id', data=node_group_table, dtype='uint32') + pop_grp.create_dataset('node_group_index', data=node_group_index_tables, dtype='uint64') + + for grp_id, props in group_props.items(): + model_grp = pop_grp.create_group('{}'.format(grp_id)) + + for key, dataset in props.items(): + # ds_path = 'nodes/{}/{}'.format(grp_id, key) + try: + model_grp.create_dataset(key, data=dataset) + except TypeError: + str_list = [str(d) for d in dataset] + hf.create_dataset(key, data=str_list) + + def nodes_iter(self, node_ids=None): + if node_ids is not None: + return [n for n in self._nodes if n.node_id in node_ids] + else: + return self._nodes + + def _process_nodepool(self, nodepool): + return nodepool + + def import_nodes(self, nodes_file_name, node_types_file_name, population=None): + sonata_file = sonata.File(data_files=nodes_file_name, data_type_files=node_types_file_name) + if sonata_file.nodes is None: + raise Exception('nodes file {} does not have any nodes.'.format(nodes_file_name)) + + populations = sonata_file.nodes.populations + if len(populations) == 1: + node_pop = populations[0] + elif population is None: + raise Exception('The nodes file {} contains multiple populations.'.format(nodes_file_name) + + 'Please specify population parameter.') + else: + for pop in populations: + if pop.name == population: + node_pop = pop + break + else: + raise Exception('Nodes file {} does not contain population {}.'.format(nodes_file_name, population)) + + # print node_pop.node_types_table + for node_type_props in node_pop.node_types_table: + self._add_node_type(node_type_props) + + for node in node_pop: + self._node_id_gen.remove_id(node.node_id) + self._nodes.append(Node(node.node_id, node.group_props, node.node_type_properties)) + + def _add_edges(self, connection_map, i): + syn_table = self.EdgeTable(connection_map) + connections = connection_map.connection_itr() + for con in connections: + if con[2] is not None: + syn_table[con[0], con[1]] = con[2] + + target_net = connection_map.target_nodes + self._target_networks[target_net.network_name] = target_net.network + + nsyns = np.sum(syn_table.nsyn_table) + self._nedges += int(nsyns) + edge_table = {'syn_table': syn_table, + 'nsyns': nsyns, + 'edge_types': connection_map.edge_type_properties, + 'edge_type_id': connection_map.edge_type_properties['edge_type_id'], + 'source_network': connection_map.source_nodes.network_name, + 'target_network': connection_map.target_nodes.network_name, + 'params': {}, + 'params_dtypes': {}, + 'source_query': connection_map.source_nodes.filter_str, + 'target_query': connection_map.target_nodes.filter_str} + + + for param in connection_map.params: + rule = param.rule + param_names = param.names + edge_table['params_dtypes'].update(param.dtypes) + if isinstance(param_names, list) or isinstance(param_names, tuple): + tmp_tables = [self.PropertyTable(nsyns) for _ in range(len(param_names))] + for source in connection_map.source_nodes: + src_node_id = source.node_id + for target in connection_map.target_nodes: + trg_node_id = target.node_id # TODO: pull this out and put in it's own list + for _ in range(syn_table[src_node_id, trg_node_id]): + pvals = rule(source, target) + for i in range(len(param_names)): + tmp_tables[i][src_node_id, trg_node_id] = pvals[i] + + for i, name in enumerate(param_names): + # TODO: I think a copy constructor might get called, move this out. + edge_table['params'][name] = tmp_tables[i] + + else: + pt = self.PropertyTable(np.sum(nsyns)) + for source in connection_map.source_nodes: + src_node_id = source.node_id + for target in connection_map.target_nodes: + trg_node_id = target.node_id # TODO: pull this out and put in it's own list + #print('{}, {}: {}'.format(src_node_id, trg_node_id, edge_table[src_node_id, trg_node_id])) + for _ in range(syn_table[src_node_id, trg_node_id]): + pt[src_node_id, trg_node_id] = rule(source, target) + edge_table['params'][param_names] = pt + + self.__edges_tables.append(edge_table) + + def _save_edges(self, edges_file_name, src_network, trg_network, name=None): + groups = {} + group_dtypes = {} # TODO: this should be stored in PropertyTable + grp_id_itr = 0 + groups_lookup = {} + total_syns = 0 + + matching_edge_tables = [et for et in self.__edges_tables + if et['source_network'] == src_network and et['target_network'] == trg_network] + + for ets in matching_edge_tables: + params_hash = str(ets['params'].keys()) + group_id = groups_lookup.get(params_hash, None) + if group_id is None: + group_id = grp_id_itr + groups_lookup[params_hash] = group_id + grp_id_itr += 1 + + ets['group_id'] = group_id + groups[group_id] = {} + group_dtypes[group_id] = ets['params_dtypes'] + for param_name in ets['params'].keys(): + groups[group_id][param_name] = [] + + total_syns += int(ets['nsyns']) + + group_index_itrs = [0 for _ in range(grp_id_itr)] + trg_gids = np.zeros(total_syns) # set dtype to uint64 + src_gids = np.zeros(total_syns) + edge_groups = np.zeros(total_syns) # dtype uint16 or uint8 + edge_group_index = np.zeros(total_syns) # uint32 + edge_type_ids = np.zeros(total_syns) # uint32 + + # TODO: Another potential issue if node-ids don't start with 0 + index_ptrs = np.zeros(len(self._target_networks[trg_network].nodes()) + 1) + #index_ptrs = np.zeros(len(self._nodes)+1) # TODO: issue when target nodes come from another network + index_ptr_itr = 0 + + gid_indx = 0 + for trg_node in self._target_networks[trg_network].nodes(): + index_ptrs[index_ptr_itr] = gid_indx + index_ptr_itr += 1 + + for ets in matching_edge_tables: + edge_group_id = ets['group_id'] + group_table = groups[edge_group_id] + + syn_table = ets['syn_table'] + if syn_table.has_target(trg_node.node_id): + if ets['params']: + for src_id, nsyns in syn_table.trg_itr(trg_node.node_id): + # Add on to the edges index + indx_end = gid_indx+nsyns + while gid_indx < indx_end: + trg_gids[gid_indx] = trg_node.node_id + src_gids[gid_indx] = src_id + edge_type_ids[gid_indx] = ets['edge_type_id'] + edge_groups[gid_indx] = edge_group_id + edge_group_index[gid_indx] = group_index_itrs[edge_group_id] + group_index_itrs[edge_group_id] += 1 + gid_indx += 1 + + for param_name, param_table in ets['params'].items(): + param_vals = group_table[param_name] + for val in param_table.itr_vals(src_id, trg_node.node_id): + param_vals.append(val) + + else: + # If no properties just print nsyns table. + if 'nsyns' not in group_table: + group_table['nsyns'] = [] + group_dtypes[edge_group_id]['nsyns'] = 'uint16' + for src_id, nsyns in syn_table.trg_itr(trg_node.node_id): + trg_gids[gid_indx] = trg_node.node_id + src_gids[gid_indx] = src_id + edge_type_ids[gid_indx] = ets['edge_type_id'] + edge_groups[gid_indx] = edge_group_id + edge_group_index[gid_indx] = group_index_itrs[edge_group_id] + # group_dtypes + group_index_itrs[edge_group_id] += 1 + gid_indx += 1 + + group_table['nsyns'].append(nsyns) + + trg_gids = trg_gids[:gid_indx] + src_gids = src_gids[:gid_indx] + edge_groups = edge_groups[:gid_indx] + edge_group_index = edge_group_index[:gid_indx] + edge_type_ids = edge_type_ids[:gid_indx] + + pop_name = '{}_to_{}'.format(src_network, trg_network) if name is None else name + + index_ptrs[index_ptr_itr] = gid_indx + with h5py.File(edges_file_name, 'w') as hf: + add_hdf5_attrs(hf) + pop_grp = hf.create_group('/edges/{}'.format(pop_name)) + pop_grp.create_dataset('target_node_id', data=trg_gids, dtype='uint64') + pop_grp['target_node_id'].attrs['node_population'] = trg_network + pop_grp.create_dataset('source_node_id', data=src_gids, dtype='uint64') + pop_grp['source_node_id'].attrs['node_population'] = src_network + + pop_grp.create_dataset('edge_group_id', data=edge_groups, dtype='uint16') + pop_grp.create_dataset('edge_group_index', data=edge_group_index, dtype='uint32') + pop_grp.create_dataset('edge_type_id', data=edge_type_ids, dtype='uint32') + # pop_grp.create_dataset('edges/index_pointer', data=index_ptrs, dtype='uint32') + + for group_id, params_dict in groups.items(): + model_grp = pop_grp.create_group(str(group_id)) + for params_key, params_vals in params_dict.items(): + #group_path = 'edges/{}/{}'.format(group_id, params_key) + dtype = group_dtypes[group_id][params_key] + if dtype is not None: + model_grp.create_dataset(params_key, data=list(params_vals), dtype=dtype) + else: + model_grp.create_dataset(params_key, data=list(params_vals)) + + self._create_index(pop_grp['target_node_id'], pop_grp, index_type='target') + self._create_index(pop_grp['source_node_id'], pop_grp, index_type='source') + + def _create_index(self, node_ids_ds, output_grp, index_type='target'): + if index_type == 'target': + edge_nodes = np.array(node_ids_ds, dtype=np.int64) + output_grp = output_grp.create_group('indicies/target_to_source') + elif index_type == 'source': + edge_nodes = np.array(node_ids_ds, dtype=np.int64) + output_grp = output_grp.create_group('indicies/source_to_target') + + edge_nodes = np.append(edge_nodes, [-1]) + n_targets = np.max(edge_nodes) + ranges_list = [[] for _ in six.moves.range(n_targets + 1)] + + n_ranges = 0 + begin_index = 0 + cur_trg = edge_nodes[begin_index] + for end_index, trg_gid in enumerate(edge_nodes): + if cur_trg != trg_gid: + ranges_list[cur_trg].append((begin_index, end_index)) + cur_trg = int(trg_gid) + begin_index = end_index + n_ranges += 1 + + node_id_to_range = np.zeros((n_targets + 1, 2)) + range_to_edge_id = np.zeros((n_ranges, 2)) + range_index = 0 + for node_index, trg_ranges in enumerate(ranges_list): + if len(trg_ranges) > 0: + node_id_to_range[node_index, 0] = range_index + for r in trg_ranges: + range_to_edge_id[range_index, :] = r + range_index += 1 + node_id_to_range[node_index, 1] = range_index + + output_grp.create_dataset('range_to_edge_id', data=range_to_edge_id, dtype='uint64') + output_grp.create_dataset('node_id_to_range', data=node_id_to_range, dtype='uint64') + + def _clear(self): + self._nedges = 0 + self._nnodes = 0 + + def edges_iter(self, trg_gids, src_network=None, trg_network=None): + matching_edge_tables = self.__edges_tables + if trg_network is not None: + matching_edge_tables = [et for et in self.__edges_tables if et['target_network'] == trg_network] + + if src_network is not None: + matching_edge_tables = [et for et in matching_edge_tables if et['source_network'] == src_network] + + for trg_gid in trg_gids: + for ets in matching_edge_tables: + syn_table = ets['syn_table'] + if syn_table.has_target(trg_gid): + for src_id, nsyns in syn_table.trg_itr(trg_gid): + if ets['params']: + synapses = [{} for _ in range(nsyns)] + for param_name, param_table in ets['params'].items(): + for i, val in enumerate(param_table[src_id, trg_gid]): + synapses[i][param_name] = val + for syn_prop in synapses: + yield Edge(src_gid=src_id, trg_gid=trg_gid, edge_type_props=ets['edge_types'], + syn_props=syn_prop) + else: + yield Edge(src_gid=src_id, trg_gid=trg_gid, edge_type_props=ets['edge_types'], + syn_props={'nsyns': nsyns}) + + @property + def nnodes(self): + if not self.nodes_built: + return 0 + return self._nnodes + + @property + def nedges(self): + return self._nedges + + class EdgeTable(object): + def __init__(self, connection_map): + # TODO: save column and row lengths + # Create maps between source_node gids and their row in the matrix. + self.__idx2src = [n.node_id for n in connection_map.source_nodes] + self.__src2idx = {node_id: i for i, node_id in enumerate(self.__idx2src)} + + # Create maps betwee target_node gids and their column in the matrix + self.__idx2trg = [n.node_id for n in connection_map.target_nodes] + self.__trg2idx = {node_id: i for i, node_id in enumerate(self.__idx2trg)} + + self._nsyn_table = np.zeros((len(self.__idx2src), len(self.__idx2trg)), dtype=np.uint8) + + def __getitem__(self, item): + # TODO: make sure matrix is column oriented, or swithc trg and srcs. + indexed_pair = (self.__src2idx[item[0]], self.__trg2idx[item[1]]) + return self._nsyn_table[indexed_pair] + + def __setitem__(self, key, value): + assert(len(key) == 2) + indexed_pair = (self.__src2idx[key[0]], self.__trg2idx[key[1]]) + self._nsyn_table[indexed_pair] = value + + def has_target(self, node_id): + return node_id in self.__trg2idx + + @property + def nsyn_table(self): + return self._nsyn_table + + @property + def target_ids(self): + return self.__idx2trg + + @property + def source_ids(self): + return self.__idx2src + + def trg_itr(self, trg_id): + trg_i = self.__trg2idx[trg_id] + for src_j, src_id in enumerate(self.__idx2src): + nsyns = self._nsyn_table[src_j, trg_i] + if nsyns: + yield src_id, nsyns + + class PropertyTable(object): + # TODO: add support for strings + def __init__(self, nvalues): + self._prop_array = np.zeros(nvalues) + # self._prop_table = np.zeros((nvalues, 1)) # TODO: set dtype + self._index = np.zeros((nvalues, 2), dtype=np.uint32) + self._itr_index = 0 + + def itr_vals(self, src_id, trg_id): + indicies = np.where((self._index[:, 0] == src_id) & (self._index[:, 1] == trg_id)) + for val in self._prop_array[indicies]: + yield val + + def __setitem__(self, key, value): + self._index[self._itr_index, 0] = key[0] # src_node_id + self._index[self._itr_index, 1] = key[1] # trg_node_id + self._prop_array[self._itr_index] = value + self._itr_index += 1 + + def __getitem__(self, item): + indicies = np.where((self._index[:, 0] == item[0]) & (self._index[:, 1] == item[1])) + return self._prop_array[indicies] + + +def add_hdf5_attrs(hdf5_handle): + # TODO: move this as a utility function + hdf5_handle['/'].attrs['magic'] = np.uint32(0x0A7A) + hdf5_handle['/'].attrs['version'] = [np.uint32(0), np.uint32(1)] diff --git a/bmtk-vb/bmtk/builder/networks/dm_network.pyc b/bmtk-vb/bmtk/builder/networks/dm_network.pyc new file mode 100644 index 0000000..e8c42c7 Binary files /dev/null and b/bmtk-vb/bmtk/builder/networks/dm_network.pyc differ diff --git a/bmtk-vb/bmtk/builder/networks/input_network.py b/bmtk-vb/bmtk/builder/networks/input_network.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/bmtk/builder/networks/input_network.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/bmtk/builder/networks/mpi_network.py b/bmtk-vb/bmtk/builder/networks/mpi_network.py new file mode 100644 index 0000000..aa6a51e --- /dev/null +++ b/bmtk-vb/bmtk/builder/networks/mpi_network.py @@ -0,0 +1,171 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .dm_network import DenseNetwork +from mpi4py import MPI +from heapq import heappush, heappop +import h5py + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() +nprocs = comm.Get_size() + + +class MPINetwork(DenseNetwork): + def __init__(self, name, **network_props): + super(MPINetwork, self).__init__(name, **network_props or {}) + self._edge_assignment = None + + def _add_edges(self, connection_map, i): + if self._assign_to_rank(i): + super(MPINetwork, self)._add_edges(connection_map, i) + + def save_nodes(self, nodes_file_name, node_types_file_name): + if rank == 0: + super(MPINetwork, self).save_nodes(nodes_file_name, node_types_file_name) + comm.Barrier() + + """ + def save_edges(self, edges_file_name=None, edge_types_file_name=None, output_dir='.', src_network=None, + trg_network=None, force_build=True, force_overwrite=False): + + if rank == 0: + # print rank, len(self.edges_table()) + super(MPINetwork, self).save_edges(edges_file_name, edge_types_file_name, output_dir, src_network, + trg_network, force_build, force_overwrite) + + comm.Barrier() + """ + + def edges_iter(self, trg_gids, src_network=None, trg_network=None): + for trg_gid in trg_gids: + edges = list(super(MPINetwork, self).edges_iter([trg_gid], src_network, trg_network)) + collected_edges = comm.gather(edges, root=0) + if rank == 0: + for edge_list in collected_edges: + for edge in edge_list: + # print 'b' + yield edge + else: + yield None + + comm.Barrier() + + def _save_edges(self, edges_file_name, src_network, trg_network): + target_gids = [n.node_id for n in self._target_networks[trg_network].nodes()] + # TODO: make sure target_gids are sorted + + trg_gids_ds = [] + src_gids_ds = [] + edge_type_id_ds = [] + edge_group_ds = [] + edge_group_index_ds = [] + + eg_collection = {} + eg_ids = 0 + eg_lookup = {} + eg_table = {} + eg_indices = {} + for cm in self.get_connections(): + col_key = cm.properties_keys() + if col_key in eg_collection: + group_id = eg_collection[col_key] + else: + group_id = eg_ids + eg_collection[col_key] = group_id + eg_ids += 1 + eg_lookup[cm.edge_type_id] = group_id + eg_indices[group_id] = 0 + eg_table[group_id] = {k: [] for k in cm.property_names} + + for e in self.edges_iter(target_gids, src_network=src_network, trg_network=trg_network): + if rank == 0: + trg_gids_ds.append(e.target_gid) + src_gids_ds.append(e.source_gid) + edge_type_id_ds.append(e.edge_type_id) + + group_id = eg_lookup[e.edge_type_id] + edge_group_ds.append(group_id) + group_id_index = eg_indices[group_id] + edge_group_index_ds.append(group_id_index) + eg_indices[group_id] += 1 + + for k, v in e.synaptic_properties.items(): + eg_table[group_id][k].append(v) + + if rank == 0: + # Create index from target_gids dataset + index_pointer_ds = [] + cur_gid = 0 + index = 0 + while index < len(trg_gids_ds): + if trg_gids_ds[index] == cur_gid: + index += 1 + else: + cur_gid += 1 + index_pointer_ds.append(index) + index_pointer_ds.append(len(trg_gids_ds)+1) + + + with h5py.File(edges_file_name, 'w') as hf: + hf.create_dataset('edges/target_gid', data=trg_gids_ds, dtype='uint64') + hf['edges/target_gid'].attrs['network'] = trg_network + hf.create_dataset('edges/source_gid', data=src_gids_ds, dtype='uint64') + hf['edges/source_gid'].attrs['network'] = src_network + + hf.create_dataset('edges/edge_group', data=edge_group_ds, dtype='uint16') + hf.create_dataset('edges/edge_group_index', data=edge_group_index_ds, dtype='uint32') + hf.create_dataset('edges/edge_type_id', data=edge_type_id_ds, dtype='uint32') + hf.create_dataset('edges/index_pointer', data=index_pointer_ds, dtype='uint32') + + for gid, group in eg_table.items(): + for col_key, col_ds in group.items(): + ds_loc = 'edges/{}/{}'.format(gid, col_key) + hf.create_dataset(ds_loc, data=col_ds) + + comm.Barrier() + + def _assign_to_rank(self, i): + if self._edge_assignment is None: + self._build_rank_assignments() + + return rank == self._edge_assignment[i] + + def _build_rank_assignments(self): + """Builds the _edge_assignment array. + + Division of connections is decided by the maximum possible edges (i.e. number of source and target nodes). In + the end assignment should balance the connection matrix sizes need by each rank. + """ + rank_heap = [] # A heap of tuples (weight, rank #) + for a in range(nprocs): + heappush(rank_heap, (0, a)) + + # find the rank with the lowest weight, assign that rank to build the i'th connection matrix, update the rank's + # weight and re-add to the heap. + # TODO: sort connection_maps in descending order to get better balance + self._edge_assignment = [] + for cm in self.get_connections(): + r = heappop(rank_heap) + self._edge_assignment.append(r[1]) + heappush(rank_heap, (r[0] + cm.max_connections(), r[1])) + diff --git a/bmtk-vb/bmtk/builder/networks/mpi_network.pyc b/bmtk-vb/bmtk/builder/networks/mpi_network.pyc new file mode 100644 index 0000000..cdd6730 Binary files /dev/null and b/bmtk-vb/bmtk/builder/networks/mpi_network.pyc differ diff --git a/bmtk-vb/bmtk/builder/networks/nxnetwork.py b/bmtk-vb/bmtk/builder/networks/nxnetwork.py new file mode 100644 index 0000000..3424fd6 --- /dev/null +++ b/bmtk-vb/bmtk/builder/networks/nxnetwork.py @@ -0,0 +1,80 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import networkx as nx + +from bmtk.builder.network import Network +from bmtk.builder.node import Node + + +class NxNetwork(Network): + def __init__(self, name, **network_props): + super(NxNetwork, self).__init__(name, **network_props or {}) + + self.net = nx.MultiDiGraph() + self.__nodes = [] + + + def _initialize(self): + self.net.clear() + + def _add_nodes(self, nodes): + self.__nodes += nodes + self.net.add_nodes_from(nodes) + + def _add_edges(self, edge, connections): + for src, trg, nsyns in connections: + self.net.add_edge(src, trg, nsyns=nsyns, edge_type_id=edge.edge_type_id) + + + def _clear(self): + self.net.clear() + + def _nodes_iter(self, nids=None): + if nids is not None: + return ((nid, d) + for nid, d in self.__nodes + if nid in nids ) + else: + return self.__nodes + #return self.net.nodes_iter(data=True) + + def _edges_iter(self, nids=None, rank=0): + if nids == None or len(nids) == 0: + for e in self.net.edges(data=True): + yield (e[0], e[1], e[2]['nsyns'], e[2]['edge_type_id']) + #return self.net.edges(data=True) + elif rank == 0: + for e in self.net.out_edges(nids, data=True): + yield (e[0], e[1], e[2]['nsyns'], e[2]['edge_type_id']) + else: + for e in self.net.in_edges(nids, data=True): + yield (e[0], e[1], e[2]['nsyns'], e[2]['edge_type_id']) + #return self.net.in_edges(nids, data=True) + + @property + def nnodes(self): + return nx.number_of_nodes(self.net) + + @property + def nedges(self): + return nx.number_of_edges(self.net) \ No newline at end of file diff --git a/bmtk-vb/bmtk/builder/networks/sparse_network.py b/bmtk-vb/bmtk/builder/networks/sparse_network.py new file mode 100644 index 0000000..035aaeb --- /dev/null +++ b/bmtk-vb/bmtk/builder/networks/sparse_network.py @@ -0,0 +1,26 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from bmtk.builder.network import Network + +class SparseNetwork(Network): + pass \ No newline at end of file diff --git a/bmtk-vb/bmtk/builder/node.py b/bmtk-vb/bmtk/builder/node.py new file mode 100644 index 0000000..6d1b295 --- /dev/null +++ b/bmtk-vb/bmtk/builder/node.py @@ -0,0 +1,76 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class Node(dict): + def __init__(self, node_id, node_params, node_type_properties, params_hash=-1): + super(Node, self).__init__({}) + + self._node_params = node_params + self._node_params['node_id'] = node_id + self._node_type_properties = node_type_properties + self._params_hash = params_hash + self._node_id = node_id + + @property + def node_id(self): + return self._node_id + + @property + def node_type_id(self): + return self._node_type_properties['node_type_id'] + + @property + def params(self): + return self._node_params + + @property + def node_type_properties(self): + return self._node_type_properties + + @property + def params_hash(self): + return self._params_hash + + def get(self, key, default=None): + if key in self._node_params: + return self._node_params[key] + elif key in self._node_type_properties: + return self._node_type_properties[key] + else: + return default + + def __contains__(self, item): + return item in self._node_type_properties or item in self._node_params + + def __getitem__(self, item): + if item in self._node_params: + return self._node_params[item] + else: + return self._node_type_properties[item] + + def __hash__(self): + return hash(self.node_id) + + def __repr__(self): + tmp_dict = dict(self._node_type_properties) + tmp_dict.update(self._node_params) + return tmp_dict.__repr__() diff --git a/bmtk-vb/bmtk/builder/node.pyc b/bmtk-vb/bmtk/builder/node.pyc new file mode 100644 index 0000000..fda7bcb Binary files /dev/null and b/bmtk-vb/bmtk/builder/node.pyc differ diff --git a/bmtk-vb/bmtk/builder/node_pool.py b/bmtk-vb/bmtk/builder/node_pool.py new file mode 100644 index 0000000..2e1bb18 --- /dev/null +++ b/bmtk-vb/bmtk/builder/node_pool.py @@ -0,0 +1,106 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from ast import literal_eval +from six import string_types + + +class NodePool(object): + """Stores a collection of nodes based off some query of the network. + + Returns the results of a query of nodes from a network using the nodes() method. Nodes are still generated and + saved by the network, this just stores the query information and provides iterator methods for accessing different + nodes. + + TODO: + * Implement a collection-set algebra including | and not operators. ie. + nodes = net.nodes(type=1) | net.nodes(type=2) + * Implement operators on properties + nodes = net.nodes(val) > 100 + nodes = 100 in net.nodes(val) + """ + + def __init__(self, network, **properties): + self.__network = network + self.__properties = properties + self.__filter_str = None + + def __len__(self): + return sum(1 for _ in self) + + def __iter__(self): + return (n for n in self.__network.nodes_iter() if self.__query_object_properties(n, self.__properties)) + + @property + def network(self): + return self.__network + + @property + def network_name(self): + return self.__network.name + + @property + def filter_str(self): + if self.__filter_str is None: + if len(self.__properties) == 0: + self.__filter_str = '*' + else: + self.__filter_str = '' + for k, v in self.__properties.items(): + conditional = "{}=='{}'".format(k, v) + self.__filter_str += conditional + '&' + if self.__filter_str.endswith('&'): + self.__filter_str = self.__filter_str[0:-1] + + return self.__filter_str + + @classmethod + def from_filter(cls, network, filter_str): + assert(isinstance(filter_str, string_types)) + if len(filter_str) == 0 or filter_str == '*': + return cls(network, position=None) + + properties = {} + for condtional in filter_str.split('&'): + var, val = condtional.split('==') + properties[var] = literal_eval(val) + return cls(network, position=None, **properties) + + def __query_object_properties(self, obj, props): + if props is None: + return True + + for k, v in props.items(): + ov = obj.get(k, None) + if ov is None: + return False + + if hasattr(v, '__call__'): + if not v(ov): + return False + elif isinstance(v, list): + if ov not in v: + return False + elif ov != v: + return False + + return True diff --git a/bmtk-vb/bmtk/builder/node_pool.pyc b/bmtk-vb/bmtk/builder/node_pool.pyc new file mode 100644 index 0000000..2448378 Binary files /dev/null and b/bmtk-vb/bmtk/builder/node_pool.pyc differ diff --git a/bmtk-vb/bmtk/builder/node_set.py b/bmtk-vb/bmtk/builder/node_set.py new file mode 100644 index 0000000..59c1918 --- /dev/null +++ b/bmtk-vb/bmtk/builder/node_set.py @@ -0,0 +1,71 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import six +from .node import Node + + +class NodeSet(object): + def __init__(self, N, node_params, node_type_properties): + self.__N = N + self.__node_params = node_params + self.__node_type_properties = node_type_properties + + assert('node_type_id' in node_type_properties) + self.__node_type_id = node_type_properties['node_type_id'] + + # Used for determining which node_sets share the same params columns + columns = list(self.__node_params.keys()) + columns.sort() + self.__params_col_hash = hash(str(columns)) + + @property + def N(self): + return self.__N + + @property + def node_type_id(self): + return self.__node_type_id + + @property + def params_keys(self): + return self.__node_params.keys() + + @property + def params_hash(self): + return self.__params_col_hash + + def build(self, nid_generator): + # fetch existing node ids or create new ones + node_ids = self.__node_params.get('node_id', None) + if node_ids is None: + node_ids = [nid for nid in nid_generator(self.N)] + + # turn node_params from dictionary of lists to a list of dictionaries. + ap_flat = [{} for _ in six.moves.range(self.N)] + for key, plist in self.__node_params.items(): + for i, val in enumerate(plist): + ap_flat[i][key] = val + + # create node objects + return [Node(nid, params, self.__node_type_properties, self.__params_col_hash) + for (nid, params) in zip(node_ids, ap_flat)] diff --git a/bmtk-vb/bmtk/builder/node_set.pyc b/bmtk-vb/bmtk/builder/node_set.pyc new file mode 100644 index 0000000..9692157 Binary files /dev/null and b/bmtk-vb/bmtk/builder/node_set.pyc differ diff --git a/bmtk-vb/bmtk/simulator/__init__.py b/bmtk-vb/bmtk/simulator/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/bmtk/simulator/__init__.pyc b/bmtk-vb/bmtk/simulator/__init__.pyc new file mode 100644 index 0000000..abfe6a5 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/__init__.pyc differ diff --git a/bmtk-vb/bmtk/simulator/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/simulator/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..065f4a1 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/#biosimulator.py# b/bmtk-vb/bmtk/simulator/bionet/#biosimulator.py# new file mode 100644 index 0000000..773d796 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/#biosimulator.py# @@ -0,0 +1,361 @@ + + + + +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import time +from six import string_types +from neuron import h +from bmtk.simulator.core.simulator import Simulator +from bmtk.simulator.bionet.io_tools import io +from bmtk.simulator.bionet.iclamp import IClamp +from bmtk.simulator.bionet import modules as mods +from bmtk.simulator.core.node_sets import NodeSet +import bmtk.simulator.utils.simulation_reports as reports +import bmtk.simulator.utils.simulation_inputs as inputs +from bmtk.utils.io import spike_trains + + +pc = h.ParallelContext() # object to access MPI methods + + +class BioSimulator(Simulator): + """Includes methods to run and control the simulation""" + + def __init__(self, network, dt, tstop, v_init, celsius, cao0, nsteps_block, start_from_state=False): + self.net = network + + self._start_from_state = start_from_state + self.dt = dt + self.tstop = tstop + + self._v_init = v_init + self._celsius = celsius + self._cao0 = cao0 + self._h = h + + self.tstep = int(round(h.t / h.dt)) + self.tstep_start_block = self.tstep + self.nsteps = int(round(h.tstop/h.dt)) + + # make sure the block size isn't small than the total number of steps + # TODO: should we send a warning that block-step size is being reset? + self._nsteps_block = nsteps_block if self.nsteps > nsteps_block else self.nsteps + + self.__tstep_end_block = 0 + self.__tstep_start_block = 0 + + h.runStopAt = h.tstop + h.steps_per_ms = 1/h.dt + + self._set_init_conditions() # call to save state + h.cvode.cache_efficient(1) + + h.pysim = self # use this objref to be able to call postFadvance from proc advance in advance.hoc + self._iclamps = [] + + self._output_dir = 'output' + self._log_file = 'output/log.txt' + + self._spikes = {} # for keeping track of different spike times, key of cell gids + + self._cell_variables = [] # location of saved cell variables + self._cell_vars_dir = 'output/cellvars' + + self._sim_mods = [] # list of modules.SimulatorMod's + + @property + def dt(self): + return h.dt + + @dt.setter + def dt(self, ms): + h.dt = ms + + @property + def tstop(self): + return h.tstop + + @tstop.setter + def tstop(self, ms): + h.tstop = ms + + @property + def v_init(self): + return self._v_init + + @v_init.setter + def v_init(self, voltage): + self._v_init = voltage + + @property + def celsius(self): + return self._celsius + + @celsius.setter + def celsius(self, c): + self._celsius = c + + @property + def cao0(self): + return self._cao0 + + @cao0.setter + def cao0(self, cao): + self._cao0 = cao + + @property + def n_steps(self): + return int(round(self.tstop/self.dt)) + + @property + def cell_variables(self): + return self._cell_variables + + @property + def cell_var_output(self): + return self._cell_vars_dir + + @property + def spikes_table(self): + return self._spikes + + @property + def nsteps_block(self): + return self._nsteps_block + + @property + def h(self): + return self._h + + @property + def biophysical_gids(self): + return self.net.cell_type_maps('biophysical').keys() + + @property + def local_gids(self): + # return self.net.get + return self.net.local_gids + + def __elapsed_time(self, time_s): + if time_s < 120: + return '{:.4} seconds'.format(time_s) + elif time_s < 7200: + mins, secs = divmod(time_s, 60) + return '{} minutes, {:.4} seconds'.format(mins, secs) + else: + mins, secs = divmod(time_s, 60) + hours, mins = divmod(mins, 60) + return '{} hours, {} minutes and {:.4} seconds'.format(hours, mins, secs) + + def _set_init_conditions(self): + """Set up the initial conditions: either read from the h.SaveState or from config["condidtions"]""" + pc.set_maxstep(10) + h.stdinit() + self.tstep = int(round(h.t/h.dt)) + self.tstep_start_block = self.tstep + + if self._start_from_state: + # io.read_state() + io.log_info('Read the initial state saved at t_sim: {} ms'.format(h.t)) + else: + h.v_init = self.v_init + + h.celsius = self.celsius + h.cao0_ca_ion = self.cao0 + + def set_spikes_recording(self): + for gid, _ in self.net.get_local_cells().items(): + tvec = self.h.Vector() + gidvec = self.h.Vector() + pc.spike_record(gid, tvec, gidvec) + self._spikes[gid] = tvec + + def attach_current_clamp(self, amplitude, delay, duration, gids=None): + # TODO: verify current clamp works with MPI + # TODO: Create appropiate module + if gids is None: + gids = self.gids['biophysical'] + if isinstance(gids, int): + gids = [gids] + elif isinstance(gids, string_types): + gids = [int(gids)] + elif isinstance(gids, NodeSet): + gids = gids.gids() + + + gids = list(set(self.local_gids) & set(gids)) + for gid in gids: + cell = self.net.get_cell_gid(gid) + Ic = IClamp(amplitude, delay, duration) + Ic.attach_current(cell) + self._iclamps.append(Ic) + + def add_mod(self, module): + self._sim_mods.append(module) + + def run(self): + """Run the simulation: + if beginning from a blank state, then will use h.run(), + if continuing from the saved state, then will use h.continuerun() + """ + for mod in self._sim_mods: + mod.initialize(self) + + self.start_time = h.startsw() + s_time = time.time() + pc.timeout(0) + + pc.barrier() # wait for all hosts to get to this point + io.log_info('Running simulation for {:.3f} ms with the time step {:.3f} ms'.format(self.tstop, self.dt)) + io.log_info('Starting timestep: {} at t_sim: {:.3f} ms'.format(self.tstep, h.t)) + io.log_info('Block save every {} steps'.format(self.nsteps_block)) + + if self._start_from_state: + h.continuerun(h.tstop) + else: + h.run(h.tstop) # <- runs simuation: works in parallel + + pc.barrier() + + for mod in self._sim_mods: + mod.finalize(self) + pc.barrier() + + end_time = time.time() + + sim_time = self.__elapsed_time(end_time - s_time) + io.log_info('Simulation completed in {} '.format(sim_time)) + + def report_load_balance(self): + comptime = pc.step_time() + avgcomp = pc.allreduce(comptime, 1)/pc.nhost() + maxcomp = pc.allreduce(comptime, 2) + io.log_info('Maximum compute time is {} seconds.'.format(maxcomp)) + io.log_info('Approximate exchange time is {} seconds.'.format(comptime - maxcomp)) + if maxcomp != 0.0: + io.log_info('Load balance is {}.'.format(avgcomp/maxcomp)) + + def post_fadvance(self): + """ + Runs after every execution of fadvance (see advance.hoc) + Called after every time step to perform computation and save data to memory block or to disk. + The initial condition tstep=0 is not being saved + """ + for mod in self._sim_mods: + mod.step(self, self.tstep) + + self.tstep += 1 + + if (self.tstep % self.nsteps_block == 0) or self.tstep == self.nsteps: + io.log_info(' step:{} t_sim:{:.2f} ms'.format(self.tstep, h.t)) + self.__tstep_end_block = self.tstep + time_step_interval = (self.__tstep_start_block, self.__tstep_end_block) + + for mod in self._sim_mods: + mod.block(self, time_step_interval) + + self.__tstep_start_block = self.tstep # starting point for the next block + + @classmethod + def from_config(cls, config, network, set_recordings=True): + # TODO: convert from json to sonata config if necessary + + sim = cls(network=network, + dt=config.dt, + tstop=config.tstop, + v_init=config.v_init, + celsius=config.celsius, + cao0=config.cao0, + nsteps_block=config.block_step) + + network.io.log_info('Building cells.') + network.build_nodes() + + network.io.log_info('Building recurrent connections') + network.build_recurrent_edges() + + # TODO: Need to create a gid selector + for sim_input in inputs.from_config(config): + node_set = network.get_node_set(sim_input.node_set) + if sim_input.input_type == 'spikes': + spikes = spike_trains.SpikesInput.load(name=sim_input.name, module=sim_input.module, + input_type=sim_input.input_type, params=sim_input.params) + io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + network.add_spike_trains(spikes, node_set) + + elif sim_input.module == 'IClamp': + # TODO: Parse from csv file + amplitude = sim_input.params['amp'] + delay = sim_input.params['delay'] + duration = sim_input.params['duration'] + gids = sim_input.params['node_set'] + sim.attach_current_clamp(amplitude, delay, duration, node_set) + + elif sim_input.module == 'xstim': + sim.add_mod(mods.XStimMod(**sim_input.params)) + + else: + io.log_exception('Can not parse input format {}'.format(sim_input.name)) + + if config.calc_ecp: + for gid, cell in network.cell_type_maps('biophysical').items(): + cell.setup_ecp() + sim.h.cvode.use_fast_imem(1) + + # Parse the "reports" section of the config and load an associated output module for each report + sim_reports = reports.from_config(config) + for report in sim_reports: + if isinstance(report, reports.SpikesReport): + mod = mods.SpikesMod(**report.params) + + elif isinstance(report, reports.SectionReport): + mod = mods.SectionReport(**report.params) + + elif isinstance(report, reports.MembraneReport): + if report.params['sections'] == 'soma': + mod = mods.SomaReport(**report.params) + + else: + mod = mods.MembraneReport(**report.params) + + elif isinstance(report, reports.ECPReport): + assert config.calc_ecp + mod = mods.EcpMod(**report.params) + # Set up the ability for ecp on all relevant cells + # TODO: According to spec we need to allow a different subset other than only biophysical cells + # for gid, cell in network.cell_type_maps('biophysical').items(): + # cell.setup_ecp() + + elif report.module == 'save_synapses': + mod = mods.SaveSynapses(**report.params) + + else: + # TODO: Allow users to register customized modules using pymodules + io.log_warning('Unrecognized module {}, skipping.'.format(report.module)) + continue + + sim.add_mod(mod) + + return sim diff --git a/bmtk-vb/bmtk/simulator/bionet/README.md b/bmtk-vb/bmtk/simulator/bionet/README.md new file mode 100644 index 0000000..5448a66 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/README.md @@ -0,0 +1,4 @@ +## BioNet source code + +For instruction on how to install BioNet please consult the [BioNet tutorial](https://alleninstitute.github.io/bmtk/bionet.html) + diff --git a/bmtk-vb/bmtk/simulator/bionet/__init__.py b/bmtk-vb/bmtk/simulator/bionet/__init__.py new file mode 100644 index 0000000..7c86d80 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/__init__.py @@ -0,0 +1,31 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from bmtk.simulator.bionet.pyfunction_cache import synapse_model, synaptic_weight, cell_model +from bmtk.simulator.bionet.config import Config +from bmtk.simulator.bionet.bionetwork import BioNetwork +from bmtk.simulator.bionet.biosimulator import BioSimulator +#from bmtk.simulator.bionet.io_tools import io + +#io = NEURONIOUtils() + + diff --git a/bmtk-vb/bmtk/simulator/bionet/__init__.pyc b/bmtk-vb/bmtk/simulator/bionet/__init__.pyc new file mode 100644 index 0000000..5c8584a Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__init__.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..96ea6be Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/biocell.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/biocell.cpython-37.pyc new file mode 100644 index 0000000..31641c6 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/biocell.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/bionetwork.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/bionetwork.cpython-37.pyc new file mode 100644 index 0000000..7e43da0 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/bionetwork.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/biosimulator.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/biosimulator.cpython-37.pyc new file mode 100644 index 0000000..76f720b Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/biosimulator.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/cell.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/cell.cpython-37.pyc new file mode 100644 index 0000000..a0c0452 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/cell.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/config.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000..b07f0f2 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/config.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/iclamp.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/iclamp.cpython-37.pyc new file mode 100644 index 0000000..c145b51 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/iclamp.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/io_tools.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/io_tools.cpython-37.pyc new file mode 100644 index 0000000..928891f Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/io_tools.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/morphology.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/morphology.cpython-37.pyc new file mode 100644 index 0000000..aadd109 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/morphology.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/nml_reader.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/nml_reader.cpython-37.pyc new file mode 100644 index 0000000..6bc9bf4 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/nml_reader.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/nrn.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/nrn.cpython-37.pyc new file mode 100644 index 0000000..6b637d5 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/nrn.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/pointprocesscell.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/pointprocesscell.cpython-37.pyc new file mode 100644 index 0000000..c43d61e Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/pointprocesscell.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/pointsomacell.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/pointsomacell.cpython-37.pyc new file mode 100644 index 0000000..8a53bd2 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/pointsomacell.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/pyfunction_cache.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/pyfunction_cache.cpython-37.pyc new file mode 100644 index 0000000..0cf316a Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/pyfunction_cache.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/sonata_adaptors.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/sonata_adaptors.cpython-37.pyc new file mode 100644 index 0000000..ea93924 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/sonata_adaptors.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/utils.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000..44a2b80 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/utils.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/__pycache__/virtualcell.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/__pycache__/virtualcell.cpython-37.pyc new file mode 100644 index 0000000..5d51b9d Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/__pycache__/virtualcell.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/biocell.py b/bmtk-vb/bmtk/simulator/bionet/biocell.py new file mode 100644 index 0000000..1807042 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/biocell.py @@ -0,0 +1,323 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from scipy.stats import norm +from bmtk.simulator.bionet import utils, nrn +from bmtk.simulator.bionet.cell import Cell +import six + +from neuron import h + +pc = h.ParallelContext() # object to access MPI methods + + +class BioCell(Cell): + """Implemntation of a morphologically and biophysically detailed type cell. + + """ + def __init__(self, node, bionetwork): + super(BioCell, self).__init__(node) + + # Set up netcon object that can be used to detect and communicate cell spikes. + self.set_spike_detector(bionetwork.spike_threshold) + + self._morph = None + self._seg_coords = {} + + # Determine number of segments and store a list of all sections. + self._nseg = 0 + self.set_nseg(bionetwork.dL) + self._secs = [] + self._secs_by_id = [] + self.set_sec_array() + + self._save_conn = False # bionetwork.save_connection + self._synapses = [] + self._syn_src_net = [] + self._syn_src_gid = [] + self._syn_seg_ix = [] + self._syn_sec_x = [] + self._edge_type_ids = [] + self._segments = None + + # potentially used by ecp module + self.im_ptr = None + self.imVec = None + + # used by xstim module + self.ptr2e_extracellular = None + + self.__extracellular_mech = False + + def set_spike_detector(self, spike_threshold): + nc = h.NetCon(self.hobj.soma[0](0.5)._ref_v, None, sec=self.hobj.soma[0]) # attach spike detector to cell + nc.threshold = spike_threshold + pc.cell(self.gid, nc) # associate gid with spike detector + + def set_nseg(self, dL): + """Define number of segments in a cell""" + self._nseg = 0 + for sec in self.hobj.all: + sec.nseg = 1 + 2 * int(sec.L/(2*dL)) + self._nseg += sec.nseg # get the total number of segments in the cell + + def calc_seg_coords(self, morph_seg_coords): + """Update the segment coordinates (after rotations) for individual cells""" + phi_y = self._node.rotation_angle_yaxis + phi_z = self._node.rotation_angle_zaxis + phi_x = self._node.rotation_angle_xaxis + + # Rotate cell + # TODO: Rotations should follow as described in sonata (https://github.com/AllenInstitute/sonata/blob/master/docs/SONATA_DEVELOPER_GUIDE.md). + # Need someone with graphics experience to check they are being done correctly (I'm not sure atm). + RotX = utils.rotation_matrix([1, 0, 0], phi_x) + RotY = utils.rotation_matrix([0, 1, 0], phi_y) # rotate segments around yaxis normal to pia + RotZ = utils.rotation_matrix([0, 0, 1], -phi_z) # rotate segments around zaxis to get a proper orientation + RotXYZ = np.dot(RotX, RotY.dot(RotZ)) + + # rotated coordinates around z axis first then shift relative to the soma + self._seg_coords['p0'] = self._pos_soma + np.dot(RotXYZ, morph_seg_coords['p0']) + self._seg_coords['p1'] = self._pos_soma + np.dot(RotXYZ, morph_seg_coords['p1']) + self._seg_coords['p05'] = self._pos_soma + np.dot(RotXYZ, morph_seg_coords['p05']) + + self._seg_coords['d0'] = morph_seg_coords['d0'] + self._seg_coords['d1'] = morph_seg_coords['d1'] + + def get_seg_coords(self): + return self._seg_coords + + def get_part_ids(self, enum=None): + """ + Return a list of id's for which "part" of the neuron each section belongs to. + The list will be in the same order as self._seg_coords + + enum = dict mapping "part" string (soma, dend, apic, basal, axon) + Default: 0 = soma, 1 = dend, 2 = apic, 3 = basal, 4 = axon + """ + enum = enum or {'soma': 0, 'dend': 1, 'apic': 2, 'basal': 3, 'axon': 4} + return [enum[sec.name().split('.')[-1].split('[')[0]] for sec in self._secs] + + + @property + def morphology_file(self): + # TODO: Get from self._node.morphology_file + return self._node.morphology_file + + @property + def morphology(self): + return self._morph + + @morphology.setter + def morphology(self, morphology_obj): + self.set_morphology(morphology_obj) + + def set_morphology(self, morphology_obj): + self._morph = morphology_obj + + def get_sections(self): + #return self._secs_by_id + return self._secs + + def get_sections_id(self): + return self._secs_by_id + + def get_section(self, sec_id): + return self._secs[sec_id] + + def store_segments(self): + self._segments = [] + for sec in self._secs: + for seg in sec: + self._segments.append(seg) + + def get_segments(self): + return self._segments + + def set_sec_array(self): + """Arrange sections in an array to be access by index""" + secs = [] # build ref to sections + self._secs_by_id = [] + for sec in self.hobj.all: + self._secs_by_id.append(sec) + for _ in sec: + secs.append(sec) # section to which segments belongs + + self._secs = np.array(secs) + + def set_syn_connection(self, edge_prop, src_node, stim=None): + syn_weight = edge_prop.syn_weight(src_node=src_node, trg_node=self._node) + + if edge_prop.preselected_targets: + return self._set_connection_preselected(edge_prop, src_node, syn_weight, stim) + else: + return self._set_connections(edge_prop, src_node, syn_weight, stim) + + def _set_connection_preselected(self, edge_prop, src_node, syn_weight, stim=None): + # TODO: synapses should be loaded by edge_prop.load_synapse + sec_x = edge_prop['sec_x'] + sec_id = edge_prop['sec_id'] + section = self._secs_by_id[sec_id] + # section = self._secs[sec_id] + delay = edge_prop['delay'] + synapse_fnc = nrn.py_modules.synapse_model(edge_prop['model_template']) + syn = synapse_fnc(edge_prop['dynamics_params'], sec_x, section) + + if stim is not None: + nc = h.NetCon(stim.hobj, syn) # stim.hobj - source, syn - target + else: + nc = pc.gid_connect(src_node.node_id, syn) + + nc.weight[0] = syn_weight + nc.delay = delay + self._netcons.append(nc) + self._synapses.append(syn) + if self._save_conn: + self._save_connection(src_gid=src_node.node_id, src_net=src_node.network, sec_x=sec_x, seg_ix=sec_id, + edge_type_id=edge_prop.edge_type_id) + + return 1 + + def _set_connections(self, edge_prop, src_node, syn_weight, stim=None): + if 'prob_peaks' in edge_prop and edge_prop['prob_peaks']: + # Compute probability based on proximity to the peak depths given at network build time + tar_seg_prob = np.zeros(len(self._secs)) + prob_peaks = [float(x) for x in edge_prop['prob_peaks'].split(',')] + prob_peak_std = [float(x) for x in edge_prop['prob_peak_std'].split(',')] + _z = lambda idx: self._seg_coords['p05'][1, idx] + for mu, std in zip(prob_peaks, prob_peak_std): + tar_seg_prob += np.array([norm.pdf(_z(idx), mu, std) for idx in range(len(self._secs))]) + tar_seg_prob = tar_seg_prob / sum(tar_seg_prob) + tar_seg_ix = range(len(self._secs)) + else: + # Compute probability based on segment length + tar_seg_ix, tar_seg_prob = self._morph.get_target_segments(edge_prop) + + + src_gid = src_node.node_id + nsyns = edge_prop.nsyns + + # choose nsyn elements from seg_ix with probability proportional to segment area + segs_ix = self.prng.choice(tar_seg_ix, nsyns, p=tar_seg_prob) + secs = self._secs[segs_ix] # sections where synapases connect + xs = self._morph.seg_prop['x'][segs_ix] # distance along the section where synapse connects, i.e., seg_x + + # TODO: this should be done just once + synapses = [edge_prop.load_synapses(x, sec) for x, sec in zip(xs, secs)] + + delay = edge_prop['delay'] + self._synapses.extend(synapses) + + # TODO: Don't save this if not needed + self._edge_type_ids.extend([edge_prop.edge_type_id]*len(synapses)) + + for syn in synapses: + # connect synapses + if stim: + nc = h.NetCon(stim.hobj, syn) + else: + nc = pc.gid_connect(src_gid, syn) + + nc.weight[0] = syn_weight + nc.delay = delay + self.netcons.append(nc) + + return nsyns + + def _save_connection(self, src_gid, src_net, sec_x, seg_ix, edge_type_id): + self._syn_src_gid.append(src_gid) + self._syn_src_net.append(src_net) + self._syn_sec_x.append(sec_x) + self._syn_seg_ix.append(seg_ix) + self._edge_type_id.append(edge_type_id) + + def get_connection_info(self): + # TODO: There should be a more effecient and robust way to return synapse information. + return [[self.gid, self._syn_src_gid[i], self.network_name, self._syn_src_net[i], self._syn_seg_ix[i], + self._syn_sec_x[i], self.netcons[i].weight[0], self.netcons[i].delay, self._edge_type_id[i], 0] + for i in range(len(self._synapses))] + + def init_connections(self): + super(BioCell, self).init_connections() + self._synapses = [] + self._syn_src_gid = [] + self._syn_seg_ix = [] + self._syn_sec_x = [] + + def __set_extracell_mechanism(self): + if not self.__extracellular_mech: + for sec in self.hobj.all: + sec.insert('extracellular') + self.__extracellular_mech = True + + def setup_ecp(self): + self.im_ptr = h.PtrVector(self._nseg) # pointer vector + # used for gathering an array of i_membrane values from the pointer vector + self.im_ptr.ptr_update_callback(self.set_im_ptr) + self.imVec = h.Vector(self._nseg) + + self.__set_extracell_mechanism() + #for sec in self.hobj.all: + # sec.insert('extracellular') + + def setup_xstim(self, set_nrn_mechanism=True): + self.ptr2e_extracellular = h.PtrVector(self._nseg) + self.ptr2e_extracellular.ptr_update_callback(self.set_ptr2e_extracellular) + + # Set the e_extracellular mechanism for all sections on this hoc object + if set_nrn_mechanism: + self.__set_extracell_mechanism() + #for sec in self.hobj.all: + # sec.insert('extracellular') + + def set_im_ptr(self): + """Set PtrVector to point to the i_membrane_""" + jseg = 0 + for sec in self.hobj.all: + for seg in sec: + self.im_ptr.pset(jseg, seg._ref_i_membrane_) # notice the underscore at the end + jseg += 1 + + def get_im(self): + """Gather membrane currents from PtrVector into imVec (does not need a loop!)""" + self.im_ptr.gather(self.imVec) + # Warning: as_numpy() seems to fail with in neuron 7.4 for python 3 + # return self.imVec.as_numpy() # (nA) + return np.array(self.imVec) + + def set_ptr2e_extracellular(self): + jseg = 0 + for sec in self.hobj.all: + for seg in sec: + self.ptr2e_extracellular.pset(jseg, seg._ref_e_extracellular) + jseg += 1 + + def set_e_extracellular(self, vext): + self.ptr2e_extracellular.scatter(vext) + + def print_synapses(self): + rstr = '' + for i in six.moves.range(len(self._syn_src_gid)): + rstr += '{}> <-- {} ({}, {}, {}, {})\n'.format(i, self._syn_src_gid[i], self.netcons[i].weight[0], + self.netcons[i].delay, self._syn_seg_ix[i], + self._syn_sec_x[i]) + return rstr diff --git a/bmtk-vb/bmtk/simulator/bionet/biocell.pyc b/bmtk-vb/bmtk/simulator/bionet/biocell.pyc new file mode 100644 index 0000000..14409ba Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/biocell.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/bionetwork.py b/bmtk-vb/bmtk/simulator/bionet/bionetwork.py new file mode 100644 index 0000000..78ec0ae --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/bionetwork.py @@ -0,0 +1,262 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +from neuron import h + +from bmtk.simulator.core.simulator_network import SimNetwork +from bmtk.simulator.bionet.biocell import BioCell +from bmtk.simulator.bionet.pointprocesscell import PointProcessCell +from bmtk.simulator.bionet.pointsomacell import PointSomaCell +from bmtk.simulator.bionet.virtualcell import VirtualCell +from bmtk.simulator.bionet.morphology import Morphology +from bmtk.simulator.bionet.io_tools import io +from bmtk.simulator.bionet import nrn +from bmtk.simulator.bionet.sonata_adaptors import BioNodeAdaptor, BioEdgeAdaptor + +# TODO: leave this import, it will initialize some of the default functions for building neurons/synapses/weights. +import bmtk.simulator.bionet.default_setters + + +pc = h.ParallelContext() # object to access MPI methods +MPI_size = int(pc.nhost()) +MPI_rank = int(pc.id()) + + +class BioNetwork(SimNetwork): + model_type_col = 'model_type' + + def __init__(self): + # property_schema = property_schema if property_schema is not None else DefaultPropertySchema + super(BioNetwork, self).__init__() + self._io = io + + # TODO: Find a better way that will allow users to register their own class + self._model_type_map = { + 'biophysical': BioCell, + 'point_process': PointProcessCell, + 'point_soma': PointSomaCell, + 'virtual': VirtualCell + } + + self._morphologies_cache = {} + self._morphology_lookup = {} + + self._rank_node_gids = {} + self._rank_node_ids = {} + self._rank_nodes_by_model = {m_type: {} for m_type in self._model_type_map.keys()} + self._remote_node_cache = {} + self._virtual_nodes = {} + + self._cells_built = False + self._connections_initialized = False + + @property + def py_function_caches(self): + return nrn + + def get_node_id(self, population, node_id): + if node_id in self._rank_node_ids[population]: + return self._rank_node_ids[population][node_id].node + + elif node_id in self._remote_node_cache[population]: + return self._remote_node_cache[population][node_id] + + else: + node_pop = self.get_node_population(population) + node = node_pop.get_node(node_id) + self._remote_node_cache[population][node_id] = node + return node + + def cell_type_maps(self, model_type): + return self._rank_nodes_by_model[model_type] + + def get_cell_node_id(self, population, node_id): + return self._rank_node_ids[population].get(node_id, None) + + def get_cell_gid(self, gid): + return self._rank_node_gids[gid] + + def get_local_cells(self): + return self._rank_node_gids + + @property + def local_gids(self): + return list(self._rank_node_gids.keys()) + + def get_virtual_cells(self, population, node_id, spike_trains): + if node_id in self._virtual_nodes[population]: + return self._virtual_nodes[population][node_id] + else: + node = self.get_node_id(population, node_id) + virt_cell = VirtualCell(node, spike_trains) + self._virtual_nodes[population][node_id] = virt_cell + return virt_cell + + def _build_cell(self, bionode): + if bionode.model_type in self._model_type_map: + cell = self._model_type_map[bionode.model_type](bionode, self) + self._rank_nodes_by_model[bionode.model_type][cell.gid] = cell + return cell + else: + self.io.log_exception('Unrecognized model_type {}.'.format(bionode.model_type)) + + def _register_adaptors(self): + super(BioNetwork, self)._register_adaptors() + self._node_adaptors['sonata'] = BioNodeAdaptor + self._edge_adaptors['sonata'] = BioEdgeAdaptor + + def build_nodes(self): + for node_pop in self.node_populations: + self._remote_node_cache[node_pop.name] = {} + node_ids_map = {} + if node_pop.internal_nodes_only: + for node in node_pop[MPI_rank::MPI_size]: + cell = self._build_cell(node) + node_ids_map[node.node_id] = cell + self._rank_node_gids[cell.gid] = cell + + elif node_pop.mixed_nodes: + # node population contains both internal and virtual (external) nodes and the virtual nodes must be + # filtered out + self._virtual_nodes[node_pop.name] = {} + for node in node_pop[MPI_rank::MPI_size]: + if node.model_type == 'virtual': + continue + else: + cell = self._build_cell(node) + node_ids_map[node.node_id] = cell + self._rank_node_gids[cell.gid] = cell + + elif node_pop.virtual_nodes_only: + self._virtual_nodes[node_pop.name] = {} + + self._rank_node_ids[node_pop.name] = node_ids_map + + self.make_morphologies() + self.set_seg_props() # set segment properties by creating Morphologies + self.calc_seg_coords() # use for computing the ECP + self._cells_built = True + + def set_seg_props(self): + """Set morphological properties for biophysically (morphologically) detailed cells""" + for _, morphology in self._morphologies_cache.items(): + morphology.set_seg_props() + + def calc_seg_coords(self): + """Needed for the ECP calculations""" + # TODO: Is there any reason this function can't be moved to make_morphologies() + for morphology_file, morphology in self._morphologies_cache.items(): + morph_seg_coords = morphology.calc_seg_coords() # needed for ECP calculations + + for gid in self._morphology_lookup[morphology_file]: + self.get_cell_gid(gid).calc_seg_coords(morph_seg_coords) + + def make_morphologies(self): + """Creating a Morphology object for each biophysical model""" + # TODO: Let Morphology take care of the cache + # TODO: Let other types have morphologies + # TODO: Get all available morphologies from TypesTable or group + for gid, cell in self._rank_node_gids.items(): + if not isinstance(cell, BioCell): + continue + + morphology_file = cell.morphology_file + if morphology_file in self._morphologies_cache: + # create a single morphology object for each model_group which share that morphology + morph = self._morphologies_cache[morphology_file] + + # associate morphology with a cell + cell.set_morphology(morph) + self._morphology_lookup[morphology_file].append(cell.gid) + + else: + hobj = cell.hobj # get hoc object (hobj) from the first cell with a new morphologys + morph = Morphology(hobj) + + # associate morphology with a cell + cell.set_morphology(morph) + + # create a single morphology object for each model_group which share that morphology + self._morphologies_cache[morphology_file] = morph + self._morphology_lookup[morphology_file] = [cell.gid] + + self.io.barrier() + + def _init_connections(self): + if not self._connections_initialized: + for gid, cell in self._rank_node_gids.items(): + cell.init_connections() + self._connections_initialized = True + + def build_recurrent_edges(self): + recurrent_edge_pops = [ep for ep in self._edge_populations if not ep.virtual_connections] + if not recurrent_edge_pops: + return + + self._init_connections() + for edge_pop in recurrent_edge_pops: + if edge_pop.recurrent_connections: + source_population = edge_pop.source_nodes + for trg_nid, trg_cell in self._rank_node_ids[edge_pop.target_nodes].items(): + for edge in edge_pop.get_target(trg_nid): + src_node = self.get_node_id(source_population, edge.source_node_id) + trg_cell.set_syn_connection(edge, src_node) + + elif edge_pop.mixed_connections: + # When dealing with edges that contain both virtual and recurrent edges we have to check every source + # node to see if is virtual (bc virtual nodes can't be built yet). This conditional can significantly + # slow down build time so we use a special loop that can be ignored. + source_population = edge_pop.source_nodes + for trg_nid, trg_cell in self._rank_node_ids[edge_pop.target_nodes].items(): + for edge in edge_pop.get_target(trg_nid): + src_node = self.get_node_id(source_population, edge.source_node_id) + if src_node.model_type == 'virtual': + continue + trg_cell.set_syn_connection(edge, src_node) + + def find_edges(self, source_nodes=None, target_nodes=None): + selected_edges = self._edge_populations[:] + + if source_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.source_nodes == source_nodes] + + if target_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.target_nodes == target_nodes] + + return selected_edges + + def add_spike_trains(self, spike_trains, node_set): + self._init_connections() + + src_nodes = [node_pop for node_pop in self.node_populations if node_pop.name in node_set.population_names()] + for src_node_pop in src_nodes: + source_population = src_node_pop.name + for edge_pop in self.find_edges(source_nodes=source_population): + if edge_pop.virtual_connections: + for trg_nid, trg_cell in self._rank_node_ids[edge_pop.target_nodes].items(): + for edge in edge_pop.get_target(trg_nid): + src_cell = self.get_virtual_cells(source_population, edge.source_node_id, spike_trains) + trg_cell.set_syn_connection(edge, src_cell, src_cell) + + elif edge_pop.mixed_connections: + raise NotImplementedError() diff --git a/bmtk-vb/bmtk/simulator/bionet/bionetwork.pyc b/bmtk-vb/bmtk/simulator/bionet/bionetwork.pyc new file mode 100644 index 0000000..ca52c8d Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/bionetwork.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/biosimulator.py b/bmtk-vb/bmtk/simulator/bionet/biosimulator.py new file mode 100644 index 0000000..4082adc --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/biosimulator.py @@ -0,0 +1,363 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import time +from six import string_types +from neuron import h +from bmtk.simulator.core.simulator import Simulator +from bmtk.simulator.bionet.io_tools import io +from bmtk.simulator.bionet.iclamp import IClamp +from bmtk.simulator.bionet import modules as mods +from bmtk.simulator.core.node_sets import NodeSet +import bmtk.simulator.utils.simulation_reports as reports +import bmtk.simulator.utils.simulation_inputs as inputs +from bmtk.utils.io import spike_trains + + +pc = h.ParallelContext() # object to access MPI methods + + +class BioSimulator(Simulator): + """Includes methods to run and control the simulation""" + # Add extra argument "optocell" + def __init__(self, network, dt, tstop, v_init, celsius, cao0, optocell, nsteps_block, start_from_state=False): + self.net = network + + self._start_from_state = start_from_state + self.dt = dt + self.tstop = tstop + + self._v_init = v_init + self._celsius = celsius + self._cao0 = cao0 + self._optocell = optocell # Set instance var to optocell + self._h = h + + self.tstep = int(round(h.t / h.dt)) + self.tstep_start_block = self.tstep + self.nsteps = int(round(h.tstop/h.dt)) + + # make sure the block size isn't small than the total number of steps + # TODO: should we send a warning that block-step size is being reset? + self._nsteps_block = nsteps_block if self.nsteps > nsteps_block else self.nsteps + + self.__tstep_end_block = 0 + self.__tstep_start_block = 0 + + h.runStopAt = h.tstop + h.steps_per_ms = 1/h.dt + + self._set_init_conditions() # call to save state + h.cvode.cache_efficient(1) + + h.pysim = self # use this objref to be able to call postFadvance from proc advance in advance.hoc + self._iclamps = [] + + self._output_dir = 'output' + self._log_file = 'output/log.txt' + + self._spikes = {} # for keeping track of different spike times, key of cell gids + + self._cell_variables = [] # location of saved cell variables + self._cell_vars_dir = 'output/cellvars' + + self._sim_mods = [] # list of modules.SimulatorMod's + + @property + def optocell(self): + return self._optocell + + @property + def dt(self): + return h.dt + + @dt.setter + def dt(self, ms): + h.dt = ms + + @property + def tstop(self): + return h.tstop + + @tstop.setter + def tstop(self, ms): + h.tstop = ms + + @property + def v_init(self): + return self._v_init + + @v_init.setter + def v_init(self, voltage): + self._v_init = voltage + + @property + def celsius(self): + return self._celsius + + @celsius.setter + def celsius(self, c): + self._celsius = c + + @property + def cao0(self): + return self._cao0 + + @cao0.setter + def cao0(self, cao): + self._cao0 = cao + + @property + def n_steps(self): + return int(round(self.tstop/self.dt)) + + @property + def cell_variables(self): + return self._cell_variables + + @property + def cell_var_output(self): + return self._cell_vars_dir + + @property + def spikes_table(self): + return self._spikes + + @property + def nsteps_block(self): + return self._nsteps_block + + @property + def h(self): + return self._h + + @property + def biophysical_gids(self): + return self.net.cell_type_maps('biophysical').keys() + + @property + def local_gids(self): + # return self.net.get + return self.net.local_gids + + def __elapsed_time(self, time_s): + if time_s < 120: + return '{:.4} seconds'.format(time_s) + elif time_s < 7200: + mins, secs = divmod(time_s, 60) + return '{} minutes, {:.4} seconds'.format(mins, secs) + else: + mins, secs = divmod(time_s, 60) + hours, mins = divmod(mins, 60) + return '{} hours, {} minutes and {:.4} seconds'.format(hours, mins, secs) + + def _set_init_conditions(self): + """Set up the initial conditions: either read from the h.SaveState or from config["condidtions"]""" + pc.set_maxstep(10) + h.stdinit() + self.tstep = int(round(h.t/h.dt)) + self.tstep_start_block = self.tstep + + if self._start_from_state: + # io.read_state() + io.log_info('Read the initial state saved at t_sim: {} ms'.format(h.t)) + else: + h.v_init = self.v_init + + h.celsius = self.celsius + # h.cao0_ca_ion = self.cao0 + + def set_spikes_recording(self): + for gid, _ in self.net.get_local_cells().items(): + tvec = self.h.Vector() + gidvec = self.h.Vector() + pc.spike_record(gid, tvec, gidvec) + self._spikes[gid] = tvec + + def attach_current_clamp(self, amplitude, delay, duration, gids=None): + # TODO: verify current clamp works with MPI + # TODO: Create appropiate module + if gids is None: + gids = self.gids['biophysical'] + if isinstance(gids, int): + gids = [gids] + elif isinstance(gids, string_types): + gids = [int(gids)] + elif isinstance(gids, NodeSet): + gids = gids.gids() + + + gids = list(set(self.local_gids) & set(gids)) + for gid in gids: + cell = self.net.get_cell_gid(gid) + Ic = IClamp(amplitude, delay, duration) + Ic.attach_current(cell) + self._iclamps.append(Ic) + + def add_mod(self, module): + self._sim_mods.append(module) + + def run(self): + """Run the simulation: + if beginning from a blank state, then will use h.run(), + if continuing from the saved state, then will use h.continuerun() + """ + for mod in self._sim_mods: + mod.initialize(self) + + self.start_time = h.startsw() + s_time = time.time() + pc.timeout(0) + + pc.barrier() # wait for all hosts to get to this point + io.log_info('Running simulation for {:.3f} ms with the time step {:.3f} ms'.format(self.tstop, self.dt)) + io.log_info('Starting timestep: {} at t_sim: {:.3f} ms'.format(self.tstep, h.t)) + io.log_info('Block save every {} steps'.format(self.nsteps_block)) + + if self._start_from_state: + h.continuerun(h.tstop) + else: + h.run(h.tstop) # <- runs simuation: works in parallel + + pc.barrier() + + for mod in self._sim_mods: + mod.finalize(self) + pc.barrier() + + end_time = time.time() + + sim_time = self.__elapsed_time(end_time - s_time) + io.log_info('Simulation completed in {} '.format(sim_time)) + + def report_load_balance(self): + comptime = pc.step_time() + avgcomp = pc.allreduce(comptime, 1)/pc.nhost() + maxcomp = pc.allreduce(comptime, 2) + io.log_info('Maximum compute time is {} seconds.'.format(maxcomp)) + io.log_info('Approximate exchange time is {} seconds.'.format(comptime - maxcomp)) + if maxcomp != 0.0: + io.log_info('Load balance is {}.'.format(avgcomp/maxcomp)) + + def post_fadvance(self): + """ + Runs after every execution of fadvance (see advance.hoc) + Called after every time step to perform computation and save data to memory block or to disk. + The initial condition tstep=0 is not being saved + """ + for mod in self._sim_mods: + mod.step(self, self.tstep) + + self.tstep += 1 + + if (self.tstep % self.nsteps_block == 0) or self.tstep == self.nsteps: + io.log_info(' step:{} t_sim:{:.2f} ms'.format(self.tstep, h.t)) + self.__tstep_end_block = self.tstep + time_step_interval = (self.__tstep_start_block, self.__tstep_end_block) + + for mod in self._sim_mods: + mod.block(self, time_step_interval) + + self.__tstep_start_block = self.tstep # starting point for the next block + + @classmethod + def from_config(cls, config, network, set_recordings=True): + # TODO: convert from json to sonata config if necessary + + sim = cls(network=network, + dt=config.dt, + tstop=config.tstop, + v_init=config.v_init, + celsius=config.celsius, + cao0=config.cao0, + optocell=config.optocell, + nsteps_block=config.block_step) + + network.io.log_info('Building cells.') + network.build_nodes() + + network.io.log_info('Building recurrent connections') + network.build_recurrent_edges() + + # TODO: Need to create a gid selector + for sim_input in inputs.from_config(config): + node_set = network.get_node_set(sim_input.node_set) + if sim_input.input_type == 'spikes': + spikes = spike_trains.SpikesInput.load(name=sim_input.name, module=sim_input.module, + input_type=sim_input.input_type, params=sim_input.params) + io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + network.add_spike_trains(spikes, node_set) + + elif sim_input.module == 'IClamp': + # TODO: Parse from csv file + amplitude = sim_input.params['amp'] + delay = sim_input.params['delay'] + duration = sim_input.params['duration'] + gids = sim_input.params['node_set'] + sim.attach_current_clamp(amplitude, delay, duration, node_set) + + elif sim_input.module == 'xstim': + sim.add_mod(mods.XStimMod(**sim_input.params)) + + else: + io.log_exception('Can not parse input format {}'.format(sim_input.name)) + + if config.calc_ecp: + for gid, cell in network.cell_type_maps('biophysical').items(): + cell.setup_ecp() + sim.h.cvode.use_fast_imem(1) + + # Parse the "reports" section of the config and load an associated output module for each report + sim_reports = reports.from_config(config) + for report in sim_reports: + if isinstance(report, reports.SpikesReport): + mod = mods.SpikesMod(**report.params) + + elif isinstance(report, reports.SectionReport): + mod = mods.SectionReport(**report.params) + + elif isinstance(report, reports.MembraneReport): + if report.params['sections'] == 'soma': + mod = mods.SomaReport(**report.params) + + else: + mod = mods.MembraneReport(**report.params) + + elif isinstance(report, reports.ECPReport): + assert config.calc_ecp + mod = mods.EcpMod(**report.params) + # Set up the ability for ecp on all relevant cells + # TODO: According to spec we need to allow a different subset other than only biophysical cells + # for gid, cell in network.cell_type_maps('biophysical').items(): + # cell.setup_ecp() + + elif report.module == 'save_synapses': + mod = mods.SaveSynapses(**report.params) + + else: + # TODO: Allow users to register customized modules using pymodules + io.log_warning('Unrecognized module {}, skipping.'.format(report.module)) + continue + + sim.add_mod(mod) + + return sim diff --git a/bmtk-vb/bmtk/simulator/bionet/biosimulator.pyc b/bmtk-vb/bmtk/simulator/bionet/biosimulator.pyc new file mode 100644 index 0000000..9b47d1d Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/biosimulator.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/cell.py b/bmtk-vb/bmtk/simulator/bionet/cell.py new file mode 100644 index 0000000..190836a --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/cell.py @@ -0,0 +1,104 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h +import numpy as np + + +pc = h.ParallelContext() # object to access MPI methods +MPI_RANK = int(pc.id()) + + +class Cell(object): + """A abstract base class for any cell object. + + A base class for implementation of a cell-type objects like biophysical cells, LIF cells, etc. Do not instantiate + a Cell object directly. Cell classes act as wrapper around HOC cell object with extra functionality for setting + positions, synapses, and other parameters depending on the desired cell class. + """ + def __init__(self, node): + self._node = node + self._gid = node.gid + self._node_id = node.node_id + self._props = node + self._netcons = [] # list of NEURON network connection object attached to this cell + + self._pos_soma = [] + self.set_soma_position() + + # register the cell + pc.set_gid2node(self.gid, MPI_RANK) + + # Load the NEURON HOC object + self._hobj = node.load_cell() + + @property + def node(self): + return self._node + + @property + def hobj(self): + return self._hobj + + @property + def gid(self): + return self._gid + + @property + def node_id(self): + return self._node_id + + @property + def group_id(self): + return self._node.group_id + + @property + def network_name(self): + return self._node.network + + @property + def netcons(self): + return self._netcons + + @property + def soma_position(self): + return self._pos_soma + + def set_soma_position(self): + positions = self._node.position + if positions is not None: + self._pos_soma = positions.reshape(3, 1) + + def init_connections(self): + self.rand_streams = [] + self.prng = np.random.RandomState(self.gid) # generate random stream based on gid + + def scale_weights(self, factor): + for nc in self.netcons: + weight = nc.weight[0] + nc.weight[0] = weight*factor + + def get_connection_info(self): + return [] + + def set_syn_connections(self, edge_prop, src_node, stim=None): + raise NotImplementedError diff --git a/bmtk-vb/bmtk/simulator/bionet/cell.pyc b/bmtk-vb/bmtk/simulator/bionet/cell.pyc new file mode 100644 index 0000000..cd5671d Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/cell.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/config.py b/bmtk-vb/bmtk/simulator/bionet/config.py new file mode 100644 index 0000000..e81a0ba --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/config.py @@ -0,0 +1,88 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json + +from neuron import h + +#import bmtk.simulator.utils.config as msdk_config +#from bmtk.utils.sonata.config import SonataConfig +#from bmtk.simulator.core.config import ConfigDict +from bmtk.simulator.utils.config import ConfigDict +from bmtk.simulator.utils.sim_validator import SimConfigValidator +from bmtk.simulator.bionet.io_tools import io +from . import nrn + +pc = h.ParallelContext() # object to access MPI methods +MPI_Rank = int(pc.id()) + + +# load the configuration schema +schema_folder = os.path.join(os.path.dirname(__file__), 'schemas') +config_schema_file = os.path.join(schema_folder, 'config_schema.json') + +# json schemas (but not real jsonschema) to describe the various input file formats +file_formats = [ + ("csv:nodes_internal", os.path.join(schema_folder, 'csv_nodes_internal.json')), + ("csv:node_types_internal", os.path.join(schema_folder, 'csv_node_types_internal.json')), + ("csv:edge_types", os.path.join(schema_folder, 'csv_edge_types.json')), + ("csv:nodes_external", os.path.join(schema_folder, 'csv_nodes_external.json')), + ("csv:node_types_external", os.path.join(schema_folder, 'csv_node_types_external.json')) +] + +# Create a config and input file validator for Bionet +with open(config_schema_file, 'r') as f: + config_schema = json.load(f) +bionet_validator = SimConfigValidator(config_schema, file_formats=file_formats) + + +class Config(ConfigDict): + @property + def cao0(self): + return self.conditions['cao0'] + + @property + def optocell(self): + return self.run['optocell'] + + @staticmethod + def get_validator(): + return bionet_validator + + def create_output_dir(self): + io.setup_output_dir(self.output_dir, self.log_file) + + def load_nrn_modules(self): + nrn.load_neuron_modules(self.mechanisms_dir, self.templates_dir) + + def build_env(self): + if MPI_Rank == 0: + self.create_output_dir() + self.copy_to_output() + + if io.mpi_size > 1: + # A friendly message requested by fb + io.log_info('Running NEURON with mpi ({} cores).'.format(io.mpi_size)) + + pc.barrier() + self.load_nrn_modules() diff --git a/bmtk-vb/bmtk/simulator/bionet/config.pyc b/bmtk-vb/bmtk/simulator/bionet/config.pyc new file mode 100644 index 0000000..a2394fb Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/config.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/__init__.py b/bmtk-vb/bmtk/simulator/bionet/default_setters/__init__.py new file mode 100644 index 0000000..4ad0b56 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/default_setters/__init__.py @@ -0,0 +1,25 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import cell_models +from . import synapse_models +from . import synaptic_weights \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/__init__.pyc b/bmtk-vb/bmtk/simulator/bionet/default_setters/__init__.pyc new file mode 100644 index 0000000..5107fd0 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/default_setters/__init__.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..6c648a6 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/cell_models.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/cell_models.cpython-37.pyc new file mode 100644 index 0000000..f4ac9ff Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/cell_models.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/synapse_models.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/synapse_models.cpython-37.pyc new file mode 100644 index 0000000..08a45bb Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/synapse_models.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/synaptic_weights.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/synaptic_weights.cpython-37.pyc new file mode 100644 index 0000000..6263560 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/default_setters/__pycache__/synaptic_weights.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/cell_models.py b/bmtk-vb/bmtk/simulator/bionet/default_setters/cell_models.py new file mode 100644 index 0000000..16d5bfb --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/default_setters/cell_models.py @@ -0,0 +1,460 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import numpy as np +from neuron import h +try: + from sklearn.decomposition import PCA +except Exception as e: + pass + +from bmtk.simulator.bionet.pyfunction_cache import add_cell_model, add_cell_processor +from bmtk.simulator.bionet.io_tools import io +from bmtk.simulator.bionet.nml_reader import NMLTree + +""" +Functions for loading NEURON cell objects. + +Functions will be loaded by bionetwork and called when a new cell object is created. These are for standard models +loaded with Cell-Types json files or their NeuroML equivelent, but may be overridden by the users. +""" + + +def IntFire1(cell, template_name, dynamics_params): + """Loads a point integrate and fire neuron""" + hobj = h.IntFire1() + hobj.tau = dynamics_params['tau']*1000.0 # Convert from seconds to ms. + hobj.refrac = dynamics_params['refrac']*1000.0 # Convert from seconds to ms. + return hobj + + +def Biophys1(cell, template_name, dynamic_params): + """Loads a biophysical NEURON hoc object using Cell-Types database objects.""" + morphology_file = cell.morphology_file + hobj = h.Biophys1(str(morphology_file)) + #fix_axon(hobj) + #set_params_peri(hobj, dynamic_params) + return hobj + + +def Biophys1_nml(json_file): + # TODO: look at examples to see how to convert .nml files + raise NotImplementedError() + + +def Biophys1_dict(cell): + """ Set parameters for cells from the Allen Cell Types database Prior to setting parameters will replace the + axon with the stub + """ + morphology_file = cell['morphology'] + hobj = h.Biophys1(str(morphology_file)) + return hobj + + +def aibs_perisomatic(hobj, cell, dynamics_params): + if dynamics_params is not None: + fix_axon_peri(hobj) + set_params_peri(hobj, dynamics_params) + + return hobj + + +def fix_axon_peri(hobj): + """Replace reconstructed axon with a stub + + :param hobj: hoc object + """ + for sec in hobj.axon: + h.delete_section(sec=sec) + + h.execute('create axon[2]', hobj) + + for sec in hobj.axon: + sec.L = 30 + sec.diam = 1 + hobj.axonal.append(sec=sec) + hobj.all.append(sec=sec) # need to remove this comment + + hobj.axon[0].connect(hobj.soma[0], 0.5, 0) + hobj.axon[1].connect(hobj.axon[0], 1, 0) + + h.define_shape() + + +def set_params_peri(hobj, biophys_params): + """Set biophysical parameters for the cell + + :param hobj: NEURON's cell object + :param biophys_params: name of json file with biophys params for cell's model which determine spiking behavior + :return: + """ + passive = biophys_params['passive'][0] + conditions = biophys_params['conditions'][0] + genome = biophys_params['genome'] + + # Set passive properties + cm_dict = dict([(c['section'], c['cm']) for c in passive['cm']]) + for sec in hobj.all: + sec.Ra = passive['ra'] + sec.cm = cm_dict[sec.name().split(".")[1][:4]] + sec.insert('pas') + + for seg in sec: + seg.pas.e = passive["e_pas"] + + # Insert channels and set parameters + for p in genome: + sections = [s for s in hobj.all if s.name().split(".")[1][:4] == p["section"]] + + for sec in sections: + if p["mechanism"] != "": + sec.insert(p["mechanism"]) + setattr(sec, p["name"], p["value"]) + + # Set reversal potentials + for erev in conditions['erev']: + sections = [s for s in hobj.all if s.name().split(".")[1][:4] == erev["section"]] + for sec in sections: + sec.ena = erev["ena"] + sec.ek = erev["ek"] + + +def aibs_allactive(hobj, cell, dynamics_params): + fix_axon_allactive(hobj) + set_params_allactive(hobj, dynamics_params) + return hobj + + +def fix_axon_allactive(hobj): + """Replace reconstructed axon with a stub + + Parameters + ---------- + hobj: instance of a Biophysical template + NEURON's cell object + """ + # find the start and end diameter of the original axon, this is different from the perisomatic cell model + # where diameter == 1. + axon_diams = [hobj.axon[0].diam, hobj.axon[0].diam] + for sec in hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name == 'axon': + axon_diams[1] = sec.diam + + for sec in hobj.axon: + h.delete_section(sec=sec) + + h.execute('create axon[2]', hobj) + for index, sec in enumerate(hobj.axon): + sec.L = 30 + sec.diam = axon_diams[index] # 1 + + hobj.axonal.append(sec=sec) + hobj.all.append(sec=sec) # need to remove this comment + + hobj.axon[0].connect(hobj.soma[0], 1.0, 0) + hobj.axon[1].connect(hobj.axon[0], 1.0, 0) + + h.define_shape() + + +def set_params_allactive(hobj, params_dict): + # params_dict = json.load(open(params_file_name, 'r')) + passive = params_dict['passive'][0] + genome = params_dict['genome'] + conditions = params_dict['conditions'][0] + + section_map = {} + for sec in hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name in section_map: + section_map[section_name].append(sec) + else: + section_map[section_name] = [sec] + + for sec in hobj.all: + sec.insert('pas') + # sec.insert('extracellular') + + if 'e_pas' in passive: + e_pas_val = passive['e_pas'] + for sec in hobj.all: + for seg in sec: + seg.pas.e = e_pas_val + + if 'ra' in passive: + ra_val = passive['ra'] + for sec in hobj.all: + sec.Ra = ra_val + + if 'cm' in passive: + # print('Setting cm') + for cm_dict in passive['cm']: + cm = cm_dict['cm'] + for sec in section_map.get(cm_dict['section'], []): + sec.cm = cm + + for genome_dict in genome: + g_section = genome_dict['section'] + if genome_dict['section'] == 'glob': + io.log_warning("There is a section called glob, probably old json file") + continue + + g_value = float(genome_dict['value']) + g_name = genome_dict['name'] + g_mechanism = genome_dict.get("mechanism", "") + for sec in section_map.get(g_section, []): + if g_mechanism != "": + sec.insert(g_mechanism) + setattr(sec, g_name, g_value) + + for erev in conditions['erev']: + erev_section = erev['section'] + erev_ena = erev['ena'] + erev_ek = erev['ek'] + + if erev_section in section_map: + for sec in section_map.get(erev_section, []): + if h.ismembrane('k_ion', sec=sec) == 1: + setattr(sec, 'ek', erev_ek) + if h.ismembrane('na_ion', sec=sec) == 1: + setattr(sec, 'ena', erev_ena) + else: + io.log_warning("Can't set erev for {}, section array doesn't exist".format(erev_section)) + + +def aibs_perisomatic_directed(hobj, cell, dynamics_params): + fix_axon_perisomatic_directed(hobj) + set_params_peri(hobj, dynamics_params) + return hobj + + +def aibs_allactive_directed(hobj, cell, dynamics_params): + fix_axon_allactive_directed(hobj) + set_params_allactive(hobj, dynamics_params) + return hobj + + +def fix_axon_perisomatic_directed(hobj): + # io.log_info('Fixing Axon like perisomatic') + all_sec_names = [] + for sec in hobj.all: + all_sec_names.append(sec.name().split(".")[1][:4]) + + if 'axon' not in all_sec_names: + io.log_exception('There is no axonal recostruction in swc file.') + else: + beg1, end1, beg2, end2 = get_axon_direction(hobj) + + for sec in hobj.axon: + h.delete_section(sec=sec) + h.execute('create axon[2]', hobj) + + h.pt3dadd(beg1[0], beg1[1], beg1[2], 1, sec=hobj.axon[0]) + h.pt3dadd(end1[0], end1[1], end1[2], 1, sec=hobj.axon[0]) + hobj.all.append(sec=hobj.axon[0]) + h.pt3dadd(beg2[0], beg2[1], beg2[2], 1, sec=hobj.axon[1]) + h.pt3dadd(end2[0], end2[1], end2[2], 1, sec=hobj.axon[1]) + hobj.all.append(sec=hobj.axon[1]) + + hobj.axon[0].connect(hobj.soma[0], 0.5, 0) + hobj.axon[1].connect(hobj.axon[0], 1.0, 0) + + hobj.axon[0].L = 30.0 + hobj.axon[1].L = 30.0 + + h.define_shape() + + for sec in hobj.axon: + # print "sec.L:", sec.L + if np.abs(30-sec.L) > 0.0001: + io.log_exception('Axon stub L is less than 30') + + +def fix_axon_allactive_directed(hobj): + all_sec_names = [] + for sec in hobj.all: + all_sec_names.append(sec.name().split(".")[1][:4]) + + if 'axon' not in all_sec_names: + io.log_exception('There is no axonal recostruction in swc file.') + else: + beg1, end1, beg2, end2 = get_axon_direction(hobj) + + axon_diams = [hobj.axon[0].diam, hobj.axon[0].diam] + for sec in hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name == 'axon': + axon_diams[1] = sec.diam + + for sec in hobj.axon: + h.delete_section(sec=sec) + h.execute('create axon[2]', hobj) + hobj.axon[0].connect(hobj.soma[0], 1.0, 0) + hobj.axon[1].connect(hobj.axon[0], 1.0, 0) + + h.pt3dadd(beg1[0], beg1[1], beg1[2], axon_diams[0], sec=hobj.axon[0]) + h.pt3dadd(end1[0], end1[1], end1[2], axon_diams[0], sec=hobj.axon[0]) + hobj.all.append(sec=hobj.axon[0]) + h.pt3dadd(beg2[0], beg2[1], beg2[2], axon_diams[1], sec=hobj.axon[1]) + h.pt3dadd(end2[0], end2[1], end2[2], axon_diams[1], sec=hobj.axon[1]) + hobj.all.append(sec=hobj.axon[1]) + + hobj.axon[0].L = 30.0 + hobj.axon[1].L = 30.0 + + h.define_shape() + + for sec in hobj.axon: + # io.log_info('sec.L: {}'.format(sec.L)) + if np.abs(30 - sec.L) > 0.0001: + io.log_exception('Axon stub L is less than 30') + + +def get_axon_direction(hobj): + for sec in hobj.somatic: + n3d = int(h.n3d()) # get number of n3d points in each section + soma_end = np.asarray([h.x3d(n3d - 1), h.y3d(n3d - 1), h.z3d(n3d - 1)]) + mid_point = int(n3d / 2) + soma_mid = np.asarray([h.x3d(mid_point), h.y3d(mid_point), h.z3d(mid_point)]) + + for sec in hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name == 'axon': + n3d = int(h.n3d()) # get number of n3d points in each section + axon_p3d = np.zeros((n3d, 3)) # to hold locations of 3D morphology for the current section + for i in range(n3d): + axon_p3d[i, 0] = h.x3d(i) + axon_p3d[i, 1] = h.y3d(i) # shift coordinates such to place soma at the origin. + axon_p3d[i, 2] = h.z3d(i) + + # Add soma coordinates to the list + p3d = np.concatenate(([soma_mid], axon_p3d), axis=0) + + # Compute PCA + pca = PCA(n_components=3) + pca.fit(p3d) + unit_v = pca.components_[0] + + mag_v = np.sqrt(pow(unit_v[0], 2) + pow(unit_v[1], 2) + pow(unit_v[2], 2)) + unit_v[0] = unit_v[0] / mag_v + unit_v[1] = unit_v[1] / mag_v + unit_v[2] = unit_v[2] / mag_v + + # Find the direction + axon_end = axon_p3d[-1] - soma_mid + if np.dot(unit_v, axon_end) < 0: + unit_v *= -1 + + axon_seg_coor = np.zeros((4, 3)) + # unit_v = np.asarray([0,1,0]) + axon_seg_coor[0] = soma_end + axon_seg_coor[1] = soma_end + (unit_v * 30.) + axon_seg_coor[2] = soma_end + (unit_v * 30.) + axon_seg_coor[3] = soma_end + (unit_v * 60.) + + return axon_seg_coor + + +nml_files = {} # For caching neuroml file trees +def NMLLoad(cell, template_name, dynamic_params): + """Convert a NEUROML file to a NEURON hoc cell object. + + Current limitations: + * Ignores nml morphology section. You must pass in a swc file + * Only for biophysically detailed cell biophysical components. All properties must be assigned to a segment group. + + :param cell: + :param template_name: + :param dynamic_params: + :return: + """ + # Last I checked there is no built in way to load a NML file directly into NEURON through the API, instead we have + # to manually parse the nml file and build the NEUROM cell object section-by-section. + morphology_file = cell.morphology_file + hobj = h.Biophys1(str(morphology_file)) + # Depending on if the axon is cut before or after setting cell channels and mechanism can create drastically + # different results. Currently NML files doesn't produce the same results if you use model_processing directives. + # TODO: Find a way to specify model_processing directive with NML file + fix_axon_peri(hobj) + + # Load the hoc template containing a swc initialized NEURON cell + if template_name in nml_files: + nml_params = nml_files[template_name] + else: + # Parse the NML parameters file xml tree and cache. + biophys_dirs = cell.network.get_component('biophysical_neuron_models_dir') + nml_path = os.path.join(biophys_dirs, template_name) + nml_params = NMLTree(nml_path) + nml_files[template_name] = nml_params + + # Iterate through the NML tree by section and use the properties to manually create cell mechanisms + section_lists = [(sec, sec.name().split(".")[1][:4]) for sec in hobj.all] + for sec, sec_name in section_lists: + for prop_name, prop_obj in nml_params[sec_name].items(): + if prop_obj.element_tag() == 'resistivity': + sec.Ra = prop_obj.value + + elif prop_obj.element_tag() == 'specificCapacitance': + sec.cm = prop_obj.value + + elif prop_obj.element_tag() == 'channelDensity' and prop_obj.ion_channel == 'pas': + sec.insert('pas') + setattr(sec, 'g_pas', prop_obj.cond_density) + for seg in sec: + seg.pas.e = prop_obj.erev + + elif prop_obj.element_tag() == 'channelDensity' or prop_obj.element_tag() == 'channelDensityNernst': + sec.insert(prop_obj.ion_channel) + setattr(sec, prop_obj.id, prop_obj.cond_density) + if prop_obj.ion == 'na' and prop_obj: + sec.ena = prop_obj.erev + elif prop_obj.ion == 'k': + sec.ek = prop_obj.erev + + elif prop_obj.element_tag() == 'concentrationModel': + sec.insert(prop_obj.id) + setattr(sec, 'gamma_' + prop_obj.type, prop_obj.gamma) + setattr(sec, 'decay_' + prop_obj.type, prop_obj.decay) + + return hobj + +def set_extracellular(hobj, cell, dynamics_params): + for sec in hobj.all: + sec.insert('extracellular') + + return hobj + + +add_cell_model(NMLLoad, directive='nml', model_type='biophysical') +add_cell_model(Biophys1, directive='ctdb:Biophys1', model_type='biophysical', overwrite=False) +add_cell_model(Biophys1, directive='ctdb:Biophys1.hoc', model_type='biophysical', overwrite=False) +add_cell_model(IntFire1, directive='nrn:IntFire1', model_type='point_process', overwrite=False) + + +add_cell_processor(aibs_perisomatic, overwrite=False) +add_cell_processor(aibs_allactive, overwrite=False) +add_cell_processor(aibs_perisomatic_directed, overwrite=False) +add_cell_processor(aibs_allactive_directed, overwrite=False) +add_cell_processor(set_extracellular, overwrite=False) +add_cell_processor(set_extracellular, 'extracellular', overwrite=False) \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/cell_models.pyc b/bmtk-vb/bmtk/simulator/bionet/default_setters/cell_models.pyc new file mode 100644 index 0000000..4bc74f0 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/default_setters/cell_models.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/synapse_models.py b/bmtk-vb/bmtk/simulator/bionet/default_setters/synapse_models.py new file mode 100644 index 0000000..013cbcb --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/default_setters/synapse_models.py @@ -0,0 +1,206 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h + +from bmtk.simulator.bionet.pyfunction_cache import add_synapse_model +from bmtk.simulator.bionet.nrn import * + + +def exp2syn(syn_params, xs, secs): + """Create a list of exp2syn synapses + + :param syn_params: parameters of a synapse + :param xs: list of normalized distances along the section + :param secs: target sections + :return: list of NEURON synpase objects + """ + syns = [] + for x, sec in zip(xs, secs): + syn = h.Exp2Syn(x, sec=sec) + syn.e = syn_params['erev'] + syn.tau1 = syn_params['tau1'] + syn.tau2 = syn_params['tau2'] + syns.append(syn) + return syns + + +def Exp2Syn(syn_params, sec_x, sec_id): + """Create a list of exp2syn synapses + + :param syn_params: parameters of a synapse + :param sec_x: normalized distance along the section + :param sec_id: target section + :return: NEURON synapse object + """ + syn = h.Exp2Syn(sec_x, sec=sec_id) + syn.e = syn_params['erev'] + syn.tau1 = syn_params['tau1'] + syn.tau2 = syn_params['tau2'] + return syn + + + +@synapse_model +def stp1syn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.stp1syn(x, sec=sec) + + syn.e = syn_params["erev"] + syn.p0 = 0.5 + syn.tau_r = 200 + syn.tau_1 = 5 + syns.append(syn) + + return syns + + +@synapse_model +def stp2syn(syn_params, x, sec): + syn = h.stp2syn(x, sec=sec) + syn.e = syn_params["erev"] + syn.p0 = syn_params["p0"] + syn.tau_r0 = syn_params["tau_r0"] + syn.tau_FDR = syn_params["tau_FDR"] + syn.tau_1 = syn_params["tau_1"] + return syn + + +@synapse_model +def stp3syn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.stp3syn(x, sec=sec) # temporary + syn.e = syn_params["erev"] + syn.p0 = 0.6 + syn.tau_r0 = 200 + syn.tau_FDR = 2000 + syn.tau_D = 500 + syn.tau_1 = 5 + syns.append(syn) + + return syns + + +@synapse_model +def stp4syn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.stp4syn(x, sec=sec) + syn.e = syn_params["erev"] + syn.p0 = 0.6 + syn.tau_r = 200 + syn.tau_1 = 5 + syns.append(syn) + + return syns + + +@synapse_model +def stp5syn(syn_params, x, sec): # temporary + syn = h.stp5syn(x, sec=sec) + syn.e = syn_params["erev"] + syn.tau_1 = syn_params["tau_1"] + syn.tau_r0 = syn_params["tau_r0"] + syn.tau_FDR = syn_params["tau_FDR"] + syn.a_FDR = syn_params["a_FDR"] + syn.a_D = syn_params["a_D"] + syn.a_i = syn_params["a_i"] + syn.a_f = syn_params["a_f"] + syn.pbtilde = syn_params["pbtilde"] + return syn + + +def stp5isyn(syn_params, xs, secs): # temporary + syns = [] + for x, sec in zip(xs, secs): + syn = h.stp5isyn(x, sec=sec) + syn.e = syn_params["erev"] + syn.tau_1 = syn_params["tau_1"] + syn.tau_r0 = syn_params["tau_r0"] + syn.tau_FDR = syn_params["tau_FDR"] + syn.a_FDR = syn_params["a_FDR"] + syn.a_D = syn_params["a_D"] + syn.a_i = syn_params["a_i"] + syn.a_f = syn_params["a_f"] + syn.pbtilde = syn_params["pbtilde"] + syns.append(syn) + + return syns + + +@synapse_model +def tmgsyn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.tmgsyn(x, sec=sec) + syn.e = syn_params["erev"] + syn.tau_1 = syn_params["tau_1"] + syn.tau_rec = syn_params["tau_rec"] + syn.tau_facil = syn_params["tau_facil"] + syn.U = syn_params["U"] + syn.u0 = syn_params["u0"] + syns.append(syn) + + return syns + + +@synapse_model +def expsyn(syn_params, x, sec): + """Create a list of expsyn synapses + + :param syn_params: parameters of a synapse (dict) + :param x: normalized distance along the section (float) + :param sec: target section (hoc object) + :return: synapse objects + """ + syn = h.ExpSyn(x, sec=sec) + syn.e = syn_params['erev'] + syn.tau = syn_params["tau1"] + return syn + + +@synapse_model +def exp1syn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.exp1syn(x, sec=sec) + syn.e = syn_params['erev'] + syn.tau = syn_params["tau_1"] + syns.append(syn) + return syns + + +@synapse_model +def exp1isyn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.exp1isyn(x, sec=sec) + syn.e = syn_params['erev'] + syn.tau = syn_params["tau_1"] + syns.append(syn) + return syns + + +add_synapse_model(Exp2Syn, 'exp2syn', overwrite=False) +add_synapse_model(Exp2Syn, overwrite=False) diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/synapse_models.pyc b/bmtk-vb/bmtk/simulator/bionet/default_setters/synapse_models.pyc new file mode 100644 index 0000000..7e3c6a0 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/default_setters/synapse_models.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/synaptic_weights.py b/bmtk-vb/bmtk/simulator/bionet/default_setters/synaptic_weights.py new file mode 100644 index 0000000..0f0973d --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/default_setters/synaptic_weights.py @@ -0,0 +1,51 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import math + +from bmtk.simulator.bionet.pyfunction_cache import add_weight_function + + +def default_weight_fnc(edge_props, src_props, trg_props): + return edge_props['syn_weight'] + + +def wmax(edge_props, src_props, trg_props): + return edge_props["syn_weight"] + + +def gaussianLL(edge_props, src_props, trg_props): + src_tuning = src_props['tuning_angle'] + tar_tuning = trg_props['tuning_angle'] + + w0 = edge_props["syn_weight"] + sigma = edge_props["weight_sigma"] + + delta_tuning = abs(abs(abs(180.0 - abs(float(tar_tuning) - float(src_tuning)) % 360.0) - 90.0) - 90.0) + weight = w0 * math.exp(-(delta_tuning / sigma) ** 2) + + return weight + + +add_weight_function(wmax, 'wmax', overwrite=False) +add_weight_function(gaussianLL, 'gaussianLL', overwrite=False) +add_weight_function(default_weight_fnc, 'default_weight_fnc', overwrite=False) diff --git a/bmtk-vb/bmtk/simulator/bionet/default_setters/synaptic_weights.pyc b/bmtk-vb/bmtk/simulator/bionet/default_setters/synaptic_weights.pyc new file mode 100644 index 0000000..ee8a4ff Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/default_setters/synaptic_weights.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/default_templates/BioAxonStub.hoc b/bmtk-vb/bmtk/simulator/bionet/default_templates/BioAxonStub.hoc new file mode 100644 index 0000000..df8660d --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/default_templates/BioAxonStub.hoc @@ -0,0 +1,61 @@ +begintemplate BioAxonStub + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + + simplify_axon() +} + +proc simplify_axon() { + + forsec axonal { delete_section() } + create axon[2] + + axon[0] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + axon[1] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + connect axon(0), soma(0.5) + connect axon[1](0), axon[0](1) + define_shape() + + +} + +endtemplate BioAxonStub \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/bionet/default_templates/Biophys1.hoc b/bmtk-vb/bmtk/simulator/bionet/default_templates/Biophys1.hoc new file mode 100644 index 0000000..e25192a --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/default_templates/Biophys1.hoc @@ -0,0 +1,32 @@ +begintemplate Biophys1 + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) + import.instantiate(this) + +} + +endtemplate Biophys1 diff --git a/bmtk-vb/bmtk/simulator/bionet/default_templates/advance.hoc b/bmtk-vb/bmtk/simulator/bionet/default_templates/advance.hoc new file mode 100644 index 0000000..f4ed0b8 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/default_templates/advance.hoc @@ -0,0 +1,10 @@ +// custom proc advance() + +objref pysim // defined in the Simulation as h.pysim = self + +pysim = new PythonObject() + +proc advance() { + fadvance() + pysim.post_fadvance() // run Simulation.post_fadvance() function after each fadvance call +} diff --git a/bmtk-vb/bmtk/simulator/bionet/gids.pyc b/bmtk-vb/bmtk/simulator/bionet/gids.pyc new file mode 100644 index 0000000..89dd0fa Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/gids.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/iclamp.py b/bmtk-vb/bmtk/simulator/bionet/iclamp.py new file mode 100644 index 0000000..fe823ef --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/iclamp.py @@ -0,0 +1,38 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h + + +class IClamp(object): + def __init__(self, amplitude, delay, duration): + self._iclamp_amp = amplitude + self._iclamp_del = delay + self._iclamp_dur = duration + self._stim = None + + def attach_current(self, cell): + self._stim = h.IClamp(cell.hobj.soma[0](0.5)) + self._stim.delay = self._iclamp_del + self._stim.dur = self._iclamp_dur + self._stim.amp = self._iclamp_amp + return self._stim diff --git a/bmtk-vb/bmtk/simulator/bionet/iclamp.pyc b/bmtk-vb/bmtk/simulator/bionet/iclamp.pyc new file mode 100644 index 0000000..312c976 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/iclamp.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/import3d.hoc b/bmtk-vb/bmtk/simulator/bionet/import3d.hoc new file mode 100644 index 0000000..3bcad33 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/import3d.hoc @@ -0,0 +1,12 @@ +{xopen("import3d/import3d_sec.hoc")} +{xopen("import3d/read_swc.hoc")} +{xopen("import3d/read_nlcda.hoc")} +{xopen("import3d/read_nlcda3.hoc")} +{xopen("import3d/read_nts.hoc")} +{xopen("import3d/read_morphml.hoc")} +{xopen("import3d/import3d_gui.hoc")} +objref tobj, nil +proc makeimport3dtool() { + tobj = new Import3d_GUI(nil) + tobj = nil +} diff --git a/bmtk-vb/bmtk/simulator/bionet/import3d/import3d_gui.hoc b/bmtk-vb/bmtk/simulator/bionet/import3d/import3d_gui.hoc new file mode 100644 index 0000000..81d6935 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/import3d/import3d_gui.hoc @@ -0,0 +1,1174 @@ +{load_file("celbild.hoc")} +{load_file("stdlib.hoc")} + +begintemplate Import3d_GUI +public swc, diam_glyph, box, plrot, readfile, redraw, name +public origin, rotmatold, raworigin, g, rotraw, instantiate +external hoc_sf_ +objref swc, g, box, this, rotmat, m2, origin, tobj, rotmatold +objref raworigin, rotsav, viewsec, rawsel, deck +objref file, nil, problist, types, editbox +strdef tstr, tstr1, typelabel_, filename +public quiet + + +proc init() { + + quiet = 0 + + if (numarg() == 2) if ($2 == 0) { + swc = $o1 + return + } + if ($o1 == nil) { + file = new File() + filename = "choose a file " + }else{ + file = $o1.file + hoc_sf_.head(file.getname(), "[^/]*$", tstr) + file.chooser("r", "Import 3-D Reconstruction File", "*", "Read", "Cancel", tstr) + filename =file.getname() + } + ztrans_ = 0 + dummy_ = 0 + undo_type_ = 0 + show_point_ = 1 + show_diam_ = 1 + if ($o1 == nil) { build() map() return } + init1($o1) + build() + map() + init2() + +} + +proc map() { + sprint(tstr, "%s", this) + if (numarg() == 0) { + box.map(tstr) + }else{ + box.map(tstr, $2, $3, $4, $5) + } +} + +proc init1() { + i=0 j=0 + swc = $o1 + selpoint_ = -1 + selid_ = swc.pt2id(selpoint_) + viewsec = new List() + showtype(-10000) + rotated_ = 0 + rotmat = new Matrix(3,3) + rotmatold = rotmat.c.ident + rotsav = rotmat.c.ident + origin = new Vector(3) + raworigin = new Vector(3) + rawsel = new Vector(3) + m2 = new Matrix(3,3) +} +proc init2() { + rot(0,0) + pl() + g.exec_menu("View = plot") + g.exec_menu("Zoom") +} + +proc build() {local i + box = new HBox(3) + box.full_request(1) + box.save("") + box.ref(this) + box.intercept(1) + box.adjuster(400) + g = new Graph(0) + g.view(2) + g.xaxis(3) + deck = new Deck(3) + build_panel() + deck.map + box.intercept(0) +} + +proc build_panel() {local i + deck.intercept(1) + xpanel("") + xcheckbox(filename, &readfile_, "readfile()") + if (swc == nil) { + xlabel(" accepted file formats:") + xlabel(" SWC") + xlabel(" Neurolucida (v1 and v3)") + xlabel(" Eutectic") + if (nrnpython("")) xlabel(" MorphML") + for i = 0, 15 { xlabel("") } + xpanel(0) + deck.intercept(0) + deck.flip_to(0) + return + } + sprint(tstr, "File format: %s", swc.filetype) + xlabel(tstr) + xlabel("-------------------------------") + g.menu_remove("Zoom") + g.menu_tool("Zoom", "zoom") + g.menu_remove("Translate ") + g.menu_tool("Translate ", "translate") + g.menu_remove("Rotate") + g.menu_tool("Rotate (about axis in plane)", "rotate") + xcheckbox("Rotate 45deg about y axis", &dummy_, "rot45()") + xcheckbox("Rotated (vs Raw view)", &rotated_, "rotraw()") + xcheckbox("Show Points", &show_point_, "pl()") + xcheckbox("Show Diam", &show_diam_, "pl()") + xvarlabel(typelabel_) + xmenu("View type") + xradiobutton("All", "showtype(-10000) pl()", 1) + xradiobutton("Section containing selected point", "showsec() pl()") + xradiobutton("Distal (tree) from selected point", "showdistal() pl()") + xradiobutton("Proximal (path to root) from selected point", "showprox() pl()") + xradiobutton("Root sections", "showroot() pl()") + if (swc.type.min != swc.type.max) { + for i = swc.type.min, swc.type.max { + if (swc.type.indwhere("==", i) != -1) { + sprint(tstr, "type %d", i) + sprint(tstr1, "showtype(%d) pl()", i) + xradiobutton(tstr, tstr1) + } + } + } + xmenu() + g.menu_remove("Select point") + g.menu_tool("Select point", "selpoint", "selpoint1(1)") + if (strcmp(swc.filetype, "Neurolucida") == 0) { + xpvalue("Line#", &selid_, 1, "selid(1)") + if (swc.err) { + xbutton("Problem points", "probpointpanel()") + } + }else if (strcmp(swc.filetype, "Neurolucida V3") == 0) { + xpvalue("Line#", &selid_, 1, "selid(1)") + }else{ + xpvalue("Select id", &selid_, 1, "selid(1)") + } + xlabel("-------------------------------") + xbutton("Edit", "map_edit()") + xmenu("Export") + xbutton("CellBuilder", "cbexport()") + xbutton("Instantiate", "instantiate(nil)") + xmenu() + sprint(tstr, "%s filter facts", swc.filetype) + xbutton(tstr, "swc.helptxt()") + xpanel(0) + deck.intercept(0) + deck.flip_to(0) +} + + +proc map_edit() { + if (editbox == nil) { + build_edit() + } + if (editbox.ismapped) { return } + sprint(tstr, "Edit %s", this) + editbox.map(tstr) +} +proc build_edit() { + editbox = new VBox() + editbox.intercept(1) + editbox.save("") + xpanel("") + ztransitem() + xlabel("Select point:") + xcheckbox("Largest z change", &dummy_, "sel_largest_dz()") + xlabel("then action:") + xcheckbox("z-translate rest of tree to parent point", &dummy_, "edit2()") + xcheckbox("z-translate to average of adjacent points", &dummy_, "edit1()") + xcheckbox("undo last", &dummy_, "edit0()") + xlabel("-------------------") + xcheckbox("3 point filter of all z values (no undo)", &dummy_, "edit3()") + xpanel() + editbox.intercept(0) +} + +proc sel_largest_dz() {local i, j, dz, dzmax, imax, jmax localobj sec, tobj + dummy_ = 0 + dzmax = -1 + for i = 0, swc.sections.count-1 { + sec = swc.sections.object(i) + tobj = sec.raw.getrow(2).deriv(1,1).abs + j = tobj.max_ind + dz = tobj.x[j] + if (dz > dzmax) { + jmax = j+1 + imax = i + dzmax = dz + } + } + if (dzmax > 0) { + selpoint_ = swc.sec2pt(imax, jmax) + selpoint_dependent_show() + swc.sections.object(imax).raw.getcol(jmax, rawsel) + selid_ = swc.pt2id(selpoint_) + pl() + } +} + +proc ztransitem() {local i, n localobj raw + n = 0 + for i = 0, swc.sections.count-1 { + raw = swc.sections.object(i).raw + if (abs(raw.x[2][0] - raw.x[2][1]) > 10) { + n += 1 + } + } + if (n > 0) { + sprint(tstr, "z translation for %d abrupt branch backlash", n) + xcheckbox(tstr, &ztrans_, "ztrans()") + } +} + +proc ztrans() { local i, zd, pn localobj sec + if (ztrans_) { + for i = 0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (object_id(sec.parentsec) == 0) { continue } + if (object_id(sec.parentsec.parentsec) == 0) { continue } + zd = sec.raw.x[2][1] - sec.raw.x[2][0] + if (abs(zd) > 5) { + zd += sec.parentsec.ztrans + }else{ + zd = sec.parentsec.ztrans + } + sec.ztrans = zd + sec.raw.setrow(2, sec.raw.getrow(2).sub(sec.ztrans)) + pn = sec.parentsec.raw.ncol + sec.raw.x[2][0] = sec.parentsec.raw.x[2][pn-1] + } + }else{ + for i = 0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.ztrans) { +sec.raw.setrow(2, sec.raw.getrow(2).add(sec.ztrans)) + pn = sec.parentsec.raw.ncol + sec.raw.x[2][0] = sec.parentsec.raw.x[2][pn-1] + sec.ztrans = 0 + } + } + } + redraw() +} + +proc edit0() {local i, n localobj sec + dummy_ = 0 + if (undo_type_ == 1) { + i = swc.pt2sec(undo_selpoint_, sec) + sec.raw.x[2][i] = undo_z_ + sec.raw.getcol(i, rawsel) + }else if (undo_type_ == 2) { + i = swc.pt2sec(undo_selpoint_, sec) + n = sec.raw.ncol + for i=i, n-1 { + sec.raw.x[2][i] += undo_z_ + } + sec.raw.getcol(i, rawsel) + for i=0, swc.sections.count-1 { swc.sections.object(i).volatile = 0 } + sec.volatile = 1 + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (object_id(sec.parentsec)) if (sec.parentsec.volatile) { + sec.volatile = 1 + sec.raw.setrow(2, sec.raw.getrow(2).add(undo_z_)) + } + } + } + undo_type_ = 0 + redraw() +} + +proc edit1() {local i, z1, z2 localobj sec + // z translate to average of adjacent points + dummy_ = 0 + if (selpoint_ >= 0) { + i = swc.pt2sec(selpoint_, sec) + if (i > 0) { + z1 = sec.raw.x[2][i-1] + }else{ + return + } + if (i < sec.raw.ncol-1) { + z2 = sec.raw.x[2][i+1] + }else{ + return + } + undo_selpoint_ = selpoint_ + undo_type_ = 1 + undo_z_ = sec.raw.x[2][i] + sec.raw.x[2][i] = (z1 + z2)/2 + sec.raw.getcol(i, rawsel) + } + redraw() +} + +proc edit2() {local i, ip, z1, n localobj sec + // z-translate rest of tree to parent point + dummy_ = 0 + if (selpoint_ >= 0) { + ip = swc.pt2sec(selpoint_, sec) + if (ip > 0) { + z1 = sec.raw.x[2][ip] - sec.raw.x[2][ip-1] + }else{ + return + } + undo_selpoint_ = selpoint_ + undo_type_ = 2 + undo_z_ = z1 + n = sec.raw.ncol + for i=ip, n-1 { + sec.raw.x[2][i] -= z1 + } + sec.raw.getcol(ip, rawsel) + for i=0, swc.sections.count-1 { swc.sections.object(i).volatile = 0 } + sec.volatile = 1 + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (object_id(sec.parentsec)) if (sec.parentsec.volatile) { + sec.volatile = 1 + sec.raw.setrow(2, sec.raw.getrow(2).sub(z1)) + } + } + } + redraw() +} + +proc edit3() {local i localobj sec + dummy_ = 0 + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + sec.raw.setrow(2, sec.raw.getrow(2).medfltr) + } + if (selpoint_ >= 0) { + i = swc.pt2sec(selpoint_, sec) + sec.raw.getcol(i, rawsel) + } + redraw() +} + +proc probpointpanel() { + problist = new List() + problist.browser("Problem points", "s") + problist.select_action("probpoint(hoc_ac_)") + swc.fillproblist(problist) + problist.select(-1) +} + +proc probpoint() {local i + if ($1 < 0) {return} + sscanf(problist.object($1).s, "%d:", &i) + selid_ = i + selid(0) +} + +proc readfile() { + readfile_ = 0 + if (numarg() == 0) { + file.chooser("r", "Import 3-D Reconstruction File", "*", "Read", "Cancel") + if (file.chooser()) { + if (!some_format()) { + return + } + }else{ + return + } + }else{ + file = new File($s1) + if (!some_format()) { + return + } + } + // if new file + problist = nil + deck.flip_to(-1) + build_panel() + deck.move_last(0) + deck.flip_to(0) + init1(swc) + init2() + doNotify() + if (swc.err) { + printf("\n") + sprint(tstr, "%s: File translation problems. See the messages on the terminal", file.getname) + continue_dialog(tstr) + if (strcmp(swc.filetype, "Neurolucida V3") == 0) { + swc.b2spanel(this) + } + } + deck.remove_last() +} + +func some_format() {local i, a,b,c,d,e,f,g, n + if (!file.ropen()) { + sprint(tstr, "Can't read %s", file.getname) + continue_dialog(tstr) + return 0 + } + while (1) { + if (file.eof) { + file.close + sprint(tstr, "Can't figure out file format for %s", file.getname) + continue_dialog(tstr) + return 0 + } + file.gets(tstr) + if (hoc_sf_.head(tstr, "^\\<\\?xml", tstr1) != -1) { + if (nrnpython("")) { + swc = new Import3d_MorphML() break + }else{ + file.close + sprint(tstr, "Can't read MorphML: Python not available.") + continue_dialog(tstr) + return 0 + } + } + n = sscanf(tstr, "%f %f %f %f %f %f %f", &a, &b, &c, &d, &e, &f, &g) + if (n == 7) { swc = new Import3d_SWC_read() break } + n = sscanf(tstr, "[%d,%d] (%f,%f,%f) %f", &a, &b, &c, &d, &e, &f) + if (n == 6) { swc = new Import3d_Neurolucida_read() break } + n = sscanf(tstr, "%d %s %d %f %f %f %f", &a, tstr, &b, &c, &d, &e, &f) + if (n == 7) { swc = new Import3d_Eutectic_read() break } + if (hoc_sf_.tail(tstr, "^[ \t]*", tstr1) != -1) { + //unfortunately regexp does not allow an explicit "(" + hoc_sf_.left(tstr1, 1) + if (strcmp(tstr1, "(") == 0) { + swc = new Import3d_Neurolucida3() break + } + } + if (hoc_sf_.head(tstr, "^;[ \t]*V3", tstr1) != -1) { + swc = new Import3d_Neurolucida3() break + } + } + file.close + filename = file.getname + swc.input(filename) + return 1 +} + +proc pl_point() { local i, j, i1 localobj m, m0 + if (viewsec.count) {m0 = swc.sections.object(0).xyz} + for i=0, viewsec.count-1 { + viewsec.object(i).pl_point(g) + } +} + +proc pl_centroid() {local i + for i=0, swc.sections.count-1 { + swc.sections.object(i).pl_centroid(g) + } +} +proc pl_diam() {local i localobj sec + for i=0, viewsec.count-1 { + viewsec.object(i).pl_diam(g) + } +} +proc pl() { localobj tobj + g.erase_all + if (show_diam_) {pl_diam()} + pl_centroid() + if (show_point_) {pl_point()} + if (selpoint_ >= 0) { + tobj = m2.mulv(rawsel) + g.mark(tobj.x[0], tobj.x[1], "O", 12, 2, 1) + swc.label(selpoint_, tstr) + g.label(.1, .05, tstr, 2, 1, 0, 0, 1) + } +} + +proc redraw() { local i localobj sec + if (selpoint_ >= 0) { + i = swc.pt2sec(selpoint_, sec) + sec.raw.getcol(i, rawsel) + } + showtype(viewtype_) + rot(0,0) + pl() +} + +proc showtype() { + viewtype_ = $1 + viewsec.remove_all + if ($1 == -10000) { + typelabel_ = "View all types" + for i=0, swc.sections.count - 1 { + viewsec.append(swc.sections.object(i)) + swc.sections.object(i).centroid_color = 2 + } + }else{ + sprint(typelabel_, "View type %d", viewtype_) + for i=0, swc.sections.count - 1 { + if (swc.sections.object(i).type == viewtype_) { + viewsec.append(swc.sections.object(i)) + swc.sections.object(i).centroid_color = 2 + }else{ + swc.sections.object(i).centroid_color = 9 + } + } + } +} + +proc selpoint_dependent_show() { + if (viewtype_ == -20000) { + showdistal() + }else if (viewtype_ == -30000) { + showprox() + }else if (viewtype_ == -40000) { + showsec() + }else if (viewtype_ == -50000) { + showroot() + } +} + +proc showdistal() {local i localobj sec + viewtype_ = -20000 + typelabel_ = "Show distal (tree) from selected point" + viewsec.remove_all + for i=0, swc.sections.count - 1 { + swc.sections.object(i).centroid_color = 9 + } + if (selpoint_ < 0) { return } + swc.pt2sec(selpoint_, sec) + // recursion is trivial but I want to avoid the depth so use the + // fact that children are after the parent in the sections list + sec.centroid_color = 2 + viewsec.append(sec) + for i=0, swc.sections.count - 1 { + if (swc.sections.object(i).centroid_color == 2) { + break + } + } + for i=i+1, swc.sections.count - 1 { + sec = swc.sections.object(i) + if (sec.parentsec != nil) if (sec.parentsec.centroid_color == 2) { + sec.centroid_color = 2 + viewsec.append(sec) + } + } +} + +proc showprox() {localobj sec + viewtype_ = -30000 + typelabel_ = "Show proximal (path to root) from selected point" + viewsec.remove_all + for i=0, swc.sections.count - 1 { + swc.sections.object(i).centroid_color = 9 + } + if (selpoint_ < 0) { return } + for (swc.pt2sec(selpoint_, sec); sec != nil; sec = sec.parentsec) { + viewsec.append(sec) + sec.centroid_color = 2 + } +} + +proc showsec() {localobj sec + viewtype_ = -40000 + typelabel_ = "Show section containing selected point" + viewsec.remove_all + for i=0, swc.sections.count - 1 { + swc.sections.object(i).centroid_color = 9 + } + if (selpoint_ < 0) { return } + swc.pt2sec(selpoint_, sec) + if (sec != nil) { + viewsec.append(sec) + sec.centroid_color = 2 + } +} + +proc showroot() {localobj sec + viewtype_ = -50000 + typelabel_ = "Show root sections" + viewsec.remove_all + for i=0, swc.sections.count - 1 { + sec = swc.sections.object(i) + sec.centroid_color = 9 + if (sec.parentsec == nil) { + sec.centroid_color = 2 + viewsec.append(sec) + } + } +} + +proc selpoint1() { // deselection not supported by menu_tool + if ($1 == 0) { + selpoint_ = -1 + } +} +proc selpoint() {local i, j + if ($1 == 2) { + nearest_point($2, $3, &i, &j) + selpoint_ = swc.sec2pt(i, j) + selpoint_dependent_show() + swc.sections.object(i).raw.getcol(j, rawsel) + selid_ = swc.pt2id(selpoint_) + pl() + } +} + +proc selid() {local i, j localobj sec + selpoint_ = swc.id2pt(selid_) + selid_ = swc.pt2id(selpoint_) + if (selpoint_ >= 0) { + i = swc.pt2sec(selpoint_, sec) + sec.raw.getcol(i, rawsel) + } + selpoint_dependent_show() + pl() + if ($1 == 1) { + swc.label(selpoint_, tstr) + print tstr + } +} + +proc zoom() {local x1,y1,scale,w,h,x0,y0 + if ($1 == 2) { + i = g.view_info() + x = $2 + y = $3 + xrel=g.view_info(i, 11, $2) + yrel=g.view_info(i, 12, $3) + width=g.view_info(i,1) + height=g.view_info(i,2) + } + if ($1 == 1) { + x1 = g.view_info(i, 11, $2) + y1 = g.view_info(i, 12, $3) + y1 = (y1 - yrel) + (x1 - xrel) + if(y1 > 2) { y1 = 2 } else if (y1 < -2) { y1 = -2 } + scale = 10^(y1) + w = width/scale + h = height/scale + x0 = x - w*xrel + y0 = y - h*yrel + g.view_size(i, x0, x0+w, y0, y0+h) + } +} + +proc translate() {local x0,y0 + if ($1 == 2) { + i = g.view_info() + x = g.view_info(i, 5) + y = g.view_info(i, 7) + xrel=g.view_info(i, 11, $2) + yrel=g.view_info(i, 12, $3) + width=g.view_info(i,1) + height=g.view_info(i,2) + } + if ($1 == 1) { + x1 = g.view_info(i, 11, $2) + y1 = g.view_info(i, 12, $3) + x0 = x - width*(x1 - xrel) + y0 = y - height*(y1 - yrel) + g.view_size(i, x0, x0 + width, y0, y0 + height) + } +} + +func nearest_point() { local i, j, xmin localobj m, v1 + // return section index and sectionpoint index in $3 and $4 + xmin = 1e9 + for i=0, swc.sections.count-1 { + m = swc.sections.object(i).xyz + v1 = m.getrow(0).sub($1).pow(2).add(m.getrow(1).sub($2).pow(2)) + j = v1.min_ind + if (v1.x[j] < xmin) { + xmin = v1.x[j] + $&3 = i + $&4 = j + } + } + return xmin +} + +proc rotate() {local x, y, x0, y0, len, a + if ($1 == 2) { + rotated_ = 1 + nearest_point($2, $3, &i, &j) + swc.sections.object(i).xyz.getcol(j, origin) + swc.sections.object(i).raw.getcol(j, raworigin) +//print i, j origin.printf + i = g.view_info() + xpix = g.view_info(i,13, $2) + ypix = g.view_info(i, 14, $3) // from top + left = g.view_info(i, 5) + bottom = g.view_info(i, 7) + width=g.view_info(i,1) + height=g.view_info(i,2) + }else{ + x = g.view_info(i,13, $2) - xpix + y = ypix - g.view_info(i, 14, $3) + // rotation axis is normal to the line, rotation magnitude + // proportional to length of line + len = sqrt(x*x + y*y) + // rotation axis angle + if (len > 0) { + a = atan2(x, y) + b = len/50 + }else{ + a = 0 + b = 0 + } + rot(a, b) + pl() + tobj = rotmat.mulv(origin) + //tobj.x[0] should be at same place as origin.x[0] + x0 = left - origin.x[0] + tobj.x[0] + y0 = bottom - origin.x[1] + tobj.x[1] + g.view_size(i, x0, x0 + width, y0, y0 + height) + + } + if ($1 == 3) { + m2.c(rotmatold) +//rotmatold.printf + } +} + +proc rotraw() {local x0, y0 + width = g.view_info(0, 1) + height = g.view_info(0, 2) + left = g.view_info(0,5) + bottom = g.view_info(0,7) + if (rotated_ == 0) { //turn off + rotmatold.c(rotsav) + tobj = rotmatold.mulv(raworigin) + //tobj.x[0] should be at same place as origin.x[0] + x0 = left + raworigin.x[0] - tobj.x[0] + y0 = bottom + raworigin.x[1] - tobj.x[1] + rotmatold.ident + }else{ // back to previous rotation + rotsav.c(rotmatold) + tobj = rotmatold.mulv(raworigin) + //tobj.x[0] should be at same place as origin.x[0] + x0 = left - raworigin.x[0] + tobj.x[0] + y0 = bottom - raworigin.x[1] + tobj.x[1] + } + rot(0,0) + pl() + g.view_size(0, x0, x0 + width, y0, y0 + height) +} + +proc rot45() { + rot(PI/2, PI/4) + rotated_=1 + m2.c(rotmatold) + pl() + dummy_ = 0 +} + +proc rot() {local s, c, i localobj sec + s = sin($1) c = cos($1) + m2.zero + m2.x[2][2] = 1 + m2.x[1][1] = m2.x[0][0] = c + m2.x[1][0] = -s + m2.x[0][1] = s +//m2.printf + s = sin($2) c = cos($2) + rotmat.zero + rotmat.x[0][0] = 1 + rotmat.x[1][1] = rotmat.x[2][2] = c + rotmat.x[1][2] = s + rotmat.x[2][1] = -s +//rotmat.printf + + m2.mulm(rotmat).mulm(m2.transpose(m2), rotmat) + rotmat.mulm(rotmatold, m2) +//rotmat.printf + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + sec.rotate(m2) + } +} + +proc cbexport() {local i, j, k localobj sec, cell + chk_valid() + j = 0 + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.is_subsidiary) { continue } + if (sec.parentsec == nil) { + sec.volatile2 = j + j += 1 + }else{ + sec.volatile2 = sec.parentsec.volatile2 + } + } + cell = new List() + for k=0, j-1 { + cell.remove_all() + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.is_subsidiary) { continue } + if (sec.volatile2 == k) { + cell.append(sec) + } + } + cbexport1(cell) + } +} + +proc sphere_rep() { local i localobj x, y, z, d + x = new Vector(3) y = x.c z = x.c d = x.c + x.fill($o1.x[0]) + y.fill($o2.x[0]) + z.fill($o3.x[0]) + d.fill($o4.x[0]) + x.x[0] -= $o4.x[0]/2 + x.x[2] += $o4.x[0]/2 + $o1 = x $o2 = y $o3 = z $o4 = d +} + +proc cbexport1() {local i, j, k, min localobj cb, sec, psec, cbsec, slist, m, subsetindex, xx, yy, zz, dd + for i=0, $o1.count-1 { + sec = $o1.object(i) + sec.volatile = i + } + min = set_nameindex($o1) + cb = new CellBuild() + cb.topol.names_off = 1 + cb.topol.circles_off = 1 + slist = cb.topol.slist + slist.remove_all() + for i=0, $o1.count-1 { + sec = $o1.object(i) + psec = nil + if (sec.parentsec != nil) { + psec = slist.object(sec.parentsec.volatile) + } + type2name(sec.type, tstr) + cbsec = new CellBuildSection(tstr, sec.nameindex, 0, psec, sec.parentx) + slist.append(cbsec) + m = sec.raw + j = sec.first + xx = m.getrow(0).c(j) + yy = m.getrow(1).c(j) + zz = m.getrow(2).c(j) + dd = sec.d.c(j) + if (sec.iscontour_) { + contour2centroid(xx, yy, zz, dd, sec) + } + if (sec.parentsec == nil && dd.size == 1) { + // represent spherical soma as 3 point cylinder + // with L=diam + sphere_rep(xx, yy, zz, dd) + } + k = dd.size-1 + cbsec.position(xx.x[0], yy.x[0], xx.x[k], yy.x[k]) + cbsec.i3d = k+1 + cbsec.p3d = new P3D(k + 1) + cbsec.p3d.x = xx + cbsec.p3d.y = yy + cbsec.p3d.z = zz + cbsec.p3d.d = dd + if (sec.first == 1) { + cbsec.logstyle(m.x[0][0], m.x[1][0], m.x[2][0]) + } + cb.all.add(cbsec) + } + cb.topol.consist() + cb.topol.update() + cb.subsets.update() + subsetindex = types.c.fill(0) + k = 0 + for i=0, types.size-1 { + if (types.x[i] > 0) { + k += 1 // after all + subsetindex.x[i] = k + j = i + min + if (j == 1) { + tstr = "somatic" + }else if (j == 2) { + tstr = "axonal" + }else if (j == 3) { + tstr = "basal" + }else if (j == 4) { + tstr = "apical" + }else if (j < 0) { + sprint(tstr, "minus_%dset", -j) + }else{ + sprint(tstr, "dendritic_%d", j) + } + m = new SNList(tstr) + cb.subsets.snlist.append(m) + } + } + for i=0, slist.count-1 { + sec = $o1.object(i) + cbsec = slist.object(i) + cb.subsets.snlist.object(subsetindex.x[sec.type-min]).add(cbsec) + } + //cb.page(2) //unfortunately not able to blacken the radiobutton +} + +func set_nameindex() {local i, min localobj sec + min = swc.type.min + types = new Vector(swc.type.max - min + 1) + for i = 0, $o1.count-1 { + sec = $o1.object(i) + if (sec.is_subsidiary) { continue } + sec.nameindex = types.x[sec.type - min] + types.x[sec.type-min] += 1 + } + return min +} + +proc instantiate() {local i, j, min, haspy localobj sec, xx, yy, zz, dd, pyobj + chk_valid() + haspy = nrnpython("import neuron") + if (haspy) { + pyobj = new PythonObject() + } + min = set_nameindex(swc.sections) + // create + for i = 0, types.size-1 { + type2name(i+min, tstr) + if (types.x[i] == 1) { + sprint(tstr1, "~create %s[1]\n", tstr) + execute(tstr1, $o1) + }else if (types.x[i] > 1) { + sprint(tstr1, "~create %s[%d]\n", tstr, types.x[i]) + execute(tstr1, $o1) + } + if ($o1 != nil) { mksubset($o1, i+min, tstr) } + } + if ($o1 != nil) {execute("forall all.append", $o1) } + // connect + for i = 0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.is_subsidiary) { continue } + name(sec, tstr) + if (i == 0) { + sprint(tstr1, "access %s", tstr) + if ($o1 == nil) { + execute(tstr1, $o1) + } + } + if (sec.parentsec != nil) { + name(sec.parentsec, tstr1) + sprint(tstr1, "%s connect %s(0), %g", tstr1, tstr, sec.parentx) + execute(tstr1, $o1) + } + // 3-d point info + if (sec.first == 1) { + sprint(tstr1, "%s { pt3dstyle(1, %g, %g, %g) }", tstr, sec.raw.x[0][0], sec.raw.x[1][0], sec.raw.x[2][0]) + execute(tstr1, $o1) + } + j = sec.first + xx = sec.raw.getrow(0).c(j) + yy = sec.raw.getrow(1).c(j) + zz = sec.raw.getrow(2).c(j) + dd = sec.d.c(j) + if (sec.iscontour_) { + if (haspy) { + pyobj.neuron._declare_contour(sec, tstr) + } + contour2centroid(xx, yy, zz, dd, sec) + } + if (dd.size == 1) { sphere_rep(xx, yy, zz, dd) } + for j = 0, dd.size-1 { + sprint(tstr1, "%s { pt3dadd(%g, %g, %g, %g) }",\ + tstr,xx.x[j], yy.x[j], zz.x[j], dd.x[j]) + execute(tstr1, $o1) + } + } +} + +proc chk_valid() {local i, x, replot localobj sec + replot = 0 + // some validity checks added in response to experienced file errors + // sometimes we can work around them + + // two point sections with 0 length, remove, unless root + for (i=swc.sections.count-1; i >= 0; i -= 1) { + sec = swc.sections.object(i) + if (sec.parentsec == nil) { continue } + if ((sec.raw.ncol - sec.first) <= 1) { + if (!quiet) {// addded by Sergey to suppress the warning output + printf("One point section %s ending at line %d has been removed\n", sec, swc.iline.x[swc.id2line(sec.id)]) + } + rm0len(i, sec) + replot = 1 + }else if ((sec.raw.ncol - sec.first) <= 2) { + if (sec.raw.getcol(sec.first).eq(sec.raw.getcol(sec.first + 1))) { + printf("Two point section ending at line %d with 0 length has been removed\n", swc.iline.x[swc.id2line(sec.id)]) + rm0len(i, sec) + replot = 1 + } + } + } + if (replot && g != nil) { + redraw() + } +} + +proc rm0len() {local i localobj sec + swc.sections.remove($1) + for i=$1, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.parentsec == $o2) { + sec.parentsec = $o2.parentsec + sec.parentx = $o2.parentx + if (!quiet) {// addded by Sergey to suppress the warning output + printf("\tand child %s reattached\n", sec) + } + } + } +} + +proc mksubset() { + if ($2 == 1) { + tstr1 = "somatic" + }else if ($2 == 2) { + tstr1 = "axonal" + }else if ($2 == 3) { + tstr1 = "basal" + }else if ($2 == 4) { + tstr1 = "apical" + }else if ($2 < 0) { + sprint(tstr1, "minus_%dset", -$2) + }else{ + sprint(tstr1, "dendritic_%d", $2) + } + sprint(tstr1, "forsec \"%s\" %s.append", $s3, tstr1) + execute(tstr1, $o1) +} + +proc contour2centroid() {local i, j, imax, imin, ok localobj mean, pts, d, max, min, tobj, rad, rad2, side2, pt, major, m, minor + if (object_id($o5.contour_list)) { + contourstack2centroid($o1, $o2, $o3, $o4, $o5) + return + } + mean = swc.sections.object(0).contourcenter($o1, $o2, $o3) + if (g != nil) { + g.beginline(6,1) + for i=0, $o1.size-1 { + g.line($o1.x[i], $o2.x[i]) + } + g.flush() + } + pts = new Matrix(3, $o1.size) + for i=1,3 { pts.setrow(i-1, $oi.c.sub(mean.x[i-1])) } + // find the major axis of the ellipsoid that best fits the shape + // assuming (falsely in general) that the center is the mean + + m = new Matrix(3,3) + for i=0, 2 { + for j=i, 2 { + m.x[i][j] = pts.getrow(i).mul(pts.getrow(j)).sum + m.x[j][i] = m.x[i][j] + } + } + tobj = m.symmeig(m) + // major axis is the one with largest eigenvalue + major = m.getcol(tobj.max_ind) + // minor is normal and in xy plane + minor = m.getcol(3-tobj.min_ind-tobj.max_ind) + minor.x[2] = 0 + minor.div(minor.mag) +if (g != nil) { +g.beginline(4, 3) g.line(mean.x[0], mean.x[1]) +g.line(mean.x[0] + 20*major.x[0], mean.x[1] + 20*major.x[1]) g.flush +} + d = new Vector(pts.ncol) + rad = new Vector(pts.ncol) + for i=0, pts.ncol-1 { + pt = pts.getcol(i) + d.x[i] = pt.dot(major) // position on the line + tobj = major.c.mul(d.x[i]) + rad.x[i] = pt.dot(minor) + } + imax = d.max_ind + d.rotate(-imax) + rad.rotate(-imax) + imin = d.min_ind + side2 = d.c(imin) + rad2 = rad.c(imin) + d.resize(imin).reverse + rad.resize(imin).reverse + // now we have the two sides without the min and max points (rad=0) + // we hope both sides now monotonically increase, i.e. convex + // make it convex + for (j = d.size-1; j > 0; j -= 1) { + if (d.x[j] <= d.x[j-1]) { +//printf("removed d %d %g\n", j, d.x[j]) + d.remove(j) + rad.remove(j) + if (j != d.size()) { j += 1 } + } + } + for (j = side2.size-1; j > 0; j -= 1) { + if (side2.x[j] <= side2.x[j-1]) { +//printf("removed side2 %d %g\n", j, side2.x[j]) + side2.remove(j) + rad2.remove(j) + if (j != side2.size()) { j += 1 } + } + } + // can interpolate so diams on either side of major have same d + tobj = d.c.append(side2) + tobj.sort + i = tobj.x[1] j = tobj.x[tobj.size-2] + tobj.indgen(i, j, (j-i)/20) + rad.interpolate(tobj, d) + rad2.interpolate(tobj,side2) + d = tobj + pts.resize(3, d.size) + $o4.resize(d.size) + for i = 0, d.size-1 { + pt = major.c.mul(d.x[i]).add(mean) + $o4.x[i] = abs(rad.x[i] - rad2.x[i]) + tobj = pt.c.add(minor.c.mul(rad.x[i])) +if (g != nil) g.beginline(5,3) g.line(tobj.x[0], tobj.x[1]) + tobj = pt.c.add(minor.c.mul(rad2.x[i])) +if (g != nil) g.line(tobj.x[0], tobj.x[1]) g.flush +// pt.add(minor.c.mul(rad2.x[i])).add(minor.c.mul(rad.x[i])) + pts.setcol(i, pt) + } + // avoid 0 diameter ends + $o4.x[0] = ($o4.x[0]+$o4.x[1])/2 + i = $o4.size-1 + $o4.x[i] = ($o4.x[i]+$o4.x[i-1])/2 + for i=1,3 { $oi = pts.getrow(i-1) } +// print d d.printf print rad rad.printf +// print side2 side2.printf print rad2 rad2.printf +} + +proc contourstack2centroid() {local i, j, area, d localobj c + area = $o5.stk_triang_area() + printf("stk_triang_area = %g\n", area) + for i=1,4 { $oi.resize(0) } + c = $o5.approximate_contour_by_circle(&d) + $o4.append(d) for i=1,3 { $oi.append(c.x[i-1]) } + for j=0, $o5.contour_list.count-1 { + c = $o5.contour_list.object(j).approximate_contour_by_circle(&d) + $o4.append(d) for i=1,3 { $oi.append(c.x[i-1]) } + } +} + +proc name() { + type2name($o1.type, $s2) + if ($o1.nameindex > 0) { + sprint($s2, "%s[%d]", $s2, $o1.nameindex) + } +} + +proc type2name() { + if ($1 == 1) { + $s2 = "soma" + }else if ($1 == 2) { + $s2 = "axon" + }else if ($1 == 3) { + $s2 = "dend" + }else if ($1 == 4) { + $s2 = "apic" + }else if ($1 < 0) { + sprint($s2, "minus_%d", -$1) + }else{ + sprint($s2, "dend_%d", $1) + } +} +endtemplate Import3d_GUI diff --git a/bmtk-vb/bmtk/simulator/bionet/import3d/import3d_sec.hoc b/bmtk-vb/bmtk/simulator/bionet/import3d/import3d_sec.hoc new file mode 100644 index 0000000..01b0b2d --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/import3d/import3d_sec.hoc @@ -0,0 +1,392 @@ +begintemplate Import3d_Section +// primarily for display. Allows gui without instantiating sections +// fid refers to the raw index of the point that id refers to. +// For a root section fid is normally 0. For sections that have +// parents, fid is normally 1 since the first point is often a copy of +// the last point of the parent. +// The variable first=0 means that when diam is shown, there +// should be a glyph drawn defined by raw indices 0 and 1. +// if this is a contour it may also contain a list of contours that +// define a 3-d object +public raw, xyz, d, id, append, g, mkglyph, rotate, type, centroid_color +public iscontour_, pid, parentsec, parentx, volatile, nameindex, first, fid +public contour_list, pl_centroid, pl_diam +public stk_triang_vec, stk_triang_area, is_subsidiary +public volatile2, contourcenter, ztrans, approximate_contour_by_circle +public pl_point, insrt, set_pt, stk_center, accurate_triangle_area +objref raw, xyz, d, g, parentsec, contour_list, this, stk_triang_vec +proc init() { + is_subsidiary = 0 + ztrans = 0 + first = 0 + fid = 0 + nameindex=0 + parentx = 1 + volatile = 0 + volatile2 = 0 + pid = -1 + iscontour_ = 0 + type = 0 + centroid_color = 2 + id = $1 + raw = new Matrix(3, $2) + xyz = new Matrix(3, $2) + d = new Vector($2) +} +proc set_pt() { + raw.x[0][$1] = $2 + raw.x[1][$1] = $3 + raw.x[2][$1] = $4 + d.x[$1] = $5 +} + +proc append() {local i, j + for i=0, $3-1 { + j = $1 + i + k = $2 + i + set_pt(j, $o4.x[k], $o5.x[k], $o6.x[k], $o7.x[k]) + } +} + +proc insrt() {local i, nr, nc + nr = raw.nrow nc = raw.ncol + d.resize(nc+1) + raw.resize(nr, nc+1) + xyz.resize(nr, nc+1) + for (i=nc-1; i >= $1; i -= 1) { + raw.setcol(i+1, raw.getcol(i)) + d.x[i+1] = d.x[i] + } + set_pt($1, $2, $3, $4, $5) +} + +proc pl_centroid() {local i, n + xyz.getrow(1).line($o1, xyz.getrow(0), centroid_color, 1) + if (iscontour_) { + n = xyz.ncol - 1 + $o1.beginline(centroid_color, 1) + $o1.line(xyz.x[0][0], xyz.x[1][0]) + $o1.line(xyz.x[0][n], xyz.x[1][n]) + } + if (0) { + if (object_id(contour_list)) { + for i=0, contour_list.count-1 { + contour_list.object(i).pl_centroid($o1) + } + } + } +} + +proc pl_diam() {local i + if (!iscontour_) { + mkglyph() + $o1.glyph(g, 0, 0) + }else{ + if (object_id(contour_list)) { + if (!object_id(contour_list.object(0).stk_triang_vec)) { + mk_stk_triang_vec(this, contour_list.object(0)) + for i=1, contour_list.count-1 { + mk_stk_triang_vec(contour_list.object(i-1), contour_list.object(i)) + } + } + pl_stk_triang($o1, this, contour_list.object(0)) + for i=1, contour_list.count-1 { + pl_stk_triang($o1, contour_list.object(i-1), contour_list.object(i)) + } + } + } +} + +proc pl_point() {local i + for i=first, xyz.ncol-1 { + $o1.mark(xyz.x[0][i], xyz.x[1][i], "s", 5, 3, 1) + } + if (object_id(parentsec) == 0) { + $o1.mark(xyz.x[0][0], xyz.x[1][0], "S", 8, 3, 1) + } + if (0) { + if (object_id(contour_list)) { + for i=0, contour_list.count-1 { + contour_list.object(i).pl_point($o1) + } + } + } +} + +proc mkglyph() {local i, d1, d2 localobj x, y, norm, x1, y1, i1 + g = new Glyph() + if (xyz.ncol - first < 1) { return } + // normal + x1 = xyz.getrow(0) + y1 = xyz.getrow(1) + if (xyz.ncol - first == 1) { + // render as spherical + g.circle(x1.x[0], y1.x[0], d.x[0]/2) + g.fill(1) + return + } + // may or may not want to include parent point in glyph + x = x1.c(first).deriv(1,1) + y = y1.c(first).deriv(1,1) + // point separations + norm = x.c.mul(x).add(y.c.mul(y)).sqrt.mul(2) // d is diam, need radius + // only want frustra for the non-zero separations + i1=norm.c.indvwhere("!=", 0) + if (i1.size == 0) { +// printf("Section with id=%d has 0 length in this projection\n", id) + return + } + norm.index(norm, i1) + x.index(x, i1).div(norm) + y.index(y, i1).div(norm) + + // but take care of the possible index offset due to missing parent point + if (first) { i1.add(first) } + i1.append(x1.size-1) + x1.index(x1, i1) + y1.index(y1, i1) + + for i = 0, x.size-1 { + d1 = d.x[i1.x[i]] d2=d.x[i1.x[i]+1] + g.path() + g.m(x1.x[i]+y.x[i]*d1, y1.x[i]-x.x[i]*d1) + g.l(x1.x[i+1]+y.x[i]*d2, y1.x[i+1]-x.x[i]*d2) + g.l(x1.x[i+1]-y.x[i]*d2, y1.x[i+1]+x.x[i]*d2) + g.l(x1.x[i]-y.x[i]*d1, y1.x[i]+x.x[i]*d1) + g.close() + g.fill(1) + } +} + +proc rotate() { + $o1.mulm(raw, xyz) + if (1) { + if (object_id(contour_list)) { + for i=0, contour_list.count-1 { + contour_list.object(i).rotate($o1) + } + } + } +} + + +// a utility function +obfunc contourcenter() {local i localobj mean, pts, perim, d + // convert contour defined by $o1, $o2, $o3 vectors to + // 100 uniform points around perimeter + // and return the center coordinates as well as the uniform contour + // vectors (in $o1, $o2, $o3) + pts = new Matrix(3, $o1.size) + for i=1,2 { pts.setrow(i-1, $oi) } + for i=0,2 {pts.setrow(i, pts.getrow(i).append(pts.x[i][0]).deriv(1,1)) } + perim = new Vector(pts.ncol) + for i=1, pts.ncol-1 { perim.x[i] = perim.x[i-1] + pts.getcol(i-1).mag } + d = new Vector(101) + d.indgen(perim.x(perim.size-1)/100) + for i=1,3 $oi.interpolate(d, perim) + mean = new Vector(3) + for i=1, 3 { mean.x[i-1] = $oi.mean } + return mean +} + +// return center (Vector.size=3) and average diameter in $&1 +obfunc approximate_contour_by_circle() {local i,n, perim localobj center, x, y, z + x=raw.getrow(0) + y=raw.getrow(1) + z=raw.getrow(2) + perim = 0 + n = x.size + for i = 0, n-1 { + perim += edgelen(raw.getcol(i), raw.getcol((i+1)%n)) + } + center = contourcenter(x, y, z) + if (0) { + $&1 = perim/PI + }else{ + x.sub(center.x[0]).mul(x) + y.sub(center.x[1]).mul(y) + z.sub(center.x[2]).mul(z) +// $&1 = 2*x.add(y).add(z).sqrt.mean + // average of radius based on perim and mean radius of all points + $&1 = x.add(y).add(z).sqrt.mean + perim/(2*PI) + } +// printf("%g %g %g %g\n", center.x[0], center.x[1], center.x[2], $&1) +// printf("perimeter approx = %g actual = %g\n", PI*$&1, perim) + return center +} + +proc mk_stk_triang_vec() {local i, j, n1, n2, d1, d2 localobj i1, i2, trv + trv = new Vector() + $o2.stk_triang_vec = trv + // contour indices are chosen so points 0 cross 1 of a contour from center + // are in +z direction and points 0 between the two contours are + // guaranteed to be an edge. An extra index added to end to close the polygon + // I suppose this could fail if angle does not increase monotonically + stk_contour_indices($o1, i1, $o1.raw.getcol(0)) + stk_contour_indices($o2, i2, $o1.raw.getcol(0)) + i = 0 j = 0 + n1 = i1.size-1 + n2 = i2.size-1 + while(i < n1 || j < n2) { + trv.append(i1.x[i], i2.x[j]) + if (i < n1 && j < n2) { + // which next one is shorter + d1 = ($o1.raw.x[0][i1.x[i]] - $o2.raw.x[0][i2.x[j+1]])^2 + ($o1.raw.x[1][i1.x[i]] - $o2.raw.x[1][i2.x[j+1]])^2 + d2 = ($o1.raw.x[0][i1.x[i+1]] - $o2.raw.x[0][i2.x[j]])^2 + ($o1.raw.x[1][i1.x[i+1]] - $o2.raw.x[1][i2.x[j]])^2 + if (d2 < d1) { + i += 1 + }else{ + j += 1 + } + }else{ + if (i < n1) { + i += 1 + }else{ + j += 1 + } + } + } + trv.append(i1.x[i], i2.x[j]) +} + +proc stk_contour_indices() {local i, d, dmin, imin localobj c, x, y, z + $o2 = new Vector($o1.raw.ncol) + $o2.indgen() + // order the points counterclockwise. ie 0 cross 1 in -z direction + x = $o1.raw.getrow(0) + y = $o1.raw.getrow(1) + z = $o1.raw.getrow(2) + c = contourcenter(x, y, z) + x = $o1.raw.getcol(0).sub(c) + y = $o1.raw.getcol(1).sub(c) + if (x.x[0]*y.x[1] - x.x[1]*y.x[0] > 0) { + $o2.reverse() + } + + // which point is closest to $o3 + imin = -1 + dmin = 1e9 + for i=0, $o2.size - 1 { + d = edgelen($o1.raw.getcol($o2.x[i]), $o3) + if (d < dmin) { + dmin = d + imin = i + } + } + $o2.rotate(-imin) + + $o2.append($o2.x[0]) +} + +proc pl_stk_triang() {local i, j localobj g, m1, m2, trv + g = $o1 + m1 = $o2.xyz + m2 = $o3.xyz + trv = $o3.stk_triang_vec + for i=0, trv.size-1 { + g.beginline(centroid_color, 1) + j = trv.x[i] + g.line(m1.x[0][j], m1.x[1][j]) + i += 1 + j = trv.x[i] + g.line(m2.x[0][j], m2.x[1][j]) + } +} + +func edgelen() { + return sqrt($o1.c.sub($o2).sumsq) +} + +func stk_triang_area1() {local area, i, i1, i2, j1, j2, a, b, c, na localobj m1, m2, trv + area = 0 + m1 = $o1.raw + m2 = $o2.raw + trv = $o2.stk_triang_vec + i1 = trv.x[0] + i2 = trv.x[1] + a = edgelen(m1.getcol(i1), m2.getcol(i2)) + na = 0 + for i=2, trv.size-1 { + j1 = trv.x[i] + i += 1 + j2 = trv.x[i] + b = edgelen(m1.getcol(j1), m2.getcol(j2)) + + // which contour for side c + if (i1 == j1) { + c = edgelen(m2.getcol(i2), m2.getcol(j2)) + }else{ + c = edgelen(m1.getcol(i1), m1.getcol(j1)) + } + + area += accurate_triangle_area(a, b, c) + na += 1 + i1 = j1 + i2 = j2 + a = b + } +//printf("stk_triang_area1 na=%d npoints=%d\n", na, m1.ncol+m2.ncol) + // missing one triangle + return area +} + +func stk_triang_area() {local area, i + area = stk_triang_area1(this, contour_list.object(0)) + for i=1, contour_list.count-1 { + area += stk_triang_area1(contour_list.object(i-1), contour_list.object(i)) + } + return area +} + +// the center of the centroid of the contour stack +obfunc stk_center() {local i, len, th localobj c, centroid, x, y, z, r, lenvec + centroid = new Matrix(3, 1 + contour_list.count) + lenvec = new Vector(centroid.ncol) lenvec.resize(1) + x = raw.getrow(0) + y = raw.getrow(1) + z = raw.getrow(2) + c = contourcenter(x, y, z) + centroid.setcol(0, c) + len = 0 + for i=0, contour_list.count-1 { + r = contour_list.object(i).raw + x = r.getrow(0) + y = r.getrow(1) + z = r.getrow(2) + c = contourcenter(x, y, z) + centroid.setcol(i+1, c) + + len += sqrt(c.sub(centroid.getcol(i)).sumsq) + lenvec.append(len) + } + len = len/2 + if (len == 0) { + c = centroid.getcol(0) + return c + } + i = lenvec.indwhere(">", len) + th = (len - lenvec.x[i-1])/(lenvec.x[i] - lenvec.x[i-1]) + for j=0, 2 { + c.x[j] = th*centroid.x[j][i] + (1 - th)*centroid.x[j][i-1] + } + return c +} + +func accurate_triangle_area() {local x localobj a + // from http://http.cs.berkeley.edu/~wkahan/Triangle.pdf + // W. Kahan + x = float_epsilon + float_epsilon = 0 + a = new Vector(3) a.resize(0) + a.append($1, $2, $3).sort + if ((a.x[0] - (a.x[2] - a.x[1])) < 0) { + float_epsilon = x + execerror("accurate_triangle_area:","not a triangle") + } + float_epsilon = x + x = .25*sqrt((a.x[2]+(a.x[1]+a.x[0])) * (a.x[0]-(a.x[2]-a.x[1])) \ + * (a.x[0]+(a.x[2]-a.x[1])) * (a.x[2]+(a.x[1]-a.x[0]))) + return x +} + +endtemplate Import3d_Section diff --git a/bmtk-vb/bmtk/simulator/bionet/import3d/read_morphml.hoc b/bmtk-vb/bmtk/simulator/bionet/import3d/read_morphml.hoc new file mode 100644 index 0000000..c6801b4 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/import3d/read_morphml.hoc @@ -0,0 +1,78 @@ + +begintemplate Import3d_MorphML +public input, filetype, type, sections, err, parsed +public pt2id, id2pt, pt2sec, sec2pt, label, id2line +objref type, sections, this, p, nil +objref cables, points, cableid2index +strdef filetype, tstr +proc init() { + nrnpython("from neuron.neuroml.rdxml import rdxml") + //print "Import3d_MorphML" + filetype = "MorphML" + p = new PythonObject() +} +proc input() { + //print "Import3d_MorphML.input" + type = new Vector() + sections = new List(1000) + err = 0 + p.rdxml($s1, this) +} +proc parsed() {local i, j, ip, jp localobj cab, sec, pt + cables = $o1.cables_ + points = $o1.points_ + cableid2index = $o1.cableid2index_ + // ptid2pt = $o1.ptid2pt_ + //print $o1, cables.__len__() + for i=0, cables.__len__() - 1 { + cab = cables._[i] + sec = new Import3d_Section(cab.first_, cab.pcnt_) + sections.append(sec) + if (cab.parent_cable_id_ >= 0) { + ip = $o1.cableid2index_[cab.parent_cable_id_] + sec.parentsec = sections.object(ip) + sec.parentx = cab.px_ + } + //print i, cab.id_, cab.name_ + for j=0, cab.pcnt_ - 1 { + jp = cab.first_ + j + pt = points._[jp] + sec.set_pt(j, pt.x_, pt.y_, pt.z_, pt.d_) + } + } +} +func pt2id() { + //print "pt2id ", $1 + if ($1 < 0) { return 0 } + if ($1 >= points.__len__()) { return points.__len__() - 1 } + return $1 +} +func id2pt() { + //print "id2pt ", $1 + return $1 +} +func pt2sec() {local cid, cindex + //print "pt2sec ", $1, " cid=", points._[$1].cid_ + cid = points._[$1].cid_ + cindex = cableid2index._[cid] + //print " cindex=", cindex, " first=", cables._[cindex].first_ + $o2 = sections.object(cindex) + //printf("pt2sec %s\n", $o2) + return $1 - cables._[cindex].first_ +} +func sec2pt() {local i localobj sec + sec = sections.object($1) + //print "sec2pnt ", $1, $2, " secid=", sec.id, " cabid=", cables._[$1].id_ + i = sec.id + $2 - sec.fid + return i +} +func id2line() { + //print "id2line ", $1 + return $1 +} +proc label() {localobj pt + pt = points._[$1] + sprint($s2, "pt[%d] Line %d x=%g y=%g z=%g d=%g", $1, pt.lineno_, pt.x_, pt.y_, pt.z_, pt.d_) +} +endtemplate Import3d_MorphML + diff --git a/bmtk-vb/bmtk/simulator/bionet/import3d/read_nlcda.hoc b/bmtk-vb/bmtk/simulator/bionet/import3d/read_nlcda.hoc new file mode 100644 index 0000000..9a8e450 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/import3d/read_nlcda.hoc @@ -0,0 +1,550 @@ +// Assume that except for soma, the move and line items form a tree +// where, generally, a move is at the same point of the line to which +// it is connected. Under this assumption, all major codes except 1 and 2 +// can be ignored. +// An exception is the [10,5] code for branch point. The next point +// is generally a line (not a move) with the same x,y,z of the branch point. + +begintemplate Import3d_Neurolucida_read +public input, pheader +public type, x, y, z, d, iline, header, point2sec, sections, lines +public label, id2pt, id2line, pt2id, pt2sec, sec2pt, file, filetype, err +public points, pointtype, branchpoints, firstpoints +public helptxt, iline2pt, mark, fillproblist +external hoc_sf_ +objref major, minor, x, y, z, d, iline, header, lines, iline2sec +objref type, pointtype, points, iline2pt +objref file, vectors, sec2point, point2sec, sections +objref firstpoints, branchpoints +objref cursec, diam, nil, gm +objref line_branch_err, parse_err, xyparent_err, xynotnearest_err, noparent_err +objref line_coincide_err, line_branch_err_pt, somabbox_err +strdef tstr, line, filetype +double a[7] + +proc init() { + filetype = "Neurolucida" + vectors = new List() + header = new List() + lines = new List() + gm = new GUIMath() +} + +proc input() { + err = 0 + line_branch_err = new List() + parse_err = new List() + xyparent_err = new List() + xynotnearest_err = new List() + noparent_err = new List() + line_coincide_err = new List() + somabbox_err = new List() + line_branch_err_pt = new Vector() + + rdfile($s1) + find_parents() + repair_diam() + connect2soma() + if (err) { errout() } +} + +proc repair_diam() {local i localobj sec + // I am told, and it seems the case, that + // the first point incorrectly always has the diameter of + // the last point of the previous branch. For this reason + // we set the diameter of the first point to the diameter + // of the second point in the section + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.parentsec != nil) { + if (sec.first < sec.d.size-1){ + sec.d.x[sec.first] = sec.d.x[sec.first + 1] + } + } + } +} + +proc rdfile() {local i, j + file = new File($s1) + // count lines for vector allocation space (not really necessary) + if (!file.ropen()) { + err = 1 + printf("could not open %s\n", $s1) + } + for (i = 0; !file.eof(); i += 1) { + file.gets(line) + } + file.close() +// printf("%s has %d lines\n", $s1, i) + alloc(i, major, minor, x, y, z, d, iline, pointtype, points) + diam = d + file.ropen() + for (i = 1; !file.eof(); i += 1) { + file.gets(line) + parse(i, line) + } + file.close() + iline2pt = new Vector(iline.x[iline.size-1]) + j = 0 + for i=0, points.size-2 { + while(j <= iline.x[points.x[i]]) { + iline2pt.x[j] = i + j += 1 + } + } + for j=j, iline2pt.size-1 { + iline2pt.x[j] = points.size-1 + } +} + +proc alloc() { local i // $oi.size = 0 but enough space for $1 elements + for i = 2, numarg() { + $oi = new Vector($1) + $oi.resize(0) + vectors.append($oi) + } +} + +func dist() {local x1, y1, z1 + x1 = ($1 - x.x[$4]) + y1 = ($2 - y.x[$4]) + z1 = ($3 - z.x[$4]) + return sqrt(x1*x1 + y1*y1 + z1*z1) +} + +func xydist() {local x1, y1 + x1 = (x.x[$1] - x.x[$2]) + y1 = (y.x[$1] - y.x[$2]) + return sqrt(x1*x1 + y1*y1) +} + +func xysame() { + if ($1 == x.x[$3]) { + if ($2 == y.x[$3]) { + return 1 + } + } + return 0 +} + +proc parse() {local i, n, m + n = sscanf($s2, "[%d,%d] (%f,%f,%f) %f", &a[0], &a[1], &a[2],\ + &a[3], &a[4], &a[5]) + hoc_sf_.left($s2, hoc_sf_.len($s2)-1) + if (n == 6) { + a[5] *= 2 + iline_ = major.size + if (a[0] == 1) { // line + m = major.x[iline_ - 1] + if (m == 10 && minor.x[iline_-1] == 5) { + pointtype.append(0) + points.append(iline_) + if (!xysame(a[2], a[3], iline_-1)) { + err = 1 + line_branch_err_pt.append(points.size-1) +sprint(tstr, "%d: %s separated by %g from branch",\ +$1, $s2, dist(a[2], a[3], a[4], iline_-1)) +line_branch_err.append(new String(tstr)) + } + }else if (m == 1 || m == 2) { + pointtype.append(1) + points.append(iline_) + }else{ + pointtype.append(1) + points.append(iline_) + } + }else if (a[0] == 2) { // move + pointtype.append(0) + points.append(iline_) + }else if (a[0] == 10 && a[1] == 5) { // branch + pointtype.append(2) + points.append(iline_) + }else{ + } + for i=0, 5 { + vectors.object(i).append(a[i]) + } + iline.append($1) // for error messages + lines.append(new String($s2)) + } else if (n == 0) { // comment + header.append(new String($s2)) + } else { + err = 1 + sprint(tstr, "%d: %s parse failure after item %d", $1, $s2, n) + parse_err.append(new String(tstr)) + } +} + +proc mark() {local i, a,b,c,d,e,f + print $o1, $2, iline, lines + i = iline.indwhere("==",$2) + printf("%d,%d: %s\n", i, iline.x[i], lines.object(i).s) + n = sscanf(lines.object(i).s, "[%d,%d] (%f,%f,%f) %f", &a,&b,&c,\ + &d,&e,&f) + if (n == 6) { + print a,b,c,d,e,f + $o1.mark(c,d,"S",12,4,1) + } +} + +proc pheader() {local i + for i=0, header.count-1 { + printf("%s", header.object(i).s) + } +} + +proc find_parents() {local i, j, m, ip, jp, jpmin, d, dmin, xi,yi,zi, bp, ip1 + // we need to associate all pointtype=0 with a branch point (except the + // ones conceptually connected to the soma + // assume the pid is earlier than the pointtype=0 + point2sec = points.c.fill(-1) + branchpoints = pointtype.c.indvwhere("==", 2) + firstpoints = pointtype.c.indvwhere("==", 0) + sections = new List() + type = firstpoints.c.fill(0) + for i=0, firstpoints.size-1 { + ip = points.x[firstpoints.x[i]] + newsec(i) + type.x[i] = cursec.type + xi = x.x[ip] yi = y.x[ip] zi = z.x[ip] + dmin = 1e9 + jpmin = -1 + m = minor.x[ip] + if (m == 41) { // soma start (contour + continue +/* some files use these as branch beginnings so check this after seeing if +there are coincident points. + }else if (m == 1) { // dendrite start + continue + }else if (m == 21) { // axon start + continue + }else if (m == 61) { // apical dendrite start + continue +*/ + } + if (line_branch_err_pt.size) { + j = line_branch_err_pt.x[0] + if (ip == points.x[j]) { + physcon(i, ip, ip-1, j-1) + line_branch_err_pt.remove(0) + continue + } + } + for j=0, branchpoints.size-1 { + jp = points.x[branchpoints.x[j]] + if (ip <= jp) { break } + d = dist(xi, yi, zi, jp) + if (d < dmin) { + bp = branchpoints.x[j] + dmin = d + jpmin = jp + } + } + if (dmin <= 0) { + cursec.parentsec = sections.object(point2sec.x[bp]) + }else if (m == 1) { // dendrite start + continue + }else if (m == 21) { // axon start + continue + }else if (m == 61) { // apical dendrite start + continue + }else{ + err = 1 +sprint(tstr, "%d: %s branch at line %d is %.4g away",\ +iline.x[ip], lines.object(ip).s, iline.x[jpmin], dmin) + d = xydist(ip, jpmin) + if (d <= 0) { // overlay branch point in xy plane? + xyparent_err.append(new String(tstr)) + physcon(i, ip, jpmin, bp) + }else if (ip > 0) { + // sometime it coincides with a previous LineTo + ip1 = firstpoints.x[i]-1 + d = dist(xi, yi, zi, points.x[ip1]) + if (d <= 0) { +sprint(tstr, "%s\n but coincides with line %d", tstr, iline.x[points.x[ip1]]) + line_coincide_err.append(new String(tstr)) + cursec.parentsec = sections.object(point2sec.x[ip1]) + }else if (try_xy_coincide(i, ip)){ + xynotnearest_err.append(new String(tstr)) + }else{ + noparent_err.append(new String(tstr)) + } + } + } + } +} + +func try_xy_coincide() {local j, jp, d + // sometimes it coincides in the xy plane with a branch point + // even though it is not the nearest point and therefore we + // assume that is the parent point + for j=0, branchpoints.size-1 { + jp = points.x[branchpoints.x[j]] + if ($2 <= jp) { break } + d = xydist($2, jp) + if (d <= 0) { +sprint(tstr, "%s\n but coincides with branch point at line %d", tstr, iline.x[jp]) + bp = branchpoints.x[j] + physcon($1, $2, jp, bp) + return 1 + } + } + return 0 +} + +proc physcon() { + cursec.parentsec = sections.object(point2sec.x[$4]) + cursec.insrt(0, x.x[$3], y.x[$3], z.x[$3], d.x[$2]) + cursec.id -= 1 +} + +proc newsec() {local i, ip, n, m, first, isec + first = firstpoints.x[$1] + ip = points.x[first] + if ($1 < firstpoints.size-1) { + n = firstpoints.x[$1+1] - first + }else{ + n = points.size - first + } + cursec = new Import3d_Section(first, n) + isec = sections.count + sections.append(cursec) + for i = 0, n-1 { + cursec.append(i, points.x[i+first], 1, x, y, z, d) + point2sec.x[i+first] = isec + } + m = minor.x[ip] + if (m == 1 || m == 2) { // dendrite + cursec.type = 3 + }else if (m == 21 || m == 22) { //axon + cursec.type = 2 + }else if (m == 41 || m == 42) { // soma + cursec.type = 1 + cursec.iscontour_ = 1 + }else if (m == 61 || m == 62) { // apdendrite + cursec.type = 4 + }else{ + err = 1 +printf("%s line %d: don't know section type: %s\n",\ + file.getname, iline.x[ip], lines.object(ip).s) + } +} + +proc connect2soma() {local i, ip, j, jp, bp, jpmin, dmin, d, xmin, xmax, ymin, ymax localobj soma, sec, xc, yc, zc, c, psec, r + // find centroid of soma if outline and connect all dangling + // dendrites to that if inside the contour + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.type == 1 && sec.iscontour_ == 1) { + soma = sec + sections.remove(i) + sections.insrt(0, soma) + break + } + } + if (soma == nil) { return } + xc = soma.raw.getrow(0) + yc = soma.raw.getrow(1) + zc = soma.raw.getrow(2) + xmin = xc.min-.5 xmax = xc.max + .5 + ymin = yc.min-.5 ymax = yc.max + .5 + c = soma.contourcenter(xc, yc, zc) + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.parentsec == nil && sec != soma) { + if (gm.inside(sec.raw.x[0][0], sec.raw.x[1][0], xmin, ymin, xmax, ymax)) { + sec.parentsec = soma + sec.parentx = .5 + sec.insrt(0, c.x[0], c.x[1], c.x[2], .01) + sec.id -= 1 + sec.first = 1 + }else{ + // is same as end point of earlier section? + ip = points.x[sec2pt(i, 0)] + d = 1e9 + for j=0, i-1 { + psec = sections.object(j) + jp = psec.d.size-1 + r = psec.raw + d = dist(r.x[0][jp], r.x[1][jp], r.x[2][jp], ip) + if (d == 0) { + sec.parentsec = psec + break + } + } + if (d == 0) { continue } + ip = points.x[sec2pt(i, 0)] + dmin = dist(c.x[0], c.x[1], c.x[2], ip) + jpmin = -1 + for j=0, branchpoints.size-1 { + jp = points.x[branchpoints.x[j]] + if (ip <= jp) { break } + d = dist(x.x[ip], y.x[ip], z.x[ip], jp) + if (d < dmin) { + bp = branchpoints.x[j] + dmin = d + jpmin = jp + } + } + err = 1 +sprint(tstr, "%d: %s is outside soma, logically connect to", iline.x[ip], lines.object(ip).s) + if (jpmin == -1) { + sprint(tstr, "%s soma", tstr) + sec.parentsec = soma + sec.insrt(0, c.x[0], c.x[1], c.x[2], .01) + sec.id -= 1 + }else{ + jp = jpmin + sprint(tstr, "%s %d", tstr, iline.x[jp]) + sec.parentsec = sections.object(point2sec.x[bp]) + sec.insrt(0, x.x[jp], y.x[jp], z.x[jp], .01) + sec.id -= 1 + } + sec.first = 1 + somabbox_err.append(new String(tstr)) + } + } + } +} + +// note selpoint defined in swc_gui.hoc as sec.id + j +// selpoint is the points index +// ie. the first points of the sections are firstpoints +proc label() {local i + i = points.x[$1] + sprint($s2, "Line %d: %s", iline.x[i], lines.object(i).s) +} +func id2pt() { + if ($1 < 0) { return -1 } + if ($1 >= iline2pt.size) { return iline2pt.x[iline2pt.size-1]} + return iline2pt.x[$1] +} +func id2line() { return points.x[$1] } +func pt2id() { + if ($1 < 0) {return -1} + return iline.x[points.x[$1]] +} +func pt2sec() {local i + i = firstpoints.indwhere(">", $1) + if (i == -1) { + i = firstpoints.size + } + $o2 = sections.object(i-1) + j = $1 - $o2.id + return j +} +func sec2pt() { +//print "sec2pt ", $1, $2, sections.object($1).id + return sections.object($1).id + $2 +} + +proc helptxt() { + xpanel("Neurolucida file filter characteristics") +xlabel(" The only lines utilized are [1,x], [2,x], and [5,10]. i.e , LineTo,") +xlabel("MoveTo, and Branch lines. ") +xlabel(" Sections generally consist of MoveTo followed by sequence of LineTo,") +xlabel("and possibly ending with Branch. Intervening lines of other major types") +xlabel("are ignored. ") +xlabel(" The type of the section (dendrite, axon, soma outline, or apical) is") +xlabel("determined by the minor code of the first point in the branch. ") +xlabel(" Coincidence of the first x,y,z point of a section with the last") +xlabel("(branch) point of some section defines a connection between child and") +xlabel("parent section. However most files contain errors and the following") +xlabel("heuristics are applied to the first points of problem sections when the") +xlabel("parent is not obvious. EACH PROBLEM POINT SHOULD BE EXAMINED to") +xlabel("determine if the correction is suitable. ") +xlabel(" 1) The first point after a Branch point is a MoveTo which is") +xlabel("coincident in the xy plane but not in the z axis. A physical connection") +xlabel("is made with the diam of the MoveTo. ") +xlabel(" 2) The nearest branch point is coincident in the xy plane. A physical") +xlabel("connection is made with the diam of the MoveTo.") +xlabel(" 3) There is no coincident branchpoint in the xy plane but the MoveTo") +xlabel("is 3-d coincident with the preceding LineTo point. A logical connection") +xlabel("is made to the section containing the LineTo point.") +xlabel(" 4) There is an xy plane coincident branch point but it is not the") +xlabel("nearest in a 3-d sense. A physical connection is made to the section") +xlabel("containing the xy plane coincident point. ") +xlabel(" 5) The first point of the branch is not a soma, dendrite, axon, or") +xlabel("apical start point and there is no xy plane coincident branch point. ") +xlabel("The branch remains unattached (but see heuristic 6). ") +xlabel(" 6) All unattached branches within 0.5 microns of the soma contour") +xlabel("bounding box are logically connected to the soma contour section. ") +xlabel("I am told, and it seems to be the case, that the first point in a") +xlabel("branch always has a diameter value of the last point in the previous") +xlabel("branch. For this reason we set the first point to the diameter of") +xlabel("of the second point in each section that has a parent branch.") +xlabel("If this is not the right thing to do then comment out the call to") +xlabel("repair_diam() in the input() procedure of read_nlcda.hoc") + xpanel(1) +} + +proc errout() {local i + printf("\n%s problems and default fixes\n\n", file.getname) + if (parse_err.count) { + printf(" Following lines could not be parsed\n") + for i=0, parse_err.count-1 { + printf(" %s\n", parse_err.object(i).s) + } + printf("\n") + } + if (line_branch_err.count) { +printf(" LINETO follows branch and does not coincide in the xy plane.\n") +printf(" Make a physical connection using the LINETO diameter.\n") + for i = 0, line_branch_err.count-1 { + printf(" %s\n", line_branch_err.object(i).s) + } + printf("\n") + } + if (xyparent_err.count) { + printf(" Nearest branch point is coincident in xy plane.\n Make a physical connection with diam of the MOVETO\n") + for i=0, xyparent_err.count-1 { + printf(" %s\n", xyparent_err.object(i).s) + } + printf("\n") + } + if (line_coincide_err.count) { + printf(" No coincident branchpoint in xy plane but 3-d coincident to previous LINETO.\n") + printf(" point. Make a logical connection to the section containing that LINETO\n") + for i=0, line_coincide_err.count-1 { + printf(" %s\n", line_coincide_err.object(i).s) + } + printf("\n") + } + if (xynotnearest_err.count) { + printf(" The xy plane coincident branch point is not the nearest in the 3-d sense.\n") + printf(" However we connect physically to the indicated xy coincident branch point\n") + for i=0, xynotnearest_err.count-1 { + printf(" %s\n", xynotnearest_err.object(i).s) + } + printf("\n") + } + if (noparent_err.count) { + printf(" Cannot figure out which is the parent\n") + printf(" No coincident (even in xy plane) branch point.\n") + for i=0, noparent_err.count-1 { + printf(" %s\n", noparent_err.object(i).s) + } + printf("\n") + } + if (somabbox_err.count) { + printf(" Unconnected branch is more than .5 microns outside the soma bounding box.\n") + printf(" Connect logically to nearest branch point\n") + for i=0, somabbox_err.count-1 { + printf(" %s\n", somabbox_err.object(i).s) + } + printf("\n") + } +} + +proc fillproblist() { + fillproblist1($o1, parse_err, line_branch_err, xyparent_err, line_coincide_err, xynotnearest_err, noparent_err, somabbox_err) +} +proc fillproblist1() { local i, j + for i=2, numarg() { + for j=0, $oi.count-1 { + $o1.append($oi.object(j)) + } + } +} + +endtemplate Import3d_Neurolucida_read diff --git a/bmtk-vb/bmtk/simulator/bionet/import3d/read_nlcda3.hoc b/bmtk-vb/bmtk/simulator/bionet/import3d/read_nlcda3.hoc new file mode 100644 index 0000000..0402dbb --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/import3d/read_nlcda3.hoc @@ -0,0 +1,1194 @@ +// Read neurolucida +// ; V3 text file written for MicroBrightField products. +// file. +// The format is given by a context free grammar that would be easy +// to handle with lex/yacc but we can do reasonably well using recursive descent +// that more or less matches each production rules for the grammar. +// Presently we only handle contours and trees but with spines ignored. + +begintemplate Branch2SomaInfo +// info to carry out decision about which to connect to for +// possible root branch mistakes +// may have to split the parent +public sec, sindex, pbranch, ipoint, d2p, d2s, connected2p +objref sec, pbranch +proc init() { + sec = $o1 + pbranch = $o2 + sindex = $3 + d2p = $4 + d2s = $5 + ipoint = $6 + connected2p = 0 +} +endtemplate Branch2SomaInfo + +begintemplate Import3d_LexToken +public token, x, s, itok, iline, clone +strdef s +token = 0 +x = 0 +itok = 0 +iline = 0 +obfunc clone() { localobj r + r = new Import3d_LexToken() + r.s = s + r.token = token + r.x = x + r.itok = itok + r.iline = iline + return r +} +endtemplate Import3d_LexToken + +begintemplate Import3d_Neurolucida3 +public type +public filetype, input, file, sections +public label, id2pt, id2line, pt2id, pt2sec, sec2pt, helptxt, mark, err, b2spanel +public x, y, z, d, iline, lines, quiet +external hoc_sf_ +objref type, firstpoints, gm, plist +objref current, look_ahead, look_ahead2 +objref file, tokens, sections, cursec, parentsec, nil +objref x, y, z, d, iline, lines +objref somas, centers, b2serr, b2sinfo +strdef line, tstr, tstr2, filetype, fline + +proc init() { + quiet = 0 + debug_on = 0 + gm = new GUIMath() + filetype = "Neurolucida V3" + current = new Import3d_LexToken() + look_ahead = new Import3d_LexToken() + look_ahead2 = new Import3d_LexToken() + eof=0 + number=1 leftpar=2 rightpar=3 comma=4 bar=5 + set=6 rgb=7 string=8 label_=9 err_=10 + leftsp=11 rightsp=12 + tokens = new List() + tokensappend("eof", "number", "leftpar", "rightpar", "comma", "bar") + tokensappend("set", "rgb", "string", "label", "err") + tokensappend("leftsp", "rightsp") + plist = new List() +} +proc tokensappend() {local i + for i=1, numarg() { + tokens.append(new String($si)) + } +} + +proc input() { + b2serr = new List() + b2sinfo = new List() + nspine = 0 + err = 0 + type = new Vector() + sections = new List(1000) + alloc(25000, x, y, z, d, iline) + lines = new List(25000) + itoken = 0 + depth = 0 + rdfile($s1) + firstpoints = new Vector(sections.count) + set_firstpoints() + connect2soma() + if (err) { errout() } +} + +proc set_firstpoints() {local i + firstpoints.resize(sections.count) + for i=0, sections.count-1 { + firstpoints.x[i] = sections.object(i).id + } +} + +proc alloc() {local i + for i=2, numarg() { + $oi = new Vector($1) + $oi.resize(0) + } +} +proc connect2soma() {local i, j, d, dmin localobj sec, roots, xx + // first make sure all somas are at the beginning + centers = new List() + j = 0 // next soma index + somas = new List() + roots = new List() + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.iscontour_) { + if (i > j) { + sections.remove(i) + sections.insrt(j, sec) + } + somas.append(sec) + j += 1 + } + } + // mark the soma contours that are part of a + // contour stack and link them into a list + // that is in the main contour section. + // we do not remove them from the sections since + // we want to be able to select their points + soma_contour_stack() + for i=0, sections.count-1 { + sec = sections.object(i) + if (!sec.iscontour_) if (sec.parentsec == nil) { + roots.append(sec) + } + } + if (somas.count == 0) { return } + // note that j is the number of soma's + for i = 0, somas.count-1 { + connect2soma_2(somas.object(i), roots) + } + for i=0, roots.count-1 { + sec = roots.object(i) + xx = sec.raw.getcol(0) + dmin = 1e9 + for j=0, centers.count-1 { + d = xx.c.sub(centers.object(j)).mag + if (d < dmin) { + imin = j + dmin = d + } + } + err = 1 + xx = centers.object(imin) + sprint(tstr, "\nMain branch starting at line %d is outside the soma bounding boxes", pt2id(sec.id)) + b2serr.append(new String(tstr)) + sprint(tstr, " Making a logical connection to center of nearest soma") + b2serr.append(new String(tstr)) + sec.parentsec = somas.object(imin) + sec.parentx = .5 + sec.insrt(0, xx.x[0], xx.x[1], xx.x[2], .01) + sec.first = 1 + sec.fid = 1 + opt_connect(sec, imin, dmin) + } +} + +proc soma_contour_stack() {local i, j localobj bb1, bb2, first, next + // if soma contour bounding boxes overlap, treat as single soma + if (somas.count == 0) return + first = somas.object(0) + bb1 = bounding_box(first) + j = 0 + for i = 1, somas.count-1 { + j += 1 + next = somas.object(j) + bb2 = bounding_box(next) + if (xy_intersect(bb1, bb2)) { + if (!object_id(first.contour_list)) { + first.contour_list = new List() + } + first.contour_list.append(next) + next.is_subsidiary = 1 + somas.remove(j) + j -= 1 + }else{ + first = next + } + bb1 = bb2 + } + for i=0, somas.count-1 { + somastack_makes_sense(somas.object(i)) + somastack_process(somas.object(i)) + } +} + +obfunc bounding_box() {localobj bb + bb = new Vector(6) + bb.x[0] = $o1.raw.getrow(0).min + bb.x[1] = $o1.raw.getrow(1).min + bb.x[2] = $o1.raw.getrow(2).min + bb.x[3] = $o1.raw.getrow(0).max + bb.x[4] = $o1.raw.getrow(1).max + bb.x[5] = $o1.raw.getrow(2).max + return bb +} + +func xy_intersect() {local i + for i = 0, 1 { +if ($o1.x[i] > $o2.x[3+i] || $o2.x[i] > $o1.x[3+i]) { return 0 } + } + return 1 +} + +proc somastack_makes_sense() {local i, j, z, z2, dz, dz2 localobj sec + if (!object_id($o1.contour_list)) { return } + // the soma stack must be monotonic in the z axis and all points + // on a contour must have same z value. + z = $o1.raw.x[2][0] + for i = 1, $o1.raw.ncol-1 if (z != $o1.raw.x[2][i]) { + sprint(tstr, "Soma stack contour %s does not have constant z value.", $o1) + b2serr.append(new String(tstr)) + b2serr.append(new String(" Soma area calculation may be serious in error.")) + return + } + dz = 0 + for j=0, $o1.contour_list.count-1 { + sec = $o1.contour_list.object(j) + z2 = sec.raw.x[2][0] + dz2 = z2 - z + if (dz2 == 0) { + sprint(tstr, "Adjacent contour %d of soma stack %s has same z coordinate and previous.", j, $o1) + b2serr.append(new String(tstr)) + return + }else if (dz2 > 0) { + dz2 = 1 + }else{ + dz2 = -1 + } + if (dz == 0) { + dz = dz2 + }else if (dz != dz2) { + sprint(tstr, "Contour %d of the Soma stack %s is not monotonic in z.", j, $o1) + b2serr.append(new String(tstr)) + b2serr.append(new String(" Manually edit the neurolucida file and reorder or eliminate some contours.")) + b2serr.append(new String(" Presently the soma surface is nonsense.")) + return + } + z = z2 + for i = 1, sec.raw.ncol-1 if (z != sec.raw.x[2][i]) { + sprint(tstr, "contour %d of the Soma stack %s does not have constant z value.", j, $o1) + b2serr.append(new String(tstr)) + b2serr.append(new String(" Soma area calculation may be serious in error.")) + return + } + } +} + +proc somastack_process() {local i, n, n1 localobj pts, m, center, pv + if (!object_id($o1.contour_list)) { return } + printf("somastack_process %d\n", $o1.contour_list.count + 1) + // The stack defines a volume. Determine the principle axes + // and slice the volume along the major axis, approximating + // each slice by a circle and shifting the circle to be + // along the major axis. So the set of soma contours ends + // up being one straight cylindrically symetric soma centroid + // note then that curved carrots don't look quite right but + // straight carrots do. + + // for each contour use 100 points equally spaced. + // we should, but do not, make the stack equally spaced. + // then all the points are used to find the principle axes + // this pretty much follows the corresponding analysis in + // Import3d_GUI + // Heck. Let's just use all the contour points and approximate + // the thing as an ellipsoid + + // copy all the centroids into one matrix + // size of matrix + n = $o1.raw.nrow + for i=0, $o1.contour_list.count-1 { n += $o1.contour_list.object(i).raw.nrow} + pts = new Matrix(3, n) + n = 0 + n1 = $o1.raw.nrow + $o1.raw.bcopy(0, 0, 3, n1, 0, n, pts) + n = n1 + for i=0, $o1.contour_list.count-1 { + n1 = $o1.contour_list.object(i).raw.nrow + $o1.contour_list.object(i).raw.bcopy(0, 0, 3, n1, 0, n, pts) + n += n1 + } + center = new Vector(3) + for i=0, 2 { center.x[i] = pts.getrow(i).mean } + printf("center\n") center.printf + + //principle axes + m = new Matrix(3,3) + for i=0, 2 { pts.setrow(i, pts.getrow(i).sub(center.x[i])) } + for i=0, 2 { + for j=i, 2 { + m.x[i][j] = pts.getrow(i).mul(pts.getrow(j)).sum + m.x[j][i] = m.x[i][j] + } + } + pv = m.symmeig(m) + printf("Principle values\n") pv.printf() + printf("Principle axes\n") m.printf() +} + +proc stk_bbox() {local i, j localobj bbs, bbc + bbs = bounding_box($o1) + for i=0, $o1.contour_list.count-1 { + bbc = bounding_box($o1.contour_list.o(i)) + for j=0, 2 { + if (bbs.x[j] > bbc.x[j]) bbs.x[j] = bbc.x[j] + if (bbs.x[j+3] < bbc.x[j+3]) bbs.x[j+3] = bbc.x[j+3] + } + } + $&2 = bbs.x[0] $&3 = bbs.x[3] $&4 = bbs.x[1] $&5 = bbs.x[4] +} + +proc connect2soma_2() {local i, xmin, xmax, ymin, ymax localobj sec, xc, yc, zc, center + // find centroid of soma if outline and connect all dangling + // dendrites to that if inside the contour + if (object_id($o1.contour_list)) { + center = $o1.stk_center() + stk_bbox($o1, &xmin, &xmax, &ymin, &ymax) + }else{ + xc = $o1.raw.getrow(0) + yc = $o1.raw.getrow(1) + zc = $o1.raw.getrow(2) + xmin = xc.min-.5 xmax = xc.max + .5 + ymin = yc.min-.5 ymax = yc.max + .5 + center = $o1.contourcenter(xc, yc, zc) + } + centers.append(center) + + for (i=$o2.count-1; i >= 0; i -= 1) { + sec = $o2.object(i) + if (gm.inside(sec.raw.x[0][0], sec.raw.x[1][0], xmin, ymin, xmax, ymax)) { + sec.parentsec = $o1 + sec.parentx = .5 + sec.insrt(0, center.x[0], center.x[1], center.x[2], .01) + sec.first = 1 + sec.fid = 1 + $o2.remove(i) + } + } +} + +proc opt_connect() {local i, j, d, dmin, imin, n, ip localobj psec, xx + dmin = 1e9 + xx = $o1.raw.getcol(1) + for i=0, sections.count - 1 { + psec = sections.object(i) + if (psec == $o1) { break } + n = psec.raw.ncol + for j=0, n-1 { + d = xx.c.sub(psec.raw.getcol(j)).set(2,0).mag + if (d < dmin) { + dmin = d + imin = i + ip = j + } + } + } + if (dmin == 1e9) { return } + psec = sections.object(imin) +// if (dmin < psec.d.x[psec.d.size-1]) { + if (dmin < $3) { + b2sinfo.append(new Branch2SomaInfo($o1, psec, $2, dmin, $3, ip)) + } +} + +proc b2spanel() {local i localobj b2s + if (b2sinfo.count == 0) { return } + xpanel("Possible root branch errors") + xlabel("Default logical connection to nearest soma.") + xlabel("Check to physically connect to closest parent") + xlabel(" in the xy plane.") + xlabel(" (Note: may split the parent into two sections)") + for i=0, b2sinfo.count -1 { + b2s = b2sinfo.object(i) +sprint(tstr, "Line #%d connect to #%d %g (um) away", pt2id(sec2pto(b2s.sec, 1)), \ +pt2id(sec2pto(b2s.pbranch, b2s.ipoint)), b2s.d2p) +sprint(tstr2, "b2soption_act(%d, \"%s\")", i, $o1) + xcheckbox(tstr, &b2s.connected2p(), tstr2) + } + xpanel() +} + +proc b2soption_act() {local i localobj b2s, sec, parent, soma, xx + b2s = b2sinfo.object($1) + sec = b2s.sec + soma = somas.object(b2s.sindex) + parent = b2s.pbranch + if (sec.parentsec == soma) { // connect to parent + if (b2s.ipoint != parent.raw.ncol-1) { // need to split + b2soption_split(b2s) + parent = b2s.pbranch + set_firstpoints() + } + xx = parent.raw.getcol(b2s.ipoint) + sec.parentsec = parent + sec.parentx = 1 + sec.raw.setcol(0, xx) + sec.d.x[0] = sec.d.x[1] + sec.first = 0 + sec.fid = 1 + }else{ // connect to soma + xx = centers.object(b2s.sindex) + sec.parentsec = soma + sec.parentx = .5 + sec.raw.setcol(0, xx) + sec.d.x[0] = .01 + sec.first = 1 + sec.fid = 1 + } + sprint(tstr, "%s.redraw()", $s2) + execute(tstr) +} + +proc b2soption_split() {local i, n, id, ip localobj p, newsec, tobj + p = $o1.pbranch + ip = $o1.ipoint + id = sec2pto(p, ip) + n = p.raw.ncol + newsec = new Import3d_Section(p.id, ip+1) + p.id = id + + tobj = p.raw.c + tobj.bcopy(0,0,3,ip+1,newsec.raw) + p.raw.resize(3, n - ip) + p.xyz.resize(3, n - ip) + tobj.bcopy(0, ip, 3, n - ip, p.raw) + + tobj = p.d.c + newsec.d.copy(tobj, 0, ip) + p.d.resize(n - ip) + p.d.copy(tobj, ip, n-1) + + newsec.parentsec = p.parentsec + p.parentsec = newsec + newsec.parentx = p.parentx + p.parentx = 1 + newsec.type = p.type + newsec.first = p.first + newsec.fid = p.fid + p.first = 0 + p.fid = 0 + newsec.type = p.type + $o1.pbranch = newsec + $o1.ipoint = newsec.d.size-1 + // now adjust any screwed up b2sinfo items that also reference p + for i=0, b2sinfo.count-1 { + tobj = b2sinfo.object(i) + if (tobj == $o1) { continue } + if (tobj.pbranch == p) { + if (tobj.ipoint <= ip) { // on newsec + tobj.pbranch = newsec + }else{ // still on p + tobj.ipoint -= ip + } + } + } + sections.insrt(sections.index(p), newsec) +} + +func lex() {local n + $o1.x = 0 + $o1.s = "" + while (hoc_sf_.len(line) <= 1 || sscanf(line, " ;%[^@]", line) == 1) { + if (!getline(fline)) { + $o1.token = eof + itoken += 1 + $o1.itok = itoken + $o1.iline = iline_ + return eof + } + line = fline + hoc_sf_.left(fline, hoc_sf_.len(fline)-1) + } + if (sscanf(line, " %lf%[^@]", &$o1.x, line) == 2) { + $o1.token = number + }else if (sscanf(line, " (%[^@]", line) == 1) { + $o1.token = leftpar + }else if (sscanf(line, " )%[^@]", line) == 1) { + $o1.token = rightpar + }else if (sscanf(line, " ,%[^@]", line) == 1) { + $o1.token = comma + }else if (sscanf(line, " |%[^@]", line) == 1) { + $o1.token = bar + }else if (sscanf(line, " <%[^@]", line) == 1) { + $o1.token = leftsp + }else if (sscanf(line, " >%[^@]", line) == 1) { + $o1.token = rightsp + }else if (sscanf(line, " set %[^@]", line) == 1) { + $o1.token = set + }else if (sscanf(line, " Set %[^@]", line) == 1) { + $o1.token = set + }else if (sscanf(line, " SET %[^@]", line) == 1) { + $o1.token = set + }else if (sscanf(line, " RGB %[^@]", line) == 1) { + $o1.token = rgb + }else if ((n = sscanf(line, " \"%[^\"]\"%[^@]", $o1.s, line)) > 0) { + // not allowing quotes in quote + $o1.token = string + if (n == 1) { + printf("Lexical error: no closing '\"' in string. The entire line %d in ||is\n", iline_) + printf("|%s|\n", fline) + line = "" + $o1.token = err_ + } + }else if (sscanf(line, " %[A-Za-z0-9_]%[^@]", $o1.s, line) == 2) { + $o1.token = label_ + }else{ + $o1.token = err_ + } + itoken += 1 + $o1.itok = itoken + $o1.iline = iline_ + return $o1.token +} + +func getline() { + if (file.eof) { + if (!quiet) { + printf("\r%d lines read\n", iline_) + } + return 0 + } + file.gets($s1) + iline_ += 1 +// printf("%d: %s", iline_, $s1) + if ((iline_%1000) == 0) { + if (!quiet) { + printf("\r%d lines read", iline_) + } + } + return 1 +} + +proc rdfile() {local i + iline_ = 0 + file = new File($s1) + if (!file.ropen()) { + err = 1 + printf("could not open %s\n", $s1) + } + for (i=0; !file.eof(); i += 1) { + file.gets(line) + } + alloc(i, x, y, z, d, iline) + file.close + lines = new List(25000) + line="" + if (!quiet) { + printf("\n") + } + file.ropen() + p_file() + file.close +} + +objref rollback + +proc save_for_rollback() { + if (object_id(rollback)) { + printf("rollback in use\n") + p_err() + } + rollback = new List() + rollback.append(current.clone()) + rollback.append(look_ahead.clone()) + rollback.append(look_ahead2.clone()) + use_rollback_ = 0 +} +proc use_rollback() { + use_rollback_ = 1 + current = rollback.o(0) rollback.remove(0) + look_ahead = rollback.o(0) rollback.remove(0) + look_ahead2 = rollback.o(0) rollback.remove(0) + if (rollback.count == 0) {clear_rollback()} +} +proc clear_rollback() {localobj nil + rollback = nil + use_rollback_ = 0 +} + +proc read_next_token() { + if (use_rollback_) { + current = look_ahead + look_ahead = look_ahead2 + look_ahead2 = rollback.o(0) + rollback.remove(0) + if (rollback.count == 0) { + clear_rollback() + } + }else{ + read_next_token_lex() + if (object_id(rollback)){ + rollback.append(look_ahead2.clone()) + } + } +} +proc read_next_token_lex() {localobj tobj + tobj = current + current = look_ahead + look_ahead = look_ahead2 + look_ahead2 = tobj + if (look_ahead.token != eof) { + lex(look_ahead2) + }else{ + look_ahead2.token = eof + } +// printf("current token=%s x=%g s=%s\n", tokens.object(current.token).s, current.x, current.s) +} + +func need_extra() {local i, n localobj m + if (parentsec == nil) { return 0 } + m = parentsec.raw + n = m.ncol-1 + if ( m.x[0][n] == x.x[$1]) { + if ( m.x[1][n] == y.x[$1]) { + if ( m.x[2][n] == z.x[$1]) { + return 0 + } + } + } + return 1 +} +proc newsec() {local i, n, first, n1 localobj m + first = 0 + n = $2 - $1 + if (need_extra($1)) { + cursec = new Import3d_Section($1, n+1) + first = 1 + cursec.fid = 1 + m = parentsec.raw + n1 = m.ncol-1 + cursec.set_pt(0, m.x[0][n1], m.x[1][n1], m.x[2][n1], d.x[$1]) + }else{ + cursec = new Import3d_Section($1, n) + } + cursec.type = sectype + type.append(sectype) + sections.append(cursec) + cursec.append(first, $1, n, x, y, z, d) +} +proc set_sectype() {localobj tobj + sectype = 0 + if (plist.count) { + tobj = plist.object(plist.count-1) + if (strcmp(tobj.s, "Axon") == 0) { + sectype = 2 + }else if (strcmp(tobj.s, "Dendrite") == 0) { + sectype = 3 + }else if (strcmp(tobj.s, "Apical") == 0) { + sectype = 4 + } + } +} + +proc label() { + sprint($s2, "Line %d: %s", iline.x[$1], lines.object($1).s) +} +func id2pt() {local i + i = iline.indwhere(">=", $1) + if (i < 0) { i = iline.size-1 } + return i +} +func id2line() { return $1 } +func pt2id() {local i + i = $1 + if (i < 0) { i == 0 } + if (i >= iline.size) { i = iline.size-1 } + return iline.x[i] +} +func pt2sec() {local i, j + i = firstpoints.indwhere(">", $1) + if (i == -1) { + i = firstpoints.size + } + $o2 = sections.object(i-1) + j = $1 - $o2.id + $o2.fid + return j +} +func sec2pt() {local i localobj sec + sec = sections.object($1) + i = sec.id + $2 - sec.fid + return i +} +func sec2pto() {local i localobj sec + sec = $o1 + i = sec.id + $2 - sec.fid + return i +} +proc mark() {local i + print $o1, $2, iline, lines + i = iline.indwhere("==", $2) + if (i != -1) { + printf("%d,%d,%d (%g,%g): %s\n", $2, iline.x[i], i, x.x[i], y.x[i], lines.object(i).s) + $o1.mark(x.x[i], y.x[i], "S",12,4,1) + } +} + +proc helptxt() { + xpanel("Neurolucida V3 file filter characteristics") +xlabel("The elaborate file format is handled by a reasonably complete") +xlabel("recursive descent parser that more or less matches the production") +xlabel("rules for the grammar. However, at present, only contours and trees") +xlabel("are given any semantic actions (in particular, spines are ignored).") + xpanel(1) +} + +proc chk() { + if (current.token != $1) { p_err() } +} +proc demand() { + read_next_token() + chk($1) +} +proc pcur() { + printf("itok=%d on line %d token=%s x=%g s=%s\n", current.itok, current.iline, tokens.object(current.token).s, current.x, current.s) +} +proc plook() { +// printf("lookahead: itok=%d token=%s x=%g s=%s\n", look_ahead.itok, tokens.object(look_ahead.token).s, look_ahead.x, look_ahead.s) +} +proc enter() {local i + if (debug_on == 0) {return} + for i=1, depth {printf(" ")} + printf("enter %s: ", $s1) + pcur() + depth += 1 +} +proc leave() {local i + if (debug_on == 0) {return} + depth -= 1 + for i=1, depth {printf(" ")} + printf("leave %s: ", $s1) + pcur() +} +// p stands for production if needed to avoid conflict with variable +proc p_file() { + look_ahead2.token = eof + look_ahead.token = eof + if (lex(current) != eof) { + if (lex(look_ahead) != eof) { + lex(look_ahead2) + } + } + enter("p_file") + objects() + leave("p_file") +} +proc objects() { + enter("objects") + object() + while(1) { + optionalcomma() + if (current.token != leftpar) { + break + } + object() + } + leave("objects") +} +proc object() {local i + i = current.itok + enter("object") + if (current.token == leftpar) { + plook() + if (look_ahead.token == string) { + contour() + }else if (look_ahead.token == label_) { + marker_or_property() + }else if (look_ahead.token == leftpar) { + tree_or_text() + }else if (look_ahead.token == set) { + p_set() + }else{ + p_err() + } + }else{ + p_err() + } + leave("object") + if (i == current.itok) { + print "internal error: ", "object consumed no tokens" + stop + } +} +proc marker_or_property() { + enter("marker_or_property") + if (look_ahead2.token == leftpar) { + marker() + }else{ + property() + } + leave("marker_or_property") +} +proc tree_or_text() { + // the tree and text productions are poorly conceived since they + // match each other for arbitrarily long sequences of Properties tokens. + // And after the properties they both have a Point. + // For now just assume it is a tree. + // It will be painful to consume the [ '(' Properties Point ] here + // and then disambiguate between Tree or Text and then more + // often than not, start the tree production after having already + // read the first point (Branch currently assumes it is supposed + // to read the first point of the tree.) + enter("tree_or_text") + save_for_rollback() + if (text()) { + clear_rollback() + }else{ + use_rollback() + tree() + } + leave("tree_or_text") +} +proc properties() { + enter("properties") + plist.remove_all() + if (current.token == leftpar) { + if(look_ahead.token == label_ || look_ahead.token == set) { + property_or_set() + while (1) { + optionalcomma() +if (current.token != leftpar || (look_ahead.token != label_ && look_ahead.token != set)) { + break + } + property_or_set() + } + } + } + leave("properties") +} +proc property_or_set() { + if (look_ahead.token == label_) { + property() + }else{ + p_set() + } +} +proc property() { + enter("property") + chk(leftpar) + demand(label_) + plist.append(new String(current.s)) + read_next_token() + optionalvalues() + chk(rightpar) + read_next_token() + leave("property") +} +proc optionalvalues() {local c + enter("optionalvalues") + c = current.token + if (c == number || c == string || c == label_ || c == rgb) { + values() + } + leave("optionalvalues") +} +proc values() {local c + enter("values") + value() + while (1) { + c = current.token + if (c != number && c != string && c != label_ && c != rgb) { + break + } + value() + } + leave("values") +} +proc value() {local c + enter("value") + c = current.token + if (c == number) { + }else if (c == string) { + }else if (c == label_) { + }else if (c == rgb) { + demand(leftpar) + demand(number) + read_next_token() + optionalcomma() + chk(number) + read_next_token() + optionalcomma() + chk(number) + demand(rightpar) + }else{ + p_err() + } + read_next_token() + leave("value") +} +proc p_set() { + // presently, I am imagining that we ignore sets + // and I hope we never see objects() in them. + enter("p_set") + chk(leftpar) + demand(set) + demand(string) + read_next_token() + if (current.token != rightpar) { + objects() + } + chk(rightpar) + read_next_token() + leave("p_set") +} +proc contour() {local begin, end, keep, il + enter("contour") + chk(leftpar) + begin = x.size + keep = 0 + demand(string) + if (strcmp(current.s, "CellBody") == 0) { keep = 1 } + if (strcmp(current.s, "Cell Body") == 0) { keep = 1 } + il = current.iline + read_next_token() + contourinfo() + if (keep) { + end = x.size + if (end - begin > 2) { + sectype = 1 + newsec(begin, end) + cursec.iscontour_ = 1 + }else{ +sprint(tstr, "CellBody contour has less than three points at line %d. Ignoring.", il) + b2serr.append(new String(tstr)) + } + } + chk(rightpar) + read_next_token() + leave("contour") +} +proc contourinfo() { + enter("contourinfo") + properties() + points() + morepoints() + leave("contourinfo") +} +proc morepoints() { + enter("morepoints") + optmarkerlist() + leave("morepoints") +} +proc optmarkerlist() { + enter("optmarkerlist") + leave("optmarkerlist") +} +proc markerlist() {local pcnt + enter("markerlist") + chk(leftpar) + pcnt = 1 + // not handling markers. when pcnt goes to 0 then leave + while (pcnt != 0) { + read_next_token() + if (current.token == rightpar) { + pcnt -= 1 + }else if (current.token == leftpar) { + pcnt += 1 + } + } + read_next_token() + leave("markerlist") +} +proc tree() { + enter("tree") + parentsec = nil + chk(leftpar) + read_next_token() + properties() + set_sectype() + branch() + chk(rightpar) + read_next_token() + parentsec = nil + leave("tree") +} +proc branch() {local begin, end localobj psav + enter("branch") + psav = parentsec + begin = x.size + treepoints() + end = x.size + newsec(begin, end) + cursec.parentsec = parentsec + parentsec = cursec + branchend() + parentsec = psav + leave("branch") +} +proc treepoints() { + enter("treepoints") + treepoint() + while (1) { + optionalcomma() + if (current.token != leftpar || look_ahead.token != number) { + break + } + treepoint() + } + leave("treepoints") +} +proc treepoint() { + enter("treepoint") + point() + if (current.token == leftsp) { + spines() + } + leave("treepoint") +} +proc spines() { + enter("spines") + spine() + while(current.token == leftsp) { + spine() + } + leave("spines") +} +proc spine() { + enter("spine") + chk(leftsp) read_next_token() + nspine += 1 err = 1 +// properties() points() + while (current.token != rightsp) { + read_next_token() + } + chk(rightsp) read_next_token() + leave("spine") +} +proc branchend() { + enter("branchend") + optionalcomma() + if (current.token == leftpar) { + while (look_ahead.token == label_) { + markerlist() + } + } + optionalcomma() + if (current.token == leftpar || current.token == label_) { + node() + } + leave("branchend") +} +proc node() { + enter("node") + if (current.token == leftpar) { + read_next_token() split() + chk(rightpar) read_next_token() + }else if (current.token == label_) { + read_next_token() + }else{ + p_err() + } + leave("node") +} +proc split() { + enter("split") + branch() + while (current.token == bar) { + read_next_token() + branch() + } + leave("split") +} +proc marker() { + enter("marker") + chk(leftpar) + demand(label_) + read_next_token() + properties() points() + chk(rightpar) read_next_token() + leave("marker") +} +func text() { + // if text fails then it may be a tree + enter("text") + chk(leftpar) read_next_token() + properties() point() + if (current.token != string) { + leave("text invalid --- expect string") + return 0 + } + chk(string) +// demand(rightpar) + read_next_token() + if (current.token != rightpar) { + leave("text invalid --- expect rightpar") + return 0 + } + chk(rightpar) + read_next_token() + leave("text") + return 1 +} +proc points() { + enter("points") + point() + while (1) { + optionalcomma() + if (current.token != leftpar) { + break + } + point() + } + leave("points") +} +proc point() { + enter("point") + chk(leftpar) + demand(number) + xval = current.x + iline.append(iline_) lines.append(new String(fline)) + read_next_token() optionalcomma() + chk(number) + yval = current.x + zval = dval = 0 + read_next_token() optz() + x.append(xval) y.append(yval) z.append(zval) d.append(dval) + chk(rightpar) read_next_token() +//printf("%g %g %g %g\n", xval, yval, zval, dval) + leave("point") +} +proc optz() { + enter("optz") + optionalcomma() + if (current.token == number) { + zval = current.x + read_next_token() + optmodifier() + } + leave("optz") +} +proc optmodifier() { + enter("optmodifier") + optionalcomma() + if (current.token == number) { + dval = current.x + read_next_token() + optionalcomma() + if (current.token == label_) { + read_next_token() + } + optbezier() + } + leave("optmodifier") +} +proc optbezier() { + enter("optbezier") + optionalcomma() + if (current.token == leftpar) { + demand(number) + read_next_token() + optionalcomma() chk(number) read_next_token() + optionalcomma() chk(number) read_next_token() + optionalcomma() chk(number) demand(rightpar) + read_next_token() + } + leave("optbezier") +} +proc optionalcomma() { + enter("optionalcomma") + if (current.token == comma) { + read_next_token() + } + leave("optionalcomma") +} +proc p_err() { + printf("\nparse error\n") + pcur() + printf("line %d: %s\n", iline_, fline) + stop +} +proc errout() {local i + if (quiet) { return } + printf("\n%s problems\n\n", file.getname) + if (nspine) { + printf("Ignored %d spines\n", nspine) + } + for i=0, b2serr.count-1 { + printf("%s\n", b2serr.object(i).s) + } +} +endtemplate Import3d_Neurolucida3 diff --git a/bmtk-vb/bmtk/simulator/bionet/import3d/read_nts.hoc b/bmtk-vb/bmtk/simulator/bionet/import3d/read_nts.hoc new file mode 100644 index 0000000..c58e9d6 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/import3d/read_nts.hoc @@ -0,0 +1,331 @@ +// translation of ntscable's read_nts.c file for importing +// eutectic files. After reading and parsing lines, the logic +// follows that in nlcda_read.hoc + +begintemplate Import3d_Eutectic_read +public filetype, sections, input, type, file, err +public label, id2pt, id2line, pt2id, pt2sec, sec2pt, mark +external hoc_sf_ +public id, ptype, tag, x, y, z, d, iline, pointtype, points, type +public firstpoints, lastpoints +objref sections, file, stack, cursec, firstpoints, lastpoints, gm +objref id, ptype, tag, x, y, z, d, iline, pointtype, points, type +objref iline2pt, vectors, header, lines, diam, parse_err, nil, soma +strdef tstr, tstr1, point_type_names, filetype, line + +proc init() { + filetype = "Eutectic" + vectors = new List() + header = new List() + lines = new List() + gm = new GUIMath() + MTO = 0 + TTO = 3 + BTO = 6 + CP = 9+1 + FS = 12+1 + SB = 15+1 + BP = 18+1 + NE = 21+1 + ES = 24+1 + MAE = 27 + TAE = 30 + BAE = 33 + SOS = 36 + SCP = 39 + SOE = 42 + OS = 45+1 + OCP = 48 + OE = 51+1 + DS = 54+1 + DCP = 57 + DE = 60+1 + point_type_names = \ +"MTOTTOBTO CP FS SB BP NE ESMAETAEBAESOSSCPSOE OSOCP OE DSDCP DE" +// note numbering for two char item is 1 more than in read_nts.c +// since space is not included in first char +} + +proc input() {local i + nspine = 0 + err = 0 + parse_err = new List() + sections = new List() + stack = new List() + lastpoints = new Vector() + firstpoints = new Vector() + + rdfile($s1) + parse2() + type = new Vector(sections.count) + for i=0, sections.count-1 { + type.x[i] = tag.x[sections.object(i).id] + } + connect2soma() + if (err) { errout() } +} + +proc rdfile() {local i, j + file = new File($s1) + // count lines for vector allocation space (not really necessary) + if (!file.ropen()) { + err = 1 + printf("could not open %s\n", $s1) + } + for (i = 0; !file.eof(); i += 1) { + file.gets(line) + } + file.close() +// printf("%s has %d lines\n", $s1, i) + alloc(i, id, ptype, tag, x, y, z, d, iline, pointtype, points) + tag + diam = d + file.ropen() + for (i = 1; !file.eof(); i += 1) { + file.gets(line) + parse(i, line) + } + file.close() +} + +proc alloc() { local i // $oi.size = 0 but enough space for $1 elements + for i = 2, numarg() { + $oi = new Vector($1) + $oi.resize(0) + vectors.append($oi) + } +} + +proc parse() {local a1 ,a2, a3, a4, a5, a6, a7 + n = sscanf($s2, "%d %s %d %f %f %f %f", &a1, tstr, &a3, &a4, &a5, &a6, &a7) + hoc_sf_.left($s2, hoc_sf_.len($s2)-1) + if (n <= 0) { + header.append(new String($s2)) + return + } + if (n != 7) { + err = 1 + sprint(tstr, "%d: %s parse failure after item %d", $1, $s2, n) + parse_err.append(new String(tstr)) + return + } + a2 = hoc_sf_.head(point_type_names, tstr, tstr1) +// print tstr, " ", a2 + // first points of branches (before physical connection) is 1 + // continuation points are 2 + // branch are 3 + // ends are 4 + // a branch point can also be a first point + // so easiest to accumulate them here + if (a2 == MTO) { + last = 1 + firstpoints.append(id.size) + }else if (a2 == BP ){ + if (last == 3 || last == 4){ + firstpoints.append(id.size) + } + last = 3 + }else if (a2 == FS || a2 == SB || a2 == CP){ + if (a2 == SB) { err = 1 nspine += 1 } + if (last == 3 || last == 4){ + firstpoints.append(id.size) + last = 1 + }else{ + last = 2 + } + }else if (a2 == NE || a2 == ES || a2 == MAE || a2 == TAE || a2 == BAE){ + if (last == 3 || last == 4){ + firstpoints.append(id.size) + } + last = 4 + }else if (a2 == SOS){ + last = 10 + }else if (a2 == SCP){ + last = 10 + }else if (a2 == SOE){ + last = 10 + }else if (a2 == OS){ + return + }else if (a2 == DS){ + return + }else if (a2 == DCP || OCP){ + return + }else if (a2 == DE || a2 == OE){ + return + }else{ + return + } + pointtype.append(last) + points.append(a1) + id.append(a1) + ptype.append(a2) + tag.append(a3) + x.append(a4) + y.append(a5) + z.append(a6) + d.append(a7) + iline.append($1) + lines.append(new String($s2)) +} +proc parse2() {local i, j, k localobj parent + i = ptype.indwhere("==", SOS) + j = ptype.indwhere("==", SOE) + if (i > -1 && j > i) { + mksec(i, j, nil) + cursec.iscontour_ = 1 +// cursec.type=1 + soma = cursec + } + for i=0, firstpoints.size-1 { + j = firstpoints.x[i] + for (k=j; pointtype.x[k] <= 2; k += 1) { + } + parent = pop() + if (parent != nil) { + if (parent.volatile < 1) { + push(parent) + parent.volatile += 1 + } + } + mksec(j, k, parent) +//printf("%s %d %d: %s | %s\n", cursec, j, k, lines.object(j).s, lines.object(k).s) + cursec.parentsec = parent +// logic_connect(cursec, parent) + if (pointtype.x[k] == 3) { + push(cursec) + } + } + if (stack.count > 0) { + err = 1 + } +} + +proc push() { + stack.append($o1) +} +obfunc pop() {localobj p + if (stack.count > 0) { + p = stack.object(stack.count-1) + stack.remove(stack.count-1) + }else{ + p = nil + } + return p +} + +proc mksec() {local i, x1, y1, z1, d1 + if ($o3 == nil) { + cursec = new Import3d_Section($1, $2-$1+1) + cursec.append(0, $1, $2-$1+1, x, y, z, d) + }else{ + cursec = new Import3d_Section($1, $2-$1+2) + cursec.append(1, $1, $2-$1+1, x, y, z, d) + cursec.first = 0 // physical connection + i = $o3.raw.ncol-1 + x1 = $o3.raw.x[0][i] + y1 = $o3.raw.x[1][i] + z1 = $o3.raw.x[2][i] + //d1 = $o3.d.x[i] + cursec.set_pt(0, x1, y1, z1, cursec.d.x[1]) + cursec.fid = 1 + } + cursec.volatile = 0 + cursec.type = tag.x[$1] + sections.append(cursec) + lastpoints.append($2) +} + +proc logic_connect() {local i, x1, y1, z1, d1 + if ($o2 == nil) { return } + i = $o2.raw.ncol-1 + x1 = $o2.raw.x[0][i] + y1 = $o2.raw.x[1][i] + z1 = $o2.raw.x[2][i] + d1 = $o2.d.x[i] + $o1.insrt(0, x1, y1, z1, $o1.d.x[0]) + $o1.first = 1 +} + +proc connect2soma() {local i, ip, j, jp, bp, jpmin, dmin, d, xmin, xmax, ymin, ymax localobj sec, xc, yc, zc, c + // find centroid of soma if outline and connect all dangling + // dendrites to that if inside the contour + if (soma == nil) { return } + xc = soma.raw.getrow(0) + yc = soma.raw.getrow(1) + zc = soma.raw.getrow(2) + xmin = xc.min-.5 xmax = xc.max + .5 + ymin = yc.min-.5 ymax = yc.max + .5 + c = soma.contourcenter(xc, yc, zc) + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.parentsec == nil && sec != soma) { + if (gm.inside(sec.raw.x[0][0], sec.raw.x[1][0], xmin, ymin, xmax, ymax)) { + sec.parentsec = soma + sec.parentx = .5 + sec.insrt(0, c.x[0], c.x[1], c.x[2], .01) + sec.first = 1 + sec.fid = 1 + } + } + } +} + +proc label(){ + sprint($s2, "Line %d: %s", iline.x[$1], lines.object($1).s) +} +func id2pt() { + i = id.indwhere(">=", $1) +//print "id2pt ", $1, i, id.x[i] + return i +} +func id2line() { return points.x[$1] } +func pt2id() {local i +//print "pt2id ", $1, id.x[$1] + return id.x[$1] +} +func pt2sec(){local i, j + i = lastpoints.indwhere(">=", $1) + if (i == -1) { + i = lastpoints.size-1 + } + $o2 = sections.object(i) + j = $1 - $o2.id + $o2.fid +//print "pt2sec ", $1, $o2, $o2.id, j + return j +} +func sec2pt(){local i localobj sec + sec = sections.object($1) + i = sec.id + $2 - sec.fid +//print "sec2pt ", $1, $2, sec.id, sec.first, i + return i +} + +proc mark() {local i, a,b,c,d,e,f + print $o1, $2, iline, lines + i = id.indwhere("==",$2) + printf("%d,%d,%d: %s\n", i, id.x[i], iline.x[i], lines.object(i).s) + n = sscanf(lines.object(i).s, "%d %s %d %f %f %f %f", &a, tstr, &b, &c, &d, &e, &f) + if (n == 7) { + print a," ",tstr," ",b,c,d,e,f + $o1.mark(c,d,"S",12,4,1) + } +} + +proc errout() { + printf("\n%s problems and default fixes\n\n", file.getname) + if (parse_err.count) { + printf(" Following lines could not be parsed\n") + for i=0, parse_err.count-1 { + printf(" %s\n", parse_err.object(i).s) + } + printf("\n") + } + if (stack.count > 0) { + printf(" stack.count = %d\n", stack.count) + } + if (nspine > 0) { + printf(" Ignore %d spines\n", nspine) + } +} + +endtemplate Import3d_Eutectic_read diff --git a/bmtk-vb/bmtk/simulator/bionet/import3d/read_swc.hoc b/bmtk-vb/bmtk/simulator/bionet/import3d/read_swc.hoc new file mode 100644 index 0000000..2dddd72 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/import3d/read_swc.hoc @@ -0,0 +1,428 @@ +// read swc file, create and verify that it is a single tree, +// and identify the lists of unbranched points. + +begintemplate Import3d_SWC_read +public input, pheader, instantiate +public id, type, x, y, z, d, pid, iline, header, point2sec, sections, lines +public idoffset, label, id2pt, id2line, pt2id, pt2sec, sec2pt, file, mark +public filetype, err, helptxt +public quiet +external hoc_sf_ +objref id, type, x, y, z, d, pid, iline, header, lines +objref file, vectors, sec2point, point2sec, sections +objref connect2prox +strdef tstr, line, filetype +double a[7] +objref id2index_ + +// id and pid contain the raw id values (1st and 7th values on each line) +// from the file. After the file is read id2index(id.x[i]) == i +// Note that the only requireement for a valid swc file is the tree +// topology condition pid.x[i] < id.x[i] + + +proc init() { + quiet = 0 + filetype = "SWC" + vectors = new List() + header = new List() + lines = new List() +} + +func id2index() { + return id2index_.x[$1] +} +func pix2ix() {local pid_ + pid_ = pid.x[$1] + if (pid_ < 0) { return -1 } + return id2index_.x[pid_] +} + +proc input() { + err = 0 + rdfile($s1) + check_pid() // and also creates id2index_ + sectionify() // create point2sec index map + mksections() // Import3dSection list +// instantiate() +} + +proc rdfile() {local i + file = new File($s1) + // count lines for vector allocation space (not really necessary) + if (!file.ropen()) { + err = 1 + printf("could not open %s\n", $s1) + } + for (i = 0; !file.eof(); i += 1) { + file.gets(line) + } + file.close() +// printf("%s has %d lines\n", $s1, i) + alloc(i, id, type, x, y, z, d, pid, iline) + file.ropen() + for (i = 1; !file.eof(); i += 1) { + file.gets(line) + parse(i, line) + } + file.close() +} + +proc alloc() { local i // $oi.size = 0 but enough space for $1 elements + for i = 2, numarg() { + $oi = new Vector($1) + $oi.resize(0) + vectors.append($oi) + } +} + +proc parse() {local i, n + n = sscanf($s2, "%f %f %f %f %f %f %f", &a[0], &a[1], &a[2],\ + &a[3], &a[4], &a[5], &a[6]) + if (n == 7) { + a[5] *= 2 // radius to diameter + for i=0, 6 { + vectors.object(i).append(a[i]) + } + iline.append($1) // for error messages + hoc_sf_.left($s2, hoc_sf_.len($s2)-1) + lines.append(new String($s2)) + } else if (hoc_sf_.head($s2, "#", tstr) == 0) { // comment + header.append(new String($s2)) + } else { + err = 1 + printf("error %s line %d: could not parse: %s", file.getname, $1, $s2) +// Note: only swcdata/n120.swc and swcdata/n423.swc last lines are invalid + } +} + +proc pheader() {local i + for i=0, header.count-1 { + printf("%s", header.object(i).s) + } +} + +proc shift_id() { local i, ierr, imin + // Note: swcdata/*.swc have sequential id's + // shift id and pid so that id.x[0] == 0. Then verify that + // id.x[i] == i + if (id.size > 0) { + imin = id.min_ind + idoffset = id.x[imin] + // is the first one the smallest? + if (id.x[0] != idoffset) { + err = 1 +printf("error %s lines %d and %d: id's %d and %d are not sequential\n", \ + file.getname, iline.x[0], iline.x[imin], \ + id.x[0], idoffset) + } + id.sub(idoffset) + pid.sub(idoffset) + } + ierr = 0 + for i=0, id.size-1 { + if (id.x[i] != i ) { + err = 1 +printf("error %s line %d: id's shifted by %d are not sequential: id.x[%d] != %g\n", \ + file.getname, iline.x[i], idoffset, i, id.x[i]) + ierr += 1 + } + if (ierr > 5) { break } + } +} + +proc check_pid() {local i, ierr, needsort localobj tobj + // if all pid.x[i] < id.x[i] then we must be 1 or more trees with no loops + // Note: swcdata/*.swc conforms. + needsort = 0 + ierr = 0 + for i=0, id.size-1 { + if (i > 0) if (id.x[i] <= id.x[i-1]) { needsort = 1 } + if (pid.x[i] >= id.x[i]) { + err = 1 +printf("error %s line %d: index %d pid=%d is not less than id=%d\n",\ + file.getname, iline.x[i], i, pid.x[i], id.x[i]) + } + } + if (needsort) { // sort in id order + tobj = id.sortindex() + id.sortindex(id, tobj) + pid.sortindex(pid, tobj) + x.sortindex(x, tobj) + y.sortindex(y, tobj) + z.sortindex(z, tobj) + d.sortindex(diam, tobj) + iline.sortindex(iline, tobj) + } + // the number of trees is just the number of pid's < 0 + // Note: swcdata/*.swc have only one tree + tobj = new Vector() + tobj.indvwhere(pid, "<", 0) + if (tobj.size > 1) { + err = 1 + + if (!quiet) {// added by Sergey to suppress the warning output + +printf("warning %s: more than one tree:\n", file.getname) + printf(" root at line:") + for i=0, tobj.size-1 { + printf(" %d,", iline.x[tobj.x[i]]) + } + printf(" \n") + }// end of quiet + } + // check for duplicate id + for i=1, id.size-1 if (id.x[i] == id.x[i-1]) { + err = 1 +printf("error %s: duplicate id:\n", file.getname) +printf(" %d: %s\n", iline.x[i-1], lines.o(iline.x[i-1]).s) +printf(" %d: %s\n", iline.x[i], lines.o(iline.x[i]).s) + } + // create the id2index_ map + id2index_ = new Vector(id.max()+1) + id2index_.fill(-1) + for i=0, id.size-1 { + id2index_.x[id.x[i]] = i + } +} + +proc sectionify() {local i, si localobj tobj + // create point2sec map and sections list + // point2sec gives immediate knowledge of the section a point is in + // sections list is for display purposes + if (id.size < 2) { return } + + // tobj stores the number of child nodes with pid equal to i + // actually every non-contiguous child adds 1.01 and a contiguous + // child adds 1 + mark_branch(tobj) + + point2sec = new Vector(id.size) + // first point in the root and if only one point it will be interpreted + // as spherical. + point2sec.x[0] = 0 + si = 0 + for i=1, id.size-1 { + if (tobj.x[pix2ix(i)] > 1 || connect2prox.x[i]) { + si += 1 + } + point2sec.x[i] = si + } + sec2point = new Vector(si) + tobj.x[0] = 1 + sec2point.indvwhere(tobj, "!=", 1) + // sec2point.x[i] is the last point of section i + // 0 is the first point of section 0 + // sec2point.x[i-1]+1 is the first point of section i +} + +proc mark_branch() { local i, p + //$o1 is used to store the number of child nodes with pid equal to i + // actually add a bit more than 1 + // if noncontiguous child and 1 if contiguous child + // this is the basic computation that defines sections, i.e. + // contiguous 1's with perhaps a final 0 (a leaf) + // As usual, the only ambiguity will be how to treat the soma + + // Another wrinkle is that we do not want any sections that + // have multiple point types. E.g. point type 1 is often + // associated with the soma. Therefore we identify + // point type changes with branch points. + + // however warn if the first two points do not have the same type + // if single point soma set the spherical_soma flag + if ( type.x[0] != type.x[1]) { + err = 1 + if (0 && !quiet) { +printf("\nNotice: %s:\nThe first two points have different types (%d and %d) but\n a single point NEURON section is not allowed.\n Interpreting the point as the center of a sphere of\n radius %g at location (%g, %g, %g)\n Will represent as 3-point cylinder with L=diam and with all\n children kept at their 1st point positions and connected\n with wire to middle point.\n If this is an incorrect guess, then change the file.\n"\ +, file.getname, type.x[0], type.x[1], d.x[0]/2, x.x[0], y.x[0], z.x[0]) + } + } + + // another wrinkle is that when a dendrite connects to the soma + // by a wire, + // another branch may connect to the first point of that dendrite + // In this case (to avoid single point sections) + // that branch should be connected to position 0 + // of the dendrite (and the first point of that branch should be + // the same position as the first point of the dendrite. + // use connect2prox to indicate the parent point is not + // the distal end but the proximal end of the parent section + connect2prox = new Vector(id.size) + + $o1 = new Vector(id.size) + for i=0, id.size-1 { + p = pix2ix(i) + if (p >= 0) { + $o1.x[p] += 1 + if ( p != i-1) { + $o1.x[p] += .01 +//i noncontiguous with parent and +// if parent is not soma and parent of parent is soma +// then i appended to connect2prox +if (p > 1) if (type.x[p] != 1 && type.x[pix2ix(p)] == 1) { + connect2prox.x[i] = 1 + $o1.x[p] = 1 // p not treated as a 1pt section + err = 1 + if (0 && !quiet) { +printf("\nNotice: %s:\n %d parent is %d which is the proximal point of a section\n connected by a wire to the soma.\n The dendrite is being connected to\n the proximal end of the parent dendrite.\n If this is an incorrect guess, then change the file.\n"\ +, file.getname, id.x[i], id.x[p]) + } +} + + } + if (type.x[p] != type.x[i]) { + // increment enough to get past 1 + // so force end of section but + // not really a branch + $o1.x[p] += .01 + } + } + } +} + +proc mksections() {local i, j, isec, first localobj sec, psec, pts + sections = new List() + isec = 0 + first = 0 + for i=0, id.size-1 { + if (point2sec.x[i] > isec) { + mksection(isec, first, i) + isec += 1 + first = i + } + } + mksection(isec, first, i) +} + +proc mksection() { local i, isec, first localobj sec + isec = $1 first=$2 i=$3 + if (isec > 0) {// branches have pid as first point + sec = new Import3d_Section(first, i-first+1) + pt2sec(pix2ix(first), sec.parentsec) + // but if the parent is the root and the branch has more than + // one point, then connect to center of root with wire + if (point2sec.x[pix2ix(first)] == 0 && i > 1) { + sec.parentx = 0.5 + sec.first = 1 + }else{ + if (pix2ix(first) == 0) { sec.parentx = 0 } + } + sec.append(0, pix2ix(first), 1, x, y, z, d) + sec.append(1, first, i-first, x, y, z, d) + }else{// pid not first point in root section + sec = new Import3d_Section(first, i-first) + sec.append(0, first, i-first, x, y, z, d) + } + sec.type = type.x[first] + sections.append(sec) + if (object_id(sec.parentsec)) { + if (sec.parentsec.type == 1 && sec.type != 1) { + sec.d.x[0] = sec.d.x[1] + } + } + if (connect2prox.x[first]) { + sec.pid = sec.parentsec.id + sec.parentx = 0 + } +} + +func same() { + if ($2 < 0) return 0 + if (x.x[$1] == x.x[$2]) { + if (y.x[$1] == y.x[$2]) { +// if (z.x[$1] == z.x[$2]) { + return 1 +// } + } + } + return 0 +} + +proc instantiate() {local i, isec, psec, pp, si, px + if (id.size < 2) { return } + + sprint(tstr, "~create K[%d]", sec2point.size) + execute(tstr) + + // connect + for i = 2, id.size-1 { + if (point2sec.x[pix2ix(i)] == point2sec.x[i]) { continue } + if (pix2ix(i) == 0) { px = 0 } else { px = 1 } + sprint(tstr, "K[%d] connect K[%d](0), (%g)", \ + point2sec.x[pix2ix(i)], point2sec.x[i], px) + execute(tstr) + } + + // 3-d point info + // needs some thought with regard to interior duplicate + // points, and whether it is appropriate to make the first + // point in the section the same location and diam as the + // pid point + isec = 0 + for i=0, id.size-1 { + if (point2sec.x[i] > isec ) { // in next section + ptadd(pix2ix(i), point2sec.x[i]) + } + isec = point2sec.x[i] + ptadd(i, isec) + } +} + +proc ptadd() { + sprint(tstr, "K[%d] { pt3dadd(%g, %g, %g, %g) }", \ + $2, x.x[$1], y.x[$1], z.x[$1], d.x[$1]) + execute(tstr) +} + +proc label() { + sprint($s2, "Line %d: %s", iline.x[$1], lines.object($1).s) +} +func id2pt() {local i + if ($1 < 0) { + $1 = 0 + }else if ( $1 > id2index_.size-1) { + $1 = id2index_.size-1 + } + return id2index($1) +} +func id2line() { return $1 } +func pt2id() { return id.x[$1] } +func pt2sec() { local i,j //from selpoint + i = point2sec.x[$1] + $o2 = sections.object(i) + j = $1 - $o2.id + if (i > 0) { j += 1 } + return j +} +func sec2pt() {local i + i = sections.object($1).id + $2 + if ($1 > 0) { + i -= 1 + } + return i +} +proc mark() {local i + print $o1, $2, iline, lines + i = id2index($2) + printf("%d %d %g %g: %s\n", i, iline.x[i], x.x[i], y.x[i], lines.object(i).s) + $o1.mark(x.x[i], y.x[i], "S", 12, 4, 1) +} + +proc helptxt() { + xpanel("SWC file filter characteristics") +xlabel(" Sections consist of unbranched sequences of points having") +xlabel("the same type. All sections connect from 0 to 1") +xlabel("(except those connecting to the first point") +xlabel("of the root section connect from 0 to 0).") +xlabel("With one exception, all child sections have as their first pt3d") +xlabel("point a copy of the parent point and the diameter of that first") +xlabel("point is the diameter of the parent point") +xlabel(" The exception, so that the error in area is not so") +xlabel("egregious, is that dendrite branches that connect to the soma") +xlabel("get a copy of the parent point as their first pt3d point but") +xlabel("the diameter of that point is the diameter of the second point") +xlabel(" The root section does not contain an extra parent point.") + xpanel(0) +} +endtemplate Import3d_SWC_read diff --git a/bmtk-vb/bmtk/simulator/bionet/io_tools.py b/bmtk-vb/bmtk/simulator/bionet/io_tools.py new file mode 100644 index 0000000..2ae6289 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/io_tools.py @@ -0,0 +1,38 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h + +from bmtk.simulator.core.io_tools import IOUtils + +pc = h.ParallelContext() +MPI_Rank = int(pc.id()) +MPI_Size = int(pc.nhost()) + + +class NEURONIOUtils(IOUtils): + def __init__(self): + super(NEURONIOUtils, self).__init__() + self.mpi_rank = MPI_Rank + self.mpi_size = MPI_Size + +io = NEURONIOUtils() diff --git a/bmtk-vb/bmtk/simulator/bionet/io_tools.pyc b/bmtk-vb/bmtk/simulator/bionet/io_tools.pyc new file mode 100644 index 0000000..33f4fcd Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/io_tools.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__init__.py b/bmtk-vb/bmtk/simulator/bionet/modules/__init__.py new file mode 100644 index 0000000..7bb45dc --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/modules/__init__.py @@ -0,0 +1,27 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .ecp import EcpMod +from .record_cellvars import MembraneReport, SomaReport, SectionReport +from .record_spikes import SpikesMod +from .xstim import XStimMod +from .save_synapses import SaveSynapses diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__init__.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/__init__.pyc new file mode 100644 index 0000000..750b8ea Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/__init__.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..716edfd Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/ecp.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/ecp.cpython-37.pyc new file mode 100644 index 0000000..b4a1961 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/ecp.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/record_cellvars.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/record_cellvars.cpython-37.pyc new file mode 100644 index 0000000..2ff2541 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/record_cellvars.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/record_spikes.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/record_spikes.cpython-37.pyc new file mode 100644 index 0000000..0330fa3 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/record_spikes.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/save_synapses.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/save_synapses.cpython-37.pyc new file mode 100644 index 0000000..5c98520 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/save_synapses.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/sim_module.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/sim_module.cpython-37.pyc new file mode 100644 index 0000000..8fbd3ba Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/sim_module.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/xstim.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/xstim.cpython-37.pyc new file mode 100644 index 0000000..273b5a3 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/xstim.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/xstim_waveforms.cpython-37.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/xstim_waveforms.cpython-37.pyc new file mode 100644 index 0000000..22d74a6 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/__pycache__/xstim_waveforms.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/ecp.py b/bmtk-vb/bmtk/simulator/bionet/modules/ecp.py new file mode 100644 index 0000000..3ea1059 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/modules/ecp.py @@ -0,0 +1,275 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import h5py +import math +import pandas as pd +from neuron import h +import numpy as np + +from bmtk.simulator.bionet.modules.sim_module import SimulatorMod +from bmtk.utils.sonata.utils import add_hdf5_magic, add_hdf5_version + + +pc = h.ParallelContext() +MPI_RANK = int(pc.id()) +N_HOSTS = int(pc.nhost()) + + +class EcpMod(SimulatorMod): + def __init__(self, tmp_dir, file_name, electrode_positions, contributions_dir, cells=[], variable_name='v', + electrode_channels=None): + self._ecp_output = file_name if os.path.isabs(file_name) else os.path.join(tmp_dir, file_name) + self._positions_file = electrode_positions + self._tmp_outputdir = tmp_dir + self._contributions_dir = contributions_dir if os.path.isabs(contributions_dir) else os.path.join(tmp_dir, contributions_dir) + self._cells = cells + self._rel = None + self._fih1 = None + self._rel_nsites = 0 + self._block_size = 0 + # self._biophys_gids = [] + self._saved_gids = {} + self._nsteps = 0 + + self._tstep = 0 # accumlative time step + # self._rel_time = 0 # + self._block_step = 0 # time step within the given block of time + self._tstep_start_block = 0 + self._data_block = None + self._cell_var_files = {} + + self._tmp_ecp_file = self._get_tmp_fname(MPI_RANK) + self._tmp_ecp_handle = None + # self._tmp_ecp_dataset = None + + self._local_gids = [] + + def _get_tmp_fname(self, rank): + return os.path.join(self._tmp_outputdir, 'tmp_{}_ecp.h5'.format(MPI_RANK)) + + def _create_ecp_file(self, sim): + dt = sim.dt + tstop = sim.tstop + self._nsteps = int(round(tstop/dt)) + + # create file to temporary store ecp data on each rank + self._tmp_ecp_handle = h5py.File(self._tmp_ecp_file, 'a') + self._tmp_ecp_handle.create_dataset('data', (self._nsteps, self._rel_nsites), maxshape=(None, self._rel_nsites), + chunks=True) + + # only the primary node will need to save the final ecp + if MPI_RANK == 0: + with h5py.File(self._ecp_output, 'w') as f5: + add_hdf5_magic(f5) + add_hdf5_version(f5) + f5.create_dataset('data', (self._nsteps, self._rel_nsites), maxshape=(None, self._rel_nsites), + chunks=True) + f5.attrs['dt'] = dt + f5.attrs['tstart'] = 0.0 + f5.attrs['tstop'] = tstop + + # Save channels. Current we record from all channels, may want to be more selective in the future. + f5.create_dataset('channel_id', data=np.arange(self._rel.nsites)) + + pc.barrier() + + def _create_cell_file(self, gid): + file_name = os.path.join(self._contributions_dir, '{}.h5'.format(int(gid))) + file_h5 = h5py.File(file_name, 'a') + self._cell_var_files[gid] = file_h5 + file_h5.create_dataset('data', (self._nsteps, self._rel_nsites), maxshape=(None, self._rel_nsites), chunks=True) + # self._cell_var_files[gid] = file_h5['ecp'] + + def _calculate_ecp(self, sim): + self._rel = RecXElectrode(self._positions_file) + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + #cell = sim.net.get_local_cell(gid) + # cell = sim.net.cells[gid] + self._rel.calc_transfer_resistance(gid, cell.get_seg_coords()) + + self._rel_nsites = self._rel.nsites + sim.h.cvode.use_fast_imem(1) # make i_membrane_ a range variable + + def set_pointers(): + for gid, cell in sim.net.get_local_cells().items(): + #for gid, cell in sim.net.local_cells.items(): + # for gid, cell in sim.net.cells.items(): + cell.set_im_ptr() + self._fih1 = sim.h.FInitializeHandler(0, set_pointers) + + def _save_block(self, interval): + """Add """ + itstart, itend = interval + self._tmp_ecp_handle['data'][itstart:itend, :] += self._data_block[0:(itend - itstart), :] + self._tmp_ecp_handle.flush() + self._data_block[:] = 0.0 + + def _save_ecp(self, sim): + """Save ECP from each rank to disk into a single file""" + block_size = sim.nsteps_block + nblocks, remain = divmod(self._nsteps, block_size) + ivals = [i*block_size for i in range(nblocks+1)] + if remain != 0: + ivals.append(self._nsteps) + + for rank in range(N_HOSTS): # iterate over the ranks + if rank == MPI_RANK: # wait until finished with a particular rank + with h5py.File(self._ecp_output, 'a') as ecp_f5: + for i in range(len(ivals)-1): + ecp_f5['data'][ivals[i]:ivals[i+1], :] += self._tmp_ecp_handle['data'][ivals[i]:ivals[i+1], :] + + pc.barrier() + + def _save_cell_vars(self, interval): + itstart, itend = interval + + for gid, data in self._saved_gids.items(): + h5_file = self._cell_var_files[gid] + h5_file['data'][itstart:itend, :] = data[0:(itend-itstart), :] + h5_file.flush() + data[:] = 0.0 + + def _delete_tmp_files(self): + if os.path.exists(self._tmp_ecp_file): + os.remove(self._tmp_ecp_file) + + def initialize(self, sim): + if self._contributions_dir and (not os.path.exists(self._contributions_dir)) and MPI_RANK == 0: + os.makedirs(self._contributions_dir) + pc.barrier() + + self._block_size = sim.nsteps_block + + # Get list of gids being recorded + selected_gids = set(sim.net.get_node_set(self._cells).gids()) + self._local_gids = list(set(sim.biophysical_gids) & selected_gids) + + self._calculate_ecp(sim) + self._create_ecp_file(sim) + + # ecp data + self._data_block = np.zeros((self._block_size, self._rel_nsites)) + + # create list of all cells whose ecp values will be saved separetly + self._saved_gids = {gid: np.empty((self._block_size, self._rel_nsites)) + for gid in self._local_gids} + for gid in self._saved_gids.keys(): + self._create_cell_file(gid) + + pc.barrier() + + def step(self, sim, tstep): + for gid in self._local_gids: # compute ecp only from the biophysical cells + cell = sim.net.get_cell_gid(gid) + #cell = sim.net.get_local_cell(gid) + # cell = sim.net.cells[gid] + im = cell.get_im() + tr = self._rel.get_transfer_resistance(gid) + ecp = np.dot(tr, im) + + if gid in self._saved_gids.keys(): + # save individual contribution + self._saved_gids[gid][self._block_step, :] = ecp + + # add to total ecp contribution + self._data_block[self._block_step, :] += ecp + + self._block_step += 1 + + def block(self, sim, block_interval): + self._save_block(block_interval) + # self._save_ecp(block_interval) + self._save_cell_vars(block_interval) + + self._block_step = 0 + self._tstep_start_block = self._tstep + + def finalize(self, sim): + if self._block_step > 0: + # just in case the simulation doesn't end on a block step + self.block(sim, (sim.n_steps - self._block_step, sim.n_steps)) + + self._save_ecp(sim) + self._delete_tmp_files() + pc.barrier() + + +class RecXElectrode(object): + """Extracellular electrode + + """ + + def __init__(self, positions): + """Create an array""" + # self.conf = conf + electrode_file = positions # self.conf["recXelectrode"]["positions"] + + # convert coordinates to ndarray, The first index is xyz and the second is the channel number + el_df = pd.read_csv(electrode_file, sep=' ') + self.pos = el_df[['x_pos', 'y_pos', 'z_pos']].T.values + #self.pos = el_df.as_matrix(columns=['x_pos', 'y_pos', 'z_pos']).T + self.nsites = self.pos.shape[1] + # self.conf['run']['nsites'] = self.nsites # add to the config + self.transfer_resistances = {} # V_e = transfer_resistance*Im + + def drift(self): + # will include function to model electrode drift + pass + + def get_transfer_resistance(self, gid): + return self.transfer_resistances[gid] + + def calc_transfer_resistance(self, gid, seg_coords): + """Precompute mapping from segment to electrode locations""" + sigma = 0.3 # mS/mm + + r05 = (seg_coords['p0'] + seg_coords['p1']) / 2 + dl = seg_coords['p1'] - seg_coords['p0'] + + nseg = r05.shape[1] + + tr = np.zeros((self.nsites, nseg)) + + for j in range(self.nsites): # calculate mapping for each site on the electrode + rel = np.expand_dims(self.pos[:, j], axis=1) # coordinates of a j-th site on the electrode + rel_05 = rel - r05 # distance between electrode and segment centers + + # compute dot product column-wise, the resulting array has as many columns as original + r2 = np.einsum('ij,ij->j', rel_05, rel_05) + + # compute dot product column-wise, the resulting array has as many columns as original + rlldl = np.einsum('ij,ij->j', rel_05, dl) + dlmag = np.linalg.norm(dl, axis=0) # length of each segment + rll = abs(rlldl / dlmag) # component of r parallel to the segment axis it must be always positive + rT2 = r2 - rll ** 2 # square of perpendicular component + up = rll + dlmag / 2 + low = rll - dlmag / 2 + num = up + np.sqrt(up ** 2 + rT2) + den = low + np.sqrt(low ** 2 + rT2) + tr[j, :] = np.log(num / den) / dlmag # units of (um) use with im_ (total seg current) + np.copyto(tr[j, :], 0, where=(dlmag == 0)) # zero out stub segments + + tr *= 1 / (4 * math.pi * sigma) + self.transfer_resistances[gid] = tr diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/ecp.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/ecp.pyc new file mode 100644 index 0000000..d3fd9d9 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/ecp.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/record_cellvars.py b/bmtk-vb/bmtk/simulator/bionet/modules/record_cellvars.py new file mode 100644 index 0000000..91a0ace --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/modules/record_cellvars.py @@ -0,0 +1,212 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import h5py +import numpy as np +from neuron import h + +from bmtk.simulator.bionet.modules.sim_module import SimulatorMod +from bmtk.simulator.bionet.io_tools import io + +from bmtk.utils.io import cell_vars +try: + # Check to see if h5py is built to run in parallel + if h5py.get_config().mpi: + MembraneRecorder = cell_vars.CellVarRecorderParallel + else: + MembraneRecorder = cell_vars.CellVarRecorder + +except Exception as e: + MembraneRecorder = cell_vars.CellVarRecorder + +MembraneRecorder._io = io + +pc = h.ParallelContext() +MPI_RANK = int(pc.id()) +N_HOSTS = int(pc.nhost()) + + +def first_element(lst): + return lst[0] + + +transforms_table = { + 'first_element': first_element, +} + + +class MembraneReport(SimulatorMod): + def __init__(self, tmp_dir, file_name, variable_name, cells, sections='all', buffer_data=True, transform={}): + """Module used for saving NEURON cell properities at each given step of the simulation. + + :param tmp_dir: + :param file_name: name of h5 file to save variable. + :param variables: list of cell variables to record + :param gids: list of gids to to record + :param sections: + :param buffer_data: Set to true then data will be saved to memory until written to disk during each block, reqs. + more memory but faster. Set to false and data will be written to disk on each step (default: True) + """ + self._all_variables = list(variable_name) + self._variables = list(variable_name) + self._transforms = {} + # self._special_variables = [] + for var_name, fnc_name in transform.items(): + if fnc_name is None or len(fnc_name) == 0: + del self._transforms[var_name] + continue + + fnc = transforms_table[fnc_name] + self._transforms[var_name] = fnc + self._variables.remove(var_name) + + self._tmp_dir = tmp_dir + + self._file_name = file_name if os.path.isabs(file_name) else os.path.join(tmp_dir, file_name) + self._all_gids = cells + self._local_gids = [] + self._sections = sections + + self._var_recorder = MembraneRecorder(self._file_name, self._tmp_dir, self._all_variables, + buffer_data=buffer_data, mpi_rank=MPI_RANK, mpi_size=N_HOSTS) + + self._gid_list = [] # list of all gids that will have their variables saved + self._data_block = {} # table of variable data indexed by [gid][variable] + self._block_step = 0 # time step within a given block + + def _get_gids(self, sim): + # get list of gids to save. Will only work for biophysical cells saved on the current MPI rank + selected_gids = set(sim.net.get_node_set(self._all_gids).gids()) + self._local_gids = list(set(sim.biophysical_gids) & selected_gids) + + def _save_sim_data(self, sim): + self._var_recorder.tstart = 0.0 + self._var_recorder.tstop = sim.tstop + self._var_recorder.dt = sim.dt + + def initialize(self, sim): + self._get_gids(sim) + self._save_sim_data(sim) + + # TODO: get section by name and/or list of section ids + # Build segment/section list + sec_list = [] + seg_list = [] + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + cell.store_segments() + for sec_id, sec in enumerate(cell.get_sections()): + for seg in sec: + # TODO: Make sure the seg has the recorded variable(s) + sec_list.append(sec_id) + seg_list.append(seg.x) + + # sec_list = [cell.get_sections_id().index(sec) for sec in cell.get_sections()] + # seg_list = [seg.x for seg in cell.get_segments()] + + self._var_recorder.add_cell(gid, sec_list, seg_list) + + self._var_recorder.initialize(sim.n_steps, sim.nsteps_block) + + def step(self, sim, tstep): + # save all necessary cells/variables at the current time-step into memory + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + + for var_name in self._variables: + seg_vals = [getattr(seg, var_name) for seg in cell.get_segments()] + self._var_recorder.record_cell(gid, var_name, seg_vals, tstep) + + for var_name, fnc in self._transforms.items(): + seg_vals = [fnc(getattr(seg, var_name)) for seg in cell.get_segments()] + self._var_recorder.record_cell(gid, var_name, seg_vals, tstep) + + self._block_step += 1 + + def block(self, sim, block_interval): + # write variables in memory to file + self._var_recorder.flush() + + def finalize(self, sim): + # TODO: Build in mpi signaling into var_recorder + pc.barrier() + self._var_recorder.close() + + pc.barrier() + self._var_recorder.merge() + + +class SomaReport(MembraneReport): + """Special case for when only needing to save the soma variable""" + def __init__(self, tmp_dir, file_name, variable_name, cells, sections='soma', buffer_data=True, transform={}): + super(SomaReport, self).__init__(tmp_dir=tmp_dir, file_name=file_name, variable_name=variable_name, cells=cells, + sections=sections, buffer_data=buffer_data, transform=transform) + + def initialize(self, sim): + self._get_gids(sim) + self._save_sim_data(sim) + + for gid in self._local_gids: + self._var_recorder.add_cell(gid, [0], [0.5]) + self._var_recorder.initialize(sim.n_steps, sim.nsteps_block) + + def step(self, sim, tstep, rel_time=0.0): + # save all necessary cells/variables at the current time-step into memory + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + for var_name in self._variables: + var_val = getattr(cell.hobj.soma[0](0.5), var_name) + self._var_recorder.record_cell(gid, var_name, [var_val], tstep) + + for var_name, fnc in self._transforms.items(): + var_val = getattr(cell.hobj.soma[0](0.5), var_name) + new_val = fnc(var_val) + self._var_recorder.record_cell(gid, var_name, [new_val], tstep) + + self._block_step += 1 + +class SectionReport(MembraneReport): + """For variables like im which have one value per section, not segment""" + + def initialize(self, sim): + self._get_gids(sim) + self._save_sim_data(sim) + + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + sec_list = range(len(cell.get_sections())) + self._var_recorder.add_cell(gid, sec_list, sec_list) + + self._var_recorder.initialize(sim.n_steps, sim.nsteps_block) + + def step(self, sim, tstep): + for gid in self._local_gids: + for var in self._variables: + cell = sim.net.get_cell_gid(gid) + if var == 'im': + vals = cell.get_im() + elif var =='v': + vals = np.array([sec.v for sec in cell.get_sections()]) + self._var_recorder.record_cell(gid, var, vals, tstep) + + self._block_step += 1 diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/record_cellvars.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/record_cellvars.pyc new file mode 100644 index 0000000..21c71d9 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/record_cellvars.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/record_netcons.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/record_netcons.pyc new file mode 100644 index 0000000..d724a65 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/record_netcons.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/record_spikes.py b/bmtk-vb/bmtk/simulator/bionet/modules/record_spikes.py new file mode 100644 index 0000000..4c8751b --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/modules/record_spikes.py @@ -0,0 +1,94 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import csv +import h5py +import numpy as np +from bmtk.simulator.bionet.modules.sim_module import SimulatorMod +from bmtk.utils.io.spike_trains import SpikeTrainWriter + +from neuron import h + + +pc = h.ParallelContext() +MPI_RANK = int(pc.id()) +N_HOSTS = int(pc.nhost()) + + +class SpikesMod(SimulatorMod): + """Module use for saving spikes + + """ + + def __init__(self, tmp_dir, spikes_file_csv=None, spikes_file=None, spikes_file_nwb=None, spikes_sort_order=None): + # TODO: Have option to turn off caching spikes to csv. + def _file_path(file_name): + if file_name is None: + return None + return file_name if os.path.isabs(file_name) else os.path.join(tmp_dir, file_name) + + self._csv_fname = _file_path(spikes_file_csv) + self._save_csv = spikes_file_csv is not None + + self._h5_fname = _file_path(spikes_file) + self._save_h5 = spikes_file is not None + + self._nwb_fname = _file_path(spikes_file_nwb) + self._save_nwb = spikes_file_nwb is not None + + self._tmpdir = tmp_dir + self._sort_order = spikes_sort_order + + self._spike_writer = SpikeTrainWriter(tmp_dir=tmp_dir, mpi_rank=MPI_RANK, mpi_size=N_HOSTS) + + def initialize(self, sim): + # TODO: since it's possible that other modules may need to access spikes, set_spikes_recordings() should + # probably be called in the simulator itself. + sim.set_spikes_recording() + + def block(self, sim, block_interval): + # take spikes from Simulator spikes vector and save to the tmp file + for gid, tVec in sim.spikes_table.items(): + for t in tVec: + self._spike_writer.add_spike(time=t, gid=gid) + + pc.barrier() # wait until all ranks have been saved + sim.set_spikes_recording() # reset recording vector + + def finalize(self, sim): + self._spike_writer.flush() + pc.barrier() + + if self._save_csv: + self._spike_writer.to_csv(self._csv_fname, sort_order=self._sort_order) + pc.barrier() + + if self._save_h5: + self._spike_writer.to_hdf5(self._h5_fname, sort_order=self._sort_order) + pc.barrier() + + if self._save_nwb: + self._spike_writer.to_nwb(self._nwb_fname, sort_order=self._sort_order) + pc.barrier() + + self._spike_writer.close() diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/record_spikes.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/record_spikes.pyc new file mode 100644 index 0000000..dcd53a8 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/record_spikes.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/save_synapses.py b/bmtk-vb/bmtk/simulator/bionet/modules/save_synapses.py new file mode 100644 index 0000000..396aa7d --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/modules/save_synapses.py @@ -0,0 +1,235 @@ +import os +import csv +import h5py +import numpy as np +from neuron import h + +from .sim_module import SimulatorMod +from bmtk.simulator.bionet.biocell import BioCell +from bmtk.simulator.bionet.io_tools import io +from bmtk.simulator.bionet.pointprocesscell import PointProcessCell + + +pc = h.ParallelContext() +MPI_RANK = int(pc.id()) +N_HOSTS = int(pc.nhost()) + + +class SaveSynapses(SimulatorMod): + def __init__(self, network_dir, single_file=False, **params): + self._network_dir = network_dir + self._virt_lookup = {} + self._gid_lookup = {} + self._sec_lookup = {} + if not os.path.exists(network_dir): + os.makedirs(network_dir) + + if N_HOSTS > 1: + io.log_exception('save_synapses module is not current supported with mpi') + + self._syn_writer = ConnectionWriter(network_dir) + + def _print_nc(self, nc, src_nid, trg_nid, cell, src_pop, trg_pop, edge_type_id): + if isinstance(cell, BioCell): + sec_x = nc.postloc() + sec = h.cas() + sec_id = self._sec_lookup[cell.gid][sec] #cell.get_section_id(sec) + h.pop_section() + self._syn_writer.add_bio_conn(edge_type_id, src_nid, src_pop, trg_nid, trg_pop, nc.weight[0], sec_id, sec_x) + # print '{} ({}) <-- {} ({}), {}, {}, {}, {}'.format(trg_nid, trg_pop, src_nid, src_pop, nc.weight[0], nc.delay, sec_id, sec_x) + + else: + self._syn_writer.add_point_conn(edge_type_id, src_nid, src_pop, trg_nid, trg_pop, nc.weight[0]) + #print '{} ({}) <-- {} ({}), {}, {}'.format(trg_nid, trg_pop, src_nid, src_pop, nc.weight[0], nc.delay) + + + def initialize(self, sim): + io.log_info('Saving network connections. This may take a while.') + + # Need a way to look up virtual nodes from nc.pre() + for pop_name, nodes_table in sim.net._virtual_nodes.items(): + for node_id, virt_node in nodes_table.items(): + self._virt_lookup[virt_node.hobj] = (pop_name, node_id) + + # Need to figure out node_id and pop_name from nc.srcgid() + for node_pop in sim.net.node_populations: + pop_name = node_pop.name + for node in node_pop[0::1]: + if node.model_type != 'virtual': + self._gid_lookup[node.gid] = (pop_name, node.node_id) + + for gid, cell in sim.net.get_local_cells().items(): + trg_pop, trg_id = self._gid_lookup[gid] + if isinstance(cell, BioCell): + #from pprint import pprint + #pprint({i: s_name for i, s_name in enumerate(cell.get_sections())}) + #exit() + # sections = cell._syn_seg_ix + self._sec_lookup[gid] = {sec_name: sec_id for sec_id, sec_name in enumerate(cell.get_sections_id())} + + else: + sections = [-1]*len(cell.netcons) + + for nc, edge_type_id in zip(cell.netcons, cell._edge_type_ids): + src_gid = int(nc.srcgid()) + if src_gid == -1: + # source is a virtual node + src_pop, src_id = self._virt_lookup[nc.pre()] + else: + src_pop, src_id = self._gid_lookup[src_gid] + + self._print_nc(nc, src_id, trg_id, cell, src_pop, trg_pop, edge_type_id) + + self._syn_writer.close() + io.log_info(' Done saving network connections.') + + +class ConnectionWriter(object): + class H5Index(object): + def __init__(self, network_dir, src_pop, trg_pop): + # TODO: Merge with NetworkBuilder code for building SONATA files + self._nsyns = 0 + self._n_biosyns = 0 + self._n_pointsyns = 0 + self._block_size = 5 + + self._pop_name = '{}_{}'.format(src_pop, trg_pop) + self._h5_file = h5py.File(os.path.join(network_dir, '{}_edges.h5'.format(self._pop_name)), 'w') + self._pop_root = self._h5_file.create_group('/edges/{}'.format(self._pop_name)) + self._pop_root.create_dataset('edge_group_id', (self._block_size, ), dtype=np.uint16, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root.create_dataset('source_node_id', (self._block_size, ), dtype=np.uint64, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root['source_node_id'].attrs['node_population'] = src_pop + self._pop_root.create_dataset('target_node_id', (self._block_size, ), dtype=np.uint64, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root['target_node_id'].attrs['node_population'] = trg_pop + self._pop_root.create_dataset('edge_type_id', (self._block_size, ), dtype=np.uint32, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root.create_dataset('0/syn_weight', (self._block_size, ), dtype=np.float, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root.create_dataset('0/sec_id', (self._block_size, ), dtype=np.uint64, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root.create_dataset('0/sec_x', (self._block_size, ), chunks=(self._block_size, ), + maxshape=(None, ), dtype=np.float) + self._pop_root.create_dataset('1/syn_weight', (self._block_size, ), dtype=np.float, + chunks=(self._block_size, ), maxshape=(None, )) + + def _add_conn(self, edge_type_id, src_id, trg_id, grp_id): + self._pop_root['edge_type_id'][self._nsyns] = edge_type_id + self._pop_root['source_node_id'][self._nsyns] = src_id + self._pop_root['target_node_id'][self._nsyns] = trg_id + self._pop_root['edge_group_id'][self._nsyns] = grp_id + + self._nsyns += 1 + if self._nsyns % self._block_size == 0: + self._pop_root['edge_type_id'].resize((self._nsyns + self._block_size,)) + self._pop_root['source_node_id'].resize((self._nsyns + self._block_size, )) + self._pop_root['target_node_id'].resize((self._nsyns + self._block_size, )) + self._pop_root['edge_group_id'].resize((self._nsyns + self._block_size, )) + + def add_bio_conn(self, edge_type_id, src_id, trg_id, syn_weight, sec_id, sec_x): + self._add_conn(edge_type_id, src_id, trg_id, 0) + self._pop_root['0/syn_weight'][self._n_biosyns] = syn_weight + self._pop_root['0/sec_id'][self._n_biosyns] = sec_id + self._pop_root['0/sec_x'][self._n_biosyns] = sec_x + + self._n_biosyns += 1 + if self._n_biosyns % self._block_size == 0: + self._pop_root['0/syn_weight'].resize((self._n_biosyns + self._block_size, )) + self._pop_root['0/sec_id'].resize((self._n_biosyns + self._block_size, )) + self._pop_root['0/sec_x'].resize((self._n_biosyns + self._block_size, )) + + def add_point_conn(self, edge_type_id, src_id, trg_id, syn_weight): + self._add_conn(edge_type_id, src_id, trg_id, 1) + self._pop_root['1/syn_weight'][self._n_pointsyns] = syn_weight + + self._n_pointsyns += 1 + if self._n_pointsyns % self._block_size == 0: + self._pop_root['1/syn_weight'].resize((self._n_pointsyns + self._block_size, )) + + def clean_ends(self): + self._pop_root['source_node_id'].resize((self._nsyns,)) + self._pop_root['target_node_id'].resize((self._nsyns,)) + self._pop_root['edge_group_id'].resize((self._nsyns,)) + self._pop_root['edge_type_id'].resize((self._nsyns,)) + + self._pop_root['0/syn_weight'].resize((self._n_biosyns,)) + self._pop_root['0/sec_id'].resize((self._n_biosyns,)) + self._pop_root['0/sec_x'].resize((self._n_biosyns,)) + + self._pop_root['1/syn_weight'].resize((self._n_pointsyns,)) + + eg_ds = self._pop_root.create_dataset('edge_group_index', (self._nsyns, ), dtype=np.uint64) + bio_count, point_count = 0, 0 + for idx, grp_id in enumerate(self._pop_root['edge_group_id']): + if grp_id == 0: + eg_ds[idx] = bio_count + bio_count += 1 + elif grp_id == 1: + eg_ds[idx] = point_count + point_count += 1 + + self._create_index('target') + + def _create_index(self, index_type='target'): + if index_type == 'target': + edge_nodes = np.array(self._pop_root['target_node_id'], dtype=np.int64) + output_grp = self._pop_root.create_group('indicies/target_to_source') + elif index_type == 'source': + edge_nodes = np.array(self._pop_root['source_node_id'], dtype=np.int64) + output_grp = self._pop_root.create_group('indicies/source_to_target') + + edge_nodes = np.append(edge_nodes, [-1]) + n_targets = np.max(edge_nodes) + ranges_list = [[] for _ in xrange(n_targets + 1)] + + n_ranges = 0 + begin_index = 0 + cur_trg = edge_nodes[begin_index] + for end_index, trg_gid in enumerate(edge_nodes): + if cur_trg != trg_gid: + ranges_list[cur_trg].append((begin_index, end_index)) + cur_trg = int(trg_gid) + begin_index = end_index + n_ranges += 1 + + node_id_to_range = np.zeros((n_targets + 1, 2)) + range_to_edge_id = np.zeros((n_ranges, 2)) + range_index = 0 + for node_index, trg_ranges in enumerate(ranges_list): + if len(trg_ranges) > 0: + node_id_to_range[node_index, 0] = range_index + for r in trg_ranges: + range_to_edge_id[range_index, :] = r + range_index += 1 + node_id_to_range[node_index, 1] = range_index + + output_grp.create_dataset('range_to_edge_id', data=range_to_edge_id, dtype='uint64') + output_grp.create_dataset('node_id_to_range', data=node_id_to_range, dtype='uint64') + + def __init__(self, network_dir): + self._network_dir = network_dir + self._pop_groups = {} + + def _group_key(self, src_pop, trg_pop): + return (src_pop, trg_pop) + + def _get_edge_group(self, src_pop, trg_pop): + grp_key = self._group_key(src_pop, trg_pop) + if grp_key not in self._pop_groups: + self._pop_groups[grp_key] = self.H5Index(self._network_dir, src_pop, trg_pop) + + return self._pop_groups[grp_key] + + def add_bio_conn(self, edge_type_id, src_id, src_pop, trg_id, trg_pop, syn_weight, sec_id, sec_x): + h5_grp = self._get_edge_group(src_pop, trg_pop) + h5_grp.add_bio_conn(edge_type_id, src_id, trg_id, syn_weight, sec_id, sec_x) + + def add_point_conn(self, edge_type_id, src_id, src_pop, trg_id, trg_pop, syn_weight): + h5_grp = self._get_edge_group(src_pop, trg_pop) + h5_grp.add_point_conn(edge_type_id, src_id, trg_id, syn_weight) + + def close(self): + for _, h5index in self._pop_groups.items(): + h5index.clean_ends() diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/save_synapses.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/save_synapses.pyc new file mode 100644 index 0000000..2e7d394 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/save_synapses.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/sim_module.py b/bmtk-vb/bmtk/simulator/bionet/modules/sim_module.py new file mode 100644 index 0000000..f04e469 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/modules/sim_module.py @@ -0,0 +1,72 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class SimulatorMod(object): + """Class for writing custom bionet functions that will be called during the simulation. To use overwrite one or + more of the following methods in a subclass, and bionet will call the function at the appropiate time. + + To call during a simulation: + ... + sim = Simulation(...) + mymod = MyModule(...) + sim.add_mod(mymod) + sim.run() + + """ + + def initialize(self, sim): + """Will be called once at the beginning of the simulation run, after the network and simulation parameters have + all been finalized. + + :param sim: Simulation object + """ + pass + + def step(self, sim, tstep): + """Called on every single time step (dt). + + The step method is used for anything that should be recorded or changed continously. dt is determined during + the setup, and the sim parameter can be used to access simulation, network and individual cell properties + + :param sim: Simulation object. + :param tstep: The decrete time-step + """ + pass + + def block(self, sim, block_interval): + """This method is called once after every block of time, as specified by the configuration. + + Unlike the step method which is called during every time-step, the block method will typically be called only a + few times over the entire simulation. The block method is preferable for accessing and saving to the disk, + summing up existing data, or simular functionality + + :param sim: Simulation object + :param block_interval: The time interval (tstep_start, tstep_end) for which the block is being called on. + """ + pass + + def finalize(self, sim): + """Call once at the very end of the simulation. + + :param sim: Simulation object + """ + pass diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/sim_module.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/sim_module.pyc new file mode 100644 index 0000000..ce6ce8e Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/sim_module.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/xstim.py b/bmtk-vb/bmtk/simulator/bionet/modules/xstim.py new file mode 100644 index 0000000..f2192ff --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/modules/xstim.py @@ -0,0 +1,163 @@ +import os +import math +import pandas as pd +import numpy as np +import six +from neuron import h + +from bmtk.simulator.bionet.modules.sim_module import SimulatorMod +from bmtk.simulator.bionet.modules.xstim_waveforms import stimx_waveform_factory +from bmtk.simulator.bionet.utils import rotation_matrix +from bmtk.simulator.bionet.io_tools import io + + +class XStimMod(SimulatorMod): + def __init__(self, positions_file, waveform, mesh_files_dir=None, cells=None, set_nrn_mechanisms=True, + node_set=None): + self._positions_file = positions_file + self._mesh_files_dir = mesh_files_dir if mesh_files_dir is not None \ + else os.path.dirname(os.path.realpath(self._positions_file)) + + self._waveform = waveform # TODO: Check if waveform is a file or dict and load it appropiately + + self._set_nrn_mechanisms = set_nrn_mechanisms + self._electrode = None + self._cells = cells + self._local_gids = [] + self._fih = None + + #def __set_extracellular_mechanism(self): + # for gid in self._local_gids: + + def initialize(self, sim): + if self._cells is None: + # if specific gids not listed just get all biophysically detailed cells on this rank + self._local_gids = sim.biophysical_gids + else: + # get subset of selected gids only on this rank + self._local_gids = list(set(sim.local_gids) & set(self._all_gids)) + + self._electrode = StimXElectrode(self._positions_file, self._waveform, self._mesh_files_dir, sim.dt) + for gid in self._local_gids: + # cell = sim.net.get_local_cell(gid) + cell = sim.net.get_cell_gid(gid) + cell.setup_xstim(self._set_nrn_mechanisms) + self._electrode.set_transfer_resistance(gid, cell.get_seg_coords()) + + def set_pointers(): + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + #cell = sim.net.get_local_cell(gid) + cell.set_ptr2e_extracellular() + + self._fih = sim.h.FInitializeHandler(0, set_pointers) + + def step(self, sim, tstep): + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + # Use tstep +1 to match isee-engine existing results. This will make it so that it begins a step earlier + # than if using just tstep. + self._electrode.calculate_waveforms(tstep+1) + vext_vec = self._electrode.get_vext(gid) + cell.set_e_extracellular(vext_vec) + + +class StimXElectrode(object): + """ + Extracellular Stimulating electrode + """ + def __init__(self, positions_file, waveform, mesh_files_dir, dt): + self._dt = dt + self._mesh_files_dir = mesh_files_dir + + stimelectrode_position_df = pd.read_csv(positions_file, sep=' ') + + self.elmesh_files = stimelectrode_position_df['electrode_mesh_file'] + self.elpos = stimelectrode_position_df[['pos_x', 'pos_y', 'pos_z']].T.values + self.elrot = stimelectrode_position_df[['rotation_x', 'rotation_y', 'rotation_z']].values + self.elnsites = self.elpos.shape[1] # Number of electrodes in electrode file + self.waveform = stimx_waveform_factory(waveform) + + self.trans_X = {} # mapping segment coordinates + self.waveform_amplitude = [] + self.el_mesh = {} + self.el_mesh_size = [] + + self.read_electrode_mesh() + self.rotate_the_electrodes() + self.place_the_electrodes() + + def read_electrode_mesh(self): + el_counter = 0 + for mesh_file in self.elmesh_files: + file_path = mesh_file if os.path.isabs(mesh_file) else os.path.join(self._mesh_files_dir, mesh_file) + mesh = pd.read_csv(file_path, sep=" ") + mesh_size = mesh.shape[0] + self.el_mesh_size.append(mesh_size) + + self.el_mesh[el_counter] = np.zeros((3, mesh_size)) + self.el_mesh[el_counter][0] = mesh['x_pos'] + self.el_mesh[el_counter][1] = mesh['y_pos'] + self.el_mesh[el_counter][2] = mesh['z_pos'] + el_counter += 1 + + def place_the_electrodes(self): + + transfer_vector = np.zeros((self.elnsites, 3)) + + for el in range(self.elnsites): + mesh_mean = np.mean(self.el_mesh[el], axis=1) + transfer_vector[el] = self.elpos[:, el] - mesh_mean[:] + + for el in range(self.elnsites): + new_mesh = self.el_mesh[el].T + transfer_vector[el] + self.el_mesh[el] = new_mesh.T + + def rotate_the_electrodes(self): + for el in range(self.elnsites): + phi_x = self.elrot[el][0] + phi_y = self.elrot[el][1] + phi_z = self.elrot[el][2] + + rot_x = rotation_matrix([1, 0, 0], phi_x) + rot_y = rotation_matrix([0, 1, 0], phi_y) + rot_z = rotation_matrix([0, 0, 1], phi_z) + rot_xy = rot_x.dot(rot_y) + rot_xyz = rot_xy.dot(rot_z) + new_mesh = np.dot(rot_xyz, self.el_mesh[el]) + self.el_mesh[el] = new_mesh + + def set_transfer_resistance(self, gid, seg_coords): + + rho = 300.0 # ohm cm + r05 = seg_coords['p05'] + nseg = r05.shape[1] + cell_map = np.zeros((self.elnsites, nseg)) + for el in six.moves.range(self.elnsites): + + mesh_size = self.el_mesh_size[el] + + for k in range(mesh_size): + + rel = np.expand_dims(self.el_mesh[el][:, k], axis=1) + rel_05 = rel - r05 + r2 = np.einsum('ij,ij->j', rel_05, rel_05) + r = np.sqrt(r2) + if not all(i >= 10 for i in r): + io.log_exception('External electrode is too close') + cell_map[el, :] += 1. / r + + cell_map *= (rho / (4 * math.pi)) * 0.01 + self.trans_X[gid] = cell_map + + def calculate_waveforms(self, tstep): + simulation_time = self._dt * tstep + # copies waveform elnsites times (homogeneous) + self.waveform_amplitude = np.zeros(self.elnsites) + self.waveform.calculate(simulation_time) + + def get_vext(self, gid): + waveform_per_mesh = np.divide(self.waveform_amplitude, self.el_mesh_size) + v_extracellular = np.dot(waveform_per_mesh, self.trans_X[gid]) * 1E6 + vext_vec = h.Vector(v_extracellular) + + return vext_vec diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/xstim.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/xstim.pyc new file mode 100644 index 0000000..72dd0f7 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/xstim.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/xstim_waveforms.py b/bmtk-vb/bmtk/simulator/bionet/modules/xstim_waveforms.py new file mode 100644 index 0000000..86e204d --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/modules/xstim_waveforms.py @@ -0,0 +1,127 @@ +import os +import numpy as np +import pandas as pd +import json +from six import string_types + +from bmtk.simulator.bionet.io_tools import io + +class BaseWaveform(object): + """Abstraction of waveform class to ensure calculate method is implemented""" + def calculate(self, simulation_time): + raise NotImplementedError("Implement specific waveform calculation") + + +class BaseWaveformType(object): + """Specific waveform type""" + def __init__(self, waveform_config): + self.amp = float(waveform_config["amp"]) # units? mA? + self.delay = float(waveform_config["del"]) # ms + self.duration = float(waveform_config["dur"]) # ms + + def is_active(self, simulation_time): + stop_time = self.delay + self.duration + return self.delay < simulation_time < stop_time + + +class WaveformTypeDC(BaseWaveformType, BaseWaveform): + """DC (step) waveform""" + def __init__(self, waveform_config): + super(WaveformTypeDC, self).__init__(waveform_config) + + def calculate(self, t): # TODO better name + if self.is_active(t): + return self.amp + else: + return 0 + + +class WaveformTypeSin(BaseWaveformType, BaseWaveform): + """Sinusoidal waveform""" + def __init__(self, waveform_config): + super(WaveformTypeSin, self).__init__(waveform_config) + self.freq = float(waveform_config["freq"]) # Hz + self.phase_offset = float(waveform_config.get("phase", np.pi)) # radians, optional + self.amp_offset = float(waveform_config.get("offset", 0)) # units? mA? optional + + def calculate(self, t): # TODO better name + if self.is_active(t): + f = self.freq / 1000. # Hz to mHz + a = self.amp + return a * np.sin(2 * np.pi * f * t + self.phase_offset) + self.amp_offset + else: + return 0 + + +class WaveformCustom(BaseWaveform): + """Custom waveform defined by csv file""" + def __init__(self, waveform_file): + self.definition = pd.read_csv(waveform_file, sep='\t') + + def calculate(self, t): + return np.interp(t, self.definition["time"], self.definition["amplitude"]) + + +class ComplexWaveform(BaseWaveform): + """Superposition of simple waveforms""" + def __init__(self, el_collection): + self.electrodes = el_collection + + def calculate(self, t): + val = 0 + for el in self.electrodes: + val += el.calculate(t) + + return val + + +# mapping from 'shape' code to subclass, always lowercase +shape_classes = { + 'dc': WaveformTypeDC, + 'sin': WaveformTypeSin, +} + + +def stimx_waveform_factory(waveform): + """ + Factory to create correct waveform class based on conf. + Supports json config in conf as well as string pointer to a file. + :rtype: BaseWaveformType + """ + if isinstance(waveform, string_types): + # if waveform_conf is str or unicode assume to be name of file in stim_dir + # waveform_conf = str(waveform_conf) # make consistent + file_ext = os.path.splitext(waveform) + if file_ext == 'csv': + return WaveformCustom(waveform) + + elif file_ext == 'json': + with open(waveform, 'r') as f: + waveform = json.load(f) + else: + io.log_warning('Unknwon filetype for waveform') + + shape_key = waveform["shape"].lower() + + if shape_key not in shape_classes: + io.log_warning("Waveform shape not known") # throw error? + + Constructor = shape_classes[shape_key] + return Constructor(waveform) + + +def iclamp_waveform_factory(conf): + """ + Factory to create correct waveform class based on conf. + Supports json config in conf as well as string pointer to a file. + :rtype: BaseWaveformType + """ + iclamp_waveform_conf = conf["iclamp"] + + shape_key = iclamp_waveform_conf["shape"].lower() + + if shape_key not in shape_classes: + io.log_warning('iclamp waveform shape not known') # throw error? + + Constructor = shape_classes[shape_key] + return Constructor(iclamp_waveform_conf) \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/bionet/modules/xstim_waveforms.pyc b/bmtk-vb/bmtk/simulator/bionet/modules/xstim_waveforms.pyc new file mode 100644 index 0000000..560ade8 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/modules/xstim_waveforms.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/morphology.py b/bmtk-vb/bmtk/simulator/bionet/morphology.py new file mode 100644 index 0000000..b0085fc --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/morphology.py @@ -0,0 +1,245 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from neuron import h + + +pc = h.ParallelContext() # object to access MPI methods + + +class Morphology(object): + """Methods for processing morphological data""" + def __init__(self, hobj): + """reuse hoc object from one of the cells which share the same morphology/model""" + self.hobj = hobj + self.sec_type_swc = {'soma': 1, 'somatic': 1, # convert section name and section list names + 'axon': 2, 'axonal': 2, # into a consistent swc notation + 'dend': 3, 'basal': 3, + 'apic': 4, 'apical': 4} + self.nseg = self.get_nseg() + self._segments = {} + + def get_nseg(self): + nseg = 0 + for sec in self.hobj.all: + nseg += sec.nseg # get the total # of segments in the cell + return nseg + + def get_soma_pos(self): + n3dsoma = 0 + r3dsoma = np.zeros(3) + for sec in self.hobj.somatic: + n3d = int(h.n3d()) # get number of n3d points in each section + r3d = np.zeros((3, n3d)) # to hold locations of 3D morphology for the current section + n3dsoma += n3d + + for i in range(n3d): + r3dsoma[0] += h.x3d(i) + r3dsoma[1] += h.y3d(i) + r3dsoma[2] += h.z3d(i) + + r3dsoma /= n3dsoma + return r3dsoma + + def calc_seg_coords(self): + """Calculate segment coordinates from 3d point coordinates""" + ix = 0 # segment index + + p3dsoma = self.get_soma_pos() + self.psoma = p3dsoma + + p0 = np.zeros((3, self.nseg)) # hold the coordinates of segment starting points + p1 = np.zeros((3, self.nseg)) # hold the coordinates of segment end points + p05 = np.zeros((3, self.nseg)) + d0 = np.zeros(self.nseg) + d1 = np.zeros(self.nseg) + + for sec in self.hobj.all: + n3d = int(h.n3d()) # get number of n3d points in each section + p3d = np.zeros((3, n3d)) # to hold locations of 3D morphology for the current section + l3d = np.zeros(n3d) # to hold locations of 3D morphology for the current section + diam3d = np.zeros(n3d) # to diameters + + for i in range(n3d): + p3d[0, i] = h.x3d(i) - p3dsoma[0] + p3d[1, i] = h.y3d(i) - p3dsoma[1] # shift coordinates such to place soma at the origin. + p3d[2, i] = h.z3d(i) - p3dsoma[2] + diam3d[i] = h.diam3d(i) + l3d[i] = h.arc3d(i) + + l3d /= sec.L # normalize + nseg = sec.nseg + + l0 = np.zeros(nseg) # keep range of segment starting point + l1 = np.zeros(nseg) # keep range of segment ending point + l05 = np.zeros(nseg) + + for iseg, seg in enumerate(sec): + l0[iseg] = seg.x - 0.5*1/nseg # x (normalized distance along the section) for the beginning of the segment + l1[iseg] = seg.x + 0.5*1/nseg # x for the end of the segment + l05[iseg] = seg.x + + if n3d != 0: + p0[0, ix:ix+nseg] = np.interp(l0, l3d, p3d[0, :]) + p0[1, ix:ix+nseg] = np.interp(l0, l3d, p3d[1, :]) + p0[2, ix:ix+nseg] = np.interp(l0, l3d, p3d[2, :]) + d0[ix:ix+nseg] = np.interp(l0, l3d, diam3d[:]) + + p1[0, ix:ix+nseg] = np.interp(l1, l3d, p3d[0, :]) + p1[1, ix:ix+nseg] = np.interp(l1, l3d, p3d[1, :]) + p1[2, ix:ix+nseg] = np.interp(l1, l3d, p3d[2, :]) + d1[ix:ix+nseg] = np.interp(l1, l3d, diam3d[:]) + + p05[0,ix:ix+nseg] = np.interp(l05, l3d, p3d[0,:]) + p05[1,ix:ix+nseg] = np.interp(l05, l3d, p3d[1,:]) + p05[2,ix:ix+nseg] = np.interp(l05, l3d, p3d[2,:]) + else: + # If we are dealing with a stub axon, this compartment + # will be zero'd out in the calculation of transfer + # resistance in modules/ecp.py + + if sec not in self.hobj.axonal: + raise Exception("Non-axonal section with 0 3d points (stub)") + + if nseg != 1: + raise Exception("in calc_seg_coords(), n3d = 0, but nseg != 1") + + ix += nseg + + self.seg_coords = {} + + self.seg_coords['p0'] = p0 + self.seg_coords['p1'] = p1 + self.seg_coords['p05'] = p05 + + self.seg_coords['d0'] = d0 + self.seg_coords['d1'] = d1 + + return self.seg_coords + + def set_seg_props(self): + """Set segment properties which are invariant for all cell using this morphology""" + seg_type = [] + seg_area = [] + seg_x = [] + seg_dist = [] + seg_length = [] + + h.distance(sec=self.hobj.soma[0]) # measure distance relative to the soma + + for sec in self.hobj.all: + fullsecname = sec.name() + sec_type = fullsecname.split(".")[1][:4] # get sec name type without the cell name + sec_type_swc = self.sec_type_swc[sec_type] # convert to swc code + + for seg in sec: + + seg_area.append(h.area(seg.x)) + seg_x.append(seg.x) + seg_length.append(sec.L/sec.nseg) + seg_type.append(sec_type_swc) # record section type in a list + seg_dist.append(h.distance(seg.x)) # distance to the center of the segment + + self.seg_prop = {} + self.seg_prop['type'] = np.array(seg_type) + self.seg_prop['area'] = np.array(seg_area) + self.seg_prop['x'] = np.array(seg_x) + self.seg_prop['dist'] = np.array(seg_dist) + self.seg_prop['length'] = np.array(seg_length) + self.seg_prop['dist0'] = self.seg_prop['dist'] - self.seg_prop['length']/2 + self.seg_prop['dist1'] = self.seg_prop['dist'] + self.seg_prop['length']/2 + + def get_target_segments(self, edge_type): + # Determine the target segments and their probabilities of connections for each new edge-type. Save the + # information for each additional time a given edge-type is used on this morphology + # TODO: Don't rely on edge-type-table, just use the edge? + if edge_type in self._segments: + return self._segments[edge_type] + + else: + tar_seg_ix, tar_seg_prob = self.find_sections(edge_type.target_sections, edge_type.target_distance) + self._segments[edge_type] = (tar_seg_ix, tar_seg_prob) + return tar_seg_ix, tar_seg_prob + + """ + tar_sec_labels = edge_type.target_sections + drange = edge_type.target_distance + dmin, dmax = drange[0], drange[1] + + seg_d0 = self.seg_prop['dist0'] # use a more compact variables + seg_d1 = self.seg_prop['dist1'] + seg_length = self.seg_prop['length'] + seg_area = self.seg_prop['area'] + seg_type = self.seg_prop['type'] + + # Find the fractional overlap between the segment and the distance range: + # this is done by finding the overlap between [d0,d1] and [dmin,dmax] + # np.minimum(seg_d1,dmax) find the smaller of the two end locations + # np.maximum(seg_d0,dmin) find the larger of the two start locations + # np.maximum(0,overlap) is used to return zero when segments do not overlap + # and then dividing by the segment length + frac_overlap = np.maximum(0, (np.minimum(seg_d1, dmax) - np.maximum(seg_d0, dmin))) / seg_length + ix_drange = np.where(frac_overlap > 0) # find indexes with non-zero overlap + ix_labels = np.array([], dtype=np.int) + + for tar_sec_label in tar_sec_labels: # find indexes within sec_labels + sec_type = self.sec_type_swc[tar_sec_label] # get swc code for the section label + ix_label = np.where(seg_type == sec_type) + ix_labels = np.append(ix_labels, ix_label) # target segment indexes + + tar_seg_ix = np.intersect1d(ix_drange, ix_labels) # find intersection between indexes for range and labels + tar_seg_length = seg_length[tar_seg_ix] * frac_overlap[tar_seg_ix] # weighted length of targeted segments + tar_seg_prob = tar_seg_length / np.sum(tar_seg_length) # probability of targeting segments + + self._segments[edge_type] = (tar_seg_ix, tar_seg_prob) + return tar_seg_ix, tar_seg_prob + """ + + def find_sections(self, target_sections, distance_range): + dmin, dmax = distance_range[0], distance_range[1] + + seg_d0 = self.seg_prop['dist0'] # use a more compact variables + seg_d1 = self.seg_prop['dist1'] + seg_length = self.seg_prop['length'] + seg_area = self.seg_prop['area'] + seg_type = self.seg_prop['type'] + + # Find the fractional overlap between the segment and the distance range: + # this is done by finding the overlap between [d0,d1] and [dmin,dmax] + # np.minimum(seg_d1,dmax) find the smaller of the two end locations + # np.maximum(seg_d0,dmin) find the larger of the two start locations + # np.maximum(0,overlap) is used to return zero when segments do not overlap + # and then dividing by the segment length + frac_overlap = np.maximum(0, (np.minimum(seg_d1, dmax) - np.maximum(seg_d0, dmin))) / seg_length + ix_drange = np.where(frac_overlap > 0) # find indexes with non-zero overlap + ix_labels = np.array([], dtype=np.int) + + for tar_sec_label in target_sections: # find indexes within sec_labels + sec_type = self.sec_type_swc[tar_sec_label] # get swc code for the section label + ix_label = np.where(seg_type == sec_type) + ix_labels = np.append(ix_labels, ix_label) # target segment indexes + + tar_seg_ix = np.intersect1d(ix_drange, ix_labels) # find intersection between indexes for range and labels + tar_seg_length = seg_length[tar_seg_ix] * frac_overlap[tar_seg_ix] # weighted length of targeted segments + tar_seg_prob = tar_seg_length / np.sum(tar_seg_length) # probability of targeting segments + return tar_seg_ix, tar_seg_prob diff --git a/bmtk-vb/bmtk/simulator/bionet/morphology.pyc b/bmtk-vb/bmtk/simulator/bionet/morphology.pyc new file mode 100644 index 0000000..fe2f023 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/morphology.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/nml_reader.py b/bmtk-vb/bmtk/simulator/bionet/nml_reader.py new file mode 100644 index 0000000..c64b9cd --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/nml_reader.py @@ -0,0 +1,168 @@ +class NMLTree(object): + nml_ns = '{http://www.neuroml.org/schema/neuroml2}' + element_registry = {} + + def __init__(self, nml_path): + from xml.etree import ElementTree + self._nml_path = nml_path + self._nml_root = ElementTree.parse(nml_path).getroot() + #self._relevant_elements = { + # NMLTree.ns_name('channelDensity'): ChannelDensity, + # NMLTree.ns_name('resistivity'): Resistivity + #} + + # For each section store a list of all the NML elements include + self._soma_props = {} + self._axon_props = {} + self._dend_props = {} + self._apic_props = {} + # For lookup by segmentGroup attribute, include common synonyms for diff sections + self._section_maps = { + 'soma': self._soma_props, 'somatic': self._soma_props, + 'axon': self._axon_props, 'axonal': self._axon_props, + 'dend': self._dend_props, 'basal': self._dend_props, 'dendritic': self._dend_props, + 'apic': self._apic_props, 'apical': self._apic_props + } + + self._parse_root(self._nml_root) + + @classmethod + def ns_name(cls, name): + return '{}{}'.format(cls.nml_ns, name) + + @staticmethod + def common_name(elem): + if '}' in elem: + return elem.split('}')[-1] + else: + return elem + + @staticmethod + def parse_value(value): + val_list = value.split(' ') + if len(val_list) == 2: + return float(val_list[0]), val_list[1] + elif len(val_list) == 1: + return float(val_list[0]), 'NONE' + else: + raise Exception('Cannot parse value {}'.format(value)) + + @classmethod + def register_module(cls, element_cls): + cls.element_registry[cls.ns_name(element_cls.element_tag())] = element_cls + return element_cls + + def _parse_root(self, root): + for elem in root.iter(): + if elem.tag in NMLTree.element_registry: + nml_element = NMLTree.element_registry[elem.tag](elem) + self._add_param(nml_element) + + def _add_param(self, nml_element): + seggroup_str = nml_element.section + if seggroup_str is None: + raise Exception('Error: tag {} in {} is missing segmentGroup'.format(nml_element.id, self._nml_path)) + elif seggroup_str.lower() == 'all': + sections = ['soma', 'axon', 'apic', 'dend'] + else: + sections = [seggroup_str.lower()] + + for sec_name in sections: + param_table = self._section_maps[sec_name] + if sec_name in param_table: + raise Exception('Error: {} already has a {} element in {}.'.format(nml_element.id, sec_name, + self._nml_path)) + + self._section_maps[sec_name][nml_element.id] = nml_element + + def __getitem__(self, section_name): + return self._section_maps[section_name] + + +class NMLElement(object): + def __init__(self, nml_element): + self._elem = nml_element + self._attribs = nml_element.attrib + + self.tag_name = NMLTree.common_name(self._elem.tag) + self.section = self._attribs.get('segmentGroup', None) + self.id = self._attribs.get('id', self.tag_name) + + @staticmethod + def element_tag(): + raise NotImplementedError() + + +@NMLTree.register_module +class ChannelDensity(NMLElement): + def __init__(self, nml_element): + super(ChannelDensity, self).__init__(nml_element) + self.ion = self._attribs['ion'] + self.ion_channel = self._attribs['ionChannel'] + + if 'erev' in self._attribs: + v_list = NMLTree.parse_value(self._attribs['erev']) + self.erev = v_list[0] + self.erev_units = v_list[1] + else: + self.erev = None + + v_list = NMLTree.parse_value(self._attribs['condDensity']) + self.cond_density = v_list[0] + self.cond_density_units = v_list[1] + + @staticmethod + def element_tag(): + return 'channelDensity' + + +@NMLTree.register_module +class ChannelDensityNernst(ChannelDensity): + + @staticmethod + def element_tag(): + return 'channelDensityNernst' + + +@NMLTree.register_module +class Resistivity(NMLElement): + def __init__(self, nml_element): + super(Resistivity, self).__init__(nml_element) + v_list = NMLTree.parse_value(self._attribs['value']) + self.value = v_list[0] + self.value_units = v_list[1] + + @staticmethod + def element_tag(): + return 'resistivity' + + +@NMLTree.register_module +class SpecificCapacitance(NMLElement): + def __init__(self, nml_element): + super(SpecificCapacitance, self).__init__(nml_element) + v_list = NMLTree.parse_value(self._attribs['value']) + self.value = v_list[0] + self.value_units = v_list[1] + + @staticmethod + def element_tag(): + return 'specificCapacitance' + + +@NMLTree.register_module +class ConcentrationModel(NMLElement): + def __init__(self, nml_element): + super(ConcentrationModel, self).__init__(nml_element) + self.type = self._attribs['type'] + v_list = NMLTree.parse_value(self._attribs['decay']) + self.decay = v_list[0] + self.decay_units = v_list[1] + + v_list = NMLTree.parse_value(self._attribs['gamma']) + self.gamma = v_list[0] + self.gamma_units = v_list[1] + + @staticmethod + def element_tag(): + return 'concentrationModel' diff --git a/bmtk-vb/bmtk/simulator/bionet/nml_reader.pyc b/bmtk-vb/bmtk/simulator/bionet/nml_reader.pyc new file mode 100644 index 0000000..5db337a Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/nml_reader.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/nrn.py b/bmtk-vb/bmtk/simulator/bionet/nrn.py new file mode 100644 index 0000000..c5f8419 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/nrn.py @@ -0,0 +1,82 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import sys +import os +import glob +import neuron +from neuron import h + +from bmtk.simulator.bionet.pyfunction_cache import py_modules +from bmtk.simulator.bionet.pyfunction_cache import load_py_modules +from bmtk.simulator.bionet.pyfunction_cache import synapse_model, synaptic_weight, cell_model + + +pc = h.ParallelContext() + + +def quit_execution(): # quit the execution with a message + pc.done() + sys.exit() + return + + +def clear_gids(): + pc.gid_clear() + pc.barrier() + + +def load_neuron_modules(mechanisms_dir, templates_dir, default_templates=True): + """ + + :param mechanisms_dir: + :param templates_dir: + :param default_templates: + """ + h.load_file('stdgui.hoc') + + bionet_dir = os.path.dirname(__file__) + # h.load_file(os.path.join(bionet_dir, 'import3d.hoc')) # customized import3d.hoc to supress warnings + # h.load_file('import3d.hoc') + h.load_file(os.path.join(bionet_dir,'default_templates', 'advance.hoc')) + + if mechanisms_dir is not None: + neuron.load_mechanisms(str(mechanisms_dir)) + + # if default_templates: + # load_templates(os.path.join(bionet_dir, 'default_templates')) + + # if templates_dir: + # load_templates(templates_dir) + + +def load_templates(template_dir): + """Load all templates to be available in the hoc namespace for instantiating cells""" + cwd = os.getcwd() + os.chdir(template_dir) + + hoc_templates = glob.glob("*.hoc") + + for hoc_template in hoc_templates: + h.load_file(str(hoc_template)) + + os.chdir(cwd) diff --git a/bmtk-vb/bmtk/simulator/bionet/nrn.pyc b/bmtk-vb/bmtk/simulator/bionet/nrn.pyc new file mode 100644 index 0000000..826481f Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/nrn.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/pointprocesscell.py b/bmtk-vb/bmtk/simulator/bionet/pointprocesscell.py new file mode 100644 index 0000000..8d0d893 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/pointprocesscell.py @@ -0,0 +1,85 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h +import six +from bmtk.simulator.bionet.cell import Cell + + +pc = h.ParallelContext() # object to access MPI methods + + +class PointProcessCell(Cell): + """Implimentation of a Leaky Integrate-and-file neuron type cell.""" + def __init__(self, node, bionetwork): + super(PointProcessCell, self).__init__(node) + self.set_spike_detector() + self._src_gids = [] + self._src_nets = [] + self._edge_type_ids = [] + + def set_spike_detector(self): + nc = h.NetCon(self.hobj, None) + pc.cell(self.gid, nc) + + def set_im_ptr(self): + pass + + def set_syn_connection(self, edge_prop, src_node, stim=None): + syn_params = edge_prop.dynamics_params + nsyns = edge_prop.nsyns + delay = edge_prop.delay + + syn_weight = edge_prop.syn_weight(src_node, self._node) + if not edge_prop.preselected_targets: + # TODO: this is not very robust, need some other way + syn_weight *= syn_params['sign'] * nsyns + + if stim is not None: + src_gid = -1 + nc = h.NetCon(stim.hobj, self.hobj) + else: + src_gid = src_node.node_id + nc = pc.gid_connect(src_gid, self.hobj) + + weight = syn_weight + nc.weight[0] = weight + nc.delay = delay + self._netcons.append(nc) + self._src_gids.append(src_gid) + self._src_nets.append(-1) + self._edge_type_ids.append(edge_prop.edge_type_id) + return nsyns + + def get_connection_info(self): + # TODO: There should be a more effecient and robust way to return synapse information. + return [[self.gid, self._src_gids[i], self.network_name, self._src_nets[i], 'NaN', 'NaN', + self.netcons[i].weight[0], self.netcons[i].delay, self._edge_type_id[i], 1] + for i in range(len(self._src_gids))] + + def print_synapses(self): + rstr = '' + for i in six.moves.range(len(self._src_gids)): + rstr += '{}> <-- {} ({}, {})\n'.format(i, self._src_gids[i], self.netcons[i].weight[0], + self.netcons[i].delay) + + return rstr diff --git a/bmtk-vb/bmtk/simulator/bionet/pointprocesscell.pyc b/bmtk-vb/bmtk/simulator/bionet/pointprocesscell.pyc new file mode 100644 index 0000000..c7ae873 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/pointprocesscell.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/pointsomacell.py b/bmtk-vb/bmtk/simulator/bionet/pointsomacell.py new file mode 100644 index 0000000..0c96594 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/pointsomacell.py @@ -0,0 +1,12 @@ +from neuron import h +from bmtk.simulator.bionet.cell import Cell + + +pc = h.ParallelContext() # object to access MPI methods + + +class PointSomaCell(Cell): + """Used to represent single compartment cells with neural mechanisms""" + def __init__(self): + # TODO: Implement + raise NotImplementedError('Point Soma cell types are not currently implemented.') diff --git a/bmtk-vb/bmtk/simulator/bionet/pointsomacell.pyc b/bmtk-vb/bmtk/simulator/bionet/pointsomacell.pyc new file mode 100644 index 0000000..5e1ce56 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/pointsomacell.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/pyfunction_cache.py b/bmtk-vb/bmtk/simulator/bionet/pyfunction_cache.py new file mode 100644 index 0000000..1fa5a26 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/pyfunction_cache.py @@ -0,0 +1,252 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import types +import warnings +from functools import wraps + + +class _PyFunctions(object): + """Structure for holding custom user-defined python functions. + + Will store a set of functions created by the user. Should not access this directly but rather user the + decorators or setter functions, and use the py_modules class variable to access individual functions. Is divided + up into + synaptic_weight: functions for calcuating synaptic weight. + cell_model: should return NEURON cell hobj. + synapse model: should return a NEURON synapse object. + """ + def __init__(self): + self.__syn_weights = {} + self.__cell_models = {} + self.__synapse_models = {} + self.__cell_processors = {} + + def clear(self): + self.__syn_weights.clear() + self.__cell_models.clear() + self.__synapse_models.clear() + self.__cell_processors.clear() + + def add_synaptic_weight(self, name, func, overwrite=True): + """stores synpatic fuction for given name""" + if overwrite or name not in self.__syn_weights: + self.__syn_weights[name] = func + + @property + def synaptic_weights(self): + """return list of the names of all available synaptic weight functions""" + return self.__syn_weights.keys() + + def synaptic_weight(self, name): + """return the synpatic weight function""" + return self.__syn_weights[name] + + def has_synaptic_weight(self, name): + return name in self.__syn_weights + + def __cell_model_key(self, directive, model_type): + return (directive, model_type) + + def add_cell_model(self, directive, model_type, func, overwrite=True): + key = self.__cell_model_key(directive, model_type) + if overwrite or key not in self.__cell_models: + self.__cell_models[key] = func + + @property + def cell_models(self): + return self.__cell_models.keys() + + def cell_model(self, directive, model_type): + return self.__cell_models[self.__cell_model_key(directive, model_type)] + + def has_cell_model(self, directive, model_type): + return self.__cell_model_key(directive, model_type) in self.__cell_models + + def add_synapse_model(self, name, func, overwrite=True): + if overwrite or name not in self.__synapse_models: + self.__synapse_models[name] = func + + @property + def synapse_models(self): + return self.__synapse_models.keys() + + def synapse_model(self, name): + return self.__synapse_models[name] + + @property + def cell_processors(self): + return self.__cell_processors.keys() + + def cell_processor(self, name): + return self.__cell_processors[name] + + def add_cell_processor(self, name, func, overwrite=True): + if overwrite or name not in self.__syn_weights: + self.__cell_processors[name] = func + + def __repr__(self): + rstr = '{}: {}\n'.format('cell_models', self.cell_models) + rstr += '{}: {}\n'.format('synapse_models', self.synapse_models) + rstr += '{}: {}'.format('synaptic_weights', self.synaptic_weights) + return rstr + +py_modules = _PyFunctions() + + +def synaptic_weight(*wargs, **wkwargs): + """A decorator for registering a function as a synaptic weight function. + To use either + @synaptic_weight + def weight_function(): ... + + or + @synaptic_weight(name='name_in_edge_types') + def weight_function(): ... + + Once the decorator has been attached and imported the functions will automatically be added to py_modules. + """ + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_synaptic_weight(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_synaptic_weight(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def cell_model(*wargs, **wkwargs): + """A decorator for registering NEURON cell loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_cell_model(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_cell_model(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def synapse_model(*wargs, **wkwargs): + """A decorator for registering NEURON synapse loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_synapse_model(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_synapse_model(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def add_weight_function(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_synaptic_weight(func_name, func, overwrite) + + +def add_cell_model(func, directive, model_type, overwrite=True): + assert(callable(func)) + # func_name = name if name is not None else func.__name__ + py_modules.add_cell_model(directive, model_type, func, overwrite) + + +def add_cell_processor(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_cell_processor(func_name, func, overwrite) + + +def add_synapse_model(func, name=None, overwrite=True): + assert (callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_synapse_model(func_name, func, overwrite) + + +def load_py_modules(cell_models=None, syn_models=None, syn_weights=None, cell_processors=None): + # py_modules.clear() + warnings.warn('Do not call this method directly', DeprecationWarning) + if cell_models is not None: + assert(isinstance(cell_models, types.ModuleType)) + for f in [cell_models.__dict__.get(f) for f in dir(cell_models)]: + if isinstance(f, types.FunctionType): + py_modules.add_cell_model(f.__name__, f) + + if syn_models is not None: + assert(isinstance(syn_models, types.ModuleType)) + for f in [syn_models.__dict__.get(f) for f in dir(syn_models)]: + if isinstance(f, types.FunctionType): + py_modules.add_synapse_model(f.__name__, f) + + if syn_weights is not None: + assert(isinstance(syn_weights, types.ModuleType)) + for f in [syn_weights.__dict__.get(f) for f in dir(syn_weights)]: + if isinstance(f, types.FunctionType): + py_modules.add_synaptic_weight(f.__name__, f) + + if cell_processors is not None: + assert(isinstance(cell_processors, types.ModuleType)) + for f in [cell_processors.__dict__.get(f) for f in dir(cell_processors)]: + if isinstance(f, types.FunctionType): + py_modules.add_cell_processor(f.__name__, f) diff --git a/bmtk-vb/bmtk/simulator/bionet/pyfunction_cache.pyc b/bmtk-vb/bmtk/simulator/bionet/pyfunction_cache.pyc new file mode 100644 index 0000000..d325c8b Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/pyfunction_cache.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/schemas/config_schema.json b/bmtk-vb/bmtk/simulator/bionet/schemas/config_schema.json new file mode 100644 index 0000000..780e7bd --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/schemas/config_schema.json @@ -0,0 +1,131 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + + "properties": { + "target_simulator": {"$ref": "#/definitions/target_simulator"}, + "components": {"$ref": "#/definitions/components"}, + "networks": { + "type": "object", + "properties": { + "node_files": {"$ref": "#/definitions/nodes_files"}, + "edge_files": {"$ref": "#/definitions/edges_files"} + } + }, + "run": {"$ref": "#/definitions/run"}, + "groups": {"$ref": "#/definitions/groups"}, + "output": {"$ref": "#/definitions/output"}, + "conditions": {"$ref": "#/definitions/conditions"}, + "input": { + "type": "array", + "items": { + "oneOf": [ + {"$ref": "#/definitions/input_file"} + ] + } + } + }, + + "definitions": { + "target_simulator": { + "type": "string" + }, + + "components": { + "type": "object", + "properties": { + "synaptic_models_dir": {"type": "directory", "exists": true}, + "mechanisms_dir": {"type": "directory", "exists": true}, + "morphologies_dir": {"type": "directory", "exists": true}, + "biophysical_neuron_models_dir": {"type": "directory", "exists": true}, + "point_neuron_models_dir": {"type": "directory", "exists": true}, + "templates_dir": {"type": "directory", "exists": true} + } + }, + + "edges": { + "type": "array", + "items": { + "type": "object", + "properites": { + "edges_file": {"type": "file", "exists": true}, + "edge_types_file": {"type": "file", "exists": true} + } + } + }, + + "nodes": { + "type": "array", + "items": { + "type": "object", + + "properties": { + "nodes_file": {"type": "file", "exists": true}, + "node_types_file": {"type": "file", "exists": true} + } + } + }, + + "run": { + "type": "object", + "properties": { + "tstop": {"type": "number", "minimum": 0}, + "dt": {"type": "number", "minimum": 0}, + "dL": {"type": "number", "minimum": 0}, + "overwrite_output_dir": {"type": "boolean"}, + "spike_threshold": {"type": "number"}, + "save_state": {"type": "boolean"}, + "start_from_state": {"type": "boolean"}, + "nsteps_block": {"type": "number", "minimum": 0}, + "save_cell_vars": {"type": "array"}, + "calc_ecp": {"type": "boolean"}, + "optocell": {"type": "array", "items": {"type": "string"}} + } + }, + + "node_id_selections": { + "type": "object", + "properties": { + "save_cell_vars": {"type": "array", "items": {"type": "number"}} + } + }, + + "output": { + "type": "object", + "properties": { + "log_file": {"type": "file"}, + "spikes_ascii": {"type": "file"}, + "spikes_h5": {"type": "file"}, + "cell_vars_dir": {"type": "file"}, + "extra_cell_vars": {"type": "file"}, + "ecp_file": {"type": "file"}, + "state_dir": {"type": "directory"}, + "output_dir": {"type": "directory"} + } + }, + + "conditions": { + "type": "object", + "properties": { + "celsius": {"type": "number"}, + "v_init": {"type": "number"}, + "cao0": {"type": "number"} + } + }, + + "extracellular_electrode": { + "type": "object", + "properties": { + "positions": {"type": "file"} + } + }, + + "input_file": { + "type": "object", + "properties": { + "format": {"type": "string", "enum": ["nwb", "csv"]}, + "file": {"type": "file", "exists": true} + } + } + } +} diff --git a/bmtk-vb/bmtk/simulator/bionet/schemas/csv_edge_types.json b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_edge_types.json new file mode 100644 index 0000000..b3e6f59 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_edge_types.json @@ -0,0 +1,20 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "edge_type_id": {"required": true}, + "target_query": {"required": false}, + "source_query": {"required": false}, + "weight_max": {"required": true}, + "weight_function": {"required": false}, + "weight_sigma": {"required": false}, + "distance_range": {"required": true}, + "target_sections": {"required": true}, + "delay": {"required": true}, + "params_file": {"required": true}, + "set_params_function": {"required": true} + } +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/bionet/schemas/csv_node_types_external.json b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_node_types_external.json new file mode 100644 index 0000000..5dd3a08 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_node_types_external.json @@ -0,0 +1,11 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "node_type_id": {"required": true}, + "level_of_detail": {"required": true} + } +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/bionet/schemas/csv_node_types_internal.json b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_node_types_internal.json new file mode 100644 index 0000000..6dc2188 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_node_types_internal.json @@ -0,0 +1,15 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "node_type_id": {"required": true}, + "params_file": {"required": true}, + "level_of_detail": {"required": true}, + "morphology_file": {"required": true}, + "rotation_angle_zaxis": {"required": true}, + "set_params_function": {"required": true} + } +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/bionet/schemas/csv_nodes_external.json b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_nodes_external.json new file mode 100644 index 0000000..e7240b0 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_nodes_external.json @@ -0,0 +1,11 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "node_id": {"required": true}, + "node_type_id": {"required": true} + } +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/bionet/schemas/csv_nodes_internal.json b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_nodes_internal.json new file mode 100644 index 0000000..f2287b0 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/schemas/csv_nodes_internal.json @@ -0,0 +1,19 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "node_id": {"required": true}, + "node_type_id": {"required": true}, + "x_soma": {"required": true}, + "y_soma": {"required": true}, + "z_soma": {"required": true}, + "rotation_angle_yaxis": {"required": true}, + "pop_name": {"required": true}, + "ei": {"required": true}, + "location": {"required": false}, + "tuning_angle": {"required": false} + } +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/bionet/sonata_adaptors.py b/bmtk-vb/bmtk/simulator/bionet/sonata_adaptors.py new file mode 100644 index 0000000..91982c6 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/sonata_adaptors.py @@ -0,0 +1,142 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import types +import numpy as np + +from bmtk.simulator.core.sonata_reader import NodeAdaptor, SonataBaseNode, EdgeAdaptor, SonataBaseEdge +from bmtk.simulator.bionet import nrn + + +class BioNode(SonataBaseNode): + @property + def position(self): + return self._prop_adaptor.position(self._node) + + @property + def morphology_file(self): + return self._node['morphology'] + + @property + def rotation_angle_xaxis(self): + return self._prop_adaptor.rotation_angle_xaxis(self._node) + + @property + def rotation_angle_yaxis(self): + # TODO: Combine rotation alnges into a single property + return self._prop_adaptor.rotation_angle_yaxis(self._node) + + @property + def rotation_angle_zaxis(self): + return self._prop_adaptor.rotation_angle_zaxis(self._node) + + def load_cell(self): + model_template = self.model_template + template_name = model_template[1] + model_type = self.model_type + if nrn.py_modules.has_cell_model(self['model_template'], model_type): + cell_fnc = nrn.py_modules.cell_model(self['model_template'], model_type) + else: + cell_fnc = nrn.py_modules.cell_model(model_template[0], model_type) + + dynamics_params = self.dynamics_params + hobj = cell_fnc(self, template_name, dynamics_params) + + for model_processing_str in self.model_processing: + processing_fnc = nrn.py_modules.cell_processor(model_processing_str) + hobj = processing_fnc(hobj, self, dynamics_params) + + return hobj + + +class BioNodeAdaptor(NodeAdaptor): + def get_node(self, sonata_node): + return BioNode(sonata_node, self) + + @classmethod + def patch_adaptor(cls, adaptor, node_group, network): + node_adaptor = NodeAdaptor.patch_adaptor(adaptor, node_group, network) + + # Position + if 'positions' in node_group.all_columns: + node_adaptor.position = types.MethodType(positions, adaptor) + elif 'position' in node_group.all_columns: + node_adaptor.position = types.MethodType(position, adaptor) + else: + node_adaptor.position = types.MethodType(positions_default, adaptor) + + # Rotation angles + if 'rotation_angle_xaxis' in node_group.all_columns: + node_adaptor.rotation_angle_xaxis = types.MethodType(rotation_angle_x, node_adaptor) + else: + node_adaptor.rotation_angle_xaxis = types.MethodType(rotation_angle_default, node_adaptor) + + if 'rotation_angle_yaxis' in node_group.all_columns: + node_adaptor.rotation_angle_yaxis = types.MethodType(rotation_angle_y, node_adaptor) + else: + node_adaptor.rotation_angle_yaxis = types.MethodType(rotation_angle_default, node_adaptor) + + if 'rotation_angle_zaxis' in node_group.all_columns: + node_adaptor.rotation_angle_zaxis = types.MethodType(rotation_angle_z, node_adaptor) + else: + node_adaptor.rotation_angle_zaxis = types.MethodType(rotation_angle_default, node_adaptor) + + return node_adaptor + + +def positions_default(self, node): + return np.array([0.0, 0.0, 0.0]) + + +def positions(self, node): + return node['positions'] + + +def position(self, node): + return node['position'] + + +def rotation_angle_default(self, node): + return 0.0 + + +def rotation_angle_x(self, node): + return node['rotation_angle_xaxis'] + + +def rotation_angle_y(self, node): + return node['rotation_angle_yaxis'] + + +def rotation_angle_z(self, node): + return node['rotation_angle_zaxis'] + + +class BioEdge(SonataBaseEdge): + def load_synapses(self, section_x, section_id): + synapse_fnc = nrn.py_modules.synapse_model(self.model_template) + return synapse_fnc(self.dynamics_params, section_x, section_id) + + +class BioEdgeAdaptor(EdgeAdaptor): + def get_edge(self, sonata_edge): + return BioEdge(sonata_edge, self) diff --git a/bmtk-vb/bmtk/simulator/bionet/sonata_adaptors.pyc b/bmtk-vb/bmtk/simulator/bionet/sonata_adaptors.pyc new file mode 100644 index 0000000..ea79c88 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/sonata_adaptors.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/utils.py b/bmtk-vb/bmtk/simulator/bionet/utils.py new file mode 100644 index 0000000..ca63bc6 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/utils.py @@ -0,0 +1,84 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import numpy as np +import math +import json +import pandas as pd +import h5py + +from neuron import h + + +def rotation_matrix(axis, theta): + """Return the rotation matrix associated with counterclockwise rotation about the given axis by theta radians. + """ + axis = np.asarray(axis) + theta = np.asarray(theta) + axis = axis/math.sqrt(np.dot(axis, axis)) + a = math.cos(theta/2.0) + b, c, d = -axis*math.sin(theta/2.0) + aa, bb, cc, dd = a*a, b*b, c*c, d*d + bc, ad, ac, ab, bd, cd = b*c, a*d, a*c, a*b, b*d, c*d + + return np.array([[aa+bb-cc-dd, 2*(bc+ad), 2*(bd-ac)], + [2*(bc-ad), aa+cc-bb-dd, 2*(cd+ab)], + [2*(bd+ac), 2*(cd-ab), aa+dd-bb-cc]]) + + +def edge_converter_csv(output_dir, csv_file): + """urrently being used by BioNetwork.write_connections(), need to refactor + + :param output_dir: + :param csv_file: + :return: + """ + syns_df = pd.read_csv(csv_file, sep=' ') + for name, group in syns_df.groupby(['trg_network', 'src_network']): + trg_net, src_net = name + group_len = len(group.index) + with h5py.File(os.path.join(output_dir, '{}_{}_edges.h5'.format(trg_net, src_net)), 'w') as conns_h5: + conns_h5.create_dataset('edges/target_gid', data=group['trg_gid']) + conns_h5.create_dataset('edges/source_gid', data=group['src_gid']) + conns_h5.create_dataset('edges/edge_type_id', data=group['edge_type_id']) + conns_h5.create_dataset('edges/edge_group', data=group['connection_group']) + + group_counters = {group_id: 0 for group_id in group.connection_group.unique()} + edge_group_indicies = np.zeros(group_len, dtype=np.uint) + for i, group_id in enumerate(group['connection_group']): + edge_group_indicies[i] = group_counters[group_id] + group_counters[group_id] += 1 + conns_h5.create_dataset('edges/edge_group_indicies', data=edge_group_indicies) + + for group_class, sub_group in group.groupby('connection_group'): + grp = conns_h5.create_group('edges/{}'.format(group_class)) + if group_class == 0: + grp.create_dataset('sec_id', data=sub_group['segment'], dtype='int') + grp.create_dataset('sec_x', data=sub_group['section']) + grp.create_dataset('syn_weight', data=sub_group['weight']) + grp.create_dataset('delay', data=sub_group['delay']) + elif group_class == 1: + grp.create_dataset('syn_weight', data=sub_group['weight']) + grp.create_dataset('delay', data=sub_group['delay']) + else: + print('Unknown cell group {}'.format(group_class)) diff --git a/bmtk-vb/bmtk/simulator/bionet/utils.pyc b/bmtk-vb/bmtk/simulator/bionet/utils.pyc new file mode 100644 index 0000000..efa923f Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/utils.pyc differ diff --git a/bmtk-vb/bmtk/simulator/bionet/virtualcell.py b/bmtk-vb/bmtk/simulator/bionet/virtualcell.py new file mode 100644 index 0000000..64b3929 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/bionet/virtualcell.py @@ -0,0 +1,51 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h + + +class VirtualCell(object): + """Representation of a Virtual/External node""" + + def __init__(self, node, spike_train_dataset): + # VirtualCell is currently not a subclass of bionet.Cell class b/c the parent has a bunch of properties that + # just don't apply to a virtual cell. May want to make bionet.Cell more generic in the future. + self._node_id = node.node_id + self._hobj = None + self._spike_train_dataset = spike_train_dataset + self._train_vec = [] + self.set_stim(node, self._spike_train_dataset) + + @property + def node_id(self): + return self._node_id + + @property + def hobj(self): + return self._hobj + + def set_stim(self, stim_prop, spike_train): + """Gets the spike trains for each individual cell.""" + self._train_vec = h.Vector(spike_train.get_spikes(self.node_id)) + vecstim = h.VecStim() + vecstim.play(self._train_vec) + self._hobj = vecstim diff --git a/bmtk-vb/bmtk/simulator/bionet/virtualcell.pyc b/bmtk-vb/bmtk/simulator/bionet/virtualcell.pyc new file mode 100644 index 0000000..d11300f Binary files /dev/null and b/bmtk-vb/bmtk/simulator/bionet/virtualcell.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/__init__.py b/bmtk-vb/bmtk/simulator/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/bmtk-vb/bmtk/simulator/core/__init__.pyc b/bmtk-vb/bmtk/simulator/core/__init__.pyc new file mode 100644 index 0000000..288e3ee Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/__init__.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..d76cbf5 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/__pycache__/io_tools.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/__pycache__/io_tools.cpython-37.pyc new file mode 100644 index 0000000..0144fff Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/__pycache__/io_tools.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/__pycache__/network_reader.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/__pycache__/network_reader.cpython-37.pyc new file mode 100644 index 0000000..9499c53 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/__pycache__/network_reader.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/__pycache__/node_sets.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/__pycache__/node_sets.cpython-37.pyc new file mode 100644 index 0000000..e8b067d Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/__pycache__/node_sets.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/__pycache__/simulator.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/__pycache__/simulator.cpython-37.pyc new file mode 100644 index 0000000..06c3afe Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/__pycache__/simulator.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/__pycache__/simulator_network.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/__pycache__/simulator_network.cpython-37.pyc new file mode 100644 index 0000000..50dbed5 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/__pycache__/simulator_network.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/config.py b/bmtk-vb/bmtk/simulator/core/config.py new file mode 100644 index 0000000..8a36dc7 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/config.py @@ -0,0 +1,436 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +from bmtk.simulator.utils.config import ConfigDict + +''' +import os +import json +import re +import copy +import datetime +from six import string_types + + +from bmtk.simulator.core.io_tools import io + + +def from_json(config_file, validator=None): + """Builds and validates a configuration json file. + + :param config_file: File object or path to a json file. + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + #print(config_file) + #if os.path.isfile(config_file): + #if isinstance(config_file, file): + # conf = json.load(config_file) + if isinstance(config_file, string_types): + conf = json.load(open(config_file, 'r')) + elif isinstance(config_file, dict): + conf = config_file.copy() + else: + raise Exception('{} is not a file or file path.'.format(config_file)) + + # insert file path into dictionary + if 'config_path' not in conf: + conf['config_path'] = os.path.abspath(config_file) + conf['config_dir'] = os.path.dirname(conf['config_path']) + + # Will resolve manifest variables and validate + return from_dict(conf, validator) + + +def from_dict(config_dict, validator=None): + """Builds and validates a configuration json dictionary object. Best to directly use from_json when possible. + + :param config_dict: Dictionary object + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + assert(isinstance(config_dict, dict)) + conf = copy.deepcopy(config_dict) # Since the functions will mutate the dictionary we will copy just-in-case. + + if 'config_path' not in conf: + conf['config_path'] = os.path.join(os.getcwd(), 'tmp_cfg.dict') + conf['config_dir'] = os.path.dirname(conf['config_path']) + + # Build the manifest and resolve variables. + # TODO: Check that manifest exists + manifest = __build_manifest(conf) + conf['manifest'] = manifest + __recursive_insert(conf, manifest) + + # In our work with Blue-Brain it was agreed that 'network' and 'simulator' parts of config may be split up into + # separate files. If this is the case we build each sub-file separately and merge into this one + for childconfig in ['network', 'simulation']: + if childconfig in conf and isinstance(conf[childconfig], string_types): + # Try to resolve the path of the network/simulation config files. If an absolute path isn't used find + # the file relative to the current config file. TODO: test if this will work on windows? + conf_str = conf[childconfig] + conf_path = conf_str if conf_str.startswith('/') else os.path.join(conf['config_dir'], conf_str) + + # Build individual json file and merge into parent. + child_json = from_json(conf_path) + del child_json['config_path'] # we don't want 'config_path' of parent being overwritten. + conf.update(child_json) + + # Run the validator + if validator is not None: + validator.validate(conf) + + return conf + + +def copy_config(conf): + """Copy configuration file to different directory, with manifest variables resolved. + + :param conf: configuration dictionary + """ + output_dir = conf.output_dir + config_name = os.path.basename(conf['config_path']) + output_path = os.path.join(output_dir, config_name) + with open(output_path, 'w') as fp: + out_cfg = conf.copy() + if 'manifest' in out_cfg: + del out_cfg['manifest'] + json.dump(out_cfg, fp, indent=2) + + +def __special_variables(conf): + """A list of preloaded variables to insert into the manifest, containing things like path to run-time directory, + configuration directory, etc. + """ + pre_manifest = dict() + pre_manifest['$workingdir'] = os.path.dirname(os.getcwd()) + if 'config_path' in conf: + pre_manifest['$configdir'] = os.path.dirname(conf['config_path']) # path of configuration file + pre_manifest['$configfname'] = conf['config_path'] + + dt_now = datetime.datetime.now() + pre_manifest['$time'] = dt_now.strftime('%H-%M-%S') + pre_manifest['$date'] = dt_now.strftime('%Y-%m-%d') + pre_manifest['$datetime'] = dt_now.strftime('%Y-%m-%d_%H-%M-%S') + + return pre_manifest + + +def __build_manifest(conf): + """Resolves the manifest section and resolve any internal variables""" + if 'manifest' not in conf: + return __special_variables(conf) + + manifest = conf["manifest"] + resolved_manifest = __special_variables(conf) + resolved_keys = set() + unresolved_keys = set(manifest.keys()) + + # No longer using recursion since that can lead to an infinite loop if the person who writes the config file isn't + # careful. Also added code to allow for ${VAR} format in-case user wants to user "$.../some_${MODEl}_here/..." + while unresolved_keys: + for key in unresolved_keys: + # Find all variables in manifest and see if they can be replaced by the value in resolved_manifest + value = __find_variables(manifest[key], resolved_manifest) + + # If value no longer has variables, and key-value pair to resolved_manifest and remove from unresolved-keys + if value.find('$') < 0: + resolved_manifest[key] = value + resolved_keys.add(key) + + # remove resolved key-value pairs from set, and make sure at every iteration unresolved_keys shrinks to prevent + # infinite loops + n_unresolved = len(unresolved_keys) + unresolved_keys -= resolved_keys + if n_unresolved == len(unresolved_keys): + msg = "Unable to resolve manifest variables: {}".format(unresolved_keys) + raise Exception(msg) + + return resolved_manifest + + +def __recursive_insert(json_obj, manifest): + """Loop through the config and substitute the path variables (e.g.: $MY_DIR) with the values from the manifest + + :param json_obj: A json dictionary object that may contain variables needing to be resolved. + :param manifest: A dictionary of variable values + :return: A new json dictionar config file with variables resolved + """ + if isinstance(json_obj, string_types): + return __find_variables(json_obj, manifest) + + elif isinstance(json_obj, list): + new_list = [] + for itm in json_obj: + new_list.append(__recursive_insert(itm, manifest)) + return new_list + + elif isinstance(json_obj, dict): + for key, val in json_obj.items(): + if key == 'manifest': + continue + json_obj[key] = __recursive_insert(val, manifest) + + return json_obj + + else: + return json_obj + + +def __find_variables(json_str, manifest): + """Replaces variables (i.e. $VAR, ${VAR}) with their values from the manifest. + + :param json_str: a json string that may contain none, one or multiple variable + :param manifest: dictionary of variable lookup values + :return: json_str with resolved variables. Won't resolve variables that don't exist in manifest. + """ + variables = [m for m in re.finditer('\$\{?[\w]+\}?', json_str)] + for var in variables: + var_lookup = var.group() + if var_lookup.startswith('${') and var_lookup.endswith('}'): + # replace ${VAR} with $VAR + var_lookup = "$" + var_lookup[2:-1] + if var_lookup in manifest: + json_str = json_str.replace(var.group(), manifest[var_lookup]) + + return json_str + + +class ConfigDict(dict): + def __init__(self, *args, **kwargs): + self.update(*args, **kwargs) + self._env_built = False + self._io = None + + self._node_set = {} + self._load_node_set() + + @property + def io(self): + if self._io is None: + self._io = io + return self._io + + @io.setter + def io(self, io): + self._io = io + + @property + def run(self): + return self['run'] + + @property + def tstart(self): + return self.run.get('tstart', 0.0) + + @property + def tstop(self): + return self.run['tstop'] + + @property + def dt(self): + return self.run.get('dt', 0.1) + + @property + def spike_threshold(self): + return self.run.get('spike_threshold', -15.0) + + @property + def dL(self): + return self.run.get('dL', 20.0) + + @property + def gid_mappings(self): + return self.get('gid_mapping_file', None) + + @property + def block_step(self): + return self.run.get('nsteps_block', 5000) + + @property + def conditions(self): + return self['conditions'] + + @property + def celsius(self): + return self.conditions['celsius'] + + @property + def v_init(self): + return self.conditions['v_init'] + + @property + def path(self): + return self['config_path'] + + @property + def output(self): + return self['output'] + + @property + def output_dir(self): + return self.output['output_dir'] + + @property + def overwrite_output(self): + return self.output.get('overwrite_output_dir', False) + + @property + def log_file(self): + return self.output['log_file'] + + @property + def components(self): + return self.get('components', {}) + + @property + def morphologies_dir(self): + return self.components['morphologies_dir'] + + @property + def synaptic_models_dir(self): + return self.components['synaptic_models_dir'] + + @property + def point_neuron_models_dir(self): + return self.components['point_neuron_models_dir'] + + @property + def mechanisms_dir(self): + return self.components['mechanisms_dir'] + + @property + def biophysical_neuron_models_dir(self): + return self.components['biophysical_neuron_models_dir'] + + @property + def templates_dir(self): + return self.components.get('templates_dir', None) + + @property + def with_networks(self): + return 'networks' in self and len(self.nodes) > 0 + + @property + def networks(self): + return self['networks'] + + @property + def nodes(self): + return self.networks.get('nodes', []) + + @property + def edges(self): + return self.networks.get('edges', []) + + @property + def reports(self): + return self.get('reports', {}) + + @property + def inputs(self): + return self.get('inputs', {}) + + @property + def node_sets(self): + return self._node_set + + def _load_node_set(self): + if 'node_sets_file' in self.keys(): + node_set_val = self['node_sets_file'] + elif 'node_sets' in self.keys(): + node_set_val = self['node_sets'] + else: + self._node_set = {} + return + + if isinstance(node_set_val, dict): + self._node_set = node_set_val + else: + try: + self._node_set = json.load(open(node_set_val, 'r')) + except Exception as e: + io.log_exception('Unable to load node_sets_file {}'.format(node_set_val)) + + def copy_to_output(self): + copy_config(self) + + def get_modules(self, module_name): + return [report for report in self.reports.values() if report['module'] == module_name] + + def _set_logging(self): + """Check if log-level and/or log-format string is being changed through the config""" + output_sec = self.output + if 'log_format' in output_sec: + self._io.set_log_format(output_sec['log_format']) + + if 'log_level' in output_sec: + self._io.set_log_level(output_sec['log_level']) + + if 'log_to_console' in output_sec: + self._io.log_to_console = output_sec['log_to_console'] + + if 'quiet_simulator' in output_sec and output_sec['quiet_simulator']: + self._io.quiet_simulator() + + def build_env(self): + if self._env_built: + return + + self._set_logging() + self.io.setup_output_dir(self.output_dir, self.log_file, self.overwrite_output) + self.copy_to_output() + self._env_built = True + + @staticmethod + def get_validator(): + raise NotImplementedError + + @classmethod + def from_json(cls, config_file, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_json(config_file, validator)) + + @classmethod + def from_dict(cls, config_dict, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_dict(config_dict, validator)) + + @classmethod + def from_yaml(cls, config_file, validate=False): + raise NotImplementedError + + @classmethod + def load(cls, config_file, validate=False): + # Implement factory method that can resolve the format/type of input configuration. + if isinstance(config_file, dict): + return cls.from_dict(config_file, validate) + elif isinstance(config_file, string_types): + if config_file.endswith('yml') or config_file.endswith('yaml'): + return cls.from_yaml(config_file, validate) + else: + return cls.from_json(config_file, validate) + else: + raise Exception +''' + diff --git a/bmtk-vb/bmtk/simulator/core/edge_population.py b/bmtk-vb/bmtk/simulator/core/edge_population.py new file mode 100644 index 0000000..5dfa06c --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/edge_population.py @@ -0,0 +1,21 @@ +class SimEdge(object): + @property + def node_id(self): + raise NotImplementedError() + + @property + def gid(self): + raise NotImplementedError() + + +class EdgePopulation(object): + @property + def source_nodes(self): + raise NotImplementedError() + + @property + def target_nodes(self): + raise NotImplementedError() + + def initialize(self, network): + raise NotImplementedError() \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/core/graph.py b/bmtk-vb/bmtk/simulator/core/graph.py new file mode 100644 index 0000000..1e56ef1 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/graph.py @@ -0,0 +1,435 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import ast +import numpy as np + +from bmtk.simulator.core.config import ConfigDict +#import config as cfg +from bmtk.simulator.utils.property_maps import NodePropertyMap, EdgePropertyMap +from bmtk.utils import sonata +from bmtk.simulator.core.io_tools import io + +from bmtk.simulator.core.node_sets import NodeSet, NodeSetAll + + +"""Creates a graph of nodes and edges from multiple network files for all simulators. + +Consists of edges and nodes. All classes are abstract and should be reimplemented by a specific simulator. Also +contains base factor methods for building a network from a config file (or other). +""" + + +class SimEdge(object): + def __init__(self, original_params, dynamics_params): + self._orig_params = original_params + self._dynamics_params = dynamics_params + self._updated_params = {'dynamics_params': self._dynamics_params} + + @property + def edge_type_id(self): + return self._orig_params['edge_type_id'] + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + else: + return self._orig_params[item] + + +class SimNode(object): + def __init__(self, node_id, graph, network, params): + self._node_id = node_id + self._graph = graph + self._graph_params = params + self._node_type_id = params['node_type_id'] + self._network = network + self._updated_params = {} + + self._model_params = {} + + @property + def node_id(self): + return self._node_id + + @property + def node_type_id(self): + return self._node_type_id + + @property + def network(self): + """Name of network node belongs too.""" + return self._network + + @property + def model_params(self): + """Parameters (json file, nml, dictionary) that describe a specific node""" + return self._model_params + + @model_params.setter + def model_params(self, value): + self._model_params = value + + def __contains__(self, item): + return item in self._updated_params or item in self._graph_params + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + else: + return self._graph_params[item] + + +class SimGraph(object): + model_type_col = 'model_type' + + def __init__(self): + self._components = {} # components table, i.e. paths to model files. + self._io = io + + self._node_property_maps = {} + self._edge_property_maps = {} + + self._node_populations = {} + self._internal_populations_map = {} + self._virtual_populations_map = {} + + self._virtual_cells_nid = {} + + self._recurrent_edges = {} + self._external_edges = {} + + self._node_sets = {} + self._using_gids = False + + @property + def io(self): + return self._io + + ''' + @property + def internal_pop_names(self): + return self + ''' + + @property + def node_populations(self): + return list(self._node_populations.keys()) + + def get_node_set(self, node_set): + if node_set in self._node_sets.keys(): + return self._node_sets[node_set] + + elif isinstance(node_set, (dict, list)): + return NodeSet(node_set, self) + + else: + self.io.log_exception('Unable to load or find node_set "{}"'.format(node_set)) + + def get_node_populations(self): + return self._node_populations.values() + + def get_node_population(self, population_name): + return self._node_populations[population_name] + + def get_component(self, key): + """Get the value of item in the components dictionary. + + :param key: name of component + :return: value assigned to component + """ + return self._components[key] + + def add_component(self, key, value): + """Add a component key-value pair + + :param key: name of component + :param value: value + """ + self._components[key] = value + + ''' + def _from_json(self, file_name): + return cfg.from_json(file_name) + ''' + + def _validate_components(self): + """Make sure various components (i.e. paths) exists before attempting to build the graph.""" + return True + + def _create_nodes_prop_map(self, grp): + return NodePropertyMap() + + def _create_edges_prop_map(self, grp): + return EdgePropertyMap() + + def __avail_model_types(self, population): + model_types = set() + for grp in population.groups: + if self.model_type_col not in grp.all_columns: + self.io.log_exception('model_type is missing from nodes.') + + model_types.update(set(np.unique(grp.get_values(self.model_type_col)))) + return model_types + + def _preprocess_node_types(self, node_population): + # TODO: The following figures out the actually used node-type-ids. For mem and speed may be better to just + # process them all + node_type_ids = node_population.type_ids + # TODO: Verify all the node_type_ids are in the table + node_types_table = node_population.types_table + + # TODO: Convert model_type to a enum + morph_dir = self.get_component('morphologies_dir') + if morph_dir is not None and 'morphology' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + if node_type['morphology'] is None: + continue + # TODO: Check the file exits + # TODO: See if absolute path is stored in csv + node_type['morphology'] = os.path.join(morph_dir, node_type['morphology']) + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + if isinstance(dynamics_params, dict): + continue + + model_type = node_type['model_type'] + if model_type == 'biophysical': + params_dir = self.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = self.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = self.get_component('point_neuron_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = self.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + def _preprocess_edge_types(self, edge_pop): + edge_types_table = edge_pop.types_table + edge_type_ids = np.unique(edge_pop.type_ids) + + for et_id in edge_type_ids: + edge_type = edge_types_table[et_id] + if 'dynamics_params' in edge_types_table.columns: + dynamics_params = edge_type['dynamics_params'] + params_dir = self.get_component('synaptic_models_dir') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + edge_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find edge dynamics_params file {}.'.format(params_path)) + + # Split target_sections + if 'target_sections' in edge_type: + trg_sec = edge_type['target_sections'] + if trg_sec is not None: + try: + edge_type['target_sections'] = ast.literal_eval(trg_sec) + except Exception as exc: + self.io.log_warning('Unable to split target_sections list {}'.format(trg_sec)) + edge_type['target_sections'] = None + + # Split target distances + if 'distance_range' in edge_type: + dist_range = edge_type['distance_range'] + if dist_range is not None: + try: + # TODO: Make the distance range has at most two values + edge_type['distance_range'] = json.loads(dist_range) + except Exception as e: + try: + edge_type['distance_range'] = [0.0, float(dist_range)] + except Exception as e: + self.io.log_warning('Unable to parse distance_range {}'.format(dist_range)) + edge_type['distance_range'] = None + + def external_edge_populations(self, src_pop, trg_pop): + return self._external_edges.get((src_pop, trg_pop), []) + + def add_nodes(self, sonata_file, populations=None): + """Add nodes from a network to the graph. + + :param sonata_file: A NodesFormat type object containing list of nodes. + :param populations: name/identifier of network. If none will attempt to retrieve from nodes object + """ + nodes = sonata_file.nodes + + selected_populations = nodes.population_names if populations is None else populations + for pop_name in selected_populations: + if pop_name not in nodes: + # when user wants to simulation only a few populations in the file + continue + + if pop_name in self.node_populations: + # Make sure their aren't any collisions + self.io.log_exception('There are multiple node populations with name {}.'.format(pop_name)) + + node_pop = nodes[pop_name] + self._preprocess_node_types(node_pop) + self._node_populations[pop_name] = node_pop + + # Segregate into virtual populations and non-virtual populations + model_types = self.__avail_model_types(node_pop) + if 'virtual' in model_types: + self._virtual_populations_map[pop_name] = node_pop + self._virtual_cells_nid[pop_name] = {} + model_types -= set(['virtual']) + if model_types: + # We'll allow a population to have virtual and non-virtual nodes but it is not ideal + self.io.log_warning('Node population {} contains both virtual and non-virtual nodes which can ' + + 'cause memory and build-time inefficency. Consider separating virtual nodes ' + + 'into their own population'.format(pop_name)) + + if model_types: + self._internal_populations_map[pop_name] = node_pop + + self._node_sets[pop_name] = NodeSet({'population': pop_name}, self) + self._node_property_maps[pop_name] = {grp.group_id: self._create_nodes_prop_map(grp) + for grp in node_pop.groups} + + def build_nodes(self): + raise NotImplementedError + + def build_recurrent_edges(self): + raise NotImplementedError + + def add_edges(self, sonata_file, populations=None, source_pop=None, target_pop=None): + """ + + :param sonata_file: + :param populations: + :param source_pop: + :param target_pop: + :return: + """ + edges = sonata_file.edges + selected_populations = edges.population_names if populations is None else populations + + for pop_name in selected_populations: + if pop_name not in edges: + continue + + edge_pop = edges[pop_name] + self._preprocess_edge_types(edge_pop) + + # Check the source nodes exists + src_pop = source_pop if source_pop is not None else edge_pop.source_population + is_internal_src = src_pop in self._internal_populations_map.keys() + is_external_src = src_pop in self._virtual_populations_map.keys() + + trg_pop = target_pop if target_pop is not None else edge_pop.target_population + is_internal_trg = trg_pop in self._internal_populations_map.keys() + + if not is_internal_trg: + self.io.log_exception(('Node population {} does not exists (or consists of only virtual nodes). ' + + '{} edges cannot create connections.').format(trg_pop, pop_name)) + + if not (is_internal_src or is_external_src): + self.io.log_exception('Source node population {} not found. Please update {} edges'.format(src_pop, + pop_name)) + if is_internal_src: + if trg_pop not in self._recurrent_edges: + self._recurrent_edges[trg_pop] = [] + self._recurrent_edges[trg_pop].append(edge_pop) + + if is_external_src: + if trg_pop not in self._external_edges: + self._external_edges[(src_pop, trg_pop)] = [] + self._external_edges[(src_pop, trg_pop)].append(edge_pop) + + self._edge_property_maps[pop_name] = {grp.group_id: self._create_edges_prop_map(grp) + for grp in edge_pop.groups} + + @classmethod + def from_config(cls, conf, **properties): + """Generates a graph structure from a json config file or dictionary. + + :param conf: name of json config file, or a dictionary with config parameters + :param properties: optional properties. + :return: A graph object of type cls + """ + graph = cls(**properties) + + # The simulation run script should create a config-dict since it's likely to vary based on the simulator engine, + # however in the case the user doesn't we will try a generic conversion from dict/json to ConfigDict + if isinstance(conf, ConfigDict): + config = conf + else: + try: + config = ConfigDict.load(conf) + except Exception as e: + graph.io.log_exception('Could not convert {} (type "{}") to json.'.format(conf, type(conf))) + + if not config.with_networks: + graph.io.log_exception('Could not find any network files. Unable to build network.') + + # TODO: These are simulator specific + graph.spike_threshold = config.spike_threshold + graph.dL = config.dL + + # load components + for name, value in config.components.items(): + graph.add_component(name, value) + graph._validate_components() + + # load nodes + gid_map = config.gid_mappings + for node_dict in config.nodes: + nodes_net = sonata.File(data_files=node_dict['nodes_file'], data_type_files=node_dict['node_types_file'], + gid_table=gid_map) + graph.add_nodes(nodes_net) + + # load edges + for edge_dict in config.edges: + target_network = edge_dict['target'] if 'target' in edge_dict else None + source_network = edge_dict['source'] if 'source' in edge_dict else None + edge_net = sonata.File(data_files=edge_dict['edges_file'], data_type_files=edge_dict['edge_types_file']) + graph.add_edges(edge_net, source_pop=target_network, target_pop=source_network) + + graph._node_sets['all'] = NodeSetAll(graph) + for ns_name, ns_filter in conf.node_sets.items(): + graph._node_sets[ns_name] = NodeSet(ns_filter, graph) + + return graph diff --git a/bmtk-vb/bmtk/simulator/core/io_tools.py b/bmtk-vb/bmtk/simulator/core/io_tools.py new file mode 100644 index 0000000..8d80c9f --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/io_tools.py @@ -0,0 +1,117 @@ +import os +import sys +import shutil +import logging + +from mpi4py import MPI + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() +size = comm.Get_size() + +class IOUtils(object): + """ + For logging/mkdir commands we sometimes need to use different MPI classes depending on the simulator being used + (NEST and NEURON have their own barrier functions that don't work well with mpi). We also need to be able to + adjust the logging levels/format at run-time depending on the simulator/configuration options. + + Thus the bulk of the io and logging functions are put into their own class and can be overwritten by specific + simulator modules + """ + def __init__(self): + self.mpi_rank = rank + self.mpi_size = size + + self._log_format = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s") + self._log_level = logging.DEBUG + self._log_to_console = True + self._logger = None + + @property + def log_to_console(self): + return self._log_to_console + + @log_to_console.setter + def log_to_console(self, flag): + assert(isinstance(flag, bool)) + self._log_to_console = flag + + @property + def logger(self): + if self._logger is None: + # Create the logger the first time it is accessed + self._logger = logging.getLogger(self.__class__.__name__) + self._logger.setLevel(self._log_level) + self._set_console_logging() + + return self._logger + + def _set_console_logging(self): + if not self._log_to_console: + return + + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setFormatter(self._log_format) + self._logger.addHandler(console_handler) + + def set_log_format(self, format_str): + self._log_format = logging.Formatter(format_str) + + def set_log_level(self, loglevel): + if isinstance(loglevel, int): + self._log_level = loglevel + + elif isinstance(loglevel, (str, unicode)): + self._log_level = logging.getLevelName(loglevel) + + else: + raise Exception('Error: cannot set logging levels to {}'.format(loglevel)) + + def barrier(self): + pass + + def quiet_simulator(self): + pass + + def setup_output_dir(self, output_dir, log_file, overwrite=True): + if self.mpi_rank == 0: + print("mpi rank 0") + # Create output directory + if os.path.exists(output_dir): + if overwrite: + shutil.rmtree(output_dir) + else: + self.log_exception('Directory already exists (remove or set to overwrite).') + os.makedirs(output_dir) + + # Create log file + if log_file is not None: + log_path = log_file if os.path.isabs(log_file) else os.path.join(output_dir, log_file) + file_logger = logging.FileHandler(log_path) + file_logger.setFormatter(self._log_format) + self.logger.addHandler(file_logger) + self.log_info('Created log file') + + self.barrier() + + def log_info(self, message, all_ranks=False): + if all_ranks is False and self.mpi_rank != 0: + return + + self.logger.info(message) + + def log_warning(self, message, all_ranks=False): + if all_ranks is False and self.mpi_rank != 0: + return + + self.logger.warning(message) + + def log_exception(self, message): + if self.mpi_rank == 0: + self.logger.error(message) + + self.barrier() + raise Exception(message) + + +io = IOUtils() diff --git a/bmtk-vb/bmtk/simulator/core/io_tools.pyc b/bmtk-vb/bmtk/simulator/core/io_tools.pyc new file mode 100644 index 0000000..1a353f9 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/io_tools.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/network_reader.py b/bmtk-vb/bmtk/simulator/core/network_reader.py new file mode 100644 index 0000000..8089e32 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/network_reader.py @@ -0,0 +1,73 @@ + + +class NodesReader(object): + def __init__(self): + self._has_internal_nodes = False + self._has_virtual_nodes = False + + @property + def name(self): + raise NotImplementedError() + + @property + def internal_nodes_only(self): + return self._has_internal_nodes and not self._has_virtual_nodes + + @property + def virtual_nodes_only(self): + return self._has_virtual_nodes and not self._has_internal_nodes + + @property + def mixed_nodes(self): + return self._has_internal_nodes and self._has_virtual_nodes + + def initialize(self, network): + raise NotImplementedError() + + @classmethod + def load(cls, **properties): + raise NotImplementedError() + + +class EdgesReader(object): + unknown = 0 + recurrent = 0 + virtual = 1 + mixed = 2 + + def __init__(self): + self._connection_type = -1 + + @property + def recurrent_connections(self): + return self._connection_type == self.recurrent + + @property + def virtual_connections(self): + return self._connection_type == self.virtual + + @property + def mixed_connections(self): + return self._connection_type == self.mixed + + @property + def source_nodes(self): + raise NotImplementedError() + + @property + def target_nodes(self): + raise NotImplementedError() + + def set_connection_type(self, src_pop, trg_pop): + if src_pop.internal_nodes_only and trg_pop.internal_nodes_only: + self._connection_type = self.recurrent + + elif src_pop.virtual_nodes_only and trg_pop.internal_nodes_only: + self._connection_type = self.virtual + + else: + self._connection_type = self.mixed + + def initialize(self, network): + raise NotImplementedError() + diff --git a/bmtk-vb/bmtk/simulator/core/network_reader.pyc b/bmtk-vb/bmtk/simulator/core/network_reader.pyc new file mode 100644 index 0000000..39e1b08 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/network_reader.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/node_population.py b/bmtk-vb/bmtk/simulator/core/node_population.py new file mode 100644 index 0000000..353bd7a --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/node_population.py @@ -0,0 +1,37 @@ +class SimNode(object): + @property + def node_id(self): + raise NotImplementedError() + + @property + def gid(self): + raise NotImplementedError() + + +class NodePopulation(object): + def __init__(self): + self._has_internal_nodes = False + self._has_virtual_nodes = False + + @property + def name(self): + raise NotImplementedError() + + @property + def internal_nodes_only(self): + return self._has_internal_nodes and not self._has_virtual_nodes + + @property + def virtual_nodes_only(self): + return self._has_virtual_nodes and not self._has_internal_nodes + + @property + def mixed_nodes(self): + return self._has_internal_nodes and self._has_virtual_nodes + + def initialize(self, network): + raise NotImplementedError() + + @classmethod + def load(cls, **properties): + raise NotImplementedError() diff --git a/bmtk-vb/bmtk/simulator/core/node_sets.py b/bmtk-vb/bmtk/simulator/core/node_sets.py new file mode 100644 index 0000000..5a67f95 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/node_sets.py @@ -0,0 +1,57 @@ +from .io_tools import io + + +class NodeSet(object): + def __init__(self, filter_params, network): + self._network = network + self._populations = [] + self._preselected_gids = None + + if isinstance(filter_params, list): + self._preselected_gids = filter_params + elif isinstance(filter_params, dict): + self._filter = filter_params.copy() + self._populations = self._find_populations() + else: + io.log_exception('Unknown node set params type {}'.format(type(filter_params))) + + def _find_populations(self): + for k in ['population', 'populations']: + if k in self._filter: + node_pops = [] + for pop_name in to_list(self._filter[k]): + node_pops.append(self._network.get_node_population(pop_name)) + del self._filter[k] + return node_pops + + return self._network.get_node_populations() + + def populations(self): + return self._populations + + def population_names(self): + return [p.name for p in self._populations] + + def gids(self): + if self._preselected_gids is not None: + for gid in self._preselected_gids: + yield gid + else: + for pop in self._populations: + for node in pop.filter(self._filter): + yield node.node_id + + def nodes(self): + return None + + +class NodeSetAll(NodeSet): + def __init__(self, network): + super(NodeSetAll, self).__init__({}, network) + + +def to_list(val): + if isinstance(val, list): + return val + else: + return [val] diff --git a/bmtk-vb/bmtk/simulator/core/node_sets.pyc b/bmtk-vb/bmtk/simulator/core/node_sets.pyc new file mode 100644 index 0000000..5618942 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/node_sets.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/simulator.py b/bmtk-vb/bmtk/simulator/core/simulator.py new file mode 100644 index 0000000..4a84174 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/simulator.py @@ -0,0 +1,9 @@ +class Simulator(object): + def __init__(self): + self._sim_mods = [] + + def add_mod(self, module): + self._sim_mods.append(module) + + def run(self): + raise NotImplementedError() \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/core/simulator.pyc b/bmtk-vb/bmtk/simulator/core/simulator.pyc new file mode 100644 index 0000000..8844715 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/simulator.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/simulator_network.py b/bmtk-vb/bmtk/simulator/core/simulator_network.py new file mode 100644 index 0000000..e1da1b3 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/simulator_network.py @@ -0,0 +1,200 @@ +from six import string_types + +from bmtk.simulator.core.io_tools import io +#from bmtk.simulator.core.config import ConfigDict +from bmtk.simulator.utils.config import ConfigDict +from bmtk.simulator.core.node_sets import NodeSet, NodeSetAll +from bmtk.simulator.core import sonata_reader + + +class SimNetwork(object): + def __init__(self): + self._components = {} + self._io = io + + self._node_adaptors = {} + self._edge_adaptors = {} + self._register_adaptors() + + self._node_populations = {} + self._node_sets = {} + + self._edge_populations = [] + + @property + def io(self): + return self._io + + @property + def node_populations(self): + return self._node_populations.values() + + @property + def recurrent_edges(self): + return [ep for ep in self._edge_populations if ep.recurrent_connections] + + @property + def py_function_caches(self): + return None + + def _register_adaptors(self): + self._node_adaptors['sonata'] = sonata_reader.NodeAdaptor + self._edge_adaptors['sonata'] = sonata_reader.EdgeAdaptor + + def get_node_adaptor(self, name): + return self._node_adaptors[name] + + def get_edge_adaptor(self, name): + return self._edge_adaptors[name] + + def add_component(self, name, path): + self._components[name] = path + + def get_component(self, name): + if name not in self._components: + self.io.log_exception('No network component set with name {}'.format(name)) + else: + return self._components[name] + + def has_component(self, name): + return name in self._components + + def get_node_population(self, name): + return self._node_populations[name] + + def get_node_populations(self): + return self._node_populations.values() + + def add_node_set(self, name, node_set): + self._node_sets[name] = node_set + + def get_node_set(self, node_set): + if isinstance(node_set, string_types) and node_set in self._node_sets: + return self._node_sets[node_set] + + elif isinstance(node_set, (dict, list)): + return NodeSet(node_set, self) + + else: + self.io.log_exception('Unable to load or find node_set "{}"'.format(node_set)) + + def add_nodes(self, node_population): + pop_name = node_population.name + if pop_name in self._node_populations: + # Make sure their aren't any collisions + self.io.log_exception('There are multiple node populations with name {}.'.format(pop_name)) + + node_population.initialize(self) + self._node_populations[pop_name] = node_population + if node_population.mixed_nodes: + # We'll allow a population to have virtual and non-virtual nodes but it is not ideal + self.io.log_warning(('Node population {} contains both virtual and non-virtual nodes which can cause ' + + 'memory and build-time inefficency. Consider separating virtual nodes into their ' + + 'own population').format(pop_name)) + + # Used in inputs/reports when needed to get all gids belonging to a node population + self._node_sets[pop_name] = NodeSet({'population': pop_name}, self) + + def add_edges(self, edge_population): + edge_population.initialize(self) + pop_name = edge_population.name + + # Check that source_population exists + src_pop_name = edge_population.source_nodes + if src_pop_name not in self._node_populations: + self.io.log_exception('Source node population {} not found. Please update {} edges'.format(src_pop_name, + pop_name)) + + # Check that the target population exists and contains non-virtual nodes (we cannot synapse onto virt nodes) + trg_pop_name = edge_population.target_nodes + if trg_pop_name not in self._node_populations or self._node_populations[trg_pop_name].virtual_nodes_only: + self.io.log_exception(('Node population {} does not exists (or consists of only virtual nodes). ' + + '{} edges cannot create connections.').format(trg_pop_name, pop_name)) + + edge_population.set_connection_type(src_pop=self._node_populations[src_pop_name], + trg_pop = self._node_populations[trg_pop_name]) + self._edge_populations.append(edge_population) + + def build(self): + self.build_nodes() + self.build_recurrent_edges() + + def build_nodes(self): + raise NotImplementedError() + + def build_recurrent_edges(self): + raise NotImplementedError() + + def build_virtual_connections(self): + raise NotImplementedError() + + @classmethod + def from_config(cls, conf, **properties): + """Generates a graph structure from a json config file or dictionary. + + :param conf: name of json config file, or a dictionary with config parameters + :param properties: optional properties. + :return: A graph object of type cls + """ + network = cls(**properties) + + # The simulation run script should create a config-dict since it's likely to vary based on the simulator engine, + # however in the case the user doesn't we will try a generic conversion from dict/json to ConfigDict + if isinstance(conf, ConfigDict): + config = conf + else: + try: + config = ConfigDict.load(conf) + except Exception as e: + network.io.log_exception('Could not convert {} (type "{}") to json.'.format(conf, type(conf))) + + if not config.with_networks: + network.io.log_exception('Could not find any network files. Unable to build network.') + + # TODO: These are simulator specific + network.spike_threshold = config.spike_threshold + network.dL = config.dL + + # load components + for name, value in config.components.items(): + network.add_component(name, value) + + # load nodes + gid_map = config.gid_mappings + node_adaptor = network.get_node_adaptor('sonata') + for node_dict in config.nodes: + nodes = sonata_reader.load_nodes(node_dict['nodes_file'], node_dict['node_types_file'], gid_map, + adaptor=node_adaptor) + for node_pop in nodes: + network.add_nodes(node_pop) + + # TODO: Raise a warning if more than one internal population and no gids (node_id collision) + + # load edges + edge_adaptor = network.get_edge_adaptor('sonata') + for edge_dict in config.edges: + if not edge_dict.get('enabled', True): + continue + + edges = sonata_reader.load_edges(edge_dict['edges_file'], edge_dict['edge_types_file'], + adaptor=edge_adaptor) + for edge_pop in edges: + network.add_edges(edge_pop) + + # Add nodeset section + network.add_node_set('all', NodeSetAll(network)) + for ns_name, ns_filter in config.node_sets.items(): + network.add_node_set(ns_name, NodeSet(ns_filter, network)) + + return network + + @classmethod + def from_manifest(cls, manifest_json): + # TODO: Add adaptors to build a simulation network from model files downloaded celltypes.brain-map.org + raise NotImplementedError() + + @classmethod + def from_builder(cls, network): + # TODO: Add adaptors to build a simulation network from a bmtk.builder Network object + raise NotImplementedError() + diff --git a/bmtk-vb/bmtk/simulator/core/simulator_network.pyc b/bmtk-vb/bmtk/simulator/core/simulator_network.pyc new file mode 100644 index 0000000..a3aa722 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/simulator_network.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/__init__.py b/bmtk-vb/bmtk/simulator/core/sonata_reader/__init__.py new file mode 100644 index 0000000..9b09281 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/sonata_reader/__init__.py @@ -0,0 +1,3 @@ +from .node_adaptor import NodeAdaptor, SonataBaseNode +from .edge_adaptor import EdgeAdaptor, SonataBaseEdge +from .network_reader import load_nodes, load_edges diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/__init__.pyc b/bmtk-vb/bmtk/simulator/core/sonata_reader/__init__.pyc new file mode 100644 index 0000000..c1bb935 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/sonata_reader/__init__.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..5c4c1f9 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/edge_adaptor.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/edge_adaptor.cpython-37.pyc new file mode 100644 index 0000000..4d18dc2 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/edge_adaptor.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/network_reader.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/network_reader.cpython-37.pyc new file mode 100644 index 0000000..673b99b Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/network_reader.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/node_adaptor.cpython-37.pyc b/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/node_adaptor.cpython-37.pyc new file mode 100644 index 0000000..fabdabb Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/sonata_reader/__pycache__/node_adaptor.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/edge_adaptor.py b/bmtk-vb/bmtk/simulator/core/sonata_reader/edge_adaptor.py new file mode 100644 index 0000000..7642808 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/sonata_reader/edge_adaptor.py @@ -0,0 +1,208 @@ +import os +import ast +import json +import types + +import numpy as np + + +class SonataBaseEdge(object): + def __init__(self, sonata_edge, edge_adaptor): + self._edge = sonata_edge + self._prop_adaptor = edge_adaptor + + @property + def source_node_id(self): + return self._edge.source_node_id + + @property + def target_node_id(self): + return self._edge.target_node_id + + @property + def dynamics_params(self): + return self._prop_adaptor.dynamics_params(self._edge) + + @property + def delay(self): + return self._edge['delay'] + + @property + def weight_function(self): + return self._prop_adaptor.weight_function(self._edge) + + @property + def preselected_targets(self): + return self._prop_adaptor.preselected_targets + + @property + def target_sections(self): + return self._edge['target_sections'] + + @property + def target_distance(self): + return self._edge['distance_range'] + + @property + def edge_type_id(self): + return self._edge.edge_type_id + + @property + def nsyns(self): + return self._prop_adaptor.nsyns(self._edge) + + @property + def model_template(self): + return self._edge['model_template'] + + def syn_weight(self, src_node, trg_node): + return self._prop_adaptor.syn_weight(self, src_node=src_node, trg_node=trg_node) + + def __getitem__(self, item): + return self._edge[item] + + def __contains__(self, prop_key): + return self._edge.__contains__(prop_key) + +class EdgeAdaptor(object): + def __init__(self, network): + self._network = network + self._func_caches = self._network.py_function_caches + + @property + def batch_process(self): + return False + + @batch_process.setter + def batch_process(self, flag): + pass + + def get_edge(self, sonata_node): + return SonataBaseEdge(sonata_node, self) + + @staticmethod + def preprocess_edge_types(network, edge_population): + edge_types_table = edge_population.types_table + edge_type_ids = np.unique(edge_population.type_ids) + + for et_id in edge_type_ids: + edge_type = edge_types_table[et_id] + if 'dynamics_params' in edge_types_table.columns: + dynamics_params = edge_type['dynamics_params'] + params_dir = network.get_component('synaptic_models_dir') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + edge_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + network.io.log_exception('Could not find edge dynamics_params file {}.'.format(params_path)) + + # Split target_sections + if 'target_sections' in edge_type: + trg_sec = edge_type['target_sections'] + if trg_sec is not None: + try: + edge_type['target_sections'] = ast.literal_eval(trg_sec) + except Exception as exc: + network.io.log_warning('Unable to split target_sections list {}'.format(trg_sec)) + edge_type['target_sections'] = None + + # Split target distances + if 'distance_range' in edge_type: + dist_range = edge_type['distance_range'] + if dist_range is not None: + try: + # TODO: Make the distance range has at most two values + edge_type['distance_range'] = json.loads(dist_range) + except Exception as e: + try: + edge_type['distance_range'] = [0.0, float(dist_range)] + except Exception as e: + network.io.log_warning('Unable to parse distance_range {}'.format(dist_range)) + edge_type['distance_range'] = None + + @classmethod + def create_adaptor(cls, edge_group, network): + prop_map = cls(network) + return cls.patch_adaptor(prop_map, edge_group) + + @staticmethod + def patch_adaptor(adaptor, edge_group): + # dynamics_params + if edge_group.has_dynamics_params: + adaptor.dynamics_params = types.MethodType(group_dynamics_params, adaptor) + else: # 'dynamics_params' in node_group.all_columns: + adaptor.dynamics_params = types.MethodType(types_dynamics_params, adaptor) + + # For fetching/calculating synaptic weights + if 'weight_function' in edge_group.all_columns: + # Customized function for user to calculate the synaptic weight + adaptor.weight_function = types.MethodType(weight_function, adaptor) + adaptor.syn_weight = types.MethodType(syn_weight_function, adaptor) + elif 'syn_weight' in edge_group.all_columns: + # Just return the synaptic weight + adaptor.weight_function = types.MethodType(ret_none_function, adaptor) + adaptor.syn_weight = types.MethodType(syn_weight, adaptor) + else: + raise Exception('Could not find syn_weight or weight_function properties. Cannot create connections.') + + # For determining the synapse placement + if 'sec_id' in edge_group.all_columns: + adaptor.preselected_targets = True + adaptor.nsyns = types.MethodType(no_nsyns, adaptor) + elif 'nsyns' in edge_group.all_columns: + adaptor.preselected_targets = False + adaptor.nsyns = types.MethodType(nsyns, adaptor) + else: + # It will get here for connections onto point neurons + adaptor.preselected_targets = True + adaptor.nsyns = types.MethodType(no_nsyns, adaptor) + + return adaptor + + +def ret_none_function(self, edge): + return None + + +def weight_function(self, edge): + return edge['weight_function'] + + +def syn_weight(self, edge, src_node, trg_node): + return edge['syn_weight'] + + +def syn_weight_function(self, edge, src_node, trg_node): + weight_fnc_name = edge.weight_function + if weight_fnc_name is None: + weight_fnc = self._func_caches.py_modules.synaptic_weight('default_weight_fnc') + return weight_fnc(edge, src_node, trg_node) + + elif self._func_caches.py_modules.has_synaptic_weight(weight_fnc_name): + weight_fnc = self._func_caches.py_modules.synaptic_weight(weight_fnc_name) + return weight_fnc(edge, src_node, trg_node) + + else: + self._network.io.log_exception('weight_function {} is not defined.'.format(weight_fnc_name)) + + +def nsyns(self, edge): + return edge['nsyns'] + + +def no_nsyns(self, edge): + return 1 + + +def types_dynamics_params(self, node): + return node['dynamics_params'] + + +def group_dynamics_params(self, node): + return node.dynamics_params diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/edge_adaptor.pyc b/bmtk-vb/bmtk/simulator/core/sonata_reader/edge_adaptor.pyc new file mode 100644 index 0000000..107e4c6 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/sonata_reader/edge_adaptor.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/network_reader.py b/bmtk-vb/bmtk/simulator/core/sonata_reader/network_reader.py new file mode 100644 index 0000000..92effcb --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/sonata_reader/network_reader.py @@ -0,0 +1,244 @@ +import os +import numpy as np +import json +import ast + +from bmtk.simulator.core.network_reader import NodesReader, EdgesReader +from bmtk.simulator.core.sonata_reader.node_adaptor import NodeAdaptor +from bmtk.simulator.core.sonata_reader.edge_adaptor import EdgeAdaptor +from bmtk.utils import sonata + + +def load_nodes(nodes_h5, node_types_csv, gid_table=None, selected_nodes=None, adaptor=NodeAdaptor): + return SonataNodes.load(nodes_h5, node_types_csv, gid_table, selected_nodes, adaptor) + + +def load_edges(edges_h5, edge_types_csv, selected_populations=None, adaptor=EdgeAdaptor): + return SonataEdges.load(edges_h5, edge_types_csv, selected_populations, adaptor) + + +class SonataNodes(NodesReader): + def __init__(self, sonata_node_population, prop_adaptor): + super(SonataNodes, self).__init__() + self._node_pop = sonata_node_population + self._pop_name = self._node_pop.name + self._prop_adaptors = {} + self._adaptor = prop_adaptor + + @property + def name(self): + return self._pop_name + + @property + def adaptor(self): + return self._adaptor + + def n_nodes(self): + return len(self._node_pop) + + def initialize(self, network): + # Determine the various mode-types available in the Node Population, whether or not a population of nodes + # contains virtual/external nodes, internal nodes, or a mix of both affects how to nodes are built + model_types = set() + for grp in self._node_pop.groups: + if self._adaptor.COL_MODEL_TYPE not in grp.all_columns: + network.io.log_exception('property {} is missing from nodes.'.format(self._adaptor.COL_MODEL_TYPE)) + + model_types.update(set(np.unique(grp.get_values(self._adaptor.COL_MODEL_TYPE)))) + + if 'virtual' in model_types: + self._has_virtual_nodes = True + model_types -= set(['virtual']) + else: + self._has_virtual_nodes = False + + if model_types: + self._has_internal_nodes = True + + self._adaptor.preprocess_node_types(network, self._node_pop) + #self._preprocess_node_types(network) + self._prop_adaptors = {grp.group_id: self._create_adaptor(grp, network) for grp in self._node_pop.groups} + + def _create_adaptor(self, grp, network): + return self._adaptor.create_adaptor(grp, network) + + ''' + def _preprocess_node_types(self, network): + # TODO: The following figures out the actually used node-type-ids. For mem and speed may be better to just + # process them all + node_type_ids = self._node_pop.type_ids + # TODO: Verify all the node_type_ids are in the table + node_types_table = self._node_pop.types_table + + # TODO: Convert model_type to a enum + if network.has_component('morphologies_dir'): + morph_dir = network.get_component('morphologies_dir') + if morph_dir is not None and 'morphology_file' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + if node_type['morphology_file'] is None: + continue + # TODO: Check the file exits + # TODO: See if absolute path is stored in csv + node_type['morphology_file'] = os.path.join(morph_dir, node_type['morphology_file']) + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + if isinstance(dynamics_params, dict): + continue + + model_type = node_type['model_type'] + if model_type == 'biophysical': + params_dir = network.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = network.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = network.get_component('point_neuron_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = network.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + network.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + # TODO: Use adaptor to validate model_type and model_template values + ''' + + @classmethod + def load(cls, nodes_h5, node_types_csv, gid_table=None, selected_nodes=None, adaptor=NodeAdaptor): + sonata_file = sonata.File(data_files=nodes_h5, data_type_files=node_types_csv, gid_table=gid_table) + node_populations = [] + for node_pop in sonata_file.nodes.populations: + node_populations.append(cls(node_pop, adaptor)) + + return node_populations + + def get_node(self, node_id): + return self._node_pop.get_node_id(node_id) + + def __getitem__(self, item): + for base_node in self._node_pop[item]: + snode = self._prop_adaptors[base_node.group_id].get_node(base_node) + yield snode + + def __iter__(self): + return self + + def filter(self, filter_conditons): + for node in self._node_pop.filter(**filter_conditons): + yield node + + def get_nodes(self): + for node_group in self._node_pop.groups: + node_adaptor = self._prop_adaptors[node_group.group_id] + if node_adaptor.batch_process: + for batch in node_adaptor.get_batches(node_group): + yield batch + else: + for node in node_group: + yield node_adaptor.get_node(node) + + +class SonataEdges(EdgesReader): + def __init__(self, edge_population, adaptor): + self._edge_pop = edge_population + self._adaptor_cls = adaptor + self._edge_adaptors = {} + + @property + def name(self): + return self._edge_pop.name + + @property + def source_nodes(self): + return self._edge_pop.source_population + + @property + def target_nodes(self): + return self._edge_pop.target_population + + def initialize(self, network): + self._adaptor_cls.preprocess_edge_types(network, self._edge_pop) + # self._preprocess_edge_types(network) + self._edge_adaptors = {grp.group_id: self._adaptor_cls.create_adaptor(grp, network) + for grp in self._edge_pop.groups} + + def get_target(self, node_id): + for edge in self._edge_pop.get_target(node_id): + yield self._edge_adaptors[edge.group_id].get_edge(edge) + + def get_edges(self): + for edge_group in self._edge_pop.groups: + edge_adaptor = self._edge_adaptors[edge_group.group_id] + if edge_adaptor.batch_process: + for edge in edge_adaptor.get_batches(edge_group): + yield edge + else: + for edge in self._edge_pop: + yield edge_adaptor.get_edge(edge) + + ''' + def _preprocess_edge_types(self, network): + edge_types_table = self._edge_pop.types_table + edge_type_ids = np.unique(self._edge_pop.type_ids) + + for et_id in edge_type_ids: + edge_type = edge_types_table[et_id] + if 'dynamics_params' in edge_types_table.columns: + dynamics_params = edge_type['dynamics_params'] + params_dir = network.get_component('synaptic_models_dir') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + edge_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find edge dynamics_params file {}.'.format(params_path)) + + # Split target_sections + if 'target_sections' in edge_type: + trg_sec = edge_type['target_sections'] + if trg_sec is not None: + try: + edge_type['target_sections'] = ast.literal_eval(trg_sec) + except Exception as exc: + self.io.log_warning('Unable to split target_sections list {}'.format(trg_sec)) + edge_type['target_sections'] = None + + # Split target distances + if 'distance_range' in edge_type: + dist_range = edge_type['distance_range'] + if dist_range is not None: + try: + # TODO: Make the distance range has at most two values + edge_type['distance_range'] = json.loads(dist_range) + except Exception as e: + try: + edge_type['distance_range'] = [0.0, float(dist_range)] + except Exception as e: + self.io.log_warning('Unable to parse distance_range {}'.format(dist_range)) + edge_type['distance_range'] = None + ''' + + @classmethod + def load(cls, edges_h5, edge_types_csv, selected_populations=None, adaptor=EdgeAdaptor): + sonata_file = sonata.File(data_files=edges_h5, data_type_files=edge_types_csv) + edge_populations = [] + for edge_pop in sonata_file.edges.populations: + edge_populations.append(cls(edge_pop, adaptor)) + + return edge_populations diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/network_reader.pyc b/bmtk-vb/bmtk/simulator/core/sonata_reader/network_reader.pyc new file mode 100644 index 0000000..722aa7d Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/sonata_reader/network_reader.pyc differ diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/node_adaptor.py b/bmtk-vb/bmtk/simulator/core/sonata_reader/node_adaptor.py new file mode 100644 index 0000000..f8d980c --- /dev/null +++ b/bmtk-vb/bmtk/simulator/core/sonata_reader/node_adaptor.py @@ -0,0 +1,207 @@ +import os +import json +import types +import numpy as np + + +class SonataBaseNode(object): + def __init__(self, node, prop_adaptor): + self._node = node + self._prop_adaptor = prop_adaptor + + @property + def node_id(self): + return self._prop_adaptor.node_id(self._node) + + @property + def gid(self): + return self._prop_adaptor.gid(self._node) + + @property + def dynamics_params(self): + return self._prop_adaptor.dynamics_params(self._node) + + @property + def model_type(self): + return self._prop_adaptor.model_type(self._node) + + @property + def model_template(self): + return self._prop_adaptor.model_template(self._node) + + @property + def model_processing(self): + return self._prop_adaptor.model_processing(self._node) + + @property + def network(self): + return self._prop_adaptor.network + + @property + def population(self): + return self._prop_adaptor.network + + def __getitem__(self, prop_key): + return self._node[prop_key] + + +class NodeAdaptor(object): + COL_MODEL_TYPE = 'model_type' + COL_GID = 'gid' + COL_DYNAMICS_PARAM = 'dynamics_params' + COL_MODEL_TEMPLATE = 'model_template' + COL_MODEL_PROCESSING = 'model_processing' + + def __init__(self, network): + self._network = network + self._model_template_cache = {} + self._model_processing_cache = {} + + @property + def batch_process(self): + return False + + @batch_process.setter + def batch_process(self, flag): + pass + + def node_id(self, node): + return node.node_id + + def model_type(self, node): + return node[self.COL_MODEL_TYPE] + + def model_template(self, node): + # TODO: If model-template comes from the types table we should split it in _preprocess_types + model_template_str = node[self.COL_MODEL_TEMPLATE] + if model_template_str is None: + return None + elif model_template_str in self._model_template_cache: + return self._model_template_cache[model_template_str] + else: + template_parts = model_template_str.split(':') + directive, template = template_parts[0], template_parts[1] + self._model_template_cache[model_template_str] = (directive, template) + return directive, template + + def model_processing(self, node): + model_processing_str = node[self.COL_MODEL_PROCESSING] + if model_processing_str is None: + return [] + else: + # TODO: Split in the node_types_table when possible + return model_processing_str.split(',') + + @staticmethod + def preprocess_node_types(network, node_population): + # TODO: The following figures out the actually used node-type-ids. For mem and speed may be better to just + # process them all + #node_type_ids = node_population.type_ids + node_type_ids = np.unique(node_population.type_ids) + # TODO: Verify all the node_type_ids are in the table + node_types_table = node_population.types_table + + # TODO: Convert model_type to a enum + if network.has_component('morphologies_dir'): + morph_dir = network.get_component('morphologies_dir') + if morph_dir is not None and 'morphology' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + if node_type['morphology'] is None: + continue + + # TODO: See if absolute path is stored in csv + swc_path = os.path.join(morph_dir, node_type['morphology']) + + # According to Sonata format, the .swc extension is not needed. Thus we need to add it if req. + if not os.path.exists(swc_path) and not swc_path.endswith('.swc'): + swc_path += '.swc' + if not os.path.exists(swc_path): + network.io.log_exception('Could not find node morphology file {}.'.format(swc_path)) + + node_type['morphology'] = swc_path + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + if isinstance(dynamics_params, dict): + continue + + if dynamics_params is None: + continue + + model_type = node_type['model_type'] + if model_type == 'biophysical': + params_dir = network.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = network.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = network.get_component('point_neuron_models_dir') + elif model_type == 'population': + params_dir = network.get_component('population_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = network.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + network.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + # TODO: Use adaptor to validate model_type and model_template values + + @classmethod + def create_adaptor(cls, node_group, network): + prop_map = cls(network) + return cls.patch_adaptor(prop_map, node_group, network) + + @classmethod + def patch_adaptor(cls, adaptor, node_group, network): + adaptor.network = network + + # Use node_id if the user hasn't specified a gid table + if not node_group.has_gids: + adaptor.gid = types.MethodType(NodeAdaptor.node_id, adaptor) + + # dynamics_params + if node_group.has_dynamics_params: + adaptor.dynamics_params = types.MethodType(group_dynamics_params, adaptor) + elif 'dynamics_params' in node_group.all_columns: + adaptor.dynamics_params = types.MethodType(types_dynamics_params, adaptor) + else: + adaptor.dynamics_params = types.MethodType(none_function, adaptor) + + if 'model_template' not in node_group.all_columns: + adaptor.model_template = types.MethodType(none_function, adaptor) + + if 'model_processing' not in node_group.all_columns: + adaptor.model_processing = types.MethodType(empty_list, adaptor) + + return adaptor + + def get_node(self, sonata_node): + return SonataBaseNode(sonata_node, self) + + +def none_function(self, node): + return None + + +def empty_list(self, node): + return [] + + +def types_dynamics_params(self, node): + return node['dynamics_params'] + + +def group_dynamics_params(self, node): + return node.dynamics_params + diff --git a/bmtk-vb/bmtk/simulator/core/sonata_reader/node_adaptor.pyc b/bmtk-vb/bmtk/simulator/core/sonata_reader/node_adaptor.pyc new file mode 100644 index 0000000..1c82499 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/core/sonata_reader/node_adaptor.pyc differ diff --git a/bmtk-vb/bmtk/simulator/filternet/__init__.py b/bmtk-vb/bmtk/simulator/filternet/__init__.py new file mode 100644 index 0000000..9e6712b --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/__init__.py @@ -0,0 +1,5 @@ +from bmtk.simulator.filternet.filternetwork import FilterNetwork +from bmtk.simulator.filternet.filtersimulator import FilterSimulator +from bmtk.simulator.filternet.config import Config + +import bmtk.simulator.filternet.default_setters diff --git a/bmtk-vb/bmtk/simulator/filternet/cell.py b/bmtk-vb/bmtk/simulator/filternet/cell.py new file mode 100644 index 0000000..240cab5 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/cell.py @@ -0,0 +1,28 @@ +from bmtk.simulator.filternet.pyfunction_cache import py_modules + + +class Cell(object): + def __init__(self, node): + self._node = node + self._gid = node.gid + self._node_id = node.node_id + self._lgn_cell_obj = None + + @property + def gid(self): + return self._gid + + @property + def lgn_cell_obj(self): + return self._lgn_cell_obj + + def build(self): + cell_loaders = self._node.model_processing + if len(cell_loaders) > 0: + raise Exception('Cannot use more than one model_processing method per cell. Exiting.') + elif len(cell_loaders) == 1: + model_processing_fnc = py_modules.cell_processor(cell_loaders[0]) + else: + model_processing_fnc = py_modules.cell_processor('default') + + self._lgn_cell_obj = model_processing_fnc(self._node) diff --git a/bmtk-vb/bmtk/simulator/filternet/cell_models.py b/bmtk-vb/bmtk/simulator/filternet/cell_models.py new file mode 100644 index 0000000..a415e9f --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/cell_models.py @@ -0,0 +1 @@ +from bmtk.simulator.filternet.lgnmodel.cellmodel import * \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/config.py b/bmtk-vb/bmtk/simulator/filternet/config.py new file mode 100644 index 0000000..b10ee10 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/config.py @@ -0,0 +1,8 @@ +import os +import json + +from bmtk.simulator.core.config import ConfigDict + + +class Config(ConfigDict): + pass \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/default_setters/__init__.py b/bmtk-vb/bmtk/simulator/filternet/default_setters/__init__.py new file mode 100644 index 0000000..6ec46cc --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/default_setters/__init__.py @@ -0,0 +1 @@ +from cell_loaders import * diff --git a/bmtk-vb/bmtk/simulator/filternet/default_setters/cell_loaders.py b/bmtk-vb/bmtk/simulator/filternet/default_setters/cell_loaders.py new file mode 100644 index 0000000..c0c74ad --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/default_setters/cell_loaders.py @@ -0,0 +1,9 @@ +from bmtk.simulator.filternet.pyfunction_cache import add_cell_processor + + +def default_cell_loader(node): + print(node.model_template) + print('DEFAULT') + exit() + +add_cell_processor(default_cell_loader, 'default', overwrite=False) diff --git a/bmtk-vb/bmtk/simulator/filternet/filternetwork.py b/bmtk-vb/bmtk/simulator/filternet/filternetwork.py new file mode 100644 index 0000000..170a9e7 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/filternetwork.py @@ -0,0 +1,28 @@ +from bmtk.simulator.core.simulator_network import SimNetwork +from bmtk.simulator.filternet.cell import Cell +from bmtk.simulator.filternet.pyfunction_cache import py_modules + + +class FilterNetwork(SimNetwork): + def __init__(self): + super(FilterNetwork, self).__init__() + + self._local_cells = [] + + def cells(self): + return self._local_cells + + def build(self): + self.build_nodes() + + def set_default_processing(self, processing_fnc): + py_modules.add_cell_processor('default', processing_fnc) + + def build_nodes(self): + for node_pop in self.node_populations: + for node in node_pop.get_nodes(): + cell = Cell(node) + cell.build() + self._local_cells.append(cell) + + diff --git a/bmtk-vb/bmtk/simulator/filternet/filters.py b/bmtk-vb/bmtk/simulator/filternet/filters.py new file mode 100644 index 0000000..ae53df5 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/filters.py @@ -0,0 +1,3 @@ +from bmtk.simulator.filternet.lgnmodel.temporalfilter import * +from bmtk.simulator.filternet.lgnmodel.spatialfilter import * +from bmtk.simulator.filternet.lgnmodel.linearfilter import * \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/filtersimulator.py b/bmtk-vb/bmtk/simulator/filternet/filtersimulator.py new file mode 100644 index 0000000..7d6742a --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/filtersimulator.py @@ -0,0 +1,193 @@ +import csv + +from bmtk.simulator.core.simulator import Simulator +import bmtk.simulator.utils.simulation_inputs as inputs +from bmtk.simulator.filternet.config import Config +from bmtk.simulator.filternet.lgnmodel.movie import * +from bmtk.simulator.filternet import modules as mods +from bmtk.simulator.filternet.io_tools import io +from six import string_types + + +class FilterSimulator(Simulator): + def __init__(self, network, dt, tstop): + super(FilterSimulator, self).__init__() + self._network = network + self._dt = dt + self._tstop = tstop/1000.0 + + self.rates_csv = None + self._movies = [] + + def add_movie(self, movie_type, params): + # TODO: Move this into its own factory + movie_type = movie_type.lower() if isinstance(movie_type, string_types) else 'movie' + if movie_type == 'movie' or not movie_type: + raise NotImplementedError + + elif movie_type == 'full_field': + raise NotImplementedError + + elif movie_type == 'full_field_flash': + raise NotImplementedError + + elif movie_type == 'graiting': + init_params = FilterSimulator.find_params(['row_size', 'col_size', 'frame_rate'], **params) + create_params = FilterSimulator.find_params(['gray_screen_dur', 'cpd', 'temporal_f', 'theta', 'contrast'], + **params) + gm = GratingMovie(**init_params) + graiting_movie = gm.create_movie(t_min=0.0, t_max=self._tstop, **create_params) + self._movies.append(graiting_movie) + + else: + raise Exception('Unknown movie type {}'.format(movie_type)) + + def run(self): + for mod in self._sim_mods: + mod.initialize(self) + + io.log_info('Evaluating rates.') + for cell in self._network.cells(): + for movie in self._movies: + ts, f_rates = cell.lgn_cell_obj.evaluate(movie, downsample=1, separable=True) + + for mod in self._sim_mods: + mod.save(self, cell.gid, ts, f_rates) + + """ + if self.rates_csv is not None: + print 'saving {}'.format(cell.gid) + for t, f in zip(t, f_tot): + csv_writer.writerow([t, f, cell.gid]) + csv_fhandle.flush() + """ + io.log_info('Done.') + for mod in self._sim_mods: + mod.finalize(self) + + """ + def generate_spikes(LGN, trials, duration, output_file_name): + # f_tot = np.loadtxt(output_file_name + "_f_tot.csv", delimiter=" ") + # t = f_tot[0, :] + + f = h5.File(output_file_name + "_f_tot.h5", 'r') + f_tot = np.array(f.get('firing_rates_Hz')) + + t = np.array(f.get('time')) + # For h5 files that don't have time explicitly saved + t = np.linspace(0, duration, f_tot.shape[1]) + + + #create output file + f = nwb.create_blank_file(output_file_name + '_spikes.nwb', force=True) + + for trial in range(trials): + for counter in range(len(LGN.nodes())): + try: + spike_train = np.array(f_rate_to_spike_train(t*1000., f_tot[counter, :], np.random.randint(10000), 1000.*min(t), 1000.*max(t), 0.1)) + except: + spike_train = 1000.*np.array(pg.generate_inhomogenous_poisson(t, f_tot[counter, :], seed=np.random.randint(10000))) #convert to milliseconds and hence the multiplication by 1000 + + nwb.SpikeTrain(spike_train, unit='millisecond').add_to_processing(f, 'trial_%s' % trial) + f.close() + + """ + + + @staticmethod + def find_params(param_names, **kwargs): + ret_dict = {} + for pn in param_names: + if pn in kwargs: + ret_dict[pn] = kwargs[pn] + + return ret_dict + + @classmethod + def from_config(cls, config, network): + if not isinstance(config, Config): + try: + config = Config.load(config, False) + except Exception as e: + network.io.log_exception('Could not convert {} (type "{}") to json.'.format(config, type(config))) + + if not config.with_networks: + network.io.log_exception('Could not find any network files. Unable to build network.') + + sim = cls(network=network, dt=config.dt, tstop=config.tstop) + + network.io.log_info('Building cells.') + network.build_nodes() + + # TODO: Need to create a gid selector + for sim_input in inputs.from_config(config): + if sim_input.input_type == 'movie': + sim.add_movie(sim_input.module, sim_input.params) + else: + raise Exception('Unable to load input type {}'.format(sim_input.input_type)) + + + """ + node_set = network.get_node_set(sim_input.node_set) + if sim_input.input_type == 'spikes': + spikes = spike_trains.SpikesInput.load(name=sim_input.name, module=sim_input.module, + input_type=sim_input.input_type, params=sim_input.params) + io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + network.add_spike_trains(spikes, node_set) + + elif sim_input.module == 'IClamp': + # TODO: Parse from csv file + amplitude = sim_input.params['amp'] + delay = sim_input.params['delay'] + duration = sim_input.params['duration'] + gids = sim_input.params['node_set'] + sim.attach_current_clamp(amplitude, delay, duration, node_set) + + elif sim_input.module == 'xstim': + sim.add_mod(mods.XStimMod(**sim_input.params)) + + else: + io.log_exception('Can not parse input format {}'.format(sim_input.name)) + """ + + + rates_csv = config.output.get('rates_csv', None) + rates_h5 = config.output.get('rates_h5', None) + if rates_csv or rates_h5: + sim.add_mod(mods.RecordRates(rates_csv, rates_h5, config.output_dir)) + + spikes_csv = config.output.get('spikes_csv', None) + spikes_h5 = config.output.get('spikes_h5', None) + spikes_nwb = config.output.get('spikes_nwb', None) + if spikes_csv or spikes_h5 or spikes_nwb: + sim.add_mod(mods.SpikesGenerator(spikes_csv, spikes_h5, spikes_nwb, config.output_dir)) + + # Parse the "reports" section of the config and load an associated output module for each report + """ + sim_reports = reports.from_config(config) + for report in sim_reports: + if isinstance(report, reports.SpikesReport): + mod = mods.SpikesMod(**report.params) + + elif isinstance(report, reports.MembraneReport): + if report.params['sections'] == 'soma': + mod = mods.SomaReport(**report.params) + + else: + #print report.params + mod = mods.MembraneReport(**report.params) + + elif isinstance(report, reports.ECPReport): + mod = mods.EcpMod(**report.params) + # Set up the ability for ecp on all relevant cells + # TODO: According to spec we need to allow a different subset other than only biophysical cells + for gid, cell in network.cell_type_maps('biophysical').items(): + cell.setup_ecp() + else: + # TODO: Allow users to register customized modules using pymodules + io.log_warning('Unrecognized module {}, skipping.'.format(report.module)) + continue + + sim.add_mod(mod) + """ + return sim \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/io_tools.py b/bmtk-vb/bmtk/simulator/filternet/io_tools.py new file mode 100644 index 0000000..dfdcfaa --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/io_tools.py @@ -0,0 +1 @@ +from bmtk.simulator.core.io_tools import io diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/__init__.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/__init__.py new file mode 100644 index 0000000..72b9443 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/__init__.py @@ -0,0 +1,7 @@ +__version__ = '0.1.0' + +# from lgnmodel import lgnmodel +# from lgnmodel.dev import mask +# from lgnmodel.dev import movie +# from lgnmodel import cellmodel +# from lgnmodel.dev import boundcellmodel diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/sOFF_cell_data.csv b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/sOFF_cell_data.csv new file mode 100755 index 0000000..f6438be --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/sOFF_cell_data.csv @@ -0,0 +1,29 @@ +Mouse_id,Shank,Clu,Area,Layer,WVF_ratio,WVF_duration,Bl_ctr_row,Bl_ctr_col,Wh_ctr_row,Wh_ctr_col,Bl_rad,Wh_rad,Bl_lat,Wh_lat,Bl_mfr,Wh_mfr,Bl_SI,Wh_SI,Area_Overlap,Area_Union,OverlapIdx,PSTH_correln,Subfield_sep,Bl_stimc,Wh_stimc,Bl_chk_num,Wh_chk_num,Spont,Spont_cyc,Pref_ori,Pref_SF,Pref_TF,Max_rate,Max_rate_cyc,F0_pref,Sharp,CV,OSI,OSI_wnull,DSI_sev,DSI_chen,f1f0b,f1f0,Pval,F0_TF1,F0_TF2,F0_TF4,F0_TF8,F0_TF15,F1_TF1,F1_TF2,F1_TF4,F1_TF8,F1_TF15 +60,3,12,1,NaN,0.227894433917728,0.275,8,13,10,9,3.31738342162619,0,94.5,NaN,21.0980965620245,9.81223461549439,0.312689578226931,NaN,0,56.309018948858,0,NaN,NaN,224,154,6,7,1.15555555555555,1.17037037037037,315,0.02,2,50,22.2222222222222,3.22222222222222,0.605603448275862,0.262695167743211,0.372781065088757,0.620071684587814,0.0265486725663716,0.0517241379310343,1.06592499221608,1.6739255292924,0.0435181045378624,2.16666666666667,3.22222222222222,2.22222222222222,1.61111111111111,0.833333333333333,2.71549870589566,3.4346471971407,3.7301484517374,2.33418898771623,1.50047031747581 +63,3,12,1,NaN,0.264513134151242,0.3,3,9,3,9,4.03491385399393,0,73.5,188.5,127.560438680997,48.7988511553626,0.342208990487044,0.322079894957013,0,51.146792844982,0,-0.436401558435213,0,147,147,5,11,9.35,9.16388888888889,135,0.04,1,75,54.1666666666667,17.625,0.700945626477541,0.110300729852412,0.254262416604892,0.464038359083644,0.231441048034935,0.375886524822695,1.108780641646,2.30965632673797,0.000512599358863601,17.625,11.2916666666667,15.4166666666667,8.875,2.875,19.5422588090107,11.9779602766624,14.173133697861,7.52200682626415,5.00527135935301 +72,2,25,1,NaN,0.23674463616793,0.375,6,14,15,19,11.6876336352714,0,144.5,NaN,23.6240071690253,18.4133737675155,0.356643544987323,NaN,0,454.751365334866,0,NaN,NaN,240,339,9,4,3.3,3.25,270,0.08,8,62.5,37.5,14.6666666666667,0.747422680412371,0.0658453670825114,0.193220338983051,0.422330097087379,0.20136518771331,0.335227272727273,0.352768488949166,0.453191635438344,0.000689821836055592,13.0833333333333,9.75,11.8333333333333,14.6666666666667,8.58333333333333,3.03189515980365,2.35162873257691,3.71804674030783,5.1739378379211,2.90346262297405 +72,3,2,1,NaN,0.17161401270352,0.45,7,14,5,32,3.2114115745907,0,106.5,NaN,10.7361652151892,6.0966299947273,0.357411817046969,NaN,0,37.6978353638313,0,NaN,NaN,241,563,7,6,2.3,0.25,0,0.16,8,37.5,33.3333333333333,6.08333333333333,0.415239726027397,0.345586939365797,0.654390934844193,0.759368836291913,0.309417040358744,0.472602739726027,0.459642275182134,0.479341229832797,0.0120917698906574,3.91666666666667,4.33333333333333,3.625,6.08333333333333,1.33333333333333,1.12042247030086,2.64044245685633,1.30729519345545,2.79615717402465,0.992882005175792 +72,3,15,1,NaN,0.191960207571084,0.525,7,14,14,2,3.8287025341613,0,128.5,NaN,25.8455956185529,12.3750239323341,0.464097667283985,NaN,0,50.2637804851085,0,NaN,NaN,241,32,8,5,0.1,0,180,0.16,8,25,12.5,2.16666666666667,0.432692307692308,0.461412217618803,0.664,0.816593886462882,0,0,0.527894845241589,0.527894845241589,0.0354251640054324,1.375,1.66666666666667,1.54166666666667,2.16666666666667,0.291666666666667,1.17481549663973,1.67067644404671,1.08148048724396,1.14377216469011,0.462933359250596 +72,3,19,1,NaN,0.193829748450602,0.45,7,12,17,18,3.80888656544766,0,95.5,NaN,15.6969845209821,9.88260583506573,0.397834985620538,NaN,0,61.6070931080991,0,NaN,NaN,205,323,6,2,1.9,1.75,45,0.64,15,75,16.6666666666667,3.875,0.75,0.0396701498587432,0.166144200626959,0.396825396825397,0.207792207792208,0.344086021505376,0.516975271992441,0.942719613633275,0.00462256555845095,2.79166666666667,3.20833333333333,3.29166666666667,2.91666666666667,3.875,1.12745038398484,0.965812716058466,1.85618045420095,1.42340203076708,2.00327917897071 +72,3,24,1,NaN,0.214114220695846,0.45,7,12,18,10,2.81304915787261,0,117.5,NaN,18.7368033776989,7.57736847420232,0.338538785120179,NaN,0,30.7695845402083,0,NaN,NaN,205,180,7,10,1.2,1.75,45,0.16,2,37.5,16.6666666666667,4.33333333333333,0.681490384615384,0.104771405575162,0.27217125382263,0.442622950819672,0.350649350649351,0.519230769230769,0.45560461795616,0.764240004313558,0.0375202720639944,3.54166666666667,4.33333333333333,3.08333333333333,2.29166666666667,2.20833333333333,2.00193125072158,1.97428667781003,1.89661235690541,1.16926096300871,1.4021824426304 +72,4,22,1,NaN,0.243258295337443,0.5,16,1,5,26,1.89448348117648,0,84.5,NaN,18.1616089127425,15.941831811114,0.313254251849423,NaN,0,32.7393813430031,0,NaN,NaN,16,455,6,5,0.7,0.5,135,0.02,4,62.5,25,6.33333333333333,0.689144736842105,0.168836493478692,0.208747514910537,0.496839443742099,0.027027027027027,0.0526315789473684,1.49136304384079,1.61919416188429,0.00797095394639537,3.875,4.33333333333333,6.33333333333333,3.70833333333333,5.04166666666667,5.18251916951976,6.44403480524721,9.44529927765837,5.83524176474689,7.47958040965291 +72,4,26,1,NaN,0.251147052076164,0.425,6,8,7,16,3.36590940295369,0,125.5,NaN,31.2988506309783,13.1607172188833,0.435950524637569,NaN,0,36.6789749485927,0,NaN,NaN,132,277,9,4,0,0,270,0.08,4,37.5,20.8333333333333,4.08333333333333,0.514030612244898,0.245707692206953,0.561752988047809,0.686609686609687,0.324324324324324,0.489795918367347,1.42520239084387,1.42520239084387,0.0153220356313431,2.91666666666667,2.54166666666667,4.08333333333333,3.25,0.541666666666667,3.15832004061644,3.12001867713679,5.81957642927912,4.76093191575991,0.932792515297761 +72,4,29,1,NaN,0.173264409742832,0.45,6,9,9,20,4.22853114375315,0,132.5,NaN,28.993229578405,10.4456145698005,0.445186921014291,NaN,0,60.180688526765,0,NaN,NaN,150,351,8,3,1.2,1.25,135,0.04,4,37.5,16.6666666666667,4,0.638020833333333,0.0560388988479427,0.207547169811321,0.405660377358491,0.288590604026846,0.447916666666667,1.43135854910831,2.08197607143027,0.00448418831120022,2.91666666666667,3.75,4,1.91666666666667,1.29166666666667,3.20708787843897,5.32832274286747,5.72543419643325,2.42846036962814,1.69737352881297 +72,5,16,1,NaN,0.32528169876946,0.45,12,17,2,20,9.76242188228036,0,10.5,NaN,16.2352767444367,16.1883204032263,0.318095563667322,NaN,0.203772083047737,434.645853140823,0.00046882325363338,NaN,NaN,300,344,2,5,3.2,2.75,135,0.04,4,87.5,58.3333333333333,16.4583333333333,0.715822784810127,0.0625111146961294,0.202435312024353,0.417130144605117,0.240188383045526,0.387341772151899,1.54763513865801,1.85810297802405,9.82286176845653e-05,13.8333333333333,15.75,16.4583333333333,10.2083333333333,15,14.5196957230697,19.9547738711671,25.4714949904131,17.8859216430096,23.7133703939669 +72,5,25,1,NaN,0.154176850826486,0.525,6,11,8,1,3.71986146157398,0,103.5,NaN,39.9487382339472,18.7840458760451,0.53388333550947,NaN,0,47.8864395162182,0,NaN,NaN,186,8,7,3,0.8,0,0,0.08,2,50,37.5,12.4166666666667,0.690855704697987,0.0835000262684289,0.337822671156005,0.490940465918896,0.37962962962963,0.550335570469799,0.91276594444903,0.91276594444903,0.00130098648313454,4.54166666666667,12.4166666666667,12.25,5.70833333333333,8.375,4.13731107678691,11.3335104769088,13.4014603108746,7.15836649799689,8.40963025038677 +72,6,18,1,NaN,0.192842487635676,0.425,6,9,7,24,2.86634576035391,0,92.5,NaN,46.4315953853779,13.4560643344102,0.321303060480483,NaN,0,25.81113051938,0,NaN,NaN,150,421,6,3,2,1,180,0.02,8,62.5,33.3333333333333,7.54166666666667,0.785714285714286,0.0543590713583877,-0.0189701897018971,0.234215885947047,0.194719471947195,0.325966850828729,1.72875777040663,1.99302647416306,0.0121928458017285,4.79166666666667,7.33333333333333,4.625,7.54166666666667,5.04166666666667,6.49902397742458,11.0959764435025,7.67992950266336,13.0377148518167,8.94178529614187 +72,6,27,1,NaN,0.163265955223293,0.425,6,9,11,31,5.26067852910692,0,187.5,NaN,28.1086462945887,18.259239443644,0.405490551796678,NaN,0,120.293453025847,0,NaN,NaN,150,551,11,10,0.9,1.75,135,0.02,1,62.5,33.3333333333333,6.875,0.756060606060606,0.0708240362608107,0.217712177121771,0.445026178010471,0.195652173913044,0.327272727272727,1.21203148773004,1.62589589817444,0.000917138003879289,6.875,5.54166666666667,3.33333333333333,3.875,2.83333333333333,8.332716478144,5.88975257891834,3.79454087673417,3.75877880958225,2.74849780724932 +73,5,9,1,NaN,0.268914895339528,0.375,6,10,4,21,5.3138386985443,0,94.5,NaN,13.3907614920431,8.32550972859402,0.351692126044824,NaN,0,104.874698741902,0,NaN,NaN,168,364,6,2,0.1,0.25,90,0.04,1,50,33.3333333333333,7.83333333333333,0.575581395348837,0.226393360499366,0.305555555555555,0.602385685884692,-0.0669975186104219,-0.143617021276596,1.35611352253308,1.40082056173747,0.000140317384885218,7.83333333333333,7.04166666666667,2.625,0.5,0.291666666666667,10.6228892598424,10.5808897672901,4.49326770686497,0.887518649793165,0.522100042786368 +73,6,14,1,NaN,0.242726417237974,0.3,9,11,3,6,9.14964940445724,0,65.5,NaN,45.3938924646263,25.8702040095581,0.334086340574054,NaN,0,278.556437526256,0,NaN,NaN,189,93,5,10,4.7,4.25,270,0.02,15,150,141.666666666667,24.0416666666667,0.868381240544629,0.0272134135049013,0.0382366171839857,0.370991468078847,-0.00944206008583688,-0.0190641247833622,1.76909268952665,2.14898206706711,1.04506321347993e-05,6.625,8.375,16.7083333333333,21.7083333333333,24.0416666666667,8.51928922805708,12.8457058640276,27.4766733503038,37.16245657985,42.5319367440365 +75,2,8,1,NaN,0.189102268383661,0.3,7,11,3,26,3.7946689474635,0,68.5,NaN,18.1486917869246,13.3610202594852,0.38722203250154,NaN,0,67.5844075441661,0,NaN,NaN,187,453,5,9,3.3,4,225,0.32,4,50,25,6.29166666666667,0.779801324503311,0.0309498508218965,0.100182149362477,0.352555701179554,0.170542635658915,0.291390728476821,0.425835896651261,1.16911309807892,0.000120970070208297,4.5,4.08333333333333,6.29166666666667,4.54166666666667,5.70833333333333,1.81889501379154,1.53151973185195,2.67921751643085,1.86448756331264,2.16687851095823 +75,3,6,1,NaN,0.156525539257234,0.3,6,10,1,16,4.3619242059316,0,71.5,NaN,31.3866228823021,18.946005773115,0.527174587558903,NaN,0,77.3654675304575,0,NaN,NaN,168,271,5,3,5.8,5.25,90,0.04,15,75,50,11.1666666666667,0.625932835820895,0.0860841200396548,0.271648873072361,0.466550825369244,0.270142180094787,0.425373134328358,1.6825021632129,3.17542661789476,0.000773426379641316,7.20833333333333,6.16666666666667,6.95833333333333,7.04166666666667,11.1666666666667,9.23802191648321,8.63768439604191,11.3629232423904,11.461549916428,18.787940822544 +75,3,10,1,NaN,0.205059107016681,0.3,7,11,13,4,3.35626033560117,0,102.5,NaN,27.7293416501643,9.88926872507762,0.5511360577852,NaN,0,37.8336834191965,0,NaN,NaN,187,67,7,4,7.9,8.75,45,0.02,15,125,91.6666666666667,20,0.761197916666666,0.0682387190512284,0.15872057936029,0.438582360048329,0.0750279955207168,0.139583333333334,1.63914777665678,2.91404049183427,8.49051217147285e-05,7.625,11.0833333333333,12.8333333333333,12.625,20,10.5593851547536,16.3644705428685,19.8691468326841,19.4162516634255,32.7829555331355 +75,3,14,1,NaN,0.193391587044465,0.275,7,8,17,27,5.13169011499309,0,72.5,NaN,22.85892380357,16.9770380143854,0.467112310488397,NaN,0,112.753885953081,0,NaN,NaN,133,485,5,2,6.6,6.25,225,0.08,4,87.5,62.5,17.4166666666667,0.634569377990431,0.0609248992044004,0.207220216606498,0.359019264448336,0.436426116838488,0.607655502392345,1.0870687813283,1.69550280072847,0.0313438418094254,11.75,12.875,17.4166666666667,13.0416666666667,7.08333333333333,9.36215604059938,9.84202467011974,18.9331146081346,16.3988326909231,8.89559308939555 +75,3,15,1,NaN,0.313001745093912,0.3,8,15,4,25,10.6510472403218,0,86.5,NaN,37.0214120367194,22.9181216449019,0.4520114522557,NaN,0,485.385101819709,0,NaN,NaN,260,436,6,7,5.2,5.75,180,0.32,1,87.5,54.1666666666667,24.1666666666667,0.500215517241379,0.348202850860347,0.688500727802038,0.810451727192205,0.135029354207436,0.237931034482759,0.126202913691368,0.165605633350663,9.89709604734052e-05,24.1666666666667,23.5416666666667,15.8333333333333,17,17.1666666666667,3.04990374754138,3.93465250177409,4.45322723594722,4.14212991396283,4.00548296424652 +77,2,25,1,NaN,0.258379026929274,0.375,10,22,7,7,8.9065730588013,0,187.5,NaN,24.7351110224677,22.4579227596474,0.50715649625158,NaN,0,322.503283436885,0,NaN,NaN,388,115,11,4,5.3,5,180,0.04,4,50,37.5,13.375,0.500389408099688,0.287783111281432,0.539568345323741,0.6751269035533,0.296969696969697,0.457943925233645,0.282369399924872,0.450948146148676,0.00118075407152943,12.4583333333333,13.25,13.375,10.5416666666667,12.6666666666667,4.24022664788561,5.37433560144109,3.77669072399516,3.62812819243134,3.8117929952908 +78,1,14,1,NaN,0.161806152197335,0.3,3,4,7,30,6.62335148075923,0,96.5,NaN,68.5583245747765,33.7420784958353,0.531495707189419,NaN,0,149.908329095452,0,NaN,NaN,57,529,6,11,13.2,16.25,225,0.02,2,87.5,58.3333333333333,20.5,0.715193089430894,0.0761481984225665,0.111236589497459,0.356763383735186,0.185542168674699,0.313008130081301,0.791461156384882,3.81763616609178,0.0017595645200145,13.1666666666667,20.5,14.9583333333333,14.2083333333333,11.75,13.4953037568487,16.2249537058901,14.9736415138084,14.2612878116158,12.0939263761713 +78,2,7,1,NaN,0.239215201127631,0.275,7,9,7,22,6.017889160438,0,59.5,NaN,56.0686653175444,22.7928361604366,0.366315406681982,NaN,0,123.350034271563,0,NaN,NaN,151,385,4,4,10.4,8.25,225,0.08,8,87.5,70.8333333333333,23.375,0.665552584670232,0.162892660368509,0.322333529758397,0.549902152641879,0.133333333333333,0.235294117647059,1.27533261529656,1.9709685872765,2.15623430262214e-05,9.375,11.8333333333333,22.2083333333333,23.375,11.5833333333333,8.63429439311284,13.7068058472998,25.8353763950164,29.810899882557,15.0089329977661 +78,2,10,1,NaN,0.255564925100401,0.3,3,31,16,24,3.96464206223105,0,187.5,NaN,14.4639652570043,12.2962025411232,0.406956185701321,NaN,0,179.794901275787,0,NaN,NaN,543,430,11,2,3,3.75,180,0.32,4,50,29.1666666666667,8.5,0.915441176470588,0.0360452798335642,0.0381679389312977,0.349397590361446,0.0408163265306121,0.0784313725490193,0.358570589289018,0.641652633464558,0.00353540111464831,5.58333333333333,6.08333333333333,8.5,4.33333333333333,2.41666666666667,3.03472779299531,2.19925771875221,3.04785000895665,2.34220359090903,1.89677282603666 +78,2,12,1,NaN,0.22823020436422,0.275,5,10,13,7,5.30569487966127,0,62.5,NaN,56.1729585863476,20.8519488568425,0.38673327032744,NaN,0,95.9087270878015,0,NaN,NaN,167,121,5,3,4.2,4.5,225,0.16,1,50,29.1666666666667,10.9583333333333,0.708650190114068,0.0776988864537472,0.190045248868778,0.450920245398773,0.112050739957717,0.201520912547529,0.746702318947234,1.2669852250524,0.000150046958143631,10.9583333333333,8.25,6.45833333333333,4.16666666666667,6.33333333333333,8.18261291179678,8.00310352210064,8.01003028585456,4.33601505186198,5.82912768418014 +63,2,2,1,NaN,0.119049915500518,0.35,5,7,5,7,5.36848635382528,0,63.5,NaN,61.5955705313946,41.2808571747207,0.366689375305713,NaN,0,90.5427289008778,0,NaN,NaN,113,113,5,11,6.30333333333333,6.41111111111111,270,0.08,2,62.5,41.6666666666667,16.2083333333333,0.686083123425693,0.0849905885078977,0.0843205574912892,0.318818040435459,0.223270440251572,0.365038560411311,0.754052323967631,1.24748945572757,0.00361592014864013,14.4166666666667,16.2083333333333,15.4583333333333,11.5833333333333,10.5833333333333,11.3388618807977,12.221931417642,16.030682212326,12.9797678284226,13.1982179165743 +63,2,6,1,NaN,0.246787403028116,0.275,4,9,4,9,6.01429531768067,0,63.5,NaN,47.5346848059286,54.4310078449639,0.437604558761872,NaN,0,113.636898312955,0,NaN,NaN,148,148,5,11,9.81166666666667,10.1472222222222,0,0.16,4,75,45.8333333333333,23.625,0.845017636684303,0.0868065796926466,0.163673678809646,0.463639355051004,0.0197841726618705,0.0388007054673722,0.158324117572715,0.277524035440218,0.000692696526636554,15.7083333333333,20.4583333333333,23.625,19.2916666666667,14.6666666666667,4.3983451939541,3.38407253347712,3.74040727765539,3.93974714619665,4.81246566442344 diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/sON_cell_data.csv b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/sON_cell_data.csv new file mode 100755 index 0000000..08ee244 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/sON_cell_data.csv @@ -0,0 +1,23 @@ +Mouse_id,Shank,Clu,Area,Layer,WVF_ratio,WVF_duration,Bl_ctr_row,Bl_ctr_col,Wh_ctr_row,Wh_ctr_col,Bl_rad,Wh_rad,Bl_lat,Wh_lat,Bl_mfr,Wh_mfr,Bl_SI,Wh_SI,Area_Overlap,Area_Union,OverlapIdx,PSTH_correln,Subfield_sep,Bl_stimc,Wh_stimc,Bl_chk_num,Wh_chk_num,Spont,Spont_cyc,Pref_ori,Pref_SF,Pref_TF,Max_rate,Max_rate_cyc,F0_pref,Sharp,CV,OSI,OSI_wnull,DSI_sev,DSI_chen,f1f0b,f1f0,Pval,F0_TF1,F0_TF2,F0_TF4,F0_TF8,F0_TF15,F1_TF1,F1_TF2,F1_TF4,F1_TF8,F1_TF15 +60,2,10,1,NaN,0.195334635936007,0.3,10,17,7,10,0,8.66541108694164,NaN,61.5,14.3369503257721,23.3418634859177,NaN,0.369894205590993,0,795.186592079952,0,NaN,NaN,298,169,6,5,4.55999999999999,4.54814814814815,225,0.64,15,50,27.7777777777778,9.11111111111111,0.510670731707317,0.184133379263178,0.413793103448276,0.575,0.301587301587302,0.463414634146341,0.362847818857151,0.724517560380351,0.00303825454171586,5.55555555555556,4.61111111111111,5.55555555555556,5.5,9.11111111111111,2.18477310973599,2.21429766905465,1.28442570797043,1.66852860111851,3.30594679403182 +72,2,6,1,NaN,0.164650901025171,0.55,14,26,7,11,0,2.67920423277157,NaN,153.5,13.6987630666981,14.536343558531,NaN,0.508970866157443,0,39.1242399451655,0,NaN,NaN,464,187,7,11,2.3,1.75,270,0.04,8,37.5,25,2.66666666666667,0.46484375,0.103773857438895,0.326424870466321,0.46058091286307,0.454545454545455,0.625,1.68037570610877,4.88836569049824,0.0382100920720876,1.04166666666667,2.29166666666667,1.16666666666667,2.66666666666667,1.58333333333333,1.27921707995628,3.50166981622075,2.0656675945114,4.48100188295672,2.67678022646792 +72,2,26,1,NaN,0.3344343145235,0.55,14,13,8,11,0,22.338050703905,NaN,176.5,22.1850478435311,24.8512546002087,NaN,0.523543835583338,409.717734981316,3234.27050213368,0.126680107526882,NaN,NaN,230,188,10,10,5.8,3.5,180,0.32,1,62.5,41.6666666666667,18.8333333333333,0.673119469026549,0.0931761102566501,0.21098459477562,0.399286078531361,0.317784256559767,0.482300884955752,0.304905314300113,0.374503266477313,6.43124629642561e-05,18.8333333333333,14.5833333333333,11.125,17.125,14,5.7423834193188,3.92013733095239,1.51569285463246,2.65128842556021,2.54752025533966 +72,3,20,1,NaN,0.267229517066826,0.525,11,28,4,29,0,5.20905138663336,NaN,8.49999999999999,9.61684879280928,11.3614898494724,NaN,0.351299958425315,0,117.98403608464,0,NaN,NaN,497,508,5,2,1,0.25,180,0.04,8,62.5,50,8.75,0.726785714285714,0.0796959761336222,0.0383189122373301,0.288197621225984,0.193181818181818,0.323809523809524,1.55465310904619,1.60037820048872,0.000505355333596263,4.66666666666667,3.125,5.54166666666667,8.75,8.66666666666667,6.30360793581716,3.76268647580404,8.91959591843672,13.6032147041541,11.6831246427099 +72,3,25,1,NaN,0.167781666216991,0.45,7,3,7,14,0,2.91496304979481,NaN,98.5,11.5325019439142,26.7238773557078,NaN,0.434989832625236,0,33.7582417582418,0,NaN,NaN,43,241,9,6,6.4,4.5,0,0.08,2,75,45.8333333333333,20.3333333333333,0.61859631147541,0.143142512106825,0.369824561403509,0.539250897896357,0.301333333333333,0.463114754098361,1.13193139299252,1.45363820994829,0.000107554353819693,6.70833333333333,20.3333333333333,16.5833333333333,8.33333333333333,10.4166666666667,6.38270556956685,23.0159383241812,23.8107421763215,13.6121294525348,13.2136843916077 +72,3,28,1,NaN,0.285846367748608,0.475,6,23,8,13,0,3.20467198358483,NaN,163.5,11.5653476737154,27.6895556751833,NaN,0.54583551614614,0,41.2298848033254,0,NaN,NaN,402,224,2,10,3.3,1.25,270,0.04,8,100,66.6666666666667,13.9583333333333,0.786940298507462,0.023712659554386,0.112033195020747,0.341538461538462,0.229357798165138,0.373134328358209,1.82736605362479,2.00710697693215,1.97344460780919e-05,10.125,9.91666666666667,12.1666666666667,13.9583333333333,7.16666666666667,13.6431561330579,14.7953235714228,20.2497869884287,25.5069844985128,11.6064123684217 +72,4,6,1,NaN,0.196289462787722,0.45,8,31,7,11,0,3.0384403606745,NaN,76.5,9.73233924408585,13.2693675358585,NaN,0.480610176730089,0,54.4750702014284,0,NaN,NaN,548,187,4,5,1.1,1,225,0.08,1,37.5,20.8333333333333,4.16666666666667,0.555,0.170130788000192,0.36518771331058,0.566433566433566,0.19047619047619,0.32,0.996095214877805,1.31065159852343,0.000711129623582446,4.16666666666667,2.25,3.08333333333333,1.54166666666667,1.79166666666667,4.15039672865752,2.62884608494724,3.55879221873478,2.2213841981537,2.26591428588672 +72,4,9,1,NaN,0.214294572215156,0.475,18,7,6,9,0,4.27177138381067,NaN,135.5,9.52936353633489,16.4833587567275,NaN,0.427509241026204,0,64.1882061600371,0,NaN,NaN,126,150,3,6,0.1,0.25,315,0.02,8,50,20.8333333333333,3.5,0.388392857142857,0.258528435369155,0.615384615384615,0.68503937007874,0.570093457943925,0.726190476190476,1.74310505967557,1.877190064266,0.00505336318565361,1.04166666666667,1.875,2.16666666666667,3.5,1.04166666666667,1.24763858363152,2.38776711999282,3.05709788515879,6.10086770886451,1.7155806622439 +72,4,21,1,NaN,0.217844151005732,0.475,3,31,8,11,0,3.18776066773677,NaN,170.5,12.2025615058367,20.7168108660928,NaN,0.435841801543017,0,45.4411745196453,0,NaN,NaN,543,188,7,10,1.7,2.5,135,0.16,4,62.5,37.5,12.5,0.608333333333334,0.0958757327317662,0.160541586073501,0.369186046511628,0.273885350318471,0.43,0.2603860195393,0.325482524424125,0.00547165806238821,8.375,6.83333333333333,12.5,5.875,4.45833333333333,3.59489882839589,3.85625472720877,3.25482524424125,2.26673443467376,2.10461606793623 +72,4,24,1,NaN,0.10878335818925,0.525,18,29,7,12,0,2.53404897104881,NaN,145.5,10.3511882503664,12.4980165446304,NaN,0.438140238886373,0,30.973356623256,0,NaN,NaN,522,205,5,9,0.1,0,135,0.02,8,37.5,16.6666666666667,3.04166666666667,0.571917808219178,0.0984843365472965,0.247863247863248,0.460122699386503,0.226890756302521,0.36986301369863,1.77737719143541,1.77737719143541,0.00472255324225911,1.66666666666667,1.20833333333333,1.54166666666667,3.04166666666667,0.625,3.07106646108599,1.92539901200301,2.56057988567349,5.40618895728271,1.12497421428348 +72,5,15,1,NaN,0.208480053180709,0.45,8,5,9,12,0,3.84279423632037,NaN,152.5,16.6943191530683,32.5814332173706,NaN,0.40223320762938,0,55.3580825613019,0,NaN,NaN,80,207,7,9,7.9,6.75,180,0.64,1,87.5,50,22.0833333333333,0.75872641509434,0.0549956127678157,0.184357541899441,0.422924901185771,0.177777777777778,0.30188679245283,0.161878539451814,0.233140287797449,0.00279839051556877,22.0833333333333,11.8333333333333,21.0416666666667,15.0416666666667,13.2083333333333,3.57481774622756,3.11748344851772,3.57759609685268,3.40194551628711,3.06055137359331 +72,5,19,1,NaN,0.428997620088616,0.15,10,28,7,11,0,5.33819561166472,NaN,112.5,23.9938894732253,35.949116935107,NaN,0.49103810252798,0,113.229354146859,0,NaN,NaN,496,187,4,7,3,3.5,90,0.02,4,62.5,37.5,11.125,0.410112359550562,0.170485431073922,0.457025920873124,0.55431131019037,0.538904899135447,0.700374531835206,0.875806996894982,1.27781676596153,0.0117853881341222,4.70833333333333,4.79166666666667,11.125,3.91666666666667,0.958333333333333,2.50967638970477,2.53217635520425,9.74335284045668,5.73578914722165,0.959235740480376 +72,6,2,1,NaN,0.190965268808285,0.375,13,21,7,9,0,3.98910700374141,NaN,120.5,13.3659124777888,33.0006033745198,NaN,0.447981807753197,0,52.8448935370465,0,NaN,NaN,373,151,5,8,2.9,2.75,135,0.08,8,62.5,45.8333333333333,14.7916666666667,0.602816901408451,0.162490299501509,0.303948576675849,0.525953721075672,0.163934426229508,0.28169014084507,0.605162911628848,0.743366206326093,0.000537158073086421,3.66666666666667,4.75,5.16666666666667,14.7916666666667,11.25,2.23704014273044,4.48402994329032,6.85878410708804,8.95136806784337,10.3292341381655 +72,6,6,1,NaN,0.197515761108188,0.375,13,11,8,9,0,3.70821867413724,NaN,100.5,9.40118730320646,14.0110191514325,NaN,0.400352438170497,0,66.2259269905145,0,NaN,NaN,193,152,8,7,2,1.5,90,0.04,8,37.5,29.1666666666667,5,0.78125,0.0987026961243827,0.212121212121212,0.493506493506494,0.0434782608695652,0.0833333333333334,1.68961352013503,2.41373360019289,0.00198568320815603,2.20833333333333,2.79166666666667,3,5,2.33333333333333,3.09566678759879,4.06940890689401,5.40946818090603,8.44806760067513,3.39229267789208 +73,4,30,1,NaN,0.331675635535987,0.375,10,27,9,14,0,21.623444609417,NaN,126.5,17.1084521879945,20.9154487535644,NaN,0.525931485916512,323.454219824441,3480.35925442766,0.0929370206288179,NaN,NaN,478,243,4,8,1.4,1,45,0.02,2,62.5,41.6666666666667,11.5833333333333,0.602517985611511,0.164829106773475,0.300584795321637,0.481352992194276,0.302107728337236,0.464028776978417,1.28689372636422,1.40848998397344,3.78393090054118e-05,10.25,11.5833333333333,5.83333333333333,6.08333333333333,3.45833333333333,13.730833515557,14.9065189970522,8.154312506586,8.07544576276451,3.1756889386636 +73,5,15,1,NaN,0.269035257341049,0.425,9,2,8,11,0,21.5824105195833,NaN,76.5,25.5259179241373,34.2880657737409,NaN,0.644064874608546,57.2599553364141,1944.66491255224,0.0294446384910933,NaN,NaN,27,188,4,5,2.3,2,90,0.02,8,100,83.3333333333333,10.9583333333333,0.735245901639344,0.172830579196914,0.101570680628272,0.38139870223504,0.0981210855949896,0.178707224334601,1.84476433113939,2.25661869344028,3.26507399354889e-05,4.375,5.375,7.875,10.9583333333333,6.66666666666667,5.48434521400257,7.56330018968726,13.1400678542315,20.2155424620692,12.0456918874321 +73,5,20,1,NaN,0.35689874574847,0.375,7,22,9,14,0,48.3327076539571,NaN,52.5,33.2042213652416,40.0433630233324,NaN,0.517788682219814,5856.13797068123,8744.33555177217,0.669706455797479,NaN,NaN,385,243,4,4,17.2,16,90,0.02,15,187.5,195.833333333333,36.9166666666667,0.693707674943567,0.106838257011537,0.270250896057348,0.498027613412229,0.166556945358789,0.285553047404063,1.73169924739543,3.05634568365011,1.87970305511782e-06,18.0833333333333,19.0833333333333,24.9166666666667,29.625,36.9166666666667,24.3957816777468,25.610858029386,38.0768763948049,53.4565594288953,63.9285638830148 +73,6,10,1,NaN,0.253528460654241,0.4,1,26,7,11,0,26.5284743983064,NaN,182.5,27.0272474277681,43.0864002273731,NaN,0.433202727809693,76.6183032259491,2659.90492404979,0.0288049029622063,NaN,NaN,451,187,7,11,2.8,4.25,270,0.02,2,62.5,33.3333333333333,8.91666666666667,0.604771784232365,0.242878254862887,0.515044247787611,0.718974358974359,0.0214797136038186,0.0420560747663551,0.824283051631535,1.57496940222454,0.00271873587544628,8.875,8.91666666666667,8.41666666666667,6.875,4.25,8.14317431824067,7.34985721038119,7.45736442349215,8.44350960466603,3.32440853257175 +74,1,15,1,NaN,0.183727313954152,0.15,14,21,7,21,0,28.4981661351972,NaN,58.5,28.4534386038884,41.8461851356699,NaN,0.604351837481679,1143.02553784244,5694.27501271364,0.200732408478761,NaN,NaN,374,367,10,4,6,6.5,45,0.04,1,87.5,58.3333333333333,19.9166666666667,0.622907949790795,0.0651809699658942,0.325017325017325,0.450028232636928,0.489096573208723,0.656903765690377,1.10528441215473,1.64076381680112,0.000190181231333335,19.9166666666667,13.875,5.41666666666667,14.2916666666667,15.9583333333333,22.0135812087484,15.8633444518911,6.53086993544498,21.5396018940375,25.7521269169952 +74,2,14,1,NaN,0.231251511914634,0.325,2,18,7,10,0,5.46824379552042,NaN,153.5,16.1446156076403,18.2826899152246,NaN,0.340041370352017,0,119.750060804387,0,NaN,NaN,308,169,5,9,1.9,1.5,315,0.08,8,62.5,20.8333333333333,5.375,0.531976744186047,0.223628682474149,0.402173913043478,0.60431654676259,0.15695067264574,0.271317829457364,0.322173076149067,0.446885234658383,0.00149819575287729,3.04166666666667,2.125,3.125,5.375,3.375,1.62585277528586,1.79821781640358,1.39978294787706,1.73168028430123,1.53350083156145 +74,3,20,1,NaN,0.377663793477819,0.275,12,11,10,16,0,8.41605810757602,NaN,53.5,35.373197432754,40.4894314308,NaN,0.460420129411097,0.815088332190948,604.727618458001,0.00134786027181849,NaN,NaN,192,280,9,4,6.6,5,45,0.02,4,100,54.1666666666667,17.125,0.811739659367397,0.107705702431509,0.262672811059908,0.52286282306163,0.073107049608355,0.13625304136253,1.25678507377187,1.77504695986336,1.77457002212552e-05,9.5,11.5416666666667,17.125,13.375,13.2916666666667,10.8379556037253,12.8763796531722,21.5224443883432,23.1589205101968,21.360342369141 +78,1,17,1,NaN,0.322199590418021,0.3,2,23,4,3,0,37.4243183273526,NaN,29.5,32.3773236372484,33.0802094356025,NaN,0.608504560227227,2204.67809052115,6874.72668980918,0.320693198434968,NaN,NaN,398,40,8,3,21.7,21.25,225,0.08,4,75,50,18.8333333333333,0.768252212389381,0.0876143581084309,0.21505376344086,0.477638640429338,0.0944309927360775,0.172566371681416,1.09063082238159,-8.49939882269789,0.0312489529126974,14.625,14.1666666666667,18.8333333333333,16.5416666666667,18.75,13.0475087788804,17.0262378450584,20.5402138215199,21.0534416364737,24.8113490972229 diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/sus_sus_cells_v3.csv b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/sus_sus_cells_v3.csv new file mode 100755 index 0000000..240114e --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/sus_sus_cells_v3.csv @@ -0,0 +1,11 @@ +Mouse_id,Shank,Clu,Area,Layer,WVF_ratio,WVF_duration,Bl_ctr_row,Bl_ctr_col,Wh_ctr_row,Wh_ctr_col,Bl_rad,Wh_rad,Bl_lat,Wh_lat,Bl_mfr,Wh_mfr,Bl_SI,Wh_SI,Area_Overlap,Area_Union,OverlapIdx,PSTH_correln,Subfield_sep,Bl_stimc,Wh_stimc,Bl_chk_num,Wh_chk_num,Spont,Spont_cyc,Pref_ori,Pref_SF,Pref_TF,Max_rate,Max_rate_cyc,F0_pref,Sharp,CV,OSI,OSI_wnull,DSI_sev,DSI_chen,f1f0b,f1f0,Pval,F0_TF1,F0_TF2,F0_TF4,F0_TF8,F0_TF15,F1_TF1,F1_TF2,F1_TF4,F1_TF8,F1_TF15 +60,3,17,1,NaN,0.21988379,0.275,8,11,8,12,6.327865943,6.701237761,193.5,78.5,37.37712406,45.7133433,0.444857153,0.456371041,104.5350786,162.3384262,0.643933054,0.35553935,4,188,206,11,5,10.43555556,10.72222222,225,0.02,15,66.66666667,66.66666667,15.72222222,0.747699387,0.109007838,0.161025641,0.497234173,-0.070607553,-0.151943463,1.587591025,4.992091778,0.001231846,10.44444444,11.44444444,12.44444444,13.44444444,14.44444444,15.44444444,16.44444444,17.44444444,18.44444444,19.44444444 +61,3,2,1,NaN,0.217966289,0.275,10,9,9,11,16.52292262,8.516929279,120.5,87.5,31.04554547,33.76316153,0.510116736,0.418572618,222.5870387,862.9747717,0.257929949,0.668366904,8.94427191,154,189,7,6,2.620952381,2.650793651,180,0.04,8,100,80.95238095,15.23809524,0.428125,0.261312339,0.610062893,0.698736638,0.464530892,0.634375,0.803898246,0.973193337,0.006674439,5.666666667,3.619047619,8.19047619,15.23809524,3.904761905,2.677247676,1.879182797,6.742832439,12.24987804,3.509487327 +73,5,14,1,NaN,0.403757221,0.1,9,12,10,11,23.60903496,10.13939494,99.5,182.5,24.94225614,16.10278371,0.510265909,0.542734315,98.21814403,1975.842041,0.049709512,0.474228965,5.656854249,207,190,7,11,2.2,2,90,0.02,4,87.5,45.83333333,19.75,0.850140713,0.041302918,0.029315961,0.369089626,-0.022680412,-0.046413502,0.326612259,0.36341364,0.000343899,18.83333333,16.5,19.75,18.625,16.95833333,6.325000537,3.901611464,6.450592115,13.91496496,9.869628164 +73,5,24,1,NaN,0.314723274,0.4,9,10,9,10,4.541621803,1.727334002,98.5,131.5,29.1787525,10.99404131,0.451261624,0.411681223,9.37351582,64.79952241,0.144654088,0.382149377,0,171,171,6,8,0.6,0.5,45,0.16,4,37.5,16.66666667,5.291666667,0.431102362,0.486649606,0.687707641,0.828153565,0.016,0.031496063,0.630096291,0.695845469,0.029047724,2.125,5,5.291666667,4.75,0.625,1.586805628,2.579259347,3.334259537,2.30995181,0.564028931 +75,2,14,1,NaN,0.142546732,0.425,8,8,7,5,29.57267929,25.99540155,112.5,169.5,43.1770015,30.45673398,0.643575616,0.507588764,847.4201694,4023.004312,0.210643615,0.578750606,12.64911064,134,79,7,10,11.9,15,90,0.32,4,75,50,25.33333333,0.577919408,0.299900872,0.559974343,0.745643307,0.033135089,0.064144737,0.240499114,0.589610732,0.008356979,21.66666667,16.54166667,25.33333333,16,14.20833333,7.120547858,4.453865703,6.092644228,4.714501425,3.586799092 +75,3,12,1,NaN,0.045806832,0.35,7,9,8,9,3.652408635,1.029283045,74.5,105.5,50.48434961,19.19976844,0.57805952,0.496553402,0.067924028,45.16947841,0.001503759,0.463704924,4,151,152,5,7,3.9,2.75,90,0.16,4,50,45.83333333,17.58333333,0.441646919,0.181271486,0.464006938,0.547915143,0.595463138,0.746445498,0.836846909,0.991992685,0.001800185,11.04166667,11.5,17.58333333,11,8.041666667,6.885552531,6.495778681,14.71455815,11.77583318,5.816827922 +78,2,8,1,NaN,0.337036581,0.3,6,11,7,10,4.865683305,4.845646089,148.5,108.5,25.39909748,20.21502353,0.4358264,0.550653522,31.38090079,116.7614036,0.268760908,0.209763145,5.656854249,186,169,9,5,3,2.25,180,0.16,15,50,33.33333333,13.70833333,0.488981763,0.27877874,0.602923264,0.728106756,0.27027027,0.425531915,0.35278986,0.42206496,0.001579724,5.708333333,7.375,7.25,7.541666667,13.70833333,2.465575603,3.101341176,3.666361028,2.655445907,4.836161001 +78,3,13,1,NaN,0.146747351,0.3,5,7,5,8,5.36647229,1.800870186,79.5,109.5,40.72018458,16.63837297,0.497626777,0.479883721,10.18860415,90.47480487,0.112612613,0.398203514,4,113,131,5,7,4.1,2.25,315,0.08,4,62.5,37.5,13.5,0.602623457,0.21507263,0.367088608,0.613899614,0.033492823,0.064814815,1.364038002,1.636845602,6.12E-06,9.083333333,11.41666667,13.5,11.70833333,5.666666667,6.518626565,11.17129891,18.41451302,18.08773131,7.404301371 +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,36,18,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/tOFF_cell_data.csv b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/tOFF_cell_data.csv new file mode 100755 index 0000000..5a0c882 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/tOFF_cell_data.csv @@ -0,0 +1,18 @@ +Mouse_id,Shank,Clu,Area,Layer,WVF_ratio,WVF_duration,Bl_ctr_row,Bl_ctr_col,Wh_ctr_row,Wh_ctr_col,Bl_rad,Wh_rad,Bl_lat,Wh_lat,Bl_mfr,Wh_mfr,Bl_SI,Wh_SI,Area_Overlap,Area_Union,OverlapIdx,PSTH_correln,Subfield_sep,Bl_stimc,Wh_stimc,Bl_chk_num,Wh_chk_num,Spont,Spont_cyc,Pref_ori,Pref_SF,Pref_TF,Max_rate,Max_rate_cyc,F0_pref,Sharp,CV,OSI,OSI_wnull,DSI_sev,DSI_chen,f1f0b,f1f0,Pval,F0_TF1,F0_TF2,F0_TF4,F0_TF8,F0_TF15,F1_TF1,F1_TF2,F1_TF4,F1_TF8,F1_TF15 +62,2,2,1,NaN,0.215549039041187,0.275,9,10,1,1,4.40139943774984,0,89.5,NaN,11.4607553064083,7.23264495463483,0.21704329596622,NaN,0,64.052358104672,0,NaN,NaN,171,1,6,3,0.834285714285718,0.742857142857142,135,0.32,4,42.8571428571429,9.52380952380952,2.38095238095238,0.565,0.22221025715911,0.428571428571429,0.63302752293578,0.123595505617978,0.22,0.981766325561374,1.42698593831595,0.0185094155784453,2,2.04761904761905,2.38095238095238,1.38095238095238,1,1.78402771385951,2.02612115745981,2.33753887038422,1.62320220368668,1.0868034839115 +62,3,3,1,NaN,0.218390570366483,0.275,6,9,12,2,5.60685057436199,0,66.5,NaN,21.0423061972472,10.8957804159064,0.265842714788767,NaN,0,107.319963738475,0,NaN,NaN,150,30,5,4,4.40571428571431,4.32063492063492,225,0.08,4,57.1428571428571,28.5714285714286,9,0.680555555555555,0.111063879629385,0.18125,0.427947598253275,0.155963302752294,0.26984126984127,0.921889826679877,1.7731056028748,0.00675805091247906,5.19047619047619,5.47619047619048,9,7.42857142857143,8.95238095238095,3.3031912443396,5.33219727104051,8.2970084401189,6.89913212674369,9.68056390590482 +62,3,5,1,NaN,0.197926357567497,0.275,4,8,2,4,5.57785442804055,0,75.5,NaN,27.7666141318318,13.313964158145,0.283153286968822,NaN,0,104.874698741902,0,NaN,NaN,130,56,5,10,2.79238095238097,2.64444444444444,45,0.08,2,71.4285714285714,23.8095238095238,5.57142857142857,0.757478632478632,0.0486345265149977,0.0758620689655171,0.354735152487961,0.109004739336493,0.196581196581197,0.846904980659619,1.61205882978051,0.00170523629049793,5.38095238095238,5.57142857142857,5.42857142857143,2.80952380952381,1.66666666666667,4.62218839714155,4.71847060653216,5.71702372992491,3.36081934119775,1.9838377906711 +72,2,3,1,NaN,0.219228375065107,0.45,9,20,13,6,3.18097096744501,0,171.5,NaN,12.0243263448861,10.7547248446559,0.22550229499408,NaN,0,53.9316779799677,0,NaN,NaN,351,103,10,6,0.8,0.25,315,0.64,15,37.5,12.5,2.95833333333333,0.60387323943662,0.0556996302464804,0.285067873303167,0.399239543726236,0.543478260869565,0.704225352112676,0.634369758786599,0.692926967289978,0.0188630922948254,2.29166666666667,0.375,1.33333333333333,2.83333333333333,2.95833333333333,1.18786881647464,0.352855348578216,1.28629593926641,1.88896647489622,1.87667720307702 +72,3,6,1,NaN,0.303651340054094,0.475,5,11,10,5,2.88514167165197,0,175.5,NaN,7.61894386746631,5.11392365433839,0.19984893684438,NaN,0,33.554469675194,0,NaN,NaN,185,82,10,4,0.1,0,0,0.02,15,25,8.33333333333333,0.791666666666667,0.592105263157895,0.191162783712058,0.310344827586207,0.5,0.266666666666667,0.421052631578947,1.10025474012538,1.10025474012538,0.00671478395873842,0.333333333333333,0.208333333333333,0.416666666666667,0.625,0.791666666666667,0.657769746816372,0.402959104280664,0.832019116885747,1.15589846012821,0.87103500259926 +72,3,8,1,NaN,0.204060705496308,0.45,9,14,7,7,2.94448241594942,0,91.5,NaN,23.6539725775758,5.40307877080598,0.227148188798464,NaN,0,27.2375351007142,0,NaN,NaN,243,115,6,2,0.2,0,225,0.02,15,50,37.5,5.875,0.554078014184397,0.131560480388299,0.247787610619469,0.492537313432836,0.128,0.226950354609929,1.63830360823029,1.63830360823029,0.00851226121028642,0.958333333333333,1.41666666666667,3,5.25,5.875,1.41866533560815,2.07280982427571,4.97146086971592,8.95908439080849,9.62503369835296 +72,4,11,1,NaN,0.121467735132855,0.425,2,13,8,3,2.53404897104881,0,51.5,NaN,8.72315355165845,7.84027106480733,0.250936754016357,NaN,0,37.6978353638313,0,NaN,NaN,218,44,4,9,0.1,0,90,0.02,4,37.5,12.5,1.75,0.476190476190476,0.212316096893288,0.541284403669725,0.6,0.68,0.80952380952381,1.42202602918566,1.42202602918566,0.00127938050810905,0.708333333333333,1.08333333333333,1.75,1.125,0.333333333333333,0.890715366202271,1.5105587568751,2.4885455510749,1.15101886396704,0.446888264581374 +72,4,13,1,NaN,0.165064781163654,0.4,5,9,14,1,2.72322696550062,0,102.5,NaN,38.6534392818895,6.76555110911782,0.246768639760459,NaN,0,23.2979414951246,0,NaN,NaN,149,14,7,2,0.2,0.25,45,0.04,8,37.5,16.6666666666667,3.79166666666667,0.581043956043956,0.271826494989175,0.510373443983402,0.708641975308642,0.0520231213872832,0.0989010989010988,1.53364475775656,1.64190203477467,0.00668181748704225,2.66666666666667,3.41666666666667,2.45833333333333,3.79166666666667,2.875,3.78601437983779,5.32693847854503,3.57133286263097,5.81506970649364,4.30216788976989 +74,4,26,1,NaN,0.213066995798835,0.375,5,16,7,5,7.32403078236779,0,73.5,NaN,10.6567039774559,8.21846108392401,0.226105620480015,NaN,0,187.945784597696,0,NaN,NaN,275,79,5,4,3.5,1.5,180,0.16,8,87.5,58.3333333333333,21.9583333333333,0.688242784380306,0.17555884492751,0.340966921119593,0.571192052980132,0.110642781875659,0.199240986717268,0.246462806198488,0.264533398913652,0.000186389460257988,11.1666666666667,15.625,10.4583333333333,21.9583333333333,6.54166666666667,3.93733712996556,3.61454481579941,4.59466872918316,5.41191245277514,2.77995569376241 +78,1,2,1,NaN,0.161143475730707,0.275,4,8,11,20,4.15372962981313,0,67.5,NaN,17.4880308364894,10.3810798326495,0.284779069546012,NaN,0,62.4221814402901,0,NaN,NaN,130,353,5,5,0.9,1.75,90,0.64,15,37.5,20.8333333333333,4.04166666666667,0.716494845360825,0.0814333195875668,0.371024734982332,0.484057971014493,0.515625,0.680412371134021,0.639572350375804,1.12797305429914,0.0248302824856542,2.625,3.29166666666667,2.04166666666667,3.58333333333333,4.04166666666667,1.86726284810314,1.71094863790475,1.19978031351727,2.27556720947382,2.58493824943554 +60,3,13,1,NaN,0.327845840428655,0.275,5,11,5,12,13.7959664558697,0,70.5,NaN,21.4829912811113,26.345156682018,0.271986804553519,NaN,0,597.935215689743,0,NaN,NaN,185,203,5,5,3.25333333333332,3.28148148148148,225,0.08,15,66.6666666666667,27.7777777777778,6.66666666666667,0.8125,0.106649406887618,0.126760563380282,0.413249211356467,0.0714285714285714,0.133333333333333,0.380618892553829,0.749577687742771,0.0225767012180496,3.44444444444445,3.22222222222222,4.66666666666667,3.83333333333333,6.66666666666667,1.4754221906457,2.22143660105183,2.05276157715755,2.03956046517732,2.5374592836922 +74,4,27,1,NaN,0.171967475142122,0.425,6,13,5,14,7.83326780213671,0,70.5,NaN,45.5289049512588,48.0564686452002,0.284859348176703,NaN,0,192.768390563159,0,NaN,NaN,222,239,5,7,4.4,5,180,0.04,4,50,33.3333333333333,13.375,0.470015576323987,0.229015558550861,0.42825361512792,0.610900832702498,0.206766917293233,0.342679127725857,0.37341006160471,0.596341441667224,0.0273395799205358,5.91666666666667,7.95833333333333,13.375,6.58333333333333,5.41666666666667,5.24514293869152,3.83526909785319,4.994359573963,3.69495923488874,1.75006614065008 +74,4,30,1,NaN,0.21589970754208,0.375,6,18,6,18,9.14964940445724,0,69.5,NaN,18.8875477576379,20.901651232031,0.23827178541323,NaN,0,263.001835186946,0,NaN,NaN,312,312,5,5,5.5,3.75,135,0.04,1,62.5,29.1666666666667,9.83333333333334,0.511122881355932,0.275602863630443,0.568106312292359,0.709821428571429,0.232375979112272,0.377118644067797,0.456952101507818,0.738634903807158,0.0336237550414378,9.83333333333334,4,4.58333333333333,5.20833333333333,1.45833333333333,4.49336233149354,1.84107264032154,1.91663363575812,3.67203571593219,1.5244219695287 +60,2,17,1,NaN,0.210579601832644,0.275,6,11,6,11,3.94276800806811,0,64.5,NaN,68.3907979469579,33.0741293106546,0.291222198592647,NaN,0,48.8373759037743,0,NaN,NaN,186,186,5,10,10.8777777777778,10.7888888888889,225,0.02,4,116.666666666667,66.6666666666667,16.6111111111111,0.70443143812709,0.110744129662319,0.202010050251256,0.46747149564051,0.0932358318098721,0.17056856187291,1.61675665077938,4.61269311625032,0.00359490460352649,12,10.3888888888889,16.6111111111111,13.6111111111111,14.3333333333333,17.0709984900058,15.2742718731787,26.8561243657241,21.8665174082843,23.9662722866475 +62,2,11,1,NaN,0.16565594104601,0.275,8,8,8,8,5.33414384970586,0,73.5,NaN,36.9172103761967,20.7529629579445,0.279188248021387,NaN,0,89.3880204302739,0,NaN,NaN,134,134,5,11,3.61333333333336,3.39365079365079,135,0.08,8,42.8571428571429,33.3333333333333,6.95238095238095,0.780821917808219,0.0658077460005423,0.17741935483871,0.441095890410959,0.110266159695818,0.198630136986302,1.55334081094115,3.03462656196353,7.45592685020831e-06,2.90476190476191,4.14285714285714,6.80952380952381,6.95238095238095,3.57142857142857,2.59084283971845,5.36811590918796,10.7597210527297,10.7994170665432,4.90613730007544 +62,3,4,1,NaN,0.137829754624094,0.275,6,10,6,10,4.15633140246399,0,70.5,NaN,39.7539863338688,27.282756259574,0.268876729571066,NaN,0,54.2712981183806,0,NaN,NaN,168,168,5,11,4.02666666666669,3.87936507936508,270,0.16,2,71.4285714285714,33.3333333333333,9.95238095238095,0.633771929824561,0.220457590731079,0.312401883830455,0.599268069533394,-0.0434782608695652,-0.0909090909090909,0.971607039042687,1.59225722289536,0.00223569037496728,5.28571428571429,9.95238095238095,7.38095238095238,9.76190476190476,6.61904761904762,3.26139269755511,9.6698033885677,10.6971171002793,12.7083262519171,5.85903230667237 +62,3,9,1,NaN,0.149611066777769,0.275,4,9,4,9,4.26417261458555,0,71.5,NaN,54.7282727298168,33.5884915562644,0.25687180983123,NaN,0,57.1241072810489,0,NaN,NaN,148,148,5,11,3.04952380952383,3.14285714285714,225,0.08,4,71.4285714285714,38.0952380952381,14.9047619047619,0.579472843450479,0.168516811168717,0.306889352818372,0.543956043956044,0.113879003558719,0.204472843450479,0.980894394884076,1.24299573116889,0.00103948076226042,12.1428571428571,10.3809523809524,14.9047619047619,12.2380952380952,5.71428571428572,9.28207380412442,13.8969989848769,14.6199974094627,13.1194669863453,7.60851795281775 diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/tON_cell_data.csv b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/tON_cell_data.csv new file mode 100755 index 0000000..c4713a6 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/tON_cell_data.csv @@ -0,0 +1,2 @@ +Mouse_id,Shank,Clu,Area,Layer,WVF_ratio,WVF_duration,Bl_ctr_row,Bl_ctr_col,Wh_ctr_row,Wh_ctr_col,Bl_rad,Wh_rad,Bl_lat,Wh_lat,Bl_mfr,Wh_mfr,Bl_SI,Wh_SI,Area_Overlap,Area_Union,OverlapIdx,PSTH_correln,Subfield_sep,Bl_stimc,Wh_stimc,Bl_chk_num,Wh_chk_num,Spont,Spont_cyc,Pref_ori,Pref_SF,Pref_TF,Max_rate,Max_rate_cyc,F0_pref,Sharp,CV,OSI,OSI_wnull,DSI_sev,DSI_chen,f1f0b,f1f0,Pval,F0_TF1,F0_TF2,F0_TF4,F0_TF8,F0_TF15,F1_TF1,F1_TF2,F1_TF4,F1_TF8,F1_TF15 +72,3,27,1,NaN,0.132502493887977,0.475,12,11,7,15,0,3.32064054899067,NaN,143.5,12.0701457420764,16.5396350519869,NaN,0.298956651109785,0,53.6599818692374,0,NaN,NaN,192,259,2,9,2.6,3.75,0,0.32,8,62.5,29.1666666666667,10.9166666666667,0.508587786259542,0.227164140602856,0.536656891495601,0.657266811279826,0.3717277486911,0.541984732824427,0.385321305601915,0.586942918998266,0.00329535217373217,9.25,8.83333333333334,10.7083333333333,10.9166666666667,5.45833333333333,3.86117629231897,4.97689599926721,7.40574622372637,4.20642425282091,2.24653624184082 diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/trans_sus_cells_v3.csv b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/trans_sus_cells_v3.csv new file mode 100755 index 0000000..a18e315 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cell_metrics/trans_sus_cells_v3.csv @@ -0,0 +1,8 @@ +Mouse_id,Shank,Clu,Area,Layer,WVF_ratio,WVF_duration,Bl_ctr_row,Bl_ctr_col,Wh_ctr_row,Wh_ctr_col,Bl_rad,Wh_rad,Bl_lat,Wh_lat,Bl_mfr,Wh_mfr,Bl_SI,Wh_SI,Area_Overlap,Area_Union,OverlapIdx,PSTH_correln,Subfield_sep,Bl_stimc,Wh_stimc,Bl_chk_num,Wh_chk_num,Spont,Spont_cyc,Pref_ori,Pref_SF,Pref_TF,Max_rate,Max_rate_cyc,F0_pref,Sharp,CV,OSI,OSI_wnull,DSI_sev,DSI_chen,f1f0b,f1f0,Pval,F0_TF1,F0_TF2,F0_TF4,F0_TF8,F0_TF15,F1_TF1,F1_TF2,F1_TF4,F1_TF8,F1_TF15 +74,1,16,1,NaN,0.180751985,0.175,8,17,8,18,3.49511124,4.859013414,80.5,95.5,34.18268004,35.83521367,0.345587999,0.460766164,37.83368342,74.71643045,0.506363636,0.607703791,4,296,314,5,6,5,6.25,0,0.16,1,125,79.16666667,36,0.50072338,0.258886811,0.56238698,0.691915977,0.300225734,0.461805556,0.245893542,0.297551849,6.79E-07,36,21.04166667,22.41666667,23.54166667,12.04166667,8.852167517,7.717443623,8.798522874,16.1074593,8.09474585 +74,4,27,1,NaN,0.171967475,0.425,6,13,5,14,7.833267802,6.991768818,70.5,109.5,45.52890495,48.05646865,0.284859348,0.552612747,142.8442302,203.5003869,0.701935915,0.00279346,5.656854249,222,239,5,7,4.4,5,180,0.04,4,50,33.33333333,13.375,0.470015576,0.229015559,0.428253615,0.610900833,0.206766917,0.342679128,0.373410062,0.596341442,0.02733958,5.916666667,7.958333333,13.375,6.583333333,5.416666667,5.245142939,3.835269098,4.994359574,3.694959235,1.750066141 +75,1,2,1,NaN,0.179020336,0.3,7,12,7,13,5.870579009,5.231830094,64.5,87.5,14.71608404,10.38016037,0.416686052,0.30332155,31.99221704,162.2705021,0.197153621,0.435460466,4,205,223,5,6,1,0.5,270,0.16,2,37.5,12.5,3.291666667,0.674157303,0.064616927,0.244094488,0.451428571,0.244094488,0.392405063,1.063534332,1.254018092,0.001120253,3.166666667,3.291666667,3.25,1.75,2.291666667,2.326214764,3.500800508,2.853026994,2.125669008,2.369890296 +78,3,7,1,NaN,0.25704279,0.3,6,6,8,5,8.514390322,3.457795816,69.5,68.5,24.97441569,17.92925808,0.255980641,0.343553303,14.87536206,250.4358901,0.059397884,0.774372866,8.94427191,96,80,5,5,3.3,2.5,225,0.02,15,50,25,5.708333333,0.682432432,0.051506564,0.033962264,0.37254902,-0.021428571,-0.04379562,1.492219197,2.654987403,0.005427301,3.208333333,3.458333333,3.791666667,5.125,5.708333333,4.43147768,4.621665853,5.537427652,8.081975,8.518084585 +78,3,11,1,NaN,0.2538379,0.25,6,9,6,10,5.969189721,2.135885692,59.5,83.5,78.43921026,33.31181738,0.268908037,0.485015497,1.290556526,124.9802109,0.010326087,0.398062208,4,150,168,4,6,11.2,13,315,0.04,8,75,50,21.83333333,0.654341603,0.112935538,0.195664575,0.454123113,0.116080937,0.208015267,1.650983868,4.080733712,0.000335046,10.29166667,13.125,19.16666667,21.83333333,17.29166667,10.79237938,19.16833868,29.71094753,36.04648112,25.37906864 +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,46,30,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cellmodel.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cellmodel.py new file mode 100644 index 0000000..bc64495 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cellmodel.py @@ -0,0 +1,358 @@ +#import isee_engine +import os +import itertools +import matplotlib.pyplot as plt +import numpy as np +from . import utilities as util +import importlib +from .kernel import Kernel2D, Kernel3D +from .linearfilter import SpatioTemporalFilter +import json +from .spatialfilter import GaussianSpatialFilter +from .transferfunction import ScalarTransferFunction +from .temporalfilter import TemporalFilterCosineBump +from .cursor import LNUnitCursor, MultiLNUnitCursor +from .movie import Movie +from .lgnmodel1 import LGNModel, heat_plot +from .transferfunction import MultiTransferFunction, ScalarTransferFunction +from .lnunit import LNUnit, MultiLNUnit +from sympy.abc import x as symbolic_x +from sympy.abc import y as symbolic_y + + + +class OnUnit(LNUnit): + + def __init__(self, linear_filter, transfer_function): + assert linear_filter.amplitude > 0 + super(OnUnit, self).__init__(linear_filter, transfer_function) + +class OffUnit(LNUnit): + + def __init__(self, linear_filter, transfer_function): + assert linear_filter.amplitude < 0 + super(OffUnit, self).__init__(linear_filter, transfer_function) + +class LGNOnOffCell(MultiLNUnit): + """A cell model for a OnOff cell""" + def __init__(self, on_filter, off_filter, transfer_function=MultiTransferFunction((symbolic_x, symbolic_y), 'Heaviside(x)*(x)+Heaviside(y)*(y)')): + """Summary + + :param on_filter: + :param off_filter: + :param transfer_function: + """ + self.on_filter = on_filter + self.off_filter = off_filter + self.on_unit = OnUnit(self.on_filter, ScalarTransferFunction('s')) + self.off_unit = OffUnit(self.off_filter, ScalarTransferFunction('s')) + super(LGNOnOffCell, self).__init__([self.on_unit, self.off_unit], transfer_function) + +class TwoSubfieldLinearCell(MultiLNUnit): + + def __init__(self, dominant_filter, nondominant_filter,subfield_separation=10, onoff_axis_angle=45, dominant_subfield_location=(30,40), + transfer_function = MultiTransferFunction((symbolic_x, symbolic_y), 'Heaviside(x)*(x)+Heaviside(y)*(y)')): + + self.subfield_separation = subfield_separation + self.onoff_axis_angle = onoff_axis_angle + self.dominant_subfield_location = dominant_subfield_location + self.dominant_filter = dominant_filter + self.nondominant_filter = nondominant_filter + self.transfer_function= transfer_function + + self.dominant_unit = LNUnit(self.dominant_filter, ScalarTransferFunction('s'), amplitude=self.dominant_filter.amplitude) + self.nondominant_unit = LNUnit(self.nondominant_filter, ScalarTransferFunction('s'), amplitude=self.dominant_filter.amplitude) + + super(TwoSubfieldLinearCell, self).__init__([self.dominant_unit, self.nondominant_unit], self.transfer_function) + + self.dominant_filter.spatial_filter.translate = self.dominant_subfield_location + hor_offset = np.cos(self.onoff_axis_angle*np.pi/180.)*self.subfield_separation + self.dominant_subfield_location[0] + vert_offset = np.sin(self.onoff_axis_angle*np.pi/180.)*self.subfield_separation+ self.dominant_subfield_location[1] + rel_translation = (hor_offset,vert_offset) + self.nondominant_filter.spatial_filter.translate = rel_translation + + +class LGNOnCell(object): + + def __init__(self, **kwargs): + + self.position = kwargs.pop('position', None) + self.weights = kwargs.pop('weights', None) + self.kpeaks = kwargs.pop('kpeaks', None) + self.amplitude = kwargs.pop('amplitude', None) + self.sigma = kwargs.pop('sigma', None) + self.transfer_function_str = kwargs.pop('transfer_function_str', 's') # 'Heaviside(s)*s') + self.metadata = kwargs.pop('metadata', {}) + + temporal_filter = TemporalFilterCosineBump(self.weights, self.kpeaks) + spatial_filter = GaussianSpatialFilter(translate=self.position, sigma=self.sigma, origin=(0,0)) # all distances measured from BOTTOM LEFT + spatiotemporal_filter = SpatioTemporalFilter(spatial_filter, temporal_filter, amplitude=self.amplitude) + transfer_function = ScalarTransferFunction(self.transfer_function_str) + self.unit = OnUnit(spatiotemporal_filter, transfer_function) + +class LGNOffCell(OffUnit): + + def __init__(self, **kwargs): + + lattice_unit_center = kwargs.pop('lattice_unit_center', None) + weights = kwargs.pop('weights', None) + kpeaks = kwargs.pop('kpeaks', None) + amplitude = kwargs.pop('amplitude', None) + sigma = kwargs.pop('sigma', None) + width = kwargs.pop('width', 5) + transfer_function_str = kwargs.pop('transfer_function_str', 'Heaviside(s)*s') + + dxi = np.random.uniform(-width*1./2,width*1./2) + dyi = np.random.uniform(-width*1./2,width*1./2) + temporal_filter = TemporalFilterCosineBump(weights, kpeaks) + spatial_filter = GaussianSpatialFilter(translate=(dxi,dyi), sigma=sigma, origin=lattice_unit_center) # all distances measured from BOTTOM LEFT + spatiotemporal_filter = SpatioTemporalFilter(spatial_filter, temporal_filter, amplitude=amplitude) + transfer_function = ScalarTransferFunction(transfer_function_str) + super(LGNOnCell, self).__init__(spatiotemporal_filter, transfer_function) + +if __name__ == "__main__": + + movie_file = '/data/mat/iSee_temp_shared/movies/TouchOfEvil.npy' + m_data = np.load(movie_file, 'r') + m = Movie(m_data[1000:], frame_rate=30.) + + # Create second cell: + transfer_function = ScalarTransferFunction('s') + temporal_filter = TemporalFilterCosineBump((.4,-.3), (20,60)) + cell_list = [] + for xi in np.linspace(0,m.data.shape[2], 5): + for yi in np.linspace(0,m.data.shape[1], 5): + spatial_filter_on = GaussianSpatialFilter(sigma=(2,2), origin=(0,0), translate=(xi, yi)) + on_linear_filter = SpatioTemporalFilter(spatial_filter_on, temporal_filter, amplitude=20) + spatial_filter_off = GaussianSpatialFilter(sigma=(4,4), origin=(0,0), translate=(xi, yi)) + off_linear_filter = SpatioTemporalFilter(spatial_filter_off, temporal_filter, amplitude=-20) + on_off_cell = LGNOnOffCell(on_linear_filter, off_linear_filter) + cell_list.append(on_off_cell) + + lgn = LGNModel(cell_list) #Here include a list of all cells + y = lgn.evaluate(m, downsample=100) #Does the filtering + non-linearity on movie object m + heat_plot(y, interpolation='none', colorbar=True) + + + + + +# +# def imshow(self, ii, image_shape, fps, ax=None, show=True, relative_spatial_location=(0,0)): +# +# if ax is None: +# _, ax = plt.subplots(1,1) +# +# curr_kernel = self.get_spatio_temporal_kernel(image_shape, fps, relative_spatial_location=relative_spatial_location) +# +# cax = curr_kernel.imshow(ii, ax=ax, show=False) +# +# if show == True: +# plt.show() +# +# return ax +# +# +# class OnOffCellModel(CellModel): +# +# def __init__(self, dc_offset=0, on_subfield=None, off_subfield=None, on_weight = 1, off_weight = -1, t_max=None): +# +# super(self.__class__, self).__init__(dc_offset, t_max) +# +# if isinstance(on_subfield, dict): +# curr_module, curr_class = on_subfield.pop('class') +# self.on_subfield = getattr(importlib.import_module(curr_module), curr_class)(**on_subfield) +# else: +# self.on_subfield = on_subfield +# +# super(self.__class__, self).add_subfield(on_subfield, on_weight) +# +# if isinstance(off_subfield, dict): +# curr_module, curr_class = off_subfield.pop('class') +# self.off_subfield = getattr(importlib.import_module(curr_module), curr_class)(**off_subfield) +# else: +# self.off_subfield = off_subfield +# +# super(self.__class__, self).add_subfield(off_subfield, off_weight) +# +# +# def to_dict(self): +# +# return {'dc_offset':self.dc_offset, +# 'on_subfield':self.on_subfield.to_dict(), +# 'off_subfield':self.off_subfield.to_dict(), +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} +# +# class SingleSubfieldCellModel(CellModel): +# +# def __init__(self, subfield, weight = 1, dc_offset=0, t_max=None): +# +# super(SingleSubfieldCellModel, self).__init__(dc_offset, t_max) +# +# if isinstance(subfield, dict): +# curr_module, curr_class = subfield.pop('class') +# subfield = getattr(importlib.import_module(curr_module), curr_class)(**subfield) +# +# super(self.__class__, self).add_subfield(subfield, weight) +# +# def to_dict(self): +# +# assert len(self.subfield_list) == 1 +# subfield = self.subfield_list[0] +# weight = self.subfield_weight_dict[subfield] +# +# return {'dc_offset':self.dc_offset, +# 'subfield':subfield.to_dict(), +# 'weight':weight, +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} +# +# class OnCellModel(SingleSubfieldCellModel): +# +# def __init__(self, on_subfield, weight = 1, dc_offset=0 , t_max=None): +# assert weight > 0 +# super(OnCellModel, self).__init__(on_subfield, weight, dc_offset, t_max) +# +# def to_dict(self): +# data_dict = super(OnCellModel, self).to_dict() +# data_dict['on_subfield'] = data_dict.pop('subfield') +# return data_dict +# +# class OffCellModel(SingleSubfieldCellModel): +# +# def __init__(self, on_subfield, weight = -1, dc_offset=0 , t_max=None): +# assert weight < 0 +# super(OffCellModel, self).__init__(on_subfield, weight, dc_offset, t_max) +# +# def to_dict(self): +# data_dict = super(OffCellModel, self).to_dict() +# data_dict['off_subfield'] = data_dict.pop('subfield') +# return data_dict + + +# class OffCellModel(CellModel): +# +# def __init__(self, off_subfield, dc_offset=0, off_weight = 1, t_max=None): +# +# assert off_weight < 0. +# self.weight = off_weight +# +# +# +# +# super(self.__class__, self).__init__(dc_offset, t_max) +# +# if isinstance(on_subfield, dict): +# curr_module, curr_class = on_subfield.pop('class') +# self.subfield = getattr(importlib.import_module(curr_module), curr_class)(**on_subfield) +# else: +# self.subfield = on_subfield +# +# super(self.__class__, self).add_subfield(self.subfield, self.weight) +# +# def to_dict(self): +# +# return {'dc_offset':self.dc_offset, +# 'on_subfield':self.subfield.to_dict(), +# 'on_weight':self.weight, +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} + + + + + + +# if __name__ == "__main__": +# +# t = np.arange(0,.5,.001) +# example_movie = movie.Movie(file_name=os.path.join(isee_engine.movie_directory, 'TouchOfEvil.npy'), frame_rate=30.1, memmap=True) +# +# temporal_filter_on = TemporalFilterExponential(weight=1, tau=.05) +# on_subfield = Subfield(scale=(5,15), weight=.5, rotation=30, temporal_filter=temporal_filter_on, translation=(0,0)) +# +# temporal_filter_off = TemporalFilterExponential(weight=2, tau=.01) +# off_subfield = Subfield(scale=(5,15), weight=.5, rotation=-30, temporal_filter=temporal_filter_off) +# +# cell = OnOffCellModel(on_subfield=on_subfield, off_subfield=off_subfield, dc_offset=0., t_max=.5) +# curr_kernel = cell.get_spatio_temporal_kernel((100,150), 30.1) +# curr_kernel.imshow(0) +# +# print cell.to_dict() + + + +# f = cell.get_spatio_temporal_filter(example_movie.movie_data.shape[1:], t,threshold=.5) +# print len(f.t_ind_list) +# +# + +# for ii in range(example_movie.number_of_frames-curr_filter.t_max): +# print ii, example_movie.number_of_frames, curr_filter.map(example_movie, ii) + + +# off_subfield = Subfield(scale=(15,15), weight=.2, translation=(30,30)) + + +# +# curr_filter = cell.get_spatio_temporal_filter((100,150)) +# + +# +# # print touch_of_evil(40.41, mask=m) +# print curr_filter.t_max +# for ii in range(example_movie.number_of_frames-curr_filter.t_max): +# print ii, example_movie.number_of_frames, curr_filter.map(example_movie, ii) + +# cell.visualize_spatial_filter((100,150)) +# show_volume(spatio_temporal_filter, vmin=spatio_temporal_filter.min(), vmax=spatio_temporal_filter.max()) + + + +# def get_spatial_filter(self, image_shape, relative_spatial_location=(0,0), relative_threshold=default_relative_threshold): +# +# # Initialize: +# translation_matrix = util.get_translation_matrix(relative_spatial_location) +# +# # On-subunit: +# on_filter_pre_spatial = self.on_subfield.get_spatial_filter(image_shape) +# on_filter_spatial = util.apply_transformation_matrix(on_filter_pre_spatial, translation_matrix) +# +# # Off-subunit: +# off_filter_pre_spatial = self.off_subfield.get_spatial_filter(image_shape) +# off_filter_spatial = util.apply_transformation_matrix(off_filter_pre_spatial, translation_matrix) +# +# spatial_filter = on_filter_spatial - off_filter_spatial +# +# tmp = np.abs(spatial_filter) +# spatial_filter[np.where(tmp/tmp.max() < relative_threshold )] = 0 +# +# return spatial_filter + +# kernel = float(self.dc_offset)/len(nonzero_ind_tuple[0])+spatio_temporal_filter[nonzero_ind_tuple] + +# def rectifying_filter_factory(kernel, movie, dc_offset=0): +# +# def rectifying_filter(t): +# +# fi = movie.frame_rate*float(t) +# fim, fiM = np.floor(fi), np.ceil(fi) +# +# print t, fim, fiM +# +# try: +# s1 = (movie.movie_data[int(fim)+kernel.t_ind_list, kernel.row_ind_list, kernel.col_ind_list]*kernel.kernel).sum() +# s2 = (movie.movie_data[int(fiM)+kernel.t_ind_list, kernel.row_ind_list, kernel.col_ind_list]*kernel.kernel).sum() +# except IndexError: +# return None +# +# # Linear interpolation: +# s_pre = dc_offset + s1*((1-(fi-fim))*.5) + s2*((fi-fim)*.5) +# +# if s_pre < 0: +# return 0 +# else: +# return float(s_pre) +# +# return rectifying_filter diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cursor.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cursor.py new file mode 100644 index 0000000..8406fd1 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/cursor.py @@ -0,0 +1,266 @@ +from .movie import Movie +import numpy as np +from .linearfilter import SpatioTemporalFilter +from .spatialfilter import GaussianSpatialFilter +from .temporalfilter import TemporalFilterCosineBump +from .utilities import convert_tmin_tmax_framerate_to_trange +import matplotlib.pyplot as plt +from .kernel import Kernel3D +import scipy.signal as spsig +import time + +class KernelCursor(object): + + + def __init__(self, kernel, movie): + + self.movie = movie + self.kernel = kernel + self.cache = {} + + # print self.kernel.t_range.min(), self.kernel.t_range.max(), type(kernel), len(self.kernel) + + # This ensures that the kernel frame rate matches the movie frame rate: + np.testing.assert_almost_equal(np.diff(self.kernel.t_range), np.ones_like(self.kernel.t_range[1:])*(1./movie.frame_rate)) + + @property + def row_range(self): + return self.movie.row_range + + @property + def col_range(self): + return self.movie.col_range + + @property + def t_range(self): + return self.movie.t_range + + @property + def frame_rate(self): + return self.movie.frame_rate + + def evaluate(self, t_min=None, t_max=None, downsample=1):#:#, show=True, ax=None, plot=False, save_file_name=None, plotstyle='b-'): + + + # print 'EVALUATE' + if t_max is None: + t_max = self.t_range[-1] + + if t_min is None: + t_min = self.t_range[0] + + t_range = convert_tmin_tmax_framerate_to_trange(t_min, t_max, self.movie.frame_rate)[::int(downsample)] + y_vals = np.array([self(t) for t in t_range]) + + return t_range, y_vals + + def __call__(self, t): + + + + if t < self.t_range[0] or t > self.t_range[-1]: + curr_rate = 0 + else: +# print 'zero' + + ti = t*self.frame_rate + til, tir = int(np.floor(ti)), int(np.ceil(ti)) + + tl, tr = float(til)/self.frame_rate, float(tir)/self.frame_rate + if np.abs(tl-t)<1e-12: + curr_rate = self.apply_dot_product(til) + # print 'a' + + elif np.abs(tr-t)<1e-12: + curr_rate = self.apply_dot_product(tir) + # print 'b' + else: + wa, wb = (1-(t-tl)/(tr-tl)), (1-(tr-t)/(tr-tl)) + cl = self.apply_dot_product(til) + cr = self.apply_dot_product(tir) + curr_rate = cl*wa+cr*wb + # print 'c' + + if np.isnan(curr_rate): + assert RuntimeError + + return curr_rate + + def apply_dot_product(self, ti_offset): + + try: + return self.cache[ti_offset] + + except KeyError: + t_inds = self.kernel.t_inds + ti_offset + 1 # Offset by one nhc 14 Apr '17 + min_ind, max_ind = 0, self.movie.data.shape[0] + allowed_inds = np.where(np.logical_and(min_ind <= t_inds, t_inds < max_ind)) + t_inds = t_inds[allowed_inds] + row_inds = self.kernel.row_inds[allowed_inds] + col_inds = self.kernel.col_inds[allowed_inds] + kernel_vector = self.kernel.kernel[allowed_inds] + result = np.dot(self.movie[t_inds, row_inds, col_inds],kernel_vector) + self.cache[ti_offset ] = result + return result + +class FilterCursor(KernelCursor): + + def __init__(self, spatiotemporal_filter, movie, threshold=0): + + self.spatiotemporal_filter = spatiotemporal_filter + kernel = self.spatiotemporal_filter.get_spatiotemporal_kernel(movie.row_range, movie.col_range, t_range=movie.t_range, threshold=threshold, reverse=True) + + super(FilterCursor, self).__init__(kernel, movie) + +class LNUnitCursor(KernelCursor): + + def __init__(self, lnunit, movie, threshold=0): + + # print 'LNUnitCursor' + + self.lnunit = lnunit + + kernel = lnunit.get_spatiotemporal_kernel(movie.row_range, movie.col_range, movie.t_range, reverse=True, threshold=threshold) + + kernel.apply_threshold(threshold) + + super(LNUnitCursor, self).__init__(kernel, movie) + + def __call__(self, t): + return self.lnunit.transfer_function(super(LNUnitCursor, self).__call__(t)) + +class MultiLNUnitCursor(object): + + def __init__(self, multi_lnunit, movie, threshold=0): + + self.multi_lnunit = multi_lnunit + self.lnunit_cursor_list = [LNUnitCursor(lnunit, movie, threshold=threshold) for lnunit in multi_lnunit.lnunit_list] + self.movie = movie + + def evaluate(self, **kwargs): + +# print len(self.lnunit_cursor_list) +# for ii, x in enumerate(self.lnunit_cursor_list): +# +# print ii, self.multi_lnunit, self.multi_lnunit.transfer_function, x +# print ii, x.evaluate(**kwargs), kwargs +# print 'done' +# # print lnunit, movie, curr_cursor + + + + multi_e = [unit_cursor.evaluate(**kwargs) for unit_cursor in self.lnunit_cursor_list] + t_list, y_list = zip(*multi_e) + +# plt.figure() +# plt.plot(t_list[0],y_list[0]) +# plt.plot(t_list[0],y_list[1],'r') +# plt.show() + + #sys.exit() + +# print len(y_list) + + return t_list[0], self.multi_lnunit.transfer_function(*y_list) + +class MultiLNUnitMultiMovieCursor(MultiLNUnitCursor): + + def __init__(self, multi_lnunit, movie_list, threshold=0.): + + assert len(multi_lnunit.lnunit_list) == len(movie_list) + + self.multi_lnunit = multi_lnunit + self.lnunit_movie_list = movie_list + self.lnunit_cursor_list = [lnunit.get_cursor(movie, threshold=threshold) for lnunit, movie in zip(multi_lnunit.lnunit_list, movie_list)] +# for lnunit, movie, curr_cursor in zip(multi_lnunit.lnunit_list, movie_list, self.lnunit_cursor_list): +# print lnunit, movie, curr_cursor + +class SeparableKernelCursor(object): + + def __init__(self, spatial_kernel, temporal_kernel, movie): + '''Assumes temporal kernel is not reversed''' + + self.movie = movie + self.spatial_kernel = spatial_kernel + self.temporal_kernel = temporal_kernel + + def evaluate(self, threshold=0): + + full_spatial_kernel = np.array([self.spatial_kernel.full()]) + full_temporal_kernel = self.temporal_kernel.full() + + nonzero_inds = np.where(np.abs(full_spatial_kernel[0,:,:])>=threshold) + rm, rM = nonzero_inds[0].min(), nonzero_inds[0].max() + cm, cM = nonzero_inds[1].min(), nonzero_inds[1].max() + + convolution_answer_sep_spatial = (self.movie.data[:,rm:rM+1, cm:cM+1] * full_spatial_kernel[:,rm:rM+1, cm:cM+1]).sum(axis=1).sum(axis=1) + sig_tmp = np.zeros(len(full_temporal_kernel) + len(convolution_answer_sep_spatial) - 1) + sig_tmp[len(full_temporal_kernel)-1:] = convolution_answer_sep_spatial + convolution_answer_sep = spsig.convolve(sig_tmp, full_temporal_kernel[::-1], mode='valid') + t = np.arange(len(convolution_answer_sep))/self.movie.frame_rate + return t, convolution_answer_sep + + +class SeparableSpatioTemporalFilterCursor(SeparableKernelCursor): + + def __init__(self, spatiotemporal_filter, movie): + + self.spatial_filter = spatiotemporal_filter.spatial_filter + self.temporal_filter = spatiotemporal_filter.temporal_filter + + spatial_kernel = self.spatial_filter.get_kernel(movie.row_range, movie.col_range, threshold=-1) + temporal_kernel = self.temporal_filter.get_kernel(t_range=movie.t_range, threshold=0, reverse=True) + spatial_kernel.kernel *= spatiotemporal_filter.amplitude + + super(SeparableSpatioTemporalFilterCursor, self).__init__(spatial_kernel, + temporal_kernel, + movie) + + +class SeparableLNUnitCursor(SeparableSpatioTemporalFilterCursor): + def __init__(self, lnunit, movie): + self.lnunit = lnunit + + super(SeparableLNUnitCursor, self).__init__(self.lnunit.linear_filter, movie) + + def evaluate(self, downsample = 1): + + assert downsample == 1 + + t, y = super(SeparableLNUnitCursor, self).evaluate() + + return t, [self.lnunit.transfer_function(yi) for yi in y] + +class SeparableMultiLNUnitCursor(object): + + def __init__(self, multilnunit, movie): + + self.multilnunit = multilnunit + + self.lnunit_cursor_list = [] + for lnunit in self.multilnunit.lnunit_list: + self.lnunit_cursor_list.append(SeparableLNUnitCursor(lnunit, movie)) + + def evaluate(self, *args, **kwargs): + + assert kwargs.get('downsample', 1) == 1 + + y_list = [] + for cursor in self.lnunit_cursor_list: + t, y = cursor.evaluate(*args, **kwargs) + y_list.append(y) + + return t, self.multilnunit.transfer_function(*y_list) + +# if __name__ == "__main__": +# spatial_filter_1 = GaussianSpatialFilter(sigma=(2.,2.), amplitude=10) +# temporal_filter = TemporalFilterCosineBump((.4,-.3), (40,80)) +# curr_filter = SpatioTemporalFilter(spatial_filter_1, temporal_filter) +# +# movie_file = '/data/mat/iSee_temp_shared/movies/TouchOfEvil.npy' +# m_data = np.load(movie_file, 'r') +# movie = Movie(m_data[:,:,:], frame_rate=30.) +# cursor = FilterCursor(curr_filter, movie, threshold=-1) +# cursor.evaluate() + + \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/fitfuns.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/fitfuns.py new file mode 100644 index 0000000..5b67919 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/fitfuns.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +""" +Created on Thu Nov 13 17:07:50 2014 + +@author: rami +""" +import os +from math import * +import numpy as np +import numpy.fft as npft +from random import * +import scipy.io as sio +#import statsmodels.api as sm +from scipy import stats +import matplotlib.pyplot as plt + +def makeFitStruct_GLM(dtsim,kbasprs,nkt,flag_exp): + + gg = {} + gg['k'] = [] + gg['dc'] = 0 + gg['kt'] = np.zeros((nkt,1)) + gg['ktbas'] = [] + gg['kbasprs'] = kbasprs + gg['dt'] = dtsim + + nkt = nkt + if flag_exp==0: + ktbas = makeBasis_StimKernel(kbasprs,nkt) + else: + ktbas = makeBasis_StimKernel_exp(kbasprs,nkt) + + gg['ktbas'] = ktbas + gg['k'] = gg['ktbas']*gg['kt'] + + return gg + +def makeBasis_StimKernel(kbasprs,nkt): + + neye = kbasprs['neye'] + ncos = kbasprs['ncos'] + kpeaks = kbasprs['kpeaks'] + kdt = 1 + b = kbasprs['b'] + delays_raw = kbasprs['delays'] + delays = delays_raw[0].astype(int) + + ylim = np.array([100.,200.]) # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!HARD-CODED FOR NOW +# yrnge = nlin(kpeaks + b*np.ones(np.shape(kpeaks))) + yrnge = nlin(ylim + b*np.ones(np.shape(kpeaks))) + db = (yrnge[-1]-yrnge[0])/(ncos-1) + ctrs = nlin(np.array(kpeaks))#yrnge + mxt = invnl(yrnge[ncos-1]+2*db)-b + kt0 = np.arange(0,mxt,kdt) #-delay + nt = len(kt0) + e1 = np.tile(nlin(kt0+b*np.ones(np.shape(kt0))),(ncos,1)) + e2 = np.transpose(e1) + e3 = np.tile(ctrs,(nt,1)) + + kbasis0 = [] + for kk in range(ncos): + kbasis0.append(ff(e2[:,kk],e3[:,kk],db)) + + + #Concatenate identity vectors + nkt0 = np.size(kt0,0) + a1 = np.concatenate((np.eye(neye), np.zeros((nkt0,neye))),axis=0) + a2 = np.concatenate((np.zeros((neye,ncos)),np.array(kbasis0).T),axis=0) + kbasis = np.concatenate((a1,a2),axis=1) + kbasis = np.flipud(kbasis) + nkt0 = np.size(kbasis,0) + + if nkt0 < nkt: + kbasis = np.concatenate((np.zeros((nkt-nkt0,ncos+neye)),kbasis),axis=0) + elif nkt0 > nkt: + kbasis = kbasis[-1-nkt:-1,:] + + + kbasis = normalizecols(kbasis) + +# plt.figure() +# plt.plot(kbasis[:,0],'b') +# plt.plot(kbasis[:,1],'r') +# plt.show() +# +# print kpeaks +# print nkt0, nkt +# print delays[0][0], delays[0][1] +# print sev + kbasis2_0 = np.concatenate((kbasis[:,0],np.zeros((delays[0],))),axis=0) + kbasis2_1 = np.concatenate((kbasis[:,1],np.zeros((delays[1],))),axis=0) + +# plt.figure() +# plt.plot(kbasis2_0,'b') +# plt.plot(kbasis2_1,'r') +# plt.show(block=False) + + len_diff = delays[1]-delays[0] + kbasis2_1 = kbasis2_1[len_diff:] + + kbasis2 = np.zeros((len(kbasis2_0),2)) + kbasis2[:,0] = kbasis2_0 + kbasis2[:,1] = kbasis2_1 + # print(np.shape(kbasis2_0)) + # print(len(kbasis2_0), len(kbasis2_1)) + + +# plt.figure() +# plt.plot(kbasis[:,0],'b') +# plt.plot(kbasis[:,1],'r') +# plt.plot(kbasis2_0,'m') +# plt.plot(kbasis2_1,'k') +# plt.show(block=False) + + kbasis2 = normalizecols(kbasis2) + + return kbasis2 + + +def makeBasis_StimKernel_exp(kbasprs,nkt): + ks = kbasprs['ks'] + b = kbasprs['b'] + x0 = np.arange(0,nkt) + kbasis = np.zeros((nkt,len(ks))) + for ii in range(len(ks)): + kbasis[:,ii] = invnl(-ks[ii]*x0) #(1.0/ks[ii])* + + kbasis = np.flipud(kbasis) + #kbasis = normalizecols(kbasis) + + return kbasis + +def nlin(x): + eps = 1e-20 + #x.clip(0.) + + return np.log(x+eps) + +def invnl(x): + eps = 1e-20 + return np.exp(x)-eps + +def ff(x,c,dc): + rowsize = np.size(x,0) + m = [] + for i in range(rowsize): + xi = x[i] + ci = c[i] + val=(np.cos(np.max([-pi,np.min([pi,(xi-ci)*pi/dc/2])]))+1)/2 + m.append(val) + + return np.array(m) + +def normalizecols(A): + + B = A/np.tile(np.sqrt(sum(A**2,0)),(np.size(A,0),1)) + + return B + +def sameconv(A,B): + + am = np.size(A) + bm = np.size(B) + nn = am+bm-1 + + q = npft.fft(A,nn)*npft.fft(np.flipud(B),nn) + p = q + G = npft.ifft(p) + G = G[range(am)] + + return G + +# kbasprs = {} +# kbasprs['neye'] = 0 +# kbasprs['ncos'] = 2 +# kbasprs['kpeaks'] = 40,80 +# kbasprs['b'] = .3 +# +# nkt = 400 +# +# filter_data = makeBasis_StimKernel(kbasprs, nkt) +# +# print filter_data +# +# print [x for x in filter_data.T] +# +# import matplotlib.pyplot as plt +# plt.plot(filter_data[:,0]+filter_data[:,1]) +# plt.show() + diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/kernel.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/kernel.py new file mode 100644 index 0000000..820b1a3 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/kernel.py @@ -0,0 +1,475 @@ +#from matplotlib import _cntr as cntr +import matplotlib as mpl +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm +import scipy.interpolate as spinterp +import h5py +import numpy as np +import bisect +import matplotlib.pyplot as plt + +def find_l_r_in_t_range(t_range, t): + + for tl in range(len(t_range)-1): + tr = tl+1 + test_val = (t_range[tl]-t)*(t_range[tr]-t) + if np.abs(test_val) < 1e-16: + + if np.abs(t_range[tl]-t) < 1e-16: + return (tl,) + else: + return (tr,) + + elif test_val < 0: + t_range[tl], t_range[tr], t + return tl, tr + +def get_contour(X, Y, Z, c): + contour_obj = plt.contour(X, Y, Z) + #contour_obj = cntr.Cntr(X, Y, Z) + res = contour_obj.trace(c) + nseg = len(res) // 2 + if nseg > 0: + seg = res[:nseg][0] + return seg[:,0], seg[:,1] + else: + return [],[] + +def plot_single_contour(ax, x_contour, y_contour, t, color): + t_contour = t+np.zeros_like(x_contour) + ax.plot(x_contour, t_contour, y_contour, zdir='z', color=color) + + +class Kernel1D(object): + + def rescale(self): + #self.kernel /= np.abs(self.kernel).sum() + if np.abs(self.kernel.sum())!=0: + self.kernel /= np.abs(self.kernel.sum()) + + def normalize(self): +# self.kernel /= np.abs(self.kernel).sum() + self.kernel /= np.abs(self.kernel.sum()) +# self.kernel /= self.kernel.sum() + + + def __init__(self, t_range, kernel_array, threshold=0., reverse=False): + assert len(t_range) == len(kernel_array) + + kernel_array = np.array(kernel_array) + inds_to_keep = np.where(np.abs(kernel_array) > threshold) + + if reverse == True: + self.t_range = -np.array(t_range)[::-1] + + t_inds_tmp = inds_to_keep[0] + max_t_ind = t_inds_tmp.max() + reversed_t_inds = max_t_ind - t_inds_tmp + self.t_inds = reversed_t_inds - max_t_ind - 1 # Had an off by one error here should be "- 1" nhc 14 Apr '17 change made in cursor evalutiate too + + else: + self.t_range = np.array(t_range) + self.t_inds = inds_to_keep[0] + + self.kernel = kernel_array[inds_to_keep] + assert len(self.t_inds) == len(self.kernel) + + def __len__(self): + return len(self.kernel) + + def imshow(self, ax=None, show=True, save_file_name=None, ylim=None, xlim=None,color='b'): + + if ax is None: + _, ax = plt.subplots(1,1) + + t_vals = self.t_range[self.t_inds] + + ax.plot(t_vals, self.kernel, color) + ax.set_xlabel('Time (Seconds)') + + if not ylim is None: + ax.set_ylim(ylim) + + if not xlim is None: + ax.set_xlim(xlim) + else: + a,b=(t_vals[0], t_vals[-1]) + ax.set_xlim(min(a,b), max(a,b)) + + if not save_file_name is None: + ax.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + return ax, (t_vals, self.kernel) + + def full(self, truncate_t=True): + data = np.zeros(len(self.t_range)) + data[self.t_inds] = self.kernel + + + if truncate_t == True: + ind_min = np.where(np.abs(data) > 0)[0].min() + return data[ind_min:] + else: + return data + + + + return data + +class Kernel2D(object): + + def rescale(self): + #self.kernel /= np.abs(self.kernel).sum() + if np.abs(self.kernel.sum())!=0: + self.kernel /= np.abs(self.kernel.sum()) + + def normalize(self): +# self.kernel /= np.abs(self.kernel).sum() + self.kernel /= np.abs(self.kernel.sum()) + + @classmethod + def from_dense(cls, row_range, col_range, kernel_array, threshold=0.): + col_range = np.array(col_range).copy() + row_range = np.array(row_range).copy() + kernel_array = np.array(kernel_array).copy() + inds_to_keep = np.where(np.abs(kernel_array) > threshold) + kernel = kernel_array[inds_to_keep] + if len(inds_to_keep) == 1: + col_inds, row_inds = np.array([]), np.array([]) + else: + col_inds, row_inds = inds_to_keep + + return cls(row_range, col_range, row_inds, col_inds, kernel) + + @classmethod + def copy(cls, instance): + return cls(instance.row_range.copy(), + instance.col_range.copy(), + instance.row_inds.copy(), + instance.col_inds.copy(), + instance.kernel.copy()) + + + def __init__(self, row_range, col_range, row_inds, col_inds, kernel): + + + self.col_range = np.array(col_range) + self.row_range = np.array(row_range) + self.row_inds = np.array(row_inds) + self.col_inds = np.array(col_inds) + + self.kernel = np.array(kernel) + + assert len(self.row_inds) == len(self.col_inds) + assert len(self.row_inds) == len(self.kernel) + + def __mul__(self, constant): + + new_copy = Kernel2D.copy(self) + new_copy.kernel *= constant + return new_copy + + def __add__(self, other): + + + if len(other) == 0: + return self + + try: + np.testing.assert_almost_equal(self.row_range, other.row_range) + np.testing.assert_almost_equal(self.col_range, other.col_range) + except: + raise Exception('Kernels must exist on same grid to be added') + + row_range = self.row_range.copy() + col_range = self.col_range.copy() + + kernel_dict = {} + for key, ker in zip(zip(self.row_inds, self.col_inds), self.kernel): + kernel_dict[key] = kernel_dict.setdefault(key, 0) + ker + for key, ker in zip(zip(other.row_inds, other.col_inds), other.kernel): + kernel_dict[key] = kernel_dict.setdefault(key, 0) + ker + + key_list, kernel_list = zip(*kernel_dict.items()) + row_inds_list, col_inds_list = zip(*key_list) + row_inds = np.array(row_inds_list) + col_inds = np.array(col_inds_list) + kernel = np.array(kernel_list) + + return Kernel2D(row_range, col_range, row_inds, col_inds, kernel) + + def apply_threshold(self, threshold): + + inds_to_keep = np.where(np.abs(self.kernel) > threshold) + self.row_inds = self.row_inds[inds_to_keep] + self.col_inds = self.col_inds[inds_to_keep] + self.kernel = self.kernel[inds_to_keep] + + def full(self): + data = np.zeros((len(self.row_range), len(self.col_range))) + data[self.row_inds, self.col_inds] = self.kernel + return data + + def imshow(self, ax=None, show=True, save_file_name=None, clim=None, colorbar=True): + + from mpl_toolkits.axes_grid1 import make_axes_locatable + + if ax is None: + _, ax = plt.subplots(1,1) + + if colorbar == True: + divider = make_axes_locatable(ax) + cax = divider.append_axes("right", size = "5%", pad = 0.05) + + data = self.full() + + if not clim is None: + im = ax.imshow(data, extent=(self.col_range[0], self.col_range[-1], self.row_range[0], self.row_range[-1]), origin='lower', clim=clim, interpolation='none') + else: + im = ax.imshow(data, extent=(self.col_range[0], self.col_range[-1], self.row_range[0], self.row_range[-1]), origin='lower', interpolation='none') + + if colorbar == True: + plt.colorbar(im,cax=cax) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + return ax, data + + def __len__(self): + return len(self.kernel) + +class Kernel3D(object): + + def rescale(self): + #self.kernel /= np.abs(self.kernel).sum() + if np.abs(self.kernel.sum())!=0: + self.kernel /= np.abs(self.kernel.sum()) + + def normalize(self): + #self.kernel /= np.abs(self.kernel).sum() +# print self.kernel.sum() + self.kernel /= (self.kernel.sum())*np.sign(self.kernel.sum()) +# print self.kernel.sum() +# sys.exit() + + @classmethod + def copy(cls, instance): + return cls(instance.row_range.copy(), + instance.col_range.copy(), + instance.t_range.copy(), + instance.row_inds.copy(), + instance.col_inds.copy(), + instance.t_inds.copy(), + instance.kernel.copy()) + + def __len__(self): + return len(self.kernel) + + def __init__(self, row_range, col_range, t_range, row_inds, col_inds, t_inds, kernel): + + self.col_range = np.array(col_range) + self.row_range = np.array(row_range) + self.t_range = np.array(t_range) + self.col_inds = np.array(col_inds) + self.row_inds = np.array(row_inds) + self.t_inds = np.array(t_inds) + self.kernel = np.array(kernel) + + assert len(self.row_inds) == len(self.col_inds) + assert len(self.row_inds) == len(self.t_inds) + assert len(self.row_inds) == len(self.kernel) + + def apply_threshold(self, threshold): + + inds_to_keep = np.where(np.abs(self.kernel) > threshold) + self.row_inds = self.row_inds[inds_to_keep] + self.col_inds = self.col_inds[inds_to_keep] + self.t_inds = self.t_inds[inds_to_keep] + self.kernel = self.kernel[inds_to_keep] + + def __add__(self, other): + + + if len(other) == 0: + return self + + try: + if not (len(self.row_range) == 0 or len(other.row_range) == 0): + np.testing.assert_almost_equal(self.row_range, other.row_range) + if not (len(self.col_range) == 0 or len(other.col_range) == 0): + np.testing.assert_almost_equal(self.col_range, other.col_range) + if not (len(self.t_range) == 0 or len(other.t_range) == 0): + np.testing.assert_almost_equal(self.t_range, other.t_range) + except: + raise Exception('Kernels must exist on same grid to be added') + + if len(self.row_range) == 0: + row_range = other.row_range.copy() + else: + row_range = self.row_range.copy() + if len(self.col_range) == 0: + col_range = other.col_range.copy() + else: + col_range = self.col_range.copy() + if len(self.t_range) == 0: + t_range = other.t_range.copy() + else: + t_range = self.t_range.copy() + + kernel_dict = {} + for key, ker in zip(zip(self.row_inds, self.col_inds, self.t_inds), self.kernel): + kernel_dict[key] = kernel_dict.setdefault(key, 0) + ker + for key, ker in zip(zip(other.row_inds, other.col_inds, other.t_inds), other.kernel): + kernel_dict[key] = kernel_dict.setdefault(key, 0) + ker + + key_list, kernel_list = zip(*kernel_dict.items()) + row_inds_list, col_inds_list, t_inds_list = zip(*key_list) + row_inds = np.array(row_inds_list) + col_inds = np.array(col_inds_list) + t_inds = np.array(t_inds_list) + kernel = np.array(kernel_list) + + return Kernel3D(row_range, col_range, t_range, row_inds, col_inds, t_inds, kernel) + + def __mul__(self, constant): + + new_copy = Kernel3D.copy(self) + new_copy.kernel *= constant + return new_copy + + def t_slice(self, t): + + ind_list = find_l_r_in_t_range(self.t_range, t) + + if ind_list is None: + return None + + elif len(ind_list) == 1: + + t_ind_i = ind_list[0] + inds_i = np.where(self.t_range[self.t_inds] == self.t_range[t_ind_i]) + row_inds = self.row_inds[inds_i] + col_inds = self.col_inds[inds_i] + kernel = self.kernel[inds_i] + return Kernel2D(self.row_range, self.col_range, row_inds, col_inds, kernel) + + else: + t_ind_l, t_ind_r = ind_list + t_l, t_r = self.t_range[t_ind_l], self.t_range[t_ind_r] + + inds_l = np.where(self.t_range[self.t_inds] == self.t_range[t_ind_l]) + inds_r = np.where(self.t_range[self.t_inds] == self.t_range[t_ind_r]) + row_inds_l = self.row_inds[inds_l] + col_inds_l = self.col_inds[inds_l] + kernel_l = self.kernel[inds_l] + kl = Kernel2D(self.row_range, self.col_range, row_inds_l, col_inds_l, kernel_l) + row_inds_r = self.row_inds[inds_r] + col_inds_r = self.col_inds[inds_r] + kernel_r = self.kernel[inds_r] + kr = Kernel2D(self.row_range, self.col_range, row_inds_r, col_inds_r, kernel_r) + wa, wb = (1-(t-t_l)/(t_r-t_l)), (1-(t_r-t)/(t_r-t_l)) + + return kl*wa + kr*wb + + def full(self, truncate_t=True): + + data = np.zeros((len(self.t_range), len(self.row_range), len(self.col_range))) + data[self.t_inds, self.row_inds, self.col_inds] = self.kernel + + if truncate_t == True: + ind_max = np.where(np.abs(data) > 0)[0].min() + return data[ind_max:, :, :] + else: + return data + + + # if truncate_t == True: + # ind_min = np.where(np.abs(data) > 0)[0].min() + # return data[ind_min:] + # else: + # return data + + def imshow(self, ax=None, t_range=None, cmap=cm.bwr, N=10, show=True, save_file_name=None, kvals=None): + + if ax is None: + fig = plt.figure() + ax = fig.gca(projection='3d') + + if t_range is None: + t_range = self.t_range + + slice_list_sparse = [self.t_slice(t) for t in t_range] + slice_list = [] + slice_t_list = [] + for curr_slice, curr_t in zip(slice_list_sparse, t_range): + if not curr_slice is None: + slice_list.append(curr_slice.full()) + slice_t_list.append(curr_t) + all_slice_max = max(map(np.max, slice_list)) + all_slice_min = min(map(np.min, slice_list)) + upper_bound = max(np.abs(all_slice_max), np.abs(all_slice_min)) + lower_bound = -upper_bound + norm = mpl.colors.Normalize(vmin=lower_bound, vmax=upper_bound) + color_mapper = cm.ScalarMappable(norm=norm, cmap=cmap).to_rgba + + if kvals is None: + kvals = np.linspace(lower_bound, upper_bound, N) + + X, Y = np.meshgrid(self.row_range, self.col_range) + + contour_dict = {} + for kval in kvals: + for t_val, curr_slice in zip(slice_t_list, slice_list): + x_contour, y_contour = get_contour(Y, X, curr_slice.T, kval) + contour_dict[kval, t_val] = x_contour, y_contour + color = color_mapper(kval) + color = color[0], color[1], color[2], np.abs(kval)/upper_bound + plot_single_contour(ax, x_contour, y_contour, t_val, color) + + ax.set_zlim(self.row_range[0], self.row_range[-1]) + ax.set_ylim(self.t_range[0], self.t_range[-1]) + ax.set_xlim(self.col_range[0], self.col_range[-1]) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + return ax, contour_dict + +def merge_spatial_temporal(spatial_kernel, temporal_kernel, threshold=0): + + t_range = temporal_kernel.t_range + + spatiotemporal_kernel = np.ones(( len(temporal_kernel), len(spatial_kernel))) + spatiotemporal_kernel *= spatial_kernel.kernel[None, :] + spatiotemporal_kernel *= temporal_kernel.kernel[:,None] + spatiotemporal_kernel = spatiotemporal_kernel.reshape((np.prod(spatiotemporal_kernel.shape))) + + spatial_coord_array = np.empty((len(spatial_kernel),2)) + spatial_coord_array[:,0] = spatial_kernel.col_inds + spatial_coord_array[:,1] = spatial_kernel.row_inds + + spatiiotemporal_coord_array = np.zeros((len(spatial_kernel)*len(temporal_kernel),3)) + spatiiotemporal_coord_array[:,0:2] = np.kron(np.ones((len(temporal_kernel),1)),spatial_coord_array) + spatiiotemporal_coord_array[:,2] = np.kron(temporal_kernel.t_inds, np.ones(len(spatial_kernel))) + + col_inds, row_inds, t_inds = map(lambda x:x.astype(np.int),spatiiotemporal_coord_array.T) + kernel = Kernel3D(spatial_kernel.row_range, spatial_kernel.col_range, t_range, row_inds, col_inds, t_inds, spatiotemporal_kernel) + kernel.apply_threshold(threshold) + + return kernel + + + +# Candidate for print +# for ri, ci, ti, k in zip(kernel.row_inds, kernel.col_inds, kernel.t_inds, kernel.kernel): +# print ri, ci, ti, k diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/lattice_unit_constructor.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/lattice_unit_constructor.py new file mode 100644 index 0000000..4de580d --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/lattice_unit_constructor.py @@ -0,0 +1,254 @@ +import scipy.io as sio +import os +import matplotlib.pyplot as plt +import isee_engine.nwb as nwb +from linearfilter import SpatioTemporalFilter +import numpy as np +from spatialfilter import GaussianSpatialFilter +from transferfunction import ScalarTransferFunction +from temporalfilter import TemporalFilterCosineBump +from cursor import LNUnitCursor, MultiLNUnitCursor +from movie import Movie +from lgnmodel1 import LGNModel, heat_plot +from cellmodel import LGNOnCell, LGNOffCell,LGNOnOffCell,TwoSubfieldLinearCell +from transferfunction import MultiTransferFunction, ScalarTransferFunction +from lnunit import LNUnit, MultiLNUnit +from sympy.abc import x as symbolic_x +from sympy.abc import y as symbolic_y +from kernel import Kernel3D +from movie import Movie, FullFieldFlashMovie +import itertools +import scipy.stats as sps +from make_cell_list import multi_cell_random_generator, make_single_unit_cell_list, make_on_off_cell_list +#from lgnmodel.make_cell_list import two_unit_cell_config +#from make_cell_list import single_unit_cell_config + +def make_lattice_unit(lattice_unit_center=None): + cell_list = [] + tON_cell_list = make_tON_cell_list(lattice_unit_center) + tOFF_cell_list = make_tOFF_cell_list(lattice_unit_center) + sON_cell_list = make_sON_cell_list(lattice_unit_center) + sOFF_cell_list = make_sOFF_cell_list(lattice_unit_center) + overlap_onoff_cell_list = make_overlapping_onoff_cell_list(lattice_unit_center) + separate_onoff_cell_list = make_separate_onoff_cell_list(lattice_unit_center) + + cell_list = tON_cell_list + tOFF_cell_list + sON_cell_list + sOFF_cell_list + overlap_onoff_cell_list + separate_onoff_cell_list + + return cell_list + + +def make_tON_cell_list(lattice_unit_center): + tON_cell_list = [] + + single_unit_cell_config = {} + single_unit_cell_config['lattice_unit_center']=lattice_unit_center + single_unit_cell_config['width'] = 5. + sz = [3,6,9] + ncells = [5,3,2] + amp_dist = sps.rv_discrete(values=([20,25], [.5,.5])) +# kpeaks_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# wts = (.4,-.2) + kpeaks_dist = sps.multivariate_normal(mean=[15., 35.], cov=[[5.0, 0], [0, 5]]) + wts = (4.,-2.5) + delays = (0.,0.) + single_unit_cell_config['amplitude'] = amp_dist + single_unit_cell_config['kpeaks'] = kpeaks_dist + single_unit_cell_config['weights'] = wts + single_unit_cell_config['delays'] = delays + for num_cells, sig in zip(ncells,sz): + single_unit_cell_config['number_of_cells'] = num_cells + single_unit_cell_config['sigma'] = (sig,sig) +# print single_unit_cell_config + tON_cell_list += multi_cell_random_generator(make_single_unit_cell_list, **single_unit_cell_config) + + #print len(tON_cell_list) + return tON_cell_list + +def make_tOFF_cell_list(lattice_unit_center): + tOFF_cell_list = [] + + single_unit_cell_config = {} + single_unit_cell_config['lattice_unit_center']=lattice_unit_center + single_unit_cell_config['width'] = 5. + sz = [3,6,9] + ncells = [10,5,5] + amp_dist = sps.rv_discrete(values=([-20,-25], [.5,.5])) +# kpeaks_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# wts = (.4,-.2) + kpeaks_dist = sps.multivariate_normal(mean=[15., 35.], cov=[[5.0, 0], [0, 5]]) + wts = (4.,-2.5) + delays = (0.,0.) + single_unit_cell_config['amplitude'] = amp_dist + single_unit_cell_config['kpeaks'] = kpeaks_dist + single_unit_cell_config['weights'] = wts + single_unit_cell_config['delays'] = delays + for num_cells, sig in zip(ncells,sz): + single_unit_cell_config['number_of_cells'] = num_cells + single_unit_cell_config['sigma'] = (sig,sig) + tOFF_cell_list += multi_cell_random_generator(make_single_unit_cell_list, **single_unit_cell_config) + + #print len(tOFF_cell_list) + return tOFF_cell_list + +def make_sON_cell_list(lattice_unit_center): + sON_cell_list = [] + + single_unit_cell_config = {} + single_unit_cell_config['lattice_unit_center']=lattice_unit_center + single_unit_cell_config['width'] = 5. + sz = [3,6,9] + ncells = [5,3,2] + amp_dist = sps.rv_discrete(values=([20,25], [.5,.5])) +# kpeaks_dist = sps.multivariate_normal(mean=[100., 160.], cov=[[5.0, 0], [0, 5]]) +# wts = (.4,-.1) + kpeaks_dist = sps.multivariate_normal(mean=[80., 120.], cov=[[5.0, 0], [0, 5]]) + wts = (4.,-.85) + delays = (0.,0.) + single_unit_cell_config['amplitude'] = amp_dist + single_unit_cell_config['kpeaks'] = kpeaks_dist + single_unit_cell_config['weights'] = wts + single_unit_cell_config['delays'] = delays + for num_cells, sig in zip(ncells,sz): + single_unit_cell_config['number_of_cells'] = num_cells + single_unit_cell_config['sigma'] = (sig,sig) + sON_cell_list += multi_cell_random_generator(make_single_unit_cell_list, **single_unit_cell_config) + + #print len(sON_cell_list) + return sON_cell_list + +def make_sOFF_cell_list(lattice_unit_center): + sOFF_cell_list = [] + + single_unit_cell_config = {} + single_unit_cell_config['lattice_unit_center']=lattice_unit_center + single_unit_cell_config['width'] = 5. + sz = [3,6,9] + ncells = [10,5,5] + amp_dist = sps.rv_discrete(values=([-20,-25], [.5,.5])) +# kpeaks_dist = sps.multivariate_normal(mean=[100., 160.], cov=[[5.0, 0], [0, 5]]) + kpeaks_dist = sps.multivariate_normal(mean=[80., 120.], cov=[[5.0, 0], [0, 5]]) +# wts = (.4,-.1) + wts = (4.,-.85) + delays = (0.,0.) + single_unit_cell_config['amplitude'] = amp_dist + single_unit_cell_config['kpeaks'] = kpeaks_dist + single_unit_cell_config['weights'] = wts + single_unit_cell_config['delays'] = delays + for num_cells, sig in zip(ncells,sz): + single_unit_cell_config['number_of_cells'] = num_cells + single_unit_cell_config['sigma'] = (sig,sig) + sOFF_cell_list += multi_cell_random_generator(make_single_unit_cell_list, **single_unit_cell_config) + + #print len(sOFF_cell_list) + return sOFF_cell_list + +def make_overlapping_onoff_cell_list(lattice_unit_center): + overlap_onoff_cell_list = [] + + two_unit_cell_config = {} + two_unit_cell_config['lattice_unit_center']=lattice_unit_center + two_unit_cell_config['width']=5. + + ncells = 4 + sz = 9 + ang_dist = sps.rv_discrete(values=(np.arange(0,180,45), 1./ncells*np.ones(ncells))) + amp_on_dist = sps.rv_discrete(values=([20,25], [.5,.5])) + amp_off_dist = sps.rv_discrete(values=([-20,-25], [.5,.5])) +# kpeak_on_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# kpeak_off_dist = sps.multivariate_normal(mean=[50., 90.], cov=[[5.0, 0], [0, 5]]) +# wts_on = wts_off = (.4,-.2) + kpeak_on_dist = sps.multivariate_normal(mean=[15., 35.], cov=[[5.0, 0], [0, 5]]) + kpeak_off_dist = sps.multivariate_normal(mean=[20., 40.], cov=[[5.0, 0], [0, 5]]) + wts_on = wts_off = (4.,-2.5) + delays_on = delays_off = (0.,0.) + subfield_sep = 2. + + two_unit_cell_config['number_of_cells'] = ncells + two_unit_cell_config['ang'] = ang_dist + two_unit_cell_config['amplitude_on'] = amp_on_dist + two_unit_cell_config['amplitude_off'] = amp_off_dist + two_unit_cell_config['kpeaks_on'] = kpeak_on_dist + two_unit_cell_config['kpeaks_off'] = kpeak_off_dist + two_unit_cell_config['weights_on'] = wts_on + two_unit_cell_config['weights_off'] = wts_off + two_unit_cell_config['sigma_on'] = (sz,sz) + two_unit_cell_config['sigma_off'] = (sz,sz) + two_unit_cell_config['subfield_separation'] = subfield_sep + two_unit_cell_config['dominant_subunit']='on' + two_unit_cell_config['delays_on']=delays_on + two_unit_cell_config['delays_off']=delays_off + + overlap_onoff_cell_list += multi_cell_random_generator(make_on_off_cell_list, **two_unit_cell_config) + + #print len(overlap_onoff_cell_list) + return overlap_onoff_cell_list + +def make_separate_onoff_cell_list(lattice_unit_center): + separate_onoff_cell_list = [] + + two_unit_cell_config = {} + two_unit_cell_config['lattice_unit_center']=lattice_unit_center + two_unit_cell_config['width']=5. + + ncells = 8 + sz = 6 + ang_dist = np.arange(0,360,45) + subfield_sep = 4. + +# kpeak_dom_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# kpeak_nondom_dist = sps.multivariate_normal(mean=[100., 160.], cov=[[5.0, 0], [0, 5]]) +# wts_dom = (.4,-.2) +# wts_nondom = (.4,-.1) + + kpeak_dom_dist = sps.multivariate_normal(mean=[15., 35.], cov=[[5.0, 0], [0, 5]]) + kpeak_nondom_dist = sps.multivariate_normal(mean=[80., 120.], cov=[[5.0, 0], [0, 5]]) + wts_dom = (4.,-2.5) + wts_nondom = (4,-.85) + delays_dom = delays_nondom = (0.,0.) + + two_unit_cell_config['number_of_cells'] = ncells + two_unit_cell_config['ang'] = ang_dist + two_unit_cell_config['sigma_on'] = (sz,sz) + two_unit_cell_config['sigma_off'] = (sz,sz) + two_unit_cell_config['subfield_separation'] = subfield_sep + + #On-dominant + dom_subunit = 'on' + if dom_subunit=='on': + two_unit_cell_config['dominant_subunit'] = dom_subunit + amp_dom_dist = sps.rv_discrete(values=([20,25], [.5,.5])) + amp_nondom_dist = sps.rv_discrete(values=([-10,-15], [.5,.5])) + two_unit_cell_config['amplitude_on'] = amp_dom_dist + two_unit_cell_config['amplitude_off'] = amp_nondom_dist + two_unit_cell_config['kpeaks_on'] = kpeak_dom_dist + two_unit_cell_config['kpeaks_off'] = kpeak_nondom_dist + two_unit_cell_config['weights_on'] = wts_dom + two_unit_cell_config['weights_off'] = wts_nondom + two_unit_cell_config['delays_on'] = delays_dom + two_unit_cell_config['delays_off'] = delays_nondom + separate_onoff_cell_list += multi_cell_random_generator(make_on_off_cell_list, **two_unit_cell_config) + + #Off-dominant + dom_subunit = 'off' + if dom_subunit=='off': + two_unit_cell_config['dominant_subunit'] = dom_subunit + amp_dom_dist = sps.rv_discrete(values=([-20,-25], [.5,.5])) + amp_nondom_dist = sps.rv_discrete(values=([10,15], [.5,.5])) + two_unit_cell_config['amplitude_off'] = amp_dom_dist + two_unit_cell_config['amplitude_on'] = amp_nondom_dist + two_unit_cell_config['kpeaks_off'] = kpeak_dom_dist + two_unit_cell_config['kpeaks_on'] = kpeak_nondom_dist + two_unit_cell_config['weights_off'] = wts_dom + two_unit_cell_config['weights_on'] = wts_nondom + two_unit_cell_config['delays_off'] = delays_dom + two_unit_cell_config['delays_on'] = delays_nondom + separate_onoff_cell_list += multi_cell_random_generator(make_on_off_cell_list, **two_unit_cell_config) + + #print len(separate_onoff_cell_list) + return separate_onoff_cell_list + +if __name__ == "__main__": + lattice_unit_center = (40,30) + lattice_cell_list = make_lattice_unit(lattice_unit_center) + print(len(lattice_cell_list)) + \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/lgnmodel1.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/lgnmodel1.py new file mode 100644 index 0000000..1b04710 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/lgnmodel1.py @@ -0,0 +1,87 @@ +import numpy as np +import matplotlib.pyplot as plt + +def line_plot(evaluate_result, ax=None, show=True, save_file_name=None, xlabel=None, plotstyle=None): + + if ax is None: + _, ax = plt.subplots(1,1) + + if not plotstyle is None: + for ((t_range, y_vals), curr_plotstyle) in zip(evaluate_result, plotstyle): + ax.plot(t_range, y_vals, curr_plotstyle) + else: + for t_range, y_vals in evaluate_result: + ax.plot(t_range, y_vals) + + if xlabel is None: + ax.set_xlabel('Time (Seconds)') + else: + ax.set_xlabel(xlabel) + + if xlabel is None: + ax.set_xlabel('Firing Rate (Hz)') + else: + ax.set_xlabel(xlabel) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + + + + if show == True: + plt.show() + +def heat_plot(evaluate_result, ax=None, show=True, save_file_name=None, colorbar=True, **kwargs): + + if ax is None: + _, ax = plt.subplots(1,1) + + data = np.empty((len(evaluate_result), len(evaluate_result[0][0]))) + for ii, (t_vals, y_vals) in enumerate(evaluate_result): + data[ii,:] = y_vals + + cax = ax.pcolor(t_vals, np.arange(len(evaluate_result)), data, **kwargs) + ax.set_ylim([0,len(evaluate_result)-1]) + ax.set_xlim([t_vals[0], t_vals[-1]]) + ax.set_ylabel('Neuron id') + ax.set_xlabel('Time (Seconds)') + + if colorbar == True: + plt.colorbar(cax) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + + + +class LGNModel(object): + + def __init__(self, cell_list): + self.cell_list = cell_list + + def evaluate(self, movie, **kwargs): + return [cell.evaluate(movie, **kwargs) for cell in self.cell_list] + +# def plot(self): +# if show == True: +# plt.show() + + +# show = kwargs.pop('show', False) +# data = [cell.evaluate_movie(movie, **kwargs) for cell in self.cell_list] +# t_list, y_list, kernel_list = zip(*data) + +# if show == True: +# for y in y_list: +# plt.plot(t_list[0], y) +# plt.show() +# +# return t_list[0], y_list, kernel_list + + def __len__(self): + return len(self.cell_list) \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/linearfilter.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/linearfilter.py new file mode 100644 index 0000000..af7fef2 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/linearfilter.py @@ -0,0 +1,128 @@ +import numpy as np +from .kernel import Kernel3D +import matplotlib.pyplot as plt + +class SpatioTemporalFilter(object): + + def __init__(self, spatial_filter, temporal_filter, amplitude=1.): + + self.spatial_filter = spatial_filter + self.temporal_filter = temporal_filter + self.amplitude = amplitude + + def get_spatiotemporal_kernel(self, row_range, col_range, t_range=None, threshold=0, reverse=False): + + spatial_kernel = self.spatial_filter.get_kernel(row_range, col_range, threshold=0) + temporal_kernel = self.temporal_filter.get_kernel(t_range=t_range, threshold=0, reverse=reverse) + + t_range = temporal_kernel.t_range + + spatiotemporal_kernel = np.ones(( len(temporal_kernel), len(spatial_kernel))) + spatiotemporal_kernel *= spatial_kernel.kernel[None, :] + + spatiotemporal_kernel *= temporal_kernel.kernel[:,None] + spatiotemporal_kernel = spatiotemporal_kernel.reshape((np.prod(spatiotemporal_kernel.shape))) + + spatial_coord_array = np.empty((len(spatial_kernel),2)) + spatial_coord_array[:,0] = spatial_kernel.col_inds + spatial_coord_array[:,1] = spatial_kernel.row_inds + + spatiiotemporal_coord_array = np.zeros((len(spatial_kernel)*len(temporal_kernel),3)) + spatiiotemporal_coord_array[:,0:2] = np.kron(np.ones((len(temporal_kernel),1)),spatial_coord_array) + spatiiotemporal_coord_array[:,2] = np.kron(temporal_kernel.t_inds, np.ones(len(spatial_kernel))) + + col_inds, row_inds, t_inds = map(lambda x:x.astype(np.int),spatiiotemporal_coord_array.T) + kernel = Kernel3D(spatial_kernel.row_range, spatial_kernel.col_range, t_range, row_inds, col_inds, t_inds, spatiotemporal_kernel) + kernel.apply_threshold(threshold) + + + kernel.kernel *= self.amplitude + + + return kernel + + def t_slice(self, t, *args, **kwargs): + + k = self.get_spatiotemporal_kernel(*args, **kwargs) + return k.t_slice(t) + + def show_temporal_filter(self, *args, **kwargs): + + self.temporal_filter.imshow(*args, **kwargs) + + def show_spatial_filter(self, *args, **kwargs): + + self.spatial_filter.imshow(*args, **kwargs) + + def to_dict(self): + + return {'class':(__name__, self.__class__.__name__), + 'spatial_filter':self.spatial_filter.to_dict(), + 'temporal_filter':self.temporal_filter.to_dict(), + 'amplitude':self.amplitude} + +# class OnOffSpatioTemporalFilter(SpatioTemporalFilter): +# +# def __init__(self, on_spatiotemporal_filter, off_spatiotemporal_filter): +# +# self.on_spatiotemporal_filter = on_spatiotemporal_filter +# self.off_spatiotemporal_filter = off_spatiotemporal_filter +# +# def get_spatiotemporal_kernel(self, col_range, row_range, t_range=None, threshold=0, reverse=False): +# +# on_kernel = self.on_spatiotemporal_filter.get_spatiotemporal_kernel(col_range, row_range, t_range, threshold, reverse) +# off_kernel = self.off_spatiotemporal_filter.get_spatiotemporal_kernel(col_range, row_range, t_range, threshold, reverse) +# +# return on_kernel + off_kernel*(-1) +# +# def to_dict(self): +# +# return {'class':(__name__, self.__class__.__name__), +# 'on_filter':self.on_spatiotemporal_filter.to_dict(), +# 'off_filter':self.off_spatiotemporal_filter.to_dict()} +# +# class TwoSubfieldLinearFilter(OnOffSpatioTemporalFilter): +# +# def __init__(self, dominant_spatiotemporal_filter, nondominant_spatiotemporal_filter, subfield_separation=10, onoff_axis_angle=45, dominant_subfield_location=(30,40)): +# +# self.subfield_separation = subfield_separation +# self.onoff_axis_angle = onoff_axis_angle +# self.dominant_subfield_location = dominant_subfield_location +# self.dominant_spatiotemporal_filter = dominant_spatiotemporal_filter +# self.nondominant_spatiotemporal_filter = nondominant_spatiotemporal_filter +# +# dom_amp = dominant_spatiotemporal_filter.spatial_filter.amplitude +# nondom_amp = nondominant_spatiotemporal_filter.spatial_filter.amplitude +# if dom_amp < 0 and nondom_amp > 0: +# super(TwoSubfieldLinearFilter, self).__init__(self.nondominant_spatiotemporal_filter, self.dominant_spatiotemporal_filter) +# elif dom_amp > 0 and nondom_amp < 0: +# super(TwoSubfieldLinearFilter, self).__init__(self.dominant_spatiotemporal_filter, self.nondominant_spatiotemporal_filter) +# else: +# raise ValueError('Subfields are not of opposite polarity') +# +# self.dominant_spatiotemporal_filter.spatial_filter.translate = self.dominant_subfield_location +# hor_offset = np.cos(self.onoff_axis_angle*np.pi/180.)*self.subfield_separation + self.dominant_subfield_location[0] +# vert_offset = np.sin(self.onoff_axis_angle*np.pi/180.)*self.subfield_separation+ self.dominant_subfield_location[1] +# rel_translation = (hor_offset,vert_offset) +# self.nondominant_spatiotemporal_filter.spatial_filter.translate = rel_translation +# self.nondominant_spatiotemporal_filter.spatial_filter.origin=self.dominant_spatiotemporal_filter.spatial_filter.origin +# +# +# def to_dict(self): +# +# raise NotImplementedError +# + + + + + + + + + + + + + + diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/lnunit.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/lnunit.py new file mode 100644 index 0000000..ebc9952 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/lnunit.py @@ -0,0 +1,380 @@ +import os +import itertools +import matplotlib.pyplot as plt +import numpy as np +from . import utilities as util +import importlib +from .kernel import Kernel2D, Kernel3D +from .linearfilter import SpatioTemporalFilter +import json +from .spatialfilter import GaussianSpatialFilter +from .transferfunction import ScalarTransferFunction +from .temporalfilter import TemporalFilterCosineBump +from .cursor import LNUnitCursor, MultiLNUnitCursor, MultiLNUnitMultiMovieCursor, SeparableLNUnitCursor, SeparableMultiLNUnitCursor +from .movie import Movie +from .lgnmodel1 import LGNModel, heat_plot +from .transferfunction import MultiTransferFunction, ScalarTransferFunction + + +class LNUnit(object): + + def __init__(self, linear_filter, transfer_function, amplitude=1.): + + self.linear_filter = linear_filter + self.transfer_function = transfer_function + self.amplitude = amplitude + + def evaluate(self, movie, **kwargs): + return self.get_cursor(movie, separable=kwargs.pop('separable', False)).evaluate(**kwargs) + + def get_spatiotemporal_kernel(self, *args, **kwargs): + return self.linear_filter.get_spatiotemporal_kernel(*args, **kwargs) + + def get_cursor(self, movie, threshold=0, separable = False): + if separable: + return SeparableLNUnitCursor(self, movie) + else: + return LNUnitCursor(self, movie, threshold=threshold) + + def show_temporal_filter(self, *args, **kwargs): + self.linear_filter.show_temporal_filter(*args, **kwargs) + + def show_spatial_filter(self, *args, **kwargs): + self.linear_filter.show_spatial_filter(*args, **kwargs) + + def to_dict(self): + return {'class':(__name__, self.__class__.__name__), + 'linear_filter':self.linear_filter.to_dict(), + 'transfer_function':self.transfer_function.to_dict()} + +class MultiLNUnit(object): + + def __init__(self, lnunit_list, transfer_function): + + self.lnunit_list = lnunit_list + self.transfer_function = transfer_function + + def get_spatiotemporal_kernel(self, *args, **kwargs): + + k = Kernel3D([],[],[],[],[],[],[]) + for unit in self.lnunit_list: + k = k+unit.get_spatiotemporal_kernel(*args, **kwargs) + + return k + + def show_temporal_filter(self, *args, **kwargs): + + ax = kwargs.pop('ax', None) + show = kwargs.pop('show', None) + save_file_name = kwargs.pop('save_file_name', None) + + + if ax is None: + _, ax = plt.subplots(1,1) + + kwargs.update({'ax':ax, 'show':False, 'save_file_name':None}) + for unit in self.lnunit_list: + if unit.linear_filter.amplitude < 0: + color='b' + else: + color='r' + unit.linear_filter.show_temporal_filter(color=color, **kwargs) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + return ax + + def show_spatial_filter(self, *args, **kwargs): + + ax = kwargs.pop('ax', None) + show = kwargs.pop('show', True) + save_file_name = kwargs.pop('save_file_name', None) + colorbar = kwargs.pop('colorbar', True) + + k = Kernel2D(args[0],args[1],[],[],[]) + for lnunit in self.lnunit_list: + k = k + lnunit.linear_filter.spatial_filter.get_kernel(*args, **kwargs) + k.imshow(ax=ax, show=show, save_file_name=save_file_name, colorbar=colorbar) + + def get_cursor(self, *args, **kwargs): + + threshold = kwargs.get('threshold', 0.) + separable = kwargs.get('separable', False) + + if len(args) == 1: + movie = args[0] + if separable: + return SeparableMultiLNUnitCursor(self, movie) + else: + return MultiLNUnitCursor(self, movie, threshold=threshold) + elif len(args) > 1: + movie_list = args + if separable: + raise NotImplementedError + else: + return MultiLNUnitMultiMovieCursor(self, movie_list, threshold=threshold) + else: + assert ValueError + + + def evaluate(self, movie, **kwargs): + seperable = kwargs.pop('separable', False) + return self.get_cursor(movie, separable=seperable).evaluate(**kwargs) + +from sympy.abc import x, y + +if __name__ == "__main__": + + movie_file = '/data/mat/iSee_temp_shared/movies/TouchOfEvil.npy' + m_data = np.load(movie_file, 'r') + m = Movie(m_data[1000:], frame_rate=30.) + + # Create second cell: + transfer_function = ScalarTransferFunction('s') + temporal_filter = TemporalFilterCosineBump((.4,-.3), (20,60)) + cell_list = [] + for xi in np.linspace(0,m.data.shape[2], 5): + for yi in np.linspace(0,m.data.shape[1], 5): + spatial_filter_on = GaussianSpatialFilter(sigma=(2,2), origin=(0,0), translate=(xi, yi)) + on_linear_filter = SpatioTemporalFilter(spatial_filter_on, temporal_filter, amplitude=20) + on_lnunit = LNUnit(on_linear_filter, transfer_function) + spatial_filter_off = GaussianSpatialFilter(sigma=(4,4), origin=(0,0), translate=(xi, yi)) + off_linear_filter = SpatioTemporalFilter(spatial_filter_off, temporal_filter, amplitude=-20) + off_lnunit = LNUnit(off_linear_filter, transfer_function) + + multi_transfer_function = MultiTransferFunction((x, y), 'x+y') + + multi_unit = MultiLNUnit([on_lnunit, off_lnunit], multi_transfer_function) + cell_list.append(multi_unit) + + lgn = LGNModel(cell_list) #Here include a list of all cells + y = lgn.evaluate(m, downsample=10) #Does the filtering + non-linearity on movie object m + heat_plot(y, interpolation='none', colorbar=False) + + + + + +# +# def imshow(self, ii, image_shape, fps, ax=None, show=True, relative_spatial_location=(0,0)): +# +# if ax is None: +# _, ax = plt.subplots(1,1) +# +# curr_kernel = self.get_spatio_temporal_kernel(image_shape, fps, relative_spatial_location=relative_spatial_location) +# +# cax = curr_kernel.imshow(ii, ax=ax, show=False) +# +# if show == True: +# plt.show() +# +# return ax +# +# +# class OnOffCellModel(CellModel): +# +# def __init__(self, dc_offset=0, on_subfield=None, off_subfield=None, on_weight = 1, off_weight = -1, t_max=None): +# +# super(self.__class__, self).__init__(dc_offset, t_max) +# +# if isinstance(on_subfield, dict): +# curr_module, curr_class = on_subfield.pop('class') +# self.on_subfield = getattr(importlib.import_module(curr_module), curr_class)(**on_subfield) +# else: +# self.on_subfield = on_subfield +# +# super(self.__class__, self).add_subfield(on_subfield, on_weight) +# +# if isinstance(off_subfield, dict): +# curr_module, curr_class = off_subfield.pop('class') +# self.off_subfield = getattr(importlib.import_module(curr_module), curr_class)(**off_subfield) +# else: +# self.off_subfield = off_subfield +# +# super(self.__class__, self).add_subfield(off_subfield, off_weight) +# +# +# def to_dict(self): +# +# return {'dc_offset':self.dc_offset, +# 'on_subfield':self.on_subfield.to_dict(), +# 'off_subfield':self.off_subfield.to_dict(), +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} +# +# class SingleSubfieldCellModel(CellModel): +# +# def __init__(self, subfield, weight = 1, dc_offset=0, t_max=None): +# +# super(SingleSubfieldCellModel, self).__init__(dc_offset, t_max) +# +# if isinstance(subfield, dict): +# curr_module, curr_class = subfield.pop('class') +# subfield = getattr(importlib.import_module(curr_module), curr_class)(**subfield) +# +# super(self.__class__, self).add_subfield(subfield, weight) +# +# def to_dict(self): +# +# assert len(self.subfield_list) == 1 +# subfield = self.subfield_list[0] +# weight = self.subfield_weight_dict[subfield] +# +# return {'dc_offset':self.dc_offset, +# 'subfield':subfield.to_dict(), +# 'weight':weight, +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} +# +# class OnCellModel(SingleSubfieldCellModel): +# +# def __init__(self, on_subfield, weight = 1, dc_offset=0 , t_max=None): +# assert weight > 0 +# super(OnCellModel, self).__init__(on_subfield, weight, dc_offset, t_max) +# +# def to_dict(self): +# data_dict = super(OnCellModel, self).to_dict() +# data_dict['on_subfield'] = data_dict.pop('subfield') +# return data_dict +# +# class OffCellModel(SingleSubfieldCellModel): +# +# def __init__(self, on_subfield, weight = -1, dc_offset=0 , t_max=None): +# assert weight < 0 +# super(OffCellModel, self).__init__(on_subfield, weight, dc_offset, t_max) +# +# def to_dict(self): +# data_dict = super(OffCellModel, self).to_dict() +# data_dict['off_subfield'] = data_dict.pop('subfield') +# return data_dict + + +# class OffCellModel(CellModel): +# +# def __init__(self, off_subfield, dc_offset=0, off_weight = 1, t_max=None): +# +# assert off_weight < 0. +# self.weight = off_weight +# +# +# +# +# super(self.__class__, self).__init__(dc_offset, t_max) +# +# if isinstance(on_subfield, dict): +# curr_module, curr_class = on_subfield.pop('class') +# self.subfield = getattr(importlib.import_module(curr_module), curr_class)(**on_subfield) +# else: +# self.subfield = on_subfield +# +# super(self.__class__, self).add_subfield(self.subfield, self.weight) +# +# def to_dict(self): +# +# return {'dc_offset':self.dc_offset, +# 'on_subfield':self.subfield.to_dict(), +# 'on_weight':self.weight, +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} + + + + + + +# if __name__ == "__main__": +# +# t = np.arange(0,.5,.001) +# example_movie = movie.Movie(file_name=os.path.join(isee_engine.movie_directory, 'TouchOfEvil.npy'), frame_rate=30.1, memmap=True) +# +# temporal_filter_on = TemporalFilterExponential(weight=1, tau=.05) +# on_subfield = Subfield(scale=(5,15), weight=.5, rotation=30, temporal_filter=temporal_filter_on, translation=(0,0)) +# +# temporal_filter_off = TemporalFilterExponential(weight=2, tau=.01) +# off_subfield = Subfield(scale=(5,15), weight=.5, rotation=-30, temporal_filter=temporal_filter_off) +# +# cell = OnOffCellModel(on_subfield=on_subfield, off_subfield=off_subfield, dc_offset=0., t_max=.5) +# curr_kernel = cell.get_spatio_temporal_kernel((100,150), 30.1) +# curr_kernel.imshow(0) +# +# print cell.to_dict() + + + +# f = cell.get_spatio_temporal_filter(example_movie.movie_data.shape[1:], t,threshold=.5) +# print len(f.t_ind_list) +# +# + +# for ii in range(example_movie.number_of_frames-curr_filter.t_max): +# print ii, example_movie.number_of_frames, curr_filter.map(example_movie, ii) + + +# off_subfield = Subfield(scale=(15,15), weight=.2, translation=(30,30)) + + +# +# curr_filter = cell.get_spatio_temporal_filter((100,150)) +# + +# +# # print touch_of_evil(40.41, mask=m) +# print curr_filter.t_max +# for ii in range(example_movie.number_of_frames-curr_filter.t_max): +# print ii, example_movie.number_of_frames, curr_filter.map(example_movie, ii) + +# cell.visualize_spatial_filter((100,150)) +# show_volume(spatio_temporal_filter, vmin=spatio_temporal_filter.min(), vmax=spatio_temporal_filter.max()) + + + +# def get_spatial_filter(self, image_shape, relative_spatial_location=(0,0), relative_threshold=default_relative_threshold): +# +# # Initialize: +# translation_matrix = util.get_translation_matrix(relative_spatial_location) +# +# # On-subunit: +# on_filter_pre_spatial = self.on_subfield.get_spatial_filter(image_shape) +# on_filter_spatial = util.apply_transformation_matrix(on_filter_pre_spatial, translation_matrix) +# +# # Off-subunit: +# off_filter_pre_spatial = self.off_subfield.get_spatial_filter(image_shape) +# off_filter_spatial = util.apply_transformation_matrix(off_filter_pre_spatial, translation_matrix) +# +# spatial_filter = on_filter_spatial - off_filter_spatial +# +# tmp = np.abs(spatial_filter) +# spatial_filter[np.where(tmp/tmp.max() < relative_threshold )] = 0 +# +# return spatial_filter + +# kernel = float(self.dc_offset)/len(nonzero_ind_tuple[0])+spatio_temporal_filter[nonzero_ind_tuple] + +# def rectifying_filter_factory(kernel, movie, dc_offset=0): +# +# def rectifying_filter(t): +# +# fi = movie.frame_rate*float(t) +# fim, fiM = np.floor(fi), np.ceil(fi) +# +# print t, fim, fiM +# +# try: +# s1 = (movie.movie_data[int(fim)+kernel.t_ind_list, kernel.row_ind_list, kernel.col_ind_list]*kernel.kernel).sum() +# s2 = (movie.movie_data[int(fiM)+kernel.t_ind_list, kernel.row_ind_list, kernel.col_ind_list]*kernel.kernel).sum() +# except IndexError: +# return None +# +# # Linear interpolation: +# s_pre = dc_offset + s1*((1-(fi-fim))*.5) + s2*((fi-fim)*.5) +# +# if s_pre < 0: +# return 0 +# else: +# return float(s_pre) +# +# return rectifying_filter \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/make_cell_list.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/make_cell_list.py new file mode 100644 index 0000000..aa05481 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/make_cell_list.py @@ -0,0 +1,294 @@ +import scipy.io as sio +import os +import matplotlib.pyplot as plt +import isee_engine.nwb as nwb +from linearfilter import SpatioTemporalFilter +import numpy as np +from spatialfilter import GaussianSpatialFilter +from transferfunction import ScalarTransferFunction +from temporalfilter import TemporalFilterCosineBump +from cursor import LNUnitCursor, MultiLNUnitCursor +from movie import Movie +from lgnmodel1 import LGNModel, heat_plot +from cellmodel import LGNOnCell, LGNOffCell,LGNOnOffCell,TwoSubfieldLinearCell, OnUnit, OffUnit +from transferfunction import MultiTransferFunction, ScalarTransferFunction +from lnunit import LNUnit, MultiLNUnit +from sympy.abc import x as symbolic_x +from sympy.abc import y as symbolic_y +from kernel import Kernel3D +from movie import Movie, FullFieldFlashMovie +import itertools +import scipy.stats as sps + +# def multi_cell_tensor_generator(cell_creation_function, **kwargs): +# +# sew_param_dict = {} +# static_param_dict = {} +# for key, val in kwargs.items(): +# if isinstance(val, (list, np.ndarray)): +# sew_param_dict[key]=val +# else: +# static_param_dict[key]=val +# +# cell_list = [] +# loop_keys, loop_lists = zip(*sew_param_dict.items()) +# for param_tuple in itertools.product(*loop_lists): +# param_dict = dict(zip(loop_keys, param_tuple)) +# print param_dict +# param_dict.update(static_param_dict) +# cell_list += cell_creation_function(**param_dict) +# +# return cell_list + +def multi_cell_random_generator(cell_creation_function=None, **kwargs): + + sew_param_dict = {} + static_param_dict = {} + range_key_dict = {} + for key, val in kwargs.items(): + if isinstance(val, (sps.rv_continuous, sps.rv_discrete)) or type(val) == type(sps.multivariate_normal()): + sew_param_dict[key]=val + elif isinstance(val, np.ndarray): + range_key_dict[key] = val + else: + static_param_dict[key]=val + + number_of_cells = static_param_dict.pop('number_of_cells', 1) + + for key, val in range_key_dict.items(): + assert len(val) == number_of_cells + + cell_list = [] + loop_keys, loop_lists = zip(*sew_param_dict.items()) + value_instance_list = zip(*map(lambda x: x.rvs(size=number_of_cells), loop_lists)) + for ii, curr_value_instance in enumerate(value_instance_list): + param_dict = dict(zip(loop_keys, curr_value_instance)) + param_dict.update(static_param_dict) + param_dict['number_of_cells'] = 1 + for range_key in range_key_dict: + param_dict[range_key] = range_key_dict[range_key][ii] + + if cell_creation_function is None: + cell_list.append(param_dict) + else: + cell_list += cell_creation_function(**param_dict) + + return cell_list + + +def make_single_unit_cell_list(number_of_cells=None, + lattice_unit_center=None, + weights=None, + kpeaks=None, + delays=None, + amplitude=None, + sigma=None, + width=5, + transfer_function_str = 'Heaviside(s)*s'): + + cell_list = [] + for _ in range(number_of_cells): + dxi = np.random.uniform(-width*1./2,width*1./2) + dyi = np.random.uniform(-width*1./2,width*1./2) + temporal_filter = TemporalFilterCosineBump(weights, kpeaks,delays) + spatial_filter = GaussianSpatialFilter(translate=(dxi,dyi), sigma=sigma, origin=lattice_unit_center) # all distances measured from BOTTOM LEFT + spatiotemporal_filter = SpatioTemporalFilter(spatial_filter, temporal_filter, amplitude=amplitude) + transfer_function = ScalarTransferFunction(transfer_function_str) + if amplitude > 0.: + cell = OnUnit(spatiotemporal_filter, transfer_function) + elif amplitude < 0.: + cell = OffUnit(spatiotemporal_filter, transfer_function) + else: + raise Exception + + + cell_list.append(cell) + + return cell_list + +def make_on_off_cell_list(number_of_cells=None, + lattice_unit_center=None, + weights_on=None, + weights_off=None, + kpeaks_on=None, + kpeaks_off=None, + delays_on = None, + delays_off = None, + amplitude_on=None, + amplitude_off=None, + sigma_on=None, + sigma_off=None, + subfield_separation=None, + ang=None, + dominant_subunit=None, + width=5, + transfer_function_str = 'Heaviside(x)*x + Heaviside(y)*y'): + + cell_list = [] + for _ in range(number_of_cells): + + dxi = np.random.uniform(-width*1./2,width*1./2) + dyi = np.random.uniform(-width*1./2,width*1./2) + + dominant_subfield_location = (lattice_unit_center[0]+dxi, lattice_unit_center[1]+dyi) +# hor_offset = np.cos(ang*np.pi/180.)*subfield_separation +# vert_offset = np.sin(ang*np.pi/180.)*subfield_separation +# nondominant_subfield_translation = (hor_offset,vert_offset) + + if dominant_subunit == 'on': + on_translate = dominant_subfield_location#(0,0) + off_translate = dominant_subfield_location#nondominant_subfield_translation + + elif dominant_subunit == 'off': + + off_translate = dominant_subfield_location#(0,0) + on_translate = dominant_subfield_location#nondominant_subfield_translation + + else: + raise Exception + + on_origin = off_origin = (0,0)#dominant_subfield_location + + temporal_filter_on = TemporalFilterCosineBump(weights_on, kpeaks_on,delays_on) + spatial_filter_on = GaussianSpatialFilter(translate=on_translate,sigma=sigma_on, origin=on_origin) # all distances measured from BOTTOM LEFT + on_filter = SpatioTemporalFilter(spatial_filter_on, temporal_filter_on, amplitude=amplitude_on) + + temporal_filter_off = TemporalFilterCosineBump(weights_off, kpeaks_off,delays_off) + spatial_filter_off = GaussianSpatialFilter(translate=off_translate,sigma=sigma_off, origin=off_origin) # all distances measured from BOTTOM LEFT + off_filter = SpatioTemporalFilter(spatial_filter_off, temporal_filter_off, amplitude=amplitude_off) + +# cell = LGNOnOffCell(on_filter, off_filter, transfer_function=MultiTransferFunction((symbolic_x, symbolic_y), transfer_function_str)) + cell = TwoSubfieldLinearCell(on_filter,off_filter,subfield_separation=subfield_separation, onoff_axis_angle=ang, dominant_subfield_location=dominant_subfield_location) + cell_list.append(cell) + + return cell_list + +# amplitude_list = amplitude_dist.rvs(size=5) +# kpeak_list = kpeak_dist.rvs(size=5) +# cell_config = {'number_of_cells':5, +# 'lattice_unit_center':(40,30), +# 'weights':(.4,-.2), +# 'kpeaks':kpeak_list, +# 'amplitude':amplitude_list, +# 'sigma':(4,4), +# 'width':5} +# multi_cell_tensor_generator(make_single_unit_cell_list, **cell_config) + + +# amplitude_dist = sps.rv_discrete(values=([20,25], [.5,.5])) +# kpeak_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# +# single_unit_cell_config = {'number_of_cells':10, +# 'lattice_unit_center':(40,30), +# 'weights':(.4,-.2), +# 'kpeaks':kpeak_dist, +# 'amplitude':amplitude_dist, +# 'sigma':(4,4), +# 'width':5} +# +# +# amplitude_on_dist = sps.rv_discrete(values=([20,25], [.5,.5])) +# amplitude_off_dist = sps.rv_discrete(values=([-10,-15], [.5,.5])) +# kpeak_on_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# kpeak_off_dist = sps.multivariate_normal(mean=[100., 160.], cov=[[5.0, 0], [0, 5]]) +# #ang_dist = sps.rv_discrete(values=(np.arange(0,360,45), 1./8*np.ones((1,8)))) +# ang_dist = np.arange(0,360,45) +# +# two_unit_cell_config={'number_of_cells':8, +# 'lattice_unit_center':(40,30), +# 'weights_on':(.4,-.2), +# 'weights_off':(.4,-.1), +# 'kpeaks_on':kpeak_on_dist, +# 'kpeaks_off':kpeak_off_dist, +# 'amplitude_on':20., +# 'amplitude_off':-10., +# 'sigma_on':(4,4), +# 'sigma_off':(4,4), +# 'subfield_separation':2., +# 'ang':ang_dist, +# 'dominant_subunit':'on', +# 'width':5} + + +def evaluate_cell_and_plot(input_cell, input_movie, ax, show=False): + t, y = input_cell.evaluate(input_movie,downsample = 10) + ax.plot(t, y) + + if show == True: + plt.show() + + +# if __name__ == "__main__": +# +# # Create stimulus 0: +# frame_rate = 60 +# m1 = FullFieldFlashMovie(np.arange(60), np.arange(80), 1., 3., frame_rate=frame_rate).full(t_max=3) +# m2 = FullFieldFlashMovie(np.arange(60), np.arange(80), 0, 2, frame_rate=frame_rate, max_intensity=-1).full(t_max=2) +# m3 = FullFieldFlashMovie(np.arange(60), np.arange(80), 0, 2., frame_rate=frame_rate).full(t_max=2) +# m4 = FullFieldFlashMovie(np.arange(60), np.arange(80), 0, 2, frame_rate=frame_rate, max_intensity=0).full(t_max=2) +# m0 = m1+m2+m3+m4 +# +# # Create stimulus 1: +# movie_file = '/data/mat/RamIyer/for_Anton/grating_ori0_res2.mat' +# m_file = sio.loadmat(movie_file) +# m_data_raw = m_file['mov_fine'].T +# m_data = np.reshape(m_data_raw,(3000,64,128)) +# m1 = Movie(m_data, frame_rate=1000.) +# +# #Create stimulus 2: +# movie_file = '/data/mat/iSee_temp_shared/TouchOfEvil_norm.npy' +# m_data = np.load(movie_file, 'r') +# m = Movie(m_data[1000:], frame_rate=30.) +# +# movie_list = [m0, m1, m2] +# +# #==================================================== +# +# #Create cell list +# +# cell_list = [] +# +# #On cells +# params_tON = (5, (40,30), (.4,-.2),(40,80),20.,(4,4)) +# tON_list = make_single_unit_cell_list(*params_tON) +# cell_list.append(tON_list) +# +# params_sON = (5, (40,30), (.4,-.1),(100,160),20.,(4,4)) +# sON_list = make_single_unit_cell_list(*params_sON) +# cell_list.append(sON_list) +# +# #Off cells +# params_tOFF = (5, (40,30), (.4,-.2),(40,80),-20.,(4,4)) +# tOFF_list = make_single_unit_cell_list(*params_tOFF) +# cell_list.append(tOFF_list) +# +# params_sOFF = (5, (40,30), (.4,-.1),(100,160),-20.,(4,4)) +# sOFF_list = make_single_unit_cell_list(*params_sOFF) +# cell_list.append(sOFF_list) +# +# #ONOFF cells +# params_onoff = (5, (40,30),(.4, -.2),(.4,-.2),(40, 80),(50,100),20.,-20.,(4,4),(4,4),2.,0,'on') +# onoff_list = make_on_off_cell_list(*params_onoff) +# cell_list.append(onoff_list) +# +# #Two subunit cells +# params_twosub = (5, (40,30),(.4, -.2),(.4,-.1),(40, 80),(100,160),20.,-10.,(4,2),(3,4),10.,90,'on') +# twosub_list = make_on_off_cell_list(*params_twosub) +# cell_list.append(twosub_list) +# +# #===================================================== +# #Evaluate and plot responses +# nc = len(movie_list) +# nr = len(cell_list) +# fig, axes = plt.subplots(nr,nc+2) +# +# for curr_row, curr_cell in zip(axes, cell_list): +# curr_cell.show_spatial_filter(np.arange(60),np.arange(80), ax=curr_row[0], show=False, colorbar=False) +# curr_cell.show_temporal_filter(ax=curr_row[1], show=False) +# +# for curr_row, curr_cell in zip(axes, cell_list): +# for curr_ax, curr_movie in zip(curr_row[2:], movie_list): +# evaluate_cell_and_plot(curr_cell, curr_movie, curr_ax, show=False) +# +# plt.tight_layout() +# plt.show() diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/movie.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/movie.py new file mode 100755 index 0000000..a9d4e67 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/movie.py @@ -0,0 +1,196 @@ +import matplotlib.pyplot as plt +import numpy as np +from .utilities import convert_tmin_tmax_framerate_to_trange + + +class Movie(object): + def __init__(self, data, row_range=None, col_range=None, labels=('time', 'y', 'x'), + units=('second', 'pixel', 'pixel'), frame_rate=None, t_range=None): + self.data = data + self.labels = labels + self.units = units + assert units[0] == 'second' + + if t_range is None: + self.frame_rate = float(frame_rate) + self.t_range = np.arange(data.shape[0])*(1./self.frame_rate) + else: + self.t_range = np.array(t_range) + self.frame_rate = 1./np.mean(np.diff(t_range)) + + if row_range is None: + self.row_range = np.arange(data.shape[1]) + else: + self.row_range = np.array(row_range) + if col_range is None: + self.col_range = np.arange(data.shape[2]) + else: + self.col_range = np.array(col_range) + + def imshow_summary(self, ax=None, show=True, xlabel=None): + if ax is None: + _, ax = plt.subplots(1,1) + + t_vals = self.t_range.copy() + y_vals = self.data.mean(axis=2).mean(axis=1) + ax.plot(t_vals, y_vals) + ax.set_ylim(y_vals.min()-np.abs(y_vals.min())*.05, y_vals.max()+np.abs(y_vals.max())*.05) + + if not xlabel is None: + ax.set_xlabel(xlabel) + + ax.set_ylabel('Average frame intensity') + + if show == True: + plt.show() + + return ax, (t_vals, y_vals) + + def imshow(self, t, show=True, vmin=-1, vmax=1, cmap=plt.cm.gray): + ti = int(t*self.frame_rate) + data = self.data[ti,:,:] + plt.imshow(data, vmin=vmin, vmax=vmax, cmap=cmap) + plt.colorbar() + if show: + plt.show() + + def __add__(self, other): + + assert self.labels == other.labels + assert self.units == other.units + assert self.frame_rate == other.frame_rate + np.testing.assert_almost_equal(self.col_range, other.col_range) + np.testing.assert_almost_equal(self.row_range, other.row_range) + + + new_data = np.empty((len(self.t_range)+len(other.t_range)-1, len(self.row_range), len(self.col_range))) + new_data[:len(self.t_range), :,:] = self.data[:,:,:] + new_data[len(self.t_range):, :,:] = other.data[1:,:,:] + + return Movie(new_data, row_range=self.row_range.copy(), col_range=self.col_range.copy(), labels=self.labels, units=self.units, frame_rate=self.frame_rate) + + @property + def ranges(self): + return self.t_range, self.row_range, self.col_range + + def get_nwb_GrayScaleMovie(self): + + t_scale = nwb.Scale(self.t_range, 'time', self.units[0]) + row_scale = nwb.Scale(self.row_range, 'distance', self.units[1]) + col_scale = nwb.Scale(self.col_range, 'distance', self.units[2]) + + return nwb.GrayScaleMovie(self.data, scale=(t_scale, row_scale, col_scale)) + + def __getitem__(self, *args): + return self.data.__getitem__(*args) + + +class FullFieldMovie(Movie): + def __init__(self, f, row_range, col_range, frame_rate=24): + self.row_range = row_range + self.col_range = col_range + self.frame_size = (len(self.row_range), len(self.col_range)) + self._frame_rate = frame_rate + self.f = f + + @property + def frame_rate(self): + return self._frame_rate + + @property + def data(self): + return self + + def __getitem__(self, *args): + + t_inds, x_inds, y_inds = args[0] + + assert (len(x_inds) == len(y_inds)) and (len(y_inds) == len(t_inds)) + + # Convert frame indices to times: + t_vals = (1./self.frame_rate)*t_inds + + # Evaluate and return: + return self.f(t_vals) + + def full(self, t_min=0, t_max=None): + # Compute t_range + t_range = convert_tmin_tmax_framerate_to_trange(t_min, t_max, self.frame_rate) + + nt = len(t_range) + nr = len(self.row_range) + nc = len(self.col_range) + a,b,c = np.meshgrid(range(nt),range(nr),range(nc)) + af, bf, cf = map(lambda x: x.flatten(), [a,b,c]) + data = np.empty((nt, nr, nc)) + data[af, bf, cf] = self.f(t_range[af]) + + return Movie(data, row_range=self.row_range, col_range=self.col_range, labels=('time', 'y', 'x'), units=('second', 'pixel', 'pixel'), frame_rate=self.frame_rate) + + +class FullFieldFlashMovie(FullFieldMovie): + def __init__(self, row_range, col_range, t_on, t_off, max_intensity=1, frame_rate=24): + assert t_on < t_off + + def f(t): + return np.piecewise(t, *zip(*[(t < t_on, 0), (np.logical_and(t_on <= t, t < t_off), max_intensity), + (t_off <= t, 0)])) + + super(FullFieldFlashMovie, self).__init__(f, row_range, col_range, frame_rate=frame_rate) + + +class GratingMovie(Movie): + def __init__(self, row_size, col_size, frame_rate=1000.): + self.row_size = row_size #in degrees + self.col_size = col_size #in degrees + self.frame_rate = float(frame_rate) #in Hz + + def create_movie(self, t_min = 0, t_max = 1, gray_screen_dur = 0, cpd = 0.05, temporal_f = 4, theta = 45, phase = 0., contrast = 1.0, row_size_new = None, col_size_new = None): + """Create the grating movie with the desired parameters + :param t_min: start time in seconds + :param t_max: end time in seconds + :param gray_screen_dur: Duration of gray screen before grating stimulus starts + :param cpd: cycles per degree + :param temporal_f: in Hz + :param theta: orientation angle + :return: Movie object of grating with desired parameters + """ + assert contrast <= 1, "Contrast must be <= 1" + assert contrast > 0, "Contrast must be > 0" + + physical_spacing = 1. / (float(cpd) * 10) #To make sure no aliasing occurs + self.row_range = np.linspace(0, self.row_size, self.row_size / physical_spacing, endpoint = True) + self.col_range = np.linspace(0, self.col_size, self.col_size / physical_spacing, endpoint = True) + numberFramesNeeded = int(round(self.frame_rate * (t_max - gray_screen_dur))) + 1 + time_range = np.linspace(gray_screen_dur, t_max - gray_screen_dur, numberFramesNeeded, endpoint=True) + + tt, yy, xx = np.meshgrid(time_range, self.row_range, self.col_range, indexing='ij') + + thetaRad = -np.pi*(180-theta)/180. + phaseRad = np.pi*(180-phase)/180. + xy = xx * np.cos(thetaRad) + yy * np.sin(thetaRad) + data = contrast*np.sin(2*np.pi*(cpd * xy + temporal_f *tt) + phaseRad) + + if row_size_new != None: + self.row_range = np.linspace(0, row_size_new, data.shape[1], endpoint = True) + if col_size_new != None: + self.col_range = np.linspace(0, col_size_new, data.shape[2], endpoint = True) + + if gray_screen_dur > 0: + # just adding one or two seconds to gray screen so flash never "happens" + m_gray = FullFieldFlashMovie(self.row_range, self.col_range, gray_screen_dur + 1, gray_screen_dur + 2, + frame_rate=self.frame_rate).full(t_max=gray_screen_dur) + mov = m_gray + Movie(data, row_range=self.row_range, col_range=self.col_range, labels=('time', 'y', 'x'), + units=('second', 'pixel', 'pixel'), frame_rate=self.frame_rate) + else: + mov = Movie(data, row_range=self.row_range, col_range=self.col_range, labels=('time', 'y', 'x'), + units=('second', 'pixel', 'pixel'), frame_rate=self.frame_rate) + + return mov + + +if __name__ == "__main__": + m1 = FullFieldFlashMovie(range(60), range(80), 1, 2).full(t_max=2) + m2 = FullFieldFlashMovie(range(60), range(80), 1, 2).full(t_max=2) + m3 = m1+m2 + m3.imshow_summary() diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/poissongeneration.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/poissongeneration.py new file mode 100644 index 0000000..b2125b1 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/poissongeneration.py @@ -0,0 +1,104 @@ +import numpy as np +import scipy.interpolate as sinterp +import scipy.integrate as spi +import warnings +import scipy.optimize as sopt +import scipy.stats as sps + +def generate_renewal_process(t0, t1, renewal_distribution): + last_event_time = t0 + curr_interevent_time = float(renewal_distribution()) + event_time_list = [] + while last_event_time+curr_interevent_time <= t1: + event_time_list.append(last_event_time+curr_interevent_time) + curr_interevent_time = float(renewal_distribution()) + last_event_time = event_time_list[-1] + + return event_time_list + +def generate_poisson_process(t0, t1, rate): + + if rate is None: raise ValueError('Rate cannot be None') + if rate > 10000: warnings.warn('Very high rate encountered: %s' % rate) + + + try: + assert rate >= 0 + except AssertionError: + raise ValueError('Negative rate (%s) not allowed' % rate) + + try: + assert rate < np.inf + except AssertionError: + raise ValueError('Rate (%s) must be finite' % rate) + + + + + + + + if rate == 0: + return [] + else: + return generate_renewal_process(t0, t1, sps.expon(0,1./rate).rvs) + +def generate_inhomogenous_poisson(t_range, y_range, seed=None): + if not seed == None: np.random.seed(seed) + spike_list = [] + for tl, tr, y in zip(t_range[:-1], t_range[1:], y_range[:-1]): + spike_list += generate_poisson_process(tl, tr, y) + return spike_list + + + + +def generate_poisson_rescaling(t, y, seed=None): + y = np.array(y) + t = np.array(t) + assert not np.any(y<0) + f = sinterp.interp1d(t, y, fill_value=0, bounds_error=False) + return generate_poisson_rescaling_function(lambda y, t: f(t), t[0], t[-1], seed=seed) + + + +def generate_poisson_rescaling_function(f, t_min, t_max, seed=None): + + + + def integrator(t0, t1): + return spi.odeint(f, 0, [t0, t1])[1][0] + + if not seed == None: + np.random.seed(seed) + + spike_train = [] + while t_min < t_max: + e0 = np.random.exponential() + def root_function(t): + return e0 - integrator(t_min, t) + + try: + with warnings.catch_warnings(record=True) as w: + result = sopt.root(root_function, .1) + assert result.success + except AssertionError: + if not e0 < integrator(t_min, t_max): + assert Exception + else: + break + + + + + t_min = result.x[0] + spike_train.append(t_min) + + return np.array(spike_train) + + +def test_generate_poisson_function(): + + f = lambda y, t:10 + + assert len(generate_poisson_function(f,0,1,seed=5)) == 12 \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/singleunitcell.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/singleunitcell.py new file mode 100644 index 0000000..d3e0b24 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/singleunitcell.py @@ -0,0 +1,8 @@ +from temporalfilter import TemporalFilterCosineBump +from transferfunction import ScalarTransferFunction +from linearfilter import SpatioTemporalFilter +import numpy as np +from spatialfilter import GaussianSpatialFilter +from cellmodel import OnUnit, OffUnit + + diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/spatialfilter.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/spatialfilter.py new file mode 100644 index 0000000..466db94 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/spatialfilter.py @@ -0,0 +1,215 @@ +from scipy import ndimage +import numpy as np +import itertools +import importlib +import scipy.interpolate as spinterp +from . import utilities as util +import matplotlib.pyplot as plt +import scipy.misc as spmisc +import scipy.ndimage as spndimage +from .kernel import Kernel2D, Kernel3D + +class ArrayFilter(object): + + default_threshold = .01 + + def __init__(self, mask): + + self.mask = mask + + def imshow(self, row_range, col_range, threshold=0, **kwargs): + + return self.get_kernel(row_range, col_range,threshold).imshow(**kwargs) + + def get_kernel(self, row_range, col_range, threshold=0, amplitude=1.): + +# print np.where(self.mask>threshold) + row_vals, col_vals = np.where(self.mask>threshold) + + kernel_vals = self.mask[row_vals, col_vals] + kernel_vals = amplitude*kernel_vals/kernel_vals.sum() + + return Kernel2D(row_range, col_range, row_vals, col_vals, kernel_vals) # row_range, col_range, row_inds, col_inds, kernel): + + +class GaussianSpatialFilter(object): + + default_threshold = .01 + + def __init__(self, translate=(0, 0), sigma=(1.,1.), rotation=0, origin='center'): + '''When w=1 and rotation=0, half-height will be at y=1''' + + self.translate = translate + self.rotation = rotation + self.sigma = sigma + self.origin = origin + + def imshow(self, row_range, col_range, threshold=0, **kwargs): + return self.get_kernel(row_range, col_range,threshold).imshow(**kwargs) + + def to_dict(self): + + return {'class':(__name__, self.__class__.__name__), + 'translate':self.translate, + 'rotation':self.rotation, + 'sigma':self.sigma} + + def get_kernel(self, row_range, col_range, threshold=0, amplitude=1.): + + # Create symmetric initial point at center: + image_shape = len(col_range), len(row_range) + h, w = image_shape + on_filter_spatial = np.zeros(image_shape) + if h%2 == 0 and w%2 == 0: + for ii, jj in itertools.product(range(2), range(2)): + on_filter_spatial[int(h/2)+ii-1,int(w/2)+jj-1] = .25 + elif h%2 == 0 and w%2 != 0: + for ii in range(2): + on_filter_spatial[int(h/2)+ii-1,int(w/2)] = .25 + elif h%2 != 0 and w%2 == 0: + for jj in range(2): + on_filter_spatial[int(h/2),int(w/2)+jj-1] = .25 + else: + on_filter_spatial[int(h/2),int(w/2)] = .25 + + # Apply gaussian filter to create correct sigma: + scaled_sigma_x =float(self.sigma[0])/(col_range[1]-col_range[0]) + scaled_sigma_y = float(self.sigma[1])/(row_range[1]-row_range[0]) + on_filter_spatial = ndimage.gaussian_filter(on_filter_spatial, (scaled_sigma_x, scaled_sigma_y), mode='nearest', cval=0) +# on_filter_spatial = skf.gaussian_filter(on_filter_spatial, sigma=(scaled_sigma_x, scaled_sigma_y)) + + # Rotate and translate at center: + rotation_matrix = util.get_rotation_matrix(self.rotation, on_filter_spatial.shape) + translation_x = float(self.translate[1])/(row_range[1]-row_range[0]) + translation_y = -float(self.translate[0])/(col_range[1]-col_range[0]) + translation_matrix = util.get_translation_matrix((translation_x, translation_y)) + if self.origin != 'center': + center_y = -(self.origin[0]-(col_range[-1]+col_range[0])/2)/(col_range[1]-col_range[0]) + center_x = (self.origin[1]-(row_range[-1]+row_range[0])/2)/(row_range[1]-row_range[0]) + translation_matrix += util.get_translation_matrix((center_x, center_y)) + kernel_data = util.apply_transformation_matrix(on_filter_spatial, translation_matrix+rotation_matrix) + + kernel = Kernel2D.from_dense(row_range, col_range, kernel_data, threshold=0) + kernel.apply_threshold(threshold) + kernel.normalize() + + kernel.kernel *= amplitude + + + return kernel + + + +# spatial_model = GaussianSpatialFilterModel(height=21, aspect_ratio=1., rotation=0) +# spatial_filter = spatial_model(center=(30,40)) +# k = spatial_filter.get_spatial_kernel(range(60), range(80)) +# k.imshow(frame_size=(60,80)) + + + + + + + + + + + + + +# def evaluate_movie(self, movie, t, show=False): +# +# y = [] +# for ti in t: +# kernel_result = movie.evaluate_Kernel3D(ti, self) +# y.append(self.transfer_function(kernel_result)) +# +# if show == True: +# plt.plot(t, y) +# plt.show() +# +# return t, y + +# print mesh_range[0] +# +# ii = mesh_range[0][inds] +# jj = mesh_range[1][inds] +# print ii, jj +# print tmp[jj,ii] + +# plt.figure() +# plt.pcolor(mesh_range[0], mesh_range[1], tmp) +# plt.colorbar() +# plt.axis('equal') +# plt.show() + +# print self.xydata[0].shape +# +# t0 = spndimage.rotate(self.xydata[0],30,reshape=False, mode=mode) +# t1 = spndimage.rotate(self.xydata[1],30, reshape=False, mode=mode) + +# print t0.shape +# print t1.shape +# print on_filter_spatial.shape + +# plt.pcolor(t0,t1, on_filter_spatial) + + +# self.interpolation_function = spinterp.interp2d(self.w_values, self.h_values, on_filter_spatial, fill_value=0, bounds_error=False) +# +# print self.interpolation_function((t0,t1)) + +# translation_matrix = util.get_translation_matrix(self.translation) +# tmp = util.apply_transformation_matrix(on_filter_spatial, translation_matrix) +# +# plt.pcolor(self.xydata[0], self.xydata[1], tmp) +# plt.show() + +# # print self.xydata_trans[0][0], self.xydata_trans[0],[-1] +# # print self.xydata_trans[1][0], self.xydata_trans[1],[-1] +# print self.xydata_trans +# rotation_matrix = util.get_rotation_matrix(self.rotation, on_filter_spatial.shape) +# translation_matrix = util.get_translation_matrix(self.translation) +# on_filter_spatial = util.apply_transformation_matrix(on_filter_spatial, translation_matrix+rotation_matrix) + +# plt.imshow(on_filter_spatial, extent=(self.w_values[0], self.w_values[-1], self.h_values[0], self.h_values[-1]), aspect=1.) +# plt.show() + +# def to_dict(self): +# +# return {'scale':self.scale, +# 'translation':self.translation, +# 'rotation':self.rotation, +# 'weight':self.weight, +# 'temporal_filter':self.temporal_filter.to_dict(), +# 'class':(__name__, self.__class__.__name__)} + +# def get_kernel(self, xdata, ydata, threshold=default_threshold): +# +# +# # Rotate and translate at center: +# rotation_matrix = util.get_rotation_matrix(self.rotation, on_filter_spatial.shape) +# translation_matrix = util.get_translation_matrix(self.translation) +# on_filter_spatial = util.apply_transformation_matrix(on_filter_spatial, translation_matrix+rotation_matrix) +# +# # Now translate center of field in image: +# # translation_matrix = util.get_translation_matrix(relative_spatial_location) +# # on_filter_spatial = util.apply_transformation_matrix(on_filter_spatial, translation_matrix) +# +# # Create and return thresholded 2D mask: +# row_ind_list, col_ind_list = np.where(on_filter_spatial != 0) +# kernel = on_filter_spatial[row_ind_list, col_ind_list] +# +# +# +# +# # filter_mask = Kernel2D(row_ind_list, col_ind_list, kernel, threshold=threshold) +# +# return filter_mask + +# translation_matrix = util.get_translation_matrix((1.*translation[0]/fudge_factor,-1.*translation[1]/fudge_factor)) + +# plt.figure() +# plt.pcolor(self.mesh_support[0], self.mesh_support[1], self.kernel_data) +# plt.axis('equal') +# plt.show() \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/temporalfilter.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/temporalfilter.py new file mode 100644 index 0000000..1e604bf --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/temporalfilter.py @@ -0,0 +1,114 @@ +import numpy as np +from . import fitfuns +import scipy.interpolate as spinterp +import matplotlib.pyplot as plt +from .kernel import Kernel1D + +class TemporalFilter(object): + + def __init__(self, *args, **kwargs): pass + + def imshow(self, t_range=None, threshold=0, reverse=False, rescale=False, **kwargs): + return self.get_kernel(t_range, threshold, reverse, rescale).imshow(**kwargs) + + + def to_dict(self): + return {'class':(__name__, self.__class__.__name__)} + + def get_kernel(self, t_range=None, threshold=0, reverse=False, rescale=False): + + if t_range is None: + t_range = self.get_default_t_grid() + +# print self.t_support +# print self.kernel_data + + if len(self.t_support) == 1: + k = Kernel1D(self.t_support, self.kernel_data, threshold=threshold, reverse=reverse) + else: + interpolation_function = spinterp.interp1d(self.t_support, self.kernel_data, fill_value=0, bounds_error=False, assume_sorted=True) + k = Kernel1D(t_range, interpolation_function(t_range), threshold=threshold, reverse=reverse) + if rescale == True: + k.rescale() + + #assert np.abs(np.abs(k.kernel).sum() - 1) < 1e-14 + assert np.abs(np.abs(k.kernel.sum()) - 1) < 1e-14 + + return k + +class ArrayTemporalFilter(TemporalFilter): + + def __init__(self, mask,t_support): + + self.mask = mask + self.t_support = t_support + + assert len(self.mask) == len(self.t_support) + + self.nkt = 600 + + super(self.__class__, self).__init__() + + self.kernel_data = self.mask + #self.t_support = np.arange(0, len(self.kernel_data)*.001, .001) + #assert len(self.t_support) == len(self.kernel_data) + + def get_default_t_grid(self): + + return np.arange(self.nkt)*.001 + +class TemporalFilterCosineBump(TemporalFilter): + + def __init__(self, weights, kpeaks, delays): + + assert len(kpeaks) == 2 + assert kpeaks[0] 0 + assert delays[0] <= delays[1] + + self.ncos = len(weights) + + # Not likely to change defaults: + self.neye = 0 + self.b = .3 + self.nkt = 600 + + super(self.__class__, self).__init__() + + # Parameters + self.weights = np.array([weights]).T + self.kpeaks = kpeaks + self.delays = np.array([delays]).astype(int) + + # Adapter code to get filters from Ram's code: + kbasprs = {} + kbasprs['neye'] = self.neye + kbasprs['ncos'] = self.ncos + kbasprs['kpeaks'] = self.kpeaks + kbasprs['b'] = self.b + kbasprs['delays'] = self.delays + nkt = self.nkt + #kbasprs['bases'] = fitfuns.makeBasis_StimKernel(kbasprs, nkt) + self.kernel_data = np.dot(fitfuns.makeBasis_StimKernel(kbasprs, nkt), self.weights)[::-1].T[0] +# plt.figure() +# plt.plot(self.kernel_data) +# plt.show() +# sys.exit() + self.t_support = np.arange(0, len(self.kernel_data)*.001, .001) + self.kbasprs = kbasprs + assert len(self.t_support) == len(self.kernel_data) + + def __call__(self, t): + return self.interpolation_function(t) + + def get_default_t_grid(self): + return np.arange(self.nkt)*.001 + + def to_dict(self): + + param_dict = super(self.__class__, self).to_dict() + + param_dict.update({'weights':self.weights.tolist(), + 'kpeaks':self.kpeaks}) + + return param_dict diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/transferfunction.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/transferfunction.py new file mode 100644 index 0000000..03ff617 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/transferfunction.py @@ -0,0 +1,58 @@ +from sympy.utilities.lambdify import lambdify +import sympy.parsing.sympy_parser as symp +import sympy.abc +import numpy as np + + +class ScalarTransferFunction(object): + def __init__(self, transfer_function_string, symbol=sympy.abc.s): + self.symbol = symbol + self.transfer_function_string = transfer_function_string + self.closure = lambdify(self.symbol, symp.parse_expr(self.transfer_function_string), modules=['sympy']) + + def __call__(self, s): + return self.closure(s) + + def to_dict(self): + return {'class': (__name__, self.__class__.__name__), + 'function': self.transfer_function_string} + + def imshow(self, xlim, ax=None, show=True, save_file_name=None, ylim=None): + # TODO: This function should be removed (as Ram to see if/where it's used) since it will fail (no t_vals) + import matplotlib.pyplot as plt + if ax is None: + _, ax = plt.subplots(1, 1) + + plt.plot(self.t_vals, self.kernel) + ax.set_xlabel('Time (Seconds)') + + if ylim is not None: + ax.set_ylim(ylim) + + if xlim is not None: + ax.set_xlim((self.t_range[0], self.t_range[-1])) + + if save_file_name is not None: + plt.savefig(save_file_name, transparent=True) + + if show: + plt.show() + + return ax + + +class MultiTransferFunction(object): + def __init__(self, symbol_tuple, transfer_function_string): + self.symbol_tuple = symbol_tuple + self.transfer_function_string = transfer_function_string + self.closure = lambdify(self.symbol_tuple, symp.parse_expr(self.transfer_function_string), modules=['sympy']) + + def __call__(self, *s): + if isinstance(s[0], (float,)): + return self.closure(*s) + else: + return np.array(list(map(lambda x: self.closure(*x), zip(*s)))) + + def to_dict(self): + return {'class': (__name__, self.__class__.__name__), + 'function': self.transfer_function_string} diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/util_fns.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/util_fns.py new file mode 100644 index 0000000..af297a0 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/util_fns.py @@ -0,0 +1,190 @@ +import os +import re +import matplotlib.mlab as mlab +import numpy as np +import scipy.io as sio +from scipy.fftpack import fft +import pandas as pd +from .movie import Movie, FullFieldFlashMovie + + +pd.set_option('display.width', 1000) +pd.set_option('display.max_columns', 100) + + +################################################# +def chunks(l, n): + """Yield successive n-sized chunks from l.""" + for i in range(0, len(l), n): + yield l[i:i + n] + + +################################################## +def compute_FFT_OneCycle(FR, TF, downsample): + one_cyc = np.int(((1000. / downsample) / TF)) + FR_cyc = list(chunks(FR, one_cyc)) + if (TF == 15. or TF == 8.): + FR_cyc = FR_cyc[:-1] + + FR_cyc_avg = np.mean(FR_cyc, axis=0) + y = FR_cyc_avg + AMP = 2 * np.abs(fft(y) / len(y)) + F0 = 0.5 * AMP[0] + assert (F0 - np.mean(y) < 1.e-4) + F1 = AMP[1] + + return F0, F1 + + +################################################## +def create_ff_mov(frame_rate, tst, tend, xrng, yrng): + ff_mov_on = FullFieldFlashMovie(np.arange(xrng), np.arange(yrng), tst, tend, frame_rate=frame_rate, + max_intensity=1).full(t_max=tend) # +0.5) + ff_mov_off = FullFieldFlashMovie(np.arange(xrng), np.arange(yrng), tst, tend, frame_rate=frame_rate, + max_intensity=-1).full(t_max=tend) # +0.5) + + return ff_mov_on, ff_mov_off + + +################################################## +def create_grating_movie_list(gr_dir_name): + gr_fnames = os.listdir(gr_dir_name) + gr_fnames_ord = sorted(gr_fnames, key=lambda x: (int(re.sub('\D', '', x)), x)) + + gr_mov_list = [] + for fname in gr_fnames_ord[:5]: + movie_file = os.path.join(gr_dir_name, fname) + m_file = sio.loadmat(movie_file) + m_data_raw = m_file['mov'].T + swid = np.shape(m_data_raw)[1] + res = int(np.sqrt(swid / (8 * 16))) + m_data = np.reshape(m_data_raw, (3000, 8 * res, 16 * res)) + m1 = Movie(m_data[:500, :, :], row_range=np.linspace(0, 120, m_data.shape[1], endpoint=True), col_range=np.linspace(0, 120, m_data.shape[2], endpoint=True), frame_rate=1000.) + gr_mov_list.append(m1) + + return gr_mov_list + + +################################################## +metrics_dir = os.path.join(os.path.dirname(__file__), 'cell_metrics') +def get_data_metrics_for_each_subclass(ctype): + # Load csv file into dataframe + if ctype.find('_sus') >= 0: + prs_fn = os.path.join(metrics_dir, '{}_cells_v3.csv'.format(ctype)) + else: + prs_fn = os.path.join(metrics_dir, '{}_cell_data.csv'.format(ctype)) + + prs_df = pd.read_csv(prs_fn) + N_class, nmet = np.shape(prs_df) + + # Group data by subclasses based on max F0 vals + exp_df = prs_df.iloc[:, [13, 14, 17, 18, 28, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54]].copy() # Bl_lat,Wh_lat,Bl_si, wh_si, spont, 5 F0s, 5 F1s + sub_df = exp_df.iloc[:, [5, 6, 7, 8, 9]] + exp_df['max_tf'] = sub_df.idxmax(axis=1).values # sub_df.idxmax(axis=1) + + exp_means = exp_df.groupby(['max_tf']).mean() + exp_std = exp_df.groupby(['max_tf']).std() + exp_nsub = exp_df.groupby(['max_tf']).size() + + max_ind_arr = np.where(exp_nsub == np.max(exp_nsub)) + max_nsub_ind = max_ind_arr[0][0] + + # Get means and std dev for subclasses + exp_prs_dict = {} + for scn in np.arange(len(exp_nsub)): + f0_exp = exp_means.iloc[scn, 5:10].values + f1_exp = exp_means.iloc[scn, 10:].values + spont_exp = exp_means.iloc[scn, 4:5].values + if ctype.find('OFF') >= 0: + si_exp = exp_means.iloc[scn, 2:3].values + ttp_exp = exp_means.iloc[scn, 0:1].values + elif ctype.find('ON') >= 0: + si_exp = exp_means.iloc[scn, 3:4].values + ttp_exp = exp_means.iloc[scn, 1:2].values + else: + si_exp = np.NaN * np.ones((1, 5)) + ttp_exp = np.NaN * np.ones((1, 2)) + + nsub = exp_nsub.iloc[scn] + if nsub == 1: + f0_std = np.mean(exp_std.iloc[max_nsub_ind, 5:10].values) * np.ones((1, 5)) + f1_std = np.mean(exp_std.iloc[max_nsub_ind, 10:].values) * np.ones((1, 5)) + spont_std = np.mean(exp_std.iloc[max_nsub_ind, 4:5].values) * np.ones((1, 5)) + if ctype.find('OFF') >= 0: + si_std = np.mean(exp_std.iloc[max_nsub_ind, 2:3].values) * np.ones((1, 5)) + elif ctype.find('ON') >= 0: + si_std = np.mean(exp_std.iloc[max_nsub_ind, 3:4].values) * np.ones((1, 5)) + else: + si_std = np.NaN * np.ones((1, 5)) + + else: + f0_std = exp_std.iloc[scn, 5:10].values + f1_std = exp_std.iloc[scn, 10:].values + spont_std = exp_std.iloc[scn, 4:5].values + if ctype.find('OFF') >= 0: + si_std = exp_std.iloc[scn, 2:3].values + elif ctype.find('ON') >= 0: + si_std = exp_std.iloc[scn, 3:4].values + else: + si_std = np.NaN * np.ones((1, 5)) + + if ctype.find('t') >= 0: + tcross = 40. + si_inf_exp = (si_exp - tcross / 200.) * (200. / (200. - tcross - 40.)) + elif ctype.find('s') >= 0: + tcross = 60. + si_inf_exp = (si_exp - tcross / 200.) * (200. / (200. - tcross - 40.)) + + dict_key = exp_means.iloc[scn].name[3:] + exp_prs_dict[dict_key] = {} + exp_prs_dict[dict_key]['f0_exp'] = f0_exp + exp_prs_dict[dict_key]['f1_exp'] = f1_exp + exp_prs_dict[dict_key]['spont_exp'] = spont_exp + exp_prs_dict[dict_key]['si_exp'] = si_exp + exp_prs_dict[dict_key]['si_inf_exp'] = si_inf_exp + exp_prs_dict[dict_key]['ttp_exp'] = ttp_exp + exp_prs_dict[dict_key]['f0_std'] = f0_std + exp_prs_dict[dict_key]['f1_std'] = f1_std + exp_prs_dict[dict_key]['spont_std'] = spont_std + exp_prs_dict[dict_key]['si_std'] = si_std + exp_prs_dict[dict_key]['nsub'] = nsub + exp_prs_dict[dict_key]['N_class'] = N_class + + return exp_prs_dict + + +################################################## +def check_optim_results_against_bounds(bounds, opt_wts, opt_kpeaks): + bds_wts0 = bounds[0] + bds_wts1 = bounds[1] + bds_kp0 = bounds[2] + bds_kp1 = bounds[3] + + opt_wts0 = opt_wts[0] + opt_wts1 = opt_wts[1] + opt_kp0 = opt_kpeaks[0] + opt_kp1 = opt_kpeaks[1] + + if (opt_wts0 == bds_wts0[0] or opt_wts0 == bds_wts0[1]): + prm_on_bds = 'w0' + elif (opt_wts1 == bds_wts1[0] or opt_wts1 == bds_wts1[1]): + prm_on_bds = 'w1' + elif (opt_kp0 == bds_kp0[0] or opt_kp0 == bds_kp0[1]): + prm_on_bds = 'kp0' + elif (opt_kp1 == bds_kp1[0] or opt_kp1 == bds_kp1[1]): + prm_on_bds = 'kp1' + else: + prm_on_bds = 'None' + + return prm_on_bds + + +####################################################### +def get_tcross_from_temporal_kernel(temporal_kernel): + max_ind = np.argmax(temporal_kernel) + min_ind = np.argmin(temporal_kernel) + + temp_tcross_ind = mlab.cross_from_above(temporal_kernel[max_ind:min_ind], 0.0) + tcross_ind = max_ind + temp_tcross_ind[0] + return tcross_ind diff --git a/bmtk-vb/bmtk/simulator/filternet/lgnmodel/utilities.py b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/utilities.py new file mode 100644 index 0000000..69e61d9 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/lgnmodel/utilities.py @@ -0,0 +1,123 @@ +import array +import matplotlib.pyplot as plt +import skimage.transform as transform +import numpy as np +import scipy.integrate as spi +import scipy.optimize as sopt +import warnings +import scipy.interpolate as sinterp + +def get_vanhateren(filename, src_dir): + with open(filename, 'rb') as handle: + s = handle.read() + arr = array.array('H', s) + arr.byteswap() + return np.array(arr, dtype='uint16').reshape(1024, 1536) + +def convert_tmin_tmax_framerate_to_trange(t_min,t_max,frame_rate): + duration = t_max-t_min + number_of_frames = duration*frame_rate # Assumes t_min/t_max in same time units as frame_rate + dt= 1./frame_rate + return t_min+np.arange(number_of_frames+1)*dt + +def get_rotation_matrix(rotation, shape): + '''Angle in degrees''' + + shift_y, shift_x = np.array(shape) / 2. + tf_rotate = transform.SimilarityTransform(rotation=np.deg2rad(rotation)) + tf_shift = transform.SimilarityTransform(translation=[-shift_x, -shift_y]) + tf_shift_inv = transform.SimilarityTransform(translation=[shift_x, shift_y]) + return (tf_shift + (tf_rotate + tf_shift_inv)) + +def get_translation_matrix(translation): + shift_x, shift_y = translation + tf_shift = transform.SimilarityTransform(translation=[-shift_x, shift_y]) + return tf_shift + + +def get_scale_matrix(scale, shape): + shift_y, shift_x = np.array(shape) / 2. + tf_rotate = transform.SimilarityTransform(scale=(1./scale[0], 1./scale[1])) + tf_shift = transform.SimilarityTransform(translation=[-shift_x, -shift_y]) + tf_shift_inv = transform.SimilarityTransform(translation=[shift_x, shift_y]) + return tf_shift + (tf_rotate + tf_shift_inv) + +def apply_transformation_matrix(image, matrix): + return transform.warp(image, matrix) + + +def get_convolution_ind(curr_fi, flipped_t_inds, kernel, data): + + flipped_and_offset_t_inds = flipped_t_inds + curr_fi + + if np.all( flipped_and_offset_t_inds >= 0): + + # No negative entries; still might be over the end though: + try: + return np.dot(data[flipped_and_offset_t_inds], kernel) + + except IndexError: + + # Requested some indices out of range of data: + indices_within_range = np.where(flipped_and_offset_t_inds < len(data)) + valid_t_inds = flipped_and_offset_t_inds[indices_within_range] + valid_kernel = kernel[indices_within_range] + return np.dot(data[valid_t_inds], valid_kernel) + + else: + +# # Some negative entries: +# if np.all( flipped_and_offset_t_inds < 0): +# +# # All are negative: +# return 0 +# +# else: + + # Only some are negative, so restrict: + indices_within_range = np.where(flipped_and_offset_t_inds >= 0) + valid_t_inds = flipped_and_offset_t_inds[indices_within_range] + valid_kernel = kernel[indices_within_range] + + return np.dot(data[valid_t_inds], valid_kernel) + +def get_convolution(t, frame_rate, flipped_t_inds, kernel, data): + + # Get frame indices: + fi = frame_rate*float(t) + fim = int(np.floor(fi)) + fiM = int(np.ceil(fi)) + + if fim != fiM: + + # Linear interpolation: + sm = get_convolution_ind(fim, flipped_t_inds, kernel, data) + sM = get_convolution_ind(fiM, flipped_t_inds, kernel, data) + return sm*(1-(fi-fim)) + sM*(fi-fim) + + else: + + # Requested time is exactly one piece of data: + return get_convolution_ind(fim, flipped_t_inds, kernel, data) + +if __name__ == "__main__": + pass +# print generate_poisson([0,1,2,3],[.5,1,2,3]) + + + +# test_generate_poisson_function() + +# image = np.zeros((101,151)) +# image[48:52+1]=1 +# +# mr = get_rotation_matrix(30, image.shape) +# mt = get_translation_matrix((20,0)) +# ms = get_scale_matrix((.5,1),image.shape) +# +# m = mr +# +# fig, ax = plt.subplots(2,1) +# ax[0].imshow(image) +# ax[1].imshow(apply_transformation_matrix(image, m)) +# plt.show() diff --git a/bmtk-vb/bmtk/simulator/filternet/modules/__init__.py b/bmtk-vb/bmtk/simulator/filternet/modules/__init__.py new file mode 100644 index 0000000..13185dd --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/modules/__init__.py @@ -0,0 +1,2 @@ +from .record_rates import RecordRates +from .create_spikes import SpikesGenerator diff --git a/bmtk-vb/bmtk/simulator/filternet/modules/base.py b/bmtk-vb/bmtk/simulator/filternet/modules/base.py new file mode 100644 index 0000000..1bf7865 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/modules/base.py @@ -0,0 +1,9 @@ +class SimModule(object): + def initialize(self, sim): + pass + + def save(self, sim, **kwargs): + pass + + def finalize(self, sim): + pass \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/modules/create_spikes.py b/bmtk-vb/bmtk/simulator/filternet/modules/create_spikes.py new file mode 100644 index 0000000..d2acf96 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/modules/create_spikes.py @@ -0,0 +1,99 @@ +import os +import numpy as np +import random +import six + +from .base import SimModule +from bmtk.utils.io.spike_trains import SpikeTrainWriter +from bmtk.simulator.filternet.lgnmodel import poissongeneration as pg + + +class SpikesGenerator(SimModule): + def __init__(self, spikes_file_csv=None, spikes_file=None, spikes_file_nwb=None, tmp_dir='output'): + def _get_file_path(file_name): + if file_name is None or os.path.isabs(file_name): + return file_name + + return os.path.join(tmp_dir, file_name) + + self._csv_fname = _get_file_path(spikes_file_csv) + self._save_csv = spikes_file_csv is not None + + self._h5_fname = _get_file_path(spikes_file) + self._save_h5 = spikes_file is not None + + self._nwb_fname = _get_file_path(spikes_file_nwb) + self._save_nwb = spikes_file_nwb is not None + + self._tmpdir = tmp_dir + + self._spike_writer = SpikeTrainWriter(tmp_dir=tmp_dir) + + def save(self, sim, gid, times, rates): + try: + spike_trains = np.array(f_rate_to_spike_train(times*1000.0, rates, np.random.randint(10000), + 1000.*min(times), 1000.*max(times), 0.1)) + except: + # convert to milliseconds and hence the multiplication by 1000 + spike_trains = 1000.0*np.array(pg.generate_inhomogenous_poisson(times, rates, + seed=np.random.randint(10000))) + + self._spike_writer.add_spikes(times=spike_trains, gid=gid) + + def finalize(self, sim): + self._spike_writer.flush() + + if self._save_csv: + self._spike_writer.to_csv(self._csv_fname) + + if self._save_h5: + self._spike_writer.to_hdf5(self._h5_fname) + + if self._save_nwb: + self._spike_writer.to_nwb(self._nwb_fname) + + self._spike_writer.close() + + +def f_rate_to_spike_train(t, f_rate, random_seed, t_window_start, t_window_end, p_spike_max): + # t and f_rate are lists containing time stamps and corresponding firing rate values; + # they are assumed to be of the same length and ordered with the time strictly increasing; + # p_spike_max is the maximal probability of spiking that we allow within the time bin; it is used to decide on the size of the time bin; should be less than 1! + + if np.max(f_rate) * np.max(np.diff(t))/1000. > 0.1: #Divide by 1000 to convert to seconds + print('Firing rate to high for time interval and will not estimate spike correctly. Spikes will ' \ + 'be calculated with the slower inhomogenous poisson generating fucntion') + raise Exception() + + spike_times = [] + + # Use seed(...) to instantiate the random number generator. Otherwise, current system time is used. + random.seed(random_seed) + + # Assume here for each pair (t[k], f_rate[k]) that the f_rate[k] value applies to the time interval [t[k], t[k+1]). + for k in six.moves.range(0, len(f_rate)-1): + t_k = t[k] + t_k_1 = t[k+1] + if ((t_k >= t_window_start) and (t_k_1 <= t_window_end)): + delta_t = t_k_1 - t_k + # Average number of spikes expected in this interval (note that firing rate is in Hz and time is in ms). + av_N_spikes = f_rate[k] / 1000.0 * delta_t + + if (av_N_spikes > 0): + if (av_N_spikes <= p_spike_max): + N_bins = 1 + else: + N_bins = int(np.ceil(av_N_spikes / p_spike_max)) + + t_base = t[k] + t_bin = 1.0 * delta_t / N_bins + p_spike_bin = 1.0 * av_N_spikes / N_bins + for i_bin in six.moves.range(0, N_bins): + rand_tmp = random() + if rand_tmp < p_spike_bin: + spike_t = t_base + random() * t_bin + spike_times.append(spike_t) + + t_base += t_bin + + return spike_times \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/modules/record_rates.py b/bmtk-vb/bmtk/simulator/filternet/modules/record_rates.py new file mode 100644 index 0000000..b2978a3 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/modules/record_rates.py @@ -0,0 +1,29 @@ +import os +import csv + +from .base import SimModule + + +class RecordRates(SimModule): + def __init__(self, csv_file=None, h5_file=None, tmp_dir='output'): + csv_file = csv_file if csv_file is None or os.path.isabs(csv_file) else os.path.join(tmp_dir, csv_file) + self._save_to_csv = csv_file is not None + self._tmp_csv_file = csv_file if self._save_to_csv else os.path.join(tmp_dir, '__tmp_rates.csv') + + self._tmp_csv_fhandle = open(self._tmp_csv_file, 'w') + self._tmp_csv_writer = csv.writer(self._tmp_csv_fhandle, delimiter=' ') + + self._save_to_h5 = h5_file is not None + + def save(self, sim, gid, times, rates): + for t, r in zip(times, rates): + self._tmp_csv_writer.writerow([gid, t, r]) + self._tmp_csv_fhandle.flush() + + def finalize(self, sim): + if self._save_to_h5: + raise NotImplementedError + + self._tmp_csv_fhandle.close() + if not self._save_to_csv: + os.remove(self._tmp_csv_file) diff --git a/bmtk-vb/bmtk/simulator/filternet/pyfunction_cache.py b/bmtk-vb/bmtk/simulator/filternet/pyfunction_cache.py new file mode 100644 index 0000000..9ac949a --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/pyfunction_cache.py @@ -0,0 +1,98 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import types +from functools import wraps + + +class _PyFunctions(object): + """Structure for holding custom user-defined python functions. + + Will store a set of functions created by the user. Should not access this directly but rather user the + decorators or setter functions, and use the py_modules class variable to access individual functions. Is divided + up into + synaptic_weight: functions for calcuating synaptic weight. + cell_model: should return NEURON cell hobj. + synapse model: should return a NEURON synapse object. + """ + def __init__(self): + self.__cell_processors = {} + + def clear(self): + self.__cell_processors.clear() + + @property + def cell_processors(self): + return self.__cell_processors.keys() + + def cell_processor(self, name): + return self.__cell_processors[name] + + def add_cell_processor(self, name, func, overwrite=True): + if overwrite or name not in self.__cell_processors: + self.__cell_processors[name] = func + + def __repr__(self): + return self.__cell_processors + + +py_modules = _PyFunctions() + + +def cell_processor(*wargs, **wkwargs): + """A decorator for registering NEURON cell loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_cell_processor(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_cell_processor(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def add_cell_processor(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_cell_processor(func_name, func, overwrite) + + +def load_py_modules(cell_processors): + # py_modules.clear() + assert (isinstance(cell_processors, types.ModuleType)) + for f in [cell_processors.__dict__.get(f) for f in dir(cell_processors)]: + if isinstance(f, types.FunctionType): + py_modules.add_cell_processor(f.__name__, f) diff --git a/bmtk-vb/bmtk/simulator/filternet/transfer_functions.py b/bmtk-vb/bmtk/simulator/filternet/transfer_functions.py new file mode 100644 index 0000000..6517719 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/transfer_functions.py @@ -0,0 +1 @@ +from bmtk.simulator.filternet.lgnmodel.transferfunction import * \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/filternet/utils.py b/bmtk-vb/bmtk/simulator/filternet/utils.py new file mode 100644 index 0000000..c01045c --- /dev/null +++ b/bmtk-vb/bmtk/simulator/filternet/utils.py @@ -0,0 +1 @@ +from bmtk.simulator.filternet.lgnmodel.util_fns import * diff --git a/bmtk-vb/bmtk/simulator/mintnet/Image_Library.py b/bmtk-vb/bmtk/simulator/mintnet/Image_Library.py new file mode 100644 index 0000000..506a040 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/Image_Library.py @@ -0,0 +1,105 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import os +from PIL import Image + +# Image_Batch +# .data (image_data) +# .image_dir, .new_size + + +# add seed for random +# call should return indices into im_list +class Image_Experiment(object): + + def __init__(self,stuff): + + self.image_dir + self.new_size + self.sample_indices + self.im_list + # creating of pandas table, template + + + + + +class Image_Library (object): + def __init__(self, image_dir,new_size=(128,192)): # NOTE: change this so that sequential is a class variable, not an argument to the call + self.image_dir = image_dir + self.new_size = new_size + + im_list = os.listdir(image_dir) + + remove_list = [] + for im in im_list: + if im[-5:]!='.tiff' and im[-5:]!='.JPEG' and im[-4:]!='.jpg': + remove_list.append(im) + + for im in remove_list: + im_list.remove(im) + + self.im_list = im_list + + self.current_location = 0 # used for sequential samples + self.lib_size = len(self.im_list) + + def __call__(self,num_samples, sequential=False): + + image_data = np.zeros([num_samples,self.new_size[0],self.new_size[1],1],dtype=np.float32) + + if sequential: + if self.lib_size-self.current_location > num_samples: + sample_indices = np.arange(self.current_location,self.current_location + num_samples) + self.current_location += num_samples + else: + sample_indices = np.arange(self.current_location,self.lib_size) + self.current_location = 0 + else: + sample_indices = np.random.randint(0,len(self.im_list),num_samples) + + for i,s in enumerate(sample_indices): + im = Image.open(os.path.join(self.image_dir,self.im_list[s])) + im = im.convert('L') + im = im.resize((self.new_size[1],self.new_size[0])) + image_data[i,:,:,0] = np.array(im,dtype=np.float32) + + return image_data + + def create_experiment(self): + + data = self() + return Image_Experiment(stuff) + + def experiment_from_table(self,table): + pass + + def to_h5(self,sample_indices=None): + pass + + def template(self): + pass + + def table(self,*params): + pass diff --git a/bmtk-vb/bmtk/simulator/mintnet/Image_Library_Supervised.py b/bmtk-vb/bmtk/simulator/mintnet/Image_Library_Supervised.py new file mode 100644 index 0000000..756b62b --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/Image_Library_Supervised.py @@ -0,0 +1,93 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from PIL import Image +import numpy as np +import os + +class Image_Library_Supervised (object): + + def __init__(self,image_dir,new_size=(256,256)): + + self.categories = os.listdir(image_dir) + + self.num_categories = len(self.categories) #len(image_dir_list) + self.image_dir_list = [os.path.join(image_dir,x) for x in self.categories] + self.new_size = new_size + + + # self.categories = [] + # for d in self.image_dir_list: + # self.categories += [os.path.basename(d)] + + self.im_lists = {} + for i,cat in enumerate(self.categories): + d = self.image_dir_list[i] + if os.path.basename(d[0])=='.': continue + self.im_lists[cat] = os.listdir(d) + + for cat in self.im_lists: + remove_list = [] + for im in self.im_lists[cat]: + if im[-4:]!='.jpg': + remove_list.append(im) + + for im in remove_list: + self.im_lists[cat].remove(im) + + + self.current_location = np.zeros(len(self.categories)) # used for sequential samples + self.lib_size = [len(self.im_lists[x]) for x in self.categories] + #self.lib_size = len(self.im_list) + + def __call__(self,num_samples,sequential=False): + + image_data = np.zeros([self.num_categories*num_samples,self.new_size[0],self.new_size[1],1],dtype=np.float32) + + # y_vals = np.tile(np.arange(self.num_categories),(num_samples,1)).T.flatten() + # y_vals = y_vals.astype(np.float32) + + y_vals = np.zeros([num_samples*self.num_categories,self.num_categories],np.float32) + + for i,cat in enumerate(self.categories): + + y_vals[num_samples*i:num_samples*i+num_samples].T[i] = 1 + + if sequential: + if self.lib_size[i]-self.current_location[i] > num_samples: + sample_indices = np.arange(self.current_location[i],self.current_location[i] + num_samples,dtype=np.int64) + self.current_location[i] += num_samples + else: + sample_indices = np.arange(self.current_location[i],self.lib_size[i],dtype=np.int64) + self.current_location[i] = 0 + else: + sample_indices = np.random.randint(0,len(self.im_lists[cat]),num_samples) + + for j,s in enumerate(sample_indices): + im = Image.open(os.path.join(self.image_dir_list[i],self.im_lists[cat][s])) + im = im.convert('L') + im = im.resize((self.new_size[1],self.new_size[0])) + index = j + num_samples*i + image_data[index,:,:,0] = np.array(im,dtype=np.float32) + + return y_vals, image_data + diff --git a/bmtk-vb/bmtk/simulator/mintnet/__init__.py b/bmtk-vb/bmtk/simulator/mintnet/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/bmtk/simulator/mintnet/analysis/LocallySparseNoise.py b/bmtk-vb/bmtk/simulator/mintnet/analysis/LocallySparseNoise.py new file mode 100644 index 0000000..60b9228 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/analysis/LocallySparseNoise.py @@ -0,0 +1,105 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd +import h5py + + +class LocallySparseNoise (object): + + def __init__(self,data_file_name): + + self.stim_table = pd.read_hdf(data_file_name,'stim_table') + self.node_table = pd.read_hdf(data_file_name,'node_table') + + + self.data_file_name = data_file_name + + data = h5py.File(self.data_file_name,'r') + + self.data_sets = data.keys() + self.data_sets.remove('stim_table') + self.data_sets.remove('node_table') + self.data_sets.remove('stim_template') + + self.stim_template = data['stim_template'].value + + data.close() + + @staticmethod + def rf(response, stim_template, stim_shape): + T = stim_template.shape[0] + rf_shape = tuple(stim_template.shape[1:]) + + unit_shape = tuple(response.shape[1:]) + + response.resize([T,np.prod(unit_shape)]) + + rf = np.dot(response.T,stim_template) + + rf_new_shape = tuple([rf.shape[0]] + list(rf_shape)) + rf.resize(rf_new_shape) + rf_final_shape = tuple(list(unit_shape) + list(stim_shape)) + rf.resize(rf_final_shape) + + return rf + + def compute_receptive_fields(self, dtype=np.float32): + + output = h5py.File(self.data_file_name[:-3]+'_analysis.ic','a') + data = h5py.File(self.data_file_name,'r') + + # convert to +/-1 or 0 + stim_template = data['stim_template'].value.astype(dtype) + stim_template = stim_template-127 + stim_template = np.sign(stim_template) + #print np.unique(stim_template) + + stim_shape = tuple(stim_template.shape[1:]) + T = stim_template.shape[0] + + stim_template.resize([T,np.prod(stim_shape)]) + + stim_template_on = stim_template.copy() + stim_template_off = stim_template.copy() + + stim_template_on[stim_template_on<0] = 0.0 + stim_template_off[stim_template_off>0] = 0.0 + + for data_set in self.data_sets: + + response = data[data_set].value + response = response - np.mean(response,axis=0) + + key_onoff = data_set+'/lsn/on_off' + key_on = data_set+'/lsn/on' + key_off = data_set+'/lsn/off' + for key in [key_onoff, key_on, key_off]: + if key in output: + del output[key] + + output[key_onoff] = self.rf(response, stim_template, stim_shape) + output[key_on] = self.rf(response, stim_template_on, stim_shape) + output[key_off] = self.rf(response, stim_template_off, stim_shape) + + data.close() diff --git a/bmtk-vb/bmtk/simulator/mintnet/analysis/StaticGratings.py b/bmtk-vb/bmtk/simulator/mintnet/analysis/StaticGratings.py new file mode 100644 index 0000000..10a019b --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/analysis/StaticGratings.py @@ -0,0 +1,101 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd +import h5py +import sys +import os + +class StaticGratings (object): + + def __init__(self,data_file_name): + + self.stim_table = pd.read_hdf(data_file_name,'stim_table') + self.node_table = pd.read_hdf(data_file_name,'node_table') + self.tunings_file = None + + f = lambda label: self.stim_table.dropna().drop_duplicates([label])[label].sort_values(inplace=False).values + + self.orientations = f('orientation') + self.spatial_frequencies = f('spatial_frequency') + self.phases = f('phase') + + self.data_file_name = data_file_name + + data = h5py.File(self.data_file_name,'r') + + self.data_sets = data.keys() + self.data_sets.remove('stim_table') + self.data_sets.remove('node_table') + self.data_sets.remove('stim_template') + + data.close() + + def tuning_matrix(self, response, dtype=np.float32): + + tuning_shape = tuple([len(self.orientations), len(self.spatial_frequencies), len(self.phases)] + list(response.shape[1:])) + + tuning_matrix = np.empty(tuning_shape, dtype=dtype) + + for i,ori in enumerate(self.orientations): + for j,sf in enumerate(self.spatial_frequencies): + for k,ph in enumerate(self.phases): + + index = self.stim_table[(self.stim_table.spatial_frequency==sf) & (self.stim_table.orientation==ori) & (self.stim_table.phase==ph)].index + + tuning_matrix[i,j,k] = np.mean(response[index],axis=0) + + return tuning_matrix + + def compute_all_tuning(self, dtype=np.float32, force=False): + self.tunings_file = self.data_file_name[:-3]+'_analysis.ic' + if os.path.exists(self.tunings_file) and not force: + print('Using existing tunings file {}.'.format(self.tunings_file)) + return + + output = h5py.File(self.tunings_file,'a') + data = h5py.File(self.data_file_name,'r') + + for i, data_set in enumerate(self.data_sets): + sys.stdout.write( '\r{0:.02f}'.format(float(i)*100/len(self.data_sets))+'% done') + sys.stdout.flush() + + response = data[data_set].value + + tuning = self.tuning_matrix(response, dtype=dtype) + + key = data_set+'/sg/tuning' + if key in output: + del output[key] + output[key] = tuning + + sys.stdout.write( '\r{0:.02f}'.format(float(100))+'% done') + sys.stdout.flush() + + data.close() + + def get_tunings_file(self): + if self.tunings_file is None: + self.compute_all_tuning() + + return h5py.File(self.tunings_file, 'r') \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/mintnet/analysis/__init__.py b/bmtk-vb/bmtk/simulator/mintnet/analysis/__init__.py new file mode 100644 index 0000000..2d56a26 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/analysis/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/mintnet/hmax/C_Layer.py b/bmtk-vb/bmtk/simulator/mintnet/hmax/C_Layer.py new file mode 100644 index 0000000..1489c89 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/hmax/C_Layer.py @@ -0,0 +1,260 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +import os +import pandas as pd + +class C_Layer (object): + def __init__(self,node_name,S_Layer_input,bands): + ''' + :type S_Layer: S_Layer object + :param S_Layer: instance of S_Layer object that serves as input for this C_Layer + + :type bands: list + :param bands: bands[i] = [[list of frequency indices for S_layer over which to pool], grid_size, sample_step] + ''' + self.node_name = node_name + self.input = S_Layer_input.input + + self.tf_sess = S_Layer_input.tf_sess + + s_output = S_Layer_input.output + + self.K = S_Layer_input.K + + band_output = {} + + num_bands = len(bands) + + self.band_output = {} + + self.band_shape = {} + + with tf.name_scope(self.node_name): + for b in range(num_bands): + bands_to_pool, grid_size, sample_step = bands[b] + + sub_band_shape = [] + for sub_band in bands_to_pool: + sub_band_shape += [S_Layer_input.band_shape[sub_band]] + + max_band_shape = sub_band_shape[0] + for shape in sub_band_shape[1:]: + if shape[0] > max_band_shape[0]: max_band_shape[0] = shape[0] + if shape[1] > max_band_shape[1]: max_band_shape[1] = shape[1] + + # print "max_band_shape = ", max_band_shape + # for sub_band in bands_to_pool: + # print "\tsub_band_shape = ", S_Layer_input.band_shape[sub_band] + # print "\tinput band shape = ", s_output[sub_band].get_shape() + + #resize all inputs to highest resolution so that we can maxpool over equivalent scales + resize_ops = [] + for sub_band in bands_to_pool: + op = s_output[sub_band] + # resize_ops += [tf.image.resize_images(op,max_band_shape[0],max_band_shape[1],method=ResizeMethod.NEAREST_NEIGHBOR)] + resize_ops += [tf.image.resize_nearest_neighbor(op,max_band_shape)] + #print "\tresize op shape = ", resize_ops[-1].get_shape() + + #take the maximum for each input channel, element-wise + max_channel_op = resize_ops[0] + for op in resize_ops[1:]: + max_channel_op = tf.maximum(op,max_channel_op) + + #print "\tmax channel op shape = ", max_channel_op.get_shape() + + # new shape for mode 'SAME' + # new_band_shape = (max_band_shape[0]/sample_step, max_band_shape[1]/sample_step) + new_band_shape = np.ceil(np.array(max_band_shape)/float(sample_step)).astype(np.int64) + + # make sure the grid_size and sample_step aren't bigger than the image + if max_band_shape[0] < grid_size: + y_size = max_band_shape[0] + else: + y_size = grid_size + + if max_band_shape[1] < grid_size: + x_size = max_band_shape[1] + else: + x_size = grid_size + + if sample_step > max_band_shape[0]: + y_step = max_band_shape[0] + new_band_shape = (1,new_band_shape[1]) + else: + y_step = sample_step + if sample_step > max_band_shape[1]: + x_step = max_band_shape[1] + new_band_shape = (new_band_shape[0],1) + else: + x_step = sample_step + + # max pool + max_pool_op = tf.nn.max_pool(max_channel_op,[1,y_size,x_size,1],strides=[1,y_step,x_step,1],padding='SAME') + + self.band_shape[b] = new_band_shape + #print "max_band_shape: ", max_band_shape + + self.band_output[b]=max_pool_op + + self.num_units = 0 + for b in self.band_shape: + self.num_units += np.prod(self.band_shape[b])*self.K + + self.output = self.band_output + + def __repr__(self): + return "C_Layer" + + def compute_output(self,X,band): + return self.tf_sess.run(self.output[band],feed_dict={self.input:X}) + + # def get_compute_ops(self): + # + # node_table = pd.DataFrame(columns=['node','band']) + # compute_list = [] + # + # for band in self.band_output: + # node_table = node_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + # + # compute_list.append(self.output[band]) + # + # return node_table, compute_list + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + + for i, row in unit_table.iterrows(): + + if 'y' in unit_table: + node, band, y, x = row['node'], int(row['band']), int(row['y']), int(row['x']) + compute_list.append(self.output[band][:,y,x,:]) + + elif 'band' in unit_table: + node, band = row['node'], int(row['band']) + compute_list.append(self.output[band]) + + else: + return self.get_all_compute_ops() + + else: + return self.get_all_compute_ops() + + return unit_table, compute_list + + def get_all_compute_ops(self): + + compute_list = [] + unit_table = pd.DataFrame(columns=['node','band']) + for band in self.band_output: + unit_table = unit_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + + compute_list.append(self.output[band]) + + return unit_table, compute_list + + +def test_C1_Layer(): + + from S1_Layer import S1_Layer + import matplotlib.pyplot as plt + + fig_dir = 'Figures' + # First we need an S1 Layer + # these parameters are taken from Serre, et al PNAS for HMAX + freq_channel_params = [ [7,2.8,3.5], + [9,3.6,4.6], + [11,4.5,5.6], + [13,5.4,6.8], + [15,6.3,7.9], + [17,7.3,9.1], + [19,8.2,10.3], + [21,9.2,11.5], + [23,10.2,12.7], + [25,11.3,14.1], + [27,12.3,15.4], + [29,13.4,16.8], + [31,14.6,18.2], + [33,15.8,19.7], + [35,17.0,21.2], + [37,18.2,22.8], + [39,19.5,24.4]] + + orientations = np.arange(4)*np.pi/4 + + input_shape = (128,192) + s1 = S1_Layer(input_shape,freq_channel_params,orientations) + + # Now we need to define a C1 Layer + bands = [ [[0,1], 8, 3], + [[2,3], 10, 5], + [[4,5], 12, 7], + [[6,7], 14, 8], + [[8,9], 16, 10], + [[10,11], 18, 12], + [[12,13], 20, 13], + [[14,15,16], 22, 15]] + + c1 = C_Layer(s1,bands) + + # Test c1 on an image + from isee_engine.mintnet.Image_Library import Image_Library + + image_dir = '/Users/michaelbu/Code/HCOMP/SampleImages' + + im_lib = Image_Library(image_dir) + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + print(image_data.shape) + + fig, ax = plt.subplots(len(bands),len(orientations)*2) + result = {} + for b in range(len(bands)): + result[b] = c1.compute_output(image_data,b) + print(result[b].shape) + n, y,x,K = result[b].shape + + for k in range(K): + #print result[b][i].shape + # y = i/8 + # x = i%8 + # ax[y,x].imshow(result[b][0,i],interpolation='nearest',cmap='gray') + # ax[y,x].axis('off') + + ax[b,k].imshow(result[b][0,:,:,k],interpolation='nearest',cmap='gray') + ax[b,k].axis('off') + + fig.savefig(os.path.join(fig_dir,'c1_layer.tiff')) + plt.show() + +if __name__=='__main__': + + test_C1_Layer() diff --git a/bmtk-vb/bmtk/simulator/mintnet/hmax/Readout_Layer.py b/bmtk-vb/bmtk/simulator/mintnet/hmax/Readout_Layer.py new file mode 100644 index 0000000..9126ea1 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/hmax/Readout_Layer.py @@ -0,0 +1,243 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +from bmtk.simulator.mintnet.Image_Library_Supervised import Image_Library_Supervised +import h5py + +class Readout_Layer (object): + + def __init__(self,node_name,input_layer,K,lam,alt_image_dir='',file_name=None): + + self.node_name = node_name + self.K = K + self.input_layer = input_layer + self.weight_file = file_name + self.lam = lam + + self.alt_image_dir = alt_image_dir + + if file_name==None: + new_weights=True + self.train_state = False + else: + + weight_h5 = h5py.File(self.weight_file,'a') + file_open=True + + if self.node_name in weight_h5.keys(): + + new_weights = False + weight_data = weight_h5[self.node_name]['weights'].value + self.train_state = weight_h5[self.node_name]['train_state'].value + + else: + + new_weights = True + self.train_state =False + weight_h5.create_group(self.node_name) + weight_h5[self.node_name]['train_state']=self.train_state + + self.input = self.input_layer.input + #self.tf_sess = self.input_layer.tf_sess + self.tf_sess = tf.Session() + + self.w_shape = (self.input_layer.K,self.K) + + if new_weights: + #weights=1.0*np.ones(self.w_shape).astype(np.float32) + weights=100000*np.random.normal(size=self.w_shape).astype(np.float32) + if file_name!=None: + weight_h5[self.node_name].create_dataset('weights',shape=weights.shape,dtype=np.float32,compression='gzip',compression_opts=9) + weight_h5[self.node_name]['weights'][...]=weights + else: + weights=weight_data + + self.weights = tf.Variable(weights.astype(np.float32),trainable=True,name='weights') + self.weights.initializer.run(session=self.tf_sess) + self.bias = tf.Variable(np.zeros(self.K,dtype=np.float32),trainable=True,name='bias') + self.bias.initializer.run(session=self.tf_sess) + + # sigmoid doesn't seem to work well, and is slow + #self.output = tf.sigmoid(tf.matmul(self.input_layer.output,W)+self.bias) + + self.input_placeholder = tf.placeholder(tf.float32,shape=(None,self.input_layer.K)) + #self.output = tf.nn.softmax(tf.matmul(self.input_placeholder,self.weights) + self.bias) + self.linear = tf.matmul(self.input_placeholder,self.weights) #+ self.bias + + self.output = tf.sign(self.linear) + #self.output = tf.nn.softmax(self.linear) + #self.output = tf.nn.softmax(tf.matmul(self.input_layer.output,self.weights) + self.bias) + + self.y = tf.placeholder(tf.float32,shape=(None,self.K)) + + + #self.cost = -tf.reduce_mean(self.y*tf.log(self.output)) + self.cost = tf.reduce_mean((self.y - self.output)**2) + self.lam*(tf.reduce_sum(self.weights))**2 + + # not gonna do much with current cost function :) + self.train_step = tf.train.GradientDescentOptimizer(0.1).minimize(self.cost) + + self.num_units = self.K + + if file_open: + weight_h5.close() + + def compute_output(self,X): + + #return self.tf_sess.run(self.output,feed_dict={self.input:X}) + + rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:X}) + + return self.tf_sess.run(self.output,feed_dict={self.input_placeholder:rep}) + + def predict(self,X): + + y_vals = self.compute_output(X) + + return np.argmax(y_vals,axis=1) + + def train(self,image_dir,batch_size=10,image_shape=(256,256),max_iter=200): + + print("Training") + + im_lib = Image_Library_Supervised(image_dir,new_size=image_shape) + + # let's use the linear regression version for now + training_lib_size = 225 + y_vals, image_data = im_lib(training_lib_size,sequential=True) + + y_vals = y_vals.T[0].T + y_vals = 2*y_vals - 1.0 + + print(y_vals) + # print y_vals + # print image_data.shape + + # import matplotlib.pyplot as plt + # plt.imshow(image_data[0,:,:,0]) + # plt.figure() + # plt.imshow(image_data[1,:,:,0]) + # plt.figure() + # plt.imshow(image_data[9,:,:,0]) + + # plt.show() + + num_batches = int(np.ceil(2*training_lib_size/float(batch_size))) + rep_list = [] + for i in range(num_batches): + print(i) + # if i==num_batches-1: + # rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data[i*batch_size:i*batch_size + training_lib_size%batch_size]}) + # else: + rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data[i*batch_size:(i+1)*batch_size]}) + rep_list += [rep] + + rep = np.vstack(rep_list) + + + C = np.dot(rep.T,rep) + self.lam*np.eye(self.input_layer.K) + W = np.dot(np.linalg.inv(C),np.dot(rep.T,y_vals)).astype(np.float32) + + self.tf_sess.run(self.weights.assign(tf.expand_dims(W,1))) + + train_result = self.tf_sess.run(self.output,feed_dict={self.input_placeholder:rep}) + + print(W) + print(train_result.flatten()) + print(y_vals.flatten()) + #print (train_result.flatten() - y_vals.flatten()) + print("train error = ", np.mean((train_result.flatten() != y_vals.flatten()))) + + from scipy.stats import norm + target_mask = y_vals==1 + dist_mask = np.logical_not(target_mask) + hit_rate = np.mean(train_result.flatten()[target_mask] == y_vals.flatten()[target_mask]) + false_alarm = np.mean(train_result.flatten()[dist_mask] != y_vals.flatten()[dist_mask]) + dprime = norm.ppf(hit_rate) - norm.ppf(false_alarm) + print("dprime = ", dprime) + + # Test error + im_lib = Image_Library_Supervised('/Users/michaelbu/Data/SerreOlivaPoggioPNAS07/Train_Test_Set/Test',new_size=image_shape) + + testing_lib_size = 300 + y_vals_test, image_data_test = im_lib(testing_lib_size,sequential=True) + + y_vals_test = y_vals_test.T[0].T + y_vals_test = 2*y_vals_test - 1.0 + + num_batches = int(np.ceil(2*testing_lib_size/float(batch_size))) + rep_list = [] + for i in range(num_batches): + print(i) + # if i==num_batches-1: + # rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data[i*batch_size:i*batch_size + training_lib_size%batch_size]}) + # else: + rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data_test[i*batch_size:(i+1)*batch_size]}) + rep_list += [rep] + + rep_test = np.vstack(rep_list) + + test_result = self.tf_sess.run(self.output,feed_dict={self.input_placeholder:rep_test}) + + #print test_result + print("test error = ", np.mean((test_result.flatten() != y_vals_test.flatten()))) + target_mask = y_vals_test==1 + dist_mask = np.logical_not(target_mask) + hit_rate = np.mean(test_result.flatten()[target_mask] == y_vals_test.flatten()[target_mask]) + false_alarm = np.mean(test_result.flatten()[dist_mask] != y_vals_test.flatten()[dist_mask]) + dprime = norm.ppf(hit_rate) - norm.ppf(false_alarm) + print("dprime = ", dprime) + + print(rep_test.shape) + + + # logistic regression unit + # import time + # for n in range(max_iter): + # start = time.time() + # print "\tIteration ", n + + # y_vals, image_data = im_lib(batch_size,sequential=True) + + # print "\tComputing representation" + # rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data}) + + # print "\tGradient descent step" + # #print "rep shape = ", rep.shape + # self.tf_sess.run(self.train_step,feed_dict={self.input_placeholder:rep,self.y:y_vals}) + + + # #self.tf_sess.run(self.train_step,feed_dict={self.input:image_data,self.y:y_vals}) + + # #print "\t\ttraining batch cost = ", self.tf_sess.run(self.cost,feed_dict={self.input:image_data,self.y:y_vals}) + + # print "\t\tTraining error = ", np.mean(np.abs(np.argmax(y_vals,axis=1) - self.predict(image_data))) + # print y_vals + # print + # print self.predict(image_data) + # print "\t\ttraining batch cost = ", self.tf_sess.run(self.cost,feed_dict={self.input_placeholder:rep,self.y:y_vals}) + # print "\t\ttraining linear model = ", self.tf_sess.run(self.linear,feed_dict={self.input_placeholder:rep,self.y:y_vals}) + + # print "\t\ttotal time = ", time.time() - start + diff --git a/bmtk-vb/bmtk/simulator/mintnet/hmax/S1_Layer.py b/bmtk-vb/bmtk/simulator/mintnet/hmax/S1_Layer.py new file mode 100644 index 0000000..44bed67 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/hmax/S1_Layer.py @@ -0,0 +1,273 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +import os +import pandas as pd + +def gabor(X,Y,lamb,sigma,theta,gamma,phase): + + X_hat = X*np.cos(theta) + Y*np.sin(theta) + Y_hat = -X*np.sin(theta) + Y*np.cos(theta) + + arg1 = (0.5/sigma**2)*(X_hat**2 + (gamma**2)*Y_hat**2) + arg2 = (2.0*np.pi/lamb)*X_hat + + return np.exp(-arg1)*np.cos(arg2 + phase) + +class S1_Layer (object): + def __init__(self,node_name,input_shape,freq_channel_params,orientations): #,num_cores=8): + ''' + freq_channel_params is a dictionary of features for each S1 channel + len(freq_channel_params) ==num_bands freq_channel_params[i] = [pixels,sigma,lambda,stride] + orientations is a list of angles in radians for each filter + ''' + #self.tf_sess = tf.Session() + + self.node_name = node_name +# NUM_CORES = num_cores # Choose how many cores to use. +# NUM_CORES = 1 +# self.tf_sess = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=NUM_CORES, +# intra_op_parallelism_threads=NUM_CORES)) + self.tf_sess = tf.Session() +# print "Warning: Using hard-coded number of CPU Cores. This should be changed to auto-configure when TensorFlow has been updated." + + self.input_shape = (None,input_shape[0],input_shape[1],1) + self.input = tf.placeholder(tf.float32,shape=self.input_shape,name="input") + + #phases = np.array([0, np.pi/2]) + phases = np.array([0.0]) # HMAX uses dense tiling in lieu of phases (make this explicit later) + + num_bands = len(freq_channel_params) + num_orientations = len(orientations) + num_phases = len(phases) + self.K = num_orientations*num_phases #number of features per band + + #n_output = num_frequency_channels*num_orientations*num_phases + + n_input = 1 + + self.band_filters = {} + self.filter_params = {} + self.band_output = {} + self.output = self.band_output + self.band_shape = {} + + with tf.name_scope(self.node_name): + for band in range(num_bands): + pixels, sigma, lamb, stride = freq_channel_params[band] + self.band_shape[band] = input_shape + + w_shape = np.array([pixels,pixels,n_input,self.K]) + + W = np.zeros(w_shape,dtype=np.float32) + + #compute w values from parameters + gamma = 0.3 # value taken from Serre et al giant HMAX manuscript from 2005 + X,Y = np.meshgrid(np.arange(pixels),np.arange(pixels)) + X = X - pixels/2 + Y = Y - pixels/2 + + #self.filter_params[band] = freq_channel_params[band] + self.filter_params[band] = {'pixels':pixels,'sigma':sigma,'lambda':lamb, 'stride':stride} #should I add orientations and phases to this? + + for i in range(self.K): + + ori_i = i%num_orientations + phase_i = i/num_orientations + + theta = orientations[ori_i] + phase = phases[phase_i] + + zero_mask = np.zeros([pixels,pixels],dtype='bool') + zero_mask = (X*X + Y*Y > pixels*pixels/4) + + W[:,:,0,i] = gabor(X,Y,lamb,sigma,theta,gamma,phase) + W[:,:,0,i][zero_mask] = 0.0 + W[:,:,0,i] = W[:,:,0,i]/np.sqrt(np.sum(W[:,:,0,i]**2)) + + W = tf.Variable(W,trainable=False,name='W_'+str(band)) + W.initializer.run(session=self.tf_sess) + + self.band_filters[band] = W + + input_norm = tf.reshape(tf.reduce_sum(self.input*self.input,[1,2,3]),[-1,1,1,1]) + normalized_input = tf.div(self.input,tf.sqrt(input_norm)) + self.band_output[band] = tf.nn.conv2d(normalized_input,W,strides=[1,stride,stride,1],padding='SAME') + self.band_shape[band] = tuple([int(x) for x in self.band_output[band].get_shape()[1:3]]) + + + self.num_units = 0 + for b in self.band_shape: + self.num_units += np.prod(self.band_shape[band])*self.K + + def __del__(self): + self.tf_sess.close() + + def __repr__(self): + return "S1_Layer" + + def compute_output(self,X,band): + + return self.tf_sess.run(self.output[band],feed_dict={self.input:X}) + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + + for i, row in unit_table.iterrows(): + + if 'y' in unit_table: + node, band, y, x = row['node'], int(row['band']), int(row['y']), int(row['x']) + compute_list.append(self.output[band][:,y,x,:]) + + elif 'band' in unit_table: + node, band = row['node'], int(row['band']) + compute_list.append(self.output[band]) + + else: + return self.get_all_compute_ops() + + else: + return self.get_all_compute_ops() + + return unit_table, compute_list + + def get_all_compute_ops(self): + + compute_list = [] + unit_table = pd.DataFrame(columns=['node','band']) + for band in self.band_output: + unit_table = unit_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + + compute_list.append(self.output[band]) + + return unit_table, compute_list + +def S1_Layer_test(): + + import matplotlib.pyplot as plt + + fig_dir = 'Figures' + + # these parameters are taken from Serre, et al PNAS for HMAX + freq_channel_params = [ [7,2.8,3.5], + [9,3.6,4.6], + [11,4.5,5.6], + [13,5.4,6.8], + [15,6.3,7.9], + [17,7.3,9.1], + [19,8.2,10.3], + [21,9.2,11.5], + [23,10.2,12.7], + [25,11.3,14.1], + [27,12.3,15.4], + [29,13.4,16.8], + [31,14.6,18.2], + [33,15.8,19.7], + [35,17.0,21.2], + [37,18.2,22.8], + [39,19.5,24.4]] + + orientations = np.arange(4)*np.pi/4 + + input_shape = (128,192) + s1 = S1_Layer(input_shape,freq_channel_params,orientations) + + #plot filters, make sure they are correct + fig, ax = plt.subplots(len(orientations),len(freq_channel_params)) + fig2,ax2 = plt.subplots(len(orientations),len(freq_channel_params)) + for i,theta in enumerate(orientations): + for j,params in enumerate(freq_channel_params): + + #index = j*len(orientations)*2 + i*2 + + fil = s1.tf_sess.run(s1.band_filters[j])[:,:,0,i] + + ax[i,j].imshow(fil,interpolation='nearest',cmap='gray') + ax[i,j].axis('off') + + fil = s1.tf_sess.run(s1.band_filters[j])[:,:,0,i+4] + + ax2[i,j].imshow(fil,interpolation='nearest',cmap='gray') + ax2[i,j].axis('off') + + + from Image_Library import Image_Library + + image_dir = '/Users/michaelbu/Code/HCOMP/SampleImages' + + im_lib = Image_Library(image_dir) + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + import timeit + #print timeit.timeit('result = s1.compute_output(image_data)','from __main__ import s1',number=10) + + def f(): + for band in range(len(freq_channel_params)): + s1.compute_output(image_data,band) + + number = 10 + runs = timeit.Timer(f).repeat(repeat=10,number=number) + print("Average time (s) for output evaluation for ", number, " runs: ", np.mean(runs)/number, '+/-', np.std(runs)/np.sqrt(number)) + + + + print("Image shape = ", image_data.shape) + + + fig_r, ax_r = plt.subplots(len(orientations),len(freq_channel_params)) + fig_r2,ax_r2 = plt.subplots(len(orientations),len(freq_channel_params)) + + for j,params in enumerate(freq_channel_params): + + result = s1.compute_output(image_data,j) + print("result shape = ", result.shape) + + for i,theta in enumerate(orientations): + + #fil = np.zeros([39,39]) + #index = j*len(orientations)*2 + i*2 + #print s1.params[0] + + ax_r[i,j].imshow(result[0,:,:,i],interpolation='nearest',cmap='gray') + ax_r[i,j].axis('off') + + ax_r2[i,j].imshow(result[0,:,:,i+4],interpolation='nearest',cmap='gray') + ax_r2[i,j].axis('off') + + fig_r.savefig(os.path.join(fig_dir,'s1_layer_0.tiff')) + fig_r2.savefig(os.path.join(fig_dir,'s1_layer_1.tiff')) + plt.show() + + #sess.close() + +if __name__=='__main__': + + S1_Layer_test() diff --git a/bmtk-vb/bmtk/simulator/mintnet/hmax/S_Layer.py b/bmtk-vb/bmtk/simulator/mintnet/hmax/S_Layer.py new file mode 100644 index 0000000..df10f08 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/hmax/S_Layer.py @@ -0,0 +1,404 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +from bmtk.simulator.mintnet.Image_Library import Image_Library +import os +import h5py +import pandas as pd + +class S_Layer (object): + def __init__(self, node_name, C_Layer_input, grid_size, pool_size, K, file_name=None, randomize=False): + self.node_name = node_name + + self.input = C_Layer_input.input + + self.tf_sess = C_Layer_input.tf_sess + #self.input_layer = C_Layer_input + # c_output should be a dictionary indexed over bands + + c_output = C_Layer_input.output + self.C_Layer_input = C_Layer_input + + self.K = K + self.input_K = C_Layer_input.K + self.grid_size = grid_size + self.pool_size = pool_size + + self.band_output = {} + #self.band_filters = {} + self.band_shape = C_Layer_input.band_shape + #print self.band_shape + + file_open = False + if file_name==None: + self.train_state=False + new_weights = True + else: + + self.weight_file = file_name + + weight_h5 = h5py.File(self.weight_file, 'a') + file_open = True + + if self.node_name in weight_h5.keys(): + + new_weights=False + weight_data = weight_h5[self.node_name]['weights'] + self.train_state = weight_h5[self.node_name]['train_state'].value + + else: + + new_weights=True + self.train_state = False + weight_h5.create_group(self.node_name) + #weight_h5[self.node_name].create_group('weights') + weight_h5[self.node_name]['train_state']=self.train_state + + + + # perform checks to make sure weight_file is consistent with the Layer parameters + # check input bands + # check grid_size, pool_size, K + + with tf.name_scope(self.node_name): + #for band in c_output.keys(): + + if new_weights: + + # if self.grid_size >= self.band_shape[band][0]: + # size_y = self.band_shape[band][0] + # else: + # size_y = grid_size + # if self.grid_size >= self.band_shape[band][1]: + # size_x = self.band_shape[band][1] + # else: + # size_x = grid_size + + w_shape = np.array([self.grid_size,self.grid_size,self.input_K,self.K]) + + self.w_shape = w_shape + + w_bound = np.sqrt(np.prod(w_shape[1:])) + if randomize: + W = np.random.uniform(low= -1.0/w_bound, high=1.0/w_bound, size=w_shape).astype(np.float32) + else: + W = np.zeros(w_shape).astype(np.float32) + + if file_name!=None: + weight_h5[self.node_name].create_dataset('weights',shape=w_shape,dtype=np.float32) + + else: + # Need to check that c_output.keys() has the same set of keys that weight_dict is expecting + W = weight_data.value + self.w_shape = W.shape + + + + + W = tf.Variable(W,trainable=False,name='W') + W.initializer.run(session=self.tf_sess) + + #self.band_filters[band]= W + self.weights = W + + for band in c_output.keys(): + W_slice = W[:self.band_shape[band][0],:self.band_shape[band][1]] + + input_norm = tf.expand_dims(tf.reduce_sum(c_output[band]*c_output[band],[1,2]),1) #,[-1,1,1,self.input_K]) + input_norm = tf.expand_dims(input_norm,1) + normalized_input = tf.div(c_output[band],tf.maximum(tf.sqrt(input_norm),1e-12)) + self.band_output[band] = tf.nn.conv2d(normalized_input,W_slice,strides=[1,1,1,1],padding='SAME') + + self.output = self.band_output + + self.num_units = 0 + for b in self.band_shape: + self.num_units += np.prod(self.band_shape[b])*self.K + + if file_open: + weight_h5.close() + + def __repr__(self): + return "S_Layer" + + def compute_output(self,X,band): + + return self.tf_sess.run(self.output[band],feed_dict={self.input:X}) + + def find_band_and_coords_for_imprinting_unit(self, imprinting_unit_index): + + cumulative_units = 0 + for band in self.C_Layer_input.output: + + units_in_next_band = int(np.prod(self.C_Layer_input.output[band].get_shape()[1:3])) + + if imprinting_unit_index < cumulative_units + units_in_next_band: + # found the right band! + yb, xb = self.C_Layer_input.band_shape[band] + + band_index = imprinting_unit_index - cumulative_units + + y = band_index/xb + x = band_index%xb + break + else: + cumulative_units += units_in_next_band + + return band, y, x + + + + def get_total_pixels_in_C_Layer_input(self): + + total = 0 + + band_shape = self.C_Layer_input.band_shape + band_ids = band_shape.keys() + band_ids.sort() + + for band in band_ids: + total += np.prod(band_shape[band]) + + return total + + + def get_patch_bounding_box_and_shift(self,band,y,x): + y_lower = y - self.grid_size/2 + y_upper = y_lower + self.grid_size + + x_lower = x - self.grid_size/2 + x_upper = x_lower + self.grid_size + + yb, xb = self.C_Layer_input.band_shape[band] + + # compute shifts in lower bound to deal with overlap with the edges + y_shift_lower = np.max([-y_lower,0]) + x_shift_lower = np.max([-x_lower,0]) + + + y_lower = np.max([y_lower,0]) + y_upper = np.min([y_upper,yb]) + + x_lower = np.max([x_lower,0]) + x_upper = np.min([x_upper,xb]) + + y_shift_upper = y_shift_lower + y_upper - y_lower + x_shift_upper = x_shift_lower + x_upper - x_lower + + return y_lower, y_upper, x_lower, x_upper, y_shift_lower, y_shift_upper, x_shift_lower, x_shift_upper + + def train(self,image_dir,batch_size=100,image_shape=(256,256)): #,save_file='weights.pkl'): + + print("Training") + + im_lib = Image_Library(image_dir,new_size=image_shape) + + new_weights = np.zeros(self.w_shape).astype(np.float32) + + + for k in range(self.K): + + if k%10==0: + print("Imprinting feature ", k) + # how to handle the randomly picked neuron; rejection sampling? + imprinting_unit_index = np.random.randint(self.get_total_pixels_in_C_Layer_input()) + + #print "Imprinting unit index ", imprinting_unit_index + band, y, x = self.find_band_and_coords_for_imprinting_unit(imprinting_unit_index) + #print "Imprinting unit in band ", band, " at ", (y, x) + + im_data = im_lib(1) + + output = self.C_Layer_input.compute_output(im_data,band) + + # grab weights from chosen unit, save them to new_weights + y_lower, y_upper, x_lower, x_upper, y_shift_lower, y_shift_upper, x_shift_lower, x_shift_upper = self.get_patch_bounding_box_and_shift(band,y,x) + + w_patch = output[0,y_lower:y_upper,x_lower:x_upper,:].copy() + + #print "(y_lower, y_upper), (x_lower, x_upper) = ", (y_lower, y_upper), (x_lower, x_upper) + #print "Patch shape = ", w_patch.shape + + patch_size = np.prod(w_patch.shape) + # print "self.w_shape = ", self.w_shape, " patch_size = ", patch_size, " pool_size = ", self.pool_size + # print "band, y, x = ", band,y,x + + pool_size = np.min([self.pool_size,patch_size]) + pool_mask_indices = np.random.choice(np.arange(patch_size), size=pool_size, replace=False) + pool_mask = np.zeros(patch_size,dtype=np.bool) + pool_mask[pool_mask_indices] = True + pool_mask.resize(w_patch.shape) + pool_mask = np.logical_not(pool_mask) # we want a mask for the indices to zero out + + w_patch[pool_mask] = 0.0 + + # will need to enlarge w_patch if the edges got truncated + + new_weights[y_shift_lower:y_shift_upper,x_shift_lower:x_shift_upper,:,k] = w_patch + + + # old code starts here + # num_batches = self.K/batch_size + # if self.K%batch_size!=0: + # num_batches = num_batches+1 + + self.tf_sess.run(self.weights.assign(new_weights)) + print() + print("Saving weights to file in ", self.weight_file) + + weight_h5 = h5py.File(self.weight_file,'a') + #for band in new_weights: + weight_h5[self.node_name]['weights'][...] = new_weights + weight_h5[self.node_name]['train_state'][...]=True + + weight_h5.close() + + # def get_compute_ops(self): + # + # node_table = pd.DataFrame(columns=['node','band']) + # compute_list = [] + # + # for band in self.band_output: + # node_table = node_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + # + # compute_list.append(self.output[band]) + # + # return node_table, compute_list + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + + for i, row in unit_table.iterrows(): + + if 'y' in unit_table: + node, band, y, x = row['node'], int(row['band']), int(row['y']), int(row['x']) + compute_list.append(self.output[band][:,y,x,:]) + + elif 'band' in unit_table: + node, band = row['node'], int(row['band']) + compute_list.append(self.output[band]) + + else: + return self.get_all_compute_ops() + + else: + return self.get_all_compute_ops() + + return unit_table, compute_list + + def get_all_compute_ops(self): + + compute_list = [] + unit_table = pd.DataFrame(columns=['node','band']) + for band in self.band_output: + unit_table = unit_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + + compute_list.append(self.output[band]) + + return unit_table, compute_list + + +def test_S_Layer_ouput(): + + from S1_Layer import S1_Layer + import matplotlib.pyplot as plt + from C_Layer import C_Layer + + fig_dir = 'Figures' + # First we need an S1 Layer + # these parameters are taken from Serre, et al PNAS for HMAX + freq_channel_params = [ [7,2.8,3.5], + [9,3.6,4.6], + [11,4.5,5.6], + [13,5.4,6.8], + [15,6.3,7.9], + [17,7.3,9.1], + [19,8.2,10.3], + [21,9.2,11.5], + [23,10.2,12.7], + [25,11.3,14.1], + [27,12.3,15.4], + [29,13.4,16.8], + [31,14.6,18.2], + [33,15.8,19.7], + [35,17.0,21.2], + [37,18.2,22.8], + [39,19.5,24.4]] + + orientations = np.arange(4)*np.pi/4 + + input_shape = (128,192) + s1 = S1_Layer(input_shape,freq_channel_params,orientations) + + # Now we need to define a C1 Layer + bands = [ [[0,1], 8, 3], + [[2,3], 10, 5], + [[4,5], 12, 7], + [[6,7], 14, 8], + [[8,9], 16, 10], + [[10,11], 18, 12], + [[12,13], 20, 13], + [[14,15,16], 22, 15]] + + c1 = C_Layer(s1,bands) + + grid_size = 3 + pool_size = 10 + K = 10 + + s2 = S_Layer('s2',c1,grid_size,pool_size,K,file_name='S_test_file.h5',randomize=False) + + # Test s2 on an image + image_dir = '/Users/michaelbu/Code/HCOMP/SampleImages' + + im_lib = Image_Library(image_dir,new_size=input_shape) + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + fig,ax = plt.subplots(8,10) + + result = {} + for b in range(len(bands)): + result[b] = s2.compute_output(image_data,b) + + for k in range(K): + ax[b,k].imshow(result[b][0,:,:,k],interpolation='nearest',cmap='gray') + ax[b,k].axis('off') + + fig.savefig(os.path.join(fig_dir,'s2_layer.tiff')) + plt.show() + + s2.train(image_dir,batch_size=10,image_shape=input_shape) #,save_file='test_weights.pkl') + + + + +if __name__=='__main__': + test_S_Layer_ouput() diff --git a/bmtk-vb/bmtk/simulator/mintnet/hmax/Sb_Layer.py b/bmtk-vb/bmtk/simulator/mintnet/hmax/Sb_Layer.py new file mode 100644 index 0000000..4731323 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/hmax/Sb_Layer.py @@ -0,0 +1,242 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +from S_Layer import S_Layer +import pandas as pd + +class Sb_Layer (object): + def __init__(self,node_name,C_Layer_input,grid_size,pool_size,K_per_subband,file_name=None): + '''grid_size is a list, unlike the standard S_Layer, as is file_names''' + + self.node_name = node_name + self.tf_sess = C_Layer_input.tf_sess + + self.input = C_Layer_input.input + + self.num_sublayers = len(grid_size) + self.K = K_per_subband*self.num_sublayers #number of features will be number of sub bands times the K per subband + self.pool_size = pool_size + self.grid_size = grid_size + + c_output = C_Layer_input.output + + self.sublayers = {} + with tf.name_scope(self.node_name): + for i in range(self.num_sublayers): + subnode_name = node_name+'_'+str(i) + self.sublayers[i] = S_Layer(subnode_name,C_Layer_input,grid_size[i],pool_size,K_per_subband,file_name) + + self.band_output = {} + self.band_shape = C_Layer_input.band_shape + + for band in c_output.keys(): + + sub_band_list = [] + for i in range(self.num_sublayers): + sub_band_list += [self.sublayers[i].band_output[band]] + + + + #gather sub_layer outputs and stack them for each band + self.band_output[band] = tf.concat(sub_band_list, 3) + + self.output = self.band_output + + self.num_units = 0 + for b in self.band_shape: + self.num_units += np.prod(self.band_shape[b])*self.K + + def __repr__(self): + return "Sb_Layer" + + def compute_output(self,X,band): + + return self.tf_sess.run(self.output[band],feed_dict={self.input:X}) + + def train(self,image_dir,batch_size=100,image_shape=(256,256)): #,save_file_prefix='weights'): + + for i in range(self.num_sublayers): + #save_file = save_file_prefix + '_'+str(i)+'.pkl' + + #try: + self.sublayers[i].train(image_dir,batch_size,image_shape) #,save_file) + #except Exception as e: + # print i + # raise e + + # def get_compute_ops(self): + # + # node_table = pd.DataFrame(columns=['node','band']) + # compute_list = [] + # + # for band in self.band_output: + # node_table = node_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + # + # compute_list.append(self.output[band]) + # + # return node_table, compute_list + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + + for i, row in unit_table.iterrows(): + + if 'y' in unit_table: + node, band, y, x = row['node'], int(row['band']), int(row['y']), int(row['x']) + compute_list.append(self.output[band][:,y,x,:]) + + elif 'band' in unit_table: + node, band = row['node'], int(row['band']) + compute_list.append(self.output[band]) + + else: + return self.get_all_compute_ops() + + else: + return self.get_all_compute_ops() + + return unit_table, compute_list + + def get_all_compute_ops(self): + + compute_list = [] + unit_table = pd.DataFrame(columns=['node','band']) + for band in self.band_output: + unit_table = unit_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + + compute_list.append(self.output[band]) + + return unit_table, compute_list + + +def test_S2b_Layer(): + + from S1_Layer import S1_Layer + import matplotlib.pyplot as plt + from C_Layer import C_Layer + + fig_dir = 'Figures' + # First we need an S1 Layer + # these parameters are taken from Serre, et al PNAS for HMAX + freq_channel_params = [ [7,2.8,3.5], + [9,3.6,4.6], + [11,4.5,5.6], + [13,5.4,6.8], + [15,6.3,7.9], + [17,7.3,9.1], + [19,8.2,10.3], + [21,9.2,11.5], + [23,10.2,12.7], + [25,11.3,14.1], + [27,12.3,15.4], + [29,13.4,16.8], + [31,14.6,18.2], + [33,15.8,19.7], + [35,17.0,21.2], + [37,18.2,22.8], + [39,19.5,24.4]] + + orientations = np.arange(4)*np.pi/4 + + input_shape = (128,192) + s1 = S1_Layer(input_shape,freq_channel_params,orientations) + + # Now we need to define a C1 Layer + bands = [ [[0,1], 8, 3], + [[2,3], 10, 5], + [[4,5], 12, 7], + [[6,7], 14, 8], + [[8,9], 16, 10], + [[10,11], 18, 12], + [[12,13], 20, 13], + [[14,15,16], 22, 15]] + + c1 = C_Layer(s1,bands) + + print("s1 shape: ", s1.band_shape) + print("c1 shape: ", c1.band_shape) + + grid_size = [6,9,12,15] + pool_size = 10 + K = 10 + + s2b = Sb_Layer(c1,grid_size,pool_size,K) + + print("s2b shape: ", s2b.band_shape) + + c2b_bands = [ [[0,1,2,3,4,5,6,7],40,40]] + + c2b = C_Layer(s2b,c2b_bands) + + + print("c2b shape: ", c2b.band_shape) + #print c2b.band_output.keys() + # Test s2 on an image + from Image_Library import Image_Library + + image_dir = '/Users/michaelbu/Code/HCOMP/SampleImages' + + im_lib = Image_Library(image_dir,new_size=input_shape) + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + fig,ax = plt.subplots(8,10) + + result = {} + for b in range(len(bands)): + result[b] = s2b.compute_output(image_data,b) + + for k in range(K): + ax[b,k].imshow(result[b][0,:,:,k],interpolation='nearest',cmap='gray') + ax[b,k].axis('off') + + fig.savefig(os.path.join(fig_dir,'s2b_layer.tiff')) + + fig,ax = plt.subplots(8,10) + + result = {} + + #only one band for c2b + result[0] = c2b.compute_output(image_data,0) + + for k in range(K): + ax[b,k].imshow(result[0][0,:,:,k],interpolation='nearest',cmap='gray') + ax[b,k].axis('off') + + fig.savefig(os.path.join(fig_dir,'c2b_layer.tiff')) + + + #plt.show() + + s2b.train(image_dir,batch_size=10,image_shape=input_shape,save_file_prefix='test_S2b_weights') + +if __name__=='__main__': + + test_S2b_Layer() diff --git a/bmtk-vb/bmtk/simulator/mintnet/hmax/ViewTunedLayer.py b/bmtk-vb/bmtk/simulator/mintnet/hmax/ViewTunedLayer.py new file mode 100644 index 0000000..1ae95e1 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/hmax/ViewTunedLayer.py @@ -0,0 +1,219 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +from bmtk.simulator.mintnet.Image_Library import Image_Library +#from bmtk.mintnet.Stimulus.NaturalScenes import NaturalScenes +import h5py +import pandas as pd + +class ViewTunedLayer (object): + def __init__(self,node_name,K,alt_image_dir='',*inputs,**keyword_args): + + self.node_name=node_name + + file_name = keyword_args.get('file_name',None) + + self.alt_image_dir = alt_image_dir + + if file_name==None: + print("No filename given. Generating new (random) weights for layer ", node_name) + self.train_state = False + new_weights=True + else: + + self.weight_file = file_name + weight_h5 = h5py.File(self.weight_file,'a') + file_open=True + + if self.node_name in weight_h5.keys(): + + #print "Loading weights for layer ", node_name, " from ", self.weight_file + new_weights = False + weight_data = weight_h5[self.node_name]['weights'].value + self.train_state = weight_h5[self.node_name]['train_state'] + + else: + + new_weights=True + self.train_state=False + weight_h5.create_group(self.node_name) + weight_h5[self.node_name]['train_state']=self.train_state + + self.input = inputs[0].input + self.tf_sess = inputs[0].tf_sess + #should add a check that all inputs have the same value of inputs[i].input + + self.K = K + + concat_list = [] + total_K = 0 + + with tf.name_scope(self.node_name): + for i, node in enumerate(inputs): + + output_i = node.output + + for b in output_i: + shape = node.band_shape[b] + + num_K = np.prod(shape)*node.K + total_K = total_K + num_K + #print "shape = ", shape, " total_K = ", num_K + reshape_op = tf.reshape(output_i[b],[-1,num_K]) + concat_list += [reshape_op] + + self.input_unit_vector = tf.concat(concat_list, 1) #shape [batch_size, total_K] + + self.w_shape = (total_K,K) + #weight = np.random.normal(size=self.w_shape).astype(np.float32) + if new_weights: + weight = np.zeros(self.w_shape).astype(np.float32) + weight_h5[self.node_name].create_dataset('weights',shape=weight.shape,dtype=np.float32,compression='gzip',compression_opts=9) + else: + weight = weight_data #ict['ViewTunedWeight'] + assert weight.shape[0]==total_K, "weights from file are not equal to total input size for layer "+self.node_name + + + self.weights = tf.Variable(weight,trainable=False,name='weights') + self.weights.initializer.run(session=self.tf_sess) + + #print self.input_unit_vector.get_shape(), total_K + #should this be a dictionary for consistency? + #print "input unit vector shape = ", self.input_unit_vector.get_shape() + #print "total_K = ", total_K + + input_norm = tf.expand_dims(tf.reduce_sum(self.input_unit_vector*self.input_unit_vector,[1]),1) #,[-1,total_K]) + normalized_input = tf.div(self.input_unit_vector,tf.sqrt(input_norm)) + self.output = tf.matmul(normalized_input,self.weights) #/0.01 + + # try gaussian tuning curve centered on preferred feature + # self.output = tf.exp(-0.5*tf.reduce_sum(self.weights - self.input_unit_vector)) + + self.num_units = K + + if file_open: + weight_h5.close() + + def __repr__(self): + return "ViewTunedLayer" + + def compute_output(self,X): + + return self.tf_sess.run(self.output,feed_dict={self.input:X}) + + def train(self,image_dir,batch_size=10,image_shape=(256,256)): #,save_file=None): + + print("Training") + + im_lib = Image_Library(image_dir,new_size=image_shape) + + #ns_lib = NaturalScenes.with_new_stimulus_from_folder(image_dir, new_size=image_shape, add_channels=True) + + new_weights = np.zeros(self.w_shape,dtype=np.float32) + + num_batches = self.K/batch_size + + for n in range(num_batches): + #for k in range(self.K): + print("\t\tbatch: ", n, " Total features: ", n*batch_size) + print("\t\t\tImporting images for batch") + image_data = im_lib(batch_size,sequential=True) + print("\t\t\tDone") + + print("\t\t\tComputing responses for batch") + batch_output = self.tf_sess.run(self.input_unit_vector,feed_dict={self.input:image_data}) + new_weights[:,n*batch_size:(n+1)*batch_size] = batch_output.T + + print("\t\t\tDone") + + if self.K%batch_size!=0: + last_batch_size = self.K%batch_size + print("\t\tbatch: ", n+1, " Total features: ", (n+1)*batch_size) + print("\t\t\tImporting images for batch") + image_data = im_lib(last_batch_size,sequential=True) + print("\t\t\tDone") + + print("\t\t\tComputing responses for batch") + batch_output = self.tf_sess.run(self.input_unit_vector,feed_dict={self.input:image_data}) + new_weights[:,-last_batch_size:] = batch_output.T + + new_weights = new_weights/np.sqrt(np.maximum(np.sum(new_weights**2,axis=0),1e-12)) + + self.tf_sess.run(self.weights.assign(new_weights)) + + print("") + print("Saving weights to file ", self.weight_file) + weight_h5 = h5py.File(self.weight_file,'a') + weight_h5[self.node_name]['weights'][...] = new_weights + weight_h5[self.node_name]['train_state'][...] = True + weight_h5.close() + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + for i, row in unit_table.iterrows(): + compute_list = [self.output] + + else: + unit_table = pd.DataFrame([[self.node_name]], columns=['node']) + compute_list = [self.output] + + return unit_table, compute_list + + + +def test_ViewTunedLayer(): + + from hmouse_test import hmouse + + image_dir = '/Users/michaelbu/Code/H-MOUSE/ILSVRC2015/Data/DET/test' + image_shape = (256,256) + weight_file_prefix = 'S2b_weights_500' + + print("Configuring HMAX network") + hm = hmouse('config/nodes.csv','config/node_types.csv') + + for node in hm.nodes: + print(node, " num_units = ", hm.nodes[node].num_units) + + s4 = ViewTunedLayer(10,hm.nodes['c1'],hm.nodes['c2'],hm.nodes['c2b']) #,hm.nodes['c3']) + + im_lib = Image_Library(image_dir,new_size=image_shape) + image_data = im_lib(1) + + print(s4.tf_sess.run(tf.shape(s4.input_unit_vector),feed_dict={s4.input:image_data})) + print(s4.tf_sess.run(tf.shape(s4.weights))) + + print(s4.compute_output(image_data).shape) + + #s4.train(image_dir,batch_size=10,image_shape=image_shape,save_file='s4_test_weights.pkl') + + + + +if __name__=='__main__': + + test_ViewTunedLayer() diff --git a/bmtk-vb/bmtk/simulator/mintnet/hmax/__init__.py b/bmtk-vb/bmtk/simulator/mintnet/hmax/__init__.py new file mode 100644 index 0000000..44200f2 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/hmax/__init__.py @@ -0,0 +1,28 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import S_Layer +import S1_Layer +import Sb_Layer +import C_Layer +import ViewTunedLayer +import hmax diff --git a/bmtk-vb/bmtk/simulator/mintnet/hmax/hmax.py b/bmtk-vb/bmtk/simulator/mintnet/hmax/hmax.py new file mode 100644 index 0000000..c770ec6 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/mintnet/hmax/hmax.py @@ -0,0 +1,432 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import sys +import json +from S1_Layer import S1_Layer +from C_Layer import C_Layer +from S_Layer import S_Layer +from Sb_Layer import Sb_Layer +from ViewTunedLayer import ViewTunedLayer +from Readout_Layer import Readout_Layer +import tensorflow as tf +import os +import h5py +import pandas as pd + +from bmtk.simulator.mintnet.Image_Library import Image_Library +import matplotlib.pyplot as plt + +class hmax (object): + + def __init__(self, configuration, name=None): #,num_cores=8): + self.name = name + + if os.path.isdir(configuration): + # If configuration is a directory look for a config-file inside it. + self.config_file = os.path.join(configuration, 'config_' + configuration + '.json') + if self.name is None: + self.name = os.path.basename(configuration) + + elif os.path.isfile(configuration): + # If configuration is a json file + if self.name is None: + raise Exception("A name is required for configuration parameters") + self.config_file = configuration + + with open(self.config_file,'r') as f: + self.config_data = json.loads(f.read()) + + self.config_dir = os.path.dirname(os.path.abspath(configuration)) + self.train_state_file = self.__get_config_file(self.config_data['train_state_file']) + self.image_dir = self.__get_config_file(self.config_data['image_dir']) + + # Find, and create if necessary, the output directory + if 'output_dir' in self.config_data: + self.output_dir = self.__get_config_file(self.config_data['output_dir']) + else: + self.output_dir = os.path.join(self.config_dir, 'output') + + if not os.path.exists(self.output_dir): + os.makedirs(self.output_dir) + + with open(self.train_state_file, 'r') as f: + self.train_state = json.loads(f.read()) + + if not os.path.exists(self.output_dir): + os.makedirs(self.output_dir) + + # get the nodes + models_file = self.__get_config_file(self.config_data['network']['node_types']) + nodes_file = self.__get_config_file(self.config_data['network']['nodes']) + self.__nodes_table = self.__build_nodes_table(nodes_file, models_file, self.config_data) + + # Read the connections + self.nodes = {} + self.train_order = [] + + edges_file = self.__get_config_file(self.config_data['network']['edges']) + for (node_name, input_node, node_dict) in self.__get_edges(edges_file, self.config_data): + model_class = self.__nodes_table[node_name]['model_id'] + + print("Constructing node: ", node_name) + if model_class=='S1_Layer': + node_type = S1_Layer + freq_channel_params = node_dict['freq_channel_params'] + input_shape = node_dict['input_shape'] + self.input_shape = input_shape + orientations = node_dict['orientations'] + + self.nodes[node_name] = node_type(node_name,input_shape,freq_channel_params,orientations) #,num_cores=num_cores) + #writer = tf.train.SummaryWriter('tmp/hmax', self.nodes['s1'].tf_sess.graph_def) + #merged = tf.merge_all_summaries() + + #writer.add_summary(self.nodes[node_name].tf_sess.run(merged),0) + + elif model_class=='C_Layer': + node_type = C_Layer + bands = node_dict['bands'] + + + self.nodes[node_name] = node_type(node_name,self.nodes[input_node],bands) + #writer = tf.train.SummaryWriter('tmp/hmax', self.nodes['s1'].tf_sess.graph_def) + + elif model_class=='S_Layer': + node_type = S_Layer + K = node_dict['K'] + weight_file = self.__get_config_file(node_dict['weight_file']) if 'weight_file' in node_dict else None + pool_size = node_dict['pool_size'] + grid_size = node_dict['grid_size'] + self.train_order += [node_name] + + self.nodes[node_name] = node_type(node_name, self.nodes[input_node], grid_size, pool_size,K, + file_name=weight_file) + + elif model_class=='Sb_Layer': + node_type = Sb_Layer + K = node_dict['K'] + weight_file = self.__get_config_file(node_dict['weight_file']) if 'weight_file' in node_dict else None + pool_size = node_dict['pool_size'] + grid_size = node_dict['grid_size'] + + self.train_order += [node_name] + + self.nodes[node_name] = node_type(node_name,self.nodes[input_node],grid_size,pool_size,K,file_name=weight_file) + + elif model_class=='ViewTunedLayer': + node_type = ViewTunedLayer + K = node_dict['K'] + input_nodes = node_dict['inputs'] + input_nodes = [self.nodes[node] for node in input_nodes] + weight_file = self.__get_config_file(node_dict['weight_file']) if 'weight_file' in node_dict else None + alt_image_dir = node_dict['alt_image_dir'] + + self.train_order += [node_name] + + #print "alt_image_dir=",alt_image_dir + self.nodes[node_name] = node_type(node_name,K,alt_image_dir,*input_nodes,file_name=weight_file) + + elif model_class=='Readout_Layer': + node_type = Readout_Layer + K = node_dict['K'] + input_nodes = self.nodes[input_node] + weight_file = os.path.join(config_dir,node_dict['weight_file']) + if weight_file=='': weight_file=None + alt_image_dir = node_dict['alt_image_dir'] + lam = node_dict['lam'] + + self.train_order += [node_name] + + self.nodes[node_name] = node_type(node_name,self.nodes[input_node],K,lam,alt_image_dir,file_name=weight_file) + + else: + raise Exception("Unknown model class {}".format(model_class)) + + # print "Done" + # print + + #nfhandle.close() + + + + self.node_names = self.nodes.keys() + + self.input_shape = (self.nodes['s1'].input_shape[1], self.nodes['s1'].input_shape[2]) + + print("Done") + #writer = tf.train.SummaryWriter('tmp/hmax', self.nodes['s1'].tf_sess.graph_def) + + + def __build_nodes_table(self, nodes_csv, models_csv, config): + models_df = pd.read_csv(models_csv, sep=' ') + nodes_df = pd.read_csv(nodes_csv, sep=' ') + nodes_df.set_index('id') + nodes_full = pd.merge(left=nodes_df, right=models_df, on='model_id') + nodes_table = {r['id']: {'model_id': r['model_id'], 'python_object': r['python_object']} + for _, r in nodes_full.iterrows() } + + return nodes_table + + def __get_edges(self, edges_csv, config): + def parse_query(query_str): + if query_str == '*' or query_str == 'None': + return None + elif query_str.startswith('id=='): + return query_str[5:-1] + else: + raise Exception('Unknown query string {}'.format(query_str)) + + # location where config files are located + params_dir = self.__get_config_file(config.get('node_config_dir', '')) + + edges_df = pd.read_csv(edges_csv, sep=' ') + edges = [] + for _, row in edges_df.iterrows(): + # find source and target + source = parse_query(row['source_query']) + target = parse_query(row['target_query']) + + # load the parameters from the file + params_file = os.path.join(params_dir, row['params_file']) + params = json.load(open(params_file, 'r')) + + # Add to list + edges.append((target, source, params)) + + # TODO: check list and reorder to make sure the layers are in a valid order + + # return the edges. Should we use a generator? + return edges + + def __get_config_file(self, fpath): + if os.path.isabs(fpath): + return fpath + else: + return os.path.join(self.config_dir, fpath) + + + + @classmethod + def load(cls, config_dir, name=None): + return cls(config_dir, name) + + def train(self): #,alt_image_dict=None): + + for node in self.train_order: + if not self.train_state.get(node, False): + print("Training Node: ", node) + + if hasattr(self.nodes[node],'alt_image_dir') and self.nodes[node].alt_image_dir!='': + print("\tUsing alternate image directory: ", self.nodes[node].alt_image_dir) # alt_image_dict[node] + self.nodes[node].train(self.nodes[node].alt_image_dir,batch_size=self.config_data['batch_size'],image_shape=self.input_shape) + self.train_state[node]=True + else: + print("\tUsing default image directory: ", self.image_dir) + self.nodes[node].train(self.image_dir,batch_size=self.config_data['batch_size'],image_shape=self.input_shape) + self.train_state[node]=True + + + # if node not in alt_image_dict: + # print "\tUsing default image directory: ", image_dir + # self.nodes[node].train(image_dir,batch_size=self.config_data['batch_size'],image_shape=self.input_shape) + # self.train_state[node]=True + # else: + # print "\tUsing alternate image directory: ", alt_image_dict[node] + # self.nodes[node].train(alt_image_dict[node],batch_size=self.config_data['batch_size'],image_shape=self.input_shape) + # self.train_state[node]=True + + print("Done") + + with open(self.config_data['train_state_file'], 'w') as f: + f.write(json.dumps(self.train_state)) + + + def run_stimulus(self,stimulus, node_table=None, output_file='output'): + '''stimulus is an instance of one of the mintnet.Stimulus objects, i.e. LocallySparseNoise''' + + if output_file[-3:]!=".ic": + output_file = output_file+".ic" # add *.ic suffix if not already there + + stim_template = stimulus.get_image_input(new_size=self.input_shape, add_channels=True) + + print("Creating new output file: ", output_file, " (and removing any previous one)") + if os.path.exists(output_file): + os.remove(output_file) + output_h5 = h5py.File(output_file,'w') + + T, y, x, K = stim_template.shape + all_nodes = self.nodes.keys() + + if node_table is None: # just compute everything and return it all; good luck! + + new_node_table = pd.DataFrame(columns=['node','band']) + + compute_list = [] + for node in all_nodes: + + add_to_node_table, new_compute_list = self.nodes[node].get_compute_ops() + new_node_table = new_node_table.append(add_to_node_table,ignore_index=True) + compute_list += new_compute_list + else: + compute_list = [] + + new_node_table = node_table.sort_values('node') + new_node_table = new_node_table.reindex(np.arange(len(new_node_table))) + + for node in all_nodes: + unit_table = new_node_table[node_table['node']==node] + if (new_node_table['node']==node).any(): + _, new_compute_list = self.nodes[node].get_compute_ops(unit_table=unit_table) + + compute_list += new_compute_list + + + # create datasets in hdf5 file from node_table, with data indexed by table index + for i, row in new_node_table.iterrows(): + + output_shape = tuple([T] + [ int(x) for x in compute_list[i].get_shape()[1:]]) + output_h5.create_dataset(str(i), output_shape, dtype=np.float32) + + + + batch_size = self.config_data['batch_size'] + num_batches = T/batch_size + if T%self.config_data['batch_size']!=0: + num_batches += 1 + + for i in range(num_batches): + sys.stdout.write( '\r{0:.02f}'.format(float(i)*100/num_batches)+'% done') + sys.stdout.flush() + output_list = self.nodes[all_nodes[0]].tf_sess.run(compute_list,feed_dict={self.nodes[all_nodes[0]].input: stim_template[i*batch_size:(i+1)*batch_size]}) + + for io, output in enumerate(output_list): + # dataset_string = node_table['node'].loc[io] + "/" + str(int(node_table['band'].loc[io])) + # output_h5[dataset_string][i*batch_size:(i+1)*batch_size] = output + + output_h5[str(io)][i*batch_size:(i+1)*batch_size] = output + sys.stdout.write( '\r{0:.02f}'.format(float(100))+'% done') + sys.stdout.flush() + + output_h5['stim_template'] = stimulus.stim_template + output_h5.close() + new_node_table.to_hdf(output_file,'node_table') + if hasattr(stimulus,'label_dataframe') and stimulus.label_dataframe is not None: + stimulus.label_dataframe.to_hdf(output_file,'labels') + stimulus.stim_table.to_hdf(output_file,'stim_table') + + + def get_exemplar_node_table(self): + + node_table = pd.DataFrame(columns=['node','band','y','x']) + for node in self.nodes: + node_output = self.nodes[node].output + if hasattr(self.nodes[node],'band_shape'): + for band in node_output: + y,x = [int(x) for x in node_output[band].get_shape()[1:3]] + y /= 2 + x /= 2 + new_row = pd.DataFrame([[self.nodes[node].node_name, band, y, x]], columns=['node','band','y','x']) + node_table = node_table.append(new_row, ignore_index=True) + else: + new_row = pd.DataFrame([[self.nodes[node].node_name]], columns=['node']) + node_table = node_table.append(new_row, ignore_index=True) + + return node_table + + + def generate_output(self): + try: + im_lib = Image_Library(self.image_dir,new_size=self.input_shape) + except OSError as e: + print('''A repository of images (such as a collection from ImageNet - http://www.image-net.org) is required for input. + An example would be too large to include in the isee_engine itself. + Set the path for this image repository in hmax/config_hmax.json''') + raise e + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + fig.savefig(os.path.join(self.output_dir,'input_image')) + plt.close(fig) + + nodes = self.nodes + + for node_to_plot in nodes: + print("Generating output for node ", node_to_plot) + node_output_dir = os.path.join(self.output_dir,node_to_plot) + + if not os.path.exists(node_output_dir): + os.makedirs(node_output_dir) + + if type(self.nodes[node_to_plot])==ViewTunedLayer: + print("ViewTunedLayer") + self.nodes[node_to_plot].compute_output(image_data) + continue + + if type(self.nodes[node_to_plot])==Readout_Layer: + print("Readout_Layer") + self.nodes[node_to_plot].compute_output(image_data) + continue + + num_bands = len(nodes[node_to_plot].output) + + if type(self.nodes[node_to_plot])==S1_Layer or node_to_plot=='c1': + #print "Yes, this is an S1_Layer" + num_filters_to_plot = 4 + fig, ax = plt.subplots(num_filters_to_plot,num_bands,figsize=(20,8)) + #fig2,ax2 = plt.subplots(num_filters_to_plot,num_bands,figsize=(20,8)) + else: + num_filters_to_plot = 8 + fig, ax = plt.subplots(num_filters_to_plot,num_bands,figsize=(20,8)) + + for band in range(num_bands): + result = nodes[node_to_plot].compute_output(image_data,band) + #print result[band].shape + n, y,x,K = result.shape + + for k in range(num_filters_to_plot): + + if num_bands!=1: + ax[k,band].imshow(result[0,:,:,k],interpolation='nearest',cmap='gray') + ax[k,band].axis('off') + else: + ax[k].imshow(result[0,:,:,k],interpolation='nearest',cmap='gray') + ax[k].axis('off') + + # if type(self.nodes[node_to_plot])==S1_Layer: + # for k in range(num_filters_to_plot): + + # ki = 4+k + # ax2[k,band].imshow(result[0,:,:,ki],interpolation='nearest',cmap='gray') + # ax2[k,band].axis('off') + + if type(self.nodes[node_to_plot])==S1_Layer: + fig.savefig(os.path.join(node_output_dir,'output_phase0.pdf')) + #fig2.savefig(os.path.join(node_output_dir,'output_phase1.pdf')) + #plt.close(fig2) + else: + fig.savefig(os.path.join(node_output_dir,'output.pdf')) + + plt.close(fig) diff --git a/bmtk-vb/bmtk/simulator/pointnet/__init__.py b/bmtk-vb/bmtk/simulator/pointnet/__init__.py new file mode 100644 index 0000000..2ad957d --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/__init__.py @@ -0,0 +1,26 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import default_setters +from .config import Config +from .pointnetwork import PointNetwork +from .pointsimulator import PointSimulator \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/pointnet/config.py b/bmtk-vb/bmtk/simulator/pointnet/config.py new file mode 100644 index 0000000..a6644d5 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/config.py @@ -0,0 +1,48 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json + +from bmtk.simulator.core.config import ConfigDict +from bmtk.simulator.pointnet.io_tools import io + + +# TODO: Implement pointnet validator and create json schema for pointnet +def from_json(config_file, validate=False): + conf_dict = ConfigDict.from_json(config_file) + conf_dict.io = io + return conf_dict + +def from_dict(config_file, validate=False): + conf_dict = ConfigDict.from_dict(config_file) + conf_dict.io = io + return conf_dict + +class Config(ConfigDict): + def __init__(self, dict_obj): + super(Config, self).__init__(dict_obj) + self._io = io + + @property + def io(self): + return io \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/pointnet/default_setters/__init__.py b/bmtk-vb/bmtk/simulator/pointnet/default_setters/__init__.py new file mode 100644 index 0000000..b07cc2d --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/default_setters/__init__.py @@ -0,0 +1,2 @@ +from . import synaptic_weights +from . import synapse_models \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/pointnet/default_setters/synapse_models.py b/bmtk-vb/bmtk/simulator/pointnet/default_setters/synapse_models.py new file mode 100644 index 0000000..8e94328 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/default_setters/synapse_models.py @@ -0,0 +1,16 @@ +from bmtk.simulator.pointnet.pyfunction_cache import add_synapse_model + + +def static_synapse(edge): + model_params = { + 'model': 'static_synapse', + 'delay': edge.delay, + 'weight': edge.syn_weight(None, None) + } + + model_params.update(edge.dynamics_params) + return model_params + + +add_synapse_model(static_synapse, 'default', overwrite=False) +add_synapse_model(static_synapse, overwrite=False) \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/pointnet/default_setters/synaptic_weights.py b/bmtk-vb/bmtk/simulator/pointnet/default_setters/synaptic_weights.py new file mode 100644 index 0000000..4c66ae1 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/default_setters/synaptic_weights.py @@ -0,0 +1,8 @@ +from bmtk.simulator.pointnet.pyfunction_cache import add_weight_function + + +def default_weight_fnc(edge_props, source_node, target_node): + return edge_props['syn_weight']*edge_props.nsyns + + +add_weight_function(default_weight_fnc, 'default_weight_fnc', overwrite=False) diff --git a/bmtk-vb/bmtk/simulator/pointnet/io_tools.py b/bmtk-vb/bmtk/simulator/pointnet/io_tools.py new file mode 100644 index 0000000..b5ea9ea --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/io_tools.py @@ -0,0 +1,122 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +""" +Functions for logging, writing and reading from file. + +""" +import nest + +from bmtk.simulator.core.io_tools import IOUtils + +# Want users to be able to use NEST whether or not it is compiled in parallel mode or not, which means checking if +# the method nest.SyncPRocesses (aka MPI Barrier) exists. If it doesn't try getting barrier from mpi4py +rank = nest.Rank() +n_nodes = nest.NumProcesses() +try: + barrier = nest.SyncProcesses +except AttributeError as exc: + try: + from mpi4py import MPI + barrier = MPI.COMM_WORLD.Barrier + except: + # Barrier is just an empty function, no problem if running on one core. + barrier = lambda: None + + +class NestIOUtils(IOUtils): + def __init__(self): + super(NestIOUtils, self).__init__() + self.mpi_rank = rank + self.mpi_size = n_nodes + + def barrier(self): + barrier() + + def quiet_simulator(self): + nest.set_verbosity('M_QUIET') + + def setup_output_dir(self, config_dir, log_file, overwrite=True): + super(NestIOUtils, self).setup_output_dir(config_dir, log_file, overwrite=True) + if n_nodes > 1 and rank == 0: + io.log_info('Running NEST with MPI ({} cores)'.format(n_nodes)) + + +io = NestIOUtils() + + +''' +log_format = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s') +pointnet_logger = logging.getLogger() +pointnet_logger.setLevel(logging.DEBUG) + +console_handler = logging.StreamHandler(sys.stdout) +console_handler.setFormatter(log_format) +pointnet_logger.addHandler(console_handler) + + +def collect_gdf_files(gdf_dir, output_file, nest_id_map, overwrite=False): + + if n_nodes > 0: + # Wait until all nodes are finished + barrier() + + if rank != 0: + return + + log("Saving spikes to file...") + spikes_out = output_file + if os.path.exists(spikes_out) and not overwrite: + return + + gdf_files_globs = '{}/*.gdf'.format(gdf_dir) + gdf_files = glob.glob(gdf_files_globs) + with open(spikes_out, 'w') as spikes_file: + csv_writer = csv.writer(spikes_file, delimiter=' ') + for gdffile in gdf_files: + spikes_df = pd.read_csv(gdffile, names=['gid', 'time', 'nan'], sep='\t') + for _, row in spikes_df.iterrows(): + csv_writer.writerow([row['time'], nest_id_map[int(row['gid'])]]) + os.remove(gdffile) + log("done.") + + +def setup_output_dir(config): + if rank == 0: + try: + output_dir = config['output']['output_dir'] + if os.path.exists(output_dir): + shutil.rmtree(output_dir) + os.makedirs(output_dir) + + if 'log_file' in config['output']: + file_logger = logging.FileHandler(config['output']['log_file']) + file_logger.setFormatter(log_format) + pointnet_logger.addHandler(file_logger) + log('Created a log file') + + except Exception as exc: + print(exc) + + barrier() +''' + diff --git a/bmtk-vb/bmtk/simulator/pointnet/modules/__init__.py b/bmtk-vb/bmtk/simulator/pointnet/modules/__init__.py new file mode 100644 index 0000000..962ea78 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/modules/__init__.py @@ -0,0 +1,2 @@ +from .record_spikes import SpikesMod +from .multimeter_reporter import MultimeterMod \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/pointnet/modules/multimeter_reporter.py b/bmtk-vb/bmtk/simulator/pointnet/modules/multimeter_reporter.py new file mode 100644 index 0000000..12d86ac --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/modules/multimeter_reporter.py @@ -0,0 +1,110 @@ +import os +import glob +import pandas as pd +from bmtk.utils.io.cell_vars import CellVarRecorder +from bmtk.simulator.pointnet.io_tools import io + +import nest + + +try: + MPI_RANK = nest.Rank() + N_HOSTS = nest.NumProcesses() + +except Exception as e: + MPI_RANK = 0 + N_HOSTS = 1 + + +class MultimeterMod(object): + def __init__(self, tmp_dir, file_name, variable_name, cells, tstart=None, tstop=None, interval=None, to_h5=True, + delete_dat=True, **opt_params): + """For recording neuron properties using a NEST multimeter object + + :param tmp_dir: ouput directory + :param file_name: Name of (SONATA hdf5) file that will be saved to + :param variable_name: A list of the variable(s) being recorded. Must be valid according to the cells + :param cells: A node-set or list of gids to record from + :param tstart: Start time of the recording (if None will default to sim.tstart) + :param tstop: Stop time of recording (if None will default to sim.tstop) + :param interval: Recording time step (if None will default to sim.dt) + :param to_h5: True to save to sonata .h5 format (default: True) + :param delete_dat: True to delete the .dat files created by NEST (default True) + :param opt_params: + """ + + self._output_dir = tmp_dir + self._file_name = file_name if os.path.isabs(file_name) else os.path.join(self._output_dir, file_name) + self._variable_name = variable_name + self._node_set = cells + self._tstart = tstart + self._tstop = tstop + self._interval = interval + self._to_h5 = to_h5 + self._delete_dat = delete_dat + + self._gids = None + self._nest_ids = None + self._multimeter = None + + self._min_delay = 1.0 # Required for calculating steps recorded + + self.__output_label = os.path.join(self._output_dir, '__bmtk_nest_{}'.format(os.path.basename(self._file_name))) + self._var_recorder = CellVarRecorder(self._file_name, self._output_dir, self._variable_name, buffer_data=False) + + def initialize(self, sim): + self._gids = list(sim.net.get_node_set(self._node_set).gids()) + self._nest_ids = [sim.net._gid2nestid[gid] for gid in self._gids] + + self._tstart = self._tstart or sim.tstart + self._tstop = self._tstop or sim.tstop + self._interval = self._interval or sim.dt + self._multimeter = nest.Create('multimeter', + params={'interval': self._interval, 'start': self._tstart, 'stop': self._tstop, + 'to_file': True, 'to_memory': False, + 'withtime': True, + 'record_from': self._variable_name, + 'label': self.__output_label}) + + nest.Connect(self._multimeter, self._nest_ids) + + def finalize(self, sim): + io.barrier() # Makes sure all nodes finish, but not sure if actually required by nest + + # min_delay needs to be fetched after simulation otherwise the value will be off. There also seems to be some + # MPI barrier inside GetKernelStatus + self._min_delay = nest.GetKernelStatus('min_delay') + # print self._min_delay + if self._to_h5 and MPI_RANK == 0: + for gid in self._gids: + self._var_recorder.add_cell(gid, sec_list=[0], seg_list=[0.0]) + + # Initialize hdf5 file including preallocated data block of recorded variables + # Unfortantely with NEST the final time-step recorded can't be calculated in advanced, and even with the + # same min/max_delay can be different. We need to read the output-file to get n_steps + def get_var_recorder(node_recording_df): + if not self._var_recorder.is_initialized: + self._var_recorder.tstart = node_recording_df['time'].min() + self._var_recorder.tstop = node_recording_df['time'].max() + self._var_recorder.dt = self._interval + self._var_recorder.initialize(len(node_recording_df)) + + return self._var_recorder + + gid_map = sim.net._nestid2gid + for nest_file in glob.glob('{}*'.format(self.__output_label)): + report_df = pd.read_csv(nest_file, index_col=False, names=['nest_id', 'time']+self._variable_name, + sep='\t') + for grp_id, grp_df in report_df.groupby(by='nest_id'): + gid = gid_map[grp_id] + vr = get_var_recorder(grp_df) + for var_name in self._variable_name: + vr.record_cell_block(gid, var_name, grp_df[var_name]) + + if self._delete_dat: + # remove csv file created by nest + os.remove(nest_file) + + self._var_recorder.close() + + io.barrier() diff --git a/bmtk-vb/bmtk/simulator/pointnet/modules/record_spikes.py b/bmtk-vb/bmtk/simulator/pointnet/modules/record_spikes.py new file mode 100644 index 0000000..9791fdc --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/modules/record_spikes.py @@ -0,0 +1,90 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import glob +from bmtk.utils.io.spike_trains import SpikeTrainWriter +from bmtk.simulator.pointnet.io_tools import io + +import nest + + +MPI_RANK = nest.Rank() +N_HOSTS = nest.NumProcesses() + + +class SpikesMod(object): + """Module use for saving spikes + + """ + + def __init__(self, tmp_dir, spikes_file_csv=None, spikes_file=None, spikes_file_nwb=None, spikes_sort_order=None): + def _get_path(file_name): + # Unless file-name is an absolute path then it should be placed in the $OUTPUT_DIR + if file_name is None: + return None + return file_name if os.path.isabs(file_name) else os.path.join(tmp_dir, file_name) + + self._csv_fname = _get_path(spikes_file_csv) + self._h5_fname = _get_path(spikes_file) + self._nwb_fname = _get_path(spikes_file_nwb) + + self._tmp_dir = tmp_dir + self._tmp_file_base = 'tmp_spike_times' + self._spike_labels = os.path.join(self._tmp_dir, self._tmp_file_base) + + self._spike_writer = SpikeTrainWriter(tmp_dir=tmp_dir, mpi_rank=MPI_RANK, mpi_size=N_HOSTS) + self._spike_writer.delimiter = '\t' + self._spike_writer.gid_col = 0 + self._spike_writer.time_col = 1 + self._sort_order = spikes_sort_order + + self._spike_detector = None + + def initialize(self, sim): + self._spike_detector = nest.Create("spike_detector", 1, {'label': self._spike_labels, 'withtime': True, + 'withgid': True, 'to_file': True}) + + for pop_name, pop in sim._graph._nestid2nodeid_map.items(): + nest.Connect(list(pop.keys()), self._spike_detector) + + def finalize(self, sim): + if MPI_RANK == 0: + for gdf_file in glob.glob(self._spike_labels + '*.gdf'): + self._spike_writer.add_spikes_file(gdf_file) + io.barrier() + + gid_map = sim._graph._nestid2gid + + if self._csv_fname is not None: + self._spike_writer.to_csv(self._csv_fname, sort_order=self._sort_order, gid_map=gid_map) + io.barrier() + + if self._h5_fname is not None: + self._spike_writer.to_hdf5(self._h5_fname, sort_order=self._sort_order, gid_map=gid_map) + io.barrier() + + if self._nwb_fname is not None: + self._spike_writer.to_nwb(self._nwb_fname, sort_order=self._sort_order, gid_map=gid_map) + io.barrier() + + self._spike_writer.close() diff --git a/bmtk-vb/bmtk/simulator/pointnet/pointnetwork.py b/bmtk-vb/bmtk/simulator/pointnet/pointnetwork.py new file mode 100644 index 0000000..0cc781f --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/pointnetwork.py @@ -0,0 +1,176 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import functools +import nest + +from bmtk.simulator.core.simulator_network import SimNetwork +from bmtk.simulator.pointnet.sonata_adaptors import PointNodeAdaptor, PointEdgeAdaptor +from bmtk.simulator.pointnet import pyfunction_cache +from bmtk.simulator.pointnet.io_tools import io + + +class PointNetwork(SimNetwork): + def __init__(self, **properties): + super(PointNetwork, self).__init__(**properties) + self._io = io + + self.__weight_functions = {} + self._params_cache = {} + + self._virtual_ids_map = {} + + self._batch_nodes = True + + self._nest_id_map = {} + self._nestid2nodeid_map = {} + + self._nestid2gid = {} + + self._nodes_table = {} + self._gid2nestid = {} + + @property + def py_function_caches(self): + return pyfunction_cache + + def __get_params(self, node_params): + if node_params.with_dynamics_params: + # TODO: use property, not name + return node_params['dynamics_params'] + + params_file = node_params[self._params_column] + # params_file = self._MT.params_column(node_params) #node_params['dynamics_params'] + if params_file in self._params_cache: + return self._params_cache[params_file] + else: + params_dir = self.get_component('models_dir') + params_path = os.path.join(params_dir, params_file) + params_dict = json.load(open(params_path, 'r')) + self._params_cache[params_file] = params_dict + return params_dict + + def _register_adaptors(self): + super(PointNetwork, self)._register_adaptors() + self._node_adaptors['sonata'] = PointNodeAdaptor + self._edge_adaptors['sonata'] = PointEdgeAdaptor + + # TODO: reimplement with py_modules like in bionet + def add_weight_function(self, function, name=None): + fnc_name = name if name is not None else function.__name__ + self.__weight_functions[fnc_name] = functools.partial(function) + + def set_default_weight_function(self, function): + self.add_weight_function(function, 'default_weight_fnc', overwrite=True) + + def get_weight_function(self, name): + return self.__weight_functions[name] + + def build_nodes(self): + for node_pop in self.node_populations: + nid2nest_map = {} + nest2nid_map = {} + if node_pop.internal_nodes_only: + for node in node_pop.get_nodes(): + node.build() + for nid, gid, nest_id in zip(node.node_ids, node.gids, node.nest_ids): + self._nestid2gid[nest_id] = gid + self._gid2nestid[gid] = nest_id + nid2nest_map[nid] = nest_id + nest2nid_map[nest_id] = nid + + elif node_pop.mixed_nodes: + for node in node_pop.get_nodes(): + if node.model_type != 'virtual': + node.build() + for nid, gid, nest_id in zip(node.node_ids, node.gids, node.nest_ids): + self._nestid2gid[nest_id] = gid + self._gid2nestid[gid] = nest_id + nid2nest_map[nid] = nest_id + nest2nid_map[nest_id] = nid + + self._nest_id_map[node_pop.name] = nid2nest_map + self._nestid2nodeid_map[node_pop.name] = nest2nid_map + + def build_recurrent_edges(self): + recurrent_edge_pops = [ep for ep in self._edge_populations if not ep.virtual_connections] + if not recurrent_edge_pops: + return + + for edge_pop in recurrent_edge_pops: + src_nest_ids = self._nest_id_map[edge_pop.source_nodes] + trg_nest_ids = self._nest_id_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + nest_srcs = [src_nest_ids[nid] for nid in edge.source_node_ids] + nest_trgs = [trg_nest_ids[nid] for nid in edge.target_node_ids] + nest.Connect(nest_srcs, nest_trgs, conn_spec='one_to_one', syn_spec=edge.nest_params) + + def find_edges(self, source_nodes=None, target_nodes=None): + # TODO: Move to parent + selected_edges = self._edge_populations[:] + + if source_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.source_nodes == source_nodes] + + if target_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.target_nodes == target_nodes] + + return selected_edges + + def add_spike_trains(self, spike_trains, node_set): + # Build the virtual nodes + src_nodes = [node_pop for node_pop in self.node_populations if node_pop.name in node_set.population_names()] + for node_pop in src_nodes: + if node_pop.name in self._virtual_ids_map: + continue + + virt_node_map = {} + if node_pop.virtual_nodes_only: + for node in node_pop.get_nodes(): + nest_ids = nest.Create('spike_generator', node.n_nodes, {}) + for node_id, nest_id in zip(node.node_ids, nest_ids): + virt_node_map[node_id] = nest_id + nest.SetStatus([nest_id], {'spike_times': spike_trains.get_spikes(node_id)}) + + elif node_pop.mixed_nodes: + for node in node_pop.get_nodes(): + if node.model_type != 'virtual': + continue + + nest_ids = nest.Create('spike_generator', node.n_nodes, {}) + for node_id, nest_id in zip(node.node_ids, nest_ids): + virt_node_map[node_id] = nest_id + nest.SetStatus([nest_id], {'spike_times': spike_trains.get_spikes(node_id)}) + + self._virtual_ids_map[node_pop.name] = virt_node_map + + # Create virtual synaptic connections + for source_reader in src_nodes: + for edge_pop in self.find_edges(source_nodes=source_reader.name): + src_nest_ids = self._virtual_ids_map[edge_pop.source_nodes] + trg_nest_ids = self._nest_id_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + nest_srcs = [src_nest_ids[nid] for nid in edge.source_node_ids] + nest_trgs = [trg_nest_ids[nid] for nid in edge.target_node_ids] + nest.Connect(nest_srcs, nest_trgs, conn_spec='one_to_one', syn_spec=edge.nest_params) diff --git a/bmtk-vb/bmtk/simulator/pointnet/pointsimulator.py b/bmtk-vb/bmtk/simulator/pointnet/pointsimulator.py new file mode 100644 index 0000000..a434da6 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/pointsimulator.py @@ -0,0 +1,266 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import glob +import nest +from six import string_types +from six import moves + +from bmtk.simulator.core.simulator import Simulator +from bmtk.simulator.pointnet.config import Config +#import bmtk.simulator.pointnet.config as cfg +from bmtk.simulator.pointnet.io_tools import io +import bmtk.simulator.utils.simulation_reports as reports +import bmtk.simulator.utils.simulation_inputs as inputs +from bmtk.utils.io import spike_trains +from . import modules as mods +from bmtk.simulator.core.node_sets import NodeSet + + +class PointSimulator(Simulator): + def __init__(self, graph, dt=0.001, overwrite=True, print_time=False): + self._tstop = 0.0 # simulation time + self._dt = dt # time step + self._output_dir = './output/' # directory where log and temporary output will be stored + self._overwrite = overwrite + self._block_run = False + self._block_size = -1 + + self._cells_built = False + self._internal_connections_built = False + + self._graph = graph + self._external_cells = {} # dict-of-dict of external pointnet cells with keys [network_name][cell_id] + self._internal_cells = {} # dictionary of internal pointnet cells with cell_id as key + self._nest_id_map = {} # a map between NEST IDs and Node-IDs + + self._spikedetector = None + self._spikes_file = None # File where all output spikes will be collected and saved + self._tmp_spikes_file = None # temporary gdf files of spike-trains + self._spike_trains_ds = {} # used to temporary store NWB datasets containing spike trains + + self._spike_detector = None + + self._mods = [] + + self._inputs = {} # Used to hold references to nest input objects (current_generators, etc) + + # Reset the NEST kernel for a new simualtion + # TODO: move this into it's own function and make sure it is called before network is built + nest.ResetKernel() + nest.SetKernelStatus({"resolution": self._dt, "overwrite_files": self._overwrite, "print_time": print_time}) + + @property + def tstart(self): + return 0.0 + + @property + def dt(self): + return self._dt + + @property + def tstop(self): + return self._tstop + + @tstop.setter + def tstop(self, val): + self._tstop = val + + @property + def n_steps(self): + return long((self.tstop-self.tstart)/self.dt) + + @property + def net(self): + return self._graph + + @property + def gid_map(self): + return self._graph._nestid2gid + + def _get_block_trial(self, duration): + """ + Compute necessary number of block trials, the length of block simulation and the simulation length of the last + block run, if necessary. + """ + if self._block_run: + data_res = self._block_size * self._dt + fn = duration / data_res + n = int(fn) + res = fn - n + else: + n = -1 + res = -1 + data_res = -1 + return n, res, data_res + + ''' + def set_spikes_recordings(self): + # TODO: Pass in output-dir and file name to save to + # TODO: Allow for sorting - overwrite bionet module + self._spike_detector = nest.Create("spike_detector", 1, {'label': os.path.join(self.output_dir, 'tmp_spike_times'), + 'withtime': True, 'withgid': True, 'to_file': True}) + # print self._spike_detector + + for pop_name, pop in self._graph._nestid2nodeid_map.items(): + # print pop.keys() + + nest.Connect(pop.keys(), self._spike_detector) + # exit() + ''' + + def add_step_currents(self, amp_times, amp_values, node_set, input_name): + scg = nest.Create("step_current_generator", + params={'amplitude_times': amp_times, 'amplitude_values': amp_values}) + + if not isinstance(node_set, NodeSet): + node_set = self.net.get_node_set(node_set) + + # Convert node set into list of gids and then look-up the nest-ids + nest_ids = [self.net._gid2nestid[gid] for gid in node_set.gids()] + + # Attach current clamp to nodes + nest.Connect(scg, nest_ids, syn_spec={'delay': self.dt}) + + self._inputs[input_name] = nest_ids + + def run(self, tstop=None): + if tstop is None: + tstop = self._tstop + + for mod in self._mods: + mod.initialize(self) + + io.barrier() + + io.log_info('Starting Simulation') + n, res, data_res = self._get_block_trial(tstop) + if n > 0: + for r in moves.range(n): + nest.Simulate(data_res) + if res > 0: + nest.Simulate(res * self.dt) + if n < 0: + nest.Simulate(tstop) + + io.barrier() + io.log_info('Simulation finished, finalizing results.') + for mod in self._mods: + mod.finalize(self) + io.barrier() + io.log_info('Done.') + + def add_mod(self, mod): + self._mods.append(mod) + + @classmethod + def from_config(cls, configure, graph): + # load the json file or object + if isinstance(configure, string_types): + config = Config.from_json(configure, validate=True) + elif isinstance(configure, dict): + config = configure + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(configure, type(configure))) + + if 'run' not in config: + raise Exception('Json file is missing "run" entry. Unable to build Bionetwork.') + run_dict = config['run'] + + # Get network parameters + # step time (dt) is set in the kernel and should be passed + overwrite = run_dict['overwrite_output_dir'] if 'overwrite_output_dir' in run_dict else True + print_time = run_dict['print_time'] if 'print_time' in run_dict else False + dt = run_dict['dt'] # TODO: make sure dt exists + network = cls(graph, dt=dt, overwrite=overwrite) + + if 'output_dir' in config['output']: + network.output_dir = config['output']['output_dir'] + + if 'block_run' in run_dict and run_dict['block_run']: + if 'block_size' not in run_dict: + raise Exception('"block_run" is set to True but "block_size" not found.') + network._block_size = run_dict['block_size'] + + if 'duration' in run_dict: + network.tstop = run_dict['duration'] + elif 'tstop' in run_dict: + network.tstop = run_dict['tstop'] + + # Create the output-directory, or delete existing files if it already exists + graph.io.log_info('Setting up output directory') + if not os.path.exists(config['output']['output_dir']): + os.mkdir(config['output']['output_dir']) + elif overwrite: + for gfile in glob.glob(os.path.join(config['output']['output_dir'], '*.gdf')): + os.remove(gfile) + + graph.io.log_info('Building cells.') + graph.build_nodes() + + graph.io.log_info('Building recurrent connections') + graph.build_recurrent_edges() + + for sim_input in inputs.from_config(config): + node_set = graph.get_node_set(sim_input.node_set) + if sim_input.input_type == 'spikes': + spikes = spike_trains.SpikesInput.load(name=sim_input.name, module=sim_input.module, + input_type=sim_input.input_type, params=sim_input.params) + io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + graph.add_spike_trains(spikes, node_set) + + elif sim_input.input_type == 'current_clamp': + # TODO: Need to make this more robust + amp_times = sim_input.params.get('amplitude_times', []) + amp_values = sim_input.params.get('amplitude_values', []) + + if 'delay' in sim_input.params: + amp_times.append(sim_input.params['delay']) + amp_values.append(sim_input.params['amp']) + + if 'duration' in sim_input.params: + amp_times.append(sim_input.params['delay'] + sim_input.params['duration']) + amp_values.append(0.0) + + network.add_step_currents(amp_times, amp_values, node_set, sim_input.name) + + else: + graph.io.log_warning('Unknown input type {}'.format(sim_input.input_type)) + + sim_reports = reports.from_config(config) + for report in sim_reports: + if report.module == 'spikes_report': + mod = mods.SpikesMod(**report.params) + + elif isinstance(report, reports.MembraneReport): + # For convience and for compliance with SONATA format. "membrane_report" and "multimeter_report is the + # same in pointnet. + mod = mods.MultimeterMod(**report.params) + + else: + graph.io.log_exception('Unknown report type {}'.format(report.module)) + + network.add_mod(mod) + + io.log_info('Network created.') + return network diff --git a/bmtk-vb/bmtk/simulator/pointnet/property_map.py b/bmtk-vb/bmtk/simulator/pointnet/property_map.py new file mode 100644 index 0000000..dd1ecc4 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/property_map.py @@ -0,0 +1,213 @@ +import types +import numpy as np + +import nest + +from bmtk.simulator.pointnet.pyfunction_cache import py_modules +from bmtk.simulator.pointnet.io_tools import io + +class NodePropertyMap(object): + def __init__(self, graph): + self._graph = graph + # TODO: Move template_cache to parent graph so it can be shared across diff populations. + self._template_cache = {} + self.node_types_table = None + + self.batch = True + + + def _parse_model_template(self, model_template): + if model_template in self._template_cache: + return self._template_cache[model_template] + else: + template_parts = model_template.split(':') + assert(len(template_parts) == 2) + directive, template = template_parts[0], template_parts[1] + self._template_cache[model_template] = (directive, template) + return directive, template + + def load_cell(self, node): + model_type = self._parse_model_template(node['model_template'])[1] + dynamics_params = self.dynamics_params(node) + fnc_name = node['model_processing'] + if fnc_name is None: + return nest.Create(model_type, 1, dynamics_params) + else: + cell_fnc = py_modules.cell_processor(fnc_name) + return cell_fnc(model_type, node, dynamics_params) + + @classmethod + def build_map(cls, node_group, graph): + prop_map = cls(graph) + + node_types_table = node_group.parent.node_types_table + prop_map.node_types_table = node_types_table + + if 'model_processing' in node_group.columns: + prop_map.batch = False + elif 'model_processing' in node_group.all_columns: + model_fncs = [node_types_table[ntid]['model_processing'] for ntid in np.unique(node_group.node_type_ids) + if node_types_table[ntid]['model_processing'] is not None] + + if model_fncs: + prop_map.batch = False + + if node_group.has_dynamics_params: + prop_map.batch = False + prop_map.dynamics_params = types.MethodType(group_dynamics_params, prop_map) + else: # 'dynamics_params' in node_group.all_columns: + prop_map.dynamics_params = types.MethodType(types_dynamics_params, prop_map) + + if prop_map.batch: + prop_map.model_type = types.MethodType(model_type_batched, prop_map) + prop_map.model_params = types.MethodType(model_params_batched, prop_map) + else: + prop_map.model_type = types.MethodType(model_type, prop_map) + prop_map.model_params = types.MethodType(model_params, prop_map) + + if node_group.has_gids: + prop_map.gid = types.MethodType(gid, prop_map) + else: + prop_map.gid = types.MethodType(node_id, prop_map) + + return prop_map + + +def gid(self, node): + return node['gid'] + + +def node_id(self, node): + return node.node_id + + +def model_type(self, node): + return self._parse_model_template(node['model_template']) + + +def model_type_batched(self, node_type_id): + return self._parse_model_template(self.node_types_table[node_type_id]['model_template']) + + +def model_params(self, node): + return {} + + +def model_params_batched(self, node_type_id): + return self.node_types_table[node_type_id]['dynamics_params'] + + +def types_dynamics_params(self, node): + return node['dynamics_params'] + + +def group_dynamics_params(self, node): + return node.dynamics_params + + +class EdgePropertyMap(object): + def __init__(self, graph, source_population, target_population): + self._graph = graph + self._source_population = source_population + self._target_population = target_population + + self.batch = True + self.synpatic_models = [] + + + def synaptic_model(self, edge): + return edge['model_template'] + + + def synpatic_params(self, edge): + params_dict = {'weight': self.syn_weight(edge), 'delay': edge['delay']} + params_dict.update(edge['dynamics_params']) + return params_dict + + @classmethod + def build_map(cls, edge_group, biograph): + prop_map = cls(biograph, edge_group.parent.source_population, edge_group.parent.source_population) + if 'model_template' in edge_group.columns: + prop_map.batch = False + elif 'model_template' in edge_group.all_columns: + edge_types_table = edge_group.parent.edge_types_table + syn_models = set(edge_types_table[etid]['model_template'] + for etid in np.unique(edge_types_table.edge_type_ids)) + prop_map.synpatic_models = list(syn_models) + else: + prop_map.synpatic_models = ['static_synapse'] + #s = [edge_types_table[ntid]['model_template'] for ntid in np.unique(edge_types_table.node_type_ids) + # if edge_types_table[ntid]['model_template'] is not None] + + + # For fetching/calculating synaptic weights + edge_types_weight_fncs = set() + edge_types_table = edge_group.parent.edge_types_table + for etid in edge_types_table.edge_type_ids: + weight_fnc = edge_types_table[etid].get('weight_function', None) + if weight_fnc is not None: + edge_types_weight_fncs.add(weight_fnc) + + if 'weight_function' in edge_group.group_columns or edge_types_weight_fncs: + # Customized function for user to calculate the synaptic weight + prop_map.syn_weight = types.MethodType(weight_function, prop_map) + + elif 'syn_weight' in edge_group.all_columns: + # Just return the synaptic weight + prop_map.syn_weight = types.MethodType(syn_weight, prop_map) + else: + io.log_exception('Could not find syn_weight or weight_function properties. Cannot create connections.') + + # For determining the synapse placement + if 'nsyns' in edge_group.all_columns: + prop_map.nsyns = types.MethodType(nsyns, prop_map) + else: + # It will get here for connections onto point neurons + prop_map.nsyns = types.MethodType(no_syns, prop_map) + + # For target sections + ''' + if 'syn_weight' not in edge_group.all_columns: + io.log_exception('Edges {} missing syn_weight property for connections.'.format(edge_group.parent.name)) + else: + prop_map.syn_weight = types.MethodType(syn_weight, prop_map) + + + + if 'syn_weight' in edge_group.columns: + prop_map.weight = types.MethodType(syn_weight, prop_map) + prop_map.preselected_targets = True + prop_map.nsyns = types.MethodType(no_nsyns, prop_map) + else: + prop_map.preselected_targets = False + ''' + return prop_map + + +def syn_weight(self, edge): + return edge['syn_weight']*self.nsyns(edge) + + +def weight_function(self, edge): + weight_fnc_name = edge['weight_function'] + src_node = self._graph.get_node(self._source_population, edge.source_node_id) + trg_node = self._graph.get_node(self._target_population, edge.target_node_id) + + if weight_fnc_name is None: + weight_fnc = py_modules.synaptic_weight('default_weight_fnc') + return weight_fnc(edge, src_node, trg_node)# *self.nsyns(edge) + + elif py_modules.has_synaptic_weight(weight_fnc_name): + weight_fnc = py_modules.synaptic_weight(weight_fnc_name) + return weight_fnc(edge, src_node, trg_node) + + else: + io.log_exception('weight_function {} is not defined.'.format(weight_fnc_name)) + + +def nsyns(self, edge): + return edge['nsyns'] + + +def no_syns(self, edge): + return 1 \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/pointnet/pyfunction_cache.py b/bmtk-vb/bmtk/simulator/pointnet/pyfunction_cache.py new file mode 100644 index 0000000..9e50616 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/pyfunction_cache.py @@ -0,0 +1,246 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import types +from functools import wraps + + +class _PyFunctions(object): + """Structure for holding custom user-defined python functions. + + Will store a set of functions created by the user. Should not access this directly but rather user the + decorators or setter functions, and use the py_modules class variable to access individual functions. Is divided + up into + synaptic_weight: functions for calcuating synaptic weight. + cell_model: should return NEURON cell hobj. + synapse model: should return a NEURON synapse object. + """ + def __init__(self): + self.__syn_weights = {} + self.__cell_models = {} + self.__synapse_models = {} + self.__cell_processors = {} + + def clear(self): + self.__syn_weights.clear() + self.__cell_models.clear() + self.__synapse_models.clear() + self.__cell_processors.clear() + + def add_synaptic_weight(self, name, func, overwrite=True): + """stores synpatic fuction for given name""" + if overwrite or name not in self.__syn_weights: + self.__syn_weights[name] = func + + @property + def synaptic_weight(self): + """return list of the names of all available synaptic weight functions""" + return self.__syn_weights.keys() + + def synaptic_weight(self, name): + """return the synpatic weight function""" + return self.__syn_weights[name] + + def has_synaptic_weight(self, name): + return name in self.__syn_weights + + def __cell_model_key(self, directive, model_type): + return (directive, model_type) + + def add_cell_model(self, directive, model_type, func, overwrite=True): + key = self.__cell_model_key(directive, model_type) + if overwrite or key not in self.__cell_models: + self.__cell_models[key] = func + + @property + def cell_models(self): + return self.__cell_models.keys() + + def cell_model(self, directive, model_type): + return self.__cell_models[self.__cell_model_key(directive, model_type)] + + def has_cell_model(self, directive, model_type): + return self.__cell_model_key(directive, model_type) in self.__cell_models + + def add_synapse_model(self, name, func, overwrite=True): + if overwrite or name not in self.__synapse_models: + self.__synapse_models[name] = func + + @property + def synapse_models(self): + return self.__synapse_models.keys() + + def synapse_model(self, name): + return self.__synapse_models[name] + + + @property + def cell_processors(self): + return self.__cell_processors.keys() + + def cell_processor(self, name): + return self.__cell_processors[name] + + def add_cell_processor(self, name, func, overwrite=True): + if overwrite or name not in self.__syn_weights: + self.__cell_processors[name] = func + + def __repr__(self): + rstr = '{}: {}\n'.format('cell_models', self.cell_models) + rstr += '{}: {}\n'.format('synapse_models', self.synapse_models) + rstr += '{}: {}'.format('synaptic_weights', self.synaptic_weights) + return rstr + +py_modules = _PyFunctions() + + +def synaptic_weight(*wargs, **wkwargs): + """A decorator for registering a function as a synaptic weight function. + To use either + @synaptic_weight + def weight_function(): ... + + or + @synaptic_weight(name='name_in_edge_types') + def weight_function(): ... + + Once the decorator has been attached and imported the functions will automatically be added to py_modules. + """ + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_synaptic_weight(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_synaptic_weight(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def cell_model(*wargs, **wkwargs): + """A decorator for registering NEURON cell loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_cell_model(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_cell_model(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def synapse_model(*wargs, **wkwargs): + """A decorator for registering NEURON synapse loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_synapse_model(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_synapse_model(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def add_weight_function(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_synaptic_weight(func_name, func, overwrite) + + +def add_cell_model(func, directive, model_type, overwrite=True): + assert(callable(func)) + # func_name = name if name is not None else func.__name__ + py_modules.add_cell_model(directive, model_type, func, overwrite) + + +def add_cell_processor(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_cell_processor(func_name, func, overwrite) + + +def add_synapse_model(func, name=None, overwrite=True): + assert (callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_synapse_model(func_name, func, overwrite) + + +def load_py_modules(cell_models=None, syn_models=None, syn_weights=None): + # py_modules.clear() + + if cell_models is not None: + assert(isinstance(cell_models, types.ModuleType)) + for f in [cell_models.__dict__.get(f) for f in dir(cell_models)]: + if isinstance(f, types.FunctionType): + py_modules.add_cell_model(f.__name__, f) + + if syn_models is not None: + assert(isinstance(syn_models, types.ModuleType)) + for f in [syn_models.__dict__.get(f) for f in dir(syn_models)]: + if isinstance(f, types.FunctionType): + py_modules.add_synapse_model(f.__name__, f) + + if syn_weights is not None: + assert(isinstance(syn_weights, types.ModuleType)) + for f in [syn_weights.__dict__.get(f) for f in dir(syn_weights)]: + if isinstance(f, types.FunctionType): + py_modules.add_synaptic_weight(f.__name__, f) diff --git a/bmtk-vb/bmtk/simulator/pointnet/sonata_adaptors.py b/bmtk-vb/bmtk/simulator/pointnet/sonata_adaptors.py new file mode 100644 index 0000000..b528dba --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/sonata_adaptors.py @@ -0,0 +1,295 @@ +import numpy as np +from collections import Counter +import numbers +import nest +import types +import pandas as pd + +from bmtk.simulator.core.sonata_reader import NodeAdaptor, SonataBaseNode, EdgeAdaptor, SonataBaseEdge +from bmtk.simulator.pointnet.io_tools import io +from bmtk.simulator.pointnet.pyfunction_cache import py_modules + + +def all_null(node_group, column_name): + """Helper function to determine if a column has any non-NULL values""" + types_table = node_group.parent.types_table + non_null_vals = [types_table[ntid][column_name] for ntid in np.unique(node_group.node_type_ids) + if types_table[ntid][column_name] is not None] + return len(non_null_vals) == 0 + + +class PointNodeBatched(object): + def __init__(self, node_ids, gids, node_types_table, node_type_id): + self._n_nodes = len(node_ids) + self._node_ids = node_ids + self._gids = gids + self._nt_table = node_types_table + self._nt_id = node_type_id + self._nest_ids = [] + + @property + def n_nodes(self): + return self._n_nodes + + @property + def node_ids(self): + return self._node_ids + + @property + def gids(self): + return self._gids + + @property + def nest_ids(self): + return self._nest_ids + + @property + def nest_model(self): + return self._nt_table[self._nt_id]['model_template'].split(':')[1] + + @property + def nest_params(self): + return self._nt_table[self._nt_id]['dynamics_params'] + + @property + def model_type(self): + return self._nt_table[self._nt_id]['model_type'] + + def build(self): + self._nest_ids = nest.Create(self.nest_model, self.n_nodes, self.nest_params) + + +class PointNode(SonataBaseNode): + def __init__(self, node, prop_adaptor): + super(PointNode, self).__init__(node, prop_adaptor) + self._nest_ids = [] + + @property + def n_nodes(self): + return 1 + + @property + def node_ids(self): + return [self._prop_adaptor.node_id(self._node)] + + @property + def gids(self): + return [self._prop_adaptor.gid(self._node)] + + @property + def nest_ids(self): + return self._nest_ids + + @property + def nest_model(self): + return self._prop_adaptor.model_template(self._node)[1] + + @property + def nest_params(self): + return self.dynamics_params + + def build(self): + nest_model = self.nest_model + dynamics_params = self.dynamics_params + fnc_name = self._node['model_processing'] + if fnc_name is None: + self._nest_ids = nest.Create(nest_model, 1, dynamics_params) + else: + cell_fnc = py_modules.cell_processor(fnc_name) + self._nest_ids = cell_fnc(nest_model, self._node, dynamics_params) + + +class PointNodeAdaptor(NodeAdaptor): + def __init__(self, network): + super(PointNodeAdaptor, self).__init__(network) + + # Flag for determining if we can build multiple NEST nodes at once. If each individual node has unique + # NEST params or a model_processing function is being called then we must nest.Create for each individual cell. + # Otherwise we can try to call nest.Create for a batch of nodes that share the same properties + self._can_batch = True + + @property + def batch_process(self): + return self._can_batch + + @batch_process.setter + def batch_process(self, flag): + self._can_batch = flag + + def get_node(self, sonata_node): + return PointNode(sonata_node, self) + + def get_batches(self, node_group): + node_ids = node_group.node_ids + node_type_ids = node_group.node_type_ids + node_gids = node_group.gids + if node_gids is None: + node_gids = node_ids + + ntids_counter = Counter(node_type_ids) + + nid_groups = {nt_id: np.zeros(ntids_counter[nt_id], dtype=np.uint32) for nt_id in ntids_counter} + gid_groups = {nt_id: np.zeros(ntids_counter[nt_id], dtype=np.uint32) for nt_id in ntids_counter} + node_groups_counter = {nt_id: 0 for nt_id in ntids_counter} + + for node_id, gid, node_type_id in zip(node_ids, node_gids, node_type_ids): + grp_indx = node_groups_counter[node_type_id] + nid_groups[node_type_id][grp_indx] = node_id + gid_groups[node_type_id][grp_indx] = gid + node_groups_counter[node_type_id] += 1 + + return [PointNodeBatched(nid_groups[nt_id], gid_groups[nt_id], node_group.parent.node_types_table, nt_id) + for nt_id in ntids_counter] + + @staticmethod + def patch_adaptor(adaptor, node_group, network): + node_adaptor = NodeAdaptor.patch_adaptor(adaptor, node_group, network) + + # If dynamics params is stored in the nodes.h5 then we have to build each node separate + if node_group.has_dynamics_params: + node_adaptor.batch_process = False + + # If there is a non-null value in the model_processing column then it potentially means that every cell is + # uniquly built (currently model_processing is applied to each individ. cell) and nodes can't be batched + if 'model_processing' in node_group.columns: + node_adaptor.batch_process = False + elif 'model_processing' in node_group.all_columns and not all_null(node_group, 'model_processing'): + node_adaptor.batch_process = False + + if node_adaptor.batch_process: + io.log_info('Batch processing nodes for {}/{}.'.format(node_group.parent.name, node_group.group_id)) + + return node_adaptor + + +class PointEdge(SonataBaseEdge): + @property + def source_node_ids(self): + return [self._edge.source_node_id] + + @property + def target_node_ids(self): + return [self._edge.target_node_id] + + @property + def nest_params(self): + if self.model_template in py_modules.synapse_models: + syn_model_fnc = py_modules.synapse_model(self.model_template) + else: + syn_model_fnc = py_modules.synapse_models('default') + + return syn_model_fnc(self) + + +class PointEdgeBatched(object): + def __init__(self, source_nids, target_nids, nest_params): + self._src_nids = source_nids + self._trg_nids = target_nids + self._nest_params = nest_params + + @property + def source_node_ids(self): + return self._src_nids + + @property + def target_node_ids(self): + return self._trg_nids + + @property + def nest_params(self): + return self._nest_params + + +class PointEdgeAdaptor(EdgeAdaptor): + def __init__(self, network): + super(PointEdgeAdaptor, self).__init__(network) + self._can_batch = True + + @property + def batch_process(self): + return self._can_batch + + @batch_process.setter + def batch_process(self, flag): + self._can_batch = flag + + def synaptic_params(self, edge): + # TODO: THIS NEEDS to be replaced with call to synapse_models + params_dict = {'weight': self.syn_weight(edge, None, None), 'delay': edge.delay} + params_dict.update(edge.dynamics_params) + return params_dict + + def get_edge(self, sonata_node): + return PointEdge(sonata_node, self) + + + def get_batches(self, edge_group): + src_ids = {} + trg_ids = {} + edge_types_table = edge_group.parent.edge_types_table + + edge_type_ids = edge_group.node_type_ids() + et_id_counter = Counter(edge_type_ids) + tmp_df = pd.DataFrame({'etid': edge_type_ids, 'src_nids': edge_group.src_node_ids(), + 'trg_nids': edge_group.trg_node_ids()}) + + for et_id, grp_vals in tmp_df.groupby('etid'): + src_ids[et_id] = np.array(grp_vals['src_nids']) + trg_ids[et_id] = np.array(grp_vals['trg_nids']) + + # selected_etids = np.unique(edge_type_ids) + type_params = {et_id: {} for et_id in et_id_counter.keys()} + for et_id, p_dict in type_params.items(): + p_dict.update(edge_types_table[et_id]['dynamics_params']) + if 'model_template' in edge_types_table[et_id]: + p_dict['model'] = edge_types_table[et_id]['model_template'] + + if 'delay' in edge_group.columns: + raise NotImplementedError + elif 'delay' in edge_types_table.columns: + for et_id, p_dict in type_params.items(): + p_dict['delay'] = edge_types_table[et_id]['delay'] + + scalar_syn_weight = 'syn_weight' not in edge_group.columns + scalar_nsyns = 'nsyns' not in edge_group.columns + + if scalar_syn_weight and scalar_nsyns: + for et_id, p_dict in type_params.items(): + et_dict = edge_types_table[et_id] + p_dict['weight'] = et_dict['nsyns']*et_dict['syn_weight'] + + else: + if not scalar_nsyns and not scalar_syn_weight: + tmp_df['nsyns'] = edge_group.get_dataset('nsyns') + tmp_df['syn_weight'] = edge_group.get_dataset('syn_weight') + for et_id, grp_vals in tmp_df.groupby('etid'): + type_params[et_id]['weight'] = np.array(grp_vals['nsyns'])*np.array(grp_vals['syn_weight']) + + elif scalar_nsyns: + tmp_df['syn_weight'] = edge_group.get_dataset('syn_weight') + for et_id, grp_vals in tmp_df.groupby('etid'): + type_params[et_id]['weight'] = edge_types_table[et_id].get('nsyns', 1) * np.array(grp_vals['syn_weight']) + + elif scalar_syn_weight: + tmp_df['nsyns'] = edge_group.get_dataset('nsyns') + for et_id, grp_vals in tmp_df.groupby('etid'): + type_params[et_id]['weight'] = np.array(grp_vals['nsyns']) * edge_types_table[et_id]['syn_weight'] + + batched_edges = [] + for et_id in et_id_counter.keys(): + batched_edges.append(PointEdgeBatched(src_ids[et_id], trg_ids[et_id], type_params[et_id])) + + return batched_edges + + @staticmethod + def patch_adaptor(adaptor, edge_group): + edge_adaptor = EdgeAdaptor.patch_adaptor(adaptor, edge_group) + + if 'weight_function' not in edge_group.all_columns and 'syn_weight' in edge_group.all_columns: + adaptor.syn_weight = types.MethodType(point_syn_weight, adaptor) + + return edge_adaptor + + +def point_syn_weight(self, edge, src_node, trg_node): + return edge['syn_weight']*edge.nsyns diff --git a/bmtk-vb/bmtk/simulator/pointnet/utils.py b/bmtk-vb/bmtk/simulator/pointnet/utils.py new file mode 100644 index 0000000..d71716a --- /dev/null +++ b/bmtk-vb/bmtk/simulator/pointnet/utils.py @@ -0,0 +1,188 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +from collections import defaultdict +import pandas as pd +import numpy as np +import six +""" +Most of these functions were collected from previous version of pointnet and are no longer tested and tested. However +some functions may still be used by some people internally at AI for running their own simulations. I have marked all +such functions as UNUSED. + +I will leave them alone for now but in the future they should be purged or updated. +""" + + +def read_LGN_activity(trial_num, file_name): + # UNUSED. + spike_train_dict = {} + f5 = h5py.File(file_name, 'r') + trial_group = f5['processing/trial_{}/spike_train'.format(trial_num)] + for cid in trial_group.keys(): + spike_train_dict[int(cid)] = trial_group[cid]['data'][...] + + return spike_train_dict + + +def read_conns(file_name): + # UNUSED. + fc = h5py.File(file_name) + indptr = fc['indptr'] + cell_size = len(indptr) - 1 + print(cell_size) + conns = {} + source = fc['src_gids'] + for xin in six.moves.range(cell_size): + conns[str(xin)] = list(source[indptr[xin]:indptr[xin+1]]) + + return conns + + +def gen_recurrent_csv(num, offset, csv_file): + # UNUSED. + conn_data = np.loadtxt(csv_file) + target_ids = conn_data[:, 0] + source_ids = conn_data[:, 1] + weight_scale = conn_data[:, 2] + + pre = [] + cell_num = num + params = [] + for xin in six.moves.range(cell_num): + pre.append(xin+offset) + ind = np.where(source_ids == xin) + + temp_param = {} + targets = target_ids[ind] + offset + weights = weight_scale[ind] + delays = np.ones(len(ind[0]))*1.5 + targets.astype(float) + weights.astype(float) + temp_param['target'] = targets + temp_param['weight'] = weights*1 + temp_param['delay'] = delays + params.append(temp_param) + + return pre, params + + +def gen_recurrent_h5(num, offset, h5_file): + # UNUSED. + fc = h5py.File(h5_file) + indptr = fc['indptr'] + cell_size = len(indptr) - 1 + src_gids = fc['src_gids'] + nsyns = fc['nsyns'] + source_ids = [] + weight_scale = [] + target_ids = [] + delay_v = 1.5 # arbitrary value + + for xin in six.moves.range(cell_size): + target_ids.append(xin) + source_ids.append(list(src_gids[indptr[xin]:indptr[xin+1]])) + weight_scale.append(list(nsyns[indptr[xin]:indptr[xin+1]])) + targets = defaultdict(list) + weights = defaultdict(list) + delays = defaultdict(list) + + for xi, xin in enumerate(target_ids): + for yi, yin in enumerate(source_ids[xi]): + targets[yin].append(xin) + weights[yin].append(weight_scale[xi][yi]) + delays[yin].append(delay_v) + + presynaptic = [] + params = [] + for xin in targets: + presynaptic.append(xin+offset) + temp_param = {} + temp_array = np.array(targets[xin])*1.0 + offset + temp_array.astype(float) + temp_param['target'] = temp_array + temp_array = np.array(weights[xin]) + temp_array.astype(float) + temp_param['weight'] = temp_array + temp_array = np.array(delays[xin]) + temp_array.astype(float) + temp_param['delay'] = temp_array + params.append(temp_param) + + return presynaptic, params + + +def load_params(node_name, model_name): + """ + load information regarding nodes and cell_models from csv files + + Parameters + ---------- + node_name: json file name for node information + model_name: json file name for neuron model information + + Returns + ------- + node_info: 2d array of node info read out from the json file + mode_info: 2d array of model info read out from the json file + dict_coordinates: dictionary of coordinates. keyword is the node_id and entries are the x,y and z coordinates. + """ + # UNUSED. + node = pd.read_csv(node_name, sep=' ', quotechar='"', quoting=0) + model = pd.read_csv(model_name, sep=' ', quotechar='"', quoting=0) + node_info = node.values + model_info = model.values + # In NEST, cells do not have intrinsic coordinates. So we have to make some virutial links between cells and + # coordinates + dict_coordinates = defaultdict(list) + + for xin in six.moves.range(len(node_info)): + dict_coordinates[str(node_info[xin, 0])] = [node_info[xin, 2], node_info[xin, 3], node_info[xin, 4]] + return node_info, model_info, dict_coordinates + + +def load_conns(cnn_fn): + """ + load information regarding connectivity from csv files + + Parameters + ---------- + cnn_fn: json file name for connection information + + Returns + ------- + connection dictionary + """ + # UNUSED. + conns = pd.read_csv(cnn_fn, sep=' ', quotechar='"', quoting=0) + targets = conns.target_label + sources = conns.source_label + weights = conns.weight + delays = conns.delay + + conns_mapping = {} + for xin in six.moves.range(len(targets)): + keys = sources[xin] + '-' + targets[xin] + conns_mapping[keys] = [weights[xin], delays[xin]] + + return conns_mapping diff --git a/bmtk-vb/bmtk/simulator/popnet/__init__.py b/bmtk-vb/bmtk/simulator/popnet/__init__.py new file mode 100644 index 0000000..7b591ca --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/__init__.py @@ -0,0 +1,25 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .popnetwork import PopNetwork +from .popsimulator import PopSimulator +from .config import Config diff --git a/bmtk-vb/bmtk/simulator/popnet/config.py b/bmtk-vb/bmtk/simulator/popnet/config.py new file mode 100644 index 0000000..567e5b6 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/config.py @@ -0,0 +1,34 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# import bmtk.simulator.utils.config as msdk_config +from bmtk.simulator.core.config import ConfigDict +from bmtk.simulator.core.io_tools import io + +def from_json(config_file, validate=False): + conf_dict = ConfigDict.from_json(config_file) + conf_dict.io = io + return conf_dict + + +class Config(ConfigDict): + pass \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/popnet/popedge.py b/bmtk-vb/bmtk/simulator/popnet/popedge.py new file mode 100644 index 0000000..1e4e98e --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/popedge.py @@ -0,0 +1,82 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from bmtk.simulator.utils.graph import SimEdge + + +class PopEdge(SimEdge): + def __init__(self, source_pop, target_pop, edge_params, dynamics_params): + super(PopEdge, self).__init__(edge_params, dynamics_params) + self.__source_pop = source_pop + self.__target_pop = target_pop + self._weight = self.__get_prop('weight', 0.0) + self._nsyns = self.__get_prop('nsyns', 0) + self._delay = self.__get_prop('delay', 0.0) + + @property + def source(self): + return self.__source_pop + + @property + def target(self): + return self.__target_pop + + @property + def params(self): + return self._orig_params + + @property + def weight(self): + return self._weight + + @weight.setter + def weight(self, value): + self._weight = value + + @property + def nsyns(self): + return self._nsyns + + @nsyns.setter + def nsyns(self, value): + self._nsyns = value + + @property + def delay(self): + return self._delay + + @delay.setter + def delay(self, value): + self._delay = value + + def __get_prop(self, name, default=None): + if name in self._orig_params: + return self._orig_params[name] + elif name in self._dynamics_params: + return self._dynamics_params[name] + else: + return default + + def __repr__(self): + relevant_params = "weight: {}, delay: {}, nsyns: {}".format(self.weight, self.delay, self.nsyns) + rstr = "{} --> {} {{{}}}".format(self.source.pop_id, self.target.pop_id, relevant_params) + return rstr diff --git a/bmtk-vb/bmtk/simulator/popnet/popnetwork.py b/bmtk-vb/bmtk/simulator/popnet/popnetwork.py new file mode 100644 index 0000000..46b7928 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/popnetwork.py @@ -0,0 +1,695 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import numpy as np + +from bmtk.simulator.core.simulator_network import SimNetwork +#from bmtk.simulator.core.graph import SimGraph +#from property_schemas import PopTypes, DefaultPropertySchema +#from popnode import InternalNode, ExternalPopulation +#from popedge import PopEdge +from bmtk.simulator.popnet import utils as poputils +from bmtk.simulator.popnet.sonata_adaptors import PopEdgeAdaptor + +from dipde.internals.internalpopulation import InternalPopulation +from dipde.internals.externalpopulation import ExternalPopulation +from dipde.internals.connection import Connection + +''' +class PopNode(object): + def __init__(self, node, property_map, graph): + self._node = node + self._property_map = property_map + self._graph = graph + + @property + def dynamics_params(self): + # TODO: Use propert map + return self._node['dynamics_params'] + + @property + def node_id(self): + # TODO: Use property map + return self._node.node_id +''' + + +class Population(object): + def __init__(self, pop_id): + self._pop_id = pop_id + self._nodes = [] + self._params = None + + self._dipde_obj = None + + def add_node(self, pnode): + self._nodes.append(pnode) + if self._params is None and pnode.dynamics_params is not None: + self._params = pnode.dynamics_params.copy() + + @property + def pop_id(self): + return self._pop_id + + @property + def dipde_obj(self): + return self._dipde_obj + + @property + def record(self): + return True + + def build(self): + params = self._nodes[0].dynamics_params + self._dipde_obj = InternalPopulation(**params) + + def get_gids(self): + for node in self._nodes: + yield node.node_id + + def __getitem__(self, item): + return self._params[item] + + def __setitem__(self, key, value): + self._params[key] = value + + def __repr__(self): + return str(self._pop_id) + + +class ExtPopulation(Population): + def __init__(self, pop_id): + super(ExtPopulation, self).__init__(pop_id) + self._firing_rate = None + + @property + def record(self): + return False + + @property + def firing_rate(self): + return self._firing_rate + + @firing_rate.setter + def firing_rate(self, value): + self.build(value) + + def build(self, firing_rate): + if firing_rate is not None: + self._firing_rate = firing_rate + + self._dipde_obj = ExternalPopulation(firing_rate) + + +class PopEdge(object): + def __init__(self, edge, property_map, graph): + self._edge = edge + self._prop_map = property_map + self._graph = graph + + @property + def nsyns(self): + # TODO: Use property map + return self._edge['nsyns'] + + @property + def delay(self): + return self._edge['delay'] + + @property + def weight(self): + return self._edge['syn_weight'] + + +class PopConnection(object): + def __init__(self, src_pop, trg_pop): + self._src_pop = src_pop + self._trg_pop = trg_pop + self._edges = [] + + self._dipde_conn = None + + def add_edge(self, edge): + self._edges.append(edge) + + def build(self): + edge = self._edges[0] + self._dipde_conn = Connection(self._src_pop._dipde_obj, self._trg_pop._dipde_obj, edge.nsyns, edge.delay, + edge.syn_weight) + + @property + def dipde_obj(self): + return self._dipde_conn + + +class PopNetwork(SimNetwork): + def __init__(self, group_by='node_type_id', **properties): + super(PopNetwork, self).__init__() + + self.__all_edges = [] + self._group_key = group_by + self._gid_table = {} + self._edges = {} + self._target_edges = {} + self._source_edges = {} + + self._params_cache = {} + #self._params_column = property_schema.get_params_column() + self._dipde_pops = {} + self._external_pop = {} + self._all_populations = [] + # self._loaded_external_pops = {} + + self._nodeid2pop_map = {} + + self._connections = {} + self._external_connections = {} + self._all_connections = [] + + @property + def populations(self): + return self._all_populations + + @property + def connections(self): + return self._all_connections + + @property + def internal_populations(self): + return self._dipde_pops.values() + + def _register_adaptors(self): + super(PopNetwork, self)._register_adaptors() + self._edge_adaptors['sonata'] = PopEdgeAdaptor + + def build_nodes(self): + if self._group_key == 'node_id' or self._group_key is None: + self._build_nodes() + else: + self._build_nodes_grouped() + + def _build_nodes(self): + for node_pop in self.node_populations: + if node_pop.internal_nodes_only: + nid2pop_map = {} + for node in node_pop.get_nodes(): + #pnode = PopNode(node, prop_maps[node.group_id], self) + pop = Population(node.node_id) + pop.add_node(node) + pop.build() + + self._dipde_pops[node.node_id] = pop + self._all_populations.append(pop) + nid2pop_map[node.node_id] = pop + + self._nodeid2pop_map[node_pop.name] = nid2pop_map + + """ + for node_pop in self._internal_populations_map.values(): + prop_maps = self._node_property_maps[node_pop.name] + nid2pop_map = {} + for node in node_pop: + pnode = PopNode(node, prop_maps[node.group_id], self) + pop = Population(node.node_id) + pop.add_node(pnode) + pop.build() + + self._dipde_pops[node.node_id] = pop + self._all_populations.append(pop) + nid2pop_map[node.node_id] = pop + + self._nodeid2pop_map[node_pop.name] = nid2pop_map + """ + + def _build_nodes_grouped(self): + # Organize every single sonata-node into a given population. + for node_pop in self.node_populations: + nid2pop_map = {} + if node_pop.internal_nodes_only: + for node in node_pop.get_nodes(): + pop_key = node[self._group_key] + if pop_key not in self._dipde_pops: + pop = Population(pop_key) + self._dipde_pops[pop_key] = pop + self._all_populations.append(pop) + + pop = self._dipde_pops[pop_key] + pop.add_node(node) + nid2pop_map[node.node_id] = pop + + self._nodeid2pop_map[node_pop.name] = nid2pop_map + + for dpop in self._dipde_pops.values(): + dpop.build() + + """ + for node_pop in self._internal_populations_map.values(): + prop_maps = self._node_property_maps[node_pop.name] + nid2pop_map = {} + for node in node_pop: + pop_key = node[self._group_key] + pnode = PopNode(node, prop_maps[node.group_id], self) + if pop_key not in self._dipde_pops: + pop = Population(pop_key) + self._dipde_pops[pop_key] = pop + self._all_populations.append(pop) + + pop = self._dipde_pops[pop_key] + pop.add_node(pnode) + nid2pop_map[node.node_id] = pop + + self._nodeid2pop_map[node_pop.name] = nid2pop_map + + for dpop in self._dipde_pops.values(): + dpop.build() + """ + + def build_recurrent_edges(self): + recurrent_edge_pops = [ep for ep in self._edge_populations if not ep.virtual_connections] + + for edge_pop in recurrent_edge_pops: + if edge_pop.recurrent_connections: + src_pop_maps = self._nodeid2pop_map[edge_pop.source_nodes] + trg_pop_maps = self._nodeid2pop_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + src_pop = src_pop_maps[edge.source_node_id] + trg_pop = trg_pop_maps[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._connections: + conn = PopConnection(src_pop, trg_pop) + self._connections[conn_key] = conn + self._all_connections.append(conn) + + self._connections[conn_key].add_edge(edge) + + elif edge_pop.mixed_connections: + raise NotImplementedError() + + for conn in self._connections.values(): + conn.build() + + """ + recurrent_edges = [edge_pop for _, edge_list in self._recurrent_edges.items() for edge_pop in edge_list] + for edge_pop in recurrent_edges: + prop_maps = self._edge_property_maps[edge_pop.name] + src_pop_maps = self._nodeid2pop_map[edge_pop.source_population] + trg_pop_maps = self._nodeid2pop_map[edge_pop.target_population] + for edge in edge_pop: + src_pop = src_pop_maps[edge.source_node_id] + trg_pop = trg_pop_maps[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._connections: + conn = PopConnection(src_pop, trg_pop) + self._connections[conn_key] = conn + self._all_connections.append(conn) + + pop_edge = PopEdge(edge, prop_maps[edge.group_id], self) + self._connections[conn_key].add_edge(pop_edge) + + for conn in self._connections.values(): + conn.build() + # print len(self._connections) + """ + + def find_edges(self, source_nodes=None, target_nodes=None): + # TODO: Move to parent + selected_edges = self._edge_populations[:] + + if source_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.source_nodes == source_nodes] + + if target_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.target_nodes == target_nodes] + + return selected_edges + + def add_spike_trains(self, spike_trains, node_set): + # Build external node populations + src_nodes = [node_pop for node_pop in self.node_populations if node_pop.name in node_set.population_names()] + for node_pop in src_nodes: + pop_name = node_pop.name + if node_pop.name not in self._external_pop: + external_pop_map = {} + src_pop_map = {} + for node in node_pop.get_nodes(): + pop_key = node[self._group_key] + if pop_key not in external_pop_map: + pop = ExtPopulation(pop_key) + external_pop_map[pop_key] = pop + self._all_populations.append(pop) + + pop = external_pop_map[pop_key] + pop.add_node(node) + src_pop_map[node.node_id] = pop + + self._nodeid2pop_map[pop_name] = src_pop_map + + firing_rates = poputils.get_firing_rates(external_pop_map.values(), spike_trains) + self._external_pop[pop_name] = external_pop_map + for dpop in external_pop_map.values(): + dpop.build(firing_rates[dpop.pop_id]) + + else: + # TODO: Throw error spike trains should only be called once per source population + # external_pop_map = self._external_pop[pop_name] + src_pop_map = self._nodeid2pop_map[pop_name] + + unbuilt_connections = [] + for source_reader in src_nodes: + for edge_pop in self.find_edges(source_nodes=source_reader.name): + trg_pop_map = self._nodeid2pop_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + src_pop = src_pop_map[edge.source_node_id] + trg_pop = trg_pop_map[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._external_connections: + pconn = PopConnection(src_pop, trg_pop) + self._external_connections[conn_key] = pconn + unbuilt_connections.append(pconn) + self._all_connections.append(pconn) + + #pop_edge = PopEdge(edge, prop_maps[edge.group_id], self) + self._external_connections[conn_key].add_edge(edge) + + for pedge in unbuilt_connections: + pedge.build() + #exit() + + """ + print node_pop.name + + + exit() + if node_pop.name in self._virtual_ids_map: + continue + + virt_node_map = {} + if node_pop.virtual_nodes_only: + print 'HERE' + exit() + + + for pop_name, node_pop in self._virtual_populations_map.items(): + if pop_name not in spike_trains.populations: + continue + + # Build external population if it already hasn't been built + if pop_name not in self._external_pop: + prop_maps = self._node_property_maps[pop_name] + external_pop_map = {} + src_pop_map = {} + for node in node_pop: + pop_key = node[self._group_key] + pnode = PopNode(node, prop_maps[node.group_id], self) + if pop_key not in external_pop_map: + pop = ExtPopulation(pop_key) + external_pop_map[pop_key] = pop + self._all_populations.append(pop) + + pop = external_pop_map[pop_key] + pop.add_node(pnode) + src_pop_map[node.node_id] = pop + + self._nodeid2pop_map[pop_name] = src_pop_map + + firing_rates = poputils.get_firing_rates(external_pop_map.values(), spike_trains) + self._external_pop[pop_name] = external_pop_map + for dpop in external_pop_map.values(): + dpop.build(firing_rates[dpop.pop_id]) + + else: + # TODO: Throw error spike trains should only be called once per source population + # external_pop_map = self._external_pop[pop_name] + src_pop_map = self._nodeid2pop_map[pop_name] + + unbuilt_connections = [] + for node_pop in self._internal_populations_map.values(): + trg_pop_map = self._nodeid2pop_map[node_pop.name] + for edge_pop in self.external_edge_populations(src_pop=pop_name, trg_pop=node_pop.name): + for edge in edge_pop: + src_pop = src_pop_map[edge.source_node_id] + trg_pop = trg_pop_map[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._external_connections: + pconn = PopConnection(src_pop, trg_pop) + self._external_connections[conn_key] = pconn + unbuilt_connections.append(pconn) + self._all_connections.append(pconn) + + pop_edge = PopEdge(edge, prop_maps[edge.group_id], self) + self._external_connections[conn_key].add_edge(pop_edge) + + for pedge in unbuilt_connections: + pedge.build() + """ + + + def add_rates(self, rates, node_set): + if self._group_key == 'node_id': + id_lookup = lambda n: n.node_id + else: + id_lookup = lambda n: n[self._group_key] + + src_nodes = [node_pop for node_pop in self.node_populations if node_pop.name in node_set.population_names()] + for node_pop in src_nodes: + pop_name = node_pop.name + if node_pop.name not in self._external_pop: + external_pop_map = {} + src_pop_map = {} + for node in node_pop.get_nodes(): + pop_key = id_lookup(node) + if pop_key not in external_pop_map: + pop = ExtPopulation(pop_key) + external_pop_map[pop_key] = pop + self._all_populations.append(pop) + + pop = external_pop_map[pop_key] + pop.add_node(node) + src_pop_map[node.node_id] = pop + + self._nodeid2pop_map[pop_name] = src_pop_map + + self._external_pop[pop_name] = external_pop_map + for dpop in external_pop_map.values(): + firing_rates = rates.get_rate(dpop.pop_id) + dpop.build(firing_rates) + + else: + # TODO: Throw error spike trains should only be called once per source population + # external_pop_map = self._external_pop[pop_name] + src_pop_map = self._nodeid2pop_map[pop_name] + + unbuilt_connections = [] + for source_reader in src_nodes: + for edge_pop in self.find_edges(source_nodes=source_reader.name): + trg_pop_map = self._nodeid2pop_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + src_pop = src_pop_map[edge.source_node_id] + trg_pop = trg_pop_map[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._external_connections: + pconn = PopConnection(src_pop, trg_pop) + self._external_connections[conn_key] = pconn + unbuilt_connections.append(pconn) + self._all_connections.append(pconn) + + #pop_edge = PopEdge(edge, prop_maps[edge.group_id], self) + self._external_connections[conn_key].add_edge(edge) + + for pedge in unbuilt_connections: + pedge.build() + + """ + for pop_name, node_pop in self._virtual_populations_map.items(): + if pop_name not in rates.populations: + continue + + # Build external population if it already hasn't been built + if pop_name not in self._external_pop: + prop_maps = self._node_property_maps[pop_name] + external_pop_map = {} + src_pop_map = {} + for node in node_pop: + pop_key = id_lookup(node) + #pop_key = node[self._group_key] + pnode = PopNode(node, prop_maps[node.group_id], self) + if pop_key not in external_pop_map: + pop = ExtPopulation(pop_key) + external_pop_map[pop_key] = pop + self._all_populations.append(pop) + + pop = external_pop_map[pop_key] + pop.add_node(pnode) + src_pop_map[node.node_id] = pop + + self._nodeid2pop_map[pop_name] = src_pop_map + + firing_rate = rates.get_rate(pop_key) + self._external_pop[pop_name] = external_pop_map + for dpop in external_pop_map.values(): + dpop.build(firing_rate) + + else: + # TODO: Throw error spike trains should only be called once per source population + # external_pop_map = self._external_pop[pop_name] + src_pop_map = self._nodeid2pop_map[pop_name] + """ + + ''' + def _add_node(self, node, network): + pops = self._networks[network] + pop_key = node[self._group_key] + if pop_key in pops: + pop = pops[pop_key] + pop.add_gid(node.gid) + self._gid_table[network][node.gid] = pop + else: + model_class = self.property_schema.get_pop_type(node) + if model_class == PopTypes.Internal: + pop = InternalNode(pop_key, self, network, node) + pop.add_gid(node.gid) + pop.model_params = self.__get_params(node) + self._add_internal_node(pop, network) + + elif model_class == PopTypes.External: + # TODO: See if we can get firing rate from dynamics_params + pop = ExternalPopulation(pop_key, self, network, node) + pop.add_gid(node.gid) + self._add_external_node(pop, network) + + else: + raise Exception('Unknown model type') + + if network not in self._gid_table: + self._gid_table[network] = {} + self._gid_table[network][node.gid] = pop + ''' + + def __get_params(self, node_params): + if node_params.with_dynamics_params: + return node_params['dynamics_params'] + + params_file = node_params[self._params_column] + if params_file in self._params_cache: + return self._params_cache[params_file] + else: + params_dir = self.get_component('models_dir') + params_path = os.path.join(params_dir, params_file) + params_dict = json.load(open(params_path, 'r')) + self._params_cache[params_file] = params_dict + return params_dict + + def _preprocess_node_types(self, node_population): + node_type_ids = np.unique(node_population.type_ids) + # TODO: Verify all the node_type_ids are in the table + node_types_table = node_population.types_table + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + model_type = node_type['model_type'] + + if model_type == 'biophysical': + params_dir = self.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = self.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = self.get_component('point_neuron_models_dir') + elif model_type == 'population': + params_dir = self.get_component('population_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = self.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + + ''' + def add_edges(self, edges, target_network=None, source_network=None): + # super(PopGraph, self).add_edges(edges) + + target_network = target_network if target_network is not None else edges.target_network + if target_network not in self._target_edges: + self._target_edges[target_network] = [] + + source_network = source_network if source_network is not None else edges.source_network + if source_network not in self._source_edges: + self._source_edges[source_network] = [] + + target_pops = self.get_populations(target_network) + source_pops = self.get_populations(source_network) + source_gid_table = self._gid_table[source_network] + + for target_pop in target_pops: + for target_gid in target_pop.get_gids(): + for edge in edges.edges_itr(target_gid): + source_pop = source_gid_table[edge.source_gid] + self._add_edge(source_pop, target_pop, edge) + ''' + + def _add_edge(self, source_pop, target_pop, edge): + src_id = source_pop.node_id + trg_id = target_pop.node_id + edge_type_id = edge['edge_type_id'] + edge_key = (src_id, source_pop.network, trg_id, target_pop.network, edge_type_id) + + if edge_key in self._edges: + return + else: + # TODO: implement dynamics params + dynamics_params = self._get_edge_params(edge) + pop_edge = PopEdge(source_pop, target_pop, edge, dynamics_params) + self._edges[edge_key] = pop_edge + self._source_edges[source_pop.network].append(pop_edge) + self._target_edges[target_pop.network].append(pop_edge) + + def get_edges(self, source_network): + return self._source_edges[source_network] + + def edges_table(self, target_network, source_network): + return self._edges_table[(target_network, source_network)] + + def get_populations(self, network): + return super(PopNetwork, self).get_nodes(network) + + def get_population(self, node_set, gid): + return self._nodeid2pop_map[node_set][gid] + + def rebuild(self): + for _, ns in self._nodeid2pop_map.items(): + for _, pop in ns.items(): + pop.build() + + for pc in self._all_connections: + pc.build() \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/popnet/popnetwork_OLD.py b/bmtk-vb/bmtk/simulator/popnet/popnetwork_OLD.py new file mode 100644 index 0000000..cfdeddb --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/popnetwork_OLD.py @@ -0,0 +1,327 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import logging + +from dipde.internals.internalpopulation import InternalPopulation +from dipde.internals.externalpopulation import ExternalPopulation +from dipde.internals.connection import Connection +import dipde + +import bmtk.simulator.popnet.config as cfg +import bmtk.simulator.popnet.utils as poputils + + +class PopNetwork (object): + def __init__(self, graph): + self._graph = graph + + self._duration = 0.0 + self._dt = 0.0001 + self._rates_file = None # name of file where the output is saved + + self.__population_list = [] # list of all populations, internal and external + self.__population_table = {graph: {} for graph in self._graph.networks} # population lookup by [network][id] + self.__connection_list = [] # list of all connections + self._dipde_network = None # reference to dipde.Network object + + # diction of rates for every external network/pop_id. Prepopulate dictionary with populations whose rates + # have already been manually set, otherwise they should use one of the add_rates_* function. + self._rates = {network: {pop.pop_id: pop.firing_rate for pop in self._graph.get_populations(network) + if not pop.is_internal and pop.is_firing_rate_set} + for network in self._graph.networks} + + """ + for network in self._graph.networks: + for pop in self._graph.get_populations(network): + + if pop.is_internal: + dipde_pop = self.__create_internal_pop(pop) + + else: + if pop.is_firing_rate_set: + rates = pop.firing_rate + """ + + @property + def duration(self): + return self._duration + + @duration.setter + def duration(self, value): + self._duration = value + + @property + def dt(self): + return self._dt + + @dt.setter + def dt(self, value): + self._dt = value + + @property + def rates_file(self): + return self._rates_file + + @rates_file.setter + def rates_file(self, value): + self._rates_file = value + + @property + def populations(self): + return self.__population_list + + @property + def connections(self): + return self.__connection_list + + def add_rates_nwb(self, network, nwb_file, trial, force=False): + """Creates external population firing rates from an NWB file. + + Will iterate through a processing trial of an NWB file by assigning gids the population it belongs too and + taking the average firing rate. + + This should be done before calling build_cells(). If a population has already been assigned a firing rate an + error will occur unless force=True. + + :param network: Name of network with external populations. + :param nwb_file: NWB file with spike rates. + :param trial: trial id in NWB file + :param force: will overwrite existing firing rates + """ + existing_rates = self._rates[network] # TODO: validate network exists + # Get all unset, external populations in a network. + network_pops = self._graph.get_populations(network) + selected_pops = [] + for pop in network_pops: + if pop.is_internal: + continue + elif not force and pop.pop_id in existing_rates: + print('Firing rate for {}/{} has already been set, skipping.'.format(network, pop.pop_id)) + else: + selected_pops.append(pop) + + if selected_pops: + # assign firing rates from NWB file + # TODO: + rates_dict = poputils.get_firing_rate_from_nwb(selected_pops, nwb_file, trial) + self._rates[network].update(rates_dict) + + def add_rate_hz(self, network, pop_id, rate, force=False): + """Set the firing rate of an external population. + + This should be done before calling build_cells(). If a population has already been assigned a firing rate an + error will occur unless force=True. + + :param network: name of network with wanted exteranl population + :param pop_id: name/id of external population + :param rate: firing rate in Hz. + :param force: will overwrite existing firing rates + """ + self.__add_rates_validator(network, pop_id, force) + self._rates[network][pop_id] = rate + + def __add_rates_validator(self, network, pop_id, force): + if network not in self._graph.networks: + raise Exception('No network {} found in PopGraph.'.format(network)) + + pop = self._graph.get_population(network, pop_id) + if pop is None: + raise Exception('No population with id {} found in {}.'.format(pop_id, network)) + if pop.is_internal: + raise Exception('Population {} in {} is not an external population.'.format(pop_id, network)) + if not force and pop_id in self._rates[network]: + raise Exception('The firing rate for {}/{} already set and force=False.'.format(network, pop_id)) + + def _get_rate(self, network, pop): + """Gets the firing rate for a given population""" + return self._rates[network][pop.pop_id] + + def build_populations(self): + """Build dipde Population objects from graph nodes. + + To calculate external populations firing rates, it first see if a population's firing rate has been manually + set in the graph. Otherwise it attempts to calulate the firing rate from the call to add_rate_hz, add_rates_NWB, + etc. (which should be called first). + """ + for network in self._graph.networks: + for pop in self._graph.get_populations(network): + if pop.is_internal: + dipde_pop = self.__create_internal_pop(pop) + + else: + dipde_pop = self.__create_external_pop(pop, self._get_rate(network, pop)) + + self.__population_list.append(dipde_pop) + self.__population_table[network][pop.pop_id] = dipde_pop + + def set_logging(self, log_file): + # TODO: move this out of the function, put in io class + if os.path.exists(log_file): + os.remove(log_file) + + # get root logger + logger = logging.getLogger() + for h in list(logger.handlers): + # remove existing handlers that will write to console. + logger.removeHandler(h) + + # creates handler that write to log_file + logging.basicConfig(filename=log_file, filemode='w', level=logging.DEBUG) + + def set_external_connections(self, network_name): + """Sets the external connections for populations in a given network. + + :param network_name: name of external network with External Populations to connect to internal pops. + """ + for edge in self._graph.get_edges(network_name): + # Get source and target populations + src = edge.source + source_pop = self.__population_table[src.network][src.pop_id] + trg = edge.target + target_pop = self.__population_table[trg.network][trg.pop_id] + + # build a connection. + self.__connection_list.append(self.__create_connection(source_pop, target_pop, edge)) + + def set_recurrent_connections(self): + """Initialize internal connections.""" + for network in self._graph.internal_networks(): + for edge in self._graph.get_edges(network): + src = edge.source + source_pop = self.__population_table[src.network][src.pop_id] + trg = edge.target + target_pop = self.__population_table[trg.network][trg.pop_id] + self.__connection_list.append(self.__create_connection(source_pop, target_pop, edge)) + + def run(self, duration=None): + # TODO: Check if cells/connections need to be rebuilt. + + # Create the networ + self._dipde_network = dipde.Network(population_list=self.populations, connection_list=self.__connection_list) + + if duration is None: + duration = self.duration + + print("running simulation...") + self._dipde_network.run(t0=0.0, tf=duration, dt=self.dt) + # TODO: make record_rates optional? + self.__record_rates() + print("done simulation.") + + def __create_internal_pop(self, params): + # TODO: use getter methods directly in case arguments are not stored in dynamics params + # pop = InternalPopulation(**params.dynamics_params) + pop = InternalPopulation(**params.model_params) + return pop + + def __create_external_pop(self, params, rates): + pop = ExternalPopulation(rates, record=False) + return pop + + def __create_connection(self, source, target, params): + return Connection(source, target, nsyn=params.nsyns, delays=params.delay, weights=params.weight) + + def __record_rates(self): + with open(self._rates_file, 'w') as f: + # TODO: store internal populations separately, unless there is a reason to save external populations + # (there isn't and it will be problematic) + for network, pop_list in self.__population_table.items(): + for pop_id, pop in pop_list.items(): + if pop.record: + for time, rate in zip(pop.t_record, pop.firing_rate_record): + f.write('{} {} {}\n'.format(pop_id, time, rate)) + + @classmethod + def from_config(cls, configure, graph): + # load the json file or object + if isinstance(configure, basestring): + config = cfg.from_json(configure, validate=True) + elif isinstance(configure, dict): + config = configure + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(configure, type(configure))) + network = cls(graph) + + if 'run' not in config: + raise Exception('Json file is missing "run" entry. Unable to build Bionetwork.') + run_dict = config['run'] + + # Create the output file + if 'output' in config: + out_dict = config['output'] + + rates_file = out_dict.get('rates_file', None) + if rates_file is not None: + # create directory if required + network.rates_file = rates_file + parent_dir = os.path.dirname(rates_file) + if not os.path.exists(parent_dir): + os.makedirs(parent_dir) + + if 'log_file' in out_dict: + log_file = out_dict['log_file'] + network.set_logging(log_file) + + # get network parameters + if 'duration' in run_dict: + network.duration = run_dict['duration'] + + if 'dt' in run_dict: + network.dt = run_dict['dt'] + + # TODO: need to get firing rates before building populations + if 'input' in config: + for netinput in config['input']: + if netinput['type'] == 'external_spikes' and netinput['format'] == 'nwb' and netinput['active']: + # Load external network spike trains from an NWB file. + print('Setting firing rates for {} from {}.'.format(netinput['source_nodes'], netinput['file'])) + network.add_rates_nwb(netinput['source_nodes'], netinput['file'], netinput['trial']) + + if netinput['type'] == 'pop_rate': + print('Setting {}/{} to fire at {} Hz.'.format(netinput['source_nodes'], netinput['pop_id'], netinput['rate'])) + network.add_rate_hz(netinput['source_nodes'], netinput['pop_id'], netinput['rate']) + + # TODO: take input as function with Population argument + + # Build populations + print('Building Populations') + network.build_populations() + + # Build recurrent connections + if run_dict['connect_internal']: + print('Building recurrention connections') + network.set_recurrent_connections() + + # Build external connections. Set connection to default True and turn off only if explicitly stated. + # NOTE: It might be better to set to default off?!?! Need to dicuss what would be more intuitive for the users. + # TODO: ignore case of network name + external_network_settings = {name: True for name in graph.external_networks()} + if 'connect_external' in run_dict: + external_network_settings.update(run_dict['connect_external']) + for netname, connect in external_network_settings.items(): + if connect: + print('Setting external connections for {}'.format(netname)) + network.set_external_connections(netname) + + return network diff --git a/bmtk-vb/bmtk/simulator/popnet/popnode.py b/bmtk-vb/bmtk/simulator/popnet/popnode.py new file mode 100644 index 0000000..6288762 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/popnode.py @@ -0,0 +1,158 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from bmtk.simulator.utils.graph import SimNode + +class PopNode(SimNode): + def __init__(self, node_id, graph, network, params): + self._graph = graph + self._node_id = node_id + self._network = network + self._graph_params = params + + self._dynamics_params = {} + self._updated_params = {'dynamics_params': self._dynamics_params} + + self._gids = set() + + @property + def node_id(self): + return self._node_id + + @property + def pop_id(self): + return self._node_id + + @property + def network(self): + return self._network + + @property + def dynamics_params(self): + return self._dynamics_params + + @dynamics_params.setter + def dynamics_params(self, value): + self._dynamics_params = value + + @property + def is_internal(self): + return False + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + elif item in self._graph_params: + return self._graph_params[item] + elif self._model_params is not None: + return self._model_params[item] + + def add_gid(self, gid): + self._gids.add(gid) + + def get_gids(self): + return list(self._gids) + + +class InternalNode(PopNode): + """ + def __init__(self, node_id, graph, network, params): + super(InternalNode, self).__init__(node_id, graph, network, params) + #self._pop_id = node_id + #self._graph = graph + #self._network = network + #self._graph_params = params + #self._dynamics_params = {} + #self._update_params = {'dynamics_params': self._dynamics_params} + """ + @property + def tau_m(self): + return self['tau_m'] + #return self._dynamics_params.get('tau_m', None) + + @tau_m.setter + def tau_m(self, value): + #return self['tau_m'] + self._dynamics_params['tau_m'] = value + + @property + def v_max(self): + return self._dynamics_params.get('v_max', None) + + @v_max.setter + def v_max(self, value): + self._dynamics_params['v_max'] = value + + @property + def dv(self): + return self._dynamics_params.get('dv', None) + + @dv.setter + def dv(self, value): + self._dynamics_params['dv'] = value + + @property + def v_min(self): + return self._dynamics_params.get('v_min', None) + + @v_min.setter + def v_min(self, value): + self._dynamics_params['v_min'] = value + + @property + def is_internal(self): + return True + + def __repr__(self): + props = 'pop_id={}, tau_m={}, v_max={}, v_min={}, dv={}'.format(self.pop_id, self.tau_m, self.v_max, self.v_min, + self.dv) + return 'InternalPopulation({})'.format(props) + + +class ExternalPopulation(PopNode): + def __init__(self, node_id, graph, network, params): + super(ExternalPopulation, self).__init__(node_id, graph, network, params) + self._firing_rate = -1 + if 'firing_rate' in params: + self._firing_rate = params['firing_rate'] + + @property + def firing_rate(self): + return self._firing_rate + + @property + def is_firing_rate_set(self): + return self._firing_rate >= 0 + + @firing_rate.setter + def firing_rate(self, rate): + assert(isinstance(rate, float) and rate >= 0) + self._firing_rate = rate + + @property + def is_internal(self): + return False + + def __repr__(self): + props = 'pop_id={}, firing_rate={}'.format(self.pop_id, self.firing_rate) + return 'ExternalPopulation({})'.format(props) + diff --git a/bmtk-vb/bmtk/simulator/popnet/popsimulator.py b/bmtk-vb/bmtk/simulator/popnet/popsimulator.py new file mode 100644 index 0000000..38c660a --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/popsimulator.py @@ -0,0 +1,451 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import logging +from six import string_types + +from dipde.internals.internalpopulation import InternalPopulation +from dipde.internals.externalpopulation import ExternalPopulation +from dipde.internals.connection import Connection +import dipde + +from bmtk.simulator.core.simulator import Simulator +from . import config as cfg +from . import utils as poputils +import bmtk.simulator.utils.simulation_inputs as inputs +from bmtk.utils.io import spike_trains, firing_rates + + +class PopSimulator(Simulator): + def __init__(self, graph, dt=0.0001, tstop=0.0, overwrite=True): + self._graph = graph + + self._tstop = tstop + self._dt = dt + self._rates_file = None # name of file where the output is saved + + self.__population_list = [] # list of all populations, internal and external + #self.__population_table = {graph: {} for graph in self._graph.networks} # population lookup by [network][id] + self.__connection_list = [] # list of all connections + self._dipde_network = None # reference to dipde.Network object + + # diction of rates for every external network/pop_id. Prepopulate dictionary with populations whose rates + # have already been manually set, otherwise they should use one of the add_rates_* function. + #self._rates = {network: {pop.pop_id: pop.firing_rate for pop in self._graph.get_populations(network) + # if not pop.is_internal and pop.is_firing_rate_set} + # for network in self._graph.networks} + + """ + for network in self._graph.networks: + for pop in self._graph.get_populations(network): + + if pop.is_internal: + dipde_pop = self.__create_internal_pop(pop) + + else: + if pop.is_firing_rate_set: + rates = pop.firing_rate + """ + + @property + def tstop(self): + return self._tstop + + @tstop.setter + def tstop(self, value): + self._tstop = value + + @property + def dt(self): + return self._dt + + @dt.setter + def dt(self, value): + self._dt = value + + @property + def rates_file(self): + return self._rates_file + + @rates_file.setter + def rates_file(self, value): + self._rates_file = value + + @property + def populations(self): + return self.__population_list + + @property + def connections(self): + return self.__connection_list + + def add_rates_nwb(self, network, nwb_file, trial, force=False): + """Creates external population firing rates from an NWB file. + + Will iterate through a processing trial of an NWB file by assigning gids the population it belongs too and + taking the average firing rate. + + This should be done before calling build_cells(). If a population has already been assigned a firing rate an + error will occur unless force=True. + + :param network: Name of network with external populations. + :param nwb_file: NWB file with spike rates. + :param trial: trial id in NWB file + :param force: will overwrite existing firing rates + """ + existing_rates = self._rates[network] # TODO: validate network exists + # Get all unset, external populations in a network. + network_pops = self._graph.get_populations(network) + selected_pops = [] + for pop in network_pops: + if pop.is_internal: + continue + elif not force and pop.pop_id in existing_rates: + print('Firing rate for {}/{} has already been set, skipping.'.format(network, pop.pop_id)) + else: + selected_pops.append(pop) + + if selected_pops: + # assign firing rates from NWB file + # TODO: + rates_dict = poputils.get_firing_rate_from_nwb(selected_pops, nwb_file, trial) + self._rates[network].update(rates_dict) + + def add_rate_hz(self, network, pop_id, rate, force=False): + """Set the firing rate of an external population. + + This should be done before calling build_cells(). If a population has already been assigned a firing rate an + error will occur unless force=True. + + :param network: name of network with wanted exteranl population + :param pop_id: name/id of external population + :param rate: firing rate in Hz. + :param force: will overwrite existing firing rates + """ + self.__add_rates_validator(network, pop_id, force) + self._rates[network][pop_id] = rate + + def __add_rates_validator(self, network, pop_id, force): + if network not in self._graph.networks: + raise Exception('No network {} found in PopGraph.'.format(network)) + + pop = self._graph.get_population(network, pop_id) + if pop is None: + raise Exception('No population with id {} found in {}.'.format(pop_id, network)) + if pop.is_internal: + raise Exception('Population {} in {} is not an external population.'.format(pop_id, network)) + if not force and pop_id in self._rates[network]: + raise Exception('The firing rate for {}/{} already set and force=False.'.format(network, pop_id)) + + def _get_rate(self, network, pop): + """Gets the firing rate for a given population""" + return self._rates[network][pop.pop_id] + + def build_populations(self): + """Build dipde Population objects from graph nodes. + + To calculate external populations firing rates, it first see if a population's firing rate has been manually + set in the graph. Otherwise it attempts to calulate the firing rate from the call to add_rate_hz, add_rates_NWB, + etc. (which should be called first). + """ + for network in self._graph.networks: + for pop in self._graph.get_populations(network): + if pop.is_internal: + dipde_pop = self.__create_internal_pop(pop) + + else: + dipde_pop = self.__create_external_pop(pop, self._get_rate(network, pop)) + + self.__population_list.append(dipde_pop) + self.__population_table[network][pop.pop_id] = dipde_pop + + def set_logging(self, log_file): + # TODO: move this out of the function, put in io class + if os.path.exists(log_file): + os.remove(log_file) + + # get root logger + logger = logging.getLogger() + for h in list(logger.handlers): + # remove existing handlers that will write to console. + logger.removeHandler(h) + + # creates handler that write to log_file + logging.basicConfig(filename=log_file, filemode='w', level=logging.DEBUG) + + def set_external_connections(self, network_name): + """Sets the external connections for populations in a given network. + + :param network_name: name of external network with External Populations to connect to internal pops. + """ + for edge in self._graph.get_edges(network_name): + # Get source and target populations + src = edge.source + source_pop = self.__population_table[src.network][src.pop_id] + trg = edge.target + target_pop = self.__population_table[trg.network][trg.pop_id] + + # build a connection. + self.__connection_list.append(self.__create_connection(source_pop, target_pop, edge)) + + def set_recurrent_connections(self): + """Initialize internal connections.""" + for network in self._graph.internal_networks(): + for edge in self._graph.get_edges(network): + src = edge.source + source_pop = self.__population_table[src.network][src.pop_id] + trg = edge.target + target_pop = self.__population_table[trg.network][trg.pop_id] + self.__connection_list.append(self.__create_connection(source_pop, target_pop, edge)) + + def run(self, tstop=None): + # TODO: Check if cells/connections need to be rebuilt. + + # Create the networ + dipde_pops = [p.dipde_obj for p in self._graph.populations] + dipde_conns = [c.dipde_obj for c in self._graph.connections] + #print dipde_pops + #print dipde_conns + #exit() + + self._dipde_network = dipde.Network(population_list=dipde_pops, connection_list=dipde_conns) + + #self._dipde_network = dipde.Network(population_list=self._graph.populations, + # connection_list=self._graph.connections) + + if tstop is None: + tstop = self.tstop + + #print tstop, self.dt + #print self._graph.populations + #exit() + print("running simulation...") + self._dipde_network.run(t0=0.0, tf=tstop, dt=self.dt) + # TODO: make record_rates optional? + self.__record_rates() + print("done simulation.") + + def __create_internal_pop(self, params): + # TODO: use getter methods directly in case arguments are not stored in dynamics params + # pop = InternalPopulation(**params.dynamics_params) + pop = InternalPopulation(**params.model_params) + return pop + + def __create_external_pop(self, params, rates): + pop = ExternalPopulation(rates, record=False) + return pop + + def __create_connection(self, source, target, params): + return Connection(source, target, nsyn=params.nsyns, delays=params.delay, weights=params.weight) + + def __record_rates(self): + with open(self._rates_file, 'w') as f: + for pop in self._graph.internal_populations: + if pop.record: + for time, rate in zip(pop.dipde_obj.t_record, pop.dipde_obj.firing_rate_record): + f.write('{} {} {}\n'.format(pop.pop_id, time, rate)) + + ''' + @classmethod + def from_config(cls, configure, graph): + # load the json file or object + if isinstance(configure, basestring): + config = cfg.from_json(configure, validate=True) + elif isinstance(configure, dict): + config = configure + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(configure, type(configure))) + network = cls(graph) + + if 'run' not in config: + raise Exception('Json file is missing "run" entry. Unable to build Bionetwork.') + run_dict = config['run'] + + # Create the output file + if 'output' in config: + out_dict = config['output'] + + rates_file = out_dict.get('rates_file', None) + if rates_file is not None: + # create directory if required + network.rates_file = rates_file + parent_dir = os.path.dirname(rates_file) + if not os.path.exists(parent_dir): + os.makedirs(parent_dir) + + if 'log_file' in out_dict: + log_file = out_dict['log_file'] + network.set_logging(log_file) + + # get network parameters + if 'duration' in run_dict: + network.duration = run_dict['duration'] + + if 'dt' in run_dict: + network.dt = run_dict['dt'] + + # TODO: need to get firing rates before building populations + if 'input' in config: + for netinput in config['input']: + if netinput['type'] == 'external_spikes' and netinput['format'] == 'nwb' and netinput['active']: + # Load external network spike trains from an NWB file. + print('Setting firing rates for {} from {}.'.format(netinput['source_nodes'], netinput['file'])) + network.add_rates_nwb(netinput['source_nodes'], netinput['file'], netinput['trial']) + + if netinput['type'] == 'pop_rate': + print('Setting {}/{} to fire at {} Hz.'.format(netinput['source_nodes'], netinput['pop_id'], netinput['rate'])) + network.add_rate_hz(netinput['source_nodes'], netinput['pop_id'], netinput['rate']) + + # TODO: take input as function with Population argument + + # Build populations + print('Building Populations') + network.build_populations() + + # Build recurrent connections + if run_dict['connect_internal']: + print('Building recurrention connections') + network.set_recurrent_connections() + + # Build external connections. Set connection to default True and turn off only if explicitly stated. + # NOTE: It might be better to set to default off?!?! Need to dicuss what would be more intuitive for the users. + # TODO: ignore case of network name + external_network_settings = {name: True for name in graph.external_networks()} + if 'connect_external' in run_dict: + external_network_settings.update(run_dict['connect_external']) + for netname, connect in external_network_settings.items(): + if connect: + print('Setting external connections for {}'.format(netname)) + network.set_external_connections(netname) + + return network + ''' + + @classmethod + def from_config(cls, configure, graph): + # load the json file or object + if isinstance(configure, string_types): + config = cfg.from_json(configure, validate=True) + elif isinstance(configure, dict): + config = configure + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(configure, type(configure))) + + if 'run' not in config: + raise Exception('Json file is missing "run" entry. Unable to build Bionetwork.') + run_dict = config['run'] + + # Get network parameters + # step time (dt) is set in the kernel and should be passed + overwrite = run_dict['overwrite_output_dir'] if 'overwrite_output_dir' in run_dict else True + print_time = run_dict['print_time'] if 'print_time' in run_dict else False + dt = run_dict['dt'] # TODO: make sure dt exists + tstop = float(config.tstop) / 1000.0 + network = cls(graph, dt=config.dt, tstop=tstop, overwrite=overwrite) + + if 'output_dir' in config['output']: + network.output_dir = config['output']['output_dir'] + + # network.spikes_file = config['output']['spikes_ascii'] + + if 'block_run' in run_dict and run_dict['block_run']: + if 'block_size' not in run_dict: + raise Exception('"block_run" is set to True but "block_size" not found.') + network._block_size = run_dict['block_size'] + + if 'duration' in run_dict: + network.duration = run_dict['duration'] + + graph.io.log_info('Building cells.') + graph.build_nodes() + + graph.io.log_info('Building recurrent connections') + graph.build_recurrent_edges() + + for sim_input in inputs.from_config(config): + node_set = graph.get_node_set(sim_input.node_set) + if sim_input.input_type == 'spikes': + spikes = spike_trains.SpikesInput.load(name=sim_input.name, module=sim_input.module, + input_type=sim_input.input_type, params=sim_input.params) + graph.io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + graph.add_spike_trains(spikes, node_set) + else: + graph.io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + rates = firing_rates.RatesInput(sim_input.params) + graph.add_rates(rates, node_set) + + # Create the output file + if 'output' in config: + out_dict = config['output'] + + rates_file = out_dict.get('rates_file', None) + if rates_file is not None: + rates_file = rates_file if os.path.isabs(rates_file) else os.path.join(config.output_dir, rates_file) + # create directory if required + network.rates_file = rates_file + parent_dir = os.path.dirname(rates_file) + if not os.path.exists(parent_dir): + os.makedirs(parent_dir) + + if 'log_file' in out_dict: + log_file = out_dict['log_file'] + network.set_logging(log_file) + + + # exit() + + + # build the cells + #io.log('Building cells') + #network.build_cells() + + # Build internal connections + #if run_dict['connect_internal']: + # io.log('Creating recurrent connections') + # network.set_recurrent_connections() + + # Build external connections. Set connection to default True and turn off only if explicitly stated. + # NOTE: It might be better to set to default off?!?! Need to dicuss what would be more intuitive for the users. + # TODO: ignore case of network name + + ''' + external_network_settings = {name: True for name in graph.external_networks()} + if 'connect_external' in run_dict: + external_network_settings.update(run_dict['connect_external']) + for netname, connect in external_network_settings.items(): + if connect: + io.log('Setting external connections for {}'.format(netname)) + network.set_external_connections(netname) + + # Build inputs + if 'input' in config: + for netinput in config['input']: + if netinput['type'] == 'external_spikes' and netinput['format'] == 'nwb' and netinput['active']: + network.add_spikes_nwb(netinput['source_nodes'], netinput['file'], netinput['trial']) + + io.log_info('Adding stimulations') + network.make_stims() + ''' + + graph.io.log_info('Network created.') + return network \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/popnet/property_schemas/__init__.py b/bmtk-vb/bmtk/simulator/popnet/property_schemas/__init__.py new file mode 100644 index 0000000..4d7c64c --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/property_schemas/__init__.py @@ -0,0 +1,28 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from base_schema import PopTypes +import property_schema_ver0 as v0 +import property_schema_ver1 as v1 + +DefaultPropertySchema = v1.PropertySchema() +AIPropertySchema = v0.PropertySchema() \ No newline at end of file diff --git a/bmtk-vb/bmtk/simulator/popnet/property_schemas/base_schema.py b/bmtk-vb/bmtk/simulator/popnet/property_schemas/base_schema.py new file mode 100644 index 0000000..cc880a6 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/property_schemas/base_schema.py @@ -0,0 +1,50 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class PopTypes: + """Essentially an enum to store the type/group of each cell. It's faster and more robust than doing multiple string + comparisons. + """ + Internal = 0 + External = 1 + Other = 2 # should never really get here + + @staticmethod + def len(): + return 3 + + +class PropertySchema(object): + ####################################### + # For nodes/cells properties + ####################################### + def get_pop_type(self, pop_params): + model_type = pop_params['model_type'].lower() + if model_type == 'virtual' or model_type == 'external': + return PopTypes.External + elif model_type == 'internal': + return PopTypes.Internal + else: + return PopTypes.Unknown + + def get_params_column(self): + raise NotImplementedError() diff --git a/bmtk-vb/bmtk/simulator/popnet/property_schemas/property_schema_ver0.py b/bmtk-vb/bmtk/simulator/popnet/property_schemas/property_schema_ver0.py new file mode 100644 index 0000000..6c5c542 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/property_schemas/property_schema_ver0.py @@ -0,0 +1,28 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from base_schema import PopTypes, PropertySchema as BaseSchema + + +class PropertySchema(BaseSchema): + def get_params_column(self): + return 'params_file' diff --git a/bmtk-vb/bmtk/simulator/popnet/property_schemas/property_schema_ver1.py b/bmtk-vb/bmtk/simulator/popnet/property_schemas/property_schema_ver1.py new file mode 100644 index 0000000..8794525 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/property_schemas/property_schema_ver1.py @@ -0,0 +1,28 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from base_schema import PropertySchema as BaseSchema + + +class PropertySchema(BaseSchema): + def get_params_column(self): + return 'dynamics_params' diff --git a/bmtk-vb/bmtk/simulator/popnet/sonata_adaptors.py b/bmtk-vb/bmtk/simulator/popnet/sonata_adaptors.py new file mode 100644 index 0000000..dcc1300 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/sonata_adaptors.py @@ -0,0 +1,12 @@ +from bmtk.simulator.core.sonata_reader import NodeAdaptor, SonataBaseNode, EdgeAdaptor, SonataBaseEdge + + +class PopNetEdge(SonataBaseEdge): + @property + def syn_weight(self): + return self._edge['syn_weight'] + + +class PopEdgeAdaptor(EdgeAdaptor): + def get_edge(self, sonata_edge): + return PopNetEdge(sonata_edge, self) diff --git a/bmtk-vb/bmtk/simulator/popnet/utils.py b/bmtk-vb/bmtk/simulator/popnet/utils.py new file mode 100644 index 0000000..ceeeaa3 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/popnet/utils.py @@ -0,0 +1,287 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import math +import warnings +import numpy as np +import pandas as pd +import scipy.interpolate as spinterp +import collections +import h5py +import itertools +import scipy.io as sio +import json +import importlib + +""" +Most of these functions are not being used directly by popnet, but may still be used in some other capcity. These have +been marked as depreciated, and should be removed soon. + + +""" + + +def get_firing_rate_from_nwb(populations, nwb_file, trial): + """Calculates firing rates for an external population""" + h5_file = h5py.File(nwb_file, 'r') + spike_trains_ds = h5_file['processing'][trial]['spike_train'] + + # TODO: look into adding a time window rather than searching for min/max t. + firing_rates = {} + for pop in populations: + spike_counts = [] + spike_min_t = 1.0e30 + spike_max_t = 0.0 + for gid in pop.get_gids(): + spike_train_ds = spike_trains_ds[str(gid)]['data'] + if spike_train_ds is not None and len(spike_train_ds[...]) > 0: + spike_times = spike_train_ds[...] + tmp_min = min(spike_times) + spike_min_t = tmp_min if tmp_min < spike_min_t else spike_min_t + tmp_max = max(spike_times) + spike_max_t = tmp_max if tmp_max > spike_max_t else spike_max_t + spike_counts.append(len(spike_times)) + + # TODO make sure t_diffs is not null and spike_counts has some values + firing_rates[pop.pop_id] = 1.0e03 * np.mean(spike_counts) / (spike_max_t - spike_min_t) + return firing_rates + + +def get_firing_rates(populations, spike_trains): + """Calculates firing rates for an external population""" + #h5_file = h5py.File(nwb_file, 'r') + #spike_trains_ds = h5_file['processing'][trial]['spike_train'] + + # TODO: look into adding a time window rather than searching for min/max t. + firing_rates = {} + for pop in populations: + spike_counts = [] + spike_min_t = 1.0e30 + spike_max_t = 0.0 + for gid in pop.get_gids(): + spike_times = spike_trains.get_spikes(gid) + if spike_times is not None and len(spike_times) > 0: + tmp_min = min(spike_times) + spike_min_t = tmp_min if tmp_min < spike_min_t else spike_min_t + tmp_max = max(spike_times) + spike_max_t = tmp_max if tmp_max > spike_max_t else spike_max_t + spike_counts.append(len(spike_times)) + + # TODO make sure t_diffs is not null and spike_counts has some values + firing_rates[pop.pop_id] = 1.0e03 * np.mean(spike_counts) / (spike_max_t - spike_min_t) + return firing_rates + +############################################# +# Depreciated +############################################# +def list_of_dicts_to_dict_of_lists(list_of_dicts, default=None): + new_dict = {} + for curr_dict in list_of_dicts: + print(curr_dict.keys()) + + +############################################# +# Depreciated +############################################# +class KeyDefaultDict(collections.defaultdict): + def __missing__(self, key): + if self.default_factory is None: + raise KeyError + else: + ret = self[key] = self.default_factory(key) + return ret + + +############################################# +# Depreciated +############################################# +def create_firing_rate_server(t, y): + + warnings.warn('Hard coded bug fix for mindscope council 4/27/15') + t = t/.001/200 + interpolation_callable = spinterp.interp1d(t, y, bounds_error=False, fill_value=0) + return lambda t: interpolation_callable(t) + + +############################################# +# Depreciated +############################################# +def create_nwb_server_file_path(nwb_file_name, nwb_path): + f = h5py.File(nwb_file_name, 'r') + y = f['%s/data' % nwb_path][:] + dt = f['%s/data' % nwb_path].dims[0][0].value + t = np.arange(len(y))*dt + f.close() + return create_firing_rate_server(t, y) + + +############################################# +# Depreciated +############################################# +def get_mesoscale_connectivity_dict(): + + # Extract data into a dictionary: + mesoscale_data_dir = '/data/mat/iSee_temp_shared/packages/mesoscale_connectivity' + nature_data = {} + for mat, side in itertools.product(['W', 'PValue'],['ipsi', 'contra']): + data, row_labels, col_labels = [sio.loadmat(os.path.join(mesoscale_data_dir, '%s_%s.mat' % (mat, side)))[key] + for key in ['data', 'row_labels', 'col_labels']] + for _, (row_label, row) in enumerate(zip(row_labels, data)): + for _, (col_label, val) in enumerate(zip(col_labels, row)): + nature_data[mat, side, str(row_label.strip()), str(col_label.strip())] = val + + return nature_data + + +############################################# +# Depreciated +############################################# +def reorder_columns_in_frame(frame, var): + varlist = [w for w in frame.columns if w not in var] + return frame[var+varlist] + + +############################################# +# Depreciated +############################################# +def population_to_dict_for_dataframe(p): + + black_list = ['firing_rate_record', + 'initial_firing_rate', + 'metadata', + 't_record'] + + json_list = ['p0', 'tau_m'] + + return_dict = {} + p_dict = p.to_dict() + + for key, val in p_dict['metadata'].items(): + return_dict[key] = val + + for key, val in p_dict.items(): + if key not in black_list: + if key in json_list: + val = json.dumps(val) + return_dict[key] = val + + return return_dict + + +############################################# +# Depreciated +############################################# +def network_dict_to_target_adjacency_dict(network_dict): + print(network_dict) + + +############################################# +# Depreciated +############################################# +def population_list_to_dataframe(population_list): + df = pd.DataFrame({'_tmp': [None]}) + for p in population_list: + model_dict = {'_tmp': [None]} + for key, val in population_to_dict_for_dataframe(p).items(): + model_dict.setdefault(key, []).append(val) + df_tmp = pd.DataFrame(model_dict) + + df = pd.merge(df, df_tmp, how='outer') + df.drop('_tmp', inplace=True, axis=1) + return df + + +############################################# +# Depreciated +############################################# +def df_to_csv(df, save_file_name, index=False, sep=' ', na_rep='None'): + df.to_csv(save_file_name, index=index, sep=sep, na_rep=na_rep) + + +############################################# +# Depreciated +############################################# +def population_list_to_csv(population_list, save_file_name): + df = population_list_to_dataframe(population_list) + df_to_csv(df, save_file_name) + + +############################################# +# Depreciated +############################################# +def create_instance(data_dict): + '''Helper function to create an object from a dictionary containing: + + "module": The name of the module containing the class + "class": The name of the class to be used to create the object + ''' + + curr_module, curr_class = data_dict.pop('module'), data_dict.pop('class') + curr_instance = getattr(importlib.import_module(curr_module), curr_class)(**data_dict) + + return curr_instance + + +############################################# +# Depreciated +############################################# +def assert_model_known(model, model_dict): + """Test if a model in in the model_dict; if not, raise UnknownModelError""" + + try: + assert model in model_dict + except: + raise Exception('model {} does not exist.'.format(model)) + + +############################################# +# Depreciated +############################################# +def create_population_list(node_table, model_table): + """Create a population list from the node and model pandas tables""" + + model_dict = {} + for row in model_table.iterrows(): + model = row[1].to_dict() + model_dict[model.pop('model')] = model + + population_list = [] + for row in node_table.iterrows(): + node = row[1].to_dict() + model = node.pop('model') + + # Check if model type in model dict: + assert_model_known(model, model_dict) + + # Clean up: + curr_model = {} + for key, val in model_dict[model].items(): + if not (isinstance(val, float) and math.isnan(val)): + curr_model[key] = val + curr_model.setdefault('metadata', {})['model'] = model + + curr_module, curr_class = curr_model['module'], curr_model['class'] + curr_instance = getattr(importlib.import_module(curr_module), curr_class)(**curr_model) + population_list.append(curr_instance) + + return population_list diff --git a/bmtk-vb/bmtk/simulator/utils/__init__.py b/bmtk-vb/bmtk/simulator/utils/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/bmtk/simulator/utils/__init__.pyc b/bmtk-vb/bmtk/simulator/utils/__init__.pyc new file mode 100644 index 0000000..d08f5a6 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/__init__.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/simulator/utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..c9640cf Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/__pycache__/config.cpython-37.pyc b/bmtk-vb/bmtk/simulator/utils/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000..ef4a035 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/__pycache__/config.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/__pycache__/sim_validator.cpython-37.pyc b/bmtk-vb/bmtk/simulator/utils/__pycache__/sim_validator.cpython-37.pyc new file mode 100644 index 0000000..2aa7e21 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/__pycache__/sim_validator.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/__pycache__/simulation_inputs.cpython-37.pyc b/bmtk-vb/bmtk/simulator/utils/__pycache__/simulation_inputs.cpython-37.pyc new file mode 100644 index 0000000..58e5306 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/__pycache__/simulation_inputs.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/__pycache__/simulation_reports.cpython-37.pyc b/bmtk-vb/bmtk/simulator/utils/__pycache__/simulation_reports.cpython-37.pyc new file mode 100644 index 0000000..9f05e3b Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/__pycache__/simulation_reports.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/config.py b/bmtk-vb/bmtk/simulator/utils/config.py new file mode 100644 index 0000000..aa5ee5e --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/config.py @@ -0,0 +1,438 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import re +import copy +import datetime +from six import string_types + + +from bmtk.simulator.core.io_tools import io + + +def from_json(config_file, validator=None): + """Builds and validates a configuration json file. + + :param config_file: File object or path to a json file. + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + #print(config_file) + #if os.path.isfile(config_file): + #if isinstance(config_file, file): + # conf = json.load(config_file) + if isinstance(config_file, string_types): + conf = json.load(open(config_file, 'r')) + elif isinstance(config_file, dict): + conf = config_file.copy() + else: + raise Exception('{} is not a file or file path.'.format(config_file)) + + # insert file path into dictionary + if 'config_path' not in conf: + conf['config_path'] = os.path.abspath(config_file) + conf['config_dir'] = os.path.dirname(conf['config_path']) + + # Will resolve manifest variables and validate + return from_dict(conf, validator) + + +def from_dict(config_dict, validator=None): + """Builds and validates a configuration json dictionary object. Best to directly use from_json when possible. + + :param config_dict: Dictionary object + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + assert(isinstance(config_dict, dict)) + conf = copy.deepcopy(config_dict) # Since the functions will mutate the dictionary we will copy just-in-case. + + if 'config_path' not in conf: + conf['config_path'] = os.path.join(os.getcwd(), 'tmp_cfg.dict') + conf['config_dir'] = os.path.dirname(conf['config_path']) + + # Build the manifest and resolve variables. + # TODO: Check that manifest exists + manifest = __build_manifest(conf) + conf['manifest'] = manifest + __recursive_insert(conf, manifest) + + # In our work with Blue-Brain it was agreed that 'network' and 'simulator' parts of config may be split up into + # separate files. If this is the case we build each sub-file separately and merge into this one + for childconfig in ['network', 'simulation']: + if childconfig in conf and isinstance(conf[childconfig], string_types): + # Try to resolve the path of the network/simulation config files. If an absolute path isn't used find + # the file relative to the current config file. TODO: test if this will work on windows? + conf_str = conf[childconfig] + conf_path = conf_str if conf_str.startswith('/') else os.path.join(conf['config_dir'], conf_str) + + # Build individual json file and merge into parent. + child_json = from_json(conf_path) + del child_json['config_path'] # we don't want 'config_path' of parent being overwritten. + conf.update(child_json) + + # Run the validator + if validator is not None: + validator.validate(conf) + + return conf + + +def copy_config(conf): + """Copy configuration file to different directory, with manifest variables resolved. + + :param conf: configuration dictionary + """ + output_dir = conf.output_dir + config_name = os.path.basename(conf['config_path']) + output_path = os.path.join(output_dir, config_name) + with open(output_path, 'w') as fp: + out_cfg = conf.copy() + if 'manifest' in out_cfg: + del out_cfg['manifest'] + json.dump(out_cfg, fp, indent=2) + + +def __special_variables(conf): + """A list of preloaded variables to insert into the manifest, containing things like path to run-time directory, + configuration directory, etc. + """ + pre_manifest = dict() + pre_manifest['$workingdir'] = os.path.dirname(os.getcwd()) + if 'config_path' in conf: + pre_manifest['$configdir'] = os.path.dirname(conf['config_path']) # path of configuration file + pre_manifest['$configfname'] = conf['config_path'] + + dt_now = datetime.datetime.now() + pre_manifest['$time'] = dt_now.strftime('%H-%M-%S') + pre_manifest['$date'] = dt_now.strftime('%Y-%m-%d') + pre_manifest['$datetime'] = dt_now.strftime('%Y-%m-%d_%H-%M-%S') + + return pre_manifest + + +def __build_manifest(conf): + """Resolves the manifest section and resolve any internal variables""" + if 'manifest' not in conf: + return __special_variables(conf) + + manifest = conf["manifest"] + resolved_manifest = __special_variables(conf) + resolved_keys = set() + unresolved_keys = set(manifest.keys()) + + # No longer using recursion since that can lead to an infinite loop if the person who writes the config file isn't + # careful. Also added code to allow for ${VAR} format in-case user wants to user "$.../some_${MODEl}_here/..." + while unresolved_keys: + for key in unresolved_keys: + # Find all variables in manifest and see if they can be replaced by the value in resolved_manifest + value = __find_variables(manifest[key], resolved_manifest) + + # If value no longer has variables, and key-value pair to resolved_manifest and remove from unresolved-keys + if value.find('$') < 0: + resolved_manifest[key] = value + resolved_keys.add(key) + + # remove resolved key-value pairs from set, and make sure at every iteration unresolved_keys shrinks to prevent + # infinite loops + n_unresolved = len(unresolved_keys) + unresolved_keys -= resolved_keys + if n_unresolved == len(unresolved_keys): + msg = "Unable to resolve manifest variables: {}".format(unresolved_keys) + raise Exception(msg) + + return resolved_manifest + + +def __recursive_insert(json_obj, manifest): + """Loop through the config and substitute the path variables (e.g.: $MY_DIR) with the values from the manifest + + :param json_obj: A json dictionary object that may contain variables needing to be resolved. + :param manifest: A dictionary of variable values + :return: A new json dictionar config file with variables resolved + """ + if isinstance(json_obj, string_types): + return __find_variables(json_obj, manifest) + + elif isinstance(json_obj, list): + new_list = [] + for itm in json_obj: + new_list.append(__recursive_insert(itm, manifest)) + return new_list + + elif isinstance(json_obj, dict): + for key, val in json_obj.items(): + if key == 'manifest': + continue + json_obj[key] = __recursive_insert(val, manifest) + + return json_obj + + else: + return json_obj + + +def __find_variables(json_str, manifest): + """Replaces variables (i.e. $VAR, ${VAR}) with their values from the manifest. + + :param json_str: a json string that may contain none, one or multiple variable + :param manifest: dictionary of variable lookup values + :return: json_str with resolved variables. Won't resolve variables that don't exist in manifest. + """ + variables = [m for m in re.finditer('\$\{?[\w]+\}?', json_str)] + for var in variables: + var_lookup = var.group() + if var_lookup.startswith('${') and var_lookup.endswith('}'): + # replace ${VAR} with $VAR + var_lookup = "$" + var_lookup[2:-1] + if var_lookup in manifest: + json_str = json_str.replace(var.group(), manifest[var_lookup]) + + return json_str + + +class ConfigDict(dict): + def __init__(self, *args, **kwargs): + self.update(*args, **kwargs) + self._env_built = False + self._io = None + + self._node_set = {} + self._load_node_set() + + @property + def io(self): + if self._io is None: + self._io = io + return self._io + + @io.setter + def io(self, io): + self._io = io + + @property + def run(self): + return self['run'] + + @property + def tstart(self): + return self.run.get('tstart', 0.0) + + @property + def tstop(self): + return self.run['tstop'] + + @property + def dt(self): + return self.run.get('dt', 0.1) + + @property + def spike_threshold(self): + return self.run.get('spike_threshold', -15.0) + + @property + def dL(self): + return self.run.get('dL', 20.0) + + @property + def gid_mappings(self): + return self.get('gid_mapping_file', None) + + @property + def block_step(self): + return self.run.get('nsteps_block', 5000) + + @property + def calc_ecp(self): + return self.run.get('calc_ecp', False) + + @property + def conditions(self): + return self['conditions'] + + @property + def celsius(self): + return self.conditions['celsius'] + + @property + def v_init(self): + return self.conditions['v_init'] + + @property + def path(self): + return self['config_path'] + + @property + def output(self): + return self['output'] + + @property + def output_dir(self): + return self.output['output_dir'] + + @property + def overwrite_output(self): + return self.output.get('overwrite_output_dir', False) + + @property + def log_file(self): + return self.output['log_file'] + + @property + def components(self): + return self.get('components', {}) + + @property + def morphologies_dir(self): + return self.components['morphologies_dir'] + + @property + def synaptic_models_dir(self): + return self.components['synaptic_models_dir'] + + @property + def point_neuron_models_dir(self): + return self.components['point_neuron_models_dir'] + + @property + def mechanisms_dir(self): + return self.components['mechanisms_dir'] + + @property + def biophysical_neuron_models_dir(self): + return self.components['biophysical_neuron_models_dir'] + + @property + def templates_dir(self): + return self.components.get('templates_dir', None) + + @property + def with_networks(self): + return 'networks' in self and len(self.nodes) > 0 + + @property + def networks(self): + return self['networks'] + + @property + def nodes(self): + return self.networks.get('nodes', []) + + @property + def edges(self): + return self.networks.get('edges', []) + + @property + def reports(self): + return self.get('reports', {}) + + @property + def inputs(self): + return self.get('inputs', {}) + + @property + def node_sets(self): + return self._node_set + + @property + def spikes_file(self): + return os.path.join(self.output_dir, self.output['spikes_file']) + + def _load_node_set(self): + if 'node_sets_file' in self.keys(): + node_set_val = self['node_sets_file'] + elif 'node_sets' in self.keys(): + node_set_val = self['node_sets'] + else: + self._node_set = {} + return + + if isinstance(node_set_val, dict): + self._node_set = node_set_val + else: + try: + self._node_set = json.load(open(node_set_val, 'r')) + except Exception as e: + io.log_exception('Unable to load node_sets_file {}'.format(node_set_val)) + + def copy_to_output(self): + copy_config(self) + + def get_modules(self, module_name): + return [report for report in self.reports.values() if report['module'] == module_name] + + def _set_logging(self): + """Check if log-level and/or log-format string is being changed through the config""" + output_sec = self.output + if 'log_format' in output_sec: + self._io.set_log_format(output_sec['log_format']) + + if 'log_level' in output_sec: + self._io.set_log_level(output_sec['log_level']) + + if 'log_to_console' in output_sec: + self._io.log_to_console = output_sec['log_to_console'] + + if 'quiet_simulator' in output_sec and output_sec['quiet_simulator']: + self._io.quiet_simulator() + + def build_env(self): + if self._env_built: + return + + self._set_logging() + self.io.setup_output_dir(self.output_dir, self.log_file, self.overwrite_output) + self.copy_to_output() + self._env_built = True + + @staticmethod + def get_validator(): + raise NotImplementedError + + @classmethod + def from_json(cls, config_file, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_json(config_file, validator)) + + @classmethod + def from_dict(cls, config_dict, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_dict(config_dict, validator)) + + @classmethod + def from_yaml(cls, config_file, validate=False): + raise NotImplementedError + + @classmethod + def load(cls, config_file, validate=False): + # Implement factory method that can resolve the format/type of input configuration. + if isinstance(config_file, dict): + return cls.from_dict(config_file, validate) + elif isinstance(config_file, string_types): + if config_file.endswith('yml') or config_file.endswith('yaml'): + return cls.from_yaml(config_file, validate) + else: + return cls.from_json(config_file, validate) + else: + raise Exception diff --git a/bmtk-vb/bmtk/simulator/utils/config.pyc b/bmtk-vb/bmtk/simulator/utils/config.pyc new file mode 100644 index 0000000..ba09d6d Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/config.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/graph.py b/bmtk-vb/bmtk/simulator/utils/graph.py new file mode 100644 index 0000000..629ea1d --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/graph.py @@ -0,0 +1,408 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import ast +import numpy as np + +import config as cfg +from property_maps import NodePropertyMap, EdgePropertyMap +from bmtk.utils import sonata + + +"""Creates a graph of nodes and edges from multiple network files for all simulators. + +Consists of edges and nodes. All classes are abstract and should be reimplemented by a specific simulator. Also +contains base factor methods for building a network from a config file (or other). +""" + + +class SimEdge(object): + def __init__(self, original_params, dynamics_params): + self._orig_params = original_params + self._dynamics_params = dynamics_params + self._updated_params = {'dynamics_params': self._dynamics_params} + + @property + def edge_type_id(self): + return self._orig_params['edge_type_id'] + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + else: + return self._orig_params[item] + + +class SimNode(object): + def __init__(self, node_id, graph, network, params): + self._node_id = node_id + self._graph = graph + self._graph_params = params + self._node_type_id = params['node_type_id'] + self._network = network + self._updated_params = {} + + self._model_params = {} + + @property + def node_id(self): + return self._node_id + + @property + def node_type_id(self): + return self._node_type_id + + @property + def network(self): + """Name of network node belongs too.""" + return self._network + + @property + def model_params(self): + """Parameters (json file, nml, dictionary) that describe a specific node""" + return self._model_params + + @model_params.setter + def model_params(self, value): + self._model_params = value + + def __contains__(self, item): + return item in self._updated_params or item in self._graph_params + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + else: + return self._graph_params[item] + + +class SimGraph(object): + model_type_col = 'model_type' + + def __init__(self): + self._components = {} # components table, i.e. paths to model files. + self._io = None # TODO: create default io module (without mpi) + + self._node_property_maps = {} + self._edge_property_maps = {} + + self._node_populations = {} + self._internal_populations_map = {} + self._virtual_populations_map = {} + + self._virtual_cells_nid = {} + + self._recurrent_edges = {} + self._external_edges = {} + + @property + def io(self): + return self._io + + @property + def internal_pop_names(self): + return self + + @property + def node_populations(self): + return list(self._node_populations.keys()) + + def get_component(self, key): + """Get the value of item in the components dictionary. + + :param key: name of component + :return: value assigned to component + """ + return self._components[key] + + def add_component(self, key, value): + """Add a component key-value pair + + :param key: name of component + :param value: value + """ + self._components[key] = value + + def _from_json(self, file_name): + return cfg.from_json(file_name) + + def _validate_components(self): + """Make sure various components (i.e. paths) exists before attempting to build the graph.""" + return True + + def _create_nodes_prop_map(self, grp): + return NodePropertyMap() + + def _create_edges_prop_map(self, grp): + return EdgePropertyMap() + + def __avail_model_types(self, population): + model_types = set() + for grp in population.groups: + if self.model_type_col not in grp.all_columns: + self.io.log_exception('model_type is missing from nodes.') + + model_types.update(set(np.unique(grp.get_values(self.model_type_col)))) + return model_types + + def _preprocess_node_types(self, node_population): + # TODO: The following figures out the actually used node-type-ids. For mem and speed may be better to just + # process them all + node_type_ids = node_population.type_ids + # TODO: Verify all the node_type_ids are in the table + node_types_table = node_population.types_table + + # TODO: Convert model_type to a enum + morph_dir = self.get_component('morphologies_dir') + if morph_dir is not None and 'morphology' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + if node_type['morphology'] is None: + continue + # TODO: Check the file exits + # TODO: See if absolute path is stored in csv + node_type['morphology'] = os.path.join(morph_dir, node_type['morphology']) + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + if isinstance(dynamics_params, dict): + continue + + model_type = node_type['model_type'] + if model_type == 'biophysical': + params_dir = self.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = self.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = self.get_component('point_neuron_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = self.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + def _preprocess_edge_types(self, edge_pop): + edge_types_table = edge_pop.types_table + edge_type_ids = np.unique(edge_pop.type_ids) + + for et_id in edge_type_ids: + if 'dynamics_params' in edge_types_table.columns: + edge_type = edge_types_table[et_id] + dynamics_params = edge_type['dynamics_params'] + params_dir = self.get_component('synaptic_models_dir') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + edge_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find edge dynamics_params file {}.'.format(params_path)) + + # Split target_sections + if 'target_sections' in edge_type: + trg_sec = edge_type['target_sections'] + if trg_sec is not None: + try: + edge_type['target_sections'] = ast.literal_eval(trg_sec) + except Exception as exc: + self.io.log_warning('Unable to split target_sections list {}'.format(trg_sec)) + edge_type['target_sections'] = None + + # Split target distances + if 'distance_range' in edge_type: + dist_range = edge_type['distance_range'] + if dist_range is not None: + try: + # TODO: Make the distance range has at most two values + edge_type['distance_range'] = json.loads(dist_range) + except Exception as e: + try: + edge_type['distance_range'] = [0.0, float(dist_range)] + except Exception as e: + self.io.log_warning('Unable to parse distance_range {}'.format(dist_range)) + edge_type['distance_range'] = None + + def external_edge_populations(self, src_pop, trg_pop): + return self._external_edges.get((src_pop, trg_pop), []) + + def add_nodes(self, sonata_file, populations=None): + """Add nodes from a network to the graph. + + :param sonata_file: A NodesFormat type object containing list of nodes. + :param populations: name/identifier of network. If none will attempt to retrieve from nodes object + """ + nodes = sonata_file.nodes + + selected_populations = nodes.population_names if populations is None else populations + for pop_name in selected_populations: + if pop_name not in nodes: + # when user wants to simulation only a few populations in the file + continue + + if pop_name in self.node_populations: + # Make sure their aren't any collisions + self.io.log_exception('There are multiple node populations with name {}.'.format(pop_name)) + + node_pop = nodes[pop_name] + self._preprocess_node_types(node_pop) + self._node_populations[pop_name] = node_pop + + # Segregate into virtual populations and non-virtual populations + model_types = self.__avail_model_types(node_pop) + if 'virtual' in model_types: + self._virtual_populations_map[pop_name] = node_pop + self._virtual_cells_nid[pop_name] = {} + model_types -= set(['virtual']) + if model_types: + # We'll allow a population to have virtual and non-virtual nodes but it is not ideal + self.io.log_warning('Node population {} contains both virtual and non-virtual nodes which can ' + + 'cause memory and build-time inefficency. Consider separating virtual nodes ' + + 'into their own population'.format(pop_name)) + + if model_types: + self._internal_populations_map[pop_name] = node_pop + + self._node_property_maps[pop_name] = {grp.group_id: self._create_nodes_prop_map(grp) + for grp in node_pop.groups} + + def build_nodes(self): + raise NotImplementedError + + def build_recurrent_edges(self): + raise NotImplementedError + + def add_edges(self, sonata_file, populations=None, source_pop=None, target_pop=None): + """ + + :param sonata_file: + :param populations: + :param source_pop: + :param target_pop: + :return: + """ + edges = sonata_file.edges + selected_populations = edges.population_names if populations is None else populations + + for pop_name in selected_populations: + if pop_name not in edges: + continue + + edge_pop = edges[pop_name] + self._preprocess_edge_types(edge_pop) + + # Check the source nodes exists + src_pop = source_pop if source_pop is not None else edge_pop.source_population + is_internal_src = src_pop in self._internal_populations_map.keys() + is_external_src = src_pop in self._virtual_populations_map.keys() + + trg_pop = target_pop if target_pop is not None else edge_pop.target_population + is_internal_trg = trg_pop in self._internal_populations_map.keys() + + if not is_internal_trg: + self.io.log_exception(('Node population {} does not exists (or consists of only virtual nodes). ' + + '{} edges cannot create connections.').format(trg_pop, pop_name)) + + if not (is_internal_src or is_external_src): + self.io.log_exception('Source node population {} not found. Please update {} edges'.format(src_pop, + pop_name)) + if is_internal_src: + if trg_pop not in self._recurrent_edges: + self._recurrent_edges[trg_pop] = [] + self._recurrent_edges[trg_pop].append(edge_pop) + + if is_external_src: + if trg_pop not in self._external_edges: + self._external_edges[(src_pop, trg_pop)] = [] + self._external_edges[(src_pop, trg_pop)].append(edge_pop) + + self._edge_property_maps[pop_name] = {grp.group_id: self._create_edges_prop_map(grp) + for grp in edge_pop.groups} + + @classmethod + def from_config(cls, conf, **properties): + """Generates a graph structure from a json config file or dictionary. + + :param conf: name of json config file, or a dictionary with config parameters + :param properties: optional properties. + :return: A graph object of type cls + """ + graph = cls(**properties) + if isinstance(conf, basestring): + config = graph._from_json(conf) + elif isinstance(conf, dict): + config = conf + else: + graph.io.log_exception('Could not convert {} (type "{}") to json.'.format(conf, type(conf))) + + run_dict = config['run'] + if 'spike_threshold' in run_dict: + # TODO: FIX, spike-thresholds should be set by simulation code, allow for diff. values based on node-group + graph.spike_threshold = run_dict['spike_threshold'] + if 'dL' in run_dict: + graph.dL = run_dict['dL'] + + if not config.with_networks: + graph.io.log_exception('Could not find any network files. Unable to build network.') + + # load components + for name, value in config.components.items(): + graph.add_component(name, value) + graph._validate_components() + + # load nodes + for node_dict in config.nodes: + nodes_net = sonata.File(data_files=node_dict['nodes_file'], data_type_files=node_dict['node_types_file']) + graph.add_nodes(nodes_net) + + # load edges + for edge_dict in config.edges: + target_network = edge_dict['target'] if 'target' in edge_dict else None + source_network = edge_dict['source'] if 'source' in edge_dict else None + edge_net = sonata.File(data_files=edge_dict['edges_file'], data_type_files=edge_dict['edge_types_file']) + graph.add_edges(edge_net, source_pop=target_network, target_pop=source_network) + + ''' + graph.io.log_info('Building cells.') + graph.build_nodes() + + graph.io.log_info('Building recurrent connections') + graph.build_recurrent_edges() + ''' + + return graph diff --git a/bmtk-vb/bmtk/simulator/utils/io.py b/bmtk-vb/bmtk/simulator/utils/io.py new file mode 100644 index 0000000..b6e5e5c --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/io.py @@ -0,0 +1,54 @@ +import os +import shutil +import logging + + +class IOUtils(object): + def __init__(self): + self.mpi_rank = 0 + self.mpi_size = 1 + + self._log_format = '%(asctime)s [%(levelname)s] %(message)s' + self._logger = logging.getLogger() + self.set_console_logging() + + @property + def logger(self): + return None + + def set_console_logging(self): + pass + + def barrier(self): + pass + + def quit(self): + exit(1) + + def setup_output_dir(self, config_dir, log_file, overwrite=True): + if self.mpi_rank == 0: + # Create output directory + if os.path.exists(config_dir): + if overwrite: + shutil.rmtree(config_dir) + else: + self.log_exception('ERROR: Directory already exists (remove or set to overwrite).') + os.makedirs(config_dir) + + # Create log file + if log_file is not None: + file_logger = logging.FileHandler(log_file) + file_logger.setFormatter(self._log_format) + self.logger.addHandler(file_logger) + self.log_info('Created log file') + + self.barrier() + + def log_info(self, message, all_ranks=False): + print(message) + + def log_warning(self, message, all_ranks=False): + print(message) + + def log_exception(self, message): + raise Exception(message) diff --git a/bmtk-vb/bmtk/simulator/utils/load_spikes.py b/bmtk-vb/bmtk/simulator/utils/load_spikes.py new file mode 100644 index 0000000..8c16caf --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/load_spikes.py @@ -0,0 +1,91 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +import numpy as np +import os +import datetime + + +def load_spikes_ascii(file_name): + ''' + Load ascii spike file + ''' + t = os.path.getmtime(file_name) + print(file_name, "modified on:", datetime.datetime.fromtimestamp(t)) + spk_ts,spk_gids = np.loadtxt(file_name, + dtype='float32,int', + unpack=True) + + spk_ts=spk_ts*1E-3 + + print('loaded spikes from ascii') + + return [spk_ts,spk_gids] + + +def load_spikes_h5(file_name): + ''' + Load ascii spike file + ''' + + t = os.path.getmtime(file_name) + print(file_name, "modified on:", datetime.datetime.fromtimestamp(t)) + + with h5py.File(file_name,'r') as h5: + + spk_ts=h5["time"][...]*1E-3 + spk_gids=h5["gid"][...] + + + print('loaded spikes from hdf5') + + return [spk_ts,spk_gids] + + +def load_spikes_nwb(file_name,trial_name): + + ''' + Load spikes from the nwb file + + Returns: + ------- + + spike_times: list + spike_gids: list + ''' + f5 = h5py.File(file_name, 'r') + + + spike_trains_handle = f5['processing/%s/spike_train' % trial_name] # nwb.SpikeTrain.get_processing(f5,'trial_0') + + spike_times = [] + spike_gids = [] + + for gid in spike_trains_handle.keys(): + + times_gid = spike_trains_handle['%d/data' %int(gid)][:] + spike_times.extend(times_gid) + spike_gids.extend([int(gid)]*len(times_gid)) + + return [np.array(spike_times)*1E-3,np.array(spike_gids)] + diff --git a/bmtk-vb/bmtk/simulator/utils/nwb.py b/bmtk-vb/bmtk/simulator/utils/nwb.py new file mode 100644 index 0000000..4d18d16 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/nwb.py @@ -0,0 +1,530 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import copy +import numpy as np +import os +import h5py +import time +import uuid +import tempfile +from bmtk.analyzer.visualization.widgets import PlotWidget, MovieWidget + +__version__ = '0.1.0' + +allowed_dimensions = {'firing_rate': ('hertz',), + 'time': ('second', 'millisecond'), + 'brightness': ('intensity',), + 'distance': ('pixel',), + 'index': ('gid',), + 'intensity': ('bit',None), + 'voltage': ('volt',), + 'current': ('ampere',), + None: (None,), + 'dev': ('dev',)} + +allowed_groups = {'firing_rate': ('firing_rate',), + 'spike_train': ('index', 'time'), + 'grayscale_movie': ('intensity',), + 'time_series': ('voltage', 'current'), + 'dev': ('dev',)} + +top_level_data = ['file_create_date', + 'stimulus', + 'acquisition', + 'analysis', + 'processing', + 'epochs', + 'general', + 'session_description', + 'nwb_version', + 'identifier'] + + +def open_file(file_name): + return h5py.File(file_name) + + +class Scale(object): + def __init__(self, scale_range, dimension, unit): + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + + self.scale_range = scale_range + self.dimension = dimension + self.unit = unit + self._hdf5_location = None + + def __eq__(self, other): + d = self.dimension == other.dimension + u = self.unit == other.unit + s = np.allclose(self.scale_range, other.scale_range) + return d and u and s + + @ property + def data(self): + return self.scale_range + + +class DtScale(object): + def __init__(self, dt, dimension, unit): + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + + self.dt = dt + self.dimension = dimension + self.unit = unit + self._hdf5_location = None + + def __eq__(self, other): + d = self.dimension == other.dimension + u = self.unit == other.unit + s = np.allclose(self.scale_range, other.scale_range) + return d and u and s + + @ property + def data(self): + return self.dt + + +class NullScale(object): + + def __init__(self): + self._hdf5_location = None + self.data = None + self.dimension = None + self.unit = None + + +class Data(object): + def __init__(self, data, dimension, unit, scales, metadata): + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + if isinstance(scales, (Scale, DtScale)): + assert len(data.shape) == 1 + scales = (scales,) + + for key in metadata.iterkeys(): + assert isinstance(key, (str, unicode)) + for ii, scale in enumerate(scales): + if isinstance(scale, Scale): + assert len(scale.scale_range) == data.shape[ii] + elif isinstance(scale, DtScale): + assert isinstance(scale.dt, (float, np.float)) and scale.dt > 0 + else: + raise Exception + + if len(scales) == 0: + scales = [NullScale()] + + metadata = copy.copy(metadata) + self.data = data + self.scales = scales + self.dimension = dimension + self.unit = unit + self.metadata = metadata + self._hdf5_location = None + + def __eq__(self, other): + da = np.allclose(self.data, other.data) + d = self.dimension == other.dimension + u = self.unit == other.unit + s = [s1 == s2 for s1, s2 in zip(self.scales, other.scales)].count(True) == len(self.scales) + if len(self.metadata) != len(other.metadata): + m = False + else: + try: + sum = 0 + for key in self.metadata.keys(): + sum += other.metadata[key] == self.metadata[key] + assert sum == len(self.metadata) + m = True + except: + m = False + return da and d and u and s and m + + @staticmethod + def _get_from_group(object_class, parent_group, group_name, ii=0): + + data_group = parent_group['%s/%s' % (group_name, ii)] + data, scales, dimension, unit, metadata = _get_data(data_group) + + assert dimension in allowed_groups[object_class.group] + + if unit == "None": + unit = None + scale_list = [] + for scale in scales: + if scale.attrs['type'] == 'Scale': + curr_scale = Scale(scale, scale.attrs['dimension'], scale.attrs['unit']) + elif scale.attrs['type'] == 'DtScale': + curr_scale = DtScale(float(scale.value), scale.attrs['dimension'], scale.attrs['unit']) + elif scale.attrs['type'] == 'NullScale': + curr_scale = None + else: + raise Exception + if curr_scale is not None: + scale_list.append(curr_scale) + + if len(scale_list) == 1: + scale_list = scale_list[0] + + return object_class(data, dimension=dimension, unit=unit, scale=scale_list, metadata=metadata) + + def add_to_stimulus(self, f, compression='gzip', compression_opts=4): + self._add_to_group(f, 'stimulus', self.__class__.group, compression=compression, + compression_opts=compression_opts) + + @classmethod + def get_stimulus(cls, f, ii=None): + if ii is None: + return_data = [cls.get_stimulus(f, ii) for ii in range(len(f['stimulus/%s' % cls.group]))] + if len(return_data) == 1: + return_data = return_data[0] + return return_data + else: + return Data._get_from_group(cls, f['stimulus'], cls.group, ii=ii) + + def add_to_acquisition(self, f, compression='gzip', compression_opts=4): + self._add_to_group(f, 'acquisition', self.__class__.group, compression=compression, + compression_opts=compression_opts) + + @classmethod + def get_acquisition(cls, f, ii=None): + if ii is None: + return_data = [cls.get_acquisition(f, ii) for ii in range(len(f['acquisition/%s' % cls.group]))] + if len(return_data) == 1: + return_data = return_data[0] + return return_data + + else: + return Data._get_from_group(cls, f['acquisition'], cls.group, ii=ii) + + def add_to_processing(self, f, processing_submodule_name): + if processing_submodule_name not in f['processing']: + f['processing'].create_group(processing_submodule_name) + return self._add_to_group(f, 'processing/%s' % processing_submodule_name, self.__class__.group) + + @classmethod + def get_processing(cls, f, subgroup_name, ii=None): + if ii is None: + return_data = {} + for ii in range(len(f['processing/%s/%s' % (subgroup_name, cls.group)])): + return_data[ii] = cls.get_processing(f, subgroup_name, ii) + return return_data + + else: + return Data._get_from_group(cls, f['processing/%s' % subgroup_name], cls.group, ii=ii) + + def add_to_analysis(self, f, analysis_submodule_name): + if analysis_submodule_name not in f['analysis']: + f['analysis'].create_group(analysis_submodule_name) + return self._add_to_group(f, 'analysis/%s' % analysis_submodule_name, self.__class__.group) + + @classmethod + def get_analysis(cls, f, subgroup_name, ii=None): + if ii is None: + return [cls.get_analysis(f, ii, subgroup_name) + for ii in range(len(f['analysis/%s/%s' % (subgroup_name, cls.group)]))] + else: + return Data._get_from_group(cls, f['analysis/%s' % subgroup_name], cls.group, ii=ii) + + def _add_to_group(self, f, parent_name, group_name, compression='gzip', compression_opts=4): + assert group_name in allowed_groups + assert self.dimension in allowed_groups[group_name] + try: + parent_group = f[parent_name] + except ValueError: + try: + file_name = f.filename + raise Exception('Parent group:%s not found in file %s' % parent_name, file_name) + except ValueError: + raise Exception('File not valid: %s' % f) + + if self.__class__.group in parent_group: + subgroup = parent_group[self.__class__.group] + int_group_name = str(len(subgroup)) + else: + subgroup = parent_group.create_group(self.__class__.group) + int_group_name = '0' + + # Create external link: + if isinstance(self.data, h5py.Dataset): + if subgroup.file == self.data.file: + raise NotImplementedError + else: + return _set_data_external_link(subgroup, int_group_name, self.data.parent) + else: + dataset_group = subgroup.create_group(int_group_name) + + # All this to allow do shared scale management: + scale_group = None + scale_list = [] + for ii, scale in enumerate(self.scales): + if isinstance(scale, (Scale, DtScale, NullScale)): + if scale._hdf5_location is None: + if scale_group is None: + scale_group = dataset_group.create_group('scale') + curr_scale = _set_scale(scale_group, 'dimension_%s' % ii, scale.data, scale.dimension, + scale.unit, scale.__class__.__name__) + scale._hdf5_location = curr_scale + else: + curr_scale = _set_scale(scale_group, 'dimension_%s' % ii, scale.data, scale.dimension, + scale.unit, scale.__class__.__name__) + scale._hdf5_location = curr_scale + else: + curr_scale = scale._hdf5_location + elif isinstance(scale, h5py.Dataset): + curr_scale = scale + else: + raise Exception + + scale_list.append(curr_scale) + + _set_data(subgroup, dataset_group.name, self.data, scale_list, self.dimension, self.unit, + metadata=self.metadata, compression=compression, compression_opts=compression_opts) + + +class FiringRate(Data): + group = 'firing_rate' + + def __init__(self, data, **kwargs): + dimension = 'firing_rate' + unit = 'hertz' + scale = kwargs.get('scale') + metadata = kwargs.get('metadata', {}) + assert isinstance(scale, (Scale, DtScale)) + super(FiringRate, self).__init__(data, dimension, unit, scale, metadata) + + def get_widget(self, **kwargs): + rate_data = self.data[:] + t_range = self.scales[0].data[:] + return PlotWidget(t_range, rate_data, metadata=self.metadata, **kwargs) + + +class Dev(Data): + group = 'dev' + + def __init__(self, data, **kwargs): + dimension = kwargs.get('dimension') + unit = kwargs.get('unit') + scale = kwargs.get('scale') + metadata = kwargs.get('metadata', {}) + + super(Dev, self).__init__(data, dimension, unit, scale, metadata) + + +class TimeSeries(Data): + group = 'time_series' + + def __init__(self, data, **kwargs): + dimension = kwargs.get('dimension') + unit = kwargs.get('unit') + scale = kwargs.get('scale') + metadata = kwargs.get('metadata', {}) + + assert isinstance(scale, (Scale, DtScale)) + assert scale.dimension == 'time' + super(TimeSeries, self).__init__(data, dimension, unit, scale, metadata) + + +class SpikeTrain(Data): + group = 'spike_train' + + def __init__(self, data, **kwargs): + scales = kwargs.get('scale',[]) + unit = kwargs.get('unit', 'gid') + metadata = kwargs.get('metadata',{}) + + if isinstance(scales, Scale): + super(SpikeTrain, self).__init__(data, 'index', unit, scales, metadata) + elif len(scales) == 0: + assert unit in allowed_dimensions['time'] + scales = [] + super(SpikeTrain, self).__init__(data, 'time', unit, scales, metadata) + else: + assert len(scales) == 1 and isinstance(scales[0], Scale) + super(SpikeTrain, self).__init__(data, 'index', unit, scales, metadata) + + +class GrayScaleMovie(Data): + group = 'grayscale_movie' + + def __init__(self, data, **kwargs): + dimension = 'intensity' + unit = kwargs.get('unit', None) + scale = kwargs.get('scale') + metadata = kwargs.get('metadata', {}) + + super(GrayScaleMovie, self).__init__(data, dimension, unit, scale, metadata) + + def get_widget(self, ax=None): + data = self.data[:] + t_range = self.scales[0].data[:] + return MovieWidget(t_range=t_range, data=data, ax=ax, metadata=self.metadata) + + +def get_temp_file_name(): + f = tempfile.NamedTemporaryFile(delete=False) + temp_file_name = f.name + f.close() + os.remove(f.name) + return temp_file_name + + +def create_blank_file(save_file_name=None, force=False, session_description='', close=False): + + if save_file_name is None: + save_file_name = get_temp_file_name() + + if not force: + f = h5py.File(save_file_name, 'w-') + else: + if os.path.exists(save_file_name): + os.remove(save_file_name) + f = h5py.File(save_file_name, 'w') + + f.create_group('acquisition') + f.create_group('analysis') + f.create_group('epochs') + f.create_group('general') + f.create_group('processing') + f.create_group('stimulus') + + f.create_dataset("file_create_date", data=np.string_(time.ctime())) + f.create_dataset("session_description", data=session_description) + f.create_dataset("nwb_version", data='iSee_%s' % __version__) + f.create_dataset("identifier", data=str(uuid.uuid4())) + + if close: + f.close() + else: + return f + + +def assert_subgroup_exists(child_name, parent): + try: + assert child_name in parent + except: + raise RuntimeError('Group: %s has no subgroup %s' % (parent.name, child_name)) + + +def _set_data_external_link(parent_group, dataset_name, data): + parent_group[dataset_name] = h5py.ExternalLink(data.file.filename, data.name) + + +def _set_scale_external_link(parent_group, name, scale): + print(parent_group, name, scale) + print(scale.file.filename, scale.name) + parent_group[name] = h5py.ExternalLink(scale.file.filename, scale.name) + return parent_group[name] + + +def _set_data(parent_group, dataset_name, data, scales, dimension, unit, force=False, metadata={}, compression='gzip', + compression_opts=4): + # Check inputs: + if isinstance(scales, h5py.Dataset): + scales = (scales,) + else: + assert isinstance(scales, (list, tuple)) + + assert data.ndim == len(scales) + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + for ii, scale in enumerate(scales): + assert len(scale.shape) in (0, 1) + check_dimension = str(scale.attrs['dimension']) + if check_dimension == 'None': + check_dimension = None + check_unit = scale.attrs['unit'] + if check_unit == 'None': + check_unit = None + assert check_dimension in allowed_dimensions + assert check_unit in allowed_dimensions[check_dimension] + if len(scale.shape) == 1: + assert len(scale) == data.shape[ii] or len(scale) == 0 + + if dataset_name not in parent_group: + dataset_group = parent_group.create_group(dataset_name) + else: + dataset_group = parent_group[dataset_name] + + for key, val in metadata.iteritems(): + assert key not in dataset_group.attrs + dataset_group.attrs[key] = val + + if 'data' in dataset_group: + if not force: + raise IOError('Field "stimulus" of %s is not empty; override with force=True' % parent_group.name) + else: + del dataset_group['data'] + + dataset = dataset_group.create_dataset(name='data', data=data, compression=compression, + compression_opts=compression_opts) + + for ii, scale in enumerate(scales): + dataset.dims[ii].label = scale.attrs['dimension'] + dataset.dims[ii].attach_scale(scale) + + dataset.attrs.create('dimension', str(dimension)) + dataset.attrs.create('unit', str(unit)) + + return dataset + + +def _set_scale(parent_group, name, scale, dimension, unit, scale_class_name): + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + + if scale is None: + scale = parent_group.create_dataset(name=name, shape=(0,)) + else: + scale = np.array(scale) + assert scale.ndim in (0, 1) + scale = parent_group.create_dataset(name=name, data=scale) + scale.attrs['dimension'] = str(dimension) + scale.attrs['unit'] = str(unit) + scale.attrs['type'] = scale_class_name + + return scale + + +def _get_data(dataset_group): + data = dataset_group['data'] + dimension = dataset_group['data'].attrs['dimension'] + unit = dataset_group['data'].attrs['unit'] + scales = tuple([dim[0] for dim in dataset_group['data'].dims]) + metadata = dict(dataset_group.attrs) + + return data, scales, dimension, unit, metadata + + +def get_stimulus(f): + category = 'stimulus' + for parent_group in f[category]: + for data_group in f[category][parent_group]: + print(f[category][parent_group][data_group]) + + +def add_external_links(parent_group, external_file_name, external_group_name_list=top_level_data): + for subgroup in external_group_name_list: + parent_group[subgroup] = h5py.ExternalLink(external_file_name, subgroup) diff --git a/bmtk-vb/bmtk/simulator/utils/property_maps.py b/bmtk-vb/bmtk/simulator/utils/property_maps.py new file mode 100644 index 0000000..9a22515 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/property_maps.py @@ -0,0 +1,7 @@ +class NodePropertyMap(object): + pass + + +class EdgePropertyMap(object): + pass + diff --git a/bmtk-vb/bmtk/simulator/utils/scripts/convert_filters.py b/bmtk-vb/bmtk/simulator/utils/scripts/convert_filters.py new file mode 100644 index 0000000..298c101 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/scripts/convert_filters.py @@ -0,0 +1,71 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import numpy as np +from bmtk.simulator.utils import nwb +import pickle +import re + +pickle_regex = re.compile('.*\.pkl') + +def convert_filters(src_dir, tgt_dir): + + for file_name in os.listdir(src_dir): + if not pickle_regex.match(file_name) is None: + + print 'Converting: %s' % file_name + + full_path_to_src_file = os.path.join(src_dir, file_name) + full_path_to_tgt_file = os.path.join(tgt_dir, file_name).replace('.pkl', '.nwb') + + try: + f = nwb.NWB(file_name=full_path_to_tgt_file, + identifier='iSee example filter dataset', + description='Convering an example inhomogenous Poisson rate collection from a filter to drive simulations') + + # Load data from file: + data = pickle.load(open(full_path_to_src_file, 'r')) + timestamps = data['t'] + + # Load first cell into file: + ts0 = f.create_timeseries('TimeSeries', "Cell_0", "acquisition") + ts0.set_data(data['cells'][0], unit='Hz', resolution=float('nan'), conversion=1.) + ts0.set_time_by_rate(0.,1000.) + ts0.set_value('num_samples', len(timestamps)) + ts0.finalize() + + # Load remaining cells into file, linking timestamps: + for ii in np.arange(1,len(data['cells'])): + ts = f.create_timeseries('TimeSeries', "Cell_%s" % ii, "acquisition") + ts.set_data(data['cells'][ii], unit='Hz', resolution=float('nan'), conversion=1.) + ts.set_time_by_rate(0.,1000.) + ts.set_value('num_samples', len(timestamps)) + ts.finalize() + + # Close out: + f.close() + + except: + print ' Conversion failed: %s' % file_name + + diff --git a/bmtk-vb/bmtk/simulator/utils/sim_validator.py b/bmtk-vb/bmtk/simulator/utils/sim_validator.py new file mode 100644 index 0000000..447dda1 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/sim_validator.py @@ -0,0 +1,126 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +from jsonschema import Draft4Validator +from jsonschema.exceptions import ValidationError +import pandas as pd + + +class SimConfigValidator(Draft4Validator): + """ + A JSON Schema validator class that will store a schema (passed into the constructor) and validate a json file. + It has all the functionality of the JSONSchema format, plus includes special types and parameters like making + sure a value is a file or directory type, checking csv files, etc. + + To Use: + validator = SimConfigValidator(json_schema.json) + validator.validate(file.json) + """ + + def __init__(self, schema, types=(), resolver=None, format_checker=None, file_formats=()): + super(SimConfigValidator, self).__init__(schema, types, resolver, format_checker) + + # custom parameter + self.VALIDATORS["exists"] = self._check_path + + self._file_formats = {} # the "file_format" property the validity of a (non-json) file. + for (name, schema) in file_formats: + self._file_formats[name] = self._parse_file_formats(schema) + self.VALIDATORS["file_format"] = self._validate_file + + def is_type(self, instance, dtype): + # override type since checking for file and directory type is potentially more complicated. + if dtype == "directory": + return self._is_directory_type(instance) + + elif dtype == "file": + return self._is_file_type(instance) + + else: + return super(SimConfigValidator, self).is_type(instance, dtype) + + def _is_directory_type(self, instance): + """Check if instance value is a valid directory file path name + + :param instance: string that represents a directory path + :return: True if instance is a valid dir path (even if it doesn't exists). + """ + # Always return true for now, rely on the "exists" property (_check_path) to actual determine if file exists. + # TODO: check that instance string is a valid path string, even if path doesn't yet exists. + return True + + def _is_file_type(self, instance): + """Check if instance value is a valid file path. + + :param instance: string of file path + :return: True if instance is a valid file path (but doesn't necessary exists), false otherwise. + """ + # Same issue as with _is_directory_type + return True + + def _parse_file_formats(self, schema_file): + # Open the schema file and based on "file_type" property create a Format validator + schema = json.load(open(schema_file, 'r')) + if schema['file_type'] == 'csv': + return self._CSVFormat(schema) + else: + return Exception("No format found") + + @staticmethod + def _check_path(validator, schema_bool, path, schema): + """Makes sure a file/directory exists or doesn't based on the "exists" property in the schema + + :param validator: + :param schema_bool: True means file must exists, False means file should not exists + :param path: path of the file + :param schema: + :return: True if schema is satisfied. + """ + assert(schema['type'] == 'directory' or schema['type'] == 'file') + path_exists = os.path.exists(path) + if path_exists != schema_bool: + raise ValidationError("{} {} exists.".format(path, "already" if path_exists else "does not")) + + def _validate_file(self, validator, file_format, file_path, schema): + file_validator = self._file_formats.get(file_format, None) + if file_validator is None: + raise ValidationError("Could not find file validator {}".format(file_format)) + + if not file_validator.check(file_path): + raise ValidationError("File {} could not be validated against {}.".format(file_path, file_format)) + + # A series of validators for indivdiual types of files. All of them should have a check(file) function that returns + # true only when it is formated correctly. + class _CSVFormat(object): + def __init__(self, schema): + self._properties = schema['file_properties'] + self._required_columns = [header for header, props in schema['columns'].items() if props['required']] + + def check(self, file_name): + csv_headers = set(pd.read_csv(file_name, nrows=0, **self._properties).columns) + for col in self._required_columns: + if col not in csv_headers: + return False + + return True diff --git a/bmtk-vb/bmtk/simulator/utils/sim_validator.pyc b/bmtk-vb/bmtk/simulator/utils/sim_validator.pyc new file mode 100644 index 0000000..3a844c8 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/sim_validator.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/simulation_inputs.py b/bmtk-vb/bmtk/simulator/utils/simulation_inputs.py new file mode 100644 index 0000000..bdd1588 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/simulation_inputs.py @@ -0,0 +1,77 @@ + +class SimInput(object): + registry = {} # For factory function + + def __init__(self, input_name, input_type, module, params): + self.name = input_name + self.input_type = input_type + self.module = module + self.params = params.copy() + + # Remove the 'module' and 'input_type' from the params since user should access it through the variable + for param_key in ['module', 'input_type']: + if param_key in self.params: + del self.params[param_key] + + # Special variable, not a part of standard but still want for ease of testing + if 'enabled' in params: + self.enabled = params['enabled'] + del params['enabled'] + else: + self.enabled = True + + # Fill in missing values with default (as specified by the subclass) + for var_name, default_val in self._get_defaults(): + if var_name not in self.params: + self.params[var_name] = default_val + + # Check there are no missing parameters + + @property + def node_set(self): + return self.params.get('node_set', None) + + def _get_defaults(self): + return [] + + @classmethod + def build(cls, input_name, params): + params = params.copy() + if 'module' not in params: + raise Exception('inputs setting {} does not specify the "module".'.format(input_name)) + + if 'input_type' not in params: + raise Exception('inputs setting {} does not specify the "input_type".'.format(input_name)) + + module_name = params['module'] + input_type = params['input_type'] + module_cls = SimInput.registry.get(module_name, SimInput) + + return module_cls(input_name, input_type, module_name, params) + + @classmethod + def register_module(cls, subclass): + # For factory, register subclass based on the module name(s) + assert(issubclass(subclass, cls)) + mod_registry = cls.registry + mod_list = subclass.avail_modules() + modules = mod_list if isinstance(mod_list, list) else [mod_list] + for mod_name in modules: + if mod_name in mod_registry: + raise Exception('Multiple modules named {}'.format(mod_name)) + mod_registry[mod_name] = subclass + + return subclass + + +def from_config(cfg): + inputs_list = [] + for input_name, input_params in cfg.inputs.items(): + input_setting = SimInput.build(input_name, input_params) + if input_setting.enabled: + inputs_list.append(input_setting) + + return inputs_list + + + diff --git a/bmtk-vb/bmtk/simulator/utils/simulation_inputs.pyc b/bmtk-vb/bmtk/simulator/utils/simulation_inputs.pyc new file mode 100644 index 0000000..66568ab Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/simulation_inputs.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/simulation_reports.py b/bmtk-vb/bmtk/simulator/utils/simulation_reports.py new file mode 100644 index 0000000..a7bffd9 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/simulation_reports.py @@ -0,0 +1,284 @@ +import os + + +class SimReport(object): + default_dir = '.' + registry = {} # Used by factory to keep track of subclasses + + def __init__(self, name, module, params): + self.report_name = name + self.module = module + self.params = params + + # Not part of standard, just want a quick way to turn off modules + if 'enabled' in params: + self.enabled = params['enabled'] + del params['enabled'] + else: + self.enabled = True + + # Set default parameter values (when not explicity stated). Should occur on a module-by-module basis + self._set_defaults() + + @property + def node_set(self): + return self.params.get('cells', 'all') + + def _set_defaults(self): + for var_name, default_val in self._get_defaults(): + if var_name not in self.params: + self.params[var_name] = default_val + + def _get_defaults(self): + """Should be overwritten by subclass with list of (var_name, default_val) tuples.""" + return [] + + @staticmethod + def avail_modules(): + # Return a string (or list of strings) to identify module name for each subclass + raise NotImplementedError + + @classmethod + def build(cls, report_name, params): + """Factory method to get the module subclass, using the params (particularlly the 'module' value, which is + required). If there is no registered subclass a generic SimReport object will be returned + + :param report_name: name of report + :param params: parameters of report + :return: A SimReport (or subclass) object with report parameters parsed out. + """ + params = params.copy() + if 'module' not in params: + raise Exception('report {} does not specify the module.'.format(report_name)) + + module_name = params['module'] + del params['module'] + module_cls = SimReport.registry.get(module_name, SimReport) + return module_cls(report_name, module_name, params) + + @classmethod + def register_module(cls, subclass): + # For factory, register subclass based on the module name(s) + assert(issubclass(subclass, cls)) + mod_registry = cls.registry + mod_list = subclass.avail_modules() + modules = mod_list if isinstance(mod_list, list) else [mod_list] + for mod_name in modules: + if mod_name in mod_registry: + raise Exception('Multiple modules named {}'.format(mod_name)) + mod_registry[mod_name] = subclass + + return subclass + + +@SimReport.register_module +class MembraneReport(SimReport, object): + def __init__(self, report_name, module, params): + super(MembraneReport, self).__init__(report_name, module, params) + # Want variable_name option to allow for singular of list of params + variables = params['variable_name'] + if isinstance(variables, list): + self.params['variable_name'] = variables + else: + self.params['variable_name'] = [variables] + self.variables = self.params['variable_name'] + + self.params['buffer_data'] = self.params.pop('buffer') + + if self.params['transform'] and not isinstance(self.params['transform'], dict): + self.params['transform'] = {var_name: self.params['transform'] for var_name in self.variables} + + def _get_defaults(self): + # directory for saving temporary files created during simulation + tmp_dir = self.default_dir + + # Find the report file name. Either look for "file_name" parameter, or else it is .h5 + if 'file_name' in self.params: + file_name = self.params['file_name'] + elif self.report_name.endswith('.h5') or self.report_name.endswith('.hdf') \ + or self.report_name.endswith('.hdf5'): + file_name = self.report_name # Check for case report.h5.h5 + else: + file_name = '{}.h5'.format(self.report_name) + + return [('cells', 'biophysical'), ('sections', 'all'), ('tmp_dir', tmp_dir), ('file_name', file_name), + ('buffer', True), ('transform', {})] + + def add_variables(self, var_name, transform): + self.params['variable_name'].extend(var_name) + self.params['transform'].update(transform) + + def can_combine(self, other): + def param_eq(key): + return self.params.get(key, None) == other.params.get(key, None) + + return param_eq('cells') and param_eq('sections') and param_eq('file_name') and param_eq('buffer') + + @staticmethod + def avail_modules(): + return 'membrane_report' + + @classmethod + def build(cls, name, params): + report = cls(name) + report.cells = params.get('cells', 'biophysical') + report.sections = params.get('sections', 'all') + + if 'file_name' in params: + report.file_name = params['file_name'] + report.tmp_dir = os.path.dirname(os.path.realpath(report.file_name)) + else: + report.file_name = os.path.join(cls.default_dir, 'cell_vars.h5') + report.tmp_dir = cls.default_dir + + variables = params['variable_name'] + if isinstance(variables, list): + report.variables = variables + else: + report.variables = [variables] + + return report + + +@SimReport.register_module +class SpikesReport(SimReport): + def __init__(self, report_name, module, params): + super(SpikesReport, self).__init__(report_name, module, params) + + @classmethod + def build(cls, name, params): + return None + + @staticmethod + def avail_modules(): + return 'spikes_report' + + @classmethod + def from_output_dict(cls, output_dict): + params = { + 'spikes_file': output_dict.get('spikes_file', None), + 'spikes_file_csv': output_dict.get('spikes_file_csv', None), + 'spikes_file_nwb': output_dict.get('spikes_file_nwb', None), + 'spikes_sort_order': output_dict.get('spikes_sort_order', None), + 'tmp_dir': output_dict.get('output_dir', cls.default_dir) + } + if not (params['spikes_file'] or params['spikes_file_csv'] or params['spikes_file_nwb']): + # User hasn't specified any spikes file + params['enabled'] = False + + return cls('spikes_report', 'spikes_report', params) + + +@SimReport.register_module +class SEClampReport(SimReport): + def __init__(self, report_name, module, params): + super(SEClampReport, self).__init__(report_name, module, params) + + @staticmethod + def avail_modules(): + return 'SEClamp' + + +@SimReport.register_module +class ECPReport(SimReport): + def __init__(self, report_name, module, params): + super(ECPReport, self).__init__(report_name, module, params) + self.tmp_dir = self.default_dir + self.positions_file = None + self.file_name = None + + @staticmethod + def avail_modules(): + return 'extracellular' + + def _get_defaults(self): + if 'file_name' in self.params: + file_name = self.params['file_name'] + elif self.report_name.endswith('.h5') or self.report_name.endswith('.hdf') \ + or self.report_name.endswith('.hdf5'): + file_name = self.report_name # Check for case report.h5.h5 + else: + file_name = '{}.h5'.format(self.report_name) + + return [('tmp_dir', self.default_dir), ('file_name', file_name), + ('contributions_dir', os.path.join(self.default_dir, 'ecp_contributions'))] + + @classmethod + def build(cls, name, params): + report = cls(name) + + if 'file_name' in params: + report.file_name = params['file_name'] + report.tmp_dir = os.path.dirname(os.path.realpath(report.file_name)) + else: + report.file_name = os.path.join(cls.default_dir, 'ecp.h5') + report.tmp_dir = cls.default_dir + + report.contributions_dir = params.get('contributions_dir', cls.default_dir) + report.positions_file = params['electrode_positions'] + return report + + +@SimReport.register_module +class SaveSynapses(SimReport): + def __init__(self, report_name, module, params): + super(SaveSynapses, self).__init__(report_name, module, params) + + @staticmethod + def avail_modules(): + return 'SaveSynapses' + + +@SimReport.register_module +class MultimeterReport(MembraneReport): + + @staticmethod + def avail_modules(): + return ['multimeter', 'multimeter_report'] + + +@SimReport.register_module +class SectionReport(MembraneReport): + + @staticmethod + def avail_modules(): + return ['section_report'] + + +def from_config(cfg): + SimReport.default_dir = cfg.output_dir + + reports_list = [] + membrane_reports = [] + has_spikes_report = False + for report_name, report_params in cfg.reports.items(): + # Get the Report class from the module_name parameter + if not report_params.get('enabled', True): + # not a part of the standard but will help skip modules + continue + + report = SimReport.build(report_name, report_params) + + if isinstance(report, MembraneReport): + # When possible for membrane reports combine multiple reports into one module if all the parameters + # except for the variable name differs. + for existing_report in membrane_reports: + if existing_report.can_combine(report): + existing_report.add_variables(report.variables, report.params['transform']) + break + else: + reports_list.append(report) + membrane_reports.append(report) + + else: + reports_list.append(report) + + if not has_spikes_report: + report = SpikesReport.from_output_dict(cfg.output) + if report is None: + # TODO: Log exception or possibly warning + pass + else: + reports_list.append(report) + + return reports_list diff --git a/bmtk-vb/bmtk/simulator/utils/simulation_reports.pyc b/bmtk-vb/bmtk/simulator/utils/simulation_reports.pyc new file mode 100644 index 0000000..0704f77 Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/simulation_reports.pyc differ diff --git a/bmtk-vb/bmtk/simulator/utils/stimulus/LocallySparseNoise.py b/bmtk-vb/bmtk/simulator/utils/stimulus/LocallySparseNoise.py new file mode 100644 index 0000000..ee43e9f --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/stimulus/LocallySparseNoise.py @@ -0,0 +1,137 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from scipy.misc import imresize +import os +import pandas as pd + +stimulus_folder = os.path.dirname(os.path.abspath(__file__)) +bob_stimlus = os.path.join(stimulus_folder,'lsn.npy') + +class LocallySparseNoise (object): + + def __init__(self,stim_template=None, stim_table=None): + + if stim_template is None or stim_table is None: + raise Exception("stim_template or stim_table not provided. Please provide them or call the class methods .with_new_stimulus or .with_bob_stimulus.") + else: + self.stim_template = stim_template + self.stim_table = stim_table + + T,y,x = stim_template.shape + + self.T = T + self.y = y + self.x = x + + + def get_image_input(self, new_size=None, add_channels=False): + + if new_size is not None: + y,x = new_size + data_new_size = np.empty((self.T,y,x),dtype=np.float32) + + for t in range(self.stim_template.shape[0]): + data_new_size[t] = imresize(self.stim_template[t].astype(np.float32),new_size,interp='nearest') + + if add_channels: + return data_new_size[:,:,:,np.newaxis] + else: + return data_new_size + + @staticmethod + def exclude(av,y_x,exclusion=0): + y, x = y_x + X,Y = np.meshgrid(np.arange(av.shape[1]), np.arange(av.shape[0])) + + mask = ((X-x)**2 + (Y-y)**2) <= exclusion**2 + av[mask] = False + + @classmethod + def create_sparse_noise_matrix(cls,Y=16,X=28,exclusion=5,T=9000, buffer_x=6, buffer_y=6): + + Xp = X+2*buffer_x + Yp = Y+2*buffer_y + + # 127 is mean luminance value + sn = 127*np.ones([T,Yp,Xp],dtype=np.uint8) + + for t in range(T): + available = np.ones([Yp,Xp]).astype(np.bool) + + while np.any(available): + y_available, x_available = np.where(available) + + pairs = zip(y_available,x_available) + pair_index = np.random.choice(range(len(pairs))) + y,x = pairs[pair_index] + + p = np.random.random() + if p < 0.5: + sn[t,y,x] = 255 + else: + sn[t,y,x] = 0 + + cls.exclude(available,(y,x),exclusion=exclusion) + + return sn[:,buffer_y:(Y+buffer_y), buffer_x:(X+buffer_x)] + + def save_to_hdf(self): + + pass + + @staticmethod + def generate_stim_table(T,start_time=0,trial_length=250): + '''frame_length is in milliseconds''' + + start_time_array = trial_length*np.arange(T) + start_time + column_list = [np.arange(T),start_time_array, start_time_array+trial_length-1] # -1 is because the tables in BOb use inclusive intervals, so we'll stick to that convention + cols = np.vstack(column_list).T + stim_table = pd.DataFrame(cols,columns=['frame','start','end']) + + return stim_table + + + @classmethod + def with_new_stimulus(cls,Y=16,X=28,exclusion=5,T=9000, buffer_x=6, buffer_y=6): + + stim_template = cls.create_sparse_noise_matrix(Y=Y,X=X,exclusion=exclusion,T=T, buffer_x=buffer_x, buffer_y=buffer_y) + T,y,x = stim_template.shape + + stim_table = cls.generate_stim_table(T) + + new_locally_sparse_noise = cls(stim_template=stim_template, stim_table=stim_table) + + return new_locally_sparse_noise + + @classmethod + def with_brain_observatory_stimulus(cls): + + stim_template = np.load(bob_stimlus) + T,y,x = stim_template.shape + + stim_table = cls.generate_stim_table(T) + + new_locally_sparse_noise = cls(stim_template=stim_template, stim_table=stim_table) + + return new_locally_sparse_noise diff --git a/bmtk-vb/bmtk/simulator/utils/stimulus/NaturalScenes.py b/bmtk-vb/bmtk/simulator/utils/stimulus/NaturalScenes.py new file mode 100644 index 0000000..b04056b --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/stimulus/NaturalScenes.py @@ -0,0 +1,337 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import os +from PIL import Image +import pandas as pd + +class NaturalScenes (object): + def __init__(self, new_size=(64,112), mode='L', dtype=np.float32, start_time=0, trial_length=250, add_channels=False): + + self.new_size = new_size + self.mode = mode + self.dtype = dtype + self.add_channels = add_channels + + + + def random_sample(self, n): + sample_indices = np.random.randint(0, self.num_images, n) + return self.stim_template[sample_indices] + + # also a method random_sample_with_labels ? + def random_sample_with_labels(self, n): + pass + + def get_image_input(self,**kwargs): + return self.stim_template + + def add_gray_screen(self): + + gray_screen = np.ones(self.new_size,dtype=self.dtype)*127 # using 127 as "gray" value + if self.add_channels: + gray_screen = gray_screen[:,:,np.newaxis] + self.stim_template = np.vstack([self.stim_template, gray_screen[np.newaxis,:,:]]) + + start = int(self.stim_table.tail(1)['end']) + 1 + end = start+self.trial_length-1 #make trial_length an argument of this function? + frame = int(self.stim_table.tail(1)['frame']) + 1 + + self.stim_table = self.stim_table.append(pd.DataFrame([[frame,start,end]],columns=['frame','start','end']),ignore_index=True) + + self.label_dataframe = self.label_dataframe.append(pd.DataFrame([['gray_screen']],columns=['image_name']),ignore_index=True) + self.num_images = self.num_images + 1 + + @classmethod + def with_brain_observatory_stimulus(cls, new_size=(64,112), mode='L', dtype=np.float32, start_time=0, trial_length=250, add_channels=False): + + from sys import platform + + if platform=='linux2': + image_dir = '/data/mat/iSee_temp_shared/CAM_Images.icns' + elif platform=='darwin': + + image_dir = '/Users/michaelbu/Data/Images/CAM_Images.icns' + if not os.path.exists(image_dir): + print("Detected platform: OS X. I'm assuming you've mounted \\\\aibsdata\\mat at /Volumes/mat/") + image_dir = '/Volumes/mat/iSee_temp_shared/CAM_Images.icns' + + + elif platform=='win32': + image_dir = r'\\aibsdata\mat\iSee_temp_shared\CAM_Images.icns' + + #image_dir = '/Users/michaelbu/Data/Images/CAM_Images' # change this to temp directory on aibsdata + new_ns = cls.with_new_stimulus_from_dataframe(image_dir=image_dir, new_size=new_size, mode=mode, dtype=dtype, start_time=start_time, trial_length=trial_length, add_channels=add_channels) + + new_ns.add_gray_screen() + + return new_ns + + @staticmethod + def generate_stim_table(T,start_time=0,trial_length=250): + '''frame_length is in milliseconds''' + + start_time_array = trial_length*np.arange(T) + start_time + column_list = [np.arange(T),start_time_array, start_time_array+trial_length-1] # -1 is because the tables in BOb use inclusive intervals, so we'll stick to that convention + cols = np.vstack(column_list).T + stim_table = pd.DataFrame(cols,columns=['frame','start','end']) + + return stim_table + + def to_h5(self,sample_indices=None): + pass + + @classmethod + def with_new_stimulus_from_folder(cls, image_dir, new_size=(64,112), mode='L', dtype=np.float32, start_time=0, trial_length=250, add_channels=False): + + new_ns = cls(new_size=new_size, mode=mode, dtype=dtype, start_time=start_time, trial_length=trial_length, add_channels=add_channels) + + new_ns.im_list = os.listdir(image_dir) + new_ns.image_dir = image_dir + + stim_list = [] + for im in new_ns.im_list: + try: + im_data = Image.open(os.path.join(new_ns.image_dir,im)) + except IOError: + print("Skipping file: ", im) + new_ns.im_list.remove(im) + + im_data = im_data.convert(new_ns.mode) + if new_size is not None: + im_data = im_data.resize((new_ns.new_size[1], new_ns.new_size[0])) + im_data = np.array(im_data,dtype=new_ns.dtype) + if add_channels: + im_data = im_data[:,:,np.newaxis] + stim_list.append(im_data) + + new_ns.stim_template = np.stack(stim_list) + new_ns.num_images = new_ns.stim_template.shape[0] + + t,y,x = new_ns.stim_template.shape + new_ns.new_size = (y,x) + + new_ns.trial_length = trial_length + new_ns.start_time = start_time + new_ns.stim_table = new_ns.generate_stim_table(new_ns.num_images,start_time=new_ns.start_time,trial_length=new_ns.trial_length) + + new_ns.label_dataframe = pd.DataFrame(columns=['image_name']) + new_ns.label_dataframe['image_name'] = new_ns.im_list + + return new_ns + + @classmethod + def with_new_stimulus_from_dataframe(cls, image_dir, new_size=(64,112), mode='L', dtype=np.float32, start_time=0, trial_length=250, add_channels=False): + '''image_dir should contain a folder of images called 'images' and an hdf5 file with a + dataframe called 'label_dataframe.h5' with the frame stored in the key 'labels'. + dataframe should have columns ['relative_image_path','label_1', 'label_2', ...]''' + + new_ns = cls(new_size=new_size, mode=mode, dtype=dtype, start_time=start_time, trial_length=trial_length, add_channels=add_channels) + + image_path = os.path.join(image_dir,'images') + label_dataframe = pd.read_hdf(os.path.join(image_dir,'label_dataframe.h5'),'labels') + new_ns.label_dataframe = label_dataframe + + new_ns.image_dir = image_path + new_ns.im_list = list(label_dataframe.image_name) + + stim_list = [] + for im in new_ns.im_list: + try: + im_data = Image.open(os.path.join(image_path,im)) + except IOError: + print("Skipping file: ", im) + new_ns.im_list.remove(im) + + im_data = im_data.convert(new_ns.mode) + if new_size is not None: + im_data = im_data.resize((new_ns.new_size[1], new_ns.new_size[0])) + im_data = np.array(im_data,dtype=new_ns.dtype) + if add_channels: + im_data = im_data[:,:,np.newaxis] + stim_list.append(im_data) + + new_ns.stim_template = np.stack(stim_list) + new_ns.num_images = new_ns.stim_template.shape[0] + + if add_channels: + t,y,x,_ = new_ns.stim_template.shape + else: + t,y,x = new_new.stim_template.shape + new_ns.new_size = (y,x) + + new_ns.trial_length = trial_length + new_ns.start_time = start_time + new_ns.stim_table = new_ns.generate_stim_table(new_ns.num_images,start_time=new_ns.start_time,trial_length=new_ns.trial_length) + + return new_ns + + @staticmethod + def create_image_dir_from_hierarchy(folder, new_path, label_names=None): + + import shutil + + image_dataframe = pd.DataFrame(columns=["image_name"]) + + if os.path.exists(new_path): + raise Exception("path "+new_path+" already exists!") + + os.mkdir(new_path) + os.mkdir(os.path.join(new_path,'images')) + for path, sub_folders, file_list in os.walk(folder): + + for f in file_list: + try: + im_data = Image.open(os.path.join(path,f)) + except IOError: + print("Skipping file: ", f) + im_data = None + + if im_data is not None: + shutil.copy(os.path.join(path,f), os.path.join(new_path,'images',f)) + image_name = f + label_vals = os.path.split(os.path.relpath(path,folder)) + if label_names is not None: + current_label_names = label_names[:] + else: + current_label_names = [] + + if len(label_vals) > current_label_names: + labels_to_add = ["label_"+str(i) for i in range(len(current_label_names), len(label_vals))] + current_label_names += labels_to_add + elif len(label_vals) < current_label_names: + current_label_names = current_label_names[:len(label_vals)] + + vals = [f] + list(label_vals) + cols = ['image_name']+current_label_names + new_frame = pd.DataFrame([vals],columns=cols) + + image_dataframe = image_dataframe.append(new_frame,ignore_index=True) + + image_dataframe.to_hdf(os.path.join(new_path,'label_dataframe.h5'),'labels') + + # @staticmethod + # def add_object_to_image(image, object_image): + # + # new_image = image.copy() + # new_image[np.isfinite(object_image)] = object_image[np.isfinite(object_image)] + # return new_image + + @staticmethod + def add_object_to_template(template, object_image): + + if template.ndim==3: + T,y,x = template.shape + elif template.ndim==4: + T,y,x,K = template.shape + else: + raise Exception("template.ndim must be 3 or 4") + + if object_image.ndim < template.ndim-1: + object_image=object_image[:,:,np.newaxis] + + new_template = template.copy() + new_template[:,np.isfinite(object_image)] = object_image[np.isfinite(object_image)] + + return new_template + + def add_objects_to_foreground(self, object_dict): + + template_list = [] + + if self.label_dataframe is None: + self.label_dataframe = pd.DataFrame(columns=['object']) + + new_label_dataframe_list = [] + + for obj in object_dict: + template_list.append(self.add_object_to_template(self.stim_template,object_dict[obj])) + obj_dataframe = self.label_dataframe.copy() + obj_dataframe['object'] = [ obj for i in range(self.num_images) ] + new_label_dataframe_list.append(obj_dataframe) + + self.stim_template = np.vstack(template_list) + self.label_dataframe = pd.concat(new_label_dataframe_list,ignore_index=True) + + self.num_images = self.stim_template.shape[0] + + self.stim_table = self.generate_stim_table(self.num_images,start_time=self.start_time,trial_length=self.trial_length) + + + @staticmethod + def create_object_dict(folder, background_shape=(64,112), dtype=np.float32, rotations=False): + + from scipy.misc import imresize + + # resize function to preserve the nans in the background + def resize_im(im,new_shape): + def mask_for_nans(): + mask = np.ones(im.shape) + mask[np.isfinite(im)] = 0 + mask = imresize(mask,new_shape,interp='nearest') + + return mask.astype(np.bool) + + new_im = im.copy() + new_im = new_im.astype(dtype) + new_im[np.isnan(new_im)] = -1. + new_im = imresize(new_im,new_shape,interp='nearest') + + new_im = new_im.astype(dtype) + new_im[mask_for_nans()] = np.nan + + return new_im + + def im_on_background(im, shift=None): + bg = np.empty(background_shape) + bg[:] = np.nan + + buffer_x = (background_shape[1] - im.shape[1])/2 + buffer_y = (background_shape[0] - im.shape[0])/2 + + bg[buffer_y:im.shape[0]+buffer_y, buffer_x:im.shape[1]+buffer_x] = im + + return bg + + im_list = os.listdir(folder) + + obj_dict = {} + + for im_file in im_list: + try: + im = np.load(os.path.join(folder,im_file)) + except IOError: + print("skipping file: ", im_file) + im = None + + if im is not None: + new_shape = (np.min(background_shape), np.min(background_shape)) + im = resize_im(im,new_shape) + obj_dict[im_file[:-4]] = im_on_background(im) + if rotations: + im_rot=im.copy() + for i in range(3): + im_rot = np.rot90(im_rot) + obj_dict[im_file[:-4]+'_'+str(90*(i+1))] = im_on_background(im_rot) + + return obj_dict diff --git a/bmtk-vb/bmtk/simulator/utils/stimulus/StaticGratings.py b/bmtk-vb/bmtk/simulator/utils/stimulus/StaticGratings.py new file mode 100644 index 0000000..c7bf9cb --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/stimulus/StaticGratings.py @@ -0,0 +1,100 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd + + +class StaticGratings (object): + + def __init__(self,orientations=30.0*np.arange(6),spatial_frequencies=0.01*(2.0**np.arange(1,6)),phases=0.25*np.arange(4),num_trials=50, start_time=0, trial_length=250): + + self.orientations = orientations + self.spatial_frequencies = spatial_frequencies + self.phases = phases + self.num_trials = num_trials + self.start_time = start_time + self.trial_length = trial_length + + trial_stims = np.array([ [orientation, spat_freq, phase] for orientation in self.orientations for spat_freq in self.spatial_frequencies for phase in self.phases ]) + + trial_stims = np.tile(trial_stims,(num_trials,1)) + + indices = np.random.permutation(trial_stims.shape[0]) + trial_stims = trial_stims[indices] + + self.stim_table = pd.DataFrame(trial_stims,columns=['orientation','spatial_frequency','phase']) + + T = self.stim_table.shape[0] + self.T = T + start_time_array = trial_length*np.arange(self.T) + start_time + end_time_array = start_time_array + trial_length + + self.stim_table['start'] = start_time_array + self.stim_table['end'] = end_time_array + + def get_image_input(self,new_size=(64,112),pix_per_degree=1.0, dtype=np.float32, add_channels=False): + + y, x = new_size + stim_template = np.empty([self.T, y, x],dtype=dtype) + + for t, row in self.stim_table.iterrows(): + ori, sf, ph = row[0], row[1], row[2] + + theta = ori*np.pi/180.0 #convert to radians + + k = (sf/pix_per_degree) # radians per pixel + ph = ph*np.pi*2.0 + + X,Y = np.meshgrid(np.arange(x),np.arange(y)) + X = X - x/2 + Y = Y - y/2 + Xp, Yp = self.rotate(X,Y,theta) + + stim_template[t] = np.cos(2.0*np.pi*Xp*k + ph) + + self.stim_template = stim_template + + if add_channels: + return stim_template[:,:,:,np.newaxis] + else: + return stim_template + + @staticmethod + def rotate(X,Y, theta): + + Xp = X*np.cos(theta) - Y*np.sin(theta) + Yp = X*np.sin(theta) + Y*np.cos(theta) + + return Xp, Yp + + @classmethod + def with_brain_observatory_stimulus(cls, num_trials=50): + + orientations = 30.0*np.arange(6) + spatial_frequencies = 0.01*(2.0**np.arange(1,6)) + phases = 0.25*np.arange(4) + + start_time = 0 + trial_length = 250 + + return cls(orientations=orientations,spatial_frequencies=spatial_frequencies,phases=phases,num_trials=num_trials,start_time=start_time,trial_length=trial_length) diff --git a/bmtk-vb/bmtk/simulator/utils/stimulus/__init__.py b/bmtk-vb/bmtk/simulator/utils/stimulus/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/stimulus/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/bmtk/simulator/utils/stimulus/lsn.npy b/bmtk-vb/bmtk/simulator/utils/stimulus/lsn.npy new file mode 100644 index 0000000..f4358ae Binary files /dev/null and b/bmtk-vb/bmtk/simulator/utils/stimulus/lsn.npy differ diff --git a/bmtk-vb/bmtk/simulator/utils/tools/__init__.py b/bmtk-vb/bmtk/simulator/utils/tools/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/tools/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/bmtk/simulator/utils/tools/process_spikes.py b/bmtk-vb/bmtk/simulator/utils/tools/process_spikes.py new file mode 100644 index 0000000..0f5519a --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/tools/process_spikes.py @@ -0,0 +1,207 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +import numpy as np +import pandas as pd +import os + + +def read_spk_txt(f_name): + + ''' + + Parameters + ---------- + f_name: string + Full path to a file containing cell IDs and spike times. + + Returns + ------- + A dataframe containing two columns: spike times and cell IDs. + + Usage: + x = read_spk_txt('output/spk.dat') + + ''' + + df = pd.read_csv(f_name, header=None, sep=' ') + df.columns = ['t', 'gid'] + + return df + + +def read_spk_h5(f_name): + + ''' + + Parameters + ---------- + f_name: string + Full path to a file containing cell IDs and spike times. + + Returns + ------- + A dataframe containing two columns: spike times and cell IDs. + + Usage: + x = read_spk_h5('output/spk.h5') + + ''' + + f = h5py.File(f_name, 'r' , libver='latest') + spikes = {} + + t = np.array([]) + gids = np.array([]) + for i, gid in enumerate(f.keys()): # save spikes of all gids + if (i % 1000 == 0): + print(i) + spike_times = f[gid][...] + t = np.append(t, spike_times) + gids = np.append(gids, np.ones(spike_times.size)*int(gid)) + + f.close() + + df = pd.DataFrame(columns=['t', 'gid']) + df['t'] = t + df['gid'] = gids + + return df + + +def spikes_to_mean_f_rate(cells_f, spk_f, t_window, **kwargs): + + ''' + + Parameters + ---------- + cells_f: string + Full path to a file containing information about all cells (in particular, all cell IDs, + and not just those that fired spikes in a simulation). + spk_f: string + Full path to a file containing cell IDs and spike times. + t_window: a tuple of two floats + Start and stop time for the window within which the firing rate is computed. + **kwargs + spk_f_type: string with accepted values 'txt' or 'h5' + Type of the file from which spike times should be extracted. + + + Assumptions + ----------- + It is assumed here that TIME IS in ms and the RATES ARE RETURNED in Hz. + + + Returns + ------- + A dataframe containing a column of cell IDs and a column of corresponding + average firing rates. + + Usage: + x = spikes_to_mean_f_rate('../network_model/cells.csv', 'output/spk.dat', (500.0, 3000.0)) + + ''' + + # Make sure the time window's start and stop times are reasonable. + t_start = t_window[0] + t_stop = t_window[1] + delta_t = t_stop - t_start + if (delta_t <= 0.0): + print('spikes_to_mean_f_rate: stop time %f is <= start time %f; exiting.' % (t_stop, t_start)) + quit() + + # Read information about all cells. + cells_df = pd.read_csv(cells_f, sep=' ') + gids = cells_df['id'].values + + # By default, the spk file type is "None", in which case it should be chosen + # based on the extension of the supplied spk file name. + spk_f_type = kwargs.get('spk_f_type', None) + if (spk_f_type == None): + spk_f_ext = spk_f.split('.')[-1] + if (spk_f_ext in ['txt', 'dat']): + spk_f_type = 'txt' # Assume this is an ASCII file. + elif (spk_f_ext in ['h5']): + spk_f_type = 'h5' # Assume this is an HDF5 file. + else: + print('spikes_to_mean_f_rate: unrecognized file extension. Use the flag spk_f_type=\'txt\' or \'h5\' to override this message. Exiting.') + quit() + + # In case the spk_f_type was provided directly, check that the value is among those the code recognizes. + if (spk_f_type not in ['txt', 'h5']): + print('spikes_to_mean_f_rate: unrecognized value of spk_f_type. The recognized values are \'txt\' or \'h5\'. Exiting.') + quit() + + # Read spikes. + # If the spike file has zero size, create a dataframe with all rates equal to zero. + # Otherwise, use spike times from the file to fill the dataframe. + if (os.stat(spk_f).st_size == 0): + f_rate_df = pd.DataFrame(columns=['gid', 'f_rate']) + f_rate_df['gid'] = gids + f_rate_df['f_rate'] = np.zeros(gids.size) + else: + # Use the appropriate function to read the spikes. + if (spk_f_type == 'txt'): + df = read_spk_txt(spk_f) + elif(spk_f_type == 'h5'): + df = read_spk_h5(spk_f) + + # Keep only those entries that have spike times within the time window. + df = df[(df['t'] >= t_start) & (df['t'] <= t_stop)] + + # Compute rates. + f_rate_df = df.groupby('gid').count() * 1000.0 / delta_t # Time is in ms and rate is in Hz. + f_rate_df.columns = ['f_rate'] + # The 'gid' label is now used as index (after the groupby operation). + # Convert it to a column; then change the index name to none, as in default. + f_rate_df['gid'] = f_rate_df.index + f_rate_df.index.names = [''] + + # Find cell IDs from the spk file that are not in the cell file. + # Remove them from the dataframe with rates. + gids_not_in_cells_f = f_rate_df['gid'].values[~np.in1d(f_rate_df['gid'].values, gids)] + f_rate_df = f_rate_df[~f_rate_df['gid'].isin(gids_not_in_cells_f)] + + # Find cell IDs from the cell file that do not have counterparts in the spk file + # (for example, because those cells did not fire). + # Add these cell IDs to the dataframe; fill rates with zeros. + gids_not_in_spk = gids[~np.in1d(gids, f_rate_df['gid'].values)] + f_rate_df = f_rate_df.append(pd.DataFrame(np.array([gids_not_in_spk, np.zeros(gids_not_in_spk.size)]).T, columns=['gid', 'f_rate'])) + + # Sort the rows according to the cell IDs. + f_rate_df = f_rate_df.sort('gid', ascending=True) + + return f_rate_df + + +# Tests. + +#x = spikes_to_mean_f_rate('/data/mat/yazan/corticalCol/ice/sims/column/build/net_structure/cells.csv', '/data/mat/yazan/corticalCol/ice/sims/column/full_preliminary_runs/output008/spikes.txt', (500.0, 2500.0)) +#print x + +#x = spikes_to_mean_f_rate('/data/mat/yazan/corticalCol/ice/sims/column/build/net_structure/cells.csv', '/data/mat/yazan/corticalCol/ice/sims/column/full_preliminary_runs/output008/spikes.h5', (500.0, 2500.0)) +#print x + +#x = spikes_to_mean_f_rate('/data/mat/yazan/corticalCol/ice/sims/column/build/net_structure/cells.csv', '/data/mat/yazan/corticalCol/ice/sims/column/full_preliminary_runs/output008/spikes.txt', (500.0, 2500.0), spk_f_type='txt') +#print x + diff --git a/bmtk-vb/bmtk/simulator/utils/tools/spatial.py b/bmtk-vb/bmtk/simulator/utils/tools/spatial.py new file mode 100644 index 0000000..9b331d0 --- /dev/null +++ b/bmtk-vb/bmtk/simulator/utils/tools/spatial.py @@ -0,0 +1,26 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + + +def example(): + print('OK') diff --git a/bmtk-vb/bmtk/test.py~ b/bmtk-vb/bmtk/test.py~ new file mode 100644 index 0000000..2d77926 --- /dev/null +++ b/bmtk-vb/bmtk/test.py~ @@ -0,0 +1,3 @@ +from bmtk.builder.networks import NetworkBuilder + +net = NetworkBuilder("cortical-column") diff --git a/bmtk-vb/bmtk/tests/builder/test_connection_map.py b/bmtk-vb/bmtk/tests/builder/test_connection_map.py new file mode 100644 index 0000000..9043d7b --- /dev/null +++ b/bmtk-vb/bmtk/tests/builder/test_connection_map.py @@ -0,0 +1,116 @@ +import pytest +from itertools import product + +from bmtk.builder.connection_map import ConnectionMap +from bmtk.builder import NetworkBuilder + + +@pytest.fixture +def net(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, x=range(100), ei='i') + net.add_nodes(N=50, x=range(50), y='y', ei='e') + return net + + +def test_connection_map_fnc(net): + cm = ConnectionMap(sources=net.nodes(ei='i'), targets=net.nodes(ei='e'), + connector=lambda s, t, a, b: s['node_id']*t['node_id'], + connector_params={'a': 1, 'b': 0}, iterator='one_to_one', + edge_type_properties={'prop1': 'prop1', 'edge_type_id': 101}) + assert(len(cm.source_nodes) == 100) + assert(len(cm.target_nodes) == 50) + assert(cm.params == []) + assert(cm.iterator == 'one_to_one') + assert(len(cm.edge_type_properties.keys()) == 2) + assert(cm.edge_type_id == 101) + for v in cm.connection_itr(): + src_id, trg_id, val = v + assert(val == src_id*trg_id) + + +def test_connection_map_num(net): + cm = ConnectionMap(sources=net.nodes(ei='i'), targets=net.nodes(ei='e'), connector=10) + count = 0 + for v in cm.connection_itr(): + src_id, trg_id, val = v + assert(val == 10) + count += 1 + assert(count == 5000) + + +def test_connection_map_list(net): + cm = ConnectionMap(sources=net.nodes(ei='i'), targets=net.nodes(ei='e'), + connector=[s.node_id*t.node_id for s, t in product(net.nodes(ei='i'), net.nodes(ei='e'))]) + count = 0 + for v in cm.connection_itr(): + src_id, trg_id, val = v + assert(val == src_id*trg_id) + count += 1 + assert(count == 5000) + + +def test_connection_map_dict(net): + cm = ConnectionMap(sources=net.nodes(ei='i'), targets=net.nodes(ei='e'), connector={'nsyn': 10}) + for v in cm.connection_itr(): + src_id, trg_id, val = v + assert('nsyn' in val and val['nsyn'] == 10) + + +def test_cm_params1(net): + cm = ConnectionMap(sources=net.nodes(ei='i'), targets=net.nodes(ei='e'), + connector=lambda s, t: 3, + edge_type_properties={'prop1': 'prop1', 'edge_type_id': 101}) + cm.add_properties(names='syn_weight', rule=lambda a: a+0.15, rule_params={'a': 0.20}, dtypes=float) + + assert(len(cm.params) == 1) + edge_props_1 = cm.params[0] + assert(edge_props_1.names == 'syn_weight') + assert(edge_props_1.get_prop_dtype('syn_weight') == float) + for v in cm.connection_itr(): + src_id, trg_id, nsyn = v + assert(nsyn == 3) + assert(edge_props_1.rule() == 0.35) + + +def test_cm_params2(net): + cm = ConnectionMap(sources=net.nodes(ei='i'), targets=net.nodes(ei='e'), + connector=lambda s, t: 3, + edge_type_properties={'prop1': 'prop1', 'edge_type_id': 101}) + cm.add_properties(names=['w', 'c'], rule=0.15, dtypes=[float, str]) + + assert(len(cm.params) == 1) + edge_props_1 = cm.params[0] + assert(edge_props_1.names == ['w', 'c']) + assert(edge_props_1.get_prop_dtype('w')) + assert (edge_props_1.get_prop_dtype('c')) + for v in cm.connection_itr(): + src_id, trg_id, nsyn = v + assert(nsyn == 3) + assert(edge_props_1.rule() == 0.15) + + +def test_cm_params3(net): + cm = ConnectionMap(sources=net.nodes(ei='i'), targets=net.nodes(ei='e'), + connector=lambda s, t: 3, + edge_type_properties={'prop1': 'prop1', 'edge_type_id': 101}) + cm.add_properties(names=['w', 'c'], rule=0.15, dtypes=[float, str]) + cm.add_properties(names='a', rule=(1, 2, 3), dtypes=dict) + + assert(len(cm.params) == 2) + edge_props_1 = cm.params[0] + assert(edge_props_1.names == ['w', 'c']) + assert(edge_props_1.get_prop_dtype('w')) + assert(edge_props_1.get_prop_dtype('c')) + for v in cm.connection_itr(): + src_id, trg_id, nsyn = v + assert(nsyn == 3) + assert(edge_props_1.rule() == 0.15) + + edge_props_2 = cm.params[1] + assert(edge_props_2.names == 'a') + assert(edge_props_2.get_prop_dtype('a')) + assert(edge_props_2.rule() == (1, 2, 3)) + + +test_connection_map_fnc(net()) \ No newline at end of file diff --git a/bmtk-vb/bmtk/tests/builder/test_connector.py b/bmtk-vb/bmtk/tests/builder/test_connector.py new file mode 100644 index 0000000..99aef6f --- /dev/null +++ b/bmtk-vb/bmtk/tests/builder/test_connector.py @@ -0,0 +1,44 @@ +from bmtk.builder import connector + + +def test_fnc_params(): + con_fnc = connector.create(connector=lambda x, p: x**p) + assert(con_fnc(2, 3) == 2**3) + + +def test_fnc_noparams(): + con_fnc = connector.create(connector=lambda x, p, a:x**p+a, a=10) + assert(con_fnc(2, 3) == 2**3+10) + + +def test_literal(): + con_fnc = connector.create(connector=100.0) + assert(con_fnc() == 100.0) + + con_fnc1 = connector.create(connector=101.0, a=10, b='10') # parameters in literals should be ignored + assert(con_fnc1() == 101.0) + + +def test_list(): + con_fnc = connector.create(connector=['a', 'b', 'c']) + assert(con_fnc == ['a', 'b', 'c']) + + con_fnc1 = connector.create(connector=[100, 200, 300], p1=1, p2='2', p34=(3,4)) + assert(con_fnc1 == [100, 200, 300]) + + +def test_dict(): + con_fnc = connector.create(connector={'a': 1, 'b': 'b', 'c': [5, 6]}) + assert('a' in con_fnc()) + assert('b' in con_fnc()) + assert('c' in con_fnc()) + + con_fnc = connector.create(connector={'a': 1, 'b': 'b', 'c': [5, 6]}, p1='p1', p2=2) + assert('a' in con_fnc()) + assert('b' in con_fnc()) + assert('c' in con_fnc()) + + +#test_dict() +#test_connector_fnc_params() +#test_connector_fnc_noparams() \ No newline at end of file diff --git a/bmtk-vb/bmtk/tests/builder/test_densenetwork.py b/bmtk-vb/bmtk/tests/builder/test_densenetwork.py new file mode 100644 index 0000000..81dfdc7 --- /dev/null +++ b/bmtk-vb/bmtk/tests/builder/test_densenetwork.py @@ -0,0 +1,307 @@ +import os +import shutil +import pytest +import numpy as np +import pandas as pd +import h5py +import tempfile + +from bmtk.builder import NetworkBuilder + + +def test_create_network(): + net = NetworkBuilder('NET1') + assert(net.name == 'NET1') + assert(net.nnodes == 0) + assert(net.nedges == 0) + assert(net.nodes_built is False) + assert(net.edges_built is False) + + +def test_no_name(): + with pytest.raises(Exception): + NetworkBuilder('') + + +def test_build_nodes(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, + position=[(100.0, -50.0, 50.0)]*100, + tunning_angle=np.linspace(0, 365.0, 100, endpoint=False), + cell_type='Scnna1', + model_type='Biophys1', + location='V1', + ei='e') + + net.add_nodes(N=25, + position=np.random.rand(25, 3)*[100.0, 50.0, 100.0], + model_type='intfire1', + location='V1', + ei='e') + + net.add_nodes(N=150, + position=np.random.rand(150, 3)*[100.0, 50.0, 100.0], + tunning_angle=np.linspace(0, 365.0, 150, endpoint=False), + cell_type='SST', + model_type='Biophys1', + location='V1', + ei='i') + + net.build() + assert(net.nodes_built is True) + assert(net.nnodes == 275) + assert(net.nedges == 0) + assert(len(net.nodes()) == 275) + assert(len(net.nodes(ei='e')) == 125) + assert(len(net.nodes(model_type='Biophys1')) == 250) + assert(len(net.nodes(location='V1', model_type='Biophys1'))) + + intfire_nodes = list(net.nodes(model_type='intfire1')) + assert(len(intfire_nodes) == 25) + node1 = intfire_nodes[0] + assert(node1['model_type'] == 'intfire1' and 'cell_type' not in node1) + + +def test_build_nodes1(): + net = NetworkBuilder('NET1') + net.add_nodes(N=3, node_id=[100, 200, 300], node_type_id=101, name=['one', 'two', 'three']) + node_one = list(net.nodes(name='one'))[0] + assert(node_one['name'] == 'one') + assert(node_one['node_id'] == 100) + assert(node_one['node_type_id'] == 101) + + node_three = list(net.nodes(name='three'))[0] + assert(node_three['name'] == 'three') + assert(node_three['node_id'] == 300) + assert(node_three['node_type_id'] == 101) + + +def test_build_nodes_fail1(): + net = NetworkBuilder('NET1') + with pytest.raises(Exception): + net.add_nodes(N=100, list1=[100]*99) + + +def test_build_nodes_fail2(): + net = NetworkBuilder('NET1') + with pytest.raises(Exception): + net.add_nodes(N=2, node_type_id=0) + net.add_nodes(N=2, node_type_id=0) + + +def test_nsyn_edges(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, cell_type='Scnna1', ei='e') + net.add_nodes(N=100, cell_type='PV1', ei='i') + net.add_nodes(N=100, cell_type='PV2', ei='i') + net.add_edges(source={'ei': 'i'}, target={'ei': 'e'}, connection_rule=lambda s, t: 1) # 200*100 = 20000 edges + net.add_edges(source=net.nodes(cell_type='Scnna1'), target=net.nodes(cell_type='PV1'), + connection_rule=lambda s, t: 2) # 100*100*2 = 20000 + net.build() + assert(net.nedges == 20000 + 20000) + assert(net.edges_built is True) + #print list(net.edges()) + + +def test_save_nsyn_table(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, position=[(0.0, 1.0, -1.0)]*100, cell_type='Scnna1', ei='e') + net.add_nodes(N=100, position=[(0.0, 1.0, -1.0)]*100, cell_type='PV1', ei='i') + net.add_nodes(N=100, position=[(0.0, 1.0, -1.0)]*100, tags=np.linspace(0, 100, 100), cell_type='PV2', ei='i') + net.add_edges(source={'ei': 'i'}, target={'ei': 'e'}, connection_rule=lambda s, t: 1, + p1='e2i', p2='e2i') # 200*100 = 20000 edges + net.add_edges(source=net.nodes(cell_type='Scnna1'), target=net.nodes(cell_type='PV1'), + connection_rule=lambda s, t: 2, p1='s2p') # 100*100*2 = 20000 + net.build() + nodes_h5 = tempfile.NamedTemporaryFile(suffix='.h5') + nodes_csv = tempfile.NamedTemporaryFile(suffix='.csv') + edges_h5 = tempfile.NamedTemporaryFile(suffix='.h5') + edges_csv = tempfile.NamedTemporaryFile(suffix='.csv') + + net.save_nodes(nodes_h5.name, nodes_csv.name) + net.save_edges(edges_h5.name, edges_csv.name) + + assert(os.path.exists(nodes_h5.name) and os.path.exists(nodes_csv.name)) + node_types_df = pd.read_csv(nodes_csv.name, sep=' ') + assert(len(node_types_df) == 3) + assert('cell_type' in node_types_df.columns) + assert('ei' in node_types_df.columns) + assert('positions' not in node_types_df.columns) + + nodes_h5 = h5py.File(nodes_h5.name, 'r') + assert ('node_id' in nodes_h5['/nodes/NET1']) + assert (len(nodes_h5['/nodes/NET1/node_id']) == 300) + assert (len(nodes_h5['/nodes/NET1/node_type_id']) == 300) + assert (len(nodes_h5['/nodes/NET1/node_group_id']) == 300) + assert (len(nodes_h5['/nodes/NET1/node_group_index']) == 300) + + node_groups = {nid: grp for nid, grp in nodes_h5['/nodes/NET1'].items() if isinstance(grp, h5py.Group)} + for grp in node_groups.values(): + if len(grp) == 1: + assert ('position' in grp and len(grp['position']) == 200) + + elif len(grp) == 2: + assert ('position' in grp and len(grp['position']) == 100) + assert ('tags' in grp and len(grp['tags']) == 100) + + else: + assert False + + assert(os.path.exists(edges_h5.name) and os.path.exists(edges_csv.name)) + edge_types_df = pd.read_csv(edges_csv.name, sep=' ') + assert (len(edge_types_df) == 2) + assert ('p1' in edge_types_df.columns) + assert ('p2' in edge_types_df.columns) + + edges_h5 = h5py.File(edges_h5.name, 'r') + assert('source_to_target' in edges_h5['/edges/NET1_to_NET1/indicies']) + assert ('target_to_source' in edges_h5['/edges/NET1_to_NET1/indicies']) + assert (len(edges_h5['/edges/NET1_to_NET1/target_node_id']) == 30000) + assert (len(edges_h5['/edges/NET1_to_NET1/source_node_id']) == 30000) + + assert (edges_h5['/edges/NET1_to_NET1/target_node_id'][0] == 0) + assert (edges_h5['/edges/NET1_to_NET1/source_node_id'][0] == 100) + assert (edges_h5['/edges/NET1_to_NET1/edge_group_index'][0] == 0) + assert (edges_h5['/edges/NET1_to_NET1/edge_type_id'][0] == 100) + assert (edges_h5['/edges/NET1_to_NET1/0/nsyns'][0] == 1) + + assert (edges_h5['/edges/NET1_to_NET1/target_node_id'][29999] == 199) + assert (edges_h5['/edges/NET1_to_NET1/source_node_id'][29999] == 99) + assert (edges_h5['/edges/NET1_to_NET1/edge_group_id'][29999] == 0) + assert (edges_h5['/edges/NET1_to_NET1/edge_type_id'][29999] == 101) + assert (edges_h5['/edges/NET1_to_NET1/0/nsyns'][29999] == 2) + + #try: + # os.remove('tmp_nodes.h5') + # os.remove('tmp_node_types.csv') + # os.remove('tmp_edges.h5') + # os.remove('tmp_edge_types.csv') + #except: + # pass + + +def test_save_weights(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, position=[(0.0, 1.0, -1.0)]*100, cell_type='Scnna1', ei='e') + net.add_nodes(N=100, position=[(0.0, 1.0, -1.0)]*100, cell_type='PV1', ei='i') + net.add_nodes(N=100, position=[(0.0, 1.0, -1.0)]*100, tags=np.linspace(0, 100, 100), cell_type='PV2', ei='i') + cm = net.add_edges(source={'ei': 'i'}, target={'ei': 'e'}, connection_rule=lambda s, t: 3, + p1='e2i', p2='e2i') # 200*100 = 60000 edges + cm.add_properties(names=['segment', 'distance'], rule=lambda s, t: [1, 0.5], dtypes=[np.int, np.float]) + + net.add_edges(source=net.nodes(cell_type='Scnna1'), target=net.nodes(cell_type='PV1'), + connection_rule=lambda s, t: 2, p1='s2p') # 100*100 = 20000' + + net.build() + net_dir = tempfile.mkdtemp() + net.save_nodes('tmp_nodes.h5', 'tmp_node_types.csv', output_dir=net_dir) + net.save_edges('tmp_edges.h5', 'tmp_edge_types.csv', output_dir=net_dir) + + edges_h5 = h5py.File('{}/tmp_edges.h5'.format(net_dir), 'r') + assert(net.nedges == 80000) + assert(len(edges_h5['/edges/NET1_to_NET1/0/distance']) == 60000) + assert(len(edges_h5['/edges/NET1_to_NET1/0/segment']) == 60000) + assert(len(edges_h5['/edges/NET1_to_NET1/1/nsyns']) == 10000) + assert(edges_h5['/edges/NET1_to_NET1/0/distance'][0] == 0.5) + assert(edges_h5['/edges/NET1_to_NET1/0/segment'][0] == 1) + assert(edges_h5['/edges/NET1_to_NET1/1/nsyns'][0] == 2) + + #try: + # os.remove('tmp_nodes.h5') + # os.remove('tmp_node_types.csv') + # os.remove('tmp_edges.h5') + # os.remove('tmp_edge_types.csv') + #except: + # pass + + +def test_save_multinetwork(): + net1 = NetworkBuilder('NET1') + net1.add_nodes(N=100, position=[(0.0, 1.0, -1.0)] * 100, cell_type='Scnna1', ei='e') + net1.add_edges(source={'ei': 'e'}, target={'ei': 'e'}, connection_rule=5, ctype_1='n1_rec') + net1.build() + + net2 = NetworkBuilder('NET2') + net2.add_nodes(N=10, position=[(0.0, 1.0, -1.0)] * 10, cell_type='PV1', ei='i') + net2.add_edges(connection_rule=10, ctype_1='n2_rec') + net2.add_edges(source=net1.nodes(), target={'ei': 'i'}, connection_rule=1, ctype_2='n1_n2') + net2.add_edges(target=net1.nodes(cell_type='Scnna1'), source={'cell_type': 'PV1'}, connection_rule=2, + ctype_2='n2_n1') + net2.build() + + net_dir = tempfile.mkdtemp() + net1.save_edges(output_dir=net_dir) + net2.save_edges(output_dir=net_dir) + + n1_n1_fname = '{}/{}_{}'.format(net_dir, 'NET1', 'NET1') + edges_h5 = h5py.File(n1_n1_fname + '_edges.h5', 'r') + assert(len(edges_h5['/edges/NET1_to_NET1/target_node_id']) == 100*100) + assert(len(edges_h5['/edges/NET1_to_NET1/0/nsyns']) == 100*100) + assert(edges_h5['/edges/NET1_to_NET1/0/nsyns'][0] == 5) + edge_types_csv = pd.read_csv(n1_n1_fname + '_edge_types.csv', sep=' ') + assert(len(edge_types_csv) == 1) + assert('ctype_2' not in edge_types_csv.columns.values) + assert(edge_types_csv['ctype_1'].iloc[0] == 'n1_rec') + + n1_n2_fname = '{}/{}_{}'.format(net_dir, 'NET1', 'NET2') + edges_h5 = h5py.File(n1_n2_fname + '_edges.h5', 'r') + assert(len(edges_h5['/edges/NET1_to_NET2/target_node_id']) == 100*10) + assert(len(edges_h5['/edges/NET1_to_NET2/0/nsyns']) == 100*10) + assert(edges_h5['/edges/NET1_to_NET2/0/nsyns'][0] == 1) + edge_types_csv = pd.read_csv(n1_n2_fname + '_edge_types.csv', sep=' ') + assert(len(edge_types_csv) == 1) + assert('ctype_1' not in edge_types_csv.columns.values) + assert(edge_types_csv['ctype_2'].iloc[0] == 'n1_n2') + + n2_n1_fname = '{}/{}_{}'.format(net_dir, 'NET2', 'NET1') + edges_h5 = h5py.File(n2_n1_fname + '_edges.h5', 'r') + assert(len(edges_h5['/edges/NET2_to_NET1/target_node_id']) == 100*10) + assert(len(edges_h5['/edges/NET2_to_NET1/0/nsyns']) == 100*10) + assert(edges_h5['/edges/NET2_to_NET1/0/nsyns'][0] == 2) + edge_types_csv = pd.read_csv(n2_n1_fname + '_edge_types.csv', sep=' ') + assert(len(edge_types_csv) == 1) + assert('ctype_1' not in edge_types_csv.columns.values) + assert(edge_types_csv['ctype_2'].iloc[0] == 'n2_n1') + + n2_n2_fname = '{}/{}_{}'.format(net_dir, 'NET2', 'NET2') + edges_h5 = h5py.File(n2_n2_fname + '_edges.h5', 'r') + assert(len(edges_h5['/edges/NET2_to_NET2/target_node_id']) == 10*10) + assert(len(edges_h5['/edges/NET2_to_NET2/0/nsyns']) == 10*10) + assert(edges_h5['/edges/NET2_to_NET2/0/nsyns'][0] == 10) + edge_types_csv = pd.read_csv(n2_n2_fname + '_edge_types.csv', sep=' ') + assert(len(edge_types_csv) == 1) + assert('ctype_2' not in edge_types_csv.columns.values) + assert(edge_types_csv['ctype_1'].iloc[0] == 'n2_rec') + + +def test_save_multinetwork_1(): + net1 = NetworkBuilder('NET1') + net1.add_nodes(N=100, position=[(0.0, 1.0, -1.0)] * 100, cell_type='Scnna1', ei='e') + net1.add_edges(source={'ei': 'e'}, target={'ei': 'e'}, connection_rule=5, ctype_1='n1_rec') + net1.build() + + net2 = NetworkBuilder('NET2') + net2.add_nodes(N=10, position=[(0.0, 1.0, -1.0)] * 10, cell_type='PV1', ei='i') + net2.add_edges(connection_rule=10, ctype_1='n2_rec') + net2.add_edges(source=net1.nodes(), target={'ei': 'i'}, connection_rule=1, ctype_2='n1_n2') + net2.add_edges(target=net1.nodes(cell_type='Scnna1'), source={'cell_type': 'PV1'}, connection_rule=2, + ctype_2='n2_n1') + net2.build() + net_dir = tempfile.mkdtemp() + net2.save_edges(edges_file_name='NET2_NET1_edges.h5', edge_types_file_name='NET2_NET1_edge_types.csv', + output_dir=net_dir, src_network='NET2') + + n1_n2_fname = '{}/{}_{}'.format(net_dir, 'NET2', 'NET1') + edges_h5 = h5py.File(n1_n2_fname + '_edges.h5', 'r') + assert(len(edges_h5['/edges/NET2_to_NET1/target_node_id']) == 100*10) + assert(len(edges_h5['/edges/NET2_to_NET1/0/nsyns']) == 100*10) + assert(edges_h5['/edges/NET2_to_NET1/0/nsyns'][0] == 2) + edge_types_csv = pd.read_csv(n1_n2_fname + '_edge_types.csv', sep=' ') + assert(len(edge_types_csv) == 1) + assert('ctype_1' not in edge_types_csv.columns.values) + assert(edge_types_csv['ctype_2'].iloc[0] == 'n2_n1') + + +if __name__ == '__main__': + test_save_weights() + # test_save_multinetwork_1() diff --git a/bmtk-vb/bmtk/tests/builder/test_edge_iterator.py b/bmtk-vb/bmtk/tests/builder/test_edge_iterator.py new file mode 100644 index 0000000..8d968fc --- /dev/null +++ b/bmtk-vb/bmtk/tests/builder/test_edge_iterator.py @@ -0,0 +1,72 @@ +import pytest + +from bmtk.builder import NetworkBuilder + +def test_itr_basic(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, position=[(0.0, 1.0, -1.0)]*100, cell_type='Scnna1', ei='e') + net.add_nodes(N=100, position=[(0.0, 1.0, -1.0)]*100, cell_type='PV1', ei='i') + net.add_edges(source={'ei': 'e'}, target={'ei': 'i'}, connection_rule=5, syn_type='e2i') + net.add_edges(source={'cell_type': 'PV1'}, target={'cell_type': 'Scnna1'}, connection_rule=5, syn_type='i2e') + net.build() + + edges = net.edges() + assert(len(edges) == 100*100*2) + assert(edges[0]['nsyns'] == 5) + + +def test_itr_advanced_search(): + net = NetworkBuilder('NET1') + net.add_nodes(N=1, cell_type='Scnna1', ei='e') + net.add_nodes(N=50, cell_type='PV1', ei='i') + net.add_nodes(N=100, cell_type='PV2', ei='i') + net.add_edges(source={'ei': 'e'}, target={'ei': 'i'}, connection_rule=5, syn_type='e2i', nm='A') + net.add_edges(source={'cell_type': 'PV1'}, target={'cell_type': 'PV2'}, connection_rule=5, syn_type='i2i', nm='B') + net.add_edges(source={'cell_type': 'PV2'}, target={'ei': 'i'}, connection_rule=5, syn_type='i2i', nm='C') + net.build() + + edges = net.edges(target_nodes=net.nodes(cell_type='Scnna1')) + assert(len(edges) == 0) + + edges = net.edges(source_nodes={'ei': 'e'}, target_nodes={'ei': 'i'}) + assert(len(edges) == 50 + 100) + + edges = net.edges(source_nodes=[n.node_id for n in net.nodes(ei='e')]) + assert(len(edges) == 50 + 100) + + edges = net.edges(source_nodes={'ei': 'i'}) + assert(len(edges) == 100 * 100 * 2) + for e in edges: + assert(e['syn_type'] == 'i2i') + + edges = net.edges(syn_type='i2i') + print(len(edges) == 100 * 100 * 2) + for e in edges: + assert(e['nm'] != 'A') + + edges = net.edges(syn_type='i2i', nm='C') + assert(len(edges) == 100 * 150) + + +def test_mulitnet_iterator(): + net1 = NetworkBuilder('NET1') + net1.add_nodes(N=50, cell_type='Rorb', ei='e') + net1.build() + + net2 = NetworkBuilder('NET2') + net2.add_nodes(N=100, cell_type='Scnna1', ei='e') + net2.add_nodes(N=100, cell_type='PV1', ei='i') + net2.add_edges(source={'ei': 'e'}, target={'ei': 'i'}, connection_rule=5, syn_type='e2i', net_type='rec') + net2.add_edges(source=net1.nodes(), target={'ei': 'e'}, connection_rule=1, syn_type='e2e', net_type='fwd') + net2.build() + + assert(len(net2.edges()) == 50*100 + 100*100) + assert(len(net2.edges(source_network='NET2', target_network='NET1')) == 0) + assert(len(net2.edges(source_network='NET1', target_network='NET2')) == 50*100) + assert(len(net2.edges(target_network='NET2', net_type='rec')) == 100*100) + + edges = net2.edges(source_network='NET1') + assert(len(edges) == 50*100) + for e in edges: + assert(e['net_type'] == 'fwd') + diff --git a/bmtk-vb/bmtk/tests/builder/test_id_generator.py b/bmtk-vb/bmtk/tests/builder/test_id_generator.py new file mode 100644 index 0000000..ba9dc5e --- /dev/null +++ b/bmtk-vb/bmtk/tests/builder/test_id_generator.py @@ -0,0 +1,36 @@ +import pytest + +from bmtk.builder.id_generator import IDGenerator + +def test_generator(): + generator = IDGenerator() + assert(generator.next() == 0) + assert(generator.next() == 1) + assert(generator.next() == 2) + + +def test_generator_initval(): + generator = IDGenerator(101) + assert(generator.next() == 101) + assert(generator.next() == 102) + assert(generator.next() == 103) + + +def test_contains(): + generator = IDGenerator(init_val=10) + gids = [generator.next() for _ in range(10)] + assert(len(gids) == 10) + assert(10 in generator) + assert(19 in generator) + assert(20 not in generator) + + +def test_remove(): + generator = IDGenerator(init_val=101) + assert(generator.next() == 101) + generator.remove_id(102) + generator.remove_id(104) + generator.remove_id(106) + assert(generator.next() == 103) + assert(generator.next() == 105) + assert(generator.next() == 107) diff --git a/bmtk-vb/bmtk/tests/builder/test_iterator.py b/bmtk-vb/bmtk/tests/builder/test_iterator.py new file mode 100644 index 0000000..82692d5 --- /dev/null +++ b/bmtk-vb/bmtk/tests/builder/test_iterator.py @@ -0,0 +1,134 @@ +import pytest +import itertools + +from bmtk.builder import connector, iterator +from bmtk.builder import NetworkBuilder +from bmtk.builder.node import Node + + +@pytest.fixture +def network(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, x=range(100), ei='i') + net.add_nodes(N=50, x=range(50), y='y', ei='e') + return net + + +def test_one2one_fnc(): + def connector_fnc(s, t): + assert(s['ei'] == 'i') + assert(t['ei'] == 'e') + return '100' + + net = network() + conr = connector.create(connector_fnc) + itr = iterator.create('one_to_one', conr) + count = 0 + for v in itr(net.nodes(ei='i'), net.nodes(ei='e'), conr): + src_id, trg_id, val = v + assert(src_id < 100) + assert(trg_id >= 100) + assert(val == '100') + count += 1 + assert(count == 100*50) + + +def test_one2all_fnc(): + def connector_fnc(s, ts): + assert(isinstance(s, Node)) + assert(s['ei'] == 'i') + assert(len(ts) == 50) + return [100]*50 + + net = network() + conr = connector.create(connector_fnc) + itr = iterator.create('one_to_all', conr) + count = 0 + for v in itr(net.nodes(ei='i'), net.nodes(ei='e'), conr): + src_id, trg_id, val = v + assert(src_id < 100) + assert(trg_id >= 100) + assert(val == 100) + count += 1 + assert(count == 5000) + + +def test_all2one_fnc(): + def connector_fnc(ss, t): + assert(isinstance(t, Node)) + assert(t['ei'] == 'e') + assert(len(ss) == 100) + return [100]*100 + + net = network() + conr = connector.create(connector_fnc) + itr = iterator.create('all_to_one', conr) + count = 0 + for v in itr(net.nodes(ei='i'), net.nodes(ei='e'), conr): + src_id, trg_id, val = v + assert(src_id < 100) + assert(trg_id >= 100) + assert(val == 100) + count += 1 + assert(count == 5000) + + +def test_literal(): + net = network() + conr = connector.create(100) + itr = iterator.create('one_to_one', conr) + count = 0 + for v in itr(net.nodes(ei='i'), net.nodes(ei='e'), conr): + src_id, trg_id, val = v + assert(src_id < 100) + assert(trg_id >= 100) + assert(val == 100) + count += 1 + + assert(count == 5000) + + +def test_dict(): + net = network() + conr = connector.create({'nsyn': 10, 'target': 'axon'}) + itr = iterator.create('one_to_one', conr) + count = 0 + for v in itr(net.nodes(ei='i'), net.nodes(ei='e'), conr): + src_id, trg_id, val = v + assert(src_id < 100) + assert(trg_id >= 100) + assert(val['nsyn'] == 10) + assert(val['target'] == 'axon') + count += 1 + + assert (count == 5000) + + +def test_one2one_list(): + net = network() + vals = [s.node_id*t.node_id for s,t in itertools.product(net.nodes(ei='i'), net.nodes(ei='e'))] + conr = connector.create(vals) + itr = iterator.create('one_to_one', conr) + for v in itr(net.nodes(ei='i'), net.nodes(ei='e'), conr): + src_id, trg_id, val = v + assert(src_id*trg_id == val) + + +def test_one2all_list(): + net = network() + vals = [v.node_id for v in net.nodes(ei='e')] + conr = connector.create(vals) + itr = iterator.create('one_to_all', conr) + for v in itr(net.nodes(ei='i'), net.nodes(ei='e'), conr): + src_id, trg_id, val = v + assert(trg_id == val) + + +def test_all2one_list(): + net = network() + vals = [v.node_id for v in net.nodes(ei='i')] + conr = connector.create(vals) + itr = iterator.create('all_to_one', conr) + for v in itr(net.nodes(ei='i'), net.nodes(ei='e'), conr): + src_id, trg_id, val = v + assert(src_id == val) diff --git a/bmtk-vb/bmtk/tests/builder/test_node_pool.py b/bmtk-vb/bmtk/tests/builder/test_node_pool.py new file mode 100644 index 0000000..65cd6b1 --- /dev/null +++ b/bmtk-vb/bmtk/tests/builder/test_node_pool.py @@ -0,0 +1,81 @@ +import pytest + +from bmtk.builder import NetworkBuilder + + +def test_single_node(): + net = NetworkBuilder('NET1') + net.add_nodes(prop1='prop1', prop2='prop2', param1=['param1']) + nodes = list(net.nodes()) + assert(len(nodes) == 1) + assert(nodes[0]['param1'] == 'param1') + assert(nodes[0]['prop1'] == 'prop1') + assert(nodes[0]['prop2'] == 'prop2') + + +def test_node_set(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, prop1='prop1', param1=range(100)) + node_pool = net.nodes() + assert(node_pool.filter_str == '*') + + nodes = list(node_pool) + assert(len(nodes) == 100) + assert(nodes[0]['prop1'] == 'prop1') + assert(nodes[0]['param1'] == 0) + assert(nodes[99]['prop1'] == 'prop1') + assert(nodes[99]['param1'] == 99) + assert(nodes[0]['node_type_id'] == nodes[99]['node_type_id']) + assert(nodes[0]['node_id'] != nodes[99]['node_id']) + + +def test_node_sets(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, prop_n='prop1', pool1='p1', sp='sp', param1=range(100)) + net.add_nodes(N=100, prop_n='prop2', pool2='p2', sp='sp', param1=range(100)) + net.add_nodes(N=100, prop_n='prop3', pool3='p3', sp='sp', param1=range(100)) + node_pool_1 = net.nodes(prop_n='prop1') + assert(len(node_pool_1) == 100) + assert(node_pool_1.filter_str == "prop_n=='prop1'") + for n in node_pool_1: + assert('pool1' in n and n['prop_n'] == 'prop1') + + node_pool_2 = net.nodes(sp='sp') + assert(node_pool_2.filter_str == "sp=='sp'") + assert(len(node_pool_2) == 300) + for n in node_pool_2: + assert(n['sp'] == 'sp') + + node_pool_3 = net.nodes(param1=10) + assert(len(node_pool_3) == 3) + assert(node_pool_3.filter_str == "param1=='10'") + nodes = list(node_pool_3) + assert(nodes[0]['node_id'] == 10) + assert(nodes[1]['node_id'] == 110) + assert(nodes[2]['node_id'] == 210) + assert(nodes[0]['node_type_id'] != nodes[1]['node_type_id'] != nodes[2]['node_type_id']) + + +def test_multi_search(): + net = NetworkBuilder('NET1') + net.add_nodes(N=10, prop_n='prop1', sp='sp1', param1=range(0, 10)) + net.add_nodes(N=10, prop_n='prop1', sp='sp2', param1=range(5, 15)) + net.add_nodes(N=20, prop_n='prop2', sp='sp2', param1=range(20)) + node_pool = net.nodes(prop_n='prop1', param1=5) + assert(len(node_pool) == 2) + nodes = list(node_pool) + assert(nodes[0]['node_id'] == 5) + assert(nodes[1]['node_id'] == 10) + + +def test_failed_search(): + net = NetworkBuilder('NET1') + net.add_nodes(N=100, p1='p1', q1=range(100)) + node_pool = net.nodes(p1='p2') + assert(len(node_pool) == 0) + + node_pool = net.nodes(q2=10) + assert(len(node_pool) == 0) + + +test_failed_search() \ No newline at end of file diff --git a/bmtk-vb/bmtk/tests/builder/test_node_set.py b/bmtk-vb/bmtk/tests/builder/test_node_set.py new file mode 100644 index 0000000..34b7afa --- /dev/null +++ b/bmtk-vb/bmtk/tests/builder/test_node_set.py @@ -0,0 +1,52 @@ +import pytest +from bmtk.builder.node_set import NodeSet +from bmtk.builder.node import Node +from bmtk.builder.id_generator import IDGenerator + +def test_node_set(): + generator = IDGenerator() + node_set = NodeSet(N=100, + node_params={'p1': range(100), 'p2': range(0, 1000, 100)}, + node_type_properties={'prop1': 'prop1', 'node_type_id': 1}) + print(node_set.N) + print(node_set.node_type_id) + print(node_set.params_keys) + + nodes = node_set.build(generator) + print(len(nodes) == 100) + print(nodes[1]['p1'] == 1) + print(nodes[1]['p2'] == 100) + print(nodes[1]['prop1'] == 'prop1') + print(nodes[1]['node_type_id'] == 1) + + +def test_set_hash(): + node_set1 = NodeSet(N=100, + node_params={'param1': range(100)}, + node_type_properties={'prop1': 'prop1', 'node_type_id': 1}) + node_set2 = NodeSet(N=100, + node_params = {'p1': range(100)}, + node_type_properties={'prop1': 'prop2', 'node_type_id': 2}) + node_set3 = NodeSet(N=10, + node_params={'p1': ['hello']*10}, + node_type_properties={'prop1': 'prop3', 'node_type_id': 3}) + + assert(node_set1.params_hash != node_set2.params_hash) + assert(node_set2.params_hash == node_set3.params_hash) + + +def test_node(): + node_set1 = NodeSet(N=100, + node_params={'param1': range(100)}, + node_type_properties={'prop1': 'prop1', 'node_type_id': 1}) + nodes = node_set1.build(IDGenerator()) + node_1 = nodes[0] + assert(node_1.node_id == 0) + assert(node_1['node_id'] == 0) + assert(node_1.node_type_id == 1) + assert(node_1['node_type_id'] == 1) + assert('prop1' in node_1.node_type_properties) + assert('param1' in node_1.params) + assert('node_id' in node_1.params) + assert('param1' in node_set1.params_keys) + assert(node_1.params_hash == node_set1.params_hash) diff --git a/bmtk-vb/bmtk/tests/simulator/bionet/bionet_virtual_files.py b/bmtk-vb/bmtk/tests/simulator/bionet/bionet_virtual_files.py new file mode 100644 index 0000000..9444329 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/bionet/bionet_virtual_files.py @@ -0,0 +1,172 @@ +import numpy as np + +from bmtk.utils.io import tabular_network as tn + + +class NodeRow(tn.NodeRow): + @property + def with_dynamics_params(self): + return False + + +class EdgeRow(tn.EdgeRow): + @property + def with_dynamics_params(self): + return False + + +class NodesFile(object): + def __init__(self, N): + self._network_name = 'test_bionet' + self._version = None + self._iter_index = 0 + self._nrows = 0 + self._node_types_table = None + + self._N = N + self._rot_delta = 360.0/float(N) + self._node_types_table = { + 101: { + 'pop_name': 'bio_exc', 'node_type_id': 101, 'model_type': 'biophysical', + 'morphology': 'be_morphology.swc', + 'dynamics_params': 'be_dynamics.json', + 'ei': 'e' + }, + 102: { + 'pop_name': 'point_exc', 'node_type_id': 102, 'model_type': 'point_IntFire1', + 'dynamics_params': 'pe_dynamics.json', + 'ei': 'e' + }, + 103: { + 'pop_name': 'bio_inh', 'node_type_id': 103, 'model_type': 'biophysical', + 'morphology': 'bi_morphology.swc', + 'dynamics_params': 'bi_dynamics.json', + 'ei': 'i' + }, + 104: { + 'pop_name': 'point_inh', 'node_type_id': 104, 'model_type': 'point_IntFire1', + 'dynamics_params': 'bi_dynamics.json', + 'ei': 'i' + } + + } + + + @property + def name(self): + """name of network containing these nodes""" + return self._network_name + + @property + def version(self): + return self._version + + @property + def gids(self): + raise NotImplementedError() + + @property + def node_types_table(self): + return self._node_types_table + + def load(self, nodes_file, node_types_file): + raise NotImplementedError() + + def get_node(self, gid, cache=False): + return self[gid] + + def __len__(self): + return self._N + + def __iter__(self): + self._iter_index = 0 + return self + + def next(self): + if self._iter_index >= len(self): + raise StopIteration + + node_row = self[self._iter_index] + self._iter_index += 1 + return node_row + + def __getitem__(self, gid): + node_props = {'positions': np.random.rand(3), 'rotation': self._rot_delta*gid, 'weight': 0.0001*gid} + return NodeRow(gid, node_props, self.__get_node_type_props(gid)) + + + def __get_node_type_props(self, gid): + if gid <= self._N/4: + return self._node_types_table[101] + elif gid <= self._N/2: + return self._node_types_table[102] + elif gid <= self._N*3/4: + return self._node_types_table[103] + else: + return self._node_types_table[104] + + +class EdgesFile(tn.EdgesFile): + def __init__(self, target_nodes, source_nodes): + self._target_nodes = target_nodes + self._source_nodes = source_nodes + self._edge_type_props = [ + { + 'node_type_id': 1, + 'target_query': 'model_type="biophysical"', 'source_query': 'ei="e"', + 'syn_weight': .10, + 'syn_targets': ['dend', 'apical'], + 'dynamics_params': 'biophys_exc.json' + }, + { + 'node_type_id': 2, + 'target_query': 'model_type="point_IntFire1"', 'source_query': 'ei="e"', + 'syn_weight': .20, + 'dynamics_params': 'point_exc.json' + }, + { + 'node_type_id': 3, + 'target_query': 'model_type="biophysical"', 'source_query': 'ei="i"', + 'syn_weight': -.10, + 'syn_targets': ['soma', 'dend'], + 'dynamics_params': 'biophys_inh.json' + }, + { + 'node_type_id': 4, + 'target_query': 'model_type="point_IntFire1"', 'source_query': 'ei="i"', + 'syn_weight': -.20, + 'dynamics_params': 'point_inh.json' + } + ] + + + @property + def source_network(self): + """Name of network containing the source gids""" + return self._source_nodes.name + + @property + def target_network(self): + """Name of network containing the target gids""" + return self._target_nodes.name + + def load(self, edges_file, edge_types_file): + raise NotImplementedError() + + def edges_itr(self, target_gid): + trg_node = self._target_nodes[target_gid] + for src_node in self._source_nodes: + edge_props = {'syn_weight': trg_node['weight']} + #edge_type_props = {'edge_type_id': 1} + yield EdgeRow(trg_node.gid, src_node.gid, edge_props, self.__get_edge_type_prop(src_node, trg_node)) + + #def __init__(self, trg_gid, src_gid, edge_props={}, edge_type_props={}): + #raise NotImplementedError() + + def __len__(self): + return len(self._source_nodes)*len(self._target_nodes) + + def __get_edge_type_prop(self, source_node, target_node): + indx = 0 if source_node['ei'] == 'e' else 2 + indx += 0 if target_node['model_type'] == 'biophysical' else 1 + return self._edge_type_props[indx] diff --git a/bmtk-vb/bmtk/tests/simulator/bionet/set_cell_params.py b/bmtk-vb/bmtk/tests/simulator/bionet/set_cell_params.py new file mode 100644 index 0000000..2a244b0 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/bionet/set_cell_params.py @@ -0,0 +1,108 @@ +import json +from neuron import h + + +def IntFire1(cell_prop): + """Set parameters for the IntFire1 cell models.""" + params_file = cell_prop['params_file'] + + with open(params_file) as params_file: + params = json.load(params_file) + + hobj = h.IntFire1() + hobj.tau = params['tau'] * 1000.0 # Convert from seconds to ms. + hobj.refrac = params['refrac'] * 1000.0 # Convert from seconds to ms. + + return hobj + + +def Biophys1(cell_prop): + """ + Set parameters for cells from the Allen Cell Types database + Prior to setting parameters will replace the axon with the stub + """ + morphology_file_name = str(cell_prop['morphology']) + params_file_name = str(cell_prop['params_file']) + + hobj = h.Biophys1(morphology_file_name) + fix_axon(hobj) + set_params_peri(hobj, params_file_name) + + return hobj + + +def set_params_peri(hobj, params_file_name): + """Set biophysical parameters for the cell + + Parameters + ---------- + hobj: instance of a Biophysical template + NEURON's cell object + params_file_name: string + name of json file containing biophysical parameters for cell's model which determine spiking behavior + """ + + with open(params_file_name) as biophys_params_file: + biophys_params = json.load(biophys_params_file) + + passive = biophys_params['passive'][0] + conditions = biophys_params['conditions'][0] + genome = biophys_params['genome'] + + # Set passive properties + cm_dict = dict([(c['section'], c['cm']) for c in passive['cm']]) + for sec in hobj.all: + sec.Ra = passive['ra'] + sec.cm = cm_dict[sec.name().split(".")[1][:4]] + sec.insert('pas') + + for seg in sec: + seg.pas.e = passive["e_pas"] + + # Insert channels and set parameters + + for p in genome: + sections = [s for s in hobj.all if s.name().split(".")[1][:4] == p["section"]] + + for sec in sections: + if p["mechanism"] != "": + sec.insert(p["mechanism"]) + setattr(sec, p["name"], p["value"]) + + # Set reversal potentials + for erev in conditions['erev']: + sections = [s for s in hobj.all if s.name().split(".")[1][:4] == erev["section"]] + for sec in sections: + sec.ena = erev["ena"] + sec.ek = erev["ek"] + + +def fix_axon(hobj): + ''' + Replace reconstructed axon with a stub + + Parameters + ---------- + hobj: instance of a Biophysical template + NEURON's cell object + ''' + + for sec in hobj.axon: + h.delete_section(sec=sec) + + h.execute('create axon[2]', hobj) + + for sec in hobj.axon: + sec.L = 30 + sec.diam = 1 + hobj.axonal.append(sec=sec) + hobj.all.append(sec=sec) # need to remove this comment + + hobj.axon[0].connect(hobj.soma[0], 0.5, 0) + hobj.axon[1].connect(hobj.axon[0], 1, 0) + + h.define_shape() + + + + diff --git a/bmtk-vb/bmtk/tests/simulator/bionet/set_syn_params.py b/bmtk-vb/bmtk/tests/simulator/bionet/set_syn_params.py new file mode 100644 index 0000000..b2b4732 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/bionet/set_syn_params.py @@ -0,0 +1,31 @@ +from neuron import h + + +def exp2syn(syn_params, xs, secs): + ''' + Create a list of exp2syn synapses + + Parameters + ---------- + syn_params: dict + parameters of a synapse + xs: float + normalized distance along the section + + secs: hoc object + target section + + Returns + ------- + syns: synapse objects + + ''' + syns = [] + + for x, sec in zip(xs, secs): + syn = h.Exp2Syn(x, sec=sec) + syn.e = syn_params['erev'] + syn.tau1 = syn_params['tau1'] + syn.tau2 = syn_params['tau2'] + syns.append(syn) + return syns \ No newline at end of file diff --git a/bmtk-vb/bmtk/tests/simulator/bionet/set_weights.py b/bmtk-vb/bmtk/tests/simulator/bionet/set_weights.py new file mode 100644 index 0000000..cdaa454 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/bionet/set_weights.py @@ -0,0 +1,19 @@ +import math + + +def gaussianLL(tar_prop,src_prop,con_prop): + src_tuning = src_prop['tuning_angle'] + tar_tuning = tar_prop['tuning_angle'] + + w0 = con_prop["weight_max"] + sigma = con_prop["weight_sigma"] + + delta_tuning = abs(abs(abs(180.0 - abs(float(tar_tuning) - float(src_tuning)) % 360.0) - 90.0) - 90.0) + weight = w0*math.exp(-(delta_tuning / sigma) ** 2) + + return weight + + +def wmax(tar_prop,src_prop,con_prop): + w0 = con_prop["weight_max"] + return w0 diff --git a/bmtk-vb/bmtk/tests/simulator/bionet/test_biograph.py b/bmtk-vb/bmtk/tests/simulator/bionet/test_biograph.py new file mode 100644 index 0000000..68ee18f --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/bionet/test_biograph.py @@ -0,0 +1,70 @@ +import pytest +import os +import json +import tempfile + +import bionet_virtual_files as bvf +from bmtk.simulator import bionet + + +@pytest.mark.skip() +def test_add_nodes(): + nodes = bvf.NodesFile(N=100) + + net = bionet.BioNetwork() + net.add_component('morphologies_dir', '.') + net.add_component('biophysical_neuron_models_dir', '.') + net.add_component('point_neuron_models_dir', '.') + net.add_nodes(nodes) + + assert(net.networks == [nodes.name]) + assert(net.get_internal_nodes() == net.get_nodes(nodes.name)) + for bionode in net.get_internal_nodes(): + node_id = bionode.node_id + orig_node = nodes[node_id] + assert(node_id == orig_node.gid) + assert(len(bionode.positions) == 3) + assert(bionode['ei'] == orig_node['ei']) + assert(bionode['model_type'] == orig_node['model_type']) + assert(bionode['rotation'] == orig_node['rotation']) + assert(os.path.basename(bionode.model_params) == orig_node['dynamics_params']) + + +@pytest.mark.skip() +def test_add_edges(): + nodes = bvf.NodesFile(N=100) + edges = bvf.EdgesFile(nodes, nodes) + + net = bionet.BioNetwork() + net.add_component('morphologies_dir', '.') + net.add_component('biophysical_neuron_models_dir', '.') + net.add_component('point_neuron_models_dir', '.') + net.add_component('synaptic_models_dir', '.') + + with open('biophys_exc.json', 'w') as fp: + json.dump({}, fp) + + with open('biophys_inh.json', 'w') as fp: + json.dump({}, fp) + + with open('point_exc.json', 'w') as fp: + json.dump({}, fp) + + with open('point_inh.json', 'w') as fp: + json.dump({}, fp) + + net.add_nodes(nodes) + net.add_edges(edges) + + count = 0 + for trg_node in net.get_internal_nodes(): + #print bionode.node_id + for e in net.edges_iterator(trg_node.node_id, nodes.name): + _, src_node, edge = e + assert(edge['syn_weight'] == trg_node['weight']) + count += 1 + assert(count == 10000) + + +if __name__ == '__main__': + test_add_nodes() \ No newline at end of file diff --git a/bmtk-vb/bmtk/tests/simulator/bionet/test_nrn.py b/bmtk-vb/bmtk/tests/simulator/bionet/test_nrn.py new file mode 100644 index 0000000..a65c333 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/bionet/test_nrn.py @@ -0,0 +1,148 @@ +import pytest +from bmtk.simulator.bionet.pyfunction_cache import * + + +def test_weight(): + def wmax(v1, v2): + return max(v1, v2) + + def wmin(v1, v2): + return min(v1, v2) + + add_weight_function(wmax) + add_weight_function(wmin, 'minimum') + + assert('wmax' in py_modules.synaptic_weights) + assert('minimum' in py_modules.synaptic_weights) + assert('wmin' not in py_modules.synaptic_weights) + wmax_fnc = py_modules.synaptic_weight('wmax') + assert(wmax_fnc(1, 2) == 2) + + wmin_fnc = py_modules.synaptic_weight('minimum') + assert(wmin_fnc(1, 2) == 1) + py_modules.clear() + + +def test_weight_decorator(): + @synaptic_weight + def wmax(v1, v2): + return max(v1, v2) + + @synaptic_weight(name='minimum') + def wmin(v1, v2): + return min(v1, v2) + + assert('wmax' in py_modules.synaptic_weights) + assert('minimum' in py_modules.synaptic_weights) + assert('wmin' not in py_modules.synaptic_weights) + wmax_fnc = py_modules.synaptic_weight('wmax') + assert(wmax_fnc(1, 2) == 2) + + wmin_fnc = py_modules.synaptic_weight('minimum') + assert(wmin_fnc(1, 2) == 1) + py_modules.clear() + + +def test_synapse_model(): + def syn1(): + return 'Syn1' + + def syn2(p1, p2): + return p1, p2 + + add_synapse_model(syn1) + add_synapse_model(syn2, 'synapse_2') + + assert('syn1' in py_modules.synapse_models) + assert('synapse_2' in py_modules.synapse_models) + assert('syn2' not in py_modules.synapse_models) + + syn_fnc = py_modules.synapse_model('syn1') + assert(syn_fnc() == 'Syn1') + + syn_fnc = py_modules.synapse_model('synapse_2') + assert(syn_fnc(1, 2) == (1, 2)) + py_modules.clear() + + +def test_synapse_model_decorator(): + @synapse_model + def syn1(): + return 'Syn1' + + @synapse_model(name='synapse_2') + def syn2(p1, p2): + return p1, p2 + + assert('syn1' in py_modules.synapse_models) + assert('synapse_2' in py_modules.synapse_models) + assert('syn2' not in py_modules.synapse_models) + + syn_fnc = py_modules.synapse_model('syn1') + assert(syn_fnc() == 'Syn1') + + syn_fnc = py_modules.synapse_model('synapse_2') + assert(syn_fnc(1, 2) == (1, 2)) + py_modules.clear() + + +@pytest.mark.skip() +def test_cell_model(): + def hoc1(): + return "hoc" + + def hoc2(p1): + return p1 + + add_cell_model(hoc1) + add_cell_model(hoc2, name='hoc_function') + + assert('hoc1' in py_modules.cell_models) + assert('hoc_function' in py_modules.cell_models) + assert('hoc2' not in py_modules.cell_models) + + hoc_fnc = py_modules.cell_model('hoc1') + assert(hoc_fnc() == 'hoc') + + hoc_fnc = py_modules.cell_model('hoc_function') + assert(hoc_fnc(1.0) == 1.0) + + +@pytest.mark.skip() +def test_cell_model_decorator(): + @cell_model + def hoc1(): + return "hoc" + + @cell_model(name='hoc_function') + def hoc2(p1): + return p1 + + assert('hoc1' in py_modules.cell_models) + assert('hoc_function' in py_modules.cell_models) + assert('hoc2' not in py_modules.cell_models) + + hoc_fnc = py_modules.cell_model('hoc1') + assert(hoc_fnc() == 'hoc') + + hoc_fnc = py_modules.cell_model('hoc_function') + assert(hoc_fnc(1.0) == 1.0) + + +@pytest.mark.skip() +def test_load_py_modules(): + import set_weights + import set_syn_params + import set_cell_params + + load_py_modules(cell_models=set_cell_params, syn_models=set_syn_params, syn_weights=set_weights) + assert(all(n in py_modules.cell_models for n in ['Biophys1', 'IntFire1'])) + assert(isinstance(py_modules.cell_model('Biophys1'), types.FunctionType)) + assert (isinstance(py_modules.cell_model('IntFire1'), types.FunctionType)) + + assert (all(n in py_modules.synapse_models for n in ['exp2syn'])) + assert (isinstance(py_modules.synapse_model('exp2syn'), types.FunctionType)) + + assert (all(n in py_modules.synaptic_weights for n in ['wmax', 'gaussianLL'])) + assert (isinstance(py_modules.synaptic_weight('wmax'), types.FunctionType)) + assert (isinstance(py_modules.synaptic_weight('gaussianLL'), types.FunctionType)) diff --git a/bmtk-vb/bmtk/tests/simulator/pointnet/pointnet_virtual_files.py b/bmtk-vb/bmtk/tests/simulator/pointnet/pointnet_virtual_files.py new file mode 100644 index 0000000..46e3c26 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/pointnet/pointnet_virtual_files.py @@ -0,0 +1,158 @@ +import numpy as np + +from bmtk.utils.io import tabular_network as tn + + +class NodeRow(tn.NodeRow): + @property + def with_dynamics_params(self): + return False + + +class NodesFile(tn.NodesFile): + def __init__(self, N): + self._network_name = 'test_bionet' + self._version = None + self._iter_index = 0 + self._nrows = 0 + self._node_types_table = None + + self._N = N + self._rot_delta = 360.0/float(N) + self._node_types_table = { + 101: { + 'pop_name': 'Rorb', 'node_type_id': 101, 'model_type': 'iaf_psc_alpha', + 'dynamics_params': 'iaf_dynamics.json', + 'ei': 'e' + }, + + 102: { + 'pop_name': 'PV1', 'node_type_id': 102, 'model_type': 'izhikevich', + 'dynamics_params': 'iz_dynamics.json', + 'ei': 'i' + } + } + + @property + def name(self): + """name of network containing these nodes""" + return self._network_name + + @property + def version(self): + return self._version + + @property + def gids(self): + raise NotImplementedError() + + @property + def node_types_table(self): + return self._node_types_table + + def load(self, nodes_file, node_types_file): + raise NotImplementedError() + + def get_node(self, gid, cache=False): + return self[gid] + + def __len__(self): + return self._N + + def __iter__(self): + self._iter_index = 0 + return self + + def next(self): + if self._iter_index >= len(self): + raise StopIteration + + node_row = self[self._iter_index] + self._iter_index += 1 + return node_row + + def __getitem__(self, gid): + node_props = {'positions': np.random.rand(3), 'rotation': self._rot_delta*gid, 'weight': 0.0001*gid} + return NodeRow(gid, node_props, self.__get_node_type_props(gid)) + + + def __get_node_type_props(self, gid): + if gid <= self._N/2: + return self._node_types_table[101] + else: + return self._node_types_table[102] + + +class EdgeRow(tn.EdgeRow): + @property + def with_dynamics_params(self): + return False + + +class EdgesFile(tn.EdgesFile): + def __init__(self, target_nodes, source_nodes): + self._target_nodes = target_nodes + self._source_nodes = source_nodes + self._edge_type_props = [ + { + 'node_type_id': 1, + 'target_query': 'model_type="iaf_psc_alpha"', 'source_query': 'ei="e"', + 'syn_weight': .10, + 'delay': 2.0, + 'dynamics_params': 'iaf_exc.json' + }, + { + 'node_type_id': 2, + 'target_query': 'model_type="iaf_psc_alpha"', 'source_query': 'ei="i"', + 'syn_weight': -.10, + 'delay': 2.0, + 'dynamics_params': 'iaf_inh.json' + }, + { + 'node_type_id': 3, + 'target_query': 'model_type="izhikevich"', 'source_query': 'ei="e"', + 'syn_weight': .20, + 'delay': 2.0, + 'dynamics_params': 'izh_exc.json' + }, + { + 'node_type_id': 4, + 'target_query': 'model_type="izhikevich"', 'source_query': 'ei="i"', + 'syn_weight': -.20, + 'delay': 2.0, + 'dynamics_params': 'izh_inh.json' + } + ] + + + + @property + def source_network(self): + """Name of network containing the source gids""" + return self._source_nodes.name + + @property + def target_network(self): + """Name of network containing the target gids""" + return self._target_nodes.name + + def load(self, edges_file, edge_types_file): + raise NotImplementedError() + + def edges_itr(self, target_gid): + trg_node = self._target_nodes[target_gid] + for src_node in self._source_nodes: + edge_props = {'syn_weight': trg_node['weight']} + #edge_type_props = {'edge_type_id': 1} + yield EdgeRow(trg_node.gid, src_node.gid, edge_props, self.__get_edge_type_prop(src_node, trg_node)) + + #def __init__(self, trg_gid, src_gid, edge_props={}, edge_type_props={}): + #raise NotImplementedError() + + def __len__(self): + return len(self._source_nodes)*len(self._target_nodes) + + def __get_edge_type_prop(self, source_node, target_node): + indx = 0 if source_node['model_type'] == 'iaf_psc_alpha' else 2 + indx += 0 if target_node['ei'] == 'e' else 1 + return self._edge_type_props[indx] diff --git a/bmtk-vb/bmtk/tests/simulator/pointnet/test_pointgraph.py b/bmtk-vb/bmtk/tests/simulator/pointnet/test_pointgraph.py new file mode 100644 index 0000000..a1c18c9 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/pointnet/test_pointgraph.py @@ -0,0 +1,77 @@ +import pytest +import os +import json +import tempfile + +from pointnet_virtual_files import NodesFile, EdgesFile +from bmtk.simulator import pointnet + + +@pytest.mark.skip() +def test_add_nodes(): + nodes = NodesFile(N=100) + + net = pointnet.PointNetwork() + if not os.path.exists('tmp/'): + os.mkdir('tmp/') + net.add_component('models_dir', '.') + with open('iaf_dynamics.json', 'w') as fp: + json.dump({}, fp) + + with open('iz_dynamics.json', 'w') as fp: + json.dump({}, fp) + + net.add_nodes(nodes) + assert(net.networks == [nodes.name]) + assert(net.get_internal_nodes() == net.get_nodes(nodes.name)) + count = 0 + for pointnode in net.get_internal_nodes(): + node_id = pointnode.node_id + orig_node = nodes[node_id] + assert(node_id == orig_node.gid) + assert(pointnode['ei'] == orig_node['ei']) + assert(pointnode['model_type'] == orig_node['model_type']) + assert(pointnode['rotation'] == orig_node['rotation']) + assert(pointnode.model_params == {}) + count += 1 + assert(count == 100) + + +@pytest.mark.skip() +def test_add_edges(): + nodes = NodesFile(N=100) + edges = EdgesFile(nodes, nodes) + + net = pointnet.PointNetwork() + net.add_component('models_dir', '.') + net.add_component('synaptic_models_dir', '.') + + with open('iaf_dynamics.json', 'w') as fp: + json.dump({}, fp) + + with open('iz_dynamics.json', 'w') as fp: + json.dump({}, fp) + + with open('iaf_exc.json', 'w') as fp: + json.dump({}, fp) + + with open('iaf_inh.json', 'w') as fp: + json.dump({}, fp) + + with open('izh_exc.json', 'w') as fp: + json.dump({}, fp) + + with open('izh_inh.json', 'w') as fp: + json.dump({}, fp) + + net.add_nodes(nodes) + net.add_edges(edges) + + count = 0 + for trg_node in net.get_internal_nodes(): + for e in net.edges_iterator(trg_node.node_id, nodes.name): + _, src_node, edge = e + assert(edge['syn_weight'] == trg_node['weight']) + count += 1 + assert(count == 10000) + diff --git a/bmtk-vb/bmtk/tests/simulator/popnet/popnet_virtual_files.py b/bmtk-vb/bmtk/tests/simulator/popnet/popnet_virtual_files.py new file mode 100644 index 0000000..eb95216 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/popnet/popnet_virtual_files.py @@ -0,0 +1,159 @@ +import numpy as np + +from bmtk.utils.io import tabular_network as tn + + +class NodeRow(tn.NodeRow): + @property + def with_dynamics_params(self): + return False + + +class NodesFile(tn.NodesFile): + def __init__(self, N): + self._network_name = 'test_bionet' + self._version = None + self._iter_index = 0 + self._nrows = 0 + self._node_types_table = None + + self._N = N + self._rot_delta = 360.0/float(N) + self._node_types_table = { + 101: { + 'pop_name': 'internal_exc', 'node_type_id': 101, 'model_type': 'internal', + 'dynamics_params': 'exc_dynamics.json', + 'ei': 'e' + }, + + 102: { + 'pop_name': 'internal_inh', 'node_type_id': 102, 'model_type': 'internal', + 'dynamics_params': 'inh_dynamics.json', + 'ei': 'i' + }, + 103: { + 'pop_name': 'external_exc', 'node_type_id': 103, 'model_type': 'external', + 'dynamics_params': 'external_dynamics.json', + 'ei': 'external_exc.json' + } + } + + @property + def name(self): + """name of network containing these nodes""" + return self._network_name + + @property + def version(self): + return self._version + + @property + def gids(self): + raise NotImplementedError() + + @property + def node_types_table(self): + return self._node_types_table + + def load(self, nodes_file, node_types_file): + raise NotImplementedError() + + def get_node(self, gid, cache=False): + return self[gid] + + def __len__(self): + return self._N + + def __iter__(self): + self._iter_index = 0 + return self + + def next(self): + if self._iter_index >= len(self): + raise StopIteration + + node_row = self[self._iter_index] + self._iter_index += 1 + return node_row + + def __getitem__(self, gid): + node_props = {'positions': np.random.rand(3), 'rotation': self._rot_delta*gid, 'weight': 0.0001*gid} + return NodeRow(gid, node_props, self.__get_node_type_props(gid)) + + def __get_node_type_props(self, gid): + if gid <= self._N/3: + return self._node_types_table[101] + elif gid <= self._N*2/3: + return self._node_types_table[102] + else: + return self._node_types_table[103] + + +class EdgeRow(tn.EdgeRow): + @property + def with_dynamics_params(self): + return False + + +class EdgesFile(tn.EdgesFile): + def __init__(self, target_nodes, source_nodes): + self._target_nodes = target_nodes + self._source_nodes = source_nodes + self._edge_type_props = [ + { + 'node_type_id': 1, + 'target_query': 'model_type="iaf_psc_alpha"', 'source_query': 'ei="e"', + 'syn_weight': .10, + 'delay': 2.0, + 'dynamics_params': 'iaf_exc.json' + }, + { + 'node_type_id': 2, + 'target_query': 'model_type="iaf_psc_alpha"', 'source_query': 'ei="i"', + 'syn_weight': -.10, + 'delay': 2.0, + 'dynamics_params': 'iaf_inh.json' + }, + { + 'node_type_id': 3, + 'target_query': 'model_type="izhikevich"', 'source_query': 'ei="e"', + 'syn_weight': .20, + 'delay': 2.0, + 'dynamics_params': 'izh_exc.json' + }, + { + 'node_type_id': 4, + 'target_query': 'model_type="izhikevich"', 'source_query': 'ei="i"', + 'syn_weight': -.20, + 'delay': 2.0, + 'dynamics_params': 'izh_inh.json' + } + ] + + @property + def source_network(self): + """Name of network containing the source gids""" + return self._source_nodes.name + + @property + def target_network(self): + """Name of network containing the target gids""" + return self._target_nodes.name + + def load(self, edges_file, edge_types_file): + raise NotImplementedError() + + def edges_itr(self, target_gid): + trg_node = self._target_nodes[target_gid] + for src_node in self._source_nodes: + edge_props = {'syn_weight': trg_node['weight']} + yield EdgeRow(trg_node.gid, src_node.gid, edge_props, self.__get_edge_type_prop(src_node, trg_node)) + + + def __len__(self): + return len(self._source_nodes)*len(self._target_nodes) + + def __get_edge_type_prop(self, source_node, target_node): + indx = 0 if source_node['model_type'] == 'iaf_psc_alpha' else 2 + indx += 0 if target_node['ei'] == 'e' else 1 + return self._edge_type_props[indx] diff --git a/bmtk-vb/bmtk/tests/simulator/popnet/test_popgraph.py b/bmtk-vb/bmtk/tests/simulator/popnet/test_popgraph.py new file mode 100644 index 0000000..318422c --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/popnet/test_popgraph.py @@ -0,0 +1,39 @@ +import pytest +import os +import json + +import popnet_virtual_files as pvf +from bmtk.simulator import popnet + + +@pytest.mark.skip() +def test_add_nodes(): + nodes = pvf.NodesFile(N=100) + + net = popnet.PopNetwork() + net.add_component('models_dir', '.') + with open('exc_dynamics.json', 'w') as fp: + json.dump({'tau_m': 0.1}, fp) + + with open('inh_dynamics.json', 'w') as fp: + json.dump({'tau_m': 0.2}, fp) + + net.add_nodes(nodes) + assert(net.networks == [nodes.name]) + assert(len(net.get_internal_nodes()) == 2) + assert(len(net.get_populations(nodes.name)) == 3) + assert(net.get_populations(nodes.name)) + + pop_e = net.get_population(nodes.name, 101) + assert (pop_e['ei'] == 'e') + assert (pop_e.is_internal == True) + assert (pop_e.pop_id == 101) + assert (pop_e.tau_m == 0.1) + + pop_i = net.get_population(nodes.name, 102) + assert (pop_i['ei'] == 'i') + assert (pop_i.is_internal == True) + assert (pop_i.tau_m == 0.2) + + +#test_add_nodes() \ No newline at end of file diff --git a/bmtk-vb/bmtk/tests/simulator/utils/files/circuit_config.json b/bmtk-vb/bmtk/tests/simulator/utils/files/circuit_config.json new file mode 100755 index 0000000..3da4ff1 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/utils/files/circuit_config.json @@ -0,0 +1,43 @@ +{ + "target_simulator":"NEURON", + + "components": { + "morphologies": "$COMPONENT_DIR/morphologies", + "synaptic_models": "$COMPONENT_DIR/synapse_dynamics", + "mechanisms":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models": "$COMPONENT_DIR/biophysical_neuron_dynamics", + "point_neuron_models": "$COMPONENT_DIR/point_neuron_dynamics", + "templates": "$COMPONENT_DIR/hoc_templates" + + }, + + "networks": { + "node_files": [ + { + "nodes": "$NETWORK_DIR/V1/v1_nodes.h5", + "node_types": "$NETWORK_DIR/V1/v1_node_types.csv" + }, + { + "nodes": "$NETWORK_DIR/LGN/lgn_nodes.h5", + "node_types": "$NETWORK_DIR/LGN/lgn_node_types.csv" + } + ], + + "edge_files": [ + { + "edges": "$NETWORK_DIR/V1/v1_edges.h5", + "edge_types": "$NETWORK_DIR/V1/v1_edge_types.csv" + }, + { + "edges": "$NETWORK_DIR/LGN/lgn_v1_edges.h5", + "edge_types": "$NETWORK_DIR/LGN/lgn_v1_edge_types.csv" + } + ] + }, + + "manifest": { + "$BASE_DIR": "${configdir}", + "$NETWORK_DIR": "$BASE_DIR/networks", + "$COMPONENT_DIR": "$BASE_DIR/components" + } +} diff --git a/bmtk-vb/bmtk/tests/simulator/utils/files/config.json b/bmtk-vb/bmtk/tests/simulator/utils/files/config.json new file mode 100644 index 0000000..27539c1 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/utils/files/config.json @@ -0,0 +1,9 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}" + }, + + "simulation": "${BASE_DIR}/simulator_config.json", + "network": "$BASE_DIR/circuit_config.json" + +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/tests/simulator/utils/files/simulator_config.json b/bmtk-vb/bmtk/tests/simulator/utils/files/simulator_config.json new file mode 100644 index 0000000..1606d3d --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/utils/files/simulator_config.json @@ -0,0 +1,50 @@ +{ + "run": { + "tstop": 3000.0, + "dt": 0.025, + "dL": 20, + "overwrite_output_dir": true, + "spike_threshold": -15, + "save_state":false, + "start_from_state": false, + "nsteps_block":5000, + "save_cell_vars": ["v", "cai"], + "calc_ecp": false, + "connect_internal": true, + "connect_external": {"lgn": true, "tw": true} + }, + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "groups": { + "save_vars": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + }, + + "input": [ + { + "type": "external_spikes", + "format": "nwb", + "file": "lgn_spike_trains.txt", + "network": "lgn", + "trial": "trial_0" + } + ], + + "output": { + "log": "$OUTPUT_DIR/log.txt", + "spikes_ascii": "$OUTPUT_DIR/spikes.txt", + "spikes_h5": "$OUTPUT_DIR/spikes.h5", + "cell_vars_dir": "$OUTPUT_DIR/cellvars", + "extra_cell_vars": "$OUTPUT_DIR/extra_cell_vars.h5", + "ecp_file": "$OUTPUT_DIR/ecp.h5", + "state_dir": "$OUTPUT_DIR/state", + "output_dir": "$OUTPUT_DIR" + }, + + "manifest": { + "$OUTPUT_DIR": "./output" + } +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/tests/simulator/utils/test_config.py b/bmtk-vb/bmtk/tests/simulator/utils/test_config.py new file mode 100644 index 0000000..414666d --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/utils/test_config.py @@ -0,0 +1,148 @@ +import os +import pytest + +import bmtk.simulator.utils.config as cfg + + +def config_path(rel_path): + c_path = os.path.dirname(os.path.realpath(__file__)) + return os.path.join(c_path, rel_path) + + +def test_load_parent_config(): + """Test a parent config file can pull in children configs""" + cfg_full_path = config_path('files/config.json') + config = cfg.from_json(cfg_full_path) + assert(config['config_path'] == cfg_full_path) + assert('components' in config) + assert('networks' in config) + assert('run' in config) + + +def test_load_network_config(): + cfg_full_path = config_path('files/circuit_config.json') + config = cfg.from_json(cfg_full_path) + manifest = config['manifest'] + assert(config['config_path'] == cfg_full_path) + assert(config['components']['morphologies'] == os.path.join(manifest['$COMPONENT_DIR'], 'morphologies')) + assert(config['networks']['node_files'][0]['nodes'] == os.path.join(manifest['$NETWORK_DIR'], 'V1/v1_nodes.h5')) + + +def test_load_simulator_config(): + cfg_full_path = config_path('files/simulator_config.json') + config = cfg.from_json(cfg_full_path) + manifest = config['manifest'] + assert('run' in config) + assert(config['output']['log'] == os.path.join(manifest['$OUTPUT_DIR'], 'log.txt')) + + +def test_build_manifest1(): + """Test simple manifest""" + config_file = {'manifest': { + '$BASE_DIR': '/base', + '$TMP_DIR': '$BASE_DIR/tmp', + '$SHARE_DIR': '${TMP_DIR}_1/share' + }} + + manifest = cfg.__build_manifest(config_file) + assert(manifest['$BASE_DIR'] == '/base') + assert(manifest['$TMP_DIR'] == '/base/tmp') + assert(manifest['$SHARE_DIR'] == '/base/tmp_1/share') + + +def test_build_manifest2(): + config_file = {'manifest': { + '$DIR_DATA': 'data', + '$DIR_MAT': 'mat', + '$APPS': '/${DIR_DATA}/$DIR_MAT/apps' + }} + + manifest = cfg.__build_manifest(config_file) + assert(manifest['$APPS'] == '/data/mat/apps') + + +def test_build_manifest_fail1(): + """Test exception occurs when variable is missing""" + config_file = {'manifest': { + '$BASE': '/base', + '$TMP': '$VAR/Smat', + }} + with pytest.raises(Exception): + cfg.__build_manifest(config_file) + + +def test_build_manifest_fail2(): + """Test recursive definition""" + config_file = {'manifest': { + '$BASE': '$TMP/share', + '$TMP': '$BASE/share', + }} + with pytest.raises(Exception): + cfg.__build_manifest(config_file) + + +def test_resolve_var_str(): + """Check that a variable can be resolved in a string""" + config_file = { + 'manifest': { + '$BASE': 'path' + }, + 's1': '$BASE/test', + 'i1': 9 + } + conf = cfg.from_dict(config_file) + assert(conf['s1'] == 'path/test') + assert(conf['i1'] == 9) + + +def test_resolve_var_list(): + """Check variables can be resolved in list""" + config_file = { + 'manifest': { + '$p1': 'a', + '$p2': 'b' + }, + 'l1': ['$p1/test', '${p2}/test', 9] + } + conf = cfg.from_dict(config_file) + assert(conf['l1'][0] == 'a/test') + assert(conf['l1'][1] == 'b/test') + assert(conf['l1'][2] == 9) + + +def test_resolve_var_dict(): + """Check variables can be resolved in dictionary""" + config_file = { + 'manifest': { + '$v1': 'a', + '$v2': 'c' + }, + 'd1': { + 'k1': '$v1', + 'k2': 'B', + 'k3': ['${v2}'], + 'k4': 4 + } + } + conf = cfg.from_dict(config_file) + assert(conf['d1']['k1'] == 'a') + assert(conf['d1']['k2'] == 'B') + assert(conf['d1']['k3'] == ['c']) + assert(conf['d1']['k4'] == 4) + + +def test_time_vars(): + config_file = { + 'd1': { + 'k1': 'k1_${date}', + 'k2': 'k2/$time', + 'k3': ['${datetime}'], + 'k4': 4 + } + } + + conf = cfg.from_dict(config_file) + + + +#test_time_vars() diff --git a/bmtk-vb/bmtk/tests/simulator/utils/test_nwb.py b/bmtk-vb/bmtk/tests/simulator/utils/test_nwb.py new file mode 100644 index 0000000..c92f058 --- /dev/null +++ b/bmtk-vb/bmtk/tests/simulator/utils/test_nwb.py @@ -0,0 +1,341 @@ +import pytest +import numpy as np +from bmtk.simulator.utils import nwb +import os +import h5py + + +def test_create_blank_file(): + nwb.create_blank_file() + f = nwb.create_blank_file(close=False) + file_name = f.filename + f.close() + + nwb.create_blank_file(file_name, force=True) + os.remove(file_name) + + +def test_create_blank_file_force(): + temp_file_name = nwb.get_temp_file_name() + nwb.create_blank_file(temp_file_name, force=True) + try: + nwb.create_blank_file(temp_file_name) + except IOError: + exception_caught = True + assert exception_caught + os.remove(temp_file_name) + + +def test_different_scales(): + y_values = 10*np.ones(10) + f = nwb.create_blank_file(close=False) + scale = nwb.DtScale(.1, 'time', 'second') + data = nwb.FiringRate(y_values, scale=scale) + data.add_to_stimulus(f) + + spike_train = nwb.FiringRate.get_stimulus(f, 0) + y_values_new = spike_train.data[:] + np.testing.assert_almost_equal(y_values_new, y_values) + f.close() + + +def test_set_data_file_handle(): + f = nwb.create_blank_file(close=False) + s0 = nwb._set_scale(f, '0', np.arange(3), 'time', 'second', "Scale") + s1 = nwb._set_scale(f, '1', np.arange(4), 'time', 'second', "Scale") + s2 = nwb._set_scale(f, '2', np.arange(5), 'time', 'second', "Scale") + nwb._set_data(f, '1D', np.zeros(3), s0, 'firing_rate', 'hertz') + nwb._set_data(f, '2D', np.zeros((3, 4)), (s0, s1), 'firing_rate', 'hertz') + nwb._set_data(f, '3D', np.zeros((3, 4, 5)), (s0, s1, s2), 'firing_rate', 'hertz') + + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_set_data_force(): + f = nwb.create_blank_file(close=False) + s0 = nwb._set_scale(f, '0', np.arange(3), 'time', 'second', "Scale") + nwb._set_data(f, 'test_force', np.zeros(3), s0, 'firing_rate', 'hertz') + nwb._set_data(f, 'test_force', np.zeros(3), s0, 'firing_rate', 'hertz', force=True) + + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_get_data(): + s0_tuple = '0', np.arange(3), 'distance', 'pixel', "Scale" + s1_tuple = '1', np.arange(4), 'distance', 'pixel', "Scale" + data, dimension, unit = np.ones((3, 4)), 'brightness', 'intensity' + + f = nwb.create_blank_file(close=False) + s0 = nwb._set_scale(f, *s0_tuple) + s1 = nwb._set_scale(f, *s1_tuple) + scales = (s0, s1) + nwb._set_data(f, 'test', data, scales, dimension, unit) + data_new, scales_new, dimension_new, unit_new, metadata = nwb._get_data(f['test']) + np.testing.assert_almost_equal(data, data_new) + assert len(metadata) == 0 + assert dimension == dimension_new + assert unit == unit_new + for scale_tuple, scale_new in zip((s0_tuple, s1_tuple), scales_new): + np.testing.assert_almost_equal(scale_tuple[1], scale_new[:]) + assert scale_tuple[2] == scale_new.attrs['dimension'] + assert scale_tuple[3] == scale_new.attrs['unit'] + + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_metadata(): + f = nwb.create_blank_file(close=False) + s0 = nwb._set_scale(f, '0', np.arange(3), 'time', 'second', "Scale") + nwb._set_data(f, 'test_metadata', np.zeros(3), s0, 'firing_rate', 'hertz', metadata={'name':'foo'}) + _, _, _, _, metadata = nwb._get_data(f['test_metadata']) + assert metadata['name'] == 'foo' + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_add_shared_scale(): + f = nwb.create_blank_file(close=False, force=True) + t_values = np.arange(10) + shared_scale = nwb.Scale(t_values, 'time', 'second') + data_0 = nwb.FiringRate(10*np.ones(10), scale=shared_scale) + data_0.add_to_stimulus(f) + data_1 = nwb.FiringRate(20*np.ones(10), scale=shared_scale) + data_1.add_to_stimulus(f) + + round_trip_0 = nwb.FiringRate.get_stimulus(f, 0) + assert data_0 == round_trip_0 + + round_trip_1 = nwb.FiringRate.get_stimulus(f, 1) + assert data_1 == round_trip_1 + + rt0, rt1 = nwb.FiringRate.get_stimulus(f) + assert data_0 == rt0 + assert data_1 == rt1 + + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_firing_rate(): + t_values = np.arange(10) + y_values = 10*np.ones(10) + + f = nwb.create_blank_file(close=False, force=True) + + scale = nwb.Scale(t_values, 'time', 'second') + data = nwb.FiringRate(y_values, scale=scale) + data.add_to_stimulus(f) + data.add_to_acquisition(f) + data.add_to_processing(f, 'step_0') + data.add_to_analysis(f, 'step_0') + + round_trip = nwb.FiringRate.get_stimulus(f, 0) + assert round_trip == data + + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_spike_train(): + t_values = np.arange(5)*.1 + y_values = np.array([0, 1, 2, 2, 1]) + + f = nwb.create_blank_file(close=False, force=True) + scale = nwb.Scale(t_values, 'time', 'second') + data = nwb.SpikeTrain(y_values, scale=scale) + data.add_to_stimulus(f) + data.add_to_acquisition(f) + data.add_to_processing(f, 'step_0') + data.add_to_analysis(f, 'step_0') + + round_trip = nwb.SpikeTrain.get_stimulus(f, 0) + assert round_trip == data + + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_grayscale_movie(): + t_values = np.arange(20)*.1 + row_values = np.arange(5) + col_values = np.arange(10) + data_values = np.empty((20, 5, 10)) + + f = nwb.create_blank_file(close=False, force=True) + t_scale = nwb.Scale(t_values, 'time', 'second') + row_scale = nwb.Scale(row_values, 'distance', 'pixel') + col_scale = nwb.Scale(col_values, 'distance', 'pixel') + + data = nwb.GrayScaleMovie(data_values, scale=(t_scale, row_scale, col_scale), metadata={'foo': 5}) + data.add_to_stimulus(f) + data.add_to_acquisition(f) + data.add_to_processing(f, 'step_0') + data.add_to_analysis(f, 'step_0') + + round_trip = nwb.GrayScaleMovie.get_stimulus(f, 0) + np.testing.assert_almost_equal(round_trip.data[:], data.data[:], 12) + + round_trip = nwb.GrayScaleMovie.get_acquisition(f, 0) + np.testing.assert_almost_equal(round_trip.data[:], data.data[:], 12) + + round_trip = nwb.GrayScaleMovie.get_processing(f, 'step_0', 0) + np.testing.assert_almost_equal(round_trip.data[:], data.data[:], 12) + + round_trip = nwb.GrayScaleMovie.get_analysis(f, 'step_0', 0) + np.testing.assert_almost_equal(round_trip.data[:], data.data[:], 12) + f.close() + + +def test_processing(): + t_values = np.arange(10) + y_values = 10*np.ones(10) + + f = nwb.create_blank_file(close=False) + + scale = nwb.Scale(t_values, 'time', 'second') + data = nwb.FiringRate(y_values, scale=scale) + data.add_to_processing(f, 'step_0') + + scale = nwb.Scale(t_values, 'time', 'second') + data = nwb.FiringRate(y_values, scale=scale) + data.add_to_processing(f, 'step_0') + + scale = nwb.Scale(t_values, 'time', 'second') + data = nwb.FiringRate(y_values, scale=scale) + data.add_to_processing(f, 'step_1') + + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_analysis(): + t_values = np.arange(10) + y_values = 10*np.ones(10) + + f = nwb.create_blank_file(close=False) + + scale = nwb.Scale(t_values, 'time', 'second') + data = nwb.FiringRate(y_values, scale=scale) + data.add_to_analysis(f, 'step_0') + + scale = nwb.Scale(t_values, 'time', 'second') + data = nwb.FiringRate(y_values, scale=scale) + data.add_to_analysis(f, 'step_0') + + scale = nwb.Scale(t_values, 'time', 'second') + data = nwb.FiringRate(y_values, scale=scale) + data.add_to_analysis(f, 'step_1') + + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_writable(): + y_values = 10*np.ones(10) + scale = nwb.DtScale(.1, 'time', 'second') + data = nwb.FiringRate(y_values, scale=scale) + + f = nwb.create_blank_file(close=True) + try: + data.add_to_stimulus(f) + except TypeError as e: + assert str(e).replace('\'', '') == "NoneType object has no attribute __getitem__" + + f = nwb.create_blank_file(close=False) + f.close() + try: + data.add_to_stimulus(f) + except Exception as e: + assert str(e) == 'File not valid: ' + + +@pytest.mark.skip(reason='Ability to add 0-lenght datasetset has been removed in newer version of h5py') +def test_nullscale(): + y_values = np.array([.1, .5, .51]) + + f = nwb.create_blank_file(force=True) + data = nwb.SpikeTrain(y_values, unit='second') + data.add_to_stimulus(f) + + spike_train = nwb.SpikeTrain.get_stimulus(f) + y_values_new = spike_train.data[:] + np.testing.assert_almost_equal(y_values, y_values_new) + assert isinstance(spike_train.scales[0], nwb.NullScale) + f.close() + + +def test_timeseries(): + y_values = np.array([.1, .2, .1]) + f = nwb.create_blank_file() + scale = nwb.DtScale(.1, 'time', 'second') + nwb.TimeSeries(y_values, scale=scale, dimension='voltage', unit='volt').add_to_acquisition(f) + + data = nwb.TimeSeries.get_acquisition(f) + assert data.scales[0].dt == .1 + assert data.scales[0].unit == 'second' + np.testing.assert_almost_equal(data.data[:], y_values) + assert data.unit == 'volt' + + file_name = f.filename + f.close() + os.remove(file_name) + + +def test_external_link(): + data_original = np.zeros(10) + f = nwb.create_blank_file(force=True) + scale = nwb.Scale(np.zeros(10), 'time', 'second') + nwb.TimeSeries(data_original, scale=scale, dimension='voltage', unit='volt', + metadata={'foo': 1}).add_to_acquisition(f) + temp_file_name = f.filename + f.close() + + f = h5py.File(temp_file_name, 'r') + f2 = nwb.create_blank_file(force=True) + data = nwb.TimeSeries.get_acquisition(f, 0) + data.add_to_acquisition(f2) + f.close() + temp_file_name_2 = f2.filename + f2.close() + + f = h5py.File(temp_file_name_2) + data = nwb.TimeSeries.get_acquisition(f, 0) + np.testing.assert_almost_equal(data.data, data_original) + assert data.data.file.filename == temp_file_name + + f.close() + os.remove(temp_file_name) + os.remove(temp_file_name_2) + + +if __name__ == "__main__": + test_create_blank_file() # pragma: no cover + test_create_blank_file_force() # pragma: no cover + test_set_data_file_handle() # pragma: no cover + test_set_data_force() # pragma: no cover + test_get_data() # pragma: no cover + test_metadata() # pragma: no cover + test_add_shared_scale() # pragma: no cover + test_firing_rate() # pragma: no cover + test_processing() # pragma: no cover + test_analysis() # pragma: no cover + test_spike_train() # pragma: no cover + test_grayscale_movie() # pragma: no cover +# test_get_stimulus() # pragma: no cover + test_different_scales() + test_writable() + #test_nullscale() + test_timeseries() + test_external_link() diff --git a/bmtk-vb/bmtk/utils/__init__.py b/bmtk-vb/bmtk/utils/__init__.py new file mode 100644 index 0000000..1c9c088 --- /dev/null +++ b/bmtk-vb/bmtk/utils/__init__.py @@ -0,0 +1,24 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import logging + + diff --git a/bmtk-vb/bmtk/utils/__init__.pyc b/bmtk-vb/bmtk/utils/__init__.pyc new file mode 100644 index 0000000..ccd0172 Binary files /dev/null and b/bmtk-vb/bmtk/utils/__init__.pyc differ diff --git a/bmtk-vb/bmtk/utils/__pycache__/__init__.cpython-36.pyc b/bmtk-vb/bmtk/utils/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..90d6bc1 Binary files /dev/null and b/bmtk-vb/bmtk/utils/__pycache__/__init__.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..aeb1c8a Binary files /dev/null and b/bmtk-vb/bmtk/utils/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/cell_vars/__init__.py b/bmtk-vb/bmtk/utils/cell_vars/__init__.py new file mode 100644 index 0000000..021345f --- /dev/null +++ b/bmtk-vb/bmtk/utils/cell_vars/__init__.py @@ -0,0 +1,6 @@ +from .var_reader import CellVarsFile + + + + + diff --git a/bmtk-vb/bmtk/utils/cell_vars/__init__.pyc b/bmtk-vb/bmtk/utils/cell_vars/__init__.pyc new file mode 100644 index 0000000..0eba0b8 Binary files /dev/null and b/bmtk-vb/bmtk/utils/cell_vars/__init__.pyc differ diff --git a/bmtk-vb/bmtk/utils/cell_vars/var_reader.py b/bmtk-vb/bmtk/utils/cell_vars/var_reader.py new file mode 100644 index 0000000..21da36d --- /dev/null +++ b/bmtk-vb/bmtk/utils/cell_vars/var_reader.py @@ -0,0 +1,134 @@ +import h5py +import numpy as np + + +class CellVarsFile(object): + VAR_UNKNOWN = 'Unknown' + UNITS_UNKNOWN = 'NA' + + def __init__(self, filename, mode='r', **params): + self._h5_handle = h5py.File(filename, 'r') + self._h5_root = self._h5_handle[params['h5_root']] if 'h5_root' in params else self._h5_handle['/'] + self._var_data = {} + self._var_units = {} + + self._mapping = None + + # Look for variabl and mapping groups + for var_name in self._h5_root.keys(): + hf_grp = self._h5_root[var_name] + + if var_name == 'data': + # According to the sonata format the /data table should be located at the root + var_name = self._h5_root['data'].attrs.get('variable_name', CellVarsFile.VAR_UNKNOWN) + self._var_data[var_name] = self._h5_root['data'] + self._var_units[var_name] = self._find_units(self._h5_root['data']) + + if not isinstance(hf_grp, h5py.Group): + continue + + if var_name == 'mapping': + # Check for /mapping group + self._mapping = hf_grp + else: + # In the bmtk we can support multiple variables in the same file (not sonata compliant but should be) + # where each variable table is separated into its own group //data + if 'data' not in hf_grp: + print('Warning: could not find "data" dataset in {}. Skipping!'.format(var_name)) + else: + self._var_data[var_name] = hf_grp['data'] + self._var_units[var_name] = self._find_units(hf_grp['data']) + + # create map between gids and tables + self._gid2data_table = {} + if self._mapping is None: + raise Exception('could not find /mapping group') + else: + gids_ds = self._mapping['gids'] + index_pointer_ds = self._mapping['index_pointer'] + for indx, gid in enumerate(gids_ds): + self._gid2data_table[gid] = (index_pointer_ds[indx], index_pointer_ds[indx+1]) # slice(index_pointer_ds[indx], index_pointer_ds[indx+1]) + + time_ds = self._mapping['time'] + self._t_start = time_ds[0] + self._t_stop = time_ds[1] + self._dt = time_ds[2] + self._n_steps = int((self._t_stop - self._t_start) / self._dt) + + @property + def variables(self): + return list(self._var_data.keys()) + + @property + def gids(self): + return list(self._gid2data_table.keys()) + + @property + def t_start(self): + return self._t_start + + @property + def t_stop(self): + return self._t_stop + + @property + def dt(self): + return self._dt + + @property + def time_trace(self): + return np.linspace(self.t_start, self.t_stop, num=self._n_steps, endpoint=True) + + @property + def h5(self): + return self._h5_root + + def _find_units(self, data_set): + return data_set.attrs.get('units', CellVarsFile.UNITS_UNKNOWN) + + def units(self, var_name=VAR_UNKNOWN): + return self._var_units[var_name] + + def n_compartments(self, gid): + bounds = self._gid2data_table[gid] + return bounds[1] - bounds[0] + + def compartment_ids(self, gid): + bounds = self._gid2data_table[gid] + return self._mapping['element_id'][bounds[0]:bounds[1]] + + def compartment_positions(self, gid): + bounds = self._gid2data_table[gid] + return self._mapping['element_pos'][bounds[0]:bounds[1]] + + def data(self, gid, var_name=VAR_UNKNOWN,time_window=None, compartments='origin'): + if var_name not in self.variables: + raise Exception('Unknown variable {}'.format(var_name)) + + if time_window is None: + time_slice = slice(0, self._n_steps) + else: + if len(time_window) != 2: + raise Exception('Invalid time_window, expecting tuple [being, end].') + + window_beg = max(int((time_window[0] - self.t_start)/self.dt), 0) + window_end = min(int((time_window[1] - self.t_start)/self.dt), self._n_steps/self.dt) + time_slice = slice(window_beg, window_end) + + multi_compartments = True + if compartments == 'origin' or self.n_compartments(gid) == 1: + # Return the first (and possibly only) compartment for said gid + gid_slice = self._gid2data_table[gid][0] + multi_compartments = False + elif compartments == 'all': + # Return all compartments + gid_slice = slice(self._gid2data_table[gid][0], self._gid2data_table[gid][1]) + else: + # return all compartments with corresponding element id + compartment_list = list(compartments) if isinstance(compartments, (long, int)) else compartments + begin = self._gid2data_table[gid][0] + end = self._gid2data_table[gid][1] + gid_slice = [i for i in range(begin, end) if self._mapping[i] in compartment_list] + + data = np.array(self._var_data[var_name][time_slice, gid_slice]) + return data.T if multi_compartments else data diff --git a/bmtk-vb/bmtk/utils/cell_vars/var_reader.pyc b/bmtk-vb/bmtk/utils/cell_vars/var_reader.pyc new file mode 100644 index 0000000..a307d73 Binary files /dev/null and b/bmtk-vb/bmtk/utils/cell_vars/var_reader.pyc differ diff --git a/bmtk-vb/bmtk/utils/converters/__init__.py b/bmtk-vb/bmtk/utils/converters/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/bmtk/utils/converters/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/bmtk/utils/converters/hoc_converter.py b/bmtk-vb/bmtk/utils/converters/hoc_converter.py new file mode 100644 index 0000000..c500945 --- /dev/null +++ b/bmtk-vb/bmtk/utils/converters/hoc_converter.py @@ -0,0 +1,299 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import json +import os.path +import re +from collections import defaultdict +from itertools import groupby +from lxml import etree +import bluepyopt.ephys as ephys +from tqdm import tqdm +import utils + +XML_NS = '{http://www.neuroml.org/schema/neuroml2}' +MECHANISMS = [ + 'channelDensity', 'channelDensityNernst', 'specificCapacitance', 'species', + 'resistivity', 'concentrationModel' +] + +LOCATION_MAP = { + 'apic': 'apical', + 'soma': 'somatic', + 'dend': 'basal', + 'axon': 'axonal', + 'all': 'all' +} + + +def map_location_name(name): + return LOCATION_MAP[name] + + +def load_json(json_path): + params = json.load(open(json_path)) + + scalar = ephys.parameterscalers.NrnSegmentLinearScaler() + mechanisms = {} + sections_lookup = {'soma': 'somatic', 'dend': 'basal', 'axon': 'axonal', 'apic': 'apical'} + def getNrnSeclist(loc_name): + return ephys.locations.NrnSeclistLocation(loc_name, seclist_name=loc_name) + + parameters = [] + for d in params['genome']: + section = sections_lookup[d['section']] + value = d['value'] + name = d['name'] + mech = 'pas' if name == 'g_pass' else d['mechanism'] + mech_name = 'CaDynamics' if mech == 'CaDynamics' else '{}.{}'.format(name, d['section']) + p_name = '{}_{}'.format(name, section) if name == 'g_pass' else name + + if mech_name not in mechanisms: + nrn_mech = ephys.mechanisms.NrnMODMechanism(name=mech_name, mod_path=None, suffix=mech, + locations=[getNrnSeclist(section)]) + mechanisms[mech_name] = nrn_mech + + parameters.append(ephys.parameters.NrnSectionParameter(name=p_name, param_name=name, value_scaler=scalar, + value=value, locations=[getNrnSeclist(section)])) + + parameters.append(ephys.parameters.NrnSectionParameter(name='erev_na', param_name='ena', value_scaler=scalar, + value=params['conditions'][0]['erev'][0]['ena'], + locations=[getNrnSeclist('somatic')])) + parameters.append(ephys.parameters.NrnSectionParameter(name='erev_k', param_name='ek', value_scaler=scalar, + value=params['conditions'][0]['erev'][0]['ek'], + locations=[getNrnSeclist('somatic')])) + parameters.append(ephys.parameters.NrnSectionParameter(name='erev_pas', param_name='e_pas', value_scaler=scalar, + value=params['conditions'][0]['v_init'], + locations=[getNrnSeclist('somatic'), getNrnSeclist('axonal'), + getNrnSeclist('basal'), getNrnSeclist('apical')])) + + parameters.append(ephys.parameters.NrnSectionParameter(name='erev_Ih', param_name='ehcn', value_scaler=scalar, + value=-45.0, + locations=[getNrnSeclist('somatic')])) + + parameters.append(ephys.parameters.NrnSectionParameter(name='res_all', param_name='Ra', value_scaler=scalar, + value=params['passive'][0]['ra'], + locations=[getNrnSeclist('somatic')])) + for sec in params['passive'][0]['cm']: + parameters.append( + ephys.parameters.NrnSectionParameter(name='{}_cap'.format(sec['section']), param_name='cm', + value_scaler=scalar, + value=sec['cm'], + locations=[getNrnSeclist(sec['section'])])) + + parameters.append( + ephys.parameters.NrnSectionParameter(name='ca', param_name='depth_CaDynamics', value_scaler=scalar, + value=0.1, locations=[getNrnSeclist('somatic')])) + parameters.append( + ephys.parameters.NrnSectionParameter(name='ca', param_name='minCai_CaDynamics', value_scaler=scalar, + value=0.0001, locations=[getNrnSeclist('somatic')])) + + return mechanisms.values(), parameters + + +def load_neuroml(neuroml_path): + root = etree.parse(neuroml_path).getroot() + biophysics = defaultdict(list) + for mechanism in MECHANISMS: + xml_mechanisms = root.findall('.//' + XML_NS + mechanism) + for xml_mechanism in xml_mechanisms: + biophysics[mechanism].append(xml_mechanism.attrib) + + return biophysics + + +def define_mechanisms(biophysics): + def keyfn(x): + return x['segmentGroup'] + + channels = biophysics['channelDensity'] + biophysics[ + 'channelDensityNernst'] + segment_groups = [(k, list(g)) + for k, g in groupby( + sorted( + channels, key=keyfn), keyfn)] + mechanisms = [] + for sectionlist, channels in segment_groups: + loc_name = map_location_name(sectionlist) + seclist_loc = ephys.locations.NrnSeclistLocation( + loc_name, seclist_name=loc_name) + for channel in channels: + # print 'mechanisms.append(ephys.mechanisms.NrnMODMechanism(name={}.{}, mod_path=None, suffix={}, locations=[{}]))'.format(channel['ionChannel'], loc_name, channel['ionChannel'], seclist_loc) + mechanisms.append( + ephys.mechanisms.NrnMODMechanism( + name='%s.%s' % (channel['ionChannel'], loc_name), + mod_path=None, + suffix=channel['ionChannel'], + locations=[seclist_loc], )) + for elem in biophysics['species']: + section = map_location_name(elem['segmentGroup']) + section_loc = ephys.locations.NrnSeclistLocation( + section, seclist_name=section) + # print 'mechanisms.append(ephys.mechanisms.NrnMODMechanism(name={}, mod_path=None, suffix={}, location=[{}]))'.format(elem['concentrationModel'], elem['concentrationModel'], section_loc) + mechanisms.append( + ephys.mechanisms.NrnMODMechanism( + name=elem['concentrationModel'], + mod_path=None, + suffix=elem['concentrationModel'], + locations=[section_loc])) + + return mechanisms + + +def define_parameters(biophysics): + ''' for the time being all AIBS distribution are uniform ''' + parameters = [] + + def keyfn(x): + return x['ionChannel'] + + NUMERIC_CONST_PATTERN = r'''[-+]? (?: (?: \d* \. \d+ ) | (?: \d+ \.? ) )(?: [Ee] [+-]? \d+ ) ?''' + rx = re.compile(NUMERIC_CONST_PATTERN, re.VERBOSE) + + def get_cond_density(density_string): + m = re.match(rx, density_string) + return float(m.group()) + + scaler = ephys.parameterscalers.NrnSegmentLinearScaler() + MAP_EREV = { + 'Im': 'ek', + 'Ih': 'ehcn', # I am not sure of that one + 'Nap': 'ena', + 'K_P': 'ek', + 'K_T': 'ek', + 'SK': 'ek', + 'SKv3_1': 'ek', + 'NaTs': 'ena', + 'Kv3_1': 'ek', + 'NaV': 'ena', + 'Kd': 'ek', + 'Kv2like': 'ek', + 'Im_v2': 'ek', + 'pas': 'e_pas' + } + for mech_type in ['channelDensity', 'channelDensityNernst']: + mechanisms = biophysics[mech_type] + for mech in mechanisms: + section_list = map_location_name(mech['segmentGroup']) + seclist_loc = ephys.locations.NrnSeclistLocation( + section_list, seclist_name=section_list) + + def map_name(name): + ''' this name has to match the name in the mod file ''' + reg_name = re.compile('gbar\_(?P[\w]+)') + m = re.match(reg_name, name) + if m: + channel = m.group('channel') + return 'gbar' + '_' + channel + if name[:len('g_pas')] == 'g_pas': + ''' special case ''' + return 'g_pas' + assert False, "name %s" % name + + param_name = map_name(mech['id']) + # print 'parameters.append(ephys.parameters.NrnSectionParameter(name={}, param_name={}, value_scalar={}, value={}, locations=[{}]))'.format(mech['id'], param_name, scaler, get_cond_density(mech['condDensity']), seclist_loc) + parameters.append( + ephys.parameters.NrnSectionParameter( + name=mech['id'], + param_name=param_name, + value_scaler=scaler, + value=get_cond_density(mech['condDensity']), + locations=[seclist_loc])) + if mech_type != 'channelDensityNernst': + # print 'parameters.append(ephys.parameters.NrnSectionParameter(name={}, param_name={}, value_scalar={}, value={}, locations=[{}]))'.format('erev' + mech['id'], MAP_EREV[mech['ionChannel']], scaler, get_cond_density(mech['erev']), seclist_loc) + parameters.append( + ephys.parameters.NrnSectionParameter( + name='erev' + mech['id'], + param_name=MAP_EREV[mech['ionChannel']], + value_scaler=scaler, + value=get_cond_density(mech['erev']), + locations=[seclist_loc])) + + # print '' + PARAM_NAME = {'specificCapacitance': 'cm', 'resistivity': 'Ra'} + for b_type in ['specificCapacitance', 'resistivity']: + for elem in biophysics[b_type]: + section = map_location_name(elem['segmentGroup']) + section_loc = ephys.locations.NrnSeclistLocation( + section, seclist_name=section) + + # print 'parameters.append(ephys.parameters.NrnSectionParameter(name={}, param_name={}, value_scalar={}, value={}, locations=[{}]))'.format(elem['id'], PARAM_NAME[b_type], scaler, get_cond_density(elem['value']), seclist_loc) + parameters.append( + ephys.parameters.NrnSectionParameter( + name=elem['id'], + param_name=PARAM_NAME[b_type], + value_scaler=scaler, + value=get_cond_density(elem['value']), + locations=[section_loc])) + concentrationModel = biophysics['concentrationModel'][0] + + # print '' + for elem in biophysics['species']: + section = map_location_name(elem['segmentGroup']) + section_loc = ephys.locations.NrnSeclistLocation( + section, seclist_name=section) + for attribute in ['gamma', 'decay', 'depth', 'minCai']: + # print 'parameters.append(ephys.parameters.NrnSectionParameter(name={}, param_name={}, value_scalar={}, value={}, locations=[{}]))'.format(elem['id'], attribute + '_' + elem['concentrationModel'], scaler, get_cond_density(concentrationModel[attribute]), seclist_loc) + parameters.append( + ephys.parameters.NrnSectionParameter( + name=elem['id'], + param_name=attribute + '_' + elem['concentrationModel'], + value_scaler=scaler, + value=get_cond_density(concentrationModel[attribute]), + locations=[section_loc])) + + return parameters + + +def create_hoc(neuroml_path, neuroml, morphologies, incr, output_dir): + if neuroml_path.endswith('json'): + mechanisms, parameters = load_json(neuroml_path) + + else: + biophysics = load_neuroml(neuroml_path) + mechanisms = define_mechanisms(biophysics) + parameters = define_parameters(biophysics) + + for morphology in morphologies: + ccell_name = utils.name_ccell(neuroml, morphology) + hoc = ephys.create_hoc.create_hoc( + mechs=mechanisms, + parameters=parameters, + template_name='ccell' + str(incr), + template_filename='cell_template_compatible.jinja2', + template_dir='.', + morphology=morphology + '.swc', ) + with open(os.path.join(output_dir, ccell_name + '.hoc'), 'w') as f: + f.write(hoc) + + +def convert_to_hoc(config, cells, output_dir): + to_convert = cells[['dynamics_params', 'morphology', 'neuroml']] + to_convert = to_convert.drop_duplicates() + neuroml_config_path = config['components']['biophysical_neuron_models_dir'] + incr = 0 + for name, g in tqdm(to_convert.groupby('dynamics_params'), 'creating hoc files'): + neuroml_path = os.path.join(neuroml_config_path, name) + create_hoc(neuroml_path, + list(g['neuroml'])[0], + set(g['morphology']), incr, output_dir) + incr += 1 \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/converters/sonata/__init__.py b/bmtk-vb/bmtk/utils/converters/sonata/__init__.py new file mode 100644 index 0000000..c473e5d --- /dev/null +++ b/bmtk-vb/bmtk/utils/converters/sonata/__init__.py @@ -0,0 +1,2 @@ +from edge_converters import convert_edges +from node_converters import convert_nodes diff --git a/bmtk-vb/bmtk/utils/converters/sonata/edge_converters.py b/bmtk-vb/bmtk/utils/converters/sonata/edge_converters.py new file mode 100644 index 0000000..335d4f5 --- /dev/null +++ b/bmtk-vb/bmtk/utils/converters/sonata/edge_converters.py @@ -0,0 +1,278 @@ +import os +from functools import partial + +import numpy as np +import pandas as pd +import h5py + +column_renames = { + 'params_file': 'dynamics_params', + 'level_of_detail': 'model_type', + 'morphology': 'morphology', + 'x_soma': 'x', + 'y_soma': 'y', + 'z_soma': 'z', + 'weight_max': 'syn_weight', + 'set_params_function': 'model_template' +} + + +def convert_edges(edges_file, edge_types_file, **params): + is_flat_h5 = False + is_new_h5 = False + try: + h5file = h5py.File(edges_file, 'r') + print + if 'edges' in h5file: + is_new_h5 = True + elif 'num_syns' in h5file: + is_flat_h5 = True + except Exception as e: + pass + + if is_flat_h5: + update_aibs_edges(edges_file, edge_types_file, **params) + return + elif is_new_h5: + update_h5_edges(edges_file, edge_types_file, **params) + return + + try: + edges_csv2h5(edges_file, **params) + return + except Exception as exc: + raise exc + + raise Exception('Could not parse edges file') + + +def update_edge_types_file(edge_types_file, src_network=None, trg_network=None, output_dir='network'): + edge_types_csv = pd.read_csv(edge_types_file, sep=' ') + + # rename required columns + edge_types_csv = edge_types_csv.rename(index=str, columns=column_renames) + + edge_types_output_fn = os.path.join(output_dir, '{}_{}_edge_types.csv'.format(src_network, trg_network)) + edge_types_csv.to_csv(edge_types_output_fn, sep=' ', index=False, na_rep='NONE') + + +def update_h5_edges(edges_file, edge_types_file, src_network=None, population_name=None, trg_network=None, + output_dir='network'): + population_name = population_name if population_name is not None else '{}_to_{}'.format(src_network, trg_network) + input_h5 = h5py.File(edges_file, 'r') + + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + edges_output_fn = os.path.join(output_dir, '{}_{}_edges.h5'.format(src_network, trg_network)) + with h5py.File(edges_output_fn, 'w') as h5: + edges_path = '/edges/{}'.format(population_name) + h5.copy(input_h5['/edges'], edges_path) + grp = h5[edges_path] + grp.move('source_gid', 'source_node_id') + grp.move('target_gid', 'target_node_id') + grp.move('edge_group', 'edge_group_id') + + if 'network' in grp['source_node_id'].attrs: + del grp['source_node_id'].attrs['network'] + grp['source_node_id'].attrs['node_population'] = src_network + + if 'network' in grp['target_node_id'].attrs: + del grp['target_node_id'].attrs['network'] + grp['target_node_id'].attrs['node_population'] = trg_network + + create_index(input_h5['edges/target_gid'], grp, index_type=INDEX_TARGET) + create_index(input_h5['edges/source_gid'], grp, index_type=INDEX_SOURCE) + + update_edge_types_file(edge_types_file, src_network, trg_network, output_dir) + + +def update_aibs_edges(edges_file, edge_types_file, trg_network, src_network, population_name=None, output_dir='output'): + population_name = population_name if population_name is not None else '{}_to_{}'.format(src_network, trg_network) + + edges_h5 = h5py.File(edges_file, 'r') + src_gids = edges_h5['/src_gids'] + n_edges = len(src_gids) + trg_gids = np.zeros(n_edges, dtype=np.uint64) + start = edges_h5['/edge_ptr'][0] + for trg_gid, end in enumerate(edges_h5['/edge_ptr'][1:]): + trg_gids[start:end] = [trg_gid]*(end-start) + start = end + + edges_output_fn = os.path.join(output_dir, '{}_{}_edges.h5'.format(src_network, trg_network)) + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + with h5py.File(edges_output_fn, 'w') as hf: + grp = hf.create_group('/edges/{}'.format(population_name)) + + grp.create_dataset('target_node_id', data=trg_gids, dtype='uint64') + grp['target_node_id'].attrs['node_population'] = trg_network + grp.create_dataset('source_node_id', data=edges_h5['src_gids'], dtype='uint64') + grp['source_node_id'].attrs['node_population'] = src_network + grp.create_dataset('edge_group_id', data=np.zeros(n_edges), dtype='uint32') + grp.create_dataset('edge_group_index', data=np.arange(0, n_edges)) + grp.create_dataset('edge_type_id', data=edges_h5['edge_types']) + grp.create_dataset('0/nsyns', data=edges_h5['num_syns'], dtype='uint32') + grp.create_group('0/dynamics_params') + + create_index(trg_gids, grp, index_type=INDEX_TARGET) + create_index(src_gids, grp, index_type=INDEX_SOURCE) + + update_edge_types_file(edge_types_file, src_network, trg_network, output_dir) + + +def edges_csv2h5(edges_file, edge_types_file, src_network, src_nodes, src_node_types, trg_network, trg_nodes, + trg_node_types, output_dir='network', src_label='location', trg_label='pop_name'): + """Used to convert oldest (isee engine) edges files + + :param edges_file: + :param edge_types_file: + :param src_network: + :param src_nodes: + :param src_node_types: + :param trg_network: + :param trg_nodes: + :param trg_node_types: + :param output_dir: + :param src_label: + :param trg_label: + """ + column_renames = { + 'target_model_id': 'node_type_id', + 'weight': 'weight_max', + 'weight_function': 'weight_func', + } + + columns_order = ['edge_type_id', 'target_query', 'source_query'] + + edges_h5 = h5py.File(edges_file, 'r') + edge_types_df = pd.read_csv(edge_types_file, sep=' ') + n_edges = len(edges_h5['src_gids']) + n_targets = len(edges_h5['indptr']) - 1 + + # rename specified columns in edge-types + edge_types_df = edge_types_df.rename(columns=column_renames) + + # Add a "target_query" and "source_query" columns from target_label and source_label + def query_col(row, labels, search_col): + return '&'.join("{}=='{}'".format(l, row[search_col]) for l in labels) + trg_query_fnc = partial(query_col, labels=['node_type_id', trg_label], search_col='target_label') + src_query_fnc = partial(query_col, labels=[src_label], search_col='source_label') + + edge_types_df['target_query'] = edge_types_df.apply(trg_query_fnc, axis=1) + edge_types_df['source_query'] = edge_types_df.apply(src_query_fnc, axis=1) + + # Add an edge_type_id column + edge_types_df['edge_type_id'] = np.arange(100, 100 + len(edge_types_df.index), dtype='uint32') + + nodes_tmp = pd.read_csv(src_nodes, sep=' ', index_col=['id']) + node_types_tmp = pd.read_csv(src_node_types, sep=' ') + src_nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='model_id') + + nodes_tmp = pd.read_csv(trg_nodes, sep=' ', index_col=['id']) + node_types_tmp = pd.read_csv(trg_node_types, sep=' ') + trg_nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='model_id') + + # For assigning edge types to each edge. For a given src --> trg pair we need to lookup source_label and + # target_label values of the nodes, then use it to find the corresponding edge_types row. + print('Processing edge_type_id dataset') + edge_types_ids = np.zeros(n_edges, dtype='uint32') + edge_types_df = edge_types_df.set_index(['node_type_id', 'target_label', 'source_label']) + ten_percent = int(n_targets*.1) # for keepting track of progress + index = 0 # keeping track of row index + for trg_gid in xrange(n_targets): + # for the target find value node_type_id and target_label + nodes_row = trg_nodes_df.loc[trg_gid] + model_id = nodes_row['model_id'] + trg_label_val = nodes_row[trg_label] + + # iterate through all the sources + idx_begin = edges_h5['indptr'][trg_gid] + idx_end = edges_h5['indptr'][trg_gid+1] + for src_gid in edges_h5['src_gids'][idx_begin:idx_end]: + # find each source_label, use value to find edge_type_id + # TODO: may be faster to filter by model_id, trg_label_val before iterating through the sources + src_label_val = src_nodes_df.loc[src_gid][src_label] + edge_type_id = edge_types_df.loc[model_id, trg_label_val, src_label_val]['edge_type_id'] + edge_types_ids[index] = edge_type_id + index += 1 + + if trg_gid % ten_percent == 0 and trg_gid != 0: + print(' processed {} out of {} targets'.format(trg_gid, n_targets)) + + # Create the target_gid table + print('Creating target_gid dataset') + trg_gids = np.zeros(n_edges) + for trg_gid in xrange(n_targets): + idx_begin = edges_h5['indptr'][trg_gid] + idx_end = edges_h5['indptr'][trg_gid+1] + trg_gids[idx_begin:idx_end] = [trg_gid]*(idx_end - idx_begin) + + # Save edges.h5 + edges_output_fn = '{}/{}_{}_edges.h5'.format(output_dir, src_network, trg_network) + print('Saving edges to {}.'.format(edges_output_fn)) + with h5py.File(edges_output_fn, 'w') as hf: + hf.create_dataset('edges/target_gid', data=trg_gids, dtype='uint64') + hf['edges/target_gid'].attrs['node_population'] = trg_network + hf.create_dataset('edges/source_gid', data=edges_h5['src_gids'], dtype='uint64') + hf['edges/source_gid'].attrs['node_population'] = trg_network + hf.create_dataset('edges/index_pointer', data=edges_h5['indptr']) + hf.create_dataset('edges/edge_group', data=np.zeros(n_edges), dtype='uint32') + hf.create_dataset('edges/edge_group_index', data=np.arange(0, n_edges)) + hf.create_dataset('edges/edge_type_id', data=edge_types_ids) + + hf.create_dataset('edges/0/nsyns', data=edges_h5['nsyns'], dtype='uint32') + + # Save edge_types.csv + update_edge_types_file(edge_types_file, src_network, trg_network, output_dir) + ''' + edges_types_output_fn = '{}/{}_{}_edge_types.csv'.format(output_dir, src_network, trg_network) + print('Saving edge-types to {}'.format(edges_types_output_fn)) + edge_types_df = edge_types_df[edge_types_df['edge_type_id'].isin(np.unique(edge_types_ids))] + # reorder columns + reorderd_cols = columns_order + [cn for cn in edge_types_df.columns.tolist() if cn not in columns_order] + edge_types_df = edge_types_df[reorderd_cols] + edge_types_df.to_csv(edges_types_output_fn, sep=' ', index=False, na_rep='NONE') + ''' + + +INDEX_TARGET = 0 +INDEX_SOURCE = 1 + + +def create_index(node_ids_ds, output_grp, index_type=INDEX_TARGET): + if index_type == INDEX_TARGET: + edge_nodes = np.array(node_ids_ds, dtype=np.int64) + output_grp = output_grp.create_group('indicies/target_to_source') + elif index_type == INDEX_SOURCE: + edge_nodes = np.array(node_ids_ds, dtype=np.int64) + output_grp = output_grp.create_group('indicies/source_to_target') + + edge_nodes = np.append(edge_nodes, [-1]) + n_targets = np.max(edge_nodes) + ranges_list = [[] for _ in xrange(n_targets + 1)] + + n_ranges = 0 + begin_index = 0 + cur_trg = edge_nodes[begin_index] + for end_index, trg_gid in enumerate(edge_nodes): + if cur_trg != trg_gid: + ranges_list[cur_trg].append((begin_index, end_index)) + cur_trg = int(trg_gid) + begin_index = end_index + n_ranges += 1 + + node_id_to_range = np.zeros((n_targets+1, 2)) + range_to_edge_id = np.zeros((n_ranges, 2)) + range_index = 0 + for node_index, trg_ranges in enumerate(ranges_list): + if len(trg_ranges) > 0: + node_id_to_range[node_index, 0] = range_index + for r in trg_ranges: + range_to_edge_id[range_index, :] = r + range_index += 1 + node_id_to_range[node_index, 1] = range_index + + output_grp.create_dataset('range_to_edge_id', data=range_to_edge_id, dtype='uint64') + output_grp.create_dataset('node_id_to_range', data=node_id_to_range, dtype='uint64') \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/converters/sonata/node_converters.py b/bmtk-vb/bmtk/utils/converters/sonata/node_converters.py new file mode 100644 index 0000000..befab51 --- /dev/null +++ b/bmtk-vb/bmtk/utils/converters/sonata/node_converters.py @@ -0,0 +1,399 @@ +import os + +import h5py +import pandas as pd +import numpy as np + + +def convert_nodes(nodes_file, node_types_file, **params): + is_h5 = False + try: + h5file = h5py.File(nodes_file, 'r') + is_h5 = True + except Exception as e: + pass + + if is_h5: + update_h5_nodes(nodes_file, node_types_file, **params) + return + + update_csv_nodes(nodes_file, node_types_file, **params) + + +# columns which need to be renamed, key is original name and value is the updated name +column_renames = { + 'id': 'node_id', + 'model_id': 'node_type_id', + 'electrophysiology': 'dynamics_params', + 'level_of_detail': 'model_type', + 'morphology': 'morphology', + 'params_file': 'dynamics_params', + 'x_soma': 'x', + 'y_soma': 'y', + 'z_soma': 'z' +} + + +def update_h5_nodes(nodes_file, node_types_file, network_name, output_dir='output', + column_order=('node_type_id', 'model_type', 'model_template', 'model_processing', 'dynamics_params', + 'morphology')): + # open nodes and node-types into a single table + input_h5 = h5py.File(nodes_file, 'r') + + output_name = '{}_nodes.h5'.format(network_name) + if not os.path.exists(output_dir): + os.makedirs(output_dir) + nodes_output_fn = os.path.join(output_dir, output_name) + + # save nodes hdf5 + with h5py.File(nodes_output_fn, 'w') as h5: + #h5.copy() + #grp = h5.create_group('/nodes/{}'.format(network_name)) + #input_grp = input_h5['/nodes/'] + nodes_path = '/nodes/{}'.format(network_name) + h5.copy(input_h5['/nodes/'], nodes_path) + grp = h5[nodes_path] + grp.move('node_gid', 'node_id') + grp.move('node_group', 'node_group_id') + + node_types_csv = pd.read_csv(node_types_file, sep=' ') + + node_types_csv = node_types_csv.rename(index=str, columns=column_renames) + + # Change values for model type + model_type_map = { + 'biophysical': 'biophysical', + 'point_IntFire1': 'point_process', + 'intfire': 'point_process', + 'virtual': 'virtual', + 'iaf_psc_alpha': 'nest:iaf_psc_alpha', + 'filter': 'virtual' + } + node_types_csv['model_type'] = node_types_csv.apply(lambda row: model_type_map[row['model_type']], axis=1) + + # Add model_template column + def model_template(row): + model_type = row['model_type'] + if model_type == 'biophysical': + return 'ctdb:Biophys1.hoc' + elif model_type == 'point_process': + return 'nrn:IntFire1' + else: + return 'NONE' + node_types_csv['model_template'] = node_types_csv.apply(model_template, axis=1) + + # Add model_processing column + def model_processing(row): + model_type = row['model_type'] + if model_type == 'biophysical': + return 'aibs_perisomatic' + else: + return 'NONE' + node_types_csv['model_processing'] = node_types_csv.apply(model_processing, axis=1) + + # Reorder columns + orig_columns = node_types_csv.columns + col_order = [cn for cn in column_order if cn in orig_columns] + col_order += [cn for cn in node_types_csv.columns if cn not in column_order] + node_types_csv = node_types_csv[col_order] + + # Save node-types csv + node_types_output_fn = os.path.join(output_dir, '{}_node_types.csv'.format(network_name)) + node_types_csv.to_csv(node_types_output_fn, sep=' ', index=False, na_rep='NONE') + # open nodes and node-types into a single table + + ''' + print('loading csv files') + nodes_tmp = pd.read_csv(nodes_file, sep=' ') + node_types_tmp = pd.read_csv(node_types_file, sep=' ') + nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='node_type_id') + n_nodes = len(nodes_df.index) + + # rename required columns + nodes_df = nodes_df.rename(index=str, columns=column_renames) + + # Old versions of node_type_id may be set to strings/floats, convert to integers + dtype_ntid = nodes_df['node_type_id'].dtype + if dtype_ntid == 'object': + # if string, move model_id to pop_name and create an integer node_type_id column + if 'pop_name' in nodes_df.columns: + nodes_df = nodes_df.drop('pop_name', axis=1) + nodes_df = nodes_df.rename(index=str, columns={'node_type_id': 'pop_name'}) + ntid_map = {pop_name: indx for indx, pop_name in enumerate(nodes_df['pop_name'].unique())} + nodes_df['node_type_id'] = nodes_df.apply(lambda row: ntid_map[row['pop_name']], axis=1) + + elif dtype_ntid == 'float64': + nodes_df['node_type_id'] = nodes_df['node_type_id'].astype('uint64') + + # divide columns up into nodes and node-types columns, and for nodes determine which columns are valid for every + # node-type. The rules are + # 1. If all values are the same for a node-type-id, column belongs in node_types csv. If there's any intra + # node-type heterogenity then the column belongs in the nodes h5. + # 2. For nodes h5 columns, a column belongs to a node-type-id if it contains at least one non-null value + print('parsing input') + opt_columns = [n for n in nodes_df.columns if n not in ['node_id', 'node_type_id']] + heterogeneous_cols = {cn: False for cn in opt_columns} + nonnull_cols = {} # for each node-type, a list of columns that contains at least one non-null value + for node_type_id, nt_group in nodes_df.groupby(['node_type_id']): + nonnull_cols[node_type_id] = set(nt_group.columns[nt_group.isnull().any() == False].tolist()) + for col_name in opt_columns: + heterogeneous_cols[col_name] |= len(nt_group[col_name].unique()) > 1 + + nodes_columns = set(cn for cn, val in heterogeneous_cols.items() if val) + nodes_types_columns = [cn for cn, val in heterogeneous_cols.items() if not val] + + # Check for nodes columns that has non-numeric values, these will require some special processing to save to hdf5 + string_nodes_columns = set() + for col_name in nodes_columns: + if nodes_df[col_name].dtype == 'object': + string_nodes_columns.add(col_name) + if len(string_nodes_columns) > 0: + print('Warning: column(s) {} have non-numeric values that vary within a node-type and will be stored in h5 format'.format(list(string_nodes_columns))) + + # Divide the nodes columns into groups and create neccessary lookup tables. If two node-types share the same + # non-null columns then they belong to the same group + grp_idx2cols = {} # group-id --> group-columns + grp_cols2idx = {} # group-columns --> group-id + grp_id2idx = {} # node-type-id --> group-id + group_index = -1 + for nt_id, cols in nonnull_cols.items(): + group_columns = sorted(list(nodes_columns & cols)) + col_key = tuple(group_columns) + if col_key in grp_cols2idx: + grp_id2idx[nt_id] = grp_cols2idx[col_key] + else: + group_index += 1 + grp_cols2idx[col_key] = group_index + grp_idx2cols[group_index] = group_columns + grp_id2idx[nt_id] = group_index + + # merge x,y,z columns, if they exists, into 'positions' dataset + grp_pos_cols = {} + for grp_idx, cols in grp_idx2cols.items(): + pos_list = [] + for coord in ['x', 'y', 'z']: + if coord in cols: + pos_list += coord + grp_idx2cols[grp_idx].remove(coord) + if len(pos_list) > 0: + grp_pos_cols[grp_idx] = pos_list + + # Create the node_group and node_group_index columns + nodes_df['__bmtk_node_group'] = nodes_df.apply(lambda row: grp_id2idx[row['node_type_id']], axis=1) + nodes_df['__bmtk_node_group_index'] = [0]*n_nodes + for grpid in grp_idx2cols.keys(): + group_size = len(nodes_df[nodes_df['__bmtk_node_group'] == grpid]) + nodes_df.loc[nodes_df['__bmtk_node_group'] == grpid, '__bmtk_node_group_index'] = range(group_size) + + # Save nodes.h5 file + nodes_output_fn = os.path.join(output_dir, '{}_nodes.h5'.format(network_name)) + node_types_output_fn = os.path.join(output_dir, '{}_node_types.csv'.format(network_name)) + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + print('Creating {}'.format(nodes_output_fn)) + with h5py.File(nodes_output_fn, 'w') as hf: + hf.create_dataset('nodes/node_gid', data=nodes_df['node_id'], dtype='uint64') + hf['nodes/node_gid'].attrs['network'] = network_name + hf.create_dataset('nodes/node_type_id', data=nodes_df['node_type_id'], dtype='uint64') + hf.create_dataset('nodes/node_group', data=nodes_df['__bmtk_node_group'], dtype='uint32') + hf.create_dataset('nodes/node_group_index', data=nodes_df['__bmtk_node_group_index'], dtype='uint64') + + for grpid, cols in grp_idx2cols.items(): + group_slice = nodes_df[nodes_df['__bmtk_node_group'] == grpid] + for col_name in cols: + dataset_name = 'nodes/{}/{}'.format(grpid, col_name) + if col_name in string_nodes_columns: + # for columns with non-numeric values + dt = h5py.special_dtype(vlen=bytes) + hf.create_dataset(dataset_name, data=group_slice[col_name], dtype=dt) + else: + hf.create_dataset(dataset_name, data=group_slice[col_name]) + + # special case for positions + if grpid in grp_pos_cols: + hf.create_dataset('nodes/{}/positions'.format(grpid), + data=group_slice.as_matrix(columns=grp_pos_cols[grpid])) + + # Save the node_types.csv file + print('Creating {}'.format(node_types_output_fn)) + node_types_table = nodes_df[['node_type_id'] + nodes_types_columns] + node_types_table = node_types_table.drop_duplicates() + if len(sort_order) > 0: + node_types_table = node_types_table.sort_values(by=sort_order) + + node_types_table.to_csv(node_types_output_fn, sep=' ', index=False) # , na_rep='NONE') + ''' + + +def update_csv_nodes(nodes_file, node_types_file, network_name, output_dir='network', + column_order=('node_type_id', 'model_type', 'model_template', 'model_processing', + 'dynamics_params', 'morphology')): + # open nodes and node-types into a single table + print('loading csv files') + nodes_tmp = pd.read_csv(nodes_file, sep=' ') + node_types_tmp = pd.read_csv(node_types_file, sep=' ') + if 'model_id' in nodes_tmp: + nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='model_id') + elif 'node_type_id' in nodes_tmp: + nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='node_type_id') + else: + raise Exception('Could not find column to merge nodes and node_types') + + n_nodes = len(nodes_df.index) + + # rename required columns + nodes_df = nodes_df.rename(index=str, columns=column_renames) + + # Old versions of node_type_id may be set to strings/floats, convert to integers + dtype_ntid = nodes_df['node_type_id'].dtype + if dtype_ntid == 'object': + # if string, move model_id to pop_name and create an integer node_type_id column + if 'pop_name' in nodes_df: + nodes_df = nodes_df.drop('pop_name', axis=1) + + nodes_df = nodes_df.rename(index=str, columns={'node_type_id': 'pop_name'}) + + ntid_map = {pop_name: indx for indx, pop_name in enumerate(nodes_df['pop_name'].unique())} + nodes_df['node_type_id'] = nodes_df.apply(lambda row: ntid_map[row['pop_name']], axis=1) + + elif dtype_ntid == 'float64': + nodes_df['node_type_id'] = nodes_df['node_type_id'].astype('uint64') + + # divide columns up into nodes and node-types columns, and for nodes determine which columns are valid for every + # node-type. The rules are + # 1. If all values are the same for a node-type-id, column belongs in node_types csv. If there's any intra + # node-type heterogenity then the column belongs in the nodes h5. + # 2. For nodes h5 columns, a column belongs to a node-type-id if it contains at least one non-null value + print('parsing input') + opt_columns = [n for n in nodes_df.columns if n not in ['node_id', 'node_type_id']] + heterogeneous_cols = {cn: False for cn in opt_columns} + nonnull_cols = {} # for each node-type, a list of columns that contains at least one non-null value + for node_type_id, nt_group in nodes_df.groupby(['node_type_id']): + nonnull_cols[node_type_id] = set(nt_group.columns[nt_group.isnull().any() == False].tolist()) + for col_name in opt_columns: + heterogeneous_cols[col_name] |= len(nt_group[col_name].unique()) > 1 + + nodes_columns = set(cn for cn, val in heterogeneous_cols.items() if val) + nodes_types_columns = [cn for cn, val in heterogeneous_cols.items() if not val] + + # Check for nodes columns that has non-numeric values, these will require some special processing to save to hdf5 + string_nodes_columns = set() + for col_name in nodes_columns: + if nodes_df[col_name].dtype == 'object': + string_nodes_columns.add(col_name) + if len(string_nodes_columns) > 0: + print('Warning: column(s) {} have non-numeric values that vary within a node-type and will be stored in h5 format'.format(list(string_nodes_columns))) + + # Divide the nodes columns into groups and create neccessary lookup tables. If two node-types share the same + # non-null columns then they belong to the same group + grp_idx2cols = {} # group-id --> group-columns + grp_cols2idx = {} # group-columns --> group-id + grp_id2idx = {} # node-type-id --> group-id + group_index = -1 + for nt_id, cols in nonnull_cols.items(): + group_columns = sorted(list(nodes_columns & cols)) + col_key = tuple(group_columns) + if col_key in grp_cols2idx: + grp_id2idx[nt_id] = grp_cols2idx[col_key] + else: + group_index += 1 + grp_cols2idx[col_key] = group_index + grp_idx2cols[group_index] = group_columns + grp_id2idx[nt_id] = group_index + + # merge x,y,z columns, if they exists, into 'positions' dataset + grp_pos_cols = {} + for grp_idx, cols in grp_idx2cols.items(): + pos_list = [] + for coord in ['x', 'y', 'z']: + if coord in cols: + pos_list += coord + grp_idx2cols[grp_idx].remove(coord) + if len(pos_list) > 0: + grp_pos_cols[grp_idx] = pos_list + + # Create the node_group and node_group_index columns + nodes_df['__bmtk_node_group'] = nodes_df.apply(lambda row: grp_id2idx[row['node_type_id']], axis=1) + nodes_df['__bmtk_node_group_index'] = [0]*n_nodes + for grpid in grp_idx2cols.keys(): + group_size = len(nodes_df[nodes_df['__bmtk_node_group'] == grpid]) + nodes_df.loc[nodes_df['__bmtk_node_group'] == grpid, '__bmtk_node_group_index'] = range(group_size) + + # Save nodes.h5 file + nodes_output_fn = os.path.join(output_dir, '{}_nodes.h5'.format(network_name)) + node_types_output_fn = os.path.join(output_dir, '{}_node_types.csv'.format(network_name)) + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + print('Creating {}'.format(nodes_output_fn)) + with h5py.File(nodes_output_fn, 'w') as hf: + grp = hf.create_group('/nodes/{}'.format(network_name)) + grp.create_dataset('node_id', data=nodes_df['node_id'], dtype='uint64') + grp.create_dataset('node_type_id', data=nodes_df['node_type_id'], dtype='uint64') + grp.create_dataset('node_group_id', data=nodes_df['__bmtk_node_group'], dtype='uint32') + grp.create_dataset('node_group_index', data=nodes_df['__bmtk_node_group_index'], dtype='uint64') + + for grpid, cols in grp_idx2cols.items(): + group_slice = nodes_df[nodes_df['__bmtk_node_group'] == grpid] + for col_name in cols: + dataset_name = '{}/{}'.format(grpid, col_name) + if col_name in string_nodes_columns: + # for columns with non-numeric values + dt = h5py.special_dtype(vlen=bytes) + grp.create_dataset(dataset_name, data=group_slice[col_name], dtype=dt) + else: + grp.create_dataset(dataset_name, data=group_slice[col_name]) + + # special case for positions + if grpid in grp_pos_cols: + grp.create_dataset('{}/positions'.format(grpid), + data=group_slice.as_matrix(columns=grp_pos_cols[grpid])) + + # Create empty dynamics_params + grp.create_group('{}/dynamics_params'.format(grpid)) + + # Save the node_types.csv file + print('Creating {}'.format(node_types_output_fn)) + node_types_table = nodes_df[['node_type_id'] + nodes_types_columns] + node_types_table = node_types_table.drop_duplicates() + + # Change values for model type + model_type_map = { + 'biophysical': 'biophysical', + 'point_IntFire1': 'point_process', + 'virtual': 'virtual', + 'intfire': 'point_process', + 'filter': 'virtual' + } + node_types_table['model_type'] = node_types_table.apply(lambda row: model_type_map[row['model_type']], axis=1) + if 'set_params_function' in node_types_table: + node_types_table = node_types_table.drop('set_params_function', axis=1) + + # Add model_template column + def model_template(row): + model_type = row['model_type'] + if model_type == 'biophysical': + return 'ctdb:Biophys1.hoc' + elif model_type == 'point_process': + return 'nrn:IntFire1' + else: + return 'NONE' + node_types_table['model_template'] = node_types_table.apply(model_template, axis=1) + + # Add model_processing column + def model_processing(row): + model_type = row['model_type'] + if model_type == 'biophysical': + return 'aibs_perisomatic' + else: + return 'NONE' + node_types_table['model_processing'] = node_types_table.apply(model_processing, axis=1) + + # Reorder columns + orig_columns = node_types_table.columns + col_order = [cn for cn in column_order if cn in orig_columns] + col_order += [cn for cn in node_types_table.columns if cn not in column_order] + node_types_table = node_types_table[col_order] + + node_types_table.to_csv(node_types_output_fn, sep=' ', index=False, na_rep='NONE') diff --git a/bmtk-vb/bmtk/utils/io/Final_Sp2019_20190512.docx b/bmtk-vb/bmtk/utils/io/Final_Sp2019_20190512.docx new file mode 100644 index 0000000..a65f351 Binary files /dev/null and b/bmtk-vb/bmtk/utils/io/Final_Sp2019_20190512.docx differ diff --git a/bmtk-vb/bmtk/utils/io/__init__.py b/bmtk-vb/bmtk/utils/io/__init__.py new file mode 100644 index 0000000..aaccbcd --- /dev/null +++ b/bmtk-vb/bmtk/utils/io/__init__.py @@ -0,0 +1,27 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +#from tabular_network_v1 import TabularNetwork +#from tabular_network_v0 import TabularNetwork as TabularNetwork_AI + +def log_warning(message): + pass \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/io/__init__.pyc b/bmtk-vb/bmtk/utils/io/__init__.pyc new file mode 100644 index 0000000..34e44ce Binary files /dev/null and b/bmtk-vb/bmtk/utils/io/__init__.pyc differ diff --git a/bmtk-vb/bmtk/utils/io/__pycache__/__init__.cpython-36.pyc b/bmtk-vb/bmtk/utils/io/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..27ece15 Binary files /dev/null and b/bmtk-vb/bmtk/utils/io/__pycache__/__init__.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/io/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/utils/io/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..a618ec9 Binary files /dev/null and b/bmtk-vb/bmtk/utils/io/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/io/__pycache__/cell_vars.cpython-36.pyc b/bmtk-vb/bmtk/utils/io/__pycache__/cell_vars.cpython-36.pyc new file mode 100644 index 0000000..a29d147 Binary files /dev/null and b/bmtk-vb/bmtk/utils/io/__pycache__/cell_vars.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/io/__pycache__/cell_vars.cpython-37.pyc b/bmtk-vb/bmtk/utils/io/__pycache__/cell_vars.cpython-37.pyc new file mode 100644 index 0000000..6a0e1fa Binary files /dev/null and b/bmtk-vb/bmtk/utils/io/__pycache__/cell_vars.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/io/__pycache__/spike_trains.cpython-37.pyc b/bmtk-vb/bmtk/utils/io/__pycache__/spike_trains.cpython-37.pyc new file mode 100644 index 0000000..d550496 Binary files /dev/null and b/bmtk-vb/bmtk/utils/io/__pycache__/spike_trains.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/io/_test_cell_vars.py~ b/bmtk-vb/bmtk/utils/io/_test_cell_vars.py~ new file mode 100644 index 0000000..ac01c7a --- /dev/null +++ b/bmtk-vb/bmtk/utils/io/_test_cell_vars.py~ @@ -0,0 +1,3 @@ +from bmtk.builder.nerworks import NetworkBuilder + +# in cortical-column (add to PYTHONPATH) diff --git a/bmtk-vb/bmtk/utils/io/cell_vars.py b/bmtk-vb/bmtk/utils/io/cell_vars.py new file mode 100644 index 0000000..36fe8cf --- /dev/null +++ b/bmtk-vb/bmtk/utils/io/cell_vars.py @@ -0,0 +1,361 @@ +import os +import h5py +import numpy as np + +from bmtk.utils import io +from bmtk.utils.sonata.utils import add_hdf5_magic, add_hdf5_version + + +try: + from mpi4py import MPI + comm = MPI.COMM_WORLD + rank = comm.Get_rank() + nhosts = comm.Get_size() + +except Exception as exc: + pass + + +class CellVarRecorder(object): + """Used to save cell membrane variables (V, Ca2+, etc) to the described hdf5 format. + + For parallel simulations this class will write to a seperate tmp file on each rank, then use the merge method to + combine the results. This is less efficent, but doesn't require the user to install mpi4py and build h5py in + parallel mode. For better performance use the CellVarRecorderParrallel class instead. + """ + _io = io + + class DataTable(object): + """A small struct to keep track of different */data (and buffer) tables""" + def __init__(self, var_name): + self.var_name = var_name + # If buffering data, buffer_block will be an in-memory array and will write to data_block during when + # filled. If not buffering buffer_block is an hdf5 dataset and data_block is ignored + self.data_block = None + self.buffer_block = None + + def __init__(self, file_name, tmp_dir, variables, buffer_data=True, mpi_rank=0, mpi_size=1): + self._file_name = file_name + self._h5_handle = None + self._tmp_dir = tmp_dir + self._variables = variables if isinstance(variables, list) else [variables] + self._n_vars = len(self._variables) # Used later to keep track if more than one var is saved to the same file. + + self._mpi_rank = mpi_rank + self._mpi_size = mpi_size + self._tmp_files = [] + self._saved_file = file_name + + if mpi_size > 1 and not isinstance(self, CellVarRecorderParallel): + self._io.log_warning('Was unable to run h5py in parallel (mpi) mode.' + + ' Saving of membrane variable(s) may slow down.') + tmp_fname = os.path.basename(file_name) # make sure file names don't clash if there are multiple reports + self._tmp_files = [os.path.join(tmp_dir, '__bmtk_tmp_cellvars_{}_{}'.format(r, tmp_fname)) + for r in range(self._mpi_size)] + self._file_name = self._tmp_files[self._mpi_rank] + + self._mapping_gids = [] # list of gids in the order they appear in the data + self._gid_map = {} # table for looking up the gid offsets + + self._mapping_element_ids = [] # sections + self._mapping_element_pos = [] # segments + self._mapping_index = [0] # index_pointer + + self._buffer_data = buffer_data + self._data_blocks = {var_name: self.DataTable(var_name) for var_name in self._variables} + self._last_save_indx = 0 # for buffering, used to keep track of last timestep data was saved to disk + + self._buffer_block_size = 0 + self._total_steps = 0 + + # Keep track of gids across the different ranks + self._n_gids_all = 0 + self._n_gids_local = 0 + self._gids_beg = 0 + self._gids_end = 0 + + # Keep track of segment counts across the different ranks + self._n_segments_all = 0 + self._n_segments_local = 0 + self._seg_offset_beg = 0 + self._seg_offset_end = 0 + + self._tstart = 0.0 + self._tstop = 0.0 + self._dt = 0.01 + self._is_initialized = False + + @property + def tstart(self): + return self._tstart + + @tstart.setter + def tstart(self, time_ms): + self._tstart = time_ms + + @property + def tstop(self): + return self._tstop + + @tstop.setter + def tstop(self, time_ms): + self._tstop = time_ms + + @property + def dt(self): + return self._dt + + @dt.setter + def dt(self, time_ms): + self._dt = time_ms + + @property + def is_initialized(self): + return self._is_initialized + + def _calc_offset(self): + self._n_segments_all = self._n_segments_local + self._seg_offset_beg = 0 + self._seg_offset_end = self._n_segments_local + + self._n_gids_all = self._n_gids_local + self._gids_beg = 0 + self._gids_end = self._n_gids_local + + def _create_h5_file(self): + self._h5_handle = h5py.File(self._file_name, 'w') + add_hdf5_version(self._h5_handle) + add_hdf5_magic(self._h5_handle) + + def add_cell(self, gid, sec_list, seg_list): + assert(len(sec_list) == len(seg_list)) + # TODO: Check the same gid isn't added twice + n_segs = len(seg_list) + self._gid_map[gid] = (self._n_segments_local, self._n_segments_local + n_segs) + self._mapping_gids.append(gid) + self._mapping_element_ids.extend(sec_list) + self._mapping_element_pos.extend(seg_list) + self._mapping_index.append(self._mapping_index[-1] + n_segs) + self._n_segments_local += n_segs + self._n_gids_local += 1 + + def _create_big_dataset(self, where, name, shape, dtype): + """ + Create and return a dataset that doesn't get filled right when created + """ + spaceid = h5py.h5s.create_simple(shape) + plist = h5py.h5p.create(h5py.h5p.DATASET_CREATE) + plist.set_fill_time(h5py.h5d.FILL_TIME_NEVER) + if shape[0] < 500 or shape[1] < 512: + chunkshape = shape + else: + chunkshape = (shape[0]/500, shape[1]/512) # TODO: don't use fixed values? + plist.set_chunk(chunkshape) + datasetid = h5py.h5d.create(where.id,name,h5py.h5t.NATIVE_FLOAT, spaceid, plist) + return h5py.Dataset(datasetid) + + def initialize(self, n_steps, buffer_size=0): + self._calc_offset() + self._create_h5_file() + + var_grp = self._h5_handle.create_group('/mapping') + var_grp.create_dataset('gids', shape=(self._n_gids_all,), dtype=np.uint) + var_grp.create_dataset('element_id', shape=(self._n_segments_all,), dtype=np.uint) + var_grp.create_dataset('element_pos', shape=(self._n_segments_all,), dtype=np.float) + var_grp.create_dataset('index_pointer', shape=(self._n_gids_all+1,), dtype=np.uint64) + var_grp.create_dataset('time', data=[self.tstart, self.tstop, self.dt]) + + var_grp['gids'][self._gids_beg:self._gids_end] = self._mapping_gids + var_grp['element_id'][self._seg_offset_beg:self._seg_offset_end] = self._mapping_element_ids + var_grp['element_pos'][self._seg_offset_beg:self._seg_offset_end] = self._mapping_element_pos + var_grp['index_pointer'][self._gids_beg:(self._gids_end+1)] = self._mapping_index + + self._total_steps = n_steps + self._buffer_block_size = buffer_size + if not self._buffer_data: + # If data is not being buffered and instead written to the main block, we have to add a rank offset + # to the gid offset + for gid, gid_offset in self._gid_map.items(): + self._gid_map[gid] = (gid_offset[0] + self._seg_offset_beg, gid_offset[1] + self._seg_offset_beg) + + for var_name, data_tables in self._data_blocks.items(): + # If users are trying to save multiple variables in the same file put data table in its own /{var} group + # (not sonata compliant). Otherwise the data table is located at the root + data_grp = self._h5_handle if self._n_vars == 1 else self._h5_handle.create_group('/{}'.format(var_name)) + if self._buffer_data: + # Set up in-memory block to buffer recorded variables before writing to the dataset + data_tables.buffer_block = np.zeros((buffer_size, self._n_segments_local), dtype=np.float) + # data_tables.data_block = data_grp.create_dataset('data', shape=(n_steps, self._n_segments_all), + # dtype=np.float, chunks=True) + data_tables.data_block = self._create_big_dataset(data_grp, b'data', (n_steps, self._n_segments_all), np.float) + data_tables.data_block.attrs['variable_name'] = var_name + else: + # Since we are not buffering data, we just write directly to the on-disk dataset + data_tables.buffer_block = data_grp.create_dataset('data', shape=(n_steps, self._n_segments_all), + dtype=np.float, chunks=True) + data_tables.buffer_block.attrs['variable_name'] = var_name + + self._is_initialized = True + + def record_cell(self, gid, var_name, seg_vals, tstep): + """Record cell parameters. + + :param gid: gid of cell. + :param var_name: name of variable being recorded. + :param seg_vals: list of all segment values + :param tstep: time step + """ + gid_beg, gid_end = self._gid_map[gid] + buffer_block = self._data_blocks[var_name].buffer_block + update_index = (tstep - self._last_save_indx) + buffer_block[update_index, gid_beg:gid_end] = seg_vals + + def record_cell_block(self, gid, var_name, seg_vals): + """Save cell parameters one block at a time + + :param gid: gid of cell. + :param var_name: name of variable being recorded. + :param seg_vals: A vector/matrix of values being recorded + """ + gid_beg, gid_end = self._gid_map[gid] + buffer_block = self._data_blocks[var_name].buffer_block + if gid_end - gid_beg == 1: + buffer_block[:, gid_beg] = seg_vals + else: + buffer_block[:, gid_beg:gid_end] = seg_vals + + def flush(self): + """Move data from memory to dataset""" + if self._buffer_data: + blk_beg = self._last_save_indx + blk_end = blk_beg + self._buffer_block_size + if blk_end > self._total_steps: + # Need to handle the case that simulation doesn't end on a block step + blk_end = blk_beg + self._total_steps - blk_beg + seg_beg, seg_end = self._seg_offset_beg, self._seg_offset_end + + block_size = blk_end - blk_beg + self._last_save_indx += block_size + + for _, data_table in self._data_blocks.items(): + dat, buf = data_table.data_block, data_table.buffer_block + dat[blk_beg:blk_end, seg_beg:seg_end] = buf[:block_size, :] + + def close(self): + self._h5_handle.close() + + def merge(self): + if self._mpi_size > 1 and self._mpi_rank == 0: + h5final = h5py.File(self._saved_file, 'w') + tmp_h5_handles = [h5py.File(name, 'r') for name in self._tmp_files] + + # Find the gid and segment offsets for each temp h5 file + gid_ranges = [] # list of (gid-beg, gid-end) + gid_offset = 0 + total_gid_count = 0 # total number of gids across all ranks + + seg_ranges = [] + seg_offset = 0 + total_seg_count = 0 # total number of segments across all ranks + time_ds = None + for h5_tmp in tmp_h5_handles: + seg_count = len(h5_tmp['/mapping/element_pos']) + seg_ranges.append((seg_offset, seg_offset+seg_count)) + seg_offset += seg_count + total_seg_count += seg_count + + gid_count = len(h5_tmp['mapping/gids']) + gid_ranges.append((gid_offset, gid_offset+gid_count)) + gid_offset += gid_count + total_gid_count += gid_count + + time_ds = h5_tmp['mapping/time'] + + mapping_grp = h5final.create_group('mapping') + if time_ds: + mapping_grp.create_dataset('time', data=time_ds) + element_id_ds = mapping_grp.create_dataset('element_id', shape=(total_seg_count,), dtype=np.uint) + el_pos_ds = mapping_grp.create_dataset('element_pos', shape=(total_seg_count,), dtype=np.float) + gids_ds = mapping_grp.create_dataset('gids', shape=(total_gid_count,), dtype=np.uint) + index_pointer_ds = mapping_grp.create_dataset('index_pointer', shape=(total_gid_count+1,), dtype=np.uint) + + # combine the /mapping datasets + for i, h5_tmp in enumerate(tmp_h5_handles): + tmp_mapping_grp = h5_tmp['mapping'] + beg, end = seg_ranges[i] + element_id_ds[beg:end] = tmp_mapping_grp['element_id'] + el_pos_ds[beg:end] = tmp_mapping_grp['element_pos'] + + # shift the index pointer values + index_pointer = np.array(tmp_mapping_grp['index_pointer']) + update_index = beg + index_pointer + + beg, end = gid_ranges[i] + gids_ds[beg:end] = tmp_mapping_grp['gids'] + index_pointer_ds[beg:(end+1)] = update_index + + # combine the /var/data datasets + for var_name in self._variables: + data_name = '/data' if self._n_vars == 1 else '/{}/data'.format(var_name) + # data_name = '/{}/data'.format(var_name) + var_data = h5final.create_dataset(data_name, shape=(self._total_steps, total_seg_count), dtype=np.float) + var_data.attrs['variable_name'] = var_name + for i, h5_tmp in enumerate(tmp_h5_handles): + beg, end = seg_ranges[i] + var_data[:, beg:end] = h5_tmp[data_name] + + for tmp_file in self._tmp_files: + os.remove(tmp_file) + + +class CellVarRecorderParallel(CellVarRecorder): + """ + Unlike the parent, this take advantage of parallel h5py to writting to the results file across different ranks. + + """ + def __init__(self, file_name, tmp_dir, variables, buffer_data=True, mpi_rank=0, mpi_size=1): + super(CellVarRecorderParallel, self).__init__( + file_name, tmp_dir, variables, buffer_data=buffer_data, + mpi_rank=mpi_rank, mpi_size=mpi_size + ) + + def _calc_offset(self): + # iterate through the ranks let rank r determine the offset from rank r-1 + for r in range(comm.Get_size()): + if rank == r: + if rank > 0: + # get num of segments and gids from prev. rank and calculate offsets + offsets = np.empty(2, dtype=np.uint) + comm.Recv([offsets, MPI.UNSIGNED_INT], source=(r-1)) + self._seg_offset_beg = offsets[0] + self._gids_beg = offsets[1] + + # for some reason, np.uint64 + int = np.float64, so need cast to int + self._seg_offset_end = int(self._seg_offset_beg) \ + + int(self._n_segments_local) + self._gids_end = int(self._gids_beg) + int(self._n_gids_local) + + if rank < (nhosts - 1): + # pass the next rank its offset + offsets = np.array([self._seg_offset_end, self._gids_end], dtype=np.uint) + comm.Send([offsets, MPI.UNSIGNED_INT], dest=(rank+1)) + + comm.Barrier() + + # broadcast the total num of gids/segments from the final rank to all the others + if rank == (nhosts - 1): + total_counts = np.array([self._seg_offset_end, self._gids_end], dtype=np.uint) + else: + total_counts = np.empty(2, dtype=np.uint) + + comm.Bcast(total_counts, root=(nhosts-1)) + self._n_segments_all = total_counts[0] + self._n_gids_all = total_counts[1] + + def _create_h5_file(self): + self._h5_handle = h5py.File(self._file_name, 'w', driver='mpio', comm=MPI.COMM_WORLD) + add_hdf5_version(self._h5_handle) + add_hdf5_magic(self._h5_handle) + + def merge(self): + pass diff --git a/bmtk-vb/bmtk/utils/io/cell_vars.pyc b/bmtk-vb/bmtk/utils/io/cell_vars.pyc new file mode 100644 index 0000000..6b5bdfb Binary files /dev/null and b/bmtk-vb/bmtk/utils/io/cell_vars.pyc differ diff --git a/bmtk-vb/bmtk/utils/io/firing_rates.py b/bmtk-vb/bmtk/utils/io/firing_rates.py new file mode 100644 index 0000000..827cc21 --- /dev/null +++ b/bmtk-vb/bmtk/utils/io/firing_rates.py @@ -0,0 +1,35 @@ +import pandas as pd +import csv + +class RatesInput(object): + def __init__(self, params): + self._rates_df = pd.read_csv(params['rates'], sep=' ') + self._node_population = params['node_set'] + self._rates_dict = {int(row['gid']): row['firing_rate'] for _, row in self._rates_df.iterrows()} + + @property + def populations(self): + return [self._node_population] + + def get_rate(self, gid): + return self._rates_dict[gid] + + +class RatesWriter(object): + def __init__(self, file_name): + self._file_name = file_name + self._fhandle = open(file_name, 'a') + self._csv_writer = csv.writer(self._fhandle, delimiter=' ') + + def add_rates(self, gid, times, rates): + for t, r in zip(times, rates): + self._csv_writer.writerow([gid, t, r]) + self._fhandle.flush() + + def to_csv(self, file_name): + pass + + def to_h5(self, file_name): + raise NotImplementedError + + diff --git a/bmtk-vb/bmtk/utils/io/orig_cell_vars.py b/bmtk-vb/bmtk/utils/io/orig_cell_vars.py new file mode 100644 index 0000000..b84b293 --- /dev/null +++ b/bmtk-vb/bmtk/utils/io/orig_cell_vars.py @@ -0,0 +1,356 @@ +import os +import h5py +import numpy as np +from pynwb import NWBFile + +from bmtk.utils import io +from bmtk.utils.sonata.utils import add_hdf5_magic, add_hdf5_version + + +try: + from mpi4py import MPI + comm = MPI.COMM_WORLD + rank = comm.Get_rank() + nhosts = comm.Get_size() + +except Exception as exc: + pass + + +class CellVarRecorder(object): + """Used to save cell membrane variables (V, Ca2+, etc) to the described hdf5 format. + + For parallel simulations this class will write to a seperate tmp file on each rank, then use the merge method to + combine the results. This is less efficent, but doesn't require the user to install mpi4py and build h5py in + parallel mode. For better performance use the CellVarRecorderParrallel class instead. + """ + _io = io + + class DataTable(object): + """A small struct to keep track of different */data (and buffer) tables""" + def __init__(self, var_name): + self.var_name = var_name + # If buffering data, buffer_block will be an in-memory array and will write to data_block during when + # filled. If not buffering buffer_block is an hdf5 dataset and data_block is ignored + self.data_block = None + self.buffer_block = None + + def __init__(self, file_name, tmp_dir, variables, buffer_data=True, mpi_rank=0, mpi_size=1): + self._file_name = file_name + self._h5_handle = None + self._tmp_dir = tmp_dir + self._variables = variables if isinstance(variables, list) else [variables] + self._n_vars = len(self._variables) # Used later to keep track if more than one var is saved to the same file. + + self._mpi_rank = mpi_rank + self._mpi_size = mpi_size + self._tmp_files = [] + self._saved_file = file_name + + if mpi_size > 1: + self._io.log_warning('Was unable to run h5py in parallel (mpi) mode.' + + ' Saving of membrane variable(s) may slow down.') + tmp_fname = os.path.basename(file_name) # make sure file names don't clash if there are multiple reports + self._tmp_files = [os.path.join(tmp_dir, '__bmtk_tmp_cellvars_{}_{}'.format(r, tmp_fname)) + for r in range(self._mpi_size)] + self._file_name = self._tmp_files[self._mpi_rank] + + self._mapping_gids = [] # list of gids in the order they appear in the data + self._gid_map = {} # table for looking up the gid offsets + self._map_attrs = {} # Used for additonal attributes in /mapping + + self._mapping_element_ids = [] # sections + self._mapping_element_pos = [] # segments + self._mapping_index = [0] # index_pointer + + self._buffer_data = buffer_data + self._data_blocks = {var_name: self.DataTable(var_name) for var_name in self._variables} + self._last_save_indx = 0 # for buffering, used to keep track of last timestep data was saved to disk + + self._buffer_block_size = 0 + self._total_steps = 0 + + # Keep track of gids across the different ranks + self._n_gids_all = 0 + self._n_gids_local = 0 + self._gids_beg = 0 + self._gids_end = 0 + + # Keep track of segment counts across the different ranks + self._n_segments_all = 0 + self._n_segments_local = 0 + self._seg_offset_beg = 0 + self._seg_offset_end = 0 + + self._tstart = 0.0 + self._tstop = 0.0 + self._dt = 0.01 + self._is_initialized = False + + @property + def tstart(self): + return self._tstart + + @tstart.setter + def tstart(self, time_ms): + self._tstart = time_ms + + @property + def tstop(self): + return self._tstop + + @tstop.setter + def tstop(self, time_ms): + self._tstop = time_ms + + @property + def dt(self): + return self._dt + + @dt.setter + def dt(self, time_ms): + self._dt = time_ms + + @property + def is_initialized(self): + return self._is_initialized + + def _calc_offset(self): + self._n_segments_all = self._n_segments_local + self._seg_offset_beg = 0 + self._seg_offset_end = self._n_segments_local + + self._n_gids_all = self._n_gids_local + self._gids_beg = 0 + self._gids_end = self._n_gids_local + + def _create_h5_file(self): + self._h5_handle = h5py.File(self._file_name, 'w') + add_hdf5_version(self._h5_handle) + add_hdf5_magic(self._h5_handle) + + def add_cell(self, gid, sec_list, seg_list, **map_attrs): + assert(len(sec_list) == len(seg_list)) + # TODO: Check the same gid isn't added twice + n_segs = len(seg_list) + self._gid_map[gid] = (self._n_segments_local, self._n_segments_local + n_segs) + self._mapping_gids.append(gid) + self._mapping_element_ids.extend(sec_list) + self._mapping_element_pos.extend(seg_list) + self._mapping_index.append(self._mapping_index[-1] + n_segs) + self._n_segments_local += n_segs + self._n_gids_local += 1 + for k, v in map_attrs.items(): + if k not in self._map_attrs: + self._map_attrs[k] = v + else: + self._map_attrs[k].extend(v) + + def initialize(self, n_steps, buffer_size=0): + import ipdb; ipdb.set_trace() + self._calc_offset() + self._create_h5_file() + + var_grp = self._h5_handle.create_group('/mapping') + var_grp.create_dataset('gids', shape=(self._n_gids_all,), dtype=np.uint) + var_grp.create_dataset('element_id', shape=(self._n_segments_all,), dtype=np.uint) + var_grp.create_dataset('element_pos', shape=(self._n_segments_all,), dtype=np.float) + var_grp.create_dataset('index_pointer', shape=(self._n_gids_all+1,), dtype=np.uint64) + var_grp.create_dataset('time', data=[self.tstart, self.tstop, self.dt]) + for k, v in self._map_attrs.items(): + var_grp.create_dataset(k, shape=(self._n_segments_all,), dtype=type(v[0])) + + var_grp['gids'][self._gids_beg:self._gids_end] = self._mapping_gids + var_grp['element_id'][self._seg_offset_beg:self._seg_offset_end] = self._mapping_element_ids + var_grp['element_pos'][self._seg_offset_beg:self._seg_offset_end] = self._mapping_element_pos + var_grp['index_pointer'][self._gids_beg:(self._gids_end+1)] = self._mapping_index + for k, v in self._map_attrs.items(): + var_grp[k][self._seg_offset_beg:self._seg_offset_end] = v + + self._total_steps = n_steps + self._buffer_block_size = buffer_size + if not self._buffer_data: + # If data is not being buffered and instead written to the main block, we have to add a rank offset + # to the gid offset + for gid, gid_offset in self._gid_map.items(): + self._gid_map[gid] = (gid_offset[0] + self._seg_offset_beg, gid_offset[1] + self._seg_offset_beg) + + for var_name, data_tables in self._data_blocks.items(): + # If users are trying to save multiple variables in the same file put data table in its own /{var} group + # (not sonata compliant). Otherwise the data table is located at the root + data_grp = self._h5_handle if self._n_vars == 1 else self._h5_handle.create_group('/{}'.format(var_name)) + if self._buffer_data: + # Set up in-memory block to buffer recorded variables before writing to the dataset + data_tables.buffer_block = np.zeros((buffer_size, self._n_segments_local), dtype=np.float) + data_tables.data_block = data_grp.create_dataset('data', shape=(n_steps, self._n_segments_all), + dtype=np.float, chunks=True) + data_tables.data_block.attrs['variable_name'] = var_name + else: + # Since we are not buffering data, we just write directly to the on-disk dataset + data_tables.buffer_block = data_grp.create_dataset('data', shape=(n_steps, self._n_segments_all), + dtype=np.float, chunks=True) + data_tables.buffer_block.attrs['variable_name'] = var_name + + self._is_initialized = True + + def record_cell(self, gid, var_name, seg_vals, tstep): + """Record cell parameters. + + :param gid: gid of cell. + :param var_name: name of variable being recorded. + :param seg_vals: list of all segment values + :param tstep: time step + """ + gid_beg, gid_end = self._gid_map[gid] + buffer_block = self._data_blocks[var_name].buffer_block + update_index = (tstep - self._last_save_indx) + buffer_block[update_index, gid_beg:gid_end] = seg_vals + + def record_cell_block(self, gid, var_name, seg_vals): + """Save cell parameters one block at a time + + :param gid: gid of cell. + :param var_name: name of variable being recorded. + :param seg_vals: A vector/matrix of values being recorded + """ + gid_beg, gid_end = self._gid_map[gid] + buffer_block = self._data_blocks[var_name].buffer_block + if gid_end - gid_beg == 1: + buffer_block[:, gid_beg] = seg_vals + else: + buffer_block[:, gid_beg:gid_end] = seg_vals + + def flush(self): + """Move data from memory to dataset""" + if self._buffer_data: + blk_beg = self._last_save_indx + blk_end = blk_beg + self._buffer_block_size + if blk_end > self._total_steps: + # Need to handle the case that simulation doesn't end on a block step + blk_end = blk_beg + self._total_steps - blk_beg + + block_size = blk_end - blk_beg + self._last_save_indx += block_size + + for _, data_table in self._data_blocks.items(): + data_table.data_block[blk_beg:blk_end, :] = data_table.buffer_block[:block_size, :] + + def close(self): + self._h5_handle.close() + + def merge(self): + if self._mpi_size > 1 and self._mpi_rank == 0: + h5final = h5py.File(self._saved_file, 'w') + tmp_h5_handles = [h5py.File(name, 'r') for name in self._tmp_files] + + # Find the gid and segment offsets for each temp h5 file + gid_ranges = [] # list of (gid-beg, gid-end) + gid_offset = 0 + total_gid_count = 0 # total number of gids across all ranks + + seg_ranges = [] + seg_offset = 0 + total_seg_count = 0 # total number of segments across all ranks + time_ds = None + for h5_tmp in tmp_h5_handles: + seg_count = len(h5_tmp['/mapping/element_pos']) + seg_ranges.append((seg_offset, seg_offset+seg_count)) + seg_offset += seg_count + total_seg_count += seg_count + + gid_count = len(h5_tmp['mapping/gids']) + gid_ranges.append((gid_offset, gid_offset+gid_count)) + gid_offset += gid_count + total_gid_count += gid_count + + time_ds = h5_tmp['mapping/time'] + + mapping_grp = h5final.create_group('mapping') + if time_ds: + mapping_grp.create_dataset('time', data=time_ds) + element_id_ds = mapping_grp.create_dataset('element_id', shape=(total_seg_count,), dtype=np.uint) + el_pos_ds = mapping_grp.create_dataset('element_pos', shape=(total_seg_count,), dtype=np.float) + gids_ds = mapping_grp.create_dataset('gids', shape=(total_gid_count,), dtype=np.uint) + index_pointer_ds = mapping_grp.create_dataset('index_pointer', shape=(total_gid_count+1,), dtype=np.uint) + for k, v in self._map_attrs.items(): + mapping_grp.create_dataset(k, shape=(total_seg_count,), dtype=type(v[0])) + + # combine the /mapping datasets + for i, h5_tmp in enumerate(tmp_h5_handles): + tmp_mapping_grp = h5_tmp['mapping'] + beg, end = seg_ranges[i] + element_id_ds[beg:end] = tmp_mapping_grp['element_id'] + el_pos_ds[beg:end] = tmp_mapping_grp['element_pos'] + for k, v in self._map_attrs.items(): + mapping_grp[k][beg:end] = v + + # shift the index pointer values + index_pointer = np.array(tmp_mapping_grp['index_pointer']) + update_index = beg + index_pointer + + beg, end = gid_ranges[i] + gids_ds[beg:end] = tmp_mapping_grp['gids'] + index_pointer_ds[beg:(end+1)] = update_index + + + # combine the /var/data datasets + for var_name in self._variables: + data_name = '/data' if self._n_vars == 1 else '/{}/data'.format(var_name) + # data_name = '/{}/data'.format(var_name) + var_data = h5final.create_dataset(data_name, shape=(self._total_steps, total_seg_count), dtype=np.float) + var_data.attrs['variable_name'] = var_name + for i, h5_tmp in enumerate(tmp_h5_handles): + beg, end = seg_ranges[i] + var_data[:, beg:end] = h5_tmp[data_name] + + for tmp_file in self._tmp_files: + os.remove(tmp_file) + + +class CellVarRecorderParallel(CellVarRecorder): + """ + Unlike the parent, this take advantage of parallel h5py to writting to the results file across different ranks. + + """ + def __init__(self, file_name, tmp_dir, variables, buffer_data=True): + super(CellVarRecorder, self).__init__(file_name, tmp_dir, variables, buffer_data=buffer_data, mpi_rank=0, + mpi_size=1) + + def _calc_offset(self): + # iterate through the ranks let rank r determine the offset from rank r-1 + for r in range(comm.Get_size()): + if rank == r: + if rank < (nhosts - 1): + # pass the num of segments and num of gids to the next rank + offsets = np.array([self._n_segments_local, self._n_gids_local], dtype=np.uint) + comm.Send([offsets, MPI.UNSIGNED_INT], dest=(rank+1)) + + if rank > 0: + # get num of segments and gids from prev. rank and calculate offsets + offset = np.empty(2, dtype=np.uint) + comm.Recv([offsets, MPI.UNSIGNED_INT], source=(r-1)) + self._seg_offset_beg = offsets[0] + self._seg_offset_end = self._seg_offset_beg + self._n_segments_local + + self._gids_beg = offset[1] + self._gids_end = self._gids_beg + self._n_gids_local + + comm.Barrier() + + # broadcast the total num of gids/segments from the final rank to all the others + if rank == (nhosts - 1): + total_counts = np.array([self._seg_offset_end, self._gids_end], dtype=np.uint) + else: + total_counts = np.empty(2, dtype=np.uint) + + comm.Bcast(total_counts, root=(nhosts-1)) + self._n_segments_all = total_counts[0] + self._n_gids_all = total_counts[1] + + def _create_h5_file(self): + self._h5_handle = h5py.File(self._file_name, 'w', driver='mpio', comm=MPI.COMM_WORLD) + add_hdf5_version(self._h5_handle) + add_hdf5_magic(self._h5_handle) + + def merge(self): + pass diff --git a/bmtk-vb/bmtk/utils/io/spike_trains.py b/bmtk-vb/bmtk/utils/io/spike_trains.py new file mode 100644 index 0000000..73d9bfd --- /dev/null +++ b/bmtk-vb/bmtk/utils/io/spike_trains.py @@ -0,0 +1,312 @@ +import os +import sys +import csv + +import h5py +import pandas as pd +import numpy as np +from bmtk.utils.sonata.utils import add_hdf5_magic, add_hdf5_version + + +class SpikeTrainWriter(object): + class TmpFileMetadata(object): + def __init__(self, file_name, sort_order=None): + self.file_name = file_name + self.sort_order = sort_order + + def __init__(self, tmp_dir, mpi_rank=0, mpi_size=1): + # For NEST/NEURON based simulations it is prefereable not to use mpi4py, so let the parent simulator determine + # MPI rank and size + self._mpi_rank = mpi_rank + self._mpi_size = mpi_size + + # used to temporary save spike files since for large simulations saving spikes into memory can crash the + # system. Requires the user to create the directory + self._tmp_dir = tmp_dir + if self._tmp_dir is None or not os.path.exists(self._tmp_dir): + raise Exception('Directory path {} does not exists'.format(self._tmp_dir)) + self._all_tmp_files = [self.TmpFileMetadata(self._get_tmp_filename(r)) for r in range(mpi_size)] + # TODO: Determine best buffer size. + self._tmp_file_handle = open(self._all_tmp_files[mpi_rank].file_name, 'w') + + self._tmp_spikes_handles = [] # used when sorting mulitple file + self._spike_count = -1 + + # Nest gid files uses tab seperators and a different order for tmp spike files. + self.delimiter = ' ' # delimiter for temporary file + self.time_col = 0 + self.gid_col = 1 + + def _get_tmp_filename(self, rank): + return os.path.join(self._tmp_dir, '_bmtk_tmp_spikes_{}.csv'.format(rank)) + + def _count_spikes(self): + if self._mpi_rank == 0: + if self._spike_count > -1: + return self._spike_count + + self._spike_count = 0 + for tmp_file in self._all_tmp_files: + with open(tmp_file.file_name, 'r') as csvfile: + csv_reader = csv.reader(csvfile, delimiter=self.delimiter) + self._spike_count += sum(1 for _ in csv_reader) + + def _sort_tmp_file(self, filedata, sort_order): + # For now load spikes into pandas, it's the fastest way but may be an issue with memory + if sort_order is None or filedata.sort_order == sort_order: + return + + file_name = filedata.file_name + tmp_spikes_ds = pd.read_csv(file_name, sep=' ', names=['time', 'gid']) + tmp_spikes_ds = tmp_spikes_ds.sort_values(by=sort_order) + tmp_spikes_ds.to_csv(file_name, sep=' ', index=False, header=False) + filedata.sort_order = sort_order + + def _next_spike(self, rank): + try: + val = next(self._tmp_spikes_handles[rank]) + return val[0], val[1], rank + except StopIteration: + return None + + def add_spike(self, time, gid): + self._tmp_file_handle.write('{:.6f} {}\n'.format(time, gid)) + + def add_spikes(self, times, gid): + for t in times: + self.add_spike(t, gid) + + def add_spikes_file(self, file_name, sort_order=None): + self._all_tmp_files.append(self.TmpFileMetadata(file_name, sort_order)) + + def _sort_files(self, sort_order, sort_column, file_write_fnc): + self._tmp_spikes_handles = [] + for fdata in self._all_tmp_files: + self._sort_tmp_file(fdata, sort_order) + self._tmp_spikes_handles.append(csv.reader(open(fdata.file_name, 'r'), delimiter=self.delimiter)) + + spikes = [] + for rank in range(len(self._tmp_spikes_handles)): # range(self._mpi_size): + spike = self._next_spike(rank) + if spike is not None: + spikes.append(spike) + + # Iterate through all the ranks and find the first spike. Write that spike/gid to the output, then + # replace that data point with the next spike on the selected rank + indx = 0 + while spikes: + # find which rank has the first spike + selected_index = 0 + selected_val = spikes[0][sort_column] + for i, spike in enumerate(spikes[1:]): + if spike[sort_column] < selected_val: + selected_index = i + 1 + selected_val = spike[sort_column] + + # write the spike to the file + row = spikes.pop(selected_index) + file_write_fnc(float(row[self.time_col]), int(row[self.gid_col]), indx) + indx += 1 + + # get the next spike on that rank and replace in spikes table + another_spike = self._next_spike(row[2]) + if another_spike is not None: + spikes.append(another_spike) + + def _merge_files(self, file_write_fnc): + indx = 0 + for fdata in self._all_tmp_files: + if not os.path.exists(fdata.file_name): + continue + + with open(fdata.file_name, 'r') as csv_file: + csv_reader = csv.reader(csv_file, delimiter=self.delimiter) + for row in csv_reader: + file_write_fnc(float(row[self.time_col]), int(row[self.gid_col]), indx) + indx += 1 + + def _to_file(self, file_name, sort_order, file_write_fnc): + if sort_order is None: + sort_column = 0 + elif sort_order == 'time': + sort_column = self.time_col + elif sort_order == 'gid': + sort_column = self.gid_col + else: + raise Exception('Unknown sort order {}'.format(sort_order)) + + # TODO: Need to make sure an MPI_Barrier is called beforehand + self._tmp_file_handle.close() + if self._mpi_rank == 0: + if sort_order is not None: + self._sort_files(sort_order, sort_column, file_write_fnc) + else: + self._merge_files(file_write_fnc) + + def to_csv(self, csv_file, sort_order=None, gid_map=None): + # TODO: Need to call flush and then barrier + if self._mpi_rank == 0: + # For the single rank case don't just copy the tmp-csv to the new name. It will fail if user calls to_hdf5 + # or to_nwb after calling to_csv. + self._count_spikes() + csv_handle = open(csv_file, 'w') + csv_writer = csv.writer(csv_handle, delimiter=' ') + + def file_write_fnc_identity(time, gid, indx): + csv_writer.writerow([time, gid]) + + def file_write_fnc_transform(time, gid, indx): + # For the case when NEURON/NEST ids don't match with the user's gid table + csv_writer.writerow([time, gid_map[gid]]) + + file_write_fnc = file_write_fnc_identity if gid_map is None else file_write_fnc_transform + self._to_file(csv_file, sort_order, file_write_fnc) + csv_handle.close() + + # TODO: Let user pass in in barrier and use it here + + def to_nwb(self, nwb_file): + raise NotImplementedError + + def to_hdf5(self, hdf5_file, sort_order=None, gid_map=None): + if self._mpi_rank == 0: + with h5py.File(hdf5_file, 'w') as h5: + add_hdf5_magic(h5) + add_hdf5_version(h5) + + self._count_spikes() + spikes_grp = h5.create_group('/spikes') + spikes_grp.attrs['sorting'] = 'none' if sort_order is None else sort_order + time_ds = spikes_grp.create_dataset('timestamps', shape=(self._spike_count,), dtype=np.float) + gid_ds = spikes_grp.create_dataset('gids', shape=(self._spike_count,), dtype=np.uint64) + + def file_write_fnc_identity(time, gid, indx): + time_ds[indx] = time + gid_ds[indx] = gid + + def file_write_fnc_transform(time, gid, indx): + time_ds[indx] = time + gid_ds[indx] = gid_map[gid] + + file_write_fnc = file_write_fnc_identity if gid_map is None else file_write_fnc_transform + self._to_file(hdf5_file, sort_order, file_write_fnc) + + # TODO: Need to make sure a barrier is used here (before close is called) + + def flush(self): + self._tmp_file_handle.flush() + + def close(self): + if self._mpi_rank == 0: + for tmp_file in self._all_tmp_files: + if os.path.exists(tmp_file.file_name): + os.remove(tmp_file.file_name) + + +class PoissonSpikesGenerator(object): + def __init__(self, gids, firing_rate, tstart=0.0, tstop=1000.0): + self._gids = gids + self._firing_rate = firing_rate / 1000.0 + self._tstart = tstart + self._tstop = tstop + + def to_hdf5(self, file_name, sort_order='gid'): + if sort_order == 'gid': + gid_list = [] + times_list = [] + if sort_order == 'gid': + for gid in self._gids: + c_time = self._tstart + while c_time < self._tstop: + interval = -np.log(1.0 - np.random.uniform()) / self._firing_rate + c_time += interval + gid_list.append(gid) + times_list.append(c_time) + + with h5py.File(file_name, 'w') as h5: + h5.create_dataset('/spikes/gids', data=gid_list, dtype=np.uint) + h5.create_dataset('/spikes/timestamps', data=times_list, dtype=np.float) + h5['/spikes'].attrs['sorting'] = 'by_gid' + + else: + raise NotImplementedError + + +class SpikesInput(object): + def get_spikes(self, gid): + raise NotImplementedError() + + @staticmethod + def load(name, module, input_type, params): + module_lc = module.lower() + if module_lc == 'nwb': + return SpikesInputNWBv1(name, module, input_type, params) + elif module_lc == 'h5' or module_lc == 'hdf5': + return SpikesInputH5(name, module, input_type, params) + elif module_lc == 'csv': + return SpikesInputCSV(name, module, input_type, params) + else: + raise Exception('Unable to load spikes for module type {}'.format(module)) + + +class SpikesInputNWBv1(SpikesInput): + def __init__(self, name, module, input_type, params): + self.input_file = params['input_file'] + self._h5_handle = h5py.File(self.input_file, 'r') + + if 'trial' in params: + self.trial = params['trial'] + self._spike_trains_handles = {} + for node_id, h5grp in self._h5_handle['processing'][self.trial]['spike_train'].items(): + self._spike_trains_handles[int(node_id)] = h5grp['data'] + + elif '/spikes' in self._h5_handle: + raise Exception + + def get_spikes(self, gid): + return np.array(self._spike_trains_handles[gid]) + + +class SpikesInputH5(SpikesInput): + def __init__(self, name, module, input_type, params): + self._input_file = params['input_file'] + self._h5_handle = h5py.File(self._input_file, 'r') + self._sort_order = self._h5_handle['/spikes'].attrs.get('sorting', None) + if sys.version_info[0] >= 3 and isinstance(self._sort_order, bytes): + # h5py attributes return str in py 2, bytes in py 3 + self._sort_order = self._sort_order.decode() + + self._gid_ds = self._h5_handle['/spikes/gids'] + self._timestamps_ds = self._h5_handle['/spikes/timestamps'] + + self._gid_indicies = {} + self._build_indicies() + + def _build_indicies(self): + if self._sort_order == 'by_gid': + indx_beg = 0 + c_gid = self._gid_ds[0] + for indx, gid in enumerate(self._gid_ds): + if gid != c_gid: + self._gid_indicies[c_gid] = slice(indx_beg, indx) + c_gid = gid + indx_beg = indx + self._gid_indicies[c_gid] = slice(indx_beg, indx+1) + + else: + raise NotImplementedError + + def get_spikes(self, gid): + if gid in self._gid_indicies: + return self._timestamps_ds[self._gid_indicies[gid]] + else: + return [] + + +class SpikesInputCSV(SpikesInput): + def __init__(self, name, module, input_type, params): + self._spikes_df = pd.read_csv(params['input_file'], index_col='gid', sep=' ') + + def get_spikes(self, gid): + spike_times_str = self._spikes_df.iloc[gid]['spike-times'] + return np.array(spike_times_str.split(','), dtype=float) diff --git a/bmtk-vb/bmtk/utils/io/spike_trains.pyc b/bmtk-vb/bmtk/utils/io/spike_trains.pyc new file mode 100644 index 0000000..7b8de68 Binary files /dev/null and b/bmtk-vb/bmtk/utils/io/spike_trains.pyc differ diff --git a/bmtk-vb/bmtk/utils/io/tabular_network.py b/bmtk-vb/bmtk/utils/io/tabular_network.py new file mode 100644 index 0000000..9b594bd --- /dev/null +++ b/bmtk-vb/bmtk/utils/io/tabular_network.py @@ -0,0 +1,350 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import h5py + + +""" +An interface for reading network files. + +We are continuing to develop network file format this interface is a way to provide backward compatibility. This +namespace should not be instantiated directly, and updates to the network standard should be given their own. The +class TabularNetwork, NodeRow, NodesFile, EdgeRow and EdgesFile are abstract and should be overridden. + +In general the developed formats have all take schema: + * Networks are split between nodes (NodesFile) and edges (EdgesFile) + * Each type is made up of rows (NodeRow, EdgeRow) + * Each row has its own set column properties (ColumnProperty), depending on the file/group it belongs too. + * Each row also has properties from (edge/node)-type metadata. +""" + + +########################################## +# Interface files +########################################## +class TabularNetwork(object): + """Factory for loading nodes and edges files.""" + @staticmethod + def load_nodes(nodes_file, node_types_file): + raise NotImplementedError() + + @staticmethod + def load_edges(edges_file, edge_types_files): + raise NotImplementedError() + + +class NodeRow(object): + """Node file row. + + Each row represents node/cell/population in a network and can include edge-type metadata and dynamics_params when + applicable. The only mandatory for a NodeRow is a unique gid (i.e cell_id, node_id). Properties can be accessed + like a dictionary. + """ + def __init__(self, gid, node_props, types_props): + self._gid = gid + self._node_props = node_props # properties from the csv/hdf5 file + self._node_type_props = types_props # properties from the edge_types metadata file + + @property + def gid(self): + return self._gid + + @property + def with_dynamics_params(self): + """Set to true if dynamics_params subgroup attached to HDF5 properities""" + raise NotImplementedError() + + @property + def dynamics_params(self): + raise NotImplementedError() + + @property + def columns(self): + return self._node_props.keys() + self._node_type_props.keys() + + @property + def node_props(self): + return self._node_props + + @property + def node_type_props(self): + return self._node_type_props + + def get(self, prop_key, default=None): + # First see if property existing in node file, then check node-types + if prop_key in self._node_props: + return self._node_props[prop_key] + elif prop_key in self._node_type_props: + return self._node_type_props[prop_key] + else: + return default + + def __contains__(self, prop_key): + return prop_key in self._node_props.keys() or prop_key in self._node_type_props.keys() + + def __getitem__(self, prop_key): + val = self.get(prop_key) + if val is None: + raise Exception('Invalid property key {}.'.format(prop_key)) + return val + + def __repr__(self): + return build_row_repr(self) + + +class EdgeRow(object): + """Representation of a edge. + + Edges must include a source and target node gid. Other properties, from the edges or edge-types files, can be + directly accessed like a dictionary. + """ + def __init__(self, trg_gid, src_gid, edge_props={}, edge_type_props={}): + self._trg_gid = trg_gid + self._src_gid = src_gid + self._edge_props = edge_props + self._edge_type_props = edge_type_props + + @property + def target_gid(self): + return self._trg_gid + + @property + def source_gid(self): + return self._src_gid + + @property + def with_dynamics_params(self): + raise NotImplementedError() + + @property + def dynamics_params(self): + raise NotImplementedError() + + @property + def columns(self): + return self._edge_props.keys() + self._edge_type_props.keys() + + @property + def edge_props(self): + return self._edge_props + + def __contains__(self, prop_key): + return prop_key in self._edge_props.keys() or prop_key in self._edge_type_props.keys() + + def __getitem__(self, prop_key): + if prop_key in self._edge_props: + return self._edge_props[prop_key] + elif prop_key in self._edge_type_props: + return self._edge_type_props[prop_key] + else: + raise Exception('Invalid property name {}.'.format(prop_key)) + + def __repr__(self): + return build_row_repr(self) + + +class NodesFile(object): + """Class for reading and iterating properties of each node in a nodes/node-types file. + + Use the load method to load in the necessary node files. Nodes can be accessed using an interator: + nodes = NodesFile() + nodes.load(nodes_file.h5, node_types.csv) + for node in nodes: + print node['prop'] + ... + Or indivdually by gid: + node = nodes[101] + print node['prop'] + """ + def __init__(self): + self._network_name = None + self._version = None + self._iter_index = 0 + self._nrows = 0 + self._node_types_table = None + + @property + def name(self): + """name of network containing these nodes""" + return self._network_name + + @property + def version(self): + return self._version + + @property + def gids(self): + raise NotImplementedError() + + @property + def node_types_table(self): + return self._node_types_table + + def load(self, nodes_file, node_types_file): + raise NotImplementedError() + + def get_node(self, gid, cache=False): + raise NotImplementedError() + + def __len__(self): + raise NotImplementedError() + + def __iter__(self): + self._iter_index = 0 + return self + + def next(self): + raise NotImplementedError() + + def __getitem__(self, gid): + return self.get_node(gid) + + +class EdgesFile(object): + """Class for reading and iterating over edge files. + + Use the load() method to instantiate from the file. Edges can be accessed for any given edge with a target-gid + using the edges_itr() method: + edges = EdgesFile() + edges.load(edge_file.h5, edge_types.csv) + for edge_prop in edges.edges_itr(101): + assert(edge_prop.target_gid == 101) + source_node = nodes[edge_prop.source_gid] + print edge_prop['prop_name'] + """ + @property + def source_network(self): + """Name of network containing the source gids""" + raise NotImplementedError() + + @property + def target_network(self): + """Name of network containing the target gids""" + raise NotImplementedError() + + def load(self, edges_file, edge_types_file): + raise NotImplementedError() + + def edges_itr(self, target_gid): + raise NotImplementedError() + + def __len__(self): + raise NotImplementedError() + + +########################################## +# Helper functions +########################################## +class ColumnProperty(object): + """Representation of a column name and metadata from a hdf5 dataset, csv column, etc. + + """ + def __init__(self, name, dtype, dimension, attrs={}): + self._name = name + self._dtype = dtype + self._dim = dimension + self._attrs = attrs + + @property + def name(self): + return self._name + + @property + def dtype(self): + return self._dtype + + @property + def dimension(self): + return self._dim + + @property + def attributes(self): + return self._attrs + + @classmethod + def from_h5(cls, hf_obj, name=None): + if isinstance(hf_obj, h5py.Dataset): + ds_name = name if name is not None else hf_obj.name.split('/')[-1] + ds_dtype = hf_obj.dtype + + # If the dataset shape is in the form "(N, M)" then the dimension is M. If the shape is just "(N)" then the + # dimension is just 1 + dim = 1 if len(hf_obj.shape) < 2 else hf_obj.shape[1] + return cls(ds_name, ds_dtype, dim, attrs=hf_obj.attrs) + + elif isinstance(hf_obj, h5py.Group): + columns = [] + for name, ds in hf_obj.items(): + if isinstance(ds, h5py.Dataset): + columns.append(ColumnProperty.from_h5(ds, name)) + return columns + + else: + raise Exception('Unable to convert hdf5 object {} to a property or list of properties.'.format(hf_obj)) + + @classmethod + def from_csv(cls, pd_obj, name=None): + if isinstance(pd_obj, pd.Series): + c_name = name if name is not None else pd_obj.name + c_dtype = pd_obj.dtype + return cls(c_name, c_dtype, 1) + + elif isinstance(pd_obj, pd.DataFrame): + return [cls(name, pd_obj[name].dtype, 1) for name in pd_obj.columns] + + else: + raise Exception('Unable to convert pandas object {} to a property or list of properties.'.format(pd_obj)) + + def __hash__(self): + return hash(self._name) + + def __repr__(self): + return '{} ({})'.format(self.name, self.dtype) + + +class TypesTable(dict): + def __init__(self, types_file, index_column, seperator=' ', comment='#'): + super(TypesTable, self).__init__() + + types_df = pd.read_csv(types_file, sep=seperator, comment=comment) + self._columns = ColumnProperty.from_csv(types_df) + for _, row in types_df.iterrows(): + # TODO: iterrows does not preserve dtype and should be replaced with itertuples + type_id = row[index_column] + row = {col.name: row[col.name] for col in self._columns} + self.update({type_id: row}) + + @property + def columns(self): + return self._columns + + +def build_row_repr(row): + columns = row.columns + if columns > 0: + rstr = "{" + for c in columns: + rstr += "'{}': {}, ".format(c, row[c]) + return rstr[:-2] + "}" + else: + return "{}" diff --git a/bmtk-vb/bmtk/utils/io/tabular_network_v0.py b/bmtk-vb/bmtk/utils/io/tabular_network_v0.py new file mode 100644 index 0000000..711c177 --- /dev/null +++ b/bmtk-vb/bmtk/utils/io/tabular_network_v0.py @@ -0,0 +1,160 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import h5py + +import tabular_network as tn + +""" +This is for the original bionet network format developed at the AI in 2016-2017. nodes, node_types, and edge_types +use csv format, while edges use an hdf5 format. + +""" +class TabularNetwork(tn.TabularNetwork): + @staticmethod + def load_nodes(nodes_file, node_types_file): + nf = NodesFile() + nf.load(nodes_file, node_types_file) + return nf + + @staticmethod + def load_edges(edges_file, edge_types_file): + ef = EdgesFile() + ef.load(edges_file, edge_types_file) + return ef + + +class NodeRow(tn.NodeRow): + def __init__(self, gid, node_props, types_props, columns): + super(NodeRow, self).__init__(gid, node_props, types_props) + self._columns = columns + + @property + def with_dynamics_params(self): + return False + + @property + def dynamics_params(self): + return None + + +class NodesFile(tn.NodesFile): + def __init__(self): + super(NodesFile, self).__init__() + self._network_name = 'NA' + self._version = 'v0.0' + + self._nodes_df = None + self._nodes_columns = None + self._columns = None + + @property + def gids(self): + return list(self._nodes_df.index) + + def load(self, nodes_file, node_types_file): + self._nodes_df = pd.read_csv(nodes_file, sep=' ', index_col=['node_id']) + self._node_types_table = tn.TypesTable(node_types_file, 'node_type_id') + + self._nrows = len(self._nodes_df.index) + self._nodes_columns = tn.ColumnProperty.from_csv(self._nodes_df) + self._columns = self._nodes_columns + self._node_types_table.columns + + def get_node(self, gid, cache=False): + nodes_data = self._nodes_df.loc[gid] + node_type_data = self._node_types_table[nodes_data['node_type_id']] + return NodeRow(gid, nodes_data, node_type_data, self._columns) + + def __len__(self): + return self._nrows + + def next(self): + if self._iter_index >= len(self): + raise StopIteration + else: + gid = self._nodes_df.index.get_loc(self._iter_index) + self._iter_index += 1 + return self.get_node(gid) + + +class EdgeRow(tn.EdgeRow): + def __init__(self, trg_gid, src_gid, nsyns, edge_type_props): + super(EdgeRow, self).__init__(trg_gid, src_gid, edge_type_props=edge_type_props) + self._edge_props['nsyns'] = nsyns + + @property + def with_dynamics_params(self): + return False + + @property + def dynamics_params(self): + return None + + +class EdgesFile(tn.EdgesFile): + def __init__(self): + self._nrows = 0 + self._index_len = 0 + + self._edge_ptr_ds = None + self._num_syns_ds = None + self._src_gids_ds = None + self._edge_types_ds = None + self._edge_types_table = {} + + @property + def source_network(self): + return None + + @property + def target_network(self): + return None + + def load(self, edges_file, edge_types_file): + edges_hf = h5py.File(edges_file, 'r') + self._edge_ptr_ds = edges_hf['edge_ptr'] + self._num_syns_ds = edges_hf['num_syns'] + self._src_gids_ds = edges_hf['src_gids'] + + # TODO: validate edge_types dataset keys + self._edge_types_ds = edges_hf['edge_types'] + self._edge_types_table = tn.TypesTable(edge_types_file, 'edge_type_id') + self._index_len = len(self._edge_ptr_ds) + self._nrows = len(self._src_gids_ds) + + def edges_itr(self, target_gid): + assert(isinstance(target_gid, int)) + if target_gid+1 >= self._index_len: + raise StopIteration() + + index_begin = self._edge_ptr_ds[target_gid] + index_end = self._edge_ptr_ds[target_gid+1] + for iloc in xrange(index_begin, index_end): + source_gid = self._src_gids_ds[iloc] + edge_type_id = self._edge_types_ds[iloc] + edge_type = self._edge_types_table[edge_type_id] + nsyns = self._num_syns_ds[iloc] + yield EdgeRow(target_gid, source_gid, nsyns, edge_type) + + def __len__(self): + return self._nrows diff --git a/bmtk-vb/bmtk/utils/io/tabular_network_v1.py b/bmtk-vb/bmtk/utils/io/tabular_network_v1.py new file mode 100644 index 0000000..3506b81 --- /dev/null +++ b/bmtk-vb/bmtk/utils/io/tabular_network_v1.py @@ -0,0 +1,256 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import h5py + +import tabular_network as tn + + +""" +For the initial draft of the network format developed jointly by AI and collaborators in Q2 of 2017. + +Edges and nodes files are stored in hdf5, while the edge-types and node-types are stored in csv. In the hd5f files +optional properties are stored in groups assigned to each node/edge. Optionally each property group may include +dynamics_params subgroup to describe the model of each node/row, or dynamics_params may be referenced in the types +metadata file. + +""" + +class TabularNetwork(tn.TabularNetwork): + @staticmethod + def load_nodes(nodes_file, node_types_file): + nf = NodesFile() + nf.load(nodes_file, node_types_file) + return nf + + @staticmethod + def load_edges(edges_file, edge_types_file): + ef = EdgesFile() + ef.load(edges_file, edge_types_file) + return ef + + +class NodeRow(tn.NodeRow): + def __init__(self, gid, group, group_props, types_props): + super(NodeRow, self).__init__(gid, group_props, types_props) + # TODO: use group to determine if dynamics_params are included. + + @property + def with_dynamics_params(self): + return False + + @property + def dynamics_params(self): + return None + + +class NodesFile(tn.NodesFile): + def __init__(self): + super(NodesFile, self).__init__() + + self._nodes_hf = None + self._nodes_index = pd.DataFrame() + self._group_table = {} + self._nrows = 0 + + @property + def gids(self): + return list(self._nodes_index.index) + + def load(self, nodes_file, node_types_file): + nodes_hf = h5py.File(nodes_file, 'r') + if 'nodes' not in nodes_hf.keys(): + raise Exception('Could not find nodes in {}'.format(nodes_file)) + nodes_group = nodes_hf['nodes'] + + self._network_name = nodes_group.attrs['network'] if 'network' in nodes_group.attrs.keys() else 'NA' + self._version = 'v0.1' # TODO: get the version number from the attributes + + # Create Indices + self._nodes_index['node_gid'] = pd.Series(nodes_group['node_gid'], dtype=nodes_group['node_gid'].dtype) + self._nodes_index['node_type_id'] = pd.Series(nodes_group['node_type_id'], + dtype=nodes_group['node_type_id'].dtype) + self._nodes_index['node_group'] = pd.Series(nodes_group['node_group'], + dtype=nodes_group['node_group'].dtype) + self._nodes_index['node_group_index'] = pd.Series(nodes_group['node_group_index'], + dtype=nodes_group['node_group_index'].dtype) + self._nodes_index.set_index(['node_gid'], inplace=True) + self._nrows = len(self._nodes_index) + + # Save the node-types + self._node_types_table = tn.TypesTable(node_types_file, 'node_type_id') + + # save pointers to the groups table + self._group_table = {grp_id: Group(grp_id, grp_ptr, self._node_types_table) + for grp_id, grp_ptr in nodes_group.items() if isinstance(grp_ptr, h5py.Group)} + + def get_node(self, gid, cache=False): + node_metadata = self._nodes_index.loc[gid] + ng = node_metadata['node_group'] + ng_idx = node_metadata['node_group_index'] + + group_props = self._group_table[str(ng)][ng_idx] + types_props = self._node_types_table[node_metadata['node_type_id']] + + return NodeRow(gid, self._group_table[str(ng)], group_props, types_props) + + def __len__(self): + return self._nrows + + def next(self): + if self._iter_index >= len(self): + raise StopIteration + else: + gid = self._nodes_index.index.get_loc(self._iter_index) + self._iter_index += 1 + return self.get_node(gid) + + +class EdgeRow(tn.EdgeRow): + def __init__(self, trg_gid, src_gid, syn_group, edge_props={}, edge_type_props={}): + super(EdgeRow, self).__init__(trg_gid, src_gid, edge_props, edge_type_props) + # TODO: Look in syn_group to see if dynamics_params are included + + @property + def with_dynamics_params(self): + return False + + @property + def dynamics_params(self): + return None + + +class EdgesFile(tn.EdgesFile): + def __init__(self): + super(EdgesFile, self).__init__() + self._nedges = 0 + self._source_network = None + self._target_network = None + + # We'll save the target-index dataset into memory + self._target_index = None + self._target_index_len = 0 + + # to save memory just keep pointers to datasets and access them as needed. + self._target_gid_ds = None + self._source_gid_ds = None + self._edge_type_ds = None + self._edge_group_ds = None + self._edge_group_index_ds = None + self._edge_types_table = None + + self._group_table = {} # A table for all subgroups + + @property + def source_network(self): + return self._source_network + + @property + def target_network(self): + return self._target_network + + def load(self, edges_file, edge_types_file): + edges_hf = h5py.File(edges_file, 'r') + if 'edges' not in edges_hf.keys(): + raise Exception('Could not find edges in {}'.format(edges_file)) + edges_group = edges_hf['edges'] + + # Preload the target index pointers into memory + self._target_index = pd.Series(edges_group['index_pointer'], dtype=edges_group['index_pointer'].dtype) + self._target_index_len = len(self._target_index) + + # For the other index tables we only load in a file pointer + self._target_gid_ds = edges_group['target_gid'] + if 'network' in self._target_gid_ds.attrs.keys(): + self._target_network = self._target_gid_ds.attrs['network'] + + self._source_gid_ds = edges_group['source_gid'] + if 'network' in self._source_gid_ds.attrs.keys(): + self._source_network = self._source_gid_ds.attrs['network'] + + self._edge_type_ds = edges_group['edge_type_id'] + self._edge_group_ds = edges_group['edge_group'] + self._edge_group_index_ds = edges_group['edge_group_index'] + + self._nedges = len(self._edge_group_index_ds) + + # Load in edge-types table + self._edge_types_table = tn.TypesTable(edge_types_file, 'edge_type_id') + + # Load in the group properties + # TODO: look in attributes for group synonyms + # TODO: HDF5 group name will always be a string, but value in groups dataset will be an int. + self._group_table = {grp_id: Group(grp_id, grp_ptr, self._edge_types_table) + for grp_id, grp_ptr in edges_group.items() if isinstance(grp_ptr, h5py.Group)} + + def edges_itr(self, target_gid): + assert(isinstance(target_gid, int)) + if target_gid+1 >= self._target_index_len: + raise StopIteration() + + index_begin = self._target_index.iloc[target_gid] + index_end = self._target_index.iloc[target_gid+1] + for iloc in xrange(index_begin, index_end): + yield self[iloc] + + def __len__(self): + return self._nedges + + def __getitem__(self, iloc): + trg_gid = self._target_gid_ds[iloc] + src_gid = self._source_gid_ds[iloc] + + et_id = self._edge_type_ds[iloc] + et_props = self._edge_types_table[et_id] + + syn_group = self._edge_group_ds[iloc] + syn_index = self._edge_group_index_ds[iloc] + group_props = self._group_table[str(syn_group)][syn_index] + + return EdgeRow(trg_gid, src_gid, syn_group, group_props, et_props) + + +class Group(object): + def __init__(self, group_id, h5_group, types_table): + self._types_table = types_table + self._group_id = group_id + + self._group_columns = tn.ColumnProperty.from_h5(h5_group) + self._group_table = [(prop, h5_group[prop.name]) for prop in self._group_columns] + + self._all_columns = self._group_columns + types_table.columns + + # TODO: check to see if dynamics_params exists + + @property + def columns(self): + return self._all_columns + + def __getitem__(self, indx): + group_props = {} + for cprop, h5_obj in self._group_table: + group_props[cprop.name] = h5_obj[indx] + return group_props + + def __repr__(self): + return "Group('group id': {}, 'properties':{})".format(self._group_id, self._all_columns) diff --git a/bmtk-vb/bmtk/utils/property_schema.py b/bmtk-vb/bmtk/utils/property_schema.py new file mode 100644 index 0000000..54f2005 --- /dev/null +++ b/bmtk-vb/bmtk/utils/property_schema.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD license plus clause a third +# clause that prohibits redistribution for commercial purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the Allen Institute's written permission. For +# purposes of this license, commercial purposes is the incorporation of the Allen Institute's software into anything for +# which you will charge fees or other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# TODO: go through the individual simulator's property_schemas and pull out the common functionality. Ideally all +# simulators should share ~80% of the same schema, with some differences in how certain columns are determined. +# TODO: Add access to builder so when a network is built with a given property schema +# TODO: have utils.io.tabular_network use these schemas to discover name of node-id, node-type-id, etc for different +# standards. +class PropertySchema: + pass \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/reports/__init__.pyc b/bmtk-vb/bmtk/utils/reports/__init__.pyc new file mode 100644 index 0000000..c99e3f3 Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/__init__.pyc differ diff --git a/bmtk-vb/bmtk/utils/reports/spike_trains/__init__.pyc b/bmtk-vb/bmtk/utils/reports/spike_trains/__init__.pyc new file mode 100644 index 0000000..7a938f1 Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/spike_trains/__init__.pyc differ diff --git a/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/__init__.pyc b/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/__init__.pyc new file mode 100644 index 0000000..279d5fc Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/__init__.pyc differ diff --git a/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/csv_adaptors.pyc b/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/csv_adaptors.pyc new file mode 100644 index 0000000..6a56f72 Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/csv_adaptors.pyc differ diff --git a/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/nwb_adaptors.pyc b/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/nwb_adaptors.pyc new file mode 100644 index 0000000..9f0cb24 Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/nwb_adaptors.pyc differ diff --git a/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/sonata_adaptors.pyc b/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/sonata_adaptors.pyc new file mode 100644 index 0000000..3c79b81 Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/spike_trains/adaptors/sonata_adaptors.pyc differ diff --git a/bmtk-vb/bmtk/utils/reports/spike_trains/core.pyc b/bmtk-vb/bmtk/utils/reports/spike_trains/core.pyc new file mode 100644 index 0000000..a39788c Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/spike_trains/core.pyc differ diff --git a/bmtk-vb/bmtk/utils/reports/spike_trains/plotting.pyc b/bmtk-vb/bmtk/utils/reports/spike_trains/plotting.pyc new file mode 100644 index 0000000..518e23a Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/spike_trains/plotting.pyc differ diff --git a/bmtk-vb/bmtk/utils/reports/spike_trains/spike_train_buffer.pyc b/bmtk-vb/bmtk/utils/reports/spike_trains/spike_train_buffer.pyc new file mode 100644 index 0000000..07a5592 Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/spike_trains/spike_train_buffer.pyc differ diff --git a/bmtk-vb/bmtk/utils/reports/spike_trains/spike_trains.pyc b/bmtk-vb/bmtk/utils/reports/spike_trains/spike_trains.pyc new file mode 100644 index 0000000..3a4d638 Binary files /dev/null and b/bmtk-vb/bmtk/utils/reports/spike_trains/spike_trains.pyc differ diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/default_config.json b/bmtk-vb/bmtk/utils/scripts/bionet/default_config.json new file mode 100644 index 0000000..572f497 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/default_config.json @@ -0,0 +1,47 @@ +{ + "manifest": { + "$OUTPUT_DIR": "output" + }, + + "target_simulator":"BioNet", + + "run": { + "tstop": 0.0, + "dt": 0.1, + "dL": 20, + "overwrite_output_dir": true, + "spike_threshold": -15, + "nsteps_block": 5000 + }, + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "inputs": {}, + + "reports": {}, + + "output": { + "log_file": "${OUTPUT_DIR}/log.txt", + "output_dir": "${OUTPUT_DIR}", + "spikes_file": "${OUTPUT_DIR}/spikes.h5", + "spikes_file_csv": "${OUTPUT_DIR}/spikes.csv" + }, + + "components": { + "morphologies_dir": "${COMPONENTS_DIR}/biophysical/morphology", + "synaptic_models_dir": "${COMPONENTS_DIR}/synaptic_models", + "mechanisms_dir":"${COMPONENTS_DIR}/mechanisms", + "biophysical_neuron_models_dir": "${COMPONENTS_DIR}/biophysical/electrophysiology", + "point_neuron_models_dir": "${COMPONENTS_DIR}/intfire", + "templates_dir": "${COMPONENTS_DIR}/hoc_templates" + }, + + "networks": { + "nodes": [], + + "edges": [] + } +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/hoc_templates/BioAllen_old.hoc b/bmtk-vb/bmtk/utils/scripts/bionet/hoc_templates/BioAllen_old.hoc new file mode 100644 index 0000000..fde930d --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/hoc_templates/BioAllen_old.hoc @@ -0,0 +1,21 @@ +begintemplate BioAllenOld + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal +objref all, somatic, basal, apical, axonal + +objref this + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() +} + +create soma[1], dend[1], apic[1], axon[1] + +endtemplate BioAllenOld diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/hoc_templates/BioAxonStub.hoc b/bmtk-vb/bmtk/utils/scripts/bionet/hoc_templates/BioAxonStub.hoc new file mode 100644 index 0000000..df8660d --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/hoc_templates/BioAxonStub.hoc @@ -0,0 +1,61 @@ +begintemplate BioAxonStub + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + + simplify_axon() +} + +proc simplify_axon() { + + forsec axonal { delete_section() } + create axon[2] + + axon[0] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + axon[1] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + connect axon(0), soma(0.5) + connect axon[1](0), axon[0](1) + define_shape() + + +} + +endtemplate BioAxonStub \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/hoc_templates/Biophys1.hoc b/bmtk-vb/bmtk/utils/scripts/bionet/hoc_templates/Biophys1.hoc new file mode 100644 index 0000000..bac9b0f --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/hoc_templates/Biophys1.hoc @@ -0,0 +1,34 @@ +begintemplate Biophys1 + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + +} + +endtemplate Biophys1 diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/intfire/IntFire1_exc_1.json b/bmtk-vb/bmtk/utils/scripts/bionet/intfire/IntFire1_exc_1.json new file mode 100644 index 0000000..6a58d3b --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/intfire/IntFire1_exc_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.024, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/intfire/IntFire1_inh_1.json b/bmtk-vb/bmtk/utils/scripts/bionet/intfire/IntFire1_inh_1.json new file mode 100644 index 0000000..0da2f1f --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/intfire/IntFire1_inh_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.007, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/CaDynamics.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/CaDynamics.mod new file mode 100644 index 0000000..12af065 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/CaDynamics.mod @@ -0,0 +1,40 @@ +: Dynamics that track inside calcium concentration +: modified from Destexhe et al. 1994 + +NEURON { + SUFFIX CaDynamics + USEION ca READ ica WRITE cai + RANGE decay, gamma, minCai, depth +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + FARADAY = (faraday) (coulombs) + (molar) = (1/liter) + (mM) = (millimolar) + (um) = (micron) +} + +PARAMETER { + gamma = 0.05 : percent of free calcium (not buffered) + decay = 80 (ms) : rate of removal of calcium + depth = 0.1 (um) : depth of shell + minCai = 1e-4 (mM) +} + +ASSIGNED {ica (mA/cm2)} + +INITIAL { + cai = minCai +} + +STATE { + cai (mM) +} + +BREAKPOINT { SOLVE states METHOD cnexp } + +DERIVATIVE states { + cai' = -(10000)*(ica*gamma/(2*FARADAY*depth)) - (cai - minCai)/decay +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Ca_HVA.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Ca_HVA.mod new file mode 100644 index 0000000..84db2d3 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Ca_HVA.mod @@ -0,0 +1,82 @@ +: Reference: Reuveni, Friedman, Amitai, and Gutnick, J.Neurosci. 1993 + +NEURON { + SUFFIX Ca_HVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + UNITSOFF + : if((v == -27) ){ + : v = v+0.0001 + : } + :mAlpha = (0.055*(-27-v))/(exp((-27-v)/3.8) - 1) + mAlpha = 0.055 * vtrap(-27 - v, 3.8) + mBeta = (0.94*exp((-75-v)/17)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + hAlpha = (0.000457*exp((-13-v)/50)) + hBeta = (0.0065/(exp((-v-15)/28)+1)) + hInf = hAlpha/(hAlpha + hBeta) + hTau = 1/(hAlpha + hBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Ca_LVA.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Ca_LVA.mod new file mode 100644 index 0000000..ab151d0 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Ca_LVA.mod @@ -0,0 +1,69 @@ +: Comment: LVA ca channel. Note: mtau is an approximation from the plots +: Reference: Avery and Johnston 1996, tau from Randall 1997 +: Comment: shifted by -10 mv to correct for junction potential +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Ca_LVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + v = v + 10 + mInf = 1.0000/(1+ exp((v - -30.000)/-6)) + mTau = (5.0000 + 20.0000/(1+exp((v - -25.000)/5)))/qt + hInf = 1.0000/(1+ exp((v - -80.000)/6.4)) + hTau = (20.0000 + 50.0000/(1+exp((v - -40.000)/7)))/qt + v = v - 10 + UNITSON +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Ih.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Ih.mod new file mode 100644 index 0000000..73b97d8 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Ih.mod @@ -0,0 +1,71 @@ +: Reference: Kole,Hallermann,and Stuart, J. Neurosci. 2006 + +NEURON { + SUFFIX Ih + NONSPECIFIC_CURRENT ihcn + RANGE gbar, g, ihcn +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + ehcn = -45.0 (mV) +} + +ASSIGNED { + v (mV) + ihcn (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ihcn = g*(v-ehcn) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + : if(v == -154.9){ + : v = v + 0.0001 + : } + :mAlpha = 0.001*6.43*(v+154.9)/(exp((v+154.9)/11.9)-1) + mAlpha = 0.001 * 6.43 * vtrap(v + 154.9, 11.9) + mBeta = 0.001*193*exp(v/33.1) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Im.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Im.mod new file mode 100644 index 0000000..d6112d5 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Im.mod @@ -0,0 +1,62 @@ +: Reference: Adams et al. 1982 - M-currents and other potassium currents in bullfrog sympathetic neurones +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Im + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mAlpha = 3.3e-3*exp(2.5*0.04*(v - -35)) + mBeta = 3.3e-3*exp(-2.5*0.04*(v - -35)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + UNITSON +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Im_v2.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Im_v2.mod new file mode 100644 index 0000000..fc219f7 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Im_v2.mod @@ -0,0 +1,59 @@ +: Based on Im model of Vervaeke et al. (2006) + +NEURON { + SUFFIX Im_v2 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-30)/10) + mAlpha = 0.007 * exp( (6 * 0.4 * (v - (-48))) / 26.12 ) + mBeta = 0.007 * exp( (-6 * (1 - 0.4) * (v - (-48))) / 26.12 ) + + mInf = mAlpha / (mAlpha + mBeta) + mTau = (15 + 1 / (mAlpha + mBeta)) / qt +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/K_P.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/K_P.mod new file mode 100644 index 0000000..0a1238f --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/K_P.mod @@ -0,0 +1,71 @@ +: Comment: The persistent component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + + +NEURON { + SUFFIX K_P + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + tauF = 1 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mInf = 1 / (1 + exp(-(v - (-14.3 + vshift)) / 14.6)) + if (v < -50 + vshift){ + mTau = tauF * (1.25+175.03*exp(-(v - vshift) * -0.026))/qt + } else { + mTau = tauF * (1.25+13*exp(-(v - vshift) * 0.026))/qt + } + hInf = 1/(1 + exp(-(v - (-54 + vshift))/-11)) + hTau = (360+(1010+24*(v - (-55 + vshift)))*exp(-((v - (-75 + vshift))/48)^2))/qt + UNITSON +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/K_T.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/K_T.mod new file mode 100644 index 0000000..c31beaf --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/K_T.mod @@ -0,0 +1,68 @@ +: Comment: The transient component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + +NEURON { + SUFFIX K_T + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + mTauF = 1.0 + hTauF = 1.0 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1/(1 + exp(-(v - (-47 + vshift)) / 29)) + mTau = (0.34 + mTauF * 0.92*exp(-((v+71-vshift)/59)^2))/qt + hInf = 1/(1 + exp(-(v+66-vshift)/-10)) + hTau = (8 + hTauF * 49*exp(-((v+73-vshift)/23)^2))/qt + UNITSON +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Kd.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Kd.mod new file mode 100644 index 0000000..82cbe59 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Kd.mod @@ -0,0 +1,62 @@ +: Based on Kd model of Foust et al. (2011) + + +NEURON { + SUFFIX Kd + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * h + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h' = (hInf - h) / hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-23)/10) + mInf = 1 - 1 / (1 + exp((v - (-43)) / 8)) + mTau = 1 + hInf = 1 / (1 + exp((v - (-67)) / 7.3)) + hTau = 1500 +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Kv2like.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Kv2like.mod new file mode 100644 index 0000000..1cbdf84 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Kv2like.mod @@ -0,0 +1,86 @@ +: Kv2-like channel +: Adapted from model implemented in Keren et al. 2005 +: Adjusted parameters to be similar to guangxitoxin-sensitive current in mouse CA1 pyramids from Liu and Bean 2014 + + +NEURON { + SUFFIX Kv2like + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mAlpha + mBeta + mTau + hInf + h1Tau + h2Tau +} + +STATE { + m + h1 + h2 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * m * (0.5 * h1 + 0.5 * h2) + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h1' = (hInf - h1) / h1Tau + h2' = (hInf - h2) / h2Tau +} + +INITIAL{ + rates() + m = mInf + h1 = hInf + h2 = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mAlpha = 0.12 * vtrap( -(v - 43), 11.0) + mBeta = 0.02 * exp(-(v + 1.27) / 120) + mInf = mAlpha / (mAlpha + mBeta) + mTau = 2.5 * (1 / (qt * (mAlpha + mBeta))) + + hInf = 1/(1 + exp((v + 58) / 11)) + h1Tau = (360 + (1010 + 23.7 * (v + 54)) * exp(-((v + 75) / 48)^2)) / qt + h2Tau = (2350 + 1380 * exp(-0.011 * v) - 210 * exp(-0.03 * v)) / qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Kv3_1.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Kv3_1.mod new file mode 100644 index 0000000..e244657 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Kv3_1.mod @@ -0,0 +1,54 @@ +: Comment: Kv3-like potassium current + +NEURON { + SUFFIX Kv3_1 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + mInf + mTau +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + mInf = 1/(1+exp(((v -(18.700 + vshift))/(-9.700)))) + mTau = 0.2*20.000/(1+exp(((v -(-46.560 + vshift))/(-44.140)))) + UNITSON +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/NaTa.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/NaTa.mod new file mode 100644 index 0000000..fcf7bd3 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/NaTa.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTa + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -48 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -69 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/NaTs.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/NaTs.mod new file mode 100644 index 0000000..f753e71 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/NaTs.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTs + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -40 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -66 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/NaV.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/NaV.mod new file mode 100644 index 0000000..a702395 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/NaV.mod @@ -0,0 +1,186 @@ +TITLE Mouse sodium current +: Kinetics of Carter et al. (2012) +: Based on 37 degC recordings from mouse hippocampal CA1 pyramids + +NEURON { + SUFFIX NaV + USEION na READ ena WRITE ina + RANGE g, gbar +} + +UNITS { + (mV) = (millivolt) + (S) = (siemens) +} + +PARAMETER { + gbar = .015 (S/cm2) + + : kinetic parameters + Con = 0.01 (/ms) : closed -> inactivated transitions + Coff = 40 (/ms) : inactivated -> closed transitions + Oon = 8 (/ms) : open -> Ineg transition + Ooff = 0.05 (/ms) : Ineg -> open transition + alpha = 400 (/ms) + beta = 12 (/ms) + gamma = 250 (/ms) : opening + delta = 60 (/ms) : closing + + alfac = 2.51 + btfac = 5.32 + + : Vdep + x1 = 24 (mV) : Vdep of activation (alpha) + x2 = -24 (mV) : Vdep of deactivation (beta) +} + +ASSIGNED { + + : rates + f01 (/ms) + f02 (/ms) + f03 (/ms) + f04 (/ms) + f0O (/ms) + f11 (/ms) + f12 (/ms) + f13 (/ms) + f14 (/ms) + f1n (/ms) + fi1 (/ms) + fi2 (/ms) + fi3 (/ms) + fi4 (/ms) + fi5 (/ms) + fin (/ms) + + b01 (/ms) + b02 (/ms) + b03 (/ms) + b04 (/ms) + b0O (/ms) + b11 (/ms) + b12 (/ms) + b13 (/ms) + b14 (/ms) + b1n (/ms) + bi1 (/ms) + bi2 (/ms) + bi3 (/ms) + bi4 (/ms) + bi5 (/ms) + bin (/ms) + + v (mV) + ena (mV) + ina (milliamp/cm2) + g (S/cm2) + celsius (degC) +} + +STATE { + C1 FROM 0 TO 1 + C2 FROM 0 TO 1 + C3 FROM 0 TO 1 + C4 FROM 0 TO 1 + C5 FROM 0 TO 1 + I1 FROM 0 TO 1 + I2 FROM 0 TO 1 + I3 FROM 0 TO 1 + I4 FROM 0 TO 1 + I5 FROM 0 TO 1 + O FROM 0 TO 1 + I6 FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE activation METHOD sparse + g = gbar * O + ina = g * (v - ena) +} + +INITIAL { + rates(v) + SOLVE seqinitial +} + +KINETIC activation +{ + rates(v) + ~ C1 <-> C2 (f01,b01) + ~ C2 <-> C3 (f02,b02) + ~ C3 <-> C4 (f03,b03) + ~ C4 <-> C5 (f04,b04) + ~ C5 <-> O (f0O,b0O) + ~ O <-> I6 (fin,bin) + ~ I1 <-> I2 (f11,b11) + ~ I2 <-> I3 (f12,b12) + ~ I3 <-> I4 (f13,b13) + ~ I4 <-> I5 (f14,b14) + ~ I5 <-> I6 (f1n,b1n) + ~ C1 <-> I1 (fi1,bi1) + ~ C2 <-> I2 (fi2,bi2) + ~ C3 <-> I3 (fi3,bi3) + ~ C4 <-> I4 (fi4,bi4) + ~ C5 <-> I5 (fi5,bi5) + + CONSERVE C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +LINEAR seqinitial { : sets initial equilibrium + ~ I1*bi1 + C2*b01 - C1*( fi1+f01) = 0 + ~ C1*f01 + I2*bi2 + C3*b02 - C2*(b01+fi2+f02) = 0 + ~ C2*f02 + I3*bi3 + C4*b03 - C3*(b02+fi3+f03) = 0 + ~ C3*f03 + I4*bi4 + C5*b04 - C4*(b03+fi4+f04) = 0 + ~ C4*f04 + I5*bi5 + O*b0O - C5*(b04+fi5+f0O) = 0 + ~ C5*f0O + I6*bin - O*(b0O+fin) = 0 + + ~ C1*fi1 + I2*b11 - I1*( bi1+f11) = 0 + ~ I1*f11 + C2*fi2 + I3*b12 - I2*(b11+bi2+f12) = 0 + ~ I2*f12 + C3*fi3 + I4*bi3 - I3*(b12+bi3+f13) = 0 + ~ I3*f13 + C4*fi4 + I5*b14 - I4*(b13+bi4+f14) = 0 + ~ I4*f14 + C5*fi5 + I6*b1n - I5*(b14+bi5+f1n) = 0 + + ~ C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +PROCEDURE rates(v(mV) ) +{ + LOCAL qt + qt = 2.3^((celsius-37)/10) + + f01 = qt * 4 * alpha * exp(v/x1) + f02 = qt * 3 * alpha * exp(v/x1) + f03 = qt * 2 * alpha * exp(v/x1) + f04 = qt * 1 * alpha * exp(v/x1) + f0O = qt * gamma + f11 = qt * 4 * alpha * alfac * exp(v/x1) + f12 = qt * 3 * alpha * alfac * exp(v/x1) + f13 = qt * 2 * alpha * alfac * exp(v/x1) + f14 = qt * 1 * alpha * alfac * exp(v/x1) + f1n = qt * gamma + fi1 = qt * Con + fi2 = qt * Con * alfac + fi3 = qt * Con * alfac^2 + fi4 = qt * Con * alfac^3 + fi5 = qt * Con * alfac^4 + fin = qt * Oon + + b01 = qt * 1 * beta * exp(v/x2) + b02 = qt * 2 * beta * exp(v/x2) + b03 = qt * 3 * beta * exp(v/x2) + b04 = qt * 4 * beta * exp(v/x2) + b0O = qt * delta + b11 = qt * 1 * beta * exp(v/x2) / btfac + b12 = qt * 2 * beta * exp(v/x2) / btfac + b13 = qt * 3 * beta * exp(v/x2) / btfac + b14 = qt * 4 * beta * exp(v/x2) / btfac + b1n = qt * delta + bi1 = qt * Coff + bi2 = qt * Coff / (btfac) + bi3 = qt * Coff / (btfac^2) + bi4 = qt * Coff / (btfac^3) + bi5 = qt * Coff / (btfac^4) + bin = qt * Ooff +} + diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Nap.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Nap.mod new file mode 100644 index 0000000..ef8021e --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/Nap.mod @@ -0,0 +1,77 @@ +:Reference : Modeled according to kinetics derived from Magistretti & Alonso 1999 +:Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Nap + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + hInf + hTau + hAlpha + hBeta +} + +STATE { + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + rates() + g = gbar*mInf*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1.0/(1+exp((v- -52.6)/-4.6)) : assuming instantaneous activation as modeled by Magistretti and Alonso + + hInf = 1.0/(1+exp((v- -48.8)/10)) + hAlpha = 2.88e-6 * vtrap(v + 17, 4.63) + hBeta = 6.94e-6 * vtrap(-(v + 64.4), 2.63) + + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/SK.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/SK.mod new file mode 100644 index 0000000..8bfa3b7 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/SK.mod @@ -0,0 +1,56 @@ +: SK-type calcium-activated potassium current +: Reference : Kohler et al. 1996 + +NEURON { + SUFFIX SK + USEION k READ ek WRITE ik + USEION ca READ cai + RANGE gbar, g, ik +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + (mM) = (milli/liter) +} + +PARAMETER { + v (mV) + gbar = .000001 (mho/cm2) + zTau = 1 (ms) + ek (mV) + cai (mM) +} + +ASSIGNED { + zInf + ik (mA/cm2) + g (S/cm2) +} + +STATE { + z FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * z + ik = g * (v - ek) +} + +DERIVATIVE states { + rates(cai) + z' = (zInf - z) / zTau +} + +PROCEDURE rates(ca(mM)) { + if(ca < 1e-7){ + ca = ca + 1e-07 + } + zInf = 1/(1 + (0.00043 / ca)^4.8) +} + +INITIAL { + rates(cai) + z = zInf +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/vecevent.mod b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/vecevent.mod new file mode 100644 index 0000000..503dfd2 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/mechanisms/modfiles/vecevent.mod @@ -0,0 +1,71 @@ +: Vector stream of events + +NEURON { + ARTIFICIAL_CELL VecStim +} + +ASSIGNED { + index + etime (ms) + space +} + +INITIAL { + index = 0 + element() + if (index > 0) { + net_send(etime - t, 1) + } +} + +NET_RECEIVE (w) { + if (flag == 1) { + net_event(t) + element() + if (index > 0) { + net_send(etime - t, 1) + } + } +} + +VERBATIM +extern double* vector_vec(); +extern int vector_capacity(); +extern void* vector_arg(); +ENDVERBATIM + +PROCEDURE element() { +VERBATIM + { void* vv; int i, size; double* px; + i = (int)index; + if (i >= 0) { + vv = *((void**)(&space)); + if (vv) { + size = vector_capacity(vv); + px = vector_vec(vv); + if (i < size) { + etime = px[i]; + index += 1.; + }else{ + index = -1.; + } + }else{ + index = -1.; + } + } + } +ENDVERBATIM +} + +PROCEDURE play() { +VERBATIM + void** vv; + vv = (void**)(&space); + *vv = (void*)0; + if (ifarg(1)) { + *vv = vector_arg(1); + } +ENDVERBATIM +} + + diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/run_bionet.py b/bmtk-vb/bmtk/utils/scripts/bionet/run_bionet.py new file mode 100644 index 0000000..ca8abeb --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/run_bionet.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +"""Simulates an example network of 14 cell receiving two kinds of exernal input as defined in configuration file""" + +import os, sys +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + graph = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=graph) + sim.run() + bionet.nrn.quit_execution() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/AMPA_ExcToExc.json b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/AMPA_ExcToExc.json new file mode 100644 index 0000000..c758540 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/AMPA_ExcToExc.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 1.0, + "tau2": 3.0, + "erev": 0.0 +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/AMPA_ExcToInh.json b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/AMPA_ExcToInh.json new file mode 100644 index 0000000..4388799 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/AMPA_ExcToInh.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.1, + "tau2": 0.5, + "erev": 0.0 +} diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/GABA_InhToExc.json b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/GABA_InhToExc.json new file mode 100644 index 0000000..702ce9b --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/GABA_InhToExc.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 2.7, + "tau2": 15.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/GABA_InhToInh.json b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/GABA_InhToInh.json new file mode 100644 index 0000000..ed4130a --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/GABA_InhToInh.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.2, + "tau2": 8.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/instanteneousExc.json b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/instanteneousExc.json new file mode 100644 index 0000000..9a6d0a5 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/instanteneousExc.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": 1 +} + diff --git a/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/instanteneousInh.json b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/instanteneousInh.json new file mode 100644 index 0000000..3bac514 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/bionet/synaptic_models/instanteneousInh.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": -1 +} + diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/472363762_point.json b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/472363762_point.json new file mode 100644 index 0000000..e6154b1 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/472363762_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 44.9, + "C_m": 239.0, + "t_ref": 3.0, + "E_L": -78.0, + "V_th": -43.0, + "V_reset": -55.0 +} diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/472912177_point.json b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/472912177_point.json new file mode 100644 index 0000000..30b9822 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/472912177_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 22.2, + "C_m": 180.0, + "t_ref": 3.0, + "E_L": -82.0, + "V_th": -35.0, + "V_reset": -50.0 +} diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/473862421_point.json b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/473862421_point.json new file mode 100644 index 0000000..6d7e76a --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/473862421_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 12.5, + "C_m": 78.0, + "t_ref": 3.0, + "E_L": -73.0, + "V_th": -37.0, + "V_reset": -55.0 +} diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/473863035_point.json b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/473863035_point.json new file mode 100644 index 0000000..db8e5e4 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/473863035_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 22.1, + "C_m": 117.0, + "t_ref": 3.0, + "E_L": -78.0, + "V_th": -47.0, + "V_reset": -50.0 +} diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/473863510_point.json b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/473863510_point.json new file mode 100644 index 0000000..348c569 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/473863510_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 11.5, + "C_m": 53.0, + "t_ref": 3.0, + "E_L": -72.0, + "V_th": -25.0, + "V_reset": -50.0 +} diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/IntFire1_exc_point.json b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/IntFire1_exc_point.json new file mode 100644 index 0000000..d3e5c19 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/IntFire1_exc_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 24.0, + "C_m": 120.0, + "t_ref": 3.0, + "E_L": -75.0, + "V_th": -37.0, + "V_reset": -53.0 +} diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/IntFire1_inh_point.json b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/IntFire1_inh_point.json new file mode 100644 index 0000000..cf889c5 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/IntFire1_inh_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 7.0, + "C_m": 50.0, + "t_ref": 3.0, + "E_L": -77.0, + "V_th": -36.0, + "V_reset": -52.0 +} diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/filter_point.json b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/filter_point.json new file mode 100644 index 0000000..0e0dcd2 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/point_neuron_templates/filter_point.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/run_pointnet.py b/bmtk-vb/bmtk/utils/scripts/pointnet/run_pointnet.py new file mode 100644 index 0000000..95c7261 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/run_pointnet.py @@ -0,0 +1,14 @@ +from bmtk.simulator import pointnet + + +def main(config_file): + configure = pointnet.Config.from_json(config_file) + configure.build_env() + + network = pointnet.PointNetwork.from_config(configure) + sim = pointnet.PointSimulator.from_config(configure, network) + sim.run() + + +if __name__ == '__main__': + main('config.json') \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/ExcToExc.json b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/ExcToExc.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/ExcToExc.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/ExcToInh.json b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/ExcToInh.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/ExcToInh.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/InhToExc.json b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/InhToExc.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/InhToExc.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/InhToInh.json b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/InhToInh.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/InhToInh.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/instanteneousExc.json b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/instanteneousExc.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/instanteneousExc.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/instanteneousInh.json b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/instanteneousInh.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/pointnet/synaptic_models/instanteneousInh.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/bmtk/utils/scripts/popnet/population_models/exc_model.json b/bmtk-vb/bmtk/utils/scripts/popnet/population_models/exc_model.json new file mode 100644 index 0000000..45370e1 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/popnet/population_models/exc_model.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0429, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/bmtk/utils/scripts/popnet/population_models/inh_model.json b/bmtk-vb/bmtk/utils/scripts/popnet/population_models/inh_model.json new file mode 100644 index 0000000..e9505ea --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/popnet/population_models/inh_model.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0299, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/bmtk/utils/scripts/popnet/run_popnet.py b/bmtk-vb/bmtk/utils/scripts/popnet/run_popnet.py new file mode 100644 index 0000000..ea46b3e --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/popnet/run_popnet.py @@ -0,0 +1,24 @@ +import sys +import os + +from bmtk.simulator import popnet + +from bmtk.analyzer.visualization.spikes import plot_rates_popnet + +def main(config_file): + configure = popnet.config.from_json(config_file) + configure.build_env() + network = popnet.PopNetwork.from_config(configure) + sim = popnet.PopSimulator.from_config(configure, network) + sim.run() + + cells_file = 'network/brunel_node_types.csv' + rates_file = 'output/spike_rates.csv' + plot_rates_popnet(cells_file, rates_file, model_keys='pop_name') + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + main(sys.argv[-1]) + else: + main('config.json') \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/ExcToExc.json b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/ExcToExc.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/ExcToExc.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/ExcToInh.json b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/ExcToInh.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/ExcToInh.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/InhToExc.json b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/InhToExc.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/InhToExc.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/InhToInh.json b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/InhToInh.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/InhToInh.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/input_ExcToExc.json b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/input_ExcToExc.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/input_ExcToExc.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/input_ExcToInh.json b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/input_ExcToInh.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/popnet/synaptic_models/input_ExcToInh.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/sonata.circuit_config.json b/bmtk-vb/bmtk/utils/scripts/sonata.circuit_config.json new file mode 100644 index 0000000..a2c7969 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/sonata.circuit_config.json @@ -0,0 +1,21 @@ +{ + "manifest": { + "$BASE_DIR": "%%BASE_DIR%%", + "$COMPONENTS_DIR": "%%COMPONENTS_DIR%%", + "$NETWORK_DIR": "%%NETWORK_DIR%%" + }, + + "components": { + "morphologies_dir": "$COMPONENTS_DIR/morphologies", + "synaptic_models_dir": "$COMPONENTS_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENTS_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENTS_DIR/biophysical_neuron_templates", + "point_neuron_models_dir": "$COMPONENTS_DIR/point_neuron_templates" + }, + + "networks": { + "nodes": [], + + "edges": [] + } +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/scripts/sonata.simulation_config.json b/bmtk-vb/bmtk/utils/scripts/sonata.simulation_config.json new file mode 100644 index 0000000..c619d29 --- /dev/null +++ b/bmtk-vb/bmtk/utils/scripts/sonata.simulation_config.json @@ -0,0 +1,31 @@ +{ + "manifest": { + "$BASE_DIR": "%%BASE_DIR", + "$OUTPUT_DIR": "$BASE_DIR/output" + }, + + "target_simulator":"%%TARGET_SIMULATOR%%", + + "run": { + "tstop": 0.0, + "dt": 0.1 + }, + + "conditions": { + "celsius": 34.0 + }, + + "inputs": {}, + + "reports": {}, + + "output": { + "log_file": "log.txt", + "output_dir": "${OUTPUT_DIR}", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "overwrite_output_dir": true + }, + + "network": "./circuit_config.json" +} \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/sim_setup.py b/bmtk-vb/bmtk/utils/sim_setup.py new file mode 100644 index 0000000..8301fb5 --- /dev/null +++ b/bmtk-vb/bmtk/utils/sim_setup.py @@ -0,0 +1,443 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import shutil +import json +import h5py +import re +from subprocess import call +from optparse import OptionParser +from collections import OrderedDict + +# Order of the different sections of the config.json. Any non-listed items will be placed at the end of the config +config_order = [ + 'manifest', + 'target_simulator', + 'run', + 'conditions', + 'inputs', + 'components', + 'output', + 'reports', + 'networks' +] + +local_path = os.path.dirname(os.path.realpath(__file__)) +scripts_path = os.path.join(local_path, 'scripts') + +''' +order_lookup = {k: i for i, k in enumerate(config_order)} +def sort_config_keys(ckey): + print(ckey) + exit() +''' + +def get_network_block(circuit_config, network_dir): + net_nodes = {} + net_edges = {} + for f in os.listdir(network_dir): + if not os.path.isfile(os.path.join(network_dir, f)) or f.startswith('.'): + continue + + if '_nodes' in f: + net_name = f[:f.find('_nodes')] + nodes_dict = net_nodes.get(net_name, {}) + nodes_dict['nodes_file'] = os.path.join('$NETWORK_DIR', f) + net_nodes[net_name] = nodes_dict + + elif '_node_types' in f: + net_name = f[:f.find('_node_types')] + nodes_dict = net_nodes.get(net_name, {}) + nodes_dict['node_types_file'] = os.path.join('$NETWORK_DIR', f) + net_nodes[net_name] = nodes_dict + + elif '_edges' in f: + net_name = f[:f.find('_edges')] + edges_dict = net_edges.get(net_name, {}) + edges_dict['edges_file'] = os.path.join('$NETWORK_DIR', f) + try: + edges_h5 = h5py.File(os.path.join(network_dir, f), 'r') + edges_dict['target'] = edges_h5['edges']['target_gid'].attrs['network'] + edges_dict['source'] = edges_h5['edges']['source_gid'].attrs['network'] + except Exception as e: + pass + + net_edges[net_name] = edges_dict + + elif '_edge_types' in f: + net_name = f[:f.find('_edge_types')] + edges_dict = net_edges.get(net_name, {}) + edges_dict['edge_types_file'] = os.path.join('$NETWORK_DIR', f) + net_edges[net_name] = edges_dict + + else: + print('Unknown file {}. Will have to enter by hand'.format(f)) + + for _, sect in net_nodes.items(): + circuit_config['networks']['nodes'].append(sect) + + for _, sect in net_edges.items(): + circuit_config['networks']['edges'].append(sect) + + +def build_components(circuit_config, components_path, scripts_path, with_examples): + for c_name, c_dir in circuit_config['components'].items(): + dir_name = c_dir.replace('$COMPONENTS_DIR/', '') + dir_path = os.path.join(components_path, dir_name) + + # create component directory + if not os.path.exists(dir_path): + os.makedirs(dir_path) + + # Copy in files from scripts// + scripts_dir = os.path.join(scripts_path, dir_name) + if with_examples and os.path.isdir(scripts_dir): + shutil.rmtree(dir_path) + shutil.copytree(scripts_dir, dir_path) + + +def build_circuit_env(base_dir, network_dir, components_dir, simulator, with_examples): + simulator_path = os.path.join(scripts_path, simulator) + + circuit_config = json.load(open(os.path.join(scripts_path, 'sonata.circuit_config.json'))) + circuit_config['manifest']['$BASE_DIR'] = base_dir if base_dir == '.' else os.path.abspath(base_dir) + circuit_config['manifest']['$COMPONENTS_DIR'] = '$BASE_DIR/{}'.format(components_dir) + + # Try to figure out the $NETWORK_DIR + if network_dir is None: + network_path = '' + if os.path.isabs(network_dir): + # In case network_dir is an absolute path + network_path = network_dir + elif os.path.abspath(network_dir).startswith(os.path.abspath(base_dir)): + # If network_dir is in a subdir of base_dir then NETWORK_DIR=$BASE_DIR/path/to/network + network_path = os.path.abspath(network_dir).replace(os.path.abspath(base_dir), '$BASE_DIR') + else: + # if network_dir exists outside of the base_dir just reference the absolute path + network_path = os.path.abspath(network_dir) + + circuit_config['manifest']['$NETWORK_DIR'] = network_path + + # Initialize the components directories + build_components(circuit_config, os.path.join(base_dir, components_dir), simulator_path, with_examples) + + # Parse the network directory + get_network_block(circuit_config, network_dir) + + return circuit_config + + +def build_simulation_env(base_dir, target_simulator, tstop, dt, reports): + simulation_config = json.load(open(os.path.join(scripts_path, 'sonata.simulation_config.json'))) + simulation_config['manifest']['$BASE_DIR'] = base_dir if base_dir == '.' else os.path.abspath(base_dir) + simulation_config['target_simulator'] = target_simulator + simulation_config['run']['tstop'] = tstop + simulation_config['run']['dt'] = dt + + if reports is not None: + for report_name, report_params in reports.items(): + simulation_config['reports'][report_name] = report_params + + return simulation_config + + +def copy_config(base_dir, json_dict, config_file_name): + with open(os.path.join(base_dir, config_file_name), 'w') as outfile: + ordered_dict = OrderedDict(sorted(json_dict.items(), + key=lambda s: config_order.index(s[0]) if s[0] in config_order else 100)) + json.dump(ordered_dict, outfile, indent=2) + + +def copy_run_script(base_dir, simulator, run_script): + simulator_path = os.path.join(scripts_path, simulator) + shutil.copy(os.path.join(simulator_path, run_script), os.path.join(base_dir, run_script)) + + +def build_env_pointnet(base_dir='.', network_dir=None, reports=None, with_examples=True, tstop=1000.0, dt=0.001, **args): + simulator='pointnet' + target_simulator='NEST' + components_dir='point_components' + + # Copy run script + copy_run_script(base_dir=base_dir, simulator=simulator, run_script='run_{}.py'.format(simulator)) + + # Build circuit_config and componenets directory + circuit_config = build_circuit_env(base_dir=base_dir, network_dir=network_dir, components_dir=components_dir, + simulator=simulator, with_examples=with_examples) + copy_config(base_dir, circuit_config, 'circuit_config.json') + + simulation_config = build_simulation_env(base_dir=base_dir, target_simulator=target_simulator, tstop=tstop, dt=dt, + reports=reports) + copy_config(base_dir, simulation_config, 'simulation_config.json') + + +def build_env_bionet(base_dir='.', network_dir=None, reports=None, with_examples=True, tstop=1000.0, dt=0.001, + compile_mechanisms=True, **args): + simulator='bionet' + target_simulator='NEURON' + components_dir='biophys_components' + + # Copy run script + copy_run_script(base_dir=base_dir, simulator=simulator, run_script='run_{}.py'.format(simulator)) + + # Build circuit_config and componenets directory + circuit_config = build_circuit_env(base_dir=base_dir, network_dir=network_dir, components_dir=components_dir, + simulator=simulator, with_examples=with_examples) + copy_config(base_dir, circuit_config, 'circuit_config.json') + if compile_mechanisms: + cwd = os.getcwd() + os.chdir(os.path.join(base_dir, components_dir, 'mechanisms')) # circuit_config['components']['mechanisms_dir']) + try: + print(os.getcwd()) + call(['nrnivmodl', 'modfiles']) + except Exception as e: + print('Was unable to compile mechanism in {}'.format(circuit_config['components']['mechanisms_dir'])) + # print e.message + os.chdir(cwd) + + # Build simulation config + simulation_config = build_simulation_env(base_dir=base_dir, target_simulator=target_simulator, tstop=tstop, dt=dt, + reports=reports) + simulation_config['run']['dL'] = args.get('dL', 20.0) + simulation_config['run']['spike_threshold'] = args.get('spike_threshold', -15.0) + simulation_config['run']['nsteps_block'] = args.get('nsteps_block', 5000) + simulation_config['conditions']['v_init'] = args.get('v_init', -80.0) + copy_config(base_dir, simulation_config, 'simulation_config.json') + + +def build_env_popnet(base_dir='.', network_dir=None, reports=None, with_examples=True, tstop=1000.0, dt=0.001, **args): + simulator='popnet' + target_simulator='DiPDE' + components_dir='pop_components' + + # Copy run script + copy_run_script(base_dir=base_dir, simulator=simulator, run_script='run_{}.py'.format(simulator)) + + # Build circuit_config and componenets directory + circuit_config = build_circuit_env(base_dir=base_dir, network_dir=network_dir, components_dir=components_dir, + simulator=simulator, with_examples=with_examples) + circuit_config['components']['population_models_dir'] = '$COMPONENTS_DIR/population_models' + # population_models_dir = os.path.join(base_dir, components_dir, 'population_models') + if with_examples: + models_dir = os.path.join(base_dir, components_dir, 'population_models') + if os.path.exists(models_dir): + shutil.rmtree(models_dir) + shutil.copytree(os.path.join(scripts_path, simulator, 'population_models'), models_dir) + + copy_config(base_dir, circuit_config, 'circuit_config.json') + + # Build simulation config + simulation_config = build_simulation_env(base_dir=base_dir, target_simulator=target_simulator, tstop=tstop, dt=dt, + reports=reports) + # PopNet doesn't produce spike files so instead need to replace them with rates files + for output_key in simulation_config['output'].keys(): + if output_key.startswith('spikes'): + del simulation_config['output'][output_key] + # simulation_config['output']['rates_file_csv'] = 'firing_rates.csv' + simulation_config['output']['rates_file'] = 'firing_rates.csv' + + copy_config(base_dir, simulation_config, 'simulation_config.json') + + +""" +def build_env_bionet(base_dir='.', run_time=0.0, with_config=True, network_dir=None, with_cell_types=True, + compile_mechanisms=True, reports=None): + local_path = os.path.dirname(os.path.realpath(__file__)) + scripts_path = os.path.join(local_path, 'scripts', 'bionet') + + components_dir = os.path.join(base_dir, 'components') + component_paths = { + 'morphologies_dir': os.path.join(components_dir, 'biophysical', 'morphology'), + 'biophysical_models_dir': os.path.join(components_dir, 'biophysical', 'electrophysiology'), + 'mechanisms_dir': os.path.join(components_dir, 'mechanisms'), + 'point_models_dir': os.path.join(components_dir, 'intfire'), + 'synaptic_models_dir': os.path.join(components_dir, 'synaptic_models'), + 'templates_dir': os.path.join(components_dir, 'hoc_templates') + } + for path in component_paths.values(): + if not os.path.exists(path): + os.makedirs(path) + + if with_cell_types: + shutil.rmtree(component_paths['templates_dir']) + shutil.copytree(os.path.join(scripts_path, 'hoc_templates'), component_paths['templates_dir']) + + shutil.rmtree(component_paths['mechanisms_dir']) + shutil.copytree(os.path.join(scripts_path, 'mechanisms'), component_paths['mechanisms_dir']) + + shutil.rmtree(component_paths['synaptic_models_dir']) + shutil.copytree(os.path.join(scripts_path, 'synaptic_models'), component_paths['synaptic_models_dir']) + + shutil.rmtree(component_paths['point_models_dir']) + shutil.copytree(os.path.join(scripts_path, 'intfire'), component_paths['point_models_dir']) + + if compile_mechanisms: + cwd = os.getcwd() + os.chdir(component_paths['mechanisms_dir']) + try: + print(os.getcwd()) + call(['nrnivmodl', 'modfiles']) + except Exception as e: + print('Was unable to compile mechanism in {}'.format(component_paths['mechanisms_dir'])) + # print e.message + os.chdir(cwd) + + shutil.copy(os.path.join(scripts_path, 'run_bionet.py'), os.path.join(base_dir, 'run_bionet.py')) + + if with_config: + config_json = json.load(open(os.path.join(scripts_path, 'default_config.json'))) + config_json['manifest']['$BASE_DIR'] = os.path.abspath(base_dir) + config_json['manifest']['$COMPONENTS_DIR'] = os.path.join('${BASE_DIR}', 'components') + config_json['run']['tstop'] = run_time + + if network_dir is not None: + config_json['manifest']['$NETWORK_DIR'] = os.path.abspath(network_dir) + + net_nodes = {} + net_edges = {} + for f in os.listdir(network_dir): + if not os.path.isfile(os.path.join(network_dir, f)) or f.startswith('.'): + continue + + if '_nodes' in f: + net_name = f[:f.find('_nodes')] + nodes_dict = net_nodes.get(net_name, {'name': net_name}) + nodes_dict['nodes_file'] = os.path.join('${NETWORK_DIR}', f) + net_nodes[net_name] = nodes_dict + + elif '_node_types' in f: + net_name = f[:f.find('_node_types')] + nodes_dict = net_nodes.get(net_name, {'name': net_name}) + nodes_dict['node_types_file'] = os.path.join('${NETWORK_DIR}', f) + net_nodes[net_name] = nodes_dict + + elif '_edges' in f: + net_name = f[:f.find('_edges')] + edges_dict = net_edges.get(net_name, {'name': net_name}) + edges_dict['edges_file'] = os.path.join('${NETWORK_DIR}', f) + try: + edges_h5 = h5py.File(os.path.join(network_dir, f), 'r') + edges_dict['target'] = edges_h5['edges']['target_gid'].attrs['network'] + edges_dict['source'] = edges_h5['edges']['source_gid'].attrs['network'] + except Exception as e: + pass + + net_edges[net_name] = edges_dict + + elif '_edge_types' in f: + net_name = f[:f.find('_edge_types')] + edges_dict = net_edges.get(net_name, {'name': net_name}) + edges_dict['edge_types_file'] = os.path.join('${NETWORK_DIR}', f) + net_edges[net_name] = edges_dict + + else: + print('Unknown file {}. Will have to enter by hand'.format(f)) + + for _, sect in net_nodes.items(): + config_json['networks']['nodes'].append(sect) + + for _, sect in net_edges.items(): + config_json['networks']['edges'].append(sect) + + if reports is not None: + for report_name, report_params in reports.items(): + config_json['reports'][report_name] = report_params + + ordered_dict = OrderedDict(sorted(config_json.items(), + key=lambda s: config_order.index(s[0]) if s[0] in config_order else 100)) + with open(os.path.join(base_dir, 'config.json'), 'w') as outfile: + json.dump(ordered_dict, outfile, indent=2) + #json.dump(config_json, outfile, indent=2) +""" + + +if __name__ == '__main__': + def str_list(option, opt, value, parser): + setattr(parser.values, option.dest, value.split(',')) + + #def int_list(option, opt, value, parser): + # setattr(parser.values, option.dest, [int(v) for v in value.split(',')]) + + def parse_node_set(option, opt, value, parser): + try: + setattr(parser.values, option.dest, [int(v) for v in value.split(',')]) + except ValueError as ve: + setattr(parser.values, option.dest, value) + + + parser = OptionParser(usage="Usage: python -m bmtk.utils.sim_setup [options] bionet|pointnet|popnet|mintnet") + parser.add_option('-b', '--base_dir', dest='base_dir', default='.', help='path of environment') + parser.add_option('-n', '--network_dir', dest='network_dir', default=None, + help="Use an exsting directory with network files.") + parser.add_option('-r', '--tstop', type='float', dest='tstop', default=1000.0) + parser.add_option('-d', '--dt', type=float, dest='dt', help='simulation time step dt', default=0.001) + + # For membrane report + def membrane_report_parser(option, opt, value, parser): + parser.values.has_membrane_report = True + if ',' in value: + try: + setattr(parser.values, option.dest, [int(v) for v in value.split(',')]) + except ValueError as ve: + setattr(parser.values, option.dest, value.split(',')) + + else: + setattr(parser.values, option.dest, value) + + parser.add_option('--membrane_report', dest='has_membrane_report', action='store_true', default=False) + parser.add_option('--membrane_report-vars', dest='mem_rep_vars', type='string', action='callback', + callback=membrane_report_parser, default=[]) + parser.add_option('--membrane_report-cells', dest='mem_rep_cells', type='string', action='callback', + callback=membrane_report_parser, default='all') + # parser.add_option('--membrane_report_file', dest='mem_rep_file', type='string', action='callback', + # callback=membrane_report_parser, default='$OUTPUT_DIR/cell_vars.h5') + parser.add_option('--membrane_report-sections', dest='mem_rep_secs', type='string', action='callback', + callback=membrane_report_parser, default='all') + + options, args = parser.parse_args() + reports = {} + + if options.has_membrane_report: + reports['membrane_report'] = { + 'module': 'membrane_report', + 'variable_name': options.mem_rep_vars, + 'cells': options.mem_rep_cells, + # 'file_name': options.mem_rep_file, + 'sections': options.mem_rep_secs, + } + + target_sim = args[0].lower() if len(args) == 1 else None + if target_sim not in ['bionet', 'popnet', 'pointnet', 'mintnet']: + raise Exception('Must specify one target simulator. options: "bionet", pointnet", "popnet" or "mintnet"') + + if target_sim == 'bionet': + build_env_bionet(base_dir=options.base_dir, network_dir=options.network_dir, tstop=options.tstop, + dt=options.dt, reports=reports) + + elif target_sim == 'pointnet': + build_env_pointnet(base_dir=options.base_dir, network_dir=options.network_dir, tstop=options.tstop, + dt=options.dt, reports=reports) + + elif target_sim == 'popnet': + build_env_popnet(base_dir=options.base_dir, network_dir=options.network_dir, tstop=options.tstop, + dt=options.dt, reports=reports) diff --git a/bmtk-vb/bmtk/utils/sonata/__init__.py b/bmtk-vb/bmtk/utils/sonata/__init__.py new file mode 100644 index 0000000..c236de1 --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/__init__.py @@ -0,0 +1,25 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .edge import Edge, EdgeSet +from .file import File +from .node import Node, NodeSet diff --git a/bmtk-vb/bmtk/utils/sonata/__init__.pyc b/bmtk-vb/bmtk/utils/sonata/__init__.pyc new file mode 100644 index 0000000..c20189c Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__init__.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/__init__.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..fb4c692 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/__init__.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/__init__.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..0a45475 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/__init__.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/column_property.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/column_property.cpython-36.pyc new file mode 100644 index 0000000..760998e Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/column_property.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/column_property.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/column_property.cpython-37.pyc new file mode 100644 index 0000000..5e45b26 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/column_property.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/edge.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/edge.cpython-36.pyc new file mode 100644 index 0000000..78cc958 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/edge.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/edge.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/edge.cpython-37.pyc new file mode 100644 index 0000000..e0c5a34 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/edge.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/file.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/file.cpython-36.pyc new file mode 100644 index 0000000..f765815 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/file.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/file.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/file.cpython-37.pyc new file mode 100644 index 0000000..5d76eda Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/file.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/file_root.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/file_root.cpython-36.pyc new file mode 100644 index 0000000..b2ce4a4 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/file_root.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/file_root.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/file_root.cpython-37.pyc new file mode 100644 index 0000000..a0e6927 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/file_root.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/group.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/group.cpython-36.pyc new file mode 100644 index 0000000..65c372b Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/group.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/group.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/group.cpython-37.pyc new file mode 100644 index 0000000..3194b72 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/group.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/node.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/node.cpython-36.pyc new file mode 100644 index 0000000..ec874dc Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/node.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/node.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/node.cpython-37.pyc new file mode 100644 index 0000000..a9c5d38 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/node.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/population.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/population.cpython-36.pyc new file mode 100644 index 0000000..412a1da Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/population.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/population.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/population.cpython-37.pyc new file mode 100644 index 0000000..ec5b709 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/population.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/types_table.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/types_table.cpython-36.pyc new file mode 100644 index 0000000..e9019eb Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/types_table.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/types_table.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/types_table.cpython-37.pyc new file mode 100644 index 0000000..fd5cb3b Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/types_table.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/utils.cpython-36.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000..20a79b1 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/utils.cpython-36.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/__pycache__/utils.cpython-37.pyc b/bmtk-vb/bmtk/utils/sonata/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000..eefccc4 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/__pycache__/utils.cpython-37.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/column_property.py b/bmtk-vb/bmtk/utils/sonata/column_property.py new file mode 100644 index 0000000..34eaa5a --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/column_property.py @@ -0,0 +1,103 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +import pandas as pd + + +class ColumnProperty(object): + """Representation of a column name and metadata from a hdf5 dataset, csv column, etc. + + """ + def __init__(self, name, dtype, dimension, nrows=0, attrs=None): + self._name = name + self._dtype = dtype + self._dim = dimension + self._nrows = nrows + self._attrs = attrs or {} + + @property + def name(self): + return self._name + + @property + def dtype(self): + return self._dtype + + @property + def dimension(self): + return self._dim + + @property + def nrows(self): + return self._nrows + + @property + def attributes(self): + return self._attrs + + @classmethod + def from_h5(cls, hf_obj, name=None): + if isinstance(hf_obj, h5py.Dataset): + ds_name = name if name is not None else hf_obj.name.split('/')[-1] + ds_dtype = hf_obj.dtype + + # If the dataset shape is in the form "(N, M)" then the dimension is M. If the shape is just "(N)" then the + # dimension is just 1 + dim = 1 if len(hf_obj.shape) < 2 else hf_obj.shape[1] + nrows = hf_obj.shape[0] + return cls(ds_name, ds_dtype, dim, nrows, attrs=hf_obj.attrs) + + elif isinstance(hf_obj, h5py.Group): + columns = [] + for name, ds in hf_obj.items(): + if isinstance(ds, h5py.Dataset): + columns.append(ColumnProperty.from_h5(ds, name)) + return columns + + else: + raise Exception('Unable to convert hdf5 object {} to a property or list of properties.'.format(hf_obj)) + + @classmethod + def from_csv(cls, pd_obj, name=None): + if isinstance(pd_obj, pd.Series): + c_name = name if name is not None else pd_obj.name + c_dtype = pd_obj.dtype + return cls(c_name, c_dtype, 1) + + elif isinstance(pd_obj, pd.DataFrame): + return [cls(name, pd_obj[name].dtype, 1) for name in pd_obj.columns] + + else: + raise Exception('Unable to convert pandas object {} to a property or list of properties.'.format(pd_obj)) + + def __hash__(self): + return hash(self._name) + + def __repr__(self): + return '{}'.format(self.name, self.dtype) + + def __eq__(self, other): + if isinstance(other, ColumnProperty): + return self._name == other._name + else: + return self._name == other diff --git a/bmtk-vb/bmtk/utils/sonata/column_property.pyc b/bmtk-vb/bmtk/utils/sonata/column_property.pyc new file mode 100644 index 0000000..8fd0806 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/column_property.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/config.py b/bmtk-vb/bmtk/utils/sonata/config.py new file mode 100644 index 0000000..fdb97ab --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/config.py @@ -0,0 +1,341 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import re +import copy +import datetime + + +class SonataConfig(dict): + def __init__(self, *args, **kwargs): + super(SonataConfig, self).__init__(*args, **kwargs) + self._env_built = False + + @property + def run(self): + return self['run'] + + @property + def tstart(self): + return self.run.get('tstart', 0.0) + + @property + def tstop(self): + return self.run['tstop'] + + @property + def dt(self): + return self.run.get('dt', 0.1) + + @property + def block_step(self): + return self.run.get('nsteps_block', 5000) + + @property + def conditions(self): + return self['conditions'] + + @property + def celsius(self): + return self.conditions['celsius'] + + @property + def v_init(self): + return self.conditions['v_init'] + + @property + def path(self): + return self['config_path'] + + @property + def output(self): + return self['output'] + + @property + def output_dir(self): + return self.output['output_dir'] + + @property + def overwrite_output(self): + return self.output['overwrite_output_dir'] + + @property + def log_file(self): + return self.output['log_file'] + + @property + def components(self): + return self.get('components', {}) + + @property + def morphologies_dir(self): + return self.components['morphologies_dir'] + + @property + def synaptic_models_dir(self): + return self.components['synaptic_models_dir'] + + @property + def point_neuron_models_dir(self): + return self.components['point_neuron_models_dir'] + + @property + def mechanisms_dir(self): + return self.components['mechanisms_dir'] + + @property + def biophysical_neuron_models_dir(self): + return self.components['biophysical_neuron_models_dir'] + + @property + def templates_dir(self): + return self.components.get('templates_dir', None) + + @property + def with_networks(self): + return 'networks' in self and len(self.nodes) > 0 + + @property + def networks(self): + return self['networks'] + + @property + def nodes(self): + return self.networks.get('nodes', []) + + @property + def edges(self): + return self.networks.get('edges', []) + + def copy_to_output(self): + copy_config(self) + + @staticmethod + def get_validator(): + raise NotImplementedError + + @classmethod + def from_json(cls, config_file, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_json(config_file, validator)) + + @classmethod + def from_dict(cls, config_dict, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_dict(config_dict, validator)) + + @classmethod + def from_yaml(cls, config_file, validate=False): + raise NotImplementedError + + @property + def reports(self): + return self.get('reports', {}) + + @property + def inputs(self): + return self.get('inputs', {}) + + def get_modules(self, module_name): + return [report for report in self.reports.values() if report['module'] == module_name] + + def build_env(self): + if self._env_built: + return + + self.create_output_dir() + self.copy_to_output() + self._env_built = True + + +def from_json(config_file, validator=None): + """Builds and validates a configuration json file. + + :param config_file: File object or path to a json file. + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + if isinstance(config_file, file): + conf = json.load(config_file) + elif isinstance(config_file, basestring): + conf = json.load(open(config_file, 'r')) + else: + raise Exception('{} is not a file or file path.'.format(config_file)) + + # insert file path into dictionary + if 'config_path' not in conf: + conf['config_path'] = os.path.abspath(config_file) + + # Will resolve manifest variables and validate + return from_dict(conf, validator) + + +def from_dict(config_dict, validator=None): + """Builds and validates a configuration json dictionary object. Best to directly use from_json when possible. + + :param config_dict: Dictionary object + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + assert(isinstance(config_dict, dict)) + conf = copy.deepcopy(config_dict) # Since the functions will mutate the dictionary we will copy just-in-case. + + if 'config_path' not in conf: + conf['config_path'] = os.path.abspath(__file__) + + # Build the manifest and resolve variables. + # TODO: Check that manifest exists + manifest = __build_manifest(conf) + conf['manifest'] = manifest + __recursive_insert(conf, manifest) + + # In our work with Blue-Brain it was agreed that 'network' and 'simulator' parts of config may be split up into + # separate files. If this is the case we build each sub-file separately and merge into this one + for childconfig in ['network', 'simulation']: + if childconfig in conf and isinstance(conf[childconfig], basestring): + # Try to resolve the path of the network/simulation config files. If an absolute path isn't used find + # the file relative to the current config file. TODO: test if this will work on windows? + conf_str = conf[childconfig] + conf_path = conf_str if conf_str.startswith('/') else os.path.join(conf['config_path'], conf_str) + + # Build individual json file and merge into parent. + child_json = from_json(conf_path) + del child_json['config_path'] # we don't want 'config_path' of parent being overwritten. + conf.update(child_json) + + # Run the validator + if validator is not None: + validator.validate(conf) + + return conf + + +def copy_config(conf): + """Copy configuration file to different directory, with manifest variables resolved. + + :param conf: configuration dictionary + """ + output_dir = conf["output"]["output_dir"] + config_name = os.path.basename(conf['config_path']) + output_path = os.path.join(output_dir, config_name) + with open(output_path, 'w') as fp: + json.dump(conf, fp, indent=2) + + +def __special_variables(conf): + """A list of preloaded variables to insert into the manifest, containing things like path to run-time directory, + configuration directory, etc. + """ + pre_manifest = dict() + pre_manifest['$workingdir'] = os.path.dirname(os.getcwd()) + if 'config_path' in conf: + pre_manifest['$configdir'] = os.path.dirname(conf['config_path']) # path of configuration file + pre_manifest['$configfname'] = conf['config_path'] + + dt_now = datetime.datetime.now() + pre_manifest['$time'] = dt_now.strftime('%H-%M-%S') + pre_manifest['$date'] = dt_now.strftime('%Y-%m-%d') + pre_manifest['$datetime'] = dt_now.strftime('%Y-%m-%d_%H-%M-%S') + + return pre_manifest + + +def __build_manifest(conf): + """Resolves the manifest section and resolve any internal variables""" + if 'manifest' not in conf: + return __special_variables(conf) + + manifest = conf["manifest"] + resolved_manifest = __special_variables(conf) + resolved_keys = set() + unresolved_keys = set(manifest.keys()) + + # No longer using recursion since that can lead to an infinite loop if the person who writes the config file isn't + # careful. Also added code to allow for ${VAR} format in-case user wants to user "$.../some_${MODEl}_here/..." + while unresolved_keys: + for key in unresolved_keys: + # Find all variables in manifest and see if they can be replaced by the value in resolved_manifest + value = __find_variables(manifest[key], resolved_manifest) + + # If value no longer has variables, and key-value pair to resolved_manifest and remove from unresolved-keys + if value.find('$') < 0: + resolved_manifest[key] = value + resolved_keys.add(key) + + # remove resolved key-value pairs from set, and make sure at every iteration unresolved_keys shrinks to prevent + # infinite loops + n_unresolved = len(unresolved_keys) + unresolved_keys -= resolved_keys + if n_unresolved == len(unresolved_keys): + msg = "Unable to resolve manifest variables: {}".format(unresolved_keys) + raise Exception(msg) + + return resolved_manifest + + +def __recursive_insert(json_obj, manifest): + """Loop through the config and substitute the path variables (e.g.: $MY_DIR) with the values from the manifest + + :param json_obj: A json dictionary object that may contain variables needing to be resolved. + :param manifest: A dictionary of variable values + :return: A new json dictionar config file with variables resolved + """ + if isinstance(json_obj, basestring): + return __find_variables(json_obj, manifest) + + elif isinstance(json_obj, list): + new_list = [] + for itm in json_obj: + new_list.append(__recursive_insert(itm, manifest)) + return new_list + + elif isinstance(json_obj, dict): + for key, val in json_obj.items(): + if key == 'manifest': + continue + json_obj[key] = __recursive_insert(val, manifest) + + return json_obj + + else: + return json_obj + + +def __find_variables(json_str, manifest): + """Replaces variables (i.e. $VAR, ${VAR}) with their values from the manifest. + + :param json_str: a json string that may contain none, one or multiple variable + :param manifest: dictionary of variable lookup values + :return: json_str with resolved variables. Won't resolve variables that don't exist in manifest. + """ + variables = [m for m in re.finditer('\$\{?[\w]+\}?', json_str)] + for var in variables: + var_lookup = var.group() + if var_lookup.startswith('${') and var_lookup.endswith('}'): + # replace ${VAR} with $VAR + var_lookup = "$" + var_lookup[2:-1] + if var_lookup in manifest: + json_str = json_str.replace(var.group(), manifest[var_lookup]) + + return json_str diff --git a/bmtk-vb/bmtk/utils/sonata/edge.py b/bmtk-vb/bmtk/utils/sonata/edge.py new file mode 100644 index 0000000..435dd02 --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/edge.py @@ -0,0 +1,90 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class EdgeSet(object): + def __init__(self, edge_ids, population): + self._edge_ids = edge_ids + self._population = population + self._n_edges = len(self._edge_ids) + self.__itr = 0 + + def __iter__(self): + self.__itr = 0 + return self + + def next(self): + if self.__itr >= self._n_edges: + raise StopIteration + + next_edge = self._population.iloc(self._edge_ids[self.__itr]) + self.__itr += 1 + return next_edge + + +class Edge(object): + def __init__(self, src_node_id, trg_node_id, source_pop, target_pop, group_id, group_props, edge_types_props): + self._src_node_id = src_node_id + self._trg_node_id = trg_node_id + self._source_population = source_pop + self._target_population = target_pop + self._group_props = group_props + self._group_id = group_id + self._edge_type_props = edge_types_props + + @property + def source_node_id(self): + return self._src_node_id + + @property + def target_node_id(self): + return self._trg_node_id + + @property + def source_population(self): + return self._source_population + + @property + def target_population(self): + return self._target_population + + @property + def group_id(self): + return self._group_id + + @property + def edge_type_id(self): + return self._edge_type_props['edge_type_id'] + + @property + def dynamics_params(self): + raise NotImplementedError + + def __getitem__(self, prop_key): + if prop_key in self._group_props: + return self._group_props[prop_key] + elif prop_key in self._edge_type_props: + return self._edge_type_props[prop_key] + else: + raise KeyError('Property {} not found in edge.'.format(prop_key)) + + def __contains__(self, prop_key): + return prop_key in self._group_props or prop_key in self._edge_type_props \ No newline at end of file diff --git a/bmtk-vb/bmtk/utils/sonata/edge.pyc b/bmtk-vb/bmtk/utils/sonata/edge.pyc new file mode 100644 index 0000000..6812aa0 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/edge.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/file.py b/bmtk-vb/bmtk/utils/sonata/file.py new file mode 100644 index 0000000..d70f66a --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/file.py @@ -0,0 +1,124 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import utils +from .file_root import NodesRoot, EdgesRoot + + +class File(object): + def __init__(self, data_files, data_type_files, mode='r', gid_table=None, require_magic=True): + if mode != 'r': + raise Exception('Currently only read mode is supported.') + + self._data_files = utils.listify(data_files) + self._data_type_files = utils.listify(data_type_files) + + # Open and check HDF5 file(s) + self._h5_file_handles = [utils.load_h5(f, mode) for f in self._data_files] + if require_magic: + map(utils.check_magic, self._h5_file_handles) # Check magic attribute in h5 files + + # Check version number + avail_versions = set(map(utils.get_version, self._h5_file_handles)) + if len(avail_versions) == 1: + self._version = list(avail_versions)[0] + elif len(avail_versions) > 1: + # TODO: log as warning + print('Warning: Passing in multiple hdf5 files of different version') + self._version = ','.join(avail_versions) + else: + self._version = utils.VERSION_NA + + self._csv_file_handles = [(f, utils.load_csv(f)) for f in self._data_type_files] + + self._has_nodes = False + self._nodes = None # /nodes object + self._nodes_groups = [] # list of all hdf5 /nodes group + self._node_types_dataframes = [] # list of all csv node-types dataframe + + self._has_edges = False + self._edges = None # /edges object + self._edges_groups = [] # list of all hdf5 /edges group + self._edge_types_dataframes = [] # list of csv edge-types dataframes + + # for multiple inputs sort into edge files and node files + self._sort_types_file() + self._sort_h5_files() + + if not (self._has_nodes or self._has_edges): + raise Exception('Could not find neither nodes nor edges for the given file(s).') + + if self._has_nodes: + self._nodes = NodesRoot(nodes=self._nodes_groups, node_types=self._node_types_dataframes, gid_table=gid_table) + + if self._has_edges: + self._edges = EdgesRoot(edges=self._edges_groups, edge_types=self._edge_types_dataframes) + + @property + def nodes(self): + return self._nodes + + @property + def has_nodes(self): + return self._has_nodes + + @property + def edges(self): + return self._edges + + @property + def has_edges(self): + return self._has_edges + + @property + def version(self): + return self._version + + def _sort_types_file(self): + # TODO: node/edge type_id columnn names should not be hardcoded + for filename, df in self._csv_file_handles: + has_node_type_id = 'node_type_id' in df.columns + has_edge_type_id = 'edge_type_id' in df.columns + if has_node_type_id and has_edge_type_id: + # TODO: users may be creating their own dataframe and thus not have a filename + raise Exception('types file {} has both node_types_id and edge_types_id column.'.format(filename)) + elif has_node_type_id: + self._node_types_dataframes.append(df) + elif has_edge_type_id: + self._edge_types_dataframes.append(df) + else: + # TODO: if strict this should fail immedietely + print('Warning: Could not determine if file {} was an edge-types or node-types file. Ignoring'.format(filename)) + + def _sort_h5_files(self): + for h5 in self._h5_file_handles: + has_nodes = '/nodes' in h5 + has_edges = '/edges' in h5 + if not (has_nodes or has_edges): + print('File {} contains neither nodes nor edges. Ignoring'.format(h5.filename)) + else: + if has_nodes: + self._nodes_groups.append(h5) + self._has_nodes = True + if has_edges: + self._edges_groups.append(h5) + self._has_edges = True diff --git a/bmtk-vb/bmtk/utils/sonata/file.pyc b/bmtk-vb/bmtk/utils/sonata/file.pyc new file mode 100644 index 0000000..a118f7b Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/file.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/file_root.py b/bmtk-vb/bmtk/utils/sonata/file_root.py new file mode 100644 index 0000000..071e88c --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/file_root.py @@ -0,0 +1,301 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import sys + +import h5py +import pandas as pd +import numpy as np + +from . import utils +from .population import NodePopulation, EdgePopulation +from .types_table import NodeTypesTable, EdgeTypesTable + + +class FileRoot(object): + """Base class for both /nodes and /edges root group in h5 file""" + def __init__(self, root_name, h5_files, h5_mode, csv_files): + """ + :param root_name: should either be 'nodes' or 'edges' + :param h5_files: file (or list of files) containing nodes/edges + :param h5_mode: currently only supporting 'r' mode in h5py + :param csv_files: file (or list of files) containing node/edge types + """ + self._root_name = root_name + self._h5_handles = [utils.load_h5(f, h5_mode) for f in utils.listify(h5_files)] + self._csv_handles = [(f, utils.load_csv(f)) for f in utils.listify(csv_files)] + + # merge and create a table of the types table(s) + self._types_table = None + self._build_types_table() + + # population_name->h5py.Group table (won't instantiate the population) + self._populations_groups = {} + self._store_groups() + + # A map between population_name -> Population object. Population objects aren't created until called, in the + # case user wants to split populations among MPI nodes (instantiation will create node/edge indicies and other + # overhead). + self._populations_cache = {} + + self.check_format() + + @property + def root_name(self): + return self._root_name + + @property + def population_names(self): + return list(self._populations_groups.keys()) + + @property + def populations(self): + return [self[name] for name in self.population_names] + + @property + def types_table(self): + return self._types_table + + @types_table.setter + def types_table(self, types_table): + self._types_table = types_table + + def _build_types_table(self): + raise NotImplementedError + + def _store_groups(self): + """Create a map between group population to their h5py.Group handle""" + for h5handle in self._h5_handles: + assert(self.root_name in h5handle.keys()) + for pop_name, pop_group in h5handle[self._root_name].items(): + if pop_name in self._populations_groups: + raise Exception('Multiple {} populations with name {}.'.format(self._root_name, pop_name)) + self._populations_groups[pop_name] = pop_group + + def _build_population(self, pop_name, pop_group): + raise NotImplementedError + + def get_population(self, population_name, default=None): + """Return a population group object based on population's name""" + if population_name in self: + return self[population_name] + else: + # need this for EdgeRoot.get_populations + return default + + def check_format(self): + if len(self._h5_handles) == 0: + raise Exception('No {} hdf5 files specified.'.format(self.root_name)) + + if len(self._csv_handles) == 0: + raise Exception('No {} types csv files specified.'.format(self.root_name)) + + def __contains__(self, population_name): + # TODO: Add condition if user passes in io.Population object + return population_name in self.population_names + + def __getitem__(self, population_name): + if population_name not in self: + raise Exception('{} does not contain a population with name {}.'.format(self.root_name, population_name)) + + if population_name in self._populations_cache: + return self._populations_cache[population_name] + else: + h5_grp = self._populations_groups[population_name] + pop_obj = self._build_population(population_name, h5_grp) + self._populations_cache[population_name] = pop_obj + return pop_obj + + +class NodesRoot(FileRoot): + def __init__(self, nodes, node_types, mode='r', gid_table=None): + super(NodesRoot, self).__init__('nodes', h5_files=nodes, h5_mode=mode, csv_files=node_types) + + # load the gid <--> (node_id, population) map if specified. + self._gid_table = gid_table + self._gid_table_groupby = {} + self._has_gids = False + # TODO: Should we allow gid-table to be built into '/nodes' h5 groups, or must it always be a separat file? + if gid_table is not None: + self.set_gid_table(gid_table) + + @property + def has_gids(self): + return self._has_gids + + @property + def node_types_table(self): + return self.types_table + + def set_gid_table(self, gid_table, force=False): + """Adds a map from a gids <--> (node_id, population) based on specification. + + :param gid_table: An h5 file/group containing map specifications + :param force: Set to true to have it overwrite any exsiting gid table (default False) + """ + assert(gid_table is not None) + if self.has_gids and not force: + raise Exception('gid table already exists (use force=True to overwrite)') + + self._gid_table = utils.load_h5(gid_table, 'r') + # TODO: validate that the correct columns/dtypes exists. + gid_df = pd.DataFrame() + gid_df['gid'] = pd.Series(data=self._gid_table['gid'], dtype=self._gid_table['gid'].dtype) + gid_df['node_id'] = pd.Series(data=self._gid_table['node_id'], dtype=self._gid_table['node_id'].dtype) + gid_df['population'] = pd.Series(data=self._gid_table['population']) + population_names_ds = self._gid_table['population_names'] + for pop_id, subset in gid_df.groupby(by='population'): + pop_name = population_names_ds[pop_id] + self._gid_table_groupby[pop_name] = subset + self._has_gids = True + + def generate_gids(self, file_name, gids=None, force=False): + """Creates a gid <--> (node_id, population) table based on sonnet specifications. + + Generating gids will take some time and so not recommend to call this during the simulation. Instead save + the file to the disk and pass in h5 file during the simulation (using gid_table parameter). In fact if you're + worried about efficeny don't use this method. + + :param file_name: Name of h5 file to save gid map to. + :param gids: rule/list of gids to use + :param force: set to true to overwrite existing gid map (default False). + """ + + # TODO: This is very inefficent, fix (although not a priority as this function should be called sparingly) + # TODO: Allow users to pass in a list/function to determine gids + # TODO: We should use an enumerated lookup table for population ds instead of storing strings + # TODO: Move this to a utils function rather than a File + if self.has_gids and not force: + raise Exception('Nodes already have a gid table. Use force=True to overwrite existing gids.') + + dir_name = os.path.dirname(os.path.abspath(file_name)) + if not os.path.exists(dir_name): + os.makedirs(dir_name) + + with h5py.File(file_name, 'w') as h5: + # TODO: should we use mode 'x', or give an option to overwrite existing files + n_nodes = 0 + ascii_len = 0 # store max population name for h5 fixed length strings + # Find population names and the total size of every population + for node_pop in self.populations: + n_nodes += len(node_pop) + name_nchars = len(node_pop.name) + ascii_len = ascii_len if ascii_len >= name_nchars else name_nchars + + # node_id and gid datasets should just be unsigned integers + h5.create_dataset(name='gid', shape=(n_nodes,), dtype=np.uint64) + h5.create_dataset(name='node_id', shape=(n_nodes,), dtype=np.uint64) + # TODO: determine population precisions from num of populations + h5.create_dataset(name='population', shape=(n_nodes,), dtype=np.uint16) + + # Create a lookup table for pop-name + pop_name_list = [pname for pname in self.population_names] + if utils.using_py3: + dt = h5py.special_dtype(vlen=str) # python 3 + else: + dt = h5py.special_dtype(vlen=unicode) # python 2 + h5.create_dataset(name='population_names', shape=(len(pop_name_list),), dtype=dt) + # No clue why but just passing in the data during create_dataset doesn't work h5py + for i, n in enumerate(pop_name_list): + h5['population_names'][i] = n + + # write each (gid, node_id, population) + indx = 0 + for node_pop in self.populations: + # TODO: Block write if special gid generator isn't being used + # TODO: Block write populations at least + pop_name = node_pop.name # encode('ascii', 'ignore') + pop_id = pop_name_list.index(pop_name) + for node in node_pop: + h5['node_id'][indx] = node.node_id + h5['population'][indx] = pop_id + h5['gid'][indx] = indx + indx += 1 + + # pass gid table to current nodes + self.set_gid_table(h5) + + def _build_types_table(self): + self.types_table = NodeTypesTable() + for _, csvhandle in self._csv_handles: + self.types_table.add_table(csvhandle) + + def _build_population(self, pop_name, pop_group): + return NodePopulation(pop_name, pop_group, self.node_types_table) + + def __getitem__(self, population_name): + # If their is a gids map then we must pass it into the population + pop_obj = super(NodesRoot, self).__getitem__(population_name) + if self.has_gids and (not pop_obj.has_gids) and (population_name in self._gid_table_groupby): + pop_obj.add_gids(self._gid_table_groupby[population_name]) + + return pop_obj + + +class EdgesRoot(FileRoot): + def __init__(self, edges, edge_types, mode='r'): + super(EdgesRoot, self).__init__(root_name='edges', h5_files=edges, h5_mode=mode, csv_files=edge_types) + + + @property + def edge_types_table(self): + return self.types_table + + def get_populations(self, name=None, source=None, target=None): + """Find all populations with matching criteria, either using the population name (which will return a list + of size 0 or 1) or based on the source/target population. + + To return a list of all populations just use populations() method + + :param name: (str) name of population + :param source: (str or NodePopulation) returns edges with nodes coming from matching source-population + :param target: (str or NodePopulation) returns edges with nodes coming from matching target-population + :return: A (potential empty) list of EdgePopulation objects filter by criteria. + """ + assert((name is not None) ^ (source is not None or target is not None)) + if name is not None: + return [self[name]] + + else: + # TODO: make sure groups aren't built unless they are a part of the results + selected_pops = self.population_names + if source is not None: + # filter out only edges with given source population + source = source.name if isinstance(source, NodePopulation) else source + selected_pops = [name for name in selected_pops + if EdgePopulation.get_source_population(self._populations_groups[name]) == source] + if target is not None: + # filter out by target population + target = target.name if isinstance(target, NodePopulation) else target + selected_pops = [name for name in selected_pops + if EdgePopulation.get_target_population(self._populations_groups[name]) == target] + + return [self[name] for name in selected_pops] + + def _build_types_table(self): + self.types_table = EdgeTypesTable() + for _, csvhandle in self._csv_handles: + self.edge_types_table.add_table(csvhandle) + + def _build_population(self, pop_name, pop_group): + return EdgePopulation(pop_name, pop_group, self.edge_types_table) diff --git a/bmtk-vb/bmtk/utils/sonata/file_root.pyc b/bmtk-vb/bmtk/utils/sonata/file_root.pyc new file mode 100644 index 0000000..ef37054 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/file_root.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/group.py b/bmtk-vb/bmtk/utils/sonata/group.py new file mode 100644 index 0000000..4264d45 --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/group.py @@ -0,0 +1,416 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd + +from .column_property import ColumnProperty +from .node import Node, NodeSet +from .edge import Edge, EdgeSet + + +class Group(object): + """A container containig a node/edge population groups. + + A node or edge population will have one or more groups, each having a unique identifier. Each group shared the same + columns and datatypes, thus each group is essentially a different model. + """ + + def __init__(self, group_id, h5_group, parent): + self._group_id = int(group_id) + self._parent = parent + self._types_table = parent.types_table + self._h5_group = h5_group + self._types_index_col = self._types_table.index_column_name + + self._group_columns = ColumnProperty.from_h5(h5_group) + # TODO: combine group_columns, group_column_names and group_columns_map, doesn't need to be 3 structures + self._group_column_map = {col.name: col for col in self._group_columns} + self._group_column_names = set(col.name for col in self._group_columns) + self._group_table = {prop: h5_group[prop.name] for prop in self._group_columns} + self._ncolumns = len(self._group_columns) + + self._all_columns = self._group_columns + self._types_table.columns + self._all_column_names = set(col.name for col in self._all_columns) + + self._nrows = 0 # number of group members + + # For storing dynamics_params subgroup (if it exists) + self._has_dynamics_params = 'dynamics_params' in self._h5_group and len(self._h5_group['dynamics_params']) > 0 + self._dynamics_params_columns = [] + + # An index of all the rows in parent population that map onto a member of this group + self._parent_indicies = None # A list of parent rows indicies + self._parent_indicies_built = False + + self.check_format() + + @property + def group_id(self): + return self._group_id + + @property + def has_dynamics_params(self): + return False + + @property + def columns(self): + return self._group_columns + + @property + def group_columns(self): + return self._group_columns + + @property + def all_columns(self): + return self._all_columns + + @property + def has_gids(self): + return self._parent.has_gids + + @property + def parent(self): + return self._parent + + def get_dataset(self, column_name): + return self._group_table[column_name] + + def column(self, column_name, group_only=False): + if column_name in self._group_column_map: + return self._group_column_map[column_name] + elif not group_only and column_name in self._types_table.columns: + return self._types_table.column(column_name) + else: + return KeyError + + def check_format(self): + # Check that all the properties have the same number of rows + col_counts = [col.nrows for col in self._group_columns + self._dynamics_params_columns] + if len(set(col_counts)) > 1: + # TODO: Would be nice to warn user which dataset have different size + raise Exception('properties in {}/{} have different ranks'.format(self._parent.name, self._group_id)) + elif len(set(col_counts)) == 1: + self._nrows = col_counts[0] + + def build_indicies(self, force=False): + raise NotImplementedError + + def to_dataframe(self): + raise NotImplementedError + + def get_values(self, property_name, all_rows=False): + """Returns all values for a group property. + + Note that a row within a group may not have a corresponding node/edge, or they may have a different order or + multiple node/edges may share the same group row. Setting all_rows=False will return all the values as you + see if you iterated through all the population's items. Setting all_rows=True just returns the data as a + list as they appear in the dataset (will be faster). + + :param property_name: Name of dataset property/column to fetch. + :param all_rows: Set false to return order in which they appear in population, false to return entire dataset + :return: A list of values for the given column name. + """ + raise NotImplementedError + + def __len__(self): + return self._nrows + + def __getitem__(self, group_index): + group_props = {} + for cname, h5_obj in self._group_table.items(): + group_props[cname] = h5_obj[group_index] + return group_props + + def __contains__(self, prop_name): + """Search that a column name exists in this group""" + return prop_name in self._group_column_names + + +class NodeGroup(Group): + def __init__(self, group_id, h5_group, parent): + super(NodeGroup, self).__init__(group_id, h5_group, parent) + # Note: Don't call build_indicies right away so uses can call __getitem__ without having to load all the + # node_ids + + @property + def node_ids(self): + self.build_indicies() + # print self._parent_indicies + return self._parent.inode_ids(self._parent_indicies) + + @property + def node_type_ids(self): + self.build_indicies() + return self._parent.inode_type_ids(self._parent_indicies) + + @property + def gids(self): + self.build_indicies() + return self._parent.igids(self._parent_indicies) + + def build_indicies(self, force=False): + if self._parent_indicies_built and not force: + return + + # TODO: Check for the special case where there is only one group + # TODO: If memory becomes an issue on very larget nodes (10's of millions) consider using a generator + # I've pushed the actual building of the population->group indicies onto the parent population + self._parent_indicies = self._parent.group_indicies(self.group_id, build_cache=True) + self._parent_indicies_built = True + + def get_values(self, property_name, filtered_indicies=True): + self.build_indicies() + # TODO: Check if property_name is node_id, node_type, or gid + + if property_name in self._group_columns: + if not filtered_indicies: + # Just return all values in dataset + return np.array(self._group_table[property_name]) + else: + # Return only those values for group indicies with associated nodes + grp_indicies = self._parent.igroup_indicies(self._parent_indicies) + # It is possible that the group_index is unorderd or contains duplicates which will cause h5py slicing + # to fail. Thus convert to a numpy array + # TODO: loading the entire table is not good if the filtered nodes is small, consider building. + tmp_array = np.array(self._group_table[property_name]) + return tmp_array[grp_indicies] + + elif property_name in self._parent.node_types_table.columns: + # For properties that come from node-types table we need to build the results from scratch + # TODO: Need to performance test, I think this code could be optimized. + node_types_table = self._parent.node_types_table + nt_col = node_types_table.column(property_name) + tmp_array = np.empty(shape=len(self._parent_indicies), dtype=nt_col.dtype) + for i, ntid in enumerate(self.node_type_ids): + tmp_array[i] = node_types_table[ntid][property_name] + + return tmp_array + + def to_dataframe(self): + self.build_indicies() + + # Build a dataframe of group properties + # TODO: Include dynamics_params? + properties_df = pd.DataFrame() + for col in self._group_columns: + if col.dimension > 1: + for i in range(col.dimension): + # TODO: see if column name exists in the attributes + col_name = '{}.{}'.format(col.name, i) + properties_df[col_name] = pd.Series(self._h5_group[col.name][:, i]) + else: + properties_df[col.name] = pd.Series(self._h5_group[col.name]) + + # Build a dataframe of parent node (node_id, gid, node_types, etc) + root_df = pd.DataFrame() + root_df['node_type_id'] = pd.Series(self.node_type_ids) + root_df['node_id'] = pd.Series(self.node_ids) + root_df['node_group_index'] = pd.Series(self._parent.igroup_indicies(self._parent_indicies)) # used as pivot + if self._parent.has_gids: + root_df['gid'] = self.gids + + # merge group props df with parent df + results_df = root_df.merge(properties_df, how='left', left_on='node_group_index', right_index=True) + results_df = results_df.drop('node_group_index', axis=1) + + # Build node_types dataframe and merge + node_types_df = self._parent.node_types_table.to_dataframe() + # remove properties that exist in the group + node_types_cols = [c.name for c in self._parent.node_types_table.columns if c not in self._group_columns] + node_types_df = node_types_df[node_types_cols] + + # TODO: consider caching these results + return results_df.merge(node_types_df, how='left', left_on='node_type_id', right_index=True) + + def filter(self, **filter_props): + """Filter all nodes in the group by key=value pairs. + + The filter specifications may apply to either node_type or group column properties. Currently at the moment + it only supports equivlency. An intersection (and operator) is done for every different filter pair. This will + produce a generator of all nodes matching the the filters. + + for node in filter(pop_name='VIp', depth=10.0): + assert(node['pop_name'] == 'VIp' and node['depth'] == 10.0) + + :param filter_props: keys and their values to filter nodes on. + :return: A generator that produces all valid nodes within the group with matching key==value pairs. + """ + # TODO: Integrate this with NodeSet. + self.build_indicies() + node_types_table = self._parent.node_types_table + node_type_filter = set(node_types_table.node_type_ids) # list of valid node_type_ids + type_filter = False + group_prop_filter = {} # list of 'prop_name'==prov_val for group datasets + group_filter = False + + # Build key==value lists + for filter_key, filter_val in filter_props.items(): + # TODO: Check if node_type_id is an input + if filter_key in self._group_columns: + # keep of list of group_popertiess to filter + group_prop_filter[filter_key] = filter_val + group_filter = True + + elif filter_key in node_types_table.columns: + # for node_types we just keep a list of all node_type_ids with matching key==value pairs + node_type_filter &= set(node_types_table.find(filter_key, filter_val)) + type_filter = True + + else: + # TODO: should we raise an exception? + # TODO: User logger + print('Could not find property {} in either group or types table. Ignoring.'.format(filter_key)) + + # iterate through all nodes, skipping ones that don't have matching key==value pairs + for indx in self._parent_indicies: + # TODO: Don't build the node until you filter out node_type_id + node = self._parent.get_row(indx) + if type_filter and node.node_type_id not in node_type_filter: + # confirm node_type_id is a correct one + continue + + if group_filter: + # Filter by group property values + # TODO: Allow group properties to handle lists + src_failed = True + for k, v in group_prop_filter.items(): + if node[k] != v: + break + else: + src_failed = False + + if src_failed: + continue + + yield node + + def __iter__(self): + self.build_indicies() + # Pass a list of indicies into the NodeSet, the NodeSet will take care of the iteration + return NodeSet(self._parent_indicies, self._parent).__iter__() + + +class EdgeGroup(Group): + def __init__(self, group_id, h5_group, parent): + super(EdgeGroup, self).__init__(group_id, h5_group, parent) + self._indicies_count = 0 # Used to keep track of number of indicies (since it contains multple ranges) + + self.__itr_index = 0 + self.__itr_range = [] + self.__itr_range_idx = 0 + self.__itr_range_max = 0 + + def build_indicies(self, force=False): + if self._parent_indicies_built and not force: + return + + # Saves indicies as a (potentially empty) list of ranges + # TODO: Turn index into generator, allows for cheaper iteration over the group + self._indicies_count, self._parent_indicies = self._parent.group_indicies(self.group_id, build_cache=False) + self._parent_indicies_built = True + + def to_dataframe(self): + raise NotImplementedError + + + def _get_parent_ds(self, parent_ds): + self.build_indicies() + ds_vals = np.zeros(self._indicies_count, dtype=parent_ds.dtype) + c_indx = 0 + for indx_range in self._parent_indicies: + indx_beg, indx_end = indx_range[0], indx_range[1] + n_indx = c_indx + (indx_end - indx_beg) + ds_vals[c_indx:n_indx] = parent_ds[indx_beg:indx_end] + c_indx = n_indx + + return ds_vals + + def src_node_ids(self): + return self._get_parent_ds(self.parent._source_node_id_ds) + + def trg_node_ids(self): + return self._get_parent_ds(self.parent._target_node_id_ds) + + def node_type_ids(self): + return self._get_parent_ds(self.parent._type_id_ds) + + def get_values(self, property_name, all_rows=False): + # TODO: Need to take into account if property_name is in the edge-types + if property_name not in self.columns: + raise KeyError + + if all_rows: + return np.array(self._h5_group[property_name]) + else: + self.build_indicies() + # Go through all ranges and build the return list + dataset = self._h5_group[property_name] + return_list = np.empty(self._indicies_count, self._h5_group[property_name].dtype) + i = 0 + for r_beg, r_end in self._parent_indicies: + r_len = r_end - r_beg + return_list[i:(i+r_len)] = dataset[r_beg:r_end] + i += r_len + return return_list + + def filter(self, **filter_props): + # TODO: I'm not sure If I want to do this? Need to check on a larger dataset than I currently have. + raise NotImplementedError + + def __iter__(self): + self.build_indicies() + # TODO: Implement using an EdgeSet + if len(self._parent_indicies) == 0: + self.__itr_max_range = 0 + self.__itr_range = [] + self.__itr_index = 0 + else: + # Stop at the largest range end (I'm not sure if the indicies are ordered, if we can make it ordered then + # in the future just use self_parent_indicies[-1][1] + self.__itr_range_max = len(self._parent_indicies) + self.__itr_range_idx = 0 + self.__itr_range = self._parent_indicies[0] + self.__itr_index = self.__itr_range[0] + + return self + + def next(self): + return self.__next__() + + def __next__(self): + if self.__itr_range_idx >= self.__itr_range_max: + raise StopIteration + + nxt_edge = self._parent.get_row(self.__itr_index) + self.__itr_index += 1 + if self.__itr_index >= self.__itr_range[1]: + # iterator has moved past the current range + self.__itr_range_idx += 1 + if self.__itr_range_idx < self.__itr_range_max: + # move the iterator onto next range + self.__itr_range = self._parent_indicies[self.__itr_range_idx] # update range + self.__itr_index = self.__itr_range[0] # update iterator to start and the beginning of new range + else: + self.__itr_range = [] + + return nxt_edge diff --git a/bmtk-vb/bmtk/utils/sonata/group.pyc b/bmtk-vb/bmtk/utils/sonata/group.pyc new file mode 100644 index 0000000..51067ca Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/group.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/node.py b/bmtk-vb/bmtk/utils/sonata/node.py new file mode 100644 index 0000000..4fa24ae --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/node.py @@ -0,0 +1,126 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + + +class NodeSet(object): + # TODO: Merge NodeSet and NodePopulation + def __init__(self, node_indicies, population, **parameters): + self._indicies = node_indicies + self._n_nodes = len(self._indicies) + self._population = population + + self.__itr_index = 0 + + @property + def node_ids(self): + return self._population.inode_ids(self._indicies) + + @property + def gids(self): + return self._population.igids(self._indicies) + + @property + def node_type_ids(self): + return self._population.inode_type_ids(self._indicies) + + ''' + @property + def node_types(self): + return [self._population._node_types_table[ntid] for ntid in self._node_type_ids] + ''' + + def get_properties(self, property_name): + raise NotImplementedError + + def __len__(self): + return self._n_nodes + + def __iter__(self): + self.__itr_index = 0 + return self + + def next(self): + return self.__next__() + + def __next__(self): + if self.__itr_index >= self._n_nodes: + raise StopIteration + + node = self._population.get_row(self._indicies[self.__itr_index]) + self.__itr_index += 1 + return node + + +class Node(object): + # TODO: include population name/reference + # TODO: make a dictionary (or preferably a collections.MutableMap + def __init__(self, node_id, node_type_id, node_types_props, group_id, group_props, dynamics_params, gid=None): + self._node_id = node_id + self._gid = gid + self._node_type_id = node_type_id + self._node_type_props = node_types_props + self._group_id = group_id + self._group_props = group_props + + @property + def node_id(self): + return self._node_id + + @property + def gid(self): + return self._gid + + @property + def group_id(self): + return self._group_id + + @property + def node_type_id(self): + return self._node_type_id + + @property + def group_props(self): + return self._group_props + + @property + def node_type_properties(self): + return self._node_type_props + + @property + def dynamics_params(self): + raise NotImplementedError + + def __getitem__(self, prop_key): + if prop_key in self._group_props: + return self._group_props[prop_key] + elif prop_key in self._node_type_props: + return self._node_type_props[prop_key] + elif prop_key == 'node_id': + return self.node_id + elif property == 'node_type_id': + return self.node_type_id + else: + raise KeyError('Unknown property {}'.format(prop_key)) + + def __contains__(self, prop_key): + return prop_key in self._group_props or prop_key in self._node_type_props diff --git a/bmtk-vb/bmtk/utils/sonata/node.pyc b/bmtk-vb/bmtk/utils/sonata/node.pyc new file mode 100644 index 0000000..c31b400 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/node.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/population.py b/bmtk-vb/bmtk/utils/sonata/population.py new file mode 100644 index 0000000..0d16064 --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/population.py @@ -0,0 +1,608 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import h5py +import numpy as np + +from .utils import range_itr, get_attribute_h5 +from .node import Node, NodeSet +from .edge import Edge, EdgeSet +from .group import NodeGroup, EdgeGroup + + +class Population(object): + def __init__(self, pop_name, pop_group, types_table): + self._pop_name = pop_name + self._pop_group = pop_group + self._types_table = types_table + self._nrows = 0 + + # For storing individual groups + self._group_map = {} # grp-id --> h5py.Group object + self._find_groups() + self._group_cache = {} # grp-id --> soneta.io.Group() object + + # Refrences to most of the population's primary dataset + self._type_id_ds = pop_group[self.type_ids_column] + self._group_id_ds = pop_group[self.group_id_column] + self._group_index_ds = pop_group[self.group_index_column] + + self._group_indicies = {} # grp-id --> list of rows indicies + self._group_indicies_cache_built = False + + @property + def name(self): + """name of current population""" + return self._pop_name + + @property + def group_ids(self): + """List of all group_ids belonging to population""" + return list(self._group_map.keys()) + + @property + def groups(self): + """Returns a list of sonata.Group objects""" + return [self.get_group(name) for name in self._group_map.keys()] + + @property + def types_table(self): + return self._types_table + + @property + def type_ids(self): + return np.array(self._type_id_ds) + + @property + def group_id_ds(self): + return self._group_id_ds + + @property + def group_index_ds(self): + return self._group_index_ds + + @property + def group_id_column(self): + raise NotImplementedError + + @property + def group_index_column(self): + raise NotImplementedError + + @property + def type_ids_column(self): + raise NotImplementedError + + def to_dataframe(self): + """Convert Population to dataframe""" + raise NotImplementedError + + def get_group(self, group_id): + if group_id in self._group_cache: + return self._group_cache[group_id] + else: + grp_h5 = self._group_map[group_id] + grp_obj = self._build_group(group_id, grp_h5) + self._group_cache[group_id] = grp_obj + return grp_obj + + def group_indicies(self, group_id, build_cache=False): + """Returns a list of all the population row index that maps onto the given group. + + Used for iterating or searching within a Group + + :param group_id: id of a given group + :param build_cache: Will cache indicies for all groups. Will be faster if making multiple calls but requires + more memory (default False) + :return: A (possibly empty) list of row indicies (non-contiguous, but unique) + """ + if self._group_indicies_cache_built: + return self._group_indicies.get(group_id, []) + + else: + tmp_index = pd.DataFrame() + # TODO: Need to check the memory overhead, especially for edges. See if an iterative search is just as fast + tmp_index['grp_id'] = pd.Series(self._group_id_ds[:], dtype=self._group_id_ds.dtype) + tmp_index['row_indx'] = pd.Series(range_itr(self._nrows), dtype=np.uint32) + if build_cache: + # save all indicies as arrays + self._group_indicies = {grp_id: np.array(subset['row_indx']) + for grp_id, subset in tmp_index.groupby(by='grp_id')} + self._group_indicies_cache_built = True + return self._group_indicies.get(group_id, []) + else: + # TODO: Manually del tmp_index to clear out the memory? + tmp_index = tmp_index[tmp_index['grp_id'] == group_id] + return np.array(tmp_index['row_indx']) + + def igroup_ids(self, row_indicies): + return self._group_id_ds[list(row_indicies)] + + def igroup_indicies(self, row_indicies): + return self._group_index_ds[list(row_indicies)] + + def _find_groups(self): + """Create a map between group-id and h5py.Group reference""" + for grp_key, grp_h5 in self._pop_group.items(): + if grp_key.isdigit(): + grp_id = int(grp_key) + self._group_map[grp_id] = grp_h5 + else: + # TODO: Should we put a warning if an unrecognized group exists? + pass + + def _build_group(self, group_id, group_h5): + raise NotImplementedError + + def __len__(self): + return self._nrows + + +class NodePopulation(Population): + def __init__(self, pop_name, pop_group, node_types_tables): + super(NodePopulation, self).__init__(pop_name=pop_name, pop_group=pop_group, types_table=node_types_tables) + + # TODO: node_ids can be implicit + self._node_id_ds = pop_group['node_id'] + self._nrows = len(self._node_id_ds) + + # TODO: This isn't necessary if only using iterator. Delay building index until get_node() is called. + self._index_nid2row = None # A lookup from node_id --> h5 row number + self._node_id_index_built = False + self._build_node_id_index() + + # indicies for gid <--> node_id map + self._has_gids = False + self._index_gid2row = None # gid --> row (for searching by gid) + self._index_row2gid = None # row --> gid (for iterator or searching by node-id) + self._gid_lookup_fnc = lambda _: None # for looking up gid by row, use fnc pointer rather than conditional + + self.__itr_index = 0 # for iterator + + @property + def group_id_column(self): + return 'node_group_id' + + @property + def group_index_column(self): + return 'node_group_index' + + @property + def type_ids_column(self): + return 'node_type_id' + + @property + def has_gids(self): + return self._has_gids + + @property + def node_ids(self): + return np.array(self._node_id_ds) + + @property + def gids(self): + if self.has_gids: + return np.array(self._index_gid2row.index) + else: + return None + + @property + def node_types_table(self): + return self._types_table + + @property + def index_column_name(self): + return 'node_id' + + @property + def node_types_table(self): + return self.types_table + + def add_gids(self, gid_map_df, force=False): + if self.has_gids and not force: + # TODO: not sure if it's best to return an exception or just continue on in silence? + raise Exception('Node population {} already has gids mapped onto node-ids.'.format(self.name)) + # return + + # Create map from gid --> node_id --> row # + self._build_node_id_index() + tmp_df = pd.DataFrame() + tmp_df['row_id'] = self._index_nid2row.index + tmp_df['node_id'] = self._index_nid2row + gid_map_df = gid_map_df.merge(tmp_df, how='left', left_on='node_id', right_on='node_id') + gid_map_df = gid_map_df.drop(['node_id', 'population'], axis=1) + self._index_gid2row = gid_map_df.set_index('gid') + self._index_row2gid = gid_map_df.set_index('row_id') + self._gid_lookup_fnc = lambda row_indx: self._index_row2gid.loc[row_indx]['gid'] + self._has_gids = True + + def to_dataframe(self): + raise NotImplementedError + + def get_row(self, row_indx): + # TODO: Use helper function so we don't have to lookup gid/node_id twice + # Note: I'm not cacheing the nodes for memory purposes, but it might be beneificial too. + node_id = self._node_id_ds[row_indx] + node_type_id = self._type_id_ds[row_indx] + node_group_id = self._group_id_ds[row_indx] + node_group_index = self._group_index_ds[row_indx] + + node_type_props = self.node_types_table[node_type_id] + node_group_props = self.get_group(node_group_id)[node_group_index] + node_gid = self._gid_lookup_fnc(row_indx) + + return Node(node_id, node_type_id, node_type_props, node_group_id, node_group_props, None, gid=node_gid) + + def get_rows(self, row_indicies): + """Returns a set of all nodes based on list of row indicies. + + Warning: currently due to the use of h5py, the list must be ordered and cannot contain duplicates. + + :param row_indicies: A list of row indicies + :return: An iterable NodeSet of nodes in the specified indicies + """ + # TODO: Check that row_indicies is unsigned and the max (which will be the last value) < n_rows + # TODO: Check order and check for duplicates in list + return NodeSet(row_indicies, self) + + def inode_ids(self, row_indicies): + # You get errors if row_indicies is a numpy array or panda series so convert to python list + # TODO: list conversion can be expensive, see if h5py will work with np arrays natively. + return self._node_id_ds[list(row_indicies)] + + def igids(self, row_indicies): + gids = self._gid_lookup_fnc(row_indicies) + if gids is not None: + gids = np.array(gids) + return gids + + def inode_type_ids(self, row_indicies): + # self._node_type_id_ds + return self._type_id_ds[list(row_indicies)] + + def get_node_id(self, node_id): + row_indx = self._index_nid2row.iloc[node_id] + return self.get_row(row_indx) + + def get_gid(self, gid): + # assert(self.has_gids) + row_indx = self._index_gid2row.iloc[gid]['row_id'] + return self.get_row(row_indx) + + def filter(self, **filter_props): + for grp in self.groups: + for node in grp.filter(**filter_props): + yield node + + def _build_node_id_index(self, force=False): + if self._node_id_index_built and not force: + return + + self._index_nid2row = pd.Series(range_itr(self._nrows), index=self._node_id_ds, dtype=self._node_id_ds.dtype) + self._node_id_index_built = True + + def _build_group(self, group_id, group_h5): + return NodeGroup(group_id, group_h5, self) + + def __iter__(self): + self.__itr_index = 0 + return self + + def next(self): + return self.__next__() + + def __next__(self): + if self.__itr_index >= self._nrows: + raise StopIteration + + nxt_node = self.get_row(self.__itr_index) + self.__itr_index += 1 + return nxt_node + + def __getitem__(self, item): + if isinstance(item, slice): + # TODO: Check + start = item.start if item.start is not None else 0 + stop = item.stop if item.stop is not None else self._nrows + row_indicies = range_itr(start, stop, item.step) + return NodeSet(row_indicies, self) + + elif isinstance(item, int): + return self.get_row(item) + + elif isinstance(item, list): + return NodeSet(item) + else: + print('Unable to get item using {}.'.format(type(item))) + + +class EdgePopulation(Population): + class __IndexStruct(object): + """Class sto store indicies subgroup""" + # TODO: Use collections.namedtuple + def __init__(self, lookup_table, edge_table): + self.lookup_table = lookup_table + self.edge_table = edge_table + + def __init__(self, pop_name, pop_group, edge_types_tables): + super(EdgePopulation, self).__init__(pop_name=pop_name, pop_group=pop_group, types_table=edge_types_tables) + + # keep reference to source and target datasets + self._source_node_id_ds = pop_group['source_node_id'] + self._target_node_id_ds = pop_group['target_node_id'] + + self._nrows = len(self._source_node_id_ds) + + # TODO: Throw an error/warning if missing + self._source_population = EdgePopulation.get_source_population(pop_group) + self._target_population = EdgePopulation.get_target_population(pop_group) + + self.__itr_index = 0 + + # TODO: use a function pointer for get_index so it doesn't have to run a conditional every time + # TODO: add property and/or property so user can determine what indicies exists. + self._targets_index = None + self._has_target_index = False + self._sources_index = None + self._has_source_index = False + self.build_indicies() + + @property + def group_id_column(self): + return 'edge_group_id' + + @property + def group_index_column(self): + return 'edge_group_index' + + @property + def type_ids_column(self): + return 'edge_type_id' + + @property + def source_population(self): + return self._source_population + + @property + def target_population(self): + return self._target_population + + @staticmethod + def get_source_population(pop_group_h5): + return get_attribute_h5(pop_group_h5['source_node_id'], 'node_population', None) + + @staticmethod + def get_target_population(pop_group_h5): + return get_attribute_h5(pop_group_h5['target_node_id'], 'node_population', None) + + @property + def edge_types_table(self): + return self._types_table + + def to_dataframe(self): + raise NotImplementedError + + def build_indicies(self): + if 'indicies' in self._pop_group: + indicies_grp = self._pop_group['indicies'] + for index_name, index_grp in indicies_grp.items(): + # TODO: Let __IndexStruct build the indicies + # Make sure subgroup has the correct datasets + if not isinstance(index_grp, h5py.Group): + continue + + if 'node_id_to_range' not in index_grp: + # TODO: make this more general, i.e 'id_to_range' thus we can index on gids, edge_types, etc + # TODO: Check that there are two columns in dataset + raise Exception('index {} in {} edges is missing column {}.'.format(index_name, self.name, + 'node_id_to_range')) + if 'range_to_edge_id' not in index_grp: + raise Exception('index {} in {} edges is missing column {}.'.format(index_name, self.name, + 'range_to_edge_id')) + + # Cache the index + targets_lookup = index_grp['node_id_to_range'] + edges_range = index_grp['range_to_edge_id'] + index_obj = self.__IndexStruct(targets_lookup, edges_range) + + # Determine the type of index + if index_name == 'source_to_target': + self._sources_index = index_obj + self._has_source_index = True + elif index_name == 'target_to_source': + self._targets_index = index_obj + self._has_target_index = True + else: + # TODO: Need to send this to a logger rather than stdout + print('Unrecognized index {}. Ignoring.'.format(index_name)) + + def _build_group(self, group_id, group_h5): + return EdgeGroup(group_id, group_h5, self) + + def group_indicies(self, group_id, build_cache=False): + # For nodes it's safe to just keep a list of all indicies that map onto a given group. For edges bc there are + # many more rows (and typically a lot less groups), We want to build an index like for source/target ids + if len(self._group_map) == 1: + return len(self), [[0, len(self)]] + + grp_indicies = super(EdgePopulation, self).group_indicies(group_id, build_cache=False) + if len(grp_indicies) == 0: + # Return an index with no ranges + return 0, [] + + # cluster into ranges. Naively implement, there is probably a faster way to cluster an ordered array! + range_beg = grp_indicies[0] + ranges = [] + for i in range_itr(1, len(grp_indicies)): + if (grp_indicies[i-1]+1) != grp_indicies[i]: + ranges.append([range_beg, grp_indicies[i-1]+1]) + range_beg = grp_indicies[i] + ranges.append([range_beg, grp_indicies[-1]+1]) + return len(grp_indicies), np.array(ranges, dtype=np.uint32) + + ''' + def _get_target_index(self): + # TODO: Do only once + if self._targets_index is not None: + return self._targets_index + + if 'incidies' in self._pop_group: + if 'target_to_source' in self._pop_group['incidies']: + targets_lookup = self._pop_group['incidies']['target_to_source']['node_id_to_range'] + edges_range = self._pop_group['incidies']['target_to_source']['range_to_edge_id'] + self._targets_index = self.__IndexStruct(targets_lookup, edges_range) + return self._targets_index + + # TODO: What to do if index doesn't exist? + raise NotImplementedError + ''' + + def get_row(self, index): + src_node = self._source_node_id_ds[index] + trg_node = self._target_node_id_ds[index] + edge_type_id = self._type_id_ds[index] + edge_types_props = self.edge_types_table[edge_type_id] + + edge_group_id = self._group_id_ds[index] + edge_group_index = self._group_index_ds[index] + edge_group_props = self.get_group(edge_group_id)[edge_group_index] + return Edge(trg_node_id=trg_node, src_node_id=src_node, source_pop=self.source_population, + target_pop=self.target_population, group_id = edge_group_id, + group_props=edge_group_props, edge_types_props=edge_types_props) + + def filter(self, **filter_props): + selected_edge_types = set(self.edge_types_table.edge_type_ids) + types_filter = False # Do we need to filter results by edge_type_id + if 'edge_type_id' in filter_props: + # TODO: Make sure the edge_type_id is valid + selected_edge_types = set([filter_props['edge_type_id']]) + del filter_props['edge_type_id'] + types_filter = True + + selected_groups = set(self._group_map.keys()) # list of grp_id's that will be used + group_prop_filter = {} # list of actual query statements + group_filter = False # do we need to filter results by group_id + + # Go through filter key==value pairs, create filters for groups and edge_types + for filter_key, filter_val in filter_props.items(): + # Find out what groups, if any, the column should search in. + group_query = False # If it's querying a group property don't look in edge_types + types_query = False + for grp_id, grp_h5 in self._group_map.items(): + if filter_key in grp_h5: + # TODO: Need to check the dtype's match + selected_groups &= set([grp_id]) + group_prop_filter[filter_key] = filter_val + group_query = True + group_filter = True + + if (not group_query) and filter_key in self.edge_types_table.columns: + # Presearch the edge types and get only those edge_type_ids which match key==val + selected_edge_types &= set(self.edge_types_table.find(filter_key, filter_val)) + types_filter = True + types_query = True + + if not (group_query or types_query): + # Property key neither exists in a group or the edge_types_table + raise Exception('Could not find property {}'.format(filter_key)) + + # Iterate through all nodes, only returning those that match the filter + for indx in range_itr(self._nrows): + # Filter by edge_type_id + if types_filter: + # TODO: Invert the selected_edge_types, it will be faster to fail immeditely than search the entire list + if self._type_id_ds[indx] not in selected_edge_types: + continue + + # Filter by group properties + if group_filter: + # TODO: Invert group search + grp_id = self._group_id_ds[indx] + if grp_id not in selected_groups: + continue + + grp_index = self._group_index_ds[indx] + search_failed = True + for prop_key, prop_val in group_prop_filter.items(): + if prop_val != self._group_map[grp_id][prop_key][grp_index]: + break + else: + search_failed = False + + if search_failed: + continue + + yield self.get_row(indx) + + def get_target(self, target_node_id): + # TODO: Raise an exception, or call find() and log a warning that the index is not available + # TODO: check validity of target_node_id (non-negative integer and smaller than index range) + assert(self._has_target_index) + return self._get_index(self._targets_index, target_node_id) + + def get_targets(self, target_node_ids): + # TODO: verify input is iterable + assert(self._has_target_index) + trg_index = self._targets_index + for trg_id in target_node_ids: + for edge in self._get_index(trg_index, trg_id): + yield edge + + def get_source(self, source_node_id): + assert(self._has_source_index) + return self._get_index(self._sources_index, source_node_id) + + def get_sources(self, source_node_ids): + assert(self._has_target_index) + trg_index = self._sources_index + for src_id in source_node_ids: + for edge in self._get_index(trg_index, src_id): + yield edge + + def _get_index(self, index_struct, lookup_id): + # TODO: Use a EdgeSet instead + if lookup_id >= len(index_struct.lookup_table): + # TODO: Store length in index + raise StopIteration + + edges_table = index_struct.edge_table + lookup_beg, lookup_end = index_struct.lookup_table[lookup_id] + for i in range_itr(lookup_beg, lookup_end): + edge_indx_beg, edge_indx_end = edges_table[i] + for edge_indx in range_itr(edge_indx_beg, edge_indx_end): + yield self.get_row(edge_indx) + + def __iter__(self): + self.__itr_index = 0 + return self + + def __next__(self): + if self.__itr_index >= self._nrows: + raise StopIteration + + next_edge = self.get_row(self.__itr_index) + self.__itr_index += 1 + return next_edge + + def next(self): + return self.__next__() diff --git a/bmtk-vb/bmtk/utils/sonata/population.pyc b/bmtk-vb/bmtk/utils/sonata/population.pyc new file mode 100644 index 0000000..3c668a3 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/population.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/types_table.py b/bmtk-vb/bmtk/utils/sonata/types_table.py new file mode 100644 index 0000000..375d332 --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/types_table.py @@ -0,0 +1,220 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd +import numbers +import math + +from .column_property import ColumnProperty + + +def remove_nans(types_dict): + """Convert nan values to None in type row (dict)""" + for k, v in types_dict.items(): + if isinstance(v, numbers.Real) and math.isnan(v): + types_dict[k] = None + + +class TypesTable(object): + def __init__(self, parent=None): + self._parent = None # Used to keep track of FileRoot object this table belongs to + self._columns = {} + self._index_typeid2df = {} # map from node(edge)_type_id --> csv Row + self._column_map = {} # TODO: Use defaultdict + # self._id_table = self.IDSearcher(self) + self._dataframes = [] # list of all pandas dataframe (types tables) + + self._cached_node_types = {} + self._df_cache = None + + self._itr_indx = 0 + self._itr_end = 0 + + @property + def index_column_name(self): + raise NotImplementedError + + @property + def type_ids(self): + return self._index_typeid2df.keys() + + @property + def columns(self): + return list(self._columns.values()) + + def column(self, column_name): + return self._columns[column_name] + + def add_table(self, nt_df): + # TODO: Just saving the entire dataframe currently because we don't expect the node-types table to get too large + # (few hundred rows at the most). If that changes consider to loading the csv until explicity called by user. + self._dataframes.append(nt_df) + + # Check that the type ids are unique and build id --> dataframe map + nt_df.set_index(keys=self.index_column_name, inplace=True) + for type_id in list(nt_df.index): + if type_id in self._index_typeid2df: + raise Exception('Multiple {}s with value {}.'.format(self.index_column_name, type_id)) + self._index_typeid2df[type_id] = nt_df + + columns = ColumnProperty.from_csv(nt_df) + for col in columns: + self._columns[col.name] = col + if col in self._column_map: + # TODO: make sure dtype matches. Bad things can happen if the same col has heterogeneous dtypes + self._column_map[col.name].append(nt_df) + else: + self._column_map[col.name] = [nt_df] + + def find(self, column_key, column_val, silent=False): + """Returns a list of type_ids that contain column property column_key==column_val + + :param column_key: Name of column to search + :param column_val: Value of column to select for + :param silent: Set to true to prevent KeyError if column_key doesn't exist (default=False) + :return: A (potentially empty) list of type_ids + """ + if not silent and column_key not in self.columns: + raise KeyError + + is_list = isinstance(column_val, list) + selected_ids = [] # running list of valid type-ids + column_dtype = self.column(column_key).dtype + for df in self._column_map[column_key]: + # if a csv column has all NONE values, pandas will load the values as float(NaN)'s. Thus for str/object + # columns we need to check dtype otherwise we'll get an invalid comparisson. + if df[column_key].dtype == column_dtype: + if is_list: + indicies = df[df[column_key].isin(column_val)].index + else: + indicies = df[df[column_key] == column_val].index + + if len(indicies) > 0: + selected_ids.extend(list(indicies)) + + return selected_ids + + def to_dataframe(self, cache=False): + if self._df_cache is not None: + return self._df_cache + + if len(self._dataframes) == 0: + return None + elif len(self._dataframes) == 1: + merged_table = self._dataframes[0] + else: + # merge all dataframes together + merged_table = self._dataframes[0].reset_index() # TODO: just merge on the indicies rather than reset + for df in self._dataframes[1:]: + try: + merged_table = merged_table.merge(df.reset_index(), how='outer') + except ValueError as ve: + # There is a potential issue if merging where one dtype is different from another (ex, if all + # model_template's are NONE pandas will load column as float64). First solution is to find columns + # that differ and upcast columns as object's (TODO: look for better solution) + right_df = df.reset_index() + for col in set(merged_table.columns) & set(right_df.columns): + # find all shared columns whose dtype differs + if merged_table[col].dtype != right_df[col].dtype: + # change column(s) dtype to object + merged_table[col] = merged_table[col] if merged_table[col].dtype == object \ + else merged_table[col].astype(object) + right_df[col] = right_df[col] if right_df[col].dtype == object \ + else right_df[col].astype(object) + + merged_table = merged_table.merge(right_df, how='outer') + + merged_table.set_index(self.index_column_name, inplace=True) + + if cache: + self._df_cache = merged_table + + return merged_table + + def __iter__(self): + self._itr_indx = 0 + self._itr_end = len(self.type_ids) + return self + + def next(self): + return self.__next__() + + def __next__(self): + if self._itr_indx >= self._itr_end: + raise StopIteration + + ntid = self.type_ids[self._itr_indx] + self._itr_indx += 1 + return self[ntid] + + def __getitem__(self, type_id): + if isinstance(type_id, tuple): + return [self[ntid] for ntid in type_id] + + elif isinstance(type_id, numbers.Integral): + if type_id not in self._index_typeid2df: + raise Exception('{} {} not found'.format(self.index_column_name, type_id)) + + if type_id in self._cached_node_types: + return self._cached_node_types[type_id] + else: + nt_dict = self._index_typeid2df[type_id].loc[type_id].to_dict() + # TODO: consider just removing key from dict if value is None/NaN + remove_nans(nt_dict) # pd turns None into np.nan's. Temp soln is to just convert them back. + self._cached_node_types[type_id] = nt_dict + self._cached_node_types[type_id][self.index_column_name] = type_id # include node/edge_type_id + return nt_dict + else: + raise Exception('Unsupported search on node-type-id') + + def __contains__(self, type_id): + return type_id in self._index_typeid2df + + def __repr__(self): + return repr(self.to_dataframe()) + + +class NodeTypesTable(TypesTable): + def __init__(self, parent=None): + super(NodeTypesTable, self).__init__(parent) + + @property + def index_column_name(self): + return 'node_type_id' + + @property + def node_type_ids(self): + return self.type_ids + + +class EdgeTypesTable(TypesTable): + def __init__(self, parent=None): + super(EdgeTypesTable, self).__init__(parent) + + @property + def index_column_name(self): + return 'edge_type_id' + + @property + def edge_type_ids(self): + return self.type_ids diff --git a/bmtk-vb/bmtk/utils/sonata/types_table.pyc b/bmtk-vb/bmtk/utils/sonata/types_table.pyc new file mode 100644 index 0000000..a242e6c Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/types_table.pyc differ diff --git a/bmtk-vb/bmtk/utils/sonata/utils.py b/bmtk-vb/bmtk/utils/sonata/utils.py new file mode 100644 index 0000000..953572d --- /dev/null +++ b/bmtk-vb/bmtk/utils/sonata/utils.py @@ -0,0 +1,116 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import sys + +import h5py +import pandas as pd +import numpy as np + +MAGIC_ATTR = 'magic' +MAGIC_VAL = 0x0A7A +VERSION_ATTR = 'version' +VERSION_NA = 'NA' +VERSION_CURRENT = '0.1' + +try: + ver_split = VERSION_CURRENT.split('.') + VERSION_MAJOR = ver_split[0] + VERSION_MINOR = ver_split[1] +except (IndexError, AttributeError) as err: + VERSION_MAJOR = 0 + VERSION_MINOR = 1 + + +def listify(files): + # TODO: change this to include any iterable datastructures (sets, panda sequences, etc) + if not isinstance(files, (list, tuple)): + return [files] + else: + return files + + +def load_h5(h5file, mode='r'): + # TODO: Allow for h5py.Group also + if isinstance(h5file, h5py.File): + return h5file + + return h5py.File(h5file, mode) + + +def load_csv(csvfile): + # TODO: make the separator more flexible + if isinstance(csvfile, pd.DataFrame): + return csvfile + + # TODO: check if it is csv object and convert to a pd dataframe + return pd.read_csv(csvfile, sep=' ', na_values='NONE') + + +def get_attribute_h5(h5obj, attribut_name, default=None): + val = h5obj.attrs.get(attribut_name, default) + if using_py3 and isinstance(val, bytes): + # There is an but with h5py returning unicode/str based attributes as bytes + val = val.decode() + + return val + + +def check_magic(hdf5_file): + """Check the magic attribute exists according to the sonata format""" + h5_file_obj = load_h5(hdf5_file) + if MAGIC_ATTR not in h5_file_obj.attrs: + raise Exception('File {} missing top-level \"{}\" attribute.'.format(h5_file_obj.filename, MAGIC_ATTR)) + elif np.uint32(get_attribute_h5(hdf5_file, MAGIC_ATTR)) != MAGIC_VAL: + raise Exception('File {} has unexpected magic value (expected {})'.format(h5_file_obj.filename, MAGIC_VAL)) + + return True + + +def get_version(hdf5_file): + h5_file_obj = load_h5(hdf5_file) + if VERSION_ATTR not in h5_file_obj.attrs: + return VERSION_NA + + else: + version_val = get_attribute_h5(h5_file_obj, VERSION_ATTR) + version_str = str(version_val[0]) + for ver_sub in version_val[1:]: + version_str += '.{}'.format(ver_sub) + return version_str + + +def add_hdf5_magic(hdf5_handle): + hdf5_handle['/'].attrs['magic'] = np.uint32(0x0A7A) + + +def add_hdf5_version(hdf5_handle): + hdf5_handle['/'].attrs['version'] = [np.uint32(VERSION_MAJOR), np.uint32(VERSION_MINOR)] + + +if sys.version_info[0] == 3: + using_py3 = True + range_itr = range +else: + using_py3 = False + range_itr = xrange diff --git a/bmtk-vb/bmtk/utils/sonata/utils.pyc b/bmtk-vb/bmtk/utils/sonata/utils.pyc new file mode 100644 index 0000000..5a44079 Binary files /dev/null and b/bmtk-vb/bmtk/utils/sonata/utils.pyc differ diff --git a/bmtk-vb/bmtk/utils/spike_trains/__init__.py b/bmtk-vb/bmtk/utils/spike_trains/__init__.py new file mode 100644 index 0000000..7fdcfe6 --- /dev/null +++ b/bmtk-vb/bmtk/utils/spike_trains/__init__.py @@ -0,0 +1,24 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .spikes_csv import SpikesGenerator +from .spikes_file import SpikesFile diff --git a/bmtk-vb/bmtk/utils/spike_trains/spikes_csv.py b/bmtk-vb/bmtk/utils/spike_trains/spikes_csv.py new file mode 100644 index 0000000..64651d0 --- /dev/null +++ b/bmtk-vb/bmtk/utils/spike_trains/spikes_csv.py @@ -0,0 +1,94 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import numpy as np +import csv +import h5py +from six import string_types + +from bmtk.utils import sonata + +class Rates(object): + def __iter__(self): + return self + + def next(self): + raise StopIteration + + +class NormalRates(Rates): + def __init__(self, t_start, t_end, rate_mu, rate_sigma=5.0): + self.t_start = t_start + self.t_end = t_end + self.period_mu = 1.0/float(rate_mu) + self.period_sigma = 1.0/float(rate_mu + rate_sigma) + + self._current_t = t_start + + def next(self): + self._current_t += abs(np.random.normal(self.period_mu, self.period_sigma)) + if self._current_t > self.t_end: + self._current_t = self.t_start + raise StopIteration + else: + return self._current_t + + +class SpikesGenerator(object): + def __init__(self, nodes, populations=None, t_min=0, t_max=1.0): + self._t_min = t_min + self._t_max = t_max + + if isinstance(nodes, string_types): + nodes_h5 = h5py.File(nodes, 'r') + nodes_grp = nodes_h5['/nodes'] + if populations is None: + populations = nodes_grp.keys() + + # TODO: Need a way to Use sonata library without having to use node-types + nodes = [] + for node_pop in populations: + nodes.extend(nodes_grp[node_pop]['node_id']) + + self._nodes = {n: Rates() for n in nodes} + + def set_rate(self, firing_rate, gids=None, t_start=None, t_end=None): + t_start = t_start or self._t_min + assert(t_start >= self._t_min) + + t_end = t_end or self._t_max + assert(t_end <= self._t_max) + + gids = gids or self._nodes.keys() + for gid in gids: + self._nodes[gid] = NormalRates(t_start, t_end, firing_rate) + + def save_csv(self, csv_file_name, in_ms=False): + conv = 1000.0 if in_ms else 1.0 + + with open(csv_file_name, 'w') as csv_file: + csv_writer = csv.writer(csv_file, delimiter=' ') + csv_writer.writerow(['gid', 'spike-times']) + for gid, rate_gen in self._nodes.items(): + csv_writer.writerow([gid, ','.join(str(r*conv) for r in rate_gen)]) + diff --git a/bmtk-vb/bmtk/utils/spike_trains/spikes_file.py b/bmtk-vb/bmtk/utils/spike_trains/spikes_file.py new file mode 100644 index 0000000..fd4577a --- /dev/null +++ b/bmtk-vb/bmtk/utils/spike_trains/spikes_file.py @@ -0,0 +1,174 @@ +import os +from collections import Counter +import numpy as np +import pandas as pd +import h5py + + +class SpikesFile(object): + _file_adaptors = {} + + def __init__(self, filename, mode='r', filetype=None, **params): + self._ftype = self._get_file_type(filename, filetype) + self._adaptor = SpikesFile._file_adaptors[self._ftype](filename, **params) + + def _get_file_type(self, filename, filetype): + if filetype is not None: + if filetype not in self._file_adaptors: + raise Exception('Unknown spikes file type {}'.format(filetype)) + else: + return filetype + + else: + for ft, adaptor_cls in self._file_adaptors.items(): + if adaptor_cls.is_type(filename): + return ft + + raise Exception('Unable to determine file type for {}.'.format(filename)) + + def _get_spikes_sort(self, spikes_list, t_window=None): + if t_window is not None: + spikes_list.sort() + return [s for s in spikes_list if t_window[0] <= s <= t_window[1]] + else: + spikes_list.sort() + return spikes_list + + @property + def gids(self): + """Return a list of all gids""" + return self._adaptor.gids + + def to_dataframe(self): + return self._adaptor.to_dataframe() + + def get_spikes(self, gid, time_window=None): + return self._adaptor.get_spikes(gid, time_window=None) + + def __eq__(self, other): + return self.is_equal(other) + + def is_equal(self, other, err=0.00001, time_window=None): + # check that gids matches + if set(self.gids) != set(other.gids): + return False + + for gid in self.gids: + spikes_self = self._get_spikes_sort(self.get_spikes(gid), time_window) + spikes_other = self._get_spikes_sort(other.get_spikes(gid), time_window) + + if len(spikes_other) != len(spikes_self): + return False + + for s0, s1 in zip(spikes_self, spikes_other): + if abs(s0 - s1) > err: + return False + return True + + @classmethod + def register_adaptor(cls, adaptor_cls): + cls._file_adaptors[adaptor_cls.ext_name()] = adaptor_cls + return adaptor_cls + + +class SpikesFileAdaptor(object): + def __init__(self, filename): + self._filename = filename + + @property + def gids(self): + raise NotImplementedError + + def to_dataframe(self): + raise NotImplementedError + + def get_spikes(self, gid, time_window=None): + raise NotImplementedError + + @staticmethod + def is_type(filename): + raise NotImplementedError + + @staticmethod + def ext_name(): + raise NotImplementedError + + +@SpikesFile.register_adaptor +class SpikesFileH5(SpikesFileAdaptor): + def __init__(self, filename, **params): + super(SpikesFileH5, self).__init__(filename) + self._h5_handle = h5py.File(self._filename, 'r') + self._sort_order = self._h5_handle['/spikes'].attrs.get('sorting', None) + self._gid_ds = self._h5_handle['/spikes/gids'] + self._timestamps_ds = self._h5_handle['/spikes/timestamps'] + + self._indexed = False + self._gid_indicies = {} + self._build_indicies() + + def _build_indicies(self): + if self._sort_order == 'by_gid': + indx_beg = 0 + c_gid = self._gid_ds[0] + for indx, gid in enumerate(self._gid_ds): + if gid != c_gid: + self._gid_indicies[c_gid] = slice(indx_beg, indx) + c_gid = gid + indx_beg = indx + self._gid_indicies[c_gid] = slice(indx_beg, indx+1) + self._indexed = True + else: + self._gid_indicies = {int(gid): [] for gid in np.unique(self._gid_ds)} + for indx, gid in enumerate(self._gid_ds): + self._gid_indicies[gid].append(indx) + self._indexed = True + + @property + def gids(self): + return list(self._gid_indicies.keys()) + + def to_dataframe(self): + return pd.DataFrame({'timestamps': self._timestamps_ds, 'gids': self._gid_ds}) + + def get_spikes(self, gid, time_window=None): + return self._timestamps_ds[self._gid_indicies[gid]] + + @staticmethod + def is_type(filename): + _, fext = os.path.splitext(filename) + fext = fext.lower() + return fext == '.h5' or fext == '.hdf' or fext == '.hdf5' + + @staticmethod + def ext_name(): + return 'h5' + + +@SpikesFile.register_adaptor +class SpikesFileCSV(SpikesFileAdaptor): + def __init__(self, filename, **params): + super(SpikesFileCSV, self).__init__(filename) + self._spikes_df = pd.read_csv(self._filename, names=['timestamps', 'gids'], sep=' ') + + @property + def gids(self): + return list(self._spikes_df.gids.unique()) + + def to_dataframe(self): + return self._spikes_df + + def get_spikes(self, gid, time_window=None): + return np.array(self._spikes_df[self._spikes_df.gids == gid].timestamps) + + @staticmethod + def is_type(filename): + _, fext = os.path.splitext(filename) + fext = fext.lower() + return fext == '.csv' or fext == '.txt' + + @staticmethod + def ext_name(): + return 'csv' + + diff --git a/bmtk-vb/build/lib/bmtk/__init__.py b/bmtk-vb/build/lib/bmtk/__init__.py new file mode 100644 index 0000000..f4f772b --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/__init__.py @@ -0,0 +1,23 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +__version__ = '0.0.6' diff --git a/bmtk-vb/build/lib/bmtk/analyzer/__init__.py b/bmtk-vb/build/lib/bmtk/analyzer/__init__.py new file mode 100644 index 0000000..7b04c40 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/analyzer/__init__.py @@ -0,0 +1,189 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +from six import string_types +import h5py +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np + +import bmtk.simulator.utils.config as cfg + + +def _get_config(config): + if isinstance(config, string_types): + return cfg.from_json(config) + elif isinstance(config, dict): + return config + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(config, type(config))) + +def plot_potential(cell_vars_h5=None, config_file=None, gids=None, show_plot=True, save=False): + if (cell_vars_h5 or config_file) is None: + raise Exception('Please specify a cell_vars hdf5 file or a simulation config.') + + if cell_vars_h5 is not None: + plot_potential_hdf5(cell_vars_h5, gids=gids, show_plot=show_plot, + save_as='sim_potential.jpg' if save else None) + + else: + # load the json file or object + if isinstance(config_file, string_types): + config = cfg.from_json(config_file) + elif isinstance(config_file, dict): + config = config_file + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(config_file, type(config_file))) + + gid_list = gids or config['node_id_selections']['save_cell_vars'] + for gid in gid_list: + save_as = '{}_v.jpg'.format(gid) if save else None + title = 'cell gid {}'.format(gid) + var_h5 = os.path.join(config['output']['cell_vars_dir'], '{}.h5'.format(gid)) + plot_potential_hdf5(var_h5, title, show_plot, save_as) + + +def plot_potential_hdf5(cell_vars_h5, gids, title='membrane potential', show_plot=True, save_as=None): + data_h5 = h5py.File(cell_vars_h5, 'r') + membrane_trace = data_h5['data'] + + time_ds = data_h5['/mapping/time'] + tstart = time_ds[0] + tstop = time_ds[1] + x_axis = np.linspace(tstart, tstop, len(membrane_trace), endpoint=True) + + gids_ds = data_h5['/mapping/gids'] + index_ds = data_h5['/mapping/index_pointer'] + index_lookup = {gids_ds[i]: (index_ds[i], index_ds[i+1]) for i in range(len(gids_ds))} + gids = gids_ds.keys() if gids_ds is None else gids + for gid in gids: + var_indx = index_lookup[gid][0] + plt.plot(x_axis, membrane_trace[:, var_indx], label=gid) + + plt.xlabel('time (ms)') + plt.ylabel('membrane (mV)') + plt.title(title) + plt.legend(markerscale=2, scatterpoints=1) + + if save_as is not None: + plt.savefig(save_as) + + if show_plot: + plt.show() + + +def plot_calcium(cell_vars_h5=None, config_file=None, gids=None, show_plot=True, save=False): + if (cell_vars_h5 or config_file) is None: + raise Exception('Please specify a cell_vars hdf5 file or a simulation config.') + + if cell_vars_h5 is not None: + plot_calcium_hdf5(cell_vars_h5, gids, show_plot=show_plot, save_as='sim_ca.jpg' if save else None) + + else: + # load the json file or object + if isinstance(config_file, string_types): + config = cfg.from_json(config_file) + elif isinstance(config_file, dict): + config = config_file + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(config_file, type(config_file))) + + gid_list = gids or config['node_id_selections']['save_cell_vars'] + for gid in gid_list: + save_as = '{}_v.jpg'.format(gid) if save else None + title = 'cell gid {}'.format(gid) + var_h5 = os.path.join(config['output']['cell_vars_dir'], '{}.h5'.format(gid)) + plot_calcium_hdf5(var_h5, title, show_plot, save_as) + + +def plot_calcium_hdf5(cell_vars_h5, gids, title='Ca2+ influx', show_plot=True, save_as=None): + data_h5 = h5py.File(cell_vars_h5, 'r') + cai_trace = data_h5['cai/data'] + + time_ds = data_h5['/mapping/time'] + tstart = time_ds[0] + tstop = time_ds[1] + x_axis = np.linspace(tstart, tstop, len(cai_trace), endpoint=True) + + gids_ds = data_h5['/mapping/gids'] + index_ds = data_h5['/mapping/index_pointer'] + index_lookup = {gids_ds[i]: (index_ds[i], index_ds[i+1]) for i in range(len(gids_ds))} + gids = gids_ds.keys() if gids_ds is None else gids + for gid in gids: + var_indx = index_lookup[gid][0] + plt.plot(x_axis, cai_trace[:, var_indx], label=gid) + + #plt.plot(x_axis, cai_trace) + plt.xlabel('time (ms)') + plt.ylabel('calcium [Ca2+]') + plt.title(title) + plt.legend(markerscale=2, scatterpoints=1) + + if save_as is not None: + plt.savefig(save_as) + + if show_plot: + plt.show() + + +def spikes_table(config_file, spikes_file=None): + config = _get_config(config_file) + spikes_file = config['output']['spikes_file'] + spikes_h5 = h5py.File(spikes_file, 'r') + gids = np.array(spikes_h5['/spikes/gids'], dtype=np.uint) + times = np.array(spikes_h5['/spikes/timestamps'], dtype=np.float) + return pd.DataFrame(data={'gid': gids, 'spike time (ms)': times}) + #return pd.read_csv(spikes_ascii, names=['time (ms)', 'cell gid'], sep=' ') + + +def nodes_table(nodes_file, population): + # TODO: Integrate into sonata api + nodes_h5 = h5py.File(nodes_file, 'r') + nodes_pop = nodes_h5['/nodes'][population] + root_df = pd.DataFrame(data={'node_id': nodes_pop['node_id'], 'node_type_id': nodes_pop['node_type_id'], + 'node_group_id': nodes_pop['node_group_id'], + 'node_group_index': nodes_pop['node_group_index']}) #, + #index=[nodes_pop['node_group_id'], nodes_pop['node_group_index']]) + root_df = root_df.set_index(['node_group_id', 'node_group_index']) + + node_grps = np.unique(nodes_pop['node_group_id']) + for grp_id in node_grps: + sub_group = nodes_pop[str(grp_id)] + grp_df = pd.DataFrame() + for hf_key in sub_group: + hf_obj = sub_group[hf_key] + if isinstance(hf_obj, h5py.Dataset): + grp_df[hf_key] = hf_obj + + subgrp_len = len(grp_df) + if subgrp_len > 0: + grp_df['node_group_id'] = [grp_id]*subgrp_len + grp_df['node_group_index'] = range(subgrp_len) + grp_df = grp_df.set_index(['node_group_id', 'node_group_index']) + root_df = root_df.join(other=grp_df, how='left') + + return root_df.reset_index(drop=True) + + +def node_types_table(node_types_file, population): + return pd.read_csv(node_types_file, sep=' ') \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/analyzer/cell_vars.py b/bmtk-vb/build/lib/bmtk/analyzer/cell_vars.py new file mode 100644 index 0000000..da2e719 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/analyzer/cell_vars.py @@ -0,0 +1,95 @@ +import os +import matplotlib.pyplot as plt + +from .io_tools import load_config +from .utils import listify +from bmtk.utils.cell_vars import CellVarsFile + +# In the case reports are missing units, try to guess based on +missing_units = { + 'V_m': 'mV', + 'cai': 'mM', + 'v': 'mV' +} + + +def _get_cell_report(config_file, report_name): + cfg = load_config(config_file) + if report_name is not None: + return cfg.reports[report_name], report_name + + else: + cell_var_reports = [(r_name, r_dict) for r_name, r_dict in cfg.reports.items() + if r_dict['module'] == 'membrane_report'] + if len(cell_var_reports) == 0: + raise Exception('Could not find any membrane_reports in {}'.format(config_file)) + + elif len(cell_var_reports) > 1: + raise Exception('Found more than one membrane_report, please specify report_name') + + else: + report_name = cell_var_reports[0][0] + report = cell_var_reports[0][1] + report_fname = report['file_name'] if 'file_name' in report else '{}.h5'.format(report_name) + return report_name, os.path.join(cfg.output_dir, report_fname) + + +def plot_report(config_file=None, report_file=None, report_name=None, variables=None, gids=None): + if report_file is None: + report_name, report_file = _get_cell_report(config_file, report_name) + + var_report = CellVarsFile(report_file) + variables = listify(variables) if variables is not None else var_report.variables + gids = listify(gids) if gids is not None else var_report.gids + time_steps = var_report.time_trace + + def __units_str(var): + units = var_report.units(var) + if units == CellVarsFile.UNITS_UNKNOWN: + units = missing_units.get(var, '') + return '({})'.format(units) if units else '' + + n_plots = len(variables) + if n_plots > 1: + # If more than one variale to plot do so in different subplots + f, axarr = plt.subplots(n_plots, 1) + for i, var in enumerate(variables): + for gid in gids: + axarr[i].plot(time_steps, var_report.data(gid=gid, var_name=var), label='gid {}'.format(gid)) + + axarr[i].legend() + axarr[i].set_ylabel('{} {}'.format(var, __units_str(var))) + if i < n_plots - 1: + axarr[i].set_xticklabels([]) + + axarr[i].set_xlabel('time (ms)') + + elif n_plots == 1: + # For plotting a single variable + plt.figure() + for gid in gids: + plt.plot(time_steps, var_report.data(gid=0, var_name=variables[0]), label='gid {}'.format(gid)) + plt.ylabel('{} {}'.format(variables[0], __units_str(variables[0]))) + plt.xlabel('time (ms)') + + else: + return + + plt.show() + + #for gid in gids: + # plt.plot(times, var_report.data(gid=0, var_name='v'), label='gid {}'.format(gid)) + + + ''' + + + + plt.ylabel('{} {}'.format('v', units_str)) + plt.xlabel('time (ms)') + plt.legend() + plt.show() + ''' + + + diff --git a/bmtk-vb/build/lib/bmtk/analyzer/firing_rates.py b/bmtk-vb/build/lib/bmtk/analyzer/firing_rates.py new file mode 100644 index 0000000..bca785c --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/analyzer/firing_rates.py @@ -0,0 +1,55 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import numpy as np + +def convert_rates(rates_file): + rates_df = pd.read_csv(rates_file, sep=' ', names=['gid', 'time', 'rate']) + rates_sorted_df = rates_df.sort_values(['gid', 'time']) + rates_dict = {} + for gid, rates in rates_sorted_df.groupby('gid'): + start = rates['time'].iloc[0] + #start = rates['rate'][0] + end = rates['time'].iloc[-1] + dt = float(end - start)/len(rates) + rates_dict[gid] = {'start': start, 'end': end, 'dt': dt, 'rates': np.array(rates['rate'])} + + return rates_dict + + +def firing_rates_equal(rates_file1, rates_file2, err=0.0001): + trial_1 = convert_rates(rates_file1) + trial_2 = convert_rates(rates_file2) + if set(trial_1.keys()) != set(trial_2.keys()): + return False + + for gid, rates_data1 in trial_1.items(): + rates_data2 = trial_2[gid] + if rates_data1['dt'] != rates_data2['dt'] or rates_data1['start'] != rates_data2['start'] or rates_data1['end'] != rates_data2['end']: + return False + + for r1, r2 in zip(rates_data1['rates'], rates_data2['rates']): + if abs(r1 - r2) > err: + return False + + return True \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/analyzer/io_tools.py b/bmtk-vb/build/lib/bmtk/analyzer/io_tools.py new file mode 100644 index 0000000..326389b --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/analyzer/io_tools.py @@ -0,0 +1,11 @@ +from six import string_types +from bmtk.simulator.utils.config import ConfigDict + + +def load_config(config): + if isinstance(config, string_types): + return ConfigDict.from_json(config) + elif isinstance(config, dict): + return ConfigDict.from_dict(config) + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(config, type(config))) \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/analyzer/spike_trains.py b/bmtk-vb/build/lib/bmtk/analyzer/spike_trains.py new file mode 100644 index 0000000..a7f6c8d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/analyzer/spike_trains.py @@ -0,0 +1,16 @@ +import numpy as np +import pandas as pd +import h5py + + +from bmtk.analyzer.visualization.spikes import plot_spikes as raster_plot +from bmtk.analyzer.visualization.spikes import plot_rates as rates_plot +from .io_tools import load_config +from bmtk.utils.spike_trains import SpikesFile + + +def to_dataframe(config_file, spikes_file=None): + config = load_config(config_file) + spikes_file = SpikesFile(config.spikes_file) + return spikes_file.to_dataframe() + diff --git a/bmtk-vb/build/lib/bmtk/analyzer/spikes_analyzer.py b/bmtk-vb/build/lib/bmtk/analyzer/spikes_analyzer.py new file mode 100644 index 0000000..af77187 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/analyzer/spikes_analyzer.py @@ -0,0 +1,127 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import numpy as np + +try: + from distutils.version import LooseVersion + use_sort_values = LooseVersion(pd.__version__) >= LooseVersion('0.19.0') + +except: + use_sort_values = False + + +def spikes2dict(spikes_file): + spikes_df = pd.read_csv(spikes_file, sep=' ', names=['time', 'gid']) + + if use_sort_values: + spikes_sorted = spikes_df.sort_values(['gid', 'time']) + else: + spikes_sorted = spikes_df.sort(['gid', 'time']) + + spike_dict = {} + for gid, spike_train in spikes_sorted.groupby('gid'): + spike_dict[gid] = np.array(spike_train['time']) + return spike_dict + + +def spike_files_equal(spikes_txt_1, spikes_txt_2, err=0.0001): + trial_1 = spikes2dict(spikes_txt_1) + trial_2 = spikes2dict(spikes_txt_2) + if set(trial_1.keys()) != set(trial_2.keys()): + return False + + for gid, spike_train1 in trial_1.items(): + spike_train2 = trial_2[gid] + if len(spike_train1) != len(spike_train2): + return False + + for s1, s2 in zip(spike_train1, spike_train2): + if abs(s1 - s2) > err: + return False + + return True + + +def get_mean_firing_rates(spike_gids, node_ids, tstop_msec): + + """ + Compute mean firing rate over the duration of the simulation + + :param spike_gids: gids of cells which spiked + :param node_ids: np.array of node_ids + + :return mean_firing_rate: np.array mean firing rates + + """ + + min_gid = np.min(node_ids) + max_gid = np.max(node_ids) + + gid_bins = np.arange(min_gid-0.5,max_gid+1.5,1) + hist,bins = np.histogram(spike_gids, bins=gid_bins) + + tstop_sec = tstop_msec*1E-3 + mean_firing_rates = hist/tstop_sec + + return mean_firing_rates + + + +def spikes_equal_in_window(spikes1,spikes2,twindow): + """ + Compare spikes within a time window + :param spikes1: dict with "time" and "gid" arrays for raster 1 + :param spikes2: dict with "time" and "gid" arrays for raster 2 + :param twindow: [tstart,tend] time window + + :return boolean: True if equal, False if different + """ + + ix1_window0=np.where(spikes1["time"]>twindow[0]) + ix1_window1=np.where(spikes1["time"]twindow[0]) + ix2_window1=np.where(spikes2["time"] tstart) & (spikes[0] < tend)) + + spike_times = spikes[0][ix_t] + spike_gids = spikes[1][ix_t] + + for query, col in cmap.items(): + query_df = nodes_df.query(query) + gids_query = query_df.index + print("{} ncells: {} {}".format(query, len(gids_query), col)) + + ix_g = np.in1d(spike_gids, gids_query) + ax.scatter(spike_times[ix_g], spike_gids[ix_g], + marker=marker, + # facecolors='none', + facecolors=col, + # edgecolors=col, + s=s, + label=query, + lw=lw) diff --git a/bmtk-vb/build/lib/bmtk/analyzer/visualization/spikes.py b/bmtk-vb/build/lib/bmtk/analyzer/visualization/spikes.py new file mode 100644 index 0000000..e7b34e9 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/analyzer/visualization/spikes.py @@ -0,0 +1,499 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import csv +import h5py +from six import string_types +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.cm as cmx +import matplotlib.colors as colors +import matplotlib.gridspec as gridspec + +import bmtk.simulator.utils.config as config + +from mpl_toolkits.axes_grid1 import make_axes_locatable + +def _create_node_table(node_file, node_type_file, group_key=None, exclude=[]): + """Creates a merged nodes.csv and node_types.csv dataframe with excluded items removed. Returns a dataframe.""" + node_types_df = pd.read_csv(node_type_file, sep=' ', index_col='node_type_id') + nodes_h5 = h5py.File(node_file) + # TODO: Use utils.spikesReader + node_pop_name = nodes_h5['/nodes'].keys()[0] + + nodes_grp = nodes_h5['/nodes'][node_pop_name] + # TODO: Need to be able to handle gid or node_id + nodes_df = pd.DataFrame({'node_id': nodes_grp['node_id'], 'node_type_id': nodes_grp['node_type_id']}) + #nodes_df = pd.DataFrame({'node_id': nodes_h5['/nodes/node_gid'], 'node_type_id': nodes_h5['/nodes/node_type_id']}) + nodes_df.set_index('node_id', inplace=True) + + # nodes_df = pd.read_csv(node_file, sep=' ', index_col='node_id') + full_df = pd.merge(left=nodes_df, right=node_types_df, how='left', left_on='node_type_id', right_index=True) + + if group_key is not None and len(exclude) > 0: + # Make sure sure we group-key exists as column + if group_key not in full_df: + raise Exception('Could not find column {}'.format(group_key)) + + group_keys = set(nodes_df[group_key].unique()) - set(exclude) + groupings = nodes_df.groupby(group_key) + # remove any rows with matching column value + for cond in exclude: + full_df = full_df[full_df[group_key] != cond] + + return full_df + +def _count_spikes(spikes_file, max_gid, interval=None): + def parse_line(line): + ts, gid = line.strip().split(' ') + return float(ts), int(gid) + + if interval is None: + t_max = t_bounds_low = -1.0 + t_min = t_bounds_high = 1e16 + elif hasattr(interval, "__getitem__") and len(interval) == 2: + t_min = t_bounds_low = interval[0] + t_max = t_bounds_high = interval[1] + elif isinstance(interval, float): + t_max = t_min = t_bounds_low = interval[0] + t_bounds_high = 1e16 + else: + raise Exception("Unable to determine interval.") + + max_gid = int(max_gid) # strange bug where max_gid was being returned as a float. + spikes = [[] for _ in xrange(max_gid+1)] + spike_sums = np.zeros(max_gid+1) + # TODO: Use utils.spikesReader + spikes_h5 = h5py.File(spikes_file, 'r') + #print spikes_h5['/spikes'].keys() + gid_ds = spikes_h5['/spikes/gids'] + ts_ds = spikes_h5['/spikes/timestamps'] + + for i in range(len(gid_ds)): + ts = ts_ds[i] + gid = gid_ds[i] + + if gid <= max_gid and t_bounds_low <= ts <= t_bounds_high: + spikes[gid].append(ts) + spike_sums[gid] += 1 + t_min = ts if ts < t_min else t_min + t_max = ts if ts > t_max else t_max + + """ + with open(spikes_file, 'r') as fspikes: + for line in fspikes: + ts, gid = parse_line(line) + if gid <= max_gid and t_bounds_low <= ts <= t_bounds_high: + spikes[gid].append(ts) + spike_sums[gid] += 1 + t_min = ts if ts < t_min else t_min + t_max = ts if ts > t_max else t_max + """ + return spikes, spike_sums/(float(t_max-t_min)*1e-3) + + + +def plot_spikes_config(configure, group_key=None, exclude=[], save_as=None, show_plot=True): + if isinstance(configure, string_types): + conf = config.from_json(configure) + elif isinstance(configure, dict): + conf = configure + else: + raise Exception("configure variable must be either a json dictionary or json file name.") + + cells_file_name = conf['internal']['nodes'] + cell_models_file_name = conf['internal']['node_types'] + spikes_file = conf['output']['spikes_ascii'] + + plot_spikes(cells_file_name, cell_models_file_name, spikes_file, group_key, exclude, save_as, show_plot) + + +def plot_spikes(cells_file, cell_models_file, spikes_file, population=None, group_key=None, exclude=[], save_as=None, + show=True, title=None): + # check if can be shown and/or saved + #if save_as is not None: + # if os.path.exists(save_as): + # raise Exception('file {} already exists. Cannot save.'.format(save_as)) + + cm_df = pd.read_csv(cell_models_file, sep=' ') + cm_df.set_index('node_type_id', inplace=True) + + cells_h5 = h5py.File(cells_file, 'r') + # TODO: Use sonata api + if population is None: + if len(cells_h5['/nodes']) > 1: + raise Exception('Multiple populations in nodes file. Please specify one to plot using population param') + else: + population = cells_h5['/nodes'].keys()[0] + + nodes_grp = cells_h5['/nodes'][population] + c_df = pd.DataFrame({'node_id': nodes_grp['node_id'], 'node_type_id': nodes_grp['node_type_id']}) + # c_df = pd.read_csv(cells_file, sep=' ') + c_df.set_index('node_id', inplace=True) + nodes_df = pd.merge(left=c_df, + right=cm_df, + how='left', + left_on='node_type_id', + right_index=True) # use 'model_id' key to merge, for right table the "model_id" is an index + + # TODO: Uses utils.SpikesReader to open + spikes_h5 = h5py.File(spikes_file, 'r') + spike_gids = np.array(spikes_h5['/spikes/gids'], dtype=np.uint) + spike_times = np.array(spikes_h5['/spikes/timestamps'], dtype=np.float) + # spike_times, spike_gids = np.loadtxt(spikes_file, dtype='float32,int', unpack=True) + # spike_gids, spike_times = np.loadtxt(spikes_file, dtype='int,float32', unpack=True) + + spike_times = spike_times * 1.0e-3 + + if group_key is not None: + if group_key not in nodes_df: + raise Exception('Could not find column {}'.format(group_key)) + groupings = nodes_df.groupby(group_key) + + n_colors = nodes_df[group_key].nunique() + color_norm = colors.Normalize(vmin=0, vmax=(n_colors-1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + else: + groupings = [(None, nodes_df)] + color_map = ['blue'] + + #marker = '.' if len(nodes_df) > 1000 else 'o' + marker = 'o' + + # Create plot + gs = gridspec.GridSpec(2, 1, height_ratios=[7, 1]) + ax1 = plt.subplot(gs[0]) + gid_min = 10**10 + gid_max = -1 + for color, (group_name, group_df) in zip(color_map, groupings): + if group_name in exclude: + continue + group_min_gid = min(group_df.index.tolist()) + group_max_gid = max(group_df.index.tolist()) + gid_min = group_min_gid if group_min_gid <= gid_min else gid_min + gid_max = group_max_gid if group_max_gid > gid_max else gid_max + + gids_group = group_df.index + indexes = np.in1d(spike_gids, gids_group) + ax1.scatter(spike_times[indexes], spike_gids[indexes], marker=marker, facecolors=color, label=group_name, lw=0, s=5) + + #ax1.set_xlabel('time (s)') + ax1.axes.get_xaxis().set_visible(False) + ax1.set_ylabel('cell_id') + ax1.set_xlim([0, max(spike_times)]) + ax1.set_ylim([gid_min, gid_max]) + plt.legend(markerscale=2, scatterpoints=1) + + ax2 = plt.subplot(gs[1]) + plt.hist(spike_times, 100) + ax2.set_xlabel('time (s)') + ax2.set_xlim([0, max(spike_times)]) + ax2.axes.get_yaxis().set_visible(False) + if title is not None: + ax1.set_title(title) + + if save_as is not None: + plt.savefig(save_as) + + if show: + plt.show() + + +def plot_ratess(cells_file, cell_models_file, spikes_file, group_key='pop_name', exclude=['LIF_inh', 'LIF_exc'], save_as=None, show_plot=True): + #if save_as is not None: + # if os.path.exists(save_as): + # raise Exception('file {} already exists. Cannot save.'.format(save_as)) + + cm_df = pd.read_csv(cell_models_file, sep=' ') + cm_df.set_index('node_type_id', inplace=True) + + c_df = pd.read_csv(cells_file, sep=' ') + c_df.set_index('node_id', inplace=True) + nodes_df = pd.merge(left=c_df, + right=cm_df, + how='left', + left_on='node_type_id', + right_index=True) # use 'model_id' key to merge, for right table the "model_id" is an index + + for cond in exclude: + nodes_df = nodes_df[nodes_df[group_key] != cond] + + groupings = nodes_df.groupby(group_key) + n_colors = nodes_df[group_key].nunique() + color_norm = colors.Normalize(vmin=0, vmax=(n_colors - 1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + + + spike_times, spike_gids = np.loadtxt(spikes_file, dtype='float32,int', unpack=True) + rates = np.zeros(max(spike_gids) + 1) + for ts, gid in zip(spike_times, spike_gids): + if ts < 500.0: + continue + rates[gid] += 1 + + for color, (group_name, group_df) in zip(color_map, groupings): + print(group_name) + print(group_df.index) + print(rates[group_df.index]) + plt.plot(group_df.index, rates[group_df.index], '.', color=color) + + plt.show() + + print(n_colors) + exit() + + + + group_keys = set(nodes_df[group_key].unique()) - set(exclude) + groupings = nodes_df.groupby(group_key) + + n_colors = len(group_keys) + color_norm = colors.Normalize(vmin=0, vmax=(n_colors - 1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + + for color, (group_name, group_df) in zip(color_map, groupings): + print(group_name) + print(group_df.index) + + exit() + + + """ + print color_map + exit() + + n_colors = nodes_df[group_key].nunique() + color_norm = colors.Normalize(vmin=0, vmax=(n_colors - 1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + """ + + spike_times, spike_gids = np.loadtxt(spikes_file, dtype='float32,int', unpack=True) + rates = np.zeros(max(spike_gids)+1) + + for ts, gid in zip(spike_times, spike_gids): + if ts < 500.0: + continue + + rates[gid] += 1 + + rates = rates / 3.0 + + plt.plot(xrange(max(spike_gids)+1), rates, '.') + plt.show() + + +def plot_rates(cells_file, cell_models_file, spikes_file, group_key=None, exclude=[], interval=None, show=True, + title=None, save_as=None, smoothed=False): + def smooth(data, window=100): + h = int(window/2) + x_max = len(data) + return [np.mean(data[max(0, x-h):min(x_max, x+h)]) for x in xrange(0, x_max)] + + nodes_df = _create_node_table(cells_file, cell_models_file, group_key, exclude) + _, spike_rates = _count_spikes(spikes_file, max(nodes_df.index), interval) + + if group_key is not None: + groupings = nodes_df.groupby(group_key) + group_order = {k: i for i, k in enumerate(nodes_df[group_key].unique())} + + n_colors = len(group_order) + color_norm = colors.Normalize(vmin=0, vmax=(n_colors-1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + color_map = [scalar_map.to_rgba(i) for i in range(0, n_colors)] + ordered_groupings = [(group_order[name], c, name, df) for c, (name, df) in zip(color_map, groupings)] + + else: + ordered_groupings = [(0, 'blue', None, nodes_df)] + + keys = ['' for _ in xrange(len(group_order))] + means = [0 for _ in xrange(len(group_order))] + stds = [0 for _ in xrange(len(group_order))] + fig = plt.figure() + ax1 = fig.add_subplot(111) + for indx, color, group_name, group_df in ordered_groupings: + keys[indx] = group_name + means[indx] = np.mean(spike_rates[group_df.index]) + stds[indx] = np.std(spike_rates[group_df.index]) + y = smooth(spike_rates[group_df.index]) if smoothed else spike_rates[group_df.index] + ax1.plot(group_df.index, y, '.', color=color, label=group_name) + + max_rate = np.max(spike_rates) + ax1.set_ylim(0, 50)#max_rate*1.3) + ax1.set_ylabel('Hz') + ax1.set_xlabel('gid') + ax1.legend(fontsize='x-small') + if title is not None: + ax1.set_title(title) + if save_as is not None: + plt.savefig(save_as) + + plt.figure() + plt.errorbar(xrange(len(means)), means, stds, linestyle='None', marker='o') + plt.xlim(-0.5, len(color_map)-0.5) # len(color_map) == last_index + 1 + plt.ylim(0, 50.0)# max_rate*1.3) + plt.xticks(xrange(len(means)), keys) + if title is not None: + plt.title(title) + if save_as is not None: + if save_as.endswith('.jpg'): + base = save_as[0:-4] + elif save_as.endswith('.jpeg'): + base = save_as[0:-5] + else: + base = save_as + + plt.savefig('{}.summary.jpg'.format(base)) + with open('{}.summary.csv'.format(base), 'w') as f: + f.write('population mean stddev\n') + for i, key in enumerate(keys): + f.write('{} {} {}\n'.format(key, means[i], stds[i])) + + if show: + plt.show() + +def plot_rates_popnet(cell_models_file, rates_file, model_keys=None, save_as=None, show_plot=True): + """Initial method for plotting popnet output + + :param cell_models_file: + :param rates_file: + :param model_keys: + :param save_as: + :param show_plot: + :return: + """ + + pops_df = pd.read_csv(cell_models_file, sep=' ') + lookup_col = model_keys if model_keys is not None else 'node_type_id' + pop_keys = {str(r['node_type_id']): r[lookup_col] for _, r in pops_df.iterrows()} + + # organize the rates file by population + # rates = {pop_name: ([], []) for pop_name in pop_keys.keys()} + rates_df = pd.read_csv(rates_file, sep=' ', names=['id', 'times', 'rates']) + for grp_key, grp_df in rates_df.groupby('id'): + grp_label = pop_keys[str(grp_key)] + plt.plot(grp_df['times'], grp_df['rates'], label=grp_label) + + plt.legend(fontsize='x-small') + plt.xlabel('time (s)') + plt.ylabel('firing rates (Hz)') + + if save_as is not None: + plt.savefig(save_as) + + if show_plot: + plt.show() + +def plot_avg_rates(cell_models_file, rates_file, model_keys=None, save_as=None, show_plot=True): + pops_df = pd.read_csv(cell_models_file, sep=' ') + lookup_col = model_keys if model_keys is not None else 'node_type_id' + pop_keys = {str(r['node_type_id']): r[lookup_col] for _, r in pops_df.iterrows()} + + # organize the rates file by population + rates = {pop_name: [] for pop_name in pop_keys.keys()} + with open(rates_file, 'r') as f: + reader = csv.reader(f, delimiter=' ') + for row in reader: + if row[0] in rates: + #rates[row[0]][0].append(row[1]) + rates[row[0]].append(float(row[2])) + + labels = [] + means = [] + stds = [] + #print rates + for pop_name in pops_df['node_type_id'].unique(): + r = rates[str(pop_name)] + if len(r) == 0: + continue + + labels.append(pop_keys.get(str(pop_name), str(pop_name))) + means.append(np.mean(r)) + stds.append(np.std(r)) + + plt.figure() + plt.errorbar(xrange(len(means)), means, stds, linestyle='None', marker='o') + plt.xlim(-0.5, len(means) - 0.5) + plt.xticks(xrange(len(means)), labels) + plt.ylabel('firing rates (Hz)') + + if save_as is not None: + plt.savefig(save_as) + + if show_plot: + plt.show() + + +def plot_tuning(sg_analysis, node, band, Freq=0, show=True, save_as=None): + def index_for_node(node, band): + if node == 's4': + mask = sg_analysis.node_table.node == node + else: + mask = (sg_analysis.node_table.node == node) & (sg_analysis.node_table.band == band) + return str(sg_analysis.node_table[mask].index[0]) + + index = index_for_node(node, band) + + key = index + '/sg/tuning' + analysis_file = sg_analysis.get_tunings_file() + + tuning_matrix = analysis_file[key].value[:, :, :, Freq] + + n_or, n_sf, n_ph = tuning_matrix.shape + + vmax = np.max(tuning_matrix[:, :, :]) + vmin = np.min(tuning_matrix[:, :, :]) + + #fig, ax = plt.subplots(1, n_ph, figsize=(12, 16), sharex=True, sharey=True) + fig, ax = plt.subplots(1, n_ph, figsize=(13.9, 4.3), sharex=False, sharey=True) + + print(sg_analysis.orientations) + for phase in range(n_ph): + tuning_to_plot = tuning_matrix[:, :, phase] + + im = ax[phase].imshow(tuning_to_plot, interpolation='nearest', vmax=vmax, vmin=vmin) + ax[phase].set_xticklabels([0] + list(sg_analysis.spatial_frequencies)) + ax[phase].set_yticklabels([0] + list(sg_analysis.orientations)) + + ax[phase].set_title('phase = {}'.format(sg_analysis.phases[phase])) + ax[phase].set_xlabel('spatial_frequency') + if phase == 0: + ax[phase].set_ylabel('orientation') + + fig.subplots_adjust(right=0.90) + cbar_ax = fig.add_axes([0.92, 0.10, 0.02, 0.75]) + cbar = fig.colorbar(im, cax=cbar_ax, ticks=[vmin, 0.0, vmax]) + + if save_as is not None: + plt.savefig(save_as) + + if show: + plt.show() + + + #config_file = +# plot_spikes('../../examples/pointnet/example2/config.json', 'pop_name') diff --git a/bmtk-vb/build/lib/bmtk/analyzer/visualization/widgets.py b/bmtk-vb/build/lib/bmtk/analyzer/visualization/widgets.py new file mode 100644 index 0000000..bb9c909 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/analyzer/visualization/widgets.py @@ -0,0 +1,114 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import matplotlib.pyplot as plt +import scipy.interpolate as spinterp +import numpy as np + +class PlotWidget(object): + + def __init__(self, t_range, y_range, rate_ax=None, position_ax=None, metadata={}, location_markersize=5): + + if rate_ax is None: + self.fig = plt.figure() + self.ax = self.fig.add_subplot(111) + else: + self.ax = rate_ax + self.position_ax = position_ax + + self.t_range = t_range + self.y_range = y_range + self.interp_fcn = spinterp.interp1d(self.t_range, self.y_range) + self._t = None + self.metadata=metadata + self.artist_list = [] + self.location_markersize = location_markersize + + @property + def y(self): + return self.interp_fcn(self._t) + + def initialize(self, t0, **kwargs): + + self._t = t0 + self.plot_data, = self.ax.plot(self.t_range,self.y_range,**kwargs) + self.vertical_rule_data, = self.ax.plot([self._t, self._t],self.ax.get_ylim(),'--r') + self.point_data, = self.ax.plot([self._t],[self.y],'*r') + + self.artist_list = [self.plot_data, self.vertical_rule_data, self.point_data] + + if (not self.position_ax is None) and 'position' in self.metadata: + x = self.metadata['position'][0] + y = self.metadata['position'][1] + self.location_point_data, = self.position_ax.plot([x],[y],'*r', markersize=self.location_markersize) + self.artist_list.append(self.location_point_data) + + + def update(self, t): + + self._t = t + self.point_data + self.point_data.set_xdata([self._t]) + self.vertical_rule_data.set_xdata([self._t, self._t]) + self.vertical_rule_data.set_ydata(self.ax.get_ylim()) + + for data in self.artist_list: + self.ax.figure.canvas.blit(data) + + def set_visible(self, visible_or_not): + + + for data in self.artist_list: + data.set_visible(visible_or_not) + self.ax.figure.canvas.blit(data) + + +class MovieWidget(object): + + def __init__(self, t_range, data, ax=None, metadata={}): + + if ax is None: + self.fig = plt.figure() + self.ax = self.fig.add_subplot(111) + else: + self.ax = ax + + self.t_range = t_range + self.frame_rate = 1./np.mean(np.diff(t_range)) + self.data = data + self.ax.get_xaxis().set_visible(False) + self.ax.get_yaxis().set_visible(False) + self.metadata=metadata + + def initialize(self, t0, vmin=-1, vmax=1, cmap=plt.cm.gray): + + data = self.data[self.ti(t0),:,:] + self.im = self.ax.imshow(data, vmin=vmin, vmax=vmax, cmap=cmap) + + def update(self, t): + + data = self.data[self.ti(t),:,:] + self.im.set_data(data) + self.ax.figure.canvas.draw() + + def ti(self, t): + return int(t*self.frame_rate) - int(self.t_range[0]*self.frame_rate) \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/builder/__init__.py b/bmtk-vb/build/lib/bmtk/builder/__init__.py new file mode 100644 index 0000000..1f7a3ed --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/__init__.py @@ -0,0 +1,23 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .networks import DenseNetwork, NetworkBuilder diff --git a/bmtk-vb/build/lib/bmtk/builder/aux/__init__.py b/bmtk-vb/build/lib/bmtk/builder/aux/__init__.py new file mode 100644 index 0000000..2d56a26 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/aux/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/builder/aux/edge_connectors.py b/bmtk-vb/build/lib/bmtk/builder/aux/edge_connectors.py new file mode 100644 index 0000000..7abba26 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/aux/edge_connectors.py @@ -0,0 +1,56 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import random + + +def distance_connector(source, target, d_weight_min, d_weight_max, d_max, nsyn_min, nsyn_max): + # Avoid self-connections. + sid = source.node_id + tid = target.node_id + if sid == tid: + return None + + # first create weights by euclidean distance between cells + r = np.linalg.norm(np.array(source['positions']) - np.array(target['positions'])) + if r > d_max: + dw = 0.0 + else: + t = r / d_max + dw = d_weight_max * (1.0 - t) + d_weight_min * t + + # drop the connection if the weight is too low + if dw <= 0: + return None + + # filter out nodes by treating the weight as a probability of connection + if random.random() > dw: + return None + + # Add the number of synapses for every connection. + tmp_nsyn = random.randint(nsyn_min, nsyn_max) + return tmp_nsyn + + +def connect_random(source, target, nsyn_min=0, nsyn_max=10, distribution=None): + return np.random.randint(nsyn_min, nsyn_max) \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/builder/aux/node_params.py b/bmtk-vb/build/lib/bmtk/builder/aux/node_params.py new file mode 100644 index 0000000..0ce1f4f --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/aux/node_params.py @@ -0,0 +1,38 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import math + + +def positions_columinar(N=1, center=[0.0, 50.0, 0.0], height=100.0, min_radius=0.0, max_radius=1.0, distribution='uniform'): + phi = 2.0 * math.pi * np.random.random([N]) + r = np.sqrt((min_radius**2 - max_radius**2) * np.random.random([N]) + max_radius**2) + x = center[0] + r * np.cos(phi) + z = center[2] + r * np.sin(phi) + y = center[1] + height * (np.random.random([N]) - 0.5) + + return np.column_stack((x, y, z)) + + +def xiter_random(N=1, min_x=0.0, max_x=1.0): + return np.random.uniform(low=min_x, high=max_x, size=(N,)) \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/builder/bionet/__init__.py b/bmtk-vb/build/lib/bmtk/builder/bionet/__init__.py new file mode 100644 index 0000000..324aace --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/bionet/__init__.py @@ -0,0 +1 @@ +from swc_reader import SWCReader \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/builder/bionet/swc_reader.py b/bmtk-vb/build/lib/bmtk/builder/bionet/swc_reader.py new file mode 100644 index 0000000..4833a1d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/bionet/swc_reader.py @@ -0,0 +1,81 @@ +import numpy as np +from neuron import h + +from bmtk.simulator.bionet import nrn +from bmtk.simulator.bionet.morphology import Morphology + + +class SWCReader(object): + def __init__(self, swc_file, random_seed=10, fix_axon=True): + nrn.load_neuron_modules(None, None) + self._swc_file = swc_file + self._hobj = h.Biophys1(swc_file) + if fix_axon: + self._fix_axon() + + self._morphology = Morphology(self._hobj) + self._morphology.set_seg_props() + self._morphology.calc_seg_coords() + self._prng = np.random.RandomState(random_seed) + + self._secs = [] + self._save_sections() + + def _save_sections(self): + for sec in self._hobj.all: + for _ in sec: + self._secs.append(sec) + + def _fix_axon(self): + """Removes and refixes axon""" + axon_diams = [self._hobj.axon[0].diam, self._hobj.axon[0].diam] + for sec in self._hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name == 'axon': + axon_diams[1] = sec.diam + + for sec in self._hobj.axon: + h.delete_section(sec=sec) + + h.execute('create axon[2]', self._hobj) + for index, sec in enumerate(self._hobj.axon): + sec.L = 30 + sec.diam = 1 + + self._hobj.axonal.append(sec=sec) + self._hobj.all.append(sec=sec) # need to remove this comment + + self._hobj.axon[0].connect(self._hobj.soma[0], 1.0, 0) + self._hobj.axon[1].connect(self._hobj.axon[0], 1.0, 0) + + h.define_shape() + + def find_sections(self, section_names, distance_range): + return self._morphology.find_sections(section_names, distance_range) + + def choose_sections(self, section_names, distance_range, n_sections=1): + secs, probs = self.find_sections(section_names, distance_range) + secs_ix = self._prng.choice(secs, n_sections, p=probs) + return secs_ix, self._morphology.seg_prop['x'][secs_ix] + + def get_coord(self, sec_ids, sec_xs, soma_center=(0.0, 0.0, 0.0), rotations=None): + adjusted = self._morphology.get_soma_pos() - np.array(soma_center) + absolute_coords = [] + for sec_id, sec_x in zip(sec_ids, sec_xs): + sec = self._secs[sec_id] + n_coords = int(h.n3d(sec=sec)) + coord_indx = int(sec_x*(n_coords - 1)) + swc_coords = np.array([h.x3d(coord_indx, sec=sec), h.y3d(coord_indx, sec=sec), h.x3d(coord_indx, sec=sec)]) + absolute_coords.append(swc_coords - adjusted) + + if rotations is not None: + raise NotImplementedError + + return absolute_coords + + def get_dist(self, sec_ids): + return [self._morphology.seg_prop['dist'][sec_id] for sec_id in sec_ids] + + def get_type(self, sec_ids): + return [self._morphology.seg_prop['type'][sec_id] for sec_id in sec_ids] + diff --git a/bmtk-vb/build/lib/bmtk/builder/connection_map.py b/bmtk-vb/build/lib/bmtk/builder/connection_map.py new file mode 100644 index 0000000..863cf26 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/connection_map.py @@ -0,0 +1,153 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import connector +from . import iterator + + +class ConnectionMap(object): + """Class for keeping track of connection rules. + + For every connection from source --> target this keeps track of rules (functions, literals, lists) for + 1. the number of synapses between source and target + 2. Used defined parameters (syn-weight, synaptic-location) for every synapse. + + The number of synapses rule (1) is stored as a connector. Individual synaptic parameters, if they exists, are stored + as ParamsRules. + """ + + class ParamsRules(object): + """A subclass to store indvidiual synpatic parameter rules""" + def __init__(self, names, rule, rule_params, dtypes): + self._names = names + self._rule = rule + self._rule_params = rule_params + self._dtypes = self.__create_dtype_dict(names, dtypes) + + def __create_dtype_dict(self, names, dtypes): + if isinstance(names, list): + # TODO: compare size of names and dtypes + return {n: dt for n, dt in zip(names, dtypes)} + else: + return {names: dtypes} + + @property + def names(self): + return self._names + + @property + def rule(self): + return connector.create(self._rule, **(self._rule_params or {})) + + @property + def dtypes(self): + return self._dtypes + + def get_prop_dtype(self, prop_name): + return self._dtypes[prop_name] + + def __init__(self, sources=None, targets=None, connector=None, connector_params=None, iterator='one_to_one', + edge_type_properties=None): + self._source_nodes = sources # source nodes + self._target_nodes = targets # target nodes + self._connector = connector # function, list or value that determines connection between sources and targets + self._connector_params = connector_params # parameters passed into connector + self._iterator = iterator # rule for iterating between sources and targets + self._edge_type_properties = edge_type_properties + + self._params = [] + self._param_keys = [] + + @property + def params(self): + return self._params + + @property + def source_nodes(self): + return self._source_nodes + + @property + def source_network_name(self): + return self._source_nodes.network_name + + @property + def target_nodes(self): + return self._target_nodes + + @property + def target_network_name(self): + return self._target_nodes.network_name + + @property + def connector(self): + return self._connector + + @property + def connector_params(self): + return self._connector_params + + @property + def iterator(self): + return self._iterator + + @property + def edge_type_properties(self): + return self._edge_type_properties or {} + + @property + def edge_type_id(self): + # TODO: properly implement edge_type + return self._edge_type_properties['edge_type_id'] + + @property + def property_names(self): + if len(self._param_keys) == 0: + return ['nsyns'] + else: + return self._param_keys + + def properties_keys(self): + ordered_keys = sorted(self.property_names) + return str(ordered_keys) + + + def max_connections(self): + return len(self._source_nodes) * len(self._target_nodes) + + def add_properties(self, names, rule, rule_params=None, dtypes=None): + """A a synaptic property + + :param names: list, or single string, of the property + :param rule: function, list or value of property + :param rule_params: when rule is a function, rule_params will be passed into function when called. + :param dtypes: expected property type + """ + self._params.append(self.ParamsRules(names, rule, rule_params, dtypes)) + self._param_keys += names + + def connection_itr(self): + """Returns a generator that will iterate through the source/target pairs (as specified by the iterator function, + and create a connection rule based on the connector. + """ + conr = connector.create(self.connector, **(self.connector_params or {})) + itr = iterator.create(self.iterator, conr, **({})) + return itr(self.source_nodes, self.target_nodes, conr) diff --git a/bmtk-vb/build/lib/bmtk/builder/connector.py b/bmtk-vb/build/lib/bmtk/builder/connector.py new file mode 100644 index 0000000..0d2cfd6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/connector.py @@ -0,0 +1,35 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import functor_cache + + +def create(connector, **params): + return CONNECTOR_CACHE.create(connector, **params) + + +def register(name, func): + CONNECTOR_CACHE.register(name, func) + + +CONNECTOR_CACHE = functor_cache.FunctorCache() +register('passthrough', lambda *_: {}) diff --git a/bmtk-vb/build/lib/bmtk/builder/edge.py b/bmtk-vb/build/lib/bmtk/builder/edge.py new file mode 100644 index 0000000..31265a9 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/edge.py @@ -0,0 +1,66 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + + +class Edge(object): + def __init__(self, src_gid, trg_gid, edge_type_props, syn_props): + self.__src_gid = src_gid + self.__trg_gid = trg_gid + self.__edge_type_props = edge_type_props + self.__syn_props = syn_props + + @property + def source_gid(self): + return self.__src_gid + + @property + def target_gid(self): + return self.__trg_gid + + @property + def edge_type_properties(self): + return self.__edge_type_props + + @property + def edge_type_id(self): + return self.edge_type_properties['edge_type_id'] + + @property + def synaptic_properties(self): + return self.__syn_props + + def __contains__(self, item): + return item in self.edge_type_properties or item in self.synaptic_properties + + def __getitem__(self, item): + if item in self.edge_type_properties: + return self.edge_type_properties[item] + elif item in self.synaptic_properties: + return self.synaptic_properties[item] + else: + return None + + def __repr__(self): + rstr = "{} --> {} ('edge_type_id': {}, ".format(self.source_gid, self.target_gid, self.edge_type_id) + rstr += "{}: {}" ', '.join("'{}': {}".format(k, v) for k, v in self.synaptic_properties.items()) + return rstr + ")" diff --git a/bmtk-vb/build/lib/bmtk/builder/formats/__init__.py b/bmtk-vb/build/lib/bmtk/builder/formats/__init__.py new file mode 100644 index 0000000..6480e34 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/formats/__init__.py @@ -0,0 +1,246 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +""" network2.format + +The XFormat classes are implemented within Network class to allow network objects to handle different data types. +Each class should be able to control both input and output file format (json, csv, h5, etc) and the expected parameters, +including their corresponding order. + +Example: + net = Network(format=ISeeFormat) + ... + net.save(cells="cells.csv", models="cell_models.csv", connections="connections.h5") + +Todo: + * change network.load(cls) to be format specific. +""" +import csv +import h5py +import numpy as np +import json +import pandas as pd + +from ..node import Node + +from iformats import IFormat + + +class DefaultFormat(IFormat): + def save_nodes(self, file_name): + raise NotImplementedError() + + def save_edges(self, file_name): + raise NotImplementedError() + + def save(self, file_name): + raise NotImplementedError() + + +class ISeeFormat(IFormat): + """Controls the output of networks that will be used in the isee_engine simulator. + + The nodes are saved in a cells and cell_model csv files with predefined format. the edges/connections are + saved in a connections h5 format. + """ + def save_cells(self, filename, columns, position_labels=None): + """Saves nodes/cell information and their model type metadata. + + :param cells_csv: name of csv file where cell information will be saved. + :param models_csv: name of csv file where cell model information will be saved. + """ + # TODO: add checks and warnings if parameters are missing. + with open(filename, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=' ') + header = [] + for col in columns: + if col == 'position': + for label in position_labels: + if label: + header.append(label) + else: + header.append(col) + csvw.writerow(header) + for nid, params in self._network.nodes(): + row_array = [] + for col in columns: + if col == 'position': + for i, label in enumerate(position_labels): + if label: + row_array.append(params['position'][i]) + else: + row_array.append(params[col]) + + csvw.writerow(row_array) + + def save_types(self, filename, columns, key=None): + seen_types = set() + + with open(filename, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=' ') + csvw.writerow(columns) + #csvw.writerow(['model_id', 'electrophysiology' 'level_of_detail', 'morphology', 'rotation_angle_zaxis']) + for node_set in self._network._node_sets: + props = node_set.properties#['properties'] + + if key is not None: + key_val = props.get(key, None) + if key_val is not None and key_val in seen_types: + continue + else: + seen_types.add(key_val) + + row_array = [] + for col in columns: + row_array.append(props.get(col, 'NA')) + csvw.writerow(row_array) + + def save_edges(self, filename, include_nsyns=True): + """Saves connection information into h5 format + + :param filename: Name of h5 file where connection information will be stored. + :param include_nsyns: setting to false will omit the nsyns table in the h5 file, default + true (nsyn table included). + """ + print("save_edges") + + n_nodes = self._network.nnodes + n_edges = self._network.nedges + + # TODO: check the order of the node list + + print("> building tables with %d nodes and %d edges" % (self._network.nnodes, self._network.nedges)) + indptr_table = [0] + nsyns_table = [] + src_gids_table = [] + edge_types_table = [] + for trg in self._network.nodes(): + tid = trg[1]['id'] + for edges in self._network.edges([tid], rank=1): + src_gids_table.append(edges[0]) + nsyns_table.append(edges[2]) + edge_types_table.append(edges[3]) + + #if len(src_gids_table) == indptr_table[-1]: + # print "node %d doesn't have any edges" % (tid) + indptr_table.append(len(src_gids_table)) + + + print("> saving tables to %s" % (filename)) + + with h5py.File(filename, 'w') as hf: + hf.create_dataset('edge_ptr', data=indptr_table) + if include_nsyns: + hf.create_dataset('num_syns', data=nsyns_table) + hf.create_dataset('src_gids', data=src_gids_table) + hf.create_dataset('edge_types', data=edge_types_table) + hf.attrs["shape"] = (n_nodes, n_nodes) + + + """ + temp = np.empty([n_edges, 3]) + for i, edge in enumerate(self._network.edges()): + temp[i, 0] = edge[0] + temp[i, 1] = edge[1] + temp[i, 2] = edge[2] + + src_gids_new = np.array([]) + nsyns_new = np.array([]) + indptr_new = [] + counter = 0 + indptr_new.append(counter) + print "Building database" + for i in range(n_nodes): + indicies = np.where(temp[:, 1] == i) + + src_gids_new = np.concatenate([src_gids_new, np.array(temp[indicies[0], 0])]) + nsyns_new = np.concatenate([nsyns_new, np.array(temp[indicies[0], 2])]) + + counter += np.size(indicies[0]) + indptr_new.append(counter) + + print "Writing to h5" + + indptr_new = np.array(indptr_new) + + src_gids_new = src_gids_new.astype(int) + print src_gids_new + exit() + + nsyns_new = nsyns_new.astype(int) + indptr_new = indptr_new.astype(int) + + with h5py.File(filename, 'w') as hf: + hf.create_dataset('indptr', data=indptr_new) + if include_nsyns: + hf.create_dataset('nsyns', data=nsyns_new) + hf.create_dataset('src_gids', data=src_gids_new) + hf.attrs["shape"] = (n_nodes, n_nodes) + """ + + def save(self, cells_fname, cell_models_fname, connections_fname, include_nsyns=True): + """Saves node (cells) and connection information to files. + + :param cells_fname: name of csv file where cell information will be saved. + :param cell_models_fname: name of csv file where cell model information will be saved. + :param connections_fname: Name of h5 file where connection information will be stored. + :param include_nsyns: set to False to build h5 without nsyn table. + """ + #self.save_nodes(cells_fname, cell_models_fname) + self.save_edges(connections_fname, include_nsyns) + + def load(self, nodes, edge_types=None, node_types=None, edges=None, positions=None): + # TODO: check imported ids + + df = pd.read_csv(nodes, sep=' ') + if node_types is not None: + types_df = pd.read_csv(node_types, sep=' ', index_col='node_type_id') + df = pd.merge(left=df, right=types_df, how='left', left_on='node_type_id', right_index=True) + + gids_df = df['node_id'] if 'node_id' in df.columns else df['id'] + #df = df.drop(['id'], axis=1) + + positions_df = None + if positions: + positions_df = df[positions] + df = df.drop(positions, axis=1) + + node_params = df.to_dict(orient='records') + node_tuples = [Node(gids_df[i], gids_df[i], None, array_params=node_params[i]) + for i in xrange(df.shape[0])] + + + if positions: + self._network.positions = position_set.PositionSet() + posr = positioner.create('points', location=positions_df.as_matrix()) + #self._network.positions.add(posr(df.shape[0]), gids_df.tolist()) + self._network.positions.add(positions_df.values, gids_df.tolist()) + + for i in xrange(df.shape[0]): + node_tuples[i]['position'] = np.array(positions_df.loc[i]) + + self._network.positions.finalize() + + self._network._initialize() + self._network._add_nodes(node_tuples) + self._network.nodes_built = True + diff --git a/bmtk-vb/build/lib/bmtk/builder/formats/hdf5_format.py b/bmtk-vb/build/lib/bmtk/builder/formats/hdf5_format.py new file mode 100644 index 0000000..a0227ca --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/formats/hdf5_format.py @@ -0,0 +1,423 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import csv +import json +import math +import h5py +import pandas as pd +from ast import literal_eval + +import bmtk +from .iformats import IFormat +from bmtk.builder.node_pool import NodePool +from time import gmtime, strftime + + +class HDF5Format(IFormat): + """ + Format prior to Blue-brain project collaboration. + Saves as: + nodes (csv) + node_types (csv) + edge_types (csv) + edges (h5) + """ + + CSV_DELIMITER = ' ' + COL_NODE_TYPE_ID = 'node_type_id' + COL_EDGE_TYPE_ID = 'edge_type_id' + COL_TARGET_QUERY = 'target_query' + COL_SOURCE_QUERY = 'source_query' + COL_NODE_ID = 'node_id' + BASE_DIR = 'network' + + @property + def format(self): + return 'msdk.HDF5Format' + + def save(self, directory, **kwargs): + """ saves nodes.csv, node_types.csv, edges.h5, edge_types.csv and .metadata.json. Will overwrite existing files. + + :param directory: Directory where all the files will be saved, creating dir if it doesn't exists. + :param kwargs: + """ + if directory is None: + base_path = os.path.join(self.BASE_DIR, self._network.name) + else: + base_path = directory + + metadata = { + 'version': bmtk.__version__, + 'name': self._network.name, + 'date_created': strftime("%Y-%m-%d %H:%M:%S", gmtime()), + 'file_format': self.format, + 'network_class': self._network.__class__.__name__ + } + + # save node-types. + node_types_path = os.path.join(base_path, 'node_types.csv') + self.save_node_types(node_types_path, **kwargs) + metadata['node_types_file'] = 'node_types.csv' + + # save individual nodes. + if self._network.nodes_built: + # make sure nodes have been built + nodes_path = os.path.join(base_path, 'nodes.csv') + self.save_nodes(nodes_path, **kwargs) + metadata['nodes_file'] = 'nodes.csv' + else: + print('Nodes not built. Unable to save to nodes.csv.') + + # save edge-types. + edge_types_path = os.path.join(base_path, 'edge_types.csv') + self.save_edge_types(edge_types_path, **kwargs) + metadata['edge_types_file'] = 'edge_types.csv' + + # save edges if they have been built + if self._network.edges_built: + edges_path = os.path.join(base_path, 'edges.h5') + self.save_edges(edges_path, **kwargs) + metadata['edges_file'] = 'edges.h5' + else: + print('Edges not built. Unable to save to edges.h5.') + + # save the metadata file + metadata_path = os.path.join(base_path, '.metadata.json') + with open(metadata_path, 'w') as mdfile: + json.dump(metadata, mdfile, indent=2) + + def save_node_types(self, file_name, columns=None, **kwargs): + """Write node_types to csv. + + :param file_name: path to csv file. Will be overwritten if it exists + :param columns: optional columns (not incl. manditory ones). If None then will use all node properties. + :param kwargs: optional + """ + self.__checkpath(file_name, **kwargs) + + # csv should always start with node_type_id + manditory_cols = [self.COL_NODE_TYPE_ID] + + # Determine which columns are in the node_types file and their order + nt_properties = self._network.node_type_properties + opt_cols = [] + if columns is None: + # use all node type properties + opt_cols = list(nt_properties) + else: + # check that columns specified by user exists + for col_name in columns: + if col_name not in nt_properties: + raise Exception('No node property {} found in network, cannot save {}.'.format(col_name, file_name)) + else: + opt_cols.append(col_name) + + # write to csv iteratively + cols = manditory_cols + opt_cols + with open(file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=self.CSV_DELIMITER) + csvw.writerow(cols) + for node_set in self._network._node_sets: + props = node_set.properties + row = [] + for cname in cols: + # TODO: determine dtype of parameters so we can use the appropiate none value + row.append(props.get(cname, 'NA')) # get column name or NA if it doesn't exists for this node + csvw.writerow(row) + + def save_nodes(self, file_name, columns=None, **kwargs): + """Write nodes to csv. + + :param file_name: path to csv file. Will be overwritten if it exists + :param columns: optional columns (not incl. manditory ones). If None then will use all node properties. + :param kwargs: optional + """ + self.__checkpath(file_name, **kwargs) + + # csv will start with node_id and node_type_id + manditory_columns = [self.COL_NODE_ID, self.COL_NODE_TYPE_ID] + + # optional columns from either node params or node-type properties + opt_columns = [] + if columns is None: + opt_columns = list(self._network.node_params) + else: + all_cols = self._network.node_params | self._network.node_type_properties + for col_name in columns: + if col_name not in all_cols: + # verify params/properties exist + raise Exception('No edge property {} found in network, cannot save {}.'.format(col_name, file_name)) + else: + opt_columns.append(col_name) + + # write to csv + with open(file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=self.CSV_DELIMITER) + csvw.writerow(manditory_columns + opt_columns) + for nid, node in self._network.nodes(): + row = [node.node_id, node.node_type_id] + for cname in opt_columns: + row.append(node.get(cname, 'NA')) + csvw.writerow(row) + + def save_edge_types(self, file_name, columns=None, **kwargs): + """Write edge-types to csv. + + :param file_name: path to csv file. Will be overwritten if it exists + :param columns: optional columns (not incl. manditory ones). If None then will use all node properties. + :param kwargs: optional + """ + self.__checkpath(file_name, **kwargs) + + # start with edge_type_id, target_query and source_query + manditory_cols = [self.COL_EDGE_TYPE_ID, self.COL_TARGET_QUERY, self.COL_SOURCE_QUERY] + + # optional columns + edge_props = self._network.edge_type_properties + opt_cols = [] + if columns is None: + opt_cols = list(edge_props) + else: + for col_name in columns: + if col_name not in edge_props: + raise Exception('No edge property {} found in network, cannot save {}.'.format(col_name, file_name)) + else: + opt_cols.append(col_name) + + # write to csv by iteratively going through all edge-types + with open(file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=self.CSV_DELIMITER) + csvw.writerow(manditory_cols + opt_cols) + for et in self._network._edge_sets: + edge = et['edge'] + targetnodes = edge.targets # get source as NodePools to get the source_query strings + sourcenodes = edge.sources # same with target + row_array = [edge.id, targetnodes.filter_str, sourcenodes.filter_str] + edge_params = edge.parameters + for col in opt_cols: + row_array.append(edge_params.get(col, 'NA')) + csvw.writerow(row_array) + + def save_edges(self, file_name, **kwargs): + """Saves edges to edges.h5 + + :param file_name: path to hdf5 file. Will be overwritten if it exists + :param kwargs: optional + """ + self.__checkpath(file_name, **kwargs) + + # Get sources, targets, nsyns and edge_type_id for all edges. + print("> building tables with %d nodes and %d edges" % (self._network.nnodes, self._network.nedges)) + indptr_table = [0] + nsyns_table = [] + src_gids_table = [] + edge_types_table = [] + for trg in self._network.nodes(): + # the targets have to be ordered. + tid = trg[1].node_id + for edges in self._network.edges([tid], rank=1): + src_gids_table.append(edges[0]) + nsyns_table.append(edges[2]) + edge_types_table.append(edges[3]) + + indptr_table.append(len(src_gids_table)) + + # save to h5 + print("> saving tables to %s" % (file_name)) + with h5py.File(file_name, 'w') as hf: + hf.create_dataset('edge_ptr', data=indptr_table) + hf.create_dataset('num_syns', data=nsyns_table) + hf.create_dataset('src_gids', data=src_gids_table) + hf.create_dataset('edge_types', data=edge_types_table) + + def __checkpath(self, file_name, **kwargs): + """Makes sure file_name is a valid file path and can be written.""" + dir_path = os.path.dirname(file_name) + if not os.path.exists(dir_path): + # create file's directory if it doesn't exist + os.makedirs(dir_path) + + def __load_nodes(self, nodes_file, node_types_file): + """Loads nodes and node_types from exists files + + :param nodes_file: path to nodes csv + :param node_types_file: path to node_types csv + """ + def eval(val): + # Helper function that can convert csv to an appropiate type. Helpful for cells of lists (positions, etc) + # TODO: keep column dtypes in metadata and use that for converting each column + if isinstance(val, float) and math.isnan(val): + return None + elif isinstance(val, basestring): + try: + # this will be helpful for turning strings into lists where appropiate "(0, 1, 2)" --> (0, 1, 2) + return literal_eval(val) + except ValueError: + return val + return val + + if nodes_file is None and node_types_file is None: + return None + + elif nodes_file is not None and node_types_file is not None: + # Get the array_params from nodes_file and properties from nodes_types_file, combine them to call + # add_nodes() function and rebuilt the nodes. + nt_df = pd.read_csv(node_types_file, self.CSV_DELIMITER) #, index_col=self.COL_NODE_TYPE_ID) + n_df = pd.read_csv(nodes_file, self.CSV_DELIMITER) + + for _, row in nt_df.iterrows(): + # iterate through the node_types, find all nodes with matching node_type_id and get those node's + # parameters as a dictionary of lists + node_type_props = {l: eval(row[l]) for l in nt_df.columns if eval(row[l]) is not None} + selected_nodes = n_df[n_df[self.COL_NODE_TYPE_ID] == row[self.COL_NODE_TYPE_ID]] + N = len(selected_nodes.axes[0]) + array_params = {l: list(selected_nodes[l]) for l in selected_nodes.columns + if l not in ['node_type_id', 'position']} + + # Special function for position_params + position = None + position_params = None + if 'position' in selected_nodes.columns: + position_params = {'location': [eval(p) for p in selected_nodes['position']]} + position = 'points' + + self._network.add_nodes(N, position=position, position_params=position_params, + array_params=array_params, **node_type_props) + + self._network._build_nodes() + + elif node_types_file is not None: + # nodes_types exists but nodes doesn't. We convert each row (node_type) in the csv to a collection + # of nodes with N=1, no array_params. + nt_df = pd.read_csv(node_types_file, self.CSV_DELIMITER) + for _, row in nt_df.iterrows(): + node_type_props = {l: eval(row[l]) for l in nt_df.columns if eval(row[l]) is not None} + self._network.add_nodes(N=1, **node_type_props) + self._network._build_nodes() + + elif nodes_file is not None: + # nodes exists but node_types doesn't. In this case group together all nodes by node_type_id and add them + # as a single population (with no node_params) + n_df = pd.read_csv(nodes_file, self.CSV_DELIMITER) + for nt_id, df in n_df.groupby(self.COL_NODE_TYPE_ID): + N = len(df.axes[0]) + array_params = {l: list(df[l]) for l in df.columns + if l not in ['node_type_id', 'position']} + + position = None + position_params = None + if 'position' in df.columns: + position_params = {'location': [eval(p) for p in df['position']]} + position = 'points' + + self._network.add_nodes(N, position=position, position_params=position_params, + array_params=array_params, node_type_id=nt_id) + self._network._build_nodes() + + def __load_edge_types(self, edges_file, edge_types_file): + """Loads edges and edge_types + + :param edges_file: path to edges hdf5 + :param edge_types_file: path to edge_types csv + """ + if edge_types_file is None and edges_file is None: + return + + if edge_types_file is not None: + # load in the edge-types. iterate through all the rows of edge_types.csv and call connect() function. + et_pd = pd.read_csv(edge_types_file, self.CSV_DELIMITER) + prop_cols = [label for label in et_pd.columns + if label not in [self.COL_SOURCE_QUERY, self.COL_TARGET_QUERY]] + + for _, row in et_pd.iterrows(): + # the connect function requires a Pool of nodes (like net.nodes()) or a dictionary filter. + source_nodes = NodePool.from_filter(self._network, row[self.COL_SOURCE_QUERY]) + target_nodes = NodePool.from_filter(self._network, row[self.COL_TARGET_QUERY]) + # TODO: evaluate edge-properties and exclude any that are None. + edge_params = {label: row[label] for label in prop_cols} + + # don't try to guess connection rule + self._network.connect(source=source_nodes, target=target_nodes, edge_params=edge_params) + + if edges_file is not None: + # Create edges from h5. + if not self._network.nodes_built: + print('The nodes have not been built. Cannot load edges file.') + return + + # load h5 tables + edges_h5 = h5py.File(edges_file, 'r') + edge_types_ds = edges_h5['edge_types'] + num_syns_ds = edges_h5['num_syns'] + src_gids_ds = edges_h5['src_gids'] + edge_ptr_ds = edges_h5['edge_ptr'] + n_edge_ptr = len(edge_ptr_ds) + + # the network needs edge-types objects while building the edges. If the edge_types_file exists then they + # would have been added in the previous section of code. If edge_types_file is missing we will create + # filler edge types based on the edge_type_id's found in edge_ptr dataset + if edge_types_file is None: + for et_id in set(edges_h5['edge_types'][:]): + self._network.connect(edge_params={self.COL_NODE_TYPE_ID: et_id}) + + # TODO: if edge_types.csv does exists we should check it has matching edge_type_ids with edges.h5/edge_ptr + + def itr_fnc(et): + # Creates a generator that will iteratively go through h5 file and return (source_gid, target_gid, + # nsyn) values for connections with matching edge_type.edge_type_id + edge_type_id = et.id + for ep_indx in xrange(n_edge_ptr - 1): + trg_gid = ep_indx + for syn_indx in xrange(edge_ptr_ds[ep_indx], edge_ptr_ds[ep_indx + 1]): + if edge_types_ds[syn_indx] == edge_type_id: + src_gid = src_gids_ds[syn_indx] + n_syn = num_syns_ds[syn_indx] + yield (src_gid, trg_gid, n_syn) + + for edge in self._network.edge_types(): + # create iterator and directly add edges + itr = itr_fnc(edge) + self._network._add_edges(edge, itr) + + self.edges_built = True + + def load_dir(self, directory, metadata): + def get_path(f): + if f not in metadata: + return None + file_name = metadata[f] + if directory is None or os.path.isabs(file_name): + return file + return os.path.join(directory, file_name) + + nodes_file = get_path('nodes_file') + node_types_file = get_path('node_types_file') + self.__load_nodes(nodes_file, node_types_file) + + edge_types_file = get_path('edge_types_file') + edges_file = get_path('edges_file') + self.__load_edge_types(edges_file, edge_types_file) + + def load(self, nodes_file=None, node_types_file=None, edges_file=None, edge_types_file=None): + self.__load_nodes(nodes_file, node_types_file) diff --git a/bmtk-vb/build/lib/bmtk/builder/formats/iformats.py b/bmtk-vb/build/lib/bmtk/builder/formats/iformats.py new file mode 100644 index 0000000..a29261e --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/formats/iformats.py @@ -0,0 +1,29 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class IFormat(object): + def __init__(self, network): + self._network = network + + @property + def format(self): + raise NotImplementedError() \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/builder/functor_cache.py b/bmtk-vb/build/lib/bmtk/builder/functor_cache.py new file mode 100644 index 0000000..0da8fc1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/functor_cache.py @@ -0,0 +1,55 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from six import string_types +import functools + + +class FunctorCache(object): + def __init__(self): + self.cache = {} + + def create(self, connector, **params): + if params is None: + params = {} + + if isinstance(connector, string_types): + # TODO: don't do this, a user may want to return a string in connection_map params + func = self.cache[connector] + return functools.partial(func, **params) + + elif isinstance(connector, dict): + return lambda *args: connector + + elif isinstance(connector, list): + # for the iterator we want to pass backs lists as they are + return connector + + elif callable(connector): + return functools.partial(connector, **params) + + else: + # should include all numericals, non-callable objects and tuples + return lambda *args: connector + + def register(self, name, func): + self.cache[name] = func diff --git a/bmtk-vb/build/lib/bmtk/builder/id_generator.py b/bmtk-vb/build/lib/bmtk/builder/id_generator.py new file mode 100644 index 0000000..9d7b798 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/id_generator.py @@ -0,0 +1,71 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import threading +import numpy as np +import six + + + +class IDGenerator(object): + """ A simple class for fetching global ids. To get a unqiue global ID class next(), which should be thread-safe. It + Also has a remove_id(gid) in which case next() will never return the gid. The remove_id function is used for cases + when using imported networks and we want to elimnate previously created id. + + TODO: + * Implement a bit array to keep track of already existing gids + * It might be necessary to implement with MPI support? + """ + def __init__(self, init_val=0): + self.__counter = init_val + self.__taken = set() + self.__lock = threading.Lock() + + def remove_id(self, gid): + assert(np.issubdtype(type(gid), np.integer)) + if gid >= self.__counter: + self.__taken.add(gid) + + def next(self): + self.__lock.acquire() + while self.__counter in self.__taken: + self.__taken.remove(self.__counter) + self.__counter += 1 + + nid = self.__counter + self.__counter += 1 + self.__lock.release() + + return nid + + def __contains__(self, gid): + return gid < self.__counter + + def __call__(self, *args, **kwargs): + if len(args) == 1: + N = args[0] + elif 'N' in 'kwargs': + N = args['N'] + + assert(isinstance(N, (int, long))) + return [self.next() for _ in six.moves.range(N)] + diff --git a/bmtk-vb/build/lib/bmtk/builder/io/__init__.py b/bmtk-vb/build/lib/bmtk/builder/io/__init__.py new file mode 100644 index 0000000..00a458f --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/io/__init__.py @@ -0,0 +1,66 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +from ..network import Network + +def write_edges_to_h5(network, filename, synapse_key=None, verbose=True): + assert(isinstance(network, Network)) + + # The network edges may either be a raw value, dictionary or list + if synapse_key == None: + lookup = lambda x: x + + elif isinstance(synapse_key, str): + lookup = lambda x: x[synapse_key] + + elif isinstance(synapse_key, int): + lookup = lambda x: x[synapse_key] + + else: + raise Exception("Unable to resolve the synapse_key type.") + + # Create the tables for indptr, nsyns and src_gids + if verbose: + print("> building tables with {} nodes and {} edges.".format(network.nnodes, network.nedges)) + indptr_table = [0] + nsyns_table = [] + src_gids_table = [] + for trg in network.nodes(): + # TODO: check the order of the node list + tid = trg[1]['id'] + for edges in network.edges([tid], rank=1): + src_gids_table.append(edges[0]) + nsyns_table.append(lookup(edges[2])) + + if len(src_gids_table) == indptr_table[-1]: + print("node %d doesn't have any edges {}".format(tid)) + indptr_table.append(len(src_gids_table)) + + # Save the tables in h5 format + if verbose: + print("> Saving table to {}.".format(filename)) + with h5py.File(filename, 'w') as hf: + hf.create_dataset('indptr', data=indptr_table) + hf.create_dataset('nsyns', data=nsyns_table) + hf.create_dataset('src_gids', data=src_gids_table, dtype=int32) + hf.attrs["shape"] = (network.nnodes, network.nnodes) diff --git a/bmtk-vb/build/lib/bmtk/builder/iterator.py b/bmtk-vb/build/lib/bmtk/builder/iterator.py new file mode 100644 index 0000000..1469cfa --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/iterator.py @@ -0,0 +1,124 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import itertools +import functools +import types + + +class IteratorCache(object): + def __init__(self): + self.cache = {} + + def create(self, itr_name, itr_type, **params): + if params is None: + params = {} + + if (itr_name, itr_type) in self.cache: + func = self.cache[(itr_name, itr_type)] + return functools.partial(func, **params) + + else: + raise Exception("Couldn't find iterator for ({}, {}).".format(itr_name, itr_type)) + + def register(self, name, itr_type, func): + self.cache[(name, itr_type)] = func + + +def create(iterator, connector, **params): + return ITERATOR_CACHE.create(iterator, type(connector), **params) + + +def register(name, dtype, func): + ITERATOR_CACHE.register(name, dtype, func) + + +######################################################################## +# Pre-defined iterators +######################################################################## +def one_to_all_iterator(source_nodes, target_nodes, connector): + """Calls the connector function with (1 source, all targets), iterated for each source""" + target_list = list(target_nodes) # list of all targets + target_node_ids = [t.node_id for t in target_list] # slight improvement than calling node_id S*T times + for source in source_nodes: + source_node_id = source.node_id + edge_vals = connector(source, target_list) + for i, target in enumerate(target_list): + yield (source_node_id, target_node_ids[i], edge_vals[i]) + + +def all_to_one_iterator(source_nodes, target_nodes, connector): + """Iterate through all the target nodes and return target node + list of all sources""" + source_list = list(source_nodes) + for target in target_nodes: + val = connector(source_list, target) + for i, source in enumerate(source_list): + yield (source.node_id, target.node_id, val[i]) + + +def one_to_one_iterator(source_nodes, target_nodes, connector): + # TODO: may be faster to pull out the node_ids, don't user itertools + for source, target in itertools.product(source_nodes, target_nodes): + val = connector(source, target) + yield (source.node_id, target.node_id, val) + + +def one_to_one_list_iterator(source_nodes, target_nodes, vals): + assert(len(vals) == len(source_nodes)*len(target_nodes)) + for i, (source, target) in enumerate(itertools.product(source_nodes, target_nodes)): + yield (source.node_id, target.node_id, vals[i]) + + +def one_to_all_list_iterator(source_nodes, target_nodes, vals): + assert(len(vals) == len(target_nodes)) + source_ids = [s.node_id for s in list(source_nodes)] + target_ids = [t.node_id for t in list(target_nodes)] + for src_id in source_ids: + for i, trg_id in enumerate(target_ids): + yield (src_id, trg_id, vals[i]) + + +def all_to_one_list_iterator(source_nodes, target_nodes, vals): + assert(len(vals) == len(source_nodes)) + source_ids = [s.node_id for s in list(source_nodes)] + target_ids = [t.node_id for t in list(target_nodes)] + for trg_id in target_ids: + for i, src_id in enumerate(source_ids): + yield (src_id, trg_id, vals[i]) + + +def lambda_iterator(source_nodes, target_nodes, lambda_val): + for source, target in itertools.product(source_nodes, target_nodes): + yield (source.node_id, target.node_id, lambda_val()) + + +ITERATOR_CACHE = IteratorCache() +register('one_to_one', functools.partial, one_to_one_iterator) +register('all_to_one', functools.partial, all_to_one_iterator) +register('one_to_all', functools.partial, one_to_all_iterator) + +register('one_to_one', list, one_to_one_list_iterator) +register('one_to_all', list, one_to_all_list_iterator) +register('all_to_one', list, all_to_one_list_iterator) + + +register('one_to_one', types.FunctionType, lambda_iterator) diff --git a/bmtk-vb/build/lib/bmtk/builder/network.py b/bmtk-vb/build/lib/bmtk/builder/network.py new file mode 100644 index 0000000..90d3ac1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/network.py @@ -0,0 +1,478 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import numpy as np +import types +import csv +import six + +from .node_pool import NodePool +from .connection_map import ConnectionMap +from .node_set import NodeSet +from .id_generator import IDGenerator + + +class Network (object): + def __init__(self, name, **network_props): + if len(name) == 0: + raise Exception('Network name missing.') + + self._network_name = name + + self._nnodes = 0 + self._nodes_built = False + self._nedges = 0 + self._edges_built = False + + self._node_sets = [] + self.__external_node_sets = [] + self.__node_id_counter = 0 + + self._node_types_properties = {} + self._node_types_columns = set(['node_type_id']) + # self._edge_type_properties = {} + # self._edge_types_columns = set(['edge_type_id']) + self._connection_maps = [] + #self._connection_maps = ConnectionTable() + + self._node_id_gen = IDGenerator() + self._node_type_id_gen = IDGenerator(100) + self._edge_type_id_gen = IDGenerator(100) + + #self._connection_table = [] + #self._source_networks = [] + #self._target_networks = [] + self._network_conns = set() + self._connected_networks = {} + + @property + def name(self): + return self._network_name + + @property + def nodes_built(self): + return self._nodes_built + + @property + def edges_built(self): + return self._edges_built + + @property + def nnodes(self): + raise NotImplementedError + + @property + def nedges(self): + raise NotImplementedError + + def get_connections(self): + return self._connection_maps + + def _add_node_type(self, props): + node_type_id = props.get('node_type_id', None) + if node_type_id is None: + node_type_id = self._node_type_id_gen.next() + else: + if node_type_id in self._node_types_properties: + raise Exception('node_type_id {} already exists.'.format(node_type_id)) + self._node_type_id_gen.remove_id(node_type_id) + + props['node_type_id'] = node_type_id + self._node_types_properties[node_type_id] = props + + def add_nodes(self, N=1, **properties): + self._clear() + + # categorize properties as either a node-params (for nodes file) or node-type-property (for node_types files) + node_params = {} + node_properties = {} + for prop_name, prop_value in properties.items(): + if isinstance(prop_value, (list, np.ndarray)): # TODO: what about pandas series + n_props = len(prop_value) + if n_props != N: + raise Exception('Trying to pass in array of length {} into N={} nodes'.format(n_props, N)) + node_params[prop_name] = prop_value + + elif isinstance(prop_value, types.GeneratorType): + vals = list(prop_value) + assert(len(vals) == N) + node_params[prop_name] = vals + + else: + node_properties[prop_name] = prop_value + self._node_types_columns.add(prop_name) + + # If node-type-id exists, make sure there is no clash, otherwise generate a new id. + if 'node_type_id' in node_params: + raise Exception('There can be only one "node_type_id" per set of nodes.') + + self._add_node_type(node_properties) + self._node_sets.append(NodeSet(N, node_params, node_properties)) + + def add_edges(self, source=None, target=None, connection_rule=1, connection_params=None, iterator='one_to_one', + **edge_type_properties): + # TODO: check edge_type_properties for 'edge_type_id' and make sure there isn't a collision. Otherwise create + # a new id. + if not isinstance(source, NodePool): + source = NodePool(self, **source or {}) + + if not isinstance(target, NodePool): + target = NodePool(self, **target or {}) + + self._network_conns.add((source.network_name, target.network_name)) + self._connected_networks[source.network_name] = source.network + self._connected_networks[target.network_name] = target.network + + # TODO: make sure that they don't add a dictionary or some other wried property type. + edge_type_id = edge_type_properties.get('edge_type_id', None) + if edge_type_id is None: + edge_type_id = self._edge_type_id_gen.next() + edge_type_properties['edge_type_id'] = edge_type_id + elif edge_type_id in self._edge_type_id_gen: + raise Exception('edge_type_id {} already exists.'.format(edge_type_id)) + else: + self._edge_type_id_gen.remove_id(edge_type_id) + + edge_type_properties['source_query'] = source.filter_str + edge_type_properties['target_query'] = target.filter_str + + if 'nsyns' in edge_type_properties: + connection_rule = edge_type_properties['nsyns'] + del edge_type_properties['nsyns'] + + # self._edge_types_columns.update(edge_type_properties.keys()) + connection = ConnectionMap(source, target, connection_rule, connection_params, iterator, edge_type_properties) + self._connection_maps.append(connection) + # self._connection_maps.add(source.network_name, target.network_name, connection) + return connection + + def nodes(self, **properties): + if not self.nodes_built: + self._build_nodes() + + return NodePool(self, **properties) + + def nodes_iter(self, nids=None): + raise NotImplementedError + + def edges(self, target_nodes=None, source_nodes=None, target_network=None, source_network=None, **properties): + """Returns a list of dictionary-like Edge objects, given filter parameters. + + To get all edges from a network + edges = net.edges() + + To specify the target and/or source node-set + edges = net.edges(target_nodes=net.nodes(type='biophysical'), source_nodes=net.nodes(ei='i')) + + To only get edges with a given edge_property + edges = net.edges(weight=100, syn_type='AMPA_Exc2Exc') + + :param target_nodes: gid, list of gid, dict or node-pool. Set of target nodes for a given edge. + :param source_nodes: gid, list of gid, dict or node-pool. Set of source nodes for a given edge. + :param target_network: name of network containing target nodes. + :param source_network: name of network containing source nodes. + :param properties: edge-properties used to filter out only certain edges. + :return: list of bmtk.builder.edge.Edge properties. + """ + def nodes2gids(nodes, network): + """helper function for converting target and source nodes into list of gids""" + if nodes is None or isinstance(nodes, list): + return nodes, network + if isinstance(nodes, int): + return [nodes], network + if isinstance(nodes, dict): + network = network or self._network_name + nodes = self._connected_networks[network].nodes(**nodes) + if isinstance(nodes, NodePool): + if network is not None and nodes.network_name != network: + print('Warning. nodes and network don not match') + return [n.node_id for n in nodes], nodes.network_name + else: + raise Exception('Couldnt convert nodes') + + def filter_edges(e): + """Returns true only if all the properities match for a given edge""" + for k, v in properties.items(): + if k not in e: + return False + if e[k] != v: + return False + return True + + if not self.edges_built: + self.build() + + # trg_gids can't be none for edges_itr. if target-nodes is not explicity states get all target_gids that + # synapse onto or from current network. + if target_nodes is None: + trg_gid_set = set(n.node_id for cm in self._connection_maps for n in cm.target_nodes) + target_nodes = sorted(trg_gid_set) + + # convert target/source nodes into a list of their gids + trg_gids, trg_net = nodes2gids(target_nodes, target_network) + src_gids, src_net = nodes2gids(source_nodes, source_network) + + # use the iterator to get edges and return as a list + if properties is None: + edges = list(self.edges_iter(trg_gids=trg_gids, trg_network=trg_net, src_network=src_net)) + else: + # filter out certain edges using the properties parameters + edges = [e for e in self.edges_iter(trg_gids=trg_gids, trg_network=trg_net, src_network=src_net) + if filter_edges(e)] + + if src_gids is not None: + # if src_gids are set filter out edges some more + edges = [e for e in edges if e.source_gid in src_gids] + + return edges + + def edges_iter(self, trg_gids, src_network=None, trg_network=None): + """Given a list of target gids, returns a generator for iteratoring over all possible edges. + + It is preferable to use edges() method instead, it allows more flexibibility in the input and can better + indicate if their is a problem. + + The order of the edges returned will be in the same order as the trg_gids list, but does not guarentee any + secondary ordering by source-nodes and/or edge-type. If their isn't a edge with a matching target-id then + it will skip that gid in the list, the size of the generator can 0 to arbitrarly large. + + :param trg_gids: list of gids to match with an edge's target. + :param src_network: str, only returns edges coming from the specified source network. + :param trg_network: str, only returns edges coming from the specified target network. + :return: iteration of bmtk.build.edge.Edge objects representing given edge. + """ + raise NotImplementedError + + def clear(self): + self._nodes_built = False + self._edges_built = False + self._clear() + + def _node_id(self, N): + for i in six.moves.range(N): + yield self.__node_id_counter + self.__node_id_counter += 1 + + def _build_nodes(self): + """Builds or rebuilds all the nodes, clear out both node and edge sets.""" + # print 'build_nodes' + self._clear() + self._initialize() + + for ns in self._node_sets: + nodes = ns.build(nid_generator=self._node_id) + self._add_nodes(nodes) + self._nodes_built = True + + def __build_edges(self): + """Builds network edges""" + if not self.nodes_built: + # only rebuild nodes if necessary. + self._build_nodes() + + for i, conn_map in enumerate(self._connection_maps): + # print conn_map + self._add_edges(conn_map, i) + + self._edges_built = True + + def build(self, force=False): + """ Builds nodes (assigns gids) and edges. + + Args: + force (bool): set true to force complete rebuilding of nodes and edges, if nodes() or save_nodes() has been + called before then forcing a rebuild may change gids of each node. + """ + + # if nodes() or save_nodes() is called by user prior to calling build() - make sure the nodes + # are completely rebuilt (unless a node set has been added). + if force: + self._clear() + self._initialize() + self._build_nodes() + + # always build the edges. + self.__build_edges() + + def __get_path(self, filename, path_dir, ftype): + if filename is None: + fname = '{}_{}'.format(self.name, ftype) + return os.path.join(path_dir, fname) + elif os.path.isabs(filename): + return filename + else: + return os.path.join(path_dir, filename) + + def save(self, output_dir='.'): + self.save_nodes(output_dir=output_dir) + self.save_edges(output_dir=output_dir) + + def save_nodes(self, nodes_file_name=None, node_types_file_name=None, output_dir='.', force_overwrite=True): + nodes_file = self.__get_path(nodes_file_name, output_dir, 'nodes.h5') + if not force_overwrite and os.path.exists(nodes_file): + raise Exception('File {} exists. Please use different name or use force_overwrite'.format(nodes_file)) + nf_dir = os.path.dirname(nodes_file) + if not os.path.exists(nf_dir): + os.makedirs(nf_dir) + + node_types_file = self.__get_path(node_types_file_name, output_dir, 'node_types.csv') + if not force_overwrite and os.path.exists(node_types_file): + raise Exception('File {} exists. Please use different name or use force_overwrite'.format(node_types_file)) + ntf_dir = os.path.dirname(node_types_file) + if not os.path.exists(ntf_dir): + os.makedirs(ntf_dir) + + self._save_nodes(nodes_file) + self._save_node_types(node_types_file) + + def _save_nodes(self, nodes_file_name): + raise NotImplementedError + + def _save_node_types(self, node_types_file_name): + node_types_cols = ['node_type_id'] + [col for col in self._node_types_columns if col != 'node_type_id'] + with open(node_types_file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=' ') + csvw.writerow(node_types_cols) + for node_type in self._node_types_properties.values(): + csvw.writerow([node_type.get(cname, 'NULL') for cname in node_types_cols]) + + def import_nodes(self, nodes_file_name, node_types_file_name): + raise NotImplementedError + + def save_edges(self, edges_file_name=None, edge_types_file_name=None, output_dir='.', src_network=None, + trg_network=None, name=None, force_build=True, force_overwrite=False): + # Make sure edges exists and are built + if len(self._connection_maps) == 0: + print("Warning: no edges have been made for this network, skipping saving.") + return + + if self._edges_built is False: + if force_build: + print("Message: building edges") + self.__build_edges() + else: + print("Warning: Edges are not built. Either call build() or use force_build parameter. Skip saving.") + return + + network_params = [(s, t, s+'_'+t+'_edges.h5', s+'_'+t+'_edge_types.csv') for s, t in list(self._network_conns)] + if src_network is not None: + network_params = [p for p in network_params if p[0] == src_network] + + if trg_network is not None: + network_params = [p for p in network_params if p[1] == trg_network] + + if len(network_params) == 0: + print("Warning: couldn't find connections. Skip saving.") + return + + if (edges_file_name or edge_types_file_name) is not None: + network_params = [(network_params[0][0], network_params[0][1], edges_file_name, edge_types_file_name)] + + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + for p in network_params: + if p[3] is not None: + self._save_edge_types(os.path.join(output_dir, p[3]), p[0], p[1]) + + if p[2] is not None: + self._save_edges(os.path.join(output_dir, p[2]), p[0], p[1], name) + + def _save_edge_types(self, edge_types_file_name, src_network, trg_network): + + # Get edge-type properties for connections with matching source/target networks + matching_et = [c.edge_type_properties for c in self._connection_maps + if c.source_network_name == src_network and c.target_network_name == trg_network] + + # Get edge-type properties that are only relevant for this source-target network pair + cols = ['edge_type_id', 'target_query', 'source_query'] # manditory and should come first + merged_keys = [k for et in matching_et for k in et.keys() if k not in cols] + cols += list(set(merged_keys)) + + # Write to csv + with open(edge_types_file_name, 'w') as csvfile: + csvw = csv.writer(csvfile, delimiter=' ') + csvw.writerow(cols) + for edge_type in matching_et: + csvw.writerow([edge_type.get(cname, 'NULL') if edge_type.get(cname, 'NULL') is not None else 'NULL' + for cname in cols]) + + def _save_edges(self, edges_file_name, src_network, trg_network): + raise NotImplementedError + + def _initialize(self): + raise NotImplementedError + + def _add_nodes(self, node_tuples): + raise NotImplementedError + + def _add_edges(self, edge_tuples, i): + raise NotImplementedError + + def _clear(self): + raise NotImplementedError + + """ + def _edges_iter(targets=None, sources=None): + raise NotImplementedError + """ + +""" +class ConnectionTable(object): + def __init__(self): + self.__targets = {} + self.__sources = {} + self.__connections = [] + + def add(self, source_network, target_network, connection_map): + # TODO: If the source/target are network objects we can get the network_name + assert(isinstance(source_network, basestring)) + assert(isinstance(target_network, basestring)) + assert(isinstance(connection_map, ConnectionMap)) + + if source_network not in self.__sources: + self.__sources[source_network] = [] + if target_network not in self.__targets: + self.__targets[target_network] = [] + + cm_index = len(self.__connections) + self.__connections.append(connection_map) + self.__sources[source_network].append(cm_index) + self.__targets[target_network].append(cm_index) + + def get(self, source_network=None, target_network=None): + # TODO: Add warning if source/target network is not found + cm_indicies = set(range(len(self.__connections))) + if source_network is not None: + cm_indicies &= set(self.__sources.get(source_network, [])) + + if target_network is not None: + cm_indicies &= set(self.__targets.get(target_network, [])) + + return self.__connections[cm_indicies] +""" + + + + + diff --git a/bmtk-vb/build/lib/bmtk/builder/networks/__init__.py b/bmtk-vb/build/lib/bmtk/builder/networks/__init__.py new file mode 100644 index 0000000..45b0922 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/networks/__init__.py @@ -0,0 +1,30 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .dm_network import DenseNetwork +NetworkBuilder = dm_network.DenseNetwork + +try: + # If mpi4py is installed let users access MPIBuilder for parallel building networks + from .mpi_network import MPINetwork, MPINetwork as MPIBuilder +except ImportError as err: + pass diff --git a/bmtk-vb/build/lib/bmtk/builder/networks/dm_network.py b/bmtk-vb/build/lib/bmtk/builder/networks/dm_network.py new file mode 100644 index 0000000..b6547dc --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/networks/dm_network.py @@ -0,0 +1,487 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import numpy as np +import h5py +import six +import csv + +from ..network import Network +from bmtk.builder.node import Node +from bmtk.builder.edge import Edge +from bmtk.utils import sonata + + +class DenseNetwork(Network): + def __init__(self, name, **network_props): + super(DenseNetwork, self).__init__(name, **network_props or {}) + + self.__edges_types = {} + self.__src_mapping = {} + + self.__networks = {} + self.__node_count = 0 + self._nodes = [] + + self.__edges_tables = [] + self._target_networks = {} + + def _initialize(self): + self.__id_map = [] + self.__lookup = [] + + def _add_nodes(self, nodes): + self._nodes.extend(nodes) + self._nnodes = len(self._nodes) + + """ + id_label = 'node_id' if 'node_id' in nodes[0].keys() else 'id' + + start_idx = len(self.__id_map) # + self.__id_map += [n[id_label] for n in nodes] + self.__nodes += [(interal_id, nodes[node_idx]) + for node_idx, interal_id in enumerate(xrange(start_idx, len(self.__id_map)))] + + assert(len(self.__id_map) == len(self.__nodes)) + """ + + def edges_table(self): + return self.__edges_tables + + def _save_nodes(self, nodes_file_name): + if not self._nodes_built: + self._build_nodes() + + # save the node_types file + # TODO: how do we add attributes to the h5 + group_indx = 0 + groups_lookup = {} + group_indicies = {} + group_props = {} + for ns in self._node_sets: + if ns.params_hash in groups_lookup: + continue + else: + groups_lookup[ns.params_hash] = group_indx + group_indicies[group_indx] = 0 + group_props[group_indx] = {k: [] for k in ns.params_keys if k != 'node_id'} + group_indx += 1 + + node_gid_table = np.zeros(self._nnodes) # todo: set dtypes + node_type_id_table = np.zeros(self._nnodes) + node_group_table = np.zeros(self._nnodes) + node_group_index_tables = np.zeros(self._nnodes) + + for i, node in enumerate(self.nodes()): + node_gid_table[i] = node.node_id + node_type_id_table[i] = node.node_type_id + group_id = groups_lookup[node.params_hash] + node_group_table[i] = group_id + node_group_index_tables[i] = group_indicies[group_id] + group_indicies[group_id] += 1 + + group_dict = group_props[group_id] + for key, prop_ds in group_dict.items(): + prop_ds.append(node.params[key]) + + # TODO: open in append mode + with h5py.File(nodes_file_name, 'w') as hf: + # Add magic and version attribute + add_hdf5_attrs(hf) + + pop_grp = hf.create_group('/nodes/{}'.format(self.name)) + pop_grp.create_dataset('node_id', data=node_gid_table, dtype='uint64') + pop_grp.create_dataset('node_type_id', data=node_type_id_table, dtype='uint64') + pop_grp.create_dataset('node_group_id', data=node_group_table, dtype='uint32') + pop_grp.create_dataset('node_group_index', data=node_group_index_tables, dtype='uint64') + + for grp_id, props in group_props.items(): + model_grp = pop_grp.create_group('{}'.format(grp_id)) + + for key, dataset in props.items(): + # ds_path = 'nodes/{}/{}'.format(grp_id, key) + try: + model_grp.create_dataset(key, data=dataset) + except TypeError: + str_list = [str(d) for d in dataset] + hf.create_dataset(key, data=str_list) + + def nodes_iter(self, node_ids=None): + if node_ids is not None: + return [n for n in self._nodes if n.node_id in node_ids] + else: + return self._nodes + + def _process_nodepool(self, nodepool): + return nodepool + + def import_nodes(self, nodes_file_name, node_types_file_name, population=None): + sonata_file = sonata.File(data_files=nodes_file_name, data_type_files=node_types_file_name) + if sonata_file.nodes is None: + raise Exception('nodes file {} does not have any nodes.'.format(nodes_file_name)) + + populations = sonata_file.nodes.populations + if len(populations) == 1: + node_pop = populations[0] + elif population is None: + raise Exception('The nodes file {} contains multiple populations.'.format(nodes_file_name) + + 'Please specify population parameter.') + else: + for pop in populations: + if pop.name == population: + node_pop = pop + break + else: + raise Exception('Nodes file {} does not contain population {}.'.format(nodes_file_name, population)) + + # print node_pop.node_types_table + for node_type_props in node_pop.node_types_table: + self._add_node_type(node_type_props) + + for node in node_pop: + self._node_id_gen.remove_id(node.node_id) + self._nodes.append(Node(node.node_id, node.group_props, node.node_type_properties)) + + def _add_edges(self, connection_map, i): + syn_table = self.EdgeTable(connection_map) + connections = connection_map.connection_itr() + for con in connections: + if con[2] is not None: + syn_table[con[0], con[1]] = con[2] + + target_net = connection_map.target_nodes + self._target_networks[target_net.network_name] = target_net.network + + nsyns = np.sum(syn_table.nsyn_table) + self._nedges += int(nsyns) + edge_table = {'syn_table': syn_table, + 'nsyns': nsyns, + 'edge_types': connection_map.edge_type_properties, + 'edge_type_id': connection_map.edge_type_properties['edge_type_id'], + 'source_network': connection_map.source_nodes.network_name, + 'target_network': connection_map.target_nodes.network_name, + 'params': {}, + 'params_dtypes': {}, + 'source_query': connection_map.source_nodes.filter_str, + 'target_query': connection_map.target_nodes.filter_str} + + + for param in connection_map.params: + rule = param.rule + param_names = param.names + edge_table['params_dtypes'].update(param.dtypes) + if isinstance(param_names, list) or isinstance(param_names, tuple): + tmp_tables = [self.PropertyTable(nsyns) for _ in range(len(param_names))] + for source in connection_map.source_nodes: + src_node_id = source.node_id + for target in connection_map.target_nodes: + trg_node_id = target.node_id # TODO: pull this out and put in it's own list + for _ in range(syn_table[src_node_id, trg_node_id]): + pvals = rule(source, target) + for i in range(len(param_names)): + tmp_tables[i][src_node_id, trg_node_id] = pvals[i] + + for i, name in enumerate(param_names): + # TODO: I think a copy constructor might get called, move this out. + edge_table['params'][name] = tmp_tables[i] + + else: + pt = self.PropertyTable(np.sum(nsyns)) + for source in connection_map.source_nodes: + src_node_id = source.node_id + for target in connection_map.target_nodes: + trg_node_id = target.node_id # TODO: pull this out and put in it's own list + #print('{}, {}: {}'.format(src_node_id, trg_node_id, edge_table[src_node_id, trg_node_id])) + for _ in range(syn_table[src_node_id, trg_node_id]): + pt[src_node_id, trg_node_id] = rule(source, target) + edge_table['params'][param_names] = pt + + self.__edges_tables.append(edge_table) + + def _save_edges(self, edges_file_name, src_network, trg_network, name=None): + groups = {} + group_dtypes = {} # TODO: this should be stored in PropertyTable + grp_id_itr = 0 + groups_lookup = {} + total_syns = 0 + + matching_edge_tables = [et for et in self.__edges_tables + if et['source_network'] == src_network and et['target_network'] == trg_network] + + for ets in matching_edge_tables: + params_hash = str(ets['params'].keys()) + group_id = groups_lookup.get(params_hash, None) + if group_id is None: + group_id = grp_id_itr + groups_lookup[params_hash] = group_id + grp_id_itr += 1 + + ets['group_id'] = group_id + groups[group_id] = {} + group_dtypes[group_id] = ets['params_dtypes'] + for param_name in ets['params'].keys(): + groups[group_id][param_name] = [] + + total_syns += int(ets['nsyns']) + + group_index_itrs = [0 for _ in range(grp_id_itr)] + trg_gids = np.zeros(total_syns) # set dtype to uint64 + src_gids = np.zeros(total_syns) + edge_groups = np.zeros(total_syns) # dtype uint16 or uint8 + edge_group_index = np.zeros(total_syns) # uint32 + edge_type_ids = np.zeros(total_syns) # uint32 + + # TODO: Another potential issue if node-ids don't start with 0 + index_ptrs = np.zeros(len(self._target_networks[trg_network].nodes()) + 1) + #index_ptrs = np.zeros(len(self._nodes)+1) # TODO: issue when target nodes come from another network + index_ptr_itr = 0 + + gid_indx = 0 + for trg_node in self._target_networks[trg_network].nodes(): + index_ptrs[index_ptr_itr] = gid_indx + index_ptr_itr += 1 + + for ets in matching_edge_tables: + edge_group_id = ets['group_id'] + group_table = groups[edge_group_id] + + syn_table = ets['syn_table'] + if syn_table.has_target(trg_node.node_id): + if ets['params']: + for src_id, nsyns in syn_table.trg_itr(trg_node.node_id): + # Add on to the edges index + indx_end = gid_indx+nsyns + while gid_indx < indx_end: + trg_gids[gid_indx] = trg_node.node_id + src_gids[gid_indx] = src_id + edge_type_ids[gid_indx] = ets['edge_type_id'] + edge_groups[gid_indx] = edge_group_id + edge_group_index[gid_indx] = group_index_itrs[edge_group_id] + group_index_itrs[edge_group_id] += 1 + gid_indx += 1 + + for param_name, param_table in ets['params'].items(): + param_vals = group_table[param_name] + for val in param_table.itr_vals(src_id, trg_node.node_id): + param_vals.append(val) + + else: + # If no properties just print nsyns table. + if 'nsyns' not in group_table: + group_table['nsyns'] = [] + group_dtypes[edge_group_id]['nsyns'] = 'uint16' + for src_id, nsyns in syn_table.trg_itr(trg_node.node_id): + trg_gids[gid_indx] = trg_node.node_id + src_gids[gid_indx] = src_id + edge_type_ids[gid_indx] = ets['edge_type_id'] + edge_groups[gid_indx] = edge_group_id + edge_group_index[gid_indx] = group_index_itrs[edge_group_id] + # group_dtypes + group_index_itrs[edge_group_id] += 1 + gid_indx += 1 + + group_table['nsyns'].append(nsyns) + + trg_gids = trg_gids[:gid_indx] + src_gids = src_gids[:gid_indx] + edge_groups = edge_groups[:gid_indx] + edge_group_index = edge_group_index[:gid_indx] + edge_type_ids = edge_type_ids[:gid_indx] + + pop_name = '{}_to_{}'.format(src_network, trg_network) if name is None else name + + index_ptrs[index_ptr_itr] = gid_indx + with h5py.File(edges_file_name, 'w') as hf: + add_hdf5_attrs(hf) + pop_grp = hf.create_group('/edges/{}'.format(pop_name)) + pop_grp.create_dataset('target_node_id', data=trg_gids, dtype='uint64') + pop_grp['target_node_id'].attrs['node_population'] = trg_network + pop_grp.create_dataset('source_node_id', data=src_gids, dtype='uint64') + pop_grp['source_node_id'].attrs['node_population'] = src_network + + pop_grp.create_dataset('edge_group_id', data=edge_groups, dtype='uint16') + pop_grp.create_dataset('edge_group_index', data=edge_group_index, dtype='uint32') + pop_grp.create_dataset('edge_type_id', data=edge_type_ids, dtype='uint32') + # pop_grp.create_dataset('edges/index_pointer', data=index_ptrs, dtype='uint32') + + for group_id, params_dict in groups.items(): + model_grp = pop_grp.create_group(str(group_id)) + for params_key, params_vals in params_dict.items(): + #group_path = 'edges/{}/{}'.format(group_id, params_key) + dtype = group_dtypes[group_id][params_key] + if dtype is not None: + model_grp.create_dataset(params_key, data=list(params_vals), dtype=dtype) + else: + model_grp.create_dataset(params_key, data=list(params_vals)) + + self._create_index(pop_grp['target_node_id'], pop_grp, index_type='target') + self._create_index(pop_grp['source_node_id'], pop_grp, index_type='source') + + def _create_index(self, node_ids_ds, output_grp, index_type='target'): + if index_type == 'target': + edge_nodes = np.array(node_ids_ds, dtype=np.int64) + output_grp = output_grp.create_group('indicies/target_to_source') + elif index_type == 'source': + edge_nodes = np.array(node_ids_ds, dtype=np.int64) + output_grp = output_grp.create_group('indicies/source_to_target') + + edge_nodes = np.append(edge_nodes, [-1]) + n_targets = np.max(edge_nodes) + ranges_list = [[] for _ in six.moves.range(n_targets + 1)] + + n_ranges = 0 + begin_index = 0 + cur_trg = edge_nodes[begin_index] + for end_index, trg_gid in enumerate(edge_nodes): + if cur_trg != trg_gid: + ranges_list[cur_trg].append((begin_index, end_index)) + cur_trg = int(trg_gid) + begin_index = end_index + n_ranges += 1 + + node_id_to_range = np.zeros((n_targets + 1, 2)) + range_to_edge_id = np.zeros((n_ranges, 2)) + range_index = 0 + for node_index, trg_ranges in enumerate(ranges_list): + if len(trg_ranges) > 0: + node_id_to_range[node_index, 0] = range_index + for r in trg_ranges: + range_to_edge_id[range_index, :] = r + range_index += 1 + node_id_to_range[node_index, 1] = range_index + + output_grp.create_dataset('range_to_edge_id', data=range_to_edge_id, dtype='uint64') + output_grp.create_dataset('node_id_to_range', data=node_id_to_range, dtype='uint64') + + def _clear(self): + self._nedges = 0 + self._nnodes = 0 + + def edges_iter(self, trg_gids, src_network=None, trg_network=None): + matching_edge_tables = self.__edges_tables + if trg_network is not None: + matching_edge_tables = [et for et in self.__edges_tables if et['target_network'] == trg_network] + + if src_network is not None: + matching_edge_tables = [et for et in matching_edge_tables if et['source_network'] == src_network] + + for trg_gid in trg_gids: + for ets in matching_edge_tables: + syn_table = ets['syn_table'] + if syn_table.has_target(trg_gid): + for src_id, nsyns in syn_table.trg_itr(trg_gid): + if ets['params']: + synapses = [{} for _ in range(nsyns)] + for param_name, param_table in ets['params'].items(): + for i, val in enumerate(param_table[src_id, trg_gid]): + synapses[i][param_name] = val + for syn_prop in synapses: + yield Edge(src_gid=src_id, trg_gid=trg_gid, edge_type_props=ets['edge_types'], + syn_props=syn_prop) + else: + yield Edge(src_gid=src_id, trg_gid=trg_gid, edge_type_props=ets['edge_types'], + syn_props={'nsyns': nsyns}) + + @property + def nnodes(self): + if not self.nodes_built: + return 0 + return self._nnodes + + @property + def nedges(self): + return self._nedges + + class EdgeTable(object): + def __init__(self, connection_map): + # TODO: save column and row lengths + # Create maps between source_node gids and their row in the matrix. + self.__idx2src = [n.node_id for n in connection_map.source_nodes] + self.__src2idx = {node_id: i for i, node_id in enumerate(self.__idx2src)} + + # Create maps betwee target_node gids and their column in the matrix + self.__idx2trg = [n.node_id for n in connection_map.target_nodes] + self.__trg2idx = {node_id: i for i, node_id in enumerate(self.__idx2trg)} + + self._nsyn_table = np.zeros((len(self.__idx2src), len(self.__idx2trg)), dtype=np.uint8) + + def __getitem__(self, item): + # TODO: make sure matrix is column oriented, or swithc trg and srcs. + indexed_pair = (self.__src2idx[item[0]], self.__trg2idx[item[1]]) + return self._nsyn_table[indexed_pair] + + def __setitem__(self, key, value): + assert(len(key) == 2) + indexed_pair = (self.__src2idx[key[0]], self.__trg2idx[key[1]]) + self._nsyn_table[indexed_pair] = value + + def has_target(self, node_id): + return node_id in self.__trg2idx + + @property + def nsyn_table(self): + return self._nsyn_table + + @property + def target_ids(self): + return self.__idx2trg + + @property + def source_ids(self): + return self.__idx2src + + def trg_itr(self, trg_id): + trg_i = self.__trg2idx[trg_id] + for src_j, src_id in enumerate(self.__idx2src): + nsyns = self._nsyn_table[src_j, trg_i] + if nsyns: + yield src_id, nsyns + + class PropertyTable(object): + # TODO: add support for strings + def __init__(self, nvalues): + self._prop_array = np.zeros(nvalues) + # self._prop_table = np.zeros((nvalues, 1)) # TODO: set dtype + self._index = np.zeros((nvalues, 2), dtype=np.uint32) + self._itr_index = 0 + + def itr_vals(self, src_id, trg_id): + indicies = np.where((self._index[:, 0] == src_id) & (self._index[:, 1] == trg_id)) + for val in self._prop_array[indicies]: + yield val + + def __setitem__(self, key, value): + self._index[self._itr_index, 0] = key[0] # src_node_id + self._index[self._itr_index, 1] = key[1] # trg_node_id + self._prop_array[self._itr_index] = value + self._itr_index += 1 + + def __getitem__(self, item): + indicies = np.where((self._index[:, 0] == item[0]) & (self._index[:, 1] == item[1])) + return self._prop_array[indicies] + + +def add_hdf5_attrs(hdf5_handle): + # TODO: move this as a utility function + hdf5_handle['/'].attrs['magic'] = np.uint32(0x0A7A) + hdf5_handle['/'].attrs['version'] = [np.uint32(0), np.uint32(1)] diff --git a/bmtk-vb/build/lib/bmtk/builder/networks/input_network.py b/bmtk-vb/build/lib/bmtk/builder/networks/input_network.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/networks/input_network.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/build/lib/bmtk/builder/networks/mpi_network.py b/bmtk-vb/build/lib/bmtk/builder/networks/mpi_network.py new file mode 100644 index 0000000..aa6a51e --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/networks/mpi_network.py @@ -0,0 +1,171 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .dm_network import DenseNetwork +from mpi4py import MPI +from heapq import heappush, heappop +import h5py + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() +nprocs = comm.Get_size() + + +class MPINetwork(DenseNetwork): + def __init__(self, name, **network_props): + super(MPINetwork, self).__init__(name, **network_props or {}) + self._edge_assignment = None + + def _add_edges(self, connection_map, i): + if self._assign_to_rank(i): + super(MPINetwork, self)._add_edges(connection_map, i) + + def save_nodes(self, nodes_file_name, node_types_file_name): + if rank == 0: + super(MPINetwork, self).save_nodes(nodes_file_name, node_types_file_name) + comm.Barrier() + + """ + def save_edges(self, edges_file_name=None, edge_types_file_name=None, output_dir='.', src_network=None, + trg_network=None, force_build=True, force_overwrite=False): + + if rank == 0: + # print rank, len(self.edges_table()) + super(MPINetwork, self).save_edges(edges_file_name, edge_types_file_name, output_dir, src_network, + trg_network, force_build, force_overwrite) + + comm.Barrier() + """ + + def edges_iter(self, trg_gids, src_network=None, trg_network=None): + for trg_gid in trg_gids: + edges = list(super(MPINetwork, self).edges_iter([trg_gid], src_network, trg_network)) + collected_edges = comm.gather(edges, root=0) + if rank == 0: + for edge_list in collected_edges: + for edge in edge_list: + # print 'b' + yield edge + else: + yield None + + comm.Barrier() + + def _save_edges(self, edges_file_name, src_network, trg_network): + target_gids = [n.node_id for n in self._target_networks[trg_network].nodes()] + # TODO: make sure target_gids are sorted + + trg_gids_ds = [] + src_gids_ds = [] + edge_type_id_ds = [] + edge_group_ds = [] + edge_group_index_ds = [] + + eg_collection = {} + eg_ids = 0 + eg_lookup = {} + eg_table = {} + eg_indices = {} + for cm in self.get_connections(): + col_key = cm.properties_keys() + if col_key in eg_collection: + group_id = eg_collection[col_key] + else: + group_id = eg_ids + eg_collection[col_key] = group_id + eg_ids += 1 + eg_lookup[cm.edge_type_id] = group_id + eg_indices[group_id] = 0 + eg_table[group_id] = {k: [] for k in cm.property_names} + + for e in self.edges_iter(target_gids, src_network=src_network, trg_network=trg_network): + if rank == 0: + trg_gids_ds.append(e.target_gid) + src_gids_ds.append(e.source_gid) + edge_type_id_ds.append(e.edge_type_id) + + group_id = eg_lookup[e.edge_type_id] + edge_group_ds.append(group_id) + group_id_index = eg_indices[group_id] + edge_group_index_ds.append(group_id_index) + eg_indices[group_id] += 1 + + for k, v in e.synaptic_properties.items(): + eg_table[group_id][k].append(v) + + if rank == 0: + # Create index from target_gids dataset + index_pointer_ds = [] + cur_gid = 0 + index = 0 + while index < len(trg_gids_ds): + if trg_gids_ds[index] == cur_gid: + index += 1 + else: + cur_gid += 1 + index_pointer_ds.append(index) + index_pointer_ds.append(len(trg_gids_ds)+1) + + + with h5py.File(edges_file_name, 'w') as hf: + hf.create_dataset('edges/target_gid', data=trg_gids_ds, dtype='uint64') + hf['edges/target_gid'].attrs['network'] = trg_network + hf.create_dataset('edges/source_gid', data=src_gids_ds, dtype='uint64') + hf['edges/source_gid'].attrs['network'] = src_network + + hf.create_dataset('edges/edge_group', data=edge_group_ds, dtype='uint16') + hf.create_dataset('edges/edge_group_index', data=edge_group_index_ds, dtype='uint32') + hf.create_dataset('edges/edge_type_id', data=edge_type_id_ds, dtype='uint32') + hf.create_dataset('edges/index_pointer', data=index_pointer_ds, dtype='uint32') + + for gid, group in eg_table.items(): + for col_key, col_ds in group.items(): + ds_loc = 'edges/{}/{}'.format(gid, col_key) + hf.create_dataset(ds_loc, data=col_ds) + + comm.Barrier() + + def _assign_to_rank(self, i): + if self._edge_assignment is None: + self._build_rank_assignments() + + return rank == self._edge_assignment[i] + + def _build_rank_assignments(self): + """Builds the _edge_assignment array. + + Division of connections is decided by the maximum possible edges (i.e. number of source and target nodes). In + the end assignment should balance the connection matrix sizes need by each rank. + """ + rank_heap = [] # A heap of tuples (weight, rank #) + for a in range(nprocs): + heappush(rank_heap, (0, a)) + + # find the rank with the lowest weight, assign that rank to build the i'th connection matrix, update the rank's + # weight and re-add to the heap. + # TODO: sort connection_maps in descending order to get better balance + self._edge_assignment = [] + for cm in self.get_connections(): + r = heappop(rank_heap) + self._edge_assignment.append(r[1]) + heappush(rank_heap, (r[0] + cm.max_connections(), r[1])) + diff --git a/bmtk-vb/build/lib/bmtk/builder/networks/nxnetwork.py b/bmtk-vb/build/lib/bmtk/builder/networks/nxnetwork.py new file mode 100644 index 0000000..3424fd6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/networks/nxnetwork.py @@ -0,0 +1,80 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import networkx as nx + +from bmtk.builder.network import Network +from bmtk.builder.node import Node + + +class NxNetwork(Network): + def __init__(self, name, **network_props): + super(NxNetwork, self).__init__(name, **network_props or {}) + + self.net = nx.MultiDiGraph() + self.__nodes = [] + + + def _initialize(self): + self.net.clear() + + def _add_nodes(self, nodes): + self.__nodes += nodes + self.net.add_nodes_from(nodes) + + def _add_edges(self, edge, connections): + for src, trg, nsyns in connections: + self.net.add_edge(src, trg, nsyns=nsyns, edge_type_id=edge.edge_type_id) + + + def _clear(self): + self.net.clear() + + def _nodes_iter(self, nids=None): + if nids is not None: + return ((nid, d) + for nid, d in self.__nodes + if nid in nids ) + else: + return self.__nodes + #return self.net.nodes_iter(data=True) + + def _edges_iter(self, nids=None, rank=0): + if nids == None or len(nids) == 0: + for e in self.net.edges(data=True): + yield (e[0], e[1], e[2]['nsyns'], e[2]['edge_type_id']) + #return self.net.edges(data=True) + elif rank == 0: + for e in self.net.out_edges(nids, data=True): + yield (e[0], e[1], e[2]['nsyns'], e[2]['edge_type_id']) + else: + for e in self.net.in_edges(nids, data=True): + yield (e[0], e[1], e[2]['nsyns'], e[2]['edge_type_id']) + #return self.net.in_edges(nids, data=True) + + @property + def nnodes(self): + return nx.number_of_nodes(self.net) + + @property + def nedges(self): + return nx.number_of_edges(self.net) \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/builder/networks/sparse_network.py b/bmtk-vb/build/lib/bmtk/builder/networks/sparse_network.py new file mode 100644 index 0000000..035aaeb --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/networks/sparse_network.py @@ -0,0 +1,26 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from bmtk.builder.network import Network + +class SparseNetwork(Network): + pass \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/builder/node.py b/bmtk-vb/build/lib/bmtk/builder/node.py new file mode 100644 index 0000000..6d1b295 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/node.py @@ -0,0 +1,76 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class Node(dict): + def __init__(self, node_id, node_params, node_type_properties, params_hash=-1): + super(Node, self).__init__({}) + + self._node_params = node_params + self._node_params['node_id'] = node_id + self._node_type_properties = node_type_properties + self._params_hash = params_hash + self._node_id = node_id + + @property + def node_id(self): + return self._node_id + + @property + def node_type_id(self): + return self._node_type_properties['node_type_id'] + + @property + def params(self): + return self._node_params + + @property + def node_type_properties(self): + return self._node_type_properties + + @property + def params_hash(self): + return self._params_hash + + def get(self, key, default=None): + if key in self._node_params: + return self._node_params[key] + elif key in self._node_type_properties: + return self._node_type_properties[key] + else: + return default + + def __contains__(self, item): + return item in self._node_type_properties or item in self._node_params + + def __getitem__(self, item): + if item in self._node_params: + return self._node_params[item] + else: + return self._node_type_properties[item] + + def __hash__(self): + return hash(self.node_id) + + def __repr__(self): + tmp_dict = dict(self._node_type_properties) + tmp_dict.update(self._node_params) + return tmp_dict.__repr__() diff --git a/bmtk-vb/build/lib/bmtk/builder/node_pool.py b/bmtk-vb/build/lib/bmtk/builder/node_pool.py new file mode 100644 index 0000000..2e1bb18 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/node_pool.py @@ -0,0 +1,106 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from ast import literal_eval +from six import string_types + + +class NodePool(object): + """Stores a collection of nodes based off some query of the network. + + Returns the results of a query of nodes from a network using the nodes() method. Nodes are still generated and + saved by the network, this just stores the query information and provides iterator methods for accessing different + nodes. + + TODO: + * Implement a collection-set algebra including | and not operators. ie. + nodes = net.nodes(type=1) | net.nodes(type=2) + * Implement operators on properties + nodes = net.nodes(val) > 100 + nodes = 100 in net.nodes(val) + """ + + def __init__(self, network, **properties): + self.__network = network + self.__properties = properties + self.__filter_str = None + + def __len__(self): + return sum(1 for _ in self) + + def __iter__(self): + return (n for n in self.__network.nodes_iter() if self.__query_object_properties(n, self.__properties)) + + @property + def network(self): + return self.__network + + @property + def network_name(self): + return self.__network.name + + @property + def filter_str(self): + if self.__filter_str is None: + if len(self.__properties) == 0: + self.__filter_str = '*' + else: + self.__filter_str = '' + for k, v in self.__properties.items(): + conditional = "{}=='{}'".format(k, v) + self.__filter_str += conditional + '&' + if self.__filter_str.endswith('&'): + self.__filter_str = self.__filter_str[0:-1] + + return self.__filter_str + + @classmethod + def from_filter(cls, network, filter_str): + assert(isinstance(filter_str, string_types)) + if len(filter_str) == 0 or filter_str == '*': + return cls(network, position=None) + + properties = {} + for condtional in filter_str.split('&'): + var, val = condtional.split('==') + properties[var] = literal_eval(val) + return cls(network, position=None, **properties) + + def __query_object_properties(self, obj, props): + if props is None: + return True + + for k, v in props.items(): + ov = obj.get(k, None) + if ov is None: + return False + + if hasattr(v, '__call__'): + if not v(ov): + return False + elif isinstance(v, list): + if ov not in v: + return False + elif ov != v: + return False + + return True diff --git a/bmtk-vb/build/lib/bmtk/builder/node_set.py b/bmtk-vb/build/lib/bmtk/builder/node_set.py new file mode 100644 index 0000000..59c1918 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/builder/node_set.py @@ -0,0 +1,71 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import six +from .node import Node + + +class NodeSet(object): + def __init__(self, N, node_params, node_type_properties): + self.__N = N + self.__node_params = node_params + self.__node_type_properties = node_type_properties + + assert('node_type_id' in node_type_properties) + self.__node_type_id = node_type_properties['node_type_id'] + + # Used for determining which node_sets share the same params columns + columns = list(self.__node_params.keys()) + columns.sort() + self.__params_col_hash = hash(str(columns)) + + @property + def N(self): + return self.__N + + @property + def node_type_id(self): + return self.__node_type_id + + @property + def params_keys(self): + return self.__node_params.keys() + + @property + def params_hash(self): + return self.__params_col_hash + + def build(self, nid_generator): + # fetch existing node ids or create new ones + node_ids = self.__node_params.get('node_id', None) + if node_ids is None: + node_ids = [nid for nid in nid_generator(self.N)] + + # turn node_params from dictionary of lists to a list of dictionaries. + ap_flat = [{} for _ in six.moves.range(self.N)] + for key, plist in self.__node_params.items(): + for i, val in enumerate(plist): + ap_flat[i][key] = val + + # create node objects + return [Node(nid, params, self.__node_type_properties, self.__params_col_hash) + for (nid, params) in zip(node_ids, ap_flat)] diff --git a/bmtk-vb/build/lib/bmtk/simulator/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/README.md b/bmtk-vb/build/lib/bmtk/simulator/bionet/README.md new file mode 100644 index 0000000..5448a66 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/README.md @@ -0,0 +1,4 @@ +## BioNet source code + +For instruction on how to install BioNet please consult the [BioNet tutorial](https://alleninstitute.github.io/bmtk/bionet.html) + diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/__init__.py new file mode 100644 index 0000000..7c86d80 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/__init__.py @@ -0,0 +1,31 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from bmtk.simulator.bionet.pyfunction_cache import synapse_model, synaptic_weight, cell_model +from bmtk.simulator.bionet.config import Config +from bmtk.simulator.bionet.bionetwork import BioNetwork +from bmtk.simulator.bionet.biosimulator import BioSimulator +#from bmtk.simulator.bionet.io_tools import io + +#io = NEURONIOUtils() + + diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/biocell.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/biocell.py new file mode 100644 index 0000000..412730c --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/biocell.py @@ -0,0 +1,323 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from scipy.stats import norm +from bmtk.simulator.bionet import utils, nrn +from bmtk.simulator.bionet.cell import Cell +import six + +from neuron import h + +pc = h.ParallelContext() # object to access MPI methods + + +class BioCell(Cell): + """Implemntation of a morphologically and biophysically detailed type cell. + + """ + def __init__(self, node, bionetwork): + super(BioCell, self).__init__(node) + + # Set up netcon object that can be used to detect and communicate cell spikes. + self.set_spike_detector(bionetwork.spike_threshold) + + self._morph = None + self._seg_coords = {} + + # Determine number of segments and store a list of all sections. + self._nseg = 0 + self.set_nseg(bionetwork.dL) + self._secs = [] + self._secs_by_id = [] + self.set_sec_array() + + self._save_conn = False # bionetwork.save_connection + self._synapses = [] + self._syn_src_net = [] + self._syn_src_gid = [] + self._syn_seg_ix = [] + self._syn_sec_x = [] + self._edge_type_ids = [] + self._segments = None + + # potentially used by ecp module + self.im_ptr = None + self.imVec = None + + # used by xstim module + self.ptr2e_extracellular = None + + self.__extracellular_mech = False + + def set_spike_detector(self, spike_threshold): + nc = h.NetCon(self.hobj.soma[0](0.5)._ref_v, None, sec=self.hobj.soma[0]) # attach spike detector to cell + nc.threshold = spike_threshold + pc.cell(self.gid, nc) # associate gid with spike detector + + def set_nseg(self, dL): + """Define number of segments in a cell""" + self._nseg = 0 + for sec in self.hobj.all: + sec.nseg = 1 + 2 * int(sec.L/(2*dL)) + self._nseg += sec.nseg # get the total number of segments in the cell + + def calc_seg_coords(self, morph_seg_coords): + """Update the segment coordinates (after rotations) for individual cells""" + phi_y = self._node.rotation_angle_yaxis + phi_z = self._node.rotation_angle_zaxis + phi_x = self._node.rotation_angle_xaxis + + # Rotate cell + # TODO: Rotations should follow as described in sonata (https://github.com/AllenInstitute/sonata/blob/master/docs/SONATA_DEVELOPER_GUIDE.md). + # Need someone with graphics experience to check they are being done correctly (I'm not sure atm). + RotX = utils.rotation_matrix([1, 0, 0], phi_x) + RotY = utils.rotation_matrix([0, 1, 0], phi_y) # rotate segments around yaxis normal to pia + RotZ = utils.rotation_matrix([0, 0, 1], -phi_z) # rotate segments around zaxis to get a proper orientation + RotXYZ = np.dot(RotX, RotY.dot(RotZ)) + + # rotated coordinates around z axis first then shift relative to the soma + self._seg_coords['p0'] = self._pos_soma + np.dot(RotXYZ, morph_seg_coords['p0']) + self._seg_coords['p1'] = self._pos_soma + np.dot(RotXYZ, morph_seg_coords['p1']) + self._seg_coords['p05'] = self._pos_soma + np.dot(RotXYZ, morph_seg_coords['p05']) + + def get_seg_coords(self): + return self._seg_coords + + @property + def morphology_file(self): + # TODO: Get from self._node.morphology_file + return self._node.morphology_file + + @property + def morphology(self): + return self._morph + + @morphology.setter + def morphology(self, morphology_obj): + self.set_morphology(morphology_obj) + + def set_morphology(self, morphology_obj): + self._morph = morphology_obj + + def get_sections(self): + #return self._secs_by_id + return self._secs + + def get_sections_id(self): + return self._secs_by_id + + def get_section(self, sec_id): + return self._secs[sec_id] + + def store_segments(self): + self._segments = [] + for sec in self._secs: + for seg in sec: + self._segments.append(seg) + + def get_segments(self): + return self._segments + + def set_sec_array(self): + """Arrange sections in an array to be access by index""" + secs = [] # build ref to sections + self._secs_by_id = [] + for sec in self.hobj.all: + self._secs_by_id.append(sec) + for _ in sec: + secs.append(sec) # section to which segments belongs + + self._secs = np.array(secs) + + def set_syn_connection(self, edge_prop, src_node, stim=None): + syn_weight = edge_prop.syn_weight(src_node=src_node, trg_node=self._node) + + if edge_prop.preselected_targets: + return self._set_connection_preselected(edge_prop, src_node, syn_weight, stim) + else: + return self._set_connections(edge_prop, src_node, syn_weight, stim) + + def _set_connection_preselected(self, edge_prop, src_node, syn_weight, stim=None): + # TODO: synapses should be loaded by edge_prop.load_synapse + sec_x = edge_prop['sec_x'] + sec_id = edge_prop['sec_id'] + section = self._secs_by_id[sec_id] + # section = self._secs[sec_id] + delay = edge_prop['delay'] + synapse_fnc = nrn.py_modules.synapse_model(edge_prop['model_template']) + syn = synapse_fnc(edge_prop['dynamics_params'], sec_x, section) + + if stim is not None: + nc = h.NetCon(stim.hobj, syn) # stim.hobj - source, syn - target + else: + nc = pc.gid_connect(src_node.node_id, syn) + + nc.weight[0] = syn_weight + nc.delay = delay + self._netcons.append(nc) + self._synapses.append(syn) + if self._save_conn: + self._save_connection(src_gid=src_node.node_id, src_net=src_node.network, sec_x=sec_x, seg_ix=sec_id, + edge_type_id=edge_prop.edge_type_id) + + return 1 + + def _set_connections(self, edge_prop, src_node, syn_weight, stim=None): + try: + # Compute probability based on proximity to the peak depths given at network build time + if edge_prop['prob_peaks']: + tar_seg_prob = np.zeros(len(self._secs)) + prob_peaks = [float(x) for x in edge_prop['prob_peaks'].split(',')] + prob_peak_std = [float(x) for x in edge_prop['prob_peak_std'].split(',')] + _z = lambda idx: self._seg_coords['p05'][1, idx] + for mu, std in zip(prob_peaks, prob_peak_std): + tar_seg_prob += np.array([norm.pdf(_z(idx), mu, std) for idx in range(len(self._secs))]) + tar_seg_prob = tar_seg_prob / sum(tar_seg_prob) + tar_seg_ix = range(len(self._secs)) + else: + raise KeyError() # just to trigger the except block below... + except KeyError: + # Compute probability based on segment length + tar_seg_ix, tar_seg_prob = self._morph.get_target_segments(edge_prop) + + + src_gid = src_node.node_id + nsyns = edge_prop.nsyns + + # choose nsyn elements from seg_ix with probability proportional to segment area + segs_ix = self.prng.choice(tar_seg_ix, nsyns, p=tar_seg_prob) + secs = self._secs[segs_ix] # sections where synapases connect + xs = self._morph.seg_prop['x'][segs_ix] # distance along the section where synapse connects, i.e., seg_x + + # DEBUG + try: + _z = lambda idx: self._seg_coords['p05'][1, idx] + edge_prop['prob_peaks'] + print("DEPTH {}".format(','.join(str(_z(i)) for i in segs_ix))) + zs = np.array([_z(i) for i in tar_seg_ix]) + idx = np.argsort(zs) + print '\n'.join(str(s) for s in zip(zs[idx], tar_seg_prob[idx])) + except: + pass + # END DEBUG + + # TODO: this should be done just once + synapses = [edge_prop.load_synapses(x, sec) for x, sec in zip(xs, secs)] + + delay = edge_prop['delay'] + self._synapses.extend(synapses) + + # TODO: Don't save this if not needed + self._edge_type_ids.extend([edge_prop.edge_type_id]*len(synapses)) + + for syn in synapses: + # connect synapses + if stim: + nc = h.NetCon(stim.hobj, syn) + else: + nc = pc.gid_connect(src_gid, syn) + + nc.weight[0] = syn_weight + nc.delay = delay + self.netcons.append(nc) + + return nsyns + + def _save_connection(self, src_gid, src_net, sec_x, seg_ix, edge_type_id): + self._syn_src_gid.append(src_gid) + self._syn_src_net.append(src_net) + self._syn_sec_x.append(sec_x) + self._syn_seg_ix.append(seg_ix) + self._edge_type_id.append(edge_type_id) + + def get_connection_info(self): + # TODO: There should be a more effecient and robust way to return synapse information. + return [[self.gid, self._syn_src_gid[i], self.network_name, self._syn_src_net[i], self._syn_seg_ix[i], + self._syn_sec_x[i], self.netcons[i].weight[0], self.netcons[i].delay, self._edge_type_id[i], 0] + for i in range(len(self._synapses))] + + def init_connections(self): + super(BioCell, self).init_connections() + self._synapses = [] + self._syn_src_gid = [] + self._syn_seg_ix = [] + self._syn_sec_x = [] + + def __set_extracell_mechanism(self): + if not self.__extracellular_mech: + for sec in self.hobj.all: + sec.insert('extracellular') + self.__extracellular_mech = True + + def setup_ecp(self): + self.im_ptr = h.PtrVector(self._nseg) # pointer vector + # used for gathering an array of i_membrane values from the pointer vector + self.im_ptr.ptr_update_callback(self.set_im_ptr) + self.imVec = h.Vector(self._nseg) + + self.__set_extracell_mechanism() + #for sec in self.hobj.all: + # sec.insert('extracellular') + + def setup_xstim(self, set_nrn_mechanism=True): + self.ptr2e_extracellular = h.PtrVector(self._nseg) + self.ptr2e_extracellular.ptr_update_callback(self.set_ptr2e_extracellular) + + # Set the e_extracellular mechanism for all sections on this hoc object + if set_nrn_mechanism: + self.__set_extracell_mechanism() + #for sec in self.hobj.all: + # sec.insert('extracellular') + + def set_im_ptr(self): + """Set PtrVector to point to the i_membrane_""" + jseg = 0 + for sec in self.hobj.all: + for seg in sec: + self.im_ptr.pset(jseg, seg._ref_i_membrane_) # notice the underscore at the end + jseg += 1 + + def get_im(self): + """Gather membrane currents from PtrVector into imVec (does not need a loop!)""" + self.im_ptr.gather(self.imVec) + # Warning: as_numpy() seems to fail with in neuron 7.4 for python 3 + # return self.imVec.as_numpy() # (nA) + return np.array(self.imVec) + + def set_ptr2e_extracellular(self): + jseg = 0 + for sec in self.hobj.all: + for seg in sec: + self.ptr2e_extracellular.pset(jseg, seg._ref_e_extracellular) + jseg += 1 + + def set_e_extracellular(self, vext): + self.ptr2e_extracellular.scatter(vext) + + def print_synapses(self): + rstr = '' + for i in six.moves.range(len(self._syn_src_gid)): + rstr += '{}> <-- {} ({}, {}, {}, {})\n'.format(i, self._syn_src_gid[i], self.netcons[i].weight[0], + self.netcons[i].delay, self._syn_seg_ix[i], + self._syn_sec_x[i]) + return rstr diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/bionetwork.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/bionetwork.py new file mode 100644 index 0000000..78ec0ae --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/bionetwork.py @@ -0,0 +1,262 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +from neuron import h + +from bmtk.simulator.core.simulator_network import SimNetwork +from bmtk.simulator.bionet.biocell import BioCell +from bmtk.simulator.bionet.pointprocesscell import PointProcessCell +from bmtk.simulator.bionet.pointsomacell import PointSomaCell +from bmtk.simulator.bionet.virtualcell import VirtualCell +from bmtk.simulator.bionet.morphology import Morphology +from bmtk.simulator.bionet.io_tools import io +from bmtk.simulator.bionet import nrn +from bmtk.simulator.bionet.sonata_adaptors import BioNodeAdaptor, BioEdgeAdaptor + +# TODO: leave this import, it will initialize some of the default functions for building neurons/synapses/weights. +import bmtk.simulator.bionet.default_setters + + +pc = h.ParallelContext() # object to access MPI methods +MPI_size = int(pc.nhost()) +MPI_rank = int(pc.id()) + + +class BioNetwork(SimNetwork): + model_type_col = 'model_type' + + def __init__(self): + # property_schema = property_schema if property_schema is not None else DefaultPropertySchema + super(BioNetwork, self).__init__() + self._io = io + + # TODO: Find a better way that will allow users to register their own class + self._model_type_map = { + 'biophysical': BioCell, + 'point_process': PointProcessCell, + 'point_soma': PointSomaCell, + 'virtual': VirtualCell + } + + self._morphologies_cache = {} + self._morphology_lookup = {} + + self._rank_node_gids = {} + self._rank_node_ids = {} + self._rank_nodes_by_model = {m_type: {} for m_type in self._model_type_map.keys()} + self._remote_node_cache = {} + self._virtual_nodes = {} + + self._cells_built = False + self._connections_initialized = False + + @property + def py_function_caches(self): + return nrn + + def get_node_id(self, population, node_id): + if node_id in self._rank_node_ids[population]: + return self._rank_node_ids[population][node_id].node + + elif node_id in self._remote_node_cache[population]: + return self._remote_node_cache[population][node_id] + + else: + node_pop = self.get_node_population(population) + node = node_pop.get_node(node_id) + self._remote_node_cache[population][node_id] = node + return node + + def cell_type_maps(self, model_type): + return self._rank_nodes_by_model[model_type] + + def get_cell_node_id(self, population, node_id): + return self._rank_node_ids[population].get(node_id, None) + + def get_cell_gid(self, gid): + return self._rank_node_gids[gid] + + def get_local_cells(self): + return self._rank_node_gids + + @property + def local_gids(self): + return list(self._rank_node_gids.keys()) + + def get_virtual_cells(self, population, node_id, spike_trains): + if node_id in self._virtual_nodes[population]: + return self._virtual_nodes[population][node_id] + else: + node = self.get_node_id(population, node_id) + virt_cell = VirtualCell(node, spike_trains) + self._virtual_nodes[population][node_id] = virt_cell + return virt_cell + + def _build_cell(self, bionode): + if bionode.model_type in self._model_type_map: + cell = self._model_type_map[bionode.model_type](bionode, self) + self._rank_nodes_by_model[bionode.model_type][cell.gid] = cell + return cell + else: + self.io.log_exception('Unrecognized model_type {}.'.format(bionode.model_type)) + + def _register_adaptors(self): + super(BioNetwork, self)._register_adaptors() + self._node_adaptors['sonata'] = BioNodeAdaptor + self._edge_adaptors['sonata'] = BioEdgeAdaptor + + def build_nodes(self): + for node_pop in self.node_populations: + self._remote_node_cache[node_pop.name] = {} + node_ids_map = {} + if node_pop.internal_nodes_only: + for node in node_pop[MPI_rank::MPI_size]: + cell = self._build_cell(node) + node_ids_map[node.node_id] = cell + self._rank_node_gids[cell.gid] = cell + + elif node_pop.mixed_nodes: + # node population contains both internal and virtual (external) nodes and the virtual nodes must be + # filtered out + self._virtual_nodes[node_pop.name] = {} + for node in node_pop[MPI_rank::MPI_size]: + if node.model_type == 'virtual': + continue + else: + cell = self._build_cell(node) + node_ids_map[node.node_id] = cell + self._rank_node_gids[cell.gid] = cell + + elif node_pop.virtual_nodes_only: + self._virtual_nodes[node_pop.name] = {} + + self._rank_node_ids[node_pop.name] = node_ids_map + + self.make_morphologies() + self.set_seg_props() # set segment properties by creating Morphologies + self.calc_seg_coords() # use for computing the ECP + self._cells_built = True + + def set_seg_props(self): + """Set morphological properties for biophysically (morphologically) detailed cells""" + for _, morphology in self._morphologies_cache.items(): + morphology.set_seg_props() + + def calc_seg_coords(self): + """Needed for the ECP calculations""" + # TODO: Is there any reason this function can't be moved to make_morphologies() + for morphology_file, morphology in self._morphologies_cache.items(): + morph_seg_coords = morphology.calc_seg_coords() # needed for ECP calculations + + for gid in self._morphology_lookup[morphology_file]: + self.get_cell_gid(gid).calc_seg_coords(morph_seg_coords) + + def make_morphologies(self): + """Creating a Morphology object for each biophysical model""" + # TODO: Let Morphology take care of the cache + # TODO: Let other types have morphologies + # TODO: Get all available morphologies from TypesTable or group + for gid, cell in self._rank_node_gids.items(): + if not isinstance(cell, BioCell): + continue + + morphology_file = cell.morphology_file + if morphology_file in self._morphologies_cache: + # create a single morphology object for each model_group which share that morphology + morph = self._morphologies_cache[morphology_file] + + # associate morphology with a cell + cell.set_morphology(morph) + self._morphology_lookup[morphology_file].append(cell.gid) + + else: + hobj = cell.hobj # get hoc object (hobj) from the first cell with a new morphologys + morph = Morphology(hobj) + + # associate morphology with a cell + cell.set_morphology(morph) + + # create a single morphology object for each model_group which share that morphology + self._morphologies_cache[morphology_file] = morph + self._morphology_lookup[morphology_file] = [cell.gid] + + self.io.barrier() + + def _init_connections(self): + if not self._connections_initialized: + for gid, cell in self._rank_node_gids.items(): + cell.init_connections() + self._connections_initialized = True + + def build_recurrent_edges(self): + recurrent_edge_pops = [ep for ep in self._edge_populations if not ep.virtual_connections] + if not recurrent_edge_pops: + return + + self._init_connections() + for edge_pop in recurrent_edge_pops: + if edge_pop.recurrent_connections: + source_population = edge_pop.source_nodes + for trg_nid, trg_cell in self._rank_node_ids[edge_pop.target_nodes].items(): + for edge in edge_pop.get_target(trg_nid): + src_node = self.get_node_id(source_population, edge.source_node_id) + trg_cell.set_syn_connection(edge, src_node) + + elif edge_pop.mixed_connections: + # When dealing with edges that contain both virtual and recurrent edges we have to check every source + # node to see if is virtual (bc virtual nodes can't be built yet). This conditional can significantly + # slow down build time so we use a special loop that can be ignored. + source_population = edge_pop.source_nodes + for trg_nid, trg_cell in self._rank_node_ids[edge_pop.target_nodes].items(): + for edge in edge_pop.get_target(trg_nid): + src_node = self.get_node_id(source_population, edge.source_node_id) + if src_node.model_type == 'virtual': + continue + trg_cell.set_syn_connection(edge, src_node) + + def find_edges(self, source_nodes=None, target_nodes=None): + selected_edges = self._edge_populations[:] + + if source_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.source_nodes == source_nodes] + + if target_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.target_nodes == target_nodes] + + return selected_edges + + def add_spike_trains(self, spike_trains, node_set): + self._init_connections() + + src_nodes = [node_pop for node_pop in self.node_populations if node_pop.name in node_set.population_names()] + for src_node_pop in src_nodes: + source_population = src_node_pop.name + for edge_pop in self.find_edges(source_nodes=source_population): + if edge_pop.virtual_connections: + for trg_nid, trg_cell in self._rank_node_ids[edge_pop.target_nodes].items(): + for edge in edge_pop.get_target(trg_nid): + src_cell = self.get_virtual_cells(source_population, edge.source_node_id, spike_trains) + trg_cell.set_syn_connection(edge, src_cell, src_cell) + + elif edge_pop.mixed_connections: + raise NotImplementedError() diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/biosimulator.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/biosimulator.py new file mode 100644 index 0000000..b1a7e56 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/biosimulator.py @@ -0,0 +1,357 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import time +from six import string_types +from neuron import h +from bmtk.simulator.core.simulator import Simulator +from bmtk.simulator.bionet.io_tools import io +from bmtk.simulator.bionet.iclamp import IClamp +from bmtk.simulator.bionet import modules as mods +from bmtk.simulator.core.node_sets import NodeSet +import bmtk.simulator.utils.simulation_reports as reports +import bmtk.simulator.utils.simulation_inputs as inputs +from bmtk.utils.io import spike_trains + + +pc = h.ParallelContext() # object to access MPI methods + + +class BioSimulator(Simulator): + """Includes methods to run and control the simulation""" + + def __init__(self, network, dt, tstop, v_init, celsius, cao0, nsteps_block, start_from_state=False): + self.net = network + + self._start_from_state = start_from_state + self.dt = dt + self.tstop = tstop + + self._v_init = v_init + self._celsius = celsius + self._cao0 = cao0 + self._h = h + + self.tstep = int(round(h.t / h.dt)) + self.tstep_start_block = self.tstep + self.nsteps = int(round(h.tstop/h.dt)) + + # make sure the block size isn't small than the total number of steps + # TODO: should we send a warning that block-step size is being reset? + self._nsteps_block = nsteps_block if self.nsteps > nsteps_block else self.nsteps + + self.__tstep_end_block = 0 + self.__tstep_start_block = 0 + + h.runStopAt = h.tstop + h.steps_per_ms = 1/h.dt + + self._set_init_conditions() # call to save state + h.cvode.cache_efficient(1) + + h.pysim = self # use this objref to be able to call postFadvance from proc advance in advance.hoc + self._iclamps = [] + + self._output_dir = 'output' + self._log_file = 'output/log.txt' + + self._spikes = {} # for keeping track of different spike times, key of cell gids + + self._cell_variables = [] # location of saved cell variables + self._cell_vars_dir = 'output/cellvars' + + self._sim_mods = [] # list of modules.SimulatorMod's + + @property + def dt(self): + return h.dt + + @dt.setter + def dt(self, ms): + h.dt = ms + + @property + def tstop(self): + return h.tstop + + @tstop.setter + def tstop(self, ms): + h.tstop = ms + + @property + def v_init(self): + return self._v_init + + @v_init.setter + def v_init(self, voltage): + self._v_init = voltage + + @property + def celsius(self): + return self._celsius + + @celsius.setter + def celsius(self, c): + self._celsius = c + + @property + def cao0(self): + return self._cao0 + + @cao0.setter + def cao0(self, cao): + self._cao0 = cao + + @property + def n_steps(self): + return int(round(self.tstop/self.dt)) + + @property + def cell_variables(self): + return self._cell_variables + + @property + def cell_var_output(self): + return self._cell_vars_dir + + @property + def spikes_table(self): + return self._spikes + + @property + def nsteps_block(self): + return self._nsteps_block + + @property + def h(self): + return self._h + + @property + def biophysical_gids(self): + return self.net.cell_type_maps('biophysical').keys() + + @property + def local_gids(self): + # return self.net.get + return self.net.local_gids + + def __elapsed_time(self, time_s): + if time_s < 120: + return '{:.4} seconds'.format(time_s) + elif time_s < 7200: + mins, secs = divmod(time_s, 60) + return '{} minutes, {:.4} seconds'.format(mins, secs) + else: + mins, secs = divmod(time_s, 60) + hours, mins = divmod(mins, 60) + return '{} hours, {} minutes and {:.4} seconds'.format(hours, mins, secs) + + def _set_init_conditions(self): + """Set up the initial conditions: either read from the h.SaveState or from config["condidtions"]""" + pc.set_maxstep(10) + h.stdinit() + self.tstep = int(round(h.t/h.dt)) + self.tstep_start_block = self.tstep + + if self._start_from_state: + # io.read_state() + io.log_info('Read the initial state saved at t_sim: {} ms'.format(h.t)) + else: + h.v_init = self.v_init + + h.celsius = self.celsius + h.cao0_ca_ion = self.cao0 + + def set_spikes_recording(self): + for gid, _ in self.net.get_local_cells().items(): + tvec = self.h.Vector() + gidvec = self.h.Vector() + pc.spike_record(gid, tvec, gidvec) + self._spikes[gid] = tvec + + def attach_current_clamp(self, amplitude, delay, duration, gids=None): + # TODO: verify current clamp works with MPI + # TODO: Create appropiate module + if gids is None: + gids = self.gids['biophysical'] + if isinstance(gids, int): + gids = [gids] + elif isinstance(gids, string_types): + gids = [int(gids)] + elif isinstance(gids, NodeSet): + gids = gids.gids() + + + gids = list(set(self.local_gids) & set(gids)) + for gid in gids: + cell = self.net.get_cell_gid(gid) + Ic = IClamp(amplitude, delay, duration) + Ic.attach_current(cell) + self._iclamps.append(Ic) + + def add_mod(self, module): + self._sim_mods.append(module) + + def run(self): + """Run the simulation: + if beginning from a blank state, then will use h.run(), + if continuing from the saved state, then will use h.continuerun() + """ + for mod in self._sim_mods: + mod.initialize(self) + + self.start_time = h.startsw() + s_time = time.time() + pc.timeout(0) + + pc.barrier() # wait for all hosts to get to this point + io.log_info('Running simulation for {:.3f} ms with the time step {:.3f} ms'.format(self.tstop, self.dt)) + io.log_info('Starting timestep: {} at t_sim: {:.3f} ms'.format(self.tstep, h.t)) + io.log_info('Block save every {} steps'.format(self.nsteps_block)) + + if self._start_from_state: + h.continuerun(h.tstop) + else: + h.run(h.tstop) # <- runs simuation: works in parallel + + pc.barrier() + + for mod in self._sim_mods: + mod.finalize(self) + pc.barrier() + + end_time = time.time() + + sim_time = self.__elapsed_time(end_time - s_time) + io.log_info('Simulation completed in {} '.format(sim_time)) + + def report_load_balance(self): + comptime = pc.step_time() + avgcomp = pc.allreduce(comptime, 1)/pc.nhost() + maxcomp = pc.allreduce(comptime, 2) + io.log_info('Maximum compute time is {} seconds.'.format(maxcomp)) + io.log_info('Approximate exchange time is {} seconds.'.format(comptime - maxcomp)) + if maxcomp != 0.0: + io.log_info('Load balance is {}.'.format(avgcomp/maxcomp)) + + def post_fadvance(self): + """ + Runs after every execution of fadvance (see advance.hoc) + Called after every time step to perform computation and save data to memory block or to disk. + The initial condition tstep=0 is not being saved + """ + for mod in self._sim_mods: + mod.step(self, self.tstep) + + self.tstep += 1 + + if (self.tstep % self.nsteps_block == 0) or self.tstep == self.nsteps: + io.log_info(' step:{} t_sim:{:.2f} ms'.format(self.tstep, h.t)) + self.__tstep_end_block = self.tstep + time_step_interval = (self.__tstep_start_block, self.__tstep_end_block) + + for mod in self._sim_mods: + mod.block(self, time_step_interval) + + self.__tstep_start_block = self.tstep # starting point for the next block + + @classmethod + def from_config(cls, config, network, set_recordings=True): + # TODO: convert from json to sonata config if necessary + + sim = cls(network=network, + dt=config.dt, + tstop=config.tstop, + v_init=config.v_init, + celsius=config.celsius, + cao0=config.cao0, + nsteps_block=config.block_step) + + network.io.log_info('Building cells.') + network.build_nodes() + + network.io.log_info('Building recurrent connections') + network.build_recurrent_edges() + + # TODO: Need to create a gid selector + for sim_input in inputs.from_config(config): + node_set = network.get_node_set(sim_input.node_set) + if sim_input.input_type == 'spikes': + spikes = spike_trains.SpikesInput.load(name=sim_input.name, module=sim_input.module, + input_type=sim_input.input_type, params=sim_input.params) + io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + network.add_spike_trains(spikes, node_set) + + elif sim_input.module == 'IClamp': + # TODO: Parse from csv file + amplitude = sim_input.params['amp'] + delay = sim_input.params['delay'] + duration = sim_input.params['duration'] + gids = sim_input.params['node_set'] + sim.attach_current_clamp(amplitude, delay, duration, node_set) + + elif sim_input.module == 'xstim': + sim.add_mod(mods.XStimMod(**sim_input.params)) + + else: + io.log_exception('Can not parse input format {}'.format(sim_input.name)) + + if config.calc_ecp: + for gid, cell in network.cell_type_maps('biophysical').items(): + cell.setup_ecp() + sim.h.cvode.use_fast_imem(1) + + # Parse the "reports" section of the config and load an associated output module for each report + sim_reports = reports.from_config(config) + for report in sim_reports: + if isinstance(report, reports.SpikesReport): + mod = mods.SpikesMod(**report.params) + + elif isinstance(report, reports.SectionReport): + mod = mods.SectionReport(**report.params) + + elif isinstance(report, reports.MembraneReport): + if report.params['sections'] == 'soma': + mod = mods.SomaReport(**report.params) + + else: + mod = mods.MembraneReport(**report.params) + + elif isinstance(report, reports.ECPReport): + assert config.calc_ecp + mod = mods.EcpMod(**report.params) + # Set up the ability for ecp on all relevant cells + # TODO: According to spec we need to allow a different subset other than only biophysical cells + # for gid, cell in network.cell_type_maps('biophysical').items(): + # cell.setup_ecp() + + elif report.module == 'save_synapses': + mod = mods.SaveSynapses(**report.params) + + else: + # TODO: Allow users to register customized modules using pymodules + io.log_warning('Unrecognized module {}, skipping.'.format(report.module)) + continue + + sim.add_mod(mod) + + return sim diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/cell.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/cell.py new file mode 100644 index 0000000..190836a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/cell.py @@ -0,0 +1,104 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h +import numpy as np + + +pc = h.ParallelContext() # object to access MPI methods +MPI_RANK = int(pc.id()) + + +class Cell(object): + """A abstract base class for any cell object. + + A base class for implementation of a cell-type objects like biophysical cells, LIF cells, etc. Do not instantiate + a Cell object directly. Cell classes act as wrapper around HOC cell object with extra functionality for setting + positions, synapses, and other parameters depending on the desired cell class. + """ + def __init__(self, node): + self._node = node + self._gid = node.gid + self._node_id = node.node_id + self._props = node + self._netcons = [] # list of NEURON network connection object attached to this cell + + self._pos_soma = [] + self.set_soma_position() + + # register the cell + pc.set_gid2node(self.gid, MPI_RANK) + + # Load the NEURON HOC object + self._hobj = node.load_cell() + + @property + def node(self): + return self._node + + @property + def hobj(self): + return self._hobj + + @property + def gid(self): + return self._gid + + @property + def node_id(self): + return self._node_id + + @property + def group_id(self): + return self._node.group_id + + @property + def network_name(self): + return self._node.network + + @property + def netcons(self): + return self._netcons + + @property + def soma_position(self): + return self._pos_soma + + def set_soma_position(self): + positions = self._node.position + if positions is not None: + self._pos_soma = positions.reshape(3, 1) + + def init_connections(self): + self.rand_streams = [] + self.prng = np.random.RandomState(self.gid) # generate random stream based on gid + + def scale_weights(self, factor): + for nc in self.netcons: + weight = nc.weight[0] + nc.weight[0] = weight*factor + + def get_connection_info(self): + return [] + + def set_syn_connections(self, edge_prop, src_node, stim=None): + raise NotImplementedError diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/config.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/config.py new file mode 100644 index 0000000..7a43cd1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/config.py @@ -0,0 +1,84 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json + +from neuron import h + +#import bmtk.simulator.utils.config as msdk_config +#from bmtk.utils.sonata.config import SonataConfig +#from bmtk.simulator.core.config import ConfigDict +from bmtk.simulator.utils.config import ConfigDict +from bmtk.simulator.utils.sim_validator import SimConfigValidator +from bmtk.simulator.bionet.io_tools import io +from . import nrn + +pc = h.ParallelContext() # object to access MPI methods +MPI_Rank = int(pc.id()) + + +# load the configuration schema +schema_folder = os.path.join(os.path.dirname(__file__), 'schemas') +config_schema_file = os.path.join(schema_folder, 'config_schema.json') + +# json schemas (but not real jsonschema) to describe the various input file formats +file_formats = [ + ("csv:nodes_internal", os.path.join(schema_folder, 'csv_nodes_internal.json')), + ("csv:node_types_internal", os.path.join(schema_folder, 'csv_node_types_internal.json')), + ("csv:edge_types", os.path.join(schema_folder, 'csv_edge_types.json')), + ("csv:nodes_external", os.path.join(schema_folder, 'csv_nodes_external.json')), + ("csv:node_types_external", os.path.join(schema_folder, 'csv_node_types_external.json')) +] + +# Create a config and input file validator for Bionet +with open(config_schema_file, 'r') as f: + config_schema = json.load(f) +bionet_validator = SimConfigValidator(config_schema, file_formats=file_formats) + + +class Config(ConfigDict): + @property + def cao0(self): + return self.conditions['cao0'] + + @staticmethod + def get_validator(): + return bionet_validator + + def create_output_dir(self): + io.setup_output_dir(self.output_dir, self.log_file) + + def load_nrn_modules(self): + nrn.load_neuron_modules(self.mechanisms_dir, self.templates_dir) + + def build_env(self): + if MPI_Rank == 0: + self.create_output_dir() + self.copy_to_output() + + if io.mpi_size > 1: + # A friendly message requested by fb + io.log_info('Running NEURON with mpi ({} cores).'.format(io.mpi_size)) + + pc.barrier() + self.load_nrn_modules() diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/__init__.py new file mode 100644 index 0000000..4ad0b56 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/__init__.py @@ -0,0 +1,25 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import cell_models +from . import synapse_models +from . import synaptic_weights \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/cell_models.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/cell_models.py new file mode 100644 index 0000000..16d5bfb --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/cell_models.py @@ -0,0 +1,460 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import numpy as np +from neuron import h +try: + from sklearn.decomposition import PCA +except Exception as e: + pass + +from bmtk.simulator.bionet.pyfunction_cache import add_cell_model, add_cell_processor +from bmtk.simulator.bionet.io_tools import io +from bmtk.simulator.bionet.nml_reader import NMLTree + +""" +Functions for loading NEURON cell objects. + +Functions will be loaded by bionetwork and called when a new cell object is created. These are for standard models +loaded with Cell-Types json files or their NeuroML equivelent, but may be overridden by the users. +""" + + +def IntFire1(cell, template_name, dynamics_params): + """Loads a point integrate and fire neuron""" + hobj = h.IntFire1() + hobj.tau = dynamics_params['tau']*1000.0 # Convert from seconds to ms. + hobj.refrac = dynamics_params['refrac']*1000.0 # Convert from seconds to ms. + return hobj + + +def Biophys1(cell, template_name, dynamic_params): + """Loads a biophysical NEURON hoc object using Cell-Types database objects.""" + morphology_file = cell.morphology_file + hobj = h.Biophys1(str(morphology_file)) + #fix_axon(hobj) + #set_params_peri(hobj, dynamic_params) + return hobj + + +def Biophys1_nml(json_file): + # TODO: look at examples to see how to convert .nml files + raise NotImplementedError() + + +def Biophys1_dict(cell): + """ Set parameters for cells from the Allen Cell Types database Prior to setting parameters will replace the + axon with the stub + """ + morphology_file = cell['morphology'] + hobj = h.Biophys1(str(morphology_file)) + return hobj + + +def aibs_perisomatic(hobj, cell, dynamics_params): + if dynamics_params is not None: + fix_axon_peri(hobj) + set_params_peri(hobj, dynamics_params) + + return hobj + + +def fix_axon_peri(hobj): + """Replace reconstructed axon with a stub + + :param hobj: hoc object + """ + for sec in hobj.axon: + h.delete_section(sec=sec) + + h.execute('create axon[2]', hobj) + + for sec in hobj.axon: + sec.L = 30 + sec.diam = 1 + hobj.axonal.append(sec=sec) + hobj.all.append(sec=sec) # need to remove this comment + + hobj.axon[0].connect(hobj.soma[0], 0.5, 0) + hobj.axon[1].connect(hobj.axon[0], 1, 0) + + h.define_shape() + + +def set_params_peri(hobj, biophys_params): + """Set biophysical parameters for the cell + + :param hobj: NEURON's cell object + :param biophys_params: name of json file with biophys params for cell's model which determine spiking behavior + :return: + """ + passive = biophys_params['passive'][0] + conditions = biophys_params['conditions'][0] + genome = biophys_params['genome'] + + # Set passive properties + cm_dict = dict([(c['section'], c['cm']) for c in passive['cm']]) + for sec in hobj.all: + sec.Ra = passive['ra'] + sec.cm = cm_dict[sec.name().split(".")[1][:4]] + sec.insert('pas') + + for seg in sec: + seg.pas.e = passive["e_pas"] + + # Insert channels and set parameters + for p in genome: + sections = [s for s in hobj.all if s.name().split(".")[1][:4] == p["section"]] + + for sec in sections: + if p["mechanism"] != "": + sec.insert(p["mechanism"]) + setattr(sec, p["name"], p["value"]) + + # Set reversal potentials + for erev in conditions['erev']: + sections = [s for s in hobj.all if s.name().split(".")[1][:4] == erev["section"]] + for sec in sections: + sec.ena = erev["ena"] + sec.ek = erev["ek"] + + +def aibs_allactive(hobj, cell, dynamics_params): + fix_axon_allactive(hobj) + set_params_allactive(hobj, dynamics_params) + return hobj + + +def fix_axon_allactive(hobj): + """Replace reconstructed axon with a stub + + Parameters + ---------- + hobj: instance of a Biophysical template + NEURON's cell object + """ + # find the start and end diameter of the original axon, this is different from the perisomatic cell model + # where diameter == 1. + axon_diams = [hobj.axon[0].diam, hobj.axon[0].diam] + for sec in hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name == 'axon': + axon_diams[1] = sec.diam + + for sec in hobj.axon: + h.delete_section(sec=sec) + + h.execute('create axon[2]', hobj) + for index, sec in enumerate(hobj.axon): + sec.L = 30 + sec.diam = axon_diams[index] # 1 + + hobj.axonal.append(sec=sec) + hobj.all.append(sec=sec) # need to remove this comment + + hobj.axon[0].connect(hobj.soma[0], 1.0, 0) + hobj.axon[1].connect(hobj.axon[0], 1.0, 0) + + h.define_shape() + + +def set_params_allactive(hobj, params_dict): + # params_dict = json.load(open(params_file_name, 'r')) + passive = params_dict['passive'][0] + genome = params_dict['genome'] + conditions = params_dict['conditions'][0] + + section_map = {} + for sec in hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name in section_map: + section_map[section_name].append(sec) + else: + section_map[section_name] = [sec] + + for sec in hobj.all: + sec.insert('pas') + # sec.insert('extracellular') + + if 'e_pas' in passive: + e_pas_val = passive['e_pas'] + for sec in hobj.all: + for seg in sec: + seg.pas.e = e_pas_val + + if 'ra' in passive: + ra_val = passive['ra'] + for sec in hobj.all: + sec.Ra = ra_val + + if 'cm' in passive: + # print('Setting cm') + for cm_dict in passive['cm']: + cm = cm_dict['cm'] + for sec in section_map.get(cm_dict['section'], []): + sec.cm = cm + + for genome_dict in genome: + g_section = genome_dict['section'] + if genome_dict['section'] == 'glob': + io.log_warning("There is a section called glob, probably old json file") + continue + + g_value = float(genome_dict['value']) + g_name = genome_dict['name'] + g_mechanism = genome_dict.get("mechanism", "") + for sec in section_map.get(g_section, []): + if g_mechanism != "": + sec.insert(g_mechanism) + setattr(sec, g_name, g_value) + + for erev in conditions['erev']: + erev_section = erev['section'] + erev_ena = erev['ena'] + erev_ek = erev['ek'] + + if erev_section in section_map: + for sec in section_map.get(erev_section, []): + if h.ismembrane('k_ion', sec=sec) == 1: + setattr(sec, 'ek', erev_ek) + if h.ismembrane('na_ion', sec=sec) == 1: + setattr(sec, 'ena', erev_ena) + else: + io.log_warning("Can't set erev for {}, section array doesn't exist".format(erev_section)) + + +def aibs_perisomatic_directed(hobj, cell, dynamics_params): + fix_axon_perisomatic_directed(hobj) + set_params_peri(hobj, dynamics_params) + return hobj + + +def aibs_allactive_directed(hobj, cell, dynamics_params): + fix_axon_allactive_directed(hobj) + set_params_allactive(hobj, dynamics_params) + return hobj + + +def fix_axon_perisomatic_directed(hobj): + # io.log_info('Fixing Axon like perisomatic') + all_sec_names = [] + for sec in hobj.all: + all_sec_names.append(sec.name().split(".")[1][:4]) + + if 'axon' not in all_sec_names: + io.log_exception('There is no axonal recostruction in swc file.') + else: + beg1, end1, beg2, end2 = get_axon_direction(hobj) + + for sec in hobj.axon: + h.delete_section(sec=sec) + h.execute('create axon[2]', hobj) + + h.pt3dadd(beg1[0], beg1[1], beg1[2], 1, sec=hobj.axon[0]) + h.pt3dadd(end1[0], end1[1], end1[2], 1, sec=hobj.axon[0]) + hobj.all.append(sec=hobj.axon[0]) + h.pt3dadd(beg2[0], beg2[1], beg2[2], 1, sec=hobj.axon[1]) + h.pt3dadd(end2[0], end2[1], end2[2], 1, sec=hobj.axon[1]) + hobj.all.append(sec=hobj.axon[1]) + + hobj.axon[0].connect(hobj.soma[0], 0.5, 0) + hobj.axon[1].connect(hobj.axon[0], 1.0, 0) + + hobj.axon[0].L = 30.0 + hobj.axon[1].L = 30.0 + + h.define_shape() + + for sec in hobj.axon: + # print "sec.L:", sec.L + if np.abs(30-sec.L) > 0.0001: + io.log_exception('Axon stub L is less than 30') + + +def fix_axon_allactive_directed(hobj): + all_sec_names = [] + for sec in hobj.all: + all_sec_names.append(sec.name().split(".")[1][:4]) + + if 'axon' not in all_sec_names: + io.log_exception('There is no axonal recostruction in swc file.') + else: + beg1, end1, beg2, end2 = get_axon_direction(hobj) + + axon_diams = [hobj.axon[0].diam, hobj.axon[0].diam] + for sec in hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name == 'axon': + axon_diams[1] = sec.diam + + for sec in hobj.axon: + h.delete_section(sec=sec) + h.execute('create axon[2]', hobj) + hobj.axon[0].connect(hobj.soma[0], 1.0, 0) + hobj.axon[1].connect(hobj.axon[0], 1.0, 0) + + h.pt3dadd(beg1[0], beg1[1], beg1[2], axon_diams[0], sec=hobj.axon[0]) + h.pt3dadd(end1[0], end1[1], end1[2], axon_diams[0], sec=hobj.axon[0]) + hobj.all.append(sec=hobj.axon[0]) + h.pt3dadd(beg2[0], beg2[1], beg2[2], axon_diams[1], sec=hobj.axon[1]) + h.pt3dadd(end2[0], end2[1], end2[2], axon_diams[1], sec=hobj.axon[1]) + hobj.all.append(sec=hobj.axon[1]) + + hobj.axon[0].L = 30.0 + hobj.axon[1].L = 30.0 + + h.define_shape() + + for sec in hobj.axon: + # io.log_info('sec.L: {}'.format(sec.L)) + if np.abs(30 - sec.L) > 0.0001: + io.log_exception('Axon stub L is less than 30') + + +def get_axon_direction(hobj): + for sec in hobj.somatic: + n3d = int(h.n3d()) # get number of n3d points in each section + soma_end = np.asarray([h.x3d(n3d - 1), h.y3d(n3d - 1), h.z3d(n3d - 1)]) + mid_point = int(n3d / 2) + soma_mid = np.asarray([h.x3d(mid_point), h.y3d(mid_point), h.z3d(mid_point)]) + + for sec in hobj.all: + section_name = sec.name().split(".")[1][:4] + if section_name == 'axon': + n3d = int(h.n3d()) # get number of n3d points in each section + axon_p3d = np.zeros((n3d, 3)) # to hold locations of 3D morphology for the current section + for i in range(n3d): + axon_p3d[i, 0] = h.x3d(i) + axon_p3d[i, 1] = h.y3d(i) # shift coordinates such to place soma at the origin. + axon_p3d[i, 2] = h.z3d(i) + + # Add soma coordinates to the list + p3d = np.concatenate(([soma_mid], axon_p3d), axis=0) + + # Compute PCA + pca = PCA(n_components=3) + pca.fit(p3d) + unit_v = pca.components_[0] + + mag_v = np.sqrt(pow(unit_v[0], 2) + pow(unit_v[1], 2) + pow(unit_v[2], 2)) + unit_v[0] = unit_v[0] / mag_v + unit_v[1] = unit_v[1] / mag_v + unit_v[2] = unit_v[2] / mag_v + + # Find the direction + axon_end = axon_p3d[-1] - soma_mid + if np.dot(unit_v, axon_end) < 0: + unit_v *= -1 + + axon_seg_coor = np.zeros((4, 3)) + # unit_v = np.asarray([0,1,0]) + axon_seg_coor[0] = soma_end + axon_seg_coor[1] = soma_end + (unit_v * 30.) + axon_seg_coor[2] = soma_end + (unit_v * 30.) + axon_seg_coor[3] = soma_end + (unit_v * 60.) + + return axon_seg_coor + + +nml_files = {} # For caching neuroml file trees +def NMLLoad(cell, template_name, dynamic_params): + """Convert a NEUROML file to a NEURON hoc cell object. + + Current limitations: + * Ignores nml morphology section. You must pass in a swc file + * Only for biophysically detailed cell biophysical components. All properties must be assigned to a segment group. + + :param cell: + :param template_name: + :param dynamic_params: + :return: + """ + # Last I checked there is no built in way to load a NML file directly into NEURON through the API, instead we have + # to manually parse the nml file and build the NEUROM cell object section-by-section. + morphology_file = cell.morphology_file + hobj = h.Biophys1(str(morphology_file)) + # Depending on if the axon is cut before or after setting cell channels and mechanism can create drastically + # different results. Currently NML files doesn't produce the same results if you use model_processing directives. + # TODO: Find a way to specify model_processing directive with NML file + fix_axon_peri(hobj) + + # Load the hoc template containing a swc initialized NEURON cell + if template_name in nml_files: + nml_params = nml_files[template_name] + else: + # Parse the NML parameters file xml tree and cache. + biophys_dirs = cell.network.get_component('biophysical_neuron_models_dir') + nml_path = os.path.join(biophys_dirs, template_name) + nml_params = NMLTree(nml_path) + nml_files[template_name] = nml_params + + # Iterate through the NML tree by section and use the properties to manually create cell mechanisms + section_lists = [(sec, sec.name().split(".")[1][:4]) for sec in hobj.all] + for sec, sec_name in section_lists: + for prop_name, prop_obj in nml_params[sec_name].items(): + if prop_obj.element_tag() == 'resistivity': + sec.Ra = prop_obj.value + + elif prop_obj.element_tag() == 'specificCapacitance': + sec.cm = prop_obj.value + + elif prop_obj.element_tag() == 'channelDensity' and prop_obj.ion_channel == 'pas': + sec.insert('pas') + setattr(sec, 'g_pas', prop_obj.cond_density) + for seg in sec: + seg.pas.e = prop_obj.erev + + elif prop_obj.element_tag() == 'channelDensity' or prop_obj.element_tag() == 'channelDensityNernst': + sec.insert(prop_obj.ion_channel) + setattr(sec, prop_obj.id, prop_obj.cond_density) + if prop_obj.ion == 'na' and prop_obj: + sec.ena = prop_obj.erev + elif prop_obj.ion == 'k': + sec.ek = prop_obj.erev + + elif prop_obj.element_tag() == 'concentrationModel': + sec.insert(prop_obj.id) + setattr(sec, 'gamma_' + prop_obj.type, prop_obj.gamma) + setattr(sec, 'decay_' + prop_obj.type, prop_obj.decay) + + return hobj + +def set_extracellular(hobj, cell, dynamics_params): + for sec in hobj.all: + sec.insert('extracellular') + + return hobj + + +add_cell_model(NMLLoad, directive='nml', model_type='biophysical') +add_cell_model(Biophys1, directive='ctdb:Biophys1', model_type='biophysical', overwrite=False) +add_cell_model(Biophys1, directive='ctdb:Biophys1.hoc', model_type='biophysical', overwrite=False) +add_cell_model(IntFire1, directive='nrn:IntFire1', model_type='point_process', overwrite=False) + + +add_cell_processor(aibs_perisomatic, overwrite=False) +add_cell_processor(aibs_allactive, overwrite=False) +add_cell_processor(aibs_perisomatic_directed, overwrite=False) +add_cell_processor(aibs_allactive_directed, overwrite=False) +add_cell_processor(set_extracellular, overwrite=False) +add_cell_processor(set_extracellular, 'extracellular', overwrite=False) \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/synapse_models.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/synapse_models.py new file mode 100644 index 0000000..013cbcb --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/synapse_models.py @@ -0,0 +1,206 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h + +from bmtk.simulator.bionet.pyfunction_cache import add_synapse_model +from bmtk.simulator.bionet.nrn import * + + +def exp2syn(syn_params, xs, secs): + """Create a list of exp2syn synapses + + :param syn_params: parameters of a synapse + :param xs: list of normalized distances along the section + :param secs: target sections + :return: list of NEURON synpase objects + """ + syns = [] + for x, sec in zip(xs, secs): + syn = h.Exp2Syn(x, sec=sec) + syn.e = syn_params['erev'] + syn.tau1 = syn_params['tau1'] + syn.tau2 = syn_params['tau2'] + syns.append(syn) + return syns + + +def Exp2Syn(syn_params, sec_x, sec_id): + """Create a list of exp2syn synapses + + :param syn_params: parameters of a synapse + :param sec_x: normalized distance along the section + :param sec_id: target section + :return: NEURON synapse object + """ + syn = h.Exp2Syn(sec_x, sec=sec_id) + syn.e = syn_params['erev'] + syn.tau1 = syn_params['tau1'] + syn.tau2 = syn_params['tau2'] + return syn + + + +@synapse_model +def stp1syn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.stp1syn(x, sec=sec) + + syn.e = syn_params["erev"] + syn.p0 = 0.5 + syn.tau_r = 200 + syn.tau_1 = 5 + syns.append(syn) + + return syns + + +@synapse_model +def stp2syn(syn_params, x, sec): + syn = h.stp2syn(x, sec=sec) + syn.e = syn_params["erev"] + syn.p0 = syn_params["p0"] + syn.tau_r0 = syn_params["tau_r0"] + syn.tau_FDR = syn_params["tau_FDR"] + syn.tau_1 = syn_params["tau_1"] + return syn + + +@synapse_model +def stp3syn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.stp3syn(x, sec=sec) # temporary + syn.e = syn_params["erev"] + syn.p0 = 0.6 + syn.tau_r0 = 200 + syn.tau_FDR = 2000 + syn.tau_D = 500 + syn.tau_1 = 5 + syns.append(syn) + + return syns + + +@synapse_model +def stp4syn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.stp4syn(x, sec=sec) + syn.e = syn_params["erev"] + syn.p0 = 0.6 + syn.tau_r = 200 + syn.tau_1 = 5 + syns.append(syn) + + return syns + + +@synapse_model +def stp5syn(syn_params, x, sec): # temporary + syn = h.stp5syn(x, sec=sec) + syn.e = syn_params["erev"] + syn.tau_1 = syn_params["tau_1"] + syn.tau_r0 = syn_params["tau_r0"] + syn.tau_FDR = syn_params["tau_FDR"] + syn.a_FDR = syn_params["a_FDR"] + syn.a_D = syn_params["a_D"] + syn.a_i = syn_params["a_i"] + syn.a_f = syn_params["a_f"] + syn.pbtilde = syn_params["pbtilde"] + return syn + + +def stp5isyn(syn_params, xs, secs): # temporary + syns = [] + for x, sec in zip(xs, secs): + syn = h.stp5isyn(x, sec=sec) + syn.e = syn_params["erev"] + syn.tau_1 = syn_params["tau_1"] + syn.tau_r0 = syn_params["tau_r0"] + syn.tau_FDR = syn_params["tau_FDR"] + syn.a_FDR = syn_params["a_FDR"] + syn.a_D = syn_params["a_D"] + syn.a_i = syn_params["a_i"] + syn.a_f = syn_params["a_f"] + syn.pbtilde = syn_params["pbtilde"] + syns.append(syn) + + return syns + + +@synapse_model +def tmgsyn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.tmgsyn(x, sec=sec) + syn.e = syn_params["erev"] + syn.tau_1 = syn_params["tau_1"] + syn.tau_rec = syn_params["tau_rec"] + syn.tau_facil = syn_params["tau_facil"] + syn.U = syn_params["U"] + syn.u0 = syn_params["u0"] + syns.append(syn) + + return syns + + +@synapse_model +def expsyn(syn_params, x, sec): + """Create a list of expsyn synapses + + :param syn_params: parameters of a synapse (dict) + :param x: normalized distance along the section (float) + :param sec: target section (hoc object) + :return: synapse objects + """ + syn = h.ExpSyn(x, sec=sec) + syn.e = syn_params['erev'] + syn.tau = syn_params["tau1"] + return syn + + +@synapse_model +def exp1syn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.exp1syn(x, sec=sec) + syn.e = syn_params['erev'] + syn.tau = syn_params["tau_1"] + syns.append(syn) + return syns + + +@synapse_model +def exp1isyn(syn_params, xs, secs): + syns = [] + for x, sec in zip(xs, secs): + syn = h.exp1isyn(x, sec=sec) + syn.e = syn_params['erev'] + syn.tau = syn_params["tau_1"] + syns.append(syn) + return syns + + +add_synapse_model(Exp2Syn, 'exp2syn', overwrite=False) +add_synapse_model(Exp2Syn, overwrite=False) diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/synaptic_weights.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/synaptic_weights.py new file mode 100644 index 0000000..0f0973d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_setters/synaptic_weights.py @@ -0,0 +1,51 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import math + +from bmtk.simulator.bionet.pyfunction_cache import add_weight_function + + +def default_weight_fnc(edge_props, src_props, trg_props): + return edge_props['syn_weight'] + + +def wmax(edge_props, src_props, trg_props): + return edge_props["syn_weight"] + + +def gaussianLL(edge_props, src_props, trg_props): + src_tuning = src_props['tuning_angle'] + tar_tuning = trg_props['tuning_angle'] + + w0 = edge_props["syn_weight"] + sigma = edge_props["weight_sigma"] + + delta_tuning = abs(abs(abs(180.0 - abs(float(tar_tuning) - float(src_tuning)) % 360.0) - 90.0) - 90.0) + weight = w0 * math.exp(-(delta_tuning / sigma) ** 2) + + return weight + + +add_weight_function(wmax, 'wmax', overwrite=False) +add_weight_function(gaussianLL, 'gaussianLL', overwrite=False) +add_weight_function(default_weight_fnc, 'default_weight_fnc', overwrite=False) diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/default_templates/BioAxonStub.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_templates/BioAxonStub.hoc new file mode 100644 index 0000000..df8660d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_templates/BioAxonStub.hoc @@ -0,0 +1,61 @@ +begintemplate BioAxonStub + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + + simplify_axon() +} + +proc simplify_axon() { + + forsec axonal { delete_section() } + create axon[2] + + axon[0] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + axon[1] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + connect axon(0), soma(0.5) + connect axon[1](0), axon[0](1) + define_shape() + + +} + +endtemplate BioAxonStub \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/default_templates/Biophys1.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_templates/Biophys1.hoc new file mode 100644 index 0000000..e25192a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_templates/Biophys1.hoc @@ -0,0 +1,32 @@ +begintemplate Biophys1 + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) + import.instantiate(this) + +} + +endtemplate Biophys1 diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/default_templates/advance.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_templates/advance.hoc new file mode 100644 index 0000000..f4ed0b8 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/default_templates/advance.hoc @@ -0,0 +1,10 @@ +// custom proc advance() + +objref pysim // defined in the Simulation as h.pysim = self + +pysim = new PythonObject() + +proc advance() { + fadvance() + pysim.post_fadvance() // run Simulation.post_fadvance() function after each fadvance call +} diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/iclamp.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/iclamp.py new file mode 100644 index 0000000..fe823ef --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/iclamp.py @@ -0,0 +1,38 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h + + +class IClamp(object): + def __init__(self, amplitude, delay, duration): + self._iclamp_amp = amplitude + self._iclamp_del = delay + self._iclamp_dur = duration + self._stim = None + + def attach_current(self, cell): + self._stim = h.IClamp(cell.hobj.soma[0](0.5)) + self._stim.delay = self._iclamp_del + self._stim.dur = self._iclamp_dur + self._stim.amp = self._iclamp_amp + return self._stim diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d.hoc new file mode 100644 index 0000000..3bcad33 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d.hoc @@ -0,0 +1,12 @@ +{xopen("import3d/import3d_sec.hoc")} +{xopen("import3d/read_swc.hoc")} +{xopen("import3d/read_nlcda.hoc")} +{xopen("import3d/read_nlcda3.hoc")} +{xopen("import3d/read_nts.hoc")} +{xopen("import3d/read_morphml.hoc")} +{xopen("import3d/import3d_gui.hoc")} +objref tobj, nil +proc makeimport3dtool() { + tobj = new Import3d_GUI(nil) + tobj = nil +} diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/import3d_gui.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/import3d_gui.hoc new file mode 100644 index 0000000..81d6935 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/import3d_gui.hoc @@ -0,0 +1,1174 @@ +{load_file("celbild.hoc")} +{load_file("stdlib.hoc")} + +begintemplate Import3d_GUI +public swc, diam_glyph, box, plrot, readfile, redraw, name +public origin, rotmatold, raworigin, g, rotraw, instantiate +external hoc_sf_ +objref swc, g, box, this, rotmat, m2, origin, tobj, rotmatold +objref raworigin, rotsav, viewsec, rawsel, deck +objref file, nil, problist, types, editbox +strdef tstr, tstr1, typelabel_, filename +public quiet + + +proc init() { + + quiet = 0 + + if (numarg() == 2) if ($2 == 0) { + swc = $o1 + return + } + if ($o1 == nil) { + file = new File() + filename = "choose a file " + }else{ + file = $o1.file + hoc_sf_.head(file.getname(), "[^/]*$", tstr) + file.chooser("r", "Import 3-D Reconstruction File", "*", "Read", "Cancel", tstr) + filename =file.getname() + } + ztrans_ = 0 + dummy_ = 0 + undo_type_ = 0 + show_point_ = 1 + show_diam_ = 1 + if ($o1 == nil) { build() map() return } + init1($o1) + build() + map() + init2() + +} + +proc map() { + sprint(tstr, "%s", this) + if (numarg() == 0) { + box.map(tstr) + }else{ + box.map(tstr, $2, $3, $4, $5) + } +} + +proc init1() { + i=0 j=0 + swc = $o1 + selpoint_ = -1 + selid_ = swc.pt2id(selpoint_) + viewsec = new List() + showtype(-10000) + rotated_ = 0 + rotmat = new Matrix(3,3) + rotmatold = rotmat.c.ident + rotsav = rotmat.c.ident + origin = new Vector(3) + raworigin = new Vector(3) + rawsel = new Vector(3) + m2 = new Matrix(3,3) +} +proc init2() { + rot(0,0) + pl() + g.exec_menu("View = plot") + g.exec_menu("Zoom") +} + +proc build() {local i + box = new HBox(3) + box.full_request(1) + box.save("") + box.ref(this) + box.intercept(1) + box.adjuster(400) + g = new Graph(0) + g.view(2) + g.xaxis(3) + deck = new Deck(3) + build_panel() + deck.map + box.intercept(0) +} + +proc build_panel() {local i + deck.intercept(1) + xpanel("") + xcheckbox(filename, &readfile_, "readfile()") + if (swc == nil) { + xlabel(" accepted file formats:") + xlabel(" SWC") + xlabel(" Neurolucida (v1 and v3)") + xlabel(" Eutectic") + if (nrnpython("")) xlabel(" MorphML") + for i = 0, 15 { xlabel("") } + xpanel(0) + deck.intercept(0) + deck.flip_to(0) + return + } + sprint(tstr, "File format: %s", swc.filetype) + xlabel(tstr) + xlabel("-------------------------------") + g.menu_remove("Zoom") + g.menu_tool("Zoom", "zoom") + g.menu_remove("Translate ") + g.menu_tool("Translate ", "translate") + g.menu_remove("Rotate") + g.menu_tool("Rotate (about axis in plane)", "rotate") + xcheckbox("Rotate 45deg about y axis", &dummy_, "rot45()") + xcheckbox("Rotated (vs Raw view)", &rotated_, "rotraw()") + xcheckbox("Show Points", &show_point_, "pl()") + xcheckbox("Show Diam", &show_diam_, "pl()") + xvarlabel(typelabel_) + xmenu("View type") + xradiobutton("All", "showtype(-10000) pl()", 1) + xradiobutton("Section containing selected point", "showsec() pl()") + xradiobutton("Distal (tree) from selected point", "showdistal() pl()") + xradiobutton("Proximal (path to root) from selected point", "showprox() pl()") + xradiobutton("Root sections", "showroot() pl()") + if (swc.type.min != swc.type.max) { + for i = swc.type.min, swc.type.max { + if (swc.type.indwhere("==", i) != -1) { + sprint(tstr, "type %d", i) + sprint(tstr1, "showtype(%d) pl()", i) + xradiobutton(tstr, tstr1) + } + } + } + xmenu() + g.menu_remove("Select point") + g.menu_tool("Select point", "selpoint", "selpoint1(1)") + if (strcmp(swc.filetype, "Neurolucida") == 0) { + xpvalue("Line#", &selid_, 1, "selid(1)") + if (swc.err) { + xbutton("Problem points", "probpointpanel()") + } + }else if (strcmp(swc.filetype, "Neurolucida V3") == 0) { + xpvalue("Line#", &selid_, 1, "selid(1)") + }else{ + xpvalue("Select id", &selid_, 1, "selid(1)") + } + xlabel("-------------------------------") + xbutton("Edit", "map_edit()") + xmenu("Export") + xbutton("CellBuilder", "cbexport()") + xbutton("Instantiate", "instantiate(nil)") + xmenu() + sprint(tstr, "%s filter facts", swc.filetype) + xbutton(tstr, "swc.helptxt()") + xpanel(0) + deck.intercept(0) + deck.flip_to(0) +} + + +proc map_edit() { + if (editbox == nil) { + build_edit() + } + if (editbox.ismapped) { return } + sprint(tstr, "Edit %s", this) + editbox.map(tstr) +} +proc build_edit() { + editbox = new VBox() + editbox.intercept(1) + editbox.save("") + xpanel("") + ztransitem() + xlabel("Select point:") + xcheckbox("Largest z change", &dummy_, "sel_largest_dz()") + xlabel("then action:") + xcheckbox("z-translate rest of tree to parent point", &dummy_, "edit2()") + xcheckbox("z-translate to average of adjacent points", &dummy_, "edit1()") + xcheckbox("undo last", &dummy_, "edit0()") + xlabel("-------------------") + xcheckbox("3 point filter of all z values (no undo)", &dummy_, "edit3()") + xpanel() + editbox.intercept(0) +} + +proc sel_largest_dz() {local i, j, dz, dzmax, imax, jmax localobj sec, tobj + dummy_ = 0 + dzmax = -1 + for i = 0, swc.sections.count-1 { + sec = swc.sections.object(i) + tobj = sec.raw.getrow(2).deriv(1,1).abs + j = tobj.max_ind + dz = tobj.x[j] + if (dz > dzmax) { + jmax = j+1 + imax = i + dzmax = dz + } + } + if (dzmax > 0) { + selpoint_ = swc.sec2pt(imax, jmax) + selpoint_dependent_show() + swc.sections.object(imax).raw.getcol(jmax, rawsel) + selid_ = swc.pt2id(selpoint_) + pl() + } +} + +proc ztransitem() {local i, n localobj raw + n = 0 + for i = 0, swc.sections.count-1 { + raw = swc.sections.object(i).raw + if (abs(raw.x[2][0] - raw.x[2][1]) > 10) { + n += 1 + } + } + if (n > 0) { + sprint(tstr, "z translation for %d abrupt branch backlash", n) + xcheckbox(tstr, &ztrans_, "ztrans()") + } +} + +proc ztrans() { local i, zd, pn localobj sec + if (ztrans_) { + for i = 0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (object_id(sec.parentsec) == 0) { continue } + if (object_id(sec.parentsec.parentsec) == 0) { continue } + zd = sec.raw.x[2][1] - sec.raw.x[2][0] + if (abs(zd) > 5) { + zd += sec.parentsec.ztrans + }else{ + zd = sec.parentsec.ztrans + } + sec.ztrans = zd + sec.raw.setrow(2, sec.raw.getrow(2).sub(sec.ztrans)) + pn = sec.parentsec.raw.ncol + sec.raw.x[2][0] = sec.parentsec.raw.x[2][pn-1] + } + }else{ + for i = 0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.ztrans) { +sec.raw.setrow(2, sec.raw.getrow(2).add(sec.ztrans)) + pn = sec.parentsec.raw.ncol + sec.raw.x[2][0] = sec.parentsec.raw.x[2][pn-1] + sec.ztrans = 0 + } + } + } + redraw() +} + +proc edit0() {local i, n localobj sec + dummy_ = 0 + if (undo_type_ == 1) { + i = swc.pt2sec(undo_selpoint_, sec) + sec.raw.x[2][i] = undo_z_ + sec.raw.getcol(i, rawsel) + }else if (undo_type_ == 2) { + i = swc.pt2sec(undo_selpoint_, sec) + n = sec.raw.ncol + for i=i, n-1 { + sec.raw.x[2][i] += undo_z_ + } + sec.raw.getcol(i, rawsel) + for i=0, swc.sections.count-1 { swc.sections.object(i).volatile = 0 } + sec.volatile = 1 + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (object_id(sec.parentsec)) if (sec.parentsec.volatile) { + sec.volatile = 1 + sec.raw.setrow(2, sec.raw.getrow(2).add(undo_z_)) + } + } + } + undo_type_ = 0 + redraw() +} + +proc edit1() {local i, z1, z2 localobj sec + // z translate to average of adjacent points + dummy_ = 0 + if (selpoint_ >= 0) { + i = swc.pt2sec(selpoint_, sec) + if (i > 0) { + z1 = sec.raw.x[2][i-1] + }else{ + return + } + if (i < sec.raw.ncol-1) { + z2 = sec.raw.x[2][i+1] + }else{ + return + } + undo_selpoint_ = selpoint_ + undo_type_ = 1 + undo_z_ = sec.raw.x[2][i] + sec.raw.x[2][i] = (z1 + z2)/2 + sec.raw.getcol(i, rawsel) + } + redraw() +} + +proc edit2() {local i, ip, z1, n localobj sec + // z-translate rest of tree to parent point + dummy_ = 0 + if (selpoint_ >= 0) { + ip = swc.pt2sec(selpoint_, sec) + if (ip > 0) { + z1 = sec.raw.x[2][ip] - sec.raw.x[2][ip-1] + }else{ + return + } + undo_selpoint_ = selpoint_ + undo_type_ = 2 + undo_z_ = z1 + n = sec.raw.ncol + for i=ip, n-1 { + sec.raw.x[2][i] -= z1 + } + sec.raw.getcol(ip, rawsel) + for i=0, swc.sections.count-1 { swc.sections.object(i).volatile = 0 } + sec.volatile = 1 + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (object_id(sec.parentsec)) if (sec.parentsec.volatile) { + sec.volatile = 1 + sec.raw.setrow(2, sec.raw.getrow(2).sub(z1)) + } + } + } + redraw() +} + +proc edit3() {local i localobj sec + dummy_ = 0 + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + sec.raw.setrow(2, sec.raw.getrow(2).medfltr) + } + if (selpoint_ >= 0) { + i = swc.pt2sec(selpoint_, sec) + sec.raw.getcol(i, rawsel) + } + redraw() +} + +proc probpointpanel() { + problist = new List() + problist.browser("Problem points", "s") + problist.select_action("probpoint(hoc_ac_)") + swc.fillproblist(problist) + problist.select(-1) +} + +proc probpoint() {local i + if ($1 < 0) {return} + sscanf(problist.object($1).s, "%d:", &i) + selid_ = i + selid(0) +} + +proc readfile() { + readfile_ = 0 + if (numarg() == 0) { + file.chooser("r", "Import 3-D Reconstruction File", "*", "Read", "Cancel") + if (file.chooser()) { + if (!some_format()) { + return + } + }else{ + return + } + }else{ + file = new File($s1) + if (!some_format()) { + return + } + } + // if new file + problist = nil + deck.flip_to(-1) + build_panel() + deck.move_last(0) + deck.flip_to(0) + init1(swc) + init2() + doNotify() + if (swc.err) { + printf("\n") + sprint(tstr, "%s: File translation problems. See the messages on the terminal", file.getname) + continue_dialog(tstr) + if (strcmp(swc.filetype, "Neurolucida V3") == 0) { + swc.b2spanel(this) + } + } + deck.remove_last() +} + +func some_format() {local i, a,b,c,d,e,f,g, n + if (!file.ropen()) { + sprint(tstr, "Can't read %s", file.getname) + continue_dialog(tstr) + return 0 + } + while (1) { + if (file.eof) { + file.close + sprint(tstr, "Can't figure out file format for %s", file.getname) + continue_dialog(tstr) + return 0 + } + file.gets(tstr) + if (hoc_sf_.head(tstr, "^\\<\\?xml", tstr1) != -1) { + if (nrnpython("")) { + swc = new Import3d_MorphML() break + }else{ + file.close + sprint(tstr, "Can't read MorphML: Python not available.") + continue_dialog(tstr) + return 0 + } + } + n = sscanf(tstr, "%f %f %f %f %f %f %f", &a, &b, &c, &d, &e, &f, &g) + if (n == 7) { swc = new Import3d_SWC_read() break } + n = sscanf(tstr, "[%d,%d] (%f,%f,%f) %f", &a, &b, &c, &d, &e, &f) + if (n == 6) { swc = new Import3d_Neurolucida_read() break } + n = sscanf(tstr, "%d %s %d %f %f %f %f", &a, tstr, &b, &c, &d, &e, &f) + if (n == 7) { swc = new Import3d_Eutectic_read() break } + if (hoc_sf_.tail(tstr, "^[ \t]*", tstr1) != -1) { + //unfortunately regexp does not allow an explicit "(" + hoc_sf_.left(tstr1, 1) + if (strcmp(tstr1, "(") == 0) { + swc = new Import3d_Neurolucida3() break + } + } + if (hoc_sf_.head(tstr, "^;[ \t]*V3", tstr1) != -1) { + swc = new Import3d_Neurolucida3() break + } + } + file.close + filename = file.getname + swc.input(filename) + return 1 +} + +proc pl_point() { local i, j, i1 localobj m, m0 + if (viewsec.count) {m0 = swc.sections.object(0).xyz} + for i=0, viewsec.count-1 { + viewsec.object(i).pl_point(g) + } +} + +proc pl_centroid() {local i + for i=0, swc.sections.count-1 { + swc.sections.object(i).pl_centroid(g) + } +} +proc pl_diam() {local i localobj sec + for i=0, viewsec.count-1 { + viewsec.object(i).pl_diam(g) + } +} +proc pl() { localobj tobj + g.erase_all + if (show_diam_) {pl_diam()} + pl_centroid() + if (show_point_) {pl_point()} + if (selpoint_ >= 0) { + tobj = m2.mulv(rawsel) + g.mark(tobj.x[0], tobj.x[1], "O", 12, 2, 1) + swc.label(selpoint_, tstr) + g.label(.1, .05, tstr, 2, 1, 0, 0, 1) + } +} + +proc redraw() { local i localobj sec + if (selpoint_ >= 0) { + i = swc.pt2sec(selpoint_, sec) + sec.raw.getcol(i, rawsel) + } + showtype(viewtype_) + rot(0,0) + pl() +} + +proc showtype() { + viewtype_ = $1 + viewsec.remove_all + if ($1 == -10000) { + typelabel_ = "View all types" + for i=0, swc.sections.count - 1 { + viewsec.append(swc.sections.object(i)) + swc.sections.object(i).centroid_color = 2 + } + }else{ + sprint(typelabel_, "View type %d", viewtype_) + for i=0, swc.sections.count - 1 { + if (swc.sections.object(i).type == viewtype_) { + viewsec.append(swc.sections.object(i)) + swc.sections.object(i).centroid_color = 2 + }else{ + swc.sections.object(i).centroid_color = 9 + } + } + } +} + +proc selpoint_dependent_show() { + if (viewtype_ == -20000) { + showdistal() + }else if (viewtype_ == -30000) { + showprox() + }else if (viewtype_ == -40000) { + showsec() + }else if (viewtype_ == -50000) { + showroot() + } +} + +proc showdistal() {local i localobj sec + viewtype_ = -20000 + typelabel_ = "Show distal (tree) from selected point" + viewsec.remove_all + for i=0, swc.sections.count - 1 { + swc.sections.object(i).centroid_color = 9 + } + if (selpoint_ < 0) { return } + swc.pt2sec(selpoint_, sec) + // recursion is trivial but I want to avoid the depth so use the + // fact that children are after the parent in the sections list + sec.centroid_color = 2 + viewsec.append(sec) + for i=0, swc.sections.count - 1 { + if (swc.sections.object(i).centroid_color == 2) { + break + } + } + for i=i+1, swc.sections.count - 1 { + sec = swc.sections.object(i) + if (sec.parentsec != nil) if (sec.parentsec.centroid_color == 2) { + sec.centroid_color = 2 + viewsec.append(sec) + } + } +} + +proc showprox() {localobj sec + viewtype_ = -30000 + typelabel_ = "Show proximal (path to root) from selected point" + viewsec.remove_all + for i=0, swc.sections.count - 1 { + swc.sections.object(i).centroid_color = 9 + } + if (selpoint_ < 0) { return } + for (swc.pt2sec(selpoint_, sec); sec != nil; sec = sec.parentsec) { + viewsec.append(sec) + sec.centroid_color = 2 + } +} + +proc showsec() {localobj sec + viewtype_ = -40000 + typelabel_ = "Show section containing selected point" + viewsec.remove_all + for i=0, swc.sections.count - 1 { + swc.sections.object(i).centroid_color = 9 + } + if (selpoint_ < 0) { return } + swc.pt2sec(selpoint_, sec) + if (sec != nil) { + viewsec.append(sec) + sec.centroid_color = 2 + } +} + +proc showroot() {localobj sec + viewtype_ = -50000 + typelabel_ = "Show root sections" + viewsec.remove_all + for i=0, swc.sections.count - 1 { + sec = swc.sections.object(i) + sec.centroid_color = 9 + if (sec.parentsec == nil) { + sec.centroid_color = 2 + viewsec.append(sec) + } + } +} + +proc selpoint1() { // deselection not supported by menu_tool + if ($1 == 0) { + selpoint_ = -1 + } +} +proc selpoint() {local i, j + if ($1 == 2) { + nearest_point($2, $3, &i, &j) + selpoint_ = swc.sec2pt(i, j) + selpoint_dependent_show() + swc.sections.object(i).raw.getcol(j, rawsel) + selid_ = swc.pt2id(selpoint_) + pl() + } +} + +proc selid() {local i, j localobj sec + selpoint_ = swc.id2pt(selid_) + selid_ = swc.pt2id(selpoint_) + if (selpoint_ >= 0) { + i = swc.pt2sec(selpoint_, sec) + sec.raw.getcol(i, rawsel) + } + selpoint_dependent_show() + pl() + if ($1 == 1) { + swc.label(selpoint_, tstr) + print tstr + } +} + +proc zoom() {local x1,y1,scale,w,h,x0,y0 + if ($1 == 2) { + i = g.view_info() + x = $2 + y = $3 + xrel=g.view_info(i, 11, $2) + yrel=g.view_info(i, 12, $3) + width=g.view_info(i,1) + height=g.view_info(i,2) + } + if ($1 == 1) { + x1 = g.view_info(i, 11, $2) + y1 = g.view_info(i, 12, $3) + y1 = (y1 - yrel) + (x1 - xrel) + if(y1 > 2) { y1 = 2 } else if (y1 < -2) { y1 = -2 } + scale = 10^(y1) + w = width/scale + h = height/scale + x0 = x - w*xrel + y0 = y - h*yrel + g.view_size(i, x0, x0+w, y0, y0+h) + } +} + +proc translate() {local x0,y0 + if ($1 == 2) { + i = g.view_info() + x = g.view_info(i, 5) + y = g.view_info(i, 7) + xrel=g.view_info(i, 11, $2) + yrel=g.view_info(i, 12, $3) + width=g.view_info(i,1) + height=g.view_info(i,2) + } + if ($1 == 1) { + x1 = g.view_info(i, 11, $2) + y1 = g.view_info(i, 12, $3) + x0 = x - width*(x1 - xrel) + y0 = y - height*(y1 - yrel) + g.view_size(i, x0, x0 + width, y0, y0 + height) + } +} + +func nearest_point() { local i, j, xmin localobj m, v1 + // return section index and sectionpoint index in $3 and $4 + xmin = 1e9 + for i=0, swc.sections.count-1 { + m = swc.sections.object(i).xyz + v1 = m.getrow(0).sub($1).pow(2).add(m.getrow(1).sub($2).pow(2)) + j = v1.min_ind + if (v1.x[j] < xmin) { + xmin = v1.x[j] + $&3 = i + $&4 = j + } + } + return xmin +} + +proc rotate() {local x, y, x0, y0, len, a + if ($1 == 2) { + rotated_ = 1 + nearest_point($2, $3, &i, &j) + swc.sections.object(i).xyz.getcol(j, origin) + swc.sections.object(i).raw.getcol(j, raworigin) +//print i, j origin.printf + i = g.view_info() + xpix = g.view_info(i,13, $2) + ypix = g.view_info(i, 14, $3) // from top + left = g.view_info(i, 5) + bottom = g.view_info(i, 7) + width=g.view_info(i,1) + height=g.view_info(i,2) + }else{ + x = g.view_info(i,13, $2) - xpix + y = ypix - g.view_info(i, 14, $3) + // rotation axis is normal to the line, rotation magnitude + // proportional to length of line + len = sqrt(x*x + y*y) + // rotation axis angle + if (len > 0) { + a = atan2(x, y) + b = len/50 + }else{ + a = 0 + b = 0 + } + rot(a, b) + pl() + tobj = rotmat.mulv(origin) + //tobj.x[0] should be at same place as origin.x[0] + x0 = left - origin.x[0] + tobj.x[0] + y0 = bottom - origin.x[1] + tobj.x[1] + g.view_size(i, x0, x0 + width, y0, y0 + height) + + } + if ($1 == 3) { + m2.c(rotmatold) +//rotmatold.printf + } +} + +proc rotraw() {local x0, y0 + width = g.view_info(0, 1) + height = g.view_info(0, 2) + left = g.view_info(0,5) + bottom = g.view_info(0,7) + if (rotated_ == 0) { //turn off + rotmatold.c(rotsav) + tobj = rotmatold.mulv(raworigin) + //tobj.x[0] should be at same place as origin.x[0] + x0 = left + raworigin.x[0] - tobj.x[0] + y0 = bottom + raworigin.x[1] - tobj.x[1] + rotmatold.ident + }else{ // back to previous rotation + rotsav.c(rotmatold) + tobj = rotmatold.mulv(raworigin) + //tobj.x[0] should be at same place as origin.x[0] + x0 = left - raworigin.x[0] + tobj.x[0] + y0 = bottom - raworigin.x[1] + tobj.x[1] + } + rot(0,0) + pl() + g.view_size(0, x0, x0 + width, y0, y0 + height) +} + +proc rot45() { + rot(PI/2, PI/4) + rotated_=1 + m2.c(rotmatold) + pl() + dummy_ = 0 +} + +proc rot() {local s, c, i localobj sec + s = sin($1) c = cos($1) + m2.zero + m2.x[2][2] = 1 + m2.x[1][1] = m2.x[0][0] = c + m2.x[1][0] = -s + m2.x[0][1] = s +//m2.printf + s = sin($2) c = cos($2) + rotmat.zero + rotmat.x[0][0] = 1 + rotmat.x[1][1] = rotmat.x[2][2] = c + rotmat.x[1][2] = s + rotmat.x[2][1] = -s +//rotmat.printf + + m2.mulm(rotmat).mulm(m2.transpose(m2), rotmat) + rotmat.mulm(rotmatold, m2) +//rotmat.printf + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + sec.rotate(m2) + } +} + +proc cbexport() {local i, j, k localobj sec, cell + chk_valid() + j = 0 + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.is_subsidiary) { continue } + if (sec.parentsec == nil) { + sec.volatile2 = j + j += 1 + }else{ + sec.volatile2 = sec.parentsec.volatile2 + } + } + cell = new List() + for k=0, j-1 { + cell.remove_all() + for i=0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.is_subsidiary) { continue } + if (sec.volatile2 == k) { + cell.append(sec) + } + } + cbexport1(cell) + } +} + +proc sphere_rep() { local i localobj x, y, z, d + x = new Vector(3) y = x.c z = x.c d = x.c + x.fill($o1.x[0]) + y.fill($o2.x[0]) + z.fill($o3.x[0]) + d.fill($o4.x[0]) + x.x[0] -= $o4.x[0]/2 + x.x[2] += $o4.x[0]/2 + $o1 = x $o2 = y $o3 = z $o4 = d +} + +proc cbexport1() {local i, j, k, min localobj cb, sec, psec, cbsec, slist, m, subsetindex, xx, yy, zz, dd + for i=0, $o1.count-1 { + sec = $o1.object(i) + sec.volatile = i + } + min = set_nameindex($o1) + cb = new CellBuild() + cb.topol.names_off = 1 + cb.topol.circles_off = 1 + slist = cb.topol.slist + slist.remove_all() + for i=0, $o1.count-1 { + sec = $o1.object(i) + psec = nil + if (sec.parentsec != nil) { + psec = slist.object(sec.parentsec.volatile) + } + type2name(sec.type, tstr) + cbsec = new CellBuildSection(tstr, sec.nameindex, 0, psec, sec.parentx) + slist.append(cbsec) + m = sec.raw + j = sec.first + xx = m.getrow(0).c(j) + yy = m.getrow(1).c(j) + zz = m.getrow(2).c(j) + dd = sec.d.c(j) + if (sec.iscontour_) { + contour2centroid(xx, yy, zz, dd, sec) + } + if (sec.parentsec == nil && dd.size == 1) { + // represent spherical soma as 3 point cylinder + // with L=diam + sphere_rep(xx, yy, zz, dd) + } + k = dd.size-1 + cbsec.position(xx.x[0], yy.x[0], xx.x[k], yy.x[k]) + cbsec.i3d = k+1 + cbsec.p3d = new P3D(k + 1) + cbsec.p3d.x = xx + cbsec.p3d.y = yy + cbsec.p3d.z = zz + cbsec.p3d.d = dd + if (sec.first == 1) { + cbsec.logstyle(m.x[0][0], m.x[1][0], m.x[2][0]) + } + cb.all.add(cbsec) + } + cb.topol.consist() + cb.topol.update() + cb.subsets.update() + subsetindex = types.c.fill(0) + k = 0 + for i=0, types.size-1 { + if (types.x[i] > 0) { + k += 1 // after all + subsetindex.x[i] = k + j = i + min + if (j == 1) { + tstr = "somatic" + }else if (j == 2) { + tstr = "axonal" + }else if (j == 3) { + tstr = "basal" + }else if (j == 4) { + tstr = "apical" + }else if (j < 0) { + sprint(tstr, "minus_%dset", -j) + }else{ + sprint(tstr, "dendritic_%d", j) + } + m = new SNList(tstr) + cb.subsets.snlist.append(m) + } + } + for i=0, slist.count-1 { + sec = $o1.object(i) + cbsec = slist.object(i) + cb.subsets.snlist.object(subsetindex.x[sec.type-min]).add(cbsec) + } + //cb.page(2) //unfortunately not able to blacken the radiobutton +} + +func set_nameindex() {local i, min localobj sec + min = swc.type.min + types = new Vector(swc.type.max - min + 1) + for i = 0, $o1.count-1 { + sec = $o1.object(i) + if (sec.is_subsidiary) { continue } + sec.nameindex = types.x[sec.type - min] + types.x[sec.type-min] += 1 + } + return min +} + +proc instantiate() {local i, j, min, haspy localobj sec, xx, yy, zz, dd, pyobj + chk_valid() + haspy = nrnpython("import neuron") + if (haspy) { + pyobj = new PythonObject() + } + min = set_nameindex(swc.sections) + // create + for i = 0, types.size-1 { + type2name(i+min, tstr) + if (types.x[i] == 1) { + sprint(tstr1, "~create %s[1]\n", tstr) + execute(tstr1, $o1) + }else if (types.x[i] > 1) { + sprint(tstr1, "~create %s[%d]\n", tstr, types.x[i]) + execute(tstr1, $o1) + } + if ($o1 != nil) { mksubset($o1, i+min, tstr) } + } + if ($o1 != nil) {execute("forall all.append", $o1) } + // connect + for i = 0, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.is_subsidiary) { continue } + name(sec, tstr) + if (i == 0) { + sprint(tstr1, "access %s", tstr) + if ($o1 == nil) { + execute(tstr1, $o1) + } + } + if (sec.parentsec != nil) { + name(sec.parentsec, tstr1) + sprint(tstr1, "%s connect %s(0), %g", tstr1, tstr, sec.parentx) + execute(tstr1, $o1) + } + // 3-d point info + if (sec.first == 1) { + sprint(tstr1, "%s { pt3dstyle(1, %g, %g, %g) }", tstr, sec.raw.x[0][0], sec.raw.x[1][0], sec.raw.x[2][0]) + execute(tstr1, $o1) + } + j = sec.first + xx = sec.raw.getrow(0).c(j) + yy = sec.raw.getrow(1).c(j) + zz = sec.raw.getrow(2).c(j) + dd = sec.d.c(j) + if (sec.iscontour_) { + if (haspy) { + pyobj.neuron._declare_contour(sec, tstr) + } + contour2centroid(xx, yy, zz, dd, sec) + } + if (dd.size == 1) { sphere_rep(xx, yy, zz, dd) } + for j = 0, dd.size-1 { + sprint(tstr1, "%s { pt3dadd(%g, %g, %g, %g) }",\ + tstr,xx.x[j], yy.x[j], zz.x[j], dd.x[j]) + execute(tstr1, $o1) + } + } +} + +proc chk_valid() {local i, x, replot localobj sec + replot = 0 + // some validity checks added in response to experienced file errors + // sometimes we can work around them + + // two point sections with 0 length, remove, unless root + for (i=swc.sections.count-1; i >= 0; i -= 1) { + sec = swc.sections.object(i) + if (sec.parentsec == nil) { continue } + if ((sec.raw.ncol - sec.first) <= 1) { + if (!quiet) {// addded by Sergey to suppress the warning output + printf("One point section %s ending at line %d has been removed\n", sec, swc.iline.x[swc.id2line(sec.id)]) + } + rm0len(i, sec) + replot = 1 + }else if ((sec.raw.ncol - sec.first) <= 2) { + if (sec.raw.getcol(sec.first).eq(sec.raw.getcol(sec.first + 1))) { + printf("Two point section ending at line %d with 0 length has been removed\n", swc.iline.x[swc.id2line(sec.id)]) + rm0len(i, sec) + replot = 1 + } + } + } + if (replot && g != nil) { + redraw() + } +} + +proc rm0len() {local i localobj sec + swc.sections.remove($1) + for i=$1, swc.sections.count-1 { + sec = swc.sections.object(i) + if (sec.parentsec == $o2) { + sec.parentsec = $o2.parentsec + sec.parentx = $o2.parentx + if (!quiet) {// addded by Sergey to suppress the warning output + printf("\tand child %s reattached\n", sec) + } + } + } +} + +proc mksubset() { + if ($2 == 1) { + tstr1 = "somatic" + }else if ($2 == 2) { + tstr1 = "axonal" + }else if ($2 == 3) { + tstr1 = "basal" + }else if ($2 == 4) { + tstr1 = "apical" + }else if ($2 < 0) { + sprint(tstr1, "minus_%dset", -$2) + }else{ + sprint(tstr1, "dendritic_%d", $2) + } + sprint(tstr1, "forsec \"%s\" %s.append", $s3, tstr1) + execute(tstr1, $o1) +} + +proc contour2centroid() {local i, j, imax, imin, ok localobj mean, pts, d, max, min, tobj, rad, rad2, side2, pt, major, m, minor + if (object_id($o5.contour_list)) { + contourstack2centroid($o1, $o2, $o3, $o4, $o5) + return + } + mean = swc.sections.object(0).contourcenter($o1, $o2, $o3) + if (g != nil) { + g.beginline(6,1) + for i=0, $o1.size-1 { + g.line($o1.x[i], $o2.x[i]) + } + g.flush() + } + pts = new Matrix(3, $o1.size) + for i=1,3 { pts.setrow(i-1, $oi.c.sub(mean.x[i-1])) } + // find the major axis of the ellipsoid that best fits the shape + // assuming (falsely in general) that the center is the mean + + m = new Matrix(3,3) + for i=0, 2 { + for j=i, 2 { + m.x[i][j] = pts.getrow(i).mul(pts.getrow(j)).sum + m.x[j][i] = m.x[i][j] + } + } + tobj = m.symmeig(m) + // major axis is the one with largest eigenvalue + major = m.getcol(tobj.max_ind) + // minor is normal and in xy plane + minor = m.getcol(3-tobj.min_ind-tobj.max_ind) + minor.x[2] = 0 + minor.div(minor.mag) +if (g != nil) { +g.beginline(4, 3) g.line(mean.x[0], mean.x[1]) +g.line(mean.x[0] + 20*major.x[0], mean.x[1] + 20*major.x[1]) g.flush +} + d = new Vector(pts.ncol) + rad = new Vector(pts.ncol) + for i=0, pts.ncol-1 { + pt = pts.getcol(i) + d.x[i] = pt.dot(major) // position on the line + tobj = major.c.mul(d.x[i]) + rad.x[i] = pt.dot(minor) + } + imax = d.max_ind + d.rotate(-imax) + rad.rotate(-imax) + imin = d.min_ind + side2 = d.c(imin) + rad2 = rad.c(imin) + d.resize(imin).reverse + rad.resize(imin).reverse + // now we have the two sides without the min and max points (rad=0) + // we hope both sides now monotonically increase, i.e. convex + // make it convex + for (j = d.size-1; j > 0; j -= 1) { + if (d.x[j] <= d.x[j-1]) { +//printf("removed d %d %g\n", j, d.x[j]) + d.remove(j) + rad.remove(j) + if (j != d.size()) { j += 1 } + } + } + for (j = side2.size-1; j > 0; j -= 1) { + if (side2.x[j] <= side2.x[j-1]) { +//printf("removed side2 %d %g\n", j, side2.x[j]) + side2.remove(j) + rad2.remove(j) + if (j != side2.size()) { j += 1 } + } + } + // can interpolate so diams on either side of major have same d + tobj = d.c.append(side2) + tobj.sort + i = tobj.x[1] j = tobj.x[tobj.size-2] + tobj.indgen(i, j, (j-i)/20) + rad.interpolate(tobj, d) + rad2.interpolate(tobj,side2) + d = tobj + pts.resize(3, d.size) + $o4.resize(d.size) + for i = 0, d.size-1 { + pt = major.c.mul(d.x[i]).add(mean) + $o4.x[i] = abs(rad.x[i] - rad2.x[i]) + tobj = pt.c.add(minor.c.mul(rad.x[i])) +if (g != nil) g.beginline(5,3) g.line(tobj.x[0], tobj.x[1]) + tobj = pt.c.add(minor.c.mul(rad2.x[i])) +if (g != nil) g.line(tobj.x[0], tobj.x[1]) g.flush +// pt.add(minor.c.mul(rad2.x[i])).add(minor.c.mul(rad.x[i])) + pts.setcol(i, pt) + } + // avoid 0 diameter ends + $o4.x[0] = ($o4.x[0]+$o4.x[1])/2 + i = $o4.size-1 + $o4.x[i] = ($o4.x[i]+$o4.x[i-1])/2 + for i=1,3 { $oi = pts.getrow(i-1) } +// print d d.printf print rad rad.printf +// print side2 side2.printf print rad2 rad2.printf +} + +proc contourstack2centroid() {local i, j, area, d localobj c + area = $o5.stk_triang_area() + printf("stk_triang_area = %g\n", area) + for i=1,4 { $oi.resize(0) } + c = $o5.approximate_contour_by_circle(&d) + $o4.append(d) for i=1,3 { $oi.append(c.x[i-1]) } + for j=0, $o5.contour_list.count-1 { + c = $o5.contour_list.object(j).approximate_contour_by_circle(&d) + $o4.append(d) for i=1,3 { $oi.append(c.x[i-1]) } + } +} + +proc name() { + type2name($o1.type, $s2) + if ($o1.nameindex > 0) { + sprint($s2, "%s[%d]", $s2, $o1.nameindex) + } +} + +proc type2name() { + if ($1 == 1) { + $s2 = "soma" + }else if ($1 == 2) { + $s2 = "axon" + }else if ($1 == 3) { + $s2 = "dend" + }else if ($1 == 4) { + $s2 = "apic" + }else if ($1 < 0) { + sprint($s2, "minus_%d", -$1) + }else{ + sprint($s2, "dend_%d", $1) + } +} +endtemplate Import3d_GUI diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/import3d_sec.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/import3d_sec.hoc new file mode 100644 index 0000000..01b0b2d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/import3d_sec.hoc @@ -0,0 +1,392 @@ +begintemplate Import3d_Section +// primarily for display. Allows gui without instantiating sections +// fid refers to the raw index of the point that id refers to. +// For a root section fid is normally 0. For sections that have +// parents, fid is normally 1 since the first point is often a copy of +// the last point of the parent. +// The variable first=0 means that when diam is shown, there +// should be a glyph drawn defined by raw indices 0 and 1. +// if this is a contour it may also contain a list of contours that +// define a 3-d object +public raw, xyz, d, id, append, g, mkglyph, rotate, type, centroid_color +public iscontour_, pid, parentsec, parentx, volatile, nameindex, first, fid +public contour_list, pl_centroid, pl_diam +public stk_triang_vec, stk_triang_area, is_subsidiary +public volatile2, contourcenter, ztrans, approximate_contour_by_circle +public pl_point, insrt, set_pt, stk_center, accurate_triangle_area +objref raw, xyz, d, g, parentsec, contour_list, this, stk_triang_vec +proc init() { + is_subsidiary = 0 + ztrans = 0 + first = 0 + fid = 0 + nameindex=0 + parentx = 1 + volatile = 0 + volatile2 = 0 + pid = -1 + iscontour_ = 0 + type = 0 + centroid_color = 2 + id = $1 + raw = new Matrix(3, $2) + xyz = new Matrix(3, $2) + d = new Vector($2) +} +proc set_pt() { + raw.x[0][$1] = $2 + raw.x[1][$1] = $3 + raw.x[2][$1] = $4 + d.x[$1] = $5 +} + +proc append() {local i, j + for i=0, $3-1 { + j = $1 + i + k = $2 + i + set_pt(j, $o4.x[k], $o5.x[k], $o6.x[k], $o7.x[k]) + } +} + +proc insrt() {local i, nr, nc + nr = raw.nrow nc = raw.ncol + d.resize(nc+1) + raw.resize(nr, nc+1) + xyz.resize(nr, nc+1) + for (i=nc-1; i >= $1; i -= 1) { + raw.setcol(i+1, raw.getcol(i)) + d.x[i+1] = d.x[i] + } + set_pt($1, $2, $3, $4, $5) +} + +proc pl_centroid() {local i, n + xyz.getrow(1).line($o1, xyz.getrow(0), centroid_color, 1) + if (iscontour_) { + n = xyz.ncol - 1 + $o1.beginline(centroid_color, 1) + $o1.line(xyz.x[0][0], xyz.x[1][0]) + $o1.line(xyz.x[0][n], xyz.x[1][n]) + } + if (0) { + if (object_id(contour_list)) { + for i=0, contour_list.count-1 { + contour_list.object(i).pl_centroid($o1) + } + } + } +} + +proc pl_diam() {local i + if (!iscontour_) { + mkglyph() + $o1.glyph(g, 0, 0) + }else{ + if (object_id(contour_list)) { + if (!object_id(contour_list.object(0).stk_triang_vec)) { + mk_stk_triang_vec(this, contour_list.object(0)) + for i=1, contour_list.count-1 { + mk_stk_triang_vec(contour_list.object(i-1), contour_list.object(i)) + } + } + pl_stk_triang($o1, this, contour_list.object(0)) + for i=1, contour_list.count-1 { + pl_stk_triang($o1, contour_list.object(i-1), contour_list.object(i)) + } + } + } +} + +proc pl_point() {local i + for i=first, xyz.ncol-1 { + $o1.mark(xyz.x[0][i], xyz.x[1][i], "s", 5, 3, 1) + } + if (object_id(parentsec) == 0) { + $o1.mark(xyz.x[0][0], xyz.x[1][0], "S", 8, 3, 1) + } + if (0) { + if (object_id(contour_list)) { + for i=0, contour_list.count-1 { + contour_list.object(i).pl_point($o1) + } + } + } +} + +proc mkglyph() {local i, d1, d2 localobj x, y, norm, x1, y1, i1 + g = new Glyph() + if (xyz.ncol - first < 1) { return } + // normal + x1 = xyz.getrow(0) + y1 = xyz.getrow(1) + if (xyz.ncol - first == 1) { + // render as spherical + g.circle(x1.x[0], y1.x[0], d.x[0]/2) + g.fill(1) + return + } + // may or may not want to include parent point in glyph + x = x1.c(first).deriv(1,1) + y = y1.c(first).deriv(1,1) + // point separations + norm = x.c.mul(x).add(y.c.mul(y)).sqrt.mul(2) // d is diam, need radius + // only want frustra for the non-zero separations + i1=norm.c.indvwhere("!=", 0) + if (i1.size == 0) { +// printf("Section with id=%d has 0 length in this projection\n", id) + return + } + norm.index(norm, i1) + x.index(x, i1).div(norm) + y.index(y, i1).div(norm) + + // but take care of the possible index offset due to missing parent point + if (first) { i1.add(first) } + i1.append(x1.size-1) + x1.index(x1, i1) + y1.index(y1, i1) + + for i = 0, x.size-1 { + d1 = d.x[i1.x[i]] d2=d.x[i1.x[i]+1] + g.path() + g.m(x1.x[i]+y.x[i]*d1, y1.x[i]-x.x[i]*d1) + g.l(x1.x[i+1]+y.x[i]*d2, y1.x[i+1]-x.x[i]*d2) + g.l(x1.x[i+1]-y.x[i]*d2, y1.x[i+1]+x.x[i]*d2) + g.l(x1.x[i]-y.x[i]*d1, y1.x[i]+x.x[i]*d1) + g.close() + g.fill(1) + } +} + +proc rotate() { + $o1.mulm(raw, xyz) + if (1) { + if (object_id(contour_list)) { + for i=0, contour_list.count-1 { + contour_list.object(i).rotate($o1) + } + } + } +} + + +// a utility function +obfunc contourcenter() {local i localobj mean, pts, perim, d + // convert contour defined by $o1, $o2, $o3 vectors to + // 100 uniform points around perimeter + // and return the center coordinates as well as the uniform contour + // vectors (in $o1, $o2, $o3) + pts = new Matrix(3, $o1.size) + for i=1,2 { pts.setrow(i-1, $oi) } + for i=0,2 {pts.setrow(i, pts.getrow(i).append(pts.x[i][0]).deriv(1,1)) } + perim = new Vector(pts.ncol) + for i=1, pts.ncol-1 { perim.x[i] = perim.x[i-1] + pts.getcol(i-1).mag } + d = new Vector(101) + d.indgen(perim.x(perim.size-1)/100) + for i=1,3 $oi.interpolate(d, perim) + mean = new Vector(3) + for i=1, 3 { mean.x[i-1] = $oi.mean } + return mean +} + +// return center (Vector.size=3) and average diameter in $&1 +obfunc approximate_contour_by_circle() {local i,n, perim localobj center, x, y, z + x=raw.getrow(0) + y=raw.getrow(1) + z=raw.getrow(2) + perim = 0 + n = x.size + for i = 0, n-1 { + perim += edgelen(raw.getcol(i), raw.getcol((i+1)%n)) + } + center = contourcenter(x, y, z) + if (0) { + $&1 = perim/PI + }else{ + x.sub(center.x[0]).mul(x) + y.sub(center.x[1]).mul(y) + z.sub(center.x[2]).mul(z) +// $&1 = 2*x.add(y).add(z).sqrt.mean + // average of radius based on perim and mean radius of all points + $&1 = x.add(y).add(z).sqrt.mean + perim/(2*PI) + } +// printf("%g %g %g %g\n", center.x[0], center.x[1], center.x[2], $&1) +// printf("perimeter approx = %g actual = %g\n", PI*$&1, perim) + return center +} + +proc mk_stk_triang_vec() {local i, j, n1, n2, d1, d2 localobj i1, i2, trv + trv = new Vector() + $o2.stk_triang_vec = trv + // contour indices are chosen so points 0 cross 1 of a contour from center + // are in +z direction and points 0 between the two contours are + // guaranteed to be an edge. An extra index added to end to close the polygon + // I suppose this could fail if angle does not increase monotonically + stk_contour_indices($o1, i1, $o1.raw.getcol(0)) + stk_contour_indices($o2, i2, $o1.raw.getcol(0)) + i = 0 j = 0 + n1 = i1.size-1 + n2 = i2.size-1 + while(i < n1 || j < n2) { + trv.append(i1.x[i], i2.x[j]) + if (i < n1 && j < n2) { + // which next one is shorter + d1 = ($o1.raw.x[0][i1.x[i]] - $o2.raw.x[0][i2.x[j+1]])^2 + ($o1.raw.x[1][i1.x[i]] - $o2.raw.x[1][i2.x[j+1]])^2 + d2 = ($o1.raw.x[0][i1.x[i+1]] - $o2.raw.x[0][i2.x[j]])^2 + ($o1.raw.x[1][i1.x[i+1]] - $o2.raw.x[1][i2.x[j]])^2 + if (d2 < d1) { + i += 1 + }else{ + j += 1 + } + }else{ + if (i < n1) { + i += 1 + }else{ + j += 1 + } + } + } + trv.append(i1.x[i], i2.x[j]) +} + +proc stk_contour_indices() {local i, d, dmin, imin localobj c, x, y, z + $o2 = new Vector($o1.raw.ncol) + $o2.indgen() + // order the points counterclockwise. ie 0 cross 1 in -z direction + x = $o1.raw.getrow(0) + y = $o1.raw.getrow(1) + z = $o1.raw.getrow(2) + c = contourcenter(x, y, z) + x = $o1.raw.getcol(0).sub(c) + y = $o1.raw.getcol(1).sub(c) + if (x.x[0]*y.x[1] - x.x[1]*y.x[0] > 0) { + $o2.reverse() + } + + // which point is closest to $o3 + imin = -1 + dmin = 1e9 + for i=0, $o2.size - 1 { + d = edgelen($o1.raw.getcol($o2.x[i]), $o3) + if (d < dmin) { + dmin = d + imin = i + } + } + $o2.rotate(-imin) + + $o2.append($o2.x[0]) +} + +proc pl_stk_triang() {local i, j localobj g, m1, m2, trv + g = $o1 + m1 = $o2.xyz + m2 = $o3.xyz + trv = $o3.stk_triang_vec + for i=0, trv.size-1 { + g.beginline(centroid_color, 1) + j = trv.x[i] + g.line(m1.x[0][j], m1.x[1][j]) + i += 1 + j = trv.x[i] + g.line(m2.x[0][j], m2.x[1][j]) + } +} + +func edgelen() { + return sqrt($o1.c.sub($o2).sumsq) +} + +func stk_triang_area1() {local area, i, i1, i2, j1, j2, a, b, c, na localobj m1, m2, trv + area = 0 + m1 = $o1.raw + m2 = $o2.raw + trv = $o2.stk_triang_vec + i1 = trv.x[0] + i2 = trv.x[1] + a = edgelen(m1.getcol(i1), m2.getcol(i2)) + na = 0 + for i=2, trv.size-1 { + j1 = trv.x[i] + i += 1 + j2 = trv.x[i] + b = edgelen(m1.getcol(j1), m2.getcol(j2)) + + // which contour for side c + if (i1 == j1) { + c = edgelen(m2.getcol(i2), m2.getcol(j2)) + }else{ + c = edgelen(m1.getcol(i1), m1.getcol(j1)) + } + + area += accurate_triangle_area(a, b, c) + na += 1 + i1 = j1 + i2 = j2 + a = b + } +//printf("stk_triang_area1 na=%d npoints=%d\n", na, m1.ncol+m2.ncol) + // missing one triangle + return area +} + +func stk_triang_area() {local area, i + area = stk_triang_area1(this, contour_list.object(0)) + for i=1, contour_list.count-1 { + area += stk_triang_area1(contour_list.object(i-1), contour_list.object(i)) + } + return area +} + +// the center of the centroid of the contour stack +obfunc stk_center() {local i, len, th localobj c, centroid, x, y, z, r, lenvec + centroid = new Matrix(3, 1 + contour_list.count) + lenvec = new Vector(centroid.ncol) lenvec.resize(1) + x = raw.getrow(0) + y = raw.getrow(1) + z = raw.getrow(2) + c = contourcenter(x, y, z) + centroid.setcol(0, c) + len = 0 + for i=0, contour_list.count-1 { + r = contour_list.object(i).raw + x = r.getrow(0) + y = r.getrow(1) + z = r.getrow(2) + c = contourcenter(x, y, z) + centroid.setcol(i+1, c) + + len += sqrt(c.sub(centroid.getcol(i)).sumsq) + lenvec.append(len) + } + len = len/2 + if (len == 0) { + c = centroid.getcol(0) + return c + } + i = lenvec.indwhere(">", len) + th = (len - lenvec.x[i-1])/(lenvec.x[i] - lenvec.x[i-1]) + for j=0, 2 { + c.x[j] = th*centroid.x[j][i] + (1 - th)*centroid.x[j][i-1] + } + return c +} + +func accurate_triangle_area() {local x localobj a + // from http://http.cs.berkeley.edu/~wkahan/Triangle.pdf + // W. Kahan + x = float_epsilon + float_epsilon = 0 + a = new Vector(3) a.resize(0) + a.append($1, $2, $3).sort + if ((a.x[0] - (a.x[2] - a.x[1])) < 0) { + float_epsilon = x + execerror("accurate_triangle_area:","not a triangle") + } + float_epsilon = x + x = .25*sqrt((a.x[2]+(a.x[1]+a.x[0])) * (a.x[0]-(a.x[2]-a.x[1])) \ + * (a.x[0]+(a.x[2]-a.x[1])) * (a.x[2]+(a.x[1]-a.x[0]))) + return x +} + +endtemplate Import3d_Section diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_morphml.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_morphml.hoc new file mode 100644 index 0000000..c6801b4 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_morphml.hoc @@ -0,0 +1,78 @@ + +begintemplate Import3d_MorphML +public input, filetype, type, sections, err, parsed +public pt2id, id2pt, pt2sec, sec2pt, label, id2line +objref type, sections, this, p, nil +objref cables, points, cableid2index +strdef filetype, tstr +proc init() { + nrnpython("from neuron.neuroml.rdxml import rdxml") + //print "Import3d_MorphML" + filetype = "MorphML" + p = new PythonObject() +} +proc input() { + //print "Import3d_MorphML.input" + type = new Vector() + sections = new List(1000) + err = 0 + p.rdxml($s1, this) +} +proc parsed() {local i, j, ip, jp localobj cab, sec, pt + cables = $o1.cables_ + points = $o1.points_ + cableid2index = $o1.cableid2index_ + // ptid2pt = $o1.ptid2pt_ + //print $o1, cables.__len__() + for i=0, cables.__len__() - 1 { + cab = cables._[i] + sec = new Import3d_Section(cab.first_, cab.pcnt_) + sections.append(sec) + if (cab.parent_cable_id_ >= 0) { + ip = $o1.cableid2index_[cab.parent_cable_id_] + sec.parentsec = sections.object(ip) + sec.parentx = cab.px_ + } + //print i, cab.id_, cab.name_ + for j=0, cab.pcnt_ - 1 { + jp = cab.first_ + j + pt = points._[jp] + sec.set_pt(j, pt.x_, pt.y_, pt.z_, pt.d_) + } + } +} +func pt2id() { + //print "pt2id ", $1 + if ($1 < 0) { return 0 } + if ($1 >= points.__len__()) { return points.__len__() - 1 } + return $1 +} +func id2pt() { + //print "id2pt ", $1 + return $1 +} +func pt2sec() {local cid, cindex + //print "pt2sec ", $1, " cid=", points._[$1].cid_ + cid = points._[$1].cid_ + cindex = cableid2index._[cid] + //print " cindex=", cindex, " first=", cables._[cindex].first_ + $o2 = sections.object(cindex) + //printf("pt2sec %s\n", $o2) + return $1 - cables._[cindex].first_ +} +func sec2pt() {local i localobj sec + sec = sections.object($1) + //print "sec2pnt ", $1, $2, " secid=", sec.id, " cabid=", cables._[$1].id_ + i = sec.id + $2 - sec.fid + return i +} +func id2line() { + //print "id2line ", $1 + return $1 +} +proc label() {localobj pt + pt = points._[$1] + sprint($s2, "pt[%d] Line %d x=%g y=%g z=%g d=%g", $1, pt.lineno_, pt.x_, pt.y_, pt.z_, pt.d_) +} +endtemplate Import3d_MorphML + diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_nlcda.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_nlcda.hoc new file mode 100644 index 0000000..9a8e450 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_nlcda.hoc @@ -0,0 +1,550 @@ +// Assume that except for soma, the move and line items form a tree +// where, generally, a move is at the same point of the line to which +// it is connected. Under this assumption, all major codes except 1 and 2 +// can be ignored. +// An exception is the [10,5] code for branch point. The next point +// is generally a line (not a move) with the same x,y,z of the branch point. + +begintemplate Import3d_Neurolucida_read +public input, pheader +public type, x, y, z, d, iline, header, point2sec, sections, lines +public label, id2pt, id2line, pt2id, pt2sec, sec2pt, file, filetype, err +public points, pointtype, branchpoints, firstpoints +public helptxt, iline2pt, mark, fillproblist +external hoc_sf_ +objref major, minor, x, y, z, d, iline, header, lines, iline2sec +objref type, pointtype, points, iline2pt +objref file, vectors, sec2point, point2sec, sections +objref firstpoints, branchpoints +objref cursec, diam, nil, gm +objref line_branch_err, parse_err, xyparent_err, xynotnearest_err, noparent_err +objref line_coincide_err, line_branch_err_pt, somabbox_err +strdef tstr, line, filetype +double a[7] + +proc init() { + filetype = "Neurolucida" + vectors = new List() + header = new List() + lines = new List() + gm = new GUIMath() +} + +proc input() { + err = 0 + line_branch_err = new List() + parse_err = new List() + xyparent_err = new List() + xynotnearest_err = new List() + noparent_err = new List() + line_coincide_err = new List() + somabbox_err = new List() + line_branch_err_pt = new Vector() + + rdfile($s1) + find_parents() + repair_diam() + connect2soma() + if (err) { errout() } +} + +proc repair_diam() {local i localobj sec + // I am told, and it seems the case, that + // the first point incorrectly always has the diameter of + // the last point of the previous branch. For this reason + // we set the diameter of the first point to the diameter + // of the second point in the section + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.parentsec != nil) { + if (sec.first < sec.d.size-1){ + sec.d.x[sec.first] = sec.d.x[sec.first + 1] + } + } + } +} + +proc rdfile() {local i, j + file = new File($s1) + // count lines for vector allocation space (not really necessary) + if (!file.ropen()) { + err = 1 + printf("could not open %s\n", $s1) + } + for (i = 0; !file.eof(); i += 1) { + file.gets(line) + } + file.close() +// printf("%s has %d lines\n", $s1, i) + alloc(i, major, minor, x, y, z, d, iline, pointtype, points) + diam = d + file.ropen() + for (i = 1; !file.eof(); i += 1) { + file.gets(line) + parse(i, line) + } + file.close() + iline2pt = new Vector(iline.x[iline.size-1]) + j = 0 + for i=0, points.size-2 { + while(j <= iline.x[points.x[i]]) { + iline2pt.x[j] = i + j += 1 + } + } + for j=j, iline2pt.size-1 { + iline2pt.x[j] = points.size-1 + } +} + +proc alloc() { local i // $oi.size = 0 but enough space for $1 elements + for i = 2, numarg() { + $oi = new Vector($1) + $oi.resize(0) + vectors.append($oi) + } +} + +func dist() {local x1, y1, z1 + x1 = ($1 - x.x[$4]) + y1 = ($2 - y.x[$4]) + z1 = ($3 - z.x[$4]) + return sqrt(x1*x1 + y1*y1 + z1*z1) +} + +func xydist() {local x1, y1 + x1 = (x.x[$1] - x.x[$2]) + y1 = (y.x[$1] - y.x[$2]) + return sqrt(x1*x1 + y1*y1) +} + +func xysame() { + if ($1 == x.x[$3]) { + if ($2 == y.x[$3]) { + return 1 + } + } + return 0 +} + +proc parse() {local i, n, m + n = sscanf($s2, "[%d,%d] (%f,%f,%f) %f", &a[0], &a[1], &a[2],\ + &a[3], &a[4], &a[5]) + hoc_sf_.left($s2, hoc_sf_.len($s2)-1) + if (n == 6) { + a[5] *= 2 + iline_ = major.size + if (a[0] == 1) { // line + m = major.x[iline_ - 1] + if (m == 10 && minor.x[iline_-1] == 5) { + pointtype.append(0) + points.append(iline_) + if (!xysame(a[2], a[3], iline_-1)) { + err = 1 + line_branch_err_pt.append(points.size-1) +sprint(tstr, "%d: %s separated by %g from branch",\ +$1, $s2, dist(a[2], a[3], a[4], iline_-1)) +line_branch_err.append(new String(tstr)) + } + }else if (m == 1 || m == 2) { + pointtype.append(1) + points.append(iline_) + }else{ + pointtype.append(1) + points.append(iline_) + } + }else if (a[0] == 2) { // move + pointtype.append(0) + points.append(iline_) + }else if (a[0] == 10 && a[1] == 5) { // branch + pointtype.append(2) + points.append(iline_) + }else{ + } + for i=0, 5 { + vectors.object(i).append(a[i]) + } + iline.append($1) // for error messages + lines.append(new String($s2)) + } else if (n == 0) { // comment + header.append(new String($s2)) + } else { + err = 1 + sprint(tstr, "%d: %s parse failure after item %d", $1, $s2, n) + parse_err.append(new String(tstr)) + } +} + +proc mark() {local i, a,b,c,d,e,f + print $o1, $2, iline, lines + i = iline.indwhere("==",$2) + printf("%d,%d: %s\n", i, iline.x[i], lines.object(i).s) + n = sscanf(lines.object(i).s, "[%d,%d] (%f,%f,%f) %f", &a,&b,&c,\ + &d,&e,&f) + if (n == 6) { + print a,b,c,d,e,f + $o1.mark(c,d,"S",12,4,1) + } +} + +proc pheader() {local i + for i=0, header.count-1 { + printf("%s", header.object(i).s) + } +} + +proc find_parents() {local i, j, m, ip, jp, jpmin, d, dmin, xi,yi,zi, bp, ip1 + // we need to associate all pointtype=0 with a branch point (except the + // ones conceptually connected to the soma + // assume the pid is earlier than the pointtype=0 + point2sec = points.c.fill(-1) + branchpoints = pointtype.c.indvwhere("==", 2) + firstpoints = pointtype.c.indvwhere("==", 0) + sections = new List() + type = firstpoints.c.fill(0) + for i=0, firstpoints.size-1 { + ip = points.x[firstpoints.x[i]] + newsec(i) + type.x[i] = cursec.type + xi = x.x[ip] yi = y.x[ip] zi = z.x[ip] + dmin = 1e9 + jpmin = -1 + m = minor.x[ip] + if (m == 41) { // soma start (contour + continue +/* some files use these as branch beginnings so check this after seeing if +there are coincident points. + }else if (m == 1) { // dendrite start + continue + }else if (m == 21) { // axon start + continue + }else if (m == 61) { // apical dendrite start + continue +*/ + } + if (line_branch_err_pt.size) { + j = line_branch_err_pt.x[0] + if (ip == points.x[j]) { + physcon(i, ip, ip-1, j-1) + line_branch_err_pt.remove(0) + continue + } + } + for j=0, branchpoints.size-1 { + jp = points.x[branchpoints.x[j]] + if (ip <= jp) { break } + d = dist(xi, yi, zi, jp) + if (d < dmin) { + bp = branchpoints.x[j] + dmin = d + jpmin = jp + } + } + if (dmin <= 0) { + cursec.parentsec = sections.object(point2sec.x[bp]) + }else if (m == 1) { // dendrite start + continue + }else if (m == 21) { // axon start + continue + }else if (m == 61) { // apical dendrite start + continue + }else{ + err = 1 +sprint(tstr, "%d: %s branch at line %d is %.4g away",\ +iline.x[ip], lines.object(ip).s, iline.x[jpmin], dmin) + d = xydist(ip, jpmin) + if (d <= 0) { // overlay branch point in xy plane? + xyparent_err.append(new String(tstr)) + physcon(i, ip, jpmin, bp) + }else if (ip > 0) { + // sometime it coincides with a previous LineTo + ip1 = firstpoints.x[i]-1 + d = dist(xi, yi, zi, points.x[ip1]) + if (d <= 0) { +sprint(tstr, "%s\n but coincides with line %d", tstr, iline.x[points.x[ip1]]) + line_coincide_err.append(new String(tstr)) + cursec.parentsec = sections.object(point2sec.x[ip1]) + }else if (try_xy_coincide(i, ip)){ + xynotnearest_err.append(new String(tstr)) + }else{ + noparent_err.append(new String(tstr)) + } + } + } + } +} + +func try_xy_coincide() {local j, jp, d + // sometimes it coincides in the xy plane with a branch point + // even though it is not the nearest point and therefore we + // assume that is the parent point + for j=0, branchpoints.size-1 { + jp = points.x[branchpoints.x[j]] + if ($2 <= jp) { break } + d = xydist($2, jp) + if (d <= 0) { +sprint(tstr, "%s\n but coincides with branch point at line %d", tstr, iline.x[jp]) + bp = branchpoints.x[j] + physcon($1, $2, jp, bp) + return 1 + } + } + return 0 +} + +proc physcon() { + cursec.parentsec = sections.object(point2sec.x[$4]) + cursec.insrt(0, x.x[$3], y.x[$3], z.x[$3], d.x[$2]) + cursec.id -= 1 +} + +proc newsec() {local i, ip, n, m, first, isec + first = firstpoints.x[$1] + ip = points.x[first] + if ($1 < firstpoints.size-1) { + n = firstpoints.x[$1+1] - first + }else{ + n = points.size - first + } + cursec = new Import3d_Section(first, n) + isec = sections.count + sections.append(cursec) + for i = 0, n-1 { + cursec.append(i, points.x[i+first], 1, x, y, z, d) + point2sec.x[i+first] = isec + } + m = minor.x[ip] + if (m == 1 || m == 2) { // dendrite + cursec.type = 3 + }else if (m == 21 || m == 22) { //axon + cursec.type = 2 + }else if (m == 41 || m == 42) { // soma + cursec.type = 1 + cursec.iscontour_ = 1 + }else if (m == 61 || m == 62) { // apdendrite + cursec.type = 4 + }else{ + err = 1 +printf("%s line %d: don't know section type: %s\n",\ + file.getname, iline.x[ip], lines.object(ip).s) + } +} + +proc connect2soma() {local i, ip, j, jp, bp, jpmin, dmin, d, xmin, xmax, ymin, ymax localobj soma, sec, xc, yc, zc, c, psec, r + // find centroid of soma if outline and connect all dangling + // dendrites to that if inside the contour + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.type == 1 && sec.iscontour_ == 1) { + soma = sec + sections.remove(i) + sections.insrt(0, soma) + break + } + } + if (soma == nil) { return } + xc = soma.raw.getrow(0) + yc = soma.raw.getrow(1) + zc = soma.raw.getrow(2) + xmin = xc.min-.5 xmax = xc.max + .5 + ymin = yc.min-.5 ymax = yc.max + .5 + c = soma.contourcenter(xc, yc, zc) + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.parentsec == nil && sec != soma) { + if (gm.inside(sec.raw.x[0][0], sec.raw.x[1][0], xmin, ymin, xmax, ymax)) { + sec.parentsec = soma + sec.parentx = .5 + sec.insrt(0, c.x[0], c.x[1], c.x[2], .01) + sec.id -= 1 + sec.first = 1 + }else{ + // is same as end point of earlier section? + ip = points.x[sec2pt(i, 0)] + d = 1e9 + for j=0, i-1 { + psec = sections.object(j) + jp = psec.d.size-1 + r = psec.raw + d = dist(r.x[0][jp], r.x[1][jp], r.x[2][jp], ip) + if (d == 0) { + sec.parentsec = psec + break + } + } + if (d == 0) { continue } + ip = points.x[sec2pt(i, 0)] + dmin = dist(c.x[0], c.x[1], c.x[2], ip) + jpmin = -1 + for j=0, branchpoints.size-1 { + jp = points.x[branchpoints.x[j]] + if (ip <= jp) { break } + d = dist(x.x[ip], y.x[ip], z.x[ip], jp) + if (d < dmin) { + bp = branchpoints.x[j] + dmin = d + jpmin = jp + } + } + err = 1 +sprint(tstr, "%d: %s is outside soma, logically connect to", iline.x[ip], lines.object(ip).s) + if (jpmin == -1) { + sprint(tstr, "%s soma", tstr) + sec.parentsec = soma + sec.insrt(0, c.x[0], c.x[1], c.x[2], .01) + sec.id -= 1 + }else{ + jp = jpmin + sprint(tstr, "%s %d", tstr, iline.x[jp]) + sec.parentsec = sections.object(point2sec.x[bp]) + sec.insrt(0, x.x[jp], y.x[jp], z.x[jp], .01) + sec.id -= 1 + } + sec.first = 1 + somabbox_err.append(new String(tstr)) + } + } + } +} + +// note selpoint defined in swc_gui.hoc as sec.id + j +// selpoint is the points index +// ie. the first points of the sections are firstpoints +proc label() {local i + i = points.x[$1] + sprint($s2, "Line %d: %s", iline.x[i], lines.object(i).s) +} +func id2pt() { + if ($1 < 0) { return -1 } + if ($1 >= iline2pt.size) { return iline2pt.x[iline2pt.size-1]} + return iline2pt.x[$1] +} +func id2line() { return points.x[$1] } +func pt2id() { + if ($1 < 0) {return -1} + return iline.x[points.x[$1]] +} +func pt2sec() {local i + i = firstpoints.indwhere(">", $1) + if (i == -1) { + i = firstpoints.size + } + $o2 = sections.object(i-1) + j = $1 - $o2.id + return j +} +func sec2pt() { +//print "sec2pt ", $1, $2, sections.object($1).id + return sections.object($1).id + $2 +} + +proc helptxt() { + xpanel("Neurolucida file filter characteristics") +xlabel(" The only lines utilized are [1,x], [2,x], and [5,10]. i.e , LineTo,") +xlabel("MoveTo, and Branch lines. ") +xlabel(" Sections generally consist of MoveTo followed by sequence of LineTo,") +xlabel("and possibly ending with Branch. Intervening lines of other major types") +xlabel("are ignored. ") +xlabel(" The type of the section (dendrite, axon, soma outline, or apical) is") +xlabel("determined by the minor code of the first point in the branch. ") +xlabel(" Coincidence of the first x,y,z point of a section with the last") +xlabel("(branch) point of some section defines a connection between child and") +xlabel("parent section. However most files contain errors and the following") +xlabel("heuristics are applied to the first points of problem sections when the") +xlabel("parent is not obvious. EACH PROBLEM POINT SHOULD BE EXAMINED to") +xlabel("determine if the correction is suitable. ") +xlabel(" 1) The first point after a Branch point is a MoveTo which is") +xlabel("coincident in the xy plane but not in the z axis. A physical connection") +xlabel("is made with the diam of the MoveTo. ") +xlabel(" 2) The nearest branch point is coincident in the xy plane. A physical") +xlabel("connection is made with the diam of the MoveTo.") +xlabel(" 3) There is no coincident branchpoint in the xy plane but the MoveTo") +xlabel("is 3-d coincident with the preceding LineTo point. A logical connection") +xlabel("is made to the section containing the LineTo point.") +xlabel(" 4) There is an xy plane coincident branch point but it is not the") +xlabel("nearest in a 3-d sense. A physical connection is made to the section") +xlabel("containing the xy plane coincident point. ") +xlabel(" 5) The first point of the branch is not a soma, dendrite, axon, or") +xlabel("apical start point and there is no xy plane coincident branch point. ") +xlabel("The branch remains unattached (but see heuristic 6). ") +xlabel(" 6) All unattached branches within 0.5 microns of the soma contour") +xlabel("bounding box are logically connected to the soma contour section. ") +xlabel("I am told, and it seems to be the case, that the first point in a") +xlabel("branch always has a diameter value of the last point in the previous") +xlabel("branch. For this reason we set the first point to the diameter of") +xlabel("of the second point in each section that has a parent branch.") +xlabel("If this is not the right thing to do then comment out the call to") +xlabel("repair_diam() in the input() procedure of read_nlcda.hoc") + xpanel(1) +} + +proc errout() {local i + printf("\n%s problems and default fixes\n\n", file.getname) + if (parse_err.count) { + printf(" Following lines could not be parsed\n") + for i=0, parse_err.count-1 { + printf(" %s\n", parse_err.object(i).s) + } + printf("\n") + } + if (line_branch_err.count) { +printf(" LINETO follows branch and does not coincide in the xy plane.\n") +printf(" Make a physical connection using the LINETO diameter.\n") + for i = 0, line_branch_err.count-1 { + printf(" %s\n", line_branch_err.object(i).s) + } + printf("\n") + } + if (xyparent_err.count) { + printf(" Nearest branch point is coincident in xy plane.\n Make a physical connection with diam of the MOVETO\n") + for i=0, xyparent_err.count-1 { + printf(" %s\n", xyparent_err.object(i).s) + } + printf("\n") + } + if (line_coincide_err.count) { + printf(" No coincident branchpoint in xy plane but 3-d coincident to previous LINETO.\n") + printf(" point. Make a logical connection to the section containing that LINETO\n") + for i=0, line_coincide_err.count-1 { + printf(" %s\n", line_coincide_err.object(i).s) + } + printf("\n") + } + if (xynotnearest_err.count) { + printf(" The xy plane coincident branch point is not the nearest in the 3-d sense.\n") + printf(" However we connect physically to the indicated xy coincident branch point\n") + for i=0, xynotnearest_err.count-1 { + printf(" %s\n", xynotnearest_err.object(i).s) + } + printf("\n") + } + if (noparent_err.count) { + printf(" Cannot figure out which is the parent\n") + printf(" No coincident (even in xy plane) branch point.\n") + for i=0, noparent_err.count-1 { + printf(" %s\n", noparent_err.object(i).s) + } + printf("\n") + } + if (somabbox_err.count) { + printf(" Unconnected branch is more than .5 microns outside the soma bounding box.\n") + printf(" Connect logically to nearest branch point\n") + for i=0, somabbox_err.count-1 { + printf(" %s\n", somabbox_err.object(i).s) + } + printf("\n") + } +} + +proc fillproblist() { + fillproblist1($o1, parse_err, line_branch_err, xyparent_err, line_coincide_err, xynotnearest_err, noparent_err, somabbox_err) +} +proc fillproblist1() { local i, j + for i=2, numarg() { + for j=0, $oi.count-1 { + $o1.append($oi.object(j)) + } + } +} + +endtemplate Import3d_Neurolucida_read diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_nlcda3.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_nlcda3.hoc new file mode 100644 index 0000000..0402dbb --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_nlcda3.hoc @@ -0,0 +1,1194 @@ +// Read neurolucida +// ; V3 text file written for MicroBrightField products. +// file. +// The format is given by a context free grammar that would be easy +// to handle with lex/yacc but we can do reasonably well using recursive descent +// that more or less matches each production rules for the grammar. +// Presently we only handle contours and trees but with spines ignored. + +begintemplate Branch2SomaInfo +// info to carry out decision about which to connect to for +// possible root branch mistakes +// may have to split the parent +public sec, sindex, pbranch, ipoint, d2p, d2s, connected2p +objref sec, pbranch +proc init() { + sec = $o1 + pbranch = $o2 + sindex = $3 + d2p = $4 + d2s = $5 + ipoint = $6 + connected2p = 0 +} +endtemplate Branch2SomaInfo + +begintemplate Import3d_LexToken +public token, x, s, itok, iline, clone +strdef s +token = 0 +x = 0 +itok = 0 +iline = 0 +obfunc clone() { localobj r + r = new Import3d_LexToken() + r.s = s + r.token = token + r.x = x + r.itok = itok + r.iline = iline + return r +} +endtemplate Import3d_LexToken + +begintemplate Import3d_Neurolucida3 +public type +public filetype, input, file, sections +public label, id2pt, id2line, pt2id, pt2sec, sec2pt, helptxt, mark, err, b2spanel +public x, y, z, d, iline, lines, quiet +external hoc_sf_ +objref type, firstpoints, gm, plist +objref current, look_ahead, look_ahead2 +objref file, tokens, sections, cursec, parentsec, nil +objref x, y, z, d, iline, lines +objref somas, centers, b2serr, b2sinfo +strdef line, tstr, tstr2, filetype, fline + +proc init() { + quiet = 0 + debug_on = 0 + gm = new GUIMath() + filetype = "Neurolucida V3" + current = new Import3d_LexToken() + look_ahead = new Import3d_LexToken() + look_ahead2 = new Import3d_LexToken() + eof=0 + number=1 leftpar=2 rightpar=3 comma=4 bar=5 + set=6 rgb=7 string=8 label_=9 err_=10 + leftsp=11 rightsp=12 + tokens = new List() + tokensappend("eof", "number", "leftpar", "rightpar", "comma", "bar") + tokensappend("set", "rgb", "string", "label", "err") + tokensappend("leftsp", "rightsp") + plist = new List() +} +proc tokensappend() {local i + for i=1, numarg() { + tokens.append(new String($si)) + } +} + +proc input() { + b2serr = new List() + b2sinfo = new List() + nspine = 0 + err = 0 + type = new Vector() + sections = new List(1000) + alloc(25000, x, y, z, d, iline) + lines = new List(25000) + itoken = 0 + depth = 0 + rdfile($s1) + firstpoints = new Vector(sections.count) + set_firstpoints() + connect2soma() + if (err) { errout() } +} + +proc set_firstpoints() {local i + firstpoints.resize(sections.count) + for i=0, sections.count-1 { + firstpoints.x[i] = sections.object(i).id + } +} + +proc alloc() {local i + for i=2, numarg() { + $oi = new Vector($1) + $oi.resize(0) + } +} +proc connect2soma() {local i, j, d, dmin localobj sec, roots, xx + // first make sure all somas are at the beginning + centers = new List() + j = 0 // next soma index + somas = new List() + roots = new List() + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.iscontour_) { + if (i > j) { + sections.remove(i) + sections.insrt(j, sec) + } + somas.append(sec) + j += 1 + } + } + // mark the soma contours that are part of a + // contour stack and link them into a list + // that is in the main contour section. + // we do not remove them from the sections since + // we want to be able to select their points + soma_contour_stack() + for i=0, sections.count-1 { + sec = sections.object(i) + if (!sec.iscontour_) if (sec.parentsec == nil) { + roots.append(sec) + } + } + if (somas.count == 0) { return } + // note that j is the number of soma's + for i = 0, somas.count-1 { + connect2soma_2(somas.object(i), roots) + } + for i=0, roots.count-1 { + sec = roots.object(i) + xx = sec.raw.getcol(0) + dmin = 1e9 + for j=0, centers.count-1 { + d = xx.c.sub(centers.object(j)).mag + if (d < dmin) { + imin = j + dmin = d + } + } + err = 1 + xx = centers.object(imin) + sprint(tstr, "\nMain branch starting at line %d is outside the soma bounding boxes", pt2id(sec.id)) + b2serr.append(new String(tstr)) + sprint(tstr, " Making a logical connection to center of nearest soma") + b2serr.append(new String(tstr)) + sec.parentsec = somas.object(imin) + sec.parentx = .5 + sec.insrt(0, xx.x[0], xx.x[1], xx.x[2], .01) + sec.first = 1 + sec.fid = 1 + opt_connect(sec, imin, dmin) + } +} + +proc soma_contour_stack() {local i, j localobj bb1, bb2, first, next + // if soma contour bounding boxes overlap, treat as single soma + if (somas.count == 0) return + first = somas.object(0) + bb1 = bounding_box(first) + j = 0 + for i = 1, somas.count-1 { + j += 1 + next = somas.object(j) + bb2 = bounding_box(next) + if (xy_intersect(bb1, bb2)) { + if (!object_id(first.contour_list)) { + first.contour_list = new List() + } + first.contour_list.append(next) + next.is_subsidiary = 1 + somas.remove(j) + j -= 1 + }else{ + first = next + } + bb1 = bb2 + } + for i=0, somas.count-1 { + somastack_makes_sense(somas.object(i)) + somastack_process(somas.object(i)) + } +} + +obfunc bounding_box() {localobj bb + bb = new Vector(6) + bb.x[0] = $o1.raw.getrow(0).min + bb.x[1] = $o1.raw.getrow(1).min + bb.x[2] = $o1.raw.getrow(2).min + bb.x[3] = $o1.raw.getrow(0).max + bb.x[4] = $o1.raw.getrow(1).max + bb.x[5] = $o1.raw.getrow(2).max + return bb +} + +func xy_intersect() {local i + for i = 0, 1 { +if ($o1.x[i] > $o2.x[3+i] || $o2.x[i] > $o1.x[3+i]) { return 0 } + } + return 1 +} + +proc somastack_makes_sense() {local i, j, z, z2, dz, dz2 localobj sec + if (!object_id($o1.contour_list)) { return } + // the soma stack must be monotonic in the z axis and all points + // on a contour must have same z value. + z = $o1.raw.x[2][0] + for i = 1, $o1.raw.ncol-1 if (z != $o1.raw.x[2][i]) { + sprint(tstr, "Soma stack contour %s does not have constant z value.", $o1) + b2serr.append(new String(tstr)) + b2serr.append(new String(" Soma area calculation may be serious in error.")) + return + } + dz = 0 + for j=0, $o1.contour_list.count-1 { + sec = $o1.contour_list.object(j) + z2 = sec.raw.x[2][0] + dz2 = z2 - z + if (dz2 == 0) { + sprint(tstr, "Adjacent contour %d of soma stack %s has same z coordinate and previous.", j, $o1) + b2serr.append(new String(tstr)) + return + }else if (dz2 > 0) { + dz2 = 1 + }else{ + dz2 = -1 + } + if (dz == 0) { + dz = dz2 + }else if (dz != dz2) { + sprint(tstr, "Contour %d of the Soma stack %s is not monotonic in z.", j, $o1) + b2serr.append(new String(tstr)) + b2serr.append(new String(" Manually edit the neurolucida file and reorder or eliminate some contours.")) + b2serr.append(new String(" Presently the soma surface is nonsense.")) + return + } + z = z2 + for i = 1, sec.raw.ncol-1 if (z != sec.raw.x[2][i]) { + sprint(tstr, "contour %d of the Soma stack %s does not have constant z value.", j, $o1) + b2serr.append(new String(tstr)) + b2serr.append(new String(" Soma area calculation may be serious in error.")) + return + } + } +} + +proc somastack_process() {local i, n, n1 localobj pts, m, center, pv + if (!object_id($o1.contour_list)) { return } + printf("somastack_process %d\n", $o1.contour_list.count + 1) + // The stack defines a volume. Determine the principle axes + // and slice the volume along the major axis, approximating + // each slice by a circle and shifting the circle to be + // along the major axis. So the set of soma contours ends + // up being one straight cylindrically symetric soma centroid + // note then that curved carrots don't look quite right but + // straight carrots do. + + // for each contour use 100 points equally spaced. + // we should, but do not, make the stack equally spaced. + // then all the points are used to find the principle axes + // this pretty much follows the corresponding analysis in + // Import3d_GUI + // Heck. Let's just use all the contour points and approximate + // the thing as an ellipsoid + + // copy all the centroids into one matrix + // size of matrix + n = $o1.raw.nrow + for i=0, $o1.contour_list.count-1 { n += $o1.contour_list.object(i).raw.nrow} + pts = new Matrix(3, n) + n = 0 + n1 = $o1.raw.nrow + $o1.raw.bcopy(0, 0, 3, n1, 0, n, pts) + n = n1 + for i=0, $o1.contour_list.count-1 { + n1 = $o1.contour_list.object(i).raw.nrow + $o1.contour_list.object(i).raw.bcopy(0, 0, 3, n1, 0, n, pts) + n += n1 + } + center = new Vector(3) + for i=0, 2 { center.x[i] = pts.getrow(i).mean } + printf("center\n") center.printf + + //principle axes + m = new Matrix(3,3) + for i=0, 2 { pts.setrow(i, pts.getrow(i).sub(center.x[i])) } + for i=0, 2 { + for j=i, 2 { + m.x[i][j] = pts.getrow(i).mul(pts.getrow(j)).sum + m.x[j][i] = m.x[i][j] + } + } + pv = m.symmeig(m) + printf("Principle values\n") pv.printf() + printf("Principle axes\n") m.printf() +} + +proc stk_bbox() {local i, j localobj bbs, bbc + bbs = bounding_box($o1) + for i=0, $o1.contour_list.count-1 { + bbc = bounding_box($o1.contour_list.o(i)) + for j=0, 2 { + if (bbs.x[j] > bbc.x[j]) bbs.x[j] = bbc.x[j] + if (bbs.x[j+3] < bbc.x[j+3]) bbs.x[j+3] = bbc.x[j+3] + } + } + $&2 = bbs.x[0] $&3 = bbs.x[3] $&4 = bbs.x[1] $&5 = bbs.x[4] +} + +proc connect2soma_2() {local i, xmin, xmax, ymin, ymax localobj sec, xc, yc, zc, center + // find centroid of soma if outline and connect all dangling + // dendrites to that if inside the contour + if (object_id($o1.contour_list)) { + center = $o1.stk_center() + stk_bbox($o1, &xmin, &xmax, &ymin, &ymax) + }else{ + xc = $o1.raw.getrow(0) + yc = $o1.raw.getrow(1) + zc = $o1.raw.getrow(2) + xmin = xc.min-.5 xmax = xc.max + .5 + ymin = yc.min-.5 ymax = yc.max + .5 + center = $o1.contourcenter(xc, yc, zc) + } + centers.append(center) + + for (i=$o2.count-1; i >= 0; i -= 1) { + sec = $o2.object(i) + if (gm.inside(sec.raw.x[0][0], sec.raw.x[1][0], xmin, ymin, xmax, ymax)) { + sec.parentsec = $o1 + sec.parentx = .5 + sec.insrt(0, center.x[0], center.x[1], center.x[2], .01) + sec.first = 1 + sec.fid = 1 + $o2.remove(i) + } + } +} + +proc opt_connect() {local i, j, d, dmin, imin, n, ip localobj psec, xx + dmin = 1e9 + xx = $o1.raw.getcol(1) + for i=0, sections.count - 1 { + psec = sections.object(i) + if (psec == $o1) { break } + n = psec.raw.ncol + for j=0, n-1 { + d = xx.c.sub(psec.raw.getcol(j)).set(2,0).mag + if (d < dmin) { + dmin = d + imin = i + ip = j + } + } + } + if (dmin == 1e9) { return } + psec = sections.object(imin) +// if (dmin < psec.d.x[psec.d.size-1]) { + if (dmin < $3) { + b2sinfo.append(new Branch2SomaInfo($o1, psec, $2, dmin, $3, ip)) + } +} + +proc b2spanel() {local i localobj b2s + if (b2sinfo.count == 0) { return } + xpanel("Possible root branch errors") + xlabel("Default logical connection to nearest soma.") + xlabel("Check to physically connect to closest parent") + xlabel(" in the xy plane.") + xlabel(" (Note: may split the parent into two sections)") + for i=0, b2sinfo.count -1 { + b2s = b2sinfo.object(i) +sprint(tstr, "Line #%d connect to #%d %g (um) away", pt2id(sec2pto(b2s.sec, 1)), \ +pt2id(sec2pto(b2s.pbranch, b2s.ipoint)), b2s.d2p) +sprint(tstr2, "b2soption_act(%d, \"%s\")", i, $o1) + xcheckbox(tstr, &b2s.connected2p(), tstr2) + } + xpanel() +} + +proc b2soption_act() {local i localobj b2s, sec, parent, soma, xx + b2s = b2sinfo.object($1) + sec = b2s.sec + soma = somas.object(b2s.sindex) + parent = b2s.pbranch + if (sec.parentsec == soma) { // connect to parent + if (b2s.ipoint != parent.raw.ncol-1) { // need to split + b2soption_split(b2s) + parent = b2s.pbranch + set_firstpoints() + } + xx = parent.raw.getcol(b2s.ipoint) + sec.parentsec = parent + sec.parentx = 1 + sec.raw.setcol(0, xx) + sec.d.x[0] = sec.d.x[1] + sec.first = 0 + sec.fid = 1 + }else{ // connect to soma + xx = centers.object(b2s.sindex) + sec.parentsec = soma + sec.parentx = .5 + sec.raw.setcol(0, xx) + sec.d.x[0] = .01 + sec.first = 1 + sec.fid = 1 + } + sprint(tstr, "%s.redraw()", $s2) + execute(tstr) +} + +proc b2soption_split() {local i, n, id, ip localobj p, newsec, tobj + p = $o1.pbranch + ip = $o1.ipoint + id = sec2pto(p, ip) + n = p.raw.ncol + newsec = new Import3d_Section(p.id, ip+1) + p.id = id + + tobj = p.raw.c + tobj.bcopy(0,0,3,ip+1,newsec.raw) + p.raw.resize(3, n - ip) + p.xyz.resize(3, n - ip) + tobj.bcopy(0, ip, 3, n - ip, p.raw) + + tobj = p.d.c + newsec.d.copy(tobj, 0, ip) + p.d.resize(n - ip) + p.d.copy(tobj, ip, n-1) + + newsec.parentsec = p.parentsec + p.parentsec = newsec + newsec.parentx = p.parentx + p.parentx = 1 + newsec.type = p.type + newsec.first = p.first + newsec.fid = p.fid + p.first = 0 + p.fid = 0 + newsec.type = p.type + $o1.pbranch = newsec + $o1.ipoint = newsec.d.size-1 + // now adjust any screwed up b2sinfo items that also reference p + for i=0, b2sinfo.count-1 { + tobj = b2sinfo.object(i) + if (tobj == $o1) { continue } + if (tobj.pbranch == p) { + if (tobj.ipoint <= ip) { // on newsec + tobj.pbranch = newsec + }else{ // still on p + tobj.ipoint -= ip + } + } + } + sections.insrt(sections.index(p), newsec) +} + +func lex() {local n + $o1.x = 0 + $o1.s = "" + while (hoc_sf_.len(line) <= 1 || sscanf(line, " ;%[^@]", line) == 1) { + if (!getline(fline)) { + $o1.token = eof + itoken += 1 + $o1.itok = itoken + $o1.iline = iline_ + return eof + } + line = fline + hoc_sf_.left(fline, hoc_sf_.len(fline)-1) + } + if (sscanf(line, " %lf%[^@]", &$o1.x, line) == 2) { + $o1.token = number + }else if (sscanf(line, " (%[^@]", line) == 1) { + $o1.token = leftpar + }else if (sscanf(line, " )%[^@]", line) == 1) { + $o1.token = rightpar + }else if (sscanf(line, " ,%[^@]", line) == 1) { + $o1.token = comma + }else if (sscanf(line, " |%[^@]", line) == 1) { + $o1.token = bar + }else if (sscanf(line, " <%[^@]", line) == 1) { + $o1.token = leftsp + }else if (sscanf(line, " >%[^@]", line) == 1) { + $o1.token = rightsp + }else if (sscanf(line, " set %[^@]", line) == 1) { + $o1.token = set + }else if (sscanf(line, " Set %[^@]", line) == 1) { + $o1.token = set + }else if (sscanf(line, " SET %[^@]", line) == 1) { + $o1.token = set + }else if (sscanf(line, " RGB %[^@]", line) == 1) { + $o1.token = rgb + }else if ((n = sscanf(line, " \"%[^\"]\"%[^@]", $o1.s, line)) > 0) { + // not allowing quotes in quote + $o1.token = string + if (n == 1) { + printf("Lexical error: no closing '\"' in string. The entire line %d in ||is\n", iline_) + printf("|%s|\n", fline) + line = "" + $o1.token = err_ + } + }else if (sscanf(line, " %[A-Za-z0-9_]%[^@]", $o1.s, line) == 2) { + $o1.token = label_ + }else{ + $o1.token = err_ + } + itoken += 1 + $o1.itok = itoken + $o1.iline = iline_ + return $o1.token +} + +func getline() { + if (file.eof) { + if (!quiet) { + printf("\r%d lines read\n", iline_) + } + return 0 + } + file.gets($s1) + iline_ += 1 +// printf("%d: %s", iline_, $s1) + if ((iline_%1000) == 0) { + if (!quiet) { + printf("\r%d lines read", iline_) + } + } + return 1 +} + +proc rdfile() {local i + iline_ = 0 + file = new File($s1) + if (!file.ropen()) { + err = 1 + printf("could not open %s\n", $s1) + } + for (i=0; !file.eof(); i += 1) { + file.gets(line) + } + alloc(i, x, y, z, d, iline) + file.close + lines = new List(25000) + line="" + if (!quiet) { + printf("\n") + } + file.ropen() + p_file() + file.close +} + +objref rollback + +proc save_for_rollback() { + if (object_id(rollback)) { + printf("rollback in use\n") + p_err() + } + rollback = new List() + rollback.append(current.clone()) + rollback.append(look_ahead.clone()) + rollback.append(look_ahead2.clone()) + use_rollback_ = 0 +} +proc use_rollback() { + use_rollback_ = 1 + current = rollback.o(0) rollback.remove(0) + look_ahead = rollback.o(0) rollback.remove(0) + look_ahead2 = rollback.o(0) rollback.remove(0) + if (rollback.count == 0) {clear_rollback()} +} +proc clear_rollback() {localobj nil + rollback = nil + use_rollback_ = 0 +} + +proc read_next_token() { + if (use_rollback_) { + current = look_ahead + look_ahead = look_ahead2 + look_ahead2 = rollback.o(0) + rollback.remove(0) + if (rollback.count == 0) { + clear_rollback() + } + }else{ + read_next_token_lex() + if (object_id(rollback)){ + rollback.append(look_ahead2.clone()) + } + } +} +proc read_next_token_lex() {localobj tobj + tobj = current + current = look_ahead + look_ahead = look_ahead2 + look_ahead2 = tobj + if (look_ahead.token != eof) { + lex(look_ahead2) + }else{ + look_ahead2.token = eof + } +// printf("current token=%s x=%g s=%s\n", tokens.object(current.token).s, current.x, current.s) +} + +func need_extra() {local i, n localobj m + if (parentsec == nil) { return 0 } + m = parentsec.raw + n = m.ncol-1 + if ( m.x[0][n] == x.x[$1]) { + if ( m.x[1][n] == y.x[$1]) { + if ( m.x[2][n] == z.x[$1]) { + return 0 + } + } + } + return 1 +} +proc newsec() {local i, n, first, n1 localobj m + first = 0 + n = $2 - $1 + if (need_extra($1)) { + cursec = new Import3d_Section($1, n+1) + first = 1 + cursec.fid = 1 + m = parentsec.raw + n1 = m.ncol-1 + cursec.set_pt(0, m.x[0][n1], m.x[1][n1], m.x[2][n1], d.x[$1]) + }else{ + cursec = new Import3d_Section($1, n) + } + cursec.type = sectype + type.append(sectype) + sections.append(cursec) + cursec.append(first, $1, n, x, y, z, d) +} +proc set_sectype() {localobj tobj + sectype = 0 + if (plist.count) { + tobj = plist.object(plist.count-1) + if (strcmp(tobj.s, "Axon") == 0) { + sectype = 2 + }else if (strcmp(tobj.s, "Dendrite") == 0) { + sectype = 3 + }else if (strcmp(tobj.s, "Apical") == 0) { + sectype = 4 + } + } +} + +proc label() { + sprint($s2, "Line %d: %s", iline.x[$1], lines.object($1).s) +} +func id2pt() {local i + i = iline.indwhere(">=", $1) + if (i < 0) { i = iline.size-1 } + return i +} +func id2line() { return $1 } +func pt2id() {local i + i = $1 + if (i < 0) { i == 0 } + if (i >= iline.size) { i = iline.size-1 } + return iline.x[i] +} +func pt2sec() {local i, j + i = firstpoints.indwhere(">", $1) + if (i == -1) { + i = firstpoints.size + } + $o2 = sections.object(i-1) + j = $1 - $o2.id + $o2.fid + return j +} +func sec2pt() {local i localobj sec + sec = sections.object($1) + i = sec.id + $2 - sec.fid + return i +} +func sec2pto() {local i localobj sec + sec = $o1 + i = sec.id + $2 - sec.fid + return i +} +proc mark() {local i + print $o1, $2, iline, lines + i = iline.indwhere("==", $2) + if (i != -1) { + printf("%d,%d,%d (%g,%g): %s\n", $2, iline.x[i], i, x.x[i], y.x[i], lines.object(i).s) + $o1.mark(x.x[i], y.x[i], "S",12,4,1) + } +} + +proc helptxt() { + xpanel("Neurolucida V3 file filter characteristics") +xlabel("The elaborate file format is handled by a reasonably complete") +xlabel("recursive descent parser that more or less matches the production") +xlabel("rules for the grammar. However, at present, only contours and trees") +xlabel("are given any semantic actions (in particular, spines are ignored).") + xpanel(1) +} + +proc chk() { + if (current.token != $1) { p_err() } +} +proc demand() { + read_next_token() + chk($1) +} +proc pcur() { + printf("itok=%d on line %d token=%s x=%g s=%s\n", current.itok, current.iline, tokens.object(current.token).s, current.x, current.s) +} +proc plook() { +// printf("lookahead: itok=%d token=%s x=%g s=%s\n", look_ahead.itok, tokens.object(look_ahead.token).s, look_ahead.x, look_ahead.s) +} +proc enter() {local i + if (debug_on == 0) {return} + for i=1, depth {printf(" ")} + printf("enter %s: ", $s1) + pcur() + depth += 1 +} +proc leave() {local i + if (debug_on == 0) {return} + depth -= 1 + for i=1, depth {printf(" ")} + printf("leave %s: ", $s1) + pcur() +} +// p stands for production if needed to avoid conflict with variable +proc p_file() { + look_ahead2.token = eof + look_ahead.token = eof + if (lex(current) != eof) { + if (lex(look_ahead) != eof) { + lex(look_ahead2) + } + } + enter("p_file") + objects() + leave("p_file") +} +proc objects() { + enter("objects") + object() + while(1) { + optionalcomma() + if (current.token != leftpar) { + break + } + object() + } + leave("objects") +} +proc object() {local i + i = current.itok + enter("object") + if (current.token == leftpar) { + plook() + if (look_ahead.token == string) { + contour() + }else if (look_ahead.token == label_) { + marker_or_property() + }else if (look_ahead.token == leftpar) { + tree_or_text() + }else if (look_ahead.token == set) { + p_set() + }else{ + p_err() + } + }else{ + p_err() + } + leave("object") + if (i == current.itok) { + print "internal error: ", "object consumed no tokens" + stop + } +} +proc marker_or_property() { + enter("marker_or_property") + if (look_ahead2.token == leftpar) { + marker() + }else{ + property() + } + leave("marker_or_property") +} +proc tree_or_text() { + // the tree and text productions are poorly conceived since they + // match each other for arbitrarily long sequences of Properties tokens. + // And after the properties they both have a Point. + // For now just assume it is a tree. + // It will be painful to consume the [ '(' Properties Point ] here + // and then disambiguate between Tree or Text and then more + // often than not, start the tree production after having already + // read the first point (Branch currently assumes it is supposed + // to read the first point of the tree.) + enter("tree_or_text") + save_for_rollback() + if (text()) { + clear_rollback() + }else{ + use_rollback() + tree() + } + leave("tree_or_text") +} +proc properties() { + enter("properties") + plist.remove_all() + if (current.token == leftpar) { + if(look_ahead.token == label_ || look_ahead.token == set) { + property_or_set() + while (1) { + optionalcomma() +if (current.token != leftpar || (look_ahead.token != label_ && look_ahead.token != set)) { + break + } + property_or_set() + } + } + } + leave("properties") +} +proc property_or_set() { + if (look_ahead.token == label_) { + property() + }else{ + p_set() + } +} +proc property() { + enter("property") + chk(leftpar) + demand(label_) + plist.append(new String(current.s)) + read_next_token() + optionalvalues() + chk(rightpar) + read_next_token() + leave("property") +} +proc optionalvalues() {local c + enter("optionalvalues") + c = current.token + if (c == number || c == string || c == label_ || c == rgb) { + values() + } + leave("optionalvalues") +} +proc values() {local c + enter("values") + value() + while (1) { + c = current.token + if (c != number && c != string && c != label_ && c != rgb) { + break + } + value() + } + leave("values") +} +proc value() {local c + enter("value") + c = current.token + if (c == number) { + }else if (c == string) { + }else if (c == label_) { + }else if (c == rgb) { + demand(leftpar) + demand(number) + read_next_token() + optionalcomma() + chk(number) + read_next_token() + optionalcomma() + chk(number) + demand(rightpar) + }else{ + p_err() + } + read_next_token() + leave("value") +} +proc p_set() { + // presently, I am imagining that we ignore sets + // and I hope we never see objects() in them. + enter("p_set") + chk(leftpar) + demand(set) + demand(string) + read_next_token() + if (current.token != rightpar) { + objects() + } + chk(rightpar) + read_next_token() + leave("p_set") +} +proc contour() {local begin, end, keep, il + enter("contour") + chk(leftpar) + begin = x.size + keep = 0 + demand(string) + if (strcmp(current.s, "CellBody") == 0) { keep = 1 } + if (strcmp(current.s, "Cell Body") == 0) { keep = 1 } + il = current.iline + read_next_token() + contourinfo() + if (keep) { + end = x.size + if (end - begin > 2) { + sectype = 1 + newsec(begin, end) + cursec.iscontour_ = 1 + }else{ +sprint(tstr, "CellBody contour has less than three points at line %d. Ignoring.", il) + b2serr.append(new String(tstr)) + } + } + chk(rightpar) + read_next_token() + leave("contour") +} +proc contourinfo() { + enter("contourinfo") + properties() + points() + morepoints() + leave("contourinfo") +} +proc morepoints() { + enter("morepoints") + optmarkerlist() + leave("morepoints") +} +proc optmarkerlist() { + enter("optmarkerlist") + leave("optmarkerlist") +} +proc markerlist() {local pcnt + enter("markerlist") + chk(leftpar) + pcnt = 1 + // not handling markers. when pcnt goes to 0 then leave + while (pcnt != 0) { + read_next_token() + if (current.token == rightpar) { + pcnt -= 1 + }else if (current.token == leftpar) { + pcnt += 1 + } + } + read_next_token() + leave("markerlist") +} +proc tree() { + enter("tree") + parentsec = nil + chk(leftpar) + read_next_token() + properties() + set_sectype() + branch() + chk(rightpar) + read_next_token() + parentsec = nil + leave("tree") +} +proc branch() {local begin, end localobj psav + enter("branch") + psav = parentsec + begin = x.size + treepoints() + end = x.size + newsec(begin, end) + cursec.parentsec = parentsec + parentsec = cursec + branchend() + parentsec = psav + leave("branch") +} +proc treepoints() { + enter("treepoints") + treepoint() + while (1) { + optionalcomma() + if (current.token != leftpar || look_ahead.token != number) { + break + } + treepoint() + } + leave("treepoints") +} +proc treepoint() { + enter("treepoint") + point() + if (current.token == leftsp) { + spines() + } + leave("treepoint") +} +proc spines() { + enter("spines") + spine() + while(current.token == leftsp) { + spine() + } + leave("spines") +} +proc spine() { + enter("spine") + chk(leftsp) read_next_token() + nspine += 1 err = 1 +// properties() points() + while (current.token != rightsp) { + read_next_token() + } + chk(rightsp) read_next_token() + leave("spine") +} +proc branchend() { + enter("branchend") + optionalcomma() + if (current.token == leftpar) { + while (look_ahead.token == label_) { + markerlist() + } + } + optionalcomma() + if (current.token == leftpar || current.token == label_) { + node() + } + leave("branchend") +} +proc node() { + enter("node") + if (current.token == leftpar) { + read_next_token() split() + chk(rightpar) read_next_token() + }else if (current.token == label_) { + read_next_token() + }else{ + p_err() + } + leave("node") +} +proc split() { + enter("split") + branch() + while (current.token == bar) { + read_next_token() + branch() + } + leave("split") +} +proc marker() { + enter("marker") + chk(leftpar) + demand(label_) + read_next_token() + properties() points() + chk(rightpar) read_next_token() + leave("marker") +} +func text() { + // if text fails then it may be a tree + enter("text") + chk(leftpar) read_next_token() + properties() point() + if (current.token != string) { + leave("text invalid --- expect string") + return 0 + } + chk(string) +// demand(rightpar) + read_next_token() + if (current.token != rightpar) { + leave("text invalid --- expect rightpar") + return 0 + } + chk(rightpar) + read_next_token() + leave("text") + return 1 +} +proc points() { + enter("points") + point() + while (1) { + optionalcomma() + if (current.token != leftpar) { + break + } + point() + } + leave("points") +} +proc point() { + enter("point") + chk(leftpar) + demand(number) + xval = current.x + iline.append(iline_) lines.append(new String(fline)) + read_next_token() optionalcomma() + chk(number) + yval = current.x + zval = dval = 0 + read_next_token() optz() + x.append(xval) y.append(yval) z.append(zval) d.append(dval) + chk(rightpar) read_next_token() +//printf("%g %g %g %g\n", xval, yval, zval, dval) + leave("point") +} +proc optz() { + enter("optz") + optionalcomma() + if (current.token == number) { + zval = current.x + read_next_token() + optmodifier() + } + leave("optz") +} +proc optmodifier() { + enter("optmodifier") + optionalcomma() + if (current.token == number) { + dval = current.x + read_next_token() + optionalcomma() + if (current.token == label_) { + read_next_token() + } + optbezier() + } + leave("optmodifier") +} +proc optbezier() { + enter("optbezier") + optionalcomma() + if (current.token == leftpar) { + demand(number) + read_next_token() + optionalcomma() chk(number) read_next_token() + optionalcomma() chk(number) read_next_token() + optionalcomma() chk(number) demand(rightpar) + read_next_token() + } + leave("optbezier") +} +proc optionalcomma() { + enter("optionalcomma") + if (current.token == comma) { + read_next_token() + } + leave("optionalcomma") +} +proc p_err() { + printf("\nparse error\n") + pcur() + printf("line %d: %s\n", iline_, fline) + stop +} +proc errout() {local i + if (quiet) { return } + printf("\n%s problems\n\n", file.getname) + if (nspine) { + printf("Ignored %d spines\n", nspine) + } + for i=0, b2serr.count-1 { + printf("%s\n", b2serr.object(i).s) + } +} +endtemplate Import3d_Neurolucida3 diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_nts.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_nts.hoc new file mode 100644 index 0000000..c58e9d6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_nts.hoc @@ -0,0 +1,331 @@ +// translation of ntscable's read_nts.c file for importing +// eutectic files. After reading and parsing lines, the logic +// follows that in nlcda_read.hoc + +begintemplate Import3d_Eutectic_read +public filetype, sections, input, type, file, err +public label, id2pt, id2line, pt2id, pt2sec, sec2pt, mark +external hoc_sf_ +public id, ptype, tag, x, y, z, d, iline, pointtype, points, type +public firstpoints, lastpoints +objref sections, file, stack, cursec, firstpoints, lastpoints, gm +objref id, ptype, tag, x, y, z, d, iline, pointtype, points, type +objref iline2pt, vectors, header, lines, diam, parse_err, nil, soma +strdef tstr, tstr1, point_type_names, filetype, line + +proc init() { + filetype = "Eutectic" + vectors = new List() + header = new List() + lines = new List() + gm = new GUIMath() + MTO = 0 + TTO = 3 + BTO = 6 + CP = 9+1 + FS = 12+1 + SB = 15+1 + BP = 18+1 + NE = 21+1 + ES = 24+1 + MAE = 27 + TAE = 30 + BAE = 33 + SOS = 36 + SCP = 39 + SOE = 42 + OS = 45+1 + OCP = 48 + OE = 51+1 + DS = 54+1 + DCP = 57 + DE = 60+1 + point_type_names = \ +"MTOTTOBTO CP FS SB BP NE ESMAETAEBAESOSSCPSOE OSOCP OE DSDCP DE" +// note numbering for two char item is 1 more than in read_nts.c +// since space is not included in first char +} + +proc input() {local i + nspine = 0 + err = 0 + parse_err = new List() + sections = new List() + stack = new List() + lastpoints = new Vector() + firstpoints = new Vector() + + rdfile($s1) + parse2() + type = new Vector(sections.count) + for i=0, sections.count-1 { + type.x[i] = tag.x[sections.object(i).id] + } + connect2soma() + if (err) { errout() } +} + +proc rdfile() {local i, j + file = new File($s1) + // count lines for vector allocation space (not really necessary) + if (!file.ropen()) { + err = 1 + printf("could not open %s\n", $s1) + } + for (i = 0; !file.eof(); i += 1) { + file.gets(line) + } + file.close() +// printf("%s has %d lines\n", $s1, i) + alloc(i, id, ptype, tag, x, y, z, d, iline, pointtype, points) + tag + diam = d + file.ropen() + for (i = 1; !file.eof(); i += 1) { + file.gets(line) + parse(i, line) + } + file.close() +} + +proc alloc() { local i // $oi.size = 0 but enough space for $1 elements + for i = 2, numarg() { + $oi = new Vector($1) + $oi.resize(0) + vectors.append($oi) + } +} + +proc parse() {local a1 ,a2, a3, a4, a5, a6, a7 + n = sscanf($s2, "%d %s %d %f %f %f %f", &a1, tstr, &a3, &a4, &a5, &a6, &a7) + hoc_sf_.left($s2, hoc_sf_.len($s2)-1) + if (n <= 0) { + header.append(new String($s2)) + return + } + if (n != 7) { + err = 1 + sprint(tstr, "%d: %s parse failure after item %d", $1, $s2, n) + parse_err.append(new String(tstr)) + return + } + a2 = hoc_sf_.head(point_type_names, tstr, tstr1) +// print tstr, " ", a2 + // first points of branches (before physical connection) is 1 + // continuation points are 2 + // branch are 3 + // ends are 4 + // a branch point can also be a first point + // so easiest to accumulate them here + if (a2 == MTO) { + last = 1 + firstpoints.append(id.size) + }else if (a2 == BP ){ + if (last == 3 || last == 4){ + firstpoints.append(id.size) + } + last = 3 + }else if (a2 == FS || a2 == SB || a2 == CP){ + if (a2 == SB) { err = 1 nspine += 1 } + if (last == 3 || last == 4){ + firstpoints.append(id.size) + last = 1 + }else{ + last = 2 + } + }else if (a2 == NE || a2 == ES || a2 == MAE || a2 == TAE || a2 == BAE){ + if (last == 3 || last == 4){ + firstpoints.append(id.size) + } + last = 4 + }else if (a2 == SOS){ + last = 10 + }else if (a2 == SCP){ + last = 10 + }else if (a2 == SOE){ + last = 10 + }else if (a2 == OS){ + return + }else if (a2 == DS){ + return + }else if (a2 == DCP || OCP){ + return + }else if (a2 == DE || a2 == OE){ + return + }else{ + return + } + pointtype.append(last) + points.append(a1) + id.append(a1) + ptype.append(a2) + tag.append(a3) + x.append(a4) + y.append(a5) + z.append(a6) + d.append(a7) + iline.append($1) + lines.append(new String($s2)) +} +proc parse2() {local i, j, k localobj parent + i = ptype.indwhere("==", SOS) + j = ptype.indwhere("==", SOE) + if (i > -1 && j > i) { + mksec(i, j, nil) + cursec.iscontour_ = 1 +// cursec.type=1 + soma = cursec + } + for i=0, firstpoints.size-1 { + j = firstpoints.x[i] + for (k=j; pointtype.x[k] <= 2; k += 1) { + } + parent = pop() + if (parent != nil) { + if (parent.volatile < 1) { + push(parent) + parent.volatile += 1 + } + } + mksec(j, k, parent) +//printf("%s %d %d: %s | %s\n", cursec, j, k, lines.object(j).s, lines.object(k).s) + cursec.parentsec = parent +// logic_connect(cursec, parent) + if (pointtype.x[k] == 3) { + push(cursec) + } + } + if (stack.count > 0) { + err = 1 + } +} + +proc push() { + stack.append($o1) +} +obfunc pop() {localobj p + if (stack.count > 0) { + p = stack.object(stack.count-1) + stack.remove(stack.count-1) + }else{ + p = nil + } + return p +} + +proc mksec() {local i, x1, y1, z1, d1 + if ($o3 == nil) { + cursec = new Import3d_Section($1, $2-$1+1) + cursec.append(0, $1, $2-$1+1, x, y, z, d) + }else{ + cursec = new Import3d_Section($1, $2-$1+2) + cursec.append(1, $1, $2-$1+1, x, y, z, d) + cursec.first = 0 // physical connection + i = $o3.raw.ncol-1 + x1 = $o3.raw.x[0][i] + y1 = $o3.raw.x[1][i] + z1 = $o3.raw.x[2][i] + //d1 = $o3.d.x[i] + cursec.set_pt(0, x1, y1, z1, cursec.d.x[1]) + cursec.fid = 1 + } + cursec.volatile = 0 + cursec.type = tag.x[$1] + sections.append(cursec) + lastpoints.append($2) +} + +proc logic_connect() {local i, x1, y1, z1, d1 + if ($o2 == nil) { return } + i = $o2.raw.ncol-1 + x1 = $o2.raw.x[0][i] + y1 = $o2.raw.x[1][i] + z1 = $o2.raw.x[2][i] + d1 = $o2.d.x[i] + $o1.insrt(0, x1, y1, z1, $o1.d.x[0]) + $o1.first = 1 +} + +proc connect2soma() {local i, ip, j, jp, bp, jpmin, dmin, d, xmin, xmax, ymin, ymax localobj sec, xc, yc, zc, c + // find centroid of soma if outline and connect all dangling + // dendrites to that if inside the contour + if (soma == nil) { return } + xc = soma.raw.getrow(0) + yc = soma.raw.getrow(1) + zc = soma.raw.getrow(2) + xmin = xc.min-.5 xmax = xc.max + .5 + ymin = yc.min-.5 ymax = yc.max + .5 + c = soma.contourcenter(xc, yc, zc) + for i=0, sections.count-1 { + sec = sections.object(i) + if (sec.parentsec == nil && sec != soma) { + if (gm.inside(sec.raw.x[0][0], sec.raw.x[1][0], xmin, ymin, xmax, ymax)) { + sec.parentsec = soma + sec.parentx = .5 + sec.insrt(0, c.x[0], c.x[1], c.x[2], .01) + sec.first = 1 + sec.fid = 1 + } + } + } +} + +proc label(){ + sprint($s2, "Line %d: %s", iline.x[$1], lines.object($1).s) +} +func id2pt() { + i = id.indwhere(">=", $1) +//print "id2pt ", $1, i, id.x[i] + return i +} +func id2line() { return points.x[$1] } +func pt2id() {local i +//print "pt2id ", $1, id.x[$1] + return id.x[$1] +} +func pt2sec(){local i, j + i = lastpoints.indwhere(">=", $1) + if (i == -1) { + i = lastpoints.size-1 + } + $o2 = sections.object(i) + j = $1 - $o2.id + $o2.fid +//print "pt2sec ", $1, $o2, $o2.id, j + return j +} +func sec2pt(){local i localobj sec + sec = sections.object($1) + i = sec.id + $2 - sec.fid +//print "sec2pt ", $1, $2, sec.id, sec.first, i + return i +} + +proc mark() {local i, a,b,c,d,e,f + print $o1, $2, iline, lines + i = id.indwhere("==",$2) + printf("%d,%d,%d: %s\n", i, id.x[i], iline.x[i], lines.object(i).s) + n = sscanf(lines.object(i).s, "%d %s %d %f %f %f %f", &a, tstr, &b, &c, &d, &e, &f) + if (n == 7) { + print a," ",tstr," ",b,c,d,e,f + $o1.mark(c,d,"S",12,4,1) + } +} + +proc errout() { + printf("\n%s problems and default fixes\n\n", file.getname) + if (parse_err.count) { + printf(" Following lines could not be parsed\n") + for i=0, parse_err.count-1 { + printf(" %s\n", parse_err.object(i).s) + } + printf("\n") + } + if (stack.count > 0) { + printf(" stack.count = %d\n", stack.count) + } + if (nspine > 0) { + printf(" Ignore %d spines\n", nspine) + } +} + +endtemplate Import3d_Eutectic_read diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_swc.hoc b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_swc.hoc new file mode 100644 index 0000000..2dddd72 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/import3d/read_swc.hoc @@ -0,0 +1,428 @@ +// read swc file, create and verify that it is a single tree, +// and identify the lists of unbranched points. + +begintemplate Import3d_SWC_read +public input, pheader, instantiate +public id, type, x, y, z, d, pid, iline, header, point2sec, sections, lines +public idoffset, label, id2pt, id2line, pt2id, pt2sec, sec2pt, file, mark +public filetype, err, helptxt +public quiet +external hoc_sf_ +objref id, type, x, y, z, d, pid, iline, header, lines +objref file, vectors, sec2point, point2sec, sections +objref connect2prox +strdef tstr, line, filetype +double a[7] +objref id2index_ + +// id and pid contain the raw id values (1st and 7th values on each line) +// from the file. After the file is read id2index(id.x[i]) == i +// Note that the only requireement for a valid swc file is the tree +// topology condition pid.x[i] < id.x[i] + + +proc init() { + quiet = 0 + filetype = "SWC" + vectors = new List() + header = new List() + lines = new List() +} + +func id2index() { + return id2index_.x[$1] +} +func pix2ix() {local pid_ + pid_ = pid.x[$1] + if (pid_ < 0) { return -1 } + return id2index_.x[pid_] +} + +proc input() { + err = 0 + rdfile($s1) + check_pid() // and also creates id2index_ + sectionify() // create point2sec index map + mksections() // Import3dSection list +// instantiate() +} + +proc rdfile() {local i + file = new File($s1) + // count lines for vector allocation space (not really necessary) + if (!file.ropen()) { + err = 1 + printf("could not open %s\n", $s1) + } + for (i = 0; !file.eof(); i += 1) { + file.gets(line) + } + file.close() +// printf("%s has %d lines\n", $s1, i) + alloc(i, id, type, x, y, z, d, pid, iline) + file.ropen() + for (i = 1; !file.eof(); i += 1) { + file.gets(line) + parse(i, line) + } + file.close() +} + +proc alloc() { local i // $oi.size = 0 but enough space for $1 elements + for i = 2, numarg() { + $oi = new Vector($1) + $oi.resize(0) + vectors.append($oi) + } +} + +proc parse() {local i, n + n = sscanf($s2, "%f %f %f %f %f %f %f", &a[0], &a[1], &a[2],\ + &a[3], &a[4], &a[5], &a[6]) + if (n == 7) { + a[5] *= 2 // radius to diameter + for i=0, 6 { + vectors.object(i).append(a[i]) + } + iline.append($1) // for error messages + hoc_sf_.left($s2, hoc_sf_.len($s2)-1) + lines.append(new String($s2)) + } else if (hoc_sf_.head($s2, "#", tstr) == 0) { // comment + header.append(new String($s2)) + } else { + err = 1 + printf("error %s line %d: could not parse: %s", file.getname, $1, $s2) +// Note: only swcdata/n120.swc and swcdata/n423.swc last lines are invalid + } +} + +proc pheader() {local i + for i=0, header.count-1 { + printf("%s", header.object(i).s) + } +} + +proc shift_id() { local i, ierr, imin + // Note: swcdata/*.swc have sequential id's + // shift id and pid so that id.x[0] == 0. Then verify that + // id.x[i] == i + if (id.size > 0) { + imin = id.min_ind + idoffset = id.x[imin] + // is the first one the smallest? + if (id.x[0] != idoffset) { + err = 1 +printf("error %s lines %d and %d: id's %d and %d are not sequential\n", \ + file.getname, iline.x[0], iline.x[imin], \ + id.x[0], idoffset) + } + id.sub(idoffset) + pid.sub(idoffset) + } + ierr = 0 + for i=0, id.size-1 { + if (id.x[i] != i ) { + err = 1 +printf("error %s line %d: id's shifted by %d are not sequential: id.x[%d] != %g\n", \ + file.getname, iline.x[i], idoffset, i, id.x[i]) + ierr += 1 + } + if (ierr > 5) { break } + } +} + +proc check_pid() {local i, ierr, needsort localobj tobj + // if all pid.x[i] < id.x[i] then we must be 1 or more trees with no loops + // Note: swcdata/*.swc conforms. + needsort = 0 + ierr = 0 + for i=0, id.size-1 { + if (i > 0) if (id.x[i] <= id.x[i-1]) { needsort = 1 } + if (pid.x[i] >= id.x[i]) { + err = 1 +printf("error %s line %d: index %d pid=%d is not less than id=%d\n",\ + file.getname, iline.x[i], i, pid.x[i], id.x[i]) + } + } + if (needsort) { // sort in id order + tobj = id.sortindex() + id.sortindex(id, tobj) + pid.sortindex(pid, tobj) + x.sortindex(x, tobj) + y.sortindex(y, tobj) + z.sortindex(z, tobj) + d.sortindex(diam, tobj) + iline.sortindex(iline, tobj) + } + // the number of trees is just the number of pid's < 0 + // Note: swcdata/*.swc have only one tree + tobj = new Vector() + tobj.indvwhere(pid, "<", 0) + if (tobj.size > 1) { + err = 1 + + if (!quiet) {// added by Sergey to suppress the warning output + +printf("warning %s: more than one tree:\n", file.getname) + printf(" root at line:") + for i=0, tobj.size-1 { + printf(" %d,", iline.x[tobj.x[i]]) + } + printf(" \n") + }// end of quiet + } + // check for duplicate id + for i=1, id.size-1 if (id.x[i] == id.x[i-1]) { + err = 1 +printf("error %s: duplicate id:\n", file.getname) +printf(" %d: %s\n", iline.x[i-1], lines.o(iline.x[i-1]).s) +printf(" %d: %s\n", iline.x[i], lines.o(iline.x[i]).s) + } + // create the id2index_ map + id2index_ = new Vector(id.max()+1) + id2index_.fill(-1) + for i=0, id.size-1 { + id2index_.x[id.x[i]] = i + } +} + +proc sectionify() {local i, si localobj tobj + // create point2sec map and sections list + // point2sec gives immediate knowledge of the section a point is in + // sections list is for display purposes + if (id.size < 2) { return } + + // tobj stores the number of child nodes with pid equal to i + // actually every non-contiguous child adds 1.01 and a contiguous + // child adds 1 + mark_branch(tobj) + + point2sec = new Vector(id.size) + // first point in the root and if only one point it will be interpreted + // as spherical. + point2sec.x[0] = 0 + si = 0 + for i=1, id.size-1 { + if (tobj.x[pix2ix(i)] > 1 || connect2prox.x[i]) { + si += 1 + } + point2sec.x[i] = si + } + sec2point = new Vector(si) + tobj.x[0] = 1 + sec2point.indvwhere(tobj, "!=", 1) + // sec2point.x[i] is the last point of section i + // 0 is the first point of section 0 + // sec2point.x[i-1]+1 is the first point of section i +} + +proc mark_branch() { local i, p + //$o1 is used to store the number of child nodes with pid equal to i + // actually add a bit more than 1 + // if noncontiguous child and 1 if contiguous child + // this is the basic computation that defines sections, i.e. + // contiguous 1's with perhaps a final 0 (a leaf) + // As usual, the only ambiguity will be how to treat the soma + + // Another wrinkle is that we do not want any sections that + // have multiple point types. E.g. point type 1 is often + // associated with the soma. Therefore we identify + // point type changes with branch points. + + // however warn if the first two points do not have the same type + // if single point soma set the spherical_soma flag + if ( type.x[0] != type.x[1]) { + err = 1 + if (0 && !quiet) { +printf("\nNotice: %s:\nThe first two points have different types (%d and %d) but\n a single point NEURON section is not allowed.\n Interpreting the point as the center of a sphere of\n radius %g at location (%g, %g, %g)\n Will represent as 3-point cylinder with L=diam and with all\n children kept at their 1st point positions and connected\n with wire to middle point.\n If this is an incorrect guess, then change the file.\n"\ +, file.getname, type.x[0], type.x[1], d.x[0]/2, x.x[0], y.x[0], z.x[0]) + } + } + + // another wrinkle is that when a dendrite connects to the soma + // by a wire, + // another branch may connect to the first point of that dendrite + // In this case (to avoid single point sections) + // that branch should be connected to position 0 + // of the dendrite (and the first point of that branch should be + // the same position as the first point of the dendrite. + // use connect2prox to indicate the parent point is not + // the distal end but the proximal end of the parent section + connect2prox = new Vector(id.size) + + $o1 = new Vector(id.size) + for i=0, id.size-1 { + p = pix2ix(i) + if (p >= 0) { + $o1.x[p] += 1 + if ( p != i-1) { + $o1.x[p] += .01 +//i noncontiguous with parent and +// if parent is not soma and parent of parent is soma +// then i appended to connect2prox +if (p > 1) if (type.x[p] != 1 && type.x[pix2ix(p)] == 1) { + connect2prox.x[i] = 1 + $o1.x[p] = 1 // p not treated as a 1pt section + err = 1 + if (0 && !quiet) { +printf("\nNotice: %s:\n %d parent is %d which is the proximal point of a section\n connected by a wire to the soma.\n The dendrite is being connected to\n the proximal end of the parent dendrite.\n If this is an incorrect guess, then change the file.\n"\ +, file.getname, id.x[i], id.x[p]) + } +} + + } + if (type.x[p] != type.x[i]) { + // increment enough to get past 1 + // so force end of section but + // not really a branch + $o1.x[p] += .01 + } + } + } +} + +proc mksections() {local i, j, isec, first localobj sec, psec, pts + sections = new List() + isec = 0 + first = 0 + for i=0, id.size-1 { + if (point2sec.x[i] > isec) { + mksection(isec, first, i) + isec += 1 + first = i + } + } + mksection(isec, first, i) +} + +proc mksection() { local i, isec, first localobj sec + isec = $1 first=$2 i=$3 + if (isec > 0) {// branches have pid as first point + sec = new Import3d_Section(first, i-first+1) + pt2sec(pix2ix(first), sec.parentsec) + // but if the parent is the root and the branch has more than + // one point, then connect to center of root with wire + if (point2sec.x[pix2ix(first)] == 0 && i > 1) { + sec.parentx = 0.5 + sec.first = 1 + }else{ + if (pix2ix(first) == 0) { sec.parentx = 0 } + } + sec.append(0, pix2ix(first), 1, x, y, z, d) + sec.append(1, first, i-first, x, y, z, d) + }else{// pid not first point in root section + sec = new Import3d_Section(first, i-first) + sec.append(0, first, i-first, x, y, z, d) + } + sec.type = type.x[first] + sections.append(sec) + if (object_id(sec.parentsec)) { + if (sec.parentsec.type == 1 && sec.type != 1) { + sec.d.x[0] = sec.d.x[1] + } + } + if (connect2prox.x[first]) { + sec.pid = sec.parentsec.id + sec.parentx = 0 + } +} + +func same() { + if ($2 < 0) return 0 + if (x.x[$1] == x.x[$2]) { + if (y.x[$1] == y.x[$2]) { +// if (z.x[$1] == z.x[$2]) { + return 1 +// } + } + } + return 0 +} + +proc instantiate() {local i, isec, psec, pp, si, px + if (id.size < 2) { return } + + sprint(tstr, "~create K[%d]", sec2point.size) + execute(tstr) + + // connect + for i = 2, id.size-1 { + if (point2sec.x[pix2ix(i)] == point2sec.x[i]) { continue } + if (pix2ix(i) == 0) { px = 0 } else { px = 1 } + sprint(tstr, "K[%d] connect K[%d](0), (%g)", \ + point2sec.x[pix2ix(i)], point2sec.x[i], px) + execute(tstr) + } + + // 3-d point info + // needs some thought with regard to interior duplicate + // points, and whether it is appropriate to make the first + // point in the section the same location and diam as the + // pid point + isec = 0 + for i=0, id.size-1 { + if (point2sec.x[i] > isec ) { // in next section + ptadd(pix2ix(i), point2sec.x[i]) + } + isec = point2sec.x[i] + ptadd(i, isec) + } +} + +proc ptadd() { + sprint(tstr, "K[%d] { pt3dadd(%g, %g, %g, %g) }", \ + $2, x.x[$1], y.x[$1], z.x[$1], d.x[$1]) + execute(tstr) +} + +proc label() { + sprint($s2, "Line %d: %s", iline.x[$1], lines.object($1).s) +} +func id2pt() {local i + if ($1 < 0) { + $1 = 0 + }else if ( $1 > id2index_.size-1) { + $1 = id2index_.size-1 + } + return id2index($1) +} +func id2line() { return $1 } +func pt2id() { return id.x[$1] } +func pt2sec() { local i,j //from selpoint + i = point2sec.x[$1] + $o2 = sections.object(i) + j = $1 - $o2.id + if (i > 0) { j += 1 } + return j +} +func sec2pt() {local i + i = sections.object($1).id + $2 + if ($1 > 0) { + i -= 1 + } + return i +} +proc mark() {local i + print $o1, $2, iline, lines + i = id2index($2) + printf("%d %d %g %g: %s\n", i, iline.x[i], x.x[i], y.x[i], lines.object(i).s) + $o1.mark(x.x[i], y.x[i], "S", 12, 4, 1) +} + +proc helptxt() { + xpanel("SWC file filter characteristics") +xlabel(" Sections consist of unbranched sequences of points having") +xlabel("the same type. All sections connect from 0 to 1") +xlabel("(except those connecting to the first point") +xlabel("of the root section connect from 0 to 0).") +xlabel("With one exception, all child sections have as their first pt3d") +xlabel("point a copy of the parent point and the diameter of that first") +xlabel("point is the diameter of the parent point") +xlabel(" The exception, so that the error in area is not so") +xlabel("egregious, is that dendrite branches that connect to the soma") +xlabel("get a copy of the parent point as their first pt3d point but") +xlabel("the diameter of that point is the diameter of the second point") +xlabel(" The root section does not contain an extra parent point.") + xpanel(0) +} +endtemplate Import3d_SWC_read diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/io_tools.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/io_tools.py new file mode 100644 index 0000000..2ae6289 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/io_tools.py @@ -0,0 +1,38 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h + +from bmtk.simulator.core.io_tools import IOUtils + +pc = h.ParallelContext() +MPI_Rank = int(pc.id()) +MPI_Size = int(pc.nhost()) + + +class NEURONIOUtils(IOUtils): + def __init__(self): + super(NEURONIOUtils, self).__init__() + self.mpi_rank = MPI_Rank + self.mpi_size = MPI_Size + +io = NEURONIOUtils() diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/__init__.py new file mode 100644 index 0000000..7bb45dc --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/__init__.py @@ -0,0 +1,27 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .ecp import EcpMod +from .record_cellvars import MembraneReport, SomaReport, SectionReport +from .record_spikes import SpikesMod +from .xstim import XStimMod +from .save_synapses import SaveSynapses diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/ecp.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/ecp.py new file mode 100644 index 0000000..3ea1059 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/ecp.py @@ -0,0 +1,275 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import h5py +import math +import pandas as pd +from neuron import h +import numpy as np + +from bmtk.simulator.bionet.modules.sim_module import SimulatorMod +from bmtk.utils.sonata.utils import add_hdf5_magic, add_hdf5_version + + +pc = h.ParallelContext() +MPI_RANK = int(pc.id()) +N_HOSTS = int(pc.nhost()) + + +class EcpMod(SimulatorMod): + def __init__(self, tmp_dir, file_name, electrode_positions, contributions_dir, cells=[], variable_name='v', + electrode_channels=None): + self._ecp_output = file_name if os.path.isabs(file_name) else os.path.join(tmp_dir, file_name) + self._positions_file = electrode_positions + self._tmp_outputdir = tmp_dir + self._contributions_dir = contributions_dir if os.path.isabs(contributions_dir) else os.path.join(tmp_dir, contributions_dir) + self._cells = cells + self._rel = None + self._fih1 = None + self._rel_nsites = 0 + self._block_size = 0 + # self._biophys_gids = [] + self._saved_gids = {} + self._nsteps = 0 + + self._tstep = 0 # accumlative time step + # self._rel_time = 0 # + self._block_step = 0 # time step within the given block of time + self._tstep_start_block = 0 + self._data_block = None + self._cell_var_files = {} + + self._tmp_ecp_file = self._get_tmp_fname(MPI_RANK) + self._tmp_ecp_handle = None + # self._tmp_ecp_dataset = None + + self._local_gids = [] + + def _get_tmp_fname(self, rank): + return os.path.join(self._tmp_outputdir, 'tmp_{}_ecp.h5'.format(MPI_RANK)) + + def _create_ecp_file(self, sim): + dt = sim.dt + tstop = sim.tstop + self._nsteps = int(round(tstop/dt)) + + # create file to temporary store ecp data on each rank + self._tmp_ecp_handle = h5py.File(self._tmp_ecp_file, 'a') + self._tmp_ecp_handle.create_dataset('data', (self._nsteps, self._rel_nsites), maxshape=(None, self._rel_nsites), + chunks=True) + + # only the primary node will need to save the final ecp + if MPI_RANK == 0: + with h5py.File(self._ecp_output, 'w') as f5: + add_hdf5_magic(f5) + add_hdf5_version(f5) + f5.create_dataset('data', (self._nsteps, self._rel_nsites), maxshape=(None, self._rel_nsites), + chunks=True) + f5.attrs['dt'] = dt + f5.attrs['tstart'] = 0.0 + f5.attrs['tstop'] = tstop + + # Save channels. Current we record from all channels, may want to be more selective in the future. + f5.create_dataset('channel_id', data=np.arange(self._rel.nsites)) + + pc.barrier() + + def _create_cell_file(self, gid): + file_name = os.path.join(self._contributions_dir, '{}.h5'.format(int(gid))) + file_h5 = h5py.File(file_name, 'a') + self._cell_var_files[gid] = file_h5 + file_h5.create_dataset('data', (self._nsteps, self._rel_nsites), maxshape=(None, self._rel_nsites), chunks=True) + # self._cell_var_files[gid] = file_h5['ecp'] + + def _calculate_ecp(self, sim): + self._rel = RecXElectrode(self._positions_file) + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + #cell = sim.net.get_local_cell(gid) + # cell = sim.net.cells[gid] + self._rel.calc_transfer_resistance(gid, cell.get_seg_coords()) + + self._rel_nsites = self._rel.nsites + sim.h.cvode.use_fast_imem(1) # make i_membrane_ a range variable + + def set_pointers(): + for gid, cell in sim.net.get_local_cells().items(): + #for gid, cell in sim.net.local_cells.items(): + # for gid, cell in sim.net.cells.items(): + cell.set_im_ptr() + self._fih1 = sim.h.FInitializeHandler(0, set_pointers) + + def _save_block(self, interval): + """Add """ + itstart, itend = interval + self._tmp_ecp_handle['data'][itstart:itend, :] += self._data_block[0:(itend - itstart), :] + self._tmp_ecp_handle.flush() + self._data_block[:] = 0.0 + + def _save_ecp(self, sim): + """Save ECP from each rank to disk into a single file""" + block_size = sim.nsteps_block + nblocks, remain = divmod(self._nsteps, block_size) + ivals = [i*block_size for i in range(nblocks+1)] + if remain != 0: + ivals.append(self._nsteps) + + for rank in range(N_HOSTS): # iterate over the ranks + if rank == MPI_RANK: # wait until finished with a particular rank + with h5py.File(self._ecp_output, 'a') as ecp_f5: + for i in range(len(ivals)-1): + ecp_f5['data'][ivals[i]:ivals[i+1], :] += self._tmp_ecp_handle['data'][ivals[i]:ivals[i+1], :] + + pc.barrier() + + def _save_cell_vars(self, interval): + itstart, itend = interval + + for gid, data in self._saved_gids.items(): + h5_file = self._cell_var_files[gid] + h5_file['data'][itstart:itend, :] = data[0:(itend-itstart), :] + h5_file.flush() + data[:] = 0.0 + + def _delete_tmp_files(self): + if os.path.exists(self._tmp_ecp_file): + os.remove(self._tmp_ecp_file) + + def initialize(self, sim): + if self._contributions_dir and (not os.path.exists(self._contributions_dir)) and MPI_RANK == 0: + os.makedirs(self._contributions_dir) + pc.barrier() + + self._block_size = sim.nsteps_block + + # Get list of gids being recorded + selected_gids = set(sim.net.get_node_set(self._cells).gids()) + self._local_gids = list(set(sim.biophysical_gids) & selected_gids) + + self._calculate_ecp(sim) + self._create_ecp_file(sim) + + # ecp data + self._data_block = np.zeros((self._block_size, self._rel_nsites)) + + # create list of all cells whose ecp values will be saved separetly + self._saved_gids = {gid: np.empty((self._block_size, self._rel_nsites)) + for gid in self._local_gids} + for gid in self._saved_gids.keys(): + self._create_cell_file(gid) + + pc.barrier() + + def step(self, sim, tstep): + for gid in self._local_gids: # compute ecp only from the biophysical cells + cell = sim.net.get_cell_gid(gid) + #cell = sim.net.get_local_cell(gid) + # cell = sim.net.cells[gid] + im = cell.get_im() + tr = self._rel.get_transfer_resistance(gid) + ecp = np.dot(tr, im) + + if gid in self._saved_gids.keys(): + # save individual contribution + self._saved_gids[gid][self._block_step, :] = ecp + + # add to total ecp contribution + self._data_block[self._block_step, :] += ecp + + self._block_step += 1 + + def block(self, sim, block_interval): + self._save_block(block_interval) + # self._save_ecp(block_interval) + self._save_cell_vars(block_interval) + + self._block_step = 0 + self._tstep_start_block = self._tstep + + def finalize(self, sim): + if self._block_step > 0: + # just in case the simulation doesn't end on a block step + self.block(sim, (sim.n_steps - self._block_step, sim.n_steps)) + + self._save_ecp(sim) + self._delete_tmp_files() + pc.barrier() + + +class RecXElectrode(object): + """Extracellular electrode + + """ + + def __init__(self, positions): + """Create an array""" + # self.conf = conf + electrode_file = positions # self.conf["recXelectrode"]["positions"] + + # convert coordinates to ndarray, The first index is xyz and the second is the channel number + el_df = pd.read_csv(electrode_file, sep=' ') + self.pos = el_df[['x_pos', 'y_pos', 'z_pos']].T.values + #self.pos = el_df.as_matrix(columns=['x_pos', 'y_pos', 'z_pos']).T + self.nsites = self.pos.shape[1] + # self.conf['run']['nsites'] = self.nsites # add to the config + self.transfer_resistances = {} # V_e = transfer_resistance*Im + + def drift(self): + # will include function to model electrode drift + pass + + def get_transfer_resistance(self, gid): + return self.transfer_resistances[gid] + + def calc_transfer_resistance(self, gid, seg_coords): + """Precompute mapping from segment to electrode locations""" + sigma = 0.3 # mS/mm + + r05 = (seg_coords['p0'] + seg_coords['p1']) / 2 + dl = seg_coords['p1'] - seg_coords['p0'] + + nseg = r05.shape[1] + + tr = np.zeros((self.nsites, nseg)) + + for j in range(self.nsites): # calculate mapping for each site on the electrode + rel = np.expand_dims(self.pos[:, j], axis=1) # coordinates of a j-th site on the electrode + rel_05 = rel - r05 # distance between electrode and segment centers + + # compute dot product column-wise, the resulting array has as many columns as original + r2 = np.einsum('ij,ij->j', rel_05, rel_05) + + # compute dot product column-wise, the resulting array has as many columns as original + rlldl = np.einsum('ij,ij->j', rel_05, dl) + dlmag = np.linalg.norm(dl, axis=0) # length of each segment + rll = abs(rlldl / dlmag) # component of r parallel to the segment axis it must be always positive + rT2 = r2 - rll ** 2 # square of perpendicular component + up = rll + dlmag / 2 + low = rll - dlmag / 2 + num = up + np.sqrt(up ** 2 + rT2) + den = low + np.sqrt(low ** 2 + rT2) + tr[j, :] = np.log(num / den) / dlmag # units of (um) use with im_ (total seg current) + np.copyto(tr[j, :], 0, where=(dlmag == 0)) # zero out stub segments + + tr *= 1 / (4 * math.pi * sigma) + self.transfer_resistances[gid] = tr diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/record_cellvars.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/record_cellvars.py new file mode 100644 index 0000000..5a1d3a3 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/record_cellvars.py @@ -0,0 +1,204 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import h5py +from neuron import h + +from bmtk.simulator.bionet.modules.sim_module import SimulatorMod +from bmtk.simulator.bionet.io_tools import io + +from bmtk.utils.io import cell_vars +try: + # Check to see if h5py is built to run in parallel + if h5py.get_config().mpi: + MembraneRecorder = cell_vars.CellVarRecorderParallel + else: + MembraneRecorder = cell_vars.CellVarRecorder + +except Exception as e: + MembraneRecorder = cell_vars.CellVarRecorder + +MembraneRecorder._io = io + +pc = h.ParallelContext() +MPI_RANK = int(pc.id()) +N_HOSTS = int(pc.nhost()) + + +def first_element(lst): + return lst[0] + + +transforms_table = { + 'first_element': first_element, +} + + +class MembraneReport(SimulatorMod): + def __init__(self, tmp_dir, file_name, variable_name, cells, sections='all', buffer_data=True, transform={}): + """Module used for saving NEURON cell properities at each given step of the simulation. + + :param tmp_dir: + :param file_name: name of h5 file to save variable. + :param variables: list of cell variables to record + :param gids: list of gids to to record + :param sections: + :param buffer_data: Set to true then data will be saved to memory until written to disk during each block, reqs. + more memory but faster. Set to false and data will be written to disk on each step (default: True) + """ + self._all_variables = list(variable_name) + self._variables = list(variable_name) + self._transforms = {} + # self._special_variables = [] + for var_name, fnc_name in transform.items(): + if fnc_name is None or len(fnc_name) == 0: + del self._transforms[var_name] + continue + + fnc = transforms_table[fnc_name] + self._transforms[var_name] = fnc + self._variables.remove(var_name) + + self._tmp_dir = tmp_dir + + self._file_name = file_name if os.path.isabs(file_name) else os.path.join(tmp_dir, file_name) + self._all_gids = cells + self._local_gids = [] + self._sections = sections + + self._var_recorder = MembraneRecorder(self._file_name, self._tmp_dir, self._all_variables, + buffer_data=buffer_data, mpi_rank=MPI_RANK, mpi_size=N_HOSTS) + + self._gid_list = [] # list of all gids that will have their variables saved + self._data_block = {} # table of variable data indexed by [gid][variable] + self._block_step = 0 # time step within a given block + + def _get_gids(self, sim): + # get list of gids to save. Will only work for biophysical cells saved on the current MPI rank + selected_gids = set(sim.net.get_node_set(self._all_gids).gids()) + self._local_gids = list(set(sim.biophysical_gids) & selected_gids) + + def _save_sim_data(self, sim): + self._var_recorder.tstart = 0.0 + self._var_recorder.tstop = sim.tstop + self._var_recorder.dt = sim.dt + + def initialize(self, sim): + self._get_gids(sim) + self._save_sim_data(sim) + + # TODO: get section by name and/or list of section ids + # Build segment/section list + for gid in self._local_gids: + sec_list = [] + seg_list = [] + cell = sim.net.get_cell_gid(gid) + cell.store_segments() + for sec_id, sec in enumerate(cell.get_sections()): + for seg in sec: + # TODO: Make sure the seg has the recorded variable(s) + sec_list.append(sec_id) + seg_list.append(seg.x) + + self._var_recorder.add_cell(gid, sec_list, seg_list) + + self._var_recorder.initialize(sim.n_steps, sim.nsteps_block) + + def step(self, sim, tstep): + # save all necessary cells/variables at the current time-step into memory + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + + for var_name in self._variables: + seg_vals = [getattr(seg, var_name) for seg in cell.get_segments()] + self._var_recorder.record_cell(gid, var_name, seg_vals, tstep) + + for var_name, fnc in self._transforms.items(): + seg_vals = [fnc(getattr(seg, var_name)) for seg in cell.get_segments()] + self._var_recorder.record_cell(gid, var_name, seg_vals, tstep) + + self._block_step += 1 + + def block(self, sim, block_interval): + # write variables in memory to file + self._var_recorder.flush() + + def finalize(self, sim): + # TODO: Build in mpi signaling into var_recorder + pc.barrier() + self._var_recorder.close() + + pc.barrier() + self._var_recorder.merge() + + +class SomaReport(MembraneReport): + """Special case for when only needing to save the soma variable""" + def __init__(self, tmp_dir, file_name, variable_name, cells, sections='soma', buffer_data=True, transform={}): + super(SomaReport, self).__init__(tmp_dir=tmp_dir, file_name=file_name, variable_name=variable_name, cells=cells, + sections=sections, buffer_data=buffer_data, transform=transform) + + def initialize(self, sim): + self._get_gids(sim) + self._save_sim_data(sim) + + for gid in self._local_gids: + self._var_recorder.add_cell(gid, [0], [0.5]) + self._var_recorder.initialize(sim.n_steps, sim.nsteps_block) + + def step(self, sim, tstep, rel_time=0.0): + # save all necessary cells/variables at the current time-step into memory + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + for var_name in self._variables: + var_val = getattr(cell.hobj.soma[0](0.5), var_name) + self._var_recorder.record_cell(gid, var_name, [var_val], tstep) + + for var_name, fnc in self._transforms.items(): + var_val = getattr(cell.hobj.soma[0](0.5), var_name) + new_val = fnc(var_val) + self._var_recorder.record_cell(gid, var_name, [new_val], tstep) + + self._block_step += 1 + +class SectionReport(MembraneReport): + """For variables like im which have one value per section, not segment""" + + def initialize(self, sim): + self._get_gids(sim) + self._save_sim_data(sim) + + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + sec_list = range(len(cell.get_sections())) + self._var_recorder.add_cell(gid, sec_list, sec_list) + + self._var_recorder.initialize(sim.n_steps, sim.nsteps_block) + + def step(self, sim, tstep): + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + im_vals = cell.get_im() + self._var_recorder.record_cell(gid, 'im', im_vals, tstep) + + self._block_step += 1 diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/record_spikes.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/record_spikes.py new file mode 100644 index 0000000..4c8751b --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/record_spikes.py @@ -0,0 +1,94 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import csv +import h5py +import numpy as np +from bmtk.simulator.bionet.modules.sim_module import SimulatorMod +from bmtk.utils.io.spike_trains import SpikeTrainWriter + +from neuron import h + + +pc = h.ParallelContext() +MPI_RANK = int(pc.id()) +N_HOSTS = int(pc.nhost()) + + +class SpikesMod(SimulatorMod): + """Module use for saving spikes + + """ + + def __init__(self, tmp_dir, spikes_file_csv=None, spikes_file=None, spikes_file_nwb=None, spikes_sort_order=None): + # TODO: Have option to turn off caching spikes to csv. + def _file_path(file_name): + if file_name is None: + return None + return file_name if os.path.isabs(file_name) else os.path.join(tmp_dir, file_name) + + self._csv_fname = _file_path(spikes_file_csv) + self._save_csv = spikes_file_csv is not None + + self._h5_fname = _file_path(spikes_file) + self._save_h5 = spikes_file is not None + + self._nwb_fname = _file_path(spikes_file_nwb) + self._save_nwb = spikes_file_nwb is not None + + self._tmpdir = tmp_dir + self._sort_order = spikes_sort_order + + self._spike_writer = SpikeTrainWriter(tmp_dir=tmp_dir, mpi_rank=MPI_RANK, mpi_size=N_HOSTS) + + def initialize(self, sim): + # TODO: since it's possible that other modules may need to access spikes, set_spikes_recordings() should + # probably be called in the simulator itself. + sim.set_spikes_recording() + + def block(self, sim, block_interval): + # take spikes from Simulator spikes vector and save to the tmp file + for gid, tVec in sim.spikes_table.items(): + for t in tVec: + self._spike_writer.add_spike(time=t, gid=gid) + + pc.barrier() # wait until all ranks have been saved + sim.set_spikes_recording() # reset recording vector + + def finalize(self, sim): + self._spike_writer.flush() + pc.barrier() + + if self._save_csv: + self._spike_writer.to_csv(self._csv_fname, sort_order=self._sort_order) + pc.barrier() + + if self._save_h5: + self._spike_writer.to_hdf5(self._h5_fname, sort_order=self._sort_order) + pc.barrier() + + if self._save_nwb: + self._spike_writer.to_nwb(self._nwb_fname, sort_order=self._sort_order) + pc.barrier() + + self._spike_writer.close() diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/save_synapses.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/save_synapses.py new file mode 100644 index 0000000..396aa7d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/save_synapses.py @@ -0,0 +1,235 @@ +import os +import csv +import h5py +import numpy as np +from neuron import h + +from .sim_module import SimulatorMod +from bmtk.simulator.bionet.biocell import BioCell +from bmtk.simulator.bionet.io_tools import io +from bmtk.simulator.bionet.pointprocesscell import PointProcessCell + + +pc = h.ParallelContext() +MPI_RANK = int(pc.id()) +N_HOSTS = int(pc.nhost()) + + +class SaveSynapses(SimulatorMod): + def __init__(self, network_dir, single_file=False, **params): + self._network_dir = network_dir + self._virt_lookup = {} + self._gid_lookup = {} + self._sec_lookup = {} + if not os.path.exists(network_dir): + os.makedirs(network_dir) + + if N_HOSTS > 1: + io.log_exception('save_synapses module is not current supported with mpi') + + self._syn_writer = ConnectionWriter(network_dir) + + def _print_nc(self, nc, src_nid, trg_nid, cell, src_pop, trg_pop, edge_type_id): + if isinstance(cell, BioCell): + sec_x = nc.postloc() + sec = h.cas() + sec_id = self._sec_lookup[cell.gid][sec] #cell.get_section_id(sec) + h.pop_section() + self._syn_writer.add_bio_conn(edge_type_id, src_nid, src_pop, trg_nid, trg_pop, nc.weight[0], sec_id, sec_x) + # print '{} ({}) <-- {} ({}), {}, {}, {}, {}'.format(trg_nid, trg_pop, src_nid, src_pop, nc.weight[0], nc.delay, sec_id, sec_x) + + else: + self._syn_writer.add_point_conn(edge_type_id, src_nid, src_pop, trg_nid, trg_pop, nc.weight[0]) + #print '{} ({}) <-- {} ({}), {}, {}'.format(trg_nid, trg_pop, src_nid, src_pop, nc.weight[0], nc.delay) + + + def initialize(self, sim): + io.log_info('Saving network connections. This may take a while.') + + # Need a way to look up virtual nodes from nc.pre() + for pop_name, nodes_table in sim.net._virtual_nodes.items(): + for node_id, virt_node in nodes_table.items(): + self._virt_lookup[virt_node.hobj] = (pop_name, node_id) + + # Need to figure out node_id and pop_name from nc.srcgid() + for node_pop in sim.net.node_populations: + pop_name = node_pop.name + for node in node_pop[0::1]: + if node.model_type != 'virtual': + self._gid_lookup[node.gid] = (pop_name, node.node_id) + + for gid, cell in sim.net.get_local_cells().items(): + trg_pop, trg_id = self._gid_lookup[gid] + if isinstance(cell, BioCell): + #from pprint import pprint + #pprint({i: s_name for i, s_name in enumerate(cell.get_sections())}) + #exit() + # sections = cell._syn_seg_ix + self._sec_lookup[gid] = {sec_name: sec_id for sec_id, sec_name in enumerate(cell.get_sections_id())} + + else: + sections = [-1]*len(cell.netcons) + + for nc, edge_type_id in zip(cell.netcons, cell._edge_type_ids): + src_gid = int(nc.srcgid()) + if src_gid == -1: + # source is a virtual node + src_pop, src_id = self._virt_lookup[nc.pre()] + else: + src_pop, src_id = self._gid_lookup[src_gid] + + self._print_nc(nc, src_id, trg_id, cell, src_pop, trg_pop, edge_type_id) + + self._syn_writer.close() + io.log_info(' Done saving network connections.') + + +class ConnectionWriter(object): + class H5Index(object): + def __init__(self, network_dir, src_pop, trg_pop): + # TODO: Merge with NetworkBuilder code for building SONATA files + self._nsyns = 0 + self._n_biosyns = 0 + self._n_pointsyns = 0 + self._block_size = 5 + + self._pop_name = '{}_{}'.format(src_pop, trg_pop) + self._h5_file = h5py.File(os.path.join(network_dir, '{}_edges.h5'.format(self._pop_name)), 'w') + self._pop_root = self._h5_file.create_group('/edges/{}'.format(self._pop_name)) + self._pop_root.create_dataset('edge_group_id', (self._block_size, ), dtype=np.uint16, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root.create_dataset('source_node_id', (self._block_size, ), dtype=np.uint64, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root['source_node_id'].attrs['node_population'] = src_pop + self._pop_root.create_dataset('target_node_id', (self._block_size, ), dtype=np.uint64, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root['target_node_id'].attrs['node_population'] = trg_pop + self._pop_root.create_dataset('edge_type_id', (self._block_size, ), dtype=np.uint32, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root.create_dataset('0/syn_weight', (self._block_size, ), dtype=np.float, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root.create_dataset('0/sec_id', (self._block_size, ), dtype=np.uint64, + chunks=(self._block_size, ), maxshape=(None, )) + self._pop_root.create_dataset('0/sec_x', (self._block_size, ), chunks=(self._block_size, ), + maxshape=(None, ), dtype=np.float) + self._pop_root.create_dataset('1/syn_weight', (self._block_size, ), dtype=np.float, + chunks=(self._block_size, ), maxshape=(None, )) + + def _add_conn(self, edge_type_id, src_id, trg_id, grp_id): + self._pop_root['edge_type_id'][self._nsyns] = edge_type_id + self._pop_root['source_node_id'][self._nsyns] = src_id + self._pop_root['target_node_id'][self._nsyns] = trg_id + self._pop_root['edge_group_id'][self._nsyns] = grp_id + + self._nsyns += 1 + if self._nsyns % self._block_size == 0: + self._pop_root['edge_type_id'].resize((self._nsyns + self._block_size,)) + self._pop_root['source_node_id'].resize((self._nsyns + self._block_size, )) + self._pop_root['target_node_id'].resize((self._nsyns + self._block_size, )) + self._pop_root['edge_group_id'].resize((self._nsyns + self._block_size, )) + + def add_bio_conn(self, edge_type_id, src_id, trg_id, syn_weight, sec_id, sec_x): + self._add_conn(edge_type_id, src_id, trg_id, 0) + self._pop_root['0/syn_weight'][self._n_biosyns] = syn_weight + self._pop_root['0/sec_id'][self._n_biosyns] = sec_id + self._pop_root['0/sec_x'][self._n_biosyns] = sec_x + + self._n_biosyns += 1 + if self._n_biosyns % self._block_size == 0: + self._pop_root['0/syn_weight'].resize((self._n_biosyns + self._block_size, )) + self._pop_root['0/sec_id'].resize((self._n_biosyns + self._block_size, )) + self._pop_root['0/sec_x'].resize((self._n_biosyns + self._block_size, )) + + def add_point_conn(self, edge_type_id, src_id, trg_id, syn_weight): + self._add_conn(edge_type_id, src_id, trg_id, 1) + self._pop_root['1/syn_weight'][self._n_pointsyns] = syn_weight + + self._n_pointsyns += 1 + if self._n_pointsyns % self._block_size == 0: + self._pop_root['1/syn_weight'].resize((self._n_pointsyns + self._block_size, )) + + def clean_ends(self): + self._pop_root['source_node_id'].resize((self._nsyns,)) + self._pop_root['target_node_id'].resize((self._nsyns,)) + self._pop_root['edge_group_id'].resize((self._nsyns,)) + self._pop_root['edge_type_id'].resize((self._nsyns,)) + + self._pop_root['0/syn_weight'].resize((self._n_biosyns,)) + self._pop_root['0/sec_id'].resize((self._n_biosyns,)) + self._pop_root['0/sec_x'].resize((self._n_biosyns,)) + + self._pop_root['1/syn_weight'].resize((self._n_pointsyns,)) + + eg_ds = self._pop_root.create_dataset('edge_group_index', (self._nsyns, ), dtype=np.uint64) + bio_count, point_count = 0, 0 + for idx, grp_id in enumerate(self._pop_root['edge_group_id']): + if grp_id == 0: + eg_ds[idx] = bio_count + bio_count += 1 + elif grp_id == 1: + eg_ds[idx] = point_count + point_count += 1 + + self._create_index('target') + + def _create_index(self, index_type='target'): + if index_type == 'target': + edge_nodes = np.array(self._pop_root['target_node_id'], dtype=np.int64) + output_grp = self._pop_root.create_group('indicies/target_to_source') + elif index_type == 'source': + edge_nodes = np.array(self._pop_root['source_node_id'], dtype=np.int64) + output_grp = self._pop_root.create_group('indicies/source_to_target') + + edge_nodes = np.append(edge_nodes, [-1]) + n_targets = np.max(edge_nodes) + ranges_list = [[] for _ in xrange(n_targets + 1)] + + n_ranges = 0 + begin_index = 0 + cur_trg = edge_nodes[begin_index] + for end_index, trg_gid in enumerate(edge_nodes): + if cur_trg != trg_gid: + ranges_list[cur_trg].append((begin_index, end_index)) + cur_trg = int(trg_gid) + begin_index = end_index + n_ranges += 1 + + node_id_to_range = np.zeros((n_targets + 1, 2)) + range_to_edge_id = np.zeros((n_ranges, 2)) + range_index = 0 + for node_index, trg_ranges in enumerate(ranges_list): + if len(trg_ranges) > 0: + node_id_to_range[node_index, 0] = range_index + for r in trg_ranges: + range_to_edge_id[range_index, :] = r + range_index += 1 + node_id_to_range[node_index, 1] = range_index + + output_grp.create_dataset('range_to_edge_id', data=range_to_edge_id, dtype='uint64') + output_grp.create_dataset('node_id_to_range', data=node_id_to_range, dtype='uint64') + + def __init__(self, network_dir): + self._network_dir = network_dir + self._pop_groups = {} + + def _group_key(self, src_pop, trg_pop): + return (src_pop, trg_pop) + + def _get_edge_group(self, src_pop, trg_pop): + grp_key = self._group_key(src_pop, trg_pop) + if grp_key not in self._pop_groups: + self._pop_groups[grp_key] = self.H5Index(self._network_dir, src_pop, trg_pop) + + return self._pop_groups[grp_key] + + def add_bio_conn(self, edge_type_id, src_id, src_pop, trg_id, trg_pop, syn_weight, sec_id, sec_x): + h5_grp = self._get_edge_group(src_pop, trg_pop) + h5_grp.add_bio_conn(edge_type_id, src_id, trg_id, syn_weight, sec_id, sec_x) + + def add_point_conn(self, edge_type_id, src_id, src_pop, trg_id, trg_pop, syn_weight): + h5_grp = self._get_edge_group(src_pop, trg_pop) + h5_grp.add_point_conn(edge_type_id, src_id, trg_id, syn_weight) + + def close(self): + for _, h5index in self._pop_groups.items(): + h5index.clean_ends() diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/sim_module.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/sim_module.py new file mode 100644 index 0000000..f04e469 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/sim_module.py @@ -0,0 +1,72 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class SimulatorMod(object): + """Class for writing custom bionet functions that will be called during the simulation. To use overwrite one or + more of the following methods in a subclass, and bionet will call the function at the appropiate time. + + To call during a simulation: + ... + sim = Simulation(...) + mymod = MyModule(...) + sim.add_mod(mymod) + sim.run() + + """ + + def initialize(self, sim): + """Will be called once at the beginning of the simulation run, after the network and simulation parameters have + all been finalized. + + :param sim: Simulation object + """ + pass + + def step(self, sim, tstep): + """Called on every single time step (dt). + + The step method is used for anything that should be recorded or changed continously. dt is determined during + the setup, and the sim parameter can be used to access simulation, network and individual cell properties + + :param sim: Simulation object. + :param tstep: The decrete time-step + """ + pass + + def block(self, sim, block_interval): + """This method is called once after every block of time, as specified by the configuration. + + Unlike the step method which is called during every time-step, the block method will typically be called only a + few times over the entire simulation. The block method is preferable for accessing and saving to the disk, + summing up existing data, or simular functionality + + :param sim: Simulation object + :param block_interval: The time interval (tstep_start, tstep_end) for which the block is being called on. + """ + pass + + def finalize(self, sim): + """Call once at the very end of the simulation. + + :param sim: Simulation object + """ + pass diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/xstim.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/xstim.py new file mode 100644 index 0000000..f2192ff --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/xstim.py @@ -0,0 +1,163 @@ +import os +import math +import pandas as pd +import numpy as np +import six +from neuron import h + +from bmtk.simulator.bionet.modules.sim_module import SimulatorMod +from bmtk.simulator.bionet.modules.xstim_waveforms import stimx_waveform_factory +from bmtk.simulator.bionet.utils import rotation_matrix +from bmtk.simulator.bionet.io_tools import io + + +class XStimMod(SimulatorMod): + def __init__(self, positions_file, waveform, mesh_files_dir=None, cells=None, set_nrn_mechanisms=True, + node_set=None): + self._positions_file = positions_file + self._mesh_files_dir = mesh_files_dir if mesh_files_dir is not None \ + else os.path.dirname(os.path.realpath(self._positions_file)) + + self._waveform = waveform # TODO: Check if waveform is a file or dict and load it appropiately + + self._set_nrn_mechanisms = set_nrn_mechanisms + self._electrode = None + self._cells = cells + self._local_gids = [] + self._fih = None + + #def __set_extracellular_mechanism(self): + # for gid in self._local_gids: + + def initialize(self, sim): + if self._cells is None: + # if specific gids not listed just get all biophysically detailed cells on this rank + self._local_gids = sim.biophysical_gids + else: + # get subset of selected gids only on this rank + self._local_gids = list(set(sim.local_gids) & set(self._all_gids)) + + self._electrode = StimXElectrode(self._positions_file, self._waveform, self._mesh_files_dir, sim.dt) + for gid in self._local_gids: + # cell = sim.net.get_local_cell(gid) + cell = sim.net.get_cell_gid(gid) + cell.setup_xstim(self._set_nrn_mechanisms) + self._electrode.set_transfer_resistance(gid, cell.get_seg_coords()) + + def set_pointers(): + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + #cell = sim.net.get_local_cell(gid) + cell.set_ptr2e_extracellular() + + self._fih = sim.h.FInitializeHandler(0, set_pointers) + + def step(self, sim, tstep): + for gid in self._local_gids: + cell = sim.net.get_cell_gid(gid) + # Use tstep +1 to match isee-engine existing results. This will make it so that it begins a step earlier + # than if using just tstep. + self._electrode.calculate_waveforms(tstep+1) + vext_vec = self._electrode.get_vext(gid) + cell.set_e_extracellular(vext_vec) + + +class StimXElectrode(object): + """ + Extracellular Stimulating electrode + """ + def __init__(self, positions_file, waveform, mesh_files_dir, dt): + self._dt = dt + self._mesh_files_dir = mesh_files_dir + + stimelectrode_position_df = pd.read_csv(positions_file, sep=' ') + + self.elmesh_files = stimelectrode_position_df['electrode_mesh_file'] + self.elpos = stimelectrode_position_df[['pos_x', 'pos_y', 'pos_z']].T.values + self.elrot = stimelectrode_position_df[['rotation_x', 'rotation_y', 'rotation_z']].values + self.elnsites = self.elpos.shape[1] # Number of electrodes in electrode file + self.waveform = stimx_waveform_factory(waveform) + + self.trans_X = {} # mapping segment coordinates + self.waveform_amplitude = [] + self.el_mesh = {} + self.el_mesh_size = [] + + self.read_electrode_mesh() + self.rotate_the_electrodes() + self.place_the_electrodes() + + def read_electrode_mesh(self): + el_counter = 0 + for mesh_file in self.elmesh_files: + file_path = mesh_file if os.path.isabs(mesh_file) else os.path.join(self._mesh_files_dir, mesh_file) + mesh = pd.read_csv(file_path, sep=" ") + mesh_size = mesh.shape[0] + self.el_mesh_size.append(mesh_size) + + self.el_mesh[el_counter] = np.zeros((3, mesh_size)) + self.el_mesh[el_counter][0] = mesh['x_pos'] + self.el_mesh[el_counter][1] = mesh['y_pos'] + self.el_mesh[el_counter][2] = mesh['z_pos'] + el_counter += 1 + + def place_the_electrodes(self): + + transfer_vector = np.zeros((self.elnsites, 3)) + + for el in range(self.elnsites): + mesh_mean = np.mean(self.el_mesh[el], axis=1) + transfer_vector[el] = self.elpos[:, el] - mesh_mean[:] + + for el in range(self.elnsites): + new_mesh = self.el_mesh[el].T + transfer_vector[el] + self.el_mesh[el] = new_mesh.T + + def rotate_the_electrodes(self): + for el in range(self.elnsites): + phi_x = self.elrot[el][0] + phi_y = self.elrot[el][1] + phi_z = self.elrot[el][2] + + rot_x = rotation_matrix([1, 0, 0], phi_x) + rot_y = rotation_matrix([0, 1, 0], phi_y) + rot_z = rotation_matrix([0, 0, 1], phi_z) + rot_xy = rot_x.dot(rot_y) + rot_xyz = rot_xy.dot(rot_z) + new_mesh = np.dot(rot_xyz, self.el_mesh[el]) + self.el_mesh[el] = new_mesh + + def set_transfer_resistance(self, gid, seg_coords): + + rho = 300.0 # ohm cm + r05 = seg_coords['p05'] + nseg = r05.shape[1] + cell_map = np.zeros((self.elnsites, nseg)) + for el in six.moves.range(self.elnsites): + + mesh_size = self.el_mesh_size[el] + + for k in range(mesh_size): + + rel = np.expand_dims(self.el_mesh[el][:, k], axis=1) + rel_05 = rel - r05 + r2 = np.einsum('ij,ij->j', rel_05, rel_05) + r = np.sqrt(r2) + if not all(i >= 10 for i in r): + io.log_exception('External electrode is too close') + cell_map[el, :] += 1. / r + + cell_map *= (rho / (4 * math.pi)) * 0.01 + self.trans_X[gid] = cell_map + + def calculate_waveforms(self, tstep): + simulation_time = self._dt * tstep + # copies waveform elnsites times (homogeneous) + self.waveform_amplitude = np.zeros(self.elnsites) + self.waveform.calculate(simulation_time) + + def get_vext(self, gid): + waveform_per_mesh = np.divide(self.waveform_amplitude, self.el_mesh_size) + v_extracellular = np.dot(waveform_per_mesh, self.trans_X[gid]) * 1E6 + vext_vec = h.Vector(v_extracellular) + + return vext_vec diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/xstim_waveforms.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/xstim_waveforms.py new file mode 100644 index 0000000..86e204d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/modules/xstim_waveforms.py @@ -0,0 +1,127 @@ +import os +import numpy as np +import pandas as pd +import json +from six import string_types + +from bmtk.simulator.bionet.io_tools import io + +class BaseWaveform(object): + """Abstraction of waveform class to ensure calculate method is implemented""" + def calculate(self, simulation_time): + raise NotImplementedError("Implement specific waveform calculation") + + +class BaseWaveformType(object): + """Specific waveform type""" + def __init__(self, waveform_config): + self.amp = float(waveform_config["amp"]) # units? mA? + self.delay = float(waveform_config["del"]) # ms + self.duration = float(waveform_config["dur"]) # ms + + def is_active(self, simulation_time): + stop_time = self.delay + self.duration + return self.delay < simulation_time < stop_time + + +class WaveformTypeDC(BaseWaveformType, BaseWaveform): + """DC (step) waveform""" + def __init__(self, waveform_config): + super(WaveformTypeDC, self).__init__(waveform_config) + + def calculate(self, t): # TODO better name + if self.is_active(t): + return self.amp + else: + return 0 + + +class WaveformTypeSin(BaseWaveformType, BaseWaveform): + """Sinusoidal waveform""" + def __init__(self, waveform_config): + super(WaveformTypeSin, self).__init__(waveform_config) + self.freq = float(waveform_config["freq"]) # Hz + self.phase_offset = float(waveform_config.get("phase", np.pi)) # radians, optional + self.amp_offset = float(waveform_config.get("offset", 0)) # units? mA? optional + + def calculate(self, t): # TODO better name + if self.is_active(t): + f = self.freq / 1000. # Hz to mHz + a = self.amp + return a * np.sin(2 * np.pi * f * t + self.phase_offset) + self.amp_offset + else: + return 0 + + +class WaveformCustom(BaseWaveform): + """Custom waveform defined by csv file""" + def __init__(self, waveform_file): + self.definition = pd.read_csv(waveform_file, sep='\t') + + def calculate(self, t): + return np.interp(t, self.definition["time"], self.definition["amplitude"]) + + +class ComplexWaveform(BaseWaveform): + """Superposition of simple waveforms""" + def __init__(self, el_collection): + self.electrodes = el_collection + + def calculate(self, t): + val = 0 + for el in self.electrodes: + val += el.calculate(t) + + return val + + +# mapping from 'shape' code to subclass, always lowercase +shape_classes = { + 'dc': WaveformTypeDC, + 'sin': WaveformTypeSin, +} + + +def stimx_waveform_factory(waveform): + """ + Factory to create correct waveform class based on conf. + Supports json config in conf as well as string pointer to a file. + :rtype: BaseWaveformType + """ + if isinstance(waveform, string_types): + # if waveform_conf is str or unicode assume to be name of file in stim_dir + # waveform_conf = str(waveform_conf) # make consistent + file_ext = os.path.splitext(waveform) + if file_ext == 'csv': + return WaveformCustom(waveform) + + elif file_ext == 'json': + with open(waveform, 'r') as f: + waveform = json.load(f) + else: + io.log_warning('Unknwon filetype for waveform') + + shape_key = waveform["shape"].lower() + + if shape_key not in shape_classes: + io.log_warning("Waveform shape not known") # throw error? + + Constructor = shape_classes[shape_key] + return Constructor(waveform) + + +def iclamp_waveform_factory(conf): + """ + Factory to create correct waveform class based on conf. + Supports json config in conf as well as string pointer to a file. + :rtype: BaseWaveformType + """ + iclamp_waveform_conf = conf["iclamp"] + + shape_key = iclamp_waveform_conf["shape"].lower() + + if shape_key not in shape_classes: + io.log_warning('iclamp waveform shape not known') # throw error? + + Constructor = shape_classes[shape_key] + return Constructor(iclamp_waveform_conf) \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/morphology.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/morphology.py new file mode 100644 index 0000000..b0085fc --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/morphology.py @@ -0,0 +1,245 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from neuron import h + + +pc = h.ParallelContext() # object to access MPI methods + + +class Morphology(object): + """Methods for processing morphological data""" + def __init__(self, hobj): + """reuse hoc object from one of the cells which share the same morphology/model""" + self.hobj = hobj + self.sec_type_swc = {'soma': 1, 'somatic': 1, # convert section name and section list names + 'axon': 2, 'axonal': 2, # into a consistent swc notation + 'dend': 3, 'basal': 3, + 'apic': 4, 'apical': 4} + self.nseg = self.get_nseg() + self._segments = {} + + def get_nseg(self): + nseg = 0 + for sec in self.hobj.all: + nseg += sec.nseg # get the total # of segments in the cell + return nseg + + def get_soma_pos(self): + n3dsoma = 0 + r3dsoma = np.zeros(3) + for sec in self.hobj.somatic: + n3d = int(h.n3d()) # get number of n3d points in each section + r3d = np.zeros((3, n3d)) # to hold locations of 3D morphology for the current section + n3dsoma += n3d + + for i in range(n3d): + r3dsoma[0] += h.x3d(i) + r3dsoma[1] += h.y3d(i) + r3dsoma[2] += h.z3d(i) + + r3dsoma /= n3dsoma + return r3dsoma + + def calc_seg_coords(self): + """Calculate segment coordinates from 3d point coordinates""" + ix = 0 # segment index + + p3dsoma = self.get_soma_pos() + self.psoma = p3dsoma + + p0 = np.zeros((3, self.nseg)) # hold the coordinates of segment starting points + p1 = np.zeros((3, self.nseg)) # hold the coordinates of segment end points + p05 = np.zeros((3, self.nseg)) + d0 = np.zeros(self.nseg) + d1 = np.zeros(self.nseg) + + for sec in self.hobj.all: + n3d = int(h.n3d()) # get number of n3d points in each section + p3d = np.zeros((3, n3d)) # to hold locations of 3D morphology for the current section + l3d = np.zeros(n3d) # to hold locations of 3D morphology for the current section + diam3d = np.zeros(n3d) # to diameters + + for i in range(n3d): + p3d[0, i] = h.x3d(i) - p3dsoma[0] + p3d[1, i] = h.y3d(i) - p3dsoma[1] # shift coordinates such to place soma at the origin. + p3d[2, i] = h.z3d(i) - p3dsoma[2] + diam3d[i] = h.diam3d(i) + l3d[i] = h.arc3d(i) + + l3d /= sec.L # normalize + nseg = sec.nseg + + l0 = np.zeros(nseg) # keep range of segment starting point + l1 = np.zeros(nseg) # keep range of segment ending point + l05 = np.zeros(nseg) + + for iseg, seg in enumerate(sec): + l0[iseg] = seg.x - 0.5*1/nseg # x (normalized distance along the section) for the beginning of the segment + l1[iseg] = seg.x + 0.5*1/nseg # x for the end of the segment + l05[iseg] = seg.x + + if n3d != 0: + p0[0, ix:ix+nseg] = np.interp(l0, l3d, p3d[0, :]) + p0[1, ix:ix+nseg] = np.interp(l0, l3d, p3d[1, :]) + p0[2, ix:ix+nseg] = np.interp(l0, l3d, p3d[2, :]) + d0[ix:ix+nseg] = np.interp(l0, l3d, diam3d[:]) + + p1[0, ix:ix+nseg] = np.interp(l1, l3d, p3d[0, :]) + p1[1, ix:ix+nseg] = np.interp(l1, l3d, p3d[1, :]) + p1[2, ix:ix+nseg] = np.interp(l1, l3d, p3d[2, :]) + d1[ix:ix+nseg] = np.interp(l1, l3d, diam3d[:]) + + p05[0,ix:ix+nseg] = np.interp(l05, l3d, p3d[0,:]) + p05[1,ix:ix+nseg] = np.interp(l05, l3d, p3d[1,:]) + p05[2,ix:ix+nseg] = np.interp(l05, l3d, p3d[2,:]) + else: + # If we are dealing with a stub axon, this compartment + # will be zero'd out in the calculation of transfer + # resistance in modules/ecp.py + + if sec not in self.hobj.axonal: + raise Exception("Non-axonal section with 0 3d points (stub)") + + if nseg != 1: + raise Exception("in calc_seg_coords(), n3d = 0, but nseg != 1") + + ix += nseg + + self.seg_coords = {} + + self.seg_coords['p0'] = p0 + self.seg_coords['p1'] = p1 + self.seg_coords['p05'] = p05 + + self.seg_coords['d0'] = d0 + self.seg_coords['d1'] = d1 + + return self.seg_coords + + def set_seg_props(self): + """Set segment properties which are invariant for all cell using this morphology""" + seg_type = [] + seg_area = [] + seg_x = [] + seg_dist = [] + seg_length = [] + + h.distance(sec=self.hobj.soma[0]) # measure distance relative to the soma + + for sec in self.hobj.all: + fullsecname = sec.name() + sec_type = fullsecname.split(".")[1][:4] # get sec name type without the cell name + sec_type_swc = self.sec_type_swc[sec_type] # convert to swc code + + for seg in sec: + + seg_area.append(h.area(seg.x)) + seg_x.append(seg.x) + seg_length.append(sec.L/sec.nseg) + seg_type.append(sec_type_swc) # record section type in a list + seg_dist.append(h.distance(seg.x)) # distance to the center of the segment + + self.seg_prop = {} + self.seg_prop['type'] = np.array(seg_type) + self.seg_prop['area'] = np.array(seg_area) + self.seg_prop['x'] = np.array(seg_x) + self.seg_prop['dist'] = np.array(seg_dist) + self.seg_prop['length'] = np.array(seg_length) + self.seg_prop['dist0'] = self.seg_prop['dist'] - self.seg_prop['length']/2 + self.seg_prop['dist1'] = self.seg_prop['dist'] + self.seg_prop['length']/2 + + def get_target_segments(self, edge_type): + # Determine the target segments and their probabilities of connections for each new edge-type. Save the + # information for each additional time a given edge-type is used on this morphology + # TODO: Don't rely on edge-type-table, just use the edge? + if edge_type in self._segments: + return self._segments[edge_type] + + else: + tar_seg_ix, tar_seg_prob = self.find_sections(edge_type.target_sections, edge_type.target_distance) + self._segments[edge_type] = (tar_seg_ix, tar_seg_prob) + return tar_seg_ix, tar_seg_prob + + """ + tar_sec_labels = edge_type.target_sections + drange = edge_type.target_distance + dmin, dmax = drange[0], drange[1] + + seg_d0 = self.seg_prop['dist0'] # use a more compact variables + seg_d1 = self.seg_prop['dist1'] + seg_length = self.seg_prop['length'] + seg_area = self.seg_prop['area'] + seg_type = self.seg_prop['type'] + + # Find the fractional overlap between the segment and the distance range: + # this is done by finding the overlap between [d0,d1] and [dmin,dmax] + # np.minimum(seg_d1,dmax) find the smaller of the two end locations + # np.maximum(seg_d0,dmin) find the larger of the two start locations + # np.maximum(0,overlap) is used to return zero when segments do not overlap + # and then dividing by the segment length + frac_overlap = np.maximum(0, (np.minimum(seg_d1, dmax) - np.maximum(seg_d0, dmin))) / seg_length + ix_drange = np.where(frac_overlap > 0) # find indexes with non-zero overlap + ix_labels = np.array([], dtype=np.int) + + for tar_sec_label in tar_sec_labels: # find indexes within sec_labels + sec_type = self.sec_type_swc[tar_sec_label] # get swc code for the section label + ix_label = np.where(seg_type == sec_type) + ix_labels = np.append(ix_labels, ix_label) # target segment indexes + + tar_seg_ix = np.intersect1d(ix_drange, ix_labels) # find intersection between indexes for range and labels + tar_seg_length = seg_length[tar_seg_ix] * frac_overlap[tar_seg_ix] # weighted length of targeted segments + tar_seg_prob = tar_seg_length / np.sum(tar_seg_length) # probability of targeting segments + + self._segments[edge_type] = (tar_seg_ix, tar_seg_prob) + return tar_seg_ix, tar_seg_prob + """ + + def find_sections(self, target_sections, distance_range): + dmin, dmax = distance_range[0], distance_range[1] + + seg_d0 = self.seg_prop['dist0'] # use a more compact variables + seg_d1 = self.seg_prop['dist1'] + seg_length = self.seg_prop['length'] + seg_area = self.seg_prop['area'] + seg_type = self.seg_prop['type'] + + # Find the fractional overlap between the segment and the distance range: + # this is done by finding the overlap between [d0,d1] and [dmin,dmax] + # np.minimum(seg_d1,dmax) find the smaller of the two end locations + # np.maximum(seg_d0,dmin) find the larger of the two start locations + # np.maximum(0,overlap) is used to return zero when segments do not overlap + # and then dividing by the segment length + frac_overlap = np.maximum(0, (np.minimum(seg_d1, dmax) - np.maximum(seg_d0, dmin))) / seg_length + ix_drange = np.where(frac_overlap > 0) # find indexes with non-zero overlap + ix_labels = np.array([], dtype=np.int) + + for tar_sec_label in target_sections: # find indexes within sec_labels + sec_type = self.sec_type_swc[tar_sec_label] # get swc code for the section label + ix_label = np.where(seg_type == sec_type) + ix_labels = np.append(ix_labels, ix_label) # target segment indexes + + tar_seg_ix = np.intersect1d(ix_drange, ix_labels) # find intersection between indexes for range and labels + tar_seg_length = seg_length[tar_seg_ix] * frac_overlap[tar_seg_ix] # weighted length of targeted segments + tar_seg_prob = tar_seg_length / np.sum(tar_seg_length) # probability of targeting segments + return tar_seg_ix, tar_seg_prob diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/nml_reader.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/nml_reader.py new file mode 100644 index 0000000..c64b9cd --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/nml_reader.py @@ -0,0 +1,168 @@ +class NMLTree(object): + nml_ns = '{http://www.neuroml.org/schema/neuroml2}' + element_registry = {} + + def __init__(self, nml_path): + from xml.etree import ElementTree + self._nml_path = nml_path + self._nml_root = ElementTree.parse(nml_path).getroot() + #self._relevant_elements = { + # NMLTree.ns_name('channelDensity'): ChannelDensity, + # NMLTree.ns_name('resistivity'): Resistivity + #} + + # For each section store a list of all the NML elements include + self._soma_props = {} + self._axon_props = {} + self._dend_props = {} + self._apic_props = {} + # For lookup by segmentGroup attribute, include common synonyms for diff sections + self._section_maps = { + 'soma': self._soma_props, 'somatic': self._soma_props, + 'axon': self._axon_props, 'axonal': self._axon_props, + 'dend': self._dend_props, 'basal': self._dend_props, 'dendritic': self._dend_props, + 'apic': self._apic_props, 'apical': self._apic_props + } + + self._parse_root(self._nml_root) + + @classmethod + def ns_name(cls, name): + return '{}{}'.format(cls.nml_ns, name) + + @staticmethod + def common_name(elem): + if '}' in elem: + return elem.split('}')[-1] + else: + return elem + + @staticmethod + def parse_value(value): + val_list = value.split(' ') + if len(val_list) == 2: + return float(val_list[0]), val_list[1] + elif len(val_list) == 1: + return float(val_list[0]), 'NONE' + else: + raise Exception('Cannot parse value {}'.format(value)) + + @classmethod + def register_module(cls, element_cls): + cls.element_registry[cls.ns_name(element_cls.element_tag())] = element_cls + return element_cls + + def _parse_root(self, root): + for elem in root.iter(): + if elem.tag in NMLTree.element_registry: + nml_element = NMLTree.element_registry[elem.tag](elem) + self._add_param(nml_element) + + def _add_param(self, nml_element): + seggroup_str = nml_element.section + if seggroup_str is None: + raise Exception('Error: tag {} in {} is missing segmentGroup'.format(nml_element.id, self._nml_path)) + elif seggroup_str.lower() == 'all': + sections = ['soma', 'axon', 'apic', 'dend'] + else: + sections = [seggroup_str.lower()] + + for sec_name in sections: + param_table = self._section_maps[sec_name] + if sec_name in param_table: + raise Exception('Error: {} already has a {} element in {}.'.format(nml_element.id, sec_name, + self._nml_path)) + + self._section_maps[sec_name][nml_element.id] = nml_element + + def __getitem__(self, section_name): + return self._section_maps[section_name] + + +class NMLElement(object): + def __init__(self, nml_element): + self._elem = nml_element + self._attribs = nml_element.attrib + + self.tag_name = NMLTree.common_name(self._elem.tag) + self.section = self._attribs.get('segmentGroup', None) + self.id = self._attribs.get('id', self.tag_name) + + @staticmethod + def element_tag(): + raise NotImplementedError() + + +@NMLTree.register_module +class ChannelDensity(NMLElement): + def __init__(self, nml_element): + super(ChannelDensity, self).__init__(nml_element) + self.ion = self._attribs['ion'] + self.ion_channel = self._attribs['ionChannel'] + + if 'erev' in self._attribs: + v_list = NMLTree.parse_value(self._attribs['erev']) + self.erev = v_list[0] + self.erev_units = v_list[1] + else: + self.erev = None + + v_list = NMLTree.parse_value(self._attribs['condDensity']) + self.cond_density = v_list[0] + self.cond_density_units = v_list[1] + + @staticmethod + def element_tag(): + return 'channelDensity' + + +@NMLTree.register_module +class ChannelDensityNernst(ChannelDensity): + + @staticmethod + def element_tag(): + return 'channelDensityNernst' + + +@NMLTree.register_module +class Resistivity(NMLElement): + def __init__(self, nml_element): + super(Resistivity, self).__init__(nml_element) + v_list = NMLTree.parse_value(self._attribs['value']) + self.value = v_list[0] + self.value_units = v_list[1] + + @staticmethod + def element_tag(): + return 'resistivity' + + +@NMLTree.register_module +class SpecificCapacitance(NMLElement): + def __init__(self, nml_element): + super(SpecificCapacitance, self).__init__(nml_element) + v_list = NMLTree.parse_value(self._attribs['value']) + self.value = v_list[0] + self.value_units = v_list[1] + + @staticmethod + def element_tag(): + return 'specificCapacitance' + + +@NMLTree.register_module +class ConcentrationModel(NMLElement): + def __init__(self, nml_element): + super(ConcentrationModel, self).__init__(nml_element) + self.type = self._attribs['type'] + v_list = NMLTree.parse_value(self._attribs['decay']) + self.decay = v_list[0] + self.decay_units = v_list[1] + + v_list = NMLTree.parse_value(self._attribs['gamma']) + self.gamma = v_list[0] + self.gamma_units = v_list[1] + + @staticmethod + def element_tag(): + return 'concentrationModel' diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/nrn.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/nrn.py new file mode 100644 index 0000000..c5f8419 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/nrn.py @@ -0,0 +1,82 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import sys +import os +import glob +import neuron +from neuron import h + +from bmtk.simulator.bionet.pyfunction_cache import py_modules +from bmtk.simulator.bionet.pyfunction_cache import load_py_modules +from bmtk.simulator.bionet.pyfunction_cache import synapse_model, synaptic_weight, cell_model + + +pc = h.ParallelContext() + + +def quit_execution(): # quit the execution with a message + pc.done() + sys.exit() + return + + +def clear_gids(): + pc.gid_clear() + pc.barrier() + + +def load_neuron_modules(mechanisms_dir, templates_dir, default_templates=True): + """ + + :param mechanisms_dir: + :param templates_dir: + :param default_templates: + """ + h.load_file('stdgui.hoc') + + bionet_dir = os.path.dirname(__file__) + # h.load_file(os.path.join(bionet_dir, 'import3d.hoc')) # customized import3d.hoc to supress warnings + # h.load_file('import3d.hoc') + h.load_file(os.path.join(bionet_dir,'default_templates', 'advance.hoc')) + + if mechanisms_dir is not None: + neuron.load_mechanisms(str(mechanisms_dir)) + + # if default_templates: + # load_templates(os.path.join(bionet_dir, 'default_templates')) + + # if templates_dir: + # load_templates(templates_dir) + + +def load_templates(template_dir): + """Load all templates to be available in the hoc namespace for instantiating cells""" + cwd = os.getcwd() + os.chdir(template_dir) + + hoc_templates = glob.glob("*.hoc") + + for hoc_template in hoc_templates: + h.load_file(str(hoc_template)) + + os.chdir(cwd) diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/pointprocesscell.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/pointprocesscell.py new file mode 100644 index 0000000..8d0d893 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/pointprocesscell.py @@ -0,0 +1,85 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h +import six +from bmtk.simulator.bionet.cell import Cell + + +pc = h.ParallelContext() # object to access MPI methods + + +class PointProcessCell(Cell): + """Implimentation of a Leaky Integrate-and-file neuron type cell.""" + def __init__(self, node, bionetwork): + super(PointProcessCell, self).__init__(node) + self.set_spike_detector() + self._src_gids = [] + self._src_nets = [] + self._edge_type_ids = [] + + def set_spike_detector(self): + nc = h.NetCon(self.hobj, None) + pc.cell(self.gid, nc) + + def set_im_ptr(self): + pass + + def set_syn_connection(self, edge_prop, src_node, stim=None): + syn_params = edge_prop.dynamics_params + nsyns = edge_prop.nsyns + delay = edge_prop.delay + + syn_weight = edge_prop.syn_weight(src_node, self._node) + if not edge_prop.preselected_targets: + # TODO: this is not very robust, need some other way + syn_weight *= syn_params['sign'] * nsyns + + if stim is not None: + src_gid = -1 + nc = h.NetCon(stim.hobj, self.hobj) + else: + src_gid = src_node.node_id + nc = pc.gid_connect(src_gid, self.hobj) + + weight = syn_weight + nc.weight[0] = weight + nc.delay = delay + self._netcons.append(nc) + self._src_gids.append(src_gid) + self._src_nets.append(-1) + self._edge_type_ids.append(edge_prop.edge_type_id) + return nsyns + + def get_connection_info(self): + # TODO: There should be a more effecient and robust way to return synapse information. + return [[self.gid, self._src_gids[i], self.network_name, self._src_nets[i], 'NaN', 'NaN', + self.netcons[i].weight[0], self.netcons[i].delay, self._edge_type_id[i], 1] + for i in range(len(self._src_gids))] + + def print_synapses(self): + rstr = '' + for i in six.moves.range(len(self._src_gids)): + rstr += '{}> <-- {} ({}, {})\n'.format(i, self._src_gids[i], self.netcons[i].weight[0], + self.netcons[i].delay) + + return rstr diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/pointsomacell.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/pointsomacell.py new file mode 100644 index 0000000..0c96594 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/pointsomacell.py @@ -0,0 +1,12 @@ +from neuron import h +from bmtk.simulator.bionet.cell import Cell + + +pc = h.ParallelContext() # object to access MPI methods + + +class PointSomaCell(Cell): + """Used to represent single compartment cells with neural mechanisms""" + def __init__(self): + # TODO: Implement + raise NotImplementedError('Point Soma cell types are not currently implemented.') diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/pyfunction_cache.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/pyfunction_cache.py new file mode 100644 index 0000000..1fa5a26 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/pyfunction_cache.py @@ -0,0 +1,252 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import types +import warnings +from functools import wraps + + +class _PyFunctions(object): + """Structure for holding custom user-defined python functions. + + Will store a set of functions created by the user. Should not access this directly but rather user the + decorators or setter functions, and use the py_modules class variable to access individual functions. Is divided + up into + synaptic_weight: functions for calcuating synaptic weight. + cell_model: should return NEURON cell hobj. + synapse model: should return a NEURON synapse object. + """ + def __init__(self): + self.__syn_weights = {} + self.__cell_models = {} + self.__synapse_models = {} + self.__cell_processors = {} + + def clear(self): + self.__syn_weights.clear() + self.__cell_models.clear() + self.__synapse_models.clear() + self.__cell_processors.clear() + + def add_synaptic_weight(self, name, func, overwrite=True): + """stores synpatic fuction for given name""" + if overwrite or name not in self.__syn_weights: + self.__syn_weights[name] = func + + @property + def synaptic_weights(self): + """return list of the names of all available synaptic weight functions""" + return self.__syn_weights.keys() + + def synaptic_weight(self, name): + """return the synpatic weight function""" + return self.__syn_weights[name] + + def has_synaptic_weight(self, name): + return name in self.__syn_weights + + def __cell_model_key(self, directive, model_type): + return (directive, model_type) + + def add_cell_model(self, directive, model_type, func, overwrite=True): + key = self.__cell_model_key(directive, model_type) + if overwrite or key not in self.__cell_models: + self.__cell_models[key] = func + + @property + def cell_models(self): + return self.__cell_models.keys() + + def cell_model(self, directive, model_type): + return self.__cell_models[self.__cell_model_key(directive, model_type)] + + def has_cell_model(self, directive, model_type): + return self.__cell_model_key(directive, model_type) in self.__cell_models + + def add_synapse_model(self, name, func, overwrite=True): + if overwrite or name not in self.__synapse_models: + self.__synapse_models[name] = func + + @property + def synapse_models(self): + return self.__synapse_models.keys() + + def synapse_model(self, name): + return self.__synapse_models[name] + + @property + def cell_processors(self): + return self.__cell_processors.keys() + + def cell_processor(self, name): + return self.__cell_processors[name] + + def add_cell_processor(self, name, func, overwrite=True): + if overwrite or name not in self.__syn_weights: + self.__cell_processors[name] = func + + def __repr__(self): + rstr = '{}: {}\n'.format('cell_models', self.cell_models) + rstr += '{}: {}\n'.format('synapse_models', self.synapse_models) + rstr += '{}: {}'.format('synaptic_weights', self.synaptic_weights) + return rstr + +py_modules = _PyFunctions() + + +def synaptic_weight(*wargs, **wkwargs): + """A decorator for registering a function as a synaptic weight function. + To use either + @synaptic_weight + def weight_function(): ... + + or + @synaptic_weight(name='name_in_edge_types') + def weight_function(): ... + + Once the decorator has been attached and imported the functions will automatically be added to py_modules. + """ + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_synaptic_weight(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_synaptic_weight(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def cell_model(*wargs, **wkwargs): + """A decorator for registering NEURON cell loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_cell_model(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_cell_model(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def synapse_model(*wargs, **wkwargs): + """A decorator for registering NEURON synapse loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_synapse_model(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_synapse_model(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def add_weight_function(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_synaptic_weight(func_name, func, overwrite) + + +def add_cell_model(func, directive, model_type, overwrite=True): + assert(callable(func)) + # func_name = name if name is not None else func.__name__ + py_modules.add_cell_model(directive, model_type, func, overwrite) + + +def add_cell_processor(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_cell_processor(func_name, func, overwrite) + + +def add_synapse_model(func, name=None, overwrite=True): + assert (callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_synapse_model(func_name, func, overwrite) + + +def load_py_modules(cell_models=None, syn_models=None, syn_weights=None, cell_processors=None): + # py_modules.clear() + warnings.warn('Do not call this method directly', DeprecationWarning) + if cell_models is not None: + assert(isinstance(cell_models, types.ModuleType)) + for f in [cell_models.__dict__.get(f) for f in dir(cell_models)]: + if isinstance(f, types.FunctionType): + py_modules.add_cell_model(f.__name__, f) + + if syn_models is not None: + assert(isinstance(syn_models, types.ModuleType)) + for f in [syn_models.__dict__.get(f) for f in dir(syn_models)]: + if isinstance(f, types.FunctionType): + py_modules.add_synapse_model(f.__name__, f) + + if syn_weights is not None: + assert(isinstance(syn_weights, types.ModuleType)) + for f in [syn_weights.__dict__.get(f) for f in dir(syn_weights)]: + if isinstance(f, types.FunctionType): + py_modules.add_synaptic_weight(f.__name__, f) + + if cell_processors is not None: + assert(isinstance(cell_processors, types.ModuleType)) + for f in [cell_processors.__dict__.get(f) for f in dir(cell_processors)]: + if isinstance(f, types.FunctionType): + py_modules.add_cell_processor(f.__name__, f) diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/config_schema.json b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/config_schema.json new file mode 100644 index 0000000..cd63b71 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/config_schema.json @@ -0,0 +1,130 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + + "properties": { + "target_simulator": {"$ref": "#/definitions/target_simulator"}, + "components": {"$ref": "#/definitions/components"}, + "networks": { + "type": "object", + "properties": { + "node_files": {"$ref": "#/definitions/nodes_files"}, + "edge_files": {"$ref": "#/definitions/edges_files"} + } + }, + "run": {"$ref": "#/definitions/run"}, + "groups": {"$ref": "#/definitions/groups"}, + "output": {"$ref": "#/definitions/output"}, + "conditions": {"$ref": "#/definitions/conditions"}, + "input": { + "type": "array", + "items": { + "oneOf": [ + {"$ref": "#/definitions/input_file"} + ] + } + } + }, + + "definitions": { + "target_simulator": { + "type": "string" + }, + + "components": { + "type": "object", + "properties": { + "synaptic_models_dir": {"type": "directory", "exists": true}, + "mechanisms_dir": {"type": "directory", "exists": true}, + "morphologies_dir": {"type": "directory", "exists": true}, + "biophysical_neuron_models_dir": {"type": "directory", "exists": true}, + "point_neuron_models_dir": {"type": "directory", "exists": true}, + "templates_dir": {"type": "directory", "exists": true} + } + }, + + "edges": { + "type": "array", + "items": { + "type": "object", + "properites": { + "edges_file": {"type": "file", "exists": true}, + "edge_types_file": {"type": "file", "exists": true} + } + } + }, + + "nodes": { + "type": "array", + "items": { + "type": "object", + + "properties": { + "nodes_file": {"type": "file", "exists": true}, + "node_types_file": {"type": "file", "exists": true} + } + } + }, + + "run": { + "type": "object", + "properties": { + "tstop": {"type": "number", "minimum": 0}, + "dt": {"type": "number", "minimum": 0}, + "dL": {"type": "number", "minimum": 0}, + "overwrite_output_dir": {"type": "boolean"}, + "spike_threshold": {"type": "number"}, + "save_state": {"type": "boolean"}, + "start_from_state": {"type": "boolean"}, + "nsteps_block": {"type": "number", "minimum": 0}, + "save_cell_vars": {"type": "array"}, + "calc_ecp": {"type": "boolean"} + } + }, + + "node_id_selections": { + "type": "object", + "properties": { + "save_cell_vars": {"type": "array", "items": {"type": "number"}} + } + }, + + "output": { + "type": "object", + "properties": { + "log_file": {"type": "file"}, + "spikes_ascii": {"type": "file"}, + "spikes_h5": {"type": "file"}, + "cell_vars_dir": {"type": "file"}, + "extra_cell_vars": {"type": "file"}, + "ecp_file": {"type": "file"}, + "state_dir": {"type": "directory"}, + "output_dir": {"type": "directory"} + } + }, + + "conditions": { + "type": "object", + "properties": { + "celsius": {"type": "number"}, + "v_init": {"type": "number"}, + "cao0": {"type": "number"} + } + }, + + "extracellular_electrode": { + "type": "object", + "properties": { + "positions": {"type": "file"} + } + }, + + "input_file": { + "type": "object", + "properties": { + "format": {"type": "string", "enum": ["nwb", "csv"]}, + "file": {"type": "file", "exists": true} + } + } + } +} diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_edge_types.json b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_edge_types.json new file mode 100644 index 0000000..b3e6f59 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_edge_types.json @@ -0,0 +1,20 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "edge_type_id": {"required": true}, + "target_query": {"required": false}, + "source_query": {"required": false}, + "weight_max": {"required": true}, + "weight_function": {"required": false}, + "weight_sigma": {"required": false}, + "distance_range": {"required": true}, + "target_sections": {"required": true}, + "delay": {"required": true}, + "params_file": {"required": true}, + "set_params_function": {"required": true} + } +} \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_node_types_external.json b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_node_types_external.json new file mode 100644 index 0000000..5dd3a08 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_node_types_external.json @@ -0,0 +1,11 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "node_type_id": {"required": true}, + "level_of_detail": {"required": true} + } +} \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_node_types_internal.json b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_node_types_internal.json new file mode 100644 index 0000000..6dc2188 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_node_types_internal.json @@ -0,0 +1,15 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "node_type_id": {"required": true}, + "params_file": {"required": true}, + "level_of_detail": {"required": true}, + "morphology_file": {"required": true}, + "rotation_angle_zaxis": {"required": true}, + "set_params_function": {"required": true} + } +} \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_nodes_external.json b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_nodes_external.json new file mode 100644 index 0000000..e7240b0 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_nodes_external.json @@ -0,0 +1,11 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "node_id": {"required": true}, + "node_type_id": {"required": true} + } +} \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_nodes_internal.json b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_nodes_internal.json new file mode 100644 index 0000000..f2287b0 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/schemas/csv_nodes_internal.json @@ -0,0 +1,19 @@ +{ + "file_type": "csv", + "file_properties": { + "sep": " " + }, + + "columns": { + "node_id": {"required": true}, + "node_type_id": {"required": true}, + "x_soma": {"required": true}, + "y_soma": {"required": true}, + "z_soma": {"required": true}, + "rotation_angle_yaxis": {"required": true}, + "pop_name": {"required": true}, + "ei": {"required": true}, + "location": {"required": false}, + "tuning_angle": {"required": false} + } +} \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/sonata_adaptors.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/sonata_adaptors.py new file mode 100644 index 0000000..91982c6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/sonata_adaptors.py @@ -0,0 +1,142 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import types +import numpy as np + +from bmtk.simulator.core.sonata_reader import NodeAdaptor, SonataBaseNode, EdgeAdaptor, SonataBaseEdge +from bmtk.simulator.bionet import nrn + + +class BioNode(SonataBaseNode): + @property + def position(self): + return self._prop_adaptor.position(self._node) + + @property + def morphology_file(self): + return self._node['morphology'] + + @property + def rotation_angle_xaxis(self): + return self._prop_adaptor.rotation_angle_xaxis(self._node) + + @property + def rotation_angle_yaxis(self): + # TODO: Combine rotation alnges into a single property + return self._prop_adaptor.rotation_angle_yaxis(self._node) + + @property + def rotation_angle_zaxis(self): + return self._prop_adaptor.rotation_angle_zaxis(self._node) + + def load_cell(self): + model_template = self.model_template + template_name = model_template[1] + model_type = self.model_type + if nrn.py_modules.has_cell_model(self['model_template'], model_type): + cell_fnc = nrn.py_modules.cell_model(self['model_template'], model_type) + else: + cell_fnc = nrn.py_modules.cell_model(model_template[0], model_type) + + dynamics_params = self.dynamics_params + hobj = cell_fnc(self, template_name, dynamics_params) + + for model_processing_str in self.model_processing: + processing_fnc = nrn.py_modules.cell_processor(model_processing_str) + hobj = processing_fnc(hobj, self, dynamics_params) + + return hobj + + +class BioNodeAdaptor(NodeAdaptor): + def get_node(self, sonata_node): + return BioNode(sonata_node, self) + + @classmethod + def patch_adaptor(cls, adaptor, node_group, network): + node_adaptor = NodeAdaptor.patch_adaptor(adaptor, node_group, network) + + # Position + if 'positions' in node_group.all_columns: + node_adaptor.position = types.MethodType(positions, adaptor) + elif 'position' in node_group.all_columns: + node_adaptor.position = types.MethodType(position, adaptor) + else: + node_adaptor.position = types.MethodType(positions_default, adaptor) + + # Rotation angles + if 'rotation_angle_xaxis' in node_group.all_columns: + node_adaptor.rotation_angle_xaxis = types.MethodType(rotation_angle_x, node_adaptor) + else: + node_adaptor.rotation_angle_xaxis = types.MethodType(rotation_angle_default, node_adaptor) + + if 'rotation_angle_yaxis' in node_group.all_columns: + node_adaptor.rotation_angle_yaxis = types.MethodType(rotation_angle_y, node_adaptor) + else: + node_adaptor.rotation_angle_yaxis = types.MethodType(rotation_angle_default, node_adaptor) + + if 'rotation_angle_zaxis' in node_group.all_columns: + node_adaptor.rotation_angle_zaxis = types.MethodType(rotation_angle_z, node_adaptor) + else: + node_adaptor.rotation_angle_zaxis = types.MethodType(rotation_angle_default, node_adaptor) + + return node_adaptor + + +def positions_default(self, node): + return np.array([0.0, 0.0, 0.0]) + + +def positions(self, node): + return node['positions'] + + +def position(self, node): + return node['position'] + + +def rotation_angle_default(self, node): + return 0.0 + + +def rotation_angle_x(self, node): + return node['rotation_angle_xaxis'] + + +def rotation_angle_y(self, node): + return node['rotation_angle_yaxis'] + + +def rotation_angle_z(self, node): + return node['rotation_angle_zaxis'] + + +class BioEdge(SonataBaseEdge): + def load_synapses(self, section_x, section_id): + synapse_fnc = nrn.py_modules.synapse_model(self.model_template) + return synapse_fnc(self.dynamics_params, section_x, section_id) + + +class BioEdgeAdaptor(EdgeAdaptor): + def get_edge(self, sonata_edge): + return BioEdge(sonata_edge, self) diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/utils.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/utils.py new file mode 100644 index 0000000..ca63bc6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/utils.py @@ -0,0 +1,84 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import numpy as np +import math +import json +import pandas as pd +import h5py + +from neuron import h + + +def rotation_matrix(axis, theta): + """Return the rotation matrix associated with counterclockwise rotation about the given axis by theta radians. + """ + axis = np.asarray(axis) + theta = np.asarray(theta) + axis = axis/math.sqrt(np.dot(axis, axis)) + a = math.cos(theta/2.0) + b, c, d = -axis*math.sin(theta/2.0) + aa, bb, cc, dd = a*a, b*b, c*c, d*d + bc, ad, ac, ab, bd, cd = b*c, a*d, a*c, a*b, b*d, c*d + + return np.array([[aa+bb-cc-dd, 2*(bc+ad), 2*(bd-ac)], + [2*(bc-ad), aa+cc-bb-dd, 2*(cd+ab)], + [2*(bd+ac), 2*(cd-ab), aa+dd-bb-cc]]) + + +def edge_converter_csv(output_dir, csv_file): + """urrently being used by BioNetwork.write_connections(), need to refactor + + :param output_dir: + :param csv_file: + :return: + """ + syns_df = pd.read_csv(csv_file, sep=' ') + for name, group in syns_df.groupby(['trg_network', 'src_network']): + trg_net, src_net = name + group_len = len(group.index) + with h5py.File(os.path.join(output_dir, '{}_{}_edges.h5'.format(trg_net, src_net)), 'w') as conns_h5: + conns_h5.create_dataset('edges/target_gid', data=group['trg_gid']) + conns_h5.create_dataset('edges/source_gid', data=group['src_gid']) + conns_h5.create_dataset('edges/edge_type_id', data=group['edge_type_id']) + conns_h5.create_dataset('edges/edge_group', data=group['connection_group']) + + group_counters = {group_id: 0 for group_id in group.connection_group.unique()} + edge_group_indicies = np.zeros(group_len, dtype=np.uint) + for i, group_id in enumerate(group['connection_group']): + edge_group_indicies[i] = group_counters[group_id] + group_counters[group_id] += 1 + conns_h5.create_dataset('edges/edge_group_indicies', data=edge_group_indicies) + + for group_class, sub_group in group.groupby('connection_group'): + grp = conns_h5.create_group('edges/{}'.format(group_class)) + if group_class == 0: + grp.create_dataset('sec_id', data=sub_group['segment'], dtype='int') + grp.create_dataset('sec_x', data=sub_group['section']) + grp.create_dataset('syn_weight', data=sub_group['weight']) + grp.create_dataset('delay', data=sub_group['delay']) + elif group_class == 1: + grp.create_dataset('syn_weight', data=sub_group['weight']) + grp.create_dataset('delay', data=sub_group['delay']) + else: + print('Unknown cell group {}'.format(group_class)) diff --git a/bmtk-vb/build/lib/bmtk/simulator/bionet/virtualcell.py b/bmtk-vb/build/lib/bmtk/simulator/bionet/virtualcell.py new file mode 100644 index 0000000..64b3929 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/bionet/virtualcell.py @@ -0,0 +1,51 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from neuron import h + + +class VirtualCell(object): + """Representation of a Virtual/External node""" + + def __init__(self, node, spike_train_dataset): + # VirtualCell is currently not a subclass of bionet.Cell class b/c the parent has a bunch of properties that + # just don't apply to a virtual cell. May want to make bionet.Cell more generic in the future. + self._node_id = node.node_id + self._hobj = None + self._spike_train_dataset = spike_train_dataset + self._train_vec = [] + self.set_stim(node, self._spike_train_dataset) + + @property + def node_id(self): + return self._node_id + + @property + def hobj(self): + return self._hobj + + def set_stim(self, stim_prop, spike_train): + """Gets the spike trains for each individual cell.""" + self._train_vec = h.Vector(spike_train.get_spikes(self.node_id)) + vecstim = h.VecStim() + vecstim.play(self._train_vec) + self._hobj = vecstim diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/config.py b/bmtk-vb/build/lib/bmtk/simulator/core/config.py new file mode 100644 index 0000000..8a36dc7 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/config.py @@ -0,0 +1,436 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +from bmtk.simulator.utils.config import ConfigDict + +''' +import os +import json +import re +import copy +import datetime +from six import string_types + + +from bmtk.simulator.core.io_tools import io + + +def from_json(config_file, validator=None): + """Builds and validates a configuration json file. + + :param config_file: File object or path to a json file. + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + #print(config_file) + #if os.path.isfile(config_file): + #if isinstance(config_file, file): + # conf = json.load(config_file) + if isinstance(config_file, string_types): + conf = json.load(open(config_file, 'r')) + elif isinstance(config_file, dict): + conf = config_file.copy() + else: + raise Exception('{} is not a file or file path.'.format(config_file)) + + # insert file path into dictionary + if 'config_path' not in conf: + conf['config_path'] = os.path.abspath(config_file) + conf['config_dir'] = os.path.dirname(conf['config_path']) + + # Will resolve manifest variables and validate + return from_dict(conf, validator) + + +def from_dict(config_dict, validator=None): + """Builds and validates a configuration json dictionary object. Best to directly use from_json when possible. + + :param config_dict: Dictionary object + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + assert(isinstance(config_dict, dict)) + conf = copy.deepcopy(config_dict) # Since the functions will mutate the dictionary we will copy just-in-case. + + if 'config_path' not in conf: + conf['config_path'] = os.path.join(os.getcwd(), 'tmp_cfg.dict') + conf['config_dir'] = os.path.dirname(conf['config_path']) + + # Build the manifest and resolve variables. + # TODO: Check that manifest exists + manifest = __build_manifest(conf) + conf['manifest'] = manifest + __recursive_insert(conf, manifest) + + # In our work with Blue-Brain it was agreed that 'network' and 'simulator' parts of config may be split up into + # separate files. If this is the case we build each sub-file separately and merge into this one + for childconfig in ['network', 'simulation']: + if childconfig in conf and isinstance(conf[childconfig], string_types): + # Try to resolve the path of the network/simulation config files. If an absolute path isn't used find + # the file relative to the current config file. TODO: test if this will work on windows? + conf_str = conf[childconfig] + conf_path = conf_str if conf_str.startswith('/') else os.path.join(conf['config_dir'], conf_str) + + # Build individual json file and merge into parent. + child_json = from_json(conf_path) + del child_json['config_path'] # we don't want 'config_path' of parent being overwritten. + conf.update(child_json) + + # Run the validator + if validator is not None: + validator.validate(conf) + + return conf + + +def copy_config(conf): + """Copy configuration file to different directory, with manifest variables resolved. + + :param conf: configuration dictionary + """ + output_dir = conf.output_dir + config_name = os.path.basename(conf['config_path']) + output_path = os.path.join(output_dir, config_name) + with open(output_path, 'w') as fp: + out_cfg = conf.copy() + if 'manifest' in out_cfg: + del out_cfg['manifest'] + json.dump(out_cfg, fp, indent=2) + + +def __special_variables(conf): + """A list of preloaded variables to insert into the manifest, containing things like path to run-time directory, + configuration directory, etc. + """ + pre_manifest = dict() + pre_manifest['$workingdir'] = os.path.dirname(os.getcwd()) + if 'config_path' in conf: + pre_manifest['$configdir'] = os.path.dirname(conf['config_path']) # path of configuration file + pre_manifest['$configfname'] = conf['config_path'] + + dt_now = datetime.datetime.now() + pre_manifest['$time'] = dt_now.strftime('%H-%M-%S') + pre_manifest['$date'] = dt_now.strftime('%Y-%m-%d') + pre_manifest['$datetime'] = dt_now.strftime('%Y-%m-%d_%H-%M-%S') + + return pre_manifest + + +def __build_manifest(conf): + """Resolves the manifest section and resolve any internal variables""" + if 'manifest' not in conf: + return __special_variables(conf) + + manifest = conf["manifest"] + resolved_manifest = __special_variables(conf) + resolved_keys = set() + unresolved_keys = set(manifest.keys()) + + # No longer using recursion since that can lead to an infinite loop if the person who writes the config file isn't + # careful. Also added code to allow for ${VAR} format in-case user wants to user "$.../some_${MODEl}_here/..." + while unresolved_keys: + for key in unresolved_keys: + # Find all variables in manifest and see if they can be replaced by the value in resolved_manifest + value = __find_variables(manifest[key], resolved_manifest) + + # If value no longer has variables, and key-value pair to resolved_manifest and remove from unresolved-keys + if value.find('$') < 0: + resolved_manifest[key] = value + resolved_keys.add(key) + + # remove resolved key-value pairs from set, and make sure at every iteration unresolved_keys shrinks to prevent + # infinite loops + n_unresolved = len(unresolved_keys) + unresolved_keys -= resolved_keys + if n_unresolved == len(unresolved_keys): + msg = "Unable to resolve manifest variables: {}".format(unresolved_keys) + raise Exception(msg) + + return resolved_manifest + + +def __recursive_insert(json_obj, manifest): + """Loop through the config and substitute the path variables (e.g.: $MY_DIR) with the values from the manifest + + :param json_obj: A json dictionary object that may contain variables needing to be resolved. + :param manifest: A dictionary of variable values + :return: A new json dictionar config file with variables resolved + """ + if isinstance(json_obj, string_types): + return __find_variables(json_obj, manifest) + + elif isinstance(json_obj, list): + new_list = [] + for itm in json_obj: + new_list.append(__recursive_insert(itm, manifest)) + return new_list + + elif isinstance(json_obj, dict): + for key, val in json_obj.items(): + if key == 'manifest': + continue + json_obj[key] = __recursive_insert(val, manifest) + + return json_obj + + else: + return json_obj + + +def __find_variables(json_str, manifest): + """Replaces variables (i.e. $VAR, ${VAR}) with their values from the manifest. + + :param json_str: a json string that may contain none, one or multiple variable + :param manifest: dictionary of variable lookup values + :return: json_str with resolved variables. Won't resolve variables that don't exist in manifest. + """ + variables = [m for m in re.finditer('\$\{?[\w]+\}?', json_str)] + for var in variables: + var_lookup = var.group() + if var_lookup.startswith('${') and var_lookup.endswith('}'): + # replace ${VAR} with $VAR + var_lookup = "$" + var_lookup[2:-1] + if var_lookup in manifest: + json_str = json_str.replace(var.group(), manifest[var_lookup]) + + return json_str + + +class ConfigDict(dict): + def __init__(self, *args, **kwargs): + self.update(*args, **kwargs) + self._env_built = False + self._io = None + + self._node_set = {} + self._load_node_set() + + @property + def io(self): + if self._io is None: + self._io = io + return self._io + + @io.setter + def io(self, io): + self._io = io + + @property + def run(self): + return self['run'] + + @property + def tstart(self): + return self.run.get('tstart', 0.0) + + @property + def tstop(self): + return self.run['tstop'] + + @property + def dt(self): + return self.run.get('dt', 0.1) + + @property + def spike_threshold(self): + return self.run.get('spike_threshold', -15.0) + + @property + def dL(self): + return self.run.get('dL', 20.0) + + @property + def gid_mappings(self): + return self.get('gid_mapping_file', None) + + @property + def block_step(self): + return self.run.get('nsteps_block', 5000) + + @property + def conditions(self): + return self['conditions'] + + @property + def celsius(self): + return self.conditions['celsius'] + + @property + def v_init(self): + return self.conditions['v_init'] + + @property + def path(self): + return self['config_path'] + + @property + def output(self): + return self['output'] + + @property + def output_dir(self): + return self.output['output_dir'] + + @property + def overwrite_output(self): + return self.output.get('overwrite_output_dir', False) + + @property + def log_file(self): + return self.output['log_file'] + + @property + def components(self): + return self.get('components', {}) + + @property + def morphologies_dir(self): + return self.components['morphologies_dir'] + + @property + def synaptic_models_dir(self): + return self.components['synaptic_models_dir'] + + @property + def point_neuron_models_dir(self): + return self.components['point_neuron_models_dir'] + + @property + def mechanisms_dir(self): + return self.components['mechanisms_dir'] + + @property + def biophysical_neuron_models_dir(self): + return self.components['biophysical_neuron_models_dir'] + + @property + def templates_dir(self): + return self.components.get('templates_dir', None) + + @property + def with_networks(self): + return 'networks' in self and len(self.nodes) > 0 + + @property + def networks(self): + return self['networks'] + + @property + def nodes(self): + return self.networks.get('nodes', []) + + @property + def edges(self): + return self.networks.get('edges', []) + + @property + def reports(self): + return self.get('reports', {}) + + @property + def inputs(self): + return self.get('inputs', {}) + + @property + def node_sets(self): + return self._node_set + + def _load_node_set(self): + if 'node_sets_file' in self.keys(): + node_set_val = self['node_sets_file'] + elif 'node_sets' in self.keys(): + node_set_val = self['node_sets'] + else: + self._node_set = {} + return + + if isinstance(node_set_val, dict): + self._node_set = node_set_val + else: + try: + self._node_set = json.load(open(node_set_val, 'r')) + except Exception as e: + io.log_exception('Unable to load node_sets_file {}'.format(node_set_val)) + + def copy_to_output(self): + copy_config(self) + + def get_modules(self, module_name): + return [report for report in self.reports.values() if report['module'] == module_name] + + def _set_logging(self): + """Check if log-level and/or log-format string is being changed through the config""" + output_sec = self.output + if 'log_format' in output_sec: + self._io.set_log_format(output_sec['log_format']) + + if 'log_level' in output_sec: + self._io.set_log_level(output_sec['log_level']) + + if 'log_to_console' in output_sec: + self._io.log_to_console = output_sec['log_to_console'] + + if 'quiet_simulator' in output_sec and output_sec['quiet_simulator']: + self._io.quiet_simulator() + + def build_env(self): + if self._env_built: + return + + self._set_logging() + self.io.setup_output_dir(self.output_dir, self.log_file, self.overwrite_output) + self.copy_to_output() + self._env_built = True + + @staticmethod + def get_validator(): + raise NotImplementedError + + @classmethod + def from_json(cls, config_file, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_json(config_file, validator)) + + @classmethod + def from_dict(cls, config_dict, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_dict(config_dict, validator)) + + @classmethod + def from_yaml(cls, config_file, validate=False): + raise NotImplementedError + + @classmethod + def load(cls, config_file, validate=False): + # Implement factory method that can resolve the format/type of input configuration. + if isinstance(config_file, dict): + return cls.from_dict(config_file, validate) + elif isinstance(config_file, string_types): + if config_file.endswith('yml') or config_file.endswith('yaml'): + return cls.from_yaml(config_file, validate) + else: + return cls.from_json(config_file, validate) + else: + raise Exception +''' + diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/edge_population.py b/bmtk-vb/build/lib/bmtk/simulator/core/edge_population.py new file mode 100644 index 0000000..5dfa06c --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/edge_population.py @@ -0,0 +1,21 @@ +class SimEdge(object): + @property + def node_id(self): + raise NotImplementedError() + + @property + def gid(self): + raise NotImplementedError() + + +class EdgePopulation(object): + @property + def source_nodes(self): + raise NotImplementedError() + + @property + def target_nodes(self): + raise NotImplementedError() + + def initialize(self, network): + raise NotImplementedError() \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/graph.py b/bmtk-vb/build/lib/bmtk/simulator/core/graph.py new file mode 100644 index 0000000..1e56ef1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/graph.py @@ -0,0 +1,435 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import ast +import numpy as np + +from bmtk.simulator.core.config import ConfigDict +#import config as cfg +from bmtk.simulator.utils.property_maps import NodePropertyMap, EdgePropertyMap +from bmtk.utils import sonata +from bmtk.simulator.core.io_tools import io + +from bmtk.simulator.core.node_sets import NodeSet, NodeSetAll + + +"""Creates a graph of nodes and edges from multiple network files for all simulators. + +Consists of edges and nodes. All classes are abstract and should be reimplemented by a specific simulator. Also +contains base factor methods for building a network from a config file (or other). +""" + + +class SimEdge(object): + def __init__(self, original_params, dynamics_params): + self._orig_params = original_params + self._dynamics_params = dynamics_params + self._updated_params = {'dynamics_params': self._dynamics_params} + + @property + def edge_type_id(self): + return self._orig_params['edge_type_id'] + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + else: + return self._orig_params[item] + + +class SimNode(object): + def __init__(self, node_id, graph, network, params): + self._node_id = node_id + self._graph = graph + self._graph_params = params + self._node_type_id = params['node_type_id'] + self._network = network + self._updated_params = {} + + self._model_params = {} + + @property + def node_id(self): + return self._node_id + + @property + def node_type_id(self): + return self._node_type_id + + @property + def network(self): + """Name of network node belongs too.""" + return self._network + + @property + def model_params(self): + """Parameters (json file, nml, dictionary) that describe a specific node""" + return self._model_params + + @model_params.setter + def model_params(self, value): + self._model_params = value + + def __contains__(self, item): + return item in self._updated_params or item in self._graph_params + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + else: + return self._graph_params[item] + + +class SimGraph(object): + model_type_col = 'model_type' + + def __init__(self): + self._components = {} # components table, i.e. paths to model files. + self._io = io + + self._node_property_maps = {} + self._edge_property_maps = {} + + self._node_populations = {} + self._internal_populations_map = {} + self._virtual_populations_map = {} + + self._virtual_cells_nid = {} + + self._recurrent_edges = {} + self._external_edges = {} + + self._node_sets = {} + self._using_gids = False + + @property + def io(self): + return self._io + + ''' + @property + def internal_pop_names(self): + return self + ''' + + @property + def node_populations(self): + return list(self._node_populations.keys()) + + def get_node_set(self, node_set): + if node_set in self._node_sets.keys(): + return self._node_sets[node_set] + + elif isinstance(node_set, (dict, list)): + return NodeSet(node_set, self) + + else: + self.io.log_exception('Unable to load or find node_set "{}"'.format(node_set)) + + def get_node_populations(self): + return self._node_populations.values() + + def get_node_population(self, population_name): + return self._node_populations[population_name] + + def get_component(self, key): + """Get the value of item in the components dictionary. + + :param key: name of component + :return: value assigned to component + """ + return self._components[key] + + def add_component(self, key, value): + """Add a component key-value pair + + :param key: name of component + :param value: value + """ + self._components[key] = value + + ''' + def _from_json(self, file_name): + return cfg.from_json(file_name) + ''' + + def _validate_components(self): + """Make sure various components (i.e. paths) exists before attempting to build the graph.""" + return True + + def _create_nodes_prop_map(self, grp): + return NodePropertyMap() + + def _create_edges_prop_map(self, grp): + return EdgePropertyMap() + + def __avail_model_types(self, population): + model_types = set() + for grp in population.groups: + if self.model_type_col not in grp.all_columns: + self.io.log_exception('model_type is missing from nodes.') + + model_types.update(set(np.unique(grp.get_values(self.model_type_col)))) + return model_types + + def _preprocess_node_types(self, node_population): + # TODO: The following figures out the actually used node-type-ids. For mem and speed may be better to just + # process them all + node_type_ids = node_population.type_ids + # TODO: Verify all the node_type_ids are in the table + node_types_table = node_population.types_table + + # TODO: Convert model_type to a enum + morph_dir = self.get_component('morphologies_dir') + if morph_dir is not None and 'morphology' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + if node_type['morphology'] is None: + continue + # TODO: Check the file exits + # TODO: See if absolute path is stored in csv + node_type['morphology'] = os.path.join(morph_dir, node_type['morphology']) + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + if isinstance(dynamics_params, dict): + continue + + model_type = node_type['model_type'] + if model_type == 'biophysical': + params_dir = self.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = self.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = self.get_component('point_neuron_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = self.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + def _preprocess_edge_types(self, edge_pop): + edge_types_table = edge_pop.types_table + edge_type_ids = np.unique(edge_pop.type_ids) + + for et_id in edge_type_ids: + edge_type = edge_types_table[et_id] + if 'dynamics_params' in edge_types_table.columns: + dynamics_params = edge_type['dynamics_params'] + params_dir = self.get_component('synaptic_models_dir') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + edge_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find edge dynamics_params file {}.'.format(params_path)) + + # Split target_sections + if 'target_sections' in edge_type: + trg_sec = edge_type['target_sections'] + if trg_sec is not None: + try: + edge_type['target_sections'] = ast.literal_eval(trg_sec) + except Exception as exc: + self.io.log_warning('Unable to split target_sections list {}'.format(trg_sec)) + edge_type['target_sections'] = None + + # Split target distances + if 'distance_range' in edge_type: + dist_range = edge_type['distance_range'] + if dist_range is not None: + try: + # TODO: Make the distance range has at most two values + edge_type['distance_range'] = json.loads(dist_range) + except Exception as e: + try: + edge_type['distance_range'] = [0.0, float(dist_range)] + except Exception as e: + self.io.log_warning('Unable to parse distance_range {}'.format(dist_range)) + edge_type['distance_range'] = None + + def external_edge_populations(self, src_pop, trg_pop): + return self._external_edges.get((src_pop, trg_pop), []) + + def add_nodes(self, sonata_file, populations=None): + """Add nodes from a network to the graph. + + :param sonata_file: A NodesFormat type object containing list of nodes. + :param populations: name/identifier of network. If none will attempt to retrieve from nodes object + """ + nodes = sonata_file.nodes + + selected_populations = nodes.population_names if populations is None else populations + for pop_name in selected_populations: + if pop_name not in nodes: + # when user wants to simulation only a few populations in the file + continue + + if pop_name in self.node_populations: + # Make sure their aren't any collisions + self.io.log_exception('There are multiple node populations with name {}.'.format(pop_name)) + + node_pop = nodes[pop_name] + self._preprocess_node_types(node_pop) + self._node_populations[pop_name] = node_pop + + # Segregate into virtual populations and non-virtual populations + model_types = self.__avail_model_types(node_pop) + if 'virtual' in model_types: + self._virtual_populations_map[pop_name] = node_pop + self._virtual_cells_nid[pop_name] = {} + model_types -= set(['virtual']) + if model_types: + # We'll allow a population to have virtual and non-virtual nodes but it is not ideal + self.io.log_warning('Node population {} contains both virtual and non-virtual nodes which can ' + + 'cause memory and build-time inefficency. Consider separating virtual nodes ' + + 'into their own population'.format(pop_name)) + + if model_types: + self._internal_populations_map[pop_name] = node_pop + + self._node_sets[pop_name] = NodeSet({'population': pop_name}, self) + self._node_property_maps[pop_name] = {grp.group_id: self._create_nodes_prop_map(grp) + for grp in node_pop.groups} + + def build_nodes(self): + raise NotImplementedError + + def build_recurrent_edges(self): + raise NotImplementedError + + def add_edges(self, sonata_file, populations=None, source_pop=None, target_pop=None): + """ + + :param sonata_file: + :param populations: + :param source_pop: + :param target_pop: + :return: + """ + edges = sonata_file.edges + selected_populations = edges.population_names if populations is None else populations + + for pop_name in selected_populations: + if pop_name not in edges: + continue + + edge_pop = edges[pop_name] + self._preprocess_edge_types(edge_pop) + + # Check the source nodes exists + src_pop = source_pop if source_pop is not None else edge_pop.source_population + is_internal_src = src_pop in self._internal_populations_map.keys() + is_external_src = src_pop in self._virtual_populations_map.keys() + + trg_pop = target_pop if target_pop is not None else edge_pop.target_population + is_internal_trg = trg_pop in self._internal_populations_map.keys() + + if not is_internal_trg: + self.io.log_exception(('Node population {} does not exists (or consists of only virtual nodes). ' + + '{} edges cannot create connections.').format(trg_pop, pop_name)) + + if not (is_internal_src or is_external_src): + self.io.log_exception('Source node population {} not found. Please update {} edges'.format(src_pop, + pop_name)) + if is_internal_src: + if trg_pop not in self._recurrent_edges: + self._recurrent_edges[trg_pop] = [] + self._recurrent_edges[trg_pop].append(edge_pop) + + if is_external_src: + if trg_pop not in self._external_edges: + self._external_edges[(src_pop, trg_pop)] = [] + self._external_edges[(src_pop, trg_pop)].append(edge_pop) + + self._edge_property_maps[pop_name] = {grp.group_id: self._create_edges_prop_map(grp) + for grp in edge_pop.groups} + + @classmethod + def from_config(cls, conf, **properties): + """Generates a graph structure from a json config file or dictionary. + + :param conf: name of json config file, or a dictionary with config parameters + :param properties: optional properties. + :return: A graph object of type cls + """ + graph = cls(**properties) + + # The simulation run script should create a config-dict since it's likely to vary based on the simulator engine, + # however in the case the user doesn't we will try a generic conversion from dict/json to ConfigDict + if isinstance(conf, ConfigDict): + config = conf + else: + try: + config = ConfigDict.load(conf) + except Exception as e: + graph.io.log_exception('Could not convert {} (type "{}") to json.'.format(conf, type(conf))) + + if not config.with_networks: + graph.io.log_exception('Could not find any network files. Unable to build network.') + + # TODO: These are simulator specific + graph.spike_threshold = config.spike_threshold + graph.dL = config.dL + + # load components + for name, value in config.components.items(): + graph.add_component(name, value) + graph._validate_components() + + # load nodes + gid_map = config.gid_mappings + for node_dict in config.nodes: + nodes_net = sonata.File(data_files=node_dict['nodes_file'], data_type_files=node_dict['node_types_file'], + gid_table=gid_map) + graph.add_nodes(nodes_net) + + # load edges + for edge_dict in config.edges: + target_network = edge_dict['target'] if 'target' in edge_dict else None + source_network = edge_dict['source'] if 'source' in edge_dict else None + edge_net = sonata.File(data_files=edge_dict['edges_file'], data_type_files=edge_dict['edge_types_file']) + graph.add_edges(edge_net, source_pop=target_network, target_pop=source_network) + + graph._node_sets['all'] = NodeSetAll(graph) + for ns_name, ns_filter in conf.node_sets.items(): + graph._node_sets[ns_name] = NodeSet(ns_filter, graph) + + return graph diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/io_tools.py b/bmtk-vb/build/lib/bmtk/simulator/core/io_tools.py new file mode 100644 index 0000000..3750015 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/io_tools.py @@ -0,0 +1,111 @@ +import os +import sys +import shutil +import logging + + +class IOUtils(object): + """ + For logging/mkdir commands we sometimes need to use different MPI classes depending on the simulator being used + (NEST and NEURON have their own barrier functions that don't work well with mpi). We also need to be able to + adjust the logging levels/format at run-time depending on the simulator/configuration options. + + Thus the bulk of the io and logging functions are put into their own class and can be overwritten by specific + simulator modules + """ + def __init__(self): + self.mpi_rank = 0 + self.mpi_size = 1 + + self._log_format = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s") + self._log_level = logging.DEBUG + self._log_to_console = True + self._logger = None + + @property + def log_to_console(self): + return self._log_to_console + + @log_to_console.setter + def log_to_console(self, flag): + assert(isinstance(flag, bool)) + self._log_to_console = flag + + @property + def logger(self): + if self._logger is None: + # Create the logger the first time it is accessed + self._logger = logging.getLogger(self.__class__.__name__) + self._logger.setLevel(self._log_level) + self._set_console_logging() + + return self._logger + + def _set_console_logging(self): + if not self._log_to_console: + return + + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setFormatter(self._log_format) + self._logger.addHandler(console_handler) + + def set_log_format(self, format_str): + self._log_format = logging.Formatter(format_str) + + def set_log_level(self, loglevel): + if isinstance(loglevel, int): + self._log_level = loglevel + + elif isinstance(loglevel, (str, unicode)): + self._log_level = logging.getLevelName(loglevel) + + else: + raise Exception('Error: cannot set logging levels to {}'.format(loglevel)) + + def barrier(self): + pass + + def quiet_simulator(self): + pass + + def setup_output_dir(self, output_dir, log_file, overwrite=True): + if self.mpi_rank == 0: + # Create output directory + if os.path.exists(output_dir): + if overwrite: + shutil.rmtree(output_dir) + else: + self.log_exception('Directory already exists (remove or set to overwrite).') + os.makedirs(output_dir) + + # Create log file + if log_file is not None: + log_path = log_file if os.path.isabs(log_file) else os.path.join(output_dir, log_file) + file_logger = logging.FileHandler(log_path) + file_logger.setFormatter(self._log_format) + self.logger.addHandler(file_logger) + self.log_info('Created log file') + + self.barrier() + + def log_info(self, message, all_ranks=False): + if all_ranks is False and self.mpi_rank != 0: + return + + self.logger.info(message) + + def log_warning(self, message, all_ranks=False): + if all_ranks is False and self.mpi_rank != 0: + return + + self.logger.warning(message) + + def log_exception(self, message): + if self.mpi_rank == 0: + self.logger.error(message) + + self.barrier() + raise Exception(message) + + +io = IOUtils() diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/network_reader.py b/bmtk-vb/build/lib/bmtk/simulator/core/network_reader.py new file mode 100644 index 0000000..8089e32 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/network_reader.py @@ -0,0 +1,73 @@ + + +class NodesReader(object): + def __init__(self): + self._has_internal_nodes = False + self._has_virtual_nodes = False + + @property + def name(self): + raise NotImplementedError() + + @property + def internal_nodes_only(self): + return self._has_internal_nodes and not self._has_virtual_nodes + + @property + def virtual_nodes_only(self): + return self._has_virtual_nodes and not self._has_internal_nodes + + @property + def mixed_nodes(self): + return self._has_internal_nodes and self._has_virtual_nodes + + def initialize(self, network): + raise NotImplementedError() + + @classmethod + def load(cls, **properties): + raise NotImplementedError() + + +class EdgesReader(object): + unknown = 0 + recurrent = 0 + virtual = 1 + mixed = 2 + + def __init__(self): + self._connection_type = -1 + + @property + def recurrent_connections(self): + return self._connection_type == self.recurrent + + @property + def virtual_connections(self): + return self._connection_type == self.virtual + + @property + def mixed_connections(self): + return self._connection_type == self.mixed + + @property + def source_nodes(self): + raise NotImplementedError() + + @property + def target_nodes(self): + raise NotImplementedError() + + def set_connection_type(self, src_pop, trg_pop): + if src_pop.internal_nodes_only and trg_pop.internal_nodes_only: + self._connection_type = self.recurrent + + elif src_pop.virtual_nodes_only and trg_pop.internal_nodes_only: + self._connection_type = self.virtual + + else: + self._connection_type = self.mixed + + def initialize(self, network): + raise NotImplementedError() + diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/node_population.py b/bmtk-vb/build/lib/bmtk/simulator/core/node_population.py new file mode 100644 index 0000000..353bd7a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/node_population.py @@ -0,0 +1,37 @@ +class SimNode(object): + @property + def node_id(self): + raise NotImplementedError() + + @property + def gid(self): + raise NotImplementedError() + + +class NodePopulation(object): + def __init__(self): + self._has_internal_nodes = False + self._has_virtual_nodes = False + + @property + def name(self): + raise NotImplementedError() + + @property + def internal_nodes_only(self): + return self._has_internal_nodes and not self._has_virtual_nodes + + @property + def virtual_nodes_only(self): + return self._has_virtual_nodes and not self._has_internal_nodes + + @property + def mixed_nodes(self): + return self._has_internal_nodes and self._has_virtual_nodes + + def initialize(self, network): + raise NotImplementedError() + + @classmethod + def load(cls, **properties): + raise NotImplementedError() diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/node_sets.py b/bmtk-vb/build/lib/bmtk/simulator/core/node_sets.py new file mode 100644 index 0000000..5a67f95 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/node_sets.py @@ -0,0 +1,57 @@ +from .io_tools import io + + +class NodeSet(object): + def __init__(self, filter_params, network): + self._network = network + self._populations = [] + self._preselected_gids = None + + if isinstance(filter_params, list): + self._preselected_gids = filter_params + elif isinstance(filter_params, dict): + self._filter = filter_params.copy() + self._populations = self._find_populations() + else: + io.log_exception('Unknown node set params type {}'.format(type(filter_params))) + + def _find_populations(self): + for k in ['population', 'populations']: + if k in self._filter: + node_pops = [] + for pop_name in to_list(self._filter[k]): + node_pops.append(self._network.get_node_population(pop_name)) + del self._filter[k] + return node_pops + + return self._network.get_node_populations() + + def populations(self): + return self._populations + + def population_names(self): + return [p.name for p in self._populations] + + def gids(self): + if self._preselected_gids is not None: + for gid in self._preselected_gids: + yield gid + else: + for pop in self._populations: + for node in pop.filter(self._filter): + yield node.node_id + + def nodes(self): + return None + + +class NodeSetAll(NodeSet): + def __init__(self, network): + super(NodeSetAll, self).__init__({}, network) + + +def to_list(val): + if isinstance(val, list): + return val + else: + return [val] diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/simulator.py b/bmtk-vb/build/lib/bmtk/simulator/core/simulator.py new file mode 100644 index 0000000..4a84174 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/simulator.py @@ -0,0 +1,9 @@ +class Simulator(object): + def __init__(self): + self._sim_mods = [] + + def add_mod(self, module): + self._sim_mods.append(module) + + def run(self): + raise NotImplementedError() \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/simulator_network.py b/bmtk-vb/build/lib/bmtk/simulator/core/simulator_network.py new file mode 100644 index 0000000..e1da1b3 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/simulator_network.py @@ -0,0 +1,200 @@ +from six import string_types + +from bmtk.simulator.core.io_tools import io +#from bmtk.simulator.core.config import ConfigDict +from bmtk.simulator.utils.config import ConfigDict +from bmtk.simulator.core.node_sets import NodeSet, NodeSetAll +from bmtk.simulator.core import sonata_reader + + +class SimNetwork(object): + def __init__(self): + self._components = {} + self._io = io + + self._node_adaptors = {} + self._edge_adaptors = {} + self._register_adaptors() + + self._node_populations = {} + self._node_sets = {} + + self._edge_populations = [] + + @property + def io(self): + return self._io + + @property + def node_populations(self): + return self._node_populations.values() + + @property + def recurrent_edges(self): + return [ep for ep in self._edge_populations if ep.recurrent_connections] + + @property + def py_function_caches(self): + return None + + def _register_adaptors(self): + self._node_adaptors['sonata'] = sonata_reader.NodeAdaptor + self._edge_adaptors['sonata'] = sonata_reader.EdgeAdaptor + + def get_node_adaptor(self, name): + return self._node_adaptors[name] + + def get_edge_adaptor(self, name): + return self._edge_adaptors[name] + + def add_component(self, name, path): + self._components[name] = path + + def get_component(self, name): + if name not in self._components: + self.io.log_exception('No network component set with name {}'.format(name)) + else: + return self._components[name] + + def has_component(self, name): + return name in self._components + + def get_node_population(self, name): + return self._node_populations[name] + + def get_node_populations(self): + return self._node_populations.values() + + def add_node_set(self, name, node_set): + self._node_sets[name] = node_set + + def get_node_set(self, node_set): + if isinstance(node_set, string_types) and node_set in self._node_sets: + return self._node_sets[node_set] + + elif isinstance(node_set, (dict, list)): + return NodeSet(node_set, self) + + else: + self.io.log_exception('Unable to load or find node_set "{}"'.format(node_set)) + + def add_nodes(self, node_population): + pop_name = node_population.name + if pop_name in self._node_populations: + # Make sure their aren't any collisions + self.io.log_exception('There are multiple node populations with name {}.'.format(pop_name)) + + node_population.initialize(self) + self._node_populations[pop_name] = node_population + if node_population.mixed_nodes: + # We'll allow a population to have virtual and non-virtual nodes but it is not ideal + self.io.log_warning(('Node population {} contains both virtual and non-virtual nodes which can cause ' + + 'memory and build-time inefficency. Consider separating virtual nodes into their ' + + 'own population').format(pop_name)) + + # Used in inputs/reports when needed to get all gids belonging to a node population + self._node_sets[pop_name] = NodeSet({'population': pop_name}, self) + + def add_edges(self, edge_population): + edge_population.initialize(self) + pop_name = edge_population.name + + # Check that source_population exists + src_pop_name = edge_population.source_nodes + if src_pop_name not in self._node_populations: + self.io.log_exception('Source node population {} not found. Please update {} edges'.format(src_pop_name, + pop_name)) + + # Check that the target population exists and contains non-virtual nodes (we cannot synapse onto virt nodes) + trg_pop_name = edge_population.target_nodes + if trg_pop_name not in self._node_populations or self._node_populations[trg_pop_name].virtual_nodes_only: + self.io.log_exception(('Node population {} does not exists (or consists of only virtual nodes). ' + + '{} edges cannot create connections.').format(trg_pop_name, pop_name)) + + edge_population.set_connection_type(src_pop=self._node_populations[src_pop_name], + trg_pop = self._node_populations[trg_pop_name]) + self._edge_populations.append(edge_population) + + def build(self): + self.build_nodes() + self.build_recurrent_edges() + + def build_nodes(self): + raise NotImplementedError() + + def build_recurrent_edges(self): + raise NotImplementedError() + + def build_virtual_connections(self): + raise NotImplementedError() + + @classmethod + def from_config(cls, conf, **properties): + """Generates a graph structure from a json config file or dictionary. + + :param conf: name of json config file, or a dictionary with config parameters + :param properties: optional properties. + :return: A graph object of type cls + """ + network = cls(**properties) + + # The simulation run script should create a config-dict since it's likely to vary based on the simulator engine, + # however in the case the user doesn't we will try a generic conversion from dict/json to ConfigDict + if isinstance(conf, ConfigDict): + config = conf + else: + try: + config = ConfigDict.load(conf) + except Exception as e: + network.io.log_exception('Could not convert {} (type "{}") to json.'.format(conf, type(conf))) + + if not config.with_networks: + network.io.log_exception('Could not find any network files. Unable to build network.') + + # TODO: These are simulator specific + network.spike_threshold = config.spike_threshold + network.dL = config.dL + + # load components + for name, value in config.components.items(): + network.add_component(name, value) + + # load nodes + gid_map = config.gid_mappings + node_adaptor = network.get_node_adaptor('sonata') + for node_dict in config.nodes: + nodes = sonata_reader.load_nodes(node_dict['nodes_file'], node_dict['node_types_file'], gid_map, + adaptor=node_adaptor) + for node_pop in nodes: + network.add_nodes(node_pop) + + # TODO: Raise a warning if more than one internal population and no gids (node_id collision) + + # load edges + edge_adaptor = network.get_edge_adaptor('sonata') + for edge_dict in config.edges: + if not edge_dict.get('enabled', True): + continue + + edges = sonata_reader.load_edges(edge_dict['edges_file'], edge_dict['edge_types_file'], + adaptor=edge_adaptor) + for edge_pop in edges: + network.add_edges(edge_pop) + + # Add nodeset section + network.add_node_set('all', NodeSetAll(network)) + for ns_name, ns_filter in config.node_sets.items(): + network.add_node_set(ns_name, NodeSet(ns_filter, network)) + + return network + + @classmethod + def from_manifest(cls, manifest_json): + # TODO: Add adaptors to build a simulation network from model files downloaded celltypes.brain-map.org + raise NotImplementedError() + + @classmethod + def from_builder(cls, network): + # TODO: Add adaptors to build a simulation network from a bmtk.builder Network object + raise NotImplementedError() + diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/__init__.py new file mode 100644 index 0000000..9b09281 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/__init__.py @@ -0,0 +1,3 @@ +from .node_adaptor import NodeAdaptor, SonataBaseNode +from .edge_adaptor import EdgeAdaptor, SonataBaseEdge +from .network_reader import load_nodes, load_edges diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/edge_adaptor.py b/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/edge_adaptor.py new file mode 100644 index 0000000..01ebace --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/edge_adaptor.py @@ -0,0 +1,206 @@ +import os +import ast +import json +import types + +import numpy as np + + +class SonataBaseEdge(object): + def __init__(self, sonata_edge, edge_adaptor): + self._edge = sonata_edge + self._prop_adaptor = edge_adaptor + + @property + def source_node_id(self): + return self._edge.source_node_id + + @property + def target_node_id(self): + return self._edge.target_node_id + + @property + def dynamics_params(self): + return self._prop_adaptor.dynamics_params(self._edge) + + @property + def delay(self): + return self._edge['delay'] + + @property + def weight_function(self): + return self._prop_adaptor.weight_function(self._edge) + + @property + def preselected_targets(self): + return self._prop_adaptor.preselected_targets + + @property + def target_sections(self): + return self._edge['target_sections'] + + @property + def target_distance(self): + return self._edge['distance_range'] + + @property + def edge_type_id(self): + return self._edge.edge_type_id + + @property + def nsyns(self): + return self._prop_adaptor.nsyns(self._edge) + + @property + def model_template(self): + return self._edge['model_template'] + + def syn_weight(self, src_node, trg_node): + return self._prop_adaptor.syn_weight(self, src_node=src_node, trg_node=trg_node) + + def __getitem__(self, item): + return self._edge[item] + + +class EdgeAdaptor(object): + def __init__(self, network): + self._network = network + self._func_caches = self._network.py_function_caches + + @property + def batch_process(self): + return False + + @batch_process.setter + def batch_process(self, flag): + pass + + def get_edge(self, sonata_node): + return SonataBaseEdge(sonata_node, self) + + @staticmethod + def preprocess_edge_types(network, edge_population): + edge_types_table = edge_population.types_table + edge_type_ids = np.unique(edge_population.type_ids) + + for et_id in edge_type_ids: + edge_type = edge_types_table[et_id] + if 'dynamics_params' in edge_types_table.columns: + dynamics_params = edge_type['dynamics_params'] + params_dir = network.get_component('synaptic_models_dir') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + edge_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + network.io.log_exception('Could not find edge dynamics_params file {}.'.format(params_path)) + + # Split target_sections + if 'target_sections' in edge_type: + trg_sec = edge_type['target_sections'] + if trg_sec is not None: + try: + edge_type['target_sections'] = ast.literal_eval(trg_sec) + except Exception as exc: + network.io.log_warning('Unable to split target_sections list {}'.format(trg_sec)) + edge_type['target_sections'] = None + + # Split target distances + if 'distance_range' in edge_type: + dist_range = edge_type['distance_range'] + if dist_range is not None: + try: + # TODO: Make the distance range has at most two values + edge_type['distance_range'] = json.loads(dist_range) + except Exception as e: + try: + edge_type['distance_range'] = [0.0, float(dist_range)] + except Exception as e: + network.io.log_warning('Unable to parse distance_range {}'.format(dist_range)) + edge_type['distance_range'] = None + + @classmethod + def create_adaptor(cls, edge_group, network): + prop_map = cls(network) + return cls.patch_adaptor(prop_map, edge_group) + + @staticmethod + def patch_adaptor(adaptor, edge_group): + # dynamics_params + if edge_group.has_dynamics_params: + adaptor.dynamics_params = types.MethodType(group_dynamics_params, adaptor) + else: # 'dynamics_params' in node_group.all_columns: + adaptor.dynamics_params = types.MethodType(types_dynamics_params, adaptor) + + # For fetching/calculating synaptic weights + if 'weight_function' in edge_group.all_columns: + # Customized function for user to calculate the synaptic weight + adaptor.weight_function = types.MethodType(weight_function, adaptor) + adaptor.syn_weight = types.MethodType(syn_weight_function, adaptor) + elif 'syn_weight' in edge_group.all_columns: + # Just return the synaptic weight + adaptor.weight_function = types.MethodType(ret_none_function, adaptor) + adaptor.syn_weight = types.MethodType(syn_weight, adaptor) + else: + raise Exception('Could not find syn_weight or weight_function properties. Cannot create connections.') + + # For determining the synapse placement + if 'sec_id' in edge_group.all_columns: + adaptor.preselected_targets = True + adaptor.nsyns = types.MethodType(no_nsyns, adaptor) + elif 'nsyns' in edge_group.all_columns: + adaptor.preselected_targets = False + adaptor.nsyns = types.MethodType(nsyns, adaptor) + else: + # It will get here for connections onto point neurons + adaptor.preselected_targets = True + adaptor.nsyns = types.MethodType(no_nsyns, adaptor) + + return adaptor + + +def ret_none_function(self, edge): + return None + + +def weight_function(self, edge): + return edge['weight_function'] + + +def syn_weight(self, edge, src_node, trg_node): + return edge['syn_weight'] + + +def syn_weight_function(self, edge, src_node, trg_node): + weight_fnc_name = edge.weight_function + if weight_fnc_name is None: + weight_fnc = self._func_caches.py_modules.synaptic_weight('default_weight_fnc') + return weight_fnc(edge, src_node, trg_node) + + elif self._func_caches.py_modules.has_synaptic_weight(weight_fnc_name): + weight_fnc = self._func_caches.py_modules.synaptic_weight(weight_fnc_name) + return weight_fnc(edge, src_node, trg_node) + + else: + self._network.io.log_exception('weight_function {} is not defined.'.format(weight_fnc_name)) + + +def nsyns(self, edge): + return edge['nsyns'] + + +def no_nsyns(self, edge): + return 1 + + +def types_dynamics_params(self, node): + return node['dynamics_params'] + + +def group_dynamics_params(self, node): + return node.dynamics_params \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/network_reader.py b/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/network_reader.py new file mode 100644 index 0000000..648d9ad --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/network_reader.py @@ -0,0 +1,241 @@ +import os +import numpy as np +import json +import ast + +from bmtk.simulator.core.network_reader import NodesReader, EdgesReader +from bmtk.simulator.core.sonata_reader.node_adaptor import NodeAdaptor +from bmtk.simulator.core.sonata_reader.edge_adaptor import EdgeAdaptor +from bmtk.utils import sonata + + +def load_nodes(nodes_h5, node_types_csv, gid_table=None, selected_nodes=None, adaptor=NodeAdaptor): + return SonataNodes.load(nodes_h5, node_types_csv, gid_table, selected_nodes, adaptor) + + +def load_edges(edges_h5, edge_types_csv, selected_populations=None, adaptor=EdgeAdaptor): + return SonataEdges.load(edges_h5, edge_types_csv, selected_populations, adaptor) + + +class SonataNodes(NodesReader): + def __init__(self, sonata_node_population, prop_adaptor): + super(SonataNodes, self).__init__() + self._node_pop = sonata_node_population + self._pop_name = self._node_pop.name + self._prop_adaptors = {} + self._adaptor = prop_adaptor + + @property + def name(self): + return self._pop_name + + @property + def adaptor(self): + return self._adaptor + + def initialize(self, network): + # Determine the various mode-types available in the Node Population, whether or not a population of nodes + # contains virtual/external nodes, internal nodes, or a mix of both affects how to nodes are built + model_types = set() + for grp in self._node_pop.groups: + if self._adaptor.COL_MODEL_TYPE not in grp.all_columns: + network.io.log_exception('property {} is missing from nodes.'.format(self._adaptor.COL_MODEL_TYPE)) + + model_types.update(set(np.unique(grp.get_values(self._adaptor.COL_MODEL_TYPE)))) + + if 'virtual' in model_types: + self._has_virtual_nodes = True + model_types -= set(['virtual']) + else: + self._has_virtual_nodes = False + + if model_types: + self._has_internal_nodes = True + + self._adaptor.preprocess_node_types(network, self._node_pop) + #self._preprocess_node_types(network) + self._prop_adaptors = {grp.group_id: self._create_adaptor(grp, network) for grp in self._node_pop.groups} + + def _create_adaptor(self, grp, network): + return self._adaptor.create_adaptor(grp, network) + + ''' + def _preprocess_node_types(self, network): + # TODO: The following figures out the actually used node-type-ids. For mem and speed may be better to just + # process them all + node_type_ids = self._node_pop.type_ids + # TODO: Verify all the node_type_ids are in the table + node_types_table = self._node_pop.types_table + + # TODO: Convert model_type to a enum + if network.has_component('morphologies_dir'): + morph_dir = network.get_component('morphologies_dir') + if morph_dir is not None and 'morphology_file' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + if node_type['morphology_file'] is None: + continue + # TODO: Check the file exits + # TODO: See if absolute path is stored in csv + node_type['morphology_file'] = os.path.join(morph_dir, node_type['morphology_file']) + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + if isinstance(dynamics_params, dict): + continue + + model_type = node_type['model_type'] + if model_type == 'biophysical': + params_dir = network.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = network.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = network.get_component('point_neuron_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = network.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + network.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + # TODO: Use adaptor to validate model_type and model_template values + ''' + + @classmethod + def load(cls, nodes_h5, node_types_csv, gid_table=None, selected_nodes=None, adaptor=NodeAdaptor): + sonata_file = sonata.File(data_files=nodes_h5, data_type_files=node_types_csv, gid_table=gid_table) + node_populations = [] + for node_pop in sonata_file.nodes.populations: + node_populations.append(cls(node_pop, adaptor)) + + return node_populations + + def get_node(self, node_id): + return self._node_pop.get_node_id(node_id) + + def __getitem__(self, item): + for base_node in self._node_pop[item]: + snode = self._prop_adaptors[base_node.group_id].get_node(base_node) + yield snode + + def __iter__(self): + return self + + def filter(self, filter_conditons): + for node in self._node_pop.filter(**filter_conditons): + yield node + + def get_nodes(self): + for node_group in self._node_pop.groups: + node_adaptor = self._prop_adaptors[node_group.group_id] + if node_adaptor.batch_process: + for batch in node_adaptor.get_batches(node_group): + yield batch + else: + for node in node_group: + yield node_adaptor.get_node(node) + + +class SonataEdges(EdgesReader): + def __init__(self, edge_population, adaptor): + self._edge_pop = edge_population + self._adaptor_cls = adaptor + self._edge_adaptors = {} + + @property + def name(self): + return self._edge_pop.name + + @property + def source_nodes(self): + return self._edge_pop.source_population + + @property + def target_nodes(self): + return self._edge_pop.target_population + + def initialize(self, network): + self._adaptor_cls.preprocess_edge_types(network, self._edge_pop) + # self._preprocess_edge_types(network) + self._edge_adaptors = {grp.group_id: self._adaptor_cls.create_adaptor(grp, network) + for grp in self._edge_pop.groups} + + def get_target(self, node_id): + for edge in self._edge_pop.get_target(node_id): + yield self._edge_adaptors[edge.group_id].get_edge(edge) + + def get_edges(self): + for edge_group in self._edge_pop.groups: + edge_adaptor = self._edge_adaptors[edge_group.group_id] + if edge_adaptor.batch_process: + for edge in edge_adaptor.get_batches(edge_group): + yield edge + else: + for edge in self._edge_pop: + yield edge_adaptor.get_edge(edge) + + ''' + def _preprocess_edge_types(self, network): + edge_types_table = self._edge_pop.types_table + edge_type_ids = np.unique(self._edge_pop.type_ids) + + for et_id in edge_type_ids: + edge_type = edge_types_table[et_id] + if 'dynamics_params' in edge_types_table.columns: + dynamics_params = edge_type['dynamics_params'] + params_dir = network.get_component('synaptic_models_dir') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + edge_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find edge dynamics_params file {}.'.format(params_path)) + + # Split target_sections + if 'target_sections' in edge_type: + trg_sec = edge_type['target_sections'] + if trg_sec is not None: + try: + edge_type['target_sections'] = ast.literal_eval(trg_sec) + except Exception as exc: + self.io.log_warning('Unable to split target_sections list {}'.format(trg_sec)) + edge_type['target_sections'] = None + + # Split target distances + if 'distance_range' in edge_type: + dist_range = edge_type['distance_range'] + if dist_range is not None: + try: + # TODO: Make the distance range has at most two values + edge_type['distance_range'] = json.loads(dist_range) + except Exception as e: + try: + edge_type['distance_range'] = [0.0, float(dist_range)] + except Exception as e: + self.io.log_warning('Unable to parse distance_range {}'.format(dist_range)) + edge_type['distance_range'] = None + ''' + + @classmethod + def load(cls, edges_h5, edge_types_csv, selected_populations=None, adaptor=EdgeAdaptor): + sonata_file = sonata.File(data_files=edges_h5, data_type_files=edge_types_csv) + edge_populations = [] + for edge_pop in sonata_file.edges.populations: + edge_populations.append(cls(edge_pop, adaptor)) + + return edge_populations diff --git a/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/node_adaptor.py b/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/node_adaptor.py new file mode 100644 index 0000000..f8d980c --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/core/sonata_reader/node_adaptor.py @@ -0,0 +1,207 @@ +import os +import json +import types +import numpy as np + + +class SonataBaseNode(object): + def __init__(self, node, prop_adaptor): + self._node = node + self._prop_adaptor = prop_adaptor + + @property + def node_id(self): + return self._prop_adaptor.node_id(self._node) + + @property + def gid(self): + return self._prop_adaptor.gid(self._node) + + @property + def dynamics_params(self): + return self._prop_adaptor.dynamics_params(self._node) + + @property + def model_type(self): + return self._prop_adaptor.model_type(self._node) + + @property + def model_template(self): + return self._prop_adaptor.model_template(self._node) + + @property + def model_processing(self): + return self._prop_adaptor.model_processing(self._node) + + @property + def network(self): + return self._prop_adaptor.network + + @property + def population(self): + return self._prop_adaptor.network + + def __getitem__(self, prop_key): + return self._node[prop_key] + + +class NodeAdaptor(object): + COL_MODEL_TYPE = 'model_type' + COL_GID = 'gid' + COL_DYNAMICS_PARAM = 'dynamics_params' + COL_MODEL_TEMPLATE = 'model_template' + COL_MODEL_PROCESSING = 'model_processing' + + def __init__(self, network): + self._network = network + self._model_template_cache = {} + self._model_processing_cache = {} + + @property + def batch_process(self): + return False + + @batch_process.setter + def batch_process(self, flag): + pass + + def node_id(self, node): + return node.node_id + + def model_type(self, node): + return node[self.COL_MODEL_TYPE] + + def model_template(self, node): + # TODO: If model-template comes from the types table we should split it in _preprocess_types + model_template_str = node[self.COL_MODEL_TEMPLATE] + if model_template_str is None: + return None + elif model_template_str in self._model_template_cache: + return self._model_template_cache[model_template_str] + else: + template_parts = model_template_str.split(':') + directive, template = template_parts[0], template_parts[1] + self._model_template_cache[model_template_str] = (directive, template) + return directive, template + + def model_processing(self, node): + model_processing_str = node[self.COL_MODEL_PROCESSING] + if model_processing_str is None: + return [] + else: + # TODO: Split in the node_types_table when possible + return model_processing_str.split(',') + + @staticmethod + def preprocess_node_types(network, node_population): + # TODO: The following figures out the actually used node-type-ids. For mem and speed may be better to just + # process them all + #node_type_ids = node_population.type_ids + node_type_ids = np.unique(node_population.type_ids) + # TODO: Verify all the node_type_ids are in the table + node_types_table = node_population.types_table + + # TODO: Convert model_type to a enum + if network.has_component('morphologies_dir'): + morph_dir = network.get_component('morphologies_dir') + if morph_dir is not None and 'morphology' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + if node_type['morphology'] is None: + continue + + # TODO: See if absolute path is stored in csv + swc_path = os.path.join(morph_dir, node_type['morphology']) + + # According to Sonata format, the .swc extension is not needed. Thus we need to add it if req. + if not os.path.exists(swc_path) and not swc_path.endswith('.swc'): + swc_path += '.swc' + if not os.path.exists(swc_path): + network.io.log_exception('Could not find node morphology file {}.'.format(swc_path)) + + node_type['morphology'] = swc_path + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + if isinstance(dynamics_params, dict): + continue + + if dynamics_params is None: + continue + + model_type = node_type['model_type'] + if model_type == 'biophysical': + params_dir = network.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = network.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = network.get_component('point_neuron_models_dir') + elif model_type == 'population': + params_dir = network.get_component('population_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = network.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + network.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + # TODO: Use adaptor to validate model_type and model_template values + + @classmethod + def create_adaptor(cls, node_group, network): + prop_map = cls(network) + return cls.patch_adaptor(prop_map, node_group, network) + + @classmethod + def patch_adaptor(cls, adaptor, node_group, network): + adaptor.network = network + + # Use node_id if the user hasn't specified a gid table + if not node_group.has_gids: + adaptor.gid = types.MethodType(NodeAdaptor.node_id, adaptor) + + # dynamics_params + if node_group.has_dynamics_params: + adaptor.dynamics_params = types.MethodType(group_dynamics_params, adaptor) + elif 'dynamics_params' in node_group.all_columns: + adaptor.dynamics_params = types.MethodType(types_dynamics_params, adaptor) + else: + adaptor.dynamics_params = types.MethodType(none_function, adaptor) + + if 'model_template' not in node_group.all_columns: + adaptor.model_template = types.MethodType(none_function, adaptor) + + if 'model_processing' not in node_group.all_columns: + adaptor.model_processing = types.MethodType(empty_list, adaptor) + + return adaptor + + def get_node(self, sonata_node): + return SonataBaseNode(sonata_node, self) + + +def none_function(self, node): + return None + + +def empty_list(self, node): + return [] + + +def types_dynamics_params(self, node): + return node['dynamics_params'] + + +def group_dynamics_params(self, node): + return node.dynamics_params + diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/__init__.py new file mode 100644 index 0000000..9e6712b --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/__init__.py @@ -0,0 +1,5 @@ +from bmtk.simulator.filternet.filternetwork import FilterNetwork +from bmtk.simulator.filternet.filtersimulator import FilterSimulator +from bmtk.simulator.filternet.config import Config + +import bmtk.simulator.filternet.default_setters diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/cell.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/cell.py new file mode 100644 index 0000000..240cab5 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/cell.py @@ -0,0 +1,28 @@ +from bmtk.simulator.filternet.pyfunction_cache import py_modules + + +class Cell(object): + def __init__(self, node): + self._node = node + self._gid = node.gid + self._node_id = node.node_id + self._lgn_cell_obj = None + + @property + def gid(self): + return self._gid + + @property + def lgn_cell_obj(self): + return self._lgn_cell_obj + + def build(self): + cell_loaders = self._node.model_processing + if len(cell_loaders) > 0: + raise Exception('Cannot use more than one model_processing method per cell. Exiting.') + elif len(cell_loaders) == 1: + model_processing_fnc = py_modules.cell_processor(cell_loaders[0]) + else: + model_processing_fnc = py_modules.cell_processor('default') + + self._lgn_cell_obj = model_processing_fnc(self._node) diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/cell_models.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/cell_models.py new file mode 100644 index 0000000..a415e9f --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/cell_models.py @@ -0,0 +1 @@ +from bmtk.simulator.filternet.lgnmodel.cellmodel import * \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/config.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/config.py new file mode 100644 index 0000000..b10ee10 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/config.py @@ -0,0 +1,8 @@ +import os +import json + +from bmtk.simulator.core.config import ConfigDict + + +class Config(ConfigDict): + pass \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/default_setters/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/default_setters/__init__.py new file mode 100644 index 0000000..6ec46cc --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/default_setters/__init__.py @@ -0,0 +1 @@ +from cell_loaders import * diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/default_setters/cell_loaders.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/default_setters/cell_loaders.py new file mode 100644 index 0000000..c0c74ad --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/default_setters/cell_loaders.py @@ -0,0 +1,9 @@ +from bmtk.simulator.filternet.pyfunction_cache import add_cell_processor + + +def default_cell_loader(node): + print(node.model_template) + print('DEFAULT') + exit() + +add_cell_processor(default_cell_loader, 'default', overwrite=False) diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/filternetwork.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/filternetwork.py new file mode 100644 index 0000000..170a9e7 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/filternetwork.py @@ -0,0 +1,28 @@ +from bmtk.simulator.core.simulator_network import SimNetwork +from bmtk.simulator.filternet.cell import Cell +from bmtk.simulator.filternet.pyfunction_cache import py_modules + + +class FilterNetwork(SimNetwork): + def __init__(self): + super(FilterNetwork, self).__init__() + + self._local_cells = [] + + def cells(self): + return self._local_cells + + def build(self): + self.build_nodes() + + def set_default_processing(self, processing_fnc): + py_modules.add_cell_processor('default', processing_fnc) + + def build_nodes(self): + for node_pop in self.node_populations: + for node in node_pop.get_nodes(): + cell = Cell(node) + cell.build() + self._local_cells.append(cell) + + diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/filters.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/filters.py new file mode 100644 index 0000000..ae53df5 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/filters.py @@ -0,0 +1,3 @@ +from bmtk.simulator.filternet.lgnmodel.temporalfilter import * +from bmtk.simulator.filternet.lgnmodel.spatialfilter import * +from bmtk.simulator.filternet.lgnmodel.linearfilter import * \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/filtersimulator.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/filtersimulator.py new file mode 100644 index 0000000..7d6742a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/filtersimulator.py @@ -0,0 +1,193 @@ +import csv + +from bmtk.simulator.core.simulator import Simulator +import bmtk.simulator.utils.simulation_inputs as inputs +from bmtk.simulator.filternet.config import Config +from bmtk.simulator.filternet.lgnmodel.movie import * +from bmtk.simulator.filternet import modules as mods +from bmtk.simulator.filternet.io_tools import io +from six import string_types + + +class FilterSimulator(Simulator): + def __init__(self, network, dt, tstop): + super(FilterSimulator, self).__init__() + self._network = network + self._dt = dt + self._tstop = tstop/1000.0 + + self.rates_csv = None + self._movies = [] + + def add_movie(self, movie_type, params): + # TODO: Move this into its own factory + movie_type = movie_type.lower() if isinstance(movie_type, string_types) else 'movie' + if movie_type == 'movie' or not movie_type: + raise NotImplementedError + + elif movie_type == 'full_field': + raise NotImplementedError + + elif movie_type == 'full_field_flash': + raise NotImplementedError + + elif movie_type == 'graiting': + init_params = FilterSimulator.find_params(['row_size', 'col_size', 'frame_rate'], **params) + create_params = FilterSimulator.find_params(['gray_screen_dur', 'cpd', 'temporal_f', 'theta', 'contrast'], + **params) + gm = GratingMovie(**init_params) + graiting_movie = gm.create_movie(t_min=0.0, t_max=self._tstop, **create_params) + self._movies.append(graiting_movie) + + else: + raise Exception('Unknown movie type {}'.format(movie_type)) + + def run(self): + for mod in self._sim_mods: + mod.initialize(self) + + io.log_info('Evaluating rates.') + for cell in self._network.cells(): + for movie in self._movies: + ts, f_rates = cell.lgn_cell_obj.evaluate(movie, downsample=1, separable=True) + + for mod in self._sim_mods: + mod.save(self, cell.gid, ts, f_rates) + + """ + if self.rates_csv is not None: + print 'saving {}'.format(cell.gid) + for t, f in zip(t, f_tot): + csv_writer.writerow([t, f, cell.gid]) + csv_fhandle.flush() + """ + io.log_info('Done.') + for mod in self._sim_mods: + mod.finalize(self) + + """ + def generate_spikes(LGN, trials, duration, output_file_name): + # f_tot = np.loadtxt(output_file_name + "_f_tot.csv", delimiter=" ") + # t = f_tot[0, :] + + f = h5.File(output_file_name + "_f_tot.h5", 'r') + f_tot = np.array(f.get('firing_rates_Hz')) + + t = np.array(f.get('time')) + # For h5 files that don't have time explicitly saved + t = np.linspace(0, duration, f_tot.shape[1]) + + + #create output file + f = nwb.create_blank_file(output_file_name + '_spikes.nwb', force=True) + + for trial in range(trials): + for counter in range(len(LGN.nodes())): + try: + spike_train = np.array(f_rate_to_spike_train(t*1000., f_tot[counter, :], np.random.randint(10000), 1000.*min(t), 1000.*max(t), 0.1)) + except: + spike_train = 1000.*np.array(pg.generate_inhomogenous_poisson(t, f_tot[counter, :], seed=np.random.randint(10000))) #convert to milliseconds and hence the multiplication by 1000 + + nwb.SpikeTrain(spike_train, unit='millisecond').add_to_processing(f, 'trial_%s' % trial) + f.close() + + """ + + + @staticmethod + def find_params(param_names, **kwargs): + ret_dict = {} + for pn in param_names: + if pn in kwargs: + ret_dict[pn] = kwargs[pn] + + return ret_dict + + @classmethod + def from_config(cls, config, network): + if not isinstance(config, Config): + try: + config = Config.load(config, False) + except Exception as e: + network.io.log_exception('Could not convert {} (type "{}") to json.'.format(config, type(config))) + + if not config.with_networks: + network.io.log_exception('Could not find any network files. Unable to build network.') + + sim = cls(network=network, dt=config.dt, tstop=config.tstop) + + network.io.log_info('Building cells.') + network.build_nodes() + + # TODO: Need to create a gid selector + for sim_input in inputs.from_config(config): + if sim_input.input_type == 'movie': + sim.add_movie(sim_input.module, sim_input.params) + else: + raise Exception('Unable to load input type {}'.format(sim_input.input_type)) + + + """ + node_set = network.get_node_set(sim_input.node_set) + if sim_input.input_type == 'spikes': + spikes = spike_trains.SpikesInput.load(name=sim_input.name, module=sim_input.module, + input_type=sim_input.input_type, params=sim_input.params) + io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + network.add_spike_trains(spikes, node_set) + + elif sim_input.module == 'IClamp': + # TODO: Parse from csv file + amplitude = sim_input.params['amp'] + delay = sim_input.params['delay'] + duration = sim_input.params['duration'] + gids = sim_input.params['node_set'] + sim.attach_current_clamp(amplitude, delay, duration, node_set) + + elif sim_input.module == 'xstim': + sim.add_mod(mods.XStimMod(**sim_input.params)) + + else: + io.log_exception('Can not parse input format {}'.format(sim_input.name)) + """ + + + rates_csv = config.output.get('rates_csv', None) + rates_h5 = config.output.get('rates_h5', None) + if rates_csv or rates_h5: + sim.add_mod(mods.RecordRates(rates_csv, rates_h5, config.output_dir)) + + spikes_csv = config.output.get('spikes_csv', None) + spikes_h5 = config.output.get('spikes_h5', None) + spikes_nwb = config.output.get('spikes_nwb', None) + if spikes_csv or spikes_h5 or spikes_nwb: + sim.add_mod(mods.SpikesGenerator(spikes_csv, spikes_h5, spikes_nwb, config.output_dir)) + + # Parse the "reports" section of the config and load an associated output module for each report + """ + sim_reports = reports.from_config(config) + for report in sim_reports: + if isinstance(report, reports.SpikesReport): + mod = mods.SpikesMod(**report.params) + + elif isinstance(report, reports.MembraneReport): + if report.params['sections'] == 'soma': + mod = mods.SomaReport(**report.params) + + else: + #print report.params + mod = mods.MembraneReport(**report.params) + + elif isinstance(report, reports.ECPReport): + mod = mods.EcpMod(**report.params) + # Set up the ability for ecp on all relevant cells + # TODO: According to spec we need to allow a different subset other than only biophysical cells + for gid, cell in network.cell_type_maps('biophysical').items(): + cell.setup_ecp() + else: + # TODO: Allow users to register customized modules using pymodules + io.log_warning('Unrecognized module {}, skipping.'.format(report.module)) + continue + + sim.add_mod(mod) + """ + return sim \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/io_tools.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/io_tools.py new file mode 100644 index 0000000..dfdcfaa --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/io_tools.py @@ -0,0 +1 @@ +from bmtk.simulator.core.io_tools import io diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/__init__.py new file mode 100644 index 0000000..72b9443 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/__init__.py @@ -0,0 +1,7 @@ +__version__ = '0.1.0' + +# from lgnmodel import lgnmodel +# from lgnmodel.dev import mask +# from lgnmodel.dev import movie +# from lgnmodel import cellmodel +# from lgnmodel.dev import boundcellmodel diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/cellmodel.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/cellmodel.py new file mode 100644 index 0000000..bc64495 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/cellmodel.py @@ -0,0 +1,358 @@ +#import isee_engine +import os +import itertools +import matplotlib.pyplot as plt +import numpy as np +from . import utilities as util +import importlib +from .kernel import Kernel2D, Kernel3D +from .linearfilter import SpatioTemporalFilter +import json +from .spatialfilter import GaussianSpatialFilter +from .transferfunction import ScalarTransferFunction +from .temporalfilter import TemporalFilterCosineBump +from .cursor import LNUnitCursor, MultiLNUnitCursor +from .movie import Movie +from .lgnmodel1 import LGNModel, heat_plot +from .transferfunction import MultiTransferFunction, ScalarTransferFunction +from .lnunit import LNUnit, MultiLNUnit +from sympy.abc import x as symbolic_x +from sympy.abc import y as symbolic_y + + + +class OnUnit(LNUnit): + + def __init__(self, linear_filter, transfer_function): + assert linear_filter.amplitude > 0 + super(OnUnit, self).__init__(linear_filter, transfer_function) + +class OffUnit(LNUnit): + + def __init__(self, linear_filter, transfer_function): + assert linear_filter.amplitude < 0 + super(OffUnit, self).__init__(linear_filter, transfer_function) + +class LGNOnOffCell(MultiLNUnit): + """A cell model for a OnOff cell""" + def __init__(self, on_filter, off_filter, transfer_function=MultiTransferFunction((symbolic_x, symbolic_y), 'Heaviside(x)*(x)+Heaviside(y)*(y)')): + """Summary + + :param on_filter: + :param off_filter: + :param transfer_function: + """ + self.on_filter = on_filter + self.off_filter = off_filter + self.on_unit = OnUnit(self.on_filter, ScalarTransferFunction('s')) + self.off_unit = OffUnit(self.off_filter, ScalarTransferFunction('s')) + super(LGNOnOffCell, self).__init__([self.on_unit, self.off_unit], transfer_function) + +class TwoSubfieldLinearCell(MultiLNUnit): + + def __init__(self, dominant_filter, nondominant_filter,subfield_separation=10, onoff_axis_angle=45, dominant_subfield_location=(30,40), + transfer_function = MultiTransferFunction((symbolic_x, symbolic_y), 'Heaviside(x)*(x)+Heaviside(y)*(y)')): + + self.subfield_separation = subfield_separation + self.onoff_axis_angle = onoff_axis_angle + self.dominant_subfield_location = dominant_subfield_location + self.dominant_filter = dominant_filter + self.nondominant_filter = nondominant_filter + self.transfer_function= transfer_function + + self.dominant_unit = LNUnit(self.dominant_filter, ScalarTransferFunction('s'), amplitude=self.dominant_filter.amplitude) + self.nondominant_unit = LNUnit(self.nondominant_filter, ScalarTransferFunction('s'), amplitude=self.dominant_filter.amplitude) + + super(TwoSubfieldLinearCell, self).__init__([self.dominant_unit, self.nondominant_unit], self.transfer_function) + + self.dominant_filter.spatial_filter.translate = self.dominant_subfield_location + hor_offset = np.cos(self.onoff_axis_angle*np.pi/180.)*self.subfield_separation + self.dominant_subfield_location[0] + vert_offset = np.sin(self.onoff_axis_angle*np.pi/180.)*self.subfield_separation+ self.dominant_subfield_location[1] + rel_translation = (hor_offset,vert_offset) + self.nondominant_filter.spatial_filter.translate = rel_translation + + +class LGNOnCell(object): + + def __init__(self, **kwargs): + + self.position = kwargs.pop('position', None) + self.weights = kwargs.pop('weights', None) + self.kpeaks = kwargs.pop('kpeaks', None) + self.amplitude = kwargs.pop('amplitude', None) + self.sigma = kwargs.pop('sigma', None) + self.transfer_function_str = kwargs.pop('transfer_function_str', 's') # 'Heaviside(s)*s') + self.metadata = kwargs.pop('metadata', {}) + + temporal_filter = TemporalFilterCosineBump(self.weights, self.kpeaks) + spatial_filter = GaussianSpatialFilter(translate=self.position, sigma=self.sigma, origin=(0,0)) # all distances measured from BOTTOM LEFT + spatiotemporal_filter = SpatioTemporalFilter(spatial_filter, temporal_filter, amplitude=self.amplitude) + transfer_function = ScalarTransferFunction(self.transfer_function_str) + self.unit = OnUnit(spatiotemporal_filter, transfer_function) + +class LGNOffCell(OffUnit): + + def __init__(self, **kwargs): + + lattice_unit_center = kwargs.pop('lattice_unit_center', None) + weights = kwargs.pop('weights', None) + kpeaks = kwargs.pop('kpeaks', None) + amplitude = kwargs.pop('amplitude', None) + sigma = kwargs.pop('sigma', None) + width = kwargs.pop('width', 5) + transfer_function_str = kwargs.pop('transfer_function_str', 'Heaviside(s)*s') + + dxi = np.random.uniform(-width*1./2,width*1./2) + dyi = np.random.uniform(-width*1./2,width*1./2) + temporal_filter = TemporalFilterCosineBump(weights, kpeaks) + spatial_filter = GaussianSpatialFilter(translate=(dxi,dyi), sigma=sigma, origin=lattice_unit_center) # all distances measured from BOTTOM LEFT + spatiotemporal_filter = SpatioTemporalFilter(spatial_filter, temporal_filter, amplitude=amplitude) + transfer_function = ScalarTransferFunction(transfer_function_str) + super(LGNOnCell, self).__init__(spatiotemporal_filter, transfer_function) + +if __name__ == "__main__": + + movie_file = '/data/mat/iSee_temp_shared/movies/TouchOfEvil.npy' + m_data = np.load(movie_file, 'r') + m = Movie(m_data[1000:], frame_rate=30.) + + # Create second cell: + transfer_function = ScalarTransferFunction('s') + temporal_filter = TemporalFilterCosineBump((.4,-.3), (20,60)) + cell_list = [] + for xi in np.linspace(0,m.data.shape[2], 5): + for yi in np.linspace(0,m.data.shape[1], 5): + spatial_filter_on = GaussianSpatialFilter(sigma=(2,2), origin=(0,0), translate=(xi, yi)) + on_linear_filter = SpatioTemporalFilter(spatial_filter_on, temporal_filter, amplitude=20) + spatial_filter_off = GaussianSpatialFilter(sigma=(4,4), origin=(0,0), translate=(xi, yi)) + off_linear_filter = SpatioTemporalFilter(spatial_filter_off, temporal_filter, amplitude=-20) + on_off_cell = LGNOnOffCell(on_linear_filter, off_linear_filter) + cell_list.append(on_off_cell) + + lgn = LGNModel(cell_list) #Here include a list of all cells + y = lgn.evaluate(m, downsample=100) #Does the filtering + non-linearity on movie object m + heat_plot(y, interpolation='none', colorbar=True) + + + + + +# +# def imshow(self, ii, image_shape, fps, ax=None, show=True, relative_spatial_location=(0,0)): +# +# if ax is None: +# _, ax = plt.subplots(1,1) +# +# curr_kernel = self.get_spatio_temporal_kernel(image_shape, fps, relative_spatial_location=relative_spatial_location) +# +# cax = curr_kernel.imshow(ii, ax=ax, show=False) +# +# if show == True: +# plt.show() +# +# return ax +# +# +# class OnOffCellModel(CellModel): +# +# def __init__(self, dc_offset=0, on_subfield=None, off_subfield=None, on_weight = 1, off_weight = -1, t_max=None): +# +# super(self.__class__, self).__init__(dc_offset, t_max) +# +# if isinstance(on_subfield, dict): +# curr_module, curr_class = on_subfield.pop('class') +# self.on_subfield = getattr(importlib.import_module(curr_module), curr_class)(**on_subfield) +# else: +# self.on_subfield = on_subfield +# +# super(self.__class__, self).add_subfield(on_subfield, on_weight) +# +# if isinstance(off_subfield, dict): +# curr_module, curr_class = off_subfield.pop('class') +# self.off_subfield = getattr(importlib.import_module(curr_module), curr_class)(**off_subfield) +# else: +# self.off_subfield = off_subfield +# +# super(self.__class__, self).add_subfield(off_subfield, off_weight) +# +# +# def to_dict(self): +# +# return {'dc_offset':self.dc_offset, +# 'on_subfield':self.on_subfield.to_dict(), +# 'off_subfield':self.off_subfield.to_dict(), +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} +# +# class SingleSubfieldCellModel(CellModel): +# +# def __init__(self, subfield, weight = 1, dc_offset=0, t_max=None): +# +# super(SingleSubfieldCellModel, self).__init__(dc_offset, t_max) +# +# if isinstance(subfield, dict): +# curr_module, curr_class = subfield.pop('class') +# subfield = getattr(importlib.import_module(curr_module), curr_class)(**subfield) +# +# super(self.__class__, self).add_subfield(subfield, weight) +# +# def to_dict(self): +# +# assert len(self.subfield_list) == 1 +# subfield = self.subfield_list[0] +# weight = self.subfield_weight_dict[subfield] +# +# return {'dc_offset':self.dc_offset, +# 'subfield':subfield.to_dict(), +# 'weight':weight, +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} +# +# class OnCellModel(SingleSubfieldCellModel): +# +# def __init__(self, on_subfield, weight = 1, dc_offset=0 , t_max=None): +# assert weight > 0 +# super(OnCellModel, self).__init__(on_subfield, weight, dc_offset, t_max) +# +# def to_dict(self): +# data_dict = super(OnCellModel, self).to_dict() +# data_dict['on_subfield'] = data_dict.pop('subfield') +# return data_dict +# +# class OffCellModel(SingleSubfieldCellModel): +# +# def __init__(self, on_subfield, weight = -1, dc_offset=0 , t_max=None): +# assert weight < 0 +# super(OffCellModel, self).__init__(on_subfield, weight, dc_offset, t_max) +# +# def to_dict(self): +# data_dict = super(OffCellModel, self).to_dict() +# data_dict['off_subfield'] = data_dict.pop('subfield') +# return data_dict + + +# class OffCellModel(CellModel): +# +# def __init__(self, off_subfield, dc_offset=0, off_weight = 1, t_max=None): +# +# assert off_weight < 0. +# self.weight = off_weight +# +# +# +# +# super(self.__class__, self).__init__(dc_offset, t_max) +# +# if isinstance(on_subfield, dict): +# curr_module, curr_class = on_subfield.pop('class') +# self.subfield = getattr(importlib.import_module(curr_module), curr_class)(**on_subfield) +# else: +# self.subfield = on_subfield +# +# super(self.__class__, self).add_subfield(self.subfield, self.weight) +# +# def to_dict(self): +# +# return {'dc_offset':self.dc_offset, +# 'on_subfield':self.subfield.to_dict(), +# 'on_weight':self.weight, +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} + + + + + + +# if __name__ == "__main__": +# +# t = np.arange(0,.5,.001) +# example_movie = movie.Movie(file_name=os.path.join(isee_engine.movie_directory, 'TouchOfEvil.npy'), frame_rate=30.1, memmap=True) +# +# temporal_filter_on = TemporalFilterExponential(weight=1, tau=.05) +# on_subfield = Subfield(scale=(5,15), weight=.5, rotation=30, temporal_filter=temporal_filter_on, translation=(0,0)) +# +# temporal_filter_off = TemporalFilterExponential(weight=2, tau=.01) +# off_subfield = Subfield(scale=(5,15), weight=.5, rotation=-30, temporal_filter=temporal_filter_off) +# +# cell = OnOffCellModel(on_subfield=on_subfield, off_subfield=off_subfield, dc_offset=0., t_max=.5) +# curr_kernel = cell.get_spatio_temporal_kernel((100,150), 30.1) +# curr_kernel.imshow(0) +# +# print cell.to_dict() + + + +# f = cell.get_spatio_temporal_filter(example_movie.movie_data.shape[1:], t,threshold=.5) +# print len(f.t_ind_list) +# +# + +# for ii in range(example_movie.number_of_frames-curr_filter.t_max): +# print ii, example_movie.number_of_frames, curr_filter.map(example_movie, ii) + + +# off_subfield = Subfield(scale=(15,15), weight=.2, translation=(30,30)) + + +# +# curr_filter = cell.get_spatio_temporal_filter((100,150)) +# + +# +# # print touch_of_evil(40.41, mask=m) +# print curr_filter.t_max +# for ii in range(example_movie.number_of_frames-curr_filter.t_max): +# print ii, example_movie.number_of_frames, curr_filter.map(example_movie, ii) + +# cell.visualize_spatial_filter((100,150)) +# show_volume(spatio_temporal_filter, vmin=spatio_temporal_filter.min(), vmax=spatio_temporal_filter.max()) + + + +# def get_spatial_filter(self, image_shape, relative_spatial_location=(0,0), relative_threshold=default_relative_threshold): +# +# # Initialize: +# translation_matrix = util.get_translation_matrix(relative_spatial_location) +# +# # On-subunit: +# on_filter_pre_spatial = self.on_subfield.get_spatial_filter(image_shape) +# on_filter_spatial = util.apply_transformation_matrix(on_filter_pre_spatial, translation_matrix) +# +# # Off-subunit: +# off_filter_pre_spatial = self.off_subfield.get_spatial_filter(image_shape) +# off_filter_spatial = util.apply_transformation_matrix(off_filter_pre_spatial, translation_matrix) +# +# spatial_filter = on_filter_spatial - off_filter_spatial +# +# tmp = np.abs(spatial_filter) +# spatial_filter[np.where(tmp/tmp.max() < relative_threshold )] = 0 +# +# return spatial_filter + +# kernel = float(self.dc_offset)/len(nonzero_ind_tuple[0])+spatio_temporal_filter[nonzero_ind_tuple] + +# def rectifying_filter_factory(kernel, movie, dc_offset=0): +# +# def rectifying_filter(t): +# +# fi = movie.frame_rate*float(t) +# fim, fiM = np.floor(fi), np.ceil(fi) +# +# print t, fim, fiM +# +# try: +# s1 = (movie.movie_data[int(fim)+kernel.t_ind_list, kernel.row_ind_list, kernel.col_ind_list]*kernel.kernel).sum() +# s2 = (movie.movie_data[int(fiM)+kernel.t_ind_list, kernel.row_ind_list, kernel.col_ind_list]*kernel.kernel).sum() +# except IndexError: +# return None +# +# # Linear interpolation: +# s_pre = dc_offset + s1*((1-(fi-fim))*.5) + s2*((fi-fim)*.5) +# +# if s_pre < 0: +# return 0 +# else: +# return float(s_pre) +# +# return rectifying_filter diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/cursor.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/cursor.py new file mode 100644 index 0000000..8406fd1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/cursor.py @@ -0,0 +1,266 @@ +from .movie import Movie +import numpy as np +from .linearfilter import SpatioTemporalFilter +from .spatialfilter import GaussianSpatialFilter +from .temporalfilter import TemporalFilterCosineBump +from .utilities import convert_tmin_tmax_framerate_to_trange +import matplotlib.pyplot as plt +from .kernel import Kernel3D +import scipy.signal as spsig +import time + +class KernelCursor(object): + + + def __init__(self, kernel, movie): + + self.movie = movie + self.kernel = kernel + self.cache = {} + + # print self.kernel.t_range.min(), self.kernel.t_range.max(), type(kernel), len(self.kernel) + + # This ensures that the kernel frame rate matches the movie frame rate: + np.testing.assert_almost_equal(np.diff(self.kernel.t_range), np.ones_like(self.kernel.t_range[1:])*(1./movie.frame_rate)) + + @property + def row_range(self): + return self.movie.row_range + + @property + def col_range(self): + return self.movie.col_range + + @property + def t_range(self): + return self.movie.t_range + + @property + def frame_rate(self): + return self.movie.frame_rate + + def evaluate(self, t_min=None, t_max=None, downsample=1):#:#, show=True, ax=None, plot=False, save_file_name=None, plotstyle='b-'): + + + # print 'EVALUATE' + if t_max is None: + t_max = self.t_range[-1] + + if t_min is None: + t_min = self.t_range[0] + + t_range = convert_tmin_tmax_framerate_to_trange(t_min, t_max, self.movie.frame_rate)[::int(downsample)] + y_vals = np.array([self(t) for t in t_range]) + + return t_range, y_vals + + def __call__(self, t): + + + + if t < self.t_range[0] or t > self.t_range[-1]: + curr_rate = 0 + else: +# print 'zero' + + ti = t*self.frame_rate + til, tir = int(np.floor(ti)), int(np.ceil(ti)) + + tl, tr = float(til)/self.frame_rate, float(tir)/self.frame_rate + if np.abs(tl-t)<1e-12: + curr_rate = self.apply_dot_product(til) + # print 'a' + + elif np.abs(tr-t)<1e-12: + curr_rate = self.apply_dot_product(tir) + # print 'b' + else: + wa, wb = (1-(t-tl)/(tr-tl)), (1-(tr-t)/(tr-tl)) + cl = self.apply_dot_product(til) + cr = self.apply_dot_product(tir) + curr_rate = cl*wa+cr*wb + # print 'c' + + if np.isnan(curr_rate): + assert RuntimeError + + return curr_rate + + def apply_dot_product(self, ti_offset): + + try: + return self.cache[ti_offset] + + except KeyError: + t_inds = self.kernel.t_inds + ti_offset + 1 # Offset by one nhc 14 Apr '17 + min_ind, max_ind = 0, self.movie.data.shape[0] + allowed_inds = np.where(np.logical_and(min_ind <= t_inds, t_inds < max_ind)) + t_inds = t_inds[allowed_inds] + row_inds = self.kernel.row_inds[allowed_inds] + col_inds = self.kernel.col_inds[allowed_inds] + kernel_vector = self.kernel.kernel[allowed_inds] + result = np.dot(self.movie[t_inds, row_inds, col_inds],kernel_vector) + self.cache[ti_offset ] = result + return result + +class FilterCursor(KernelCursor): + + def __init__(self, spatiotemporal_filter, movie, threshold=0): + + self.spatiotemporal_filter = spatiotemporal_filter + kernel = self.spatiotemporal_filter.get_spatiotemporal_kernel(movie.row_range, movie.col_range, t_range=movie.t_range, threshold=threshold, reverse=True) + + super(FilterCursor, self).__init__(kernel, movie) + +class LNUnitCursor(KernelCursor): + + def __init__(self, lnunit, movie, threshold=0): + + # print 'LNUnitCursor' + + self.lnunit = lnunit + + kernel = lnunit.get_spatiotemporal_kernel(movie.row_range, movie.col_range, movie.t_range, reverse=True, threshold=threshold) + + kernel.apply_threshold(threshold) + + super(LNUnitCursor, self).__init__(kernel, movie) + + def __call__(self, t): + return self.lnunit.transfer_function(super(LNUnitCursor, self).__call__(t)) + +class MultiLNUnitCursor(object): + + def __init__(self, multi_lnunit, movie, threshold=0): + + self.multi_lnunit = multi_lnunit + self.lnunit_cursor_list = [LNUnitCursor(lnunit, movie, threshold=threshold) for lnunit in multi_lnunit.lnunit_list] + self.movie = movie + + def evaluate(self, **kwargs): + +# print len(self.lnunit_cursor_list) +# for ii, x in enumerate(self.lnunit_cursor_list): +# +# print ii, self.multi_lnunit, self.multi_lnunit.transfer_function, x +# print ii, x.evaluate(**kwargs), kwargs +# print 'done' +# # print lnunit, movie, curr_cursor + + + + multi_e = [unit_cursor.evaluate(**kwargs) for unit_cursor in self.lnunit_cursor_list] + t_list, y_list = zip(*multi_e) + +# plt.figure() +# plt.plot(t_list[0],y_list[0]) +# plt.plot(t_list[0],y_list[1],'r') +# plt.show() + + #sys.exit() + +# print len(y_list) + + return t_list[0], self.multi_lnunit.transfer_function(*y_list) + +class MultiLNUnitMultiMovieCursor(MultiLNUnitCursor): + + def __init__(self, multi_lnunit, movie_list, threshold=0.): + + assert len(multi_lnunit.lnunit_list) == len(movie_list) + + self.multi_lnunit = multi_lnunit + self.lnunit_movie_list = movie_list + self.lnunit_cursor_list = [lnunit.get_cursor(movie, threshold=threshold) for lnunit, movie in zip(multi_lnunit.lnunit_list, movie_list)] +# for lnunit, movie, curr_cursor in zip(multi_lnunit.lnunit_list, movie_list, self.lnunit_cursor_list): +# print lnunit, movie, curr_cursor + +class SeparableKernelCursor(object): + + def __init__(self, spatial_kernel, temporal_kernel, movie): + '''Assumes temporal kernel is not reversed''' + + self.movie = movie + self.spatial_kernel = spatial_kernel + self.temporal_kernel = temporal_kernel + + def evaluate(self, threshold=0): + + full_spatial_kernel = np.array([self.spatial_kernel.full()]) + full_temporal_kernel = self.temporal_kernel.full() + + nonzero_inds = np.where(np.abs(full_spatial_kernel[0,:,:])>=threshold) + rm, rM = nonzero_inds[0].min(), nonzero_inds[0].max() + cm, cM = nonzero_inds[1].min(), nonzero_inds[1].max() + + convolution_answer_sep_spatial = (self.movie.data[:,rm:rM+1, cm:cM+1] * full_spatial_kernel[:,rm:rM+1, cm:cM+1]).sum(axis=1).sum(axis=1) + sig_tmp = np.zeros(len(full_temporal_kernel) + len(convolution_answer_sep_spatial) - 1) + sig_tmp[len(full_temporal_kernel)-1:] = convolution_answer_sep_spatial + convolution_answer_sep = spsig.convolve(sig_tmp, full_temporal_kernel[::-1], mode='valid') + t = np.arange(len(convolution_answer_sep))/self.movie.frame_rate + return t, convolution_answer_sep + + +class SeparableSpatioTemporalFilterCursor(SeparableKernelCursor): + + def __init__(self, spatiotemporal_filter, movie): + + self.spatial_filter = spatiotemporal_filter.spatial_filter + self.temporal_filter = spatiotemporal_filter.temporal_filter + + spatial_kernel = self.spatial_filter.get_kernel(movie.row_range, movie.col_range, threshold=-1) + temporal_kernel = self.temporal_filter.get_kernel(t_range=movie.t_range, threshold=0, reverse=True) + spatial_kernel.kernel *= spatiotemporal_filter.amplitude + + super(SeparableSpatioTemporalFilterCursor, self).__init__(spatial_kernel, + temporal_kernel, + movie) + + +class SeparableLNUnitCursor(SeparableSpatioTemporalFilterCursor): + def __init__(self, lnunit, movie): + self.lnunit = lnunit + + super(SeparableLNUnitCursor, self).__init__(self.lnunit.linear_filter, movie) + + def evaluate(self, downsample = 1): + + assert downsample == 1 + + t, y = super(SeparableLNUnitCursor, self).evaluate() + + return t, [self.lnunit.transfer_function(yi) for yi in y] + +class SeparableMultiLNUnitCursor(object): + + def __init__(self, multilnunit, movie): + + self.multilnunit = multilnunit + + self.lnunit_cursor_list = [] + for lnunit in self.multilnunit.lnunit_list: + self.lnunit_cursor_list.append(SeparableLNUnitCursor(lnunit, movie)) + + def evaluate(self, *args, **kwargs): + + assert kwargs.get('downsample', 1) == 1 + + y_list = [] + for cursor in self.lnunit_cursor_list: + t, y = cursor.evaluate(*args, **kwargs) + y_list.append(y) + + return t, self.multilnunit.transfer_function(*y_list) + +# if __name__ == "__main__": +# spatial_filter_1 = GaussianSpatialFilter(sigma=(2.,2.), amplitude=10) +# temporal_filter = TemporalFilterCosineBump((.4,-.3), (40,80)) +# curr_filter = SpatioTemporalFilter(spatial_filter_1, temporal_filter) +# +# movie_file = '/data/mat/iSee_temp_shared/movies/TouchOfEvil.npy' +# m_data = np.load(movie_file, 'r') +# movie = Movie(m_data[:,:,:], frame_rate=30.) +# cursor = FilterCursor(curr_filter, movie, threshold=-1) +# cursor.evaluate() + + \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/fitfuns.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/fitfuns.py new file mode 100644 index 0000000..5b67919 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/fitfuns.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +""" +Created on Thu Nov 13 17:07:50 2014 + +@author: rami +""" +import os +from math import * +import numpy as np +import numpy.fft as npft +from random import * +import scipy.io as sio +#import statsmodels.api as sm +from scipy import stats +import matplotlib.pyplot as plt + +def makeFitStruct_GLM(dtsim,kbasprs,nkt,flag_exp): + + gg = {} + gg['k'] = [] + gg['dc'] = 0 + gg['kt'] = np.zeros((nkt,1)) + gg['ktbas'] = [] + gg['kbasprs'] = kbasprs + gg['dt'] = dtsim + + nkt = nkt + if flag_exp==0: + ktbas = makeBasis_StimKernel(kbasprs,nkt) + else: + ktbas = makeBasis_StimKernel_exp(kbasprs,nkt) + + gg['ktbas'] = ktbas + gg['k'] = gg['ktbas']*gg['kt'] + + return gg + +def makeBasis_StimKernel(kbasprs,nkt): + + neye = kbasprs['neye'] + ncos = kbasprs['ncos'] + kpeaks = kbasprs['kpeaks'] + kdt = 1 + b = kbasprs['b'] + delays_raw = kbasprs['delays'] + delays = delays_raw[0].astype(int) + + ylim = np.array([100.,200.]) # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!HARD-CODED FOR NOW +# yrnge = nlin(kpeaks + b*np.ones(np.shape(kpeaks))) + yrnge = nlin(ylim + b*np.ones(np.shape(kpeaks))) + db = (yrnge[-1]-yrnge[0])/(ncos-1) + ctrs = nlin(np.array(kpeaks))#yrnge + mxt = invnl(yrnge[ncos-1]+2*db)-b + kt0 = np.arange(0,mxt,kdt) #-delay + nt = len(kt0) + e1 = np.tile(nlin(kt0+b*np.ones(np.shape(kt0))),(ncos,1)) + e2 = np.transpose(e1) + e3 = np.tile(ctrs,(nt,1)) + + kbasis0 = [] + for kk in range(ncos): + kbasis0.append(ff(e2[:,kk],e3[:,kk],db)) + + + #Concatenate identity vectors + nkt0 = np.size(kt0,0) + a1 = np.concatenate((np.eye(neye), np.zeros((nkt0,neye))),axis=0) + a2 = np.concatenate((np.zeros((neye,ncos)),np.array(kbasis0).T),axis=0) + kbasis = np.concatenate((a1,a2),axis=1) + kbasis = np.flipud(kbasis) + nkt0 = np.size(kbasis,0) + + if nkt0 < nkt: + kbasis = np.concatenate((np.zeros((nkt-nkt0,ncos+neye)),kbasis),axis=0) + elif nkt0 > nkt: + kbasis = kbasis[-1-nkt:-1,:] + + + kbasis = normalizecols(kbasis) + +# plt.figure() +# plt.plot(kbasis[:,0],'b') +# plt.plot(kbasis[:,1],'r') +# plt.show() +# +# print kpeaks +# print nkt0, nkt +# print delays[0][0], delays[0][1] +# print sev + kbasis2_0 = np.concatenate((kbasis[:,0],np.zeros((delays[0],))),axis=0) + kbasis2_1 = np.concatenate((kbasis[:,1],np.zeros((delays[1],))),axis=0) + +# plt.figure() +# plt.plot(kbasis2_0,'b') +# plt.plot(kbasis2_1,'r') +# plt.show(block=False) + + len_diff = delays[1]-delays[0] + kbasis2_1 = kbasis2_1[len_diff:] + + kbasis2 = np.zeros((len(kbasis2_0),2)) + kbasis2[:,0] = kbasis2_0 + kbasis2[:,1] = kbasis2_1 + # print(np.shape(kbasis2_0)) + # print(len(kbasis2_0), len(kbasis2_1)) + + +# plt.figure() +# plt.plot(kbasis[:,0],'b') +# plt.plot(kbasis[:,1],'r') +# plt.plot(kbasis2_0,'m') +# plt.plot(kbasis2_1,'k') +# plt.show(block=False) + + kbasis2 = normalizecols(kbasis2) + + return kbasis2 + + +def makeBasis_StimKernel_exp(kbasprs,nkt): + ks = kbasprs['ks'] + b = kbasprs['b'] + x0 = np.arange(0,nkt) + kbasis = np.zeros((nkt,len(ks))) + for ii in range(len(ks)): + kbasis[:,ii] = invnl(-ks[ii]*x0) #(1.0/ks[ii])* + + kbasis = np.flipud(kbasis) + #kbasis = normalizecols(kbasis) + + return kbasis + +def nlin(x): + eps = 1e-20 + #x.clip(0.) + + return np.log(x+eps) + +def invnl(x): + eps = 1e-20 + return np.exp(x)-eps + +def ff(x,c,dc): + rowsize = np.size(x,0) + m = [] + for i in range(rowsize): + xi = x[i] + ci = c[i] + val=(np.cos(np.max([-pi,np.min([pi,(xi-ci)*pi/dc/2])]))+1)/2 + m.append(val) + + return np.array(m) + +def normalizecols(A): + + B = A/np.tile(np.sqrt(sum(A**2,0)),(np.size(A,0),1)) + + return B + +def sameconv(A,B): + + am = np.size(A) + bm = np.size(B) + nn = am+bm-1 + + q = npft.fft(A,nn)*npft.fft(np.flipud(B),nn) + p = q + G = npft.ifft(p) + G = G[range(am)] + + return G + +# kbasprs = {} +# kbasprs['neye'] = 0 +# kbasprs['ncos'] = 2 +# kbasprs['kpeaks'] = 40,80 +# kbasprs['b'] = .3 +# +# nkt = 400 +# +# filter_data = makeBasis_StimKernel(kbasprs, nkt) +# +# print filter_data +# +# print [x for x in filter_data.T] +# +# import matplotlib.pyplot as plt +# plt.plot(filter_data[:,0]+filter_data[:,1]) +# plt.show() + diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/kernel.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/kernel.py new file mode 100644 index 0000000..820b1a3 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/kernel.py @@ -0,0 +1,475 @@ +#from matplotlib import _cntr as cntr +import matplotlib as mpl +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm +import scipy.interpolate as spinterp +import h5py +import numpy as np +import bisect +import matplotlib.pyplot as plt + +def find_l_r_in_t_range(t_range, t): + + for tl in range(len(t_range)-1): + tr = tl+1 + test_val = (t_range[tl]-t)*(t_range[tr]-t) + if np.abs(test_val) < 1e-16: + + if np.abs(t_range[tl]-t) < 1e-16: + return (tl,) + else: + return (tr,) + + elif test_val < 0: + t_range[tl], t_range[tr], t + return tl, tr + +def get_contour(X, Y, Z, c): + contour_obj = plt.contour(X, Y, Z) + #contour_obj = cntr.Cntr(X, Y, Z) + res = contour_obj.trace(c) + nseg = len(res) // 2 + if nseg > 0: + seg = res[:nseg][0] + return seg[:,0], seg[:,1] + else: + return [],[] + +def plot_single_contour(ax, x_contour, y_contour, t, color): + t_contour = t+np.zeros_like(x_contour) + ax.plot(x_contour, t_contour, y_contour, zdir='z', color=color) + + +class Kernel1D(object): + + def rescale(self): + #self.kernel /= np.abs(self.kernel).sum() + if np.abs(self.kernel.sum())!=0: + self.kernel /= np.abs(self.kernel.sum()) + + def normalize(self): +# self.kernel /= np.abs(self.kernel).sum() + self.kernel /= np.abs(self.kernel.sum()) +# self.kernel /= self.kernel.sum() + + + def __init__(self, t_range, kernel_array, threshold=0., reverse=False): + assert len(t_range) == len(kernel_array) + + kernel_array = np.array(kernel_array) + inds_to_keep = np.where(np.abs(kernel_array) > threshold) + + if reverse == True: + self.t_range = -np.array(t_range)[::-1] + + t_inds_tmp = inds_to_keep[0] + max_t_ind = t_inds_tmp.max() + reversed_t_inds = max_t_ind - t_inds_tmp + self.t_inds = reversed_t_inds - max_t_ind - 1 # Had an off by one error here should be "- 1" nhc 14 Apr '17 change made in cursor evalutiate too + + else: + self.t_range = np.array(t_range) + self.t_inds = inds_to_keep[0] + + self.kernel = kernel_array[inds_to_keep] + assert len(self.t_inds) == len(self.kernel) + + def __len__(self): + return len(self.kernel) + + def imshow(self, ax=None, show=True, save_file_name=None, ylim=None, xlim=None,color='b'): + + if ax is None: + _, ax = plt.subplots(1,1) + + t_vals = self.t_range[self.t_inds] + + ax.plot(t_vals, self.kernel, color) + ax.set_xlabel('Time (Seconds)') + + if not ylim is None: + ax.set_ylim(ylim) + + if not xlim is None: + ax.set_xlim(xlim) + else: + a,b=(t_vals[0], t_vals[-1]) + ax.set_xlim(min(a,b), max(a,b)) + + if not save_file_name is None: + ax.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + return ax, (t_vals, self.kernel) + + def full(self, truncate_t=True): + data = np.zeros(len(self.t_range)) + data[self.t_inds] = self.kernel + + + if truncate_t == True: + ind_min = np.where(np.abs(data) > 0)[0].min() + return data[ind_min:] + else: + return data + + + + return data + +class Kernel2D(object): + + def rescale(self): + #self.kernel /= np.abs(self.kernel).sum() + if np.abs(self.kernel.sum())!=0: + self.kernel /= np.abs(self.kernel.sum()) + + def normalize(self): +# self.kernel /= np.abs(self.kernel).sum() + self.kernel /= np.abs(self.kernel.sum()) + + @classmethod + def from_dense(cls, row_range, col_range, kernel_array, threshold=0.): + col_range = np.array(col_range).copy() + row_range = np.array(row_range).copy() + kernel_array = np.array(kernel_array).copy() + inds_to_keep = np.where(np.abs(kernel_array) > threshold) + kernel = kernel_array[inds_to_keep] + if len(inds_to_keep) == 1: + col_inds, row_inds = np.array([]), np.array([]) + else: + col_inds, row_inds = inds_to_keep + + return cls(row_range, col_range, row_inds, col_inds, kernel) + + @classmethod + def copy(cls, instance): + return cls(instance.row_range.copy(), + instance.col_range.copy(), + instance.row_inds.copy(), + instance.col_inds.copy(), + instance.kernel.copy()) + + + def __init__(self, row_range, col_range, row_inds, col_inds, kernel): + + + self.col_range = np.array(col_range) + self.row_range = np.array(row_range) + self.row_inds = np.array(row_inds) + self.col_inds = np.array(col_inds) + + self.kernel = np.array(kernel) + + assert len(self.row_inds) == len(self.col_inds) + assert len(self.row_inds) == len(self.kernel) + + def __mul__(self, constant): + + new_copy = Kernel2D.copy(self) + new_copy.kernel *= constant + return new_copy + + def __add__(self, other): + + + if len(other) == 0: + return self + + try: + np.testing.assert_almost_equal(self.row_range, other.row_range) + np.testing.assert_almost_equal(self.col_range, other.col_range) + except: + raise Exception('Kernels must exist on same grid to be added') + + row_range = self.row_range.copy() + col_range = self.col_range.copy() + + kernel_dict = {} + for key, ker in zip(zip(self.row_inds, self.col_inds), self.kernel): + kernel_dict[key] = kernel_dict.setdefault(key, 0) + ker + for key, ker in zip(zip(other.row_inds, other.col_inds), other.kernel): + kernel_dict[key] = kernel_dict.setdefault(key, 0) + ker + + key_list, kernel_list = zip(*kernel_dict.items()) + row_inds_list, col_inds_list = zip(*key_list) + row_inds = np.array(row_inds_list) + col_inds = np.array(col_inds_list) + kernel = np.array(kernel_list) + + return Kernel2D(row_range, col_range, row_inds, col_inds, kernel) + + def apply_threshold(self, threshold): + + inds_to_keep = np.where(np.abs(self.kernel) > threshold) + self.row_inds = self.row_inds[inds_to_keep] + self.col_inds = self.col_inds[inds_to_keep] + self.kernel = self.kernel[inds_to_keep] + + def full(self): + data = np.zeros((len(self.row_range), len(self.col_range))) + data[self.row_inds, self.col_inds] = self.kernel + return data + + def imshow(self, ax=None, show=True, save_file_name=None, clim=None, colorbar=True): + + from mpl_toolkits.axes_grid1 import make_axes_locatable + + if ax is None: + _, ax = plt.subplots(1,1) + + if colorbar == True: + divider = make_axes_locatable(ax) + cax = divider.append_axes("right", size = "5%", pad = 0.05) + + data = self.full() + + if not clim is None: + im = ax.imshow(data, extent=(self.col_range[0], self.col_range[-1], self.row_range[0], self.row_range[-1]), origin='lower', clim=clim, interpolation='none') + else: + im = ax.imshow(data, extent=(self.col_range[0], self.col_range[-1], self.row_range[0], self.row_range[-1]), origin='lower', interpolation='none') + + if colorbar == True: + plt.colorbar(im,cax=cax) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + return ax, data + + def __len__(self): + return len(self.kernel) + +class Kernel3D(object): + + def rescale(self): + #self.kernel /= np.abs(self.kernel).sum() + if np.abs(self.kernel.sum())!=0: + self.kernel /= np.abs(self.kernel.sum()) + + def normalize(self): + #self.kernel /= np.abs(self.kernel).sum() +# print self.kernel.sum() + self.kernel /= (self.kernel.sum())*np.sign(self.kernel.sum()) +# print self.kernel.sum() +# sys.exit() + + @classmethod + def copy(cls, instance): + return cls(instance.row_range.copy(), + instance.col_range.copy(), + instance.t_range.copy(), + instance.row_inds.copy(), + instance.col_inds.copy(), + instance.t_inds.copy(), + instance.kernel.copy()) + + def __len__(self): + return len(self.kernel) + + def __init__(self, row_range, col_range, t_range, row_inds, col_inds, t_inds, kernel): + + self.col_range = np.array(col_range) + self.row_range = np.array(row_range) + self.t_range = np.array(t_range) + self.col_inds = np.array(col_inds) + self.row_inds = np.array(row_inds) + self.t_inds = np.array(t_inds) + self.kernel = np.array(kernel) + + assert len(self.row_inds) == len(self.col_inds) + assert len(self.row_inds) == len(self.t_inds) + assert len(self.row_inds) == len(self.kernel) + + def apply_threshold(self, threshold): + + inds_to_keep = np.where(np.abs(self.kernel) > threshold) + self.row_inds = self.row_inds[inds_to_keep] + self.col_inds = self.col_inds[inds_to_keep] + self.t_inds = self.t_inds[inds_to_keep] + self.kernel = self.kernel[inds_to_keep] + + def __add__(self, other): + + + if len(other) == 0: + return self + + try: + if not (len(self.row_range) == 0 or len(other.row_range) == 0): + np.testing.assert_almost_equal(self.row_range, other.row_range) + if not (len(self.col_range) == 0 or len(other.col_range) == 0): + np.testing.assert_almost_equal(self.col_range, other.col_range) + if not (len(self.t_range) == 0 or len(other.t_range) == 0): + np.testing.assert_almost_equal(self.t_range, other.t_range) + except: + raise Exception('Kernels must exist on same grid to be added') + + if len(self.row_range) == 0: + row_range = other.row_range.copy() + else: + row_range = self.row_range.copy() + if len(self.col_range) == 0: + col_range = other.col_range.copy() + else: + col_range = self.col_range.copy() + if len(self.t_range) == 0: + t_range = other.t_range.copy() + else: + t_range = self.t_range.copy() + + kernel_dict = {} + for key, ker in zip(zip(self.row_inds, self.col_inds, self.t_inds), self.kernel): + kernel_dict[key] = kernel_dict.setdefault(key, 0) + ker + for key, ker in zip(zip(other.row_inds, other.col_inds, other.t_inds), other.kernel): + kernel_dict[key] = kernel_dict.setdefault(key, 0) + ker + + key_list, kernel_list = zip(*kernel_dict.items()) + row_inds_list, col_inds_list, t_inds_list = zip(*key_list) + row_inds = np.array(row_inds_list) + col_inds = np.array(col_inds_list) + t_inds = np.array(t_inds_list) + kernel = np.array(kernel_list) + + return Kernel3D(row_range, col_range, t_range, row_inds, col_inds, t_inds, kernel) + + def __mul__(self, constant): + + new_copy = Kernel3D.copy(self) + new_copy.kernel *= constant + return new_copy + + def t_slice(self, t): + + ind_list = find_l_r_in_t_range(self.t_range, t) + + if ind_list is None: + return None + + elif len(ind_list) == 1: + + t_ind_i = ind_list[0] + inds_i = np.where(self.t_range[self.t_inds] == self.t_range[t_ind_i]) + row_inds = self.row_inds[inds_i] + col_inds = self.col_inds[inds_i] + kernel = self.kernel[inds_i] + return Kernel2D(self.row_range, self.col_range, row_inds, col_inds, kernel) + + else: + t_ind_l, t_ind_r = ind_list + t_l, t_r = self.t_range[t_ind_l], self.t_range[t_ind_r] + + inds_l = np.where(self.t_range[self.t_inds] == self.t_range[t_ind_l]) + inds_r = np.where(self.t_range[self.t_inds] == self.t_range[t_ind_r]) + row_inds_l = self.row_inds[inds_l] + col_inds_l = self.col_inds[inds_l] + kernel_l = self.kernel[inds_l] + kl = Kernel2D(self.row_range, self.col_range, row_inds_l, col_inds_l, kernel_l) + row_inds_r = self.row_inds[inds_r] + col_inds_r = self.col_inds[inds_r] + kernel_r = self.kernel[inds_r] + kr = Kernel2D(self.row_range, self.col_range, row_inds_r, col_inds_r, kernel_r) + wa, wb = (1-(t-t_l)/(t_r-t_l)), (1-(t_r-t)/(t_r-t_l)) + + return kl*wa + kr*wb + + def full(self, truncate_t=True): + + data = np.zeros((len(self.t_range), len(self.row_range), len(self.col_range))) + data[self.t_inds, self.row_inds, self.col_inds] = self.kernel + + if truncate_t == True: + ind_max = np.where(np.abs(data) > 0)[0].min() + return data[ind_max:, :, :] + else: + return data + + + # if truncate_t == True: + # ind_min = np.where(np.abs(data) > 0)[0].min() + # return data[ind_min:] + # else: + # return data + + def imshow(self, ax=None, t_range=None, cmap=cm.bwr, N=10, show=True, save_file_name=None, kvals=None): + + if ax is None: + fig = plt.figure() + ax = fig.gca(projection='3d') + + if t_range is None: + t_range = self.t_range + + slice_list_sparse = [self.t_slice(t) for t in t_range] + slice_list = [] + slice_t_list = [] + for curr_slice, curr_t in zip(slice_list_sparse, t_range): + if not curr_slice is None: + slice_list.append(curr_slice.full()) + slice_t_list.append(curr_t) + all_slice_max = max(map(np.max, slice_list)) + all_slice_min = min(map(np.min, slice_list)) + upper_bound = max(np.abs(all_slice_max), np.abs(all_slice_min)) + lower_bound = -upper_bound + norm = mpl.colors.Normalize(vmin=lower_bound, vmax=upper_bound) + color_mapper = cm.ScalarMappable(norm=norm, cmap=cmap).to_rgba + + if kvals is None: + kvals = np.linspace(lower_bound, upper_bound, N) + + X, Y = np.meshgrid(self.row_range, self.col_range) + + contour_dict = {} + for kval in kvals: + for t_val, curr_slice in zip(slice_t_list, slice_list): + x_contour, y_contour = get_contour(Y, X, curr_slice.T, kval) + contour_dict[kval, t_val] = x_contour, y_contour + color = color_mapper(kval) + color = color[0], color[1], color[2], np.abs(kval)/upper_bound + plot_single_contour(ax, x_contour, y_contour, t_val, color) + + ax.set_zlim(self.row_range[0], self.row_range[-1]) + ax.set_ylim(self.t_range[0], self.t_range[-1]) + ax.set_xlim(self.col_range[0], self.col_range[-1]) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + return ax, contour_dict + +def merge_spatial_temporal(spatial_kernel, temporal_kernel, threshold=0): + + t_range = temporal_kernel.t_range + + spatiotemporal_kernel = np.ones(( len(temporal_kernel), len(spatial_kernel))) + spatiotemporal_kernel *= spatial_kernel.kernel[None, :] + spatiotemporal_kernel *= temporal_kernel.kernel[:,None] + spatiotemporal_kernel = spatiotemporal_kernel.reshape((np.prod(spatiotemporal_kernel.shape))) + + spatial_coord_array = np.empty((len(spatial_kernel),2)) + spatial_coord_array[:,0] = spatial_kernel.col_inds + spatial_coord_array[:,1] = spatial_kernel.row_inds + + spatiiotemporal_coord_array = np.zeros((len(spatial_kernel)*len(temporal_kernel),3)) + spatiiotemporal_coord_array[:,0:2] = np.kron(np.ones((len(temporal_kernel),1)),spatial_coord_array) + spatiiotemporal_coord_array[:,2] = np.kron(temporal_kernel.t_inds, np.ones(len(spatial_kernel))) + + col_inds, row_inds, t_inds = map(lambda x:x.astype(np.int),spatiiotemporal_coord_array.T) + kernel = Kernel3D(spatial_kernel.row_range, spatial_kernel.col_range, t_range, row_inds, col_inds, t_inds, spatiotemporal_kernel) + kernel.apply_threshold(threshold) + + return kernel + + + +# Candidate for print +# for ri, ci, ti, k in zip(kernel.row_inds, kernel.col_inds, kernel.t_inds, kernel.kernel): +# print ri, ci, ti, k diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/lattice_unit_constructor.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/lattice_unit_constructor.py new file mode 100644 index 0000000..4de580d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/lattice_unit_constructor.py @@ -0,0 +1,254 @@ +import scipy.io as sio +import os +import matplotlib.pyplot as plt +import isee_engine.nwb as nwb +from linearfilter import SpatioTemporalFilter +import numpy as np +from spatialfilter import GaussianSpatialFilter +from transferfunction import ScalarTransferFunction +from temporalfilter import TemporalFilterCosineBump +from cursor import LNUnitCursor, MultiLNUnitCursor +from movie import Movie +from lgnmodel1 import LGNModel, heat_plot +from cellmodel import LGNOnCell, LGNOffCell,LGNOnOffCell,TwoSubfieldLinearCell +from transferfunction import MultiTransferFunction, ScalarTransferFunction +from lnunit import LNUnit, MultiLNUnit +from sympy.abc import x as symbolic_x +from sympy.abc import y as symbolic_y +from kernel import Kernel3D +from movie import Movie, FullFieldFlashMovie +import itertools +import scipy.stats as sps +from make_cell_list import multi_cell_random_generator, make_single_unit_cell_list, make_on_off_cell_list +#from lgnmodel.make_cell_list import two_unit_cell_config +#from make_cell_list import single_unit_cell_config + +def make_lattice_unit(lattice_unit_center=None): + cell_list = [] + tON_cell_list = make_tON_cell_list(lattice_unit_center) + tOFF_cell_list = make_tOFF_cell_list(lattice_unit_center) + sON_cell_list = make_sON_cell_list(lattice_unit_center) + sOFF_cell_list = make_sOFF_cell_list(lattice_unit_center) + overlap_onoff_cell_list = make_overlapping_onoff_cell_list(lattice_unit_center) + separate_onoff_cell_list = make_separate_onoff_cell_list(lattice_unit_center) + + cell_list = tON_cell_list + tOFF_cell_list + sON_cell_list + sOFF_cell_list + overlap_onoff_cell_list + separate_onoff_cell_list + + return cell_list + + +def make_tON_cell_list(lattice_unit_center): + tON_cell_list = [] + + single_unit_cell_config = {} + single_unit_cell_config['lattice_unit_center']=lattice_unit_center + single_unit_cell_config['width'] = 5. + sz = [3,6,9] + ncells = [5,3,2] + amp_dist = sps.rv_discrete(values=([20,25], [.5,.5])) +# kpeaks_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# wts = (.4,-.2) + kpeaks_dist = sps.multivariate_normal(mean=[15., 35.], cov=[[5.0, 0], [0, 5]]) + wts = (4.,-2.5) + delays = (0.,0.) + single_unit_cell_config['amplitude'] = amp_dist + single_unit_cell_config['kpeaks'] = kpeaks_dist + single_unit_cell_config['weights'] = wts + single_unit_cell_config['delays'] = delays + for num_cells, sig in zip(ncells,sz): + single_unit_cell_config['number_of_cells'] = num_cells + single_unit_cell_config['sigma'] = (sig,sig) +# print single_unit_cell_config + tON_cell_list += multi_cell_random_generator(make_single_unit_cell_list, **single_unit_cell_config) + + #print len(tON_cell_list) + return tON_cell_list + +def make_tOFF_cell_list(lattice_unit_center): + tOFF_cell_list = [] + + single_unit_cell_config = {} + single_unit_cell_config['lattice_unit_center']=lattice_unit_center + single_unit_cell_config['width'] = 5. + sz = [3,6,9] + ncells = [10,5,5] + amp_dist = sps.rv_discrete(values=([-20,-25], [.5,.5])) +# kpeaks_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# wts = (.4,-.2) + kpeaks_dist = sps.multivariate_normal(mean=[15., 35.], cov=[[5.0, 0], [0, 5]]) + wts = (4.,-2.5) + delays = (0.,0.) + single_unit_cell_config['amplitude'] = amp_dist + single_unit_cell_config['kpeaks'] = kpeaks_dist + single_unit_cell_config['weights'] = wts + single_unit_cell_config['delays'] = delays + for num_cells, sig in zip(ncells,sz): + single_unit_cell_config['number_of_cells'] = num_cells + single_unit_cell_config['sigma'] = (sig,sig) + tOFF_cell_list += multi_cell_random_generator(make_single_unit_cell_list, **single_unit_cell_config) + + #print len(tOFF_cell_list) + return tOFF_cell_list + +def make_sON_cell_list(lattice_unit_center): + sON_cell_list = [] + + single_unit_cell_config = {} + single_unit_cell_config['lattice_unit_center']=lattice_unit_center + single_unit_cell_config['width'] = 5. + sz = [3,6,9] + ncells = [5,3,2] + amp_dist = sps.rv_discrete(values=([20,25], [.5,.5])) +# kpeaks_dist = sps.multivariate_normal(mean=[100., 160.], cov=[[5.0, 0], [0, 5]]) +# wts = (.4,-.1) + kpeaks_dist = sps.multivariate_normal(mean=[80., 120.], cov=[[5.0, 0], [0, 5]]) + wts = (4.,-.85) + delays = (0.,0.) + single_unit_cell_config['amplitude'] = amp_dist + single_unit_cell_config['kpeaks'] = kpeaks_dist + single_unit_cell_config['weights'] = wts + single_unit_cell_config['delays'] = delays + for num_cells, sig in zip(ncells,sz): + single_unit_cell_config['number_of_cells'] = num_cells + single_unit_cell_config['sigma'] = (sig,sig) + sON_cell_list += multi_cell_random_generator(make_single_unit_cell_list, **single_unit_cell_config) + + #print len(sON_cell_list) + return sON_cell_list + +def make_sOFF_cell_list(lattice_unit_center): + sOFF_cell_list = [] + + single_unit_cell_config = {} + single_unit_cell_config['lattice_unit_center']=lattice_unit_center + single_unit_cell_config['width'] = 5. + sz = [3,6,9] + ncells = [10,5,5] + amp_dist = sps.rv_discrete(values=([-20,-25], [.5,.5])) +# kpeaks_dist = sps.multivariate_normal(mean=[100., 160.], cov=[[5.0, 0], [0, 5]]) + kpeaks_dist = sps.multivariate_normal(mean=[80., 120.], cov=[[5.0, 0], [0, 5]]) +# wts = (.4,-.1) + wts = (4.,-.85) + delays = (0.,0.) + single_unit_cell_config['amplitude'] = amp_dist + single_unit_cell_config['kpeaks'] = kpeaks_dist + single_unit_cell_config['weights'] = wts + single_unit_cell_config['delays'] = delays + for num_cells, sig in zip(ncells,sz): + single_unit_cell_config['number_of_cells'] = num_cells + single_unit_cell_config['sigma'] = (sig,sig) + sOFF_cell_list += multi_cell_random_generator(make_single_unit_cell_list, **single_unit_cell_config) + + #print len(sOFF_cell_list) + return sOFF_cell_list + +def make_overlapping_onoff_cell_list(lattice_unit_center): + overlap_onoff_cell_list = [] + + two_unit_cell_config = {} + two_unit_cell_config['lattice_unit_center']=lattice_unit_center + two_unit_cell_config['width']=5. + + ncells = 4 + sz = 9 + ang_dist = sps.rv_discrete(values=(np.arange(0,180,45), 1./ncells*np.ones(ncells))) + amp_on_dist = sps.rv_discrete(values=([20,25], [.5,.5])) + amp_off_dist = sps.rv_discrete(values=([-20,-25], [.5,.5])) +# kpeak_on_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# kpeak_off_dist = sps.multivariate_normal(mean=[50., 90.], cov=[[5.0, 0], [0, 5]]) +# wts_on = wts_off = (.4,-.2) + kpeak_on_dist = sps.multivariate_normal(mean=[15., 35.], cov=[[5.0, 0], [0, 5]]) + kpeak_off_dist = sps.multivariate_normal(mean=[20., 40.], cov=[[5.0, 0], [0, 5]]) + wts_on = wts_off = (4.,-2.5) + delays_on = delays_off = (0.,0.) + subfield_sep = 2. + + two_unit_cell_config['number_of_cells'] = ncells + two_unit_cell_config['ang'] = ang_dist + two_unit_cell_config['amplitude_on'] = amp_on_dist + two_unit_cell_config['amplitude_off'] = amp_off_dist + two_unit_cell_config['kpeaks_on'] = kpeak_on_dist + two_unit_cell_config['kpeaks_off'] = kpeak_off_dist + two_unit_cell_config['weights_on'] = wts_on + two_unit_cell_config['weights_off'] = wts_off + two_unit_cell_config['sigma_on'] = (sz,sz) + two_unit_cell_config['sigma_off'] = (sz,sz) + two_unit_cell_config['subfield_separation'] = subfield_sep + two_unit_cell_config['dominant_subunit']='on' + two_unit_cell_config['delays_on']=delays_on + two_unit_cell_config['delays_off']=delays_off + + overlap_onoff_cell_list += multi_cell_random_generator(make_on_off_cell_list, **two_unit_cell_config) + + #print len(overlap_onoff_cell_list) + return overlap_onoff_cell_list + +def make_separate_onoff_cell_list(lattice_unit_center): + separate_onoff_cell_list = [] + + two_unit_cell_config = {} + two_unit_cell_config['lattice_unit_center']=lattice_unit_center + two_unit_cell_config['width']=5. + + ncells = 8 + sz = 6 + ang_dist = np.arange(0,360,45) + subfield_sep = 4. + +# kpeak_dom_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# kpeak_nondom_dist = sps.multivariate_normal(mean=[100., 160.], cov=[[5.0, 0], [0, 5]]) +# wts_dom = (.4,-.2) +# wts_nondom = (.4,-.1) + + kpeak_dom_dist = sps.multivariate_normal(mean=[15., 35.], cov=[[5.0, 0], [0, 5]]) + kpeak_nondom_dist = sps.multivariate_normal(mean=[80., 120.], cov=[[5.0, 0], [0, 5]]) + wts_dom = (4.,-2.5) + wts_nondom = (4,-.85) + delays_dom = delays_nondom = (0.,0.) + + two_unit_cell_config['number_of_cells'] = ncells + two_unit_cell_config['ang'] = ang_dist + two_unit_cell_config['sigma_on'] = (sz,sz) + two_unit_cell_config['sigma_off'] = (sz,sz) + two_unit_cell_config['subfield_separation'] = subfield_sep + + #On-dominant + dom_subunit = 'on' + if dom_subunit=='on': + two_unit_cell_config['dominant_subunit'] = dom_subunit + amp_dom_dist = sps.rv_discrete(values=([20,25], [.5,.5])) + amp_nondom_dist = sps.rv_discrete(values=([-10,-15], [.5,.5])) + two_unit_cell_config['amplitude_on'] = amp_dom_dist + two_unit_cell_config['amplitude_off'] = amp_nondom_dist + two_unit_cell_config['kpeaks_on'] = kpeak_dom_dist + two_unit_cell_config['kpeaks_off'] = kpeak_nondom_dist + two_unit_cell_config['weights_on'] = wts_dom + two_unit_cell_config['weights_off'] = wts_nondom + two_unit_cell_config['delays_on'] = delays_dom + two_unit_cell_config['delays_off'] = delays_nondom + separate_onoff_cell_list += multi_cell_random_generator(make_on_off_cell_list, **two_unit_cell_config) + + #Off-dominant + dom_subunit = 'off' + if dom_subunit=='off': + two_unit_cell_config['dominant_subunit'] = dom_subunit + amp_dom_dist = sps.rv_discrete(values=([-20,-25], [.5,.5])) + amp_nondom_dist = sps.rv_discrete(values=([10,15], [.5,.5])) + two_unit_cell_config['amplitude_off'] = amp_dom_dist + two_unit_cell_config['amplitude_on'] = amp_nondom_dist + two_unit_cell_config['kpeaks_off'] = kpeak_dom_dist + two_unit_cell_config['kpeaks_on'] = kpeak_nondom_dist + two_unit_cell_config['weights_off'] = wts_dom + two_unit_cell_config['weights_on'] = wts_nondom + two_unit_cell_config['delays_off'] = delays_dom + two_unit_cell_config['delays_on'] = delays_nondom + separate_onoff_cell_list += multi_cell_random_generator(make_on_off_cell_list, **two_unit_cell_config) + + #print len(separate_onoff_cell_list) + return separate_onoff_cell_list + +if __name__ == "__main__": + lattice_unit_center = (40,30) + lattice_cell_list = make_lattice_unit(lattice_unit_center) + print(len(lattice_cell_list)) + \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/lgnmodel1.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/lgnmodel1.py new file mode 100644 index 0000000..1b04710 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/lgnmodel1.py @@ -0,0 +1,87 @@ +import numpy as np +import matplotlib.pyplot as plt + +def line_plot(evaluate_result, ax=None, show=True, save_file_name=None, xlabel=None, plotstyle=None): + + if ax is None: + _, ax = plt.subplots(1,1) + + if not plotstyle is None: + for ((t_range, y_vals), curr_plotstyle) in zip(evaluate_result, plotstyle): + ax.plot(t_range, y_vals, curr_plotstyle) + else: + for t_range, y_vals in evaluate_result: + ax.plot(t_range, y_vals) + + if xlabel is None: + ax.set_xlabel('Time (Seconds)') + else: + ax.set_xlabel(xlabel) + + if xlabel is None: + ax.set_xlabel('Firing Rate (Hz)') + else: + ax.set_xlabel(xlabel) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + + + + if show == True: + plt.show() + +def heat_plot(evaluate_result, ax=None, show=True, save_file_name=None, colorbar=True, **kwargs): + + if ax is None: + _, ax = plt.subplots(1,1) + + data = np.empty((len(evaluate_result), len(evaluate_result[0][0]))) + for ii, (t_vals, y_vals) in enumerate(evaluate_result): + data[ii,:] = y_vals + + cax = ax.pcolor(t_vals, np.arange(len(evaluate_result)), data, **kwargs) + ax.set_ylim([0,len(evaluate_result)-1]) + ax.set_xlim([t_vals[0], t_vals[-1]]) + ax.set_ylabel('Neuron id') + ax.set_xlabel('Time (Seconds)') + + if colorbar == True: + plt.colorbar(cax) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + + + +class LGNModel(object): + + def __init__(self, cell_list): + self.cell_list = cell_list + + def evaluate(self, movie, **kwargs): + return [cell.evaluate(movie, **kwargs) for cell in self.cell_list] + +# def plot(self): +# if show == True: +# plt.show() + + +# show = kwargs.pop('show', False) +# data = [cell.evaluate_movie(movie, **kwargs) for cell in self.cell_list] +# t_list, y_list, kernel_list = zip(*data) + +# if show == True: +# for y in y_list: +# plt.plot(t_list[0], y) +# plt.show() +# +# return t_list[0], y_list, kernel_list + + def __len__(self): + return len(self.cell_list) \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/linearfilter.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/linearfilter.py new file mode 100644 index 0000000..af7fef2 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/linearfilter.py @@ -0,0 +1,128 @@ +import numpy as np +from .kernel import Kernel3D +import matplotlib.pyplot as plt + +class SpatioTemporalFilter(object): + + def __init__(self, spatial_filter, temporal_filter, amplitude=1.): + + self.spatial_filter = spatial_filter + self.temporal_filter = temporal_filter + self.amplitude = amplitude + + def get_spatiotemporal_kernel(self, row_range, col_range, t_range=None, threshold=0, reverse=False): + + spatial_kernel = self.spatial_filter.get_kernel(row_range, col_range, threshold=0) + temporal_kernel = self.temporal_filter.get_kernel(t_range=t_range, threshold=0, reverse=reverse) + + t_range = temporal_kernel.t_range + + spatiotemporal_kernel = np.ones(( len(temporal_kernel), len(spatial_kernel))) + spatiotemporal_kernel *= spatial_kernel.kernel[None, :] + + spatiotemporal_kernel *= temporal_kernel.kernel[:,None] + spatiotemporal_kernel = spatiotemporal_kernel.reshape((np.prod(spatiotemporal_kernel.shape))) + + spatial_coord_array = np.empty((len(spatial_kernel),2)) + spatial_coord_array[:,0] = spatial_kernel.col_inds + spatial_coord_array[:,1] = spatial_kernel.row_inds + + spatiiotemporal_coord_array = np.zeros((len(spatial_kernel)*len(temporal_kernel),3)) + spatiiotemporal_coord_array[:,0:2] = np.kron(np.ones((len(temporal_kernel),1)),spatial_coord_array) + spatiiotemporal_coord_array[:,2] = np.kron(temporal_kernel.t_inds, np.ones(len(spatial_kernel))) + + col_inds, row_inds, t_inds = map(lambda x:x.astype(np.int),spatiiotemporal_coord_array.T) + kernel = Kernel3D(spatial_kernel.row_range, spatial_kernel.col_range, t_range, row_inds, col_inds, t_inds, spatiotemporal_kernel) + kernel.apply_threshold(threshold) + + + kernel.kernel *= self.amplitude + + + return kernel + + def t_slice(self, t, *args, **kwargs): + + k = self.get_spatiotemporal_kernel(*args, **kwargs) + return k.t_slice(t) + + def show_temporal_filter(self, *args, **kwargs): + + self.temporal_filter.imshow(*args, **kwargs) + + def show_spatial_filter(self, *args, **kwargs): + + self.spatial_filter.imshow(*args, **kwargs) + + def to_dict(self): + + return {'class':(__name__, self.__class__.__name__), + 'spatial_filter':self.spatial_filter.to_dict(), + 'temporal_filter':self.temporal_filter.to_dict(), + 'amplitude':self.amplitude} + +# class OnOffSpatioTemporalFilter(SpatioTemporalFilter): +# +# def __init__(self, on_spatiotemporal_filter, off_spatiotemporal_filter): +# +# self.on_spatiotemporal_filter = on_spatiotemporal_filter +# self.off_spatiotemporal_filter = off_spatiotemporal_filter +# +# def get_spatiotemporal_kernel(self, col_range, row_range, t_range=None, threshold=0, reverse=False): +# +# on_kernel = self.on_spatiotemporal_filter.get_spatiotemporal_kernel(col_range, row_range, t_range, threshold, reverse) +# off_kernel = self.off_spatiotemporal_filter.get_spatiotemporal_kernel(col_range, row_range, t_range, threshold, reverse) +# +# return on_kernel + off_kernel*(-1) +# +# def to_dict(self): +# +# return {'class':(__name__, self.__class__.__name__), +# 'on_filter':self.on_spatiotemporal_filter.to_dict(), +# 'off_filter':self.off_spatiotemporal_filter.to_dict()} +# +# class TwoSubfieldLinearFilter(OnOffSpatioTemporalFilter): +# +# def __init__(self, dominant_spatiotemporal_filter, nondominant_spatiotemporal_filter, subfield_separation=10, onoff_axis_angle=45, dominant_subfield_location=(30,40)): +# +# self.subfield_separation = subfield_separation +# self.onoff_axis_angle = onoff_axis_angle +# self.dominant_subfield_location = dominant_subfield_location +# self.dominant_spatiotemporal_filter = dominant_spatiotemporal_filter +# self.nondominant_spatiotemporal_filter = nondominant_spatiotemporal_filter +# +# dom_amp = dominant_spatiotemporal_filter.spatial_filter.amplitude +# nondom_amp = nondominant_spatiotemporal_filter.spatial_filter.amplitude +# if dom_amp < 0 and nondom_amp > 0: +# super(TwoSubfieldLinearFilter, self).__init__(self.nondominant_spatiotemporal_filter, self.dominant_spatiotemporal_filter) +# elif dom_amp > 0 and nondom_amp < 0: +# super(TwoSubfieldLinearFilter, self).__init__(self.dominant_spatiotemporal_filter, self.nondominant_spatiotemporal_filter) +# else: +# raise ValueError('Subfields are not of opposite polarity') +# +# self.dominant_spatiotemporal_filter.spatial_filter.translate = self.dominant_subfield_location +# hor_offset = np.cos(self.onoff_axis_angle*np.pi/180.)*self.subfield_separation + self.dominant_subfield_location[0] +# vert_offset = np.sin(self.onoff_axis_angle*np.pi/180.)*self.subfield_separation+ self.dominant_subfield_location[1] +# rel_translation = (hor_offset,vert_offset) +# self.nondominant_spatiotemporal_filter.spatial_filter.translate = rel_translation +# self.nondominant_spatiotemporal_filter.spatial_filter.origin=self.dominant_spatiotemporal_filter.spatial_filter.origin +# +# +# def to_dict(self): +# +# raise NotImplementedError +# + + + + + + + + + + + + + + diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/lnunit.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/lnunit.py new file mode 100644 index 0000000..ebc9952 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/lnunit.py @@ -0,0 +1,380 @@ +import os +import itertools +import matplotlib.pyplot as plt +import numpy as np +from . import utilities as util +import importlib +from .kernel import Kernel2D, Kernel3D +from .linearfilter import SpatioTemporalFilter +import json +from .spatialfilter import GaussianSpatialFilter +from .transferfunction import ScalarTransferFunction +from .temporalfilter import TemporalFilterCosineBump +from .cursor import LNUnitCursor, MultiLNUnitCursor, MultiLNUnitMultiMovieCursor, SeparableLNUnitCursor, SeparableMultiLNUnitCursor +from .movie import Movie +from .lgnmodel1 import LGNModel, heat_plot +from .transferfunction import MultiTransferFunction, ScalarTransferFunction + + +class LNUnit(object): + + def __init__(self, linear_filter, transfer_function, amplitude=1.): + + self.linear_filter = linear_filter + self.transfer_function = transfer_function + self.amplitude = amplitude + + def evaluate(self, movie, **kwargs): + return self.get_cursor(movie, separable=kwargs.pop('separable', False)).evaluate(**kwargs) + + def get_spatiotemporal_kernel(self, *args, **kwargs): + return self.linear_filter.get_spatiotemporal_kernel(*args, **kwargs) + + def get_cursor(self, movie, threshold=0, separable = False): + if separable: + return SeparableLNUnitCursor(self, movie) + else: + return LNUnitCursor(self, movie, threshold=threshold) + + def show_temporal_filter(self, *args, **kwargs): + self.linear_filter.show_temporal_filter(*args, **kwargs) + + def show_spatial_filter(self, *args, **kwargs): + self.linear_filter.show_spatial_filter(*args, **kwargs) + + def to_dict(self): + return {'class':(__name__, self.__class__.__name__), + 'linear_filter':self.linear_filter.to_dict(), + 'transfer_function':self.transfer_function.to_dict()} + +class MultiLNUnit(object): + + def __init__(self, lnunit_list, transfer_function): + + self.lnunit_list = lnunit_list + self.transfer_function = transfer_function + + def get_spatiotemporal_kernel(self, *args, **kwargs): + + k = Kernel3D([],[],[],[],[],[],[]) + for unit in self.lnunit_list: + k = k+unit.get_spatiotemporal_kernel(*args, **kwargs) + + return k + + def show_temporal_filter(self, *args, **kwargs): + + ax = kwargs.pop('ax', None) + show = kwargs.pop('show', None) + save_file_name = kwargs.pop('save_file_name', None) + + + if ax is None: + _, ax = plt.subplots(1,1) + + kwargs.update({'ax':ax, 'show':False, 'save_file_name':None}) + for unit in self.lnunit_list: + if unit.linear_filter.amplitude < 0: + color='b' + else: + color='r' + unit.linear_filter.show_temporal_filter(color=color, **kwargs) + + if not save_file_name is None: + plt.savefig(save_file_name, transparent=True) + + if show == True: + plt.show() + + return ax + + def show_spatial_filter(self, *args, **kwargs): + + ax = kwargs.pop('ax', None) + show = kwargs.pop('show', True) + save_file_name = kwargs.pop('save_file_name', None) + colorbar = kwargs.pop('colorbar', True) + + k = Kernel2D(args[0],args[1],[],[],[]) + for lnunit in self.lnunit_list: + k = k + lnunit.linear_filter.spatial_filter.get_kernel(*args, **kwargs) + k.imshow(ax=ax, show=show, save_file_name=save_file_name, colorbar=colorbar) + + def get_cursor(self, *args, **kwargs): + + threshold = kwargs.get('threshold', 0.) + separable = kwargs.get('separable', False) + + if len(args) == 1: + movie = args[0] + if separable: + return SeparableMultiLNUnitCursor(self, movie) + else: + return MultiLNUnitCursor(self, movie, threshold=threshold) + elif len(args) > 1: + movie_list = args + if separable: + raise NotImplementedError + else: + return MultiLNUnitMultiMovieCursor(self, movie_list, threshold=threshold) + else: + assert ValueError + + + def evaluate(self, movie, **kwargs): + seperable = kwargs.pop('separable', False) + return self.get_cursor(movie, separable=seperable).evaluate(**kwargs) + +from sympy.abc import x, y + +if __name__ == "__main__": + + movie_file = '/data/mat/iSee_temp_shared/movies/TouchOfEvil.npy' + m_data = np.load(movie_file, 'r') + m = Movie(m_data[1000:], frame_rate=30.) + + # Create second cell: + transfer_function = ScalarTransferFunction('s') + temporal_filter = TemporalFilterCosineBump((.4,-.3), (20,60)) + cell_list = [] + for xi in np.linspace(0,m.data.shape[2], 5): + for yi in np.linspace(0,m.data.shape[1], 5): + spatial_filter_on = GaussianSpatialFilter(sigma=(2,2), origin=(0,0), translate=(xi, yi)) + on_linear_filter = SpatioTemporalFilter(spatial_filter_on, temporal_filter, amplitude=20) + on_lnunit = LNUnit(on_linear_filter, transfer_function) + spatial_filter_off = GaussianSpatialFilter(sigma=(4,4), origin=(0,0), translate=(xi, yi)) + off_linear_filter = SpatioTemporalFilter(spatial_filter_off, temporal_filter, amplitude=-20) + off_lnunit = LNUnit(off_linear_filter, transfer_function) + + multi_transfer_function = MultiTransferFunction((x, y), 'x+y') + + multi_unit = MultiLNUnit([on_lnunit, off_lnunit], multi_transfer_function) + cell_list.append(multi_unit) + + lgn = LGNModel(cell_list) #Here include a list of all cells + y = lgn.evaluate(m, downsample=10) #Does the filtering + non-linearity on movie object m + heat_plot(y, interpolation='none', colorbar=False) + + + + + +# +# def imshow(self, ii, image_shape, fps, ax=None, show=True, relative_spatial_location=(0,0)): +# +# if ax is None: +# _, ax = plt.subplots(1,1) +# +# curr_kernel = self.get_spatio_temporal_kernel(image_shape, fps, relative_spatial_location=relative_spatial_location) +# +# cax = curr_kernel.imshow(ii, ax=ax, show=False) +# +# if show == True: +# plt.show() +# +# return ax +# +# +# class OnOffCellModel(CellModel): +# +# def __init__(self, dc_offset=0, on_subfield=None, off_subfield=None, on_weight = 1, off_weight = -1, t_max=None): +# +# super(self.__class__, self).__init__(dc_offset, t_max) +# +# if isinstance(on_subfield, dict): +# curr_module, curr_class = on_subfield.pop('class') +# self.on_subfield = getattr(importlib.import_module(curr_module), curr_class)(**on_subfield) +# else: +# self.on_subfield = on_subfield +# +# super(self.__class__, self).add_subfield(on_subfield, on_weight) +# +# if isinstance(off_subfield, dict): +# curr_module, curr_class = off_subfield.pop('class') +# self.off_subfield = getattr(importlib.import_module(curr_module), curr_class)(**off_subfield) +# else: +# self.off_subfield = off_subfield +# +# super(self.__class__, self).add_subfield(off_subfield, off_weight) +# +# +# def to_dict(self): +# +# return {'dc_offset':self.dc_offset, +# 'on_subfield':self.on_subfield.to_dict(), +# 'off_subfield':self.off_subfield.to_dict(), +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} +# +# class SingleSubfieldCellModel(CellModel): +# +# def __init__(self, subfield, weight = 1, dc_offset=0, t_max=None): +# +# super(SingleSubfieldCellModel, self).__init__(dc_offset, t_max) +# +# if isinstance(subfield, dict): +# curr_module, curr_class = subfield.pop('class') +# subfield = getattr(importlib.import_module(curr_module), curr_class)(**subfield) +# +# super(self.__class__, self).add_subfield(subfield, weight) +# +# def to_dict(self): +# +# assert len(self.subfield_list) == 1 +# subfield = self.subfield_list[0] +# weight = self.subfield_weight_dict[subfield] +# +# return {'dc_offset':self.dc_offset, +# 'subfield':subfield.to_dict(), +# 'weight':weight, +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} +# +# class OnCellModel(SingleSubfieldCellModel): +# +# def __init__(self, on_subfield, weight = 1, dc_offset=0 , t_max=None): +# assert weight > 0 +# super(OnCellModel, self).__init__(on_subfield, weight, dc_offset, t_max) +# +# def to_dict(self): +# data_dict = super(OnCellModel, self).to_dict() +# data_dict['on_subfield'] = data_dict.pop('subfield') +# return data_dict +# +# class OffCellModel(SingleSubfieldCellModel): +# +# def __init__(self, on_subfield, weight = -1, dc_offset=0 , t_max=None): +# assert weight < 0 +# super(OffCellModel, self).__init__(on_subfield, weight, dc_offset, t_max) +# +# def to_dict(self): +# data_dict = super(OffCellModel, self).to_dict() +# data_dict['off_subfield'] = data_dict.pop('subfield') +# return data_dict + + +# class OffCellModel(CellModel): +# +# def __init__(self, off_subfield, dc_offset=0, off_weight = 1, t_max=None): +# +# assert off_weight < 0. +# self.weight = off_weight +# +# +# +# +# super(self.__class__, self).__init__(dc_offset, t_max) +# +# if isinstance(on_subfield, dict): +# curr_module, curr_class = on_subfield.pop('class') +# self.subfield = getattr(importlib.import_module(curr_module), curr_class)(**on_subfield) +# else: +# self.subfield = on_subfield +# +# super(self.__class__, self).add_subfield(self.subfield, self.weight) +# +# def to_dict(self): +# +# return {'dc_offset':self.dc_offset, +# 'on_subfield':self.subfield.to_dict(), +# 'on_weight':self.weight, +# 't_max':self.t_max, +# 'class':(__name__, self.__class__.__name__)} + + + + + + +# if __name__ == "__main__": +# +# t = np.arange(0,.5,.001) +# example_movie = movie.Movie(file_name=os.path.join(isee_engine.movie_directory, 'TouchOfEvil.npy'), frame_rate=30.1, memmap=True) +# +# temporal_filter_on = TemporalFilterExponential(weight=1, tau=.05) +# on_subfield = Subfield(scale=(5,15), weight=.5, rotation=30, temporal_filter=temporal_filter_on, translation=(0,0)) +# +# temporal_filter_off = TemporalFilterExponential(weight=2, tau=.01) +# off_subfield = Subfield(scale=(5,15), weight=.5, rotation=-30, temporal_filter=temporal_filter_off) +# +# cell = OnOffCellModel(on_subfield=on_subfield, off_subfield=off_subfield, dc_offset=0., t_max=.5) +# curr_kernel = cell.get_spatio_temporal_kernel((100,150), 30.1) +# curr_kernel.imshow(0) +# +# print cell.to_dict() + + + +# f = cell.get_spatio_temporal_filter(example_movie.movie_data.shape[1:], t,threshold=.5) +# print len(f.t_ind_list) +# +# + +# for ii in range(example_movie.number_of_frames-curr_filter.t_max): +# print ii, example_movie.number_of_frames, curr_filter.map(example_movie, ii) + + +# off_subfield = Subfield(scale=(15,15), weight=.2, translation=(30,30)) + + +# +# curr_filter = cell.get_spatio_temporal_filter((100,150)) +# + +# +# # print touch_of_evil(40.41, mask=m) +# print curr_filter.t_max +# for ii in range(example_movie.number_of_frames-curr_filter.t_max): +# print ii, example_movie.number_of_frames, curr_filter.map(example_movie, ii) + +# cell.visualize_spatial_filter((100,150)) +# show_volume(spatio_temporal_filter, vmin=spatio_temporal_filter.min(), vmax=spatio_temporal_filter.max()) + + + +# def get_spatial_filter(self, image_shape, relative_spatial_location=(0,0), relative_threshold=default_relative_threshold): +# +# # Initialize: +# translation_matrix = util.get_translation_matrix(relative_spatial_location) +# +# # On-subunit: +# on_filter_pre_spatial = self.on_subfield.get_spatial_filter(image_shape) +# on_filter_spatial = util.apply_transformation_matrix(on_filter_pre_spatial, translation_matrix) +# +# # Off-subunit: +# off_filter_pre_spatial = self.off_subfield.get_spatial_filter(image_shape) +# off_filter_spatial = util.apply_transformation_matrix(off_filter_pre_spatial, translation_matrix) +# +# spatial_filter = on_filter_spatial - off_filter_spatial +# +# tmp = np.abs(spatial_filter) +# spatial_filter[np.where(tmp/tmp.max() < relative_threshold )] = 0 +# +# return spatial_filter + +# kernel = float(self.dc_offset)/len(nonzero_ind_tuple[0])+spatio_temporal_filter[nonzero_ind_tuple] + +# def rectifying_filter_factory(kernel, movie, dc_offset=0): +# +# def rectifying_filter(t): +# +# fi = movie.frame_rate*float(t) +# fim, fiM = np.floor(fi), np.ceil(fi) +# +# print t, fim, fiM +# +# try: +# s1 = (movie.movie_data[int(fim)+kernel.t_ind_list, kernel.row_ind_list, kernel.col_ind_list]*kernel.kernel).sum() +# s2 = (movie.movie_data[int(fiM)+kernel.t_ind_list, kernel.row_ind_list, kernel.col_ind_list]*kernel.kernel).sum() +# except IndexError: +# return None +# +# # Linear interpolation: +# s_pre = dc_offset + s1*((1-(fi-fim))*.5) + s2*((fi-fim)*.5) +# +# if s_pre < 0: +# return 0 +# else: +# return float(s_pre) +# +# return rectifying_filter \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/make_cell_list.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/make_cell_list.py new file mode 100644 index 0000000..aa05481 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/make_cell_list.py @@ -0,0 +1,294 @@ +import scipy.io as sio +import os +import matplotlib.pyplot as plt +import isee_engine.nwb as nwb +from linearfilter import SpatioTemporalFilter +import numpy as np +from spatialfilter import GaussianSpatialFilter +from transferfunction import ScalarTransferFunction +from temporalfilter import TemporalFilterCosineBump +from cursor import LNUnitCursor, MultiLNUnitCursor +from movie import Movie +from lgnmodel1 import LGNModel, heat_plot +from cellmodel import LGNOnCell, LGNOffCell,LGNOnOffCell,TwoSubfieldLinearCell, OnUnit, OffUnit +from transferfunction import MultiTransferFunction, ScalarTransferFunction +from lnunit import LNUnit, MultiLNUnit +from sympy.abc import x as symbolic_x +from sympy.abc import y as symbolic_y +from kernel import Kernel3D +from movie import Movie, FullFieldFlashMovie +import itertools +import scipy.stats as sps + +# def multi_cell_tensor_generator(cell_creation_function, **kwargs): +# +# sew_param_dict = {} +# static_param_dict = {} +# for key, val in kwargs.items(): +# if isinstance(val, (list, np.ndarray)): +# sew_param_dict[key]=val +# else: +# static_param_dict[key]=val +# +# cell_list = [] +# loop_keys, loop_lists = zip(*sew_param_dict.items()) +# for param_tuple in itertools.product(*loop_lists): +# param_dict = dict(zip(loop_keys, param_tuple)) +# print param_dict +# param_dict.update(static_param_dict) +# cell_list += cell_creation_function(**param_dict) +# +# return cell_list + +def multi_cell_random_generator(cell_creation_function=None, **kwargs): + + sew_param_dict = {} + static_param_dict = {} + range_key_dict = {} + for key, val in kwargs.items(): + if isinstance(val, (sps.rv_continuous, sps.rv_discrete)) or type(val) == type(sps.multivariate_normal()): + sew_param_dict[key]=val + elif isinstance(val, np.ndarray): + range_key_dict[key] = val + else: + static_param_dict[key]=val + + number_of_cells = static_param_dict.pop('number_of_cells', 1) + + for key, val in range_key_dict.items(): + assert len(val) == number_of_cells + + cell_list = [] + loop_keys, loop_lists = zip(*sew_param_dict.items()) + value_instance_list = zip(*map(lambda x: x.rvs(size=number_of_cells), loop_lists)) + for ii, curr_value_instance in enumerate(value_instance_list): + param_dict = dict(zip(loop_keys, curr_value_instance)) + param_dict.update(static_param_dict) + param_dict['number_of_cells'] = 1 + for range_key in range_key_dict: + param_dict[range_key] = range_key_dict[range_key][ii] + + if cell_creation_function is None: + cell_list.append(param_dict) + else: + cell_list += cell_creation_function(**param_dict) + + return cell_list + + +def make_single_unit_cell_list(number_of_cells=None, + lattice_unit_center=None, + weights=None, + kpeaks=None, + delays=None, + amplitude=None, + sigma=None, + width=5, + transfer_function_str = 'Heaviside(s)*s'): + + cell_list = [] + for _ in range(number_of_cells): + dxi = np.random.uniform(-width*1./2,width*1./2) + dyi = np.random.uniform(-width*1./2,width*1./2) + temporal_filter = TemporalFilterCosineBump(weights, kpeaks,delays) + spatial_filter = GaussianSpatialFilter(translate=(dxi,dyi), sigma=sigma, origin=lattice_unit_center) # all distances measured from BOTTOM LEFT + spatiotemporal_filter = SpatioTemporalFilter(spatial_filter, temporal_filter, amplitude=amplitude) + transfer_function = ScalarTransferFunction(transfer_function_str) + if amplitude > 0.: + cell = OnUnit(spatiotemporal_filter, transfer_function) + elif amplitude < 0.: + cell = OffUnit(spatiotemporal_filter, transfer_function) + else: + raise Exception + + + cell_list.append(cell) + + return cell_list + +def make_on_off_cell_list(number_of_cells=None, + lattice_unit_center=None, + weights_on=None, + weights_off=None, + kpeaks_on=None, + kpeaks_off=None, + delays_on = None, + delays_off = None, + amplitude_on=None, + amplitude_off=None, + sigma_on=None, + sigma_off=None, + subfield_separation=None, + ang=None, + dominant_subunit=None, + width=5, + transfer_function_str = 'Heaviside(x)*x + Heaviside(y)*y'): + + cell_list = [] + for _ in range(number_of_cells): + + dxi = np.random.uniform(-width*1./2,width*1./2) + dyi = np.random.uniform(-width*1./2,width*1./2) + + dominant_subfield_location = (lattice_unit_center[0]+dxi, lattice_unit_center[1]+dyi) +# hor_offset = np.cos(ang*np.pi/180.)*subfield_separation +# vert_offset = np.sin(ang*np.pi/180.)*subfield_separation +# nondominant_subfield_translation = (hor_offset,vert_offset) + + if dominant_subunit == 'on': + on_translate = dominant_subfield_location#(0,0) + off_translate = dominant_subfield_location#nondominant_subfield_translation + + elif dominant_subunit == 'off': + + off_translate = dominant_subfield_location#(0,0) + on_translate = dominant_subfield_location#nondominant_subfield_translation + + else: + raise Exception + + on_origin = off_origin = (0,0)#dominant_subfield_location + + temporal_filter_on = TemporalFilterCosineBump(weights_on, kpeaks_on,delays_on) + spatial_filter_on = GaussianSpatialFilter(translate=on_translate,sigma=sigma_on, origin=on_origin) # all distances measured from BOTTOM LEFT + on_filter = SpatioTemporalFilter(spatial_filter_on, temporal_filter_on, amplitude=amplitude_on) + + temporal_filter_off = TemporalFilterCosineBump(weights_off, kpeaks_off,delays_off) + spatial_filter_off = GaussianSpatialFilter(translate=off_translate,sigma=sigma_off, origin=off_origin) # all distances measured from BOTTOM LEFT + off_filter = SpatioTemporalFilter(spatial_filter_off, temporal_filter_off, amplitude=amplitude_off) + +# cell = LGNOnOffCell(on_filter, off_filter, transfer_function=MultiTransferFunction((symbolic_x, symbolic_y), transfer_function_str)) + cell = TwoSubfieldLinearCell(on_filter,off_filter,subfield_separation=subfield_separation, onoff_axis_angle=ang, dominant_subfield_location=dominant_subfield_location) + cell_list.append(cell) + + return cell_list + +# amplitude_list = amplitude_dist.rvs(size=5) +# kpeak_list = kpeak_dist.rvs(size=5) +# cell_config = {'number_of_cells':5, +# 'lattice_unit_center':(40,30), +# 'weights':(.4,-.2), +# 'kpeaks':kpeak_list, +# 'amplitude':amplitude_list, +# 'sigma':(4,4), +# 'width':5} +# multi_cell_tensor_generator(make_single_unit_cell_list, **cell_config) + + +# amplitude_dist = sps.rv_discrete(values=([20,25], [.5,.5])) +# kpeak_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# +# single_unit_cell_config = {'number_of_cells':10, +# 'lattice_unit_center':(40,30), +# 'weights':(.4,-.2), +# 'kpeaks':kpeak_dist, +# 'amplitude':amplitude_dist, +# 'sigma':(4,4), +# 'width':5} +# +# +# amplitude_on_dist = sps.rv_discrete(values=([20,25], [.5,.5])) +# amplitude_off_dist = sps.rv_discrete(values=([-10,-15], [.5,.5])) +# kpeak_on_dist = sps.multivariate_normal(mean=[40., 80.], cov=[[5.0, 0], [0, 5]]) +# kpeak_off_dist = sps.multivariate_normal(mean=[100., 160.], cov=[[5.0, 0], [0, 5]]) +# #ang_dist = sps.rv_discrete(values=(np.arange(0,360,45), 1./8*np.ones((1,8)))) +# ang_dist = np.arange(0,360,45) +# +# two_unit_cell_config={'number_of_cells':8, +# 'lattice_unit_center':(40,30), +# 'weights_on':(.4,-.2), +# 'weights_off':(.4,-.1), +# 'kpeaks_on':kpeak_on_dist, +# 'kpeaks_off':kpeak_off_dist, +# 'amplitude_on':20., +# 'amplitude_off':-10., +# 'sigma_on':(4,4), +# 'sigma_off':(4,4), +# 'subfield_separation':2., +# 'ang':ang_dist, +# 'dominant_subunit':'on', +# 'width':5} + + +def evaluate_cell_and_plot(input_cell, input_movie, ax, show=False): + t, y = input_cell.evaluate(input_movie,downsample = 10) + ax.plot(t, y) + + if show == True: + plt.show() + + +# if __name__ == "__main__": +# +# # Create stimulus 0: +# frame_rate = 60 +# m1 = FullFieldFlashMovie(np.arange(60), np.arange(80), 1., 3., frame_rate=frame_rate).full(t_max=3) +# m2 = FullFieldFlashMovie(np.arange(60), np.arange(80), 0, 2, frame_rate=frame_rate, max_intensity=-1).full(t_max=2) +# m3 = FullFieldFlashMovie(np.arange(60), np.arange(80), 0, 2., frame_rate=frame_rate).full(t_max=2) +# m4 = FullFieldFlashMovie(np.arange(60), np.arange(80), 0, 2, frame_rate=frame_rate, max_intensity=0).full(t_max=2) +# m0 = m1+m2+m3+m4 +# +# # Create stimulus 1: +# movie_file = '/data/mat/RamIyer/for_Anton/grating_ori0_res2.mat' +# m_file = sio.loadmat(movie_file) +# m_data_raw = m_file['mov_fine'].T +# m_data = np.reshape(m_data_raw,(3000,64,128)) +# m1 = Movie(m_data, frame_rate=1000.) +# +# #Create stimulus 2: +# movie_file = '/data/mat/iSee_temp_shared/TouchOfEvil_norm.npy' +# m_data = np.load(movie_file, 'r') +# m = Movie(m_data[1000:], frame_rate=30.) +# +# movie_list = [m0, m1, m2] +# +# #==================================================== +# +# #Create cell list +# +# cell_list = [] +# +# #On cells +# params_tON = (5, (40,30), (.4,-.2),(40,80),20.,(4,4)) +# tON_list = make_single_unit_cell_list(*params_tON) +# cell_list.append(tON_list) +# +# params_sON = (5, (40,30), (.4,-.1),(100,160),20.,(4,4)) +# sON_list = make_single_unit_cell_list(*params_sON) +# cell_list.append(sON_list) +# +# #Off cells +# params_tOFF = (5, (40,30), (.4,-.2),(40,80),-20.,(4,4)) +# tOFF_list = make_single_unit_cell_list(*params_tOFF) +# cell_list.append(tOFF_list) +# +# params_sOFF = (5, (40,30), (.4,-.1),(100,160),-20.,(4,4)) +# sOFF_list = make_single_unit_cell_list(*params_sOFF) +# cell_list.append(sOFF_list) +# +# #ONOFF cells +# params_onoff = (5, (40,30),(.4, -.2),(.4,-.2),(40, 80),(50,100),20.,-20.,(4,4),(4,4),2.,0,'on') +# onoff_list = make_on_off_cell_list(*params_onoff) +# cell_list.append(onoff_list) +# +# #Two subunit cells +# params_twosub = (5, (40,30),(.4, -.2),(.4,-.1),(40, 80),(100,160),20.,-10.,(4,2),(3,4),10.,90,'on') +# twosub_list = make_on_off_cell_list(*params_twosub) +# cell_list.append(twosub_list) +# +# #===================================================== +# #Evaluate and plot responses +# nc = len(movie_list) +# nr = len(cell_list) +# fig, axes = plt.subplots(nr,nc+2) +# +# for curr_row, curr_cell in zip(axes, cell_list): +# curr_cell.show_spatial_filter(np.arange(60),np.arange(80), ax=curr_row[0], show=False, colorbar=False) +# curr_cell.show_temporal_filter(ax=curr_row[1], show=False) +# +# for curr_row, curr_cell in zip(axes, cell_list): +# for curr_ax, curr_movie in zip(curr_row[2:], movie_list): +# evaluate_cell_and_plot(curr_cell, curr_movie, curr_ax, show=False) +# +# plt.tight_layout() +# plt.show() diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/movie.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/movie.py new file mode 100644 index 0000000..a9d4e67 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/movie.py @@ -0,0 +1,196 @@ +import matplotlib.pyplot as plt +import numpy as np +from .utilities import convert_tmin_tmax_framerate_to_trange + + +class Movie(object): + def __init__(self, data, row_range=None, col_range=None, labels=('time', 'y', 'x'), + units=('second', 'pixel', 'pixel'), frame_rate=None, t_range=None): + self.data = data + self.labels = labels + self.units = units + assert units[0] == 'second' + + if t_range is None: + self.frame_rate = float(frame_rate) + self.t_range = np.arange(data.shape[0])*(1./self.frame_rate) + else: + self.t_range = np.array(t_range) + self.frame_rate = 1./np.mean(np.diff(t_range)) + + if row_range is None: + self.row_range = np.arange(data.shape[1]) + else: + self.row_range = np.array(row_range) + if col_range is None: + self.col_range = np.arange(data.shape[2]) + else: + self.col_range = np.array(col_range) + + def imshow_summary(self, ax=None, show=True, xlabel=None): + if ax is None: + _, ax = plt.subplots(1,1) + + t_vals = self.t_range.copy() + y_vals = self.data.mean(axis=2).mean(axis=1) + ax.plot(t_vals, y_vals) + ax.set_ylim(y_vals.min()-np.abs(y_vals.min())*.05, y_vals.max()+np.abs(y_vals.max())*.05) + + if not xlabel is None: + ax.set_xlabel(xlabel) + + ax.set_ylabel('Average frame intensity') + + if show == True: + plt.show() + + return ax, (t_vals, y_vals) + + def imshow(self, t, show=True, vmin=-1, vmax=1, cmap=plt.cm.gray): + ti = int(t*self.frame_rate) + data = self.data[ti,:,:] + plt.imshow(data, vmin=vmin, vmax=vmax, cmap=cmap) + plt.colorbar() + if show: + plt.show() + + def __add__(self, other): + + assert self.labels == other.labels + assert self.units == other.units + assert self.frame_rate == other.frame_rate + np.testing.assert_almost_equal(self.col_range, other.col_range) + np.testing.assert_almost_equal(self.row_range, other.row_range) + + + new_data = np.empty((len(self.t_range)+len(other.t_range)-1, len(self.row_range), len(self.col_range))) + new_data[:len(self.t_range), :,:] = self.data[:,:,:] + new_data[len(self.t_range):, :,:] = other.data[1:,:,:] + + return Movie(new_data, row_range=self.row_range.copy(), col_range=self.col_range.copy(), labels=self.labels, units=self.units, frame_rate=self.frame_rate) + + @property + def ranges(self): + return self.t_range, self.row_range, self.col_range + + def get_nwb_GrayScaleMovie(self): + + t_scale = nwb.Scale(self.t_range, 'time', self.units[0]) + row_scale = nwb.Scale(self.row_range, 'distance', self.units[1]) + col_scale = nwb.Scale(self.col_range, 'distance', self.units[2]) + + return nwb.GrayScaleMovie(self.data, scale=(t_scale, row_scale, col_scale)) + + def __getitem__(self, *args): + return self.data.__getitem__(*args) + + +class FullFieldMovie(Movie): + def __init__(self, f, row_range, col_range, frame_rate=24): + self.row_range = row_range + self.col_range = col_range + self.frame_size = (len(self.row_range), len(self.col_range)) + self._frame_rate = frame_rate + self.f = f + + @property + def frame_rate(self): + return self._frame_rate + + @property + def data(self): + return self + + def __getitem__(self, *args): + + t_inds, x_inds, y_inds = args[0] + + assert (len(x_inds) == len(y_inds)) and (len(y_inds) == len(t_inds)) + + # Convert frame indices to times: + t_vals = (1./self.frame_rate)*t_inds + + # Evaluate and return: + return self.f(t_vals) + + def full(self, t_min=0, t_max=None): + # Compute t_range + t_range = convert_tmin_tmax_framerate_to_trange(t_min, t_max, self.frame_rate) + + nt = len(t_range) + nr = len(self.row_range) + nc = len(self.col_range) + a,b,c = np.meshgrid(range(nt),range(nr),range(nc)) + af, bf, cf = map(lambda x: x.flatten(), [a,b,c]) + data = np.empty((nt, nr, nc)) + data[af, bf, cf] = self.f(t_range[af]) + + return Movie(data, row_range=self.row_range, col_range=self.col_range, labels=('time', 'y', 'x'), units=('second', 'pixel', 'pixel'), frame_rate=self.frame_rate) + + +class FullFieldFlashMovie(FullFieldMovie): + def __init__(self, row_range, col_range, t_on, t_off, max_intensity=1, frame_rate=24): + assert t_on < t_off + + def f(t): + return np.piecewise(t, *zip(*[(t < t_on, 0), (np.logical_and(t_on <= t, t < t_off), max_intensity), + (t_off <= t, 0)])) + + super(FullFieldFlashMovie, self).__init__(f, row_range, col_range, frame_rate=frame_rate) + + +class GratingMovie(Movie): + def __init__(self, row_size, col_size, frame_rate=1000.): + self.row_size = row_size #in degrees + self.col_size = col_size #in degrees + self.frame_rate = float(frame_rate) #in Hz + + def create_movie(self, t_min = 0, t_max = 1, gray_screen_dur = 0, cpd = 0.05, temporal_f = 4, theta = 45, phase = 0., contrast = 1.0, row_size_new = None, col_size_new = None): + """Create the grating movie with the desired parameters + :param t_min: start time in seconds + :param t_max: end time in seconds + :param gray_screen_dur: Duration of gray screen before grating stimulus starts + :param cpd: cycles per degree + :param temporal_f: in Hz + :param theta: orientation angle + :return: Movie object of grating with desired parameters + """ + assert contrast <= 1, "Contrast must be <= 1" + assert contrast > 0, "Contrast must be > 0" + + physical_spacing = 1. / (float(cpd) * 10) #To make sure no aliasing occurs + self.row_range = np.linspace(0, self.row_size, self.row_size / physical_spacing, endpoint = True) + self.col_range = np.linspace(0, self.col_size, self.col_size / physical_spacing, endpoint = True) + numberFramesNeeded = int(round(self.frame_rate * (t_max - gray_screen_dur))) + 1 + time_range = np.linspace(gray_screen_dur, t_max - gray_screen_dur, numberFramesNeeded, endpoint=True) + + tt, yy, xx = np.meshgrid(time_range, self.row_range, self.col_range, indexing='ij') + + thetaRad = -np.pi*(180-theta)/180. + phaseRad = np.pi*(180-phase)/180. + xy = xx * np.cos(thetaRad) + yy * np.sin(thetaRad) + data = contrast*np.sin(2*np.pi*(cpd * xy + temporal_f *tt) + phaseRad) + + if row_size_new != None: + self.row_range = np.linspace(0, row_size_new, data.shape[1], endpoint = True) + if col_size_new != None: + self.col_range = np.linspace(0, col_size_new, data.shape[2], endpoint = True) + + if gray_screen_dur > 0: + # just adding one or two seconds to gray screen so flash never "happens" + m_gray = FullFieldFlashMovie(self.row_range, self.col_range, gray_screen_dur + 1, gray_screen_dur + 2, + frame_rate=self.frame_rate).full(t_max=gray_screen_dur) + mov = m_gray + Movie(data, row_range=self.row_range, col_range=self.col_range, labels=('time', 'y', 'x'), + units=('second', 'pixel', 'pixel'), frame_rate=self.frame_rate) + else: + mov = Movie(data, row_range=self.row_range, col_range=self.col_range, labels=('time', 'y', 'x'), + units=('second', 'pixel', 'pixel'), frame_rate=self.frame_rate) + + return mov + + +if __name__ == "__main__": + m1 = FullFieldFlashMovie(range(60), range(80), 1, 2).full(t_max=2) + m2 = FullFieldFlashMovie(range(60), range(80), 1, 2).full(t_max=2) + m3 = m1+m2 + m3.imshow_summary() diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/poissongeneration.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/poissongeneration.py new file mode 100644 index 0000000..b2125b1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/poissongeneration.py @@ -0,0 +1,104 @@ +import numpy as np +import scipy.interpolate as sinterp +import scipy.integrate as spi +import warnings +import scipy.optimize as sopt +import scipy.stats as sps + +def generate_renewal_process(t0, t1, renewal_distribution): + last_event_time = t0 + curr_interevent_time = float(renewal_distribution()) + event_time_list = [] + while last_event_time+curr_interevent_time <= t1: + event_time_list.append(last_event_time+curr_interevent_time) + curr_interevent_time = float(renewal_distribution()) + last_event_time = event_time_list[-1] + + return event_time_list + +def generate_poisson_process(t0, t1, rate): + + if rate is None: raise ValueError('Rate cannot be None') + if rate > 10000: warnings.warn('Very high rate encountered: %s' % rate) + + + try: + assert rate >= 0 + except AssertionError: + raise ValueError('Negative rate (%s) not allowed' % rate) + + try: + assert rate < np.inf + except AssertionError: + raise ValueError('Rate (%s) must be finite' % rate) + + + + + + + + if rate == 0: + return [] + else: + return generate_renewal_process(t0, t1, sps.expon(0,1./rate).rvs) + +def generate_inhomogenous_poisson(t_range, y_range, seed=None): + if not seed == None: np.random.seed(seed) + spike_list = [] + for tl, tr, y in zip(t_range[:-1], t_range[1:], y_range[:-1]): + spike_list += generate_poisson_process(tl, tr, y) + return spike_list + + + + +def generate_poisson_rescaling(t, y, seed=None): + y = np.array(y) + t = np.array(t) + assert not np.any(y<0) + f = sinterp.interp1d(t, y, fill_value=0, bounds_error=False) + return generate_poisson_rescaling_function(lambda y, t: f(t), t[0], t[-1], seed=seed) + + + +def generate_poisson_rescaling_function(f, t_min, t_max, seed=None): + + + + def integrator(t0, t1): + return spi.odeint(f, 0, [t0, t1])[1][0] + + if not seed == None: + np.random.seed(seed) + + spike_train = [] + while t_min < t_max: + e0 = np.random.exponential() + def root_function(t): + return e0 - integrator(t_min, t) + + try: + with warnings.catch_warnings(record=True) as w: + result = sopt.root(root_function, .1) + assert result.success + except AssertionError: + if not e0 < integrator(t_min, t_max): + assert Exception + else: + break + + + + + t_min = result.x[0] + spike_train.append(t_min) + + return np.array(spike_train) + + +def test_generate_poisson_function(): + + f = lambda y, t:10 + + assert len(generate_poisson_function(f,0,1,seed=5)) == 12 \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/singleunitcell.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/singleunitcell.py new file mode 100644 index 0000000..d3e0b24 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/singleunitcell.py @@ -0,0 +1,8 @@ +from temporalfilter import TemporalFilterCosineBump +from transferfunction import ScalarTransferFunction +from linearfilter import SpatioTemporalFilter +import numpy as np +from spatialfilter import GaussianSpatialFilter +from cellmodel import OnUnit, OffUnit + + diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/spatialfilter.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/spatialfilter.py new file mode 100644 index 0000000..466db94 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/spatialfilter.py @@ -0,0 +1,215 @@ +from scipy import ndimage +import numpy as np +import itertools +import importlib +import scipy.interpolate as spinterp +from . import utilities as util +import matplotlib.pyplot as plt +import scipy.misc as spmisc +import scipy.ndimage as spndimage +from .kernel import Kernel2D, Kernel3D + +class ArrayFilter(object): + + default_threshold = .01 + + def __init__(self, mask): + + self.mask = mask + + def imshow(self, row_range, col_range, threshold=0, **kwargs): + + return self.get_kernel(row_range, col_range,threshold).imshow(**kwargs) + + def get_kernel(self, row_range, col_range, threshold=0, amplitude=1.): + +# print np.where(self.mask>threshold) + row_vals, col_vals = np.where(self.mask>threshold) + + kernel_vals = self.mask[row_vals, col_vals] + kernel_vals = amplitude*kernel_vals/kernel_vals.sum() + + return Kernel2D(row_range, col_range, row_vals, col_vals, kernel_vals) # row_range, col_range, row_inds, col_inds, kernel): + + +class GaussianSpatialFilter(object): + + default_threshold = .01 + + def __init__(self, translate=(0, 0), sigma=(1.,1.), rotation=0, origin='center'): + '''When w=1 and rotation=0, half-height will be at y=1''' + + self.translate = translate + self.rotation = rotation + self.sigma = sigma + self.origin = origin + + def imshow(self, row_range, col_range, threshold=0, **kwargs): + return self.get_kernel(row_range, col_range,threshold).imshow(**kwargs) + + def to_dict(self): + + return {'class':(__name__, self.__class__.__name__), + 'translate':self.translate, + 'rotation':self.rotation, + 'sigma':self.sigma} + + def get_kernel(self, row_range, col_range, threshold=0, amplitude=1.): + + # Create symmetric initial point at center: + image_shape = len(col_range), len(row_range) + h, w = image_shape + on_filter_spatial = np.zeros(image_shape) + if h%2 == 0 and w%2 == 0: + for ii, jj in itertools.product(range(2), range(2)): + on_filter_spatial[int(h/2)+ii-1,int(w/2)+jj-1] = .25 + elif h%2 == 0 and w%2 != 0: + for ii in range(2): + on_filter_spatial[int(h/2)+ii-1,int(w/2)] = .25 + elif h%2 != 0 and w%2 == 0: + for jj in range(2): + on_filter_spatial[int(h/2),int(w/2)+jj-1] = .25 + else: + on_filter_spatial[int(h/2),int(w/2)] = .25 + + # Apply gaussian filter to create correct sigma: + scaled_sigma_x =float(self.sigma[0])/(col_range[1]-col_range[0]) + scaled_sigma_y = float(self.sigma[1])/(row_range[1]-row_range[0]) + on_filter_spatial = ndimage.gaussian_filter(on_filter_spatial, (scaled_sigma_x, scaled_sigma_y), mode='nearest', cval=0) +# on_filter_spatial = skf.gaussian_filter(on_filter_spatial, sigma=(scaled_sigma_x, scaled_sigma_y)) + + # Rotate and translate at center: + rotation_matrix = util.get_rotation_matrix(self.rotation, on_filter_spatial.shape) + translation_x = float(self.translate[1])/(row_range[1]-row_range[0]) + translation_y = -float(self.translate[0])/(col_range[1]-col_range[0]) + translation_matrix = util.get_translation_matrix((translation_x, translation_y)) + if self.origin != 'center': + center_y = -(self.origin[0]-(col_range[-1]+col_range[0])/2)/(col_range[1]-col_range[0]) + center_x = (self.origin[1]-(row_range[-1]+row_range[0])/2)/(row_range[1]-row_range[0]) + translation_matrix += util.get_translation_matrix((center_x, center_y)) + kernel_data = util.apply_transformation_matrix(on_filter_spatial, translation_matrix+rotation_matrix) + + kernel = Kernel2D.from_dense(row_range, col_range, kernel_data, threshold=0) + kernel.apply_threshold(threshold) + kernel.normalize() + + kernel.kernel *= amplitude + + + return kernel + + + +# spatial_model = GaussianSpatialFilterModel(height=21, aspect_ratio=1., rotation=0) +# spatial_filter = spatial_model(center=(30,40)) +# k = spatial_filter.get_spatial_kernel(range(60), range(80)) +# k.imshow(frame_size=(60,80)) + + + + + + + + + + + + + +# def evaluate_movie(self, movie, t, show=False): +# +# y = [] +# for ti in t: +# kernel_result = movie.evaluate_Kernel3D(ti, self) +# y.append(self.transfer_function(kernel_result)) +# +# if show == True: +# plt.plot(t, y) +# plt.show() +# +# return t, y + +# print mesh_range[0] +# +# ii = mesh_range[0][inds] +# jj = mesh_range[1][inds] +# print ii, jj +# print tmp[jj,ii] + +# plt.figure() +# plt.pcolor(mesh_range[0], mesh_range[1], tmp) +# plt.colorbar() +# plt.axis('equal') +# plt.show() + +# print self.xydata[0].shape +# +# t0 = spndimage.rotate(self.xydata[0],30,reshape=False, mode=mode) +# t1 = spndimage.rotate(self.xydata[1],30, reshape=False, mode=mode) + +# print t0.shape +# print t1.shape +# print on_filter_spatial.shape + +# plt.pcolor(t0,t1, on_filter_spatial) + + +# self.interpolation_function = spinterp.interp2d(self.w_values, self.h_values, on_filter_spatial, fill_value=0, bounds_error=False) +# +# print self.interpolation_function((t0,t1)) + +# translation_matrix = util.get_translation_matrix(self.translation) +# tmp = util.apply_transformation_matrix(on_filter_spatial, translation_matrix) +# +# plt.pcolor(self.xydata[0], self.xydata[1], tmp) +# plt.show() + +# # print self.xydata_trans[0][0], self.xydata_trans[0],[-1] +# # print self.xydata_trans[1][0], self.xydata_trans[1],[-1] +# print self.xydata_trans +# rotation_matrix = util.get_rotation_matrix(self.rotation, on_filter_spatial.shape) +# translation_matrix = util.get_translation_matrix(self.translation) +# on_filter_spatial = util.apply_transformation_matrix(on_filter_spatial, translation_matrix+rotation_matrix) + +# plt.imshow(on_filter_spatial, extent=(self.w_values[0], self.w_values[-1], self.h_values[0], self.h_values[-1]), aspect=1.) +# plt.show() + +# def to_dict(self): +# +# return {'scale':self.scale, +# 'translation':self.translation, +# 'rotation':self.rotation, +# 'weight':self.weight, +# 'temporal_filter':self.temporal_filter.to_dict(), +# 'class':(__name__, self.__class__.__name__)} + +# def get_kernel(self, xdata, ydata, threshold=default_threshold): +# +# +# # Rotate and translate at center: +# rotation_matrix = util.get_rotation_matrix(self.rotation, on_filter_spatial.shape) +# translation_matrix = util.get_translation_matrix(self.translation) +# on_filter_spatial = util.apply_transformation_matrix(on_filter_spatial, translation_matrix+rotation_matrix) +# +# # Now translate center of field in image: +# # translation_matrix = util.get_translation_matrix(relative_spatial_location) +# # on_filter_spatial = util.apply_transformation_matrix(on_filter_spatial, translation_matrix) +# +# # Create and return thresholded 2D mask: +# row_ind_list, col_ind_list = np.where(on_filter_spatial != 0) +# kernel = on_filter_spatial[row_ind_list, col_ind_list] +# +# +# +# +# # filter_mask = Kernel2D(row_ind_list, col_ind_list, kernel, threshold=threshold) +# +# return filter_mask + +# translation_matrix = util.get_translation_matrix((1.*translation[0]/fudge_factor,-1.*translation[1]/fudge_factor)) + +# plt.figure() +# plt.pcolor(self.mesh_support[0], self.mesh_support[1], self.kernel_data) +# plt.axis('equal') +# plt.show() \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/temporalfilter.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/temporalfilter.py new file mode 100644 index 0000000..1e604bf --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/temporalfilter.py @@ -0,0 +1,114 @@ +import numpy as np +from . import fitfuns +import scipy.interpolate as spinterp +import matplotlib.pyplot as plt +from .kernel import Kernel1D + +class TemporalFilter(object): + + def __init__(self, *args, **kwargs): pass + + def imshow(self, t_range=None, threshold=0, reverse=False, rescale=False, **kwargs): + return self.get_kernel(t_range, threshold, reverse, rescale).imshow(**kwargs) + + + def to_dict(self): + return {'class':(__name__, self.__class__.__name__)} + + def get_kernel(self, t_range=None, threshold=0, reverse=False, rescale=False): + + if t_range is None: + t_range = self.get_default_t_grid() + +# print self.t_support +# print self.kernel_data + + if len(self.t_support) == 1: + k = Kernel1D(self.t_support, self.kernel_data, threshold=threshold, reverse=reverse) + else: + interpolation_function = spinterp.interp1d(self.t_support, self.kernel_data, fill_value=0, bounds_error=False, assume_sorted=True) + k = Kernel1D(t_range, interpolation_function(t_range), threshold=threshold, reverse=reverse) + if rescale == True: + k.rescale() + + #assert np.abs(np.abs(k.kernel).sum() - 1) < 1e-14 + assert np.abs(np.abs(k.kernel.sum()) - 1) < 1e-14 + + return k + +class ArrayTemporalFilter(TemporalFilter): + + def __init__(self, mask,t_support): + + self.mask = mask + self.t_support = t_support + + assert len(self.mask) == len(self.t_support) + + self.nkt = 600 + + super(self.__class__, self).__init__() + + self.kernel_data = self.mask + #self.t_support = np.arange(0, len(self.kernel_data)*.001, .001) + #assert len(self.t_support) == len(self.kernel_data) + + def get_default_t_grid(self): + + return np.arange(self.nkt)*.001 + +class TemporalFilterCosineBump(TemporalFilter): + + def __init__(self, weights, kpeaks, delays): + + assert len(kpeaks) == 2 + assert kpeaks[0] 0 + assert delays[0] <= delays[1] + + self.ncos = len(weights) + + # Not likely to change defaults: + self.neye = 0 + self.b = .3 + self.nkt = 600 + + super(self.__class__, self).__init__() + + # Parameters + self.weights = np.array([weights]).T + self.kpeaks = kpeaks + self.delays = np.array([delays]).astype(int) + + # Adapter code to get filters from Ram's code: + kbasprs = {} + kbasprs['neye'] = self.neye + kbasprs['ncos'] = self.ncos + kbasprs['kpeaks'] = self.kpeaks + kbasprs['b'] = self.b + kbasprs['delays'] = self.delays + nkt = self.nkt + #kbasprs['bases'] = fitfuns.makeBasis_StimKernel(kbasprs, nkt) + self.kernel_data = np.dot(fitfuns.makeBasis_StimKernel(kbasprs, nkt), self.weights)[::-1].T[0] +# plt.figure() +# plt.plot(self.kernel_data) +# plt.show() +# sys.exit() + self.t_support = np.arange(0, len(self.kernel_data)*.001, .001) + self.kbasprs = kbasprs + assert len(self.t_support) == len(self.kernel_data) + + def __call__(self, t): + return self.interpolation_function(t) + + def get_default_t_grid(self): + return np.arange(self.nkt)*.001 + + def to_dict(self): + + param_dict = super(self.__class__, self).to_dict() + + param_dict.update({'weights':self.weights.tolist(), + 'kpeaks':self.kpeaks}) + + return param_dict diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/transferfunction.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/transferfunction.py new file mode 100644 index 0000000..03ff617 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/transferfunction.py @@ -0,0 +1,58 @@ +from sympy.utilities.lambdify import lambdify +import sympy.parsing.sympy_parser as symp +import sympy.abc +import numpy as np + + +class ScalarTransferFunction(object): + def __init__(self, transfer_function_string, symbol=sympy.abc.s): + self.symbol = symbol + self.transfer_function_string = transfer_function_string + self.closure = lambdify(self.symbol, symp.parse_expr(self.transfer_function_string), modules=['sympy']) + + def __call__(self, s): + return self.closure(s) + + def to_dict(self): + return {'class': (__name__, self.__class__.__name__), + 'function': self.transfer_function_string} + + def imshow(self, xlim, ax=None, show=True, save_file_name=None, ylim=None): + # TODO: This function should be removed (as Ram to see if/where it's used) since it will fail (no t_vals) + import matplotlib.pyplot as plt + if ax is None: + _, ax = plt.subplots(1, 1) + + plt.plot(self.t_vals, self.kernel) + ax.set_xlabel('Time (Seconds)') + + if ylim is not None: + ax.set_ylim(ylim) + + if xlim is not None: + ax.set_xlim((self.t_range[0], self.t_range[-1])) + + if save_file_name is not None: + plt.savefig(save_file_name, transparent=True) + + if show: + plt.show() + + return ax + + +class MultiTransferFunction(object): + def __init__(self, symbol_tuple, transfer_function_string): + self.symbol_tuple = symbol_tuple + self.transfer_function_string = transfer_function_string + self.closure = lambdify(self.symbol_tuple, symp.parse_expr(self.transfer_function_string), modules=['sympy']) + + def __call__(self, *s): + if isinstance(s[0], (float,)): + return self.closure(*s) + else: + return np.array(list(map(lambda x: self.closure(*x), zip(*s)))) + + def to_dict(self): + return {'class': (__name__, self.__class__.__name__), + 'function': self.transfer_function_string} diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/util_fns.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/util_fns.py new file mode 100644 index 0000000..af297a0 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/util_fns.py @@ -0,0 +1,190 @@ +import os +import re +import matplotlib.mlab as mlab +import numpy as np +import scipy.io as sio +from scipy.fftpack import fft +import pandas as pd +from .movie import Movie, FullFieldFlashMovie + + +pd.set_option('display.width', 1000) +pd.set_option('display.max_columns', 100) + + +################################################# +def chunks(l, n): + """Yield successive n-sized chunks from l.""" + for i in range(0, len(l), n): + yield l[i:i + n] + + +################################################## +def compute_FFT_OneCycle(FR, TF, downsample): + one_cyc = np.int(((1000. / downsample) / TF)) + FR_cyc = list(chunks(FR, one_cyc)) + if (TF == 15. or TF == 8.): + FR_cyc = FR_cyc[:-1] + + FR_cyc_avg = np.mean(FR_cyc, axis=0) + y = FR_cyc_avg + AMP = 2 * np.abs(fft(y) / len(y)) + F0 = 0.5 * AMP[0] + assert (F0 - np.mean(y) < 1.e-4) + F1 = AMP[1] + + return F0, F1 + + +################################################## +def create_ff_mov(frame_rate, tst, tend, xrng, yrng): + ff_mov_on = FullFieldFlashMovie(np.arange(xrng), np.arange(yrng), tst, tend, frame_rate=frame_rate, + max_intensity=1).full(t_max=tend) # +0.5) + ff_mov_off = FullFieldFlashMovie(np.arange(xrng), np.arange(yrng), tst, tend, frame_rate=frame_rate, + max_intensity=-1).full(t_max=tend) # +0.5) + + return ff_mov_on, ff_mov_off + + +################################################## +def create_grating_movie_list(gr_dir_name): + gr_fnames = os.listdir(gr_dir_name) + gr_fnames_ord = sorted(gr_fnames, key=lambda x: (int(re.sub('\D', '', x)), x)) + + gr_mov_list = [] + for fname in gr_fnames_ord[:5]: + movie_file = os.path.join(gr_dir_name, fname) + m_file = sio.loadmat(movie_file) + m_data_raw = m_file['mov'].T + swid = np.shape(m_data_raw)[1] + res = int(np.sqrt(swid / (8 * 16))) + m_data = np.reshape(m_data_raw, (3000, 8 * res, 16 * res)) + m1 = Movie(m_data[:500, :, :], row_range=np.linspace(0, 120, m_data.shape[1], endpoint=True), col_range=np.linspace(0, 120, m_data.shape[2], endpoint=True), frame_rate=1000.) + gr_mov_list.append(m1) + + return gr_mov_list + + +################################################## +metrics_dir = os.path.join(os.path.dirname(__file__), 'cell_metrics') +def get_data_metrics_for_each_subclass(ctype): + # Load csv file into dataframe + if ctype.find('_sus') >= 0: + prs_fn = os.path.join(metrics_dir, '{}_cells_v3.csv'.format(ctype)) + else: + prs_fn = os.path.join(metrics_dir, '{}_cell_data.csv'.format(ctype)) + + prs_df = pd.read_csv(prs_fn) + N_class, nmet = np.shape(prs_df) + + # Group data by subclasses based on max F0 vals + exp_df = prs_df.iloc[:, [13, 14, 17, 18, 28, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54]].copy() # Bl_lat,Wh_lat,Bl_si, wh_si, spont, 5 F0s, 5 F1s + sub_df = exp_df.iloc[:, [5, 6, 7, 8, 9]] + exp_df['max_tf'] = sub_df.idxmax(axis=1).values # sub_df.idxmax(axis=1) + + exp_means = exp_df.groupby(['max_tf']).mean() + exp_std = exp_df.groupby(['max_tf']).std() + exp_nsub = exp_df.groupby(['max_tf']).size() + + max_ind_arr = np.where(exp_nsub == np.max(exp_nsub)) + max_nsub_ind = max_ind_arr[0][0] + + # Get means and std dev for subclasses + exp_prs_dict = {} + for scn in np.arange(len(exp_nsub)): + f0_exp = exp_means.iloc[scn, 5:10].values + f1_exp = exp_means.iloc[scn, 10:].values + spont_exp = exp_means.iloc[scn, 4:5].values + if ctype.find('OFF') >= 0: + si_exp = exp_means.iloc[scn, 2:3].values + ttp_exp = exp_means.iloc[scn, 0:1].values + elif ctype.find('ON') >= 0: + si_exp = exp_means.iloc[scn, 3:4].values + ttp_exp = exp_means.iloc[scn, 1:2].values + else: + si_exp = np.NaN * np.ones((1, 5)) + ttp_exp = np.NaN * np.ones((1, 2)) + + nsub = exp_nsub.iloc[scn] + if nsub == 1: + f0_std = np.mean(exp_std.iloc[max_nsub_ind, 5:10].values) * np.ones((1, 5)) + f1_std = np.mean(exp_std.iloc[max_nsub_ind, 10:].values) * np.ones((1, 5)) + spont_std = np.mean(exp_std.iloc[max_nsub_ind, 4:5].values) * np.ones((1, 5)) + if ctype.find('OFF') >= 0: + si_std = np.mean(exp_std.iloc[max_nsub_ind, 2:3].values) * np.ones((1, 5)) + elif ctype.find('ON') >= 0: + si_std = np.mean(exp_std.iloc[max_nsub_ind, 3:4].values) * np.ones((1, 5)) + else: + si_std = np.NaN * np.ones((1, 5)) + + else: + f0_std = exp_std.iloc[scn, 5:10].values + f1_std = exp_std.iloc[scn, 10:].values + spont_std = exp_std.iloc[scn, 4:5].values + if ctype.find('OFF') >= 0: + si_std = exp_std.iloc[scn, 2:3].values + elif ctype.find('ON') >= 0: + si_std = exp_std.iloc[scn, 3:4].values + else: + si_std = np.NaN * np.ones((1, 5)) + + if ctype.find('t') >= 0: + tcross = 40. + si_inf_exp = (si_exp - tcross / 200.) * (200. / (200. - tcross - 40.)) + elif ctype.find('s') >= 0: + tcross = 60. + si_inf_exp = (si_exp - tcross / 200.) * (200. / (200. - tcross - 40.)) + + dict_key = exp_means.iloc[scn].name[3:] + exp_prs_dict[dict_key] = {} + exp_prs_dict[dict_key]['f0_exp'] = f0_exp + exp_prs_dict[dict_key]['f1_exp'] = f1_exp + exp_prs_dict[dict_key]['spont_exp'] = spont_exp + exp_prs_dict[dict_key]['si_exp'] = si_exp + exp_prs_dict[dict_key]['si_inf_exp'] = si_inf_exp + exp_prs_dict[dict_key]['ttp_exp'] = ttp_exp + exp_prs_dict[dict_key]['f0_std'] = f0_std + exp_prs_dict[dict_key]['f1_std'] = f1_std + exp_prs_dict[dict_key]['spont_std'] = spont_std + exp_prs_dict[dict_key]['si_std'] = si_std + exp_prs_dict[dict_key]['nsub'] = nsub + exp_prs_dict[dict_key]['N_class'] = N_class + + return exp_prs_dict + + +################################################## +def check_optim_results_against_bounds(bounds, opt_wts, opt_kpeaks): + bds_wts0 = bounds[0] + bds_wts1 = bounds[1] + bds_kp0 = bounds[2] + bds_kp1 = bounds[3] + + opt_wts0 = opt_wts[0] + opt_wts1 = opt_wts[1] + opt_kp0 = opt_kpeaks[0] + opt_kp1 = opt_kpeaks[1] + + if (opt_wts0 == bds_wts0[0] or opt_wts0 == bds_wts0[1]): + prm_on_bds = 'w0' + elif (opt_wts1 == bds_wts1[0] or opt_wts1 == bds_wts1[1]): + prm_on_bds = 'w1' + elif (opt_kp0 == bds_kp0[0] or opt_kp0 == bds_kp0[1]): + prm_on_bds = 'kp0' + elif (opt_kp1 == bds_kp1[0] or opt_kp1 == bds_kp1[1]): + prm_on_bds = 'kp1' + else: + prm_on_bds = 'None' + + return prm_on_bds + + +####################################################### +def get_tcross_from_temporal_kernel(temporal_kernel): + max_ind = np.argmax(temporal_kernel) + min_ind = np.argmin(temporal_kernel) + + temp_tcross_ind = mlab.cross_from_above(temporal_kernel[max_ind:min_ind], 0.0) + tcross_ind = max_ind + temp_tcross_ind[0] + return tcross_ind diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/utilities.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/utilities.py new file mode 100644 index 0000000..69e61d9 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/lgnmodel/utilities.py @@ -0,0 +1,123 @@ +import array +import matplotlib.pyplot as plt +import skimage.transform as transform +import numpy as np +import scipy.integrate as spi +import scipy.optimize as sopt +import warnings +import scipy.interpolate as sinterp + +def get_vanhateren(filename, src_dir): + with open(filename, 'rb') as handle: + s = handle.read() + arr = array.array('H', s) + arr.byteswap() + return np.array(arr, dtype='uint16').reshape(1024, 1536) + +def convert_tmin_tmax_framerate_to_trange(t_min,t_max,frame_rate): + duration = t_max-t_min + number_of_frames = duration*frame_rate # Assumes t_min/t_max in same time units as frame_rate + dt= 1./frame_rate + return t_min+np.arange(number_of_frames+1)*dt + +def get_rotation_matrix(rotation, shape): + '''Angle in degrees''' + + shift_y, shift_x = np.array(shape) / 2. + tf_rotate = transform.SimilarityTransform(rotation=np.deg2rad(rotation)) + tf_shift = transform.SimilarityTransform(translation=[-shift_x, -shift_y]) + tf_shift_inv = transform.SimilarityTransform(translation=[shift_x, shift_y]) + return (tf_shift + (tf_rotate + tf_shift_inv)) + +def get_translation_matrix(translation): + shift_x, shift_y = translation + tf_shift = transform.SimilarityTransform(translation=[-shift_x, shift_y]) + return tf_shift + + +def get_scale_matrix(scale, shape): + shift_y, shift_x = np.array(shape) / 2. + tf_rotate = transform.SimilarityTransform(scale=(1./scale[0], 1./scale[1])) + tf_shift = transform.SimilarityTransform(translation=[-shift_x, -shift_y]) + tf_shift_inv = transform.SimilarityTransform(translation=[shift_x, shift_y]) + return tf_shift + (tf_rotate + tf_shift_inv) + +def apply_transformation_matrix(image, matrix): + return transform.warp(image, matrix) + + +def get_convolution_ind(curr_fi, flipped_t_inds, kernel, data): + + flipped_and_offset_t_inds = flipped_t_inds + curr_fi + + if np.all( flipped_and_offset_t_inds >= 0): + + # No negative entries; still might be over the end though: + try: + return np.dot(data[flipped_and_offset_t_inds], kernel) + + except IndexError: + + # Requested some indices out of range of data: + indices_within_range = np.where(flipped_and_offset_t_inds < len(data)) + valid_t_inds = flipped_and_offset_t_inds[indices_within_range] + valid_kernel = kernel[indices_within_range] + return np.dot(data[valid_t_inds], valid_kernel) + + else: + +# # Some negative entries: +# if np.all( flipped_and_offset_t_inds < 0): +# +# # All are negative: +# return 0 +# +# else: + + # Only some are negative, so restrict: + indices_within_range = np.where(flipped_and_offset_t_inds >= 0) + valid_t_inds = flipped_and_offset_t_inds[indices_within_range] + valid_kernel = kernel[indices_within_range] + + return np.dot(data[valid_t_inds], valid_kernel) + +def get_convolution(t, frame_rate, flipped_t_inds, kernel, data): + + # Get frame indices: + fi = frame_rate*float(t) + fim = int(np.floor(fi)) + fiM = int(np.ceil(fi)) + + if fim != fiM: + + # Linear interpolation: + sm = get_convolution_ind(fim, flipped_t_inds, kernel, data) + sM = get_convolution_ind(fiM, flipped_t_inds, kernel, data) + return sm*(1-(fi-fim)) + sM*(fi-fim) + + else: + + # Requested time is exactly one piece of data: + return get_convolution_ind(fim, flipped_t_inds, kernel, data) + +if __name__ == "__main__": + pass +# print generate_poisson([0,1,2,3],[.5,1,2,3]) + + + +# test_generate_poisson_function() + +# image = np.zeros((101,151)) +# image[48:52+1]=1 +# +# mr = get_rotation_matrix(30, image.shape) +# mt = get_translation_matrix((20,0)) +# ms = get_scale_matrix((.5,1),image.shape) +# +# m = mr +# +# fig, ax = plt.subplots(2,1) +# ax[0].imshow(image) +# ax[1].imshow(apply_transformation_matrix(image, m)) +# plt.show() diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/__init__.py new file mode 100644 index 0000000..13185dd --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/__init__.py @@ -0,0 +1,2 @@ +from .record_rates import RecordRates +from .create_spikes import SpikesGenerator diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/base.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/base.py new file mode 100644 index 0000000..1bf7865 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/base.py @@ -0,0 +1,9 @@ +class SimModule(object): + def initialize(self, sim): + pass + + def save(self, sim, **kwargs): + pass + + def finalize(self, sim): + pass \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/create_spikes.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/create_spikes.py new file mode 100644 index 0000000..d2acf96 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/create_spikes.py @@ -0,0 +1,99 @@ +import os +import numpy as np +import random +import six + +from .base import SimModule +from bmtk.utils.io.spike_trains import SpikeTrainWriter +from bmtk.simulator.filternet.lgnmodel import poissongeneration as pg + + +class SpikesGenerator(SimModule): + def __init__(self, spikes_file_csv=None, spikes_file=None, spikes_file_nwb=None, tmp_dir='output'): + def _get_file_path(file_name): + if file_name is None or os.path.isabs(file_name): + return file_name + + return os.path.join(tmp_dir, file_name) + + self._csv_fname = _get_file_path(spikes_file_csv) + self._save_csv = spikes_file_csv is not None + + self._h5_fname = _get_file_path(spikes_file) + self._save_h5 = spikes_file is not None + + self._nwb_fname = _get_file_path(spikes_file_nwb) + self._save_nwb = spikes_file_nwb is not None + + self._tmpdir = tmp_dir + + self._spike_writer = SpikeTrainWriter(tmp_dir=tmp_dir) + + def save(self, sim, gid, times, rates): + try: + spike_trains = np.array(f_rate_to_spike_train(times*1000.0, rates, np.random.randint(10000), + 1000.*min(times), 1000.*max(times), 0.1)) + except: + # convert to milliseconds and hence the multiplication by 1000 + spike_trains = 1000.0*np.array(pg.generate_inhomogenous_poisson(times, rates, + seed=np.random.randint(10000))) + + self._spike_writer.add_spikes(times=spike_trains, gid=gid) + + def finalize(self, sim): + self._spike_writer.flush() + + if self._save_csv: + self._spike_writer.to_csv(self._csv_fname) + + if self._save_h5: + self._spike_writer.to_hdf5(self._h5_fname) + + if self._save_nwb: + self._spike_writer.to_nwb(self._nwb_fname) + + self._spike_writer.close() + + +def f_rate_to_spike_train(t, f_rate, random_seed, t_window_start, t_window_end, p_spike_max): + # t and f_rate are lists containing time stamps and corresponding firing rate values; + # they are assumed to be of the same length and ordered with the time strictly increasing; + # p_spike_max is the maximal probability of spiking that we allow within the time bin; it is used to decide on the size of the time bin; should be less than 1! + + if np.max(f_rate) * np.max(np.diff(t))/1000. > 0.1: #Divide by 1000 to convert to seconds + print('Firing rate to high for time interval and will not estimate spike correctly. Spikes will ' \ + 'be calculated with the slower inhomogenous poisson generating fucntion') + raise Exception() + + spike_times = [] + + # Use seed(...) to instantiate the random number generator. Otherwise, current system time is used. + random.seed(random_seed) + + # Assume here for each pair (t[k], f_rate[k]) that the f_rate[k] value applies to the time interval [t[k], t[k+1]). + for k in six.moves.range(0, len(f_rate)-1): + t_k = t[k] + t_k_1 = t[k+1] + if ((t_k >= t_window_start) and (t_k_1 <= t_window_end)): + delta_t = t_k_1 - t_k + # Average number of spikes expected in this interval (note that firing rate is in Hz and time is in ms). + av_N_spikes = f_rate[k] / 1000.0 * delta_t + + if (av_N_spikes > 0): + if (av_N_spikes <= p_spike_max): + N_bins = 1 + else: + N_bins = int(np.ceil(av_N_spikes / p_spike_max)) + + t_base = t[k] + t_bin = 1.0 * delta_t / N_bins + p_spike_bin = 1.0 * av_N_spikes / N_bins + for i_bin in six.moves.range(0, N_bins): + rand_tmp = random() + if rand_tmp < p_spike_bin: + spike_t = t_base + random() * t_bin + spike_times.append(spike_t) + + t_base += t_bin + + return spike_times \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/record_rates.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/record_rates.py new file mode 100644 index 0000000..b2978a3 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/modules/record_rates.py @@ -0,0 +1,29 @@ +import os +import csv + +from .base import SimModule + + +class RecordRates(SimModule): + def __init__(self, csv_file=None, h5_file=None, tmp_dir='output'): + csv_file = csv_file if csv_file is None or os.path.isabs(csv_file) else os.path.join(tmp_dir, csv_file) + self._save_to_csv = csv_file is not None + self._tmp_csv_file = csv_file if self._save_to_csv else os.path.join(tmp_dir, '__tmp_rates.csv') + + self._tmp_csv_fhandle = open(self._tmp_csv_file, 'w') + self._tmp_csv_writer = csv.writer(self._tmp_csv_fhandle, delimiter=' ') + + self._save_to_h5 = h5_file is not None + + def save(self, sim, gid, times, rates): + for t, r in zip(times, rates): + self._tmp_csv_writer.writerow([gid, t, r]) + self._tmp_csv_fhandle.flush() + + def finalize(self, sim): + if self._save_to_h5: + raise NotImplementedError + + self._tmp_csv_fhandle.close() + if not self._save_to_csv: + os.remove(self._tmp_csv_file) diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/pyfunction_cache.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/pyfunction_cache.py new file mode 100644 index 0000000..9ac949a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/pyfunction_cache.py @@ -0,0 +1,98 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import types +from functools import wraps + + +class _PyFunctions(object): + """Structure for holding custom user-defined python functions. + + Will store a set of functions created by the user. Should not access this directly but rather user the + decorators or setter functions, and use the py_modules class variable to access individual functions. Is divided + up into + synaptic_weight: functions for calcuating synaptic weight. + cell_model: should return NEURON cell hobj. + synapse model: should return a NEURON synapse object. + """ + def __init__(self): + self.__cell_processors = {} + + def clear(self): + self.__cell_processors.clear() + + @property + def cell_processors(self): + return self.__cell_processors.keys() + + def cell_processor(self, name): + return self.__cell_processors[name] + + def add_cell_processor(self, name, func, overwrite=True): + if overwrite or name not in self.__cell_processors: + self.__cell_processors[name] = func + + def __repr__(self): + return self.__cell_processors + + +py_modules = _PyFunctions() + + +def cell_processor(*wargs, **wkwargs): + """A decorator for registering NEURON cell loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_cell_processor(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_cell_processor(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def add_cell_processor(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_cell_processor(func_name, func, overwrite) + + +def load_py_modules(cell_processors): + # py_modules.clear() + assert (isinstance(cell_processors, types.ModuleType)) + for f in [cell_processors.__dict__.get(f) for f in dir(cell_processors)]: + if isinstance(f, types.FunctionType): + py_modules.add_cell_processor(f.__name__, f) diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/transfer_functions.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/transfer_functions.py new file mode 100644 index 0000000..6517719 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/transfer_functions.py @@ -0,0 +1 @@ +from bmtk.simulator.filternet.lgnmodel.transferfunction import * \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/filternet/utils.py b/bmtk-vb/build/lib/bmtk/simulator/filternet/utils.py new file mode 100644 index 0000000..c01045c --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/filternet/utils.py @@ -0,0 +1 @@ +from bmtk.simulator.filternet.lgnmodel.util_fns import * diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/Image_Library.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/Image_Library.py new file mode 100644 index 0000000..506a040 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/Image_Library.py @@ -0,0 +1,105 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import os +from PIL import Image + +# Image_Batch +# .data (image_data) +# .image_dir, .new_size + + +# add seed for random +# call should return indices into im_list +class Image_Experiment(object): + + def __init__(self,stuff): + + self.image_dir + self.new_size + self.sample_indices + self.im_list + # creating of pandas table, template + + + + + +class Image_Library (object): + def __init__(self, image_dir,new_size=(128,192)): # NOTE: change this so that sequential is a class variable, not an argument to the call + self.image_dir = image_dir + self.new_size = new_size + + im_list = os.listdir(image_dir) + + remove_list = [] + for im in im_list: + if im[-5:]!='.tiff' and im[-5:]!='.JPEG' and im[-4:]!='.jpg': + remove_list.append(im) + + for im in remove_list: + im_list.remove(im) + + self.im_list = im_list + + self.current_location = 0 # used for sequential samples + self.lib_size = len(self.im_list) + + def __call__(self,num_samples, sequential=False): + + image_data = np.zeros([num_samples,self.new_size[0],self.new_size[1],1],dtype=np.float32) + + if sequential: + if self.lib_size-self.current_location > num_samples: + sample_indices = np.arange(self.current_location,self.current_location + num_samples) + self.current_location += num_samples + else: + sample_indices = np.arange(self.current_location,self.lib_size) + self.current_location = 0 + else: + sample_indices = np.random.randint(0,len(self.im_list),num_samples) + + for i,s in enumerate(sample_indices): + im = Image.open(os.path.join(self.image_dir,self.im_list[s])) + im = im.convert('L') + im = im.resize((self.new_size[1],self.new_size[0])) + image_data[i,:,:,0] = np.array(im,dtype=np.float32) + + return image_data + + def create_experiment(self): + + data = self() + return Image_Experiment(stuff) + + def experiment_from_table(self,table): + pass + + def to_h5(self,sample_indices=None): + pass + + def template(self): + pass + + def table(self,*params): + pass diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/Image_Library_Supervised.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/Image_Library_Supervised.py new file mode 100644 index 0000000..756b62b --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/Image_Library_Supervised.py @@ -0,0 +1,93 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from PIL import Image +import numpy as np +import os + +class Image_Library_Supervised (object): + + def __init__(self,image_dir,new_size=(256,256)): + + self.categories = os.listdir(image_dir) + + self.num_categories = len(self.categories) #len(image_dir_list) + self.image_dir_list = [os.path.join(image_dir,x) for x in self.categories] + self.new_size = new_size + + + # self.categories = [] + # for d in self.image_dir_list: + # self.categories += [os.path.basename(d)] + + self.im_lists = {} + for i,cat in enumerate(self.categories): + d = self.image_dir_list[i] + if os.path.basename(d[0])=='.': continue + self.im_lists[cat] = os.listdir(d) + + for cat in self.im_lists: + remove_list = [] + for im in self.im_lists[cat]: + if im[-4:]!='.jpg': + remove_list.append(im) + + for im in remove_list: + self.im_lists[cat].remove(im) + + + self.current_location = np.zeros(len(self.categories)) # used for sequential samples + self.lib_size = [len(self.im_lists[x]) for x in self.categories] + #self.lib_size = len(self.im_list) + + def __call__(self,num_samples,sequential=False): + + image_data = np.zeros([self.num_categories*num_samples,self.new_size[0],self.new_size[1],1],dtype=np.float32) + + # y_vals = np.tile(np.arange(self.num_categories),(num_samples,1)).T.flatten() + # y_vals = y_vals.astype(np.float32) + + y_vals = np.zeros([num_samples*self.num_categories,self.num_categories],np.float32) + + for i,cat in enumerate(self.categories): + + y_vals[num_samples*i:num_samples*i+num_samples].T[i] = 1 + + if sequential: + if self.lib_size[i]-self.current_location[i] > num_samples: + sample_indices = np.arange(self.current_location[i],self.current_location[i] + num_samples,dtype=np.int64) + self.current_location[i] += num_samples + else: + sample_indices = np.arange(self.current_location[i],self.lib_size[i],dtype=np.int64) + self.current_location[i] = 0 + else: + sample_indices = np.random.randint(0,len(self.im_lists[cat]),num_samples) + + for j,s in enumerate(sample_indices): + im = Image.open(os.path.join(self.image_dir_list[i],self.im_lists[cat][s])) + im = im.convert('L') + im = im.resize((self.new_size[1],self.new_size[0])) + index = j + num_samples*i + image_data[index,:,:,0] = np.array(im,dtype=np.float32) + + return y_vals, image_data + diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/analysis/LocallySparseNoise.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/analysis/LocallySparseNoise.py new file mode 100644 index 0000000..60b9228 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/analysis/LocallySparseNoise.py @@ -0,0 +1,105 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd +import h5py + + +class LocallySparseNoise (object): + + def __init__(self,data_file_name): + + self.stim_table = pd.read_hdf(data_file_name,'stim_table') + self.node_table = pd.read_hdf(data_file_name,'node_table') + + + self.data_file_name = data_file_name + + data = h5py.File(self.data_file_name,'r') + + self.data_sets = data.keys() + self.data_sets.remove('stim_table') + self.data_sets.remove('node_table') + self.data_sets.remove('stim_template') + + self.stim_template = data['stim_template'].value + + data.close() + + @staticmethod + def rf(response, stim_template, stim_shape): + T = stim_template.shape[0] + rf_shape = tuple(stim_template.shape[1:]) + + unit_shape = tuple(response.shape[1:]) + + response.resize([T,np.prod(unit_shape)]) + + rf = np.dot(response.T,stim_template) + + rf_new_shape = tuple([rf.shape[0]] + list(rf_shape)) + rf.resize(rf_new_shape) + rf_final_shape = tuple(list(unit_shape) + list(stim_shape)) + rf.resize(rf_final_shape) + + return rf + + def compute_receptive_fields(self, dtype=np.float32): + + output = h5py.File(self.data_file_name[:-3]+'_analysis.ic','a') + data = h5py.File(self.data_file_name,'r') + + # convert to +/-1 or 0 + stim_template = data['stim_template'].value.astype(dtype) + stim_template = stim_template-127 + stim_template = np.sign(stim_template) + #print np.unique(stim_template) + + stim_shape = tuple(stim_template.shape[1:]) + T = stim_template.shape[0] + + stim_template.resize([T,np.prod(stim_shape)]) + + stim_template_on = stim_template.copy() + stim_template_off = stim_template.copy() + + stim_template_on[stim_template_on<0] = 0.0 + stim_template_off[stim_template_off>0] = 0.0 + + for data_set in self.data_sets: + + response = data[data_set].value + response = response - np.mean(response,axis=0) + + key_onoff = data_set+'/lsn/on_off' + key_on = data_set+'/lsn/on' + key_off = data_set+'/lsn/off' + for key in [key_onoff, key_on, key_off]: + if key in output: + del output[key] + + output[key_onoff] = self.rf(response, stim_template, stim_shape) + output[key_on] = self.rf(response, stim_template_on, stim_shape) + output[key_off] = self.rf(response, stim_template_off, stim_shape) + + data.close() diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/analysis/StaticGratings.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/analysis/StaticGratings.py new file mode 100644 index 0000000..10a019b --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/analysis/StaticGratings.py @@ -0,0 +1,101 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd +import h5py +import sys +import os + +class StaticGratings (object): + + def __init__(self,data_file_name): + + self.stim_table = pd.read_hdf(data_file_name,'stim_table') + self.node_table = pd.read_hdf(data_file_name,'node_table') + self.tunings_file = None + + f = lambda label: self.stim_table.dropna().drop_duplicates([label])[label].sort_values(inplace=False).values + + self.orientations = f('orientation') + self.spatial_frequencies = f('spatial_frequency') + self.phases = f('phase') + + self.data_file_name = data_file_name + + data = h5py.File(self.data_file_name,'r') + + self.data_sets = data.keys() + self.data_sets.remove('stim_table') + self.data_sets.remove('node_table') + self.data_sets.remove('stim_template') + + data.close() + + def tuning_matrix(self, response, dtype=np.float32): + + tuning_shape = tuple([len(self.orientations), len(self.spatial_frequencies), len(self.phases)] + list(response.shape[1:])) + + tuning_matrix = np.empty(tuning_shape, dtype=dtype) + + for i,ori in enumerate(self.orientations): + for j,sf in enumerate(self.spatial_frequencies): + for k,ph in enumerate(self.phases): + + index = self.stim_table[(self.stim_table.spatial_frequency==sf) & (self.stim_table.orientation==ori) & (self.stim_table.phase==ph)].index + + tuning_matrix[i,j,k] = np.mean(response[index],axis=0) + + return tuning_matrix + + def compute_all_tuning(self, dtype=np.float32, force=False): + self.tunings_file = self.data_file_name[:-3]+'_analysis.ic' + if os.path.exists(self.tunings_file) and not force: + print('Using existing tunings file {}.'.format(self.tunings_file)) + return + + output = h5py.File(self.tunings_file,'a') + data = h5py.File(self.data_file_name,'r') + + for i, data_set in enumerate(self.data_sets): + sys.stdout.write( '\r{0:.02f}'.format(float(i)*100/len(self.data_sets))+'% done') + sys.stdout.flush() + + response = data[data_set].value + + tuning = self.tuning_matrix(response, dtype=dtype) + + key = data_set+'/sg/tuning' + if key in output: + del output[key] + output[key] = tuning + + sys.stdout.write( '\r{0:.02f}'.format(float(100))+'% done') + sys.stdout.flush() + + data.close() + + def get_tunings_file(self): + if self.tunings_file is None: + self.compute_all_tuning() + + return h5py.File(self.tunings_file, 'r') \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/analysis/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/analysis/__init__.py new file mode 100644 index 0000000..2d56a26 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/analysis/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/C_Layer.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/C_Layer.py new file mode 100644 index 0000000..1489c89 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/C_Layer.py @@ -0,0 +1,260 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +import os +import pandas as pd + +class C_Layer (object): + def __init__(self,node_name,S_Layer_input,bands): + ''' + :type S_Layer: S_Layer object + :param S_Layer: instance of S_Layer object that serves as input for this C_Layer + + :type bands: list + :param bands: bands[i] = [[list of frequency indices for S_layer over which to pool], grid_size, sample_step] + ''' + self.node_name = node_name + self.input = S_Layer_input.input + + self.tf_sess = S_Layer_input.tf_sess + + s_output = S_Layer_input.output + + self.K = S_Layer_input.K + + band_output = {} + + num_bands = len(bands) + + self.band_output = {} + + self.band_shape = {} + + with tf.name_scope(self.node_name): + for b in range(num_bands): + bands_to_pool, grid_size, sample_step = bands[b] + + sub_band_shape = [] + for sub_band in bands_to_pool: + sub_band_shape += [S_Layer_input.band_shape[sub_band]] + + max_band_shape = sub_band_shape[0] + for shape in sub_band_shape[1:]: + if shape[0] > max_band_shape[0]: max_band_shape[0] = shape[0] + if shape[1] > max_band_shape[1]: max_band_shape[1] = shape[1] + + # print "max_band_shape = ", max_band_shape + # for sub_band in bands_to_pool: + # print "\tsub_band_shape = ", S_Layer_input.band_shape[sub_band] + # print "\tinput band shape = ", s_output[sub_band].get_shape() + + #resize all inputs to highest resolution so that we can maxpool over equivalent scales + resize_ops = [] + for sub_band in bands_to_pool: + op = s_output[sub_band] + # resize_ops += [tf.image.resize_images(op,max_band_shape[0],max_band_shape[1],method=ResizeMethod.NEAREST_NEIGHBOR)] + resize_ops += [tf.image.resize_nearest_neighbor(op,max_band_shape)] + #print "\tresize op shape = ", resize_ops[-1].get_shape() + + #take the maximum for each input channel, element-wise + max_channel_op = resize_ops[0] + for op in resize_ops[1:]: + max_channel_op = tf.maximum(op,max_channel_op) + + #print "\tmax channel op shape = ", max_channel_op.get_shape() + + # new shape for mode 'SAME' + # new_band_shape = (max_band_shape[0]/sample_step, max_band_shape[1]/sample_step) + new_band_shape = np.ceil(np.array(max_band_shape)/float(sample_step)).astype(np.int64) + + # make sure the grid_size and sample_step aren't bigger than the image + if max_band_shape[0] < grid_size: + y_size = max_band_shape[0] + else: + y_size = grid_size + + if max_band_shape[1] < grid_size: + x_size = max_band_shape[1] + else: + x_size = grid_size + + if sample_step > max_band_shape[0]: + y_step = max_band_shape[0] + new_band_shape = (1,new_band_shape[1]) + else: + y_step = sample_step + if sample_step > max_band_shape[1]: + x_step = max_band_shape[1] + new_band_shape = (new_band_shape[0],1) + else: + x_step = sample_step + + # max pool + max_pool_op = tf.nn.max_pool(max_channel_op,[1,y_size,x_size,1],strides=[1,y_step,x_step,1],padding='SAME') + + self.band_shape[b] = new_band_shape + #print "max_band_shape: ", max_band_shape + + self.band_output[b]=max_pool_op + + self.num_units = 0 + for b in self.band_shape: + self.num_units += np.prod(self.band_shape[b])*self.K + + self.output = self.band_output + + def __repr__(self): + return "C_Layer" + + def compute_output(self,X,band): + return self.tf_sess.run(self.output[band],feed_dict={self.input:X}) + + # def get_compute_ops(self): + # + # node_table = pd.DataFrame(columns=['node','band']) + # compute_list = [] + # + # for band in self.band_output: + # node_table = node_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + # + # compute_list.append(self.output[band]) + # + # return node_table, compute_list + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + + for i, row in unit_table.iterrows(): + + if 'y' in unit_table: + node, band, y, x = row['node'], int(row['band']), int(row['y']), int(row['x']) + compute_list.append(self.output[band][:,y,x,:]) + + elif 'band' in unit_table: + node, band = row['node'], int(row['band']) + compute_list.append(self.output[band]) + + else: + return self.get_all_compute_ops() + + else: + return self.get_all_compute_ops() + + return unit_table, compute_list + + def get_all_compute_ops(self): + + compute_list = [] + unit_table = pd.DataFrame(columns=['node','band']) + for band in self.band_output: + unit_table = unit_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + + compute_list.append(self.output[band]) + + return unit_table, compute_list + + +def test_C1_Layer(): + + from S1_Layer import S1_Layer + import matplotlib.pyplot as plt + + fig_dir = 'Figures' + # First we need an S1 Layer + # these parameters are taken from Serre, et al PNAS for HMAX + freq_channel_params = [ [7,2.8,3.5], + [9,3.6,4.6], + [11,4.5,5.6], + [13,5.4,6.8], + [15,6.3,7.9], + [17,7.3,9.1], + [19,8.2,10.3], + [21,9.2,11.5], + [23,10.2,12.7], + [25,11.3,14.1], + [27,12.3,15.4], + [29,13.4,16.8], + [31,14.6,18.2], + [33,15.8,19.7], + [35,17.0,21.2], + [37,18.2,22.8], + [39,19.5,24.4]] + + orientations = np.arange(4)*np.pi/4 + + input_shape = (128,192) + s1 = S1_Layer(input_shape,freq_channel_params,orientations) + + # Now we need to define a C1 Layer + bands = [ [[0,1], 8, 3], + [[2,3], 10, 5], + [[4,5], 12, 7], + [[6,7], 14, 8], + [[8,9], 16, 10], + [[10,11], 18, 12], + [[12,13], 20, 13], + [[14,15,16], 22, 15]] + + c1 = C_Layer(s1,bands) + + # Test c1 on an image + from isee_engine.mintnet.Image_Library import Image_Library + + image_dir = '/Users/michaelbu/Code/HCOMP/SampleImages' + + im_lib = Image_Library(image_dir) + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + print(image_data.shape) + + fig, ax = plt.subplots(len(bands),len(orientations)*2) + result = {} + for b in range(len(bands)): + result[b] = c1.compute_output(image_data,b) + print(result[b].shape) + n, y,x,K = result[b].shape + + for k in range(K): + #print result[b][i].shape + # y = i/8 + # x = i%8 + # ax[y,x].imshow(result[b][0,i],interpolation='nearest',cmap='gray') + # ax[y,x].axis('off') + + ax[b,k].imshow(result[b][0,:,:,k],interpolation='nearest',cmap='gray') + ax[b,k].axis('off') + + fig.savefig(os.path.join(fig_dir,'c1_layer.tiff')) + plt.show() + +if __name__=='__main__': + + test_C1_Layer() diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/Readout_Layer.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/Readout_Layer.py new file mode 100644 index 0000000..9126ea1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/Readout_Layer.py @@ -0,0 +1,243 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +from bmtk.simulator.mintnet.Image_Library_Supervised import Image_Library_Supervised +import h5py + +class Readout_Layer (object): + + def __init__(self,node_name,input_layer,K,lam,alt_image_dir='',file_name=None): + + self.node_name = node_name + self.K = K + self.input_layer = input_layer + self.weight_file = file_name + self.lam = lam + + self.alt_image_dir = alt_image_dir + + if file_name==None: + new_weights=True + self.train_state = False + else: + + weight_h5 = h5py.File(self.weight_file,'a') + file_open=True + + if self.node_name in weight_h5.keys(): + + new_weights = False + weight_data = weight_h5[self.node_name]['weights'].value + self.train_state = weight_h5[self.node_name]['train_state'].value + + else: + + new_weights = True + self.train_state =False + weight_h5.create_group(self.node_name) + weight_h5[self.node_name]['train_state']=self.train_state + + self.input = self.input_layer.input + #self.tf_sess = self.input_layer.tf_sess + self.tf_sess = tf.Session() + + self.w_shape = (self.input_layer.K,self.K) + + if new_weights: + #weights=1.0*np.ones(self.w_shape).astype(np.float32) + weights=100000*np.random.normal(size=self.w_shape).astype(np.float32) + if file_name!=None: + weight_h5[self.node_name].create_dataset('weights',shape=weights.shape,dtype=np.float32,compression='gzip',compression_opts=9) + weight_h5[self.node_name]['weights'][...]=weights + else: + weights=weight_data + + self.weights = tf.Variable(weights.astype(np.float32),trainable=True,name='weights') + self.weights.initializer.run(session=self.tf_sess) + self.bias = tf.Variable(np.zeros(self.K,dtype=np.float32),trainable=True,name='bias') + self.bias.initializer.run(session=self.tf_sess) + + # sigmoid doesn't seem to work well, and is slow + #self.output = tf.sigmoid(tf.matmul(self.input_layer.output,W)+self.bias) + + self.input_placeholder = tf.placeholder(tf.float32,shape=(None,self.input_layer.K)) + #self.output = tf.nn.softmax(tf.matmul(self.input_placeholder,self.weights) + self.bias) + self.linear = tf.matmul(self.input_placeholder,self.weights) #+ self.bias + + self.output = tf.sign(self.linear) + #self.output = tf.nn.softmax(self.linear) + #self.output = tf.nn.softmax(tf.matmul(self.input_layer.output,self.weights) + self.bias) + + self.y = tf.placeholder(tf.float32,shape=(None,self.K)) + + + #self.cost = -tf.reduce_mean(self.y*tf.log(self.output)) + self.cost = tf.reduce_mean((self.y - self.output)**2) + self.lam*(tf.reduce_sum(self.weights))**2 + + # not gonna do much with current cost function :) + self.train_step = tf.train.GradientDescentOptimizer(0.1).minimize(self.cost) + + self.num_units = self.K + + if file_open: + weight_h5.close() + + def compute_output(self,X): + + #return self.tf_sess.run(self.output,feed_dict={self.input:X}) + + rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:X}) + + return self.tf_sess.run(self.output,feed_dict={self.input_placeholder:rep}) + + def predict(self,X): + + y_vals = self.compute_output(X) + + return np.argmax(y_vals,axis=1) + + def train(self,image_dir,batch_size=10,image_shape=(256,256),max_iter=200): + + print("Training") + + im_lib = Image_Library_Supervised(image_dir,new_size=image_shape) + + # let's use the linear regression version for now + training_lib_size = 225 + y_vals, image_data = im_lib(training_lib_size,sequential=True) + + y_vals = y_vals.T[0].T + y_vals = 2*y_vals - 1.0 + + print(y_vals) + # print y_vals + # print image_data.shape + + # import matplotlib.pyplot as plt + # plt.imshow(image_data[0,:,:,0]) + # plt.figure() + # plt.imshow(image_data[1,:,:,0]) + # plt.figure() + # plt.imshow(image_data[9,:,:,0]) + + # plt.show() + + num_batches = int(np.ceil(2*training_lib_size/float(batch_size))) + rep_list = [] + for i in range(num_batches): + print(i) + # if i==num_batches-1: + # rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data[i*batch_size:i*batch_size + training_lib_size%batch_size]}) + # else: + rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data[i*batch_size:(i+1)*batch_size]}) + rep_list += [rep] + + rep = np.vstack(rep_list) + + + C = np.dot(rep.T,rep) + self.lam*np.eye(self.input_layer.K) + W = np.dot(np.linalg.inv(C),np.dot(rep.T,y_vals)).astype(np.float32) + + self.tf_sess.run(self.weights.assign(tf.expand_dims(W,1))) + + train_result = self.tf_sess.run(self.output,feed_dict={self.input_placeholder:rep}) + + print(W) + print(train_result.flatten()) + print(y_vals.flatten()) + #print (train_result.flatten() - y_vals.flatten()) + print("train error = ", np.mean((train_result.flatten() != y_vals.flatten()))) + + from scipy.stats import norm + target_mask = y_vals==1 + dist_mask = np.logical_not(target_mask) + hit_rate = np.mean(train_result.flatten()[target_mask] == y_vals.flatten()[target_mask]) + false_alarm = np.mean(train_result.flatten()[dist_mask] != y_vals.flatten()[dist_mask]) + dprime = norm.ppf(hit_rate) - norm.ppf(false_alarm) + print("dprime = ", dprime) + + # Test error + im_lib = Image_Library_Supervised('/Users/michaelbu/Data/SerreOlivaPoggioPNAS07/Train_Test_Set/Test',new_size=image_shape) + + testing_lib_size = 300 + y_vals_test, image_data_test = im_lib(testing_lib_size,sequential=True) + + y_vals_test = y_vals_test.T[0].T + y_vals_test = 2*y_vals_test - 1.0 + + num_batches = int(np.ceil(2*testing_lib_size/float(batch_size))) + rep_list = [] + for i in range(num_batches): + print(i) + # if i==num_batches-1: + # rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data[i*batch_size:i*batch_size + training_lib_size%batch_size]}) + # else: + rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data_test[i*batch_size:(i+1)*batch_size]}) + rep_list += [rep] + + rep_test = np.vstack(rep_list) + + test_result = self.tf_sess.run(self.output,feed_dict={self.input_placeholder:rep_test}) + + #print test_result + print("test error = ", np.mean((test_result.flatten() != y_vals_test.flatten()))) + target_mask = y_vals_test==1 + dist_mask = np.logical_not(target_mask) + hit_rate = np.mean(test_result.flatten()[target_mask] == y_vals_test.flatten()[target_mask]) + false_alarm = np.mean(test_result.flatten()[dist_mask] != y_vals_test.flatten()[dist_mask]) + dprime = norm.ppf(hit_rate) - norm.ppf(false_alarm) + print("dprime = ", dprime) + + print(rep_test.shape) + + + # logistic regression unit + # import time + # for n in range(max_iter): + # start = time.time() + # print "\tIteration ", n + + # y_vals, image_data = im_lib(batch_size,sequential=True) + + # print "\tComputing representation" + # rep = self.input_layer.tf_sess.run(self.input_layer.output,feed_dict={self.input:image_data}) + + # print "\tGradient descent step" + # #print "rep shape = ", rep.shape + # self.tf_sess.run(self.train_step,feed_dict={self.input_placeholder:rep,self.y:y_vals}) + + + # #self.tf_sess.run(self.train_step,feed_dict={self.input:image_data,self.y:y_vals}) + + # #print "\t\ttraining batch cost = ", self.tf_sess.run(self.cost,feed_dict={self.input:image_data,self.y:y_vals}) + + # print "\t\tTraining error = ", np.mean(np.abs(np.argmax(y_vals,axis=1) - self.predict(image_data))) + # print y_vals + # print + # print self.predict(image_data) + # print "\t\ttraining batch cost = ", self.tf_sess.run(self.cost,feed_dict={self.input_placeholder:rep,self.y:y_vals}) + # print "\t\ttraining linear model = ", self.tf_sess.run(self.linear,feed_dict={self.input_placeholder:rep,self.y:y_vals}) + + # print "\t\ttotal time = ", time.time() - start + diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/S1_Layer.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/S1_Layer.py new file mode 100644 index 0000000..44bed67 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/S1_Layer.py @@ -0,0 +1,273 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +import os +import pandas as pd + +def gabor(X,Y,lamb,sigma,theta,gamma,phase): + + X_hat = X*np.cos(theta) + Y*np.sin(theta) + Y_hat = -X*np.sin(theta) + Y*np.cos(theta) + + arg1 = (0.5/sigma**2)*(X_hat**2 + (gamma**2)*Y_hat**2) + arg2 = (2.0*np.pi/lamb)*X_hat + + return np.exp(-arg1)*np.cos(arg2 + phase) + +class S1_Layer (object): + def __init__(self,node_name,input_shape,freq_channel_params,orientations): #,num_cores=8): + ''' + freq_channel_params is a dictionary of features for each S1 channel + len(freq_channel_params) ==num_bands freq_channel_params[i] = [pixels,sigma,lambda,stride] + orientations is a list of angles in radians for each filter + ''' + #self.tf_sess = tf.Session() + + self.node_name = node_name +# NUM_CORES = num_cores # Choose how many cores to use. +# NUM_CORES = 1 +# self.tf_sess = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=NUM_CORES, +# intra_op_parallelism_threads=NUM_CORES)) + self.tf_sess = tf.Session() +# print "Warning: Using hard-coded number of CPU Cores. This should be changed to auto-configure when TensorFlow has been updated." + + self.input_shape = (None,input_shape[0],input_shape[1],1) + self.input = tf.placeholder(tf.float32,shape=self.input_shape,name="input") + + #phases = np.array([0, np.pi/2]) + phases = np.array([0.0]) # HMAX uses dense tiling in lieu of phases (make this explicit later) + + num_bands = len(freq_channel_params) + num_orientations = len(orientations) + num_phases = len(phases) + self.K = num_orientations*num_phases #number of features per band + + #n_output = num_frequency_channels*num_orientations*num_phases + + n_input = 1 + + self.band_filters = {} + self.filter_params = {} + self.band_output = {} + self.output = self.band_output + self.band_shape = {} + + with tf.name_scope(self.node_name): + for band in range(num_bands): + pixels, sigma, lamb, stride = freq_channel_params[band] + self.band_shape[band] = input_shape + + w_shape = np.array([pixels,pixels,n_input,self.K]) + + W = np.zeros(w_shape,dtype=np.float32) + + #compute w values from parameters + gamma = 0.3 # value taken from Serre et al giant HMAX manuscript from 2005 + X,Y = np.meshgrid(np.arange(pixels),np.arange(pixels)) + X = X - pixels/2 + Y = Y - pixels/2 + + #self.filter_params[band] = freq_channel_params[band] + self.filter_params[band] = {'pixels':pixels,'sigma':sigma,'lambda':lamb, 'stride':stride} #should I add orientations and phases to this? + + for i in range(self.K): + + ori_i = i%num_orientations + phase_i = i/num_orientations + + theta = orientations[ori_i] + phase = phases[phase_i] + + zero_mask = np.zeros([pixels,pixels],dtype='bool') + zero_mask = (X*X + Y*Y > pixels*pixels/4) + + W[:,:,0,i] = gabor(X,Y,lamb,sigma,theta,gamma,phase) + W[:,:,0,i][zero_mask] = 0.0 + W[:,:,0,i] = W[:,:,0,i]/np.sqrt(np.sum(W[:,:,0,i]**2)) + + W = tf.Variable(W,trainable=False,name='W_'+str(band)) + W.initializer.run(session=self.tf_sess) + + self.band_filters[band] = W + + input_norm = tf.reshape(tf.reduce_sum(self.input*self.input,[1,2,3]),[-1,1,1,1]) + normalized_input = tf.div(self.input,tf.sqrt(input_norm)) + self.band_output[band] = tf.nn.conv2d(normalized_input,W,strides=[1,stride,stride,1],padding='SAME') + self.band_shape[band] = tuple([int(x) for x in self.band_output[band].get_shape()[1:3]]) + + + self.num_units = 0 + for b in self.band_shape: + self.num_units += np.prod(self.band_shape[band])*self.K + + def __del__(self): + self.tf_sess.close() + + def __repr__(self): + return "S1_Layer" + + def compute_output(self,X,band): + + return self.tf_sess.run(self.output[band],feed_dict={self.input:X}) + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + + for i, row in unit_table.iterrows(): + + if 'y' in unit_table: + node, band, y, x = row['node'], int(row['band']), int(row['y']), int(row['x']) + compute_list.append(self.output[band][:,y,x,:]) + + elif 'band' in unit_table: + node, band = row['node'], int(row['band']) + compute_list.append(self.output[band]) + + else: + return self.get_all_compute_ops() + + else: + return self.get_all_compute_ops() + + return unit_table, compute_list + + def get_all_compute_ops(self): + + compute_list = [] + unit_table = pd.DataFrame(columns=['node','band']) + for band in self.band_output: + unit_table = unit_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + + compute_list.append(self.output[band]) + + return unit_table, compute_list + +def S1_Layer_test(): + + import matplotlib.pyplot as plt + + fig_dir = 'Figures' + + # these parameters are taken from Serre, et al PNAS for HMAX + freq_channel_params = [ [7,2.8,3.5], + [9,3.6,4.6], + [11,4.5,5.6], + [13,5.4,6.8], + [15,6.3,7.9], + [17,7.3,9.1], + [19,8.2,10.3], + [21,9.2,11.5], + [23,10.2,12.7], + [25,11.3,14.1], + [27,12.3,15.4], + [29,13.4,16.8], + [31,14.6,18.2], + [33,15.8,19.7], + [35,17.0,21.2], + [37,18.2,22.8], + [39,19.5,24.4]] + + orientations = np.arange(4)*np.pi/4 + + input_shape = (128,192) + s1 = S1_Layer(input_shape,freq_channel_params,orientations) + + #plot filters, make sure they are correct + fig, ax = plt.subplots(len(orientations),len(freq_channel_params)) + fig2,ax2 = plt.subplots(len(orientations),len(freq_channel_params)) + for i,theta in enumerate(orientations): + for j,params in enumerate(freq_channel_params): + + #index = j*len(orientations)*2 + i*2 + + fil = s1.tf_sess.run(s1.band_filters[j])[:,:,0,i] + + ax[i,j].imshow(fil,interpolation='nearest',cmap='gray') + ax[i,j].axis('off') + + fil = s1.tf_sess.run(s1.band_filters[j])[:,:,0,i+4] + + ax2[i,j].imshow(fil,interpolation='nearest',cmap='gray') + ax2[i,j].axis('off') + + + from Image_Library import Image_Library + + image_dir = '/Users/michaelbu/Code/HCOMP/SampleImages' + + im_lib = Image_Library(image_dir) + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + import timeit + #print timeit.timeit('result = s1.compute_output(image_data)','from __main__ import s1',number=10) + + def f(): + for band in range(len(freq_channel_params)): + s1.compute_output(image_data,band) + + number = 10 + runs = timeit.Timer(f).repeat(repeat=10,number=number) + print("Average time (s) for output evaluation for ", number, " runs: ", np.mean(runs)/number, '+/-', np.std(runs)/np.sqrt(number)) + + + + print("Image shape = ", image_data.shape) + + + fig_r, ax_r = plt.subplots(len(orientations),len(freq_channel_params)) + fig_r2,ax_r2 = plt.subplots(len(orientations),len(freq_channel_params)) + + for j,params in enumerate(freq_channel_params): + + result = s1.compute_output(image_data,j) + print("result shape = ", result.shape) + + for i,theta in enumerate(orientations): + + #fil = np.zeros([39,39]) + #index = j*len(orientations)*2 + i*2 + #print s1.params[0] + + ax_r[i,j].imshow(result[0,:,:,i],interpolation='nearest',cmap='gray') + ax_r[i,j].axis('off') + + ax_r2[i,j].imshow(result[0,:,:,i+4],interpolation='nearest',cmap='gray') + ax_r2[i,j].axis('off') + + fig_r.savefig(os.path.join(fig_dir,'s1_layer_0.tiff')) + fig_r2.savefig(os.path.join(fig_dir,'s1_layer_1.tiff')) + plt.show() + + #sess.close() + +if __name__=='__main__': + + S1_Layer_test() diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/S_Layer.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/S_Layer.py new file mode 100644 index 0000000..df10f08 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/S_Layer.py @@ -0,0 +1,404 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +from bmtk.simulator.mintnet.Image_Library import Image_Library +import os +import h5py +import pandas as pd + +class S_Layer (object): + def __init__(self, node_name, C_Layer_input, grid_size, pool_size, K, file_name=None, randomize=False): + self.node_name = node_name + + self.input = C_Layer_input.input + + self.tf_sess = C_Layer_input.tf_sess + #self.input_layer = C_Layer_input + # c_output should be a dictionary indexed over bands + + c_output = C_Layer_input.output + self.C_Layer_input = C_Layer_input + + self.K = K + self.input_K = C_Layer_input.K + self.grid_size = grid_size + self.pool_size = pool_size + + self.band_output = {} + #self.band_filters = {} + self.band_shape = C_Layer_input.band_shape + #print self.band_shape + + file_open = False + if file_name==None: + self.train_state=False + new_weights = True + else: + + self.weight_file = file_name + + weight_h5 = h5py.File(self.weight_file, 'a') + file_open = True + + if self.node_name in weight_h5.keys(): + + new_weights=False + weight_data = weight_h5[self.node_name]['weights'] + self.train_state = weight_h5[self.node_name]['train_state'].value + + else: + + new_weights=True + self.train_state = False + weight_h5.create_group(self.node_name) + #weight_h5[self.node_name].create_group('weights') + weight_h5[self.node_name]['train_state']=self.train_state + + + + # perform checks to make sure weight_file is consistent with the Layer parameters + # check input bands + # check grid_size, pool_size, K + + with tf.name_scope(self.node_name): + #for band in c_output.keys(): + + if new_weights: + + # if self.grid_size >= self.band_shape[band][0]: + # size_y = self.band_shape[band][0] + # else: + # size_y = grid_size + # if self.grid_size >= self.band_shape[band][1]: + # size_x = self.band_shape[band][1] + # else: + # size_x = grid_size + + w_shape = np.array([self.grid_size,self.grid_size,self.input_K,self.K]) + + self.w_shape = w_shape + + w_bound = np.sqrt(np.prod(w_shape[1:])) + if randomize: + W = np.random.uniform(low= -1.0/w_bound, high=1.0/w_bound, size=w_shape).astype(np.float32) + else: + W = np.zeros(w_shape).astype(np.float32) + + if file_name!=None: + weight_h5[self.node_name].create_dataset('weights',shape=w_shape,dtype=np.float32) + + else: + # Need to check that c_output.keys() has the same set of keys that weight_dict is expecting + W = weight_data.value + self.w_shape = W.shape + + + + + W = tf.Variable(W,trainable=False,name='W') + W.initializer.run(session=self.tf_sess) + + #self.band_filters[band]= W + self.weights = W + + for band in c_output.keys(): + W_slice = W[:self.band_shape[band][0],:self.band_shape[band][1]] + + input_norm = tf.expand_dims(tf.reduce_sum(c_output[band]*c_output[band],[1,2]),1) #,[-1,1,1,self.input_K]) + input_norm = tf.expand_dims(input_norm,1) + normalized_input = tf.div(c_output[band],tf.maximum(tf.sqrt(input_norm),1e-12)) + self.band_output[band] = tf.nn.conv2d(normalized_input,W_slice,strides=[1,1,1,1],padding='SAME') + + self.output = self.band_output + + self.num_units = 0 + for b in self.band_shape: + self.num_units += np.prod(self.band_shape[b])*self.K + + if file_open: + weight_h5.close() + + def __repr__(self): + return "S_Layer" + + def compute_output(self,X,band): + + return self.tf_sess.run(self.output[band],feed_dict={self.input:X}) + + def find_band_and_coords_for_imprinting_unit(self, imprinting_unit_index): + + cumulative_units = 0 + for band in self.C_Layer_input.output: + + units_in_next_band = int(np.prod(self.C_Layer_input.output[band].get_shape()[1:3])) + + if imprinting_unit_index < cumulative_units + units_in_next_band: + # found the right band! + yb, xb = self.C_Layer_input.band_shape[band] + + band_index = imprinting_unit_index - cumulative_units + + y = band_index/xb + x = band_index%xb + break + else: + cumulative_units += units_in_next_band + + return band, y, x + + + + def get_total_pixels_in_C_Layer_input(self): + + total = 0 + + band_shape = self.C_Layer_input.band_shape + band_ids = band_shape.keys() + band_ids.sort() + + for band in band_ids: + total += np.prod(band_shape[band]) + + return total + + + def get_patch_bounding_box_and_shift(self,band,y,x): + y_lower = y - self.grid_size/2 + y_upper = y_lower + self.grid_size + + x_lower = x - self.grid_size/2 + x_upper = x_lower + self.grid_size + + yb, xb = self.C_Layer_input.band_shape[band] + + # compute shifts in lower bound to deal with overlap with the edges + y_shift_lower = np.max([-y_lower,0]) + x_shift_lower = np.max([-x_lower,0]) + + + y_lower = np.max([y_lower,0]) + y_upper = np.min([y_upper,yb]) + + x_lower = np.max([x_lower,0]) + x_upper = np.min([x_upper,xb]) + + y_shift_upper = y_shift_lower + y_upper - y_lower + x_shift_upper = x_shift_lower + x_upper - x_lower + + return y_lower, y_upper, x_lower, x_upper, y_shift_lower, y_shift_upper, x_shift_lower, x_shift_upper + + def train(self,image_dir,batch_size=100,image_shape=(256,256)): #,save_file='weights.pkl'): + + print("Training") + + im_lib = Image_Library(image_dir,new_size=image_shape) + + new_weights = np.zeros(self.w_shape).astype(np.float32) + + + for k in range(self.K): + + if k%10==0: + print("Imprinting feature ", k) + # how to handle the randomly picked neuron; rejection sampling? + imprinting_unit_index = np.random.randint(self.get_total_pixels_in_C_Layer_input()) + + #print "Imprinting unit index ", imprinting_unit_index + band, y, x = self.find_band_and_coords_for_imprinting_unit(imprinting_unit_index) + #print "Imprinting unit in band ", band, " at ", (y, x) + + im_data = im_lib(1) + + output = self.C_Layer_input.compute_output(im_data,band) + + # grab weights from chosen unit, save them to new_weights + y_lower, y_upper, x_lower, x_upper, y_shift_lower, y_shift_upper, x_shift_lower, x_shift_upper = self.get_patch_bounding_box_and_shift(band,y,x) + + w_patch = output[0,y_lower:y_upper,x_lower:x_upper,:].copy() + + #print "(y_lower, y_upper), (x_lower, x_upper) = ", (y_lower, y_upper), (x_lower, x_upper) + #print "Patch shape = ", w_patch.shape + + patch_size = np.prod(w_patch.shape) + # print "self.w_shape = ", self.w_shape, " patch_size = ", patch_size, " pool_size = ", self.pool_size + # print "band, y, x = ", band,y,x + + pool_size = np.min([self.pool_size,patch_size]) + pool_mask_indices = np.random.choice(np.arange(patch_size), size=pool_size, replace=False) + pool_mask = np.zeros(patch_size,dtype=np.bool) + pool_mask[pool_mask_indices] = True + pool_mask.resize(w_patch.shape) + pool_mask = np.logical_not(pool_mask) # we want a mask for the indices to zero out + + w_patch[pool_mask] = 0.0 + + # will need to enlarge w_patch if the edges got truncated + + new_weights[y_shift_lower:y_shift_upper,x_shift_lower:x_shift_upper,:,k] = w_patch + + + # old code starts here + # num_batches = self.K/batch_size + # if self.K%batch_size!=0: + # num_batches = num_batches+1 + + self.tf_sess.run(self.weights.assign(new_weights)) + print() + print("Saving weights to file in ", self.weight_file) + + weight_h5 = h5py.File(self.weight_file,'a') + #for band in new_weights: + weight_h5[self.node_name]['weights'][...] = new_weights + weight_h5[self.node_name]['train_state'][...]=True + + weight_h5.close() + + # def get_compute_ops(self): + # + # node_table = pd.DataFrame(columns=['node','band']) + # compute_list = [] + # + # for band in self.band_output: + # node_table = node_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + # + # compute_list.append(self.output[band]) + # + # return node_table, compute_list + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + + for i, row in unit_table.iterrows(): + + if 'y' in unit_table: + node, band, y, x = row['node'], int(row['band']), int(row['y']), int(row['x']) + compute_list.append(self.output[band][:,y,x,:]) + + elif 'band' in unit_table: + node, band = row['node'], int(row['band']) + compute_list.append(self.output[band]) + + else: + return self.get_all_compute_ops() + + else: + return self.get_all_compute_ops() + + return unit_table, compute_list + + def get_all_compute_ops(self): + + compute_list = [] + unit_table = pd.DataFrame(columns=['node','band']) + for band in self.band_output: + unit_table = unit_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + + compute_list.append(self.output[band]) + + return unit_table, compute_list + + +def test_S_Layer_ouput(): + + from S1_Layer import S1_Layer + import matplotlib.pyplot as plt + from C_Layer import C_Layer + + fig_dir = 'Figures' + # First we need an S1 Layer + # these parameters are taken from Serre, et al PNAS for HMAX + freq_channel_params = [ [7,2.8,3.5], + [9,3.6,4.6], + [11,4.5,5.6], + [13,5.4,6.8], + [15,6.3,7.9], + [17,7.3,9.1], + [19,8.2,10.3], + [21,9.2,11.5], + [23,10.2,12.7], + [25,11.3,14.1], + [27,12.3,15.4], + [29,13.4,16.8], + [31,14.6,18.2], + [33,15.8,19.7], + [35,17.0,21.2], + [37,18.2,22.8], + [39,19.5,24.4]] + + orientations = np.arange(4)*np.pi/4 + + input_shape = (128,192) + s1 = S1_Layer(input_shape,freq_channel_params,orientations) + + # Now we need to define a C1 Layer + bands = [ [[0,1], 8, 3], + [[2,3], 10, 5], + [[4,5], 12, 7], + [[6,7], 14, 8], + [[8,9], 16, 10], + [[10,11], 18, 12], + [[12,13], 20, 13], + [[14,15,16], 22, 15]] + + c1 = C_Layer(s1,bands) + + grid_size = 3 + pool_size = 10 + K = 10 + + s2 = S_Layer('s2',c1,grid_size,pool_size,K,file_name='S_test_file.h5',randomize=False) + + # Test s2 on an image + image_dir = '/Users/michaelbu/Code/HCOMP/SampleImages' + + im_lib = Image_Library(image_dir,new_size=input_shape) + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + fig,ax = plt.subplots(8,10) + + result = {} + for b in range(len(bands)): + result[b] = s2.compute_output(image_data,b) + + for k in range(K): + ax[b,k].imshow(result[b][0,:,:,k],interpolation='nearest',cmap='gray') + ax[b,k].axis('off') + + fig.savefig(os.path.join(fig_dir,'s2_layer.tiff')) + plt.show() + + s2.train(image_dir,batch_size=10,image_shape=input_shape) #,save_file='test_weights.pkl') + + + + +if __name__=='__main__': + test_S_Layer_ouput() diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/Sb_Layer.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/Sb_Layer.py new file mode 100644 index 0000000..4731323 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/Sb_Layer.py @@ -0,0 +1,242 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +from S_Layer import S_Layer +import pandas as pd + +class Sb_Layer (object): + def __init__(self,node_name,C_Layer_input,grid_size,pool_size,K_per_subband,file_name=None): + '''grid_size is a list, unlike the standard S_Layer, as is file_names''' + + self.node_name = node_name + self.tf_sess = C_Layer_input.tf_sess + + self.input = C_Layer_input.input + + self.num_sublayers = len(grid_size) + self.K = K_per_subband*self.num_sublayers #number of features will be number of sub bands times the K per subband + self.pool_size = pool_size + self.grid_size = grid_size + + c_output = C_Layer_input.output + + self.sublayers = {} + with tf.name_scope(self.node_name): + for i in range(self.num_sublayers): + subnode_name = node_name+'_'+str(i) + self.sublayers[i] = S_Layer(subnode_name,C_Layer_input,grid_size[i],pool_size,K_per_subband,file_name) + + self.band_output = {} + self.band_shape = C_Layer_input.band_shape + + for band in c_output.keys(): + + sub_band_list = [] + for i in range(self.num_sublayers): + sub_band_list += [self.sublayers[i].band_output[band]] + + + + #gather sub_layer outputs and stack them for each band + self.band_output[band] = tf.concat(sub_band_list, 3) + + self.output = self.band_output + + self.num_units = 0 + for b in self.band_shape: + self.num_units += np.prod(self.band_shape[b])*self.K + + def __repr__(self): + return "Sb_Layer" + + def compute_output(self,X,band): + + return self.tf_sess.run(self.output[band],feed_dict={self.input:X}) + + def train(self,image_dir,batch_size=100,image_shape=(256,256)): #,save_file_prefix='weights'): + + for i in range(self.num_sublayers): + #save_file = save_file_prefix + '_'+str(i)+'.pkl' + + #try: + self.sublayers[i].train(image_dir,batch_size,image_shape) #,save_file) + #except Exception as e: + # print i + # raise e + + # def get_compute_ops(self): + # + # node_table = pd.DataFrame(columns=['node','band']) + # compute_list = [] + # + # for band in self.band_output: + # node_table = node_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + # + # compute_list.append(self.output[band]) + # + # return node_table, compute_list + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + + for i, row in unit_table.iterrows(): + + if 'y' in unit_table: + node, band, y, x = row['node'], int(row['band']), int(row['y']), int(row['x']) + compute_list.append(self.output[band][:,y,x,:]) + + elif 'band' in unit_table: + node, band = row['node'], int(row['band']) + compute_list.append(self.output[band]) + + else: + return self.get_all_compute_ops() + + else: + return self.get_all_compute_ops() + + return unit_table, compute_list + + def get_all_compute_ops(self): + + compute_list = [] + unit_table = pd.DataFrame(columns=['node','band']) + for band in self.band_output: + unit_table = unit_table.append(pd.DataFrame([[self.node_name,band]],columns=['node','band']),ignore_index=True) + + compute_list.append(self.output[band]) + + return unit_table, compute_list + + +def test_S2b_Layer(): + + from S1_Layer import S1_Layer + import matplotlib.pyplot as plt + from C_Layer import C_Layer + + fig_dir = 'Figures' + # First we need an S1 Layer + # these parameters are taken from Serre, et al PNAS for HMAX + freq_channel_params = [ [7,2.8,3.5], + [9,3.6,4.6], + [11,4.5,5.6], + [13,5.4,6.8], + [15,6.3,7.9], + [17,7.3,9.1], + [19,8.2,10.3], + [21,9.2,11.5], + [23,10.2,12.7], + [25,11.3,14.1], + [27,12.3,15.4], + [29,13.4,16.8], + [31,14.6,18.2], + [33,15.8,19.7], + [35,17.0,21.2], + [37,18.2,22.8], + [39,19.5,24.4]] + + orientations = np.arange(4)*np.pi/4 + + input_shape = (128,192) + s1 = S1_Layer(input_shape,freq_channel_params,orientations) + + # Now we need to define a C1 Layer + bands = [ [[0,1], 8, 3], + [[2,3], 10, 5], + [[4,5], 12, 7], + [[6,7], 14, 8], + [[8,9], 16, 10], + [[10,11], 18, 12], + [[12,13], 20, 13], + [[14,15,16], 22, 15]] + + c1 = C_Layer(s1,bands) + + print("s1 shape: ", s1.band_shape) + print("c1 shape: ", c1.band_shape) + + grid_size = [6,9,12,15] + pool_size = 10 + K = 10 + + s2b = Sb_Layer(c1,grid_size,pool_size,K) + + print("s2b shape: ", s2b.band_shape) + + c2b_bands = [ [[0,1,2,3,4,5,6,7],40,40]] + + c2b = C_Layer(s2b,c2b_bands) + + + print("c2b shape: ", c2b.band_shape) + #print c2b.band_output.keys() + # Test s2 on an image + from Image_Library import Image_Library + + image_dir = '/Users/michaelbu/Code/HCOMP/SampleImages' + + im_lib = Image_Library(image_dir,new_size=input_shape) + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + fig,ax = plt.subplots(8,10) + + result = {} + for b in range(len(bands)): + result[b] = s2b.compute_output(image_data,b) + + for k in range(K): + ax[b,k].imshow(result[b][0,:,:,k],interpolation='nearest',cmap='gray') + ax[b,k].axis('off') + + fig.savefig(os.path.join(fig_dir,'s2b_layer.tiff')) + + fig,ax = plt.subplots(8,10) + + result = {} + + #only one band for c2b + result[0] = c2b.compute_output(image_data,0) + + for k in range(K): + ax[b,k].imshow(result[0][0,:,:,k],interpolation='nearest',cmap='gray') + ax[b,k].axis('off') + + fig.savefig(os.path.join(fig_dir,'c2b_layer.tiff')) + + + #plt.show() + + s2b.train(image_dir,batch_size=10,image_shape=input_shape,save_file_prefix='test_S2b_weights') + +if __name__=='__main__': + + test_S2b_Layer() diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/ViewTunedLayer.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/ViewTunedLayer.py new file mode 100644 index 0000000..1ae95e1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/ViewTunedLayer.py @@ -0,0 +1,219 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import tensorflow as tf +from bmtk.simulator.mintnet.Image_Library import Image_Library +#from bmtk.mintnet.Stimulus.NaturalScenes import NaturalScenes +import h5py +import pandas as pd + +class ViewTunedLayer (object): + def __init__(self,node_name,K,alt_image_dir='',*inputs,**keyword_args): + + self.node_name=node_name + + file_name = keyword_args.get('file_name',None) + + self.alt_image_dir = alt_image_dir + + if file_name==None: + print("No filename given. Generating new (random) weights for layer ", node_name) + self.train_state = False + new_weights=True + else: + + self.weight_file = file_name + weight_h5 = h5py.File(self.weight_file,'a') + file_open=True + + if self.node_name in weight_h5.keys(): + + #print "Loading weights for layer ", node_name, " from ", self.weight_file + new_weights = False + weight_data = weight_h5[self.node_name]['weights'].value + self.train_state = weight_h5[self.node_name]['train_state'] + + else: + + new_weights=True + self.train_state=False + weight_h5.create_group(self.node_name) + weight_h5[self.node_name]['train_state']=self.train_state + + self.input = inputs[0].input + self.tf_sess = inputs[0].tf_sess + #should add a check that all inputs have the same value of inputs[i].input + + self.K = K + + concat_list = [] + total_K = 0 + + with tf.name_scope(self.node_name): + for i, node in enumerate(inputs): + + output_i = node.output + + for b in output_i: + shape = node.band_shape[b] + + num_K = np.prod(shape)*node.K + total_K = total_K + num_K + #print "shape = ", shape, " total_K = ", num_K + reshape_op = tf.reshape(output_i[b],[-1,num_K]) + concat_list += [reshape_op] + + self.input_unit_vector = tf.concat(concat_list, 1) #shape [batch_size, total_K] + + self.w_shape = (total_K,K) + #weight = np.random.normal(size=self.w_shape).astype(np.float32) + if new_weights: + weight = np.zeros(self.w_shape).astype(np.float32) + weight_h5[self.node_name].create_dataset('weights',shape=weight.shape,dtype=np.float32,compression='gzip',compression_opts=9) + else: + weight = weight_data #ict['ViewTunedWeight'] + assert weight.shape[0]==total_K, "weights from file are not equal to total input size for layer "+self.node_name + + + self.weights = tf.Variable(weight,trainable=False,name='weights') + self.weights.initializer.run(session=self.tf_sess) + + #print self.input_unit_vector.get_shape(), total_K + #should this be a dictionary for consistency? + #print "input unit vector shape = ", self.input_unit_vector.get_shape() + #print "total_K = ", total_K + + input_norm = tf.expand_dims(tf.reduce_sum(self.input_unit_vector*self.input_unit_vector,[1]),1) #,[-1,total_K]) + normalized_input = tf.div(self.input_unit_vector,tf.sqrt(input_norm)) + self.output = tf.matmul(normalized_input,self.weights) #/0.01 + + # try gaussian tuning curve centered on preferred feature + # self.output = tf.exp(-0.5*tf.reduce_sum(self.weights - self.input_unit_vector)) + + self.num_units = K + + if file_open: + weight_h5.close() + + def __repr__(self): + return "ViewTunedLayer" + + def compute_output(self,X): + + return self.tf_sess.run(self.output,feed_dict={self.input:X}) + + def train(self,image_dir,batch_size=10,image_shape=(256,256)): #,save_file=None): + + print("Training") + + im_lib = Image_Library(image_dir,new_size=image_shape) + + #ns_lib = NaturalScenes.with_new_stimulus_from_folder(image_dir, new_size=image_shape, add_channels=True) + + new_weights = np.zeros(self.w_shape,dtype=np.float32) + + num_batches = self.K/batch_size + + for n in range(num_batches): + #for k in range(self.K): + print("\t\tbatch: ", n, " Total features: ", n*batch_size) + print("\t\t\tImporting images for batch") + image_data = im_lib(batch_size,sequential=True) + print("\t\t\tDone") + + print("\t\t\tComputing responses for batch") + batch_output = self.tf_sess.run(self.input_unit_vector,feed_dict={self.input:image_data}) + new_weights[:,n*batch_size:(n+1)*batch_size] = batch_output.T + + print("\t\t\tDone") + + if self.K%batch_size!=0: + last_batch_size = self.K%batch_size + print("\t\tbatch: ", n+1, " Total features: ", (n+1)*batch_size) + print("\t\t\tImporting images for batch") + image_data = im_lib(last_batch_size,sequential=True) + print("\t\t\tDone") + + print("\t\t\tComputing responses for batch") + batch_output = self.tf_sess.run(self.input_unit_vector,feed_dict={self.input:image_data}) + new_weights[:,-last_batch_size:] = batch_output.T + + new_weights = new_weights/np.sqrt(np.maximum(np.sum(new_weights**2,axis=0),1e-12)) + + self.tf_sess.run(self.weights.assign(new_weights)) + + print("") + print("Saving weights to file ", self.weight_file) + weight_h5 = h5py.File(self.weight_file,'a') + weight_h5[self.node_name]['weights'][...] = new_weights + weight_h5[self.node_name]['train_state'][...] = True + weight_h5.close() + + def get_compute_ops(self,unit_table=None): + + compute_list = [] + + if unit_table is not None: + for i, row in unit_table.iterrows(): + compute_list = [self.output] + + else: + unit_table = pd.DataFrame([[self.node_name]], columns=['node']) + compute_list = [self.output] + + return unit_table, compute_list + + + +def test_ViewTunedLayer(): + + from hmouse_test import hmouse + + image_dir = '/Users/michaelbu/Code/H-MOUSE/ILSVRC2015/Data/DET/test' + image_shape = (256,256) + weight_file_prefix = 'S2b_weights_500' + + print("Configuring HMAX network") + hm = hmouse('config/nodes.csv','config/node_types.csv') + + for node in hm.nodes: + print(node, " num_units = ", hm.nodes[node].num_units) + + s4 = ViewTunedLayer(10,hm.nodes['c1'],hm.nodes['c2'],hm.nodes['c2b']) #,hm.nodes['c3']) + + im_lib = Image_Library(image_dir,new_size=image_shape) + image_data = im_lib(1) + + print(s4.tf_sess.run(tf.shape(s4.input_unit_vector),feed_dict={s4.input:image_data})) + print(s4.tf_sess.run(tf.shape(s4.weights))) + + print(s4.compute_output(image_data).shape) + + #s4.train(image_dir,batch_size=10,image_shape=image_shape,save_file='s4_test_weights.pkl') + + + + +if __name__=='__main__': + + test_ViewTunedLayer() diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/__init__.py new file mode 100644 index 0000000..44200f2 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/__init__.py @@ -0,0 +1,28 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import S_Layer +import S1_Layer +import Sb_Layer +import C_Layer +import ViewTunedLayer +import hmax diff --git a/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/hmax.py b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/hmax.py new file mode 100644 index 0000000..c770ec6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/mintnet/hmax/hmax.py @@ -0,0 +1,432 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import sys +import json +from S1_Layer import S1_Layer +from C_Layer import C_Layer +from S_Layer import S_Layer +from Sb_Layer import Sb_Layer +from ViewTunedLayer import ViewTunedLayer +from Readout_Layer import Readout_Layer +import tensorflow as tf +import os +import h5py +import pandas as pd + +from bmtk.simulator.mintnet.Image_Library import Image_Library +import matplotlib.pyplot as plt + +class hmax (object): + + def __init__(self, configuration, name=None): #,num_cores=8): + self.name = name + + if os.path.isdir(configuration): + # If configuration is a directory look for a config-file inside it. + self.config_file = os.path.join(configuration, 'config_' + configuration + '.json') + if self.name is None: + self.name = os.path.basename(configuration) + + elif os.path.isfile(configuration): + # If configuration is a json file + if self.name is None: + raise Exception("A name is required for configuration parameters") + self.config_file = configuration + + with open(self.config_file,'r') as f: + self.config_data = json.loads(f.read()) + + self.config_dir = os.path.dirname(os.path.abspath(configuration)) + self.train_state_file = self.__get_config_file(self.config_data['train_state_file']) + self.image_dir = self.__get_config_file(self.config_data['image_dir']) + + # Find, and create if necessary, the output directory + if 'output_dir' in self.config_data: + self.output_dir = self.__get_config_file(self.config_data['output_dir']) + else: + self.output_dir = os.path.join(self.config_dir, 'output') + + if not os.path.exists(self.output_dir): + os.makedirs(self.output_dir) + + with open(self.train_state_file, 'r') as f: + self.train_state = json.loads(f.read()) + + if not os.path.exists(self.output_dir): + os.makedirs(self.output_dir) + + # get the nodes + models_file = self.__get_config_file(self.config_data['network']['node_types']) + nodes_file = self.__get_config_file(self.config_data['network']['nodes']) + self.__nodes_table = self.__build_nodes_table(nodes_file, models_file, self.config_data) + + # Read the connections + self.nodes = {} + self.train_order = [] + + edges_file = self.__get_config_file(self.config_data['network']['edges']) + for (node_name, input_node, node_dict) in self.__get_edges(edges_file, self.config_data): + model_class = self.__nodes_table[node_name]['model_id'] + + print("Constructing node: ", node_name) + if model_class=='S1_Layer': + node_type = S1_Layer + freq_channel_params = node_dict['freq_channel_params'] + input_shape = node_dict['input_shape'] + self.input_shape = input_shape + orientations = node_dict['orientations'] + + self.nodes[node_name] = node_type(node_name,input_shape,freq_channel_params,orientations) #,num_cores=num_cores) + #writer = tf.train.SummaryWriter('tmp/hmax', self.nodes['s1'].tf_sess.graph_def) + #merged = tf.merge_all_summaries() + + #writer.add_summary(self.nodes[node_name].tf_sess.run(merged),0) + + elif model_class=='C_Layer': + node_type = C_Layer + bands = node_dict['bands'] + + + self.nodes[node_name] = node_type(node_name,self.nodes[input_node],bands) + #writer = tf.train.SummaryWriter('tmp/hmax', self.nodes['s1'].tf_sess.graph_def) + + elif model_class=='S_Layer': + node_type = S_Layer + K = node_dict['K'] + weight_file = self.__get_config_file(node_dict['weight_file']) if 'weight_file' in node_dict else None + pool_size = node_dict['pool_size'] + grid_size = node_dict['grid_size'] + self.train_order += [node_name] + + self.nodes[node_name] = node_type(node_name, self.nodes[input_node], grid_size, pool_size,K, + file_name=weight_file) + + elif model_class=='Sb_Layer': + node_type = Sb_Layer + K = node_dict['K'] + weight_file = self.__get_config_file(node_dict['weight_file']) if 'weight_file' in node_dict else None + pool_size = node_dict['pool_size'] + grid_size = node_dict['grid_size'] + + self.train_order += [node_name] + + self.nodes[node_name] = node_type(node_name,self.nodes[input_node],grid_size,pool_size,K,file_name=weight_file) + + elif model_class=='ViewTunedLayer': + node_type = ViewTunedLayer + K = node_dict['K'] + input_nodes = node_dict['inputs'] + input_nodes = [self.nodes[node] for node in input_nodes] + weight_file = self.__get_config_file(node_dict['weight_file']) if 'weight_file' in node_dict else None + alt_image_dir = node_dict['alt_image_dir'] + + self.train_order += [node_name] + + #print "alt_image_dir=",alt_image_dir + self.nodes[node_name] = node_type(node_name,K,alt_image_dir,*input_nodes,file_name=weight_file) + + elif model_class=='Readout_Layer': + node_type = Readout_Layer + K = node_dict['K'] + input_nodes = self.nodes[input_node] + weight_file = os.path.join(config_dir,node_dict['weight_file']) + if weight_file=='': weight_file=None + alt_image_dir = node_dict['alt_image_dir'] + lam = node_dict['lam'] + + self.train_order += [node_name] + + self.nodes[node_name] = node_type(node_name,self.nodes[input_node],K,lam,alt_image_dir,file_name=weight_file) + + else: + raise Exception("Unknown model class {}".format(model_class)) + + # print "Done" + # print + + #nfhandle.close() + + + + self.node_names = self.nodes.keys() + + self.input_shape = (self.nodes['s1'].input_shape[1], self.nodes['s1'].input_shape[2]) + + print("Done") + #writer = tf.train.SummaryWriter('tmp/hmax', self.nodes['s1'].tf_sess.graph_def) + + + def __build_nodes_table(self, nodes_csv, models_csv, config): + models_df = pd.read_csv(models_csv, sep=' ') + nodes_df = pd.read_csv(nodes_csv, sep=' ') + nodes_df.set_index('id') + nodes_full = pd.merge(left=nodes_df, right=models_df, on='model_id') + nodes_table = {r['id']: {'model_id': r['model_id'], 'python_object': r['python_object']} + for _, r in nodes_full.iterrows() } + + return nodes_table + + def __get_edges(self, edges_csv, config): + def parse_query(query_str): + if query_str == '*' or query_str == 'None': + return None + elif query_str.startswith('id=='): + return query_str[5:-1] + else: + raise Exception('Unknown query string {}'.format(query_str)) + + # location where config files are located + params_dir = self.__get_config_file(config.get('node_config_dir', '')) + + edges_df = pd.read_csv(edges_csv, sep=' ') + edges = [] + for _, row in edges_df.iterrows(): + # find source and target + source = parse_query(row['source_query']) + target = parse_query(row['target_query']) + + # load the parameters from the file + params_file = os.path.join(params_dir, row['params_file']) + params = json.load(open(params_file, 'r')) + + # Add to list + edges.append((target, source, params)) + + # TODO: check list and reorder to make sure the layers are in a valid order + + # return the edges. Should we use a generator? + return edges + + def __get_config_file(self, fpath): + if os.path.isabs(fpath): + return fpath + else: + return os.path.join(self.config_dir, fpath) + + + + @classmethod + def load(cls, config_dir, name=None): + return cls(config_dir, name) + + def train(self): #,alt_image_dict=None): + + for node in self.train_order: + if not self.train_state.get(node, False): + print("Training Node: ", node) + + if hasattr(self.nodes[node],'alt_image_dir') and self.nodes[node].alt_image_dir!='': + print("\tUsing alternate image directory: ", self.nodes[node].alt_image_dir) # alt_image_dict[node] + self.nodes[node].train(self.nodes[node].alt_image_dir,batch_size=self.config_data['batch_size'],image_shape=self.input_shape) + self.train_state[node]=True + else: + print("\tUsing default image directory: ", self.image_dir) + self.nodes[node].train(self.image_dir,batch_size=self.config_data['batch_size'],image_shape=self.input_shape) + self.train_state[node]=True + + + # if node not in alt_image_dict: + # print "\tUsing default image directory: ", image_dir + # self.nodes[node].train(image_dir,batch_size=self.config_data['batch_size'],image_shape=self.input_shape) + # self.train_state[node]=True + # else: + # print "\tUsing alternate image directory: ", alt_image_dict[node] + # self.nodes[node].train(alt_image_dict[node],batch_size=self.config_data['batch_size'],image_shape=self.input_shape) + # self.train_state[node]=True + + print("Done") + + with open(self.config_data['train_state_file'], 'w') as f: + f.write(json.dumps(self.train_state)) + + + def run_stimulus(self,stimulus, node_table=None, output_file='output'): + '''stimulus is an instance of one of the mintnet.Stimulus objects, i.e. LocallySparseNoise''' + + if output_file[-3:]!=".ic": + output_file = output_file+".ic" # add *.ic suffix if not already there + + stim_template = stimulus.get_image_input(new_size=self.input_shape, add_channels=True) + + print("Creating new output file: ", output_file, " (and removing any previous one)") + if os.path.exists(output_file): + os.remove(output_file) + output_h5 = h5py.File(output_file,'w') + + T, y, x, K = stim_template.shape + all_nodes = self.nodes.keys() + + if node_table is None: # just compute everything and return it all; good luck! + + new_node_table = pd.DataFrame(columns=['node','band']) + + compute_list = [] + for node in all_nodes: + + add_to_node_table, new_compute_list = self.nodes[node].get_compute_ops() + new_node_table = new_node_table.append(add_to_node_table,ignore_index=True) + compute_list += new_compute_list + else: + compute_list = [] + + new_node_table = node_table.sort_values('node') + new_node_table = new_node_table.reindex(np.arange(len(new_node_table))) + + for node in all_nodes: + unit_table = new_node_table[node_table['node']==node] + if (new_node_table['node']==node).any(): + _, new_compute_list = self.nodes[node].get_compute_ops(unit_table=unit_table) + + compute_list += new_compute_list + + + # create datasets in hdf5 file from node_table, with data indexed by table index + for i, row in new_node_table.iterrows(): + + output_shape = tuple([T] + [ int(x) for x in compute_list[i].get_shape()[1:]]) + output_h5.create_dataset(str(i), output_shape, dtype=np.float32) + + + + batch_size = self.config_data['batch_size'] + num_batches = T/batch_size + if T%self.config_data['batch_size']!=0: + num_batches += 1 + + for i in range(num_batches): + sys.stdout.write( '\r{0:.02f}'.format(float(i)*100/num_batches)+'% done') + sys.stdout.flush() + output_list = self.nodes[all_nodes[0]].tf_sess.run(compute_list,feed_dict={self.nodes[all_nodes[0]].input: stim_template[i*batch_size:(i+1)*batch_size]}) + + for io, output in enumerate(output_list): + # dataset_string = node_table['node'].loc[io] + "/" + str(int(node_table['band'].loc[io])) + # output_h5[dataset_string][i*batch_size:(i+1)*batch_size] = output + + output_h5[str(io)][i*batch_size:(i+1)*batch_size] = output + sys.stdout.write( '\r{0:.02f}'.format(float(100))+'% done') + sys.stdout.flush() + + output_h5['stim_template'] = stimulus.stim_template + output_h5.close() + new_node_table.to_hdf(output_file,'node_table') + if hasattr(stimulus,'label_dataframe') and stimulus.label_dataframe is not None: + stimulus.label_dataframe.to_hdf(output_file,'labels') + stimulus.stim_table.to_hdf(output_file,'stim_table') + + + def get_exemplar_node_table(self): + + node_table = pd.DataFrame(columns=['node','band','y','x']) + for node in self.nodes: + node_output = self.nodes[node].output + if hasattr(self.nodes[node],'band_shape'): + for band in node_output: + y,x = [int(x) for x in node_output[band].get_shape()[1:3]] + y /= 2 + x /= 2 + new_row = pd.DataFrame([[self.nodes[node].node_name, band, y, x]], columns=['node','band','y','x']) + node_table = node_table.append(new_row, ignore_index=True) + else: + new_row = pd.DataFrame([[self.nodes[node].node_name]], columns=['node']) + node_table = node_table.append(new_row, ignore_index=True) + + return node_table + + + def generate_output(self): + try: + im_lib = Image_Library(self.image_dir,new_size=self.input_shape) + except OSError as e: + print('''A repository of images (such as a collection from ImageNet - http://www.image-net.org) is required for input. + An example would be too large to include in the isee_engine itself. + Set the path for this image repository in hmax/config_hmax.json''') + raise e + + image_data = im_lib(1) + + fig, ax = plt.subplots(1) + ax.imshow(image_data[0,:,:,0],cmap='gray') + + fig.savefig(os.path.join(self.output_dir,'input_image')) + plt.close(fig) + + nodes = self.nodes + + for node_to_plot in nodes: + print("Generating output for node ", node_to_plot) + node_output_dir = os.path.join(self.output_dir,node_to_plot) + + if not os.path.exists(node_output_dir): + os.makedirs(node_output_dir) + + if type(self.nodes[node_to_plot])==ViewTunedLayer: + print("ViewTunedLayer") + self.nodes[node_to_plot].compute_output(image_data) + continue + + if type(self.nodes[node_to_plot])==Readout_Layer: + print("Readout_Layer") + self.nodes[node_to_plot].compute_output(image_data) + continue + + num_bands = len(nodes[node_to_plot].output) + + if type(self.nodes[node_to_plot])==S1_Layer or node_to_plot=='c1': + #print "Yes, this is an S1_Layer" + num_filters_to_plot = 4 + fig, ax = plt.subplots(num_filters_to_plot,num_bands,figsize=(20,8)) + #fig2,ax2 = plt.subplots(num_filters_to_plot,num_bands,figsize=(20,8)) + else: + num_filters_to_plot = 8 + fig, ax = plt.subplots(num_filters_to_plot,num_bands,figsize=(20,8)) + + for band in range(num_bands): + result = nodes[node_to_plot].compute_output(image_data,band) + #print result[band].shape + n, y,x,K = result.shape + + for k in range(num_filters_to_plot): + + if num_bands!=1: + ax[k,band].imshow(result[0,:,:,k],interpolation='nearest',cmap='gray') + ax[k,band].axis('off') + else: + ax[k].imshow(result[0,:,:,k],interpolation='nearest',cmap='gray') + ax[k].axis('off') + + # if type(self.nodes[node_to_plot])==S1_Layer: + # for k in range(num_filters_to_plot): + + # ki = 4+k + # ax2[k,band].imshow(result[0,:,:,ki],interpolation='nearest',cmap='gray') + # ax2[k,band].axis('off') + + if type(self.nodes[node_to_plot])==S1_Layer: + fig.savefig(os.path.join(node_output_dir,'output_phase0.pdf')) + #fig2.savefig(os.path.join(node_output_dir,'output_phase1.pdf')) + #plt.close(fig2) + else: + fig.savefig(os.path.join(node_output_dir,'output.pdf')) + + plt.close(fig) diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/__init__.py new file mode 100644 index 0000000..2ad957d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/__init__.py @@ -0,0 +1,26 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import default_setters +from .config import Config +from .pointnetwork import PointNetwork +from .pointsimulator import PointSimulator \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/config.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/config.py new file mode 100644 index 0000000..a6644d5 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/config.py @@ -0,0 +1,48 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json + +from bmtk.simulator.core.config import ConfigDict +from bmtk.simulator.pointnet.io_tools import io + + +# TODO: Implement pointnet validator and create json schema for pointnet +def from_json(config_file, validate=False): + conf_dict = ConfigDict.from_json(config_file) + conf_dict.io = io + return conf_dict + +def from_dict(config_file, validate=False): + conf_dict = ConfigDict.from_dict(config_file) + conf_dict.io = io + return conf_dict + +class Config(ConfigDict): + def __init__(self, dict_obj): + super(Config, self).__init__(dict_obj) + self._io = io + + @property + def io(self): + return io \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/default_setters/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/default_setters/__init__.py new file mode 100644 index 0000000..b07cc2d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/default_setters/__init__.py @@ -0,0 +1,2 @@ +from . import synaptic_weights +from . import synapse_models \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/default_setters/synapse_models.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/default_setters/synapse_models.py new file mode 100644 index 0000000..8e94328 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/default_setters/synapse_models.py @@ -0,0 +1,16 @@ +from bmtk.simulator.pointnet.pyfunction_cache import add_synapse_model + + +def static_synapse(edge): + model_params = { + 'model': 'static_synapse', + 'delay': edge.delay, + 'weight': edge.syn_weight(None, None) + } + + model_params.update(edge.dynamics_params) + return model_params + + +add_synapse_model(static_synapse, 'default', overwrite=False) +add_synapse_model(static_synapse, overwrite=False) \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/default_setters/synaptic_weights.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/default_setters/synaptic_weights.py new file mode 100644 index 0000000..4c66ae1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/default_setters/synaptic_weights.py @@ -0,0 +1,8 @@ +from bmtk.simulator.pointnet.pyfunction_cache import add_weight_function + + +def default_weight_fnc(edge_props, source_node, target_node): + return edge_props['syn_weight']*edge_props.nsyns + + +add_weight_function(default_weight_fnc, 'default_weight_fnc', overwrite=False) diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/io_tools.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/io_tools.py new file mode 100644 index 0000000..b5ea9ea --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/io_tools.py @@ -0,0 +1,122 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +""" +Functions for logging, writing and reading from file. + +""" +import nest + +from bmtk.simulator.core.io_tools import IOUtils + +# Want users to be able to use NEST whether or not it is compiled in parallel mode or not, which means checking if +# the method nest.SyncPRocesses (aka MPI Barrier) exists. If it doesn't try getting barrier from mpi4py +rank = nest.Rank() +n_nodes = nest.NumProcesses() +try: + barrier = nest.SyncProcesses +except AttributeError as exc: + try: + from mpi4py import MPI + barrier = MPI.COMM_WORLD.Barrier + except: + # Barrier is just an empty function, no problem if running on one core. + barrier = lambda: None + + +class NestIOUtils(IOUtils): + def __init__(self): + super(NestIOUtils, self).__init__() + self.mpi_rank = rank + self.mpi_size = n_nodes + + def barrier(self): + barrier() + + def quiet_simulator(self): + nest.set_verbosity('M_QUIET') + + def setup_output_dir(self, config_dir, log_file, overwrite=True): + super(NestIOUtils, self).setup_output_dir(config_dir, log_file, overwrite=True) + if n_nodes > 1 and rank == 0: + io.log_info('Running NEST with MPI ({} cores)'.format(n_nodes)) + + +io = NestIOUtils() + + +''' +log_format = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s') +pointnet_logger = logging.getLogger() +pointnet_logger.setLevel(logging.DEBUG) + +console_handler = logging.StreamHandler(sys.stdout) +console_handler.setFormatter(log_format) +pointnet_logger.addHandler(console_handler) + + +def collect_gdf_files(gdf_dir, output_file, nest_id_map, overwrite=False): + + if n_nodes > 0: + # Wait until all nodes are finished + barrier() + + if rank != 0: + return + + log("Saving spikes to file...") + spikes_out = output_file + if os.path.exists(spikes_out) and not overwrite: + return + + gdf_files_globs = '{}/*.gdf'.format(gdf_dir) + gdf_files = glob.glob(gdf_files_globs) + with open(spikes_out, 'w') as spikes_file: + csv_writer = csv.writer(spikes_file, delimiter=' ') + for gdffile in gdf_files: + spikes_df = pd.read_csv(gdffile, names=['gid', 'time', 'nan'], sep='\t') + for _, row in spikes_df.iterrows(): + csv_writer.writerow([row['time'], nest_id_map[int(row['gid'])]]) + os.remove(gdffile) + log("done.") + + +def setup_output_dir(config): + if rank == 0: + try: + output_dir = config['output']['output_dir'] + if os.path.exists(output_dir): + shutil.rmtree(output_dir) + os.makedirs(output_dir) + + if 'log_file' in config['output']: + file_logger = logging.FileHandler(config['output']['log_file']) + file_logger.setFormatter(log_format) + pointnet_logger.addHandler(file_logger) + log('Created a log file') + + except Exception as exc: + print(exc) + + barrier() +''' + diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/modules/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/modules/__init__.py new file mode 100644 index 0000000..962ea78 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/modules/__init__.py @@ -0,0 +1,2 @@ +from .record_spikes import SpikesMod +from .multimeter_reporter import MultimeterMod \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/modules/multimeter_reporter.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/modules/multimeter_reporter.py new file mode 100644 index 0000000..12d86ac --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/modules/multimeter_reporter.py @@ -0,0 +1,110 @@ +import os +import glob +import pandas as pd +from bmtk.utils.io.cell_vars import CellVarRecorder +from bmtk.simulator.pointnet.io_tools import io + +import nest + + +try: + MPI_RANK = nest.Rank() + N_HOSTS = nest.NumProcesses() + +except Exception as e: + MPI_RANK = 0 + N_HOSTS = 1 + + +class MultimeterMod(object): + def __init__(self, tmp_dir, file_name, variable_name, cells, tstart=None, tstop=None, interval=None, to_h5=True, + delete_dat=True, **opt_params): + """For recording neuron properties using a NEST multimeter object + + :param tmp_dir: ouput directory + :param file_name: Name of (SONATA hdf5) file that will be saved to + :param variable_name: A list of the variable(s) being recorded. Must be valid according to the cells + :param cells: A node-set or list of gids to record from + :param tstart: Start time of the recording (if None will default to sim.tstart) + :param tstop: Stop time of recording (if None will default to sim.tstop) + :param interval: Recording time step (if None will default to sim.dt) + :param to_h5: True to save to sonata .h5 format (default: True) + :param delete_dat: True to delete the .dat files created by NEST (default True) + :param opt_params: + """ + + self._output_dir = tmp_dir + self._file_name = file_name if os.path.isabs(file_name) else os.path.join(self._output_dir, file_name) + self._variable_name = variable_name + self._node_set = cells + self._tstart = tstart + self._tstop = tstop + self._interval = interval + self._to_h5 = to_h5 + self._delete_dat = delete_dat + + self._gids = None + self._nest_ids = None + self._multimeter = None + + self._min_delay = 1.0 # Required for calculating steps recorded + + self.__output_label = os.path.join(self._output_dir, '__bmtk_nest_{}'.format(os.path.basename(self._file_name))) + self._var_recorder = CellVarRecorder(self._file_name, self._output_dir, self._variable_name, buffer_data=False) + + def initialize(self, sim): + self._gids = list(sim.net.get_node_set(self._node_set).gids()) + self._nest_ids = [sim.net._gid2nestid[gid] for gid in self._gids] + + self._tstart = self._tstart or sim.tstart + self._tstop = self._tstop or sim.tstop + self._interval = self._interval or sim.dt + self._multimeter = nest.Create('multimeter', + params={'interval': self._interval, 'start': self._tstart, 'stop': self._tstop, + 'to_file': True, 'to_memory': False, + 'withtime': True, + 'record_from': self._variable_name, + 'label': self.__output_label}) + + nest.Connect(self._multimeter, self._nest_ids) + + def finalize(self, sim): + io.barrier() # Makes sure all nodes finish, but not sure if actually required by nest + + # min_delay needs to be fetched after simulation otherwise the value will be off. There also seems to be some + # MPI barrier inside GetKernelStatus + self._min_delay = nest.GetKernelStatus('min_delay') + # print self._min_delay + if self._to_h5 and MPI_RANK == 0: + for gid in self._gids: + self._var_recorder.add_cell(gid, sec_list=[0], seg_list=[0.0]) + + # Initialize hdf5 file including preallocated data block of recorded variables + # Unfortantely with NEST the final time-step recorded can't be calculated in advanced, and even with the + # same min/max_delay can be different. We need to read the output-file to get n_steps + def get_var_recorder(node_recording_df): + if not self._var_recorder.is_initialized: + self._var_recorder.tstart = node_recording_df['time'].min() + self._var_recorder.tstop = node_recording_df['time'].max() + self._var_recorder.dt = self._interval + self._var_recorder.initialize(len(node_recording_df)) + + return self._var_recorder + + gid_map = sim.net._nestid2gid + for nest_file in glob.glob('{}*'.format(self.__output_label)): + report_df = pd.read_csv(nest_file, index_col=False, names=['nest_id', 'time']+self._variable_name, + sep='\t') + for grp_id, grp_df in report_df.groupby(by='nest_id'): + gid = gid_map[grp_id] + vr = get_var_recorder(grp_df) + for var_name in self._variable_name: + vr.record_cell_block(gid, var_name, grp_df[var_name]) + + if self._delete_dat: + # remove csv file created by nest + os.remove(nest_file) + + self._var_recorder.close() + + io.barrier() diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/modules/record_spikes.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/modules/record_spikes.py new file mode 100644 index 0000000..9791fdc --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/modules/record_spikes.py @@ -0,0 +1,90 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import glob +from bmtk.utils.io.spike_trains import SpikeTrainWriter +from bmtk.simulator.pointnet.io_tools import io + +import nest + + +MPI_RANK = nest.Rank() +N_HOSTS = nest.NumProcesses() + + +class SpikesMod(object): + """Module use for saving spikes + + """ + + def __init__(self, tmp_dir, spikes_file_csv=None, spikes_file=None, spikes_file_nwb=None, spikes_sort_order=None): + def _get_path(file_name): + # Unless file-name is an absolute path then it should be placed in the $OUTPUT_DIR + if file_name is None: + return None + return file_name if os.path.isabs(file_name) else os.path.join(tmp_dir, file_name) + + self._csv_fname = _get_path(spikes_file_csv) + self._h5_fname = _get_path(spikes_file) + self._nwb_fname = _get_path(spikes_file_nwb) + + self._tmp_dir = tmp_dir + self._tmp_file_base = 'tmp_spike_times' + self._spike_labels = os.path.join(self._tmp_dir, self._tmp_file_base) + + self._spike_writer = SpikeTrainWriter(tmp_dir=tmp_dir, mpi_rank=MPI_RANK, mpi_size=N_HOSTS) + self._spike_writer.delimiter = '\t' + self._spike_writer.gid_col = 0 + self._spike_writer.time_col = 1 + self._sort_order = spikes_sort_order + + self._spike_detector = None + + def initialize(self, sim): + self._spike_detector = nest.Create("spike_detector", 1, {'label': self._spike_labels, 'withtime': True, + 'withgid': True, 'to_file': True}) + + for pop_name, pop in sim._graph._nestid2nodeid_map.items(): + nest.Connect(list(pop.keys()), self._spike_detector) + + def finalize(self, sim): + if MPI_RANK == 0: + for gdf_file in glob.glob(self._spike_labels + '*.gdf'): + self._spike_writer.add_spikes_file(gdf_file) + io.barrier() + + gid_map = sim._graph._nestid2gid + + if self._csv_fname is not None: + self._spike_writer.to_csv(self._csv_fname, sort_order=self._sort_order, gid_map=gid_map) + io.barrier() + + if self._h5_fname is not None: + self._spike_writer.to_hdf5(self._h5_fname, sort_order=self._sort_order, gid_map=gid_map) + io.barrier() + + if self._nwb_fname is not None: + self._spike_writer.to_nwb(self._nwb_fname, sort_order=self._sort_order, gid_map=gid_map) + io.barrier() + + self._spike_writer.close() diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/pointnetwork.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/pointnetwork.py new file mode 100644 index 0000000..0cc781f --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/pointnetwork.py @@ -0,0 +1,176 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import functools +import nest + +from bmtk.simulator.core.simulator_network import SimNetwork +from bmtk.simulator.pointnet.sonata_adaptors import PointNodeAdaptor, PointEdgeAdaptor +from bmtk.simulator.pointnet import pyfunction_cache +from bmtk.simulator.pointnet.io_tools import io + + +class PointNetwork(SimNetwork): + def __init__(self, **properties): + super(PointNetwork, self).__init__(**properties) + self._io = io + + self.__weight_functions = {} + self._params_cache = {} + + self._virtual_ids_map = {} + + self._batch_nodes = True + + self._nest_id_map = {} + self._nestid2nodeid_map = {} + + self._nestid2gid = {} + + self._nodes_table = {} + self._gid2nestid = {} + + @property + def py_function_caches(self): + return pyfunction_cache + + def __get_params(self, node_params): + if node_params.with_dynamics_params: + # TODO: use property, not name + return node_params['dynamics_params'] + + params_file = node_params[self._params_column] + # params_file = self._MT.params_column(node_params) #node_params['dynamics_params'] + if params_file in self._params_cache: + return self._params_cache[params_file] + else: + params_dir = self.get_component('models_dir') + params_path = os.path.join(params_dir, params_file) + params_dict = json.load(open(params_path, 'r')) + self._params_cache[params_file] = params_dict + return params_dict + + def _register_adaptors(self): + super(PointNetwork, self)._register_adaptors() + self._node_adaptors['sonata'] = PointNodeAdaptor + self._edge_adaptors['sonata'] = PointEdgeAdaptor + + # TODO: reimplement with py_modules like in bionet + def add_weight_function(self, function, name=None): + fnc_name = name if name is not None else function.__name__ + self.__weight_functions[fnc_name] = functools.partial(function) + + def set_default_weight_function(self, function): + self.add_weight_function(function, 'default_weight_fnc', overwrite=True) + + def get_weight_function(self, name): + return self.__weight_functions[name] + + def build_nodes(self): + for node_pop in self.node_populations: + nid2nest_map = {} + nest2nid_map = {} + if node_pop.internal_nodes_only: + for node in node_pop.get_nodes(): + node.build() + for nid, gid, nest_id in zip(node.node_ids, node.gids, node.nest_ids): + self._nestid2gid[nest_id] = gid + self._gid2nestid[gid] = nest_id + nid2nest_map[nid] = nest_id + nest2nid_map[nest_id] = nid + + elif node_pop.mixed_nodes: + for node in node_pop.get_nodes(): + if node.model_type != 'virtual': + node.build() + for nid, gid, nest_id in zip(node.node_ids, node.gids, node.nest_ids): + self._nestid2gid[nest_id] = gid + self._gid2nestid[gid] = nest_id + nid2nest_map[nid] = nest_id + nest2nid_map[nest_id] = nid + + self._nest_id_map[node_pop.name] = nid2nest_map + self._nestid2nodeid_map[node_pop.name] = nest2nid_map + + def build_recurrent_edges(self): + recurrent_edge_pops = [ep for ep in self._edge_populations if not ep.virtual_connections] + if not recurrent_edge_pops: + return + + for edge_pop in recurrent_edge_pops: + src_nest_ids = self._nest_id_map[edge_pop.source_nodes] + trg_nest_ids = self._nest_id_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + nest_srcs = [src_nest_ids[nid] for nid in edge.source_node_ids] + nest_trgs = [trg_nest_ids[nid] for nid in edge.target_node_ids] + nest.Connect(nest_srcs, nest_trgs, conn_spec='one_to_one', syn_spec=edge.nest_params) + + def find_edges(self, source_nodes=None, target_nodes=None): + # TODO: Move to parent + selected_edges = self._edge_populations[:] + + if source_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.source_nodes == source_nodes] + + if target_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.target_nodes == target_nodes] + + return selected_edges + + def add_spike_trains(self, spike_trains, node_set): + # Build the virtual nodes + src_nodes = [node_pop for node_pop in self.node_populations if node_pop.name in node_set.population_names()] + for node_pop in src_nodes: + if node_pop.name in self._virtual_ids_map: + continue + + virt_node_map = {} + if node_pop.virtual_nodes_only: + for node in node_pop.get_nodes(): + nest_ids = nest.Create('spike_generator', node.n_nodes, {}) + for node_id, nest_id in zip(node.node_ids, nest_ids): + virt_node_map[node_id] = nest_id + nest.SetStatus([nest_id], {'spike_times': spike_trains.get_spikes(node_id)}) + + elif node_pop.mixed_nodes: + for node in node_pop.get_nodes(): + if node.model_type != 'virtual': + continue + + nest_ids = nest.Create('spike_generator', node.n_nodes, {}) + for node_id, nest_id in zip(node.node_ids, nest_ids): + virt_node_map[node_id] = nest_id + nest.SetStatus([nest_id], {'spike_times': spike_trains.get_spikes(node_id)}) + + self._virtual_ids_map[node_pop.name] = virt_node_map + + # Create virtual synaptic connections + for source_reader in src_nodes: + for edge_pop in self.find_edges(source_nodes=source_reader.name): + src_nest_ids = self._virtual_ids_map[edge_pop.source_nodes] + trg_nest_ids = self._nest_id_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + nest_srcs = [src_nest_ids[nid] for nid in edge.source_node_ids] + nest_trgs = [trg_nest_ids[nid] for nid in edge.target_node_ids] + nest.Connect(nest_srcs, nest_trgs, conn_spec='one_to_one', syn_spec=edge.nest_params) diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/pointsimulator.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/pointsimulator.py new file mode 100644 index 0000000..a434da6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/pointsimulator.py @@ -0,0 +1,266 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import glob +import nest +from six import string_types +from six import moves + +from bmtk.simulator.core.simulator import Simulator +from bmtk.simulator.pointnet.config import Config +#import bmtk.simulator.pointnet.config as cfg +from bmtk.simulator.pointnet.io_tools import io +import bmtk.simulator.utils.simulation_reports as reports +import bmtk.simulator.utils.simulation_inputs as inputs +from bmtk.utils.io import spike_trains +from . import modules as mods +from bmtk.simulator.core.node_sets import NodeSet + + +class PointSimulator(Simulator): + def __init__(self, graph, dt=0.001, overwrite=True, print_time=False): + self._tstop = 0.0 # simulation time + self._dt = dt # time step + self._output_dir = './output/' # directory where log and temporary output will be stored + self._overwrite = overwrite + self._block_run = False + self._block_size = -1 + + self._cells_built = False + self._internal_connections_built = False + + self._graph = graph + self._external_cells = {} # dict-of-dict of external pointnet cells with keys [network_name][cell_id] + self._internal_cells = {} # dictionary of internal pointnet cells with cell_id as key + self._nest_id_map = {} # a map between NEST IDs and Node-IDs + + self._spikedetector = None + self._spikes_file = None # File where all output spikes will be collected and saved + self._tmp_spikes_file = None # temporary gdf files of spike-trains + self._spike_trains_ds = {} # used to temporary store NWB datasets containing spike trains + + self._spike_detector = None + + self._mods = [] + + self._inputs = {} # Used to hold references to nest input objects (current_generators, etc) + + # Reset the NEST kernel for a new simualtion + # TODO: move this into it's own function and make sure it is called before network is built + nest.ResetKernel() + nest.SetKernelStatus({"resolution": self._dt, "overwrite_files": self._overwrite, "print_time": print_time}) + + @property + def tstart(self): + return 0.0 + + @property + def dt(self): + return self._dt + + @property + def tstop(self): + return self._tstop + + @tstop.setter + def tstop(self, val): + self._tstop = val + + @property + def n_steps(self): + return long((self.tstop-self.tstart)/self.dt) + + @property + def net(self): + return self._graph + + @property + def gid_map(self): + return self._graph._nestid2gid + + def _get_block_trial(self, duration): + """ + Compute necessary number of block trials, the length of block simulation and the simulation length of the last + block run, if necessary. + """ + if self._block_run: + data_res = self._block_size * self._dt + fn = duration / data_res + n = int(fn) + res = fn - n + else: + n = -1 + res = -1 + data_res = -1 + return n, res, data_res + + ''' + def set_spikes_recordings(self): + # TODO: Pass in output-dir and file name to save to + # TODO: Allow for sorting - overwrite bionet module + self._spike_detector = nest.Create("spike_detector", 1, {'label': os.path.join(self.output_dir, 'tmp_spike_times'), + 'withtime': True, 'withgid': True, 'to_file': True}) + # print self._spike_detector + + for pop_name, pop in self._graph._nestid2nodeid_map.items(): + # print pop.keys() + + nest.Connect(pop.keys(), self._spike_detector) + # exit() + ''' + + def add_step_currents(self, amp_times, amp_values, node_set, input_name): + scg = nest.Create("step_current_generator", + params={'amplitude_times': amp_times, 'amplitude_values': amp_values}) + + if not isinstance(node_set, NodeSet): + node_set = self.net.get_node_set(node_set) + + # Convert node set into list of gids and then look-up the nest-ids + nest_ids = [self.net._gid2nestid[gid] for gid in node_set.gids()] + + # Attach current clamp to nodes + nest.Connect(scg, nest_ids, syn_spec={'delay': self.dt}) + + self._inputs[input_name] = nest_ids + + def run(self, tstop=None): + if tstop is None: + tstop = self._tstop + + for mod in self._mods: + mod.initialize(self) + + io.barrier() + + io.log_info('Starting Simulation') + n, res, data_res = self._get_block_trial(tstop) + if n > 0: + for r in moves.range(n): + nest.Simulate(data_res) + if res > 0: + nest.Simulate(res * self.dt) + if n < 0: + nest.Simulate(tstop) + + io.barrier() + io.log_info('Simulation finished, finalizing results.') + for mod in self._mods: + mod.finalize(self) + io.barrier() + io.log_info('Done.') + + def add_mod(self, mod): + self._mods.append(mod) + + @classmethod + def from_config(cls, configure, graph): + # load the json file or object + if isinstance(configure, string_types): + config = Config.from_json(configure, validate=True) + elif isinstance(configure, dict): + config = configure + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(configure, type(configure))) + + if 'run' not in config: + raise Exception('Json file is missing "run" entry. Unable to build Bionetwork.') + run_dict = config['run'] + + # Get network parameters + # step time (dt) is set in the kernel and should be passed + overwrite = run_dict['overwrite_output_dir'] if 'overwrite_output_dir' in run_dict else True + print_time = run_dict['print_time'] if 'print_time' in run_dict else False + dt = run_dict['dt'] # TODO: make sure dt exists + network = cls(graph, dt=dt, overwrite=overwrite) + + if 'output_dir' in config['output']: + network.output_dir = config['output']['output_dir'] + + if 'block_run' in run_dict and run_dict['block_run']: + if 'block_size' not in run_dict: + raise Exception('"block_run" is set to True but "block_size" not found.') + network._block_size = run_dict['block_size'] + + if 'duration' in run_dict: + network.tstop = run_dict['duration'] + elif 'tstop' in run_dict: + network.tstop = run_dict['tstop'] + + # Create the output-directory, or delete existing files if it already exists + graph.io.log_info('Setting up output directory') + if not os.path.exists(config['output']['output_dir']): + os.mkdir(config['output']['output_dir']) + elif overwrite: + for gfile in glob.glob(os.path.join(config['output']['output_dir'], '*.gdf')): + os.remove(gfile) + + graph.io.log_info('Building cells.') + graph.build_nodes() + + graph.io.log_info('Building recurrent connections') + graph.build_recurrent_edges() + + for sim_input in inputs.from_config(config): + node_set = graph.get_node_set(sim_input.node_set) + if sim_input.input_type == 'spikes': + spikes = spike_trains.SpikesInput.load(name=sim_input.name, module=sim_input.module, + input_type=sim_input.input_type, params=sim_input.params) + io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + graph.add_spike_trains(spikes, node_set) + + elif sim_input.input_type == 'current_clamp': + # TODO: Need to make this more robust + amp_times = sim_input.params.get('amplitude_times', []) + amp_values = sim_input.params.get('amplitude_values', []) + + if 'delay' in sim_input.params: + amp_times.append(sim_input.params['delay']) + amp_values.append(sim_input.params['amp']) + + if 'duration' in sim_input.params: + amp_times.append(sim_input.params['delay'] + sim_input.params['duration']) + amp_values.append(0.0) + + network.add_step_currents(amp_times, amp_values, node_set, sim_input.name) + + else: + graph.io.log_warning('Unknown input type {}'.format(sim_input.input_type)) + + sim_reports = reports.from_config(config) + for report in sim_reports: + if report.module == 'spikes_report': + mod = mods.SpikesMod(**report.params) + + elif isinstance(report, reports.MembraneReport): + # For convience and for compliance with SONATA format. "membrane_report" and "multimeter_report is the + # same in pointnet. + mod = mods.MultimeterMod(**report.params) + + else: + graph.io.log_exception('Unknown report type {}'.format(report.module)) + + network.add_mod(mod) + + io.log_info('Network created.') + return network diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/property_map.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/property_map.py new file mode 100644 index 0000000..dd1ecc4 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/property_map.py @@ -0,0 +1,213 @@ +import types +import numpy as np + +import nest + +from bmtk.simulator.pointnet.pyfunction_cache import py_modules +from bmtk.simulator.pointnet.io_tools import io + +class NodePropertyMap(object): + def __init__(self, graph): + self._graph = graph + # TODO: Move template_cache to parent graph so it can be shared across diff populations. + self._template_cache = {} + self.node_types_table = None + + self.batch = True + + + def _parse_model_template(self, model_template): + if model_template in self._template_cache: + return self._template_cache[model_template] + else: + template_parts = model_template.split(':') + assert(len(template_parts) == 2) + directive, template = template_parts[0], template_parts[1] + self._template_cache[model_template] = (directive, template) + return directive, template + + def load_cell(self, node): + model_type = self._parse_model_template(node['model_template'])[1] + dynamics_params = self.dynamics_params(node) + fnc_name = node['model_processing'] + if fnc_name is None: + return nest.Create(model_type, 1, dynamics_params) + else: + cell_fnc = py_modules.cell_processor(fnc_name) + return cell_fnc(model_type, node, dynamics_params) + + @classmethod + def build_map(cls, node_group, graph): + prop_map = cls(graph) + + node_types_table = node_group.parent.node_types_table + prop_map.node_types_table = node_types_table + + if 'model_processing' in node_group.columns: + prop_map.batch = False + elif 'model_processing' in node_group.all_columns: + model_fncs = [node_types_table[ntid]['model_processing'] for ntid in np.unique(node_group.node_type_ids) + if node_types_table[ntid]['model_processing'] is not None] + + if model_fncs: + prop_map.batch = False + + if node_group.has_dynamics_params: + prop_map.batch = False + prop_map.dynamics_params = types.MethodType(group_dynamics_params, prop_map) + else: # 'dynamics_params' in node_group.all_columns: + prop_map.dynamics_params = types.MethodType(types_dynamics_params, prop_map) + + if prop_map.batch: + prop_map.model_type = types.MethodType(model_type_batched, prop_map) + prop_map.model_params = types.MethodType(model_params_batched, prop_map) + else: + prop_map.model_type = types.MethodType(model_type, prop_map) + prop_map.model_params = types.MethodType(model_params, prop_map) + + if node_group.has_gids: + prop_map.gid = types.MethodType(gid, prop_map) + else: + prop_map.gid = types.MethodType(node_id, prop_map) + + return prop_map + + +def gid(self, node): + return node['gid'] + + +def node_id(self, node): + return node.node_id + + +def model_type(self, node): + return self._parse_model_template(node['model_template']) + + +def model_type_batched(self, node_type_id): + return self._parse_model_template(self.node_types_table[node_type_id]['model_template']) + + +def model_params(self, node): + return {} + + +def model_params_batched(self, node_type_id): + return self.node_types_table[node_type_id]['dynamics_params'] + + +def types_dynamics_params(self, node): + return node['dynamics_params'] + + +def group_dynamics_params(self, node): + return node.dynamics_params + + +class EdgePropertyMap(object): + def __init__(self, graph, source_population, target_population): + self._graph = graph + self._source_population = source_population + self._target_population = target_population + + self.batch = True + self.synpatic_models = [] + + + def synaptic_model(self, edge): + return edge['model_template'] + + + def synpatic_params(self, edge): + params_dict = {'weight': self.syn_weight(edge), 'delay': edge['delay']} + params_dict.update(edge['dynamics_params']) + return params_dict + + @classmethod + def build_map(cls, edge_group, biograph): + prop_map = cls(biograph, edge_group.parent.source_population, edge_group.parent.source_population) + if 'model_template' in edge_group.columns: + prop_map.batch = False + elif 'model_template' in edge_group.all_columns: + edge_types_table = edge_group.parent.edge_types_table + syn_models = set(edge_types_table[etid]['model_template'] + for etid in np.unique(edge_types_table.edge_type_ids)) + prop_map.synpatic_models = list(syn_models) + else: + prop_map.synpatic_models = ['static_synapse'] + #s = [edge_types_table[ntid]['model_template'] for ntid in np.unique(edge_types_table.node_type_ids) + # if edge_types_table[ntid]['model_template'] is not None] + + + # For fetching/calculating synaptic weights + edge_types_weight_fncs = set() + edge_types_table = edge_group.parent.edge_types_table + for etid in edge_types_table.edge_type_ids: + weight_fnc = edge_types_table[etid].get('weight_function', None) + if weight_fnc is not None: + edge_types_weight_fncs.add(weight_fnc) + + if 'weight_function' in edge_group.group_columns or edge_types_weight_fncs: + # Customized function for user to calculate the synaptic weight + prop_map.syn_weight = types.MethodType(weight_function, prop_map) + + elif 'syn_weight' in edge_group.all_columns: + # Just return the synaptic weight + prop_map.syn_weight = types.MethodType(syn_weight, prop_map) + else: + io.log_exception('Could not find syn_weight or weight_function properties. Cannot create connections.') + + # For determining the synapse placement + if 'nsyns' in edge_group.all_columns: + prop_map.nsyns = types.MethodType(nsyns, prop_map) + else: + # It will get here for connections onto point neurons + prop_map.nsyns = types.MethodType(no_syns, prop_map) + + # For target sections + ''' + if 'syn_weight' not in edge_group.all_columns: + io.log_exception('Edges {} missing syn_weight property for connections.'.format(edge_group.parent.name)) + else: + prop_map.syn_weight = types.MethodType(syn_weight, prop_map) + + + + if 'syn_weight' in edge_group.columns: + prop_map.weight = types.MethodType(syn_weight, prop_map) + prop_map.preselected_targets = True + prop_map.nsyns = types.MethodType(no_nsyns, prop_map) + else: + prop_map.preselected_targets = False + ''' + return prop_map + + +def syn_weight(self, edge): + return edge['syn_weight']*self.nsyns(edge) + + +def weight_function(self, edge): + weight_fnc_name = edge['weight_function'] + src_node = self._graph.get_node(self._source_population, edge.source_node_id) + trg_node = self._graph.get_node(self._target_population, edge.target_node_id) + + if weight_fnc_name is None: + weight_fnc = py_modules.synaptic_weight('default_weight_fnc') + return weight_fnc(edge, src_node, trg_node)# *self.nsyns(edge) + + elif py_modules.has_synaptic_weight(weight_fnc_name): + weight_fnc = py_modules.synaptic_weight(weight_fnc_name) + return weight_fnc(edge, src_node, trg_node) + + else: + io.log_exception('weight_function {} is not defined.'.format(weight_fnc_name)) + + +def nsyns(self, edge): + return edge['nsyns'] + + +def no_syns(self, edge): + return 1 \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/pyfunction_cache.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/pyfunction_cache.py new file mode 100644 index 0000000..9e50616 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/pyfunction_cache.py @@ -0,0 +1,246 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import types +from functools import wraps + + +class _PyFunctions(object): + """Structure for holding custom user-defined python functions. + + Will store a set of functions created by the user. Should not access this directly but rather user the + decorators or setter functions, and use the py_modules class variable to access individual functions. Is divided + up into + synaptic_weight: functions for calcuating synaptic weight. + cell_model: should return NEURON cell hobj. + synapse model: should return a NEURON synapse object. + """ + def __init__(self): + self.__syn_weights = {} + self.__cell_models = {} + self.__synapse_models = {} + self.__cell_processors = {} + + def clear(self): + self.__syn_weights.clear() + self.__cell_models.clear() + self.__synapse_models.clear() + self.__cell_processors.clear() + + def add_synaptic_weight(self, name, func, overwrite=True): + """stores synpatic fuction for given name""" + if overwrite or name not in self.__syn_weights: + self.__syn_weights[name] = func + + @property + def synaptic_weight(self): + """return list of the names of all available synaptic weight functions""" + return self.__syn_weights.keys() + + def synaptic_weight(self, name): + """return the synpatic weight function""" + return self.__syn_weights[name] + + def has_synaptic_weight(self, name): + return name in self.__syn_weights + + def __cell_model_key(self, directive, model_type): + return (directive, model_type) + + def add_cell_model(self, directive, model_type, func, overwrite=True): + key = self.__cell_model_key(directive, model_type) + if overwrite or key not in self.__cell_models: + self.__cell_models[key] = func + + @property + def cell_models(self): + return self.__cell_models.keys() + + def cell_model(self, directive, model_type): + return self.__cell_models[self.__cell_model_key(directive, model_type)] + + def has_cell_model(self, directive, model_type): + return self.__cell_model_key(directive, model_type) in self.__cell_models + + def add_synapse_model(self, name, func, overwrite=True): + if overwrite or name not in self.__synapse_models: + self.__synapse_models[name] = func + + @property + def synapse_models(self): + return self.__synapse_models.keys() + + def synapse_model(self, name): + return self.__synapse_models[name] + + + @property + def cell_processors(self): + return self.__cell_processors.keys() + + def cell_processor(self, name): + return self.__cell_processors[name] + + def add_cell_processor(self, name, func, overwrite=True): + if overwrite or name not in self.__syn_weights: + self.__cell_processors[name] = func + + def __repr__(self): + rstr = '{}: {}\n'.format('cell_models', self.cell_models) + rstr += '{}: {}\n'.format('synapse_models', self.synapse_models) + rstr += '{}: {}'.format('synaptic_weights', self.synaptic_weights) + return rstr + +py_modules = _PyFunctions() + + +def synaptic_weight(*wargs, **wkwargs): + """A decorator for registering a function as a synaptic weight function. + To use either + @synaptic_weight + def weight_function(): ... + + or + @synaptic_weight(name='name_in_edge_types') + def weight_function(): ... + + Once the decorator has been attached and imported the functions will automatically be added to py_modules. + """ + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_synaptic_weight(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_synaptic_weight(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def cell_model(*wargs, **wkwargs): + """A decorator for registering NEURON cell loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_cell_model(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_cell_model(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def synapse_model(*wargs, **wkwargs): + """A decorator for registering NEURON synapse loader functions.""" + if len(wargs) == 1 and callable(wargs[0]): + # for the case without decorator arguments, grab the function object in wargs and create a decorator + func = wargs[0] + py_modules.add_synapse_model(func.__name__, func) # add function assigned to its original name + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + else: + # for the case with decorator arguments + assert(all(k in ['name'] for k in wkwargs.keys())) + + def decorator(func): + # store the function in py_modules but under the name given in the decorator arguments + py_modules.add_synapse_model(wkwargs['name'], func) + + @wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + return func_wrapper + return decorator + + +def add_weight_function(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_synaptic_weight(func_name, func, overwrite) + + +def add_cell_model(func, directive, model_type, overwrite=True): + assert(callable(func)) + # func_name = name if name is not None else func.__name__ + py_modules.add_cell_model(directive, model_type, func, overwrite) + + +def add_cell_processor(func, name=None, overwrite=True): + assert(callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_cell_processor(func_name, func, overwrite) + + +def add_synapse_model(func, name=None, overwrite=True): + assert (callable(func)) + func_name = name if name is not None else func.__name__ + py_modules.add_synapse_model(func_name, func, overwrite) + + +def load_py_modules(cell_models=None, syn_models=None, syn_weights=None): + # py_modules.clear() + + if cell_models is not None: + assert(isinstance(cell_models, types.ModuleType)) + for f in [cell_models.__dict__.get(f) for f in dir(cell_models)]: + if isinstance(f, types.FunctionType): + py_modules.add_cell_model(f.__name__, f) + + if syn_models is not None: + assert(isinstance(syn_models, types.ModuleType)) + for f in [syn_models.__dict__.get(f) for f in dir(syn_models)]: + if isinstance(f, types.FunctionType): + py_modules.add_synapse_model(f.__name__, f) + + if syn_weights is not None: + assert(isinstance(syn_weights, types.ModuleType)) + for f in [syn_weights.__dict__.get(f) for f in dir(syn_weights)]: + if isinstance(f, types.FunctionType): + py_modules.add_synaptic_weight(f.__name__, f) diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/sonata_adaptors.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/sonata_adaptors.py new file mode 100644 index 0000000..b528dba --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/sonata_adaptors.py @@ -0,0 +1,295 @@ +import numpy as np +from collections import Counter +import numbers +import nest +import types +import pandas as pd + +from bmtk.simulator.core.sonata_reader import NodeAdaptor, SonataBaseNode, EdgeAdaptor, SonataBaseEdge +from bmtk.simulator.pointnet.io_tools import io +from bmtk.simulator.pointnet.pyfunction_cache import py_modules + + +def all_null(node_group, column_name): + """Helper function to determine if a column has any non-NULL values""" + types_table = node_group.parent.types_table + non_null_vals = [types_table[ntid][column_name] for ntid in np.unique(node_group.node_type_ids) + if types_table[ntid][column_name] is not None] + return len(non_null_vals) == 0 + + +class PointNodeBatched(object): + def __init__(self, node_ids, gids, node_types_table, node_type_id): + self._n_nodes = len(node_ids) + self._node_ids = node_ids + self._gids = gids + self._nt_table = node_types_table + self._nt_id = node_type_id + self._nest_ids = [] + + @property + def n_nodes(self): + return self._n_nodes + + @property + def node_ids(self): + return self._node_ids + + @property + def gids(self): + return self._gids + + @property + def nest_ids(self): + return self._nest_ids + + @property + def nest_model(self): + return self._nt_table[self._nt_id]['model_template'].split(':')[1] + + @property + def nest_params(self): + return self._nt_table[self._nt_id]['dynamics_params'] + + @property + def model_type(self): + return self._nt_table[self._nt_id]['model_type'] + + def build(self): + self._nest_ids = nest.Create(self.nest_model, self.n_nodes, self.nest_params) + + +class PointNode(SonataBaseNode): + def __init__(self, node, prop_adaptor): + super(PointNode, self).__init__(node, prop_adaptor) + self._nest_ids = [] + + @property + def n_nodes(self): + return 1 + + @property + def node_ids(self): + return [self._prop_adaptor.node_id(self._node)] + + @property + def gids(self): + return [self._prop_adaptor.gid(self._node)] + + @property + def nest_ids(self): + return self._nest_ids + + @property + def nest_model(self): + return self._prop_adaptor.model_template(self._node)[1] + + @property + def nest_params(self): + return self.dynamics_params + + def build(self): + nest_model = self.nest_model + dynamics_params = self.dynamics_params + fnc_name = self._node['model_processing'] + if fnc_name is None: + self._nest_ids = nest.Create(nest_model, 1, dynamics_params) + else: + cell_fnc = py_modules.cell_processor(fnc_name) + self._nest_ids = cell_fnc(nest_model, self._node, dynamics_params) + + +class PointNodeAdaptor(NodeAdaptor): + def __init__(self, network): + super(PointNodeAdaptor, self).__init__(network) + + # Flag for determining if we can build multiple NEST nodes at once. If each individual node has unique + # NEST params or a model_processing function is being called then we must nest.Create for each individual cell. + # Otherwise we can try to call nest.Create for a batch of nodes that share the same properties + self._can_batch = True + + @property + def batch_process(self): + return self._can_batch + + @batch_process.setter + def batch_process(self, flag): + self._can_batch = flag + + def get_node(self, sonata_node): + return PointNode(sonata_node, self) + + def get_batches(self, node_group): + node_ids = node_group.node_ids + node_type_ids = node_group.node_type_ids + node_gids = node_group.gids + if node_gids is None: + node_gids = node_ids + + ntids_counter = Counter(node_type_ids) + + nid_groups = {nt_id: np.zeros(ntids_counter[nt_id], dtype=np.uint32) for nt_id in ntids_counter} + gid_groups = {nt_id: np.zeros(ntids_counter[nt_id], dtype=np.uint32) for nt_id in ntids_counter} + node_groups_counter = {nt_id: 0 for nt_id in ntids_counter} + + for node_id, gid, node_type_id in zip(node_ids, node_gids, node_type_ids): + grp_indx = node_groups_counter[node_type_id] + nid_groups[node_type_id][grp_indx] = node_id + gid_groups[node_type_id][grp_indx] = gid + node_groups_counter[node_type_id] += 1 + + return [PointNodeBatched(nid_groups[nt_id], gid_groups[nt_id], node_group.parent.node_types_table, nt_id) + for nt_id in ntids_counter] + + @staticmethod + def patch_adaptor(adaptor, node_group, network): + node_adaptor = NodeAdaptor.patch_adaptor(adaptor, node_group, network) + + # If dynamics params is stored in the nodes.h5 then we have to build each node separate + if node_group.has_dynamics_params: + node_adaptor.batch_process = False + + # If there is a non-null value in the model_processing column then it potentially means that every cell is + # uniquly built (currently model_processing is applied to each individ. cell) and nodes can't be batched + if 'model_processing' in node_group.columns: + node_adaptor.batch_process = False + elif 'model_processing' in node_group.all_columns and not all_null(node_group, 'model_processing'): + node_adaptor.batch_process = False + + if node_adaptor.batch_process: + io.log_info('Batch processing nodes for {}/{}.'.format(node_group.parent.name, node_group.group_id)) + + return node_adaptor + + +class PointEdge(SonataBaseEdge): + @property + def source_node_ids(self): + return [self._edge.source_node_id] + + @property + def target_node_ids(self): + return [self._edge.target_node_id] + + @property + def nest_params(self): + if self.model_template in py_modules.synapse_models: + syn_model_fnc = py_modules.synapse_model(self.model_template) + else: + syn_model_fnc = py_modules.synapse_models('default') + + return syn_model_fnc(self) + + +class PointEdgeBatched(object): + def __init__(self, source_nids, target_nids, nest_params): + self._src_nids = source_nids + self._trg_nids = target_nids + self._nest_params = nest_params + + @property + def source_node_ids(self): + return self._src_nids + + @property + def target_node_ids(self): + return self._trg_nids + + @property + def nest_params(self): + return self._nest_params + + +class PointEdgeAdaptor(EdgeAdaptor): + def __init__(self, network): + super(PointEdgeAdaptor, self).__init__(network) + self._can_batch = True + + @property + def batch_process(self): + return self._can_batch + + @batch_process.setter + def batch_process(self, flag): + self._can_batch = flag + + def synaptic_params(self, edge): + # TODO: THIS NEEDS to be replaced with call to synapse_models + params_dict = {'weight': self.syn_weight(edge, None, None), 'delay': edge.delay} + params_dict.update(edge.dynamics_params) + return params_dict + + def get_edge(self, sonata_node): + return PointEdge(sonata_node, self) + + + def get_batches(self, edge_group): + src_ids = {} + trg_ids = {} + edge_types_table = edge_group.parent.edge_types_table + + edge_type_ids = edge_group.node_type_ids() + et_id_counter = Counter(edge_type_ids) + tmp_df = pd.DataFrame({'etid': edge_type_ids, 'src_nids': edge_group.src_node_ids(), + 'trg_nids': edge_group.trg_node_ids()}) + + for et_id, grp_vals in tmp_df.groupby('etid'): + src_ids[et_id] = np.array(grp_vals['src_nids']) + trg_ids[et_id] = np.array(grp_vals['trg_nids']) + + # selected_etids = np.unique(edge_type_ids) + type_params = {et_id: {} for et_id in et_id_counter.keys()} + for et_id, p_dict in type_params.items(): + p_dict.update(edge_types_table[et_id]['dynamics_params']) + if 'model_template' in edge_types_table[et_id]: + p_dict['model'] = edge_types_table[et_id]['model_template'] + + if 'delay' in edge_group.columns: + raise NotImplementedError + elif 'delay' in edge_types_table.columns: + for et_id, p_dict in type_params.items(): + p_dict['delay'] = edge_types_table[et_id]['delay'] + + scalar_syn_weight = 'syn_weight' not in edge_group.columns + scalar_nsyns = 'nsyns' not in edge_group.columns + + if scalar_syn_weight and scalar_nsyns: + for et_id, p_dict in type_params.items(): + et_dict = edge_types_table[et_id] + p_dict['weight'] = et_dict['nsyns']*et_dict['syn_weight'] + + else: + if not scalar_nsyns and not scalar_syn_weight: + tmp_df['nsyns'] = edge_group.get_dataset('nsyns') + tmp_df['syn_weight'] = edge_group.get_dataset('syn_weight') + for et_id, grp_vals in tmp_df.groupby('etid'): + type_params[et_id]['weight'] = np.array(grp_vals['nsyns'])*np.array(grp_vals['syn_weight']) + + elif scalar_nsyns: + tmp_df['syn_weight'] = edge_group.get_dataset('syn_weight') + for et_id, grp_vals in tmp_df.groupby('etid'): + type_params[et_id]['weight'] = edge_types_table[et_id].get('nsyns', 1) * np.array(grp_vals['syn_weight']) + + elif scalar_syn_weight: + tmp_df['nsyns'] = edge_group.get_dataset('nsyns') + for et_id, grp_vals in tmp_df.groupby('etid'): + type_params[et_id]['weight'] = np.array(grp_vals['nsyns']) * edge_types_table[et_id]['syn_weight'] + + batched_edges = [] + for et_id in et_id_counter.keys(): + batched_edges.append(PointEdgeBatched(src_ids[et_id], trg_ids[et_id], type_params[et_id])) + + return batched_edges + + @staticmethod + def patch_adaptor(adaptor, edge_group): + edge_adaptor = EdgeAdaptor.patch_adaptor(adaptor, edge_group) + + if 'weight_function' not in edge_group.all_columns and 'syn_weight' in edge_group.all_columns: + adaptor.syn_weight = types.MethodType(point_syn_weight, adaptor) + + return edge_adaptor + + +def point_syn_weight(self, edge, src_node, trg_node): + return edge['syn_weight']*edge.nsyns diff --git a/bmtk-vb/build/lib/bmtk/simulator/pointnet/utils.py b/bmtk-vb/build/lib/bmtk/simulator/pointnet/utils.py new file mode 100644 index 0000000..d71716a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/pointnet/utils.py @@ -0,0 +1,188 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +from collections import defaultdict +import pandas as pd +import numpy as np +import six +""" +Most of these functions were collected from previous version of pointnet and are no longer tested and tested. However +some functions may still be used by some people internally at AI for running their own simulations. I have marked all +such functions as UNUSED. + +I will leave them alone for now but in the future they should be purged or updated. +""" + + +def read_LGN_activity(trial_num, file_name): + # UNUSED. + spike_train_dict = {} + f5 = h5py.File(file_name, 'r') + trial_group = f5['processing/trial_{}/spike_train'.format(trial_num)] + for cid in trial_group.keys(): + spike_train_dict[int(cid)] = trial_group[cid]['data'][...] + + return spike_train_dict + + +def read_conns(file_name): + # UNUSED. + fc = h5py.File(file_name) + indptr = fc['indptr'] + cell_size = len(indptr) - 1 + print(cell_size) + conns = {} + source = fc['src_gids'] + for xin in six.moves.range(cell_size): + conns[str(xin)] = list(source[indptr[xin]:indptr[xin+1]]) + + return conns + + +def gen_recurrent_csv(num, offset, csv_file): + # UNUSED. + conn_data = np.loadtxt(csv_file) + target_ids = conn_data[:, 0] + source_ids = conn_data[:, 1] + weight_scale = conn_data[:, 2] + + pre = [] + cell_num = num + params = [] + for xin in six.moves.range(cell_num): + pre.append(xin+offset) + ind = np.where(source_ids == xin) + + temp_param = {} + targets = target_ids[ind] + offset + weights = weight_scale[ind] + delays = np.ones(len(ind[0]))*1.5 + targets.astype(float) + weights.astype(float) + temp_param['target'] = targets + temp_param['weight'] = weights*1 + temp_param['delay'] = delays + params.append(temp_param) + + return pre, params + + +def gen_recurrent_h5(num, offset, h5_file): + # UNUSED. + fc = h5py.File(h5_file) + indptr = fc['indptr'] + cell_size = len(indptr) - 1 + src_gids = fc['src_gids'] + nsyns = fc['nsyns'] + source_ids = [] + weight_scale = [] + target_ids = [] + delay_v = 1.5 # arbitrary value + + for xin in six.moves.range(cell_size): + target_ids.append(xin) + source_ids.append(list(src_gids[indptr[xin]:indptr[xin+1]])) + weight_scale.append(list(nsyns[indptr[xin]:indptr[xin+1]])) + targets = defaultdict(list) + weights = defaultdict(list) + delays = defaultdict(list) + + for xi, xin in enumerate(target_ids): + for yi, yin in enumerate(source_ids[xi]): + targets[yin].append(xin) + weights[yin].append(weight_scale[xi][yi]) + delays[yin].append(delay_v) + + presynaptic = [] + params = [] + for xin in targets: + presynaptic.append(xin+offset) + temp_param = {} + temp_array = np.array(targets[xin])*1.0 + offset + temp_array.astype(float) + temp_param['target'] = temp_array + temp_array = np.array(weights[xin]) + temp_array.astype(float) + temp_param['weight'] = temp_array + temp_array = np.array(delays[xin]) + temp_array.astype(float) + temp_param['delay'] = temp_array + params.append(temp_param) + + return presynaptic, params + + +def load_params(node_name, model_name): + """ + load information regarding nodes and cell_models from csv files + + Parameters + ---------- + node_name: json file name for node information + model_name: json file name for neuron model information + + Returns + ------- + node_info: 2d array of node info read out from the json file + mode_info: 2d array of model info read out from the json file + dict_coordinates: dictionary of coordinates. keyword is the node_id and entries are the x,y and z coordinates. + """ + # UNUSED. + node = pd.read_csv(node_name, sep=' ', quotechar='"', quoting=0) + model = pd.read_csv(model_name, sep=' ', quotechar='"', quoting=0) + node_info = node.values + model_info = model.values + # In NEST, cells do not have intrinsic coordinates. So we have to make some virutial links between cells and + # coordinates + dict_coordinates = defaultdict(list) + + for xin in six.moves.range(len(node_info)): + dict_coordinates[str(node_info[xin, 0])] = [node_info[xin, 2], node_info[xin, 3], node_info[xin, 4]] + return node_info, model_info, dict_coordinates + + +def load_conns(cnn_fn): + """ + load information regarding connectivity from csv files + + Parameters + ---------- + cnn_fn: json file name for connection information + + Returns + ------- + connection dictionary + """ + # UNUSED. + conns = pd.read_csv(cnn_fn, sep=' ', quotechar='"', quoting=0) + targets = conns.target_label + sources = conns.source_label + weights = conns.weight + delays = conns.delay + + conns_mapping = {} + for xin in six.moves.range(len(targets)): + keys = sources[xin] + '-' + targets[xin] + conns_mapping[keys] = [weights[xin], delays[xin]] + + return conns_mapping diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/__init__.py new file mode 100644 index 0000000..7b591ca --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/__init__.py @@ -0,0 +1,25 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .popnetwork import PopNetwork +from .popsimulator import PopSimulator +from .config import Config diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/config.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/config.py new file mode 100644 index 0000000..567e5b6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/config.py @@ -0,0 +1,34 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# import bmtk.simulator.utils.config as msdk_config +from bmtk.simulator.core.config import ConfigDict +from bmtk.simulator.core.io_tools import io + +def from_json(config_file, validate=False): + conf_dict = ConfigDict.from_json(config_file) + conf_dict.io = io + return conf_dict + + +class Config(ConfigDict): + pass \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/popedge.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/popedge.py new file mode 100644 index 0000000..1e4e98e --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/popedge.py @@ -0,0 +1,82 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from bmtk.simulator.utils.graph import SimEdge + + +class PopEdge(SimEdge): + def __init__(self, source_pop, target_pop, edge_params, dynamics_params): + super(PopEdge, self).__init__(edge_params, dynamics_params) + self.__source_pop = source_pop + self.__target_pop = target_pop + self._weight = self.__get_prop('weight', 0.0) + self._nsyns = self.__get_prop('nsyns', 0) + self._delay = self.__get_prop('delay', 0.0) + + @property + def source(self): + return self.__source_pop + + @property + def target(self): + return self.__target_pop + + @property + def params(self): + return self._orig_params + + @property + def weight(self): + return self._weight + + @weight.setter + def weight(self, value): + self._weight = value + + @property + def nsyns(self): + return self._nsyns + + @nsyns.setter + def nsyns(self, value): + self._nsyns = value + + @property + def delay(self): + return self._delay + + @delay.setter + def delay(self, value): + self._delay = value + + def __get_prop(self, name, default=None): + if name in self._orig_params: + return self._orig_params[name] + elif name in self._dynamics_params: + return self._dynamics_params[name] + else: + return default + + def __repr__(self): + relevant_params = "weight: {}, delay: {}, nsyns: {}".format(self.weight, self.delay, self.nsyns) + rstr = "{} --> {} {{{}}}".format(self.source.pop_id, self.target.pop_id, relevant_params) + return rstr diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/popnetwork.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/popnetwork.py new file mode 100644 index 0000000..46b7928 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/popnetwork.py @@ -0,0 +1,695 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import numpy as np + +from bmtk.simulator.core.simulator_network import SimNetwork +#from bmtk.simulator.core.graph import SimGraph +#from property_schemas import PopTypes, DefaultPropertySchema +#from popnode import InternalNode, ExternalPopulation +#from popedge import PopEdge +from bmtk.simulator.popnet import utils as poputils +from bmtk.simulator.popnet.sonata_adaptors import PopEdgeAdaptor + +from dipde.internals.internalpopulation import InternalPopulation +from dipde.internals.externalpopulation import ExternalPopulation +from dipde.internals.connection import Connection + +''' +class PopNode(object): + def __init__(self, node, property_map, graph): + self._node = node + self._property_map = property_map + self._graph = graph + + @property + def dynamics_params(self): + # TODO: Use propert map + return self._node['dynamics_params'] + + @property + def node_id(self): + # TODO: Use property map + return self._node.node_id +''' + + +class Population(object): + def __init__(self, pop_id): + self._pop_id = pop_id + self._nodes = [] + self._params = None + + self._dipde_obj = None + + def add_node(self, pnode): + self._nodes.append(pnode) + if self._params is None and pnode.dynamics_params is not None: + self._params = pnode.dynamics_params.copy() + + @property + def pop_id(self): + return self._pop_id + + @property + def dipde_obj(self): + return self._dipde_obj + + @property + def record(self): + return True + + def build(self): + params = self._nodes[0].dynamics_params + self._dipde_obj = InternalPopulation(**params) + + def get_gids(self): + for node in self._nodes: + yield node.node_id + + def __getitem__(self, item): + return self._params[item] + + def __setitem__(self, key, value): + self._params[key] = value + + def __repr__(self): + return str(self._pop_id) + + +class ExtPopulation(Population): + def __init__(self, pop_id): + super(ExtPopulation, self).__init__(pop_id) + self._firing_rate = None + + @property + def record(self): + return False + + @property + def firing_rate(self): + return self._firing_rate + + @firing_rate.setter + def firing_rate(self, value): + self.build(value) + + def build(self, firing_rate): + if firing_rate is not None: + self._firing_rate = firing_rate + + self._dipde_obj = ExternalPopulation(firing_rate) + + +class PopEdge(object): + def __init__(self, edge, property_map, graph): + self._edge = edge + self._prop_map = property_map + self._graph = graph + + @property + def nsyns(self): + # TODO: Use property map + return self._edge['nsyns'] + + @property + def delay(self): + return self._edge['delay'] + + @property + def weight(self): + return self._edge['syn_weight'] + + +class PopConnection(object): + def __init__(self, src_pop, trg_pop): + self._src_pop = src_pop + self._trg_pop = trg_pop + self._edges = [] + + self._dipde_conn = None + + def add_edge(self, edge): + self._edges.append(edge) + + def build(self): + edge = self._edges[0] + self._dipde_conn = Connection(self._src_pop._dipde_obj, self._trg_pop._dipde_obj, edge.nsyns, edge.delay, + edge.syn_weight) + + @property + def dipde_obj(self): + return self._dipde_conn + + +class PopNetwork(SimNetwork): + def __init__(self, group_by='node_type_id', **properties): + super(PopNetwork, self).__init__() + + self.__all_edges = [] + self._group_key = group_by + self._gid_table = {} + self._edges = {} + self._target_edges = {} + self._source_edges = {} + + self._params_cache = {} + #self._params_column = property_schema.get_params_column() + self._dipde_pops = {} + self._external_pop = {} + self._all_populations = [] + # self._loaded_external_pops = {} + + self._nodeid2pop_map = {} + + self._connections = {} + self._external_connections = {} + self._all_connections = [] + + @property + def populations(self): + return self._all_populations + + @property + def connections(self): + return self._all_connections + + @property + def internal_populations(self): + return self._dipde_pops.values() + + def _register_adaptors(self): + super(PopNetwork, self)._register_adaptors() + self._edge_adaptors['sonata'] = PopEdgeAdaptor + + def build_nodes(self): + if self._group_key == 'node_id' or self._group_key is None: + self._build_nodes() + else: + self._build_nodes_grouped() + + def _build_nodes(self): + for node_pop in self.node_populations: + if node_pop.internal_nodes_only: + nid2pop_map = {} + for node in node_pop.get_nodes(): + #pnode = PopNode(node, prop_maps[node.group_id], self) + pop = Population(node.node_id) + pop.add_node(node) + pop.build() + + self._dipde_pops[node.node_id] = pop + self._all_populations.append(pop) + nid2pop_map[node.node_id] = pop + + self._nodeid2pop_map[node_pop.name] = nid2pop_map + + """ + for node_pop in self._internal_populations_map.values(): + prop_maps = self._node_property_maps[node_pop.name] + nid2pop_map = {} + for node in node_pop: + pnode = PopNode(node, prop_maps[node.group_id], self) + pop = Population(node.node_id) + pop.add_node(pnode) + pop.build() + + self._dipde_pops[node.node_id] = pop + self._all_populations.append(pop) + nid2pop_map[node.node_id] = pop + + self._nodeid2pop_map[node_pop.name] = nid2pop_map + """ + + def _build_nodes_grouped(self): + # Organize every single sonata-node into a given population. + for node_pop in self.node_populations: + nid2pop_map = {} + if node_pop.internal_nodes_only: + for node in node_pop.get_nodes(): + pop_key = node[self._group_key] + if pop_key not in self._dipde_pops: + pop = Population(pop_key) + self._dipde_pops[pop_key] = pop + self._all_populations.append(pop) + + pop = self._dipde_pops[pop_key] + pop.add_node(node) + nid2pop_map[node.node_id] = pop + + self._nodeid2pop_map[node_pop.name] = nid2pop_map + + for dpop in self._dipde_pops.values(): + dpop.build() + + """ + for node_pop in self._internal_populations_map.values(): + prop_maps = self._node_property_maps[node_pop.name] + nid2pop_map = {} + for node in node_pop: + pop_key = node[self._group_key] + pnode = PopNode(node, prop_maps[node.group_id], self) + if pop_key not in self._dipde_pops: + pop = Population(pop_key) + self._dipde_pops[pop_key] = pop + self._all_populations.append(pop) + + pop = self._dipde_pops[pop_key] + pop.add_node(pnode) + nid2pop_map[node.node_id] = pop + + self._nodeid2pop_map[node_pop.name] = nid2pop_map + + for dpop in self._dipde_pops.values(): + dpop.build() + """ + + def build_recurrent_edges(self): + recurrent_edge_pops = [ep for ep in self._edge_populations if not ep.virtual_connections] + + for edge_pop in recurrent_edge_pops: + if edge_pop.recurrent_connections: + src_pop_maps = self._nodeid2pop_map[edge_pop.source_nodes] + trg_pop_maps = self._nodeid2pop_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + src_pop = src_pop_maps[edge.source_node_id] + trg_pop = trg_pop_maps[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._connections: + conn = PopConnection(src_pop, trg_pop) + self._connections[conn_key] = conn + self._all_connections.append(conn) + + self._connections[conn_key].add_edge(edge) + + elif edge_pop.mixed_connections: + raise NotImplementedError() + + for conn in self._connections.values(): + conn.build() + + """ + recurrent_edges = [edge_pop for _, edge_list in self._recurrent_edges.items() for edge_pop in edge_list] + for edge_pop in recurrent_edges: + prop_maps = self._edge_property_maps[edge_pop.name] + src_pop_maps = self._nodeid2pop_map[edge_pop.source_population] + trg_pop_maps = self._nodeid2pop_map[edge_pop.target_population] + for edge in edge_pop: + src_pop = src_pop_maps[edge.source_node_id] + trg_pop = trg_pop_maps[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._connections: + conn = PopConnection(src_pop, trg_pop) + self._connections[conn_key] = conn + self._all_connections.append(conn) + + pop_edge = PopEdge(edge, prop_maps[edge.group_id], self) + self._connections[conn_key].add_edge(pop_edge) + + for conn in self._connections.values(): + conn.build() + # print len(self._connections) + """ + + def find_edges(self, source_nodes=None, target_nodes=None): + # TODO: Move to parent + selected_edges = self._edge_populations[:] + + if source_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.source_nodes == source_nodes] + + if target_nodes is not None: + selected_edges = [edge_pop for edge_pop in selected_edges if edge_pop.target_nodes == target_nodes] + + return selected_edges + + def add_spike_trains(self, spike_trains, node_set): + # Build external node populations + src_nodes = [node_pop for node_pop in self.node_populations if node_pop.name in node_set.population_names()] + for node_pop in src_nodes: + pop_name = node_pop.name + if node_pop.name not in self._external_pop: + external_pop_map = {} + src_pop_map = {} + for node in node_pop.get_nodes(): + pop_key = node[self._group_key] + if pop_key not in external_pop_map: + pop = ExtPopulation(pop_key) + external_pop_map[pop_key] = pop + self._all_populations.append(pop) + + pop = external_pop_map[pop_key] + pop.add_node(node) + src_pop_map[node.node_id] = pop + + self._nodeid2pop_map[pop_name] = src_pop_map + + firing_rates = poputils.get_firing_rates(external_pop_map.values(), spike_trains) + self._external_pop[pop_name] = external_pop_map + for dpop in external_pop_map.values(): + dpop.build(firing_rates[dpop.pop_id]) + + else: + # TODO: Throw error spike trains should only be called once per source population + # external_pop_map = self._external_pop[pop_name] + src_pop_map = self._nodeid2pop_map[pop_name] + + unbuilt_connections = [] + for source_reader in src_nodes: + for edge_pop in self.find_edges(source_nodes=source_reader.name): + trg_pop_map = self._nodeid2pop_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + src_pop = src_pop_map[edge.source_node_id] + trg_pop = trg_pop_map[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._external_connections: + pconn = PopConnection(src_pop, trg_pop) + self._external_connections[conn_key] = pconn + unbuilt_connections.append(pconn) + self._all_connections.append(pconn) + + #pop_edge = PopEdge(edge, prop_maps[edge.group_id], self) + self._external_connections[conn_key].add_edge(edge) + + for pedge in unbuilt_connections: + pedge.build() + #exit() + + """ + print node_pop.name + + + exit() + if node_pop.name in self._virtual_ids_map: + continue + + virt_node_map = {} + if node_pop.virtual_nodes_only: + print 'HERE' + exit() + + + for pop_name, node_pop in self._virtual_populations_map.items(): + if pop_name not in spike_trains.populations: + continue + + # Build external population if it already hasn't been built + if pop_name not in self._external_pop: + prop_maps = self._node_property_maps[pop_name] + external_pop_map = {} + src_pop_map = {} + for node in node_pop: + pop_key = node[self._group_key] + pnode = PopNode(node, prop_maps[node.group_id], self) + if pop_key not in external_pop_map: + pop = ExtPopulation(pop_key) + external_pop_map[pop_key] = pop + self._all_populations.append(pop) + + pop = external_pop_map[pop_key] + pop.add_node(pnode) + src_pop_map[node.node_id] = pop + + self._nodeid2pop_map[pop_name] = src_pop_map + + firing_rates = poputils.get_firing_rates(external_pop_map.values(), spike_trains) + self._external_pop[pop_name] = external_pop_map + for dpop in external_pop_map.values(): + dpop.build(firing_rates[dpop.pop_id]) + + else: + # TODO: Throw error spike trains should only be called once per source population + # external_pop_map = self._external_pop[pop_name] + src_pop_map = self._nodeid2pop_map[pop_name] + + unbuilt_connections = [] + for node_pop in self._internal_populations_map.values(): + trg_pop_map = self._nodeid2pop_map[node_pop.name] + for edge_pop in self.external_edge_populations(src_pop=pop_name, trg_pop=node_pop.name): + for edge in edge_pop: + src_pop = src_pop_map[edge.source_node_id] + trg_pop = trg_pop_map[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._external_connections: + pconn = PopConnection(src_pop, trg_pop) + self._external_connections[conn_key] = pconn + unbuilt_connections.append(pconn) + self._all_connections.append(pconn) + + pop_edge = PopEdge(edge, prop_maps[edge.group_id], self) + self._external_connections[conn_key].add_edge(pop_edge) + + for pedge in unbuilt_connections: + pedge.build() + """ + + + def add_rates(self, rates, node_set): + if self._group_key == 'node_id': + id_lookup = lambda n: n.node_id + else: + id_lookup = lambda n: n[self._group_key] + + src_nodes = [node_pop for node_pop in self.node_populations if node_pop.name in node_set.population_names()] + for node_pop in src_nodes: + pop_name = node_pop.name + if node_pop.name not in self._external_pop: + external_pop_map = {} + src_pop_map = {} + for node in node_pop.get_nodes(): + pop_key = id_lookup(node) + if pop_key not in external_pop_map: + pop = ExtPopulation(pop_key) + external_pop_map[pop_key] = pop + self._all_populations.append(pop) + + pop = external_pop_map[pop_key] + pop.add_node(node) + src_pop_map[node.node_id] = pop + + self._nodeid2pop_map[pop_name] = src_pop_map + + self._external_pop[pop_name] = external_pop_map + for dpop in external_pop_map.values(): + firing_rates = rates.get_rate(dpop.pop_id) + dpop.build(firing_rates) + + else: + # TODO: Throw error spike trains should only be called once per source population + # external_pop_map = self._external_pop[pop_name] + src_pop_map = self._nodeid2pop_map[pop_name] + + unbuilt_connections = [] + for source_reader in src_nodes: + for edge_pop in self.find_edges(source_nodes=source_reader.name): + trg_pop_map = self._nodeid2pop_map[edge_pop.target_nodes] + for edge in edge_pop.get_edges(): + src_pop = src_pop_map[edge.source_node_id] + trg_pop = trg_pop_map[edge.target_node_id] + conn_key = (src_pop, trg_pop) + if conn_key not in self._external_connections: + pconn = PopConnection(src_pop, trg_pop) + self._external_connections[conn_key] = pconn + unbuilt_connections.append(pconn) + self._all_connections.append(pconn) + + #pop_edge = PopEdge(edge, prop_maps[edge.group_id], self) + self._external_connections[conn_key].add_edge(edge) + + for pedge in unbuilt_connections: + pedge.build() + + """ + for pop_name, node_pop in self._virtual_populations_map.items(): + if pop_name not in rates.populations: + continue + + # Build external population if it already hasn't been built + if pop_name not in self._external_pop: + prop_maps = self._node_property_maps[pop_name] + external_pop_map = {} + src_pop_map = {} + for node in node_pop: + pop_key = id_lookup(node) + #pop_key = node[self._group_key] + pnode = PopNode(node, prop_maps[node.group_id], self) + if pop_key not in external_pop_map: + pop = ExtPopulation(pop_key) + external_pop_map[pop_key] = pop + self._all_populations.append(pop) + + pop = external_pop_map[pop_key] + pop.add_node(pnode) + src_pop_map[node.node_id] = pop + + self._nodeid2pop_map[pop_name] = src_pop_map + + firing_rate = rates.get_rate(pop_key) + self._external_pop[pop_name] = external_pop_map + for dpop in external_pop_map.values(): + dpop.build(firing_rate) + + else: + # TODO: Throw error spike trains should only be called once per source population + # external_pop_map = self._external_pop[pop_name] + src_pop_map = self._nodeid2pop_map[pop_name] + """ + + ''' + def _add_node(self, node, network): + pops = self._networks[network] + pop_key = node[self._group_key] + if pop_key in pops: + pop = pops[pop_key] + pop.add_gid(node.gid) + self._gid_table[network][node.gid] = pop + else: + model_class = self.property_schema.get_pop_type(node) + if model_class == PopTypes.Internal: + pop = InternalNode(pop_key, self, network, node) + pop.add_gid(node.gid) + pop.model_params = self.__get_params(node) + self._add_internal_node(pop, network) + + elif model_class == PopTypes.External: + # TODO: See if we can get firing rate from dynamics_params + pop = ExternalPopulation(pop_key, self, network, node) + pop.add_gid(node.gid) + self._add_external_node(pop, network) + + else: + raise Exception('Unknown model type') + + if network not in self._gid_table: + self._gid_table[network] = {} + self._gid_table[network][node.gid] = pop + ''' + + def __get_params(self, node_params): + if node_params.with_dynamics_params: + return node_params['dynamics_params'] + + params_file = node_params[self._params_column] + if params_file in self._params_cache: + return self._params_cache[params_file] + else: + params_dir = self.get_component('models_dir') + params_path = os.path.join(params_dir, params_file) + params_dict = json.load(open(params_path, 'r')) + self._params_cache[params_file] = params_dict + return params_dict + + def _preprocess_node_types(self, node_population): + node_type_ids = np.unique(node_population.type_ids) + # TODO: Verify all the node_type_ids are in the table + node_types_table = node_population.types_table + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + model_type = node_type['model_type'] + + if model_type == 'biophysical': + params_dir = self.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = self.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = self.get_component('point_neuron_models_dir') + elif model_type == 'population': + params_dir = self.get_component('population_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = self.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + + ''' + def add_edges(self, edges, target_network=None, source_network=None): + # super(PopGraph, self).add_edges(edges) + + target_network = target_network if target_network is not None else edges.target_network + if target_network not in self._target_edges: + self._target_edges[target_network] = [] + + source_network = source_network if source_network is not None else edges.source_network + if source_network not in self._source_edges: + self._source_edges[source_network] = [] + + target_pops = self.get_populations(target_network) + source_pops = self.get_populations(source_network) + source_gid_table = self._gid_table[source_network] + + for target_pop in target_pops: + for target_gid in target_pop.get_gids(): + for edge in edges.edges_itr(target_gid): + source_pop = source_gid_table[edge.source_gid] + self._add_edge(source_pop, target_pop, edge) + ''' + + def _add_edge(self, source_pop, target_pop, edge): + src_id = source_pop.node_id + trg_id = target_pop.node_id + edge_type_id = edge['edge_type_id'] + edge_key = (src_id, source_pop.network, trg_id, target_pop.network, edge_type_id) + + if edge_key in self._edges: + return + else: + # TODO: implement dynamics params + dynamics_params = self._get_edge_params(edge) + pop_edge = PopEdge(source_pop, target_pop, edge, dynamics_params) + self._edges[edge_key] = pop_edge + self._source_edges[source_pop.network].append(pop_edge) + self._target_edges[target_pop.network].append(pop_edge) + + def get_edges(self, source_network): + return self._source_edges[source_network] + + def edges_table(self, target_network, source_network): + return self._edges_table[(target_network, source_network)] + + def get_populations(self, network): + return super(PopNetwork, self).get_nodes(network) + + def get_population(self, node_set, gid): + return self._nodeid2pop_map[node_set][gid] + + def rebuild(self): + for _, ns in self._nodeid2pop_map.items(): + for _, pop in ns.items(): + pop.build() + + for pc in self._all_connections: + pc.build() \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/popnetwork_OLD.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/popnetwork_OLD.py new file mode 100644 index 0000000..cfdeddb --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/popnetwork_OLD.py @@ -0,0 +1,327 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import logging + +from dipde.internals.internalpopulation import InternalPopulation +from dipde.internals.externalpopulation import ExternalPopulation +from dipde.internals.connection import Connection +import dipde + +import bmtk.simulator.popnet.config as cfg +import bmtk.simulator.popnet.utils as poputils + + +class PopNetwork (object): + def __init__(self, graph): + self._graph = graph + + self._duration = 0.0 + self._dt = 0.0001 + self._rates_file = None # name of file where the output is saved + + self.__population_list = [] # list of all populations, internal and external + self.__population_table = {graph: {} for graph in self._graph.networks} # population lookup by [network][id] + self.__connection_list = [] # list of all connections + self._dipde_network = None # reference to dipde.Network object + + # diction of rates for every external network/pop_id. Prepopulate dictionary with populations whose rates + # have already been manually set, otherwise they should use one of the add_rates_* function. + self._rates = {network: {pop.pop_id: pop.firing_rate for pop in self._graph.get_populations(network) + if not pop.is_internal and pop.is_firing_rate_set} + for network in self._graph.networks} + + """ + for network in self._graph.networks: + for pop in self._graph.get_populations(network): + + if pop.is_internal: + dipde_pop = self.__create_internal_pop(pop) + + else: + if pop.is_firing_rate_set: + rates = pop.firing_rate + """ + + @property + def duration(self): + return self._duration + + @duration.setter + def duration(self, value): + self._duration = value + + @property + def dt(self): + return self._dt + + @dt.setter + def dt(self, value): + self._dt = value + + @property + def rates_file(self): + return self._rates_file + + @rates_file.setter + def rates_file(self, value): + self._rates_file = value + + @property + def populations(self): + return self.__population_list + + @property + def connections(self): + return self.__connection_list + + def add_rates_nwb(self, network, nwb_file, trial, force=False): + """Creates external population firing rates from an NWB file. + + Will iterate through a processing trial of an NWB file by assigning gids the population it belongs too and + taking the average firing rate. + + This should be done before calling build_cells(). If a population has already been assigned a firing rate an + error will occur unless force=True. + + :param network: Name of network with external populations. + :param nwb_file: NWB file with spike rates. + :param trial: trial id in NWB file + :param force: will overwrite existing firing rates + """ + existing_rates = self._rates[network] # TODO: validate network exists + # Get all unset, external populations in a network. + network_pops = self._graph.get_populations(network) + selected_pops = [] + for pop in network_pops: + if pop.is_internal: + continue + elif not force and pop.pop_id in existing_rates: + print('Firing rate for {}/{} has already been set, skipping.'.format(network, pop.pop_id)) + else: + selected_pops.append(pop) + + if selected_pops: + # assign firing rates from NWB file + # TODO: + rates_dict = poputils.get_firing_rate_from_nwb(selected_pops, nwb_file, trial) + self._rates[network].update(rates_dict) + + def add_rate_hz(self, network, pop_id, rate, force=False): + """Set the firing rate of an external population. + + This should be done before calling build_cells(). If a population has already been assigned a firing rate an + error will occur unless force=True. + + :param network: name of network with wanted exteranl population + :param pop_id: name/id of external population + :param rate: firing rate in Hz. + :param force: will overwrite existing firing rates + """ + self.__add_rates_validator(network, pop_id, force) + self._rates[network][pop_id] = rate + + def __add_rates_validator(self, network, pop_id, force): + if network not in self._graph.networks: + raise Exception('No network {} found in PopGraph.'.format(network)) + + pop = self._graph.get_population(network, pop_id) + if pop is None: + raise Exception('No population with id {} found in {}.'.format(pop_id, network)) + if pop.is_internal: + raise Exception('Population {} in {} is not an external population.'.format(pop_id, network)) + if not force and pop_id in self._rates[network]: + raise Exception('The firing rate for {}/{} already set and force=False.'.format(network, pop_id)) + + def _get_rate(self, network, pop): + """Gets the firing rate for a given population""" + return self._rates[network][pop.pop_id] + + def build_populations(self): + """Build dipde Population objects from graph nodes. + + To calculate external populations firing rates, it first see if a population's firing rate has been manually + set in the graph. Otherwise it attempts to calulate the firing rate from the call to add_rate_hz, add_rates_NWB, + etc. (which should be called first). + """ + for network in self._graph.networks: + for pop in self._graph.get_populations(network): + if pop.is_internal: + dipde_pop = self.__create_internal_pop(pop) + + else: + dipde_pop = self.__create_external_pop(pop, self._get_rate(network, pop)) + + self.__population_list.append(dipde_pop) + self.__population_table[network][pop.pop_id] = dipde_pop + + def set_logging(self, log_file): + # TODO: move this out of the function, put in io class + if os.path.exists(log_file): + os.remove(log_file) + + # get root logger + logger = logging.getLogger() + for h in list(logger.handlers): + # remove existing handlers that will write to console. + logger.removeHandler(h) + + # creates handler that write to log_file + logging.basicConfig(filename=log_file, filemode='w', level=logging.DEBUG) + + def set_external_connections(self, network_name): + """Sets the external connections for populations in a given network. + + :param network_name: name of external network with External Populations to connect to internal pops. + """ + for edge in self._graph.get_edges(network_name): + # Get source and target populations + src = edge.source + source_pop = self.__population_table[src.network][src.pop_id] + trg = edge.target + target_pop = self.__population_table[trg.network][trg.pop_id] + + # build a connection. + self.__connection_list.append(self.__create_connection(source_pop, target_pop, edge)) + + def set_recurrent_connections(self): + """Initialize internal connections.""" + for network in self._graph.internal_networks(): + for edge in self._graph.get_edges(network): + src = edge.source + source_pop = self.__population_table[src.network][src.pop_id] + trg = edge.target + target_pop = self.__population_table[trg.network][trg.pop_id] + self.__connection_list.append(self.__create_connection(source_pop, target_pop, edge)) + + def run(self, duration=None): + # TODO: Check if cells/connections need to be rebuilt. + + # Create the networ + self._dipde_network = dipde.Network(population_list=self.populations, connection_list=self.__connection_list) + + if duration is None: + duration = self.duration + + print("running simulation...") + self._dipde_network.run(t0=0.0, tf=duration, dt=self.dt) + # TODO: make record_rates optional? + self.__record_rates() + print("done simulation.") + + def __create_internal_pop(self, params): + # TODO: use getter methods directly in case arguments are not stored in dynamics params + # pop = InternalPopulation(**params.dynamics_params) + pop = InternalPopulation(**params.model_params) + return pop + + def __create_external_pop(self, params, rates): + pop = ExternalPopulation(rates, record=False) + return pop + + def __create_connection(self, source, target, params): + return Connection(source, target, nsyn=params.nsyns, delays=params.delay, weights=params.weight) + + def __record_rates(self): + with open(self._rates_file, 'w') as f: + # TODO: store internal populations separately, unless there is a reason to save external populations + # (there isn't and it will be problematic) + for network, pop_list in self.__population_table.items(): + for pop_id, pop in pop_list.items(): + if pop.record: + for time, rate in zip(pop.t_record, pop.firing_rate_record): + f.write('{} {} {}\n'.format(pop_id, time, rate)) + + @classmethod + def from_config(cls, configure, graph): + # load the json file or object + if isinstance(configure, basestring): + config = cfg.from_json(configure, validate=True) + elif isinstance(configure, dict): + config = configure + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(configure, type(configure))) + network = cls(graph) + + if 'run' not in config: + raise Exception('Json file is missing "run" entry. Unable to build Bionetwork.') + run_dict = config['run'] + + # Create the output file + if 'output' in config: + out_dict = config['output'] + + rates_file = out_dict.get('rates_file', None) + if rates_file is not None: + # create directory if required + network.rates_file = rates_file + parent_dir = os.path.dirname(rates_file) + if not os.path.exists(parent_dir): + os.makedirs(parent_dir) + + if 'log_file' in out_dict: + log_file = out_dict['log_file'] + network.set_logging(log_file) + + # get network parameters + if 'duration' in run_dict: + network.duration = run_dict['duration'] + + if 'dt' in run_dict: + network.dt = run_dict['dt'] + + # TODO: need to get firing rates before building populations + if 'input' in config: + for netinput in config['input']: + if netinput['type'] == 'external_spikes' and netinput['format'] == 'nwb' and netinput['active']: + # Load external network spike trains from an NWB file. + print('Setting firing rates for {} from {}.'.format(netinput['source_nodes'], netinput['file'])) + network.add_rates_nwb(netinput['source_nodes'], netinput['file'], netinput['trial']) + + if netinput['type'] == 'pop_rate': + print('Setting {}/{} to fire at {} Hz.'.format(netinput['source_nodes'], netinput['pop_id'], netinput['rate'])) + network.add_rate_hz(netinput['source_nodes'], netinput['pop_id'], netinput['rate']) + + # TODO: take input as function with Population argument + + # Build populations + print('Building Populations') + network.build_populations() + + # Build recurrent connections + if run_dict['connect_internal']: + print('Building recurrention connections') + network.set_recurrent_connections() + + # Build external connections. Set connection to default True and turn off only if explicitly stated. + # NOTE: It might be better to set to default off?!?! Need to dicuss what would be more intuitive for the users. + # TODO: ignore case of network name + external_network_settings = {name: True for name in graph.external_networks()} + if 'connect_external' in run_dict: + external_network_settings.update(run_dict['connect_external']) + for netname, connect in external_network_settings.items(): + if connect: + print('Setting external connections for {}'.format(netname)) + network.set_external_connections(netname) + + return network diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/popnode.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/popnode.py new file mode 100644 index 0000000..6288762 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/popnode.py @@ -0,0 +1,158 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from bmtk.simulator.utils.graph import SimNode + +class PopNode(SimNode): + def __init__(self, node_id, graph, network, params): + self._graph = graph + self._node_id = node_id + self._network = network + self._graph_params = params + + self._dynamics_params = {} + self._updated_params = {'dynamics_params': self._dynamics_params} + + self._gids = set() + + @property + def node_id(self): + return self._node_id + + @property + def pop_id(self): + return self._node_id + + @property + def network(self): + return self._network + + @property + def dynamics_params(self): + return self._dynamics_params + + @dynamics_params.setter + def dynamics_params(self, value): + self._dynamics_params = value + + @property + def is_internal(self): + return False + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + elif item in self._graph_params: + return self._graph_params[item] + elif self._model_params is not None: + return self._model_params[item] + + def add_gid(self, gid): + self._gids.add(gid) + + def get_gids(self): + return list(self._gids) + + +class InternalNode(PopNode): + """ + def __init__(self, node_id, graph, network, params): + super(InternalNode, self).__init__(node_id, graph, network, params) + #self._pop_id = node_id + #self._graph = graph + #self._network = network + #self._graph_params = params + #self._dynamics_params = {} + #self._update_params = {'dynamics_params': self._dynamics_params} + """ + @property + def tau_m(self): + return self['tau_m'] + #return self._dynamics_params.get('tau_m', None) + + @tau_m.setter + def tau_m(self, value): + #return self['tau_m'] + self._dynamics_params['tau_m'] = value + + @property + def v_max(self): + return self._dynamics_params.get('v_max', None) + + @v_max.setter + def v_max(self, value): + self._dynamics_params['v_max'] = value + + @property + def dv(self): + return self._dynamics_params.get('dv', None) + + @dv.setter + def dv(self, value): + self._dynamics_params['dv'] = value + + @property + def v_min(self): + return self._dynamics_params.get('v_min', None) + + @v_min.setter + def v_min(self, value): + self._dynamics_params['v_min'] = value + + @property + def is_internal(self): + return True + + def __repr__(self): + props = 'pop_id={}, tau_m={}, v_max={}, v_min={}, dv={}'.format(self.pop_id, self.tau_m, self.v_max, self.v_min, + self.dv) + return 'InternalPopulation({})'.format(props) + + +class ExternalPopulation(PopNode): + def __init__(self, node_id, graph, network, params): + super(ExternalPopulation, self).__init__(node_id, graph, network, params) + self._firing_rate = -1 + if 'firing_rate' in params: + self._firing_rate = params['firing_rate'] + + @property + def firing_rate(self): + return self._firing_rate + + @property + def is_firing_rate_set(self): + return self._firing_rate >= 0 + + @firing_rate.setter + def firing_rate(self, rate): + assert(isinstance(rate, float) and rate >= 0) + self._firing_rate = rate + + @property + def is_internal(self): + return False + + def __repr__(self): + props = 'pop_id={}, firing_rate={}'.format(self.pop_id, self.firing_rate) + return 'ExternalPopulation({})'.format(props) + diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/popsimulator.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/popsimulator.py new file mode 100644 index 0000000..38c660a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/popsimulator.py @@ -0,0 +1,451 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import logging +from six import string_types + +from dipde.internals.internalpopulation import InternalPopulation +from dipde.internals.externalpopulation import ExternalPopulation +from dipde.internals.connection import Connection +import dipde + +from bmtk.simulator.core.simulator import Simulator +from . import config as cfg +from . import utils as poputils +import bmtk.simulator.utils.simulation_inputs as inputs +from bmtk.utils.io import spike_trains, firing_rates + + +class PopSimulator(Simulator): + def __init__(self, graph, dt=0.0001, tstop=0.0, overwrite=True): + self._graph = graph + + self._tstop = tstop + self._dt = dt + self._rates_file = None # name of file where the output is saved + + self.__population_list = [] # list of all populations, internal and external + #self.__population_table = {graph: {} for graph in self._graph.networks} # population lookup by [network][id] + self.__connection_list = [] # list of all connections + self._dipde_network = None # reference to dipde.Network object + + # diction of rates for every external network/pop_id. Prepopulate dictionary with populations whose rates + # have already been manually set, otherwise they should use one of the add_rates_* function. + #self._rates = {network: {pop.pop_id: pop.firing_rate for pop in self._graph.get_populations(network) + # if not pop.is_internal and pop.is_firing_rate_set} + # for network in self._graph.networks} + + """ + for network in self._graph.networks: + for pop in self._graph.get_populations(network): + + if pop.is_internal: + dipde_pop = self.__create_internal_pop(pop) + + else: + if pop.is_firing_rate_set: + rates = pop.firing_rate + """ + + @property + def tstop(self): + return self._tstop + + @tstop.setter + def tstop(self, value): + self._tstop = value + + @property + def dt(self): + return self._dt + + @dt.setter + def dt(self, value): + self._dt = value + + @property + def rates_file(self): + return self._rates_file + + @rates_file.setter + def rates_file(self, value): + self._rates_file = value + + @property + def populations(self): + return self.__population_list + + @property + def connections(self): + return self.__connection_list + + def add_rates_nwb(self, network, nwb_file, trial, force=False): + """Creates external population firing rates from an NWB file. + + Will iterate through a processing trial of an NWB file by assigning gids the population it belongs too and + taking the average firing rate. + + This should be done before calling build_cells(). If a population has already been assigned a firing rate an + error will occur unless force=True. + + :param network: Name of network with external populations. + :param nwb_file: NWB file with spike rates. + :param trial: trial id in NWB file + :param force: will overwrite existing firing rates + """ + existing_rates = self._rates[network] # TODO: validate network exists + # Get all unset, external populations in a network. + network_pops = self._graph.get_populations(network) + selected_pops = [] + for pop in network_pops: + if pop.is_internal: + continue + elif not force and pop.pop_id in existing_rates: + print('Firing rate for {}/{} has already been set, skipping.'.format(network, pop.pop_id)) + else: + selected_pops.append(pop) + + if selected_pops: + # assign firing rates from NWB file + # TODO: + rates_dict = poputils.get_firing_rate_from_nwb(selected_pops, nwb_file, trial) + self._rates[network].update(rates_dict) + + def add_rate_hz(self, network, pop_id, rate, force=False): + """Set the firing rate of an external population. + + This should be done before calling build_cells(). If a population has already been assigned a firing rate an + error will occur unless force=True. + + :param network: name of network with wanted exteranl population + :param pop_id: name/id of external population + :param rate: firing rate in Hz. + :param force: will overwrite existing firing rates + """ + self.__add_rates_validator(network, pop_id, force) + self._rates[network][pop_id] = rate + + def __add_rates_validator(self, network, pop_id, force): + if network not in self._graph.networks: + raise Exception('No network {} found in PopGraph.'.format(network)) + + pop = self._graph.get_population(network, pop_id) + if pop is None: + raise Exception('No population with id {} found in {}.'.format(pop_id, network)) + if pop.is_internal: + raise Exception('Population {} in {} is not an external population.'.format(pop_id, network)) + if not force and pop_id in self._rates[network]: + raise Exception('The firing rate for {}/{} already set and force=False.'.format(network, pop_id)) + + def _get_rate(self, network, pop): + """Gets the firing rate for a given population""" + return self._rates[network][pop.pop_id] + + def build_populations(self): + """Build dipde Population objects from graph nodes. + + To calculate external populations firing rates, it first see if a population's firing rate has been manually + set in the graph. Otherwise it attempts to calulate the firing rate from the call to add_rate_hz, add_rates_NWB, + etc. (which should be called first). + """ + for network in self._graph.networks: + for pop in self._graph.get_populations(network): + if pop.is_internal: + dipde_pop = self.__create_internal_pop(pop) + + else: + dipde_pop = self.__create_external_pop(pop, self._get_rate(network, pop)) + + self.__population_list.append(dipde_pop) + self.__population_table[network][pop.pop_id] = dipde_pop + + def set_logging(self, log_file): + # TODO: move this out of the function, put in io class + if os.path.exists(log_file): + os.remove(log_file) + + # get root logger + logger = logging.getLogger() + for h in list(logger.handlers): + # remove existing handlers that will write to console. + logger.removeHandler(h) + + # creates handler that write to log_file + logging.basicConfig(filename=log_file, filemode='w', level=logging.DEBUG) + + def set_external_connections(self, network_name): + """Sets the external connections for populations in a given network. + + :param network_name: name of external network with External Populations to connect to internal pops. + """ + for edge in self._graph.get_edges(network_name): + # Get source and target populations + src = edge.source + source_pop = self.__population_table[src.network][src.pop_id] + trg = edge.target + target_pop = self.__population_table[trg.network][trg.pop_id] + + # build a connection. + self.__connection_list.append(self.__create_connection(source_pop, target_pop, edge)) + + def set_recurrent_connections(self): + """Initialize internal connections.""" + for network in self._graph.internal_networks(): + for edge in self._graph.get_edges(network): + src = edge.source + source_pop = self.__population_table[src.network][src.pop_id] + trg = edge.target + target_pop = self.__population_table[trg.network][trg.pop_id] + self.__connection_list.append(self.__create_connection(source_pop, target_pop, edge)) + + def run(self, tstop=None): + # TODO: Check if cells/connections need to be rebuilt. + + # Create the networ + dipde_pops = [p.dipde_obj for p in self._graph.populations] + dipde_conns = [c.dipde_obj for c in self._graph.connections] + #print dipde_pops + #print dipde_conns + #exit() + + self._dipde_network = dipde.Network(population_list=dipde_pops, connection_list=dipde_conns) + + #self._dipde_network = dipde.Network(population_list=self._graph.populations, + # connection_list=self._graph.connections) + + if tstop is None: + tstop = self.tstop + + #print tstop, self.dt + #print self._graph.populations + #exit() + print("running simulation...") + self._dipde_network.run(t0=0.0, tf=tstop, dt=self.dt) + # TODO: make record_rates optional? + self.__record_rates() + print("done simulation.") + + def __create_internal_pop(self, params): + # TODO: use getter methods directly in case arguments are not stored in dynamics params + # pop = InternalPopulation(**params.dynamics_params) + pop = InternalPopulation(**params.model_params) + return pop + + def __create_external_pop(self, params, rates): + pop = ExternalPopulation(rates, record=False) + return pop + + def __create_connection(self, source, target, params): + return Connection(source, target, nsyn=params.nsyns, delays=params.delay, weights=params.weight) + + def __record_rates(self): + with open(self._rates_file, 'w') as f: + for pop in self._graph.internal_populations: + if pop.record: + for time, rate in zip(pop.dipde_obj.t_record, pop.dipde_obj.firing_rate_record): + f.write('{} {} {}\n'.format(pop.pop_id, time, rate)) + + ''' + @classmethod + def from_config(cls, configure, graph): + # load the json file or object + if isinstance(configure, basestring): + config = cfg.from_json(configure, validate=True) + elif isinstance(configure, dict): + config = configure + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(configure, type(configure))) + network = cls(graph) + + if 'run' not in config: + raise Exception('Json file is missing "run" entry. Unable to build Bionetwork.') + run_dict = config['run'] + + # Create the output file + if 'output' in config: + out_dict = config['output'] + + rates_file = out_dict.get('rates_file', None) + if rates_file is not None: + # create directory if required + network.rates_file = rates_file + parent_dir = os.path.dirname(rates_file) + if not os.path.exists(parent_dir): + os.makedirs(parent_dir) + + if 'log_file' in out_dict: + log_file = out_dict['log_file'] + network.set_logging(log_file) + + # get network parameters + if 'duration' in run_dict: + network.duration = run_dict['duration'] + + if 'dt' in run_dict: + network.dt = run_dict['dt'] + + # TODO: need to get firing rates before building populations + if 'input' in config: + for netinput in config['input']: + if netinput['type'] == 'external_spikes' and netinput['format'] == 'nwb' and netinput['active']: + # Load external network spike trains from an NWB file. + print('Setting firing rates for {} from {}.'.format(netinput['source_nodes'], netinput['file'])) + network.add_rates_nwb(netinput['source_nodes'], netinput['file'], netinput['trial']) + + if netinput['type'] == 'pop_rate': + print('Setting {}/{} to fire at {} Hz.'.format(netinput['source_nodes'], netinput['pop_id'], netinput['rate'])) + network.add_rate_hz(netinput['source_nodes'], netinput['pop_id'], netinput['rate']) + + # TODO: take input as function with Population argument + + # Build populations + print('Building Populations') + network.build_populations() + + # Build recurrent connections + if run_dict['connect_internal']: + print('Building recurrention connections') + network.set_recurrent_connections() + + # Build external connections. Set connection to default True and turn off only if explicitly stated. + # NOTE: It might be better to set to default off?!?! Need to dicuss what would be more intuitive for the users. + # TODO: ignore case of network name + external_network_settings = {name: True for name in graph.external_networks()} + if 'connect_external' in run_dict: + external_network_settings.update(run_dict['connect_external']) + for netname, connect in external_network_settings.items(): + if connect: + print('Setting external connections for {}'.format(netname)) + network.set_external_connections(netname) + + return network + ''' + + @classmethod + def from_config(cls, configure, graph): + # load the json file or object + if isinstance(configure, string_types): + config = cfg.from_json(configure, validate=True) + elif isinstance(configure, dict): + config = configure + else: + raise Exception('Could not convert {} (type "{}") to json.'.format(configure, type(configure))) + + if 'run' not in config: + raise Exception('Json file is missing "run" entry. Unable to build Bionetwork.') + run_dict = config['run'] + + # Get network parameters + # step time (dt) is set in the kernel and should be passed + overwrite = run_dict['overwrite_output_dir'] if 'overwrite_output_dir' in run_dict else True + print_time = run_dict['print_time'] if 'print_time' in run_dict else False + dt = run_dict['dt'] # TODO: make sure dt exists + tstop = float(config.tstop) / 1000.0 + network = cls(graph, dt=config.dt, tstop=tstop, overwrite=overwrite) + + if 'output_dir' in config['output']: + network.output_dir = config['output']['output_dir'] + + # network.spikes_file = config['output']['spikes_ascii'] + + if 'block_run' in run_dict and run_dict['block_run']: + if 'block_size' not in run_dict: + raise Exception('"block_run" is set to True but "block_size" not found.') + network._block_size = run_dict['block_size'] + + if 'duration' in run_dict: + network.duration = run_dict['duration'] + + graph.io.log_info('Building cells.') + graph.build_nodes() + + graph.io.log_info('Building recurrent connections') + graph.build_recurrent_edges() + + for sim_input in inputs.from_config(config): + node_set = graph.get_node_set(sim_input.node_set) + if sim_input.input_type == 'spikes': + spikes = spike_trains.SpikesInput.load(name=sim_input.name, module=sim_input.module, + input_type=sim_input.input_type, params=sim_input.params) + graph.io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + graph.add_spike_trains(spikes, node_set) + else: + graph.io.log_info('Build virtual cell stimulations for {}'.format(sim_input.name)) + rates = firing_rates.RatesInput(sim_input.params) + graph.add_rates(rates, node_set) + + # Create the output file + if 'output' in config: + out_dict = config['output'] + + rates_file = out_dict.get('rates_file', None) + if rates_file is not None: + rates_file = rates_file if os.path.isabs(rates_file) else os.path.join(config.output_dir, rates_file) + # create directory if required + network.rates_file = rates_file + parent_dir = os.path.dirname(rates_file) + if not os.path.exists(parent_dir): + os.makedirs(parent_dir) + + if 'log_file' in out_dict: + log_file = out_dict['log_file'] + network.set_logging(log_file) + + + # exit() + + + # build the cells + #io.log('Building cells') + #network.build_cells() + + # Build internal connections + #if run_dict['connect_internal']: + # io.log('Creating recurrent connections') + # network.set_recurrent_connections() + + # Build external connections. Set connection to default True and turn off only if explicitly stated. + # NOTE: It might be better to set to default off?!?! Need to dicuss what would be more intuitive for the users. + # TODO: ignore case of network name + + ''' + external_network_settings = {name: True for name in graph.external_networks()} + if 'connect_external' in run_dict: + external_network_settings.update(run_dict['connect_external']) + for netname, connect in external_network_settings.items(): + if connect: + io.log('Setting external connections for {}'.format(netname)) + network.set_external_connections(netname) + + # Build inputs + if 'input' in config: + for netinput in config['input']: + if netinput['type'] == 'external_spikes' and netinput['format'] == 'nwb' and netinput['active']: + network.add_spikes_nwb(netinput['source_nodes'], netinput['file'], netinput['trial']) + + io.log_info('Adding stimulations') + network.make_stims() + ''' + + graph.io.log_info('Network created.') + return network \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/__init__.py new file mode 100644 index 0000000..4d7c64c --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/__init__.py @@ -0,0 +1,28 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from base_schema import PopTypes +import property_schema_ver0 as v0 +import property_schema_ver1 as v1 + +DefaultPropertySchema = v1.PropertySchema() +AIPropertySchema = v0.PropertySchema() \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/base_schema.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/base_schema.py new file mode 100644 index 0000000..cc880a6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/base_schema.py @@ -0,0 +1,50 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class PopTypes: + """Essentially an enum to store the type/group of each cell. It's faster and more robust than doing multiple string + comparisons. + """ + Internal = 0 + External = 1 + Other = 2 # should never really get here + + @staticmethod + def len(): + return 3 + + +class PropertySchema(object): + ####################################### + # For nodes/cells properties + ####################################### + def get_pop_type(self, pop_params): + model_type = pop_params['model_type'].lower() + if model_type == 'virtual' or model_type == 'external': + return PopTypes.External + elif model_type == 'internal': + return PopTypes.Internal + else: + return PopTypes.Unknown + + def get_params_column(self): + raise NotImplementedError() diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/property_schema_ver0.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/property_schema_ver0.py new file mode 100644 index 0000000..6c5c542 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/property_schema_ver0.py @@ -0,0 +1,28 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from base_schema import PopTypes, PropertySchema as BaseSchema + + +class PropertySchema(BaseSchema): + def get_params_column(self): + return 'params_file' diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/property_schema_ver1.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/property_schema_ver1.py new file mode 100644 index 0000000..8794525 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/property_schemas/property_schema_ver1.py @@ -0,0 +1,28 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from base_schema import PropertySchema as BaseSchema + + +class PropertySchema(BaseSchema): + def get_params_column(self): + return 'dynamics_params' diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/sonata_adaptors.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/sonata_adaptors.py new file mode 100644 index 0000000..dcc1300 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/sonata_adaptors.py @@ -0,0 +1,12 @@ +from bmtk.simulator.core.sonata_reader import NodeAdaptor, SonataBaseNode, EdgeAdaptor, SonataBaseEdge + + +class PopNetEdge(SonataBaseEdge): + @property + def syn_weight(self): + return self._edge['syn_weight'] + + +class PopEdgeAdaptor(EdgeAdaptor): + def get_edge(self, sonata_edge): + return PopNetEdge(sonata_edge, self) diff --git a/bmtk-vb/build/lib/bmtk/simulator/popnet/utils.py b/bmtk-vb/build/lib/bmtk/simulator/popnet/utils.py new file mode 100644 index 0000000..ceeeaa3 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/popnet/utils.py @@ -0,0 +1,287 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import math +import warnings +import numpy as np +import pandas as pd +import scipy.interpolate as spinterp +import collections +import h5py +import itertools +import scipy.io as sio +import json +import importlib + +""" +Most of these functions are not being used directly by popnet, but may still be used in some other capcity. These have +been marked as depreciated, and should be removed soon. + + +""" + + +def get_firing_rate_from_nwb(populations, nwb_file, trial): + """Calculates firing rates for an external population""" + h5_file = h5py.File(nwb_file, 'r') + spike_trains_ds = h5_file['processing'][trial]['spike_train'] + + # TODO: look into adding a time window rather than searching for min/max t. + firing_rates = {} + for pop in populations: + spike_counts = [] + spike_min_t = 1.0e30 + spike_max_t = 0.0 + for gid in pop.get_gids(): + spike_train_ds = spike_trains_ds[str(gid)]['data'] + if spike_train_ds is not None and len(spike_train_ds[...]) > 0: + spike_times = spike_train_ds[...] + tmp_min = min(spike_times) + spike_min_t = tmp_min if tmp_min < spike_min_t else spike_min_t + tmp_max = max(spike_times) + spike_max_t = tmp_max if tmp_max > spike_max_t else spike_max_t + spike_counts.append(len(spike_times)) + + # TODO make sure t_diffs is not null and spike_counts has some values + firing_rates[pop.pop_id] = 1.0e03 * np.mean(spike_counts) / (spike_max_t - spike_min_t) + return firing_rates + + +def get_firing_rates(populations, spike_trains): + """Calculates firing rates for an external population""" + #h5_file = h5py.File(nwb_file, 'r') + #spike_trains_ds = h5_file['processing'][trial]['spike_train'] + + # TODO: look into adding a time window rather than searching for min/max t. + firing_rates = {} + for pop in populations: + spike_counts = [] + spike_min_t = 1.0e30 + spike_max_t = 0.0 + for gid in pop.get_gids(): + spike_times = spike_trains.get_spikes(gid) + if spike_times is not None and len(spike_times) > 0: + tmp_min = min(spike_times) + spike_min_t = tmp_min if tmp_min < spike_min_t else spike_min_t + tmp_max = max(spike_times) + spike_max_t = tmp_max if tmp_max > spike_max_t else spike_max_t + spike_counts.append(len(spike_times)) + + # TODO make sure t_diffs is not null and spike_counts has some values + firing_rates[pop.pop_id] = 1.0e03 * np.mean(spike_counts) / (spike_max_t - spike_min_t) + return firing_rates + +############################################# +# Depreciated +############################################# +def list_of_dicts_to_dict_of_lists(list_of_dicts, default=None): + new_dict = {} + for curr_dict in list_of_dicts: + print(curr_dict.keys()) + + +############################################# +# Depreciated +############################################# +class KeyDefaultDict(collections.defaultdict): + def __missing__(self, key): + if self.default_factory is None: + raise KeyError + else: + ret = self[key] = self.default_factory(key) + return ret + + +############################################# +# Depreciated +############################################# +def create_firing_rate_server(t, y): + + warnings.warn('Hard coded bug fix for mindscope council 4/27/15') + t = t/.001/200 + interpolation_callable = spinterp.interp1d(t, y, bounds_error=False, fill_value=0) + return lambda t: interpolation_callable(t) + + +############################################# +# Depreciated +############################################# +def create_nwb_server_file_path(nwb_file_name, nwb_path): + f = h5py.File(nwb_file_name, 'r') + y = f['%s/data' % nwb_path][:] + dt = f['%s/data' % nwb_path].dims[0][0].value + t = np.arange(len(y))*dt + f.close() + return create_firing_rate_server(t, y) + + +############################################# +# Depreciated +############################################# +def get_mesoscale_connectivity_dict(): + + # Extract data into a dictionary: + mesoscale_data_dir = '/data/mat/iSee_temp_shared/packages/mesoscale_connectivity' + nature_data = {} + for mat, side in itertools.product(['W', 'PValue'],['ipsi', 'contra']): + data, row_labels, col_labels = [sio.loadmat(os.path.join(mesoscale_data_dir, '%s_%s.mat' % (mat, side)))[key] + for key in ['data', 'row_labels', 'col_labels']] + for _, (row_label, row) in enumerate(zip(row_labels, data)): + for _, (col_label, val) in enumerate(zip(col_labels, row)): + nature_data[mat, side, str(row_label.strip()), str(col_label.strip())] = val + + return nature_data + + +############################################# +# Depreciated +############################################# +def reorder_columns_in_frame(frame, var): + varlist = [w for w in frame.columns if w not in var] + return frame[var+varlist] + + +############################################# +# Depreciated +############################################# +def population_to_dict_for_dataframe(p): + + black_list = ['firing_rate_record', + 'initial_firing_rate', + 'metadata', + 't_record'] + + json_list = ['p0', 'tau_m'] + + return_dict = {} + p_dict = p.to_dict() + + for key, val in p_dict['metadata'].items(): + return_dict[key] = val + + for key, val in p_dict.items(): + if key not in black_list: + if key in json_list: + val = json.dumps(val) + return_dict[key] = val + + return return_dict + + +############################################# +# Depreciated +############################################# +def network_dict_to_target_adjacency_dict(network_dict): + print(network_dict) + + +############################################# +# Depreciated +############################################# +def population_list_to_dataframe(population_list): + df = pd.DataFrame({'_tmp': [None]}) + for p in population_list: + model_dict = {'_tmp': [None]} + for key, val in population_to_dict_for_dataframe(p).items(): + model_dict.setdefault(key, []).append(val) + df_tmp = pd.DataFrame(model_dict) + + df = pd.merge(df, df_tmp, how='outer') + df.drop('_tmp', inplace=True, axis=1) + return df + + +############################################# +# Depreciated +############################################# +def df_to_csv(df, save_file_name, index=False, sep=' ', na_rep='None'): + df.to_csv(save_file_name, index=index, sep=sep, na_rep=na_rep) + + +############################################# +# Depreciated +############################################# +def population_list_to_csv(population_list, save_file_name): + df = population_list_to_dataframe(population_list) + df_to_csv(df, save_file_name) + + +############################################# +# Depreciated +############################################# +def create_instance(data_dict): + '''Helper function to create an object from a dictionary containing: + + "module": The name of the module containing the class + "class": The name of the class to be used to create the object + ''' + + curr_module, curr_class = data_dict.pop('module'), data_dict.pop('class') + curr_instance = getattr(importlib.import_module(curr_module), curr_class)(**data_dict) + + return curr_instance + + +############################################# +# Depreciated +############################################# +def assert_model_known(model, model_dict): + """Test if a model in in the model_dict; if not, raise UnknownModelError""" + + try: + assert model in model_dict + except: + raise Exception('model {} does not exist.'.format(model)) + + +############################################# +# Depreciated +############################################# +def create_population_list(node_table, model_table): + """Create a population list from the node and model pandas tables""" + + model_dict = {} + for row in model_table.iterrows(): + model = row[1].to_dict() + model_dict[model.pop('model')] = model + + population_list = [] + for row in node_table.iterrows(): + node = row[1].to_dict() + model = node.pop('model') + + # Check if model type in model dict: + assert_model_known(model, model_dict) + + # Clean up: + curr_model = {} + for key, val in model_dict[model].items(): + if not (isinstance(val, float) and math.isnan(val)): + curr_model[key] = val + curr_model.setdefault('metadata', {})['model'] = model + + curr_module, curr_class = curr_model['module'], curr_model['class'] + curr_instance = getattr(importlib.import_module(curr_module), curr_class)(**curr_model) + population_list.append(curr_instance) + + return population_list diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/utils/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/config.py b/bmtk-vb/build/lib/bmtk/simulator/utils/config.py new file mode 100644 index 0000000..aa5ee5e --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/config.py @@ -0,0 +1,438 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import re +import copy +import datetime +from six import string_types + + +from bmtk.simulator.core.io_tools import io + + +def from_json(config_file, validator=None): + """Builds and validates a configuration json file. + + :param config_file: File object or path to a json file. + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + #print(config_file) + #if os.path.isfile(config_file): + #if isinstance(config_file, file): + # conf = json.load(config_file) + if isinstance(config_file, string_types): + conf = json.load(open(config_file, 'r')) + elif isinstance(config_file, dict): + conf = config_file.copy() + else: + raise Exception('{} is not a file or file path.'.format(config_file)) + + # insert file path into dictionary + if 'config_path' not in conf: + conf['config_path'] = os.path.abspath(config_file) + conf['config_dir'] = os.path.dirname(conf['config_path']) + + # Will resolve manifest variables and validate + return from_dict(conf, validator) + + +def from_dict(config_dict, validator=None): + """Builds and validates a configuration json dictionary object. Best to directly use from_json when possible. + + :param config_dict: Dictionary object + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + assert(isinstance(config_dict, dict)) + conf = copy.deepcopy(config_dict) # Since the functions will mutate the dictionary we will copy just-in-case. + + if 'config_path' not in conf: + conf['config_path'] = os.path.join(os.getcwd(), 'tmp_cfg.dict') + conf['config_dir'] = os.path.dirname(conf['config_path']) + + # Build the manifest and resolve variables. + # TODO: Check that manifest exists + manifest = __build_manifest(conf) + conf['manifest'] = manifest + __recursive_insert(conf, manifest) + + # In our work with Blue-Brain it was agreed that 'network' and 'simulator' parts of config may be split up into + # separate files. If this is the case we build each sub-file separately and merge into this one + for childconfig in ['network', 'simulation']: + if childconfig in conf and isinstance(conf[childconfig], string_types): + # Try to resolve the path of the network/simulation config files. If an absolute path isn't used find + # the file relative to the current config file. TODO: test if this will work on windows? + conf_str = conf[childconfig] + conf_path = conf_str if conf_str.startswith('/') else os.path.join(conf['config_dir'], conf_str) + + # Build individual json file and merge into parent. + child_json = from_json(conf_path) + del child_json['config_path'] # we don't want 'config_path' of parent being overwritten. + conf.update(child_json) + + # Run the validator + if validator is not None: + validator.validate(conf) + + return conf + + +def copy_config(conf): + """Copy configuration file to different directory, with manifest variables resolved. + + :param conf: configuration dictionary + """ + output_dir = conf.output_dir + config_name = os.path.basename(conf['config_path']) + output_path = os.path.join(output_dir, config_name) + with open(output_path, 'w') as fp: + out_cfg = conf.copy() + if 'manifest' in out_cfg: + del out_cfg['manifest'] + json.dump(out_cfg, fp, indent=2) + + +def __special_variables(conf): + """A list of preloaded variables to insert into the manifest, containing things like path to run-time directory, + configuration directory, etc. + """ + pre_manifest = dict() + pre_manifest['$workingdir'] = os.path.dirname(os.getcwd()) + if 'config_path' in conf: + pre_manifest['$configdir'] = os.path.dirname(conf['config_path']) # path of configuration file + pre_manifest['$configfname'] = conf['config_path'] + + dt_now = datetime.datetime.now() + pre_manifest['$time'] = dt_now.strftime('%H-%M-%S') + pre_manifest['$date'] = dt_now.strftime('%Y-%m-%d') + pre_manifest['$datetime'] = dt_now.strftime('%Y-%m-%d_%H-%M-%S') + + return pre_manifest + + +def __build_manifest(conf): + """Resolves the manifest section and resolve any internal variables""" + if 'manifest' not in conf: + return __special_variables(conf) + + manifest = conf["manifest"] + resolved_manifest = __special_variables(conf) + resolved_keys = set() + unresolved_keys = set(manifest.keys()) + + # No longer using recursion since that can lead to an infinite loop if the person who writes the config file isn't + # careful. Also added code to allow for ${VAR} format in-case user wants to user "$.../some_${MODEl}_here/..." + while unresolved_keys: + for key in unresolved_keys: + # Find all variables in manifest and see if they can be replaced by the value in resolved_manifest + value = __find_variables(manifest[key], resolved_manifest) + + # If value no longer has variables, and key-value pair to resolved_manifest and remove from unresolved-keys + if value.find('$') < 0: + resolved_manifest[key] = value + resolved_keys.add(key) + + # remove resolved key-value pairs from set, and make sure at every iteration unresolved_keys shrinks to prevent + # infinite loops + n_unresolved = len(unresolved_keys) + unresolved_keys -= resolved_keys + if n_unresolved == len(unresolved_keys): + msg = "Unable to resolve manifest variables: {}".format(unresolved_keys) + raise Exception(msg) + + return resolved_manifest + + +def __recursive_insert(json_obj, manifest): + """Loop through the config and substitute the path variables (e.g.: $MY_DIR) with the values from the manifest + + :param json_obj: A json dictionary object that may contain variables needing to be resolved. + :param manifest: A dictionary of variable values + :return: A new json dictionar config file with variables resolved + """ + if isinstance(json_obj, string_types): + return __find_variables(json_obj, manifest) + + elif isinstance(json_obj, list): + new_list = [] + for itm in json_obj: + new_list.append(__recursive_insert(itm, manifest)) + return new_list + + elif isinstance(json_obj, dict): + for key, val in json_obj.items(): + if key == 'manifest': + continue + json_obj[key] = __recursive_insert(val, manifest) + + return json_obj + + else: + return json_obj + + +def __find_variables(json_str, manifest): + """Replaces variables (i.e. $VAR, ${VAR}) with their values from the manifest. + + :param json_str: a json string that may contain none, one or multiple variable + :param manifest: dictionary of variable lookup values + :return: json_str with resolved variables. Won't resolve variables that don't exist in manifest. + """ + variables = [m for m in re.finditer('\$\{?[\w]+\}?', json_str)] + for var in variables: + var_lookup = var.group() + if var_lookup.startswith('${') and var_lookup.endswith('}'): + # replace ${VAR} with $VAR + var_lookup = "$" + var_lookup[2:-1] + if var_lookup in manifest: + json_str = json_str.replace(var.group(), manifest[var_lookup]) + + return json_str + + +class ConfigDict(dict): + def __init__(self, *args, **kwargs): + self.update(*args, **kwargs) + self._env_built = False + self._io = None + + self._node_set = {} + self._load_node_set() + + @property + def io(self): + if self._io is None: + self._io = io + return self._io + + @io.setter + def io(self, io): + self._io = io + + @property + def run(self): + return self['run'] + + @property + def tstart(self): + return self.run.get('tstart', 0.0) + + @property + def tstop(self): + return self.run['tstop'] + + @property + def dt(self): + return self.run.get('dt', 0.1) + + @property + def spike_threshold(self): + return self.run.get('spike_threshold', -15.0) + + @property + def dL(self): + return self.run.get('dL', 20.0) + + @property + def gid_mappings(self): + return self.get('gid_mapping_file', None) + + @property + def block_step(self): + return self.run.get('nsteps_block', 5000) + + @property + def calc_ecp(self): + return self.run.get('calc_ecp', False) + + @property + def conditions(self): + return self['conditions'] + + @property + def celsius(self): + return self.conditions['celsius'] + + @property + def v_init(self): + return self.conditions['v_init'] + + @property + def path(self): + return self['config_path'] + + @property + def output(self): + return self['output'] + + @property + def output_dir(self): + return self.output['output_dir'] + + @property + def overwrite_output(self): + return self.output.get('overwrite_output_dir', False) + + @property + def log_file(self): + return self.output['log_file'] + + @property + def components(self): + return self.get('components', {}) + + @property + def morphologies_dir(self): + return self.components['morphologies_dir'] + + @property + def synaptic_models_dir(self): + return self.components['synaptic_models_dir'] + + @property + def point_neuron_models_dir(self): + return self.components['point_neuron_models_dir'] + + @property + def mechanisms_dir(self): + return self.components['mechanisms_dir'] + + @property + def biophysical_neuron_models_dir(self): + return self.components['biophysical_neuron_models_dir'] + + @property + def templates_dir(self): + return self.components.get('templates_dir', None) + + @property + def with_networks(self): + return 'networks' in self and len(self.nodes) > 0 + + @property + def networks(self): + return self['networks'] + + @property + def nodes(self): + return self.networks.get('nodes', []) + + @property + def edges(self): + return self.networks.get('edges', []) + + @property + def reports(self): + return self.get('reports', {}) + + @property + def inputs(self): + return self.get('inputs', {}) + + @property + def node_sets(self): + return self._node_set + + @property + def spikes_file(self): + return os.path.join(self.output_dir, self.output['spikes_file']) + + def _load_node_set(self): + if 'node_sets_file' in self.keys(): + node_set_val = self['node_sets_file'] + elif 'node_sets' in self.keys(): + node_set_val = self['node_sets'] + else: + self._node_set = {} + return + + if isinstance(node_set_val, dict): + self._node_set = node_set_val + else: + try: + self._node_set = json.load(open(node_set_val, 'r')) + except Exception as e: + io.log_exception('Unable to load node_sets_file {}'.format(node_set_val)) + + def copy_to_output(self): + copy_config(self) + + def get_modules(self, module_name): + return [report for report in self.reports.values() if report['module'] == module_name] + + def _set_logging(self): + """Check if log-level and/or log-format string is being changed through the config""" + output_sec = self.output + if 'log_format' in output_sec: + self._io.set_log_format(output_sec['log_format']) + + if 'log_level' in output_sec: + self._io.set_log_level(output_sec['log_level']) + + if 'log_to_console' in output_sec: + self._io.log_to_console = output_sec['log_to_console'] + + if 'quiet_simulator' in output_sec and output_sec['quiet_simulator']: + self._io.quiet_simulator() + + def build_env(self): + if self._env_built: + return + + self._set_logging() + self.io.setup_output_dir(self.output_dir, self.log_file, self.overwrite_output) + self.copy_to_output() + self._env_built = True + + @staticmethod + def get_validator(): + raise NotImplementedError + + @classmethod + def from_json(cls, config_file, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_json(config_file, validator)) + + @classmethod + def from_dict(cls, config_dict, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_dict(config_dict, validator)) + + @classmethod + def from_yaml(cls, config_file, validate=False): + raise NotImplementedError + + @classmethod + def load(cls, config_file, validate=False): + # Implement factory method that can resolve the format/type of input configuration. + if isinstance(config_file, dict): + return cls.from_dict(config_file, validate) + elif isinstance(config_file, string_types): + if config_file.endswith('yml') or config_file.endswith('yaml'): + return cls.from_yaml(config_file, validate) + else: + return cls.from_json(config_file, validate) + else: + raise Exception diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/graph.py b/bmtk-vb/build/lib/bmtk/simulator/utils/graph.py new file mode 100644 index 0000000..629ea1d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/graph.py @@ -0,0 +1,408 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import ast +import numpy as np + +import config as cfg +from property_maps import NodePropertyMap, EdgePropertyMap +from bmtk.utils import sonata + + +"""Creates a graph of nodes and edges from multiple network files for all simulators. + +Consists of edges and nodes. All classes are abstract and should be reimplemented by a specific simulator. Also +contains base factor methods for building a network from a config file (or other). +""" + + +class SimEdge(object): + def __init__(self, original_params, dynamics_params): + self._orig_params = original_params + self._dynamics_params = dynamics_params + self._updated_params = {'dynamics_params': self._dynamics_params} + + @property + def edge_type_id(self): + return self._orig_params['edge_type_id'] + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + else: + return self._orig_params[item] + + +class SimNode(object): + def __init__(self, node_id, graph, network, params): + self._node_id = node_id + self._graph = graph + self._graph_params = params + self._node_type_id = params['node_type_id'] + self._network = network + self._updated_params = {} + + self._model_params = {} + + @property + def node_id(self): + return self._node_id + + @property + def node_type_id(self): + return self._node_type_id + + @property + def network(self): + """Name of network node belongs too.""" + return self._network + + @property + def model_params(self): + """Parameters (json file, nml, dictionary) that describe a specific node""" + return self._model_params + + @model_params.setter + def model_params(self, value): + self._model_params = value + + def __contains__(self, item): + return item in self._updated_params or item in self._graph_params + + def __getitem__(self, item): + if item in self._updated_params: + return self._updated_params[item] + else: + return self._graph_params[item] + + +class SimGraph(object): + model_type_col = 'model_type' + + def __init__(self): + self._components = {} # components table, i.e. paths to model files. + self._io = None # TODO: create default io module (without mpi) + + self._node_property_maps = {} + self._edge_property_maps = {} + + self._node_populations = {} + self._internal_populations_map = {} + self._virtual_populations_map = {} + + self._virtual_cells_nid = {} + + self._recurrent_edges = {} + self._external_edges = {} + + @property + def io(self): + return self._io + + @property + def internal_pop_names(self): + return self + + @property + def node_populations(self): + return list(self._node_populations.keys()) + + def get_component(self, key): + """Get the value of item in the components dictionary. + + :param key: name of component + :return: value assigned to component + """ + return self._components[key] + + def add_component(self, key, value): + """Add a component key-value pair + + :param key: name of component + :param value: value + """ + self._components[key] = value + + def _from_json(self, file_name): + return cfg.from_json(file_name) + + def _validate_components(self): + """Make sure various components (i.e. paths) exists before attempting to build the graph.""" + return True + + def _create_nodes_prop_map(self, grp): + return NodePropertyMap() + + def _create_edges_prop_map(self, grp): + return EdgePropertyMap() + + def __avail_model_types(self, population): + model_types = set() + for grp in population.groups: + if self.model_type_col not in grp.all_columns: + self.io.log_exception('model_type is missing from nodes.') + + model_types.update(set(np.unique(grp.get_values(self.model_type_col)))) + return model_types + + def _preprocess_node_types(self, node_population): + # TODO: The following figures out the actually used node-type-ids. For mem and speed may be better to just + # process them all + node_type_ids = node_population.type_ids + # TODO: Verify all the node_type_ids are in the table + node_types_table = node_population.types_table + + # TODO: Convert model_type to a enum + morph_dir = self.get_component('morphologies_dir') + if morph_dir is not None and 'morphology' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + if node_type['morphology'] is None: + continue + # TODO: Check the file exits + # TODO: See if absolute path is stored in csv + node_type['morphology'] = os.path.join(morph_dir, node_type['morphology']) + + if 'dynamics_params' in node_types_table.columns and 'model_type' in node_types_table.columns: + for nt_id in node_type_ids: + node_type = node_types_table[nt_id] + dynamics_params = node_type['dynamics_params'] + if isinstance(dynamics_params, dict): + continue + + model_type = node_type['model_type'] + if model_type == 'biophysical': + params_dir = self.get_component('biophysical_neuron_models_dir') + elif model_type == 'point_process': + params_dir = self.get_component('point_neuron_models_dir') + elif model_type == 'point_soma': + params_dir = self.get_component('point_neuron_models_dir') + else: + # Not sure what to do in this case, throw Exception? + params_dir = self.get_component('custom_neuron_models') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + node_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find node dynamics_params file {}.'.format(params_path)) + + def _preprocess_edge_types(self, edge_pop): + edge_types_table = edge_pop.types_table + edge_type_ids = np.unique(edge_pop.type_ids) + + for et_id in edge_type_ids: + if 'dynamics_params' in edge_types_table.columns: + edge_type = edge_types_table[et_id] + dynamics_params = edge_type['dynamics_params'] + params_dir = self.get_component('synaptic_models_dir') + + params_path = os.path.join(params_dir, dynamics_params) + + # see if we can load the dynamics_params as a dictionary. Otherwise just save the file path and let the + # cell_model loader function handle the extension. + try: + params_val = json.load(open(params_path, 'r')) + edge_type['dynamics_params'] = params_val + except Exception: + # TODO: Check dynamics_params before + self.io.log_exception('Could not find edge dynamics_params file {}.'.format(params_path)) + + # Split target_sections + if 'target_sections' in edge_type: + trg_sec = edge_type['target_sections'] + if trg_sec is not None: + try: + edge_type['target_sections'] = ast.literal_eval(trg_sec) + except Exception as exc: + self.io.log_warning('Unable to split target_sections list {}'.format(trg_sec)) + edge_type['target_sections'] = None + + # Split target distances + if 'distance_range' in edge_type: + dist_range = edge_type['distance_range'] + if dist_range is not None: + try: + # TODO: Make the distance range has at most two values + edge_type['distance_range'] = json.loads(dist_range) + except Exception as e: + try: + edge_type['distance_range'] = [0.0, float(dist_range)] + except Exception as e: + self.io.log_warning('Unable to parse distance_range {}'.format(dist_range)) + edge_type['distance_range'] = None + + def external_edge_populations(self, src_pop, trg_pop): + return self._external_edges.get((src_pop, trg_pop), []) + + def add_nodes(self, sonata_file, populations=None): + """Add nodes from a network to the graph. + + :param sonata_file: A NodesFormat type object containing list of nodes. + :param populations: name/identifier of network. If none will attempt to retrieve from nodes object + """ + nodes = sonata_file.nodes + + selected_populations = nodes.population_names if populations is None else populations + for pop_name in selected_populations: + if pop_name not in nodes: + # when user wants to simulation only a few populations in the file + continue + + if pop_name in self.node_populations: + # Make sure their aren't any collisions + self.io.log_exception('There are multiple node populations with name {}.'.format(pop_name)) + + node_pop = nodes[pop_name] + self._preprocess_node_types(node_pop) + self._node_populations[pop_name] = node_pop + + # Segregate into virtual populations and non-virtual populations + model_types = self.__avail_model_types(node_pop) + if 'virtual' in model_types: + self._virtual_populations_map[pop_name] = node_pop + self._virtual_cells_nid[pop_name] = {} + model_types -= set(['virtual']) + if model_types: + # We'll allow a population to have virtual and non-virtual nodes but it is not ideal + self.io.log_warning('Node population {} contains both virtual and non-virtual nodes which can ' + + 'cause memory and build-time inefficency. Consider separating virtual nodes ' + + 'into their own population'.format(pop_name)) + + if model_types: + self._internal_populations_map[pop_name] = node_pop + + self._node_property_maps[pop_name] = {grp.group_id: self._create_nodes_prop_map(grp) + for grp in node_pop.groups} + + def build_nodes(self): + raise NotImplementedError + + def build_recurrent_edges(self): + raise NotImplementedError + + def add_edges(self, sonata_file, populations=None, source_pop=None, target_pop=None): + """ + + :param sonata_file: + :param populations: + :param source_pop: + :param target_pop: + :return: + """ + edges = sonata_file.edges + selected_populations = edges.population_names if populations is None else populations + + for pop_name in selected_populations: + if pop_name not in edges: + continue + + edge_pop = edges[pop_name] + self._preprocess_edge_types(edge_pop) + + # Check the source nodes exists + src_pop = source_pop if source_pop is not None else edge_pop.source_population + is_internal_src = src_pop in self._internal_populations_map.keys() + is_external_src = src_pop in self._virtual_populations_map.keys() + + trg_pop = target_pop if target_pop is not None else edge_pop.target_population + is_internal_trg = trg_pop in self._internal_populations_map.keys() + + if not is_internal_trg: + self.io.log_exception(('Node population {} does not exists (or consists of only virtual nodes). ' + + '{} edges cannot create connections.').format(trg_pop, pop_name)) + + if not (is_internal_src or is_external_src): + self.io.log_exception('Source node population {} not found. Please update {} edges'.format(src_pop, + pop_name)) + if is_internal_src: + if trg_pop not in self._recurrent_edges: + self._recurrent_edges[trg_pop] = [] + self._recurrent_edges[trg_pop].append(edge_pop) + + if is_external_src: + if trg_pop not in self._external_edges: + self._external_edges[(src_pop, trg_pop)] = [] + self._external_edges[(src_pop, trg_pop)].append(edge_pop) + + self._edge_property_maps[pop_name] = {grp.group_id: self._create_edges_prop_map(grp) + for grp in edge_pop.groups} + + @classmethod + def from_config(cls, conf, **properties): + """Generates a graph structure from a json config file or dictionary. + + :param conf: name of json config file, or a dictionary with config parameters + :param properties: optional properties. + :return: A graph object of type cls + """ + graph = cls(**properties) + if isinstance(conf, basestring): + config = graph._from_json(conf) + elif isinstance(conf, dict): + config = conf + else: + graph.io.log_exception('Could not convert {} (type "{}") to json.'.format(conf, type(conf))) + + run_dict = config['run'] + if 'spike_threshold' in run_dict: + # TODO: FIX, spike-thresholds should be set by simulation code, allow for diff. values based on node-group + graph.spike_threshold = run_dict['spike_threshold'] + if 'dL' in run_dict: + graph.dL = run_dict['dL'] + + if not config.with_networks: + graph.io.log_exception('Could not find any network files. Unable to build network.') + + # load components + for name, value in config.components.items(): + graph.add_component(name, value) + graph._validate_components() + + # load nodes + for node_dict in config.nodes: + nodes_net = sonata.File(data_files=node_dict['nodes_file'], data_type_files=node_dict['node_types_file']) + graph.add_nodes(nodes_net) + + # load edges + for edge_dict in config.edges: + target_network = edge_dict['target'] if 'target' in edge_dict else None + source_network = edge_dict['source'] if 'source' in edge_dict else None + edge_net = sonata.File(data_files=edge_dict['edges_file'], data_type_files=edge_dict['edge_types_file']) + graph.add_edges(edge_net, source_pop=target_network, target_pop=source_network) + + ''' + graph.io.log_info('Building cells.') + graph.build_nodes() + + graph.io.log_info('Building recurrent connections') + graph.build_recurrent_edges() + ''' + + return graph diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/io.py b/bmtk-vb/build/lib/bmtk/simulator/utils/io.py new file mode 100644 index 0000000..b6e5e5c --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/io.py @@ -0,0 +1,54 @@ +import os +import shutil +import logging + + +class IOUtils(object): + def __init__(self): + self.mpi_rank = 0 + self.mpi_size = 1 + + self._log_format = '%(asctime)s [%(levelname)s] %(message)s' + self._logger = logging.getLogger() + self.set_console_logging() + + @property + def logger(self): + return None + + def set_console_logging(self): + pass + + def barrier(self): + pass + + def quit(self): + exit(1) + + def setup_output_dir(self, config_dir, log_file, overwrite=True): + if self.mpi_rank == 0: + # Create output directory + if os.path.exists(config_dir): + if overwrite: + shutil.rmtree(config_dir) + else: + self.log_exception('ERROR: Directory already exists (remove or set to overwrite).') + os.makedirs(config_dir) + + # Create log file + if log_file is not None: + file_logger = logging.FileHandler(log_file) + file_logger.setFormatter(self._log_format) + self.logger.addHandler(file_logger) + self.log_info('Created log file') + + self.barrier() + + def log_info(self, message, all_ranks=False): + print(message) + + def log_warning(self, message, all_ranks=False): + print(message) + + def log_exception(self, message): + raise Exception(message) diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/load_spikes.py b/bmtk-vb/build/lib/bmtk/simulator/utils/load_spikes.py new file mode 100644 index 0000000..8c16caf --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/load_spikes.py @@ -0,0 +1,91 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +import numpy as np +import os +import datetime + + +def load_spikes_ascii(file_name): + ''' + Load ascii spike file + ''' + t = os.path.getmtime(file_name) + print(file_name, "modified on:", datetime.datetime.fromtimestamp(t)) + spk_ts,spk_gids = np.loadtxt(file_name, + dtype='float32,int', + unpack=True) + + spk_ts=spk_ts*1E-3 + + print('loaded spikes from ascii') + + return [spk_ts,spk_gids] + + +def load_spikes_h5(file_name): + ''' + Load ascii spike file + ''' + + t = os.path.getmtime(file_name) + print(file_name, "modified on:", datetime.datetime.fromtimestamp(t)) + + with h5py.File(file_name,'r') as h5: + + spk_ts=h5["time"][...]*1E-3 + spk_gids=h5["gid"][...] + + + print('loaded spikes from hdf5') + + return [spk_ts,spk_gids] + + +def load_spikes_nwb(file_name,trial_name): + + ''' + Load spikes from the nwb file + + Returns: + ------- + + spike_times: list + spike_gids: list + ''' + f5 = h5py.File(file_name, 'r') + + + spike_trains_handle = f5['processing/%s/spike_train' % trial_name] # nwb.SpikeTrain.get_processing(f5,'trial_0') + + spike_times = [] + spike_gids = [] + + for gid in spike_trains_handle.keys(): + + times_gid = spike_trains_handle['%d/data' %int(gid)][:] + spike_times.extend(times_gid) + spike_gids.extend([int(gid)]*len(times_gid)) + + return [np.array(spike_times)*1E-3,np.array(spike_gids)] + diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/nwb.py b/bmtk-vb/build/lib/bmtk/simulator/utils/nwb.py new file mode 100644 index 0000000..4d18d16 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/nwb.py @@ -0,0 +1,530 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import copy +import numpy as np +import os +import h5py +import time +import uuid +import tempfile +from bmtk.analyzer.visualization.widgets import PlotWidget, MovieWidget + +__version__ = '0.1.0' + +allowed_dimensions = {'firing_rate': ('hertz',), + 'time': ('second', 'millisecond'), + 'brightness': ('intensity',), + 'distance': ('pixel',), + 'index': ('gid',), + 'intensity': ('bit',None), + 'voltage': ('volt',), + 'current': ('ampere',), + None: (None,), + 'dev': ('dev',)} + +allowed_groups = {'firing_rate': ('firing_rate',), + 'spike_train': ('index', 'time'), + 'grayscale_movie': ('intensity',), + 'time_series': ('voltage', 'current'), + 'dev': ('dev',)} + +top_level_data = ['file_create_date', + 'stimulus', + 'acquisition', + 'analysis', + 'processing', + 'epochs', + 'general', + 'session_description', + 'nwb_version', + 'identifier'] + + +def open_file(file_name): + return h5py.File(file_name) + + +class Scale(object): + def __init__(self, scale_range, dimension, unit): + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + + self.scale_range = scale_range + self.dimension = dimension + self.unit = unit + self._hdf5_location = None + + def __eq__(self, other): + d = self.dimension == other.dimension + u = self.unit == other.unit + s = np.allclose(self.scale_range, other.scale_range) + return d and u and s + + @ property + def data(self): + return self.scale_range + + +class DtScale(object): + def __init__(self, dt, dimension, unit): + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + + self.dt = dt + self.dimension = dimension + self.unit = unit + self._hdf5_location = None + + def __eq__(self, other): + d = self.dimension == other.dimension + u = self.unit == other.unit + s = np.allclose(self.scale_range, other.scale_range) + return d and u and s + + @ property + def data(self): + return self.dt + + +class NullScale(object): + + def __init__(self): + self._hdf5_location = None + self.data = None + self.dimension = None + self.unit = None + + +class Data(object): + def __init__(self, data, dimension, unit, scales, metadata): + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + if isinstance(scales, (Scale, DtScale)): + assert len(data.shape) == 1 + scales = (scales,) + + for key in metadata.iterkeys(): + assert isinstance(key, (str, unicode)) + for ii, scale in enumerate(scales): + if isinstance(scale, Scale): + assert len(scale.scale_range) == data.shape[ii] + elif isinstance(scale, DtScale): + assert isinstance(scale.dt, (float, np.float)) and scale.dt > 0 + else: + raise Exception + + if len(scales) == 0: + scales = [NullScale()] + + metadata = copy.copy(metadata) + self.data = data + self.scales = scales + self.dimension = dimension + self.unit = unit + self.metadata = metadata + self._hdf5_location = None + + def __eq__(self, other): + da = np.allclose(self.data, other.data) + d = self.dimension == other.dimension + u = self.unit == other.unit + s = [s1 == s2 for s1, s2 in zip(self.scales, other.scales)].count(True) == len(self.scales) + if len(self.metadata) != len(other.metadata): + m = False + else: + try: + sum = 0 + for key in self.metadata.keys(): + sum += other.metadata[key] == self.metadata[key] + assert sum == len(self.metadata) + m = True + except: + m = False + return da and d and u and s and m + + @staticmethod + def _get_from_group(object_class, parent_group, group_name, ii=0): + + data_group = parent_group['%s/%s' % (group_name, ii)] + data, scales, dimension, unit, metadata = _get_data(data_group) + + assert dimension in allowed_groups[object_class.group] + + if unit == "None": + unit = None + scale_list = [] + for scale in scales: + if scale.attrs['type'] == 'Scale': + curr_scale = Scale(scale, scale.attrs['dimension'], scale.attrs['unit']) + elif scale.attrs['type'] == 'DtScale': + curr_scale = DtScale(float(scale.value), scale.attrs['dimension'], scale.attrs['unit']) + elif scale.attrs['type'] == 'NullScale': + curr_scale = None + else: + raise Exception + if curr_scale is not None: + scale_list.append(curr_scale) + + if len(scale_list) == 1: + scale_list = scale_list[0] + + return object_class(data, dimension=dimension, unit=unit, scale=scale_list, metadata=metadata) + + def add_to_stimulus(self, f, compression='gzip', compression_opts=4): + self._add_to_group(f, 'stimulus', self.__class__.group, compression=compression, + compression_opts=compression_opts) + + @classmethod + def get_stimulus(cls, f, ii=None): + if ii is None: + return_data = [cls.get_stimulus(f, ii) for ii in range(len(f['stimulus/%s' % cls.group]))] + if len(return_data) == 1: + return_data = return_data[0] + return return_data + else: + return Data._get_from_group(cls, f['stimulus'], cls.group, ii=ii) + + def add_to_acquisition(self, f, compression='gzip', compression_opts=4): + self._add_to_group(f, 'acquisition', self.__class__.group, compression=compression, + compression_opts=compression_opts) + + @classmethod + def get_acquisition(cls, f, ii=None): + if ii is None: + return_data = [cls.get_acquisition(f, ii) for ii in range(len(f['acquisition/%s' % cls.group]))] + if len(return_data) == 1: + return_data = return_data[0] + return return_data + + else: + return Data._get_from_group(cls, f['acquisition'], cls.group, ii=ii) + + def add_to_processing(self, f, processing_submodule_name): + if processing_submodule_name not in f['processing']: + f['processing'].create_group(processing_submodule_name) + return self._add_to_group(f, 'processing/%s' % processing_submodule_name, self.__class__.group) + + @classmethod + def get_processing(cls, f, subgroup_name, ii=None): + if ii is None: + return_data = {} + for ii in range(len(f['processing/%s/%s' % (subgroup_name, cls.group)])): + return_data[ii] = cls.get_processing(f, subgroup_name, ii) + return return_data + + else: + return Data._get_from_group(cls, f['processing/%s' % subgroup_name], cls.group, ii=ii) + + def add_to_analysis(self, f, analysis_submodule_name): + if analysis_submodule_name not in f['analysis']: + f['analysis'].create_group(analysis_submodule_name) + return self._add_to_group(f, 'analysis/%s' % analysis_submodule_name, self.__class__.group) + + @classmethod + def get_analysis(cls, f, subgroup_name, ii=None): + if ii is None: + return [cls.get_analysis(f, ii, subgroup_name) + for ii in range(len(f['analysis/%s/%s' % (subgroup_name, cls.group)]))] + else: + return Data._get_from_group(cls, f['analysis/%s' % subgroup_name], cls.group, ii=ii) + + def _add_to_group(self, f, parent_name, group_name, compression='gzip', compression_opts=4): + assert group_name in allowed_groups + assert self.dimension in allowed_groups[group_name] + try: + parent_group = f[parent_name] + except ValueError: + try: + file_name = f.filename + raise Exception('Parent group:%s not found in file %s' % parent_name, file_name) + except ValueError: + raise Exception('File not valid: %s' % f) + + if self.__class__.group in parent_group: + subgroup = parent_group[self.__class__.group] + int_group_name = str(len(subgroup)) + else: + subgroup = parent_group.create_group(self.__class__.group) + int_group_name = '0' + + # Create external link: + if isinstance(self.data, h5py.Dataset): + if subgroup.file == self.data.file: + raise NotImplementedError + else: + return _set_data_external_link(subgroup, int_group_name, self.data.parent) + else: + dataset_group = subgroup.create_group(int_group_name) + + # All this to allow do shared scale management: + scale_group = None + scale_list = [] + for ii, scale in enumerate(self.scales): + if isinstance(scale, (Scale, DtScale, NullScale)): + if scale._hdf5_location is None: + if scale_group is None: + scale_group = dataset_group.create_group('scale') + curr_scale = _set_scale(scale_group, 'dimension_%s' % ii, scale.data, scale.dimension, + scale.unit, scale.__class__.__name__) + scale._hdf5_location = curr_scale + else: + curr_scale = _set_scale(scale_group, 'dimension_%s' % ii, scale.data, scale.dimension, + scale.unit, scale.__class__.__name__) + scale._hdf5_location = curr_scale + else: + curr_scale = scale._hdf5_location + elif isinstance(scale, h5py.Dataset): + curr_scale = scale + else: + raise Exception + + scale_list.append(curr_scale) + + _set_data(subgroup, dataset_group.name, self.data, scale_list, self.dimension, self.unit, + metadata=self.metadata, compression=compression, compression_opts=compression_opts) + + +class FiringRate(Data): + group = 'firing_rate' + + def __init__(self, data, **kwargs): + dimension = 'firing_rate' + unit = 'hertz' + scale = kwargs.get('scale') + metadata = kwargs.get('metadata', {}) + assert isinstance(scale, (Scale, DtScale)) + super(FiringRate, self).__init__(data, dimension, unit, scale, metadata) + + def get_widget(self, **kwargs): + rate_data = self.data[:] + t_range = self.scales[0].data[:] + return PlotWidget(t_range, rate_data, metadata=self.metadata, **kwargs) + + +class Dev(Data): + group = 'dev' + + def __init__(self, data, **kwargs): + dimension = kwargs.get('dimension') + unit = kwargs.get('unit') + scale = kwargs.get('scale') + metadata = kwargs.get('metadata', {}) + + super(Dev, self).__init__(data, dimension, unit, scale, metadata) + + +class TimeSeries(Data): + group = 'time_series' + + def __init__(self, data, **kwargs): + dimension = kwargs.get('dimension') + unit = kwargs.get('unit') + scale = kwargs.get('scale') + metadata = kwargs.get('metadata', {}) + + assert isinstance(scale, (Scale, DtScale)) + assert scale.dimension == 'time' + super(TimeSeries, self).__init__(data, dimension, unit, scale, metadata) + + +class SpikeTrain(Data): + group = 'spike_train' + + def __init__(self, data, **kwargs): + scales = kwargs.get('scale',[]) + unit = kwargs.get('unit', 'gid') + metadata = kwargs.get('metadata',{}) + + if isinstance(scales, Scale): + super(SpikeTrain, self).__init__(data, 'index', unit, scales, metadata) + elif len(scales) == 0: + assert unit in allowed_dimensions['time'] + scales = [] + super(SpikeTrain, self).__init__(data, 'time', unit, scales, metadata) + else: + assert len(scales) == 1 and isinstance(scales[0], Scale) + super(SpikeTrain, self).__init__(data, 'index', unit, scales, metadata) + + +class GrayScaleMovie(Data): + group = 'grayscale_movie' + + def __init__(self, data, **kwargs): + dimension = 'intensity' + unit = kwargs.get('unit', None) + scale = kwargs.get('scale') + metadata = kwargs.get('metadata', {}) + + super(GrayScaleMovie, self).__init__(data, dimension, unit, scale, metadata) + + def get_widget(self, ax=None): + data = self.data[:] + t_range = self.scales[0].data[:] + return MovieWidget(t_range=t_range, data=data, ax=ax, metadata=self.metadata) + + +def get_temp_file_name(): + f = tempfile.NamedTemporaryFile(delete=False) + temp_file_name = f.name + f.close() + os.remove(f.name) + return temp_file_name + + +def create_blank_file(save_file_name=None, force=False, session_description='', close=False): + + if save_file_name is None: + save_file_name = get_temp_file_name() + + if not force: + f = h5py.File(save_file_name, 'w-') + else: + if os.path.exists(save_file_name): + os.remove(save_file_name) + f = h5py.File(save_file_name, 'w') + + f.create_group('acquisition') + f.create_group('analysis') + f.create_group('epochs') + f.create_group('general') + f.create_group('processing') + f.create_group('stimulus') + + f.create_dataset("file_create_date", data=np.string_(time.ctime())) + f.create_dataset("session_description", data=session_description) + f.create_dataset("nwb_version", data='iSee_%s' % __version__) + f.create_dataset("identifier", data=str(uuid.uuid4())) + + if close: + f.close() + else: + return f + + +def assert_subgroup_exists(child_name, parent): + try: + assert child_name in parent + except: + raise RuntimeError('Group: %s has no subgroup %s' % (parent.name, child_name)) + + +def _set_data_external_link(parent_group, dataset_name, data): + parent_group[dataset_name] = h5py.ExternalLink(data.file.filename, data.name) + + +def _set_scale_external_link(parent_group, name, scale): + print(parent_group, name, scale) + print(scale.file.filename, scale.name) + parent_group[name] = h5py.ExternalLink(scale.file.filename, scale.name) + return parent_group[name] + + +def _set_data(parent_group, dataset_name, data, scales, dimension, unit, force=False, metadata={}, compression='gzip', + compression_opts=4): + # Check inputs: + if isinstance(scales, h5py.Dataset): + scales = (scales,) + else: + assert isinstance(scales, (list, tuple)) + + assert data.ndim == len(scales) + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + for ii, scale in enumerate(scales): + assert len(scale.shape) in (0, 1) + check_dimension = str(scale.attrs['dimension']) + if check_dimension == 'None': + check_dimension = None + check_unit = scale.attrs['unit'] + if check_unit == 'None': + check_unit = None + assert check_dimension in allowed_dimensions + assert check_unit in allowed_dimensions[check_dimension] + if len(scale.shape) == 1: + assert len(scale) == data.shape[ii] or len(scale) == 0 + + if dataset_name not in parent_group: + dataset_group = parent_group.create_group(dataset_name) + else: + dataset_group = parent_group[dataset_name] + + for key, val in metadata.iteritems(): + assert key not in dataset_group.attrs + dataset_group.attrs[key] = val + + if 'data' in dataset_group: + if not force: + raise IOError('Field "stimulus" of %s is not empty; override with force=True' % parent_group.name) + else: + del dataset_group['data'] + + dataset = dataset_group.create_dataset(name='data', data=data, compression=compression, + compression_opts=compression_opts) + + for ii, scale in enumerate(scales): + dataset.dims[ii].label = scale.attrs['dimension'] + dataset.dims[ii].attach_scale(scale) + + dataset.attrs.create('dimension', str(dimension)) + dataset.attrs.create('unit', str(unit)) + + return dataset + + +def _set_scale(parent_group, name, scale, dimension, unit, scale_class_name): + assert dimension in allowed_dimensions + assert unit in allowed_dimensions[dimension] + + if scale is None: + scale = parent_group.create_dataset(name=name, shape=(0,)) + else: + scale = np.array(scale) + assert scale.ndim in (0, 1) + scale = parent_group.create_dataset(name=name, data=scale) + scale.attrs['dimension'] = str(dimension) + scale.attrs['unit'] = str(unit) + scale.attrs['type'] = scale_class_name + + return scale + + +def _get_data(dataset_group): + data = dataset_group['data'] + dimension = dataset_group['data'].attrs['dimension'] + unit = dataset_group['data'].attrs['unit'] + scales = tuple([dim[0] for dim in dataset_group['data'].dims]) + metadata = dict(dataset_group.attrs) + + return data, scales, dimension, unit, metadata + + +def get_stimulus(f): + category = 'stimulus' + for parent_group in f[category]: + for data_group in f[category][parent_group]: + print(f[category][parent_group][data_group]) + + +def add_external_links(parent_group, external_file_name, external_group_name_list=top_level_data): + for subgroup in external_group_name_list: + parent_group[subgroup] = h5py.ExternalLink(external_file_name, subgroup) diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/property_maps.py b/bmtk-vb/build/lib/bmtk/simulator/utils/property_maps.py new file mode 100644 index 0000000..9a22515 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/property_maps.py @@ -0,0 +1,7 @@ +class NodePropertyMap(object): + pass + + +class EdgePropertyMap(object): + pass + diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/sim_validator.py b/bmtk-vb/build/lib/bmtk/simulator/utils/sim_validator.py new file mode 100644 index 0000000..447dda1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/sim_validator.py @@ -0,0 +1,126 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +from jsonschema import Draft4Validator +from jsonschema.exceptions import ValidationError +import pandas as pd + + +class SimConfigValidator(Draft4Validator): + """ + A JSON Schema validator class that will store a schema (passed into the constructor) and validate a json file. + It has all the functionality of the JSONSchema format, plus includes special types and parameters like making + sure a value is a file or directory type, checking csv files, etc. + + To Use: + validator = SimConfigValidator(json_schema.json) + validator.validate(file.json) + """ + + def __init__(self, schema, types=(), resolver=None, format_checker=None, file_formats=()): + super(SimConfigValidator, self).__init__(schema, types, resolver, format_checker) + + # custom parameter + self.VALIDATORS["exists"] = self._check_path + + self._file_formats = {} # the "file_format" property the validity of a (non-json) file. + for (name, schema) in file_formats: + self._file_formats[name] = self._parse_file_formats(schema) + self.VALIDATORS["file_format"] = self._validate_file + + def is_type(self, instance, dtype): + # override type since checking for file and directory type is potentially more complicated. + if dtype == "directory": + return self._is_directory_type(instance) + + elif dtype == "file": + return self._is_file_type(instance) + + else: + return super(SimConfigValidator, self).is_type(instance, dtype) + + def _is_directory_type(self, instance): + """Check if instance value is a valid directory file path name + + :param instance: string that represents a directory path + :return: True if instance is a valid dir path (even if it doesn't exists). + """ + # Always return true for now, rely on the "exists" property (_check_path) to actual determine if file exists. + # TODO: check that instance string is a valid path string, even if path doesn't yet exists. + return True + + def _is_file_type(self, instance): + """Check if instance value is a valid file path. + + :param instance: string of file path + :return: True if instance is a valid file path (but doesn't necessary exists), false otherwise. + """ + # Same issue as with _is_directory_type + return True + + def _parse_file_formats(self, schema_file): + # Open the schema file and based on "file_type" property create a Format validator + schema = json.load(open(schema_file, 'r')) + if schema['file_type'] == 'csv': + return self._CSVFormat(schema) + else: + return Exception("No format found") + + @staticmethod + def _check_path(validator, schema_bool, path, schema): + """Makes sure a file/directory exists or doesn't based on the "exists" property in the schema + + :param validator: + :param schema_bool: True means file must exists, False means file should not exists + :param path: path of the file + :param schema: + :return: True if schema is satisfied. + """ + assert(schema['type'] == 'directory' or schema['type'] == 'file') + path_exists = os.path.exists(path) + if path_exists != schema_bool: + raise ValidationError("{} {} exists.".format(path, "already" if path_exists else "does not")) + + def _validate_file(self, validator, file_format, file_path, schema): + file_validator = self._file_formats.get(file_format, None) + if file_validator is None: + raise ValidationError("Could not find file validator {}".format(file_format)) + + if not file_validator.check(file_path): + raise ValidationError("File {} could not be validated against {}.".format(file_path, file_format)) + + # A series of validators for indivdiual types of files. All of them should have a check(file) function that returns + # true only when it is formated correctly. + class _CSVFormat(object): + def __init__(self, schema): + self._properties = schema['file_properties'] + self._required_columns = [header for header, props in schema['columns'].items() if props['required']] + + def check(self, file_name): + csv_headers = set(pd.read_csv(file_name, nrows=0, **self._properties).columns) + for col in self._required_columns: + if col not in csv_headers: + return False + + return True diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/simulation_inputs.py b/bmtk-vb/build/lib/bmtk/simulator/utils/simulation_inputs.py new file mode 100644 index 0000000..bdd1588 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/simulation_inputs.py @@ -0,0 +1,77 @@ + +class SimInput(object): + registry = {} # For factory function + + def __init__(self, input_name, input_type, module, params): + self.name = input_name + self.input_type = input_type + self.module = module + self.params = params.copy() + + # Remove the 'module' and 'input_type' from the params since user should access it through the variable + for param_key in ['module', 'input_type']: + if param_key in self.params: + del self.params[param_key] + + # Special variable, not a part of standard but still want for ease of testing + if 'enabled' in params: + self.enabled = params['enabled'] + del params['enabled'] + else: + self.enabled = True + + # Fill in missing values with default (as specified by the subclass) + for var_name, default_val in self._get_defaults(): + if var_name not in self.params: + self.params[var_name] = default_val + + # Check there are no missing parameters + + @property + def node_set(self): + return self.params.get('node_set', None) + + def _get_defaults(self): + return [] + + @classmethod + def build(cls, input_name, params): + params = params.copy() + if 'module' not in params: + raise Exception('inputs setting {} does not specify the "module".'.format(input_name)) + + if 'input_type' not in params: + raise Exception('inputs setting {} does not specify the "input_type".'.format(input_name)) + + module_name = params['module'] + input_type = params['input_type'] + module_cls = SimInput.registry.get(module_name, SimInput) + + return module_cls(input_name, input_type, module_name, params) + + @classmethod + def register_module(cls, subclass): + # For factory, register subclass based on the module name(s) + assert(issubclass(subclass, cls)) + mod_registry = cls.registry + mod_list = subclass.avail_modules() + modules = mod_list if isinstance(mod_list, list) else [mod_list] + for mod_name in modules: + if mod_name in mod_registry: + raise Exception('Multiple modules named {}'.format(mod_name)) + mod_registry[mod_name] = subclass + + return subclass + + +def from_config(cfg): + inputs_list = [] + for input_name, input_params in cfg.inputs.items(): + input_setting = SimInput.build(input_name, input_params) + if input_setting.enabled: + inputs_list.append(input_setting) + + return inputs_list + + + diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/simulation_reports.py b/bmtk-vb/build/lib/bmtk/simulator/utils/simulation_reports.py new file mode 100644 index 0000000..a7bffd9 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/simulation_reports.py @@ -0,0 +1,284 @@ +import os + + +class SimReport(object): + default_dir = '.' + registry = {} # Used by factory to keep track of subclasses + + def __init__(self, name, module, params): + self.report_name = name + self.module = module + self.params = params + + # Not part of standard, just want a quick way to turn off modules + if 'enabled' in params: + self.enabled = params['enabled'] + del params['enabled'] + else: + self.enabled = True + + # Set default parameter values (when not explicity stated). Should occur on a module-by-module basis + self._set_defaults() + + @property + def node_set(self): + return self.params.get('cells', 'all') + + def _set_defaults(self): + for var_name, default_val in self._get_defaults(): + if var_name not in self.params: + self.params[var_name] = default_val + + def _get_defaults(self): + """Should be overwritten by subclass with list of (var_name, default_val) tuples.""" + return [] + + @staticmethod + def avail_modules(): + # Return a string (or list of strings) to identify module name for each subclass + raise NotImplementedError + + @classmethod + def build(cls, report_name, params): + """Factory method to get the module subclass, using the params (particularlly the 'module' value, which is + required). If there is no registered subclass a generic SimReport object will be returned + + :param report_name: name of report + :param params: parameters of report + :return: A SimReport (or subclass) object with report parameters parsed out. + """ + params = params.copy() + if 'module' not in params: + raise Exception('report {} does not specify the module.'.format(report_name)) + + module_name = params['module'] + del params['module'] + module_cls = SimReport.registry.get(module_name, SimReport) + return module_cls(report_name, module_name, params) + + @classmethod + def register_module(cls, subclass): + # For factory, register subclass based on the module name(s) + assert(issubclass(subclass, cls)) + mod_registry = cls.registry + mod_list = subclass.avail_modules() + modules = mod_list if isinstance(mod_list, list) else [mod_list] + for mod_name in modules: + if mod_name in mod_registry: + raise Exception('Multiple modules named {}'.format(mod_name)) + mod_registry[mod_name] = subclass + + return subclass + + +@SimReport.register_module +class MembraneReport(SimReport, object): + def __init__(self, report_name, module, params): + super(MembraneReport, self).__init__(report_name, module, params) + # Want variable_name option to allow for singular of list of params + variables = params['variable_name'] + if isinstance(variables, list): + self.params['variable_name'] = variables + else: + self.params['variable_name'] = [variables] + self.variables = self.params['variable_name'] + + self.params['buffer_data'] = self.params.pop('buffer') + + if self.params['transform'] and not isinstance(self.params['transform'], dict): + self.params['transform'] = {var_name: self.params['transform'] for var_name in self.variables} + + def _get_defaults(self): + # directory for saving temporary files created during simulation + tmp_dir = self.default_dir + + # Find the report file name. Either look for "file_name" parameter, or else it is .h5 + if 'file_name' in self.params: + file_name = self.params['file_name'] + elif self.report_name.endswith('.h5') or self.report_name.endswith('.hdf') \ + or self.report_name.endswith('.hdf5'): + file_name = self.report_name # Check for case report.h5.h5 + else: + file_name = '{}.h5'.format(self.report_name) + + return [('cells', 'biophysical'), ('sections', 'all'), ('tmp_dir', tmp_dir), ('file_name', file_name), + ('buffer', True), ('transform', {})] + + def add_variables(self, var_name, transform): + self.params['variable_name'].extend(var_name) + self.params['transform'].update(transform) + + def can_combine(self, other): + def param_eq(key): + return self.params.get(key, None) == other.params.get(key, None) + + return param_eq('cells') and param_eq('sections') and param_eq('file_name') and param_eq('buffer') + + @staticmethod + def avail_modules(): + return 'membrane_report' + + @classmethod + def build(cls, name, params): + report = cls(name) + report.cells = params.get('cells', 'biophysical') + report.sections = params.get('sections', 'all') + + if 'file_name' in params: + report.file_name = params['file_name'] + report.tmp_dir = os.path.dirname(os.path.realpath(report.file_name)) + else: + report.file_name = os.path.join(cls.default_dir, 'cell_vars.h5') + report.tmp_dir = cls.default_dir + + variables = params['variable_name'] + if isinstance(variables, list): + report.variables = variables + else: + report.variables = [variables] + + return report + + +@SimReport.register_module +class SpikesReport(SimReport): + def __init__(self, report_name, module, params): + super(SpikesReport, self).__init__(report_name, module, params) + + @classmethod + def build(cls, name, params): + return None + + @staticmethod + def avail_modules(): + return 'spikes_report' + + @classmethod + def from_output_dict(cls, output_dict): + params = { + 'spikes_file': output_dict.get('spikes_file', None), + 'spikes_file_csv': output_dict.get('spikes_file_csv', None), + 'spikes_file_nwb': output_dict.get('spikes_file_nwb', None), + 'spikes_sort_order': output_dict.get('spikes_sort_order', None), + 'tmp_dir': output_dict.get('output_dir', cls.default_dir) + } + if not (params['spikes_file'] or params['spikes_file_csv'] or params['spikes_file_nwb']): + # User hasn't specified any spikes file + params['enabled'] = False + + return cls('spikes_report', 'spikes_report', params) + + +@SimReport.register_module +class SEClampReport(SimReport): + def __init__(self, report_name, module, params): + super(SEClampReport, self).__init__(report_name, module, params) + + @staticmethod + def avail_modules(): + return 'SEClamp' + + +@SimReport.register_module +class ECPReport(SimReport): + def __init__(self, report_name, module, params): + super(ECPReport, self).__init__(report_name, module, params) + self.tmp_dir = self.default_dir + self.positions_file = None + self.file_name = None + + @staticmethod + def avail_modules(): + return 'extracellular' + + def _get_defaults(self): + if 'file_name' in self.params: + file_name = self.params['file_name'] + elif self.report_name.endswith('.h5') or self.report_name.endswith('.hdf') \ + or self.report_name.endswith('.hdf5'): + file_name = self.report_name # Check for case report.h5.h5 + else: + file_name = '{}.h5'.format(self.report_name) + + return [('tmp_dir', self.default_dir), ('file_name', file_name), + ('contributions_dir', os.path.join(self.default_dir, 'ecp_contributions'))] + + @classmethod + def build(cls, name, params): + report = cls(name) + + if 'file_name' in params: + report.file_name = params['file_name'] + report.tmp_dir = os.path.dirname(os.path.realpath(report.file_name)) + else: + report.file_name = os.path.join(cls.default_dir, 'ecp.h5') + report.tmp_dir = cls.default_dir + + report.contributions_dir = params.get('contributions_dir', cls.default_dir) + report.positions_file = params['electrode_positions'] + return report + + +@SimReport.register_module +class SaveSynapses(SimReport): + def __init__(self, report_name, module, params): + super(SaveSynapses, self).__init__(report_name, module, params) + + @staticmethod + def avail_modules(): + return 'SaveSynapses' + + +@SimReport.register_module +class MultimeterReport(MembraneReport): + + @staticmethod + def avail_modules(): + return ['multimeter', 'multimeter_report'] + + +@SimReport.register_module +class SectionReport(MembraneReport): + + @staticmethod + def avail_modules(): + return ['section_report'] + + +def from_config(cfg): + SimReport.default_dir = cfg.output_dir + + reports_list = [] + membrane_reports = [] + has_spikes_report = False + for report_name, report_params in cfg.reports.items(): + # Get the Report class from the module_name parameter + if not report_params.get('enabled', True): + # not a part of the standard but will help skip modules + continue + + report = SimReport.build(report_name, report_params) + + if isinstance(report, MembraneReport): + # When possible for membrane reports combine multiple reports into one module if all the parameters + # except for the variable name differs. + for existing_report in membrane_reports: + if existing_report.can_combine(report): + existing_report.add_variables(report.variables, report.params['transform']) + break + else: + reports_list.append(report) + membrane_reports.append(report) + + else: + reports_list.append(report) + + if not has_spikes_report: + report = SpikesReport.from_output_dict(cfg.output) + if report is None: + # TODO: Log exception or possibly warning + pass + else: + reports_list.append(report) + + return reports_list diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/LocallySparseNoise.py b/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/LocallySparseNoise.py new file mode 100644 index 0000000..ee43e9f --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/LocallySparseNoise.py @@ -0,0 +1,137 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from scipy.misc import imresize +import os +import pandas as pd + +stimulus_folder = os.path.dirname(os.path.abspath(__file__)) +bob_stimlus = os.path.join(stimulus_folder,'lsn.npy') + +class LocallySparseNoise (object): + + def __init__(self,stim_template=None, stim_table=None): + + if stim_template is None or stim_table is None: + raise Exception("stim_template or stim_table not provided. Please provide them or call the class methods .with_new_stimulus or .with_bob_stimulus.") + else: + self.stim_template = stim_template + self.stim_table = stim_table + + T,y,x = stim_template.shape + + self.T = T + self.y = y + self.x = x + + + def get_image_input(self, new_size=None, add_channels=False): + + if new_size is not None: + y,x = new_size + data_new_size = np.empty((self.T,y,x),dtype=np.float32) + + for t in range(self.stim_template.shape[0]): + data_new_size[t] = imresize(self.stim_template[t].astype(np.float32),new_size,interp='nearest') + + if add_channels: + return data_new_size[:,:,:,np.newaxis] + else: + return data_new_size + + @staticmethod + def exclude(av,y_x,exclusion=0): + y, x = y_x + X,Y = np.meshgrid(np.arange(av.shape[1]), np.arange(av.shape[0])) + + mask = ((X-x)**2 + (Y-y)**2) <= exclusion**2 + av[mask] = False + + @classmethod + def create_sparse_noise_matrix(cls,Y=16,X=28,exclusion=5,T=9000, buffer_x=6, buffer_y=6): + + Xp = X+2*buffer_x + Yp = Y+2*buffer_y + + # 127 is mean luminance value + sn = 127*np.ones([T,Yp,Xp],dtype=np.uint8) + + for t in range(T): + available = np.ones([Yp,Xp]).astype(np.bool) + + while np.any(available): + y_available, x_available = np.where(available) + + pairs = zip(y_available,x_available) + pair_index = np.random.choice(range(len(pairs))) + y,x = pairs[pair_index] + + p = np.random.random() + if p < 0.5: + sn[t,y,x] = 255 + else: + sn[t,y,x] = 0 + + cls.exclude(available,(y,x),exclusion=exclusion) + + return sn[:,buffer_y:(Y+buffer_y), buffer_x:(X+buffer_x)] + + def save_to_hdf(self): + + pass + + @staticmethod + def generate_stim_table(T,start_time=0,trial_length=250): + '''frame_length is in milliseconds''' + + start_time_array = trial_length*np.arange(T) + start_time + column_list = [np.arange(T),start_time_array, start_time_array+trial_length-1] # -1 is because the tables in BOb use inclusive intervals, so we'll stick to that convention + cols = np.vstack(column_list).T + stim_table = pd.DataFrame(cols,columns=['frame','start','end']) + + return stim_table + + + @classmethod + def with_new_stimulus(cls,Y=16,X=28,exclusion=5,T=9000, buffer_x=6, buffer_y=6): + + stim_template = cls.create_sparse_noise_matrix(Y=Y,X=X,exclusion=exclusion,T=T, buffer_x=buffer_x, buffer_y=buffer_y) + T,y,x = stim_template.shape + + stim_table = cls.generate_stim_table(T) + + new_locally_sparse_noise = cls(stim_template=stim_template, stim_table=stim_table) + + return new_locally_sparse_noise + + @classmethod + def with_brain_observatory_stimulus(cls): + + stim_template = np.load(bob_stimlus) + T,y,x = stim_template.shape + + stim_table = cls.generate_stim_table(T) + + new_locally_sparse_noise = cls(stim_template=stim_template, stim_table=stim_table) + + return new_locally_sparse_noise diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/NaturalScenes.py b/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/NaturalScenes.py new file mode 100644 index 0000000..b04056b --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/NaturalScenes.py @@ -0,0 +1,337 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import os +from PIL import Image +import pandas as pd + +class NaturalScenes (object): + def __init__(self, new_size=(64,112), mode='L', dtype=np.float32, start_time=0, trial_length=250, add_channels=False): + + self.new_size = new_size + self.mode = mode + self.dtype = dtype + self.add_channels = add_channels + + + + def random_sample(self, n): + sample_indices = np.random.randint(0, self.num_images, n) + return self.stim_template[sample_indices] + + # also a method random_sample_with_labels ? + def random_sample_with_labels(self, n): + pass + + def get_image_input(self,**kwargs): + return self.stim_template + + def add_gray_screen(self): + + gray_screen = np.ones(self.new_size,dtype=self.dtype)*127 # using 127 as "gray" value + if self.add_channels: + gray_screen = gray_screen[:,:,np.newaxis] + self.stim_template = np.vstack([self.stim_template, gray_screen[np.newaxis,:,:]]) + + start = int(self.stim_table.tail(1)['end']) + 1 + end = start+self.trial_length-1 #make trial_length an argument of this function? + frame = int(self.stim_table.tail(1)['frame']) + 1 + + self.stim_table = self.stim_table.append(pd.DataFrame([[frame,start,end]],columns=['frame','start','end']),ignore_index=True) + + self.label_dataframe = self.label_dataframe.append(pd.DataFrame([['gray_screen']],columns=['image_name']),ignore_index=True) + self.num_images = self.num_images + 1 + + @classmethod + def with_brain_observatory_stimulus(cls, new_size=(64,112), mode='L', dtype=np.float32, start_time=0, trial_length=250, add_channels=False): + + from sys import platform + + if platform=='linux2': + image_dir = '/data/mat/iSee_temp_shared/CAM_Images.icns' + elif platform=='darwin': + + image_dir = '/Users/michaelbu/Data/Images/CAM_Images.icns' + if not os.path.exists(image_dir): + print("Detected platform: OS X. I'm assuming you've mounted \\\\aibsdata\\mat at /Volumes/mat/") + image_dir = '/Volumes/mat/iSee_temp_shared/CAM_Images.icns' + + + elif platform=='win32': + image_dir = r'\\aibsdata\mat\iSee_temp_shared\CAM_Images.icns' + + #image_dir = '/Users/michaelbu/Data/Images/CAM_Images' # change this to temp directory on aibsdata + new_ns = cls.with_new_stimulus_from_dataframe(image_dir=image_dir, new_size=new_size, mode=mode, dtype=dtype, start_time=start_time, trial_length=trial_length, add_channels=add_channels) + + new_ns.add_gray_screen() + + return new_ns + + @staticmethod + def generate_stim_table(T,start_time=0,trial_length=250): + '''frame_length is in milliseconds''' + + start_time_array = trial_length*np.arange(T) + start_time + column_list = [np.arange(T),start_time_array, start_time_array+trial_length-1] # -1 is because the tables in BOb use inclusive intervals, so we'll stick to that convention + cols = np.vstack(column_list).T + stim_table = pd.DataFrame(cols,columns=['frame','start','end']) + + return stim_table + + def to_h5(self,sample_indices=None): + pass + + @classmethod + def with_new_stimulus_from_folder(cls, image_dir, new_size=(64,112), mode='L', dtype=np.float32, start_time=0, trial_length=250, add_channels=False): + + new_ns = cls(new_size=new_size, mode=mode, dtype=dtype, start_time=start_time, trial_length=trial_length, add_channels=add_channels) + + new_ns.im_list = os.listdir(image_dir) + new_ns.image_dir = image_dir + + stim_list = [] + for im in new_ns.im_list: + try: + im_data = Image.open(os.path.join(new_ns.image_dir,im)) + except IOError: + print("Skipping file: ", im) + new_ns.im_list.remove(im) + + im_data = im_data.convert(new_ns.mode) + if new_size is not None: + im_data = im_data.resize((new_ns.new_size[1], new_ns.new_size[0])) + im_data = np.array(im_data,dtype=new_ns.dtype) + if add_channels: + im_data = im_data[:,:,np.newaxis] + stim_list.append(im_data) + + new_ns.stim_template = np.stack(stim_list) + new_ns.num_images = new_ns.stim_template.shape[0] + + t,y,x = new_ns.stim_template.shape + new_ns.new_size = (y,x) + + new_ns.trial_length = trial_length + new_ns.start_time = start_time + new_ns.stim_table = new_ns.generate_stim_table(new_ns.num_images,start_time=new_ns.start_time,trial_length=new_ns.trial_length) + + new_ns.label_dataframe = pd.DataFrame(columns=['image_name']) + new_ns.label_dataframe['image_name'] = new_ns.im_list + + return new_ns + + @classmethod + def with_new_stimulus_from_dataframe(cls, image_dir, new_size=(64,112), mode='L', dtype=np.float32, start_time=0, trial_length=250, add_channels=False): + '''image_dir should contain a folder of images called 'images' and an hdf5 file with a + dataframe called 'label_dataframe.h5' with the frame stored in the key 'labels'. + dataframe should have columns ['relative_image_path','label_1', 'label_2', ...]''' + + new_ns = cls(new_size=new_size, mode=mode, dtype=dtype, start_time=start_time, trial_length=trial_length, add_channels=add_channels) + + image_path = os.path.join(image_dir,'images') + label_dataframe = pd.read_hdf(os.path.join(image_dir,'label_dataframe.h5'),'labels') + new_ns.label_dataframe = label_dataframe + + new_ns.image_dir = image_path + new_ns.im_list = list(label_dataframe.image_name) + + stim_list = [] + for im in new_ns.im_list: + try: + im_data = Image.open(os.path.join(image_path,im)) + except IOError: + print("Skipping file: ", im) + new_ns.im_list.remove(im) + + im_data = im_data.convert(new_ns.mode) + if new_size is not None: + im_data = im_data.resize((new_ns.new_size[1], new_ns.new_size[0])) + im_data = np.array(im_data,dtype=new_ns.dtype) + if add_channels: + im_data = im_data[:,:,np.newaxis] + stim_list.append(im_data) + + new_ns.stim_template = np.stack(stim_list) + new_ns.num_images = new_ns.stim_template.shape[0] + + if add_channels: + t,y,x,_ = new_ns.stim_template.shape + else: + t,y,x = new_new.stim_template.shape + new_ns.new_size = (y,x) + + new_ns.trial_length = trial_length + new_ns.start_time = start_time + new_ns.stim_table = new_ns.generate_stim_table(new_ns.num_images,start_time=new_ns.start_time,trial_length=new_ns.trial_length) + + return new_ns + + @staticmethod + def create_image_dir_from_hierarchy(folder, new_path, label_names=None): + + import shutil + + image_dataframe = pd.DataFrame(columns=["image_name"]) + + if os.path.exists(new_path): + raise Exception("path "+new_path+" already exists!") + + os.mkdir(new_path) + os.mkdir(os.path.join(new_path,'images')) + for path, sub_folders, file_list in os.walk(folder): + + for f in file_list: + try: + im_data = Image.open(os.path.join(path,f)) + except IOError: + print("Skipping file: ", f) + im_data = None + + if im_data is not None: + shutil.copy(os.path.join(path,f), os.path.join(new_path,'images',f)) + image_name = f + label_vals = os.path.split(os.path.relpath(path,folder)) + if label_names is not None: + current_label_names = label_names[:] + else: + current_label_names = [] + + if len(label_vals) > current_label_names: + labels_to_add = ["label_"+str(i) for i in range(len(current_label_names), len(label_vals))] + current_label_names += labels_to_add + elif len(label_vals) < current_label_names: + current_label_names = current_label_names[:len(label_vals)] + + vals = [f] + list(label_vals) + cols = ['image_name']+current_label_names + new_frame = pd.DataFrame([vals],columns=cols) + + image_dataframe = image_dataframe.append(new_frame,ignore_index=True) + + image_dataframe.to_hdf(os.path.join(new_path,'label_dataframe.h5'),'labels') + + # @staticmethod + # def add_object_to_image(image, object_image): + # + # new_image = image.copy() + # new_image[np.isfinite(object_image)] = object_image[np.isfinite(object_image)] + # return new_image + + @staticmethod + def add_object_to_template(template, object_image): + + if template.ndim==3: + T,y,x = template.shape + elif template.ndim==4: + T,y,x,K = template.shape + else: + raise Exception("template.ndim must be 3 or 4") + + if object_image.ndim < template.ndim-1: + object_image=object_image[:,:,np.newaxis] + + new_template = template.copy() + new_template[:,np.isfinite(object_image)] = object_image[np.isfinite(object_image)] + + return new_template + + def add_objects_to_foreground(self, object_dict): + + template_list = [] + + if self.label_dataframe is None: + self.label_dataframe = pd.DataFrame(columns=['object']) + + new_label_dataframe_list = [] + + for obj in object_dict: + template_list.append(self.add_object_to_template(self.stim_template,object_dict[obj])) + obj_dataframe = self.label_dataframe.copy() + obj_dataframe['object'] = [ obj for i in range(self.num_images) ] + new_label_dataframe_list.append(obj_dataframe) + + self.stim_template = np.vstack(template_list) + self.label_dataframe = pd.concat(new_label_dataframe_list,ignore_index=True) + + self.num_images = self.stim_template.shape[0] + + self.stim_table = self.generate_stim_table(self.num_images,start_time=self.start_time,trial_length=self.trial_length) + + + @staticmethod + def create_object_dict(folder, background_shape=(64,112), dtype=np.float32, rotations=False): + + from scipy.misc import imresize + + # resize function to preserve the nans in the background + def resize_im(im,new_shape): + def mask_for_nans(): + mask = np.ones(im.shape) + mask[np.isfinite(im)] = 0 + mask = imresize(mask,new_shape,interp='nearest') + + return mask.astype(np.bool) + + new_im = im.copy() + new_im = new_im.astype(dtype) + new_im[np.isnan(new_im)] = -1. + new_im = imresize(new_im,new_shape,interp='nearest') + + new_im = new_im.astype(dtype) + new_im[mask_for_nans()] = np.nan + + return new_im + + def im_on_background(im, shift=None): + bg = np.empty(background_shape) + bg[:] = np.nan + + buffer_x = (background_shape[1] - im.shape[1])/2 + buffer_y = (background_shape[0] - im.shape[0])/2 + + bg[buffer_y:im.shape[0]+buffer_y, buffer_x:im.shape[1]+buffer_x] = im + + return bg + + im_list = os.listdir(folder) + + obj_dict = {} + + for im_file in im_list: + try: + im = np.load(os.path.join(folder,im_file)) + except IOError: + print("skipping file: ", im_file) + im = None + + if im is not None: + new_shape = (np.min(background_shape), np.min(background_shape)) + im = resize_im(im,new_shape) + obj_dict[im_file[:-4]] = im_on_background(im) + if rotations: + im_rot=im.copy() + for i in range(3): + im_rot = np.rot90(im_rot) + obj_dict[im_file[:-4]+'_'+str(90*(i+1))] = im_on_background(im_rot) + + return obj_dict diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/StaticGratings.py b/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/StaticGratings.py new file mode 100644 index 0000000..c7bf9cb --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/StaticGratings.py @@ -0,0 +1,100 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd + + +class StaticGratings (object): + + def __init__(self,orientations=30.0*np.arange(6),spatial_frequencies=0.01*(2.0**np.arange(1,6)),phases=0.25*np.arange(4),num_trials=50, start_time=0, trial_length=250): + + self.orientations = orientations + self.spatial_frequencies = spatial_frequencies + self.phases = phases + self.num_trials = num_trials + self.start_time = start_time + self.trial_length = trial_length + + trial_stims = np.array([ [orientation, spat_freq, phase] for orientation in self.orientations for spat_freq in self.spatial_frequencies for phase in self.phases ]) + + trial_stims = np.tile(trial_stims,(num_trials,1)) + + indices = np.random.permutation(trial_stims.shape[0]) + trial_stims = trial_stims[indices] + + self.stim_table = pd.DataFrame(trial_stims,columns=['orientation','spatial_frequency','phase']) + + T = self.stim_table.shape[0] + self.T = T + start_time_array = trial_length*np.arange(self.T) + start_time + end_time_array = start_time_array + trial_length + + self.stim_table['start'] = start_time_array + self.stim_table['end'] = end_time_array + + def get_image_input(self,new_size=(64,112),pix_per_degree=1.0, dtype=np.float32, add_channels=False): + + y, x = new_size + stim_template = np.empty([self.T, y, x],dtype=dtype) + + for t, row in self.stim_table.iterrows(): + ori, sf, ph = row[0], row[1], row[2] + + theta = ori*np.pi/180.0 #convert to radians + + k = (sf/pix_per_degree) # radians per pixel + ph = ph*np.pi*2.0 + + X,Y = np.meshgrid(np.arange(x),np.arange(y)) + X = X - x/2 + Y = Y - y/2 + Xp, Yp = self.rotate(X,Y,theta) + + stim_template[t] = np.cos(2.0*np.pi*Xp*k + ph) + + self.stim_template = stim_template + + if add_channels: + return stim_template[:,:,:,np.newaxis] + else: + return stim_template + + @staticmethod + def rotate(X,Y, theta): + + Xp = X*np.cos(theta) - Y*np.sin(theta) + Yp = X*np.sin(theta) + Y*np.cos(theta) + + return Xp, Yp + + @classmethod + def with_brain_observatory_stimulus(cls, num_trials=50): + + orientations = 30.0*np.arange(6) + spatial_frequencies = 0.01*(2.0**np.arange(1,6)) + phases = 0.25*np.arange(4) + + start_time = 0 + trial_length = 250 + + return cls(orientations=orientations,spatial_frequencies=spatial_frequencies,phases=phases,num_trials=num_trials,start_time=start_time,trial_length=trial_length) diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/stimulus/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/tools/__init__.py b/bmtk-vb/build/lib/bmtk/simulator/utils/tools/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/tools/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/tools/process_spikes.py b/bmtk-vb/build/lib/bmtk/simulator/utils/tools/process_spikes.py new file mode 100644 index 0000000..0f5519a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/tools/process_spikes.py @@ -0,0 +1,207 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +import numpy as np +import pandas as pd +import os + + +def read_spk_txt(f_name): + + ''' + + Parameters + ---------- + f_name: string + Full path to a file containing cell IDs and spike times. + + Returns + ------- + A dataframe containing two columns: spike times and cell IDs. + + Usage: + x = read_spk_txt('output/spk.dat') + + ''' + + df = pd.read_csv(f_name, header=None, sep=' ') + df.columns = ['t', 'gid'] + + return df + + +def read_spk_h5(f_name): + + ''' + + Parameters + ---------- + f_name: string + Full path to a file containing cell IDs and spike times. + + Returns + ------- + A dataframe containing two columns: spike times and cell IDs. + + Usage: + x = read_spk_h5('output/spk.h5') + + ''' + + f = h5py.File(f_name, 'r' , libver='latest') + spikes = {} + + t = np.array([]) + gids = np.array([]) + for i, gid in enumerate(f.keys()): # save spikes of all gids + if (i % 1000 == 0): + print(i) + spike_times = f[gid][...] + t = np.append(t, spike_times) + gids = np.append(gids, np.ones(spike_times.size)*int(gid)) + + f.close() + + df = pd.DataFrame(columns=['t', 'gid']) + df['t'] = t + df['gid'] = gids + + return df + + +def spikes_to_mean_f_rate(cells_f, spk_f, t_window, **kwargs): + + ''' + + Parameters + ---------- + cells_f: string + Full path to a file containing information about all cells (in particular, all cell IDs, + and not just those that fired spikes in a simulation). + spk_f: string + Full path to a file containing cell IDs and spike times. + t_window: a tuple of two floats + Start and stop time for the window within which the firing rate is computed. + **kwargs + spk_f_type: string with accepted values 'txt' or 'h5' + Type of the file from which spike times should be extracted. + + + Assumptions + ----------- + It is assumed here that TIME IS in ms and the RATES ARE RETURNED in Hz. + + + Returns + ------- + A dataframe containing a column of cell IDs and a column of corresponding + average firing rates. + + Usage: + x = spikes_to_mean_f_rate('../network_model/cells.csv', 'output/spk.dat', (500.0, 3000.0)) + + ''' + + # Make sure the time window's start and stop times are reasonable. + t_start = t_window[0] + t_stop = t_window[1] + delta_t = t_stop - t_start + if (delta_t <= 0.0): + print('spikes_to_mean_f_rate: stop time %f is <= start time %f; exiting.' % (t_stop, t_start)) + quit() + + # Read information about all cells. + cells_df = pd.read_csv(cells_f, sep=' ') + gids = cells_df['id'].values + + # By default, the spk file type is "None", in which case it should be chosen + # based on the extension of the supplied spk file name. + spk_f_type = kwargs.get('spk_f_type', None) + if (spk_f_type == None): + spk_f_ext = spk_f.split('.')[-1] + if (spk_f_ext in ['txt', 'dat']): + spk_f_type = 'txt' # Assume this is an ASCII file. + elif (spk_f_ext in ['h5']): + spk_f_type = 'h5' # Assume this is an HDF5 file. + else: + print('spikes_to_mean_f_rate: unrecognized file extension. Use the flag spk_f_type=\'txt\' or \'h5\' to override this message. Exiting.') + quit() + + # In case the spk_f_type was provided directly, check that the value is among those the code recognizes. + if (spk_f_type not in ['txt', 'h5']): + print('spikes_to_mean_f_rate: unrecognized value of spk_f_type. The recognized values are \'txt\' or \'h5\'. Exiting.') + quit() + + # Read spikes. + # If the spike file has zero size, create a dataframe with all rates equal to zero. + # Otherwise, use spike times from the file to fill the dataframe. + if (os.stat(spk_f).st_size == 0): + f_rate_df = pd.DataFrame(columns=['gid', 'f_rate']) + f_rate_df['gid'] = gids + f_rate_df['f_rate'] = np.zeros(gids.size) + else: + # Use the appropriate function to read the spikes. + if (spk_f_type == 'txt'): + df = read_spk_txt(spk_f) + elif(spk_f_type == 'h5'): + df = read_spk_h5(spk_f) + + # Keep only those entries that have spike times within the time window. + df = df[(df['t'] >= t_start) & (df['t'] <= t_stop)] + + # Compute rates. + f_rate_df = df.groupby('gid').count() * 1000.0 / delta_t # Time is in ms and rate is in Hz. + f_rate_df.columns = ['f_rate'] + # The 'gid' label is now used as index (after the groupby operation). + # Convert it to a column; then change the index name to none, as in default. + f_rate_df['gid'] = f_rate_df.index + f_rate_df.index.names = [''] + + # Find cell IDs from the spk file that are not in the cell file. + # Remove them from the dataframe with rates. + gids_not_in_cells_f = f_rate_df['gid'].values[~np.in1d(f_rate_df['gid'].values, gids)] + f_rate_df = f_rate_df[~f_rate_df['gid'].isin(gids_not_in_cells_f)] + + # Find cell IDs from the cell file that do not have counterparts in the spk file + # (for example, because those cells did not fire). + # Add these cell IDs to the dataframe; fill rates with zeros. + gids_not_in_spk = gids[~np.in1d(gids, f_rate_df['gid'].values)] + f_rate_df = f_rate_df.append(pd.DataFrame(np.array([gids_not_in_spk, np.zeros(gids_not_in_spk.size)]).T, columns=['gid', 'f_rate'])) + + # Sort the rows according to the cell IDs. + f_rate_df = f_rate_df.sort('gid', ascending=True) + + return f_rate_df + + +# Tests. + +#x = spikes_to_mean_f_rate('/data/mat/yazan/corticalCol/ice/sims/column/build/net_structure/cells.csv', '/data/mat/yazan/corticalCol/ice/sims/column/full_preliminary_runs/output008/spikes.txt', (500.0, 2500.0)) +#print x + +#x = spikes_to_mean_f_rate('/data/mat/yazan/corticalCol/ice/sims/column/build/net_structure/cells.csv', '/data/mat/yazan/corticalCol/ice/sims/column/full_preliminary_runs/output008/spikes.h5', (500.0, 2500.0)) +#print x + +#x = spikes_to_mean_f_rate('/data/mat/yazan/corticalCol/ice/sims/column/build/net_structure/cells.csv', '/data/mat/yazan/corticalCol/ice/sims/column/full_preliminary_runs/output008/spikes.txt', (500.0, 2500.0), spk_f_type='txt') +#print x + diff --git a/bmtk-vb/build/lib/bmtk/simulator/utils/tools/spatial.py b/bmtk-vb/build/lib/bmtk/simulator/utils/tools/spatial.py new file mode 100644 index 0000000..9b331d0 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/simulator/utils/tools/spatial.py @@ -0,0 +1,26 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + + +def example(): + print('OK') diff --git a/bmtk-vb/build/lib/bmtk/utils/__init__.py b/bmtk-vb/build/lib/bmtk/utils/__init__.py new file mode 100644 index 0000000..1c9c088 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/__init__.py @@ -0,0 +1,24 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import logging + + diff --git a/bmtk-vb/build/lib/bmtk/utils/cell_vars/__init__.py b/bmtk-vb/build/lib/bmtk/utils/cell_vars/__init__.py new file mode 100644 index 0000000..021345f --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/cell_vars/__init__.py @@ -0,0 +1,6 @@ +from .var_reader import CellVarsFile + + + + + diff --git a/bmtk-vb/build/lib/bmtk/utils/cell_vars/var_reader.py b/bmtk-vb/build/lib/bmtk/utils/cell_vars/var_reader.py new file mode 100644 index 0000000..21da36d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/cell_vars/var_reader.py @@ -0,0 +1,134 @@ +import h5py +import numpy as np + + +class CellVarsFile(object): + VAR_UNKNOWN = 'Unknown' + UNITS_UNKNOWN = 'NA' + + def __init__(self, filename, mode='r', **params): + self._h5_handle = h5py.File(filename, 'r') + self._h5_root = self._h5_handle[params['h5_root']] if 'h5_root' in params else self._h5_handle['/'] + self._var_data = {} + self._var_units = {} + + self._mapping = None + + # Look for variabl and mapping groups + for var_name in self._h5_root.keys(): + hf_grp = self._h5_root[var_name] + + if var_name == 'data': + # According to the sonata format the /data table should be located at the root + var_name = self._h5_root['data'].attrs.get('variable_name', CellVarsFile.VAR_UNKNOWN) + self._var_data[var_name] = self._h5_root['data'] + self._var_units[var_name] = self._find_units(self._h5_root['data']) + + if not isinstance(hf_grp, h5py.Group): + continue + + if var_name == 'mapping': + # Check for /mapping group + self._mapping = hf_grp + else: + # In the bmtk we can support multiple variables in the same file (not sonata compliant but should be) + # where each variable table is separated into its own group //data + if 'data' not in hf_grp: + print('Warning: could not find "data" dataset in {}. Skipping!'.format(var_name)) + else: + self._var_data[var_name] = hf_grp['data'] + self._var_units[var_name] = self._find_units(hf_grp['data']) + + # create map between gids and tables + self._gid2data_table = {} + if self._mapping is None: + raise Exception('could not find /mapping group') + else: + gids_ds = self._mapping['gids'] + index_pointer_ds = self._mapping['index_pointer'] + for indx, gid in enumerate(gids_ds): + self._gid2data_table[gid] = (index_pointer_ds[indx], index_pointer_ds[indx+1]) # slice(index_pointer_ds[indx], index_pointer_ds[indx+1]) + + time_ds = self._mapping['time'] + self._t_start = time_ds[0] + self._t_stop = time_ds[1] + self._dt = time_ds[2] + self._n_steps = int((self._t_stop - self._t_start) / self._dt) + + @property + def variables(self): + return list(self._var_data.keys()) + + @property + def gids(self): + return list(self._gid2data_table.keys()) + + @property + def t_start(self): + return self._t_start + + @property + def t_stop(self): + return self._t_stop + + @property + def dt(self): + return self._dt + + @property + def time_trace(self): + return np.linspace(self.t_start, self.t_stop, num=self._n_steps, endpoint=True) + + @property + def h5(self): + return self._h5_root + + def _find_units(self, data_set): + return data_set.attrs.get('units', CellVarsFile.UNITS_UNKNOWN) + + def units(self, var_name=VAR_UNKNOWN): + return self._var_units[var_name] + + def n_compartments(self, gid): + bounds = self._gid2data_table[gid] + return bounds[1] - bounds[0] + + def compartment_ids(self, gid): + bounds = self._gid2data_table[gid] + return self._mapping['element_id'][bounds[0]:bounds[1]] + + def compartment_positions(self, gid): + bounds = self._gid2data_table[gid] + return self._mapping['element_pos'][bounds[0]:bounds[1]] + + def data(self, gid, var_name=VAR_UNKNOWN,time_window=None, compartments='origin'): + if var_name not in self.variables: + raise Exception('Unknown variable {}'.format(var_name)) + + if time_window is None: + time_slice = slice(0, self._n_steps) + else: + if len(time_window) != 2: + raise Exception('Invalid time_window, expecting tuple [being, end].') + + window_beg = max(int((time_window[0] - self.t_start)/self.dt), 0) + window_end = min(int((time_window[1] - self.t_start)/self.dt), self._n_steps/self.dt) + time_slice = slice(window_beg, window_end) + + multi_compartments = True + if compartments == 'origin' or self.n_compartments(gid) == 1: + # Return the first (and possibly only) compartment for said gid + gid_slice = self._gid2data_table[gid][0] + multi_compartments = False + elif compartments == 'all': + # Return all compartments + gid_slice = slice(self._gid2data_table[gid][0], self._gid2data_table[gid][1]) + else: + # return all compartments with corresponding element id + compartment_list = list(compartments) if isinstance(compartments, (long, int)) else compartments + begin = self._gid2data_table[gid][0] + end = self._gid2data_table[gid][1] + gid_slice = [i for i in range(begin, end) if self._mapping[i] in compartment_list] + + data = np.array(self._var_data[var_name][time_slice, gid_slice]) + return data.T if multi_compartments else data diff --git a/bmtk-vb/build/lib/bmtk/utils/converters/__init__.py b/bmtk-vb/build/lib/bmtk/utils/converters/__init__.py new file mode 100644 index 0000000..04c8f88 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/converters/__init__.py @@ -0,0 +1,22 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# diff --git a/bmtk-vb/build/lib/bmtk/utils/converters/hoc_converter.py b/bmtk-vb/build/lib/bmtk/utils/converters/hoc_converter.py new file mode 100644 index 0000000..c500945 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/converters/hoc_converter.py @@ -0,0 +1,299 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import json +import os.path +import re +from collections import defaultdict +from itertools import groupby +from lxml import etree +import bluepyopt.ephys as ephys +from tqdm import tqdm +import utils + +XML_NS = '{http://www.neuroml.org/schema/neuroml2}' +MECHANISMS = [ + 'channelDensity', 'channelDensityNernst', 'specificCapacitance', 'species', + 'resistivity', 'concentrationModel' +] + +LOCATION_MAP = { + 'apic': 'apical', + 'soma': 'somatic', + 'dend': 'basal', + 'axon': 'axonal', + 'all': 'all' +} + + +def map_location_name(name): + return LOCATION_MAP[name] + + +def load_json(json_path): + params = json.load(open(json_path)) + + scalar = ephys.parameterscalers.NrnSegmentLinearScaler() + mechanisms = {} + sections_lookup = {'soma': 'somatic', 'dend': 'basal', 'axon': 'axonal', 'apic': 'apical'} + def getNrnSeclist(loc_name): + return ephys.locations.NrnSeclistLocation(loc_name, seclist_name=loc_name) + + parameters = [] + for d in params['genome']: + section = sections_lookup[d['section']] + value = d['value'] + name = d['name'] + mech = 'pas' if name == 'g_pass' else d['mechanism'] + mech_name = 'CaDynamics' if mech == 'CaDynamics' else '{}.{}'.format(name, d['section']) + p_name = '{}_{}'.format(name, section) if name == 'g_pass' else name + + if mech_name not in mechanisms: + nrn_mech = ephys.mechanisms.NrnMODMechanism(name=mech_name, mod_path=None, suffix=mech, + locations=[getNrnSeclist(section)]) + mechanisms[mech_name] = nrn_mech + + parameters.append(ephys.parameters.NrnSectionParameter(name=p_name, param_name=name, value_scaler=scalar, + value=value, locations=[getNrnSeclist(section)])) + + parameters.append(ephys.parameters.NrnSectionParameter(name='erev_na', param_name='ena', value_scaler=scalar, + value=params['conditions'][0]['erev'][0]['ena'], + locations=[getNrnSeclist('somatic')])) + parameters.append(ephys.parameters.NrnSectionParameter(name='erev_k', param_name='ek', value_scaler=scalar, + value=params['conditions'][0]['erev'][0]['ek'], + locations=[getNrnSeclist('somatic')])) + parameters.append(ephys.parameters.NrnSectionParameter(name='erev_pas', param_name='e_pas', value_scaler=scalar, + value=params['conditions'][0]['v_init'], + locations=[getNrnSeclist('somatic'), getNrnSeclist('axonal'), + getNrnSeclist('basal'), getNrnSeclist('apical')])) + + parameters.append(ephys.parameters.NrnSectionParameter(name='erev_Ih', param_name='ehcn', value_scaler=scalar, + value=-45.0, + locations=[getNrnSeclist('somatic')])) + + parameters.append(ephys.parameters.NrnSectionParameter(name='res_all', param_name='Ra', value_scaler=scalar, + value=params['passive'][0]['ra'], + locations=[getNrnSeclist('somatic')])) + for sec in params['passive'][0]['cm']: + parameters.append( + ephys.parameters.NrnSectionParameter(name='{}_cap'.format(sec['section']), param_name='cm', + value_scaler=scalar, + value=sec['cm'], + locations=[getNrnSeclist(sec['section'])])) + + parameters.append( + ephys.parameters.NrnSectionParameter(name='ca', param_name='depth_CaDynamics', value_scaler=scalar, + value=0.1, locations=[getNrnSeclist('somatic')])) + parameters.append( + ephys.parameters.NrnSectionParameter(name='ca', param_name='minCai_CaDynamics', value_scaler=scalar, + value=0.0001, locations=[getNrnSeclist('somatic')])) + + return mechanisms.values(), parameters + + +def load_neuroml(neuroml_path): + root = etree.parse(neuroml_path).getroot() + biophysics = defaultdict(list) + for mechanism in MECHANISMS: + xml_mechanisms = root.findall('.//' + XML_NS + mechanism) + for xml_mechanism in xml_mechanisms: + biophysics[mechanism].append(xml_mechanism.attrib) + + return biophysics + + +def define_mechanisms(biophysics): + def keyfn(x): + return x['segmentGroup'] + + channels = biophysics['channelDensity'] + biophysics[ + 'channelDensityNernst'] + segment_groups = [(k, list(g)) + for k, g in groupby( + sorted( + channels, key=keyfn), keyfn)] + mechanisms = [] + for sectionlist, channels in segment_groups: + loc_name = map_location_name(sectionlist) + seclist_loc = ephys.locations.NrnSeclistLocation( + loc_name, seclist_name=loc_name) + for channel in channels: + # print 'mechanisms.append(ephys.mechanisms.NrnMODMechanism(name={}.{}, mod_path=None, suffix={}, locations=[{}]))'.format(channel['ionChannel'], loc_name, channel['ionChannel'], seclist_loc) + mechanisms.append( + ephys.mechanisms.NrnMODMechanism( + name='%s.%s' % (channel['ionChannel'], loc_name), + mod_path=None, + suffix=channel['ionChannel'], + locations=[seclist_loc], )) + for elem in biophysics['species']: + section = map_location_name(elem['segmentGroup']) + section_loc = ephys.locations.NrnSeclistLocation( + section, seclist_name=section) + # print 'mechanisms.append(ephys.mechanisms.NrnMODMechanism(name={}, mod_path=None, suffix={}, location=[{}]))'.format(elem['concentrationModel'], elem['concentrationModel'], section_loc) + mechanisms.append( + ephys.mechanisms.NrnMODMechanism( + name=elem['concentrationModel'], + mod_path=None, + suffix=elem['concentrationModel'], + locations=[section_loc])) + + return mechanisms + + +def define_parameters(biophysics): + ''' for the time being all AIBS distribution are uniform ''' + parameters = [] + + def keyfn(x): + return x['ionChannel'] + + NUMERIC_CONST_PATTERN = r'''[-+]? (?: (?: \d* \. \d+ ) | (?: \d+ \.? ) )(?: [Ee] [+-]? \d+ ) ?''' + rx = re.compile(NUMERIC_CONST_PATTERN, re.VERBOSE) + + def get_cond_density(density_string): + m = re.match(rx, density_string) + return float(m.group()) + + scaler = ephys.parameterscalers.NrnSegmentLinearScaler() + MAP_EREV = { + 'Im': 'ek', + 'Ih': 'ehcn', # I am not sure of that one + 'Nap': 'ena', + 'K_P': 'ek', + 'K_T': 'ek', + 'SK': 'ek', + 'SKv3_1': 'ek', + 'NaTs': 'ena', + 'Kv3_1': 'ek', + 'NaV': 'ena', + 'Kd': 'ek', + 'Kv2like': 'ek', + 'Im_v2': 'ek', + 'pas': 'e_pas' + } + for mech_type in ['channelDensity', 'channelDensityNernst']: + mechanisms = biophysics[mech_type] + for mech in mechanisms: + section_list = map_location_name(mech['segmentGroup']) + seclist_loc = ephys.locations.NrnSeclistLocation( + section_list, seclist_name=section_list) + + def map_name(name): + ''' this name has to match the name in the mod file ''' + reg_name = re.compile('gbar\_(?P[\w]+)') + m = re.match(reg_name, name) + if m: + channel = m.group('channel') + return 'gbar' + '_' + channel + if name[:len('g_pas')] == 'g_pas': + ''' special case ''' + return 'g_pas' + assert False, "name %s" % name + + param_name = map_name(mech['id']) + # print 'parameters.append(ephys.parameters.NrnSectionParameter(name={}, param_name={}, value_scalar={}, value={}, locations=[{}]))'.format(mech['id'], param_name, scaler, get_cond_density(mech['condDensity']), seclist_loc) + parameters.append( + ephys.parameters.NrnSectionParameter( + name=mech['id'], + param_name=param_name, + value_scaler=scaler, + value=get_cond_density(mech['condDensity']), + locations=[seclist_loc])) + if mech_type != 'channelDensityNernst': + # print 'parameters.append(ephys.parameters.NrnSectionParameter(name={}, param_name={}, value_scalar={}, value={}, locations=[{}]))'.format('erev' + mech['id'], MAP_EREV[mech['ionChannel']], scaler, get_cond_density(mech['erev']), seclist_loc) + parameters.append( + ephys.parameters.NrnSectionParameter( + name='erev' + mech['id'], + param_name=MAP_EREV[mech['ionChannel']], + value_scaler=scaler, + value=get_cond_density(mech['erev']), + locations=[seclist_loc])) + + # print '' + PARAM_NAME = {'specificCapacitance': 'cm', 'resistivity': 'Ra'} + for b_type in ['specificCapacitance', 'resistivity']: + for elem in biophysics[b_type]: + section = map_location_name(elem['segmentGroup']) + section_loc = ephys.locations.NrnSeclistLocation( + section, seclist_name=section) + + # print 'parameters.append(ephys.parameters.NrnSectionParameter(name={}, param_name={}, value_scalar={}, value={}, locations=[{}]))'.format(elem['id'], PARAM_NAME[b_type], scaler, get_cond_density(elem['value']), seclist_loc) + parameters.append( + ephys.parameters.NrnSectionParameter( + name=elem['id'], + param_name=PARAM_NAME[b_type], + value_scaler=scaler, + value=get_cond_density(elem['value']), + locations=[section_loc])) + concentrationModel = biophysics['concentrationModel'][0] + + # print '' + for elem in biophysics['species']: + section = map_location_name(elem['segmentGroup']) + section_loc = ephys.locations.NrnSeclistLocation( + section, seclist_name=section) + for attribute in ['gamma', 'decay', 'depth', 'minCai']: + # print 'parameters.append(ephys.parameters.NrnSectionParameter(name={}, param_name={}, value_scalar={}, value={}, locations=[{}]))'.format(elem['id'], attribute + '_' + elem['concentrationModel'], scaler, get_cond_density(concentrationModel[attribute]), seclist_loc) + parameters.append( + ephys.parameters.NrnSectionParameter( + name=elem['id'], + param_name=attribute + '_' + elem['concentrationModel'], + value_scaler=scaler, + value=get_cond_density(concentrationModel[attribute]), + locations=[section_loc])) + + return parameters + + +def create_hoc(neuroml_path, neuroml, morphologies, incr, output_dir): + if neuroml_path.endswith('json'): + mechanisms, parameters = load_json(neuroml_path) + + else: + biophysics = load_neuroml(neuroml_path) + mechanisms = define_mechanisms(biophysics) + parameters = define_parameters(biophysics) + + for morphology in morphologies: + ccell_name = utils.name_ccell(neuroml, morphology) + hoc = ephys.create_hoc.create_hoc( + mechs=mechanisms, + parameters=parameters, + template_name='ccell' + str(incr), + template_filename='cell_template_compatible.jinja2', + template_dir='.', + morphology=morphology + '.swc', ) + with open(os.path.join(output_dir, ccell_name + '.hoc'), 'w') as f: + f.write(hoc) + + +def convert_to_hoc(config, cells, output_dir): + to_convert = cells[['dynamics_params', 'morphology', 'neuroml']] + to_convert = to_convert.drop_duplicates() + neuroml_config_path = config['components']['biophysical_neuron_models_dir'] + incr = 0 + for name, g in tqdm(to_convert.groupby('dynamics_params'), 'creating hoc files'): + neuroml_path = os.path.join(neuroml_config_path, name) + create_hoc(neuroml_path, + list(g['neuroml'])[0], + set(g['morphology']), incr, output_dir) + incr += 1 \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/utils/converters/sonata/__init__.py b/bmtk-vb/build/lib/bmtk/utils/converters/sonata/__init__.py new file mode 100644 index 0000000..c473e5d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/converters/sonata/__init__.py @@ -0,0 +1,2 @@ +from edge_converters import convert_edges +from node_converters import convert_nodes diff --git a/bmtk-vb/build/lib/bmtk/utils/converters/sonata/edge_converters.py b/bmtk-vb/build/lib/bmtk/utils/converters/sonata/edge_converters.py new file mode 100644 index 0000000..335d4f5 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/converters/sonata/edge_converters.py @@ -0,0 +1,278 @@ +import os +from functools import partial + +import numpy as np +import pandas as pd +import h5py + +column_renames = { + 'params_file': 'dynamics_params', + 'level_of_detail': 'model_type', + 'morphology': 'morphology', + 'x_soma': 'x', + 'y_soma': 'y', + 'z_soma': 'z', + 'weight_max': 'syn_weight', + 'set_params_function': 'model_template' +} + + +def convert_edges(edges_file, edge_types_file, **params): + is_flat_h5 = False + is_new_h5 = False + try: + h5file = h5py.File(edges_file, 'r') + print + if 'edges' in h5file: + is_new_h5 = True + elif 'num_syns' in h5file: + is_flat_h5 = True + except Exception as e: + pass + + if is_flat_h5: + update_aibs_edges(edges_file, edge_types_file, **params) + return + elif is_new_h5: + update_h5_edges(edges_file, edge_types_file, **params) + return + + try: + edges_csv2h5(edges_file, **params) + return + except Exception as exc: + raise exc + + raise Exception('Could not parse edges file') + + +def update_edge_types_file(edge_types_file, src_network=None, trg_network=None, output_dir='network'): + edge_types_csv = pd.read_csv(edge_types_file, sep=' ') + + # rename required columns + edge_types_csv = edge_types_csv.rename(index=str, columns=column_renames) + + edge_types_output_fn = os.path.join(output_dir, '{}_{}_edge_types.csv'.format(src_network, trg_network)) + edge_types_csv.to_csv(edge_types_output_fn, sep=' ', index=False, na_rep='NONE') + + +def update_h5_edges(edges_file, edge_types_file, src_network=None, population_name=None, trg_network=None, + output_dir='network'): + population_name = population_name if population_name is not None else '{}_to_{}'.format(src_network, trg_network) + input_h5 = h5py.File(edges_file, 'r') + + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + edges_output_fn = os.path.join(output_dir, '{}_{}_edges.h5'.format(src_network, trg_network)) + with h5py.File(edges_output_fn, 'w') as h5: + edges_path = '/edges/{}'.format(population_name) + h5.copy(input_h5['/edges'], edges_path) + grp = h5[edges_path] + grp.move('source_gid', 'source_node_id') + grp.move('target_gid', 'target_node_id') + grp.move('edge_group', 'edge_group_id') + + if 'network' in grp['source_node_id'].attrs: + del grp['source_node_id'].attrs['network'] + grp['source_node_id'].attrs['node_population'] = src_network + + if 'network' in grp['target_node_id'].attrs: + del grp['target_node_id'].attrs['network'] + grp['target_node_id'].attrs['node_population'] = trg_network + + create_index(input_h5['edges/target_gid'], grp, index_type=INDEX_TARGET) + create_index(input_h5['edges/source_gid'], grp, index_type=INDEX_SOURCE) + + update_edge_types_file(edge_types_file, src_network, trg_network, output_dir) + + +def update_aibs_edges(edges_file, edge_types_file, trg_network, src_network, population_name=None, output_dir='output'): + population_name = population_name if population_name is not None else '{}_to_{}'.format(src_network, trg_network) + + edges_h5 = h5py.File(edges_file, 'r') + src_gids = edges_h5['/src_gids'] + n_edges = len(src_gids) + trg_gids = np.zeros(n_edges, dtype=np.uint64) + start = edges_h5['/edge_ptr'][0] + for trg_gid, end in enumerate(edges_h5['/edge_ptr'][1:]): + trg_gids[start:end] = [trg_gid]*(end-start) + start = end + + edges_output_fn = os.path.join(output_dir, '{}_{}_edges.h5'.format(src_network, trg_network)) + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + with h5py.File(edges_output_fn, 'w') as hf: + grp = hf.create_group('/edges/{}'.format(population_name)) + + grp.create_dataset('target_node_id', data=trg_gids, dtype='uint64') + grp['target_node_id'].attrs['node_population'] = trg_network + grp.create_dataset('source_node_id', data=edges_h5['src_gids'], dtype='uint64') + grp['source_node_id'].attrs['node_population'] = src_network + grp.create_dataset('edge_group_id', data=np.zeros(n_edges), dtype='uint32') + grp.create_dataset('edge_group_index', data=np.arange(0, n_edges)) + grp.create_dataset('edge_type_id', data=edges_h5['edge_types']) + grp.create_dataset('0/nsyns', data=edges_h5['num_syns'], dtype='uint32') + grp.create_group('0/dynamics_params') + + create_index(trg_gids, grp, index_type=INDEX_TARGET) + create_index(src_gids, grp, index_type=INDEX_SOURCE) + + update_edge_types_file(edge_types_file, src_network, trg_network, output_dir) + + +def edges_csv2h5(edges_file, edge_types_file, src_network, src_nodes, src_node_types, trg_network, trg_nodes, + trg_node_types, output_dir='network', src_label='location', trg_label='pop_name'): + """Used to convert oldest (isee engine) edges files + + :param edges_file: + :param edge_types_file: + :param src_network: + :param src_nodes: + :param src_node_types: + :param trg_network: + :param trg_nodes: + :param trg_node_types: + :param output_dir: + :param src_label: + :param trg_label: + """ + column_renames = { + 'target_model_id': 'node_type_id', + 'weight': 'weight_max', + 'weight_function': 'weight_func', + } + + columns_order = ['edge_type_id', 'target_query', 'source_query'] + + edges_h5 = h5py.File(edges_file, 'r') + edge_types_df = pd.read_csv(edge_types_file, sep=' ') + n_edges = len(edges_h5['src_gids']) + n_targets = len(edges_h5['indptr']) - 1 + + # rename specified columns in edge-types + edge_types_df = edge_types_df.rename(columns=column_renames) + + # Add a "target_query" and "source_query" columns from target_label and source_label + def query_col(row, labels, search_col): + return '&'.join("{}=='{}'".format(l, row[search_col]) for l in labels) + trg_query_fnc = partial(query_col, labels=['node_type_id', trg_label], search_col='target_label') + src_query_fnc = partial(query_col, labels=[src_label], search_col='source_label') + + edge_types_df['target_query'] = edge_types_df.apply(trg_query_fnc, axis=1) + edge_types_df['source_query'] = edge_types_df.apply(src_query_fnc, axis=1) + + # Add an edge_type_id column + edge_types_df['edge_type_id'] = np.arange(100, 100 + len(edge_types_df.index), dtype='uint32') + + nodes_tmp = pd.read_csv(src_nodes, sep=' ', index_col=['id']) + node_types_tmp = pd.read_csv(src_node_types, sep=' ') + src_nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='model_id') + + nodes_tmp = pd.read_csv(trg_nodes, sep=' ', index_col=['id']) + node_types_tmp = pd.read_csv(trg_node_types, sep=' ') + trg_nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='model_id') + + # For assigning edge types to each edge. For a given src --> trg pair we need to lookup source_label and + # target_label values of the nodes, then use it to find the corresponding edge_types row. + print('Processing edge_type_id dataset') + edge_types_ids = np.zeros(n_edges, dtype='uint32') + edge_types_df = edge_types_df.set_index(['node_type_id', 'target_label', 'source_label']) + ten_percent = int(n_targets*.1) # for keepting track of progress + index = 0 # keeping track of row index + for trg_gid in xrange(n_targets): + # for the target find value node_type_id and target_label + nodes_row = trg_nodes_df.loc[trg_gid] + model_id = nodes_row['model_id'] + trg_label_val = nodes_row[trg_label] + + # iterate through all the sources + idx_begin = edges_h5['indptr'][trg_gid] + idx_end = edges_h5['indptr'][trg_gid+1] + for src_gid in edges_h5['src_gids'][idx_begin:idx_end]: + # find each source_label, use value to find edge_type_id + # TODO: may be faster to filter by model_id, trg_label_val before iterating through the sources + src_label_val = src_nodes_df.loc[src_gid][src_label] + edge_type_id = edge_types_df.loc[model_id, trg_label_val, src_label_val]['edge_type_id'] + edge_types_ids[index] = edge_type_id + index += 1 + + if trg_gid % ten_percent == 0 and trg_gid != 0: + print(' processed {} out of {} targets'.format(trg_gid, n_targets)) + + # Create the target_gid table + print('Creating target_gid dataset') + trg_gids = np.zeros(n_edges) + for trg_gid in xrange(n_targets): + idx_begin = edges_h5['indptr'][trg_gid] + idx_end = edges_h5['indptr'][trg_gid+1] + trg_gids[idx_begin:idx_end] = [trg_gid]*(idx_end - idx_begin) + + # Save edges.h5 + edges_output_fn = '{}/{}_{}_edges.h5'.format(output_dir, src_network, trg_network) + print('Saving edges to {}.'.format(edges_output_fn)) + with h5py.File(edges_output_fn, 'w') as hf: + hf.create_dataset('edges/target_gid', data=trg_gids, dtype='uint64') + hf['edges/target_gid'].attrs['node_population'] = trg_network + hf.create_dataset('edges/source_gid', data=edges_h5['src_gids'], dtype='uint64') + hf['edges/source_gid'].attrs['node_population'] = trg_network + hf.create_dataset('edges/index_pointer', data=edges_h5['indptr']) + hf.create_dataset('edges/edge_group', data=np.zeros(n_edges), dtype='uint32') + hf.create_dataset('edges/edge_group_index', data=np.arange(0, n_edges)) + hf.create_dataset('edges/edge_type_id', data=edge_types_ids) + + hf.create_dataset('edges/0/nsyns', data=edges_h5['nsyns'], dtype='uint32') + + # Save edge_types.csv + update_edge_types_file(edge_types_file, src_network, trg_network, output_dir) + ''' + edges_types_output_fn = '{}/{}_{}_edge_types.csv'.format(output_dir, src_network, trg_network) + print('Saving edge-types to {}'.format(edges_types_output_fn)) + edge_types_df = edge_types_df[edge_types_df['edge_type_id'].isin(np.unique(edge_types_ids))] + # reorder columns + reorderd_cols = columns_order + [cn for cn in edge_types_df.columns.tolist() if cn not in columns_order] + edge_types_df = edge_types_df[reorderd_cols] + edge_types_df.to_csv(edges_types_output_fn, sep=' ', index=False, na_rep='NONE') + ''' + + +INDEX_TARGET = 0 +INDEX_SOURCE = 1 + + +def create_index(node_ids_ds, output_grp, index_type=INDEX_TARGET): + if index_type == INDEX_TARGET: + edge_nodes = np.array(node_ids_ds, dtype=np.int64) + output_grp = output_grp.create_group('indicies/target_to_source') + elif index_type == INDEX_SOURCE: + edge_nodes = np.array(node_ids_ds, dtype=np.int64) + output_grp = output_grp.create_group('indicies/source_to_target') + + edge_nodes = np.append(edge_nodes, [-1]) + n_targets = np.max(edge_nodes) + ranges_list = [[] for _ in xrange(n_targets + 1)] + + n_ranges = 0 + begin_index = 0 + cur_trg = edge_nodes[begin_index] + for end_index, trg_gid in enumerate(edge_nodes): + if cur_trg != trg_gid: + ranges_list[cur_trg].append((begin_index, end_index)) + cur_trg = int(trg_gid) + begin_index = end_index + n_ranges += 1 + + node_id_to_range = np.zeros((n_targets+1, 2)) + range_to_edge_id = np.zeros((n_ranges, 2)) + range_index = 0 + for node_index, trg_ranges in enumerate(ranges_list): + if len(trg_ranges) > 0: + node_id_to_range[node_index, 0] = range_index + for r in trg_ranges: + range_to_edge_id[range_index, :] = r + range_index += 1 + node_id_to_range[node_index, 1] = range_index + + output_grp.create_dataset('range_to_edge_id', data=range_to_edge_id, dtype='uint64') + output_grp.create_dataset('node_id_to_range', data=node_id_to_range, dtype='uint64') \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/utils/converters/sonata/node_converters.py b/bmtk-vb/build/lib/bmtk/utils/converters/sonata/node_converters.py new file mode 100644 index 0000000..befab51 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/converters/sonata/node_converters.py @@ -0,0 +1,399 @@ +import os + +import h5py +import pandas as pd +import numpy as np + + +def convert_nodes(nodes_file, node_types_file, **params): + is_h5 = False + try: + h5file = h5py.File(nodes_file, 'r') + is_h5 = True + except Exception as e: + pass + + if is_h5: + update_h5_nodes(nodes_file, node_types_file, **params) + return + + update_csv_nodes(nodes_file, node_types_file, **params) + + +# columns which need to be renamed, key is original name and value is the updated name +column_renames = { + 'id': 'node_id', + 'model_id': 'node_type_id', + 'electrophysiology': 'dynamics_params', + 'level_of_detail': 'model_type', + 'morphology': 'morphology', + 'params_file': 'dynamics_params', + 'x_soma': 'x', + 'y_soma': 'y', + 'z_soma': 'z' +} + + +def update_h5_nodes(nodes_file, node_types_file, network_name, output_dir='output', + column_order=('node_type_id', 'model_type', 'model_template', 'model_processing', 'dynamics_params', + 'morphology')): + # open nodes and node-types into a single table + input_h5 = h5py.File(nodes_file, 'r') + + output_name = '{}_nodes.h5'.format(network_name) + if not os.path.exists(output_dir): + os.makedirs(output_dir) + nodes_output_fn = os.path.join(output_dir, output_name) + + # save nodes hdf5 + with h5py.File(nodes_output_fn, 'w') as h5: + #h5.copy() + #grp = h5.create_group('/nodes/{}'.format(network_name)) + #input_grp = input_h5['/nodes/'] + nodes_path = '/nodes/{}'.format(network_name) + h5.copy(input_h5['/nodes/'], nodes_path) + grp = h5[nodes_path] + grp.move('node_gid', 'node_id') + grp.move('node_group', 'node_group_id') + + node_types_csv = pd.read_csv(node_types_file, sep=' ') + + node_types_csv = node_types_csv.rename(index=str, columns=column_renames) + + # Change values for model type + model_type_map = { + 'biophysical': 'biophysical', + 'point_IntFire1': 'point_process', + 'intfire': 'point_process', + 'virtual': 'virtual', + 'iaf_psc_alpha': 'nest:iaf_psc_alpha', + 'filter': 'virtual' + } + node_types_csv['model_type'] = node_types_csv.apply(lambda row: model_type_map[row['model_type']], axis=1) + + # Add model_template column + def model_template(row): + model_type = row['model_type'] + if model_type == 'biophysical': + return 'ctdb:Biophys1.hoc' + elif model_type == 'point_process': + return 'nrn:IntFire1' + else: + return 'NONE' + node_types_csv['model_template'] = node_types_csv.apply(model_template, axis=1) + + # Add model_processing column + def model_processing(row): + model_type = row['model_type'] + if model_type == 'biophysical': + return 'aibs_perisomatic' + else: + return 'NONE' + node_types_csv['model_processing'] = node_types_csv.apply(model_processing, axis=1) + + # Reorder columns + orig_columns = node_types_csv.columns + col_order = [cn for cn in column_order if cn in orig_columns] + col_order += [cn for cn in node_types_csv.columns if cn not in column_order] + node_types_csv = node_types_csv[col_order] + + # Save node-types csv + node_types_output_fn = os.path.join(output_dir, '{}_node_types.csv'.format(network_name)) + node_types_csv.to_csv(node_types_output_fn, sep=' ', index=False, na_rep='NONE') + # open nodes and node-types into a single table + + ''' + print('loading csv files') + nodes_tmp = pd.read_csv(nodes_file, sep=' ') + node_types_tmp = pd.read_csv(node_types_file, sep=' ') + nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='node_type_id') + n_nodes = len(nodes_df.index) + + # rename required columns + nodes_df = nodes_df.rename(index=str, columns=column_renames) + + # Old versions of node_type_id may be set to strings/floats, convert to integers + dtype_ntid = nodes_df['node_type_id'].dtype + if dtype_ntid == 'object': + # if string, move model_id to pop_name and create an integer node_type_id column + if 'pop_name' in nodes_df.columns: + nodes_df = nodes_df.drop('pop_name', axis=1) + nodes_df = nodes_df.rename(index=str, columns={'node_type_id': 'pop_name'}) + ntid_map = {pop_name: indx for indx, pop_name in enumerate(nodes_df['pop_name'].unique())} + nodes_df['node_type_id'] = nodes_df.apply(lambda row: ntid_map[row['pop_name']], axis=1) + + elif dtype_ntid == 'float64': + nodes_df['node_type_id'] = nodes_df['node_type_id'].astype('uint64') + + # divide columns up into nodes and node-types columns, and for nodes determine which columns are valid for every + # node-type. The rules are + # 1. If all values are the same for a node-type-id, column belongs in node_types csv. If there's any intra + # node-type heterogenity then the column belongs in the nodes h5. + # 2. For nodes h5 columns, a column belongs to a node-type-id if it contains at least one non-null value + print('parsing input') + opt_columns = [n for n in nodes_df.columns if n not in ['node_id', 'node_type_id']] + heterogeneous_cols = {cn: False for cn in opt_columns} + nonnull_cols = {} # for each node-type, a list of columns that contains at least one non-null value + for node_type_id, nt_group in nodes_df.groupby(['node_type_id']): + nonnull_cols[node_type_id] = set(nt_group.columns[nt_group.isnull().any() == False].tolist()) + for col_name in opt_columns: + heterogeneous_cols[col_name] |= len(nt_group[col_name].unique()) > 1 + + nodes_columns = set(cn for cn, val in heterogeneous_cols.items() if val) + nodes_types_columns = [cn for cn, val in heterogeneous_cols.items() if not val] + + # Check for nodes columns that has non-numeric values, these will require some special processing to save to hdf5 + string_nodes_columns = set() + for col_name in nodes_columns: + if nodes_df[col_name].dtype == 'object': + string_nodes_columns.add(col_name) + if len(string_nodes_columns) > 0: + print('Warning: column(s) {} have non-numeric values that vary within a node-type and will be stored in h5 format'.format(list(string_nodes_columns))) + + # Divide the nodes columns into groups and create neccessary lookup tables. If two node-types share the same + # non-null columns then they belong to the same group + grp_idx2cols = {} # group-id --> group-columns + grp_cols2idx = {} # group-columns --> group-id + grp_id2idx = {} # node-type-id --> group-id + group_index = -1 + for nt_id, cols in nonnull_cols.items(): + group_columns = sorted(list(nodes_columns & cols)) + col_key = tuple(group_columns) + if col_key in grp_cols2idx: + grp_id2idx[nt_id] = grp_cols2idx[col_key] + else: + group_index += 1 + grp_cols2idx[col_key] = group_index + grp_idx2cols[group_index] = group_columns + grp_id2idx[nt_id] = group_index + + # merge x,y,z columns, if they exists, into 'positions' dataset + grp_pos_cols = {} + for grp_idx, cols in grp_idx2cols.items(): + pos_list = [] + for coord in ['x', 'y', 'z']: + if coord in cols: + pos_list += coord + grp_idx2cols[grp_idx].remove(coord) + if len(pos_list) > 0: + grp_pos_cols[grp_idx] = pos_list + + # Create the node_group and node_group_index columns + nodes_df['__bmtk_node_group'] = nodes_df.apply(lambda row: grp_id2idx[row['node_type_id']], axis=1) + nodes_df['__bmtk_node_group_index'] = [0]*n_nodes + for grpid in grp_idx2cols.keys(): + group_size = len(nodes_df[nodes_df['__bmtk_node_group'] == grpid]) + nodes_df.loc[nodes_df['__bmtk_node_group'] == grpid, '__bmtk_node_group_index'] = range(group_size) + + # Save nodes.h5 file + nodes_output_fn = os.path.join(output_dir, '{}_nodes.h5'.format(network_name)) + node_types_output_fn = os.path.join(output_dir, '{}_node_types.csv'.format(network_name)) + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + print('Creating {}'.format(nodes_output_fn)) + with h5py.File(nodes_output_fn, 'w') as hf: + hf.create_dataset('nodes/node_gid', data=nodes_df['node_id'], dtype='uint64') + hf['nodes/node_gid'].attrs['network'] = network_name + hf.create_dataset('nodes/node_type_id', data=nodes_df['node_type_id'], dtype='uint64') + hf.create_dataset('nodes/node_group', data=nodes_df['__bmtk_node_group'], dtype='uint32') + hf.create_dataset('nodes/node_group_index', data=nodes_df['__bmtk_node_group_index'], dtype='uint64') + + for grpid, cols in grp_idx2cols.items(): + group_slice = nodes_df[nodes_df['__bmtk_node_group'] == grpid] + for col_name in cols: + dataset_name = 'nodes/{}/{}'.format(grpid, col_name) + if col_name in string_nodes_columns: + # for columns with non-numeric values + dt = h5py.special_dtype(vlen=bytes) + hf.create_dataset(dataset_name, data=group_slice[col_name], dtype=dt) + else: + hf.create_dataset(dataset_name, data=group_slice[col_name]) + + # special case for positions + if grpid in grp_pos_cols: + hf.create_dataset('nodes/{}/positions'.format(grpid), + data=group_slice.as_matrix(columns=grp_pos_cols[grpid])) + + # Save the node_types.csv file + print('Creating {}'.format(node_types_output_fn)) + node_types_table = nodes_df[['node_type_id'] + nodes_types_columns] + node_types_table = node_types_table.drop_duplicates() + if len(sort_order) > 0: + node_types_table = node_types_table.sort_values(by=sort_order) + + node_types_table.to_csv(node_types_output_fn, sep=' ', index=False) # , na_rep='NONE') + ''' + + +def update_csv_nodes(nodes_file, node_types_file, network_name, output_dir='network', + column_order=('node_type_id', 'model_type', 'model_template', 'model_processing', + 'dynamics_params', 'morphology')): + # open nodes and node-types into a single table + print('loading csv files') + nodes_tmp = pd.read_csv(nodes_file, sep=' ') + node_types_tmp = pd.read_csv(node_types_file, sep=' ') + if 'model_id' in nodes_tmp: + nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='model_id') + elif 'node_type_id' in nodes_tmp: + nodes_df = pd.merge(nodes_tmp, node_types_tmp, on='node_type_id') + else: + raise Exception('Could not find column to merge nodes and node_types') + + n_nodes = len(nodes_df.index) + + # rename required columns + nodes_df = nodes_df.rename(index=str, columns=column_renames) + + # Old versions of node_type_id may be set to strings/floats, convert to integers + dtype_ntid = nodes_df['node_type_id'].dtype + if dtype_ntid == 'object': + # if string, move model_id to pop_name and create an integer node_type_id column + if 'pop_name' in nodes_df: + nodes_df = nodes_df.drop('pop_name', axis=1) + + nodes_df = nodes_df.rename(index=str, columns={'node_type_id': 'pop_name'}) + + ntid_map = {pop_name: indx for indx, pop_name in enumerate(nodes_df['pop_name'].unique())} + nodes_df['node_type_id'] = nodes_df.apply(lambda row: ntid_map[row['pop_name']], axis=1) + + elif dtype_ntid == 'float64': + nodes_df['node_type_id'] = nodes_df['node_type_id'].astype('uint64') + + # divide columns up into nodes and node-types columns, and for nodes determine which columns are valid for every + # node-type. The rules are + # 1. If all values are the same for a node-type-id, column belongs in node_types csv. If there's any intra + # node-type heterogenity then the column belongs in the nodes h5. + # 2. For nodes h5 columns, a column belongs to a node-type-id if it contains at least one non-null value + print('parsing input') + opt_columns = [n for n in nodes_df.columns if n not in ['node_id', 'node_type_id']] + heterogeneous_cols = {cn: False for cn in opt_columns} + nonnull_cols = {} # for each node-type, a list of columns that contains at least one non-null value + for node_type_id, nt_group in nodes_df.groupby(['node_type_id']): + nonnull_cols[node_type_id] = set(nt_group.columns[nt_group.isnull().any() == False].tolist()) + for col_name in opt_columns: + heterogeneous_cols[col_name] |= len(nt_group[col_name].unique()) > 1 + + nodes_columns = set(cn for cn, val in heterogeneous_cols.items() if val) + nodes_types_columns = [cn for cn, val in heterogeneous_cols.items() if not val] + + # Check for nodes columns that has non-numeric values, these will require some special processing to save to hdf5 + string_nodes_columns = set() + for col_name in nodes_columns: + if nodes_df[col_name].dtype == 'object': + string_nodes_columns.add(col_name) + if len(string_nodes_columns) > 0: + print('Warning: column(s) {} have non-numeric values that vary within a node-type and will be stored in h5 format'.format(list(string_nodes_columns))) + + # Divide the nodes columns into groups and create neccessary lookup tables. If two node-types share the same + # non-null columns then they belong to the same group + grp_idx2cols = {} # group-id --> group-columns + grp_cols2idx = {} # group-columns --> group-id + grp_id2idx = {} # node-type-id --> group-id + group_index = -1 + for nt_id, cols in nonnull_cols.items(): + group_columns = sorted(list(nodes_columns & cols)) + col_key = tuple(group_columns) + if col_key in grp_cols2idx: + grp_id2idx[nt_id] = grp_cols2idx[col_key] + else: + group_index += 1 + grp_cols2idx[col_key] = group_index + grp_idx2cols[group_index] = group_columns + grp_id2idx[nt_id] = group_index + + # merge x,y,z columns, if they exists, into 'positions' dataset + grp_pos_cols = {} + for grp_idx, cols in grp_idx2cols.items(): + pos_list = [] + for coord in ['x', 'y', 'z']: + if coord in cols: + pos_list += coord + grp_idx2cols[grp_idx].remove(coord) + if len(pos_list) > 0: + grp_pos_cols[grp_idx] = pos_list + + # Create the node_group and node_group_index columns + nodes_df['__bmtk_node_group'] = nodes_df.apply(lambda row: grp_id2idx[row['node_type_id']], axis=1) + nodes_df['__bmtk_node_group_index'] = [0]*n_nodes + for grpid in grp_idx2cols.keys(): + group_size = len(nodes_df[nodes_df['__bmtk_node_group'] == grpid]) + nodes_df.loc[nodes_df['__bmtk_node_group'] == grpid, '__bmtk_node_group_index'] = range(group_size) + + # Save nodes.h5 file + nodes_output_fn = os.path.join(output_dir, '{}_nodes.h5'.format(network_name)) + node_types_output_fn = os.path.join(output_dir, '{}_node_types.csv'.format(network_name)) + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + print('Creating {}'.format(nodes_output_fn)) + with h5py.File(nodes_output_fn, 'w') as hf: + grp = hf.create_group('/nodes/{}'.format(network_name)) + grp.create_dataset('node_id', data=nodes_df['node_id'], dtype='uint64') + grp.create_dataset('node_type_id', data=nodes_df['node_type_id'], dtype='uint64') + grp.create_dataset('node_group_id', data=nodes_df['__bmtk_node_group'], dtype='uint32') + grp.create_dataset('node_group_index', data=nodes_df['__bmtk_node_group_index'], dtype='uint64') + + for grpid, cols in grp_idx2cols.items(): + group_slice = nodes_df[nodes_df['__bmtk_node_group'] == grpid] + for col_name in cols: + dataset_name = '{}/{}'.format(grpid, col_name) + if col_name in string_nodes_columns: + # for columns with non-numeric values + dt = h5py.special_dtype(vlen=bytes) + grp.create_dataset(dataset_name, data=group_slice[col_name], dtype=dt) + else: + grp.create_dataset(dataset_name, data=group_slice[col_name]) + + # special case for positions + if grpid in grp_pos_cols: + grp.create_dataset('{}/positions'.format(grpid), + data=group_slice.as_matrix(columns=grp_pos_cols[grpid])) + + # Create empty dynamics_params + grp.create_group('{}/dynamics_params'.format(grpid)) + + # Save the node_types.csv file + print('Creating {}'.format(node_types_output_fn)) + node_types_table = nodes_df[['node_type_id'] + nodes_types_columns] + node_types_table = node_types_table.drop_duplicates() + + # Change values for model type + model_type_map = { + 'biophysical': 'biophysical', + 'point_IntFire1': 'point_process', + 'virtual': 'virtual', + 'intfire': 'point_process', + 'filter': 'virtual' + } + node_types_table['model_type'] = node_types_table.apply(lambda row: model_type_map[row['model_type']], axis=1) + if 'set_params_function' in node_types_table: + node_types_table = node_types_table.drop('set_params_function', axis=1) + + # Add model_template column + def model_template(row): + model_type = row['model_type'] + if model_type == 'biophysical': + return 'ctdb:Biophys1.hoc' + elif model_type == 'point_process': + return 'nrn:IntFire1' + else: + return 'NONE' + node_types_table['model_template'] = node_types_table.apply(model_template, axis=1) + + # Add model_processing column + def model_processing(row): + model_type = row['model_type'] + if model_type == 'biophysical': + return 'aibs_perisomatic' + else: + return 'NONE' + node_types_table['model_processing'] = node_types_table.apply(model_processing, axis=1) + + # Reorder columns + orig_columns = node_types_table.columns + col_order = [cn for cn in column_order if cn in orig_columns] + col_order += [cn for cn in node_types_table.columns if cn not in column_order] + node_types_table = node_types_table[col_order] + + node_types_table.to_csv(node_types_output_fn, sep=' ', index=False, na_rep='NONE') diff --git a/bmtk-vb/build/lib/bmtk/utils/io/__init__.py b/bmtk-vb/build/lib/bmtk/utils/io/__init__.py new file mode 100644 index 0000000..aaccbcd --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/io/__init__.py @@ -0,0 +1,27 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +#from tabular_network_v1 import TabularNetwork +#from tabular_network_v0 import TabularNetwork as TabularNetwork_AI + +def log_warning(message): + pass \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/utils/io/cell_vars.py b/bmtk-vb/build/lib/bmtk/utils/io/cell_vars.py new file mode 100644 index 0000000..a5646d7 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/io/cell_vars.py @@ -0,0 +1,361 @@ +import os +import h5py +import numpy as np + +from bmtk.utils import io +from bmtk.utils.sonata.utils import add_hdf5_magic, add_hdf5_version + + +try: + from mpi4py import MPI + comm = MPI.COMM_WORLD + rank = comm.Get_rank() + nhosts = comm.Get_size() + +except Exception as exc: + pass + + +class CellVarRecorder(object): + """Used to save cell membrane variables (V, Ca2+, etc) to the described hdf5 format. + + For parallel simulations this class will write to a seperate tmp file on each rank, then use the merge method to + combine the results. This is less efficent, but doesn't require the user to install mpi4py and build h5py in + parallel mode. For better performance use the CellVarRecorderParrallel class instead. + """ + _io = io + + class DataTable(object): + """A small struct to keep track of different */data (and buffer) tables""" + def __init__(self, var_name): + self.var_name = var_name + # If buffering data, buffer_block will be an in-memory array and will write to data_block during when + # filled. If not buffering buffer_block is an hdf5 dataset and data_block is ignored + self.data_block = None + self.buffer_block = None + + def __init__(self, file_name, tmp_dir, variables, buffer_data=True, mpi_rank=0, mpi_size=1): + self._file_name = file_name + self._h5_handle = None + self._tmp_dir = tmp_dir + self._variables = variables if isinstance(variables, list) else [variables] + self._n_vars = len(self._variables) # Used later to keep track if more than one var is saved to the same file. + + self._mpi_rank = mpi_rank + self._mpi_size = mpi_size + self._tmp_files = [] + self._saved_file = file_name + + if mpi_size > 1 and not isinstance(self, CellVarRecorderParallel): + self._io.log_warning('Was unable to run h5py in parallel (mpi) mode.' + + ' Saving of membrane variable(s) may slow down.') + tmp_fname = os.path.basename(file_name) # make sure file names don't clash if there are multiple reports + self._tmp_files = [os.path.join(tmp_dir, '__bmtk_tmp_cellvars_{}_{}'.format(r, tmp_fname)) + for r in range(self._mpi_size)] + self._file_name = self._tmp_files[self._mpi_rank] + + self._mapping_gids = [] # list of gids in the order they appear in the data + self._gid_map = {} # table for looking up the gid offsets + + self._mapping_element_ids = [] # sections + self._mapping_element_pos = [] # segments + self._mapping_index = [0] # index_pointer + + self._buffer_data = buffer_data + self._data_blocks = {var_name: self.DataTable(var_name) for var_name in self._variables} + self._last_save_indx = 0 # for buffering, used to keep track of last timestep data was saved to disk + + self._buffer_block_size = 0 + self._total_steps = 0 + + # Keep track of gids across the different ranks + self._n_gids_all = 0 + self._n_gids_local = 0 + self._gids_beg = 0 + self._gids_end = 0 + + # Keep track of segment counts across the different ranks + self._n_segments_all = 0 + self._n_segments_local = 0 + self._seg_offset_beg = 0 + self._seg_offset_end = 0 + + self._tstart = 0.0 + self._tstop = 0.0 + self._dt = 0.01 + self._is_initialized = False + + @property + def tstart(self): + return self._tstart + + @tstart.setter + def tstart(self, time_ms): + self._tstart = time_ms + + @property + def tstop(self): + return self._tstop + + @tstop.setter + def tstop(self, time_ms): + self._tstop = time_ms + + @property + def dt(self): + return self._dt + + @dt.setter + def dt(self, time_ms): + self._dt = time_ms + + @property + def is_initialized(self): + return self._is_initialized + + def _calc_offset(self): + self._n_segments_all = self._n_segments_local + self._seg_offset_beg = 0 + self._seg_offset_end = self._n_segments_local + + self._n_gids_all = self._n_gids_local + self._gids_beg = 0 + self._gids_end = self._n_gids_local + + def _create_h5_file(self): + self._h5_handle = h5py.File(self._file_name, 'w') + add_hdf5_version(self._h5_handle) + add_hdf5_magic(self._h5_handle) + + def add_cell(self, gid, sec_list, seg_list): + assert(len(sec_list) == len(seg_list)) + # TODO: Check the same gid isn't added twice + n_segs = len(seg_list) + self._gid_map[gid] = (self._n_segments_local, self._n_segments_local + n_segs) + self._mapping_gids.append(gid) + self._mapping_element_ids.extend(sec_list) + self._mapping_element_pos.extend(seg_list) + self._mapping_index.append(self._mapping_index[-1] + n_segs) + self._n_segments_local += n_segs + self._n_gids_local += 1 + + def _create_big_dataset(self, where, name, shape, dtype): + """ + Create and return a dataset that doesn't get filled right when created + """ + spaceid = h5py.h5s.create_simple(shape) + plist = h5py.h5p.create(h5py.h5p.DATASET_CREATE) + plist.set_fill_time(h5py.h5d.FILL_TIME_NEVER) + if shape[0] < 500 or shape[1] < 512: + chunkshape = shape + else: + chunkshape = (shape[0]/500, shape[1]/512) # TODO: don't use fixed values? + plist.set_chunk(chunkshape) + datasetid = h5py.h5d.create(where.id,name,h5py.h5t.NATIVE_FLOAT, spaceid, plist) + return h5py.Dataset(datasetid) + + def initialize(self, n_steps, buffer_size=0): + self._calc_offset() + self._create_h5_file() + + var_grp = self._h5_handle.create_group('/mapping') + var_grp.create_dataset('gids', shape=(self._n_gids_all,), dtype=np.uint) + var_grp.create_dataset('element_id', shape=(self._n_segments_all,), dtype=np.uint) + var_grp.create_dataset('element_pos', shape=(self._n_segments_all,), dtype=np.float) + var_grp.create_dataset('index_pointer', shape=(self._n_gids_all+1,), dtype=np.uint64) + var_grp.create_dataset('time', data=[self.tstart, self.tstop, self.dt]) + + var_grp['gids'][self._gids_beg:self._gids_end] = self._mapping_gids + var_grp['element_id'][self._seg_offset_beg:self._seg_offset_end] = self._mapping_element_ids + var_grp['element_pos'][self._seg_offset_beg:self._seg_offset_end] = self._mapping_element_pos + var_grp['index_pointer'][self._gids_beg:(self._gids_end+1)] = self._mapping_index + + self._total_steps = n_steps + self._buffer_block_size = buffer_size + if not self._buffer_data: + # If data is not being buffered and instead written to the main block, we have to add a rank offset + # to the gid offset + for gid, gid_offset in self._gid_map.items(): + self._gid_map[gid] = (gid_offset[0] + self._seg_offset_beg, gid_offset[1] + self._seg_offset_beg) + + for var_name, data_tables in self._data_blocks.items(): + # If users are trying to save multiple variables in the same file put data table in its own /{var} group + # (not sonata compliant). Otherwise the data table is located at the root + data_grp = self._h5_handle if self._n_vars == 1 else self._h5_handle.create_group('/{}'.format(var_name)) + if self._buffer_data: + # Set up in-memory block to buffer recorded variables before writing to the dataset + data_tables.buffer_block = np.zeros((buffer_size, self._n_segments_local), dtype=np.float) + # data_tables.data_block = data_grp.create_dataset('data', shape=(n_steps, self._n_segments_all), + # dtype=np.float, chunks=True) + data_tables.data_block = self._create_big_dataset(data_grp, 'data', (n_steps, self._n_segments_all), np.float) + data_tables.data_block.attrs['variable_name'] = var_name + else: + # Since we are not buffering data, we just write directly to the on-disk dataset + data_tables.buffer_block = data_grp.create_dataset('data', shape=(n_steps, self._n_segments_all), + dtype=np.float, chunks=True) + data_tables.buffer_block.attrs['variable_name'] = var_name + + self._is_initialized = True + + def record_cell(self, gid, var_name, seg_vals, tstep): + """Record cell parameters. + + :param gid: gid of cell. + :param var_name: name of variable being recorded. + :param seg_vals: list of all segment values + :param tstep: time step + """ + gid_beg, gid_end = self._gid_map[gid] + buffer_block = self._data_blocks[var_name].buffer_block + update_index = (tstep - self._last_save_indx) + buffer_block[update_index, gid_beg:gid_end] = seg_vals + + def record_cell_block(self, gid, var_name, seg_vals): + """Save cell parameters one block at a time + + :param gid: gid of cell. + :param var_name: name of variable being recorded. + :param seg_vals: A vector/matrix of values being recorded + """ + gid_beg, gid_end = self._gid_map[gid] + buffer_block = self._data_blocks[var_name].buffer_block + if gid_end - gid_beg == 1: + buffer_block[:, gid_beg] = seg_vals + else: + buffer_block[:, gid_beg:gid_end] = seg_vals + + def flush(self): + """Move data from memory to dataset""" + if self._buffer_data: + blk_beg = self._last_save_indx + blk_end = blk_beg + self._buffer_block_size + if blk_end > self._total_steps: + # Need to handle the case that simulation doesn't end on a block step + blk_end = blk_beg + self._total_steps - blk_beg + seg_beg, seg_end = self._seg_offset_beg, self._seg_offset_end + + block_size = blk_end - blk_beg + self._last_save_indx += block_size + + for _, data_table in self._data_blocks.items(): + dat, buf = data_table.data_block, data_table.buffer_block + dat[blk_beg:blk_end, seg_beg:seg_end] = buf[:block_size, :] + + def close(self): + self._h5_handle.close() + + def merge(self): + if self._mpi_size > 1 and self._mpi_rank == 0: + h5final = h5py.File(self._saved_file, 'w') + tmp_h5_handles = [h5py.File(name, 'r') for name in self._tmp_files] + + # Find the gid and segment offsets for each temp h5 file + gid_ranges = [] # list of (gid-beg, gid-end) + gid_offset = 0 + total_gid_count = 0 # total number of gids across all ranks + + seg_ranges = [] + seg_offset = 0 + total_seg_count = 0 # total number of segments across all ranks + time_ds = None + for h5_tmp in tmp_h5_handles: + seg_count = len(h5_tmp['/mapping/element_pos']) + seg_ranges.append((seg_offset, seg_offset+seg_count)) + seg_offset += seg_count + total_seg_count += seg_count + + gid_count = len(h5_tmp['mapping/gids']) + gid_ranges.append((gid_offset, gid_offset+gid_count)) + gid_offset += gid_count + total_gid_count += gid_count + + time_ds = h5_tmp['mapping/time'] + + mapping_grp = h5final.create_group('mapping') + if time_ds: + mapping_grp.create_dataset('time', data=time_ds) + element_id_ds = mapping_grp.create_dataset('element_id', shape=(total_seg_count,), dtype=np.uint) + el_pos_ds = mapping_grp.create_dataset('element_pos', shape=(total_seg_count,), dtype=np.float) + gids_ds = mapping_grp.create_dataset('gids', shape=(total_gid_count,), dtype=np.uint) + index_pointer_ds = mapping_grp.create_dataset('index_pointer', shape=(total_gid_count+1,), dtype=np.uint) + + # combine the /mapping datasets + for i, h5_tmp in enumerate(tmp_h5_handles): + tmp_mapping_grp = h5_tmp['mapping'] + beg, end = seg_ranges[i] + element_id_ds[beg:end] = tmp_mapping_grp['element_id'] + el_pos_ds[beg:end] = tmp_mapping_grp['element_pos'] + + # shift the index pointer values + index_pointer = np.array(tmp_mapping_grp['index_pointer']) + update_index = beg + index_pointer + + beg, end = gid_ranges[i] + gids_ds[beg:end] = tmp_mapping_grp['gids'] + index_pointer_ds[beg:(end+1)] = update_index + + # combine the /var/data datasets + for var_name in self._variables: + data_name = '/data' if self._n_vars == 1 else '/{}/data'.format(var_name) + # data_name = '/{}/data'.format(var_name) + var_data = h5final.create_dataset(data_name, shape=(self._total_steps, total_seg_count), dtype=np.float) + var_data.attrs['variable_name'] = var_name + for i, h5_tmp in enumerate(tmp_h5_handles): + beg, end = seg_ranges[i] + var_data[:, beg:end] = h5_tmp[data_name] + + for tmp_file in self._tmp_files: + os.remove(tmp_file) + + +class CellVarRecorderParallel(CellVarRecorder): + """ + Unlike the parent, this take advantage of parallel h5py to writting to the results file across different ranks. + + """ + def __init__(self, file_name, tmp_dir, variables, buffer_data=True, mpi_rank=0, mpi_size=1): + super(CellVarRecorderParallel, self).__init__( + file_name, tmp_dir, variables, buffer_data=buffer_data, + mpi_rank=mpi_rank, mpi_size=mpi_size + ) + + def _calc_offset(self): + # iterate through the ranks let rank r determine the offset from rank r-1 + for r in range(comm.Get_size()): + if rank == r: + if rank > 0: + # get num of segments and gids from prev. rank and calculate offsets + offsets = np.empty(2, dtype=np.uint) + comm.Recv([offsets, MPI.UNSIGNED_INT], source=(r-1)) + self._seg_offset_beg = offsets[0] + self._gids_beg = offsets[1] + + # for some reason, np.uint64 + int = np.float64, so need cast to int + self._seg_offset_end = int(self._seg_offset_beg) \ + + int(self._n_segments_local) + self._gids_end = int(self._gids_beg) + int(self._n_gids_local) + + if rank < (nhosts - 1): + # pass the next rank its offset + offsets = np.array([self._seg_offset_end, self._gids_end], dtype=np.uint) + comm.Send([offsets, MPI.UNSIGNED_INT], dest=(rank+1)) + + comm.Barrier() + + # broadcast the total num of gids/segments from the final rank to all the others + if rank == (nhosts - 1): + total_counts = np.array([self._seg_offset_end, self._gids_end], dtype=np.uint) + else: + total_counts = np.empty(2, dtype=np.uint) + + comm.Bcast(total_counts, root=(nhosts-1)) + self._n_segments_all = total_counts[0] + self._n_gids_all = total_counts[1] + + def _create_h5_file(self): + self._h5_handle = h5py.File(self._file_name, 'w', driver='mpio', comm=MPI.COMM_WORLD) + add_hdf5_version(self._h5_handle) + add_hdf5_magic(self._h5_handle) + + def merge(self): + pass diff --git a/bmtk-vb/build/lib/bmtk/utils/io/firing_rates.py b/bmtk-vb/build/lib/bmtk/utils/io/firing_rates.py new file mode 100644 index 0000000..827cc21 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/io/firing_rates.py @@ -0,0 +1,35 @@ +import pandas as pd +import csv + +class RatesInput(object): + def __init__(self, params): + self._rates_df = pd.read_csv(params['rates'], sep=' ') + self._node_population = params['node_set'] + self._rates_dict = {int(row['gid']): row['firing_rate'] for _, row in self._rates_df.iterrows()} + + @property + def populations(self): + return [self._node_population] + + def get_rate(self, gid): + return self._rates_dict[gid] + + +class RatesWriter(object): + def __init__(self, file_name): + self._file_name = file_name + self._fhandle = open(file_name, 'a') + self._csv_writer = csv.writer(self._fhandle, delimiter=' ') + + def add_rates(self, gid, times, rates): + for t, r in zip(times, rates): + self._csv_writer.writerow([gid, t, r]) + self._fhandle.flush() + + def to_csv(self, file_name): + pass + + def to_h5(self, file_name): + raise NotImplementedError + + diff --git a/bmtk-vb/build/lib/bmtk/utils/io/spike_trains.py b/bmtk-vb/build/lib/bmtk/utils/io/spike_trains.py new file mode 100644 index 0000000..73d9bfd --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/io/spike_trains.py @@ -0,0 +1,312 @@ +import os +import sys +import csv + +import h5py +import pandas as pd +import numpy as np +from bmtk.utils.sonata.utils import add_hdf5_magic, add_hdf5_version + + +class SpikeTrainWriter(object): + class TmpFileMetadata(object): + def __init__(self, file_name, sort_order=None): + self.file_name = file_name + self.sort_order = sort_order + + def __init__(self, tmp_dir, mpi_rank=0, mpi_size=1): + # For NEST/NEURON based simulations it is prefereable not to use mpi4py, so let the parent simulator determine + # MPI rank and size + self._mpi_rank = mpi_rank + self._mpi_size = mpi_size + + # used to temporary save spike files since for large simulations saving spikes into memory can crash the + # system. Requires the user to create the directory + self._tmp_dir = tmp_dir + if self._tmp_dir is None or not os.path.exists(self._tmp_dir): + raise Exception('Directory path {} does not exists'.format(self._tmp_dir)) + self._all_tmp_files = [self.TmpFileMetadata(self._get_tmp_filename(r)) for r in range(mpi_size)] + # TODO: Determine best buffer size. + self._tmp_file_handle = open(self._all_tmp_files[mpi_rank].file_name, 'w') + + self._tmp_spikes_handles = [] # used when sorting mulitple file + self._spike_count = -1 + + # Nest gid files uses tab seperators and a different order for tmp spike files. + self.delimiter = ' ' # delimiter for temporary file + self.time_col = 0 + self.gid_col = 1 + + def _get_tmp_filename(self, rank): + return os.path.join(self._tmp_dir, '_bmtk_tmp_spikes_{}.csv'.format(rank)) + + def _count_spikes(self): + if self._mpi_rank == 0: + if self._spike_count > -1: + return self._spike_count + + self._spike_count = 0 + for tmp_file in self._all_tmp_files: + with open(tmp_file.file_name, 'r') as csvfile: + csv_reader = csv.reader(csvfile, delimiter=self.delimiter) + self._spike_count += sum(1 for _ in csv_reader) + + def _sort_tmp_file(self, filedata, sort_order): + # For now load spikes into pandas, it's the fastest way but may be an issue with memory + if sort_order is None or filedata.sort_order == sort_order: + return + + file_name = filedata.file_name + tmp_spikes_ds = pd.read_csv(file_name, sep=' ', names=['time', 'gid']) + tmp_spikes_ds = tmp_spikes_ds.sort_values(by=sort_order) + tmp_spikes_ds.to_csv(file_name, sep=' ', index=False, header=False) + filedata.sort_order = sort_order + + def _next_spike(self, rank): + try: + val = next(self._tmp_spikes_handles[rank]) + return val[0], val[1], rank + except StopIteration: + return None + + def add_spike(self, time, gid): + self._tmp_file_handle.write('{:.6f} {}\n'.format(time, gid)) + + def add_spikes(self, times, gid): + for t in times: + self.add_spike(t, gid) + + def add_spikes_file(self, file_name, sort_order=None): + self._all_tmp_files.append(self.TmpFileMetadata(file_name, sort_order)) + + def _sort_files(self, sort_order, sort_column, file_write_fnc): + self._tmp_spikes_handles = [] + for fdata in self._all_tmp_files: + self._sort_tmp_file(fdata, sort_order) + self._tmp_spikes_handles.append(csv.reader(open(fdata.file_name, 'r'), delimiter=self.delimiter)) + + spikes = [] + for rank in range(len(self._tmp_spikes_handles)): # range(self._mpi_size): + spike = self._next_spike(rank) + if spike is not None: + spikes.append(spike) + + # Iterate through all the ranks and find the first spike. Write that spike/gid to the output, then + # replace that data point with the next spike on the selected rank + indx = 0 + while spikes: + # find which rank has the first spike + selected_index = 0 + selected_val = spikes[0][sort_column] + for i, spike in enumerate(spikes[1:]): + if spike[sort_column] < selected_val: + selected_index = i + 1 + selected_val = spike[sort_column] + + # write the spike to the file + row = spikes.pop(selected_index) + file_write_fnc(float(row[self.time_col]), int(row[self.gid_col]), indx) + indx += 1 + + # get the next spike on that rank and replace in spikes table + another_spike = self._next_spike(row[2]) + if another_spike is not None: + spikes.append(another_spike) + + def _merge_files(self, file_write_fnc): + indx = 0 + for fdata in self._all_tmp_files: + if not os.path.exists(fdata.file_name): + continue + + with open(fdata.file_name, 'r') as csv_file: + csv_reader = csv.reader(csv_file, delimiter=self.delimiter) + for row in csv_reader: + file_write_fnc(float(row[self.time_col]), int(row[self.gid_col]), indx) + indx += 1 + + def _to_file(self, file_name, sort_order, file_write_fnc): + if sort_order is None: + sort_column = 0 + elif sort_order == 'time': + sort_column = self.time_col + elif sort_order == 'gid': + sort_column = self.gid_col + else: + raise Exception('Unknown sort order {}'.format(sort_order)) + + # TODO: Need to make sure an MPI_Barrier is called beforehand + self._tmp_file_handle.close() + if self._mpi_rank == 0: + if sort_order is not None: + self._sort_files(sort_order, sort_column, file_write_fnc) + else: + self._merge_files(file_write_fnc) + + def to_csv(self, csv_file, sort_order=None, gid_map=None): + # TODO: Need to call flush and then barrier + if self._mpi_rank == 0: + # For the single rank case don't just copy the tmp-csv to the new name. It will fail if user calls to_hdf5 + # or to_nwb after calling to_csv. + self._count_spikes() + csv_handle = open(csv_file, 'w') + csv_writer = csv.writer(csv_handle, delimiter=' ') + + def file_write_fnc_identity(time, gid, indx): + csv_writer.writerow([time, gid]) + + def file_write_fnc_transform(time, gid, indx): + # For the case when NEURON/NEST ids don't match with the user's gid table + csv_writer.writerow([time, gid_map[gid]]) + + file_write_fnc = file_write_fnc_identity if gid_map is None else file_write_fnc_transform + self._to_file(csv_file, sort_order, file_write_fnc) + csv_handle.close() + + # TODO: Let user pass in in barrier and use it here + + def to_nwb(self, nwb_file): + raise NotImplementedError + + def to_hdf5(self, hdf5_file, sort_order=None, gid_map=None): + if self._mpi_rank == 0: + with h5py.File(hdf5_file, 'w') as h5: + add_hdf5_magic(h5) + add_hdf5_version(h5) + + self._count_spikes() + spikes_grp = h5.create_group('/spikes') + spikes_grp.attrs['sorting'] = 'none' if sort_order is None else sort_order + time_ds = spikes_grp.create_dataset('timestamps', shape=(self._spike_count,), dtype=np.float) + gid_ds = spikes_grp.create_dataset('gids', shape=(self._spike_count,), dtype=np.uint64) + + def file_write_fnc_identity(time, gid, indx): + time_ds[indx] = time + gid_ds[indx] = gid + + def file_write_fnc_transform(time, gid, indx): + time_ds[indx] = time + gid_ds[indx] = gid_map[gid] + + file_write_fnc = file_write_fnc_identity if gid_map is None else file_write_fnc_transform + self._to_file(hdf5_file, sort_order, file_write_fnc) + + # TODO: Need to make sure a barrier is used here (before close is called) + + def flush(self): + self._tmp_file_handle.flush() + + def close(self): + if self._mpi_rank == 0: + for tmp_file in self._all_tmp_files: + if os.path.exists(tmp_file.file_name): + os.remove(tmp_file.file_name) + + +class PoissonSpikesGenerator(object): + def __init__(self, gids, firing_rate, tstart=0.0, tstop=1000.0): + self._gids = gids + self._firing_rate = firing_rate / 1000.0 + self._tstart = tstart + self._tstop = tstop + + def to_hdf5(self, file_name, sort_order='gid'): + if sort_order == 'gid': + gid_list = [] + times_list = [] + if sort_order == 'gid': + for gid in self._gids: + c_time = self._tstart + while c_time < self._tstop: + interval = -np.log(1.0 - np.random.uniform()) / self._firing_rate + c_time += interval + gid_list.append(gid) + times_list.append(c_time) + + with h5py.File(file_name, 'w') as h5: + h5.create_dataset('/spikes/gids', data=gid_list, dtype=np.uint) + h5.create_dataset('/spikes/timestamps', data=times_list, dtype=np.float) + h5['/spikes'].attrs['sorting'] = 'by_gid' + + else: + raise NotImplementedError + + +class SpikesInput(object): + def get_spikes(self, gid): + raise NotImplementedError() + + @staticmethod + def load(name, module, input_type, params): + module_lc = module.lower() + if module_lc == 'nwb': + return SpikesInputNWBv1(name, module, input_type, params) + elif module_lc == 'h5' or module_lc == 'hdf5': + return SpikesInputH5(name, module, input_type, params) + elif module_lc == 'csv': + return SpikesInputCSV(name, module, input_type, params) + else: + raise Exception('Unable to load spikes for module type {}'.format(module)) + + +class SpikesInputNWBv1(SpikesInput): + def __init__(self, name, module, input_type, params): + self.input_file = params['input_file'] + self._h5_handle = h5py.File(self.input_file, 'r') + + if 'trial' in params: + self.trial = params['trial'] + self._spike_trains_handles = {} + for node_id, h5grp in self._h5_handle['processing'][self.trial]['spike_train'].items(): + self._spike_trains_handles[int(node_id)] = h5grp['data'] + + elif '/spikes' in self._h5_handle: + raise Exception + + def get_spikes(self, gid): + return np.array(self._spike_trains_handles[gid]) + + +class SpikesInputH5(SpikesInput): + def __init__(self, name, module, input_type, params): + self._input_file = params['input_file'] + self._h5_handle = h5py.File(self._input_file, 'r') + self._sort_order = self._h5_handle['/spikes'].attrs.get('sorting', None) + if sys.version_info[0] >= 3 and isinstance(self._sort_order, bytes): + # h5py attributes return str in py 2, bytes in py 3 + self._sort_order = self._sort_order.decode() + + self._gid_ds = self._h5_handle['/spikes/gids'] + self._timestamps_ds = self._h5_handle['/spikes/timestamps'] + + self._gid_indicies = {} + self._build_indicies() + + def _build_indicies(self): + if self._sort_order == 'by_gid': + indx_beg = 0 + c_gid = self._gid_ds[0] + for indx, gid in enumerate(self._gid_ds): + if gid != c_gid: + self._gid_indicies[c_gid] = slice(indx_beg, indx) + c_gid = gid + indx_beg = indx + self._gid_indicies[c_gid] = slice(indx_beg, indx+1) + + else: + raise NotImplementedError + + def get_spikes(self, gid): + if gid in self._gid_indicies: + return self._timestamps_ds[self._gid_indicies[gid]] + else: + return [] + + +class SpikesInputCSV(SpikesInput): + def __init__(self, name, module, input_type, params): + self._spikes_df = pd.read_csv(params['input_file'], index_col='gid', sep=' ') + + def get_spikes(self, gid): + spike_times_str = self._spikes_df.iloc[gid]['spike-times'] + return np.array(spike_times_str.split(','), dtype=float) diff --git a/bmtk-vb/build/lib/bmtk/utils/io/tabular_network.py b/bmtk-vb/build/lib/bmtk/utils/io/tabular_network.py new file mode 100644 index 0000000..9b594bd --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/io/tabular_network.py @@ -0,0 +1,350 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import h5py + + +""" +An interface for reading network files. + +We are continuing to develop network file format this interface is a way to provide backward compatibility. This +namespace should not be instantiated directly, and updates to the network standard should be given their own. The +class TabularNetwork, NodeRow, NodesFile, EdgeRow and EdgesFile are abstract and should be overridden. + +In general the developed formats have all take schema: + * Networks are split between nodes (NodesFile) and edges (EdgesFile) + * Each type is made up of rows (NodeRow, EdgeRow) + * Each row has its own set column properties (ColumnProperty), depending on the file/group it belongs too. + * Each row also has properties from (edge/node)-type metadata. +""" + + +########################################## +# Interface files +########################################## +class TabularNetwork(object): + """Factory for loading nodes and edges files.""" + @staticmethod + def load_nodes(nodes_file, node_types_file): + raise NotImplementedError() + + @staticmethod + def load_edges(edges_file, edge_types_files): + raise NotImplementedError() + + +class NodeRow(object): + """Node file row. + + Each row represents node/cell/population in a network and can include edge-type metadata and dynamics_params when + applicable. The only mandatory for a NodeRow is a unique gid (i.e cell_id, node_id). Properties can be accessed + like a dictionary. + """ + def __init__(self, gid, node_props, types_props): + self._gid = gid + self._node_props = node_props # properties from the csv/hdf5 file + self._node_type_props = types_props # properties from the edge_types metadata file + + @property + def gid(self): + return self._gid + + @property + def with_dynamics_params(self): + """Set to true if dynamics_params subgroup attached to HDF5 properities""" + raise NotImplementedError() + + @property + def dynamics_params(self): + raise NotImplementedError() + + @property + def columns(self): + return self._node_props.keys() + self._node_type_props.keys() + + @property + def node_props(self): + return self._node_props + + @property + def node_type_props(self): + return self._node_type_props + + def get(self, prop_key, default=None): + # First see if property existing in node file, then check node-types + if prop_key in self._node_props: + return self._node_props[prop_key] + elif prop_key in self._node_type_props: + return self._node_type_props[prop_key] + else: + return default + + def __contains__(self, prop_key): + return prop_key in self._node_props.keys() or prop_key in self._node_type_props.keys() + + def __getitem__(self, prop_key): + val = self.get(prop_key) + if val is None: + raise Exception('Invalid property key {}.'.format(prop_key)) + return val + + def __repr__(self): + return build_row_repr(self) + + +class EdgeRow(object): + """Representation of a edge. + + Edges must include a source and target node gid. Other properties, from the edges or edge-types files, can be + directly accessed like a dictionary. + """ + def __init__(self, trg_gid, src_gid, edge_props={}, edge_type_props={}): + self._trg_gid = trg_gid + self._src_gid = src_gid + self._edge_props = edge_props + self._edge_type_props = edge_type_props + + @property + def target_gid(self): + return self._trg_gid + + @property + def source_gid(self): + return self._src_gid + + @property + def with_dynamics_params(self): + raise NotImplementedError() + + @property + def dynamics_params(self): + raise NotImplementedError() + + @property + def columns(self): + return self._edge_props.keys() + self._edge_type_props.keys() + + @property + def edge_props(self): + return self._edge_props + + def __contains__(self, prop_key): + return prop_key in self._edge_props.keys() or prop_key in self._edge_type_props.keys() + + def __getitem__(self, prop_key): + if prop_key in self._edge_props: + return self._edge_props[prop_key] + elif prop_key in self._edge_type_props: + return self._edge_type_props[prop_key] + else: + raise Exception('Invalid property name {}.'.format(prop_key)) + + def __repr__(self): + return build_row_repr(self) + + +class NodesFile(object): + """Class for reading and iterating properties of each node in a nodes/node-types file. + + Use the load method to load in the necessary node files. Nodes can be accessed using an interator: + nodes = NodesFile() + nodes.load(nodes_file.h5, node_types.csv) + for node in nodes: + print node['prop'] + ... + Or indivdually by gid: + node = nodes[101] + print node['prop'] + """ + def __init__(self): + self._network_name = None + self._version = None + self._iter_index = 0 + self._nrows = 0 + self._node_types_table = None + + @property + def name(self): + """name of network containing these nodes""" + return self._network_name + + @property + def version(self): + return self._version + + @property + def gids(self): + raise NotImplementedError() + + @property + def node_types_table(self): + return self._node_types_table + + def load(self, nodes_file, node_types_file): + raise NotImplementedError() + + def get_node(self, gid, cache=False): + raise NotImplementedError() + + def __len__(self): + raise NotImplementedError() + + def __iter__(self): + self._iter_index = 0 + return self + + def next(self): + raise NotImplementedError() + + def __getitem__(self, gid): + return self.get_node(gid) + + +class EdgesFile(object): + """Class for reading and iterating over edge files. + + Use the load() method to instantiate from the file. Edges can be accessed for any given edge with a target-gid + using the edges_itr() method: + edges = EdgesFile() + edges.load(edge_file.h5, edge_types.csv) + for edge_prop in edges.edges_itr(101): + assert(edge_prop.target_gid == 101) + source_node = nodes[edge_prop.source_gid] + print edge_prop['prop_name'] + """ + @property + def source_network(self): + """Name of network containing the source gids""" + raise NotImplementedError() + + @property + def target_network(self): + """Name of network containing the target gids""" + raise NotImplementedError() + + def load(self, edges_file, edge_types_file): + raise NotImplementedError() + + def edges_itr(self, target_gid): + raise NotImplementedError() + + def __len__(self): + raise NotImplementedError() + + +########################################## +# Helper functions +########################################## +class ColumnProperty(object): + """Representation of a column name and metadata from a hdf5 dataset, csv column, etc. + + """ + def __init__(self, name, dtype, dimension, attrs={}): + self._name = name + self._dtype = dtype + self._dim = dimension + self._attrs = attrs + + @property + def name(self): + return self._name + + @property + def dtype(self): + return self._dtype + + @property + def dimension(self): + return self._dim + + @property + def attributes(self): + return self._attrs + + @classmethod + def from_h5(cls, hf_obj, name=None): + if isinstance(hf_obj, h5py.Dataset): + ds_name = name if name is not None else hf_obj.name.split('/')[-1] + ds_dtype = hf_obj.dtype + + # If the dataset shape is in the form "(N, M)" then the dimension is M. If the shape is just "(N)" then the + # dimension is just 1 + dim = 1 if len(hf_obj.shape) < 2 else hf_obj.shape[1] + return cls(ds_name, ds_dtype, dim, attrs=hf_obj.attrs) + + elif isinstance(hf_obj, h5py.Group): + columns = [] + for name, ds in hf_obj.items(): + if isinstance(ds, h5py.Dataset): + columns.append(ColumnProperty.from_h5(ds, name)) + return columns + + else: + raise Exception('Unable to convert hdf5 object {} to a property or list of properties.'.format(hf_obj)) + + @classmethod + def from_csv(cls, pd_obj, name=None): + if isinstance(pd_obj, pd.Series): + c_name = name if name is not None else pd_obj.name + c_dtype = pd_obj.dtype + return cls(c_name, c_dtype, 1) + + elif isinstance(pd_obj, pd.DataFrame): + return [cls(name, pd_obj[name].dtype, 1) for name in pd_obj.columns] + + else: + raise Exception('Unable to convert pandas object {} to a property or list of properties.'.format(pd_obj)) + + def __hash__(self): + return hash(self._name) + + def __repr__(self): + return '{} ({})'.format(self.name, self.dtype) + + +class TypesTable(dict): + def __init__(self, types_file, index_column, seperator=' ', comment='#'): + super(TypesTable, self).__init__() + + types_df = pd.read_csv(types_file, sep=seperator, comment=comment) + self._columns = ColumnProperty.from_csv(types_df) + for _, row in types_df.iterrows(): + # TODO: iterrows does not preserve dtype and should be replaced with itertuples + type_id = row[index_column] + row = {col.name: row[col.name] for col in self._columns} + self.update({type_id: row}) + + @property + def columns(self): + return self._columns + + +def build_row_repr(row): + columns = row.columns + if columns > 0: + rstr = "{" + for c in columns: + rstr += "'{}': {}, ".format(c, row[c]) + return rstr[:-2] + "}" + else: + return "{}" diff --git a/bmtk-vb/build/lib/bmtk/utils/io/tabular_network_v0.py b/bmtk-vb/build/lib/bmtk/utils/io/tabular_network_v0.py new file mode 100644 index 0000000..711c177 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/io/tabular_network_v0.py @@ -0,0 +1,160 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import h5py + +import tabular_network as tn + +""" +This is for the original bionet network format developed at the AI in 2016-2017. nodes, node_types, and edge_types +use csv format, while edges use an hdf5 format. + +""" +class TabularNetwork(tn.TabularNetwork): + @staticmethod + def load_nodes(nodes_file, node_types_file): + nf = NodesFile() + nf.load(nodes_file, node_types_file) + return nf + + @staticmethod + def load_edges(edges_file, edge_types_file): + ef = EdgesFile() + ef.load(edges_file, edge_types_file) + return ef + + +class NodeRow(tn.NodeRow): + def __init__(self, gid, node_props, types_props, columns): + super(NodeRow, self).__init__(gid, node_props, types_props) + self._columns = columns + + @property + def with_dynamics_params(self): + return False + + @property + def dynamics_params(self): + return None + + +class NodesFile(tn.NodesFile): + def __init__(self): + super(NodesFile, self).__init__() + self._network_name = 'NA' + self._version = 'v0.0' + + self._nodes_df = None + self._nodes_columns = None + self._columns = None + + @property + def gids(self): + return list(self._nodes_df.index) + + def load(self, nodes_file, node_types_file): + self._nodes_df = pd.read_csv(nodes_file, sep=' ', index_col=['node_id']) + self._node_types_table = tn.TypesTable(node_types_file, 'node_type_id') + + self._nrows = len(self._nodes_df.index) + self._nodes_columns = tn.ColumnProperty.from_csv(self._nodes_df) + self._columns = self._nodes_columns + self._node_types_table.columns + + def get_node(self, gid, cache=False): + nodes_data = self._nodes_df.loc[gid] + node_type_data = self._node_types_table[nodes_data['node_type_id']] + return NodeRow(gid, nodes_data, node_type_data, self._columns) + + def __len__(self): + return self._nrows + + def next(self): + if self._iter_index >= len(self): + raise StopIteration + else: + gid = self._nodes_df.index.get_loc(self._iter_index) + self._iter_index += 1 + return self.get_node(gid) + + +class EdgeRow(tn.EdgeRow): + def __init__(self, trg_gid, src_gid, nsyns, edge_type_props): + super(EdgeRow, self).__init__(trg_gid, src_gid, edge_type_props=edge_type_props) + self._edge_props['nsyns'] = nsyns + + @property + def with_dynamics_params(self): + return False + + @property + def dynamics_params(self): + return None + + +class EdgesFile(tn.EdgesFile): + def __init__(self): + self._nrows = 0 + self._index_len = 0 + + self._edge_ptr_ds = None + self._num_syns_ds = None + self._src_gids_ds = None + self._edge_types_ds = None + self._edge_types_table = {} + + @property + def source_network(self): + return None + + @property + def target_network(self): + return None + + def load(self, edges_file, edge_types_file): + edges_hf = h5py.File(edges_file, 'r') + self._edge_ptr_ds = edges_hf['edge_ptr'] + self._num_syns_ds = edges_hf['num_syns'] + self._src_gids_ds = edges_hf['src_gids'] + + # TODO: validate edge_types dataset keys + self._edge_types_ds = edges_hf['edge_types'] + self._edge_types_table = tn.TypesTable(edge_types_file, 'edge_type_id') + self._index_len = len(self._edge_ptr_ds) + self._nrows = len(self._src_gids_ds) + + def edges_itr(self, target_gid): + assert(isinstance(target_gid, int)) + if target_gid+1 >= self._index_len: + raise StopIteration() + + index_begin = self._edge_ptr_ds[target_gid] + index_end = self._edge_ptr_ds[target_gid+1] + for iloc in xrange(index_begin, index_end): + source_gid = self._src_gids_ds[iloc] + edge_type_id = self._edge_types_ds[iloc] + edge_type = self._edge_types_table[edge_type_id] + nsyns = self._num_syns_ds[iloc] + yield EdgeRow(target_gid, source_gid, nsyns, edge_type) + + def __len__(self): + return self._nrows diff --git a/bmtk-vb/build/lib/bmtk/utils/io/tabular_network_v1.py b/bmtk-vb/build/lib/bmtk/utils/io/tabular_network_v1.py new file mode 100644 index 0000000..3506b81 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/io/tabular_network_v1.py @@ -0,0 +1,256 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import h5py + +import tabular_network as tn + + +""" +For the initial draft of the network format developed jointly by AI and collaborators in Q2 of 2017. + +Edges and nodes files are stored in hdf5, while the edge-types and node-types are stored in csv. In the hd5f files +optional properties are stored in groups assigned to each node/edge. Optionally each property group may include +dynamics_params subgroup to describe the model of each node/row, or dynamics_params may be referenced in the types +metadata file. + +""" + +class TabularNetwork(tn.TabularNetwork): + @staticmethod + def load_nodes(nodes_file, node_types_file): + nf = NodesFile() + nf.load(nodes_file, node_types_file) + return nf + + @staticmethod + def load_edges(edges_file, edge_types_file): + ef = EdgesFile() + ef.load(edges_file, edge_types_file) + return ef + + +class NodeRow(tn.NodeRow): + def __init__(self, gid, group, group_props, types_props): + super(NodeRow, self).__init__(gid, group_props, types_props) + # TODO: use group to determine if dynamics_params are included. + + @property + def with_dynamics_params(self): + return False + + @property + def dynamics_params(self): + return None + + +class NodesFile(tn.NodesFile): + def __init__(self): + super(NodesFile, self).__init__() + + self._nodes_hf = None + self._nodes_index = pd.DataFrame() + self._group_table = {} + self._nrows = 0 + + @property + def gids(self): + return list(self._nodes_index.index) + + def load(self, nodes_file, node_types_file): + nodes_hf = h5py.File(nodes_file, 'r') + if 'nodes' not in nodes_hf.keys(): + raise Exception('Could not find nodes in {}'.format(nodes_file)) + nodes_group = nodes_hf['nodes'] + + self._network_name = nodes_group.attrs['network'] if 'network' in nodes_group.attrs.keys() else 'NA' + self._version = 'v0.1' # TODO: get the version number from the attributes + + # Create Indices + self._nodes_index['node_gid'] = pd.Series(nodes_group['node_gid'], dtype=nodes_group['node_gid'].dtype) + self._nodes_index['node_type_id'] = pd.Series(nodes_group['node_type_id'], + dtype=nodes_group['node_type_id'].dtype) + self._nodes_index['node_group'] = pd.Series(nodes_group['node_group'], + dtype=nodes_group['node_group'].dtype) + self._nodes_index['node_group_index'] = pd.Series(nodes_group['node_group_index'], + dtype=nodes_group['node_group_index'].dtype) + self._nodes_index.set_index(['node_gid'], inplace=True) + self._nrows = len(self._nodes_index) + + # Save the node-types + self._node_types_table = tn.TypesTable(node_types_file, 'node_type_id') + + # save pointers to the groups table + self._group_table = {grp_id: Group(grp_id, grp_ptr, self._node_types_table) + for grp_id, grp_ptr in nodes_group.items() if isinstance(grp_ptr, h5py.Group)} + + def get_node(self, gid, cache=False): + node_metadata = self._nodes_index.loc[gid] + ng = node_metadata['node_group'] + ng_idx = node_metadata['node_group_index'] + + group_props = self._group_table[str(ng)][ng_idx] + types_props = self._node_types_table[node_metadata['node_type_id']] + + return NodeRow(gid, self._group_table[str(ng)], group_props, types_props) + + def __len__(self): + return self._nrows + + def next(self): + if self._iter_index >= len(self): + raise StopIteration + else: + gid = self._nodes_index.index.get_loc(self._iter_index) + self._iter_index += 1 + return self.get_node(gid) + + +class EdgeRow(tn.EdgeRow): + def __init__(self, trg_gid, src_gid, syn_group, edge_props={}, edge_type_props={}): + super(EdgeRow, self).__init__(trg_gid, src_gid, edge_props, edge_type_props) + # TODO: Look in syn_group to see if dynamics_params are included + + @property + def with_dynamics_params(self): + return False + + @property + def dynamics_params(self): + return None + + +class EdgesFile(tn.EdgesFile): + def __init__(self): + super(EdgesFile, self).__init__() + self._nedges = 0 + self._source_network = None + self._target_network = None + + # We'll save the target-index dataset into memory + self._target_index = None + self._target_index_len = 0 + + # to save memory just keep pointers to datasets and access them as needed. + self._target_gid_ds = None + self._source_gid_ds = None + self._edge_type_ds = None + self._edge_group_ds = None + self._edge_group_index_ds = None + self._edge_types_table = None + + self._group_table = {} # A table for all subgroups + + @property + def source_network(self): + return self._source_network + + @property + def target_network(self): + return self._target_network + + def load(self, edges_file, edge_types_file): + edges_hf = h5py.File(edges_file, 'r') + if 'edges' not in edges_hf.keys(): + raise Exception('Could not find edges in {}'.format(edges_file)) + edges_group = edges_hf['edges'] + + # Preload the target index pointers into memory + self._target_index = pd.Series(edges_group['index_pointer'], dtype=edges_group['index_pointer'].dtype) + self._target_index_len = len(self._target_index) + + # For the other index tables we only load in a file pointer + self._target_gid_ds = edges_group['target_gid'] + if 'network' in self._target_gid_ds.attrs.keys(): + self._target_network = self._target_gid_ds.attrs['network'] + + self._source_gid_ds = edges_group['source_gid'] + if 'network' in self._source_gid_ds.attrs.keys(): + self._source_network = self._source_gid_ds.attrs['network'] + + self._edge_type_ds = edges_group['edge_type_id'] + self._edge_group_ds = edges_group['edge_group'] + self._edge_group_index_ds = edges_group['edge_group_index'] + + self._nedges = len(self._edge_group_index_ds) + + # Load in edge-types table + self._edge_types_table = tn.TypesTable(edge_types_file, 'edge_type_id') + + # Load in the group properties + # TODO: look in attributes for group synonyms + # TODO: HDF5 group name will always be a string, but value in groups dataset will be an int. + self._group_table = {grp_id: Group(grp_id, grp_ptr, self._edge_types_table) + for grp_id, grp_ptr in edges_group.items() if isinstance(grp_ptr, h5py.Group)} + + def edges_itr(self, target_gid): + assert(isinstance(target_gid, int)) + if target_gid+1 >= self._target_index_len: + raise StopIteration() + + index_begin = self._target_index.iloc[target_gid] + index_end = self._target_index.iloc[target_gid+1] + for iloc in xrange(index_begin, index_end): + yield self[iloc] + + def __len__(self): + return self._nedges + + def __getitem__(self, iloc): + trg_gid = self._target_gid_ds[iloc] + src_gid = self._source_gid_ds[iloc] + + et_id = self._edge_type_ds[iloc] + et_props = self._edge_types_table[et_id] + + syn_group = self._edge_group_ds[iloc] + syn_index = self._edge_group_index_ds[iloc] + group_props = self._group_table[str(syn_group)][syn_index] + + return EdgeRow(trg_gid, src_gid, syn_group, group_props, et_props) + + +class Group(object): + def __init__(self, group_id, h5_group, types_table): + self._types_table = types_table + self._group_id = group_id + + self._group_columns = tn.ColumnProperty.from_h5(h5_group) + self._group_table = [(prop, h5_group[prop.name]) for prop in self._group_columns] + + self._all_columns = self._group_columns + types_table.columns + + # TODO: check to see if dynamics_params exists + + @property + def columns(self): + return self._all_columns + + def __getitem__(self, indx): + group_props = {} + for cprop, h5_obj in self._group_table: + group_props[cprop.name] = h5_obj[indx] + return group_props + + def __repr__(self): + return "Group('group id': {}, 'properties':{})".format(self._group_id, self._all_columns) diff --git a/bmtk-vb/build/lib/bmtk/utils/property_schema.py b/bmtk-vb/build/lib/bmtk/utils/property_schema.py new file mode 100644 index 0000000..54f2005 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/property_schema.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD license plus clause a third +# clause that prohibits redistribution for commercial purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the Allen Institute's written permission. For +# purposes of this license, commercial purposes is the incorporation of the Allen Institute's software into anything for +# which you will charge fees or other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# TODO: go through the individual simulator's property_schemas and pull out the common functionality. Ideally all +# simulators should share ~80% of the same schema, with some differences in how certain columns are determined. +# TODO: Add access to builder so when a network is built with a given property schema +# TODO: have utils.io.tabular_network use these schemas to discover name of node-id, node-type-id, etc for different +# standards. +class PropertySchema: + pass \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/utils/scripts/sonata.circuit_config.json b/bmtk-vb/build/lib/bmtk/utils/scripts/sonata.circuit_config.json new file mode 100644 index 0000000..a2c7969 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/scripts/sonata.circuit_config.json @@ -0,0 +1,21 @@ +{ + "manifest": { + "$BASE_DIR": "%%BASE_DIR%%", + "$COMPONENTS_DIR": "%%COMPONENTS_DIR%%", + "$NETWORK_DIR": "%%NETWORK_DIR%%" + }, + + "components": { + "morphologies_dir": "$COMPONENTS_DIR/morphologies", + "synaptic_models_dir": "$COMPONENTS_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENTS_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENTS_DIR/biophysical_neuron_templates", + "point_neuron_models_dir": "$COMPONENTS_DIR/point_neuron_templates" + }, + + "networks": { + "nodes": [], + + "edges": [] + } +} \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/utils/scripts/sonata.simulation_config.json b/bmtk-vb/build/lib/bmtk/utils/scripts/sonata.simulation_config.json new file mode 100644 index 0000000..c619d29 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/scripts/sonata.simulation_config.json @@ -0,0 +1,31 @@ +{ + "manifest": { + "$BASE_DIR": "%%BASE_DIR", + "$OUTPUT_DIR": "$BASE_DIR/output" + }, + + "target_simulator":"%%TARGET_SIMULATOR%%", + + "run": { + "tstop": 0.0, + "dt": 0.1 + }, + + "conditions": { + "celsius": 34.0 + }, + + "inputs": {}, + + "reports": {}, + + "output": { + "log_file": "log.txt", + "output_dir": "${OUTPUT_DIR}", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "overwrite_output_dir": true + }, + + "network": "./circuit_config.json" +} \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/utils/sim_setup.py b/bmtk-vb/build/lib/bmtk/utils/sim_setup.py new file mode 100644 index 0000000..8301fb5 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sim_setup.py @@ -0,0 +1,443 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import shutil +import json +import h5py +import re +from subprocess import call +from optparse import OptionParser +from collections import OrderedDict + +# Order of the different sections of the config.json. Any non-listed items will be placed at the end of the config +config_order = [ + 'manifest', + 'target_simulator', + 'run', + 'conditions', + 'inputs', + 'components', + 'output', + 'reports', + 'networks' +] + +local_path = os.path.dirname(os.path.realpath(__file__)) +scripts_path = os.path.join(local_path, 'scripts') + +''' +order_lookup = {k: i for i, k in enumerate(config_order)} +def sort_config_keys(ckey): + print(ckey) + exit() +''' + +def get_network_block(circuit_config, network_dir): + net_nodes = {} + net_edges = {} + for f in os.listdir(network_dir): + if not os.path.isfile(os.path.join(network_dir, f)) or f.startswith('.'): + continue + + if '_nodes' in f: + net_name = f[:f.find('_nodes')] + nodes_dict = net_nodes.get(net_name, {}) + nodes_dict['nodes_file'] = os.path.join('$NETWORK_DIR', f) + net_nodes[net_name] = nodes_dict + + elif '_node_types' in f: + net_name = f[:f.find('_node_types')] + nodes_dict = net_nodes.get(net_name, {}) + nodes_dict['node_types_file'] = os.path.join('$NETWORK_DIR', f) + net_nodes[net_name] = nodes_dict + + elif '_edges' in f: + net_name = f[:f.find('_edges')] + edges_dict = net_edges.get(net_name, {}) + edges_dict['edges_file'] = os.path.join('$NETWORK_DIR', f) + try: + edges_h5 = h5py.File(os.path.join(network_dir, f), 'r') + edges_dict['target'] = edges_h5['edges']['target_gid'].attrs['network'] + edges_dict['source'] = edges_h5['edges']['source_gid'].attrs['network'] + except Exception as e: + pass + + net_edges[net_name] = edges_dict + + elif '_edge_types' in f: + net_name = f[:f.find('_edge_types')] + edges_dict = net_edges.get(net_name, {}) + edges_dict['edge_types_file'] = os.path.join('$NETWORK_DIR', f) + net_edges[net_name] = edges_dict + + else: + print('Unknown file {}. Will have to enter by hand'.format(f)) + + for _, sect in net_nodes.items(): + circuit_config['networks']['nodes'].append(sect) + + for _, sect in net_edges.items(): + circuit_config['networks']['edges'].append(sect) + + +def build_components(circuit_config, components_path, scripts_path, with_examples): + for c_name, c_dir in circuit_config['components'].items(): + dir_name = c_dir.replace('$COMPONENTS_DIR/', '') + dir_path = os.path.join(components_path, dir_name) + + # create component directory + if not os.path.exists(dir_path): + os.makedirs(dir_path) + + # Copy in files from scripts// + scripts_dir = os.path.join(scripts_path, dir_name) + if with_examples and os.path.isdir(scripts_dir): + shutil.rmtree(dir_path) + shutil.copytree(scripts_dir, dir_path) + + +def build_circuit_env(base_dir, network_dir, components_dir, simulator, with_examples): + simulator_path = os.path.join(scripts_path, simulator) + + circuit_config = json.load(open(os.path.join(scripts_path, 'sonata.circuit_config.json'))) + circuit_config['manifest']['$BASE_DIR'] = base_dir if base_dir == '.' else os.path.abspath(base_dir) + circuit_config['manifest']['$COMPONENTS_DIR'] = '$BASE_DIR/{}'.format(components_dir) + + # Try to figure out the $NETWORK_DIR + if network_dir is None: + network_path = '' + if os.path.isabs(network_dir): + # In case network_dir is an absolute path + network_path = network_dir + elif os.path.abspath(network_dir).startswith(os.path.abspath(base_dir)): + # If network_dir is in a subdir of base_dir then NETWORK_DIR=$BASE_DIR/path/to/network + network_path = os.path.abspath(network_dir).replace(os.path.abspath(base_dir), '$BASE_DIR') + else: + # if network_dir exists outside of the base_dir just reference the absolute path + network_path = os.path.abspath(network_dir) + + circuit_config['manifest']['$NETWORK_DIR'] = network_path + + # Initialize the components directories + build_components(circuit_config, os.path.join(base_dir, components_dir), simulator_path, with_examples) + + # Parse the network directory + get_network_block(circuit_config, network_dir) + + return circuit_config + + +def build_simulation_env(base_dir, target_simulator, tstop, dt, reports): + simulation_config = json.load(open(os.path.join(scripts_path, 'sonata.simulation_config.json'))) + simulation_config['manifest']['$BASE_DIR'] = base_dir if base_dir == '.' else os.path.abspath(base_dir) + simulation_config['target_simulator'] = target_simulator + simulation_config['run']['tstop'] = tstop + simulation_config['run']['dt'] = dt + + if reports is not None: + for report_name, report_params in reports.items(): + simulation_config['reports'][report_name] = report_params + + return simulation_config + + +def copy_config(base_dir, json_dict, config_file_name): + with open(os.path.join(base_dir, config_file_name), 'w') as outfile: + ordered_dict = OrderedDict(sorted(json_dict.items(), + key=lambda s: config_order.index(s[0]) if s[0] in config_order else 100)) + json.dump(ordered_dict, outfile, indent=2) + + +def copy_run_script(base_dir, simulator, run_script): + simulator_path = os.path.join(scripts_path, simulator) + shutil.copy(os.path.join(simulator_path, run_script), os.path.join(base_dir, run_script)) + + +def build_env_pointnet(base_dir='.', network_dir=None, reports=None, with_examples=True, tstop=1000.0, dt=0.001, **args): + simulator='pointnet' + target_simulator='NEST' + components_dir='point_components' + + # Copy run script + copy_run_script(base_dir=base_dir, simulator=simulator, run_script='run_{}.py'.format(simulator)) + + # Build circuit_config and componenets directory + circuit_config = build_circuit_env(base_dir=base_dir, network_dir=network_dir, components_dir=components_dir, + simulator=simulator, with_examples=with_examples) + copy_config(base_dir, circuit_config, 'circuit_config.json') + + simulation_config = build_simulation_env(base_dir=base_dir, target_simulator=target_simulator, tstop=tstop, dt=dt, + reports=reports) + copy_config(base_dir, simulation_config, 'simulation_config.json') + + +def build_env_bionet(base_dir='.', network_dir=None, reports=None, with_examples=True, tstop=1000.0, dt=0.001, + compile_mechanisms=True, **args): + simulator='bionet' + target_simulator='NEURON' + components_dir='biophys_components' + + # Copy run script + copy_run_script(base_dir=base_dir, simulator=simulator, run_script='run_{}.py'.format(simulator)) + + # Build circuit_config and componenets directory + circuit_config = build_circuit_env(base_dir=base_dir, network_dir=network_dir, components_dir=components_dir, + simulator=simulator, with_examples=with_examples) + copy_config(base_dir, circuit_config, 'circuit_config.json') + if compile_mechanisms: + cwd = os.getcwd() + os.chdir(os.path.join(base_dir, components_dir, 'mechanisms')) # circuit_config['components']['mechanisms_dir']) + try: + print(os.getcwd()) + call(['nrnivmodl', 'modfiles']) + except Exception as e: + print('Was unable to compile mechanism in {}'.format(circuit_config['components']['mechanisms_dir'])) + # print e.message + os.chdir(cwd) + + # Build simulation config + simulation_config = build_simulation_env(base_dir=base_dir, target_simulator=target_simulator, tstop=tstop, dt=dt, + reports=reports) + simulation_config['run']['dL'] = args.get('dL', 20.0) + simulation_config['run']['spike_threshold'] = args.get('spike_threshold', -15.0) + simulation_config['run']['nsteps_block'] = args.get('nsteps_block', 5000) + simulation_config['conditions']['v_init'] = args.get('v_init', -80.0) + copy_config(base_dir, simulation_config, 'simulation_config.json') + + +def build_env_popnet(base_dir='.', network_dir=None, reports=None, with_examples=True, tstop=1000.0, dt=0.001, **args): + simulator='popnet' + target_simulator='DiPDE' + components_dir='pop_components' + + # Copy run script + copy_run_script(base_dir=base_dir, simulator=simulator, run_script='run_{}.py'.format(simulator)) + + # Build circuit_config and componenets directory + circuit_config = build_circuit_env(base_dir=base_dir, network_dir=network_dir, components_dir=components_dir, + simulator=simulator, with_examples=with_examples) + circuit_config['components']['population_models_dir'] = '$COMPONENTS_DIR/population_models' + # population_models_dir = os.path.join(base_dir, components_dir, 'population_models') + if with_examples: + models_dir = os.path.join(base_dir, components_dir, 'population_models') + if os.path.exists(models_dir): + shutil.rmtree(models_dir) + shutil.copytree(os.path.join(scripts_path, simulator, 'population_models'), models_dir) + + copy_config(base_dir, circuit_config, 'circuit_config.json') + + # Build simulation config + simulation_config = build_simulation_env(base_dir=base_dir, target_simulator=target_simulator, tstop=tstop, dt=dt, + reports=reports) + # PopNet doesn't produce spike files so instead need to replace them with rates files + for output_key in simulation_config['output'].keys(): + if output_key.startswith('spikes'): + del simulation_config['output'][output_key] + # simulation_config['output']['rates_file_csv'] = 'firing_rates.csv' + simulation_config['output']['rates_file'] = 'firing_rates.csv' + + copy_config(base_dir, simulation_config, 'simulation_config.json') + + +""" +def build_env_bionet(base_dir='.', run_time=0.0, with_config=True, network_dir=None, with_cell_types=True, + compile_mechanisms=True, reports=None): + local_path = os.path.dirname(os.path.realpath(__file__)) + scripts_path = os.path.join(local_path, 'scripts', 'bionet') + + components_dir = os.path.join(base_dir, 'components') + component_paths = { + 'morphologies_dir': os.path.join(components_dir, 'biophysical', 'morphology'), + 'biophysical_models_dir': os.path.join(components_dir, 'biophysical', 'electrophysiology'), + 'mechanisms_dir': os.path.join(components_dir, 'mechanisms'), + 'point_models_dir': os.path.join(components_dir, 'intfire'), + 'synaptic_models_dir': os.path.join(components_dir, 'synaptic_models'), + 'templates_dir': os.path.join(components_dir, 'hoc_templates') + } + for path in component_paths.values(): + if not os.path.exists(path): + os.makedirs(path) + + if with_cell_types: + shutil.rmtree(component_paths['templates_dir']) + shutil.copytree(os.path.join(scripts_path, 'hoc_templates'), component_paths['templates_dir']) + + shutil.rmtree(component_paths['mechanisms_dir']) + shutil.copytree(os.path.join(scripts_path, 'mechanisms'), component_paths['mechanisms_dir']) + + shutil.rmtree(component_paths['synaptic_models_dir']) + shutil.copytree(os.path.join(scripts_path, 'synaptic_models'), component_paths['synaptic_models_dir']) + + shutil.rmtree(component_paths['point_models_dir']) + shutil.copytree(os.path.join(scripts_path, 'intfire'), component_paths['point_models_dir']) + + if compile_mechanisms: + cwd = os.getcwd() + os.chdir(component_paths['mechanisms_dir']) + try: + print(os.getcwd()) + call(['nrnivmodl', 'modfiles']) + except Exception as e: + print('Was unable to compile mechanism in {}'.format(component_paths['mechanisms_dir'])) + # print e.message + os.chdir(cwd) + + shutil.copy(os.path.join(scripts_path, 'run_bionet.py'), os.path.join(base_dir, 'run_bionet.py')) + + if with_config: + config_json = json.load(open(os.path.join(scripts_path, 'default_config.json'))) + config_json['manifest']['$BASE_DIR'] = os.path.abspath(base_dir) + config_json['manifest']['$COMPONENTS_DIR'] = os.path.join('${BASE_DIR}', 'components') + config_json['run']['tstop'] = run_time + + if network_dir is not None: + config_json['manifest']['$NETWORK_DIR'] = os.path.abspath(network_dir) + + net_nodes = {} + net_edges = {} + for f in os.listdir(network_dir): + if not os.path.isfile(os.path.join(network_dir, f)) or f.startswith('.'): + continue + + if '_nodes' in f: + net_name = f[:f.find('_nodes')] + nodes_dict = net_nodes.get(net_name, {'name': net_name}) + nodes_dict['nodes_file'] = os.path.join('${NETWORK_DIR}', f) + net_nodes[net_name] = nodes_dict + + elif '_node_types' in f: + net_name = f[:f.find('_node_types')] + nodes_dict = net_nodes.get(net_name, {'name': net_name}) + nodes_dict['node_types_file'] = os.path.join('${NETWORK_DIR}', f) + net_nodes[net_name] = nodes_dict + + elif '_edges' in f: + net_name = f[:f.find('_edges')] + edges_dict = net_edges.get(net_name, {'name': net_name}) + edges_dict['edges_file'] = os.path.join('${NETWORK_DIR}', f) + try: + edges_h5 = h5py.File(os.path.join(network_dir, f), 'r') + edges_dict['target'] = edges_h5['edges']['target_gid'].attrs['network'] + edges_dict['source'] = edges_h5['edges']['source_gid'].attrs['network'] + except Exception as e: + pass + + net_edges[net_name] = edges_dict + + elif '_edge_types' in f: + net_name = f[:f.find('_edge_types')] + edges_dict = net_edges.get(net_name, {'name': net_name}) + edges_dict['edge_types_file'] = os.path.join('${NETWORK_DIR}', f) + net_edges[net_name] = edges_dict + + else: + print('Unknown file {}. Will have to enter by hand'.format(f)) + + for _, sect in net_nodes.items(): + config_json['networks']['nodes'].append(sect) + + for _, sect in net_edges.items(): + config_json['networks']['edges'].append(sect) + + if reports is not None: + for report_name, report_params in reports.items(): + config_json['reports'][report_name] = report_params + + ordered_dict = OrderedDict(sorted(config_json.items(), + key=lambda s: config_order.index(s[0]) if s[0] in config_order else 100)) + with open(os.path.join(base_dir, 'config.json'), 'w') as outfile: + json.dump(ordered_dict, outfile, indent=2) + #json.dump(config_json, outfile, indent=2) +""" + + +if __name__ == '__main__': + def str_list(option, opt, value, parser): + setattr(parser.values, option.dest, value.split(',')) + + #def int_list(option, opt, value, parser): + # setattr(parser.values, option.dest, [int(v) for v in value.split(',')]) + + def parse_node_set(option, opt, value, parser): + try: + setattr(parser.values, option.dest, [int(v) for v in value.split(',')]) + except ValueError as ve: + setattr(parser.values, option.dest, value) + + + parser = OptionParser(usage="Usage: python -m bmtk.utils.sim_setup [options] bionet|pointnet|popnet|mintnet") + parser.add_option('-b', '--base_dir', dest='base_dir', default='.', help='path of environment') + parser.add_option('-n', '--network_dir', dest='network_dir', default=None, + help="Use an exsting directory with network files.") + parser.add_option('-r', '--tstop', type='float', dest='tstop', default=1000.0) + parser.add_option('-d', '--dt', type=float, dest='dt', help='simulation time step dt', default=0.001) + + # For membrane report + def membrane_report_parser(option, opt, value, parser): + parser.values.has_membrane_report = True + if ',' in value: + try: + setattr(parser.values, option.dest, [int(v) for v in value.split(',')]) + except ValueError as ve: + setattr(parser.values, option.dest, value.split(',')) + + else: + setattr(parser.values, option.dest, value) + + parser.add_option('--membrane_report', dest='has_membrane_report', action='store_true', default=False) + parser.add_option('--membrane_report-vars', dest='mem_rep_vars', type='string', action='callback', + callback=membrane_report_parser, default=[]) + parser.add_option('--membrane_report-cells', dest='mem_rep_cells', type='string', action='callback', + callback=membrane_report_parser, default='all') + # parser.add_option('--membrane_report_file', dest='mem_rep_file', type='string', action='callback', + # callback=membrane_report_parser, default='$OUTPUT_DIR/cell_vars.h5') + parser.add_option('--membrane_report-sections', dest='mem_rep_secs', type='string', action='callback', + callback=membrane_report_parser, default='all') + + options, args = parser.parse_args() + reports = {} + + if options.has_membrane_report: + reports['membrane_report'] = { + 'module': 'membrane_report', + 'variable_name': options.mem_rep_vars, + 'cells': options.mem_rep_cells, + # 'file_name': options.mem_rep_file, + 'sections': options.mem_rep_secs, + } + + target_sim = args[0].lower() if len(args) == 1 else None + if target_sim not in ['bionet', 'popnet', 'pointnet', 'mintnet']: + raise Exception('Must specify one target simulator. options: "bionet", pointnet", "popnet" or "mintnet"') + + if target_sim == 'bionet': + build_env_bionet(base_dir=options.base_dir, network_dir=options.network_dir, tstop=options.tstop, + dt=options.dt, reports=reports) + + elif target_sim == 'pointnet': + build_env_pointnet(base_dir=options.base_dir, network_dir=options.network_dir, tstop=options.tstop, + dt=options.dt, reports=reports) + + elif target_sim == 'popnet': + build_env_popnet(base_dir=options.base_dir, network_dir=options.network_dir, tstop=options.tstop, + dt=options.dt, reports=reports) diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/__init__.py b/bmtk-vb/build/lib/bmtk/utils/sonata/__init__.py new file mode 100644 index 0000000..c236de1 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/__init__.py @@ -0,0 +1,25 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .edge import Edge, EdgeSet +from .file import File +from .node import Node, NodeSet diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/column_property.py b/bmtk-vb/build/lib/bmtk/utils/sonata/column_property.py new file mode 100644 index 0000000..34eaa5a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/column_property.py @@ -0,0 +1,103 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import h5py +import pandas as pd + + +class ColumnProperty(object): + """Representation of a column name and metadata from a hdf5 dataset, csv column, etc. + + """ + def __init__(self, name, dtype, dimension, nrows=0, attrs=None): + self._name = name + self._dtype = dtype + self._dim = dimension + self._nrows = nrows + self._attrs = attrs or {} + + @property + def name(self): + return self._name + + @property + def dtype(self): + return self._dtype + + @property + def dimension(self): + return self._dim + + @property + def nrows(self): + return self._nrows + + @property + def attributes(self): + return self._attrs + + @classmethod + def from_h5(cls, hf_obj, name=None): + if isinstance(hf_obj, h5py.Dataset): + ds_name = name if name is not None else hf_obj.name.split('/')[-1] + ds_dtype = hf_obj.dtype + + # If the dataset shape is in the form "(N, M)" then the dimension is M. If the shape is just "(N)" then the + # dimension is just 1 + dim = 1 if len(hf_obj.shape) < 2 else hf_obj.shape[1] + nrows = hf_obj.shape[0] + return cls(ds_name, ds_dtype, dim, nrows, attrs=hf_obj.attrs) + + elif isinstance(hf_obj, h5py.Group): + columns = [] + for name, ds in hf_obj.items(): + if isinstance(ds, h5py.Dataset): + columns.append(ColumnProperty.from_h5(ds, name)) + return columns + + else: + raise Exception('Unable to convert hdf5 object {} to a property or list of properties.'.format(hf_obj)) + + @classmethod + def from_csv(cls, pd_obj, name=None): + if isinstance(pd_obj, pd.Series): + c_name = name if name is not None else pd_obj.name + c_dtype = pd_obj.dtype + return cls(c_name, c_dtype, 1) + + elif isinstance(pd_obj, pd.DataFrame): + return [cls(name, pd_obj[name].dtype, 1) for name in pd_obj.columns] + + else: + raise Exception('Unable to convert pandas object {} to a property or list of properties.'.format(pd_obj)) + + def __hash__(self): + return hash(self._name) + + def __repr__(self): + return '{}'.format(self.name, self.dtype) + + def __eq__(self, other): + if isinstance(other, ColumnProperty): + return self._name == other._name + else: + return self._name == other diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/config.py b/bmtk-vb/build/lib/bmtk/utils/sonata/config.py new file mode 100644 index 0000000..fdb97ab --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/config.py @@ -0,0 +1,341 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import json +import re +import copy +import datetime + + +class SonataConfig(dict): + def __init__(self, *args, **kwargs): + super(SonataConfig, self).__init__(*args, **kwargs) + self._env_built = False + + @property + def run(self): + return self['run'] + + @property + def tstart(self): + return self.run.get('tstart', 0.0) + + @property + def tstop(self): + return self.run['tstop'] + + @property + def dt(self): + return self.run.get('dt', 0.1) + + @property + def block_step(self): + return self.run.get('nsteps_block', 5000) + + @property + def conditions(self): + return self['conditions'] + + @property + def celsius(self): + return self.conditions['celsius'] + + @property + def v_init(self): + return self.conditions['v_init'] + + @property + def path(self): + return self['config_path'] + + @property + def output(self): + return self['output'] + + @property + def output_dir(self): + return self.output['output_dir'] + + @property + def overwrite_output(self): + return self.output['overwrite_output_dir'] + + @property + def log_file(self): + return self.output['log_file'] + + @property + def components(self): + return self.get('components', {}) + + @property + def morphologies_dir(self): + return self.components['morphologies_dir'] + + @property + def synaptic_models_dir(self): + return self.components['synaptic_models_dir'] + + @property + def point_neuron_models_dir(self): + return self.components['point_neuron_models_dir'] + + @property + def mechanisms_dir(self): + return self.components['mechanisms_dir'] + + @property + def biophysical_neuron_models_dir(self): + return self.components['biophysical_neuron_models_dir'] + + @property + def templates_dir(self): + return self.components.get('templates_dir', None) + + @property + def with_networks(self): + return 'networks' in self and len(self.nodes) > 0 + + @property + def networks(self): + return self['networks'] + + @property + def nodes(self): + return self.networks.get('nodes', []) + + @property + def edges(self): + return self.networks.get('edges', []) + + def copy_to_output(self): + copy_config(self) + + @staticmethod + def get_validator(): + raise NotImplementedError + + @classmethod + def from_json(cls, config_file, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_json(config_file, validator)) + + @classmethod + def from_dict(cls, config_dict, validate=False): + validator = cls.get_validator() if validate else None + return cls(from_dict(config_dict, validator)) + + @classmethod + def from_yaml(cls, config_file, validate=False): + raise NotImplementedError + + @property + def reports(self): + return self.get('reports', {}) + + @property + def inputs(self): + return self.get('inputs', {}) + + def get_modules(self, module_name): + return [report for report in self.reports.values() if report['module'] == module_name] + + def build_env(self): + if self._env_built: + return + + self.create_output_dir() + self.copy_to_output() + self._env_built = True + + +def from_json(config_file, validator=None): + """Builds and validates a configuration json file. + + :param config_file: File object or path to a json file. + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + if isinstance(config_file, file): + conf = json.load(config_file) + elif isinstance(config_file, basestring): + conf = json.load(open(config_file, 'r')) + else: + raise Exception('{} is not a file or file path.'.format(config_file)) + + # insert file path into dictionary + if 'config_path' not in conf: + conf['config_path'] = os.path.abspath(config_file) + + # Will resolve manifest variables and validate + return from_dict(conf, validator) + + +def from_dict(config_dict, validator=None): + """Builds and validates a configuration json dictionary object. Best to directly use from_json when possible. + + :param config_dict: Dictionary object + :param validator: A SimConfigValidator object to validate json file. Won't validate if set to None + :return: A dictionary, verified against json validator and with manifest variables resolved. + """ + assert(isinstance(config_dict, dict)) + conf = copy.deepcopy(config_dict) # Since the functions will mutate the dictionary we will copy just-in-case. + + if 'config_path' not in conf: + conf['config_path'] = os.path.abspath(__file__) + + # Build the manifest and resolve variables. + # TODO: Check that manifest exists + manifest = __build_manifest(conf) + conf['manifest'] = manifest + __recursive_insert(conf, manifest) + + # In our work with Blue-Brain it was agreed that 'network' and 'simulator' parts of config may be split up into + # separate files. If this is the case we build each sub-file separately and merge into this one + for childconfig in ['network', 'simulation']: + if childconfig in conf and isinstance(conf[childconfig], basestring): + # Try to resolve the path of the network/simulation config files. If an absolute path isn't used find + # the file relative to the current config file. TODO: test if this will work on windows? + conf_str = conf[childconfig] + conf_path = conf_str if conf_str.startswith('/') else os.path.join(conf['config_path'], conf_str) + + # Build individual json file and merge into parent. + child_json = from_json(conf_path) + del child_json['config_path'] # we don't want 'config_path' of parent being overwritten. + conf.update(child_json) + + # Run the validator + if validator is not None: + validator.validate(conf) + + return conf + + +def copy_config(conf): + """Copy configuration file to different directory, with manifest variables resolved. + + :param conf: configuration dictionary + """ + output_dir = conf["output"]["output_dir"] + config_name = os.path.basename(conf['config_path']) + output_path = os.path.join(output_dir, config_name) + with open(output_path, 'w') as fp: + json.dump(conf, fp, indent=2) + + +def __special_variables(conf): + """A list of preloaded variables to insert into the manifest, containing things like path to run-time directory, + configuration directory, etc. + """ + pre_manifest = dict() + pre_manifest['$workingdir'] = os.path.dirname(os.getcwd()) + if 'config_path' in conf: + pre_manifest['$configdir'] = os.path.dirname(conf['config_path']) # path of configuration file + pre_manifest['$configfname'] = conf['config_path'] + + dt_now = datetime.datetime.now() + pre_manifest['$time'] = dt_now.strftime('%H-%M-%S') + pre_manifest['$date'] = dt_now.strftime('%Y-%m-%d') + pre_manifest['$datetime'] = dt_now.strftime('%Y-%m-%d_%H-%M-%S') + + return pre_manifest + + +def __build_manifest(conf): + """Resolves the manifest section and resolve any internal variables""" + if 'manifest' not in conf: + return __special_variables(conf) + + manifest = conf["manifest"] + resolved_manifest = __special_variables(conf) + resolved_keys = set() + unresolved_keys = set(manifest.keys()) + + # No longer using recursion since that can lead to an infinite loop if the person who writes the config file isn't + # careful. Also added code to allow for ${VAR} format in-case user wants to user "$.../some_${MODEl}_here/..." + while unresolved_keys: + for key in unresolved_keys: + # Find all variables in manifest and see if they can be replaced by the value in resolved_manifest + value = __find_variables(manifest[key], resolved_manifest) + + # If value no longer has variables, and key-value pair to resolved_manifest and remove from unresolved-keys + if value.find('$') < 0: + resolved_manifest[key] = value + resolved_keys.add(key) + + # remove resolved key-value pairs from set, and make sure at every iteration unresolved_keys shrinks to prevent + # infinite loops + n_unresolved = len(unresolved_keys) + unresolved_keys -= resolved_keys + if n_unresolved == len(unresolved_keys): + msg = "Unable to resolve manifest variables: {}".format(unresolved_keys) + raise Exception(msg) + + return resolved_manifest + + +def __recursive_insert(json_obj, manifest): + """Loop through the config and substitute the path variables (e.g.: $MY_DIR) with the values from the manifest + + :param json_obj: A json dictionary object that may contain variables needing to be resolved. + :param manifest: A dictionary of variable values + :return: A new json dictionar config file with variables resolved + """ + if isinstance(json_obj, basestring): + return __find_variables(json_obj, manifest) + + elif isinstance(json_obj, list): + new_list = [] + for itm in json_obj: + new_list.append(__recursive_insert(itm, manifest)) + return new_list + + elif isinstance(json_obj, dict): + for key, val in json_obj.items(): + if key == 'manifest': + continue + json_obj[key] = __recursive_insert(val, manifest) + + return json_obj + + else: + return json_obj + + +def __find_variables(json_str, manifest): + """Replaces variables (i.e. $VAR, ${VAR}) with their values from the manifest. + + :param json_str: a json string that may contain none, one or multiple variable + :param manifest: dictionary of variable lookup values + :return: json_str with resolved variables. Won't resolve variables that don't exist in manifest. + """ + variables = [m for m in re.finditer('\$\{?[\w]+\}?', json_str)] + for var in variables: + var_lookup = var.group() + if var_lookup.startswith('${') and var_lookup.endswith('}'): + # replace ${VAR} with $VAR + var_lookup = "$" + var_lookup[2:-1] + if var_lookup in manifest: + json_str = json_str.replace(var.group(), manifest[var_lookup]) + + return json_str diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/edge.py b/bmtk-vb/build/lib/bmtk/utils/sonata/edge.py new file mode 100644 index 0000000..435dd02 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/edge.py @@ -0,0 +1,90 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +class EdgeSet(object): + def __init__(self, edge_ids, population): + self._edge_ids = edge_ids + self._population = population + self._n_edges = len(self._edge_ids) + self.__itr = 0 + + def __iter__(self): + self.__itr = 0 + return self + + def next(self): + if self.__itr >= self._n_edges: + raise StopIteration + + next_edge = self._population.iloc(self._edge_ids[self.__itr]) + self.__itr += 1 + return next_edge + + +class Edge(object): + def __init__(self, src_node_id, trg_node_id, source_pop, target_pop, group_id, group_props, edge_types_props): + self._src_node_id = src_node_id + self._trg_node_id = trg_node_id + self._source_population = source_pop + self._target_population = target_pop + self._group_props = group_props + self._group_id = group_id + self._edge_type_props = edge_types_props + + @property + def source_node_id(self): + return self._src_node_id + + @property + def target_node_id(self): + return self._trg_node_id + + @property + def source_population(self): + return self._source_population + + @property + def target_population(self): + return self._target_population + + @property + def group_id(self): + return self._group_id + + @property + def edge_type_id(self): + return self._edge_type_props['edge_type_id'] + + @property + def dynamics_params(self): + raise NotImplementedError + + def __getitem__(self, prop_key): + if prop_key in self._group_props: + return self._group_props[prop_key] + elif prop_key in self._edge_type_props: + return self._edge_type_props[prop_key] + else: + raise KeyError('Property {} not found in edge.'.format(prop_key)) + + def __contains__(self, prop_key): + return prop_key in self._group_props or prop_key in self._edge_type_props \ No newline at end of file diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/file.py b/bmtk-vb/build/lib/bmtk/utils/sonata/file.py new file mode 100644 index 0000000..d70f66a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/file.py @@ -0,0 +1,124 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from . import utils +from .file_root import NodesRoot, EdgesRoot + + +class File(object): + def __init__(self, data_files, data_type_files, mode='r', gid_table=None, require_magic=True): + if mode != 'r': + raise Exception('Currently only read mode is supported.') + + self._data_files = utils.listify(data_files) + self._data_type_files = utils.listify(data_type_files) + + # Open and check HDF5 file(s) + self._h5_file_handles = [utils.load_h5(f, mode) for f in self._data_files] + if require_magic: + map(utils.check_magic, self._h5_file_handles) # Check magic attribute in h5 files + + # Check version number + avail_versions = set(map(utils.get_version, self._h5_file_handles)) + if len(avail_versions) == 1: + self._version = list(avail_versions)[0] + elif len(avail_versions) > 1: + # TODO: log as warning + print('Warning: Passing in multiple hdf5 files of different version') + self._version = ','.join(avail_versions) + else: + self._version = utils.VERSION_NA + + self._csv_file_handles = [(f, utils.load_csv(f)) for f in self._data_type_files] + + self._has_nodes = False + self._nodes = None # /nodes object + self._nodes_groups = [] # list of all hdf5 /nodes group + self._node_types_dataframes = [] # list of all csv node-types dataframe + + self._has_edges = False + self._edges = None # /edges object + self._edges_groups = [] # list of all hdf5 /edges group + self._edge_types_dataframes = [] # list of csv edge-types dataframes + + # for multiple inputs sort into edge files and node files + self._sort_types_file() + self._sort_h5_files() + + if not (self._has_nodes or self._has_edges): + raise Exception('Could not find neither nodes nor edges for the given file(s).') + + if self._has_nodes: + self._nodes = NodesRoot(nodes=self._nodes_groups, node_types=self._node_types_dataframes, gid_table=gid_table) + + if self._has_edges: + self._edges = EdgesRoot(edges=self._edges_groups, edge_types=self._edge_types_dataframes) + + @property + def nodes(self): + return self._nodes + + @property + def has_nodes(self): + return self._has_nodes + + @property + def edges(self): + return self._edges + + @property + def has_edges(self): + return self._has_edges + + @property + def version(self): + return self._version + + def _sort_types_file(self): + # TODO: node/edge type_id columnn names should not be hardcoded + for filename, df in self._csv_file_handles: + has_node_type_id = 'node_type_id' in df.columns + has_edge_type_id = 'edge_type_id' in df.columns + if has_node_type_id and has_edge_type_id: + # TODO: users may be creating their own dataframe and thus not have a filename + raise Exception('types file {} has both node_types_id and edge_types_id column.'.format(filename)) + elif has_node_type_id: + self._node_types_dataframes.append(df) + elif has_edge_type_id: + self._edge_types_dataframes.append(df) + else: + # TODO: if strict this should fail immedietely + print('Warning: Could not determine if file {} was an edge-types or node-types file. Ignoring'.format(filename)) + + def _sort_h5_files(self): + for h5 in self._h5_file_handles: + has_nodes = '/nodes' in h5 + has_edges = '/edges' in h5 + if not (has_nodes or has_edges): + print('File {} contains neither nodes nor edges. Ignoring'.format(h5.filename)) + else: + if has_nodes: + self._nodes_groups.append(h5) + self._has_nodes = True + if has_edges: + self._edges_groups.append(h5) + self._has_edges = True diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/file_root.py b/bmtk-vb/build/lib/bmtk/utils/sonata/file_root.py new file mode 100644 index 0000000..071e88c --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/file_root.py @@ -0,0 +1,301 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import sys + +import h5py +import pandas as pd +import numpy as np + +from . import utils +from .population import NodePopulation, EdgePopulation +from .types_table import NodeTypesTable, EdgeTypesTable + + +class FileRoot(object): + """Base class for both /nodes and /edges root group in h5 file""" + def __init__(self, root_name, h5_files, h5_mode, csv_files): + """ + :param root_name: should either be 'nodes' or 'edges' + :param h5_files: file (or list of files) containing nodes/edges + :param h5_mode: currently only supporting 'r' mode in h5py + :param csv_files: file (or list of files) containing node/edge types + """ + self._root_name = root_name + self._h5_handles = [utils.load_h5(f, h5_mode) for f in utils.listify(h5_files)] + self._csv_handles = [(f, utils.load_csv(f)) for f in utils.listify(csv_files)] + + # merge and create a table of the types table(s) + self._types_table = None + self._build_types_table() + + # population_name->h5py.Group table (won't instantiate the population) + self._populations_groups = {} + self._store_groups() + + # A map between population_name -> Population object. Population objects aren't created until called, in the + # case user wants to split populations among MPI nodes (instantiation will create node/edge indicies and other + # overhead). + self._populations_cache = {} + + self.check_format() + + @property + def root_name(self): + return self._root_name + + @property + def population_names(self): + return list(self._populations_groups.keys()) + + @property + def populations(self): + return [self[name] for name in self.population_names] + + @property + def types_table(self): + return self._types_table + + @types_table.setter + def types_table(self, types_table): + self._types_table = types_table + + def _build_types_table(self): + raise NotImplementedError + + def _store_groups(self): + """Create a map between group population to their h5py.Group handle""" + for h5handle in self._h5_handles: + assert(self.root_name in h5handle.keys()) + for pop_name, pop_group in h5handle[self._root_name].items(): + if pop_name in self._populations_groups: + raise Exception('Multiple {} populations with name {}.'.format(self._root_name, pop_name)) + self._populations_groups[pop_name] = pop_group + + def _build_population(self, pop_name, pop_group): + raise NotImplementedError + + def get_population(self, population_name, default=None): + """Return a population group object based on population's name""" + if population_name in self: + return self[population_name] + else: + # need this for EdgeRoot.get_populations + return default + + def check_format(self): + if len(self._h5_handles) == 0: + raise Exception('No {} hdf5 files specified.'.format(self.root_name)) + + if len(self._csv_handles) == 0: + raise Exception('No {} types csv files specified.'.format(self.root_name)) + + def __contains__(self, population_name): + # TODO: Add condition if user passes in io.Population object + return population_name in self.population_names + + def __getitem__(self, population_name): + if population_name not in self: + raise Exception('{} does not contain a population with name {}.'.format(self.root_name, population_name)) + + if population_name in self._populations_cache: + return self._populations_cache[population_name] + else: + h5_grp = self._populations_groups[population_name] + pop_obj = self._build_population(population_name, h5_grp) + self._populations_cache[population_name] = pop_obj + return pop_obj + + +class NodesRoot(FileRoot): + def __init__(self, nodes, node_types, mode='r', gid_table=None): + super(NodesRoot, self).__init__('nodes', h5_files=nodes, h5_mode=mode, csv_files=node_types) + + # load the gid <--> (node_id, population) map if specified. + self._gid_table = gid_table + self._gid_table_groupby = {} + self._has_gids = False + # TODO: Should we allow gid-table to be built into '/nodes' h5 groups, or must it always be a separat file? + if gid_table is not None: + self.set_gid_table(gid_table) + + @property + def has_gids(self): + return self._has_gids + + @property + def node_types_table(self): + return self.types_table + + def set_gid_table(self, gid_table, force=False): + """Adds a map from a gids <--> (node_id, population) based on specification. + + :param gid_table: An h5 file/group containing map specifications + :param force: Set to true to have it overwrite any exsiting gid table (default False) + """ + assert(gid_table is not None) + if self.has_gids and not force: + raise Exception('gid table already exists (use force=True to overwrite)') + + self._gid_table = utils.load_h5(gid_table, 'r') + # TODO: validate that the correct columns/dtypes exists. + gid_df = pd.DataFrame() + gid_df['gid'] = pd.Series(data=self._gid_table['gid'], dtype=self._gid_table['gid'].dtype) + gid_df['node_id'] = pd.Series(data=self._gid_table['node_id'], dtype=self._gid_table['node_id'].dtype) + gid_df['population'] = pd.Series(data=self._gid_table['population']) + population_names_ds = self._gid_table['population_names'] + for pop_id, subset in gid_df.groupby(by='population'): + pop_name = population_names_ds[pop_id] + self._gid_table_groupby[pop_name] = subset + self._has_gids = True + + def generate_gids(self, file_name, gids=None, force=False): + """Creates a gid <--> (node_id, population) table based on sonnet specifications. + + Generating gids will take some time and so not recommend to call this during the simulation. Instead save + the file to the disk and pass in h5 file during the simulation (using gid_table parameter). In fact if you're + worried about efficeny don't use this method. + + :param file_name: Name of h5 file to save gid map to. + :param gids: rule/list of gids to use + :param force: set to true to overwrite existing gid map (default False). + """ + + # TODO: This is very inefficent, fix (although not a priority as this function should be called sparingly) + # TODO: Allow users to pass in a list/function to determine gids + # TODO: We should use an enumerated lookup table for population ds instead of storing strings + # TODO: Move this to a utils function rather than a File + if self.has_gids and not force: + raise Exception('Nodes already have a gid table. Use force=True to overwrite existing gids.') + + dir_name = os.path.dirname(os.path.abspath(file_name)) + if not os.path.exists(dir_name): + os.makedirs(dir_name) + + with h5py.File(file_name, 'w') as h5: + # TODO: should we use mode 'x', or give an option to overwrite existing files + n_nodes = 0 + ascii_len = 0 # store max population name for h5 fixed length strings + # Find population names and the total size of every population + for node_pop in self.populations: + n_nodes += len(node_pop) + name_nchars = len(node_pop.name) + ascii_len = ascii_len if ascii_len >= name_nchars else name_nchars + + # node_id and gid datasets should just be unsigned integers + h5.create_dataset(name='gid', shape=(n_nodes,), dtype=np.uint64) + h5.create_dataset(name='node_id', shape=(n_nodes,), dtype=np.uint64) + # TODO: determine population precisions from num of populations + h5.create_dataset(name='population', shape=(n_nodes,), dtype=np.uint16) + + # Create a lookup table for pop-name + pop_name_list = [pname for pname in self.population_names] + if utils.using_py3: + dt = h5py.special_dtype(vlen=str) # python 3 + else: + dt = h5py.special_dtype(vlen=unicode) # python 2 + h5.create_dataset(name='population_names', shape=(len(pop_name_list),), dtype=dt) + # No clue why but just passing in the data during create_dataset doesn't work h5py + for i, n in enumerate(pop_name_list): + h5['population_names'][i] = n + + # write each (gid, node_id, population) + indx = 0 + for node_pop in self.populations: + # TODO: Block write if special gid generator isn't being used + # TODO: Block write populations at least + pop_name = node_pop.name # encode('ascii', 'ignore') + pop_id = pop_name_list.index(pop_name) + for node in node_pop: + h5['node_id'][indx] = node.node_id + h5['population'][indx] = pop_id + h5['gid'][indx] = indx + indx += 1 + + # pass gid table to current nodes + self.set_gid_table(h5) + + def _build_types_table(self): + self.types_table = NodeTypesTable() + for _, csvhandle in self._csv_handles: + self.types_table.add_table(csvhandle) + + def _build_population(self, pop_name, pop_group): + return NodePopulation(pop_name, pop_group, self.node_types_table) + + def __getitem__(self, population_name): + # If their is a gids map then we must pass it into the population + pop_obj = super(NodesRoot, self).__getitem__(population_name) + if self.has_gids and (not pop_obj.has_gids) and (population_name in self._gid_table_groupby): + pop_obj.add_gids(self._gid_table_groupby[population_name]) + + return pop_obj + + +class EdgesRoot(FileRoot): + def __init__(self, edges, edge_types, mode='r'): + super(EdgesRoot, self).__init__(root_name='edges', h5_files=edges, h5_mode=mode, csv_files=edge_types) + + + @property + def edge_types_table(self): + return self.types_table + + def get_populations(self, name=None, source=None, target=None): + """Find all populations with matching criteria, either using the population name (which will return a list + of size 0 or 1) or based on the source/target population. + + To return a list of all populations just use populations() method + + :param name: (str) name of population + :param source: (str or NodePopulation) returns edges with nodes coming from matching source-population + :param target: (str or NodePopulation) returns edges with nodes coming from matching target-population + :return: A (potential empty) list of EdgePopulation objects filter by criteria. + """ + assert((name is not None) ^ (source is not None or target is not None)) + if name is not None: + return [self[name]] + + else: + # TODO: make sure groups aren't built unless they are a part of the results + selected_pops = self.population_names + if source is not None: + # filter out only edges with given source population + source = source.name if isinstance(source, NodePopulation) else source + selected_pops = [name for name in selected_pops + if EdgePopulation.get_source_population(self._populations_groups[name]) == source] + if target is not None: + # filter out by target population + target = target.name if isinstance(target, NodePopulation) else target + selected_pops = [name for name in selected_pops + if EdgePopulation.get_target_population(self._populations_groups[name]) == target] + + return [self[name] for name in selected_pops] + + def _build_types_table(self): + self.types_table = EdgeTypesTable() + for _, csvhandle in self._csv_handles: + self.edge_types_table.add_table(csvhandle) + + def _build_population(self, pop_name, pop_group): + return EdgePopulation(pop_name, pop_group, self.edge_types_table) diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/group.py b/bmtk-vb/build/lib/bmtk/utils/sonata/group.py new file mode 100644 index 0000000..4264d45 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/group.py @@ -0,0 +1,416 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd + +from .column_property import ColumnProperty +from .node import Node, NodeSet +from .edge import Edge, EdgeSet + + +class Group(object): + """A container containig a node/edge population groups. + + A node or edge population will have one or more groups, each having a unique identifier. Each group shared the same + columns and datatypes, thus each group is essentially a different model. + """ + + def __init__(self, group_id, h5_group, parent): + self._group_id = int(group_id) + self._parent = parent + self._types_table = parent.types_table + self._h5_group = h5_group + self._types_index_col = self._types_table.index_column_name + + self._group_columns = ColumnProperty.from_h5(h5_group) + # TODO: combine group_columns, group_column_names and group_columns_map, doesn't need to be 3 structures + self._group_column_map = {col.name: col for col in self._group_columns} + self._group_column_names = set(col.name for col in self._group_columns) + self._group_table = {prop: h5_group[prop.name] for prop in self._group_columns} + self._ncolumns = len(self._group_columns) + + self._all_columns = self._group_columns + self._types_table.columns + self._all_column_names = set(col.name for col in self._all_columns) + + self._nrows = 0 # number of group members + + # For storing dynamics_params subgroup (if it exists) + self._has_dynamics_params = 'dynamics_params' in self._h5_group and len(self._h5_group['dynamics_params']) > 0 + self._dynamics_params_columns = [] + + # An index of all the rows in parent population that map onto a member of this group + self._parent_indicies = None # A list of parent rows indicies + self._parent_indicies_built = False + + self.check_format() + + @property + def group_id(self): + return self._group_id + + @property + def has_dynamics_params(self): + return False + + @property + def columns(self): + return self._group_columns + + @property + def group_columns(self): + return self._group_columns + + @property + def all_columns(self): + return self._all_columns + + @property + def has_gids(self): + return self._parent.has_gids + + @property + def parent(self): + return self._parent + + def get_dataset(self, column_name): + return self._group_table[column_name] + + def column(self, column_name, group_only=False): + if column_name in self._group_column_map: + return self._group_column_map[column_name] + elif not group_only and column_name in self._types_table.columns: + return self._types_table.column(column_name) + else: + return KeyError + + def check_format(self): + # Check that all the properties have the same number of rows + col_counts = [col.nrows for col in self._group_columns + self._dynamics_params_columns] + if len(set(col_counts)) > 1: + # TODO: Would be nice to warn user which dataset have different size + raise Exception('properties in {}/{} have different ranks'.format(self._parent.name, self._group_id)) + elif len(set(col_counts)) == 1: + self._nrows = col_counts[0] + + def build_indicies(self, force=False): + raise NotImplementedError + + def to_dataframe(self): + raise NotImplementedError + + def get_values(self, property_name, all_rows=False): + """Returns all values for a group property. + + Note that a row within a group may not have a corresponding node/edge, or they may have a different order or + multiple node/edges may share the same group row. Setting all_rows=False will return all the values as you + see if you iterated through all the population's items. Setting all_rows=True just returns the data as a + list as they appear in the dataset (will be faster). + + :param property_name: Name of dataset property/column to fetch. + :param all_rows: Set false to return order in which they appear in population, false to return entire dataset + :return: A list of values for the given column name. + """ + raise NotImplementedError + + def __len__(self): + return self._nrows + + def __getitem__(self, group_index): + group_props = {} + for cname, h5_obj in self._group_table.items(): + group_props[cname] = h5_obj[group_index] + return group_props + + def __contains__(self, prop_name): + """Search that a column name exists in this group""" + return prop_name in self._group_column_names + + +class NodeGroup(Group): + def __init__(self, group_id, h5_group, parent): + super(NodeGroup, self).__init__(group_id, h5_group, parent) + # Note: Don't call build_indicies right away so uses can call __getitem__ without having to load all the + # node_ids + + @property + def node_ids(self): + self.build_indicies() + # print self._parent_indicies + return self._parent.inode_ids(self._parent_indicies) + + @property + def node_type_ids(self): + self.build_indicies() + return self._parent.inode_type_ids(self._parent_indicies) + + @property + def gids(self): + self.build_indicies() + return self._parent.igids(self._parent_indicies) + + def build_indicies(self, force=False): + if self._parent_indicies_built and not force: + return + + # TODO: Check for the special case where there is only one group + # TODO: If memory becomes an issue on very larget nodes (10's of millions) consider using a generator + # I've pushed the actual building of the population->group indicies onto the parent population + self._parent_indicies = self._parent.group_indicies(self.group_id, build_cache=True) + self._parent_indicies_built = True + + def get_values(self, property_name, filtered_indicies=True): + self.build_indicies() + # TODO: Check if property_name is node_id, node_type, or gid + + if property_name in self._group_columns: + if not filtered_indicies: + # Just return all values in dataset + return np.array(self._group_table[property_name]) + else: + # Return only those values for group indicies with associated nodes + grp_indicies = self._parent.igroup_indicies(self._parent_indicies) + # It is possible that the group_index is unorderd or contains duplicates which will cause h5py slicing + # to fail. Thus convert to a numpy array + # TODO: loading the entire table is not good if the filtered nodes is small, consider building. + tmp_array = np.array(self._group_table[property_name]) + return tmp_array[grp_indicies] + + elif property_name in self._parent.node_types_table.columns: + # For properties that come from node-types table we need to build the results from scratch + # TODO: Need to performance test, I think this code could be optimized. + node_types_table = self._parent.node_types_table + nt_col = node_types_table.column(property_name) + tmp_array = np.empty(shape=len(self._parent_indicies), dtype=nt_col.dtype) + for i, ntid in enumerate(self.node_type_ids): + tmp_array[i] = node_types_table[ntid][property_name] + + return tmp_array + + def to_dataframe(self): + self.build_indicies() + + # Build a dataframe of group properties + # TODO: Include dynamics_params? + properties_df = pd.DataFrame() + for col in self._group_columns: + if col.dimension > 1: + for i in range(col.dimension): + # TODO: see if column name exists in the attributes + col_name = '{}.{}'.format(col.name, i) + properties_df[col_name] = pd.Series(self._h5_group[col.name][:, i]) + else: + properties_df[col.name] = pd.Series(self._h5_group[col.name]) + + # Build a dataframe of parent node (node_id, gid, node_types, etc) + root_df = pd.DataFrame() + root_df['node_type_id'] = pd.Series(self.node_type_ids) + root_df['node_id'] = pd.Series(self.node_ids) + root_df['node_group_index'] = pd.Series(self._parent.igroup_indicies(self._parent_indicies)) # used as pivot + if self._parent.has_gids: + root_df['gid'] = self.gids + + # merge group props df with parent df + results_df = root_df.merge(properties_df, how='left', left_on='node_group_index', right_index=True) + results_df = results_df.drop('node_group_index', axis=1) + + # Build node_types dataframe and merge + node_types_df = self._parent.node_types_table.to_dataframe() + # remove properties that exist in the group + node_types_cols = [c.name for c in self._parent.node_types_table.columns if c not in self._group_columns] + node_types_df = node_types_df[node_types_cols] + + # TODO: consider caching these results + return results_df.merge(node_types_df, how='left', left_on='node_type_id', right_index=True) + + def filter(self, **filter_props): + """Filter all nodes in the group by key=value pairs. + + The filter specifications may apply to either node_type or group column properties. Currently at the moment + it only supports equivlency. An intersection (and operator) is done for every different filter pair. This will + produce a generator of all nodes matching the the filters. + + for node in filter(pop_name='VIp', depth=10.0): + assert(node['pop_name'] == 'VIp' and node['depth'] == 10.0) + + :param filter_props: keys and their values to filter nodes on. + :return: A generator that produces all valid nodes within the group with matching key==value pairs. + """ + # TODO: Integrate this with NodeSet. + self.build_indicies() + node_types_table = self._parent.node_types_table + node_type_filter = set(node_types_table.node_type_ids) # list of valid node_type_ids + type_filter = False + group_prop_filter = {} # list of 'prop_name'==prov_val for group datasets + group_filter = False + + # Build key==value lists + for filter_key, filter_val in filter_props.items(): + # TODO: Check if node_type_id is an input + if filter_key in self._group_columns: + # keep of list of group_popertiess to filter + group_prop_filter[filter_key] = filter_val + group_filter = True + + elif filter_key in node_types_table.columns: + # for node_types we just keep a list of all node_type_ids with matching key==value pairs + node_type_filter &= set(node_types_table.find(filter_key, filter_val)) + type_filter = True + + else: + # TODO: should we raise an exception? + # TODO: User logger + print('Could not find property {} in either group or types table. Ignoring.'.format(filter_key)) + + # iterate through all nodes, skipping ones that don't have matching key==value pairs + for indx in self._parent_indicies: + # TODO: Don't build the node until you filter out node_type_id + node = self._parent.get_row(indx) + if type_filter and node.node_type_id not in node_type_filter: + # confirm node_type_id is a correct one + continue + + if group_filter: + # Filter by group property values + # TODO: Allow group properties to handle lists + src_failed = True + for k, v in group_prop_filter.items(): + if node[k] != v: + break + else: + src_failed = False + + if src_failed: + continue + + yield node + + def __iter__(self): + self.build_indicies() + # Pass a list of indicies into the NodeSet, the NodeSet will take care of the iteration + return NodeSet(self._parent_indicies, self._parent).__iter__() + + +class EdgeGroup(Group): + def __init__(self, group_id, h5_group, parent): + super(EdgeGroup, self).__init__(group_id, h5_group, parent) + self._indicies_count = 0 # Used to keep track of number of indicies (since it contains multple ranges) + + self.__itr_index = 0 + self.__itr_range = [] + self.__itr_range_idx = 0 + self.__itr_range_max = 0 + + def build_indicies(self, force=False): + if self._parent_indicies_built and not force: + return + + # Saves indicies as a (potentially empty) list of ranges + # TODO: Turn index into generator, allows for cheaper iteration over the group + self._indicies_count, self._parent_indicies = self._parent.group_indicies(self.group_id, build_cache=False) + self._parent_indicies_built = True + + def to_dataframe(self): + raise NotImplementedError + + + def _get_parent_ds(self, parent_ds): + self.build_indicies() + ds_vals = np.zeros(self._indicies_count, dtype=parent_ds.dtype) + c_indx = 0 + for indx_range in self._parent_indicies: + indx_beg, indx_end = indx_range[0], indx_range[1] + n_indx = c_indx + (indx_end - indx_beg) + ds_vals[c_indx:n_indx] = parent_ds[indx_beg:indx_end] + c_indx = n_indx + + return ds_vals + + def src_node_ids(self): + return self._get_parent_ds(self.parent._source_node_id_ds) + + def trg_node_ids(self): + return self._get_parent_ds(self.parent._target_node_id_ds) + + def node_type_ids(self): + return self._get_parent_ds(self.parent._type_id_ds) + + def get_values(self, property_name, all_rows=False): + # TODO: Need to take into account if property_name is in the edge-types + if property_name not in self.columns: + raise KeyError + + if all_rows: + return np.array(self._h5_group[property_name]) + else: + self.build_indicies() + # Go through all ranges and build the return list + dataset = self._h5_group[property_name] + return_list = np.empty(self._indicies_count, self._h5_group[property_name].dtype) + i = 0 + for r_beg, r_end in self._parent_indicies: + r_len = r_end - r_beg + return_list[i:(i+r_len)] = dataset[r_beg:r_end] + i += r_len + return return_list + + def filter(self, **filter_props): + # TODO: I'm not sure If I want to do this? Need to check on a larger dataset than I currently have. + raise NotImplementedError + + def __iter__(self): + self.build_indicies() + # TODO: Implement using an EdgeSet + if len(self._parent_indicies) == 0: + self.__itr_max_range = 0 + self.__itr_range = [] + self.__itr_index = 0 + else: + # Stop at the largest range end (I'm not sure if the indicies are ordered, if we can make it ordered then + # in the future just use self_parent_indicies[-1][1] + self.__itr_range_max = len(self._parent_indicies) + self.__itr_range_idx = 0 + self.__itr_range = self._parent_indicies[0] + self.__itr_index = self.__itr_range[0] + + return self + + def next(self): + return self.__next__() + + def __next__(self): + if self.__itr_range_idx >= self.__itr_range_max: + raise StopIteration + + nxt_edge = self._parent.get_row(self.__itr_index) + self.__itr_index += 1 + if self.__itr_index >= self.__itr_range[1]: + # iterator has moved past the current range + self.__itr_range_idx += 1 + if self.__itr_range_idx < self.__itr_range_max: + # move the iterator onto next range + self.__itr_range = self._parent_indicies[self.__itr_range_idx] # update range + self.__itr_index = self.__itr_range[0] # update iterator to start and the beginning of new range + else: + self.__itr_range = [] + + return nxt_edge diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/node.py b/bmtk-vb/build/lib/bmtk/utils/sonata/node.py new file mode 100644 index 0000000..4fa24ae --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/node.py @@ -0,0 +1,126 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + + +class NodeSet(object): + # TODO: Merge NodeSet and NodePopulation + def __init__(self, node_indicies, population, **parameters): + self._indicies = node_indicies + self._n_nodes = len(self._indicies) + self._population = population + + self.__itr_index = 0 + + @property + def node_ids(self): + return self._population.inode_ids(self._indicies) + + @property + def gids(self): + return self._population.igids(self._indicies) + + @property + def node_type_ids(self): + return self._population.inode_type_ids(self._indicies) + + ''' + @property + def node_types(self): + return [self._population._node_types_table[ntid] for ntid in self._node_type_ids] + ''' + + def get_properties(self, property_name): + raise NotImplementedError + + def __len__(self): + return self._n_nodes + + def __iter__(self): + self.__itr_index = 0 + return self + + def next(self): + return self.__next__() + + def __next__(self): + if self.__itr_index >= self._n_nodes: + raise StopIteration + + node = self._population.get_row(self._indicies[self.__itr_index]) + self.__itr_index += 1 + return node + + +class Node(object): + # TODO: include population name/reference + # TODO: make a dictionary (or preferably a collections.MutableMap + def __init__(self, node_id, node_type_id, node_types_props, group_id, group_props, dynamics_params, gid=None): + self._node_id = node_id + self._gid = gid + self._node_type_id = node_type_id + self._node_type_props = node_types_props + self._group_id = group_id + self._group_props = group_props + + @property + def node_id(self): + return self._node_id + + @property + def gid(self): + return self._gid + + @property + def group_id(self): + return self._group_id + + @property + def node_type_id(self): + return self._node_type_id + + @property + def group_props(self): + return self._group_props + + @property + def node_type_properties(self): + return self._node_type_props + + @property + def dynamics_params(self): + raise NotImplementedError + + def __getitem__(self, prop_key): + if prop_key in self._group_props: + return self._group_props[prop_key] + elif prop_key in self._node_type_props: + return self._node_type_props[prop_key] + elif prop_key == 'node_id': + return self.node_id + elif property == 'node_type_id': + return self.node_type_id + else: + raise KeyError('Unknown property {}'.format(prop_key)) + + def __contains__(self, prop_key): + return prop_key in self._group_props or prop_key in self._node_type_props diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/population.py b/bmtk-vb/build/lib/bmtk/utils/sonata/population.py new file mode 100644 index 0000000..0edebd2 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/population.py @@ -0,0 +1,608 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import h5py +import numpy as np + +from .utils import range_itr, get_attribute_h5 +from .node import Node, NodeSet +from .edge import Edge, EdgeSet +from .group import NodeGroup, EdgeGroup + + +class Population(object): + def __init__(self, pop_name, pop_group, types_table): + self._pop_name = pop_name + self._pop_group = pop_group + self._types_table = types_table + self._nrows = 0 + + # For storing individual groups + self._group_map = {} # grp-id --> h5py.Group object + self._find_groups() + self._group_cache = {} # grp-id --> soneta.io.Group() object + + # Refrences to most of the population's primary dataset + self._type_id_ds = pop_group[self.type_ids_column] + self._group_id_ds = pop_group[self.group_id_column] + self._group_index_ds = pop_group[self.group_index_column] + + self._group_indicies = {} # grp-id --> list of rows indicies + self._group_indicies_cache_built = False + + @property + def name(self): + """name of current population""" + return self._pop_name + + @property + def group_ids(self): + """List of all group_ids belonging to population""" + return list(self._group_map.keys()) + + @property + def groups(self): + """Returns a list of sonata.Group objects""" + return [self.get_group(name) for name in self._group_map.keys()] + + @property + def types_table(self): + return self._types_table + + @property + def type_ids(self): + return np.array(self._type_id_ds) + + @property + def group_id_ds(self): + return self._group_id_ds + + @property + def group_index_ds(self): + return self._group_index_ds + + @property + def group_id_column(self): + raise NotImplementedError + + @property + def group_index_column(self): + raise NotImplementedError + + @property + def type_ids_column(self): + raise NotImplementedError + + def to_dataframe(self): + """Convert Population to dataframe""" + raise NotImplementedError + + def get_group(self, group_id): + if group_id in self._group_cache: + return self._group_cache[group_id] + else: + grp_h5 = self._group_map[group_id] + grp_obj = self._build_group(group_id, grp_h5) + self._group_cache[group_id] = grp_obj + return grp_obj + + def group_indicies(self, group_id, build_cache=False): + """Returns a list of all the population row index that maps onto the given group. + + Used for iterating or searching within a Group + + :param group_id: id of a given group + :param build_cache: Will cache indicies for all groups. Will be faster if making multiple calls but requires + more memory (default False) + :return: A (possibly empty) list of row indicies (non-contiguous, but unique) + """ + if self._group_indicies_cache_built: + return self._group_indicies.get(group_id, []) + + else: + tmp_index = pd.DataFrame() + # TODO: Need to check the memory overhead, especially for edges. See if an iterative search is just as fast + tmp_index['grp_id'] = pd.Series(self._group_id_ds, dtype=self._group_id_ds.dtype) + tmp_index['row_indx'] = pd.Series(range_itr(self._nrows), dtype=np.uint32) + if build_cache: + # save all indicies as arrays + self._group_indicies = {grp_id: np.array(subset['row_indx']) + for grp_id, subset in tmp_index.groupby(by='grp_id')} + self._group_indicies_cache_built = True + return self._group_indicies.get(group_id, []) + else: + # TODO: Manually del tmp_index to clear out the memory? + tmp_index = tmp_index[tmp_index['grp_id'] == group_id] + return np.array(tmp_index['row_indx']) + + def igroup_ids(self, row_indicies): + return self._group_id_ds[list(row_indicies)] + + def igroup_indicies(self, row_indicies): + return self._group_index_ds[list(row_indicies)] + + def _find_groups(self): + """Create a map between group-id and h5py.Group reference""" + for grp_key, grp_h5 in self._pop_group.items(): + if grp_key.isdigit(): + grp_id = int(grp_key) + self._group_map[grp_id] = grp_h5 + else: + # TODO: Should we put a warning if an unrecognized group exists? + pass + + def _build_group(self, group_id, group_h5): + raise NotImplementedError + + def __len__(self): + return self._nrows + + +class NodePopulation(Population): + def __init__(self, pop_name, pop_group, node_types_tables): + super(NodePopulation, self).__init__(pop_name=pop_name, pop_group=pop_group, types_table=node_types_tables) + + # TODO: node_ids can be implicit + self._node_id_ds = pop_group['node_id'] + self._nrows = len(self._node_id_ds) + + # TODO: This isn't necessary if only using iterator. Delay building index until get_node() is called. + self._index_nid2row = None # A lookup from node_id --> h5 row number + self._node_id_index_built = False + self._build_node_id_index() + + # indicies for gid <--> node_id map + self._has_gids = False + self._index_gid2row = None # gid --> row (for searching by gid) + self._index_row2gid = None # row --> gid (for iterator or searching by node-id) + self._gid_lookup_fnc = lambda _: None # for looking up gid by row, use fnc pointer rather than conditional + + self.__itr_index = 0 # for iterator + + @property + def group_id_column(self): + return 'node_group_id' + + @property + def group_index_column(self): + return 'node_group_index' + + @property + def type_ids_column(self): + return 'node_type_id' + + @property + def has_gids(self): + return self._has_gids + + @property + def node_ids(self): + return np.array(self._node_id_ds) + + @property + def gids(self): + if self.has_gids: + return np.array(self._index_gid2row.index) + else: + return None + + @property + def node_types_table(self): + return self._types_table + + @property + def index_column_name(self): + return 'node_id' + + @property + def node_types_table(self): + return self.types_table + + def add_gids(self, gid_map_df, force=False): + if self.has_gids and not force: + # TODO: not sure if it's best to return an exception or just continue on in silence? + raise Exception('Node population {} already has gids mapped onto node-ids.'.format(self.name)) + # return + + # Create map from gid --> node_id --> row # + self._build_node_id_index() + tmp_df = pd.DataFrame() + tmp_df['row_id'] = self._index_nid2row.index + tmp_df['node_id'] = self._index_nid2row + gid_map_df = gid_map_df.merge(tmp_df, how='left', left_on='node_id', right_on='node_id') + gid_map_df = gid_map_df.drop(['node_id', 'population'], axis=1) + self._index_gid2row = gid_map_df.set_index('gid') + self._index_row2gid = gid_map_df.set_index('row_id') + self._gid_lookup_fnc = lambda row_indx: self._index_row2gid.loc[row_indx]['gid'] + self._has_gids = True + + def to_dataframe(self): + raise NotImplementedError + + def get_row(self, row_indx): + # TODO: Use helper function so we don't have to lookup gid/node_id twice + # Note: I'm not cacheing the nodes for memory purposes, but it might be beneificial too. + node_id = self._node_id_ds[row_indx] + node_type_id = self._type_id_ds[row_indx] + node_group_id = self._group_id_ds[row_indx] + node_group_index = self._group_index_ds[row_indx] + + node_type_props = self.node_types_table[node_type_id] + node_group_props = self.get_group(node_group_id)[node_group_index] + node_gid = self._gid_lookup_fnc(row_indx) + + return Node(node_id, node_type_id, node_type_props, node_group_id, node_group_props, None, gid=node_gid) + + def get_rows(self, row_indicies): + """Returns a set of all nodes based on list of row indicies. + + Warning: currently due to the use of h5py, the list must be ordered and cannot contain duplicates. + + :param row_indicies: A list of row indicies + :return: An iterable NodeSet of nodes in the specified indicies + """ + # TODO: Check that row_indicies is unsigned and the max (which will be the last value) < n_rows + # TODO: Check order and check for duplicates in list + return NodeSet(row_indicies, self) + + def inode_ids(self, row_indicies): + # You get errors if row_indicies is a numpy array or panda series so convert to python list + # TODO: list conversion can be expensive, see if h5py will work with np arrays natively. + return self._node_id_ds[list(row_indicies)] + + def igids(self, row_indicies): + gids = self._gid_lookup_fnc(row_indicies) + if gids is not None: + gids = np.array(gids) + return gids + + def inode_type_ids(self, row_indicies): + # self._node_type_id_ds + return self._type_id_ds[list(row_indicies)] + + def get_node_id(self, node_id): + row_indx = self._index_nid2row.iloc[node_id] + return self.get_row(row_indx) + + def get_gid(self, gid): + # assert(self.has_gids) + row_indx = self._index_gid2row.iloc[gid]['row_id'] + return self.get_row(row_indx) + + def filter(self, **filter_props): + for grp in self.groups: + for node in grp.filter(**filter_props): + yield node + + def _build_node_id_index(self, force=False): + if self._node_id_index_built and not force: + return + + self._index_nid2row = pd.Series(range_itr(self._nrows), index=self._node_id_ds, dtype=self._node_id_ds.dtype) + self._node_id_index_built = True + + def _build_group(self, group_id, group_h5): + return NodeGroup(group_id, group_h5, self) + + def __iter__(self): + self.__itr_index = 0 + return self + + def next(self): + return self.__next__() + + def __next__(self): + if self.__itr_index >= self._nrows: + raise StopIteration + + nxt_node = self.get_row(self.__itr_index) + self.__itr_index += 1 + return nxt_node + + def __getitem__(self, item): + if isinstance(item, slice): + # TODO: Check + start = item.start if item.start is not None else 0 + stop = item.stop if item.stop is not None else self._nrows + row_indicies = range_itr(start, stop, item.step) + return NodeSet(row_indicies, self) + + elif isinstance(item, int): + return self.get_row(item) + + elif isinstance(item, list): + return NodeSet(item) + else: + print('Unable to get item using {}.'.format(type(item))) + + +class EdgePopulation(Population): + class __IndexStruct(object): + """Class sto store indicies subgroup""" + # TODO: Use collections.namedtuple + def __init__(self, lookup_table, edge_table): + self.lookup_table = lookup_table + self.edge_table = edge_table + + def __init__(self, pop_name, pop_group, edge_types_tables): + super(EdgePopulation, self).__init__(pop_name=pop_name, pop_group=pop_group, types_table=edge_types_tables) + + # keep reference to source and target datasets + self._source_node_id_ds = pop_group['source_node_id'] + self._target_node_id_ds = pop_group['target_node_id'] + + self._nrows = len(self._source_node_id_ds) + + # TODO: Throw an error/warning if missing + self._source_population = EdgePopulation.get_source_population(pop_group) + self._target_population = EdgePopulation.get_target_population(pop_group) + + self.__itr_index = 0 + + # TODO: use a function pointer for get_index so it doesn't have to run a conditional every time + # TODO: add property and/or property so user can determine what indicies exists. + self._targets_index = None + self._has_target_index = False + self._sources_index = None + self._has_source_index = False + self.build_indicies() + + @property + def group_id_column(self): + return 'edge_group_id' + + @property + def group_index_column(self): + return 'edge_group_index' + + @property + def type_ids_column(self): + return 'edge_type_id' + + @property + def source_population(self): + return self._source_population + + @property + def target_population(self): + return self._target_population + + @staticmethod + def get_source_population(pop_group_h5): + return get_attribute_h5(pop_group_h5['source_node_id'], 'node_population', None) + + @staticmethod + def get_target_population(pop_group_h5): + return get_attribute_h5(pop_group_h5['target_node_id'], 'node_population', None) + + @property + def edge_types_table(self): + return self._types_table + + def to_dataframe(self): + raise NotImplementedError + + def build_indicies(self): + if 'indicies' in self._pop_group: + indicies_grp = self._pop_group['indicies'] + for index_name, index_grp in indicies_grp.items(): + # TODO: Let __IndexStruct build the indicies + # Make sure subgroup has the correct datasets + if not isinstance(index_grp, h5py.Group): + continue + + if 'node_id_to_range' not in index_grp: + # TODO: make this more general, i.e 'id_to_range' thus we can index on gids, edge_types, etc + # TODO: Check that there are two columns in dataset + raise Exception('index {} in {} edges is missing column {}.'.format(index_name, self.name, + 'node_id_to_range')) + if 'range_to_edge_id' not in index_grp: + raise Exception('index {} in {} edges is missing column {}.'.format(index_name, self.name, + 'range_to_edge_id')) + + # Cache the index + targets_lookup = index_grp['node_id_to_range'] + edges_range = index_grp['range_to_edge_id'] + index_obj = self.__IndexStruct(targets_lookup, edges_range) + + # Determine the type of index + if index_name == 'source_to_target': + self._sources_index = index_obj + self._has_source_index = True + elif index_name == 'target_to_source': + self._targets_index = index_obj + self._has_target_index = True + else: + # TODO: Need to send this to a logger rather than stdout + print('Unrecognized index {}. Ignoring.'.format(index_name)) + + def _build_group(self, group_id, group_h5): + return EdgeGroup(group_id, group_h5, self) + + def group_indicies(self, group_id, build_cache=False): + # For nodes it's safe to just keep a list of all indicies that map onto a given group. For edges bc there are + # many more rows (and typically a lot less groups), We want to build an index like for source/target ids + if len(self._group_map) == 1: + return len(self), [[0, len(self)]] + + grp_indicies = super(EdgePopulation, self).group_indicies(group_id, build_cache=False) + if len(grp_indicies) == 0: + # Return an index with no ranges + return 0, [] + + # cluster into ranges. Naively implement, there is probably a faster way to cluster an ordered array! + range_beg = grp_indicies[0] + ranges = [] + for i in range_itr(1, len(grp_indicies)): + if (grp_indicies[i-1]+1) != grp_indicies[i]: + ranges.append([range_beg, grp_indicies[i-1]+1]) + range_beg = grp_indicies[i] + ranges.append([range_beg, grp_indicies[-1]+1]) + return len(grp_indicies), np.array(ranges, dtype=np.uint32) + + ''' + def _get_target_index(self): + # TODO: Do only once + if self._targets_index is not None: + return self._targets_index + + if 'incidies' in self._pop_group: + if 'target_to_source' in self._pop_group['incidies']: + targets_lookup = self._pop_group['incidies']['target_to_source']['node_id_to_range'] + edges_range = self._pop_group['incidies']['target_to_source']['range_to_edge_id'] + self._targets_index = self.__IndexStruct(targets_lookup, edges_range) + return self._targets_index + + # TODO: What to do if index doesn't exist? + raise NotImplementedError + ''' + + def get_row(self, index): + src_node = self._source_node_id_ds[index] + trg_node = self._target_node_id_ds[index] + edge_type_id = self._type_id_ds[index] + edge_types_props = self.edge_types_table[edge_type_id] + + edge_group_id = self._group_id_ds[index] + edge_group_index = self._group_index_ds[index] + edge_group_props = self.get_group(edge_group_id)[edge_group_index] + return Edge(trg_node_id=trg_node, src_node_id=src_node, source_pop=self.source_population, + target_pop=self.target_population, group_id = edge_group_id, + group_props=edge_group_props, edge_types_props=edge_types_props) + + def filter(self, **filter_props): + selected_edge_types = set(self.edge_types_table.edge_type_ids) + types_filter = False # Do we need to filter results by edge_type_id + if 'edge_type_id' in filter_props: + # TODO: Make sure the edge_type_id is valid + selected_edge_types = set([filter_props['edge_type_id']]) + del filter_props['edge_type_id'] + types_filter = True + + selected_groups = set(self._group_map.keys()) # list of grp_id's that will be used + group_prop_filter = {} # list of actual query statements + group_filter = False # do we need to filter results by group_id + + # Go through filter key==value pairs, create filters for groups and edge_types + for filter_key, filter_val in filter_props.items(): + # Find out what groups, if any, the column should search in. + group_query = False # If it's querying a group property don't look in edge_types + types_query = False + for grp_id, grp_h5 in self._group_map.items(): + if filter_key in grp_h5: + # TODO: Need to check the dtype's match + selected_groups &= set([grp_id]) + group_prop_filter[filter_key] = filter_val + group_query = True + group_filter = True + + if (not group_query) and filter_key in self.edge_types_table.columns: + # Presearch the edge types and get only those edge_type_ids which match key==val + selected_edge_types &= set(self.edge_types_table.find(filter_key, filter_val)) + types_filter = True + types_query = True + + if not (group_query or types_query): + # Property key neither exists in a group or the edge_types_table + raise Exception('Could not find property {}'.format(filter_key)) + + # Iterate through all nodes, only returning those that match the filter + for indx in range_itr(self._nrows): + # Filter by edge_type_id + if types_filter: + # TODO: Invert the selected_edge_types, it will be faster to fail immeditely than search the entire list + if self._type_id_ds[indx] not in selected_edge_types: + continue + + # Filter by group properties + if group_filter: + # TODO: Invert group search + grp_id = self._group_id_ds[indx] + if grp_id not in selected_groups: + continue + + grp_index = self._group_index_ds[indx] + search_failed = True + for prop_key, prop_val in group_prop_filter.items(): + if prop_val != self._group_map[grp_id][prop_key][grp_index]: + break + else: + search_failed = False + + if search_failed: + continue + + yield self.get_row(indx) + + def get_target(self, target_node_id): + # TODO: Raise an exception, or call find() and log a warning that the index is not available + # TODO: check validity of target_node_id (non-negative integer and smaller than index range) + assert(self._has_target_index) + return self._get_index(self._targets_index, target_node_id) + + def get_targets(self, target_node_ids): + # TODO: verify input is iterable + assert(self._has_target_index) + trg_index = self._targets_index + for trg_id in target_node_ids: + for edge in self._get_index(trg_index, trg_id): + yield edge + + def get_source(self, source_node_id): + assert(self._has_source_index) + return self._get_index(self._sources_index, source_node_id) + + def get_sources(self, source_node_ids): + assert(self._has_target_index) + trg_index = self._sources_index + for src_id in source_node_ids: + for edge in self._get_index(trg_index, src_id): + yield edge + + def _get_index(self, index_struct, lookup_id): + # TODO: Use a EdgeSet instead + if lookup_id >= len(index_struct.lookup_table): + # TODO: Store length in index + raise StopIteration + + edges_table = index_struct.edge_table + lookup_beg, lookup_end = index_struct.lookup_table[lookup_id] + for i in range_itr(lookup_beg, lookup_end): + edge_indx_beg, edge_indx_end = edges_table[i] + for edge_indx in range_itr(edge_indx_beg, edge_indx_end): + yield self.get_row(edge_indx) + + def __iter__(self): + self.__itr_index = 0 + return self + + def __next__(self): + if self.__itr_index >= self._nrows: + raise StopIteration + + next_edge = self.get_row(self.__itr_index) + self.__itr_index += 1 + return next_edge + + def next(self): + return self.__next__() diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/types_table.py b/bmtk-vb/build/lib/bmtk/utils/sonata/types_table.py new file mode 100644 index 0000000..375d332 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/types_table.py @@ -0,0 +1,220 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd +import numbers +import math + +from .column_property import ColumnProperty + + +def remove_nans(types_dict): + """Convert nan values to None in type row (dict)""" + for k, v in types_dict.items(): + if isinstance(v, numbers.Real) and math.isnan(v): + types_dict[k] = None + + +class TypesTable(object): + def __init__(self, parent=None): + self._parent = None # Used to keep track of FileRoot object this table belongs to + self._columns = {} + self._index_typeid2df = {} # map from node(edge)_type_id --> csv Row + self._column_map = {} # TODO: Use defaultdict + # self._id_table = self.IDSearcher(self) + self._dataframes = [] # list of all pandas dataframe (types tables) + + self._cached_node_types = {} + self._df_cache = None + + self._itr_indx = 0 + self._itr_end = 0 + + @property + def index_column_name(self): + raise NotImplementedError + + @property + def type_ids(self): + return self._index_typeid2df.keys() + + @property + def columns(self): + return list(self._columns.values()) + + def column(self, column_name): + return self._columns[column_name] + + def add_table(self, nt_df): + # TODO: Just saving the entire dataframe currently because we don't expect the node-types table to get too large + # (few hundred rows at the most). If that changes consider to loading the csv until explicity called by user. + self._dataframes.append(nt_df) + + # Check that the type ids are unique and build id --> dataframe map + nt_df.set_index(keys=self.index_column_name, inplace=True) + for type_id in list(nt_df.index): + if type_id in self._index_typeid2df: + raise Exception('Multiple {}s with value {}.'.format(self.index_column_name, type_id)) + self._index_typeid2df[type_id] = nt_df + + columns = ColumnProperty.from_csv(nt_df) + for col in columns: + self._columns[col.name] = col + if col in self._column_map: + # TODO: make sure dtype matches. Bad things can happen if the same col has heterogeneous dtypes + self._column_map[col.name].append(nt_df) + else: + self._column_map[col.name] = [nt_df] + + def find(self, column_key, column_val, silent=False): + """Returns a list of type_ids that contain column property column_key==column_val + + :param column_key: Name of column to search + :param column_val: Value of column to select for + :param silent: Set to true to prevent KeyError if column_key doesn't exist (default=False) + :return: A (potentially empty) list of type_ids + """ + if not silent and column_key not in self.columns: + raise KeyError + + is_list = isinstance(column_val, list) + selected_ids = [] # running list of valid type-ids + column_dtype = self.column(column_key).dtype + for df in self._column_map[column_key]: + # if a csv column has all NONE values, pandas will load the values as float(NaN)'s. Thus for str/object + # columns we need to check dtype otherwise we'll get an invalid comparisson. + if df[column_key].dtype == column_dtype: + if is_list: + indicies = df[df[column_key].isin(column_val)].index + else: + indicies = df[df[column_key] == column_val].index + + if len(indicies) > 0: + selected_ids.extend(list(indicies)) + + return selected_ids + + def to_dataframe(self, cache=False): + if self._df_cache is not None: + return self._df_cache + + if len(self._dataframes) == 0: + return None + elif len(self._dataframes) == 1: + merged_table = self._dataframes[0] + else: + # merge all dataframes together + merged_table = self._dataframes[0].reset_index() # TODO: just merge on the indicies rather than reset + for df in self._dataframes[1:]: + try: + merged_table = merged_table.merge(df.reset_index(), how='outer') + except ValueError as ve: + # There is a potential issue if merging where one dtype is different from another (ex, if all + # model_template's are NONE pandas will load column as float64). First solution is to find columns + # that differ and upcast columns as object's (TODO: look for better solution) + right_df = df.reset_index() + for col in set(merged_table.columns) & set(right_df.columns): + # find all shared columns whose dtype differs + if merged_table[col].dtype != right_df[col].dtype: + # change column(s) dtype to object + merged_table[col] = merged_table[col] if merged_table[col].dtype == object \ + else merged_table[col].astype(object) + right_df[col] = right_df[col] if right_df[col].dtype == object \ + else right_df[col].astype(object) + + merged_table = merged_table.merge(right_df, how='outer') + + merged_table.set_index(self.index_column_name, inplace=True) + + if cache: + self._df_cache = merged_table + + return merged_table + + def __iter__(self): + self._itr_indx = 0 + self._itr_end = len(self.type_ids) + return self + + def next(self): + return self.__next__() + + def __next__(self): + if self._itr_indx >= self._itr_end: + raise StopIteration + + ntid = self.type_ids[self._itr_indx] + self._itr_indx += 1 + return self[ntid] + + def __getitem__(self, type_id): + if isinstance(type_id, tuple): + return [self[ntid] for ntid in type_id] + + elif isinstance(type_id, numbers.Integral): + if type_id not in self._index_typeid2df: + raise Exception('{} {} not found'.format(self.index_column_name, type_id)) + + if type_id in self._cached_node_types: + return self._cached_node_types[type_id] + else: + nt_dict = self._index_typeid2df[type_id].loc[type_id].to_dict() + # TODO: consider just removing key from dict if value is None/NaN + remove_nans(nt_dict) # pd turns None into np.nan's. Temp soln is to just convert them back. + self._cached_node_types[type_id] = nt_dict + self._cached_node_types[type_id][self.index_column_name] = type_id # include node/edge_type_id + return nt_dict + else: + raise Exception('Unsupported search on node-type-id') + + def __contains__(self, type_id): + return type_id in self._index_typeid2df + + def __repr__(self): + return repr(self.to_dataframe()) + + +class NodeTypesTable(TypesTable): + def __init__(self, parent=None): + super(NodeTypesTable, self).__init__(parent) + + @property + def index_column_name(self): + return 'node_type_id' + + @property + def node_type_ids(self): + return self.type_ids + + +class EdgeTypesTable(TypesTable): + def __init__(self, parent=None): + super(EdgeTypesTable, self).__init__(parent) + + @property + def index_column_name(self): + return 'edge_type_id' + + @property + def edge_type_ids(self): + return self.type_ids diff --git a/bmtk-vb/build/lib/bmtk/utils/sonata/utils.py b/bmtk-vb/build/lib/bmtk/utils/sonata/utils.py new file mode 100644 index 0000000..953572d --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/sonata/utils.py @@ -0,0 +1,116 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import os +import sys + +import h5py +import pandas as pd +import numpy as np + +MAGIC_ATTR = 'magic' +MAGIC_VAL = 0x0A7A +VERSION_ATTR = 'version' +VERSION_NA = 'NA' +VERSION_CURRENT = '0.1' + +try: + ver_split = VERSION_CURRENT.split('.') + VERSION_MAJOR = ver_split[0] + VERSION_MINOR = ver_split[1] +except (IndexError, AttributeError) as err: + VERSION_MAJOR = 0 + VERSION_MINOR = 1 + + +def listify(files): + # TODO: change this to include any iterable datastructures (sets, panda sequences, etc) + if not isinstance(files, (list, tuple)): + return [files] + else: + return files + + +def load_h5(h5file, mode='r'): + # TODO: Allow for h5py.Group also + if isinstance(h5file, h5py.File): + return h5file + + return h5py.File(h5file, mode) + + +def load_csv(csvfile): + # TODO: make the separator more flexible + if isinstance(csvfile, pd.DataFrame): + return csvfile + + # TODO: check if it is csv object and convert to a pd dataframe + return pd.read_csv(csvfile, sep=' ', na_values='NONE') + + +def get_attribute_h5(h5obj, attribut_name, default=None): + val = h5obj.attrs.get(attribut_name, default) + if using_py3 and isinstance(val, bytes): + # There is an but with h5py returning unicode/str based attributes as bytes + val = val.decode() + + return val + + +def check_magic(hdf5_file): + """Check the magic attribute exists according to the sonata format""" + h5_file_obj = load_h5(hdf5_file) + if MAGIC_ATTR not in h5_file_obj.attrs: + raise Exception('File {} missing top-level \"{}\" attribute.'.format(h5_file_obj.filename, MAGIC_ATTR)) + elif np.uint32(get_attribute_h5(hdf5_file, MAGIC_ATTR)) != MAGIC_VAL: + raise Exception('File {} has unexpected magic value (expected {})'.format(h5_file_obj.filename, MAGIC_VAL)) + + return True + + +def get_version(hdf5_file): + h5_file_obj = load_h5(hdf5_file) + if VERSION_ATTR not in h5_file_obj.attrs: + return VERSION_NA + + else: + version_val = get_attribute_h5(h5_file_obj, VERSION_ATTR) + version_str = str(version_val[0]) + for ver_sub in version_val[1:]: + version_str += '.{}'.format(ver_sub) + return version_str + + +def add_hdf5_magic(hdf5_handle): + hdf5_handle['/'].attrs['magic'] = np.uint32(0x0A7A) + + +def add_hdf5_version(hdf5_handle): + hdf5_handle['/'].attrs['version'] = [np.uint32(VERSION_MAJOR), np.uint32(VERSION_MINOR)] + + +if sys.version_info[0] == 3: + using_py3 = True + range_itr = range +else: + using_py3 = False + range_itr = xrange diff --git a/bmtk-vb/build/lib/bmtk/utils/spike_trains/__init__.py b/bmtk-vb/build/lib/bmtk/utils/spike_trains/__init__.py new file mode 100644 index 0000000..7fdcfe6 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/spike_trains/__init__.py @@ -0,0 +1,24 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from .spikes_csv import SpikesGenerator +from .spikes_file import SpikesFile diff --git a/bmtk-vb/build/lib/bmtk/utils/spike_trains/spikes_csv.py b/bmtk-vb/build/lib/bmtk/utils/spike_trains/spikes_csv.py new file mode 100644 index 0000000..64651d0 --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/spike_trains/spikes_csv.py @@ -0,0 +1,94 @@ +# Copyright 2017. Allen Institute. All rights reserved +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +import pandas as pd +import numpy as np +import csv +import h5py +from six import string_types + +from bmtk.utils import sonata + +class Rates(object): + def __iter__(self): + return self + + def next(self): + raise StopIteration + + +class NormalRates(Rates): + def __init__(self, t_start, t_end, rate_mu, rate_sigma=5.0): + self.t_start = t_start + self.t_end = t_end + self.period_mu = 1.0/float(rate_mu) + self.period_sigma = 1.0/float(rate_mu + rate_sigma) + + self._current_t = t_start + + def next(self): + self._current_t += abs(np.random.normal(self.period_mu, self.period_sigma)) + if self._current_t > self.t_end: + self._current_t = self.t_start + raise StopIteration + else: + return self._current_t + + +class SpikesGenerator(object): + def __init__(self, nodes, populations=None, t_min=0, t_max=1.0): + self._t_min = t_min + self._t_max = t_max + + if isinstance(nodes, string_types): + nodes_h5 = h5py.File(nodes, 'r') + nodes_grp = nodes_h5['/nodes'] + if populations is None: + populations = nodes_grp.keys() + + # TODO: Need a way to Use sonata library without having to use node-types + nodes = [] + for node_pop in populations: + nodes.extend(nodes_grp[node_pop]['node_id']) + + self._nodes = {n: Rates() for n in nodes} + + def set_rate(self, firing_rate, gids=None, t_start=None, t_end=None): + t_start = t_start or self._t_min + assert(t_start >= self._t_min) + + t_end = t_end or self._t_max + assert(t_end <= self._t_max) + + gids = gids or self._nodes.keys() + for gid in gids: + self._nodes[gid] = NormalRates(t_start, t_end, firing_rate) + + def save_csv(self, csv_file_name, in_ms=False): + conv = 1000.0 if in_ms else 1.0 + + with open(csv_file_name, 'w') as csv_file: + csv_writer = csv.writer(csv_file, delimiter=' ') + csv_writer.writerow(['gid', 'spike-times']) + for gid, rate_gen in self._nodes.items(): + csv_writer.writerow([gid, ','.join(str(r*conv) for r in rate_gen)]) + diff --git a/bmtk-vb/build/lib/bmtk/utils/spike_trains/spikes_file.py b/bmtk-vb/build/lib/bmtk/utils/spike_trains/spikes_file.py new file mode 100644 index 0000000..fd4577a --- /dev/null +++ b/bmtk-vb/build/lib/bmtk/utils/spike_trains/spikes_file.py @@ -0,0 +1,174 @@ +import os +from collections import Counter +import numpy as np +import pandas as pd +import h5py + + +class SpikesFile(object): + _file_adaptors = {} + + def __init__(self, filename, mode='r', filetype=None, **params): + self._ftype = self._get_file_type(filename, filetype) + self._adaptor = SpikesFile._file_adaptors[self._ftype](filename, **params) + + def _get_file_type(self, filename, filetype): + if filetype is not None: + if filetype not in self._file_adaptors: + raise Exception('Unknown spikes file type {}'.format(filetype)) + else: + return filetype + + else: + for ft, adaptor_cls in self._file_adaptors.items(): + if adaptor_cls.is_type(filename): + return ft + + raise Exception('Unable to determine file type for {}.'.format(filename)) + + def _get_spikes_sort(self, spikes_list, t_window=None): + if t_window is not None: + spikes_list.sort() + return [s for s in spikes_list if t_window[0] <= s <= t_window[1]] + else: + spikes_list.sort() + return spikes_list + + @property + def gids(self): + """Return a list of all gids""" + return self._adaptor.gids + + def to_dataframe(self): + return self._adaptor.to_dataframe() + + def get_spikes(self, gid, time_window=None): + return self._adaptor.get_spikes(gid, time_window=None) + + def __eq__(self, other): + return self.is_equal(other) + + def is_equal(self, other, err=0.00001, time_window=None): + # check that gids matches + if set(self.gids) != set(other.gids): + return False + + for gid in self.gids: + spikes_self = self._get_spikes_sort(self.get_spikes(gid), time_window) + spikes_other = self._get_spikes_sort(other.get_spikes(gid), time_window) + + if len(spikes_other) != len(spikes_self): + return False + + for s0, s1 in zip(spikes_self, spikes_other): + if abs(s0 - s1) > err: + return False + return True + + @classmethod + def register_adaptor(cls, adaptor_cls): + cls._file_adaptors[adaptor_cls.ext_name()] = adaptor_cls + return adaptor_cls + + +class SpikesFileAdaptor(object): + def __init__(self, filename): + self._filename = filename + + @property + def gids(self): + raise NotImplementedError + + def to_dataframe(self): + raise NotImplementedError + + def get_spikes(self, gid, time_window=None): + raise NotImplementedError + + @staticmethod + def is_type(filename): + raise NotImplementedError + + @staticmethod + def ext_name(): + raise NotImplementedError + + +@SpikesFile.register_adaptor +class SpikesFileH5(SpikesFileAdaptor): + def __init__(self, filename, **params): + super(SpikesFileH5, self).__init__(filename) + self._h5_handle = h5py.File(self._filename, 'r') + self._sort_order = self._h5_handle['/spikes'].attrs.get('sorting', None) + self._gid_ds = self._h5_handle['/spikes/gids'] + self._timestamps_ds = self._h5_handle['/spikes/timestamps'] + + self._indexed = False + self._gid_indicies = {} + self._build_indicies() + + def _build_indicies(self): + if self._sort_order == 'by_gid': + indx_beg = 0 + c_gid = self._gid_ds[0] + for indx, gid in enumerate(self._gid_ds): + if gid != c_gid: + self._gid_indicies[c_gid] = slice(indx_beg, indx) + c_gid = gid + indx_beg = indx + self._gid_indicies[c_gid] = slice(indx_beg, indx+1) + self._indexed = True + else: + self._gid_indicies = {int(gid): [] for gid in np.unique(self._gid_ds)} + for indx, gid in enumerate(self._gid_ds): + self._gid_indicies[gid].append(indx) + self._indexed = True + + @property + def gids(self): + return list(self._gid_indicies.keys()) + + def to_dataframe(self): + return pd.DataFrame({'timestamps': self._timestamps_ds, 'gids': self._gid_ds}) + + def get_spikes(self, gid, time_window=None): + return self._timestamps_ds[self._gid_indicies[gid]] + + @staticmethod + def is_type(filename): + _, fext = os.path.splitext(filename) + fext = fext.lower() + return fext == '.h5' or fext == '.hdf' or fext == '.hdf5' + + @staticmethod + def ext_name(): + return 'h5' + + +@SpikesFile.register_adaptor +class SpikesFileCSV(SpikesFileAdaptor): + def __init__(self, filename, **params): + super(SpikesFileCSV, self).__init__(filename) + self._spikes_df = pd.read_csv(self._filename, names=['timestamps', 'gids'], sep=' ') + + @property + def gids(self): + return list(self._spikes_df.gids.unique()) + + def to_dataframe(self): + return self._spikes_df + + def get_spikes(self, gid, time_window=None): + return np.array(self._spikes_df[self._spikes_df.gids == gid].timestamps) + + @staticmethod + def is_type(filename): + _, fext = os.path.splitext(filename) + fext = fext.lower() + return fext == '.csv' or fext == '.txt' + + @staticmethod + def ext_name(): + return 'csv' + + diff --git a/bmtk-vb/docker/Dockerfile b/bmtk-vb/docker/Dockerfile new file mode 100644 index 0000000..5adcc0a --- /dev/null +++ b/bmtk-vb/docker/Dockerfile @@ -0,0 +1,84 @@ +FROM continuumio/anaconda2 +MAINTAINER Kael Dai + +RUN apt-get update && apt-get install -y automake \ + libtool \ + build-essential \ + libncurses5-dev + +ENV BUILD_DIR=/home/build +ENV HOME_DIR=/home/shared +ENV WORK_DIR=${HOME_DIR}/workspace + +RUN mkdir -p ${BUILD_DIR} +RUN mkdir -p ${HOME_DIR} +RUN mkdir -p ${WORK_DIR} + +RUN conda install -y numpy h5py lxml pandas matplotlib jsonschema scipy mpi4py cmake + +# Install NEURON for BioNet +RUN conda install -y -c kaeldai neuron + + +### Install NEST for PointNet +ENV NEST_VER=2.12.0 +ENV NEST_INSTALL_DIR=${BUILD_DIR}/nest/build +ENV PYTHON_ENV=python2.7 + +RUN cd ${BUILD_DIR} \ + conda install -y gsl; \ + wget --quiet https://github.com/nest/nest-simulator/releases/download/v${NEST_VER}/nest-${NEST_VER}.tar.gz -O nest.tar.gz; \ + tar xfz nest.tar.gz; \ + cd nest-${NEST_VER}; \ + mkdir build && cd build; \ + cmake -DCMAKE_INSTALL_PREFIX=${NEST_INSTALL_DIR} -Dwith-mpi=ON -Dwith-gsl=ON -Dwith-python=ON -Dwith-ltdl=ON ..; \ + make; \ + make install + +# Taken from /home/shared/nest/bin/nest_vars.sh, needed to run nest and pynest in jupyter +ENV NEST_DATA_DIR=${NEST_INSTALL_DIR}/share/nest +ENV NEST_DOC_DIR=${NEST_INSTALL_DIR}/share/doc/nest +ENV NEST_MODULE_PATH=${NEST_INSTALL_DIR}/lib/nest +ENV NEST_PYTHON_PREFIX=${NEST_INSTALL_DIR}/lib/${PYTHON_ENV}/site-packages +ENV PYTHONPATH=${NEST_PYTHON_PREFIX}:${PYTHONPATH} +ENV PATH=${NEST_INSTALL_DIR}/bin:${PATH} + + +### Install DiPDE for PopNet +RUN conda install -y -c nicholasc dipde + + +### Install Tensorflow for MintNet +RUN conda install -y tensorflow + +### Install AllenSDK (Not used by bmtk, but used by some notebooks to fetch cell-types files) +RUN pip install allensdk + + +### Install the bmtk +RUN cd ${BUILD_DIR}; \ + git clone https://github.com/AllenInstitute/bmtk.git; \ + cd bmtk; \ + python setup.py install + +# Setup the examples and tutorials +RUN cd ${BUILD_DIR}/bmtk/docs; \ + cp -R examples ${HOME_DIR}; \ + cp -R tutorial ${HOME_DIR} + +# Setup components directories for tutorials, including compiling neuron modfiles +RUN cd ${HOME_DIR}/tutorial; \ + cp -R ../examples/*_components .; \ + cd biophys_components/mechanisms; \ + nrnivmodl modfiles/ + +# Pre-compile mechanisms for BioNet examples +RUN cd ${HOME_DIR}/examples/biophys_components/mechanisms; \ + nrnivmodl modfiles/ + + +# Create an entry point for running the image +COPY entry_script.sh ${BUILD_DIR} +RUN chmod +x ${BUILD_DIR}/entry_script.sh + +ENTRYPOINT ["/home/build/entry_script.sh"] diff --git a/bmtk-vb/docker/README.md b/bmtk-vb/docker/README.md new file mode 100644 index 0000000..d0e13ea --- /dev/null +++ b/bmtk-vb/docker/README.md @@ -0,0 +1,56 @@ +docker-bmtk +============== + +With Docker you can test and run the bmtk without having to go through the hasssel of installing all the prerequists (incl. +NEURON, NEST, DiPDE, etc). All you need is the Docker client installed on your computer. You can use the bmtk Docker +container through the command-line to build models and run simulations. Or you can use it as a Jupyter Notebook container +to test out existing tutorials/examples, or create new Notebooks yourself + +*Note*: You will not be able to utilize parallelization support (MPI) if running bmtk through Docker. Similarly you can +expect memory issues and slowness for larger networks. For building and simulating large networks we recommend installing +bmtk and the required tools natively on your machine. + + +Getting the Image +------------------ + +You can pull the bmtk container from DockerHub +```bash + $ docker pull alleninstitute/bmtk +``` + +Or to build the image from the bmtk/docker directory +```bash + $ docker build -t alleninstitute/bmtk . +``` + + +Running the BMTK +---------------- + +### Through the command-line +To run a network-build or simulation-run bmtk script using the docker container, go to the directory containing your +python script and any necessary supporting files: +```bash + $ docker run alleninstitute/bmtk -v $(pwd):/home/shared/workspace python .py +``` + +**NOTE**: All files must be under the directory you are running the command; including network, components, and output +directories. If your config.json files references anything outside the working directory branch things will not work +as expected. + +#### NEURON Mechanisms +If you are running BioNet and have special mechanims/mod files that need to be compiled, you can do so by running: +```bash + $ cd path/to/mechanims + $ docker run -v $(pwd):/home/shared/workspace/mechanisms nrnivmodl modfiles/ +``` + +### Through Jupyter Notebooks +To run a Jupyter Notebook server: +```bash + $ docker run -v $(pwd):/home/shared/workspace -p 8888:8888 jupyter +``` + +Then open a browser to 127.0.0.1:8888/. Any new files and/or notebooks that you want to save permenately should +be created in the workspace folder, otherwise the work will be lost when the server is stopped. \ No newline at end of file diff --git a/bmtk-vb/docker/entry_script.sh b/bmtk-vb/docker/entry_script.sh new file mode 100644 index 0000000..2d55ee9 --- /dev/null +++ b/bmtk-vb/docker/entry_script.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + +if [[ $1 = "nrnivmodl" ]]; then + shift + nrnivmodl $@ +elif [[ $1 = "python" ]]; then + shift + python $@ +elif [[ $1 = "jupyter" ]]; then + shift + echo "HERE" + jupyter notebook --allow-root --ip=* --port 8888 --no-browser --notebook-dir /home/shared --NotebookApp.token="" +else + python $@ +fi diff --git a/bmtk-vb/docs/README.md b/bmtk-vb/docs/README.md new file mode 100644 index 0000000..e5b7b6d --- /dev/null +++ b/bmtk-vb/docs/README.md @@ -0,0 +1,5 @@ +## BMTK documentation, guides and examples +#### directory structure +* autodocs/ - scripts and pages for the generation of github-pages html files. +* tutorial/ - Tutorials and guides for using bmtk and its different parts. **New users should start here**. +* examples/ - Various examples of how to build networks, run various simulations and plot their results. A good place to start for users wanting a quick and dirty introduction (warning: many of these examples are not as well documented as the tutorials). diff --git a/bmtk-vb/docs/autodocs/.nojekyll b/bmtk-vb/docs/autodocs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/bmtk-vb/docs/autodocs/Makefile b/bmtk-vb/docs/autodocs/Makefile new file mode 100644 index 0000000..e896f11 --- /dev/null +++ b/bmtk-vb/docs/autodocs/Makefile @@ -0,0 +1,25 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = python -msphinx +SPHINXPROJ = BrainModelingToolkit +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +html: + sphinx-apidoc -f -o source/bmtk/ ../../bmtk + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/bmtk-vb/docs/autodocs/source/_static/images/all_network_cropped.png b/bmtk-vb/docs/autodocs/source/_static/images/all_network_cropped.png new file mode 100644 index 0000000..658dd26 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/all_network_cropped.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/dipde_icon.png b/bmtk-vb/docs/autodocs/source/_static/images/dipde_icon.png new file mode 100644 index 0000000..e1cfa62 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/dipde_icon.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/edge_types.png b/bmtk-vb/docs/autodocs/source/_static/images/edge_types.png new file mode 100644 index 0000000..4d331a8 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/edge_types.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/edges_h5_structure.png b/bmtk-vb/docs/autodocs/source/_static/images/edges_h5_structure.png new file mode 100644 index 0000000..8695191 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/edges_h5_structure.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/ext_inputs_raster.png b/bmtk-vb/docs/autodocs/source/_static/images/ext_inputs_raster.png new file mode 100644 index 0000000..290f090 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/ext_inputs_raster.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/graph_structure.png b/bmtk-vb/docs/autodocs/source/_static/images/graph_structure.png new file mode 100644 index 0000000..af89d20 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/graph_structure.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/levels_of_resolution.png b/bmtk-vb/docs/autodocs/source/_static/images/levels_of_resolution.png new file mode 100644 index 0000000..83ad07d Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/levels_of_resolution.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/nest_icon.png b/bmtk-vb/docs/autodocs/source/_static/images/nest_icon.png new file mode 100644 index 0000000..c0d8273 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/nest_icon.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/neuron_icon.png b/bmtk-vb/docs/autodocs/source/_static/images/neuron_icon.png new file mode 100644 index 0000000..9c754c4 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/neuron_icon.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/node_types.png b/bmtk-vb/docs/autodocs/source/_static/images/node_types.png new file mode 100644 index 0000000..46d5a29 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/node_types.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/nodes_h5_structure.png b/bmtk-vb/docs/autodocs/source/_static/images/nodes_h5_structure.png new file mode 100644 index 0000000..39fcb5b Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/nodes_h5_structure.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/tensorflow_icon.png b/bmtk-vb/docs/autodocs/source/_static/images/tensorflow_icon.png new file mode 100644 index 0000000..9d89ed9 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/tensorflow_icon.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/v1_raster.png b/bmtk-vb/docs/autodocs/source/_static/images/v1_raster.png new file mode 100644 index 0000000..aadd0fa Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/v1_raster.png differ diff --git a/bmtk-vb/docs/autodocs/source/_static/images/workflow.png b/bmtk-vb/docs/autodocs/source/_static/images/workflow.png new file mode 100644 index 0000000..e603b78 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/_static/images/workflow.png differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/aibs_sphinx.css_t b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/aibs_sphinx.css_t new file mode 100644 index 0000000..d53294b --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/aibs_sphinx.css_t @@ -0,0 +1,833 @@ +/* + * traditional.css + * ~~~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- traditional docs.python.org theme. + * + * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +body { + color: #000; + margin: 0; + padding: 0; +} + +/* :::: LAYOUT :::: */ + +div.document { + position: absolute; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 {{ theme_sidebarwidth }}px; +} + +div.body { + background-color: white; + padding: 20px 50px 30px 0px; + font-family: Verdana, sans-serif; +} + +div.sphinxsidebarwrapper { + padding: 10px; + margin: 0px 0px 0px 50px; + padding: 0; +} + +div.sphinxsidebar { + position: absolute; + top: 0; + left: 0; + margin-left: 0; + width: {{ theme_sidebarwidth }}px; + font-family: Verdana, sans-serif; +} + +div.clearer { + clear: both; +} + +div.footer { + clear: both; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; +} + +div.related { + color: #333; + width: 100%; + height: 30px; + line-height: 30px; + border-bottom: 5px solid white; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + margin-left: 40px; + margin-right: 50px; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; + font-weight: bold; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + + +/* ::: SIDEBAR :::: */ +div.sphinxsidebar h3 { + margin: 0; + margin-top: 20px; + font-family: bebas_neueregular; + font-weight: bold; + font-size: 40px; + color: rgb(66,66,66); +} + +div.sphinxsidebar h3 a { + color: rgb(66,66,66); +} + +div.sphinxsidebar h4 { + margin: 5px 0 0 0; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + margin-left: 15px; + padding: 0; + font-family: arial, sans-serif; + font-size: 14px; + font-weight: bold; + list-style-type: none; +} + +div.sphinxsidebar li { + margin-top: 11px; +} + +li.toctree-l2 { + font-size: 12px; + margin-top: 8px !important; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + + +/* :::: SEARCH :::: */ +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* :::: COMMON FORM STYLES :::: */ + +div.actions { + border-top: 1px solid #aaa; + background-color: #ddd; + margin: 10px 0 0 -20px; + padding: 5px 0 5px 20px; +} + +form dl { + color: #333; +} + +form dt { + clear: both; + float: left; + min-width: 110px; + margin-right: 10px; + padding-top: 2px; +} + +input#homepage { + display: none; +} + +div.error { + margin: 5px 20px 0 0; + padding: 5px; + border: 1px solid #d00; + /*border: 2px solid #05171e; + background-color: #092835; + color: white;*/ + font-weight: bold; +} + +/* :::: INLINE COMMENTS :::: */ + +div.inlinecommentswrapper { + float: right; + max-width: 40%; +} + +div.commentmarker { + float: right; + background-image: url(style/comment.png); + background-repeat: no-repeat; + width: 25px; + height: 25px; + text-align: center; + padding-top: 3px; +} + +div.nocommentmarker { + float: right; + background-image: url(style/nocomment.png); + background-repeat: no-repeat; + width: 25px; + height: 25px; +} + +div.inlinecomments { + margin-left: 10px; + margin-bottom: 5px; + background-color: #eee; + border: 1px solid #ccc; + padding: 5px; +} + +div.inlinecomment { + border-top: 1px solid #ccc; + padding-top: 5px; + margin-top: 5px; +} + +.inlinecomments p { + margin: 5px 0 5px 0; +} + +.inlinecomments .head { + font-weight: bold; +} + +.inlinecomments .meta { + font-style: italic; +} + + +/* :::: COMMENTS :::: */ + +div#comments h3 { + border-top: 1px solid #aaa; + padding: 5px 20px 5px 20px; + margin: 20px -20px 20px -20px; + background-color: #ddd; +} + +/* +div#comments { + background-color: #ccc; + margin: 40px -20px -30px -20px; + padding: 0 0 1px 0; +} + +div#comments h4 { + margin: 30px 0 20px 0; + background-color: #aaa; + border-bottom: 1px solid #09232e; + color: #333; +} + +div#comments form { + display: block; + margin: 0 0 0 20px; +} + +div#comments textarea { + width: 98%; + height: 160px; +} + +div#comments div.help { + margin: 20px 20px 10px 0; + background-color: #ccc; + color: #333; +} + +div#comments div.help p { + margin: 0; + padding: 0 0 10px 0; +} + +div#comments input, div#comments textarea { + font-family: 'Bitstream Vera Sans', 'Arial', sans-serif; + font-size: 13px; + color: black; + background-color: #aaa; + border: 1px solid #092835; +} + +div#comments input[type="reset"], +div#comments input[type="submit"] { + cursor: pointer; + font-weight: bold; + padding: 2px; + margin: 5px 5px 5px 0; + background-color: #666; + color: white; +} + +div#comments div.comment { + margin: 10px 10px 10px 20px; + padding: 10px; + border: 1px solid #0f3646; + background-color: #aaa; + color: #333; +} + +div#comments div.comment p { + margin: 5px 0 5px 0; +} + +div#comments div.comment p.meta { + font-style: italic; + color: #444; + text-align: right; + margin: -5px 0 -5px 0; +} + +div#comments div.comment h4 { + margin: -10px -10px 5px -10px; + padding: 3px; + font-size: 15px; + background-color: #888; + color: white; + border: 0; +} + +div#comments div.comment pre, +div#comments div.comment code { + background-color: #ddd; + color: #111; + border: none; +} + +div#comments div.comment a { + color: #fff; + text-decoration: underline; +} + +div#comments div.comment blockquote { + margin: 10px; + padding: 10px; + border-left: 1px solid #0f3646; + /*border: 1px solid #0f3646; + background-color: #071c25;*/ +} + +div#comments em.important { + color: #d00; + font-weight: bold; + font-style: normal; +}*/ + +/* :::: SUGGEST CHANGES :::: */ +div#suggest-changes-box input, div#suggest-changes-box textarea { + border: 1px solid #ccc; + background-color: white; + color: black; +} + +div#suggest-changes-box textarea { + width: 99%; + height: 400px; +} + + +/* :::: PREVIEW :::: */ +div.preview { + background-image: url(style/preview.png); + padding: 0 20px 20px 20px; + margin-bottom: 30px; +} + + +/* :::: INDEX PAGE :::: */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.5em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; +} + +/* :::: GENINDEX STYLES :::: */ + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +/* :::: GLOBAL STYLES :::: */ + +p.subhead { + font-weight: bold; + margin-top: 20px; +} + +a:link { color: #0779be; } +a:visited { color: #0779be; } +a:hover { color: #bbeeff; } +a:active { color: #bbeeff; } + + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: bebas_neueregular; + font-weight: bold; + color: rgb(66,66,66); + +} + + + +div.body h1 { font-size: 21pt; } +div.body h2 { font-size: 18pt; } +div.body h3 { font-size: 14pt; } +div.body h4 { font-size: 14pt; } + +a.headerlink, +a.headerlink, +a.headerlink, +a.headerlink, +a.headerlink, +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; + visibility: hidden; +} + +*:hover > a.headerlink, +*:hover > a.headerlink, +*:hover > a.headerlink, +*:hover > a.headerlink, +*:hover > a.headerlink, +*:hover > a.headerlink { + visibility: visible; +} + +a.headerlink:hover, +a.headerlink:hover, +a.headerlink:hover, +a.headerlink:hover, +a.headerlink:hover, +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; +} + +div.body td { + text-align: left; +} + +ul.fakelist { + list-style: none; + margin: 10px 0 10px 20px; + padding: 0; +} + +/* "Footnotes" heading */ +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +/* "Topics" */ + +div.topic { + background-color: #eee; + border: 1px solid #ccc; + padding: 0 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* Admonitions */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dd { + margin-bottom: 10px; +} + +div.admonition dl { + margin-bottom: 0; +} + +div.admonition p { + display: inline; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +table.docutils { + border: 0; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 0 8px 2px 0; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +dl { + margin-bottom: 15px; + clear: both; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +th { + text-align: left; + padding-right: 5px; +} + +pre { + font-family: monospace; + padding: 5px; + color: #00008b; + border-left: none; + border-right: none; +} + +code { + font-family: monospace; + background-color: #ecf0f3; + padding: 0 1px 0 1px; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +.footnote:target { background-color: #ffa } + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +/* :::: PRINT :::: */ +@media print { + div.documentwrapper { + width: 100%; + } + + div.body { + margin: 0; + } + + div.sphinxsidebar, + div.related, + div.footer, + div#comments div.new-comment-box, + #top-link { + display: none; + } +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; + margin: -1px -10px; + padding: 0 10px; +} + +div.code-block-caption { + background-color: #cceeff; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper pre { + margin: 0; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* davidf: new stuff here */ + +img.align-right { + float: right; + padding: 10px; +} + +hr.docutils { + border: none; + clear: both; +} + +a.current { + +} + +div.sphinxsidebar p.questions { + margin-right: 15px; + font-size: 90%; +} + +dl.class > dt { + background-color: #ef9c43; + border: 1px solid #ff9c33; + padding: 3px; +} + +dl.method > dt, dl.classmethod > dt { + background-color: #add4eb; + border: 1px solid: #99daff; + padding: 3px; +} + +dl.function > dt, dl.exception > dt { + background-color: #a0d279; + border: 1px solid: #9cf25a; + padding: 3px; +} + +/* +table.docutils tr.field th.field-name { + background-color: #eaeaea; + border-bottom: 4px solid white; +} +*/ + +table.docutils th, table.docutils td { + padding: 4px 8px 4px 4px; +} + +table.docutils tr.field { + border-bottom: 3px solid white; +} + +td.field-body > p > strong { + background-color: #eaeaea; + padding: 3px; + border-left: 2px solid #d0d0d0; +} \ No newline at end of file diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/AIBS_Logo.png b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/AIBS_Logo.png new file mode 100644 index 0000000..8442fa9 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/AIBS_Logo.png differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/Brain_Atlas_Logotype_SDK.png b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/Brain_Atlas_Logotype_SDK.png new file mode 100644 index 0000000..3bf99a7 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/Brain_Atlas_Logotype_SDK.png differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/arrow_off.gif b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/arrow_off.gif new file mode 100644 index 0000000..3448eff Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/arrow_off.gif differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/arrow_on.gif b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/arrow_on.gif new file mode 100644 index 0000000..1c8ac26 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/arrow_on.gif differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/arrow_over.gif b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/arrow_over.gif new file mode 100644 index 0000000..4b7cde6 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/arrow_over.gif differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/close_x.png b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/close_x.png new file mode 100644 index 0000000..e7cc1c6 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/close_x.png differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/logo_AIBS.gif b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/logo_AIBS.gif new file mode 100644 index 0000000..21ff623 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/logo_AIBS.gif differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/logo_aibs_footer.png b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/logo_aibs_footer.png new file mode 100644 index 0000000..57f831a Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/logo_aibs_footer.png differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/progress_indicator.gif b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/progress_indicator.gif new file mode 100644 index 0000000..c439da4 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/progress_indicator.gif differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/tab_blue.gif b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/tab_blue.gif new file mode 100644 index 0000000..ed399c1 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/tab_blue.gif differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/workflow.png b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/workflow.png new file mode 100644 index 0000000..e603b78 Binary files /dev/null and b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/images/workflow.png differ diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/javascript/AC_RunActiveContent.js b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/javascript/AC_RunActiveContent.js new file mode 100644 index 0000000..39c294b --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/javascript/AC_RunActiveContent.js @@ -0,0 +1,292 @@ +//v1.7 +// Flash Player Version Detection +// Detect Client Browser type +// Copyright 2005-2007 Adobe Systems Incorporated. All rights reserved. +var isIE = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false; +var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false; +var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false; + +function ControlVersion() +{ + var version; + var axo; + var e; + + // NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry + + try { + // version will be set for 7.X or greater players + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); + version = axo.GetVariable("$version"); + } catch (e) { + } + + if (!version) + { + try { + // version will be set for 6.X players only + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); + + // installed player is some revision of 6.0 + // GetVariable("$version") crashes for versions 6.0.22 through 6.0.29, + // so we have to be careful. + + // default to the first public version + version = "WIN 6,0,21,0"; + + // throws if AllowScripAccess does not exist (introduced in 6.0r47) + axo.AllowScriptAccess = "always"; + + // safe to call for 6.0r47 or greater + version = axo.GetVariable("$version"); + + } catch (e) { + } + } + + if (!version) + { + try { + // version will be set for 4.X or 5.X player + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3"); + version = axo.GetVariable("$version"); + } catch (e) { + } + } + + if (!version) + { + try { + // version will be set for 3.X player + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3"); + version = "WIN 3,0,18,0"; + } catch (e) { + } + } + + if (!version) + { + try { + // version will be set for 2.X player + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); + version = "WIN 2,0,0,11"; + } catch (e) { + version = -1; + } + } + + return version; +} + +// JavaScript helper required to detect Flash Player PlugIn version information +function GetSwfVer(){ + // NS/Opera version >= 3 check for Flash plugin in plugin array + var flashVer = -1; + + if (navigator.plugins != null && navigator.plugins.length > 0) { + if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) { + var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : ""; + var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description; + var descArray = flashDescription.split(" "); + var tempArrayMajor = descArray[2].split("."); + var versionMajor = tempArrayMajor[0]; + var versionMinor = tempArrayMajor[1]; + var versionRevision = descArray[3]; + if (versionRevision == "") { + versionRevision = descArray[4]; + } + if (versionRevision[0] == "d") { + versionRevision = versionRevision.substring(1); + } else if (versionRevision[0] == "r") { + versionRevision = versionRevision.substring(1); + if (versionRevision.indexOf("d") > 0) { + versionRevision = versionRevision.substring(0, versionRevision.indexOf("d")); + } + } + var flashVer = versionMajor + "." + versionMinor + "." + versionRevision; + } + } + // MSN/WebTV 2.6 supports Flash 4 + else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4; + // WebTV 2.5 supports Flash 3 + else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3; + // older WebTV supports Flash 2 + else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2; + else if ( isIE && isWin && !isOpera ) { + flashVer = ControlVersion(); + } + return flashVer; +} + +// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available +function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision) +{ + versionStr = GetSwfVer(); + if (versionStr == -1 ) { + return false; + } else if (versionStr != 0) { + if(isIE && isWin && !isOpera) { + // Given "WIN 2,0,0,11" + tempArray = versionStr.split(" "); // ["WIN", "2,0,0,11"] + tempString = tempArray[1]; // "2,0,0,11" + versionArray = tempString.split(","); // ['2', '0', '0', '11'] + } else { + versionArray = versionStr.split("."); + } + var versionMajor = versionArray[0]; + var versionMinor = versionArray[1]; + var versionRevision = versionArray[2]; + + // is the major.revision >= requested major.revision AND the minor version >= requested minor + if (versionMajor > parseFloat(reqMajorVer)) { + return true; + } else if (versionMajor == parseFloat(reqMajorVer)) { + if (versionMinor > parseFloat(reqMinorVer)) + return true; + else if (versionMinor == parseFloat(reqMinorVer)) { + if (versionRevision >= parseFloat(reqRevision)) + return true; + } + } + return false; + } +} + +function AC_AddExtension(src, ext) +{ + if (src.indexOf('?') != -1) + return src.replace(/\?/, ext+'?'); + else + return src + ext; +} + +function AC_Generateobj(objAttrs, params, embedAttrs) +{ + var str = ''; + if (isIE && isWin && !isOpera) + { + str += ' '; + } + str += ''; + } + else + { + str += ' NOTE: changes made here should be mirrored to their equivalent place in appConfig.js + +document.write("

Supported Platforms

\ + This application has been tested with the following configurations. \ + You may notice irregularities with software that has not been tested. \ + There are known issues when viewing heat map data using unsupported browsers. \ +

\ + \ + \ + \ + \ +
\ + Microsoft Windows 7 \ +
    \ +
  • Chrome 38.0.2125.101 m
  • \ +
  • Firefox 33.0
  • \ +
  • Internet Explorer 9.0
  • \ +
\ +
\ + Apple Macintosh OS X 10.9.2 \ +
    \ +
  • Chrome 38.0.2125.101 m
  • \ +
  • Firefox 33.0
  • \ +
  • Safari 7
  • \ +
\ +
\ +

\ + "); diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/javascript/portal.js b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/javascript/portal.js new file mode 100644 index 0000000..0b14200 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/aibs_sphinx/static/external_assets/javascript/portal.js @@ -0,0 +1,843 @@ +// NOTE you have to configure this! +var _pEXTERNAL_ASSETS = "/external_assets"; + +document.writeln(" +{% include "portalHeader.html" %} + +{{ super() }} +{% endblock %} + +{% block relbar1 %} +{% endblock %} + + +{% block relbar2 %} +{% endblock %} + +{% block footer %} +{{ super() }} + +{% endblock %} diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/templates/portalFooter.html b/bmtk-vb/docs/autodocs/source/aibs_sphinx/templates/portalFooter.html new file mode 100644 index 0000000..8d01ba6 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/aibs_sphinx/templates/portalFooter.html @@ -0,0 +1,457 @@ + + + + +
+ + + +
+ +
+
+ + + diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/templates/portalHeader.html b/bmtk-vb/docs/autodocs/source/aibs_sphinx/templates/portalHeader.html new file mode 100644 index 0000000..9f45219 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/aibs_sphinx/templates/portalHeader.html @@ -0,0 +1,591 @@ + +
+ + +
+ + + + +
+
+ + diff --git a/bmtk-vb/docs/autodocs/source/aibs_sphinx/theme.conf b/bmtk-vb/docs/autodocs/source/aibs_sphinx/theme.conf new file mode 100644 index 0000000..1e93ee1 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/aibs_sphinx/theme.conf @@ -0,0 +1,4 @@ +# see http://sphinx-doc.org/templating.html +[theme] +inherit = basic +stylesheet = aibs_sphinx.css \ No newline at end of file diff --git a/bmtk-vb/docs/autodocs/source/bionet.rst b/bmtk-vb/docs/autodocs/source/bionet.rst new file mode 100644 index 0000000..8b19dba --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/bionet.rst @@ -0,0 +1,63 @@ +BioNet +====== + +BioNet is a high-level interface to `NEURON `_ that facilitates simulations of large-scale +networks of multicompartmental neurons. It is built on top of Python, but allows users to run simulations quickly +often with little-to-no programming. + + + +Features +-------- +* Automatically integrates MPI for parallel simulations without the need of extra coding. +* Supports models and morphologies from the Allen `Cell-Types Database `_, as well +as custom hoc and NeuroML2 cell and synapse models. +* Use spike-trains, synaptic connections, current clamps or even extracellular stimulation to drive network firing. +* Can simulate extracelluarl field recordings. + + + +Installation +------------ +BioNet supports both Python 2.7 or Python 3.6+, and also requires NEURON 7.4+ to be installed. See our +`Installation instructions `_ for help on installing NEURON and the bmtk. + + + +Documentation and Tutorials +--------------------------- +Our `github page `__ contains a number of jupyter-notebook +tutorials for both building multi-compartmental neural networks and simulating them with BioNet, including ones specially +how to: +1. Simulate cell(s) with a `current clamp `_. +2. Use synaptic inputs to stimulate `single `_ and +`multi-cell `_ networks. +3. Build and simulate `multi-population heterogeneous networks `_. + + +Previous Materials +++++++++++++++++++ +The following are from previous tutorials, workshops, and presentations; and may not work with the latest version of the bmtk. +* CNS 2018 Workshop: `notebooks `__ +* Summer Workshop on the Dynamic Brain 2018: `notebooks `__. + + +Examples +-------- +The AllenInstitute/bmtk repo contains a number of BioNet examples, many with pre-built networks and can be immediately ran. These +tutorials will have the folder prefix *bio_* and to run them in the command-line simply call:: + + $ python run_bionet.py config.json + +or to run them on multiple-cores:: + + $ mpirun -n $NCORES nrniv -mpi -python run_bionet.py config.json + +Current examples +++++++++++++++++ +* `bio_14cells `_ - A small network of 14 recurrently connected multi-compartment and point-process cells receiving synaptic input from an external network of "virtual" cells (i.e. spike-trains). +* `bio_450cells `_ - A modest heterogeneous network of 450 cells (sampled from a much large network of a mouse cortex L4). +* `bio_450cells_exact `_ - Similar to bio_450cells but with synaptic locations precisely stated (In the other examples the simulator will randomly assign synaptic locations at run-time given a predefined range). +* `bio_stp_models `_ - An example using Allen Institute custom STP-based synapse models. +* `bio_basic_features `_ - Examples how how to stimulate networks using a variety of methods. + diff --git a/bmtk-vb/docs/autodocs/source/bionet_config.rst b/bmtk-vb/docs/autodocs/source/bionet_config.rst new file mode 100644 index 0000000..a7350a0 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/bionet_config.rst @@ -0,0 +1,170 @@ +:orphan: + +Configuration file +================== + +Configuration file defines the files describing the network, its input as well as run-time parameters. For convenience it is grouped into the following categories: + + +Manifest +++++++++ + + Includes custom path variables that may be used to build full paths to files. The special variable "${configdir}" in the "$BASE_DIR" stands for the directory where configuration file is located. Users may specify any valid directory for "$BASE_DIR" as well. + + + :: + + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/../../NWB_files", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR":"$BASE_DIR/../components" + }, + + +Run ++++ + + Includes run time parameters + + :: + + "run": { + "tstop":3000.0, # run time (ms) + "dt": 0.1, # time step (ms) + "dL": 20, # length of compartments (i.e., segments) (um) + "overwrite_output_dir": true, # if True: will overwrite the output directory; if False: will issue an error that directory exists + "spike_threshold": -15, # will record a spike when membrane voltage (mV) is exceeded + "nsteps_block":5000, # will write to disk data after this many steps + "save_cell_vars": ["v", "cai"], # save somatic variables in the list + "calc_ecp": true # calculate ExtraCellular Potential (ECP): True or False + }, + + +Conditions +++++++++++ + + Includes information about the initial conditions: + + :: + + + "conditions": { + "celsius": 34.0, # temperature (C) + "v_init": -80 # initial membrane voltage (mV) + }, + + +Node_id selections +++++++++++++++++++ + + Defines selections of cells. For example, this way can specify the cells (node_ids) for which variables will be saved + + :: + + "node_id_selections": { + "save_cell_vars": [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100] + }, + + +Input ++++++ + + Defines spike_trains for the the external inputs + + + :: + + "input": [ + { + "type": "external_spikes", + "format": "nwb", + "file": "$INPUT_DIR/lgn_spikes.nwb", + "source_nodes": "LGN", + "trial": "trial_0" + }, + ... + ] + +Output +++++++ + + Defines file names for the output + + + :: + + "output": { + "log_file": "$OUTPUT_DIR/log.txt", # log file + "spikes_ascii_file": "$OUTPUT_DIR/spikes.txt", # file for spikes in ascii format + "spikes_hdf5_file": "$OUTPUT_DIR/spikes.h5", # file for spikes in HDF5 format + "cell_vars_dir": "$OUTPUT_DIR/cellvars", # folder to save variables from individual cells + "ecp_file": "$OUTPUT_DIR/ecp.h5", # file to save extracellular potential + "output_dir": "$OUTPUT_DIR" # output directory + }, + + + + +Components +++++++++++ + + The "components" grouping includes paths to directories containing building blocks of a network model + + :: + + "components": { + "morphologies_dir": "$COMPONENT_DIR/biophysical/morphology", # morphologies + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", # synaptic models + "mechanisms_dir": "$COMPONENT_DIR/mechanisms", # NEURON mechanisms + "biophysical_neuron_models_dir":"$COMPONENT_DIR/biophysical/electrophysiology", # parameters of biophysical models + "point_neuron_models_dir": "$COMPONENT_DIR/intfire", # parameters of point neuron models + "templates_dir": "$COMPONENT_DIR/hoc_templates" # NEURON HOC templates + }, + + +Recording Extracelullar Electrode ++++++++++++++++++++++++++++++++++ + + Includes parameters defining extracellular electrodes + + + :: + + "recXelectrode": { + "positions": "$COMPONENT_DIR/recXelectrodes/linear_electrode.csv" + }, + + + + +Networks +++++++++ + + Includes files defining nodes and edges: + +:: + + "networks": { + "nodes": [ + { + "name": "V1", + "nodes_file": "$NETWORK_DIR/v1_nodes.h5", + "node_types_file": "$NETWORK_DIR/v1_node_types.csv" + }, + ... + ], + + "edges": [ + { + "target": "V1", + "source": "V1", + "edges_file": "$NETWORK_DIR/v1_v1_edges.h5", + "edge_types_file": "$NETWORK_DIR/v1_v1_edge_types.csv" + }, + ... + ] + } + + diff --git a/bmtk-vb/docs/autodocs/source/bionet_tutorial.rst b/bmtk-vb/docs/autodocs/source/bionet_tutorial.rst new file mode 100644 index 0000000..a5f8399 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/bionet_tutorial.rst @@ -0,0 +1,153 @@ +:orphan: + +Simulating example networks with BioNet +======================================= + +To get started with running simulations with BioNet, we recommend to run network examples provided in the directory docs/examples/simulators/bionet: + +* /14cells : network of 14 cell receiving an external input. +* /450cells : network of 450 cells receiving an external input + +Working through the sections below, you will learn about contents of folders in each example and how to use them to run a simulation. + +Configuring simulation +----------------------- + +All the files listed below and describing the network are listed in the configuration file `config.json` to instruct BioNet where to look for files describing network. Please note that all directory and file names can be adjusted by users as they wish, as long as those names are reflected in the config file. Additionally, the configuration file includes simulation parameters (e.g. duration of simulation and time step, etc). + +Please refer to the `configuration file documentation <./bionet_config.html>`_ for details. + + +Model description +----------------- + +The directory `network` contains files that describe parameters of the cells and their connections. + +Cells in modeled networks may be generally categorized as: 1) the simulated cells for which dynamics is explicitly simulated using NEURON and 2) external input cells for which spiking dynamics is not simulated explicitly, but instead loaded from files. The external input cells can influence the simulated cells, but not vice versa. Thus, such an abstraction is convenient for simulating feedforward inputs. + +The example networks include the simulated cells from primary mouse visual cortex (V1) receiving external inputs from the Lateral Geniculate Nucleu (LGN) and also background input in a form of a Travelling Wave (TW) as shown in the Figure 1 below: + +.. image:: _static/images/all_network_cropped.png + :scale: 15 % + +**Figure 1**. Cells in the example network. Simulated network (V1) includes 14 cells: 10 biophysically detailed (depicted as morphological reconstructions) and 4 Leaky Integrate-and-fire (LIF) (showed as circles). Simulated V1 cells have recurrent connections (hollow arrow) as well as receive feedforward external input (solid arrows) in the form of spikes from the LGN (red circles) and TW cells (dark orange circles). + +A network can be viewed as a graph. Description of a graph needs to specify the properties of the nodes (cells) and edges (connections). In BioNet (and more generally, in BMTK), each node (edge) belongs to a particular node (edge) type, thus possessing all the properties of that type, but also possessing properties specific to that individual node (edge) instance. Thus, properties of nodes are described using two files: node_file and node_type_file. Similarly edges are described using two files: edges_file, edge_types_file. For node_type_file and edge_type_file we use csv format, whereas for node_file and edge_file — HDF5 format. + + +**Nodes files:** + ++------------------------+-----------------+----------------------+ +|Cells | Nodes | Node types | ++========================+=================+======================+ +| V1 cells | v1_nodes.h5 | v1_node_types.csv | ++------------------------+-----------------+----------------------+ +| LGN cells | lgn_nodes.h5 | lgn_node_types.csv | ++------------------------+-----------------+----------------------+ +| TW cells | tw_nodes.h5 | tw_node_types.csv | ++------------------------+-----------------+----------------------+ + + +**Edges files:** + ++------------------------+-----------------+----------------------+ +|Connections | Edges | Edge types | ++========================+=================+======================+ +| V1 -> V1 connections | v1_v1_edges.h5 | v1_v1_edge_types.csv | ++------------------------+-----------------+----------------------+ +| LGN -> V1 connections | lgn_v1_edges.h5 | lgn_v1_edge_types.csv| ++------------------------+-----------------+----------------------+ +| TW->V1 connections | tw_v1_edges.h5 | tw_v1_edge_types.csv | ++------------------------+-----------------+----------------------+ + + +Please refer to the `network file format documentation <./network_file_formats.html>`_ for details. + +The spikes times of external cells are precomuted and provided in the directory docs/examples/simulator/NWB_files. + +Each network utilizes models of individual cells, synapses and recording electrodes defined in the docs/examples/simulators/bionet/components/mechanisms directory. + +The paths to each of these files and directories are specified in the configuration file (see above). + + + +Running simulation +------------------ + +Running simualtions requires the following Python scripts + +`run_bionet.py` : main python script which calls BioNet to run simulation + +`set_cell_params.py`: module setting properties of cells + +`set_syn_params.py`: module setting properties of synapses + +`set_weights.py` : modules allowign to set parameter dependent connection weights + +The example networks use biophysically-detailed models of individual cells, and require additional NEURON channel mechanisms describing dynamics of ionic channels. To compile these NEURON mechanims go to the subdirectory docs/examples/simulators/bionet/components/mechanisms and run the NEURON command: +:: + + nrnivmodl modfiles/ + +From the directory of the network example you can run a simulation on a single core by executing the main python script with configuration file as a command line argument, as follows: +:: + + python run_bionet.py config.json + +Or to run in parallel with MPI on $NCORES CPUs: +:: + + mpirun -np $NCORES nrniv -mpi -python run_bionet config.json + +In either case, the main script will load the configuration file containing paths to files describing the network and will load and simulate the network. + +When simulation is finished, you will see a message “Simulation completed”. + +BioNet allows saving simulation output in blocks while simulation is still running, giving users an ability to check and analyze intermediate output. During the run you will see some output reporting on the progress of a simulation as follows: + + +When simulation completed you will see a message "Simulation completed". + +Simulation output +----------------- + +The output directory includes: + +* spikes.h5 : HDF5 file containg the spikes of the simulated cells. +* cellvars/N.h5 : HDF5 file containing time series recordings of somatic variables (e.g., somatic voltage, [Ca++]) for cell with node_id=N (there might be multiple such files, up to the number of cells in the model, or none at all, depending on the settings in the simulation config). +* config.json : a copy of configuration for record keeping +* log.txt : run log file including time-stamped information about the progress of a simulation. + + +Upon completion you may run the script plot_rasters.py to plot spike rasters of external (Figure 2) as well as simulated (Figure 3) cells: +:: + + python plot_rasters.py + + +.. image:: _static/images/ext_inputs_raster.png + :scale: 70 % + +**Figure 2.** Spike rasters of the external input cells: LGN (green) and TW (firebrick). + +| + +.. image:: _static/images/v1_raster.png + :scale: 70 % + +**Figure 3.** Spike raster of the simulated (V1) cells. + + + +Simulating your network models +------------------------------ + +To run simulations of your network with BioNet, you will first need to provide a pre-built network in the format understood by BioNet. We recommend using `BMTK's network builder api `_, but you may also use your own scripts or a third party tool to build a network. As a start we suggest to modify the existing network examples as a quick way of customizing network models and then build your own model following `builder examples tutorial `_. + +When you have your custom model built, you will need to specify in your configuration file the paths to the network, components as well as simulation run parameters. + +Just as in the above examples, your run folder should include Python modules: set_cell_params.py, set_syn_params.py, set_weights.py specifying how models of cells, synapses and connection weights are created, as well as a main python script. + +When running different simulations you will rarely need to modify the main Python script running BioNet. Instead, you will commonly need to modify paths to network files or run parameters in the configuration file to instruct BioNet which model to run and how to run it. Please refer to the `configuration file documentation <./bionet_config.html>`_ for details. + + diff --git a/bmtk-vb/docs/autodocs/source/builder.rst b/bmtk-vb/docs/autodocs/source/builder.rst new file mode 100644 index 0000000..67275f2 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/builder.rst @@ -0,0 +1,49 @@ +The Network Builder +=================== + +To run a simulation or visualizing a neural network the Brain Modeling Toolkit (bmtk) requires network files. This +workflow of using intermediate files, rather than building and simulating an entire network in memory, is done to +improve performance and memory, helps with iterative modeling, and allows for sharing and reproducibility. Before +running a simulation you will first need to obtain existing network model files, or alternativly use the bmtk +**Builder** submodule to create them from scratch. + +The Builder uses the same python inteface for creating networks of various varieties including multi-compartment neurons, +point neuron, and population levels-of-resolution. It can support any model structure that is capable of being described +by a directed graph of nodes (neurons, populations, regions) and edges (synapses, junctions, fibre tracts). It is also +simulator agnostic, modelers can choose whatever attributes and properties they require to represent their model +(*However to simulate a given network certain attributes will be required, depending on the underlying simulator*). + +The bmtk builder will build and save network files using `SONATA `_; a highly +optimized data format for representing large-scale neural networks. + + + +Installing the Builder +----------------------- + +The Builder sub-module is automatically included in the bmtk package. For instructions please refer to the `installation page `__. + + + +Tutorials and Guides +-------------------- + +For a general overview of how to use the Builder please see the following tutorial: + https://github.com/AllenInstitute/bmtk/blob/develop/docs/tutorial/NetworkBuilder_Intro.ipynb + + +Similarly there are also a number of tutorials showing how to build (and simulate) networks of different levels: + https://github.com/AllenInstitute/bmtk/blob/develop/docs/tutorial/00_introduction.ipynb + + + +Examples +-------- + +A good way of getting started with building networks is to start with an existing example. The AllenInstitute/bmtk github +repo `includes a number of examples `__. Inside most +examples you should find a *build_network.py* which shows how to build the network for that given simulation (and the +output of the Builder will be saved in the *network/* directory). + + +Many of the `examples in the SONATA repo `__ were also built using bmtk and includes *build_network.py* scripts diff --git a/bmtk-vb/docs/autodocs/source/conf.py b/bmtk-vb/docs/autodocs/source/conf.py new file mode 100644 index 0000000..a6f1897 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/conf.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +# +# Brain Modeling Toolkit documentation build configuration file, created by +# sphinx-quickstart on Tue Sep 26 10:33:33 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../../..')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.githubpages', + 'sphinx.ext.viewcode', + 'numpydoc', + 'sphinx.ext.autosummary' +] + +# Add any paths that contain templates here, relative to this directory. +#templates_path = ['_templates', 'aibs_sphinx/templates'] +templates_path = ['aibs_sphinx/templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Brain Modeling Toolkit' +copyright = u'2017, Allen Institute for Brain Science' +author = u'AIBS' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'0.0.5' +# The full version, including alpha/beta/rc tags. +release = u'0.0.5' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +numpydoc_show_class_members = False + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +# html_theme = 'alabaster' + +html_theme_path = ['.'] +html_theme = 'aibs_sphinx' +# html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static', 'aibs_sphinx/static'] +html_extra_path = ['../.nojekyll'] +html_theme_options = { + "sidebarwidth": "300" +} + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ +# 'about.html', +# 'navigation.html', + 'globaltoc.html', +# 'localtoc.html', +# 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', +# 'donate.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'BrainModelingToolkitdoc' + +# html_show_sphinx = False +html_show_copyright = True + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'BrainModelingToolkit.tex', u'Brain Modeling Toolkit Documentation', + u'Kael Dai', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'brainmodelingtoolkit', u'Brain Modeling Toolkit Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'BrainModelingToolkit', u'Brain Modeling Toolkit Documentation', + author, 'BrainModelingToolkit', 'One line description of project.', + 'Miscellaneous'), +] + + + diff --git a/bmtk-vb/docs/autodocs/source/filternet.rst b/bmtk-vb/docs/autodocs/source/filternet.rst new file mode 100644 index 0000000..9da588c --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/filternet.rst @@ -0,0 +1,38 @@ +FilterNet +========= +FilterNet will simulate the effects of visual stimuli onto a receptive field. It uses LGNModel simulator as a backend, which +uses neural-filters to simulate firing rates and spike-trains over a given time-course and stimuli. + + +Features +-------- +* Supports a number of stimuli inputs including: + * Static and moving grating + * Full field flashes + * Static images + * Short movies. + + +Installation +------------ +Filter supports both Python 2.7 or Python 3.6+, see our `Installation instructions `_. + + + +Documentation and Tutorials +--------------------------- +For more information about FilterNet and LGNModel in particular, please contact the main developers Ram Iyer (rami at alleninstitute dot org) +and Yazan Billeh (yazanb at alleninstitute dot org). + + +Examples +-------- +The AllenInstitute/bmtk repo contains a number of FilterNet examples, many with pre-built networks and can be immediately ran. These +tutorials will have the folder prefix *filter_* and to run them in the command-line simply call:: + + $ python run_filternet.py config.json + + +Current examples +++++++++++++++++ +* `filter_graitings `_ - An example of a 2 second static grating stimuli on the LGN receptive field. diff --git a/bmtk-vb/docs/autodocs/source/index.rst b/bmtk-vb/docs/autodocs/source/index.rst new file mode 100644 index 0000000..3af8ceb --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/index.rst @@ -0,0 +1,121 @@ +.. Brain Modeling Toolkit documentation master file, created by + sphinx-quickstart on Tue Sep 26 10:33:33 2017. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + + +Welcome to the Brain Modeling Toolkit +===================================== + +.. toctree:: + :maxdepth: 2 + :titlesonly: + :hidden: + + Installation Guide + Building Networks + simulators + Tutorials + Github Profile + Source Documentation + + +The Brain Modeling Toolkit (bmtk) is a python-base software package for creating and simulating large-scale brain +models. It supports building, simulation and analysis of models of different levels of resolution including: + +* Biophysically detailed networks. +* Point neuron networks. +* Filter models. +* Population-level networks. +* Machine-learning networks. + + +.. figure:: _static/images/levels_of_resolution.png + :scale: 50% + +The bmtk was developed and is supported at the `Allen Institute for Brain Science `_ and +released under a BSD 3-clause license. We encourage others to use the bmtk for their own research, and suggestions and +contributions to the bmtk are welcome. + + +The latest release, previous releases, and current development can be found at:: + + https://github.com/AllenInstitute/bmtk + + +Requirements +============ +The bmtk runs on Python 2.7 and 3.6+. To use the base features, including building and analyzing networks, require the +following numpy packages. When installing using anaconda, pypi or distutils these dependencies will be installed if +not already: + +* `numpy `_ +* `h5py `_ +* `pandas `_ +* `matplotlib `_ +* `jsonschema `_ + +Optional dependencies: +* `mpi4py `_ +* `pytest `_ + +For running network simulations bmtk uses existing software, which will differ depending on the type of simulation. As such +there may be additional requirements. + + |neuron_icon| Biophysically detailed simulation with BioNet uses the `NEURON simulator (7.4+) `_ + + |nest_icon| Point simulations with PointNet uses the `NEST simulator (2.11+) `_ + + |dipde_icon| Population level firing rates simulation with PopNet uses `DiPDE `_ + + |tensorflow_icon| Machine-learning models with MintNet uses `TensorFlow `_ + +.. |neuron_icon| image:: _static/images/neuron_icon.png + :scale: 23% + +.. |nest_icon| image:: _static/images/nest_icon.png + :scale: 20% + +.. |dipde_icon| image:: _static/images/dipde_icon.png + :scale: 15% + +.. |tensorflow_icon| image:: _static/images/tensorflow_icon.png + :scale: 15% + +See Installation page and individual simulator pages for further instructions. + + + +Additonal Resources +=================== + +**Tutorials** - Jupyter-notebook tutorials for using the bmtk can be found at https://github.com/AllenInstitute/bmtk/blob/develop/docs/tutorial/00_introduction.ipynb. + +**Examples** - A collection of examples for building and running simulations across different levels of resolution can be found at https://github.com/AllenInstitute/bmtk/tree/develop/docs/examples. + +**Questions** - Any bugs, questions, or feature requests can be done from our github issue page at https://github.com/AllenInstitute/bmtk/issues. +Or please feel free to contact Anton Arkhipov (antona at alleninstitute dot org) and Kael Dai (kaeld at alleninstitute dot org) regarding any questions + + +Papers and Posters +================== +* Paper about bmtk's BioNet simulator can be found on `PLOS ONE `_ + + +SONATA Data Format +================== +The SONATA data format was developed jointly by the Allen Institute and the Blue Brain Project as a standarized, +cross-platform format for storing large scale networks and simulation results. The bmtk utilizes when building and +simulating networks. Not only does this improve performance and file size, but it lets the bmtk interact with the growing +list of software that supports the SONATA format. + +More information about the SONATA (and hence bmtk) data format can be found at the `SONATA github page `_ + + + +Contributors +============ +Sergey Gratiy, Yazan Billeh, Kael Dai, Nicholas Cain, Ram Iyer, Fahimeh Baftizadeh, Jung Hoon Lee, Nathan Gouwens, Yina Wei, +Catalin Mitelut, Richard Xu, David Feng, Michael Buice, Stefan Mihalas, and Anton Arkhipov + +We wish to thank the Allen Institute for Brain Science Founders, Paul G. Allen and Jody Allen, for their vision, encouragement, and support. diff --git a/bmtk-vb/docs/autodocs/source/installation.rst b/bmtk-vb/docs/autodocs/source/installation.rst new file mode 100644 index 0000000..10b26f2 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/installation.rst @@ -0,0 +1,143 @@ +Installing the BMTK +=================== + +The bmtk was developed for use for Python 2.7+ and Python 3.6+. Previous releases can be downloaded from +`here `__. The latest code including newest features and bug fixes +can be found on the `develop branch of our github repo `_. + +The base installation, which will let you build networks, parse and analyze simulation reports, require the following +dependencies: + +* `numpy `_ +* `h5py `_ +* `pandas `_ +* `matplotlib `_ +* `jsonschema `_ +* `pytest `_ [optional for running unit tests] + +All components of the bmtk will work on a single machine, but some parts can take advantage of parallelism againsts +HPC clusters, and requires the following to be installed: + +* `mpi4py `_ + + +For running network simulations bmtk uses existing software which varies depending on the type of simulation you want +to run. Individual instructions are done for the various requirements of the different simulation engines. + + +Installing latest from source +----------------------------- +:: + + $ git clone https://github.com/AllenInstitute/bmtk.git + $ cd bmtk + $ python setup.py install + + +Installing with pip +------------------- +:: + + $ pip install bmtk + + +Installing with conda +--------------------- +:: + + $ conda install -c kaeldai bmtk + + +Using the Docker Image +---------------------- +The bmtk docker container lets you build and simulate networks without requiring installing all the bmtk prerequisits on +your computer. All you need is the `docker client `__ installed on your machine. + +:: + + $ docker pull alleninstitute/bmtk + +There are two main ways of using the bmtk-docker image, either like a command-line application or as a Jupyter Notebook +server + +Through the command line +++++++++++++++++++++++++ + +Go to the directory where your bmtk network-builder and/or network-simualtion scripts and supporting files are located +(*local/path*) and run the following in a command-line terminal + +:: + + $ docker run alleninstitute/bmtk -v local/path:/home/shared/workspace python .py + +Due to the way docker works, all files to build/run the network must be within *local/path*, including network files, +simulator components, output directories, etc. If your config.json files references anything outside the working +directory branch things will not work as expected. + +**NEURON mechanisms:** +If you are running BioNet and have special mechanims/mod files that need to be compiled, you can do so by running + +:: + + $ cd /path/to/mechanims + $ docker run -v $(pwd):/home/shared/workspace/mechanisms alleninstitute/bmtk nrnivmodl modfiles/ + + +Through Jupyter Notebooks ++++++++++++++++++++++++++ +The bmtk-docker image can be run as a jupyter notebook server. Not only will it contain the examples and notebook tutorials +for you to run, but you can use it to create new bmtk notebooks. In a command line run + +:: + + $ docker run -v $(pwd):/home/shared/workspace -p 8888:8888 alleninstitute/bmtk jupyter + + +Then open a browser to 127.0.0.1:8888/. Any new files/notebooks should be saved to *workspace* directory, otherwise they +will be lost once the container is closed. + + + +Running Simulations +------------------- + +Biophysically detailed simulations +++++++++++++++++++++++++++++++++++ + +Running simulations of biophysically detailed, multi-compartmental neuronal models is done with `BioNet `_ which +uses the NEURON simulator, version 7.4 and above. Precompiled version of NEURON can be downloaded and installed from +`here `__. Make sure to install the Python bindings. + +The precompiled installed version of NEURON may have issues if you are using a Anaconda or Python virtual environment. +Similarly it will not compile with MPI support so you can't parallelize the simulation. You can find instructions +for compiling NEURON for `Linux `_, +`Mac `_, and +`Windows `_. + +* **NOTE** - BioNet does not use the NEURON GUI (iv package) and we recommend you compile with the --without-iv option + + +Point-Neuron simulations +++++++++++++++++++++++++ + +The PointNet simulation engine is responsible for running point-neuron networks using the `NEST simulator `_, +version 2.11 and above. Instructions for installing NEST can be found `here `__. + + +Filter Models ++++++++++++++ + +FilterNet is the simulation engine responsible for simulating firing rate responses to stimuli onto the visual fields. It +uses a piece of simulation software called LGNModel developed at the Allen Institute for Brain Science. Luckily, LGNModel +is already built into the bmtk and no extra installation instructions are required. + + +Population Level Models ++++++++++++++++++++++++ + +PopNet will simulate population level firing rate dynamics using `DiPDE `_. Instructions +for installing DiPDE can be found `here `_. +However we recommend installing DiPDE using anaconda:: + + $ conda install -c nicholasc dipde + diff --git a/bmtk-vb/docs/autodocs/source/mintnet.rst b/bmtk-vb/docs/autodocs/source/mintnet.rst new file mode 100644 index 0000000..7698e13 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/mintnet.rst @@ -0,0 +1,7 @@ +MintNet +======= + +MintNet is our machine-intellegence level network modeling simulator. + +**NOTICE** - The current version of MintNet has been depreciated and is no longer supported. It is being replaced with a new +simulation tool planned for late 2019. \ No newline at end of file diff --git a/bmtk-vb/docs/autodocs/source/network_file_formats.rst b/bmtk-vb/docs/autodocs/source/network_file_formats.rst new file mode 100644 index 0000000..642c616 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/network_file_formats.rst @@ -0,0 +1,108 @@ +:orphan: + +Network file formats +==================== + +A network can be viewed as a graph (Figure 1) that is fully described by specifying the properties of the nodes and edges. + +.. image:: _static/images/graph_structure.png + :scale: 15 % + +**Figure 1.** Graph is described by the properties of the nodes and edges. + +In order to make the description more concrete we will be using the 14 cell example network found in +docs/examples/simulators/bionet. + +Nodes +----- +When describing properties of nodes, it is convenient to introduce the notion of the node type, which may include multiple properties depending on a particular application. Each node then belongs to a particular node type, thus possessing all of the properties of that node type, but in addition possessing properties specific to that individual node. The node type may correspond to the biological cell-type or be based on a different set of properties convenient for parsimonious description of simulated nodes. The information unique to individual nodes is saved in the HDF5 file format and about node types in the CSV file. + +The HDF5 file may include nodes utilizing multiple types of cell models that are described by different number of parameters. The HDF5 file utilizes groups to group properties of nodes described by the same set of attributes. For example in Figure 2, group "0" includes properties of the biophysically detailed neurons and group "1" of LIF neurons: + +.. image:: _static/images/nodes_h5_structure.png + :scale: 100 % + +**Figure 2.** The structure of the HDF5 file containing properties of the nodes. + +Each node has a few mandatory properties (datasets): + + node_gid : a unique node identifier, + + node_group : defines the group to which node belongs + + node_group_index : index in the datasets inside the node_group ("0" or "1" in Figure 2) containing node properties. + + node_type_id : a unique identified of the node type that is used to access additional node properties from the node_types file. + +The node types file uses the CSV format. Each node_type uses the same number of attributed as shown in Figure 3 below. + +.. image:: _static/images/node_types.png + :scale: 15 % + +**Figure 3.** An example of the node types CSV file. + +The mandatory columns include: + + node_type_id : a key identifying a node type + + dynamics_params : a file describing dynamical properties of a cell model + + morphology_file : a file describing cell morphology, + + model_type : identifies a specific dynamical model of a cell. + +Then there could be also optional columns such as "rotational_angle_zaxis", "location",etc. + +The optional properties could be included either in the HDF5 file or in the CSV file depending on whether they are specific to each node or node type. + +Edges +----- + +Similarly to nodes, in order to allow for describing edges at various levels of detail, we introduce the concept of an edge type. Each connection thus belongs to a particular edge type and possesses all properties of that type, as well as individual properties. The edge type may correspond to the synaptic connections between biological cell-types or can even be defined to conveniently represent common properties of connections for a particular network model. These common connection properties are designated as attributes of an edge type and stored in the edge type file in the CSV format, whereas properties specific to the individual edges are stored in the HDF5 file. + +The HDF5 edges file may include edges utilizing multiple types of synaptic model types that are described by different number of parameters. The HDF5 file utilizes groups to group properties of edges described by the same set of attributes. For example in Figure 4, group "0" includes properties of synapses onto biophysically detailed neurons and group "1" onto LIF neurons. + +.. image:: _static/images/edges_h5_structure.png + :scale: 100 % + +**Figure 4.** The structure of the HDF5 file containing properties of the edges. + +Each edge has a few mandatory properties (datasets): + + node_group : defines the group to which node belongs + + node_group_index : index in the datasets inside the node_group ("0" or "1" in Figure 2) containing node properties. + + edge_type_id : a unique identified of the edge type that is used to access additional node properties from the edge types CSV file. + + source_gid/target_gid : node_gids of a source and target cells connected with the edge + + +To provide a fast loading of edges connecting to a particular node, it is convenient to store nodes sorted by the target_gid. Then one can use an additional index_pointer array that provides the start and the end indexes in the datasets as follows: + + start_index = index_pointer[target_gid] + + end_index = index_pointer[target_gid+1] + + +The edge types file uses the CSV format. Each edge_type has the same number of attributed as shown in Figure 6 below. + +.. image:: _static/images/edge_types.png + :scale: 15 % + + +**Figure 6.** An example of the edge types CSV file. + +The mandatory columns include: + + the edge_type_id : a primary key identifying an edge + + dynamics_params : a file describing dynamical properties of a synaptic model + + model_type : identifies a specific dynamical model of a synapse. + + +The target_query and source_query fiels are optional reserved attributes and provide an information describing the selection of target and source cells describied by this edge type. + +The optional properties could be included either in the HDF5 file or in the CSV file depending on whether they are specific to each edge or edge type. For instance, for networks edged in Figure 6 the "delay" column describing the conduction delay property is specified in the edge type meaning that all edges of a particular edge type will have an identical "delay" value. However, for other networks the "delay" property may be specific for each edge, in which case the "delay" will be stored in the HDF5 file. + diff --git a/bmtk-vb/docs/autodocs/source/pointnet.rst b/bmtk-vb/docs/autodocs/source/pointnet.rst new file mode 100644 index 0000000..61722ac --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/pointnet.rst @@ -0,0 +1,51 @@ +PointNet +======== + +Pointnet is a simulation engine that utilizes `NEST `_ to run large-scale point +neuron network models. + +Features +-------- +* Run the same simulation on a single core or in parallel on an HPC cluster with no extra programming required. +* Supports any spiking neuron models (rates models in development) available in NEST or with user contributed modules. +* Records neuron spiking, multi-meter recorded variables into the optimized SONATA data format. + + +Installation +------------ +PointNet supports both Python 2.7 or Python 3.6+, and also requires NEST 2.11+ to be installed. See our +`Installation instructions `_ for help on installing NEST and the bmtk. + + + +Documentation and Tutorials +--------------------------- +Our `github page `__ contains a number of jupyter-notebook +tutorials for using the bmtk in general and PointNet specific examples for: +* `Building and simulating a multi-population, heterogeneous point networks `_. + + + +Previous Materials +++++++++++++++++++ +The following are from previous tutorials, workshops, and presentations; and may not work with the latest version of the bmtk. +* CNS 2018 Workshop: `notebooks `__ +* Summer Workshop on the Dynamic Brain 2018: `notebooks `__. + + +Examples +-------- +The AllenInstitute/bmtk repo contains a number of PointNet examples, many with pre-built networks and can be immediately ran. These +tutorials will have the folder prefix *point_* and to run them in the command-line simply call:: + + $ python run_pointnet.py config.json + +or to run them on multiple-cores:: + + $ mpirun -n $NCORES python run_pointnet.py config.json + +Current examples +++++++++++++++++ +* `point_120cells `_ - A small network of 120 recurrently connected point neurons receiving synaptic input from an external network of "virtual" cells (i.e. spike-generators). +* `point_450cells `_ - A modest heterogeneous network of 450 cells (sampled from a much large network of a mouse cortex L4). + diff --git a/bmtk-vb/docs/autodocs/source/popnet.rst b/bmtk-vb/docs/autodocs/source/popnet.rst new file mode 100644 index 0000000..4777a35 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/popnet.rst @@ -0,0 +1,49 @@ +PopNet +====== + +The PopNet simulation engine uses the `DiPDE simulator `_ to simulate firing +rate dynamics of connected population of cells. You can use networks of populations "nodes", or take an existing +network of individual cell models and PopNet will cluster them into populations. + + +Installation +------------ +PopNet supports both Python 2.7 or Python 3.6+, and also requires DiPDE to be installed. See our +`Installation instructions `_ for help on installing DiPDE and the bmtk. + + + +Documentation and Tutorials +--------------------------- +Our `github page `__ contains a number of jupyter-notebook +tutorials for using the bmtk in general and PopNet specific examples for: +* `Building a simple two population model `_. + +About DiPDE +++++++++++++ +DiPDE was developed at the Allen Institute for Brain Science for population level modeling of the mammallian cortex. For +a list of the available features please see the `DiPDE documentation `_. + +For further questions about DiPDE please contact Nicholas Cain (nicholasc at alleninstitute dot org) + + +Previous Materials +++++++++++++++++++ +The following are from previous tutorials, workshops, and presentations; and may not work with the latest version of the bmtk. +* CNS 2018 Workshop: `notebooks `__ +* Summer Workshop on the Dynamic Brain 2018: `notebooks `__. + + +Examples +-------- +The AllenInstitute/bmtk repo contains a number of PopNet examples, many with pre-built networks and can be immediately ran. These +tutorials will have the folder prefix *pop_* and to run them in the command-line simply call:: + + $ python run_popnet.py config.json + + +Current examples +++++++++++++++++ +* `pop_2pop `_ - A simple recurrently connected network with one excitatory and one inhibitory population. +* `pop_7pops_converted `_ - A conversion our a mouse cortex L4 spiking network into a population rates network. + diff --git a/bmtk-vb/docs/autodocs/source/simulators.rst b/bmtk-vb/docs/autodocs/source/simulators.rst new file mode 100644 index 0000000..4625d51 --- /dev/null +++ b/bmtk-vb/docs/autodocs/source/simulators.rst @@ -0,0 +1,15 @@ +Simulation Engines +------------------ + +.. toctree:: + :maxdepth: 2 + :titlesonly: + + bionet + pointnet + popnet + filternet + mintnet + + + diff --git a/bmtk-vb/docs/environments/bionet/default_config.json b/bmtk-vb/docs/environments/bionet/default_config.json new file mode 100644 index 0000000..572f497 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/default_config.json @@ -0,0 +1,47 @@ +{ + "manifest": { + "$OUTPUT_DIR": "output" + }, + + "target_simulator":"BioNet", + + "run": { + "tstop": 0.0, + "dt": 0.1, + "dL": 20, + "overwrite_output_dir": true, + "spike_threshold": -15, + "nsteps_block": 5000 + }, + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "inputs": {}, + + "reports": {}, + + "output": { + "log_file": "${OUTPUT_DIR}/log.txt", + "output_dir": "${OUTPUT_DIR}", + "spikes_file": "${OUTPUT_DIR}/spikes.h5", + "spikes_file_csv": "${OUTPUT_DIR}/spikes.csv" + }, + + "components": { + "morphologies_dir": "${COMPONENTS_DIR}/biophysical/morphology", + "synaptic_models_dir": "${COMPONENTS_DIR}/synaptic_models", + "mechanisms_dir":"${COMPONENTS_DIR}/mechanisms", + "biophysical_neuron_models_dir": "${COMPONENTS_DIR}/biophysical/electrophysiology", + "point_neuron_models_dir": "${COMPONENTS_DIR}/intfire", + "templates_dir": "${COMPONENTS_DIR}/hoc_templates" + }, + + "networks": { + "nodes": [], + + "edges": [] + } +} diff --git a/bmtk-vb/docs/environments/bionet/hoc_templates/BioAllen_old.hoc b/bmtk-vb/docs/environments/bionet/hoc_templates/BioAllen_old.hoc new file mode 100644 index 0000000..fde930d --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/hoc_templates/BioAllen_old.hoc @@ -0,0 +1,21 @@ +begintemplate BioAllenOld + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal +objref all, somatic, basal, apical, axonal + +objref this + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() +} + +create soma[1], dend[1], apic[1], axon[1] + +endtemplate BioAllenOld diff --git a/bmtk-vb/docs/environments/bionet/hoc_templates/BioAxonStub.hoc b/bmtk-vb/docs/environments/bionet/hoc_templates/BioAxonStub.hoc new file mode 100644 index 0000000..df8660d --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/hoc_templates/BioAxonStub.hoc @@ -0,0 +1,61 @@ +begintemplate BioAxonStub + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + + simplify_axon() +} + +proc simplify_axon() { + + forsec axonal { delete_section() } + create axon[2] + + axon[0] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + axon[1] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + connect axon(0), soma(0.5) + connect axon[1](0), axon[0](1) + define_shape() + + +} + +endtemplate BioAxonStub \ No newline at end of file diff --git a/bmtk-vb/docs/environments/bionet/hoc_templates/Biophys1.hoc b/bmtk-vb/docs/environments/bionet/hoc_templates/Biophys1.hoc new file mode 100644 index 0000000..bac9b0f --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/hoc_templates/Biophys1.hoc @@ -0,0 +1,34 @@ +begintemplate Biophys1 + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + +} + +endtemplate Biophys1 diff --git a/bmtk-vb/docs/environments/bionet/intfire/IntFire1_exc_1.json b/bmtk-vb/docs/environments/bionet/intfire/IntFire1_exc_1.json new file mode 100644 index 0000000..6a58d3b --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/intfire/IntFire1_exc_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.024, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/environments/bionet/intfire/IntFire1_inh_1.json b/bmtk-vb/docs/environments/bionet/intfire/IntFire1_inh_1.json new file mode 100644 index 0000000..0da2f1f --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/intfire/IntFire1_inh_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.007, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/CaDynamics.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/CaDynamics.mod new file mode 100644 index 0000000..12af065 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/CaDynamics.mod @@ -0,0 +1,40 @@ +: Dynamics that track inside calcium concentration +: modified from Destexhe et al. 1994 + +NEURON { + SUFFIX CaDynamics + USEION ca READ ica WRITE cai + RANGE decay, gamma, minCai, depth +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + FARADAY = (faraday) (coulombs) + (molar) = (1/liter) + (mM) = (millimolar) + (um) = (micron) +} + +PARAMETER { + gamma = 0.05 : percent of free calcium (not buffered) + decay = 80 (ms) : rate of removal of calcium + depth = 0.1 (um) : depth of shell + minCai = 1e-4 (mM) +} + +ASSIGNED {ica (mA/cm2)} + +INITIAL { + cai = minCai +} + +STATE { + cai (mM) +} + +BREAKPOINT { SOLVE states METHOD cnexp } + +DERIVATIVE states { + cai' = -(10000)*(ica*gamma/(2*FARADAY*depth)) - (cai - minCai)/decay +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Ca_HVA.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Ca_HVA.mod new file mode 100644 index 0000000..84db2d3 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Ca_HVA.mod @@ -0,0 +1,82 @@ +: Reference: Reuveni, Friedman, Amitai, and Gutnick, J.Neurosci. 1993 + +NEURON { + SUFFIX Ca_HVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + UNITSOFF + : if((v == -27) ){ + : v = v+0.0001 + : } + :mAlpha = (0.055*(-27-v))/(exp((-27-v)/3.8) - 1) + mAlpha = 0.055 * vtrap(-27 - v, 3.8) + mBeta = (0.94*exp((-75-v)/17)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + hAlpha = (0.000457*exp((-13-v)/50)) + hBeta = (0.0065/(exp((-v-15)/28)+1)) + hInf = hAlpha/(hAlpha + hBeta) + hTau = 1/(hAlpha + hBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Ca_LVA.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Ca_LVA.mod new file mode 100644 index 0000000..ab151d0 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Ca_LVA.mod @@ -0,0 +1,69 @@ +: Comment: LVA ca channel. Note: mtau is an approximation from the plots +: Reference: Avery and Johnston 1996, tau from Randall 1997 +: Comment: shifted by -10 mv to correct for junction potential +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Ca_LVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + v = v + 10 + mInf = 1.0000/(1+ exp((v - -30.000)/-6)) + mTau = (5.0000 + 20.0000/(1+exp((v - -25.000)/5)))/qt + hInf = 1.0000/(1+ exp((v - -80.000)/6.4)) + hTau = (20.0000 + 50.0000/(1+exp((v - -40.000)/7)))/qt + v = v - 10 + UNITSON +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Ih.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Ih.mod new file mode 100644 index 0000000..73b97d8 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Ih.mod @@ -0,0 +1,71 @@ +: Reference: Kole,Hallermann,and Stuart, J. Neurosci. 2006 + +NEURON { + SUFFIX Ih + NONSPECIFIC_CURRENT ihcn + RANGE gbar, g, ihcn +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + ehcn = -45.0 (mV) +} + +ASSIGNED { + v (mV) + ihcn (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ihcn = g*(v-ehcn) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + : if(v == -154.9){ + : v = v + 0.0001 + : } + :mAlpha = 0.001*6.43*(v+154.9)/(exp((v+154.9)/11.9)-1) + mAlpha = 0.001 * 6.43 * vtrap(v + 154.9, 11.9) + mBeta = 0.001*193*exp(v/33.1) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Im.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Im.mod new file mode 100644 index 0000000..d6112d5 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Im.mod @@ -0,0 +1,62 @@ +: Reference: Adams et al. 1982 - M-currents and other potassium currents in bullfrog sympathetic neurones +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Im + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mAlpha = 3.3e-3*exp(2.5*0.04*(v - -35)) + mBeta = 3.3e-3*exp(-2.5*0.04*(v - -35)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + UNITSON +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Im_v2.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Im_v2.mod new file mode 100644 index 0000000..fc219f7 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Im_v2.mod @@ -0,0 +1,59 @@ +: Based on Im model of Vervaeke et al. (2006) + +NEURON { + SUFFIX Im_v2 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-30)/10) + mAlpha = 0.007 * exp( (6 * 0.4 * (v - (-48))) / 26.12 ) + mBeta = 0.007 * exp( (-6 * (1 - 0.4) * (v - (-48))) / 26.12 ) + + mInf = mAlpha / (mAlpha + mBeta) + mTau = (15 + 1 / (mAlpha + mBeta)) / qt +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/K_P.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/K_P.mod new file mode 100644 index 0000000..0a1238f --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/K_P.mod @@ -0,0 +1,71 @@ +: Comment: The persistent component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + + +NEURON { + SUFFIX K_P + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + tauF = 1 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mInf = 1 / (1 + exp(-(v - (-14.3 + vshift)) / 14.6)) + if (v < -50 + vshift){ + mTau = tauF * (1.25+175.03*exp(-(v - vshift) * -0.026))/qt + } else { + mTau = tauF * (1.25+13*exp(-(v - vshift) * 0.026))/qt + } + hInf = 1/(1 + exp(-(v - (-54 + vshift))/-11)) + hTau = (360+(1010+24*(v - (-55 + vshift)))*exp(-((v - (-75 + vshift))/48)^2))/qt + UNITSON +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/K_T.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/K_T.mod new file mode 100644 index 0000000..c31beaf --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/K_T.mod @@ -0,0 +1,68 @@ +: Comment: The transient component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + +NEURON { + SUFFIX K_T + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + mTauF = 1.0 + hTauF = 1.0 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1/(1 + exp(-(v - (-47 + vshift)) / 29)) + mTau = (0.34 + mTauF * 0.92*exp(-((v+71-vshift)/59)^2))/qt + hInf = 1/(1 + exp(-(v+66-vshift)/-10)) + hTau = (8 + hTauF * 49*exp(-((v+73-vshift)/23)^2))/qt + UNITSON +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Kd.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Kd.mod new file mode 100644 index 0000000..82cbe59 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Kd.mod @@ -0,0 +1,62 @@ +: Based on Kd model of Foust et al. (2011) + + +NEURON { + SUFFIX Kd + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * h + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h' = (hInf - h) / hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-23)/10) + mInf = 1 - 1 / (1 + exp((v - (-43)) / 8)) + mTau = 1 + hInf = 1 / (1 + exp((v - (-67)) / 7.3)) + hTau = 1500 +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Kv2like.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Kv2like.mod new file mode 100644 index 0000000..1cbdf84 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Kv2like.mod @@ -0,0 +1,86 @@ +: Kv2-like channel +: Adapted from model implemented in Keren et al. 2005 +: Adjusted parameters to be similar to guangxitoxin-sensitive current in mouse CA1 pyramids from Liu and Bean 2014 + + +NEURON { + SUFFIX Kv2like + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mAlpha + mBeta + mTau + hInf + h1Tau + h2Tau +} + +STATE { + m + h1 + h2 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * m * (0.5 * h1 + 0.5 * h2) + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h1' = (hInf - h1) / h1Tau + h2' = (hInf - h2) / h2Tau +} + +INITIAL{ + rates() + m = mInf + h1 = hInf + h2 = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mAlpha = 0.12 * vtrap( -(v - 43), 11.0) + mBeta = 0.02 * exp(-(v + 1.27) / 120) + mInf = mAlpha / (mAlpha + mBeta) + mTau = 2.5 * (1 / (qt * (mAlpha + mBeta))) + + hInf = 1/(1 + exp((v + 58) / 11)) + h1Tau = (360 + (1010 + 23.7 * (v + 54)) * exp(-((v + 75) / 48)^2)) / qt + h2Tau = (2350 + 1380 * exp(-0.011 * v) - 210 * exp(-0.03 * v)) / qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Kv3_1.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Kv3_1.mod new file mode 100644 index 0000000..e244657 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Kv3_1.mod @@ -0,0 +1,54 @@ +: Comment: Kv3-like potassium current + +NEURON { + SUFFIX Kv3_1 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + mInf + mTau +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + mInf = 1/(1+exp(((v -(18.700 + vshift))/(-9.700)))) + mTau = 0.2*20.000/(1+exp(((v -(-46.560 + vshift))/(-44.140)))) + UNITSON +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/NaTa.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/NaTa.mod new file mode 100644 index 0000000..fcf7bd3 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/NaTa.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTa + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -48 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -69 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/NaTs.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/NaTs.mod new file mode 100644 index 0000000..f753e71 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/NaTs.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTs + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -40 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -66 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/NaV.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/NaV.mod new file mode 100644 index 0000000..a702395 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/NaV.mod @@ -0,0 +1,186 @@ +TITLE Mouse sodium current +: Kinetics of Carter et al. (2012) +: Based on 37 degC recordings from mouse hippocampal CA1 pyramids + +NEURON { + SUFFIX NaV + USEION na READ ena WRITE ina + RANGE g, gbar +} + +UNITS { + (mV) = (millivolt) + (S) = (siemens) +} + +PARAMETER { + gbar = .015 (S/cm2) + + : kinetic parameters + Con = 0.01 (/ms) : closed -> inactivated transitions + Coff = 40 (/ms) : inactivated -> closed transitions + Oon = 8 (/ms) : open -> Ineg transition + Ooff = 0.05 (/ms) : Ineg -> open transition + alpha = 400 (/ms) + beta = 12 (/ms) + gamma = 250 (/ms) : opening + delta = 60 (/ms) : closing + + alfac = 2.51 + btfac = 5.32 + + : Vdep + x1 = 24 (mV) : Vdep of activation (alpha) + x2 = -24 (mV) : Vdep of deactivation (beta) +} + +ASSIGNED { + + : rates + f01 (/ms) + f02 (/ms) + f03 (/ms) + f04 (/ms) + f0O (/ms) + f11 (/ms) + f12 (/ms) + f13 (/ms) + f14 (/ms) + f1n (/ms) + fi1 (/ms) + fi2 (/ms) + fi3 (/ms) + fi4 (/ms) + fi5 (/ms) + fin (/ms) + + b01 (/ms) + b02 (/ms) + b03 (/ms) + b04 (/ms) + b0O (/ms) + b11 (/ms) + b12 (/ms) + b13 (/ms) + b14 (/ms) + b1n (/ms) + bi1 (/ms) + bi2 (/ms) + bi3 (/ms) + bi4 (/ms) + bi5 (/ms) + bin (/ms) + + v (mV) + ena (mV) + ina (milliamp/cm2) + g (S/cm2) + celsius (degC) +} + +STATE { + C1 FROM 0 TO 1 + C2 FROM 0 TO 1 + C3 FROM 0 TO 1 + C4 FROM 0 TO 1 + C5 FROM 0 TO 1 + I1 FROM 0 TO 1 + I2 FROM 0 TO 1 + I3 FROM 0 TO 1 + I4 FROM 0 TO 1 + I5 FROM 0 TO 1 + O FROM 0 TO 1 + I6 FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE activation METHOD sparse + g = gbar * O + ina = g * (v - ena) +} + +INITIAL { + rates(v) + SOLVE seqinitial +} + +KINETIC activation +{ + rates(v) + ~ C1 <-> C2 (f01,b01) + ~ C2 <-> C3 (f02,b02) + ~ C3 <-> C4 (f03,b03) + ~ C4 <-> C5 (f04,b04) + ~ C5 <-> O (f0O,b0O) + ~ O <-> I6 (fin,bin) + ~ I1 <-> I2 (f11,b11) + ~ I2 <-> I3 (f12,b12) + ~ I3 <-> I4 (f13,b13) + ~ I4 <-> I5 (f14,b14) + ~ I5 <-> I6 (f1n,b1n) + ~ C1 <-> I1 (fi1,bi1) + ~ C2 <-> I2 (fi2,bi2) + ~ C3 <-> I3 (fi3,bi3) + ~ C4 <-> I4 (fi4,bi4) + ~ C5 <-> I5 (fi5,bi5) + + CONSERVE C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +LINEAR seqinitial { : sets initial equilibrium + ~ I1*bi1 + C2*b01 - C1*( fi1+f01) = 0 + ~ C1*f01 + I2*bi2 + C3*b02 - C2*(b01+fi2+f02) = 0 + ~ C2*f02 + I3*bi3 + C4*b03 - C3*(b02+fi3+f03) = 0 + ~ C3*f03 + I4*bi4 + C5*b04 - C4*(b03+fi4+f04) = 0 + ~ C4*f04 + I5*bi5 + O*b0O - C5*(b04+fi5+f0O) = 0 + ~ C5*f0O + I6*bin - O*(b0O+fin) = 0 + + ~ C1*fi1 + I2*b11 - I1*( bi1+f11) = 0 + ~ I1*f11 + C2*fi2 + I3*b12 - I2*(b11+bi2+f12) = 0 + ~ I2*f12 + C3*fi3 + I4*bi3 - I3*(b12+bi3+f13) = 0 + ~ I3*f13 + C4*fi4 + I5*b14 - I4*(b13+bi4+f14) = 0 + ~ I4*f14 + C5*fi5 + I6*b1n - I5*(b14+bi5+f1n) = 0 + + ~ C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +PROCEDURE rates(v(mV) ) +{ + LOCAL qt + qt = 2.3^((celsius-37)/10) + + f01 = qt * 4 * alpha * exp(v/x1) + f02 = qt * 3 * alpha * exp(v/x1) + f03 = qt * 2 * alpha * exp(v/x1) + f04 = qt * 1 * alpha * exp(v/x1) + f0O = qt * gamma + f11 = qt * 4 * alpha * alfac * exp(v/x1) + f12 = qt * 3 * alpha * alfac * exp(v/x1) + f13 = qt * 2 * alpha * alfac * exp(v/x1) + f14 = qt * 1 * alpha * alfac * exp(v/x1) + f1n = qt * gamma + fi1 = qt * Con + fi2 = qt * Con * alfac + fi3 = qt * Con * alfac^2 + fi4 = qt * Con * alfac^3 + fi5 = qt * Con * alfac^4 + fin = qt * Oon + + b01 = qt * 1 * beta * exp(v/x2) + b02 = qt * 2 * beta * exp(v/x2) + b03 = qt * 3 * beta * exp(v/x2) + b04 = qt * 4 * beta * exp(v/x2) + b0O = qt * delta + b11 = qt * 1 * beta * exp(v/x2) / btfac + b12 = qt * 2 * beta * exp(v/x2) / btfac + b13 = qt * 3 * beta * exp(v/x2) / btfac + b14 = qt * 4 * beta * exp(v/x2) / btfac + b1n = qt * delta + bi1 = qt * Coff + bi2 = qt * Coff / (btfac) + bi3 = qt * Coff / (btfac^2) + bi4 = qt * Coff / (btfac^3) + bi5 = qt * Coff / (btfac^4) + bin = qt * Ooff +} + diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Nap.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Nap.mod new file mode 100644 index 0000000..ef8021e --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/Nap.mod @@ -0,0 +1,77 @@ +:Reference : Modeled according to kinetics derived from Magistretti & Alonso 1999 +:Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Nap + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + hInf + hTau + hAlpha + hBeta +} + +STATE { + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + rates() + g = gbar*mInf*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1.0/(1+exp((v- -52.6)/-4.6)) : assuming instantaneous activation as modeled by Magistretti and Alonso + + hInf = 1.0/(1+exp((v- -48.8)/10)) + hAlpha = 2.88e-6 * vtrap(v + 17, 4.63) + hBeta = 6.94e-6 * vtrap(-(v + 64.4), 2.63) + + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/SK.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/SK.mod new file mode 100644 index 0000000..8bfa3b7 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/SK.mod @@ -0,0 +1,56 @@ +: SK-type calcium-activated potassium current +: Reference : Kohler et al. 1996 + +NEURON { + SUFFIX SK + USEION k READ ek WRITE ik + USEION ca READ cai + RANGE gbar, g, ik +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + (mM) = (milli/liter) +} + +PARAMETER { + v (mV) + gbar = .000001 (mho/cm2) + zTau = 1 (ms) + ek (mV) + cai (mM) +} + +ASSIGNED { + zInf + ik (mA/cm2) + g (S/cm2) +} + +STATE { + z FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * z + ik = g * (v - ek) +} + +DERIVATIVE states { + rates(cai) + z' = (zInf - z) / zTau +} + +PROCEDURE rates(ca(mM)) { + if(ca < 1e-7){ + ca = ca + 1e-07 + } + zInf = 1/(1 + (0.00043 / ca)^4.8) +} + +INITIAL { + rates(cai) + z = zInf +} diff --git a/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/vecevent.mod b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/vecevent.mod new file mode 100644 index 0000000..503dfd2 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/mechanisms/modfiles/vecevent.mod @@ -0,0 +1,71 @@ +: Vector stream of events + +NEURON { + ARTIFICIAL_CELL VecStim +} + +ASSIGNED { + index + etime (ms) + space +} + +INITIAL { + index = 0 + element() + if (index > 0) { + net_send(etime - t, 1) + } +} + +NET_RECEIVE (w) { + if (flag == 1) { + net_event(t) + element() + if (index > 0) { + net_send(etime - t, 1) + } + } +} + +VERBATIM +extern double* vector_vec(); +extern int vector_capacity(); +extern void* vector_arg(); +ENDVERBATIM + +PROCEDURE element() { +VERBATIM + { void* vv; int i, size; double* px; + i = (int)index; + if (i >= 0) { + vv = *((void**)(&space)); + if (vv) { + size = vector_capacity(vv); + px = vector_vec(vv); + if (i < size) { + etime = px[i]; + index += 1.; + }else{ + index = -1.; + } + }else{ + index = -1.; + } + } + } +ENDVERBATIM +} + +PROCEDURE play() { +VERBATIM + void** vv; + vv = (void**)(&space); + *vv = (void*)0; + if (ifarg(1)) { + *vv = vector_arg(1); + } +ENDVERBATIM +} + + diff --git a/bmtk-vb/docs/environments/bionet/run_bionet.py b/bmtk-vb/docs/environments/bionet/run_bionet.py new file mode 100644 index 0000000..ca8abeb --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/run_bionet.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +"""Simulates an example network of 14 cell receiving two kinds of exernal input as defined in configuration file""" + +import os, sys +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + graph = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=graph) + sim.run() + bionet.nrn.quit_execution() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/environments/bionet/synaptic_models/AMPA_ExcToExc.json b/bmtk-vb/docs/environments/bionet/synaptic_models/AMPA_ExcToExc.json new file mode 100644 index 0000000..c758540 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/synaptic_models/AMPA_ExcToExc.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 1.0, + "tau2": 3.0, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/environments/bionet/synaptic_models/AMPA_ExcToInh.json b/bmtk-vb/docs/environments/bionet/synaptic_models/AMPA_ExcToInh.json new file mode 100644 index 0000000..4388799 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/synaptic_models/AMPA_ExcToInh.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.1, + "tau2": 0.5, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/environments/bionet/synaptic_models/GABA_InhToExc.json b/bmtk-vb/docs/environments/bionet/synaptic_models/GABA_InhToExc.json new file mode 100644 index 0000000..702ce9b --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/synaptic_models/GABA_InhToExc.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 2.7, + "tau2": 15.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/environments/bionet/synaptic_models/GABA_InhToInh.json b/bmtk-vb/docs/environments/bionet/synaptic_models/GABA_InhToInh.json new file mode 100644 index 0000000..ed4130a --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/synaptic_models/GABA_InhToInh.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.2, + "tau2": 8.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/environments/bionet/synaptic_models/instanteneousExc.json b/bmtk-vb/docs/environments/bionet/synaptic_models/instanteneousExc.json new file mode 100644 index 0000000..9a6d0a5 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/synaptic_models/instanteneousExc.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": 1 +} + diff --git a/bmtk-vb/docs/environments/bionet/synaptic_models/instanteneousInh.json b/bmtk-vb/docs/environments/bionet/synaptic_models/instanteneousInh.json new file mode 100644 index 0000000..3bac514 --- /dev/null +++ b/bmtk-vb/docs/environments/bionet/synaptic_models/instanteneousInh.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": -1 +} + diff --git a/bmtk-vb/docs/examples/NWB_files/lgn_spikes.nwb b/bmtk-vb/docs/examples/NWB_files/lgn_spikes.nwb new file mode 100644 index 0000000..92a2051 Binary files /dev/null and b/bmtk-vb/docs/examples/NWB_files/lgn_spikes.nwb differ diff --git a/bmtk-vb/docs/examples/NWB_files/tw_spikes.nwb b/bmtk-vb/docs/examples/NWB_files/tw_spikes.nwb new file mode 100644 index 0000000..90a7834 Binary files /dev/null and b/bmtk-vb/docs/examples/NWB_files/tw_spikes.nwb differ diff --git a/bmtk-vb/docs/examples/bio_14cells/build_network.py b/bmtk-vb/docs/examples/bio_14cells/build_network.py new file mode 100644 index 0000000..40f26e6 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_14cells/build_network.py @@ -0,0 +1,369 @@ +import os +import numpy as np + +from bmtk.builder.networks import NetworkBuilder + + +# Step 1: Create a v1 mock network of 14 cells (nodes) with across 7 different cell "types" +net = NetworkBuilder("v1") +net.add_nodes(N=2, # specifiy the number of cells belong to said group. + pop_name='Scnn1a', location='VisL4', ei='e', # pop_name, location, and ei are optional parameters that help's identifies properties of the cells. The modeler can choose whatever key-value pairs as they deem appropiate. + positions=[(28.753, -364.868, -161.705), # The following properties we are passing in lists + (48.753, -344.868, -141.705)], # of size N. Doing so will uniquely assign different + tuning_angle=[0.0, 25.0], # values to each individual cell + rotation_angle_yaxis=[3.55501, 3.81531], + rotation_angle_zaxis=-3.646878266, # Note that the y-axis rotation is differnt for each cell (ie. given a list of size N), but with z-axis rotation all cells have the same value + model_type='biophysical', # The type of cell we are using + model_template='ctdb:Biophys1.hoc', # Tells the simulator that when building cells models use a hoc_template specially created for parsing Allen Cell-types file models. Value would be different if we were using NeuronML or different model files + model_processing='aibs_perisomatic', # further instructions for how to processes a cell model. In this case aibs_perisomatic is a built-in directive to cut the axon in a specific way + dynamics_params='472363762_fit.json', # Name of file (downloaded from Allen Cell-Types) used to set model parameters and channels + morphology='Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc') # Name of morphology file downloaded + +net.add_nodes(N=2, pop_name='Rorb', location='VisL4', ei='e', + positions=[(241.092, -349.263, 146.916), (201.092, -399.263, 126.916)], + tuning_angle=[50.0, 75.0], + rotation_angle_yaxis=[3.50934, 3.50934], + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic', + dynamics_params='473863510_fit.json', + morphology='Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc', + rotation_angle_zaxis=-4.159763785) + +net.add_nodes(N=2, pop_name='Nr5a1', location='VisL4', ei='e', + positions=[(320.498, -351.259, 20.273), (310.498, -371.259, 10.273)], + tuning_angle=[100.0, 125.0], + rotation_angle_yaxis=[0.72202, 0.72202], + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic', + dynamics_params='473863035_fit.json', + morphology='Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc', + rotation_angle_zaxis=-2.639275277) + +# Note that in the previous cells we set the tuning_angle, but for PV1 and PV2 such parameter is absent (as it is not +# applicable for inhibitory cells). The BMTK builder allows heterogeneous cell properties as dictated by the model +net.add_nodes(N=2, pop_name='PV1', location='VisL4', ei='i', + positions=[(122.373, -352.417, -216.748), (102.373, -342.417, -206.748)], + rotation_angle_yaxis=[2.92043, 2.92043], + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic', + dynamics_params='472912177_fit.json', + morphology='Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc', + rotation_angle_zaxis=-2.539551891) + +net.add_nodes(N=2, pop_name='PV2', location='VisL4', ei='i', + positions=[(350.321, -372.535, -18.282), (360.321, -371.535, -12.282)], + rotation_angle_yaxis=[5.043336, 5.043336], + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic', + dynamics_params='473862421_fit.json', + morphology='Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc', + rotation_angle_zaxis=-3.684439949) + + +# Along with our biophysical cells our network will also include integate-and-fire point cells +net.add_nodes(N=2, pop_name='LIF_exc', location='VisL4', ei='e', + positions=[(-243.04, -342.352, -665.666), (-233.04, -332.352, -675.666)], + tuning_angle=[150.0, 175.0], + model_type='point_process', # use point_process to indicate were are using point model cells + model_template='nrn:IntFire1', # Tell the simulator to use the NEURON built-in IntFire1 type cell + dynamics_params='IntFire1_exc_1.json') + +net.add_nodes(N=2, pop_name='LIF_inh', location='VisL4', ei='i', + positions=[(211.04, -321.333, -631.593), (218.04, -327.333, -635.593)], + model_type='point_process', + model_template='nrn:IntFire1', + dynamics_params='IntFire1_inh_1.json') + + +# Step 2: We want to connect our network. Just like how we have node-types concept we group our connections into +# "edge-types" that share rules and properties +net.add_edges(source={'ei': 'i'}, # For our synaptic source cells we select all inhibitory cells (ei==i), incl. both biophys and point + target={'ei': 'i', 'model_type': 'biophysical'}, # For our synaptic target we select all inhibitory biophysically detailed cells + connection_rule=5, # All matching source/target pairs will have + syn_weight=0.0002, # synaptic weight + target_sections=['somatic', 'basal'], # Gives the simulator the target sections and + distance_range=[0.0, 1e+20], # distances (from soma) when creating connections + delay=2.0, + dynamics_params='GABA_InhToInh.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'model_type': 'point_process'}, + connection_rule=5, + syn_weight=0.00225, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousInh.json') + +net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'model_type': 'biophysical'}, + connection_rule=lambda trg, src: 5, + syn_weight=0.00018, + weight_function='wmax', + distance_range=[0.0, 50.0], + target_sections=['somatic', 'basal', 'apical'], + delay=2.0, + dynamics_params='GABA_InhToExc.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'model_type': 'point_process'}, + connection_rule=5, + syn_weight=0.009, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousInh.json') + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'PV1'}, + connection_rule=5, + syn_weight=0.00035, + weight_function='wmax', + distance_range=[0.0, 1e+20], + target_sections=['somatic', 'basal'], + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'PV2'}, + connection_rule=5, + syn_weight=0.00027, + weight_function='wmax', + distance_range=[0.0, 1e+20], + target_sections=['somatic', 'basal'], + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_inh'}, + connection_rule=5, + syn_weight=0.0043, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousExc.json') + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'Scnn1a'}, + connection_rule=5, + syn_weight=6.4e-05, + weight_function='gaussianLL', + weight_sigma=50.0, + distance_range=[30.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'Rorb'}, + connection_rule=5, + syn_weight=5.5e-05, + weight_function='gaussianLL', + weight_sigma=50.0, + distance_range=[30.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'Nr5a1'}, + connection_rule=5, + syn_weight=7.2e-05, + weight_function='gaussianLL', + weight_sigma=50.0, + distance_range=[30.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_exc'}, + connection_rule=5, + syn_weight=0.0019, + weight_function='gaussianLL', + weight_sigma=50.0, + delay=2.0, + dynamics_params='instanteneousExc.json') + + +net.build() +net.save(output_dir='network') + + +def generate_positions(N, x0=0.0, x1=300.0, y0=0.0, y1=100.0): + X = np.random.uniform(x0, x1, N) + Y = np.random.uniform(y0, y1, N) + return np.column_stack((X, Y)) + + +def select_source_cells(src_cells, trg_cell, n_syns): + if 'tuning_angle' in trg_cell: + synapses = [n_syns if src['pop_name'] == 'tON' or src['pop_name'] == 'tOFF' else 0 for src in src_cells] + else: + synapses = [n_syns if src['pop_name'] == 'tONOFF' else 0 for src in src_cells] + + return synapses + + +lgn = NetworkBuilder("lgn") +lgn.add_nodes(N=30, pop_name='tON', ei='e', location='LGN', + positions=generate_positions(30), + model_type='virtual') + +lgn.add_nodes(N=30, pop_name='tOFF', ei='e', location='LGN', + positions=generate_positions(30), + model_type='virtual') + +lgn.add_nodes(N=30, pop_name='tONOFF', ei='e', location='LGN', + positions=generate_positions(30), + model_type='virtual') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='Rorb'), + iterator='all_to_one', + connection_rule=select_source_cells, + connection_params={'n_syns': 10}, + syn_weight=5e-05, + weight_function='wmax', + distance_range=[0.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='Nr5a1'), + iterator='all_to_one', + connection_rule=select_source_cells, + connection_params={'n_syns': 10}, + syn_weight=5e-05, + weight_function='wmax', + distance_range=[0.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='Scnn1a'), + iterator='all_to_one', + connection_rule=select_source_cells, + connection_params={'n_syns': 10}, + syn_weight=4e-05, + weight_function='wmax', + distance_range=[0.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='PV1'), + iterator='all_to_one', + connection_rule=select_source_cells, + connection_params={'n_syns': 10}, + syn_weight=0.0001, + weight_function='wmax', + distance_range=[0.0, 1.0e+20], + target_sections=['somatic', 'basal'], + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='PV2'), + iterator='all_to_one', + connection_rule=select_source_cells, + connection_params={'n_syns': 10}, + syn_weight=9e-05, + weight_function='wmax', + distance_range=[0.0, 1.0e+20], + target_sections=['somatic', 'basal'], + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_exc'), + iterator='all_to_one', + connection_rule=select_source_cells, + connection_params={'n_syns': 10}, + syn_weight=0.0045, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousExc.json') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_inh'), + iterator='all_to_one', + connection_rule=select_source_cells, + connection_params={'n_syns': 10}, + syn_weight=0.002, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousExc.json') + +lgn.build() +lgn.save(output_dir='network') + + +tw = NetworkBuilder("tw") +tw.add_nodes(N=30, pop_name='TW', ei='e', location='TW', model_type='virtual') + +tw.add_edges(source=tw.nodes(), target=net.nodes(pop_name='Rorb'), + connection_rule=5, + syn_weight=0.00015, + weight_function='wmax', + distance_range=[30.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +tw.add_edges(source=tw.nodes(), target=net.nodes(pop_name='Scnn1a'), + connection_rule=5, + syn_weight=0.00019, + weight_function='wmax', + distance_range=[30.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +tw.add_edges(source=tw.nodes(), target=net.nodes(pop_name='Nr5a1'), + connection_rule=5, + syn_weight=0.00019, + weight_function='wmax', + distance_range=[30.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +tw.add_edges(source=tw.nodes(), target=net.nodes(pop_name='PV1'), + connection_rule=5, + syn_weight=0.0022, + weight_function='wmax', + distance_range=[0.0, 1.0e+20], + target_sections=['basal', 'somatic'], + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn') + +tw.add_edges(source=tw.nodes(), target=net.nodes(pop_name='PV2'), + connection_rule = 5, + syn_weight = 0.0013, + weight_function = 'wmax', + distance_range = [0.0, 1.0e+20], + target_sections = ['basal', 'somatic'], + delay = 2.0, + dynamics_params = 'AMPA_ExcToInh.json', + model_template = 'exp2syn') + +tw.add_edges(source=tw.nodes(), target=net.nodes(pop_name='LIF_exc'), + connection_rule=5, + syn_weight=0.015, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousExc.json') + +tw.add_edges(source=tw.nodes(), target=net.nodes(pop_name='LIF_inh'), + connection_rule=5, + syn_weight=0.05, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousExc.json') + +tw.build() +tw.save(output_dir='network') diff --git a/bmtk-vb/docs/examples/bio_14cells/config.json b/bmtk-vb/docs/examples/bio_14cells/config.json new file mode 100755 index 0000000..d490009 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_14cells/config.json @@ -0,0 +1,109 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/../NWB_files", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../biophys_components" + }, + + "run": { + "tstop": 3000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15, + "nsteps_block": 5000, + "overwrite_output_dir": true + }, + + "target_simulator":"NEURON", + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "inputs": { + "LGN_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$INPUT_DIR/lgn_spikes.nwb", + "node_set": "lgn", + "trial": "trial_0" + }, + "TW_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$INPUT_DIR/tw_spikes.nwb", + "node_set": "tw", + "trial": "trial_0" + } + }, + + "output":{ + "log_file": "log.txt", + "output_dir": "$OUTPUT_DIR", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "spikes_sort_order": "time" + }, + + "components": { + "morphologies_dir": "$COMPONENT_DIR/morphologies", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENT_DIR/biophysical_neuron_templates", + "point_neuron_models_dir": "$COMPONENT_DIR/point_neuron_templates" + }, + + + "reports": { + "calcium_concentration": { + "cells": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "variable_name": "cai", + "module": "membrane_report", + "sections": "soma", + "enabled": true + }, + + "membrane_potential": { + "cells": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "variable_name": "v", + "module": "membrane_report", + "sections": "soma", + "enabled": true + } + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/v1_nodes.h5", + "node_types_file": "$NETWORK_DIR/v1_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/lgn_nodes.h5", + "node_types_file": "$NETWORK_DIR/lgn_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/tw_nodes.h5", + "node_types_file": "$NETWORK_DIR/tw_node_types.csv" + } + ], + + "edges": [ + { + "edges_file": "$NETWORK_DIR/v1_v1_edges.h5", + "edge_types_file": "$NETWORK_DIR/v1_v1_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/lgn_v1_edges.h5", + "edge_types_file": "$NETWORK_DIR/lgn_v1_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/tw_v1_edges.h5", + "edge_types_file": "$NETWORK_DIR/tw_v1_edge_types.csv" + } + ] + } +} diff --git a/bmtk-vb/docs/examples/bio_14cells/network/lgn_node_types.csv b/bmtk-vb/docs/examples/bio_14cells/network/lgn_node_types.csv new file mode 100644 index 0000000..2ead28a --- /dev/null +++ b/bmtk-vb/docs/examples/bio_14cells/network/lgn_node_types.csv @@ -0,0 +1,4 @@ +node_type_id model_type ei location pop_name +100 virtual e LGN tON +101 virtual e LGN tOFF +102 virtual e LGN tONOFF diff --git a/bmtk-vb/docs/examples/bio_14cells/network/lgn_nodes.h5 b/bmtk-vb/docs/examples/bio_14cells/network/lgn_nodes.h5 new file mode 100644 index 0000000..b2054ed Binary files /dev/null and b/bmtk-vb/docs/examples/bio_14cells/network/lgn_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_14cells/network/lgn_v1_edge_types.csv b/bmtk-vb/docs/examples/bio_14cells/network/lgn_v1_edge_types.csv new file mode 100644 index 0000000..af6e10a --- /dev/null +++ b/bmtk-vb/docs/examples/bio_14cells/network/lgn_v1_edge_types.csv @@ -0,0 +1,8 @@ +edge_type_id target_query source_query syn_weight dynamics_params distance_range delay target_sections weight_function model_template +100 pop_name=='Rorb' * 5e-05 AMPA_ExcToExc.json "[0.0, 150.0]" 2.0 "['basal', 'apical']" wmax exp2syn +101 pop_name=='Nr5a1' * 5e-05 AMPA_ExcToExc.json "[0.0, 150.0]" 2.0 "['basal', 'apical']" wmax exp2syn +102 pop_name=='Scnn1a' * 4e-05 AMPA_ExcToExc.json "[0.0, 150.0]" 2.0 "['basal', 'apical']" wmax exp2syn +103 pop_name=='PV1' * 0.0001 AMPA_ExcToInh.json "[0.0, 1e+20]" 2.0 "['somatic', 'basal']" wmax exp2syn +104 pop_name=='PV2' * 9e-05 AMPA_ExcToInh.json "[0.0, 1e+20]" 2.0 "['somatic', 'basal']" wmax exp2syn +105 pop_name=='LIF_exc' * 0.0045 instanteneousExc.json NULL 2.0 NULL wmax NULL +106 pop_name=='LIF_inh' * 0.002 instanteneousExc.json NULL 2.0 NULL wmax NULL diff --git a/bmtk-vb/docs/examples/bio_14cells/network/lgn_v1_edges.h5 b/bmtk-vb/docs/examples/bio_14cells/network/lgn_v1_edges.h5 new file mode 100644 index 0000000..de201ee Binary files /dev/null and b/bmtk-vb/docs/examples/bio_14cells/network/lgn_v1_edges.h5 differ diff --git a/bmtk-vb/docs/examples/bio_14cells/network/tw_node_types.csv b/bmtk-vb/docs/examples/bio_14cells/network/tw_node_types.csv new file mode 100644 index 0000000..e9ad70a --- /dev/null +++ b/bmtk-vb/docs/examples/bio_14cells/network/tw_node_types.csv @@ -0,0 +1,2 @@ +node_type_id model_type ei location pop_name +100 virtual e TW TW diff --git a/bmtk-vb/docs/examples/bio_14cells/network/tw_nodes.h5 b/bmtk-vb/docs/examples/bio_14cells/network/tw_nodes.h5 new file mode 100644 index 0000000..a62df65 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_14cells/network/tw_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_14cells/network/tw_v1_edge_types.csv b/bmtk-vb/docs/examples/bio_14cells/network/tw_v1_edge_types.csv new file mode 100644 index 0000000..4b015fa --- /dev/null +++ b/bmtk-vb/docs/examples/bio_14cells/network/tw_v1_edge_types.csv @@ -0,0 +1,8 @@ +edge_type_id target_query source_query syn_weight dynamics_params distance_range delay target_sections weight_function model_template +100 pop_name=='Rorb' * 0.00015 AMPA_ExcToExc.json "[30.0, 150.0]" 2.0 "['basal', 'apical']" wmax exp2syn +101 pop_name=='Scnn1a' * 0.00019 AMPA_ExcToExc.json "[30.0, 150.0]" 2.0 "['basal', 'apical']" wmax exp2syn +102 pop_name=='Nr5a1' * 0.00019 AMPA_ExcToExc.json "[30.0, 150.0]" 2.0 "['basal', 'apical']" wmax exp2syn +103 pop_name=='PV1' * 0.0022 AMPA_ExcToInh.json "[0.0, 1e+20]" 2.0 "['basal', 'somatic']" wmax exp2syn +104 pop_name=='PV2' * 0.0013 AMPA_ExcToInh.json "[0.0, 1e+20]" 2.0 "['basal', 'somatic']" wmax exp2syn +105 pop_name=='LIF_exc' * 0.015 instanteneousExc.json NULL 2.0 NULL wmax NULL +106 pop_name=='LIF_inh' * 0.05 instanteneousExc.json NULL 2.0 NULL wmax NULL diff --git a/bmtk-vb/docs/examples/bio_14cells/network/tw_v1_edges.h5 b/bmtk-vb/docs/examples/bio_14cells/network/tw_v1_edges.h5 new file mode 100644 index 0000000..f045443 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_14cells/network/tw_v1_edges.h5 differ diff --git a/bmtk-vb/docs/examples/bio_14cells/network/v1_node_types.csv b/bmtk-vb/docs/examples/bio_14cells/network/v1_node_types.csv new file mode 100644 index 0000000..f505e28 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_14cells/network/v1_node_types.csv @@ -0,0 +1,8 @@ +node_type_id ei model_type model_processing pop_name location model_template morphology dynamics_params rotation_angle_zaxis +100 e biophysical aibs_perisomatic Scnn1a VisL4 ctdb:Biophys1.hoc Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc 472363762_fit.json -3.646878266 +101 e biophysical aibs_perisomatic Rorb VisL4 ctdb:Biophys1.hoc Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc 473863510_fit.json -4.159763785 +102 e biophysical aibs_perisomatic Nr5a1 VisL4 ctdb:Biophys1.hoc Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc 473863035_fit.json -2.639275277 +103 i biophysical aibs_perisomatic PV1 VisL4 ctdb:Biophys1.hoc Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc 472912177_fit.json -2.539551891 +104 i biophysical aibs_perisomatic PV2 VisL4 ctdb:Biophys1.hoc Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc 473862421_fit.json -3.684439949 +105 e point_process NULL LIF_exc VisL4 nrn:IntFire1 NULL IntFire1_exc_1.json NULL +106 i point_process NULL LIF_inh VisL4 nrn:IntFire1 NULL IntFire1_inh_1.json NULL diff --git a/bmtk-vb/docs/examples/bio_14cells/network/v1_nodes.h5 b/bmtk-vb/docs/examples/bio_14cells/network/v1_nodes.h5 new file mode 100644 index 0000000..d1d56da Binary files /dev/null and b/bmtk-vb/docs/examples/bio_14cells/network/v1_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_14cells/network/v1_v1_edge_types.csv b/bmtk-vb/docs/examples/bio_14cells/network/v1_v1_edge_types.csv new file mode 100644 index 0000000..5f2cb05 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_14cells/network/v1_v1_edge_types.csv @@ -0,0 +1,12 @@ +edge_type_id target_query source_query syn_weight dynamics_params distance_range delay target_sections weight_function model_template weight_sigma +100 model_type=='biophysical'&ei=='i' ei=='i' 0.0002 GABA_InhToInh.json "[0.0, 1e+20]" 2.0 "['somatic', 'basal']" NULL exp2syn NULL +101 model_type=='point_process'&ei=='i' ei=='i' 0.00225 instanteneousInh.json NULL 2.0 NULL wmax NULL NULL +102 model_type=='biophysical'&ei=='e' ei=='i' 0.00018 GABA_InhToExc.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax exp2syn NULL +103 model_type=='point_process'&ei=='e' ei=='i' 0.009 instanteneousInh.json NULL 2.0 NULL wmax NULL NULL +104 pop_name=='PV1' ei=='e' 0.00035 AMPA_ExcToInh.json "[0.0, 1e+20]" 2.0 "['somatic', 'basal']" wmax exp2syn NULL +105 pop_name=='PV2' ei=='e' 0.00027 AMPA_ExcToInh.json "[0.0, 1e+20]" 2.0 "['somatic', 'basal']" wmax exp2syn NULL +106 pop_name=='LIF_inh' ei=='e' 0.0043 instanteneousExc.json NULL 2.0 NULL wmax NULL NULL +107 pop_name=='Scnn1a' ei=='e' 6.4e-05 AMPA_ExcToExc.json "[30.0, 150.0]" 2.0 "['basal', 'apical']" gaussianLL exp2syn 50.0 +108 pop_name=='Rorb' ei=='e' 5.5e-05 AMPA_ExcToExc.json "[30.0, 150.0]" 2.0 "['basal', 'apical']" gaussianLL exp2syn 50.0 +109 pop_name=='Nr5a1' ei=='e' 7.2e-05 AMPA_ExcToExc.json "[30.0, 150.0]" 2.0 "['basal', 'apical']" gaussianLL exp2syn 50.0 +110 pop_name=='LIF_exc' ei=='e' 0.0019 instanteneousExc.json NULL 2.0 NULL gaussianLL NULL 50.0 diff --git a/bmtk-vb/docs/examples/bio_14cells/network/v1_v1_edges.h5 b/bmtk-vb/docs/examples/bio_14cells/network/v1_v1_edges.h5 new file mode 100644 index 0000000..84acb6f Binary files /dev/null and b/bmtk-vb/docs/examples/bio_14cells/network/v1_v1_edges.h5 differ diff --git a/bmtk-vb/docs/examples/bio_14cells/run_bionet.py b/bmtk-vb/docs/examples/bio_14cells/run_bionet.py new file mode 100644 index 0000000..86f56a6 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_14cells/run_bionet.py @@ -0,0 +1,20 @@ +"""Simulates an example network of 450 cell receiving two kinds of exernal input as defined in the configuration file""" +import sys +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + graph = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=graph) + sim.run() + bionet.nrn.quit_execution() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/examples/bio_450cells/build_network.py b/bmtk-vb/docs/examples/bio_450cells/build_network.py new file mode 100644 index 0000000..b5c10cc --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/build_network.py @@ -0,0 +1,190 @@ +import os +import numpy as np + +from bmtk.builder import NetworkBuilder +from bmtk.builder.aux.node_params import positions_columinar, xiter_random + +#build_recurrent_edges = True + +# List of non-virtual cell models +bio_models = [ + { + 'model_name': 'Scnn1a', 'ei': 'e', + 'morphology': 'Scnn1a_473845048_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '472363762_fit.json' + }, + { + 'model_name': 'Rorb', 'ei': 'e', + 'morphology': 'Rorb_325404214_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '473863510_fit.json' + }, + { + 'model_name': 'Nr5a1', 'ei': 'e', + 'morphology': 'Nr5a1_471087815_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '473863035_fit.json' + }, + { + 'model_name': 'PV1', 'ei': 'i', + 'morphology': 'Pvalb_470522102_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '472912177_fit.json' + }, + { + 'model_name': 'PV2', 'ei': 'i', + 'morphology': 'Pvalb_469628681_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '473862421_fit.json' + } +] + +point_models = [ + { + 'model_name': 'LIF_exc', 'ei': 'e', + 'dynamics_params': 'IntFire1_exc_1.json' + }, + { + 'model_name': 'LIF_inh', 'ei': 'i', + 'dynamics_params': 'IntFire1_inh_1.json' + } +] + +# Build a network of 300 biophysical cells to simulate +internal = NetworkBuilder("internal") +for i, model_props in enumerate(bio_models): + n_cells = 80 if model_props['ei'] == 'e' else 30 # 80% excitatory, 20% inhib + + # Randomly get positions uniformly distributed in a column + positions = positions_columinar(N=n_cells, center=[0, 10.0, 0], max_radius=50.0, height=200.0) + + internal.add_nodes(N=n_cells, + x=positions[:, 0], y=positions[:, 1], z=positions[:, 2], + rotation_angle_yaxis=xiter_random(N=n_cells, min_x=0.0, max_x=2 * np.pi), # randomly rotate y axis + rotation_angle_zaxis=xiter_random(N=n_cells, min_x=0.0, max_x=2 * np.pi), # + model_type='biophysical', + model_processing='aibs_perisomatic', + **model_props) + +# Build intfire type cells +for model_props in point_models: + n_cells = 75 # Just assume 75 cells for both point inhibitory and point excitatory + positions = positions_columinar(N=n_cells, center=[0, 10.0, 0], max_radius=50.0, height=200.0) + internal.add_nodes(N=n_cells, + x=positions[:, 0], y=positions[:, 1], z=positions[:, 2], + model_type='point_process', + model_template='nrn:IntFire1', + **model_props) + + +def n_connections(src, trg, prob=0.1, min_syns=1, max_syns=5): + """Referenced by add_edges() and called by build() for every source/target pair. For every given target/source + pair will connect the two with a probability prob (excludes self-connections)""" + if src.node_id == trg.node_id: + return 0 + + return 0 if np.random.uniform() > prob else np.random.randint(min_syns, max_syns) + + +# Connections onto biophysical components, use the connection map to save section and position of every synapse +# exc --> exc connections +internal.add_edges(source={'ei': 'e'}, target={'ei': 'e', 'model_type': 'biophysical'}, + connection_rule=n_connections, + connection_params={'prob': 0.2}, + dynamics_params='AMPA_ExcToExc.json', + model_template='Exp2Syn', + syn_weight=6.0e-05, + delay=2.0, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0]) + +# exc --> inh connections +internal.add_edges(source={'ei': 'e'}, target={'ei': 'i', 'model_type': 'biophysical'}, + connection_rule=n_connections, + dynamics_params='AMPA_ExcToInh.json', + model_template='Exp2Syn', + syn_weight=0.0006, + delay=2.0, + target_sections=['somatic', 'basal'], + distance_range=[0.0, 1.0e+20]) + +# inh --> exc connections +internal.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'model_type': 'biophysical'}, + connection_rule=n_connections, + dynamics_params='GABA_InhToExc.json', + model_template='Exp2Syn', + syn_weight=0.002, + delay=2.0, + target_sections=['somatic', 'basal', 'apical'], + distance_range=[0.0, 50.0]) + +# inh --> inh connections +internal.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'model_type': 'biophysical'}, + connection_rule=n_connections, + connection_params={'prob': 0.2}, + dynamics_params='GABA_InhToInh.json', + model_template='Exp2Syn', + syn_weight=0.00015, + delay=2.0, + target_sections=['somatic', 'basal'], + distance_range=[0.0, 1.0e+20]) + +# For connections on point neurons it doesn't make sense to save syanpatic location +internal.add_edges(source={'ei': 'e'}, target={'model_type': 'point_process'}, + connection_rule=n_connections, + dynamics_params='instanteneousExc.json', + syn_weight=0.0019, + delay=2.0) + +internal.add_edges(source={'ei': 'i'}, target={'model_type': 'point_process'}, + connection_rule=n_connections, + dynamics_params='instanteneousInh.json', + syn_weight=0.0019, + delay=2.0) + +# Build and save internal network +internal.build() +print('Saving internal network') +internal.save(output_dir='network') + + +# Build a network of 100 virtual cells that will connect to and drive the simulation of the internal network +print('Building external connections') +external = NetworkBuilder("external") + +external.add_nodes(N=100, model_type='virtual', ei='e') + +# Targets all biophysical excitatory cells +external.add_edges(target=internal.nodes(ei='e', model_type='biophysical'), source=external.nodes(), + connection_rule=lambda *_: np.random.randint(0, 5), + dynamics_params='AMPA_ExcToExc.json', + model_template='Exp2Syn', + delay=2.0, + syn_weight=0.00041, + target_sections=['basal', 'apical', 'somatic'], + distance_range=[0.0, 50.0]) + +# Targets all biophysical inhibitory cells +external.add_edges(target=internal.nodes(ei='i', model_type='biophysical'), source=external.nodes(), + connection_rule=lambda *_: np.random.randint(0, 5), + dynamics_params='AMPA_ExcToInh.json', + model_template='Exp2Syn', + delay=2.0, + syn_weight=0.00095, + target_sections=['basal', 'apical'], + distance_range=[0.0, 1e+20]) + +# Targets all intfire1 cells (exc and inh) +external.add_edges(target=internal.nodes(model_type='point_process'), source=external.nodes(), + connection_rule=lambda *_: np.random.randint(0, 5), + dynamics_params='instanteneousExc.json', + delay=2.0, + syn_weight=0.045) + + +external.build() +print('Saving external') +external.save(output_dir='network') + + diff --git a/bmtk-vb/docs/examples/bio_450cells/build_nodes.py b/bmtk-vb/docs/examples/bio_450cells/build_nodes.py new file mode 100644 index 0000000..0dd0c4c --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/build_nodes.py @@ -0,0 +1,7 @@ +from bmtk.utils import sonata + +sf = sonata.File(data_files='network/v1_nodes.h5', data_type_files='network/v1_node_types.csv') +sf.nodes.generate_gids('network/gids.h5') + + + diff --git a/bmtk-vb/docs/examples/bio_450cells/config.json b/bmtk-vb/docs/examples/bio_450cells/config.json new file mode 100755 index 0000000..2bd14da --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/config.json @@ -0,0 +1,102 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/../NWB_files", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../biophys_components" + }, + + "run": { + "tstop": 3000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15, + "nsteps_block": 5000 + }, + + "target_simulator":"NEURON", + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "inputs": { + "external_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$INPUT_DIR/lgn_spikes.nwb", + "node_set": "external", + "trial": "trial_0" + } + }, + + "output":{ + "log_file": "log.txt", + "output_dir": "$OUTPUT_DIR", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv" + }, + + "node_sets": { + "bio_cells": { + "model_type": "biophysical" + }, + "point_cells": { + "model_type": ["point_process", "point_soma"] + } + }, + + "components": { + "morphologies_dir": "$COMPONENT_DIR/morphologies", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENT_DIR/biophysical_neuron_templates", + "point_neuron_models_dir": "$COMPONENT_DIR/point_neuron_templates" + }, + + "reports": { + "calcium_concentration": { + "cells": "bio_cells", + "variable_name": "cai", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + }, + + "membrane_potential": { + "cells": "bio_cells", + "variable_name": "v", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + } + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/internal_nodes.h5", + "node_types_file": "$NETWORK_DIR/internal_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/external_nodes.h5", + "node_types_file": "$NETWORK_DIR/external_node_types.csv" + } + ], + + "edges": [ + { + "edges_file": "$NETWORK_DIR/internal_internal_edges.h5", + "edge_types_file": "$NETWORK_DIR/internal_internal_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/external_internal_edges.h5", + "edge_types_file": "$NETWORK_DIR/external_internal_edge_types.csv" + } + ] + } +} diff --git a/bmtk-vb/docs/examples/bio_450cells/network/external_internal_edge_types.csv b/bmtk-vb/docs/examples/bio_450cells/network/external_internal_edge_types.csv new file mode 100644 index 0000000..4ac9cc8 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/network/external_internal_edge_types.csv @@ -0,0 +1,4 @@ +edge_type_id target_query source_query syn_weight dynamics_params distance_range delay target_sections model_template +100 model_type=='biophysical'&ei=='e' * 0.00041 AMPA_ExcToExc.json "[0.0, 50.0]" 2.0 "['basal', 'apical', 'somatic']" Exp2Syn +101 model_type=='biophysical'&ei=='i' * 0.00095 AMPA_ExcToInh.json "[0.0, 1e+20]" 2.0 "['basal', 'apical']" Exp2Syn +102 model_type=='point_process' * 0.045 instanteneousExc.json NULL 2.0 NULL NULL diff --git a/bmtk-vb/docs/examples/bio_450cells/network/external_internal_edges.h5 b/bmtk-vb/docs/examples/bio_450cells/network/external_internal_edges.h5 new file mode 100644 index 0000000..bf2a49d Binary files /dev/null and b/bmtk-vb/docs/examples/bio_450cells/network/external_internal_edges.h5 differ diff --git a/bmtk-vb/docs/examples/bio_450cells/network/external_node_types.csv b/bmtk-vb/docs/examples/bio_450cells/network/external_node_types.csv new file mode 100644 index 0000000..07b4593 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/network/external_node_types.csv @@ -0,0 +1,2 @@ +node_type_id model_type ei +100 virtual e diff --git a/bmtk-vb/docs/examples/bio_450cells/network/external_nodes.h5 b/bmtk-vb/docs/examples/bio_450cells/network/external_nodes.h5 new file mode 100644 index 0000000..1bd1fdc Binary files /dev/null and b/bmtk-vb/docs/examples/bio_450cells/network/external_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_450cells/network/internal_internal_edge_types.csv b/bmtk-vb/docs/examples/bio_450cells/network/internal_internal_edge_types.csv new file mode 100644 index 0000000..ba4c10f --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/network/internal_internal_edge_types.csv @@ -0,0 +1,7 @@ +edge_type_id target_query source_query syn_weight dynamics_params distance_range delay target_sections model_template +100 model_type=='biophysical'&ei=='e' ei=='e' 6e-05 AMPA_ExcToExc.json "[30.0, 150.0]" 2.0 "['basal', 'apical']" Exp2Syn +101 model_type=='biophysical'&ei=='i' ei=='e' 0.0006 AMPA_ExcToInh.json "[0.0, 1e+20]" 2.0 "['somatic', 'basal']" Exp2Syn +102 model_type=='biophysical'&ei=='e' ei=='i' 0.002 GABA_InhToExc.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" Exp2Syn +103 model_type=='biophysical'&ei=='i' ei=='i' 0.00015 GABA_InhToInh.json "[0.0, 1e+20]" 2.0 "['somatic', 'basal']" Exp2Syn +104 model_type=='point_process' ei=='e' 0.0019 instanteneousExc.json NULL 2.0 NULL NULL +105 model_type=='point_process' ei=='i' 0.0019 instanteneousInh.json NULL 2.0 NULL NULL diff --git a/bmtk-vb/docs/examples/bio_450cells/network/internal_internal_edges.h5 b/bmtk-vb/docs/examples/bio_450cells/network/internal_internal_edges.h5 new file mode 100644 index 0000000..042b8b8 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_450cells/network/internal_internal_edges.h5 differ diff --git a/bmtk-vb/docs/examples/bio_450cells/network/internal_node_types.csv b/bmtk-vb/docs/examples/bio_450cells/network/internal_node_types.csv new file mode 100644 index 0000000..c3e2718 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/network/internal_node_types.csv @@ -0,0 +1,8 @@ +node_type_id ei model_processing model_type model_template morphology dynamics_params model_name +100 e aibs_perisomatic biophysical ctdb:Biophys1.hoc Scnn1a_473845048_m.swc 472363762_fit.json Scnn1a +101 e aibs_perisomatic biophysical ctdb:Biophys1.hoc Rorb_325404214_m.swc 473863510_fit.json Rorb +102 e aibs_perisomatic biophysical ctdb:Biophys1.hoc Nr5a1_471087815_m.swc 473863035_fit.json Nr5a1 +103 i aibs_perisomatic biophysical ctdb:Biophys1.hoc Pvalb_470522102_m.swc 472912177_fit.json PV1 +104 i aibs_perisomatic biophysical ctdb:Biophys1.hoc Pvalb_469628681_m.swc 473862421_fit.json PV2 +105 e NULL point_process nrn:IntFire1 NULL IntFire1_exc_1.json LIF_exc +106 i NULL point_process nrn:IntFire1 NULL IntFire1_inh_1.json LIF_inh diff --git a/bmtk-vb/docs/examples/bio_450cells/network/internal_nodes.h5 b/bmtk-vb/docs/examples/bio_450cells/network/internal_nodes.h5 new file mode 100644 index 0000000..4e96c8f Binary files /dev/null and b/bmtk-vb/docs/examples/bio_450cells/network/internal_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_450cells/plot_spikes.py b/bmtk-vb/docs/examples/bio_450cells/plot_spikes.py new file mode 100644 index 0000000..e311f98 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/plot_spikes.py @@ -0,0 +1,3 @@ +from bmtk.analyzer.visualization.spikes import plot_spikes + +plot_spikes('network/internal_nodes.h5', 'network/internal_node_types.csv', 'output/spikes.h5') diff --git a/bmtk-vb/docs/examples/bio_450cells/rebuild_edge_index.py b/bmtk-vb/docs/examples/bio_450cells/rebuild_edge_index.py new file mode 100644 index 0000000..764204b --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/rebuild_edge_index.py @@ -0,0 +1,18 @@ +import h5py +import numpy as np + +with h5py.File('network/lgn_v1_edges.h5', 'a') as h5: + node_id_data = np.zeros((449, 2), dtype=np.uint64) + ds = h5['edges/lgn_to_v1/indicies/target_to_source/node_id_to_range'] + node_id_data[0:449, :] = ds + node_id_data[448,:] = [448, 448] + + #print node_id_data + #ds.resize((449, 2)) + #ds[...] = node_id_data + #ds.resize((449, 2)) + del h5['edges/lgn_to_v1/indicies/target_to_source/node_id_to_range'] + + h5.create_dataset('edges/lgn_to_v1/indicies/target_to_source/node_id_to_range', data=node_id_data) + #ary = np.array(h5['edges/lgn_to_v1/indicies/target_to_source/node_id_to_range'][...]) + #print np.append(ary, [[448, 449]]) \ No newline at end of file diff --git a/bmtk-vb/docs/examples/bio_450cells/run_bionet.py b/bmtk-vb/docs/examples/bio_450cells/run_bionet.py new file mode 100644 index 0000000..c000033 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells/run_bionet.py @@ -0,0 +1,23 @@ +"""Simulates an example network of 450 cell receiving two kinds of exernal input as defined in the configuration file""" + + +import sys, os + +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + net = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=net) + sim.run() + bionet.nrn.quit_execution() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/build_network.py b/bmtk-vb/docs/examples/bio_450cells_exact/build_network.py new file mode 100644 index 0000000..dfba066 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells_exact/build_network.py @@ -0,0 +1,215 @@ +import os +import numpy as np + +from bmtk.builder import NetworkBuilder +from bmtk.builder.bionet import SWCReader +from bmtk.utils.io.spike_trains import PoissonSpikesGenerator +from bmtk.builder.aux.node_params import positions_columinar, xiter_random + +build_recurrent_edges = True + +# List of non-virtual cell models +bio_models = [ + { + 'model_name': 'Scnn1a', 'ei': 'e', + 'morphology': 'Scnn1a_473845048_m.swc', + 'model_template': 'nml:Cell_472363762.cell.nml' + }, + { + 'model_name': 'Rorb', 'ei': 'e', + 'morphology': 'Rorb_325404214_m.swc', + 'model_template': 'nml:Cell_473863510.cell.nml' + }, + { + 'model_name': 'Nr5a1', 'ei': 'e', + 'morphology': 'Nr5a1_471087815_m.swc', + 'model_template': 'nml:Cell_473863035.cell.nml' + }, + { + 'model_name': 'PV1', 'ei': 'i', + 'morphology': 'Pvalb_470522102_m.swc', + 'model_template': 'nml:Cell_472912177.cell.nml' + }, + { + 'model_name': 'PV2', 'ei': 'i', + 'morphology': 'Pvalb_469628681_m.swc', + 'model_template': 'nml:Cell_473862421.cell.nml' + } +] + +point_models = [ + { + 'model_name': 'LIF_exc', 'ei': 'e', + 'dynamics_params': 'IntFire1_exc_1.json' + }, + { + 'model_name': 'LIF_inh', 'ei': 'i', + 'dynamics_params': 'IntFire1_inh_1.json' + } +] + + +morphologies = {p['model_name']: SWCReader(os.path.join('../biophys_components/morphologies', p['morphology'])) + for p in bio_models} +def build_edges(src, trg, sections=['basal', 'apical'], dist_range=[50.0, 150.0]): + """Function used to randomly assign a synaptic location based on the section (soma, basal, apical) and an + arc-length dist_range from the soma. This function should be passed into the network and called during the build + process. + + :param src: source cell (dict) + :param trg: target cell (dict) + :param sections: list of target cell sections to synapse onto + :param dist_range: range (distance from soma center) to place + :return: + """ + # Get morphology and soma center for the target cell + swc_reader = morphologies[trg['model_name']] + target_coords = [trg['x'], trg['y'], trg['z']] + + sec_ids, sec_xs = swc_reader.choose_sections(sections, dist_range) # randomly choose sec_ids + coords = swc_reader.get_coord(sec_ids, sec_xs, soma_center=target_coords) # get coords of sec_ids + dist = swc_reader.get_dist(sec_ids) + swctype = swc_reader.get_type(sec_ids) + return sec_ids, sec_xs, coords[0][0], coords[0][1], coords[0][2], dist[0], swctype[0] + + +# Build a network of 300 biophysical cells to simulate +internal = NetworkBuilder("internal") +for i, model_props in enumerate(bio_models): + n_cells = 80 if model_props['ei'] == 'e' else 30 # 80% excitatory, 20% inhib + + # Randomly get positions uniformly distributed in a column + positions = positions_columinar(N=n_cells, center=[0, 10.0, 0], max_radius=50.0, height=200.0) + + internal.add_nodes(N=n_cells, + x=positions[:, 0], y=positions[:, 1], z=positions[:, 2], + rotation_angle_yaxis=xiter_random(N=n_cells, min_x=0.0, max_x=2 * np.pi), # randomly rotate y axis + rotation_angle_zaxis=xiter_random(N=n_cells, min_x=0.0, max_x=2 * np.pi), # + model_type='biophysical', + model_processing='aibs_perisomatic', + **model_props) + +for model_props in point_models: + n_cells = 75 # Just assume 75 cells for both point inhibitory and point excitatory + positions = positions_columinar(N=n_cells, center=[0, 10.0, 0], max_radius=50.0, height=200.0) + internal.add_nodes(N=n_cells, + x=positions[:, 0], y=positions[:, 1], z=positions[:, 2], + model_type='point_process', + model_template='nrn:IntFire1', + **model_props) + +if build_recurrent_edges: + def n_connections(src, trg, prob=0.1, min_syns=1, max_syns=5): + if src.node_id == trg.node_id: + return 0 + + return 0 if np.random.uniform() > prob else np.random.randint(min_syns, max_syns) + + + # Connections onto biophysical components, use the connection map to save section and position of every synapse + # exc --> exc connections + cm = internal.add_edges(source={'ei': 'e'}, target={'ei': 'e', 'model_type': 'biophysical'}, + connection_rule=n_connections, + connection_params={'prob': 0.2}, + dynamics_params='AMPA_ExcToExc.json', + model_template='Exp2Syn', + delay=2.0) + cm.add_properties('syn_weight', rule=6.0e-05, dtypes=np.float) + cm.add_properties(['sec_id', 'sec_x', 'pos_x', 'pos_y', 'pos_z', 'dist', 'type'], + rule=build_edges, + rule_params={'sections': ['basal', 'apical'], 'dist_range': [30.0, 150.0]}, + dtypes=[np.int32, np.float, np.float, np.float, np.float, np.float, np.uint8]) + + # exc --> inh connections + cm = internal.add_edges(source={'ei': 'e'}, target={'ei': 'i', 'model_type': 'biophysical'}, + connection_rule=n_connections, + dynamics_params='AMPA_ExcToInh.json', + model_template='Exp2Syn', + delay=2.0) + cm.add_properties('syn_weight', rule=0.0006, dtypes=np.float) + cm.add_properties(['sec_id', 'sec_x', 'pos_x', 'pos_y', 'pos_z', 'dist', 'type'], + rule=build_edges, + rule_params={'sections': ['somatic', 'basal'], 'dist_range': [0.0, 1.0e+20]}, + dtypes=[np.int32, np.float, np.float, np.float, np.float, np.float, np.uint8]) + + # inh --> exc connections + cm = internal.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'model_type': 'biophysical'}, + connection_rule=n_connections, + dynamics_params='GABA_InhToExc.json', + model_template='Exp2Syn', + delay=2.0) + cm.add_properties('syn_weight', rule=0.002, dtypes=np.float) + cm.add_properties(['sec_id', 'sec_x', 'pos_x', 'pos_y', 'pos_z', 'dist', 'type'], + rule=build_edges, + rule_params={'sections': ['somatic', 'basal', 'apical'], 'dist_range': [0.0, 50.0]}, + dtypes=[np.int32, np.float, np.float, np.float, np.float, np.float, np.uint8]) + + # inh --> inh connections + cm = internal.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'model_type': 'biophysical'}, + connection_rule=n_connections, + connection_params={'prob': 0.2}, + dynamics_params='GABA_InhToInh.json', + model_template='Exp2Syn', + delay=2.0) + cm.add_properties('syn_weight', rule=0.00015, dtypes=np.float) + cm.add_properties(['sec_id', 'sec_x', 'pos_x', 'pos_y', 'pos_z', 'dist', 'type'], + rule=build_edges, + rule_params={'sections': ['somatic', 'basal'], 'dist_range': [0.0, 1.0e+20]}, + dtypes=[np.int32, np.float, np.float, np.float, np.float, np.float, np.uint8]) + + # For connections on point neurons it doesn't make sense to save syanpatic location + cm = internal.add_edges(source={'ei': 'e'}, target={'model_type': 'point_process'}, + connection_rule=n_connections, + dynamics_params='instanteneousExc.json', + delay=2.0) + cm.add_properties('syn_weight', rule=0.0019, dtypes=np.float) + + cm = internal.add_edges(source={'ei': 'i'}, target={'model_type': 'point_process'}, + connection_rule=n_connections, + dynamics_params='instanteneousInh.json', + delay=2.0) + cm.add_properties('syn_weight', rule=0.0019, dtypes=np.float) + +internal.build() + +print('Saving internal') +internal.save(output_dir='network') + + +print('Building external connections') +external = NetworkBuilder("external") +external.add_nodes(N=100, model_type='virtual', ei='e') +cm = external.add_edges(target=internal.nodes(ei='e', model_type='biophysical'), source=external.nodes(), + connection_rule=lambda *_: np.random.randint(0, 5), + dynamics_params='AMPA_ExcToExc.json', + model_template='Exp2Syn', + delay=2.0) +cm.add_properties('syn_weight', rule=0.00041, dtypes=np.float) +cm.add_properties(['sec_id', 'sec_x', 'pos_x', 'pos_y', 'pos_z', 'dist', 'type'], + rule=build_edges, + rule_params={'sections': ['basal', 'apical', 'somatic']}, + dtypes=[np.int32, np.float, np.float, np.float, np.float, np.float, np.uint8]) + +cm = external.add_edges(target=internal.nodes(ei='i', model_type='biophysical'), source=external.nodes(), + connection_rule=lambda *_: np.random.randint(0, 5), + dynamics_params='AMPA_ExcToInh.json', + model_template='Exp2Syn', + delay=2.0) +cm.add_properties('syn_weight', rule=0.00095, dtypes=np.float) +cm.add_properties(['sec_id', 'sec_x', 'pos_x', 'pos_y', 'pos_z', 'dist', 'type'], + rule=build_edges, + dtypes=[np.int32, np.float, np.float, np.float, np.float, np.float, np.uint8]) + +cm = external.add_edges(target=internal.nodes(model_type='point_process'), source=external.nodes(), + connection_rule=lambda *_: np.random.randint(0, 5), + dynamics_params='instanteneousExc.json', + delay=2.0) +cm.add_properties('syn_weight', rule=0.045, dtypes=np.float) + + +external.build() + +print('Saving external') +external.save(output_dir='network') + + diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/config.json b/bmtk-vb/docs/examples/bio_450cells_exact/config.json new file mode 100755 index 0000000..3f44d22 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells_exact/config.json @@ -0,0 +1,104 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/../NWB_files", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../biophys_components" + }, + + "run": { + "tstop": 3000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15, + "nsteps_block": 5000 + }, + + "target_simulator":"NEURON", + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "inputs": { + "external_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$INPUT_DIR/lgn_spikes.nwb", + "node_set": "external", + "trial": "trial_0" + } + }, + + "output":{ + "log_file": "log.txt", + "output_dir": "$OUTPUT_DIR", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv" + }, + + "components": { + "morphologies_dir": "$COMPONENT_DIR/morphologies", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENT_DIR/biophysical_neuron_templates/nml", + "point_neuron_models_dir": "$COMPONENT_DIR/point_neuron_templates" + }, + + + "reports": { + "calcium_concentration": { + "cells": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "variable_name": "cai", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + }, + + "membrane_potential": { + "cells": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "variable_name": "v", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + }, + + "ecp": { + "cells": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "variable_name": "v", + "module": "extracellular", + "electrode_positions": "$COMPONENT_DIR/recXelectrodes/linear_electrode.csv", + "file_name": "ecp.h5", + "electrode_channels": "all", + "contributions_dir": "ecp_contributions" + } + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/internal_nodes.h5", + "node_types_file": "$NETWORK_DIR/internal_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/external_nodes.h5", + "node_types_file": "$NETWORK_DIR/external_node_types.csv" + } + ], + + "edges": [ + { + "edges_file": "$NETWORK_DIR/internal_internal_edges.h5", + "edge_types_file": "$NETWORK_DIR/internal_internal_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/external_internal_edges.h5", + "edge_types_file": "$NETWORK_DIR/external_internal_edge_types.csv" + } + ] + } +} diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/network/external_internal_edge_types.csv b/bmtk-vb/docs/examples/bio_450cells_exact/network/external_internal_edge_types.csv new file mode 100644 index 0000000..16a23ce --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells_exact/network/external_internal_edge_types.csv @@ -0,0 +1,4 @@ +edge_type_id target_query source_query delay dynamics_params model_template +100 model_type=='biophysical'&ei=='e' * 2.0 AMPA_ExcToExc.json Exp2Syn +101 model_type=='biophysical'&ei=='i' * 2.0 AMPA_ExcToInh.json Exp2Syn +102 model_type=='point_process' * 2.0 instanteneousExc.json NULL diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/network/external_internal_edges.h5 b/bmtk-vb/docs/examples/bio_450cells_exact/network/external_internal_edges.h5 new file mode 100644 index 0000000..8df0e01 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_450cells_exact/network/external_internal_edges.h5 differ diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/network/external_node_types.csv b/bmtk-vb/docs/examples/bio_450cells_exact/network/external_node_types.csv new file mode 100644 index 0000000..07b4593 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells_exact/network/external_node_types.csv @@ -0,0 +1,2 @@ +node_type_id model_type ei +100 virtual e diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/network/external_nodes.h5 b/bmtk-vb/docs/examples/bio_450cells_exact/network/external_nodes.h5 new file mode 100644 index 0000000..4eb46fe Binary files /dev/null and b/bmtk-vb/docs/examples/bio_450cells_exact/network/external_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_internal_edge_types.csv b/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_internal_edge_types.csv new file mode 100644 index 0000000..fdc3359 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_internal_edge_types.csv @@ -0,0 +1,7 @@ +edge_type_id target_query source_query delay dynamics_params model_template +100 model_type=='biophysical'&ei=='e' ei=='e' 2.0 AMPA_ExcToExc.json Exp2Syn +101 model_type=='biophysical'&ei=='i' ei=='e' 2.0 AMPA_ExcToInh.json Exp2Syn +102 model_type=='biophysical'&ei=='e' ei=='i' 2.0 GABA_InhToExc.json Exp2Syn +103 model_type=='biophysical'&ei=='i' ei=='i' 2.0 GABA_InhToInh.json Exp2Syn +104 model_type=='point_process' ei=='e' 2.0 instanteneousExc.json NULL +105 model_type=='point_process' ei=='i' 2.0 instanteneousInh.json NULL diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_internal_edges.h5 b/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_internal_edges.h5 new file mode 100644 index 0000000..5cbca02 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_internal_edges.h5 differ diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_node_types.csv b/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_node_types.csv new file mode 100644 index 0000000..a70c4e1 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_node_types.csv @@ -0,0 +1,8 @@ +node_type_id ei model_processing model_type model_template morphology dynamics_params model_name +100 e aibs_perisomatic biophysical nml:Cell_472363762.cell.nml Scnn1a_473845048_m.swc NULL Scnn1a +101 e aibs_perisomatic biophysical nml:Cell_473863510.cell.nml Rorb_325404214_m.swc NULL Rorb +102 e aibs_perisomatic biophysical nml:Cell_473863035.cell.nml Nr5a1_471087815_m.swc NULL Nr5a1 +103 i aibs_perisomatic biophysical nml:Cell_472912177.cell.nml Pvalb_470522102_m.swc NULL PV1 +104 i aibs_perisomatic biophysical nml:Cell_473862421.cell.nml Pvalb_469628681_m.swc NULL PV2 +105 e NULL point_process nrn:IntFire1 NULL IntFire1_exc_1.json LIF_exc +106 i NULL point_process nrn:IntFire1 NULL IntFire1_inh_1.json LIF_inh diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_nodes.h5 b/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_nodes.h5 new file mode 100644 index 0000000..95e301b Binary files /dev/null and b/bmtk-vb/docs/examples/bio_450cells_exact/network/internal_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/plot_spikes.py b/bmtk-vb/docs/examples/bio_450cells_exact/plot_spikes.py new file mode 100644 index 0000000..e311f98 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells_exact/plot_spikes.py @@ -0,0 +1,3 @@ +from bmtk.analyzer.visualization.spikes import plot_spikes + +plot_spikes('network/internal_nodes.h5', 'network/internal_node_types.csv', 'output/spikes.h5') diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/rebuild_edge_index.py b/bmtk-vb/docs/examples/bio_450cells_exact/rebuild_edge_index.py new file mode 100644 index 0000000..764204b --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells_exact/rebuild_edge_index.py @@ -0,0 +1,18 @@ +import h5py +import numpy as np + +with h5py.File('network/lgn_v1_edges.h5', 'a') as h5: + node_id_data = np.zeros((449, 2), dtype=np.uint64) + ds = h5['edges/lgn_to_v1/indicies/target_to_source/node_id_to_range'] + node_id_data[0:449, :] = ds + node_id_data[448,:] = [448, 448] + + #print node_id_data + #ds.resize((449, 2)) + #ds[...] = node_id_data + #ds.resize((449, 2)) + del h5['edges/lgn_to_v1/indicies/target_to_source/node_id_to_range'] + + h5.create_dataset('edges/lgn_to_v1/indicies/target_to_source/node_id_to_range', data=node_id_data) + #ary = np.array(h5['edges/lgn_to_v1/indicies/target_to_source/node_id_to_range'][...]) + #print np.append(ary, [[448, 449]]) \ No newline at end of file diff --git a/bmtk-vb/docs/examples/bio_450cells_exact/run_bionet.py b/bmtk-vb/docs/examples/bio_450cells_exact/run_bionet.py new file mode 100644 index 0000000..847ecec --- /dev/null +++ b/bmtk-vb/docs/examples/bio_450cells_exact/run_bionet.py @@ -0,0 +1,21 @@ +"""Simulates an example network of 450 cell receiving two kinds of exernal input as defined in the configuration file""" + + +import sys, os +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + net = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=net) + sim.run() # run simulation + bionet.nrn.quit_execution() # exit + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/examples/bio_basic_features/README.md b/bmtk-vb/docs/examples/bio_basic_features/README.md new file mode 100644 index 0000000..5bbe253 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/README.md @@ -0,0 +1,38 @@ +# BioNet input simulation + +A simple non-connected network of 5 neuron (visual cortex mouse models taken from the Allen Cell-Types +database) network with various inputs including current clamp, external synaptic inputs, and extracellular +electrode stimulation. + +## Building the network. +Network files are stored in network/bio_nodes.h5 and network/bio_node_types.csv. In the same directory you'll +also find network files representing virtual input (virt*). You can rebuild the network by running +```bash +$ python build_network.py +``` + +## Simulations +### Current clamp +```bash +$ python run_bionet.py config_iclamp.json +``` + +Will run a series of current injections into each cell. Current clamp parameters are set in config_iclamp.json +(under the "inputs" section). Output files will by default be written to output_iclamp/. + +### Spike stimulations +```bash +$ python run_bionet.py config_spikes_input.json +``` + +Runs a simulation where each biophysical cells recieve spike trains from external cells. It uses a separate network +(network/virt_node*) with synaptic weight/location set in the files network/virt_bio_edges.h5 and +network/virt_bio_edge_types.csv, with spike trains set in inputs/exc_spike_trains.h5 + +### Extracellular stimulation +```bash +$ python run_bionet.py config_xstim.json +``` + +Runs a simualtion where all the cells are stimulated by a extracellular electrode. Extracell stimulation parameters +are set in config_xstim.json diff --git a/bmtk-vb/docs/examples/bio_basic_features/build_network.py b/bmtk-vb/docs/examples/bio_basic_features/build_network.py new file mode 100644 index 0000000..37998fc --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/build_network.py @@ -0,0 +1,71 @@ +import os +import numpy as np +from bmtk.builder import NetworkBuilder +from bmtk.utils.io.spike_trains import PoissonSpikesGenerator + + +build_virtual_net = True + +cell_models = [ + { + 'model_name': 'Scnn1a', 'ei': 'e', 'morphology': 'Scnn1a_473845048_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '472363762_fit.json', + }, + { + 'model_name': 'Rorb', 'ei': 'e', 'morphology': 'Rorb_325404214_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '473863510_fit.json', + }, + { + 'model_name': 'Nr5a1', 'ei': 'e', 'morphology': 'Nr5a1_471087815_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '473863035_fit.json', + }, + { + 'model_name': 'PV1', 'ei': 'i', 'morphology': 'Pvalb_470522102_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '472912177_fit.json', + }, + { + 'model_name': 'PV2', 'ei': 'i', 'morphology': 'Pvalb_469628681_m.swc', + 'model_template': 'ctdb:Biophys1.hoc', + 'dynamics_params': '473862421_fit.json', + } +] + +bio_net = NetworkBuilder("bio") + +radius = 100.0 +dx = 2*np.pi/float(len(cell_models)) +for i, model_props in enumerate(cell_models): + positions = [(radius*np.cos(i*dx), radius*np.sin(i*dx), 0.0)] # place cells in wheel around origin + + bio_net.add_nodes(model_type='biophysical', model_processing='aibs_perisomatic', positions=positions, + **model_props) + +bio_net.build() +bio_net.save_nodes(output_dir='network') + + +if build_virtual_net: + # Build a separate network of virtual cells to synapse onto the biophysical network + virt_net = NetworkBuilder('virt') + virt_net.add_nodes(N=10, model_type='virtual', ei='e') # 10 excitatory virtual cells + virt_net.add_edges(target=bio_net.nodes(), # Connect every virt cells onto every bio cell + connection_rule=lambda *_: np.random.randint(4, 12), # 4 to 12 synapses per source/target + dynamics_params='AMPA_ExcToExc.json', + model_template='Exp2Syn', + syn_weight=3.4e-4, + delay=2.0, + target_sections=['soma', 'basal', 'apical'], # target soma and all dendritic sections + distance_range=[0.0, 1.0e20]) + + virt_net.build() + virt_net.save(output_dir='network') + + # Create spike trains to use for our virtual cells + if not os.path.exists('inputs'): + os.mkdir('inputs') + psg = PoissonSpikesGenerator(range(10), 10.0, tstop=4000.0) + psg.to_hdf5('inputs/exc_spike_trains.h5') diff --git a/bmtk-vb/docs/examples/bio_basic_features/config_iclamp.json b/bmtk-vb/docs/examples/bio_basic_features/config_iclamp.json new file mode 100644 index 0000000..4183e4e --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/config_iclamp.json @@ -0,0 +1,94 @@ +{ + "network": "./network_config.json", + + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output_iclamp", + "$INPUT_DIR": "$BASE_DIR/inputs", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../biophys_components" + }, + + "run": { + "tstop": 4000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15, + "nsteps_block": 10000 + }, + + "target_simulator":"NEURON", + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "node_sets": { + "biophys_cells": { + "model_type": "biophysical" + } + }, + + "inputs": { + "current_clamp_1": { + "input_type": "current_clamp", + "module": "IClamp", + "node_set": "biophys_cells", + "amp": 0.1500, + "delay": 500.0, + "duration": 500.0 + }, + "current_clamp_2": { + "input_type": "current_clamp", + "module": "IClamp", + "node_set": "biophys_cells", + "amp": 0.1750, + "delay": 1500.0, + "duration": 500.0 + }, + "current_clamp_3": { + "input_type": "current_clamp", + "module": "IClamp", + "node_set": "biophys_cells", + "amp": 0.2000, + "delay": 2500.0, + "duration": 500.0 + } + }, + + "output":{ + "log_file": "log.txt", + "output_dir": "$OUTPUT_DIR", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "spikes_sort_order": "time" + }, + + "components": { + "morphologies_dir": "$COMPONENT_DIR/morphologies", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENT_DIR/biophysical_neuron_templates/nml", + "point_neuron_models_dir": "$COMPONENT_DIR/point_neuron_templates" + }, + + + "reports": { + "calcium_concentration": { + "cells": "biophys_cells", + "variable_name": "cai", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma" + }, + + "membrane_potential": { + "cells": "biophys_cells", + "variable_name": "v", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma" + } + } +} diff --git a/bmtk-vb/docs/examples/bio_basic_features/config_spikes_input.json b/bmtk-vb/docs/examples/bio_basic_features/config_spikes_input.json new file mode 100644 index 0000000..f5933c1 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/config_spikes_input.json @@ -0,0 +1,96 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output_virt", + "$INPUT_DIR": "$BASE_DIR/inputs", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../biophys_components" + }, + + "run": { + "tstop": 4000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15, + "nsteps_block": 10000 + }, + + "target_simulator":"NEURON", + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "node_sets": { + "biophys_cells": { + "model_type": "biophysical" + }, + "virtual_cells": { + "model_type": "virtual" + } + }, + + "inputs": { + "exc_spikes": { + "input_type": "spikes", + "module": "h5", + "input_file": "$INPUT_DIR/exc_spike_trains.h5", + "node_set": "virt" + } + }, + + "output":{ + "log_file": "log.txt", + "output_dir": "$OUTPUT_DIR", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "spikes_sort_order": "time" + }, + + "components": { + "morphologies_dir": "$COMPONENT_DIR/morphologies", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENT_DIR/biophysical_neuron_templates", + "point_neuron_models_dir": "$COMPONENT_DIR/point_neuron_templates" + }, + + "reports": { + "membrane_potential": { + "cells": "biophys_cells", + "variable_name": "v", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma" + }, + + "intracell_ca": { + "cells": "biophys_cells", + "variable_name": "cai", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma" + } + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/bio_nodes.h5", + "node_types_file": "$NETWORK_DIR/bio_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/virt_nodes.h5", + "node_types_file": "$NETWORK_DIR/virt_node_types.csv" + } + ], + + "edges": [ + { + "edges_file": "$NETWORK_DIR/virt_bio_edges.h5", + "edge_types_file": "$NETWORK_DIR/virt_bio_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/bio_basic_features/config_xstim.json b/bmtk-vb/docs/examples/bio_basic_features/config_xstim.json new file mode 100644 index 0000000..205cbac --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/config_xstim.json @@ -0,0 +1,125 @@ +{ + "network": "./network_config.json", + + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output_xstim", + "$INPUT_DIR": "$BASE_DIR/../NWB_files", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../biophys_components", + "$STIM_DIR": "$COMPONENT_DIR/stimulations" + }, + + "run": { + "tstop": 4000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15, + "nsteps_block": 10000 + }, + + "target_simulator":"NEURON", + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "inputs": { + "Extracellular_Stim": { + "input_type": "lfp", + "node_set": "all", + "module": "xstim", + "positions_file": "$STIM_DIR/485058595_0000.csv", + "mesh_files_dir": "$STIM_DIR", + "waveform": { + "shape": "sin", + "del": 1000.0, + "amp": 0.100, + "dur": 2000.0, + "freq": 8.0 + } + } + }, + + "output":{ + "log_file": "log.txt", + "output_dir": "$OUTPUT_DIR", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "spikes_sort_order": "time" + }, + + "components": { + "morphologies_dir": "$COMPONENT_DIR/morphologies", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENT_DIR/biophysical_neuron_templates", + "point_neuron_models_dir": "$COMPONENT_DIR/point_neuron_templates" + }, + + "node_sets": { + "biophys_cells": { + "model_type": "biophysical" + } + }, + + "reports": { + "calcium_concentration": { + "cells": "biophys_cells", + "variable_name": "cai", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + }, + + "membrane_potential": { + "cells": "biophys_cells", + "variable_name": "v", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + }, + + "extracellular": { + "cells": "biophys_cells", + "variable_name": "e_extracellular", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + }, + + "im": { + "cells": "biophys_cells", + "variable_name": "i_membrane", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + }, + + "vext": { + "cells": "biophys_cells", + "variable_name": "vext", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "transform": "first_element", + "enabled": true + }, + + "ecp": { + "cells": "biophys_cells", + "variable_name": "v", + "module": "extracellular", + "electrode_positions": "$COMPONENT_DIR/recXelectrodes/linear_electrode.csv", + "file_name": "ecp.h5", + "electrode_channels": "soma", + "contributions_dir": "ecp_contributions", + "enabled": true + } + } +} diff --git a/bmtk-vb/docs/examples/bio_basic_features/inputs/exc_spike_trains.h5 b/bmtk-vb/docs/examples/bio_basic_features/inputs/exc_spike_trains.h5 new file mode 100644 index 0000000..1a80284 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_basic_features/inputs/exc_spike_trains.h5 differ diff --git a/bmtk-vb/docs/examples/bio_basic_features/network/bio_node_types.csv b/bmtk-vb/docs/examples/bio_basic_features/network/bio_node_types.csv new file mode 100644 index 0000000..9c83f6d --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/network/bio_node_types.csv @@ -0,0 +1,6 @@ +node_type_id ei model_processing model_type model_template morphology dynamics_params model_name +104 i aibs_perisomatic biophysical ctdb:Biophys1.hoc Pvalb_469628681_m.swc 473862421_fit.json PV2 +100 e aibs_perisomatic biophysical ctdb:Biophys1.hoc Scnn1a_473845048_m.swc 472363762_fit.json Scnn1a +101 e aibs_perisomatic biophysical ctdb:Biophys1.hoc Rorb_325404214_m.swc 473863510_fit.json Rorb +102 e aibs_perisomatic biophysical ctdb:Biophys1.hoc Nr5a1_471087815_m.swc 473863035_fit.json Nr5a1 +103 i aibs_perisomatic biophysical ctdb:Biophys1.hoc Pvalb_470522102_m.swc 472912177_fit.json PV1 diff --git a/bmtk-vb/docs/examples/bio_basic_features/network/bio_nodes.h5 b/bmtk-vb/docs/examples/bio_basic_features/network/bio_nodes.h5 new file mode 100644 index 0000000..0a378e2 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_basic_features/network/bio_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_basic_features/network/virt_bio_edge_types.csv b/bmtk-vb/docs/examples/bio_basic_features/network/virt_bio_edge_types.csv new file mode 100644 index 0000000..44f5e10 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/network/virt_bio_edge_types.csv @@ -0,0 +1,2 @@ +edge_type_id target_query source_query syn_weight dynamics_params distance_range delay target_sections model_template +100 * * 0.00034 AMPA_ExcToExc.json "[0.0, 1e+20]" 2.0 "['soma', 'basal', 'apical']" Exp2Syn diff --git a/bmtk-vb/docs/examples/bio_basic_features/network/virt_bio_edges.h5 b/bmtk-vb/docs/examples/bio_basic_features/network/virt_bio_edges.h5 new file mode 100644 index 0000000..ad7b5d3 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_basic_features/network/virt_bio_edges.h5 differ diff --git a/bmtk-vb/docs/examples/bio_basic_features/network/virt_node_types.csv b/bmtk-vb/docs/examples/bio_basic_features/network/virt_node_types.csv new file mode 100644 index 0000000..07b4593 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/network/virt_node_types.csv @@ -0,0 +1,2 @@ +node_type_id model_type ei +100 virtual e diff --git a/bmtk-vb/docs/examples/bio_basic_features/network/virt_nodes.h5 b/bmtk-vb/docs/examples/bio_basic_features/network/virt_nodes.h5 new file mode 100644 index 0000000..be78676 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_basic_features/network/virt_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_basic_features/network_config.json b/bmtk-vb/docs/examples/bio_basic_features/network_config.json new file mode 100644 index 0000000..504b3b5 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/network_config.json @@ -0,0 +1,33 @@ +{ + "manifest": { + "$NETWORK_DIR": "./network", + "$COMPONENT_DIR": "../biophys_components" + }, + + "components": { + "morphologies_dir": "$COMPONENT_DIR/morphologies", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENT_DIR/biophysical_neuron_templates" + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/bio_nodes.h5", + "node_types_file": "$NETWORK_DIR/bio_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/virt_nodes.h5", + "node_types_file": "$NETWORK_DIR/virt_node_types.csv" + } + ], + + "edges": [ + { + "edges_file": "$NETWORK_DIR/virt_bio_edges.h5", + "edge_types_file": "$NETWORK_DIR/virt_bio_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/bio_basic_features/run_bionet.py b/bmtk-vb/docs/examples/bio_basic_features/run_bionet.py new file mode 100644 index 0000000..cde69c5 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_basic_features/run_bionet.py @@ -0,0 +1,48 @@ +"""Simulates an example network of 450 cell receiving two kinds of exernal input as defined in the configuration file""" +import sys +import matplotlib.pyplot as plt +import h5py +import numpy as np + +from bmtk.simulator import bionet + + +def show_cell_var(conf, var_name): + vars_h5 = h5py.File(conf.reports['membrane_potential']['file_name'], 'r') + gids = np.array(vars_h5['/mapping/gids']) + indx_ptrs = np.array(vars_h5['/mapping/index_pointer']) + t_start = vars_h5['/mapping/time'][0] + t_stop = vars_h5['/mapping/time'][1] + dt = vars_h5['/mapping/time'][2] + times = np.linspace(t_start, t_stop, int((t_stop - t_start)/dt)) + var_table = vars_h5[var_name]['data'] + for plot_num, (gid, indx) in enumerate(zip(gids, indx_ptrs)): + plt.subplot(len(gids), 1, plot_num+1) + voltages = np.array(var_table[:, indx]) + plt.plot(times, voltages, label='gid={}'.format(gid)) + plt.legend(loc='upper right') + plt.ylabel('V (mV)') + + plt.xlabel('time (ms)') + plt.show() + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + graph = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=graph) + sim.run() + + show_cell_var(conf, 'v') + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + # Make sure to run only one at a time + run('config_iclamp.json') # Current clamp stimulation + # run('config_xstim.json') # Extracellular electrode stimulation + # run('config_spikes_input.json') # Synaptic stimulation with external virtual cells diff --git a/bmtk-vb/docs/examples/bio_stp_models/build_network.py b/bmtk-vb/docs/examples/bio_stp_models/build_network.py new file mode 100644 index 0000000..0bbb348 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_stp_models/build_network.py @@ -0,0 +1,142 @@ +import os +import sys +from optparse import OptionParser +import numpy as np +import pandas as pd +import h5py + +from bmtk.builder.networks import NetworkBuilder + + +# Create 10 identical cells where 5 of the receive inputs of synaptic type 'a' and 5 of synaptic type 'b'. +# This setup will allow comparing results between two different synaptic types + +firing_rate = [10,20,50,100,200] + +def build_net(): + net = NetworkBuilder("slice") + net.add_nodes(N=5, pop_name='Scnn1a', + synapse_model='a', + firing_rate=firing_rate, + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + dynamics_params='472363762_fit.json', + morphology='Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc', + rotation_angle_zaxis=-3.646878266, + model_processing='aibs_perisomatic,extracellular') + + net.add_nodes(N=5, pop_name='Scnn1a', + synapse_model='b', + firing_rate=firing_rate, + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic,extracellular', + dynamics_params='472363762_fit.json', + morphology='Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc', + rotation_angle_zaxis=-3.646878266) + + + net.build() + net.save_nodes(nodes_file_name='network/slice_nodes.h5', node_types_file_name='network/slice_node_types.csv') + + + return net + + + +# Create 5 external cells each stimulating at different frequency 10,20,50,100,200. +# Connect them to the nodes such that each cell connects to one cell of synaptic type 'a' and one cell of type 'b'. + + +def build_ext5_nodes(): + if not os.path.exists('network'): + os.makedirs('network') + + EXT = NetworkBuilder("EXT") + # need 5 cells to stimulate at 5 different frequencies + EXT.add_nodes(N=5, pop_name='EXT', model_type='virtual', firing_rate=firing_rate) + + # Save cells.csv and cell_types.csv + EXT.save_nodes(nodes_file_name='network/ext_nodes.h5', node_types_file_name='network/ext_node_types.csv') + + net = NetworkBuilder('slice') + net.import_nodes(nodes_file_name='network/slice_nodes.h5', node_types_file_name='network/slice_node_types.csv') + + net.add_edges(source=EXT.nodes(firing_rate=10), target=net.nodes(firing_rate=10,synapse_model='a'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'AMPA_ExcToExc.json', + 'model_template': 'expsyn'})) + + net.add_edges(source=EXT.nodes(firing_rate=20), target=net.nodes(firing_rate=20,synapse_model='a'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'AMPA_ExcToExc.json', + 'model_template': 'expsyn'})) + + net.add_edges(source=EXT.nodes(firing_rate=50), target=net.nodes(firing_rate=50,synapse_model='a'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'AMPA_ExcToExc.json', + 'model_template': 'expsyn'})) + + net.add_edges(source=EXT.nodes(firing_rate=100), target=net.nodes(firing_rate=100,synapse_model='a'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'AMPA_ExcToExc.json', + 'model_template': 'expsyn'})) + + net.add_edges(source=EXT.nodes(firing_rate=200), target=net.nodes(firing_rate=200,synapse_model='a'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'AMPA_ExcToExc.json', + 'model_template': 'expsyn'})) + + + net.add_edges(source=EXT.nodes(firing_rate=10), target=net.nodes(firing_rate=10,synapse_model='b'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'pvalb_pvalb.json', + 'model_template': 'stp2syn'})) + + net.add_edges(source=EXT.nodes(firing_rate=20), target=net.nodes(firing_rate=20,synapse_model='b'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'pvalb_pvalb.json', + 'model_template': 'stp2syn'})) + + net.add_edges(source=EXT.nodes(firing_rate=50), target=net.nodes(firing_rate=50,synapse_model='b'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'pvalb_pvalb.json', + 'model_template': 'stp2syn'})) + + net.add_edges(source=EXT.nodes(firing_rate=100), target=net.nodes(firing_rate=100,synapse_model='b'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'pvalb_pvalb.json', + 'model_template': 'stp2syn'})) + + net.add_edges(source=EXT.nodes(firing_rate=200), target=net.nodes(firing_rate=200,synapse_model='b'), + connection_rule=5, + **({'syn_weight': 0.002, 'weight_function': 'wmax', 'distance_range': [0.0, 50.0], + 'target_sections': ['somatic','basal', 'apical'], 'delay': 2.0, 'dynamics_params': 'pvalb_pvalb.json', + 'model_template': 'stp2syn'})) + + + net.build() + net.save_edges(edges_file_name='network/ext_to_slice_edges.h5', + edge_types_file_name='network/ext_to_slice_edge_types.csv') + + +if __name__ == '__main__': + parser = OptionParser() + parser.add_option("--force-overwrite", dest="force_overwrite", action="store_true", default=False) + parser.add_option("--out-dir", dest="out_dir", default='./output/') + parser.add_option("--percentage", dest="percentage", type="float", default=1.0) + parser.add_option("--with-stats", dest="with_stats", action="store_true", default=False) + (options, args) = parser.parse_args() + + my_network = build_net() + build_ext5_nodes() + diff --git a/bmtk-vb/docs/examples/bio_stp_models/config.json b/bmtk-vb/docs/examples/bio_stp_models/config.json new file mode 100644 index 0000000..c5f51d1 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_stp_models/config.json @@ -0,0 +1,98 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/inputs", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../biophys_components" + }, + + "run": { + "tstop": 2000.0, + "dt": 0.01, + "dL": 20, + "spike_threshold": -15, + "nsteps_block":10000, + "save_cell_vars": ["v","i_membrane"], + "calc_ecp": false + }, + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "node_sets": { + "save_cell_vars": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + }, + + "inputs": { + "external_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$INPUT_DIR/stim_12_pulses.nwb", + "node_set": "EXT", + "trial": "trial_0" + } + }, + + "output": { + "log_file": "log.txt", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "output_dir": "$OUTPUT_DIR" + }, + + "reports": { + "membrane_current": { + "cells": "save_cell_vars", + "variable_name": "i_membrane", + "module": "membrane_report", + "file_name": "i_membrane.h5", + "sections": "soma", + "enabled": true + }, + + "membrane_potential": { + "cells": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "variable_name": "v", + "module": "membrane_report", + "file_name": "voltage.h5", + "sections": "soma", + "enabled": true + } + }, + + "target_simulator":"NEURON", + + "components": { + "morphologies_dir": "$COMPONENT_DIR/morphologies", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENT_DIR/biophysical_neuron_templates", + "point_neuron_models_dir": "$COMPONENT_DIR/point_neuron_templates" + }, + + "networks": { + "nodes": [ + { + "name": "slice", + "nodes_file": "$NETWORK_DIR/slice_nodes.h5", + "node_types_file": "$NETWORK_DIR/slice_node_types.csv" + }, + { + "name": "ext", + "nodes_file": "$NETWORK_DIR/ext_nodes.h5", + "node_types_file": "$NETWORK_DIR/ext_node_types.csv" + } + + ], + + "edges": [ + { + "edges_file": "$NETWORK_DIR/ext_to_slice_edges.h5", + "edge_types_file": "$NETWORK_DIR/ext_to_slice_edge_types.csv" + } + ] + } +} diff --git a/bmtk-vb/docs/examples/bio_stp_models/inputs/stim_12_pulses.nwb b/bmtk-vb/docs/examples/bio_stp_models/inputs/stim_12_pulses.nwb new file mode 100644 index 0000000..6a8ebde Binary files /dev/null and b/bmtk-vb/docs/examples/bio_stp_models/inputs/stim_12_pulses.nwb differ diff --git a/bmtk-vb/docs/examples/bio_stp_models/network/ext_node_types.csv b/bmtk-vb/docs/examples/bio_stp_models/network/ext_node_types.csv new file mode 100644 index 0000000..c18a759 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_stp_models/network/ext_node_types.csv @@ -0,0 +1,2 @@ +node_type_id model_type pop_name +100 virtual EXT diff --git a/bmtk-vb/docs/examples/bio_stp_models/network/ext_nodes.h5 b/bmtk-vb/docs/examples/bio_stp_models/network/ext_nodes.h5 new file mode 100644 index 0000000..5381025 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_stp_models/network/ext_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_stp_models/network/ext_to_slice_edge_types.csv b/bmtk-vb/docs/examples/bio_stp_models/network/ext_to_slice_edge_types.csv new file mode 100644 index 0000000..9348ab5 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_stp_models/network/ext_to_slice_edge_types.csv @@ -0,0 +1,11 @@ +edge_type_id target_query source_query syn_weight dynamics_params distance_range delay target_sections weight_function model_template +100 synapse_model=='a'&firing_rate=='10' firing_rate=='10' 0.002 AMPA_ExcToExc.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax expsyn +101 synapse_model=='a'&firing_rate=='20' firing_rate=='20' 0.002 AMPA_ExcToExc.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax expsyn +102 synapse_model=='a'&firing_rate=='50' firing_rate=='50' 0.002 AMPA_ExcToExc.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax expsyn +103 synapse_model=='a'&firing_rate=='100' firing_rate=='100' 0.002 AMPA_ExcToExc.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax expsyn +104 synapse_model=='a'&firing_rate=='200' firing_rate=='200' 0.002 AMPA_ExcToExc.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax expsyn +105 synapse_model=='b'&firing_rate=='10' firing_rate=='10' 0.002 pvalb_pvalb.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax stp2syn +106 synapse_model=='b'&firing_rate=='20' firing_rate=='20' 0.002 pvalb_pvalb.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax stp2syn +107 synapse_model=='b'&firing_rate=='50' firing_rate=='50' 0.002 pvalb_pvalb.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax stp2syn +108 synapse_model=='b'&firing_rate=='100' firing_rate=='100' 0.002 pvalb_pvalb.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax stp2syn +109 synapse_model=='b'&firing_rate=='200' firing_rate=='200' 0.002 pvalb_pvalb.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" wmax stp2syn diff --git a/bmtk-vb/docs/examples/bio_stp_models/network/ext_to_slice_edges.h5 b/bmtk-vb/docs/examples/bio_stp_models/network/ext_to_slice_edges.h5 new file mode 100644 index 0000000..57c66d9 Binary files /dev/null and b/bmtk-vb/docs/examples/bio_stp_models/network/ext_to_slice_edges.h5 differ diff --git a/bmtk-vb/docs/examples/bio_stp_models/network/slice_node_types.csv b/bmtk-vb/docs/examples/bio_stp_models/network/slice_node_types.csv new file mode 100644 index 0000000..9c380da --- /dev/null +++ b/bmtk-vb/docs/examples/bio_stp_models/network/slice_node_types.csv @@ -0,0 +1,3 @@ +node_type_id synapse_model dynamics_params model_type model_processing pop_name model_template morphology rotation_angle_zaxis +100 a 472363762_fit.json biophysical aibs_perisomatic,extracellular Scnn1a ctdb:Biophys1.hoc Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc -3.646878266 +101 b 472363762_fit.json biophysical aibs_perisomatic,extracellular Scnn1a ctdb:Biophys1.hoc Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc -3.646878266 diff --git a/bmtk-vb/docs/examples/bio_stp_models/network/slice_nodes.h5 b/bmtk-vb/docs/examples/bio_stp_models/network/slice_nodes.h5 new file mode 100644 index 0000000..7bf035a Binary files /dev/null and b/bmtk-vb/docs/examples/bio_stp_models/network/slice_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/bio_stp_models/run_bionet.py b/bmtk-vb/docs/examples/bio_stp_models/run_bionet.py new file mode 100644 index 0000000..86f56a6 --- /dev/null +++ b/bmtk-vb/docs/examples/bio_stp_models/run_bionet.py @@ -0,0 +1,20 @@ +"""Simulates an example network of 450 cell receiving two kinds of exernal input as defined in the configuration file""" +import sys +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + graph = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=graph) + sim.run() + bionet.nrn.quit_execution() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/1606013050101.json b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/1606013050101.json new file mode 100644 index 0000000..6ab6a07 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/1606013050101.json @@ -0,0 +1,295 @@ +{ + "passive": [ + { + "ra": 100 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": null + } + ], + "conditions": [ + { + "celsius": 34, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + }, + { + "ena": 53.0, + "section": "axon", + "ek": -107.0 + }, + { + "ena": 53.0, + "section": "apic", + "ek": -107.0 + }, + { + "ena": 53.0, + "section": "dend", + "ek": -107.0 + } + ], + "v_init": -59 + } + ], + "genome": [ + { + "section": "soma", + "name": "g_pas", + "value": "0.000397417", + "mechanism": "" + }, + { + "section": "soma", + "name": "e_pas", + "value": "-62.9174", + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": "0.00037418", + "mechanism": "" + }, + { + "section": "axon", + "name": "e_pas", + "value": "-65.4473", + "mechanism": "" + }, + { + "section": "apic", + "name": "g_pas", + "value": "5.84396e-05", + "mechanism": "" + }, + { + "section": "apic", + "name": "e_pas", + "value": "-67.1265", + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": "2.80513e-05", + "mechanism": "" + }, + { + "section": "dend", + "name": "e_pas", + "value": "-96.5393", + "mechanism": "" + }, + { + "section": "soma", + "name": "cm", + "value": "2.84314", + "mechanism": "" + }, + { + "section": "soma", + "name": "Ra", + "value": "8245.5", + "mechanism": "" + }, + { + "section": "axon", + "name": "cm", + "value": "3.22425", + "mechanism": "" + }, + { + "section": "axon", + "name": "Ra", + "value": "13834.4", + "mechanism": "" + }, + { + "section": "apic", + "name": "cm", + "value": "1.47624", + "mechanism": "" + }, + { + "section": "apic", + "name": "Ra", + "value": "5213.22", + "mechanism": "" + }, + { + "section": "dend", + "name": "cm", + "value": "2.35427", + "mechanism": "" + }, + { + "section": "dend", + "name": "Ra", + "value": "5160.97", + "mechanism": "" + }, + { + "section": "axon", + "name": "gbar_NaV", + "value": "0.0433212", + "mechanism": "NaV" + }, + { + "section": "axon", + "name": "gbar_K_T", + "value": "0.000972293", + "mechanism": "K_T" + }, + { + "section": "axon", + "name": "gbar_Kd", + "value": "0.00651797", + "mechanism": "Kd" + }, + { + "section": "axon", + "name": "gbar_Kv2like", + "value": "0.0886339", + "mechanism": "Kv2like" + }, + { + "section": "axon", + "name": "gbar_Kv3_1", + "value": "0.67237", + "mechanism": "Kv3_1" + }, + { + "section": "axon", + "name": "gbar_SK", + "value": "0.00852965", + "mechanism": "SK" + }, + { + "section": "axon", + "name": "gbar_Ca_HVA", + "value": "4.04888e-05", + "mechanism": "Ca_HVA" + }, + { + "section": "axon", + "name": "gbar_Ca_LVA", + "value": "0.00392", + "mechanism": "Ca_LVA" + }, + { + "section": "axon", + "name": "gamma_CaDynamics", + "value": "0.0406269", + "mechanism": "CaDynamics" + }, + { + "section": "axon", + "name": "decay_CaDynamics", + "value": "418.504", + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "gbar_NaV", + "value": "0.0324348", + "mechanism": "NaV" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": "0.00301219", + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": "0.0304401", + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": "8.61216e-05", + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": "0.00433744", + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": "0.00205268", + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": "425.364", + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "gbar_Ih", + "value": "8.01907e-07", + "mechanism": "Ih" + }, + { + "section": "apic", + "name": "gbar_NaV", + "value": "0.0285362", + "mechanism": "NaV" + }, + { + "section": "apic", + "name": "gbar_Kv3_1", + "value": "0.872936", + "mechanism": "Kv3_1" + }, + { + "section": "apic", + "name": "gbar_Im_v2", + "value": "0.00999168", + "mechanism": "Im_v2" + }, + { + "section": "apic", + "name": "gbar_Ih", + "value": "6.49377e-06", + "mechanism": "Ih" + }, + { + "section": "dend", + "name": "gbar_NaV", + "value": "0.0492743", + "mechanism": "NaV" + }, + { + "section": "dend", + "name": "gbar_Kv3_1", + "value": "0.833288", + "mechanism": "Kv3_1" + }, + { + "section": "dend", + "name": "gbar_Im_v2", + "value": "0.00587746", + "mechanism": "Im_v2" + }, + { + "section": "dend", + "name": "gbar_Ih", + "value": "9.29793e-06", + "mechanism": "Ih" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/318331342_fit.json b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/318331342_fit.json new file mode 100755 index 0000000..97b5620 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/318331342_fit.json @@ -0,0 +1,297 @@ +{ + "passive": [ + { + "ra": 100 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 40 + ] + } + ], + "conditions": [ + { + "celsius": 34, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + }, + { + "ena": 53.0, + "section": "axon", + "ek": -107.0 + }, + { + "ena": 53.0, + "section": "apic", + "ek": -107.0 + }, + { + "ena": 53.0, + "section": "dend", + "ek": -107.0 + } + ], + "v_init": -90 + } + ], + "genome": [ + { + "section": "soma", + "name": "g_pas", + "value": "0.000764806", + "mechanism": "" + }, + { + "section": "soma", + "name": "e_pas", + "value": "-66.3518", + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": "0.00232156", + "mechanism": "" + }, + { + "section": "axon", + "name": "e_pas", + "value": "-82.7229", + "mechanism": "" + }, + { + "section": "apic", + "name": "g_pas", + "value": "0.00832827", + "mechanism": "" + }, + { + "section": "apic", + "name": "e_pas", + "value": "-103.024", + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": "2.62583e-05", + "mechanism": "" + }, + { + "section": "dend", + "name": "e_pas", + "value": "-60.7887", + "mechanism": "" + }, + { + "section": "soma", + "name": "cm", + "value": "0.503461", + "mechanism": "" + }, + { + "section": "soma", + "name": "Ra", + "value": "73.8606", + "mechanism": "" + }, + { + "section": "axon", + "name": "cm", + "value": "7.69622", + "mechanism": "" + }, + { + "section": "axon", + "name": "Ra", + "value": "149.961", + "mechanism": "" + }, + { + "section": "apic", + "name": "cm", + "value": "4.66701", + "mechanism": "" + }, + { + "section": "apic", + "name": "Ra", + "value": "121.519", + "mechanism": "" + }, + { + "section": "dend", + "name": "cm", + "value": "3.95256", + "mechanism": "" + }, + { + "section": "dend", + "name": "Ra", + "value": "149.679", + "mechanism": "" + }, + { + "section": "axon", + "name": "gbar_NaV", + "value": "0.041089", + "mechanism": "NaV" + }, + { + "section": "axon", + "name": "gbar_K_T", + "value": "0.000906883", + "mechanism": "K_T" + }, + { + "section": "axon", + "name": "gbar_Kd", + "value": "0.00404282", + "mechanism": "Kd" + }, + { + "section": "axon", + "name": "gbar_Kv2like", + "value": "0.0992413", + "mechanism": "Kv2like" + }, + { + "section": "axon", + "name": "gbar_Kv3_1", + "value": "0.596279", + "mechanism": "Kv3_1" + }, + { + "section": "axon", + "name": "gbar_SK", + "value": "4.42405e-05", + "mechanism": "SK" + }, + { + "section": "axon", + "name": "gbar_Ca_HVA", + "value": "4.2059e-06", + "mechanism": "Ca_HVA" + }, + { + "section": "axon", + "name": "gbar_Ca_LVA", + "value": "0.00665643", + "mechanism": "Ca_LVA" + }, + { + "section": "axon", + "name": "gamma_CaDynamics", + "value": "0.0101289", + "mechanism": "CaDynamics" + }, + { + "section": "axon", + "name": "decay_CaDynamics", + "value": "567.065", + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "gbar_NaV", + "value": "0.0412405", + "mechanism": "NaV" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": "0.00324116", + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": "0.98483", + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": "5.78703e-06", + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": "0.00943293", + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": "0.000520642", + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": "200.82", + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "gbar_Ih", + "value": "9.31319e-07", + "mechanism": "Ih" + }, + { + "section": "apic", + "name": "gbar_NaV", + "value": "0.0186745", + "mechanism": "NaV" + }, + { + "section": "apic", + "name": "gbar_Kv3_1", + "value": "0.993747", + "mechanism": "Kv3_1" + }, + { + "section": "apic", + "name": "gbar_Im_v2", + "value": "0.00214984", + "mechanism": "Im_v2" + }, + { + "section": "apic", + "name": "gbar_Ih", + "value": "5.75698e-06", + "mechanism": "Ih" + }, + { + "section": "dend", + "name": "gbar_NaV", + "value": "0.000221756", + "mechanism": "NaV" + }, + { + "section": "dend", + "name": "gbar_Kv3_1", + "value": "0.559915", + "mechanism": "Kv3_1" + }, + { + "section": "dend", + "name": "gbar_Im_v2", + "value": "0.000472366", + "mechanism": "Im_v2" + }, + { + "section": "dend", + "name": "gbar_Ih", + "value": "9.37248e-06", + "mechanism": "Ih" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/472363762_fit.json b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/472363762_fit.json new file mode 100644 index 0000000..99f0eb3 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/472363762_fit.json @@ -0,0 +1,173 @@ +{ + "passive": [ + { + "ra": 138.28, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "apic", + "cm": 2.12 + }, + { + "section": "dend", + "cm": 2.12 + } + ], + "e_pas": -92.49911499023438 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 38 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -92.49911499023438 + } + ], + "genome": [ + { + "value": 0.0012021154978800002, + "section": "soma", + "name": "gbar_Im", + "mechanism": "Im" + }, + { + "value": 4.12225901169e-05, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.98228995892999993, + "section": "soma", + "name": "gbar_NaTs", + "mechanism": "NaTs" + }, + { + "value": 0.000209348990528, + "section": "soma", + "name": "gbar_Nap", + "mechanism": "Nap" + }, + { + "value": 0.051758360920800002, + "section": "soma", + "name": "gbar_K_P", + "mechanism": "K_P" + }, + { + "value": 0.00073160714529799998, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00019222004878899999, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.057264803402699994, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.00053599731839199991, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0070061294358100008, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.0012510775510599999, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 717.91660042899991, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 5.71880766722e-06, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00045738760076499994, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 3.2393273274400003e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 9.5861855476200007e-05, + "section": "apic", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/472912177_fit.json b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/472912177_fit.json new file mode 100644 index 0000000..f06b7f7 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/472912177_fit.json @@ -0,0 +1,163 @@ +{ + "passive": [ + { + "ra": 143.65, + "cm": [ + { + "section": "soma", + "cm": 2.16 + }, + { + "section": "axon", + "cm": 2.16 + }, + { + "section": "dend", + "cm": 2.16 + } + ], + "e_pas": -95.53709411621094 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 55 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -95.53709411621094 + } + ], + "genome": [ + { + "value": 5.1162860430100002e-05, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.058520185129300004, + "section": "soma", + "name": "gbar_NaV", + "mechanism": "NaV" + }, + { + "value": 0.00031192529327399998, + "section": "soma", + "name": "gbar_Kd", + "mechanism": "Kd" + }, + { + "value": 0.051060238264300006, + "section": "soma", + "name": "gbar_Kv2like", + "mechanism": "Kv2like" + }, + { + "value": 0.65076055389700005, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.033385946416300001, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00775048605222, + "section": "soma", + "name": "gbar_Im_v2", + "mechanism": "Im_v2" + }, + { + "value": 0.0027340091995900003, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.00056478972054199987, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0032114779487500003, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.0077204433411699998, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 20.300246788599999, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00026705534351299998, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00066246357111199989, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 9.8019833221899986e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/473862421_fit.json b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/473862421_fit.json new file mode 100644 index 0000000..9a4e6d1 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/473862421_fit.json @@ -0,0 +1,163 @@ +{ + "passive": [ + { + "ra": 138.99, + "cm": [ + { + "section": "soma", + "cm": 1.94 + }, + { + "section": "axon", + "cm": 1.94 + }, + { + "section": "dend", + "cm": 1.94 + } + ], + "e_pas": -88.23363494873047 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 58 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -88.23363494873047 + } + ], + "genome": [ + { + "value": 0.00030357031297000004, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.052161472289300001, + "section": "soma", + "name": "gbar_NaV", + "mechanism": "NaV" + }, + { + "value": 0.0033126476739899998, + "section": "soma", + "name": "gbar_Kd", + "mechanism": "Kd" + }, + { + "value": 0.019206276717599998, + "section": "soma", + "name": "gbar_Kv2like", + "mechanism": "Kv2like" + }, + { + "value": 1.2128893375100001, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 1.4016010650299999e-05, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.0011153668151199999, + "section": "soma", + "name": "gbar_Im_v2", + "mechanism": "Im_v2" + }, + { + "value": 0.048152669735999999, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.0, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.046090335451600004, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 574.74935741900003, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00058689407428699997, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.0009617982321389999, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 4.1690838408899998e-07, + "section": "dend", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/473863035_fit.json b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/473863035_fit.json new file mode 100644 index 0000000..35967ea --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/473863035_fit.json @@ -0,0 +1,173 @@ +{ + "passive": [ + { + "ra": 122.88, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "apic", + "cm": 2.28 + }, + { + "section": "dend", + "cm": 2.28 + } + ], + "e_pas": -89.4614028930664 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 41 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -89.4614028930664 + } + ], + "genome": [ + { + "value": 0.00204889965055, + "section": "soma", + "name": "gbar_Im", + "mechanism": "Im" + }, + { + "value": 3.7269252291999993e-05, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.60927080502300002, + "section": "soma", + "name": "gbar_NaTs", + "mechanism": "NaTs" + }, + { + "value": 6.2161868365100004e-05, + "section": "soma", + "name": "gbar_Nap", + "mechanism": "Nap" + }, + { + "value": 0.018147424450599997, + "section": "soma", + "name": "gbar_K_P", + "mechanism": "K_P" + }, + { + "value": 0.000555828337834, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00041743171143300003, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.12468487969900001, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.00097272189665800009, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0066296509568100001, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.00071152004894800005, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 798.67999240300003, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00054589151280800012, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00021542161812900001, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 6.2827249623699998e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 5.9318998497700001e-06, + "section": "apic", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/473863510_fit.json b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/473863510_fit.json new file mode 100644 index 0000000..e5f322e --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/473863510_fit.json @@ -0,0 +1,173 @@ +{ + "passive": [ + { + "ra": 35.64, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "apic", + "cm": 2.19 + }, + { + "section": "dend", + "cm": 2.19 + } + ], + "e_pas": -85.07815551757812 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 38 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -85.07815551757812 + } + ], + "genome": [ + { + "value": 0.00043788364247700001, + "section": "soma", + "name": "gbar_Im", + "mechanism": "Im" + }, + { + "value": 0.0019922075246600001, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.71282189194800005, + "section": "soma", + "name": "gbar_NaTs", + "mechanism": "NaTs" + }, + { + "value": 0.0012493753876800001, + "section": "soma", + "name": "gbar_Nap", + "mechanism": "Nap" + }, + { + "value": 0.034836377263399998, + "section": "soma", + "name": "gbar_K_P", + "mechanism": "K_P" + }, + { + "value": 0.0166428509042, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00024972209054299998, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.28059766435600003, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.00015339031713199999, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0033469316039000004, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.0040218816981199999, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 991.140696832, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00092865666454699993, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00091423093354899986, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 3.8264043188599994e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 2.11145615996e-06, + "section": "apic", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/485184849_fit.json b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/485184849_fit.json new file mode 100644 index 0000000..c05e518 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/485184849_fit.json @@ -0,0 +1,135 @@ +{ + "passive": [ + { + "ra": 278.352759326, + "cm": [ + { + "section": "soma", + "cm": 0.763348896 + }, + { + "section": "axon", + "cm": 0.763348896 + }, + { + "section": "dend", + "cm": 0.763348896 + } + ], + "e_pas": -88.83442687988281 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 54 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -88.83442687988281 + } + ], + "genome": [ + { + "section": "soma", + "name": "gbar_Ih", + "value": 0.00060694862920317454, + "mechanism": "Ih" + }, + { + "section": "soma", + "name": "gbar_NaV", + "value": 0.042267542278095482, + "mechanism": "NaV" + }, + { + "section": "soma", + "name": "gbar_Kd", + "value": 5.4815485484027704e-10, + "mechanism": "Kd" + }, + { + "section": "soma", + "name": "gbar_Kv2like", + "value": 0.26324329445044736, + "mechanism": "Kv2like" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": 0.39675179033104635, + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_K_T", + "value": 0.090370424020264961, + "mechanism": "K_T" + }, + { + "section": "soma", + "name": "gbar_Im_v2", + "value": 8.5708809383855385e-06, + "mechanism": "Im_v2" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": 0.06289744579899581, + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": 0.00023573910904022699, + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": 0.0078464457214479331, + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": 0.0030773477275872793, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": 20.166547044789194, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "g_pas", + "value": 1.0202261273409942e-07, + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": 0.00080578321219619586, + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": 6.3058734851917982e-05, + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_472363762.cell.nml b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_472363762.cell.nml new file mode 100755 index 0000000..4bf4fb4 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_472363762.cell.nml @@ -0,0 +1,40 @@ + + + + +Export of a cell model (472363762) obtained from the Allen Institute Cell Types Database into NeuroML2 + +****************************************************** +* This export to NeuroML2 has not yet been fully validated!! +* Use with caution!! +****************************************************** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_472912177.cell.nml b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_472912177.cell.nml new file mode 100755 index 0000000..d24a9f5 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_472912177.cell.nml @@ -0,0 +1,39 @@ + + + + + +Export of a cell model (472912177) obtained from the Allen Institute Cell Types Database into NeuroML2 + +****************************************************** +* This export to NeuroML2 has not yet been fully validated!! +* Use with caution!! +****************************************************** + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_473862421.cell.nml b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_473862421.cell.nml new file mode 100755 index 0000000..75f2e39 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_473862421.cell.nml @@ -0,0 +1,39 @@ + + + + + +Export of a cell model (473862421) obtained from the Allen Institute Cell Types Database into NeuroML2 + +****************************************************** +* This export to NeuroML2 has not yet been fully validated!! +* Use with caution!! +****************************************************** + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_473863035.cell.nml b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_473863035.cell.nml new file mode 100755 index 0000000..4d100d6 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_473863035.cell.nml @@ -0,0 +1,41 @@ + + + + + +Export of a cell model (473863035) obtained from the Allen Institute Cell Types Database into NeuroML2 + +****************************************************** +* This export to NeuroML2 has not yet been fully validated!! +* Use with caution!! +****************************************************** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_473863510.cell.nml b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_473863510.cell.nml new file mode 100755 index 0000000..f16ae30 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/biophysical_neuron_templates/nml/Cell_473863510.cell.nml @@ -0,0 +1,43 @@ + + + + + +Export of a cell model (473863510) obtained from the Allen Institute Cell Types Database into NeuroML2 + +Electrophysiology on which this model is based: http://celltypes.brain-map.org/mouse/experiment/electrophysiology/314804042 + +****************************************************** +* This export to NeuroML2 has not yet been fully validated!! +* Use with caution!! +****************************************************** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/CaDynamics.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/CaDynamics.mod new file mode 100644 index 0000000..12af065 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/CaDynamics.mod @@ -0,0 +1,40 @@ +: Dynamics that track inside calcium concentration +: modified from Destexhe et al. 1994 + +NEURON { + SUFFIX CaDynamics + USEION ca READ ica WRITE cai + RANGE decay, gamma, minCai, depth +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + FARADAY = (faraday) (coulombs) + (molar) = (1/liter) + (mM) = (millimolar) + (um) = (micron) +} + +PARAMETER { + gamma = 0.05 : percent of free calcium (not buffered) + decay = 80 (ms) : rate of removal of calcium + depth = 0.1 (um) : depth of shell + minCai = 1e-4 (mM) +} + +ASSIGNED {ica (mA/cm2)} + +INITIAL { + cai = minCai +} + +STATE { + cai (mM) +} + +BREAKPOINT { SOLVE states METHOD cnexp } + +DERIVATIVE states { + cai' = -(10000)*(ica*gamma/(2*FARADAY*depth)) - (cai - minCai)/decay +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Ca_HVA.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Ca_HVA.mod new file mode 100644 index 0000000..84db2d3 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Ca_HVA.mod @@ -0,0 +1,82 @@ +: Reference: Reuveni, Friedman, Amitai, and Gutnick, J.Neurosci. 1993 + +NEURON { + SUFFIX Ca_HVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + UNITSOFF + : if((v == -27) ){ + : v = v+0.0001 + : } + :mAlpha = (0.055*(-27-v))/(exp((-27-v)/3.8) - 1) + mAlpha = 0.055 * vtrap(-27 - v, 3.8) + mBeta = (0.94*exp((-75-v)/17)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + hAlpha = (0.000457*exp((-13-v)/50)) + hBeta = (0.0065/(exp((-v-15)/28)+1)) + hInf = hAlpha/(hAlpha + hBeta) + hTau = 1/(hAlpha + hBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Ca_LVA.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Ca_LVA.mod new file mode 100644 index 0000000..ab151d0 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Ca_LVA.mod @@ -0,0 +1,69 @@ +: Comment: LVA ca channel. Note: mtau is an approximation from the plots +: Reference: Avery and Johnston 1996, tau from Randall 1997 +: Comment: shifted by -10 mv to correct for junction potential +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Ca_LVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + v = v + 10 + mInf = 1.0000/(1+ exp((v - -30.000)/-6)) + mTau = (5.0000 + 20.0000/(1+exp((v - -25.000)/5)))/qt + hInf = 1.0000/(1+ exp((v - -80.000)/6.4)) + hTau = (20.0000 + 50.0000/(1+exp((v - -40.000)/7)))/qt + v = v - 10 + UNITSON +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Ih.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Ih.mod new file mode 100644 index 0000000..73b97d8 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Ih.mod @@ -0,0 +1,71 @@ +: Reference: Kole,Hallermann,and Stuart, J. Neurosci. 2006 + +NEURON { + SUFFIX Ih + NONSPECIFIC_CURRENT ihcn + RANGE gbar, g, ihcn +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + ehcn = -45.0 (mV) +} + +ASSIGNED { + v (mV) + ihcn (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ihcn = g*(v-ehcn) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + : if(v == -154.9){ + : v = v + 0.0001 + : } + :mAlpha = 0.001*6.43*(v+154.9)/(exp((v+154.9)/11.9)-1) + mAlpha = 0.001 * 6.43 * vtrap(v + 154.9, 11.9) + mBeta = 0.001*193*exp(v/33.1) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Im.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Im.mod new file mode 100644 index 0000000..d6112d5 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Im.mod @@ -0,0 +1,62 @@ +: Reference: Adams et al. 1982 - M-currents and other potassium currents in bullfrog sympathetic neurones +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Im + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mAlpha = 3.3e-3*exp(2.5*0.04*(v - -35)) + mBeta = 3.3e-3*exp(-2.5*0.04*(v - -35)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + UNITSON +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Im_v2.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Im_v2.mod new file mode 100644 index 0000000..fc219f7 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Im_v2.mod @@ -0,0 +1,59 @@ +: Based on Im model of Vervaeke et al. (2006) + +NEURON { + SUFFIX Im_v2 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-30)/10) + mAlpha = 0.007 * exp( (6 * 0.4 * (v - (-48))) / 26.12 ) + mBeta = 0.007 * exp( (-6 * (1 - 0.4) * (v - (-48))) / 26.12 ) + + mInf = mAlpha / (mAlpha + mBeta) + mTau = (15 + 1 / (mAlpha + mBeta)) / qt +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/K_P.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/K_P.mod new file mode 100644 index 0000000..0a1238f --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/K_P.mod @@ -0,0 +1,71 @@ +: Comment: The persistent component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + + +NEURON { + SUFFIX K_P + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + tauF = 1 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mInf = 1 / (1 + exp(-(v - (-14.3 + vshift)) / 14.6)) + if (v < -50 + vshift){ + mTau = tauF * (1.25+175.03*exp(-(v - vshift) * -0.026))/qt + } else { + mTau = tauF * (1.25+13*exp(-(v - vshift) * 0.026))/qt + } + hInf = 1/(1 + exp(-(v - (-54 + vshift))/-11)) + hTau = (360+(1010+24*(v - (-55 + vshift)))*exp(-((v - (-75 + vshift))/48)^2))/qt + UNITSON +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/K_T.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/K_T.mod new file mode 100644 index 0000000..c31beaf --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/K_T.mod @@ -0,0 +1,68 @@ +: Comment: The transient component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + +NEURON { + SUFFIX K_T + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + mTauF = 1.0 + hTauF = 1.0 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1/(1 + exp(-(v - (-47 + vshift)) / 29)) + mTau = (0.34 + mTauF * 0.92*exp(-((v+71-vshift)/59)^2))/qt + hInf = 1/(1 + exp(-(v+66-vshift)/-10)) + hTau = (8 + hTauF * 49*exp(-((v+73-vshift)/23)^2))/qt + UNITSON +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Kd.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Kd.mod new file mode 100644 index 0000000..82cbe59 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Kd.mod @@ -0,0 +1,62 @@ +: Based on Kd model of Foust et al. (2011) + + +NEURON { + SUFFIX Kd + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * h + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h' = (hInf - h) / hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-23)/10) + mInf = 1 - 1 / (1 + exp((v - (-43)) / 8)) + mTau = 1 + hInf = 1 / (1 + exp((v - (-67)) / 7.3)) + hTau = 1500 +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Kv2like.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Kv2like.mod new file mode 100644 index 0000000..1cbdf84 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Kv2like.mod @@ -0,0 +1,86 @@ +: Kv2-like channel +: Adapted from model implemented in Keren et al. 2005 +: Adjusted parameters to be similar to guangxitoxin-sensitive current in mouse CA1 pyramids from Liu and Bean 2014 + + +NEURON { + SUFFIX Kv2like + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mAlpha + mBeta + mTau + hInf + h1Tau + h2Tau +} + +STATE { + m + h1 + h2 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * m * (0.5 * h1 + 0.5 * h2) + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h1' = (hInf - h1) / h1Tau + h2' = (hInf - h2) / h2Tau +} + +INITIAL{ + rates() + m = mInf + h1 = hInf + h2 = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mAlpha = 0.12 * vtrap( -(v - 43), 11.0) + mBeta = 0.02 * exp(-(v + 1.27) / 120) + mInf = mAlpha / (mAlpha + mBeta) + mTau = 2.5 * (1 / (qt * (mAlpha + mBeta))) + + hInf = 1/(1 + exp((v + 58) / 11)) + h1Tau = (360 + (1010 + 23.7 * (v + 54)) * exp(-((v + 75) / 48)^2)) / qt + h2Tau = (2350 + 1380 * exp(-0.011 * v) - 210 * exp(-0.03 * v)) / qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Kv3_1.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Kv3_1.mod new file mode 100644 index 0000000..e244657 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Kv3_1.mod @@ -0,0 +1,54 @@ +: Comment: Kv3-like potassium current + +NEURON { + SUFFIX Kv3_1 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + mInf + mTau +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + mInf = 1/(1+exp(((v -(18.700 + vshift))/(-9.700)))) + mTau = 0.2*20.000/(1+exp(((v -(-46.560 + vshift))/(-44.140)))) + UNITSON +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/NaTa.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/NaTa.mod new file mode 100644 index 0000000..fcf7bd3 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/NaTa.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTa + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -48 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -69 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/NaTs.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/NaTs.mod new file mode 100644 index 0000000..f753e71 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/NaTs.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTs + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -40 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -66 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/NaV.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/NaV.mod new file mode 100644 index 0000000..a702395 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/NaV.mod @@ -0,0 +1,186 @@ +TITLE Mouse sodium current +: Kinetics of Carter et al. (2012) +: Based on 37 degC recordings from mouse hippocampal CA1 pyramids + +NEURON { + SUFFIX NaV + USEION na READ ena WRITE ina + RANGE g, gbar +} + +UNITS { + (mV) = (millivolt) + (S) = (siemens) +} + +PARAMETER { + gbar = .015 (S/cm2) + + : kinetic parameters + Con = 0.01 (/ms) : closed -> inactivated transitions + Coff = 40 (/ms) : inactivated -> closed transitions + Oon = 8 (/ms) : open -> Ineg transition + Ooff = 0.05 (/ms) : Ineg -> open transition + alpha = 400 (/ms) + beta = 12 (/ms) + gamma = 250 (/ms) : opening + delta = 60 (/ms) : closing + + alfac = 2.51 + btfac = 5.32 + + : Vdep + x1 = 24 (mV) : Vdep of activation (alpha) + x2 = -24 (mV) : Vdep of deactivation (beta) +} + +ASSIGNED { + + : rates + f01 (/ms) + f02 (/ms) + f03 (/ms) + f04 (/ms) + f0O (/ms) + f11 (/ms) + f12 (/ms) + f13 (/ms) + f14 (/ms) + f1n (/ms) + fi1 (/ms) + fi2 (/ms) + fi3 (/ms) + fi4 (/ms) + fi5 (/ms) + fin (/ms) + + b01 (/ms) + b02 (/ms) + b03 (/ms) + b04 (/ms) + b0O (/ms) + b11 (/ms) + b12 (/ms) + b13 (/ms) + b14 (/ms) + b1n (/ms) + bi1 (/ms) + bi2 (/ms) + bi3 (/ms) + bi4 (/ms) + bi5 (/ms) + bin (/ms) + + v (mV) + ena (mV) + ina (milliamp/cm2) + g (S/cm2) + celsius (degC) +} + +STATE { + C1 FROM 0 TO 1 + C2 FROM 0 TO 1 + C3 FROM 0 TO 1 + C4 FROM 0 TO 1 + C5 FROM 0 TO 1 + I1 FROM 0 TO 1 + I2 FROM 0 TO 1 + I3 FROM 0 TO 1 + I4 FROM 0 TO 1 + I5 FROM 0 TO 1 + O FROM 0 TO 1 + I6 FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE activation METHOD sparse + g = gbar * O + ina = g * (v - ena) +} + +INITIAL { + rates(v) + SOLVE seqinitial +} + +KINETIC activation +{ + rates(v) + ~ C1 <-> C2 (f01,b01) + ~ C2 <-> C3 (f02,b02) + ~ C3 <-> C4 (f03,b03) + ~ C4 <-> C5 (f04,b04) + ~ C5 <-> O (f0O,b0O) + ~ O <-> I6 (fin,bin) + ~ I1 <-> I2 (f11,b11) + ~ I2 <-> I3 (f12,b12) + ~ I3 <-> I4 (f13,b13) + ~ I4 <-> I5 (f14,b14) + ~ I5 <-> I6 (f1n,b1n) + ~ C1 <-> I1 (fi1,bi1) + ~ C2 <-> I2 (fi2,bi2) + ~ C3 <-> I3 (fi3,bi3) + ~ C4 <-> I4 (fi4,bi4) + ~ C5 <-> I5 (fi5,bi5) + + CONSERVE C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +LINEAR seqinitial { : sets initial equilibrium + ~ I1*bi1 + C2*b01 - C1*( fi1+f01) = 0 + ~ C1*f01 + I2*bi2 + C3*b02 - C2*(b01+fi2+f02) = 0 + ~ C2*f02 + I3*bi3 + C4*b03 - C3*(b02+fi3+f03) = 0 + ~ C3*f03 + I4*bi4 + C5*b04 - C4*(b03+fi4+f04) = 0 + ~ C4*f04 + I5*bi5 + O*b0O - C5*(b04+fi5+f0O) = 0 + ~ C5*f0O + I6*bin - O*(b0O+fin) = 0 + + ~ C1*fi1 + I2*b11 - I1*( bi1+f11) = 0 + ~ I1*f11 + C2*fi2 + I3*b12 - I2*(b11+bi2+f12) = 0 + ~ I2*f12 + C3*fi3 + I4*bi3 - I3*(b12+bi3+f13) = 0 + ~ I3*f13 + C4*fi4 + I5*b14 - I4*(b13+bi4+f14) = 0 + ~ I4*f14 + C5*fi5 + I6*b1n - I5*(b14+bi5+f1n) = 0 + + ~ C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +PROCEDURE rates(v(mV) ) +{ + LOCAL qt + qt = 2.3^((celsius-37)/10) + + f01 = qt * 4 * alpha * exp(v/x1) + f02 = qt * 3 * alpha * exp(v/x1) + f03 = qt * 2 * alpha * exp(v/x1) + f04 = qt * 1 * alpha * exp(v/x1) + f0O = qt * gamma + f11 = qt * 4 * alpha * alfac * exp(v/x1) + f12 = qt * 3 * alpha * alfac * exp(v/x1) + f13 = qt * 2 * alpha * alfac * exp(v/x1) + f14 = qt * 1 * alpha * alfac * exp(v/x1) + f1n = qt * gamma + fi1 = qt * Con + fi2 = qt * Con * alfac + fi3 = qt * Con * alfac^2 + fi4 = qt * Con * alfac^3 + fi5 = qt * Con * alfac^4 + fin = qt * Oon + + b01 = qt * 1 * beta * exp(v/x2) + b02 = qt * 2 * beta * exp(v/x2) + b03 = qt * 3 * beta * exp(v/x2) + b04 = qt * 4 * beta * exp(v/x2) + b0O = qt * delta + b11 = qt * 1 * beta * exp(v/x2) / btfac + b12 = qt * 2 * beta * exp(v/x2) / btfac + b13 = qt * 3 * beta * exp(v/x2) / btfac + b14 = qt * 4 * beta * exp(v/x2) / btfac + b1n = qt * delta + bi1 = qt * Coff + bi2 = qt * Coff / (btfac) + bi3 = qt * Coff / (btfac^2) + bi4 = qt * Coff / (btfac^3) + bi5 = qt * Coff / (btfac^4) + bin = qt * Ooff +} + diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Nap.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Nap.mod new file mode 100644 index 0000000..ef8021e --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/Nap.mod @@ -0,0 +1,77 @@ +:Reference : Modeled according to kinetics derived from Magistretti & Alonso 1999 +:Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Nap + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + hInf + hTau + hAlpha + hBeta +} + +STATE { + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + rates() + g = gbar*mInf*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1.0/(1+exp((v- -52.6)/-4.6)) : assuming instantaneous activation as modeled by Magistretti and Alonso + + hInf = 1.0/(1+exp((v- -48.8)/10)) + hAlpha = 2.88e-6 * vtrap(v + 17, 4.63) + hBeta = 6.94e-6 * vtrap(-(v + 64.4), 2.63) + + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/SK.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/SK.mod new file mode 100644 index 0000000..8bfa3b7 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/SK.mod @@ -0,0 +1,56 @@ +: SK-type calcium-activated potassium current +: Reference : Kohler et al. 1996 + +NEURON { + SUFFIX SK + USEION k READ ek WRITE ik + USEION ca READ cai + RANGE gbar, g, ik +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + (mM) = (milli/liter) +} + +PARAMETER { + v (mV) + gbar = .000001 (mho/cm2) + zTau = 1 (ms) + ek (mV) + cai (mM) +} + +ASSIGNED { + zInf + ik (mA/cm2) + g (S/cm2) +} + +STATE { + z FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * z + ik = g * (v - ek) +} + +DERIVATIVE states { + rates(cai) + z' = (zInf - z) / zTau +} + +PROCEDURE rates(ca(mM)) { + if(ca < 1e-7){ + ca = ca + 1e-07 + } + zInf = 1/(1 + (0.00043 / ca)^4.8) +} + +INITIAL { + rates(cai) + z = zInf +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/exp1isyn.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/exp1isyn.mod new file mode 100644 index 0000000..e870040 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/exp1isyn.mod @@ -0,0 +1,52 @@ +COMMENT +Current-based version of the conductance-based model exp1syn (refer to the exp1syn.mod) +In this model the synatic current is defined as i = g*e, whereas in the conductance based model i = g*(v - e). +Since the current is proportional to conductance, this model may be used to report the values of conductance by recording the current. + + +Implemented by Sergey L. Gratiy + +ENDCOMMENT + +NEURON { + POINT_PROCESS exp1isyn + RANGE tau, e, i + NONSPECIFIC_CURRENT i +} + +UNITS { + (nA) = (nanoamp) + (mV) = (millivolt) + (uS) = (microsiemens) +} + +PARAMETER { + tau = 0.1 (ms) <1e-9,1e9> + e = 0 (mV) +} + +ASSIGNED { + v (mV) + i (nA) +} + +STATE { + g (uS) +} + +INITIAL { + g=0 +} + +BREAKPOINT { + SOLVE state METHOD cnexp + i = g*e +} + +DERIVATIVE state { + g' = -g/tau +} + +NET_RECEIVE(weight (uS)) { + g = g + weight +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/exp1syn.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/exp1syn.mod new file mode 100644 index 0000000..6763e68 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/exp1syn.mod @@ -0,0 +1,42 @@ +NEURON { + POINT_PROCESS exp1syn + RANGE tau, e, i + NONSPECIFIC_CURRENT i +} + +UNITS { + (nA) = (nanoamp) + (mV) = (millivolt) + (uS) = (microsiemens) +} + +PARAMETER { + tau = 0.1 (ms) <1e-9,1e9> + e = 0 (mV) +} + +ASSIGNED { + v (mV) + i (nA) +} + +STATE { + g (uS) +} + +INITIAL { + g=0 +} + +BREAKPOINT { + SOLVE state METHOD cnexp + i = g*(v-e) +} + +DERIVATIVE state { + g' = -g/tau +} + +NET_RECEIVE(weight (uS)) { + g = g + weight +} diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp1syn.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp1syn.mod new file mode 100644 index 0000000..3490c58 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp1syn.mod @@ -0,0 +1,75 @@ +COMMENT +A model (# 1 using terminology of Jung Hoon Lee) of a short-term synaptic plasticity. +The magnitude of the peak conductance is found by solving Eqs (3) in Hennig, 2013. "Theoretical models of synaptic short term plasticity. Frontiers in computational neuroscience, 7, p.45." + +State variables: + + n = fraction of available vesicles + +After each spike the magnitude of the peak conductance changes by the factor w*Pmax, where +w is the static synaptic weight and Pmax is the dynamically changing factor that could be interpreted as a probability of a transmitter release by the presynaptic terminal. + +The post_synaptic dynamics of individual synaptic events is modeled by a single exponential synapse with the time constant tau_1 + +Implemented by Sergey L. Gratiy + +ENDCOMMENT + + +NEURON { + POINT_PROCESS stp1syn + RANGE e, i, tau_r, p0, tau_1 + NONSPECIFIC_CURRENT i +} + +UNITS { + (nA) = (nanoamp) + (mV) = (millivolt) + (umho) = (micromho) +} + +PARAMETER { + : e = synaptic reversal potential + e = 0 (mV) + : tau_r = recovery time constant + tau_r = 100 (ms) + : p0 = baseline level of release probability + p0 = 0.3 + : tau_1 = baseline level of release probability + tau_1 = 10 (ms) +} + +ASSIGNED { + v (mV) + i (nA) +} + +STATE { + n + g +} + +INITIAL { + n=1 + g=0 +} + +BREAKPOINT { + SOLVE state METHOD cnexp + i = g*(v - e) +} + +DERIVATIVE state { + n' = (1-n)/tau_r + g' = -g/tau_1 + +} + +NET_RECEIVE(weight (umho)) { + g = g + weight*n*p0 + n = n - n*p0 + + +} + + diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp2syn.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp2syn.mod new file mode 100644 index 0000000..ce1d162 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp2syn.mod @@ -0,0 +1,95 @@ +COMMENT +A model (# 2 using terminology of Jung Hoon Lee) of a short-term synaptic plasticity. +The magnitude of the peak conductance is found by solving Eqs (3,5) in Hennig, 2013. "Theoretical models of synaptic short term plasticity. Frontiers in computational neuroscience, 7, p.45." + +State variables: + + n = fraction of available vesicles + tau_r = time constant for vesicle replenishment + +After each spike the magnitude of the peak conductance changes by the factor w*Pmax, where +w is the static synaptic weight and Pmax is the dynamically changing factor that could be interpreted as a probability of a transmitter release by the presynaptic terminal. + +The post_synaptic dynamics of individual synaptic events is modeled by a single exponential synapse with the time constant tau_1 + +Implemented by Sergey L. Gratiy + +ENDCOMMENT + + + + +NEURON { + POINT_PROCESS stp2syn + RANGE e, i, p0, tau_1, tau_r0, a_FDR, tau_FDR, Pmax + NONSPECIFIC_CURRENT i +} + +UNITS { + (nA) = (nanoamp) + (mV) = (millivolt) + (umho) = (micromho) + (uS) = (microsiemens) + +} + +PARAMETER { + : e = synaptic reversal potential + e = 0 (mV) + + : p0 = baseline level of release probability + p0 = 0.3 + + : tau_1 = baseline level of release probability + tau_1 = 5 (ms) + + : tau_r0 = baseline level of tau_r0 + tau_r0 = 1000 (ms) + + : tau_FDR = time constant for tau_r relaxation + tau_FDR = 1000 (ms) + + : a_FDR = magnitude of tau_r reduction after each spike + a_FDR = 0.5 + + +} + +ASSIGNED { + v (mV) + i (nA) + Pmax +} + +STATE { + n + tau_r + g +} + +INITIAL { + n=1 + tau_r=tau_r0 + g=0 +} + +BREAKPOINT { + SOLVE state METHOD cnexp + i = g*(v - e) + Pmax = n*p0 +} + +DERIVATIVE state { + g' = -g/tau_1 + n' = (1-n)/tau_r + tau_r' = (tau_r0-tau_r)/tau_FDR +} + +NET_RECEIVE(weight (umho)) { + g = g + weight*Pmax + n = n - n*p0 + tau_r = tau_r - a_FDR*tau_r + +} + + diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp3syn.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp3syn.mod new file mode 100644 index 0000000..3186984 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp3syn.mod @@ -0,0 +1,102 @@ +COMMENT +A model (# 3 using terminology of Jung Hoon Lee) of a short-term synaptic plasticity. +The magnitude of the peak conductance is found by solving Eqs (3,5,10) in Hennig, 2013. "Theoretical models of synaptic short term plasticity. Frontiers in computational neuroscience, 7, p.45." + +State variables: + + n = fraction of available vesicles + D = fraction of non-desensitized receptors + tau_r = time constant for vesicle replenishment + +After each spike the magnitude of the peak conductance changes by the factor w*Pmax, where +w is the static synaptic weight and Pmax is the dynamically changing factor that could be interpreted as a probability of a transmitter release by the presynaptic terminal. + +The post_synaptic dynamics of individual synaptic events is modeled by a single exponential synapse with the time constant tau_1 + +Implemented by Sergey L. Gratiy + +ENDCOMMENT + + +NEURON { + POINT_PROCESS stp3syn + RANGE e, i, p0, tau_1, tau_r0, a_FDR, tau_FDR, a_D, tau_D + NONSPECIFIC_CURRENT i +} + +UNITS { + (nA) = (nanoamp) + (mV) = (millivolt) + (umho) = (micromho) +} + +PARAMETER { + : e = synaptic reversal potential + e = 0 (mV) + + : p0 = baseline level of release probability + p0 = 0.3 + + : tau_f = facilitation time constant + tau_f = 1000 (ms) < 0, 1e9 > + + : tau_1 = baseline level of release probability + tau_1 = 10 (ms) + + : tau_r0 = baseline level of tau_r0 + tau_r0 = 1000 (ms) + + : tau_FDR = time constant for tau_r relaxation + tau_FDR = 1000 (ms) + + : a_FDR = magnitude of tau_r reduction after each spike + a_FDR = 0.5 + + : tau_D = relaxation time of D + tau_D = 100 (ms) + + : a_D + a_D = 0.5 + +} + +ASSIGNED { + v (mV) + i (nA) +} + +STATE { + n + tau_r + D + g +} + +INITIAL { + n=1 + tau_r=tau_r0 + g=0 + D=1 +} + +BREAKPOINT { + SOLVE state METHOD cnexp + i = g*(v - e) +} + +DERIVATIVE state { + n' = (1-n)/tau_r + g' = -g/tau_1 + tau_r' = (tau_r0-tau_r)/tau_FDR + D' = (1-D)/tau_D +} + +NET_RECEIVE(weight (umho)) { + g = g + weight*n*p0*D + n = n - n*p0 + tau_r = tau_r - a_FDR*tau_r + D = D - a_D*p0*n*D + +} + + diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp4syn.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp4syn.mod new file mode 100644 index 0000000..1ba964b --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp4syn.mod @@ -0,0 +1,83 @@ +COMMENT +A model (# 4 using terminology of Jung Hoon Lee) of a short-term synaptic plasticity. +The magnitude of the peak conductance is found by +solving Eqs (3,4) in Hennig, 2013. "Theoretical models of synaptic short term plasticity. Frontiers in computational neuroscience, 7, p.45." + +State variables: + + n = fraction of available vesicles + p = release probability + +After each spike the magnitude of the peak conductance changes by the factor w*Pmax, where +w is the static synaptic weight and Pmax is the dynamically changing factor that could be interpreted as a probability of a transmitter release by the presynaptic terminal. + +The post_synaptic dynamics of individual synaptic events is modeled by a single exponential synapse with the time constant tau_1 + +Implemented by Sergey L. Gratiy + +ENDCOMMENT + + + + +NEURON { + POINT_PROCESS stp4syn + RANGE e, i, tau_r, p0, tau_1,tau_f + NONSPECIFIC_CURRENT i +} + +UNITS { + (nA) = (nanoamp) + (mV) = (millivolt) + (umho) = (micromho) +} + +PARAMETER { + : e = synaptic reversal potential + e = 0 (mV) + : tau_r = recovery time constant + tau_r = 100 (ms) + : p0 = baseline level of release probability + p0 = 0.3 + : tau_f = facilitation time constant + tau_f = 1000 (ms) < 0, 1e9 > + : tau_1 = baseline level of release probability + tau_1 = 10 (ms) +} + +ASSIGNED { + v (mV) + i (nA) +} + +STATE { + n + p + g +} + +INITIAL { + n=1 + p=1 + g=0 +} + +BREAKPOINT { + SOLVE state METHOD cnexp + i = g*(v - e) +} + +DERIVATIVE state { + n' = (1-n)/tau_r + g' = -g/tau_1 + p' = 0 +} + +NET_RECEIVE(weight (umho)) { + g = g + weight*n*p0 + n = n - n*p0 + p = p + p0*(1-p) + +} + + diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp5isyn.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp5isyn.mod new file mode 100644 index 0000000..d6b6c10 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp5isyn.mod @@ -0,0 +1,113 @@ +COMMENT +Current-based version of the conductance-based model stp5syn (refer to the stp5syn.mod) +In this model the synatic current is defined as i = g*e, whereas in the conductance based model i = g*(v - e). +Since the current is proportional to conductance, this model may be used to report the values of conductance by recording the current. + +ENDCOMMENT + + +NEURON { + POINT_PROCESS stp5isyn + RANGE e, i, tau_1, tau_r0, a_FDR, tau_FDR, a_D, tau_D, a_i, tau_i, a_f, tau_f, pbtilde, Pmax + NONSPECIFIC_CURRENT i +} + +UNITS { + (nA) = (nanoamp) + (mV) = (millivolt) + (umho) = (micromho) +} + +PARAMETER { + : e = synaptic reversal potential + e = 0 (mV) + + : tau_1 = baseline level of release probability + tau_1 = 10 (ms) + + : tau_r0 = baseline level of tau_r0 + tau_r0 = 1000 (ms) + + : tau_FDR = time constant for tau_r relaxation + tau_FDR = 1000 (ms) + + : a_FDR = amount of tau_r reduction after each spike + a_FDR = 0.5 + + : tau_D = relaxation time of D + tau_D = 100 (ms) + + : a_D = amount of desentization + a_D = 0.5 + + : tau_i = relaxation time for p0 + tau_i = 100 (ms) + + : a_i = amount of decrease of baseline probability after each spike + a_i = 0.5 + + : tau_f = facilitation time constant (relaxation time constant for p) + tau_f = 10 (ms) + + : a_f = amount of facilitation (increase of p after each spike) + a_f = 0.5 + + : pbtilde = baseline level of pb + pbtilde = 0.5 + +} + +ASSIGNED { + v (mV) + i (nA) + Pmax +} + +STATE { + n + p + tau_r + D + pb + g +} + +INITIAL { + n=1 + pb=pbtilde + p=pb + tau_r=tau_r0 + D=1 + g=0 + +} + +BREAKPOINT { + SOLVE state METHOD cnexp +: i = g*(v - e) + i = g*e + Pmax = n*p*D + +} + +DERIVATIVE state { + g' = -g/tau_1 + n' = (1-n)/tau_r + p' = (pb-p)/tau_f + tau_r' = (tau_r0-tau_r)/tau_FDR + D' = (1-D)/tau_D + pb' = (pbtilde-pb)/tau_i + +} + +NET_RECEIVE(weight (umho)) { + g = g + weight*Pmax + n = n - n*p + p = p + a_f*(1-p) + tau_r = tau_r - a_FDR*tau_r + D = D - a_D*p*n*D + pb = pb - a_i*pb + +} + + diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp5syn.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp5syn.mod new file mode 100644 index 0000000..621fe9e --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/stp5syn.mod @@ -0,0 +1,131 @@ +COMMENT +A model (# 5 using terminology of Jung Hoon Lee) of a short-term synaptic plasticity. +The magnitude of the peak conductance is found by solving Eqs (3,4,5,8,10) in Hennig, 2013. "Theoretical models of synaptic short term plasticity. Frontiers in computational neuroscience, 7, p.45." +This file could be used to simulate simpler models by setting to zero the parameters in the unused equations(e.g, a_D,a_i,a_f). + +State variables: + + n = fraction of available vesicles + D = fraction of non-desensitized receptors + tau_r = time constant for vesicle replenishment + pb = baseline vesicle release probability + p = vesicle release probability + +After each spike the magnitude of the peak conductance changes by the factor w*Pmax, where w is the static synaptic weight and Pmax is the activity-dependent factor that could be interpreted as a probability of a transmitter release by the presynaptic terminal. + +The post_synaptic dynamics of individual synaptic events is modeled by a single exponential synapse with the time constant tau_1. + +Implemented by Sergey L. Gratiy, + +ENDCOMMENT + +: Declaring parameters as RANGE allows them to change as a function of a position alogn the cell +NEURON { + POINT_PROCESS stp5syn + RANGE e, i, tau_1, tau_r0, a_FDR, tau_FDR, a_D, tau_D, a_i, tau_i, a_f, tau_f, pbtilde, Pmax + NONSPECIFIC_CURRENT i +} + +UNITS { + (nA) = (nanoamp) + (mV) = (millivolt) + (umho) = (micromho) +} + +: Declaration of the default values of parameters +PARAMETER { + : e = synaptic reversal potential + e = 0 (mV) + + : tau_1 = baseline level of release probability + tau_1 = 10 (ms) + + : tau_r0 = baseline level of tau_r0 + tau_r0 = 1000 (ms) + + : tau_FDR = time constant for tau_r relaxation + tau_FDR = 1000 (ms) + + : a_FDR = amount of tau_r reduction after each spike + a_FDR = 0.5 + + : tau_D = relaxation time of D + tau_D = 100 (ms) + + : a_D = amount of desentization + a_D = 0.5 + + : tau_i = relaxation time for p0 + tau_i = 100 (ms) + + : a_i = amount of decrease of baseline probability after each spike + a_i = 0.5 + + : tau_f = facilitation time constant (relaxation time constant for p) + tau_f = 10 (ms) + + : a_f = amount of facilitation (increase of p after each spike) + a_f = 0.5 + + : pbtilde = baseline level of p0 + pbtilde = 0.5 + +} +: Declaration of dependent and external variables that collectively are called ASSIGNED +ASSIGNED { + v (mV) + i (nA) + Pmax +} + +: Declaration of the state variables +STATE { + n + p + tau_r + D + pb + g +} + +: Initial conditions for the state variables +INITIAL { + n=1 + p=1 + tau_r=tau_r0 + D=1 + pb=pbtilde + g=0 + +} + +: Integration method + assignment statements +BREAKPOINT { + SOLVE state METHOD cnexp + i = g*(v - e) + Pmax = n*p*D +} + +: Definition of teh dynamics between the presynaptic activations +DERIVATIVE state { + n' = (1-n)/tau_r + p' = (pb-p)/tau_f + tau_r' = (tau_r0-tau_r)/tau_FDR + D' = (1-D)/tau_D + pb' = (pbtilde-pb)/tau_i + g' = -g/tau_1 + +} + +: This block defines what happens to the state variables at the moment presynaptic activation +NET_RECEIVE(weight (umho)) { + g = g + weight*Pmax + n = n - n*p + p = p + a_f*(1-p) + tau_r = tau_r - a_FDR*tau_r + D = D - a_D*p*n*D + pb = pb - a_i*pb + +} + + diff --git a/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/vecevent.mod b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/vecevent.mod new file mode 100644 index 0000000..503dfd2 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/mechanisms/modfiles/vecevent.mod @@ -0,0 +1,71 @@ +: Vector stream of events + +NEURON { + ARTIFICIAL_CELL VecStim +} + +ASSIGNED { + index + etime (ms) + space +} + +INITIAL { + index = 0 + element() + if (index > 0) { + net_send(etime - t, 1) + } +} + +NET_RECEIVE (w) { + if (flag == 1) { + net_event(t) + element() + if (index > 0) { + net_send(etime - t, 1) + } + } +} + +VERBATIM +extern double* vector_vec(); +extern int vector_capacity(); +extern void* vector_arg(); +ENDVERBATIM + +PROCEDURE element() { +VERBATIM + { void* vv; int i, size; double* px; + i = (int)index; + if (i >= 0) { + vv = *((void**)(&space)); + if (vv) { + size = vector_capacity(vv); + px = vector_vec(vv); + if (i < size) { + etime = px[i]; + index += 1.; + }else{ + index = -1.; + } + }else{ + index = -1.; + } + } + } +ENDVERBATIM +} + +PROCEDURE play() { +VERBATIM + void** vv; + vv = (void**)(&space); + *vv = (void*)0; + if (ifarg(1)) { + *vv = vector_arg(1); + } +ENDVERBATIM +} + + diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/1606013050101.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/1606013050101.swc new file mode 100644 index 0000000..963b81a --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/1606013050101.swc @@ -0,0 +1,3437 @@ +#name H16 +#comment +##n,type,x,y,z,radius,parent +1 1 466.344 710.867 33.880 10.139 -1 +2 2 468.954 719.829 28.206 1.138 1 +3 2 469.265 720.894 27.571 0.114 2 +4 2 469.575 721.958 26.956 0.114 3 +5 2 469.876 723.024 26.367 0.114 4 +6 2 469.972 724.136 25.823 0.114 5 +7 2 469.778 725.253 25.352 0.114 6 +8 2 469.482 726.352 24.963 0.114 7 +9 2 469.185 727.449 24.642 0.114 8 +10 2 469.080 728.555 24.330 0.114 9 +11 2 469.329 729.669 24.092 0.114 10 +12 2 469.571 730.761 23.936 0.114 11 +13 2 470.430 731.516 23.843 0.114 12 +14 2 471.344 732.193 23.796 0.114 13 +15 2 472.422 732.574 23.788 0.114 14 +16 2 473.538 732.812 23.808 0.114 15 +17 2 474.679 732.882 23.845 0.114 16 +18 2 475.805 733.075 23.898 0.114 17 +19 2 476.883 733.450 23.968 0.114 18 +20 2 477.866 734.018 24.059 0.114 19 +21 2 478.607 734.877 24.191 0.114 20 +22 2 479.226 735.792 24.439 0.114 21 +23 2 479.750 736.797 24.716 0.114 22 +24 2 480.092 737.888 24.976 0.114 23 +25 2 480.289 739.010 25.235 0.114 24 +26 2 480.311 740.154 25.509 0.114 25 +27 2 480.323 741.295 25.822 0.114 26 +28 2 480.308 742.425 26.229 0.114 27 +29 2 480.384 743.431 26.778 0.114 28 +30 2 480.988 743.380 27.605 0.114 29 +31 2 481.850 743.095 28.550 0.114 30 +32 2 482.890 743.248 29.381 0.114 31 +33 2 483.816 743.879 30.015 0.114 32 +34 2 484.541 744.758 30.474 0.114 33 +35 2 485.043 745.777 30.796 0.114 34 +36 2 485.300 746.887 31.033 0.114 35 +37 2 485.412 748.025 31.260 0.114 36 +38 2 485.022 749.039 31.592 0.114 37 +39 2 484.326 749.911 32.043 0.114 38 +40 2 483.429 750.551 32.602 0.114 39 +41 2 482.837 751.103 33.411 0.114 40 +42 2 482.018 751.780 34.238 0.114 41 +43 2 481.155 752.527 34.939 0.114 42 +44 2 480.609 753.462 35.610 0.114 43 +45 2 480.833 754.482 36.259 0.114 44 +46 2 481.168 755.574 36.725 0.114 45 +47 2 481.503 756.668 37.271 0.114 46 +48 3 468.078 701.625 38.658 1.057 1 +49 3 468.491 699.427 39.722 1.030 48 +50 3 468.888 697.205 40.582 1.030 49 +51 3 469.403 695.043 41.541 1.030 50 +52 3 469.692 692.803 42.443 1.030 51 +53 3 469.725 690.537 43.209 1.030 52 +54 3 469.757 688.257 43.777 1.030 53 +55 3 469.432 686.024 44.304 1.030 54 +56 3 468.730 683.851 44.644 1.030 55 +57 3 467.780 681.823 45.076 1.030 56 +58 3 466.329 680.061 45.421 1.030 57 +59 3 465.633 677.887 45.619 1.030 58 +60 3 465.619 675.601 45.725 1.030 59 +61 3 465.992 673.357 45.923 1.030 60 +62 3 466.880 671.252 46.061 1.030 61 +63 3 468.018 669.270 46.123 1.030 62 +64 3 468.994 667.200 46.141 1.030 63 +65 3 470.033 665.163 46.170 1.030 64 +66 3 470.234 662.473 46.255 0.961 65 +67 3 470.105 660.204 46.448 0.961 66 +68 3 469.820 657.937 46.567 0.961 67 +69 3 469.017 655.800 46.592 0.961 68 +70 3 467.877 653.842 46.478 0.961 69 +71 3 467.393 651.934 46.281 0.567 70 +72 3 467.490 650.855 45.470 0.566 71 +73 3 467.291 649.742 45.143 0.565 72 +74 3 466.688 648.773 44.851 0.564 73 +75 3 466.261 647.788 44.481 0.563 74 +76 3 466.355 646.734 44.055 0.563 75 +77 3 466.489 645.602 43.772 0.562 76 +78 3 466.523 644.466 43.641 0.561 77 +79 3 466.555 643.324 43.583 0.561 78 +80 3 466.475 642.183 43.566 0.560 79 +81 3 466.347 641.048 43.578 0.559 80 +82 3 466.088 639.934 43.592 0.559 81 +83 3 465.937 638.808 43.581 0.558 82 +84 3 466.043 637.670 43.551 0.557 83 +85 3 466.061 636.530 43.502 0.557 84 +86 3 465.969 635.397 43.413 0.556 85 +87 3 465.921 634.266 43.295 0.555 86 +88 3 465.792 633.131 43.208 0.555 87 +89 3 465.765 631.988 43.173 0.554 88 +90 3 465.902 630.857 43.192 0.553 89 +91 3 466.199 629.751 43.265 0.553 90 +92 3 466.456 628.642 43.404 0.552 91 +93 3 466.543 627.526 43.656 0.551 92 +94 3 466.593 626.437 44.025 0.551 93 +95 3 466.753 625.312 44.401 0.550 94 +96 3 466.814 624.185 44.769 0.549 95 +97 3 466.631 623.086 45.171 0.549 96 +98 3 466.366 621.993 45.559 0.548 97 +99 3 466.227 620.861 45.871 0.547 98 +100 3 466.291 619.723 46.125 0.547 99 +101 3 466.539 618.608 46.357 0.546 100 +102 3 466.902 617.530 46.607 0.545 101 +103 3 467.329 616.505 46.928 0.545 102 +104 3 467.621 615.479 47.354 0.544 103 +105 3 467.719 614.357 47.784 0.543 104 +106 3 467.902 613.230 48.157 0.543 105 +107 3 468.128 612.120 48.512 0.542 106 +108 3 468.399 611.038 48.868 0.541 107 +109 3 468.730 609.956 49.167 0.541 108 +110 3 468.706 608.845 49.429 0.540 109 +111 3 468.287 607.795 49.677 0.539 110 +112 3 467.786 606.767 49.865 0.539 111 +113 3 467.461 605.707 49.985 0.538 112 +114 3 467.599 604.573 50.053 0.537 113 +115 3 467.906 603.478 50.087 0.536 114 +116 3 468.309 602.416 50.096 0.536 115 +117 3 468.546 601.298 50.089 0.535 116 +118 3 468.817 600.188 50.078 0.534 117 +119 3 469.003 599.059 50.061 0.534 118 +120 3 469.272 597.956 50.036 0.533 119 +121 3 469.696 596.897 50.002 0.532 120 +122 3 469.923 595.781 49.959 0.532 121 +123 3 470.038 594.648 49.906 0.531 122 +124 3 470.203 593.545 49.800 0.530 123 +125 3 470.123 592.452 49.617 0.530 124 +126 3 469.906 591.331 49.496 0.529 125 +127 3 469.675 590.216 49.438 0.528 126 +128 3 469.472 589.089 49.403 0.528 127 +129 3 469.303 587.959 49.381 0.527 128 +130 3 469.236 586.818 49.369 0.526 129 +131 3 469.265 585.675 49.355 0.526 130 +132 3 469.381 584.544 49.311 0.525 131 +133 3 469.636 583.433 49.223 0.524 132 +134 3 469.821 582.312 49.125 0.524 133 +135 3 469.887 581.169 49.052 0.523 134 +136 3 470.000 580.033 49.003 0.522 135 +137 3 470.215 578.910 48.976 0.522 136 +138 3 470.507 577.807 48.970 0.521 137 +139 3 470.960 576.759 48.982 0.520 138 +140 3 471.353 575.705 49.004 0.520 139 +141 3 471.470 574.567 49.033 0.519 140 +142 3 471.489 573.430 49.080 0.518 141 +143 3 471.363 572.296 49.155 0.518 142 +144 3 471.232 571.163 49.243 0.517 143 +145 3 471.090 570.028 49.318 0.516 144 +146 3 470.920 568.897 49.368 0.516 145 +147 3 470.647 567.790 49.397 0.515 146 +148 3 470.157 566.770 49.397 0.514 147 +149 3 469.434 565.894 49.354 0.514 148 +150 3 468.674 565.049 49.300 0.513 149 +151 3 468.109 564.072 49.293 0.512 150 +152 3 467.834 562.974 49.354 0.512 151 +153 3 467.740 561.840 49.457 0.511 152 +154 3 467.683 560.698 49.574 0.510 153 +155 3 467.573 559.567 49.726 0.510 154 +156 3 467.620 558.450 49.886 0.509 155 +157 3 467.885 557.337 50.008 0.508 156 +158 3 467.984 556.207 50.096 0.508 157 +159 3 467.875 555.070 50.163 0.507 158 +160 3 467.705 553.939 50.216 0.506 159 +161 3 467.652 552.805 50.268 0.505 160 +162 3 467.791 551.670 50.329 0.505 161 +163 3 468.113 550.584 50.408 0.504 162 +164 3 468.373 549.502 50.504 0.503 163 +165 3 468.455 548.412 50.690 0.503 164 +166 3 468.582 547.338 50.980 0.502 165 +167 3 468.570 546.205 51.250 0.501 166 +168 3 468.593 545.064 51.453 0.501 167 +169 3 468.733 543.930 51.595 0.500 168 +170 3 468.920 542.802 51.681 0.499 169 +171 3 469.132 541.677 51.715 0.499 170 +172 3 469.392 540.564 51.717 0.498 171 +173 3 469.692 539.460 51.709 0.497 172 +174 3 469.992 538.356 51.699 0.497 173 +175 3 470.193 537.234 51.685 0.496 174 +176 3 470.146 536.100 51.664 0.495 175 +177 3 470.114 534.964 51.634 0.495 176 +178 3 470.378 533.864 51.594 0.494 177 +179 3 470.845 532.820 51.546 0.493 178 +180 3 471.207 531.747 51.467 0.493 179 +181 3 471.285 530.632 51.327 0.492 180 +182 3 471.424 529.519 51.165 0.491 181 +183 3 471.836 528.461 51.042 0.491 182 +184 3 472.483 527.526 50.977 0.490 183 +185 3 473.278 526.707 50.971 0.489 184 +186 3 473.998 525.846 51.072 0.488 185 +187 3 474.620 524.910 51.259 0.488 186 +188 3 475.108 523.885 51.441 0.487 187 +189 3 475.486 522.806 51.584 0.487 188 +190 3 475.740 521.693 51.687 0.486 189 +191 3 475.946 520.567 51.755 0.485 190 +192 3 476.120 519.437 51.797 0.484 191 +193 3 476.283 518.304 51.827 0.484 192 +194 3 476.501 517.182 51.862 0.483 193 +195 3 476.770 516.070 51.907 0.482 194 +196 3 477.226 515.033 51.987 0.482 195 +197 3 477.766 514.030 52.104 0.481 196 +198 3 478.134 512.957 52.222 0.480 197 +199 3 478.397 511.843 52.327 0.480 198 +200 3 478.599 510.718 52.420 0.479 199 +201 3 478.626 509.581 52.526 0.478 200 +202 3 478.568 508.443 52.652 0.478 201 +203 3 478.543 507.301 52.785 0.477 202 +204 3 478.645 506.165 52.911 0.476 203 +205 3 478.965 505.073 53.029 0.476 204 +206 3 479.284 503.977 53.156 0.475 205 +207 3 479.399 502.857 53.327 0.474 206 +208 3 479.448 501.731 53.540 0.474 207 +209 3 479.698 500.627 53.732 0.473 208 +210 3 479.954 499.514 53.883 0.472 209 +211 3 480.123 498.382 54.003 0.472 210 +212 3 480.183 497.242 54.094 0.471 211 +213 3 480.243 496.099 54.163 0.470 212 +214 3 480.351 494.961 54.225 0.470 213 +215 3 480.467 493.867 54.380 0.469 214 +216 3 480.661 492.759 54.548 0.468 215 +217 3 480.901 491.642 54.658 0.468 216 +218 3 481.147 490.527 54.713 0.467 217 +219 3 481.295 489.395 54.736 0.466 218 +220 3 481.324 488.252 54.751 0.466 219 +221 3 481.482 487.123 54.771 0.465 220 +222 3 481.753 486.012 54.815 0.464 221 +223 3 482.091 484.920 54.890 0.464 222 +224 3 482.301 483.809 55.037 0.463 223 +225 3 482.420 482.691 55.259 0.462 224 +226 3 482.527 481.575 55.532 0.462 225 +227 3 482.596 480.440 55.789 0.461 226 +228 3 482.655 479.298 55.987 0.460 227 +229 3 482.980 478.213 56.120 0.460 228 +230 3 483.330 477.125 56.206 0.459 229 +231 3 483.629 476.024 56.260 0.458 230 +232 3 483.920 474.920 56.295 0.458 231 +233 3 484.071 473.800 56.250 0.457 232 +234 3 484.163 472.676 56.125 0.456 233 +235 3 484.318 471.555 55.959 0.456 234 +236 3 484.545 470.440 55.789 0.455 235 +237 3 484.795 469.326 55.665 0.454 236 +238 3 485.055 468.214 55.624 0.454 237 +239 3 485.317 467.104 55.666 0.453 238 +240 3 485.728 466.046 55.779 0.452 239 +241 3 486.217 465.019 55.933 0.451 240 +242 3 486.858 464.077 56.071 0.451 241 +243 3 487.533 463.154 56.174 0.450 242 +244 3 488.145 462.192 56.264 0.450 243 +245 3 488.737 461.218 56.344 0.449 244 +246 3 489.423 460.308 56.367 0.448 245 +247 3 490.159 459.437 56.324 0.447 246 +248 3 490.817 458.512 56.232 0.447 247 +249 3 491.407 457.541 56.108 0.446 248 +250 3 491.599 456.435 56.001 0.445 249 +251 3 491.635 455.293 55.931 0.445 250 +252 3 491.175 454.282 55.932 0.444 251 +253 3 490.570 453.318 55.996 0.443 252 +254 3 490.235 452.237 56.074 0.443 253 +255 3 490.421 451.131 56.143 0.442 254 +256 3 490.942 450.117 56.195 0.441 255 +257 3 491.513 449.125 56.228 0.441 256 +258 3 492.093 448.139 56.245 0.440 257 +259 3 492.767 447.216 56.253 0.439 258 +260 3 493.463 446.309 56.260 0.439 259 +261 3 494.100 445.359 56.270 0.438 260 +262 3 494.717 444.395 56.285 0.437 261 +263 3 495.208 443.364 56.305 0.437 262 +264 3 495.632 442.301 56.333 0.436 263 +265 3 496.048 441.235 56.374 0.435 264 +266 3 496.464 440.170 56.427 0.435 265 +267 3 496.880 439.104 56.495 0.434 266 +268 3 497.312 438.050 56.613 0.433 267 +269 3 497.750 437.006 56.786 0.433 268 +270 3 498.188 435.962 56.998 0.432 269 +271 3 498.417 434.847 57.184 0.431 270 +272 3 498.607 433.719 57.336 0.431 271 +273 3 498.807 432.593 57.460 0.430 272 +274 3 499.014 431.468 57.557 0.429 273 +275 3 499.195 430.340 57.654 0.429 274 +276 3 499.260 429.231 57.827 0.428 275 +277 3 499.255 428.096 58.009 0.427 276 +278 3 499.211 426.955 58.142 0.427 277 +279 3 499.133 425.813 58.220 0.426 278 +280 3 499.022 424.674 58.241 0.425 279 +281 3 499.065 423.533 58.208 0.425 280 +282 3 499.206 422.398 58.127 0.424 281 +283 3 499.450 421.295 57.957 0.423 282 +284 3 499.711 420.198 57.715 0.423 283 +285 3 500.016 419.100 57.463 0.422 284 +286 3 500.318 417.997 57.233 0.421 285 +287 3 500.232 416.882 56.966 0.420 286 +288 3 500.102 415.764 56.676 0.420 287 +289 3 499.889 414.643 56.440 0.419 288 +290 3 499.659 413.522 56.259 0.418 289 +291 3 499.436 412.401 56.110 0.418 290 +292 3 499.247 411.274 55.965 0.417 291 +293 3 499.061 410.148 55.824 0.416 292 +294 3 498.911 409.017 55.680 0.416 293 +295 3 498.924 407.878 55.523 0.415 294 +296 3 498.952 406.738 55.360 0.414 295 +297 3 499.067 405.601 55.220 0.414 296 +298 3 499.215 404.467 55.110 0.413 297 +299 3 499.422 403.342 55.022 0.412 298 +300 3 499.657 402.222 54.950 0.412 299 +301 3 499.906 401.106 54.881 0.411 300 +302 3 500.244 400.035 54.746 0.410 301 +303 3 500.619 398.972 54.566 0.410 302 +304 3 501.206 398.002 54.459 0.409 303 +305 3 501.739 397.005 54.424 0.408 304 +306 3 502.125 395.957 54.460 0.408 305 +307 3 502.290 394.830 54.437 0.407 306 +308 3 502.199 393.751 54.246 0.406 307 +309 3 501.877 392.694 53.948 0.406 308 +310 3 501.431 391.669 53.585 0.405 309 +311 3 501.258 390.540 53.255 0.404 310 +312 3 501.184 389.398 52.996 0.404 311 +313 3 501.145 388.256 52.813 0.403 312 +314 3 501.594 387.207 52.672 0.402 313 +315 3 502.042 386.157 52.553 0.402 314 +316 3 502.487 385.106 52.440 0.401 315 +317 3 502.724 383.987 52.350 0.400 316 +318 3 502.950 382.866 52.274 0.400 317 +319 3 503.079 381.730 52.210 0.399 318 +320 3 502.880 380.603 52.151 0.398 319 +321 3 502.840 379.460 52.084 0.398 320 +322 3 502.587 378.348 51.999 0.397 321 +323 3 501.949 377.399 51.886 0.396 322 +324 3 501.343 376.458 51.731 0.396 323 +325 3 501.532 375.356 51.460 0.395 324 +326 3 501.690 374.244 51.111 0.394 325 +327 3 501.747 373.106 50.739 0.393 326 +328 3 501.756 371.974 50.347 0.393 327 +329 3 501.459 370.894 49.906 0.392 328 +330 3 501.213 369.806 49.436 0.391 329 +331 3 501.213 368.691 48.949 0.391 330 +332 3 501.377 367.572 48.479 0.390 331 +333 3 501.552 366.493 48.056 0.389 332 +334 3 501.011 365.502 47.627 0.389 333 +335 3 500.558 364.460 47.224 0.388 334 +336 3 500.008 363.496 46.749 0.387 335 +337 3 499.526 362.474 46.239 0.387 336 +338 3 499.101 361.435 45.680 0.386 337 +339 3 498.675 360.443 45.032 0.385 338 +340 3 498.307 359.511 44.259 0.385 339 +341 3 497.986 358.487 43.463 0.384 340 +342 3 497.717 357.398 42.733 0.383 341 +343 3 497.484 356.282 42.108 0.383 342 +344 3 497.394 355.189 41.562 0.382 343 +345 3 497.550 354.226 40.950 0.381 344 +346 3 497.004 353.300 40.339 0.381 345 +347 3 496.326 352.394 39.811 0.380 346 +348 3 495.772 351.468 39.262 0.379 347 +349 3 495.690 350.358 38.777 0.379 348 +350 3 496.156 349.358 38.353 0.378 349 +351 3 496.852 348.514 37.906 0.377 350 +352 3 497.135 347.523 37.401 0.376 351 +353 3 497.052 346.408 36.926 0.376 352 +354 3 496.546 345.451 36.544 0.375 353 +355 3 495.696 344.693 36.197 0.374 354 +356 3 494.901 343.886 35.861 0.374 355 +357 3 494.174 343.030 35.509 0.373 356 +358 3 493.343 342.287 35.125 0.372 357 +359 3 492.430 341.610 34.763 0.372 358 +360 3 491.809 340.839 34.306 0.371 359 +361 3 491.149 339.997 33.848 0.370 360 +362 3 490.275 339.267 33.487 0.370 361 +363 3 489.320 338.639 33.217 0.369 362 +364 3 488.411 337.947 33.018 0.368 363 +365 3 487.656 337.093 32.870 0.368 364 +366 3 487.198 336.134 32.644 0.367 365 +367 3 487.042 335.039 32.390 0.366 366 +368 3 487.066 333.906 32.230 0.365 367 +369 3 487.028 332.764 32.124 0.365 368 +370 3 486.894 331.628 32.057 0.364 369 +371 3 486.663 330.508 32.025 0.363 370 +372 3 486.408 329.394 32.019 0.363 371 +373 3 485.987 328.333 32.011 0.362 372 +374 3 485.880 327.208 32.017 0.361 373 +375 3 485.865 326.070 32.031 0.361 374 +376 3 485.789 324.939 31.962 0.360 375 +377 3 485.702 323.810 31.812 0.359 376 +378 3 485.567 322.685 31.611 0.359 377 +379 3 485.313 321.575 31.389 0.358 378 +380 3 485.041 320.469 31.159 0.357 379 +381 3 484.646 319.397 30.964 0.357 380 +382 3 483.947 318.501 30.813 0.356 381 +383 3 483.047 317.799 30.691 0.355 382 +384 3 482.304 316.946 30.535 0.355 383 +385 3 481.666 316.023 30.328 0.354 384 +386 3 481.192 314.988 30.129 0.353 385 +387 3 480.823 313.906 29.971 0.353 386 +388 3 480.557 312.794 29.852 0.352 387 +389 3 480.371 311.665 29.768 0.351 388 +390 3 480.243 310.528 29.719 0.351 389 +391 3 480.554 309.441 29.653 0.350 390 +392 3 480.995 308.390 29.573 0.349 391 +393 3 481.646 307.452 29.522 0.348 392 +394 3 482.140 306.423 29.519 0.348 393 +395 3 482.457 305.330 29.575 0.347 394 +396 3 482.522 304.191 29.658 0.347 395 +397 3 482.322 303.065 29.737 0.346 396 +398 3 482.137 301.936 29.807 0.345 397 +399 3 482.012 300.799 29.864 0.344 398 +400 3 482.206 299.672 29.912 0.344 399 +401 3 482.476 298.560 29.966 0.343 400 +402 3 482.868 297.485 30.033 0.343 401 +403 3 483.172 296.382 30.111 0.342 402 +404 3 483.417 295.265 30.206 0.341 403 +405 3 483.645 294.162 30.373 0.340 404 +406 3 484.084 293.132 30.929 0.340 405 +407 3 466.685 652.286 46.458 0.687 70 +408 3 465.224 650.599 46.137 0.565 407 +409 3 464.383 649.822 46.047 0.564 408 +410 3 463.583 649.010 46.028 0.564 409 +411 3 463.023 648.051 46.124 0.563 410 +412 3 462.654 646.984 46.303 0.562 411 +413 3 462.410 645.869 46.483 0.561 412 +414 3 462.230 644.741 46.642 0.561 413 +415 3 462.087 643.609 46.777 0.560 414 +416 3 462.010 642.469 46.860 0.559 415 +417 3 462.004 641.329 46.869 0.559 416 +418 3 461.955 640.188 46.832 0.558 417 +419 3 461.793 639.058 46.790 0.557 418 +420 3 461.637 637.925 46.754 0.556 419 +421 3 461.554 636.785 46.730 0.556 420 +422 3 461.522 635.641 46.722 0.555 421 +423 3 461.566 634.499 46.730 0.554 422 +424 3 461.655 633.358 46.750 0.553 423 +425 3 461.715 632.216 46.781 0.553 424 +426 3 461.729 631.073 46.824 0.552 425 +427 3 461.746 629.929 46.884 0.551 426 +428 3 461.820 628.787 46.961 0.551 427 +429 3 461.977 627.657 47.074 0.550 428 +430 3 462.216 626.554 47.261 0.549 429 +431 3 462.409 625.443 47.508 0.548 430 +432 3 462.412 624.307 47.753 0.548 431 +433 3 462.231 623.180 47.984 0.547 432 +434 3 461.729 622.166 48.212 0.546 433 +435 3 461.177 621.163 48.446 0.545 434 +436 3 460.921 620.066 48.731 0.545 435 +437 3 460.866 618.986 49.157 0.544 436 +438 3 460.948 617.937 49.725 0.543 437 +439 3 461.048 616.853 50.352 0.543 438 +440 3 460.932 615.747 50.957 0.542 439 +441 3 460.835 614.635 51.523 0.541 440 +442 3 461.016 613.549 52.041 0.540 441 +443 3 461.477 612.512 52.408 0.540 442 +444 3 461.975 611.483 52.642 0.539 443 +445 3 461.992 610.356 52.781 0.538 444 +446 3 461.917 609.214 52.858 0.537 445 +447 3 461.596 608.122 52.895 0.537 446 +448 3 461.213 607.044 52.913 0.536 447 +449 3 460.776 605.986 52.933 0.535 448 +450 3 460.350 604.924 52.962 0.534 449 +451 3 460.169 603.800 53.003 0.534 450 +452 3 460.643 602.788 53.060 0.533 451 +453 3 461.386 601.920 53.141 0.532 452 +454 3 462.051 600.990 53.251 0.532 453 +455 3 462.533 599.954 53.396 0.531 454 +456 3 462.915 598.884 53.622 0.530 455 +457 3 463.200 597.805 53.959 0.529 456 +458 3 463.242 596.693 54.383 0.529 457 +459 3 463.177 595.582 54.864 0.528 458 +460 3 462.748 594.552 55.363 0.527 459 +461 3 462.293 593.530 55.856 0.526 460 +462 3 461.837 592.496 56.297 0.526 461 +463 3 461.381 591.461 56.683 0.525 462 +464 3 461.138 590.350 56.996 0.524 463 +465 3 461.254 589.211 57.212 0.523 464 +466 3 461.368 588.073 57.361 0.523 465 +467 3 461.472 586.934 57.464 0.522 466 +468 3 461.573 585.794 57.541 0.521 467 +469 3 461.673 584.655 57.607 0.521 468 +470 3 461.765 583.546 57.765 0.520 469 +471 3 461.805 582.414 57.953 0.519 470 +472 3 461.717 581.278 58.064 0.518 471 +473 3 461.661 580.140 58.124 0.518 472 +474 3 461.762 579.000 58.179 0.517 473 +475 3 462.107 577.910 58.237 0.516 474 +476 3 462.445 576.817 58.323 0.515 475 +477 3 462.765 575.728 58.478 0.515 476 +478 3 462.737 574.585 58.671 0.514 477 +479 3 462.543 573.460 58.882 0.513 478 +480 3 462.547 572.340 59.172 0.513 479 +481 3 462.559 571.220 59.515 0.512 480 +482 3 462.621 570.107 59.891 0.511 481 +483 3 462.554 568.980 60.247 0.510 482 +484 3 462.242 567.879 60.520 0.510 483 +485 3 461.806 566.822 60.724 0.509 484 +486 3 461.268 565.813 60.871 0.508 485 +487 3 460.720 564.809 60.987 0.508 486 +488 3 460.187 563.801 61.095 0.507 487 +489 3 459.990 562.684 61.256 0.506 488 +490 3 460.004 561.558 61.488 0.505 489 +491 3 460.017 560.431 61.764 0.505 490 +492 3 460.040 559.298 62.051 0.504 491 +493 3 460.100 558.156 62.281 0.503 492 +494 3 460.174 557.016 62.463 0.502 493 +495 3 460.373 555.889 62.606 0.502 494 +496 3 460.587 554.766 62.731 0.501 495 +497 3 460.828 553.649 62.880 0.500 496 +498 3 461.073 552.535 63.070 0.500 497 +499 3 461.321 551.421 63.309 0.499 498 +500 3 461.609 550.317 63.601 0.498 499 +501 3 461.893 549.217 63.945 0.497 500 +502 3 462.119 548.133 64.383 0.497 501 +503 3 462.319 547.078 64.920 0.496 502 +504 3 462.660 546.061 65.517 0.495 503 +505 3 463.008 545.027 66.107 0.494 504 +506 3 463.266 543.914 66.558 0.494 505 +507 3 463.547 542.807 66.912 0.493 506 +508 3 463.829 541.703 67.182 0.492 507 +509 3 464.093 540.591 67.360 0.491 508 +510 3 464.356 539.478 67.470 0.491 509 +511 3 464.658 538.374 67.546 0.490 510 +512 3 465.002 537.284 67.615 0.489 511 +513 3 465.438 536.226 67.686 0.489 512 +514 3 465.900 535.182 67.771 0.488 513 +515 3 466.482 534.197 67.878 0.487 514 +516 3 467.019 533.230 68.023 0.486 515 +517 3 466.841 532.144 68.295 0.486 516 +518 3 466.512 531.096 68.653 0.485 517 +519 3 465.957 530.099 68.982 0.484 518 +520 3 465.440 529.091 69.273 0.483 519 +521 3 465.218 527.974 69.557 0.483 520 +522 3 465.009 526.857 69.830 0.482 521 +523 3 464.848 525.739 70.104 0.481 522 +524 3 464.694 524.618 70.380 0.481 523 +525 3 464.574 523.484 70.633 0.480 524 +526 3 464.499 522.342 70.835 0.479 525 +527 3 464.510 521.200 70.996 0.478 526 +528 3 464.630 520.063 71.134 0.478 527 +529 3 464.710 518.932 71.299 0.477 528 +530 3 464.701 517.813 71.511 0.476 529 +531 3 464.402 516.721 71.721 0.475 530 +532 3 463.897 515.695 71.893 0.475 531 +533 3 463.363 514.683 72.035 0.474 532 +534 3 462.773 513.703 72.153 0.473 533 +535 3 462.150 512.747 72.261 0.473 534 +536 3 461.408 511.879 72.391 0.472 535 +537 3 460.609 511.067 72.566 0.471 536 +538 3 459.827 510.233 72.774 0.470 537 +539 3 459.072 509.375 73.003 0.470 538 +540 3 458.308 508.526 73.273 0.469 539 +541 3 457.594 507.657 73.628 0.468 540 +542 3 457.393 506.636 74.089 0.467 541 +543 3 457.823 505.650 74.689 0.467 542 +544 3 458.397 504.735 75.391 0.466 543 +545 3 458.885 503.749 76.129 0.465 544 +546 3 458.874 502.767 76.949 0.464 545 +547 3 458.497 501.818 77.822 0.464 546 +548 3 458.085 500.818 78.664 0.463 547 +549 3 457.484 499.903 79.408 0.462 548 +550 3 456.654 499.118 80.010 0.461 549 +551 3 455.842 498.379 80.580 0.461 550 +552 3 455.026 497.665 81.168 0.460 551 +553 3 454.120 496.990 81.701 0.459 552 +554 3 453.422 496.155 82.225 0.459 553 +555 3 453.078 495.121 82.816 0.458 554 +556 3 453.046 494.040 83.460 0.457 555 +557 3 453.241 492.944 84.106 0.456 556 +558 3 453.256 491.867 84.779 0.456 557 +559 3 452.823 490.890 85.464 0.455 558 +560 3 452.148 490.005 86.118 0.454 559 +561 3 451.393 489.182 86.727 0.453 560 +562 3 450.601 488.395 87.296 0.453 561 +563 3 449.617 487.921 87.829 0.452 562 +564 3 448.562 487.535 88.318 0.451 563 +565 3 447.676 486.853 88.716 0.450 564 +566 3 447.288 485.824 89.025 0.450 565 +567 3 447.271 484.690 89.305 0.449 566 +568 3 447.050 483.648 89.663 0.448 567 +569 3 446.724 482.572 90.002 0.448 568 +570 3 446.354 481.491 90.268 0.447 569 +571 3 445.771 480.512 90.476 0.446 570 +572 3 445.154 479.549 90.637 0.445 571 +573 3 444.544 478.581 90.759 0.445 572 +574 3 443.830 477.689 90.855 0.444 573 +575 3 443.419 476.646 91.005 0.443 574 +576 3 443.803 475.612 91.256 0.442 575 +577 3 444.105 474.512 91.468 0.442 576 +578 3 443.864 473.397 91.645 0.441 577 +579 3 443.349 472.376 91.790 0.440 578 +580 3 442.965 471.313 91.921 0.439 579 +581 3 443.008 470.216 92.121 0.439 580 +582 3 443.051 469.077 92.258 0.438 581 +583 3 442.956 467.945 92.388 0.437 582 +584 3 442.505 466.919 92.512 0.436 583 +585 3 441.797 466.059 92.684 0.435 584 +586 3 441.321 465.087 92.929 0.435 585 +587 3 441.012 463.987 93.143 0.434 586 +588 3 440.596 462.928 93.331 0.433 587 +589 3 440.010 461.949 93.502 0.432 588 +590 3 439.365 461.007 93.658 0.432 589 +591 3 438.718 460.064 93.796 0.431 590 +592 3 438.072 459.123 93.921 0.430 591 +593 3 437.427 458.180 94.048 0.430 592 +594 3 436.780 457.237 94.172 0.429 593 +595 3 436.133 456.297 94.289 0.428 594 +596 3 435.426 455.401 94.388 0.427 595 +597 3 434.661 454.551 94.462 0.427 596 +598 3 433.891 453.706 94.519 0.426 597 +599 3 433.099 452.881 94.571 0.425 598 +600 3 432.290 452.071 94.626 0.425 599 +601 3 431.482 451.262 94.683 0.424 600 +602 3 430.674 450.453 94.745 0.423 601 +603 3 429.866 449.645 94.809 0.422 602 +604 3 429.057 448.836 94.873 0.422 603 +605 3 428.259 448.017 94.932 0.421 604 +606 3 427.580 447.106 94.980 0.420 605 +607 3 427.009 446.114 95.014 0.419 606 +608 3 426.434 445.126 95.037 0.419 607 +609 3 425.775 444.196 95.053 0.418 608 +610 3 425.041 443.318 95.066 0.417 609 +611 3 424.306 442.441 95.080 0.417 610 +612 3 423.616 441.530 95.098 0.416 611 +613 3 422.988 440.574 95.121 0.415 612 +614 3 422.416 439.584 95.154 0.414 613 +615 3 422.070 438.512 95.205 0.414 614 +616 3 421.896 437.383 95.279 0.413 615 +617 3 421.723 436.254 95.367 0.412 616 +618 3 421.517 435.130 95.455 0.411 617 +619 3 421.267 434.014 95.528 0.411 618 +620 3 421.002 432.901 95.582 0.410 619 +621 3 420.737 431.788 95.621 0.409 620 +622 3 420.444 430.683 95.651 0.409 621 +623 3 420.117 429.587 95.679 0.408 622 +624 3 419.781 428.493 95.712 0.407 623 +625 3 419.444 427.400 95.756 0.406 624 +626 3 419.108 426.306 95.820 0.406 625 +627 3 418.776 425.211 95.910 0.405 626 +628 3 418.459 424.112 96.032 0.404 627 +629 3 418.151 423.010 96.190 0.403 628 +630 3 417.813 421.944 96.442 0.403 629 +631 3 417.490 420.899 96.825 0.402 630 +632 3 417.242 419.838 97.302 0.401 631 +633 3 416.996 418.754 97.803 0.401 632 +634 3 416.712 417.655 98.254 0.400 633 +635 3 416.415 416.552 98.634 0.399 634 +636 3 416.117 415.449 98.948 0.398 635 +637 3 415.826 414.345 99.215 0.398 636 +638 3 415.539 413.243 99.461 0.397 637 +639 3 415.185 412.163 99.713 0.396 638 +640 3 414.725 411.126 99.991 0.396 639 +641 3 414.225 410.109 100.291 0.395 640 +642 3 413.809 409.059 100.601 0.394 641 +643 3 413.507 407.968 100.911 0.393 642 +644 3 413.243 406.865 101.209 0.393 643 +645 3 413.009 405.751 101.469 0.392 644 +646 3 412.816 404.624 101.669 0.391 645 +647 3 412.723 403.487 101.817 0.390 646 +648 3 412.779 402.346 101.930 0.390 647 +649 3 412.852 401.205 102.029 0.389 648 +650 3 412.759 400.076 102.152 0.388 649 +651 3 412.562 398.957 102.312 0.388 650 +652 3 412.365 397.839 102.500 0.387 651 +653 3 412.095 396.732 102.682 0.386 652 +654 3 411.757 395.640 102.829 0.385 653 +655 3 411.408 394.550 102.944 0.385 654 +656 3 411.017 393.475 103.037 0.384 655 +657 3 410.558 392.430 103.127 0.383 656 +658 3 410.069 391.397 103.224 0.382 657 +659 3 409.581 390.364 103.331 0.382 658 +660 3 409.059 389.348 103.450 0.381 659 +661 3 408.457 388.380 103.577 0.380 660 +662 3 407.817 387.436 103.707 0.380 661 +663 3 407.164 386.497 103.820 0.379 662 +664 3 406.501 385.566 103.902 0.378 663 +665 3 405.834 384.637 103.952 0.377 664 +666 3 405.232 383.666 103.974 0.377 665 +667 3 404.763 382.626 103.970 0.376 666 +668 3 404.349 381.561 103.956 0.375 667 +669 3 403.929 380.499 103.944 0.374 668 +670 3 403.517 379.434 103.914 0.374 669 +671 3 403.158 378.376 103.790 0.373 670 +672 3 402.833 377.326 103.552 0.372 671 +673 3 402.457 376.281 103.261 0.372 672 +674 3 401.918 375.289 103.011 0.371 673 +675 3 401.297 374.328 102.847 0.370 674 +676 3 400.655 373.392 102.804 0.369 675 +677 3 400.001 372.472 102.885 0.369 676 +678 3 399.360 371.533 103.027 0.368 677 +679 3 398.745 370.571 103.158 0.367 678 +680 3 398.138 369.601 103.244 0.366 679 +681 3 397.610 368.589 103.282 0.366 680 +682 3 397.151 367.541 103.268 0.365 681 +683 3 396.750 366.476 103.195 0.364 682 +684 3 396.375 365.402 103.081 0.364 683 +685 3 396.001 364.329 102.951 0.363 684 +686 3 395.648 363.243 102.853 0.362 685 +687 3 395.317 362.149 102.823 0.361 686 +688 3 394.995 361.054 102.863 0.361 687 +689 3 394.709 359.948 102.953 0.360 688 +690 3 394.468 358.830 103.067 0.359 689 +691 3 394.266 357.707 103.211 0.358 690 +692 3 394.097 356.584 103.397 0.358 691 +693 3 393.939 355.463 103.621 0.357 692 +694 3 393.908 354.328 103.847 0.356 693 +695 3 393.990 353.187 104.048 0.356 694 +696 3 393.999 352.045 104.225 0.355 695 +697 3 393.930 350.906 104.402 0.354 696 +698 3 393.812 349.781 104.619 0.353 697 +699 3 393.686 348.659 104.876 0.353 698 +700 3 393.617 347.522 105.124 0.352 699 +701 3 393.592 346.379 105.350 0.351 700 +702 3 393.658 345.257 105.610 0.350 701 +703 3 393.735 344.135 105.900 0.350 702 +704 3 393.697 342.999 106.159 0.349 703 +705 3 393.535 341.867 106.376 0.348 704 +706 3 393.209 340.775 106.574 0.348 705 +707 3 392.724 339.742 106.783 0.347 706 +708 3 392.129 338.770 107.026 0.346 707 +709 3 391.592 337.771 107.325 0.345 708 +710 3 391.327 336.687 107.705 0.345 709 +711 3 391.182 335.582 108.170 0.344 710 +712 3 391.148 334.522 108.744 0.343 711 +713 3 391.279 333.447 109.363 0.342 712 +714 3 391.407 332.335 109.951 0.342 713 +715 3 391.424 331.199 110.438 0.341 714 +716 3 391.209 330.098 110.871 0.340 715 +717 3 390.861 329.020 111.262 0.340 716 +718 3 390.479 327.945 111.583 0.339 717 +719 3 390.341 326.820 111.856 0.338 718 +720 3 390.366 325.686 112.161 0.337 719 +721 3 390.324 324.585 112.567 0.337 720 +722 3 390.122 323.479 113.012 0.336 721 +723 3 389.683 322.436 113.478 0.335 722 +724 3 388.995 321.538 113.965 0.334 723 +725 3 388.228 320.779 114.539 0.334 724 +726 3 387.451 320.107 115.214 0.333 725 +727 3 386.674 319.449 115.952 0.332 726 +728 3 385.717 318.880 116.593 0.331 727 +729 3 384.701 318.353 117.097 0.331 728 +730 3 383.707 317.788 117.488 0.330 729 +731 3 382.755 317.155 117.800 0.329 730 +732 3 382.053 316.266 118.077 0.329 731 +733 3 381.399 315.326 118.370 0.328 732 +734 3 380.824 314.423 118.848 0.327 733 +735 3 380.787 313.399 119.514 0.326 734 +736 3 381.041 312.363 120.304 0.326 735 +737 3 381.318 311.329 121.172 0.325 736 +738 3 381.595 310.296 122.079 0.324 737 +739 3 381.871 309.262 122.986 0.323 738 +740 3 382.147 308.229 123.860 0.323 739 +741 3 382.423 307.195 124.692 0.322 740 +742 3 382.786 306.138 125.420 0.321 741 +743 3 383.162 305.077 126.047 0.321 742 +744 3 383.540 304.018 126.589 0.320 743 +745 3 383.917 302.956 127.059 0.319 744 +746 3 384.294 301.897 127.473 0.318 745 +747 3 384.586 300.798 127.817 0.318 746 +748 3 384.713 299.664 128.060 0.317 747 +749 3 384.826 298.528 128.231 0.316 748 +750 3 384.885 297.386 128.379 0.315 749 +751 3 384.576 296.301 128.599 0.315 750 +752 3 384.239 295.218 128.903 0.314 751 +753 3 383.515 294.350 129.280 0.313 752 +754 3 382.738 293.518 129.751 0.313 753 +755 3 382.218 292.583 130.377 0.312 754 +756 3 381.729 291.638 131.105 0.311 755 +757 3 381.980 290.605 131.859 0.310 756 +758 3 382.475 289.628 132.590 0.310 757 +759 3 382.907 288.809 134.400 0.309 758 +760 3 470.782 663.892 46.243 0.766 65 +761 3 471.581 663.085 46.664 0.492 760 +762 3 472.162 662.119 46.833 0.492 761 +763 3 472.334 661.019 47.043 0.492 762 +764 3 472.422 659.883 47.249 0.492 763 +765 3 472.549 658.768 47.485 0.492 764 +766 3 472.679 657.651 47.741 0.492 765 +767 3 472.720 656.515 47.939 0.492 766 +768 3 472.247 655.527 48.064 0.492 767 +769 3 471.699 654.529 48.118 0.492 768 +770 3 471.568 653.422 48.095 0.492 769 +771 3 471.648 652.285 48.023 0.492 770 +772 3 471.825 651.156 47.947 0.492 771 +773 3 472.084 650.043 47.891 0.492 772 +774 3 472.421 648.950 47.857 0.492 773 +775 3 472.925 647.927 47.845 0.492 774 +776 3 473.532 646.959 47.851 0.492 775 +777 3 474.183 646.019 47.870 0.492 776 +778 3 474.795 645.054 47.898 0.492 777 +779 3 475.206 643.993 47.938 0.492 778 +780 3 475.299 642.863 47.995 0.492 779 +781 3 475.048 641.758 48.071 0.492 780 +782 3 474.577 640.718 48.170 0.492 781 +783 3 474.066 639.697 48.315 0.492 782 +784 3 473.774 638.649 48.585 0.492 783 +785 3 473.835 637.533 48.875 0.492 784 +786 3 474.369 636.547 49.164 0.492 785 +787 3 475.046 635.641 49.480 0.492 786 +788 3 475.378 634.573 49.816 0.492 787 +789 3 475.663 633.483 50.159 0.492 788 +790 3 476.021 632.402 50.457 0.492 789 +791 3 476.222 631.280 50.719 0.492 790 +792 3 476.030 630.167 50.965 0.492 791 +793 3 475.592 629.113 51.169 0.492 792 +794 3 475.273 628.015 51.327 0.492 793 +795 3 475.294 626.879 51.483 0.492 794 +796 3 475.437 625.750 51.657 0.492 795 +797 3 475.406 624.608 51.822 0.492 796 +798 3 475.334 623.466 51.970 0.492 797 +799 3 475.460 622.331 52.132 0.492 798 +800 3 475.689 621.215 52.334 0.492 799 +801 3 476.077 620.142 52.561 0.492 800 +802 3 476.507 619.081 52.797 0.492 801 +803 3 476.658 617.949 53.049 0.492 802 +804 3 476.673 616.860 53.443 0.492 803 +805 3 476.492 615.822 53.975 0.492 804 +806 3 476.044 614.806 54.538 0.492 805 +807 3 475.645 613.737 55.047 0.492 806 +808 3 475.322 612.655 55.541 0.492 807 +809 3 475.102 611.571 56.040 0.492 808 +810 3 475.190 610.435 56.462 0.492 809 +811 3 475.405 609.321 56.842 0.492 810 +812 3 475.719 608.232 57.212 0.492 811 +813 3 475.965 607.128 57.563 0.492 812 +814 3 475.664 606.036 57.869 0.492 813 +815 3 474.890 605.211 58.188 0.492 814 +816 3 474.158 604.412 58.579 0.492 815 +817 3 473.837 603.323 58.927 0.492 816 +818 3 473.811 602.180 59.218 0.492 817 +819 3 473.688 601.055 59.495 0.492 818 +820 3 473.645 599.991 59.867 0.492 819 +821 3 473.714 598.854 60.183 0.492 820 +822 3 473.973 597.749 60.432 0.492 821 +823 3 474.579 596.786 60.649 0.492 822 +824 3 475.384 595.972 60.851 0.492 823 +825 3 476.008 595.070 61.050 0.492 824 +826 3 475.934 593.932 61.264 0.492 825 +827 3 475.758 592.860 61.589 0.492 826 +828 3 475.652 591.944 62.144 0.492 827 +829 3 475.374 590.922 62.754 0.492 828 +830 3 475.015 589.847 63.282 0.492 829 +831 3 474.711 588.745 63.671 0.492 830 +832 3 474.336 587.666 63.929 0.492 831 +833 3 473.899 586.611 64.072 0.492 832 +834 3 473.689 585.500 64.127 0.492 833 +835 3 473.825 584.365 64.144 0.492 834 +836 3 473.997 583.235 64.154 0.492 835 +837 3 474.090 582.095 64.168 0.492 836 +838 3 474.121 580.952 64.187 0.492 837 +839 3 474.103 579.811 64.214 0.492 838 +840 3 474.317 578.702 64.252 0.492 839 +841 3 474.821 577.675 64.305 0.492 840 +842 3 475.174 576.593 64.378 0.492 841 +843 3 475.292 575.458 64.481 0.492 842 +844 3 475.227 574.318 64.626 0.492 843 +845 3 475.011 573.203 64.830 0.492 844 +846 3 474.564 572.157 65.101 0.492 845 +847 3 474.137 571.144 65.487 0.492 846 +848 3 473.814 570.191 66.042 0.492 847 +849 3 473.733 569.154 66.658 0.492 848 +850 3 473.917 568.031 67.182 0.492 849 +851 3 473.960 566.893 67.587 0.492 850 +852 3 473.816 565.762 67.906 0.492 851 +853 3 473.717 564.630 68.163 0.492 852 +854 3 473.776 563.490 68.351 0.492 853 +855 3 473.909 562.354 68.501 0.492 854 +856 3 474.054 561.227 68.673 0.492 855 +857 3 474.138 560.100 68.885 0.492 856 +858 3 474.253 558.965 69.082 0.492 857 +859 3 474.439 557.838 69.249 0.492 858 +860 3 474.386 556.718 69.415 0.492 859 +861 3 473.956 555.677 69.615 0.492 860 +862 3 473.512 554.649 69.818 0.492 861 +863 3 473.413 553.527 69.976 0.492 862 +864 3 473.573 552.394 70.110 0.492 863 +865 3 473.680 551.257 70.236 0.492 864 +866 3 473.780 550.120 70.364 0.492 865 +867 3 473.987 548.994 70.505 0.492 866 +868 3 474.203 547.871 70.675 0.492 867 +869 3 474.451 546.803 70.952 0.492 868 +870 3 474.763 545.814 71.414 0.492 869 +871 3 475.128 544.781 71.924 0.492 870 +872 3 475.491 543.698 72.381 0.492 871 +873 3 475.643 542.595 72.835 0.492 872 +874 3 475.639 541.486 73.315 0.492 873 +875 3 475.715 540.376 73.797 0.492 874 +876 3 475.841 539.256 74.237 0.492 875 +877 3 475.991 538.123 74.613 0.492 876 +878 3 476.171 536.995 74.954 0.492 877 +879 3 476.428 535.894 75.310 0.492 878 +880 3 476.712 534.809 75.707 0.492 879 +881 3 476.898 533.702 76.138 0.492 880 +882 3 477.009 532.585 76.599 0.492 881 +883 3 477.097 531.504 77.125 0.492 882 +884 3 477.162 530.448 77.708 0.492 883 +885 3 477.244 529.363 78.163 0.492 884 +886 3 477.415 528.283 78.491 0.492 885 +887 3 477.684 527.264 78.870 0.492 886 +888 3 478.068 526.266 79.157 0.492 887 +889 3 478.535 525.256 79.244 0.492 888 +890 3 478.877 524.188 79.233 0.492 889 +891 3 479.090 523.067 79.234 0.492 890 +892 3 479.353 521.964 79.294 0.492 891 +893 3 479.766 520.914 79.414 0.492 892 +894 3 480.305 519.911 79.579 0.492 893 +895 3 480.896 518.933 79.759 0.492 894 +896 3 481.392 517.907 79.927 0.492 895 +897 3 481.685 516.808 80.090 0.492 896 +898 3 481.893 515.692 80.280 0.492 897 +899 3 482.157 514.588 80.489 0.492 898 +900 3 482.585 513.537 80.701 0.492 899 +901 3 483.067 512.505 80.921 0.492 900 +902 3 483.515 511.457 81.147 0.492 901 +903 3 484.063 510.462 81.359 0.492 902 +904 3 484.656 509.484 81.542 0.492 903 +905 3 485.065 508.424 81.710 0.492 904 +906 3 485.474 507.359 81.882 0.492 905 +907 3 485.908 506.302 82.072 0.492 906 +908 3 486.266 505.219 82.317 0.492 907 +909 3 486.547 504.133 82.678 0.492 908 +910 3 486.787 503.060 83.177 0.492 909 +911 3 487.021 501.990 83.790 0.492 910 +912 3 487.256 500.920 84.483 0.492 911 +913 3 487.490 499.849 85.226 0.492 912 +914 3 487.724 498.778 85.990 0.492 913 +915 3 487.939 497.704 86.752 0.492 914 +916 3 488.093 496.620 87.498 0.492 915 +917 3 488.221 495.532 88.223 0.492 916 +918 3 488.259 494.432 88.913 0.492 917 +919 3 488.145 493.329 89.550 0.492 918 +920 3 487.973 492.228 90.130 0.492 919 +921 3 487.802 491.126 90.657 0.492 920 +922 3 487.649 490.004 91.085 0.492 921 +923 3 487.513 488.868 91.403 0.492 922 +924 3 487.378 487.732 91.640 0.492 923 +925 3 487.232 486.598 91.839 0.492 924 +926 3 487.043 485.475 92.050 0.492 925 +927 3 486.837 484.356 92.296 0.492 926 +928 3 486.631 483.238 92.579 0.492 927 +929 3 486.391 482.147 92.924 0.492 928 +930 3 486.114 481.090 93.342 0.492 929 +931 3 485.851 480.026 93.793 0.492 930 +932 3 485.758 478.912 94.136 0.492 931 +933 3 485.747 477.778 94.340 0.492 932 +934 3 485.726 476.642 94.452 0.492 933 +935 3 485.561 475.521 94.572 0.492 934 +936 3 485.325 474.408 94.753 0.492 935 +937 3 485.088 473.294 95.012 0.492 936 +938 3 484.866 472.179 95.365 0.492 937 +939 3 484.843 471.084 95.853 0.492 938 +940 3 484.916 470.000 96.463 0.492 939 +941 3 484.990 468.915 97.150 0.492 940 +942 3 485.041 467.825 97.877 0.492 941 +943 3 484.979 466.719 98.601 0.492 942 +944 3 484.867 465.606 99.298 0.492 943 +945 3 484.754 464.493 99.965 0.492 944 +946 3 484.624 463.388 100.614 0.492 945 +947 3 484.446 462.303 101.269 0.492 946 +948 3 484.251 461.229 101.932 0.492 947 +949 3 484.165 460.134 102.584 0.492 948 +950 3 484.205 459.027 103.199 0.492 949 +951 3 484.279 457.916 103.768 0.492 950 +952 3 484.333 456.799 104.275 0.492 951 +953 3 484.263 455.667 104.663 0.492 952 +954 3 484.141 454.530 104.933 0.492 953 +955 3 484.018 453.392 105.123 0.492 954 +956 3 483.897 452.254 105.263 0.492 955 +957 3 483.771 451.120 105.402 0.492 956 +958 3 483.644 449.987 105.566 0.492 957 +959 3 483.517 448.853 105.764 0.492 958 +960 3 483.391 447.719 105.995 0.492 959 +961 3 483.264 446.586 106.254 0.492 960 +962 3 483.063 445.471 106.553 0.492 961 +963 3 482.809 444.372 106.894 0.492 962 +964 3 482.546 443.276 107.263 0.492 963 +965 3 482.284 442.179 107.650 0.492 964 +966 3 482.040 441.077 108.043 0.492 965 +967 3 482.103 439.957 108.389 0.492 966 +968 3 482.297 438.829 108.675 0.492 967 +969 3 482.593 437.736 108.958 0.492 968 +970 3 483.029 436.720 109.295 0.492 969 +971 3 483.504 435.730 109.683 0.492 970 +972 3 483.875 434.670 110.049 0.492 971 +973 3 484.143 433.560 110.340 0.492 972 +974 3 484.387 432.442 110.551 0.492 973 +975 3 484.604 431.320 110.692 0.492 974 +976 3 484.807 430.193 110.779 0.492 975 +977 3 485.006 429.066 110.838 0.492 976 +978 3 485.161 427.935 110.909 0.492 977 +979 3 485.287 426.800 111.009 0.492 978 +980 3 485.408 425.665 111.132 0.492 979 +981 3 485.530 424.530 111.270 0.492 980 +982 3 485.651 423.396 111.414 0.492 981 +983 3 485.772 422.261 111.556 0.492 982 +984 3 485.966 421.135 111.676 0.492 983 +985 3 486.210 420.017 111.765 0.492 984 +986 3 486.464 418.902 111.829 0.492 985 +987 3 486.718 417.786 111.878 0.492 986 +988 3 486.920 416.661 111.923 0.492 987 +989 3 487.088 415.529 111.971 0.492 988 +990 3 487.250 414.397 112.035 0.492 989 +991 3 487.294 413.256 112.124 0.492 990 +992 3 487.241 412.113 112.251 0.492 991 +993 3 487.171 410.972 112.425 0.492 992 +994 3 487.100 409.830 112.656 0.492 993 +995 3 487.033 408.697 112.991 0.492 994 +996 3 486.976 407.658 113.521 0.492 995 +997 3 486.921 406.645 114.217 0.492 996 +998 3 486.866 405.632 115.013 0.492 997 +999 3 486.812 404.619 115.845 0.492 998 +1000 3 486.631 403.523 116.525 0.492 999 +1001 3 486.409 402.401 117.002 0.492 1000 +1002 3 486.185 401.280 117.302 0.492 1001 +1003 3 485.961 400.157 117.473 0.492 1002 +1004 3 485.736 399.035 117.564 0.492 1003 +1005 3 485.459 397.927 117.621 0.492 1004 +1006 3 485.166 396.820 117.685 0.492 1005 +1007 3 484.872 395.714 117.767 0.492 1006 +1008 3 484.914 394.592 117.904 0.492 1007 +1009 3 485.088 393.469 118.098 0.492 1008 +1010 3 485.272 392.347 118.334 0.492 1009 +1011 3 485.510 391.237 118.600 0.492 1010 +1012 3 485.841 390.149 118.878 0.492 1011 +1013 3 486.193 389.068 119.160 0.492 1012 +1014 3 486.545 387.985 119.437 0.492 1013 +1015 3 486.873 386.892 119.693 0.492 1014 +1016 3 487.177 385.789 119.920 0.492 1015 +1017 3 487.474 384.685 120.132 0.492 1016 +1018 3 487.818 383.596 120.361 0.492 1017 +1019 3 488.313 382.613 120.690 0.492 1018 +1020 3 488.844 381.657 121.113 0.492 1019 +1021 3 489.395 380.688 121.569 0.492 1020 +1022 3 489.970 379.707 121.996 0.492 1021 +1023 3 490.549 378.727 122.376 0.492 1022 +1024 3 491.129 377.747 122.708 0.492 1023 +1025 3 491.698 376.758 122.995 0.492 1024 +1026 3 491.973 375.660 123.231 0.492 1025 +1027 3 492.174 374.534 123.439 0.492 1026 +1028 3 492.374 373.407 123.646 0.492 1027 +1029 3 492.398 372.284 123.924 0.492 1028 +1030 3 492.312 371.178 124.300 0.492 1029 +1031 3 492.211 370.075 124.757 0.492 1030 +1032 3 492.310 368.963 125.249 0.492 1031 +1033 3 492.628 367.877 125.733 0.492 1032 +1034 3 492.980 366.797 126.194 0.492 1033 +1035 3 493.358 365.729 126.630 0.492 1034 +1036 3 493.859 364.737 127.078 0.492 1035 +1037 3 494.383 363.759 127.537 0.492 1036 +1038 3 494.907 362.782 128.000 0.492 1037 +1039 3 495.680 361.957 128.388 0.492 1038 +1040 3 496.534 361.196 128.688 0.492 1039 +1041 3 497.293 360.342 128.922 0.492 1040 +1042 3 497.679 359.276 129.113 0.492 1041 +1043 3 498.013 358.182 129.291 0.492 1042 +1044 3 498.059 357.061 129.544 0.492 1043 +1045 3 498.066 355.936 129.877 0.492 1044 +1046 3 498.149 354.829 130.292 0.492 1045 +1047 3 498.261 353.728 130.762 0.492 1046 +1048 3 498.376 352.629 131.259 0.492 1047 +1049 3 498.569 351.510 131.694 0.492 1048 +1050 3 498.809 350.392 132.029 0.492 1049 +1051 3 499.054 349.275 132.284 0.492 1050 +1052 3 499.300 348.157 132.485 0.492 1051 +1053 3 499.494 347.035 132.687 0.492 1052 +1054 3 499.607 345.923 132.952 0.492 1053 +1055 3 499.711 344.812 133.274 0.492 1054 +1056 3 499.815 343.701 133.630 0.492 1055 +1057 3 500.037 342.583 133.932 0.492 1056 +1058 3 500.304 341.471 134.151 0.492 1057 +1059 3 500.574 340.361 134.290 0.492 1058 +1060 3 500.845 339.249 134.364 0.492 1059 +1061 3 501.054 338.124 134.394 0.492 1060 +1062 3 501.191 336.988 134.400 0.492 1061 +1063 3 501.321 335.852 134.400 0.492 1062 +1064 3 501.452 334.715 134.400 0.492 1063 +1065 3 501.582 333.579 134.400 0.492 1064 +1066 3 501.713 332.442 134.400 0.492 1065 +1067 3 501.843 331.306 134.400 0.492 1066 +1068 3 501.973 330.169 134.400 0.492 1067 +1069 3 502.104 329.033 134.400 0.492 1068 +1070 3 502.234 327.896 134.400 0.492 1069 +1071 3 502.365 326.760 134.400 0.492 1070 +1072 3 502.495 325.624 134.400 0.492 1071 +1073 3 502.626 324.486 134.400 0.492 1072 +1074 3 502.756 323.350 134.400 0.492 1073 +1075 3 502.886 322.213 134.400 0.492 1074 +1076 3 503.017 321.077 134.400 0.492 1075 +1077 3 503.147 319.940 134.400 0.492 1076 +1078 3 503.278 318.804 134.400 0.492 1077 +1079 3 503.408 317.667 134.400 0.492 1078 +1080 3 503.538 316.531 134.400 0.492 1079 +1081 3 503.669 315.394 134.400 0.492 1080 +1082 3 503.799 314.258 134.400 0.492 1081 +1083 3 503.930 313.121 134.400 0.492 1082 +1084 3 504.060 311.985 134.400 0.492 1083 +1085 3 504.045 310.842 134.400 0.492 1084 +1086 3 503.822 309.721 134.400 0.492 1085 +1087 3 503.581 308.603 134.400 0.492 1086 +1088 3 503.339 307.484 134.400 0.492 1087 +1089 3 503.469 306.354 134.400 0.492 1088 +1090 3 504.002 305.344 134.400 0.492 1089 +1091 3 504.544 304.336 134.400 0.492 1090 +1092 3 505.094 303.333 134.400 0.492 1091 +1093 3 505.658 302.337 134.400 0.492 1092 +1094 3 506.227 301.344 134.400 0.492 1093 +1095 3 506.948 300.458 134.400 0.492 1094 +1096 3 507.673 299.572 134.400 0.492 1095 +1097 3 508.376 298.670 134.400 0.492 1096 +1098 3 509.009 297.717 134.400 0.492 1097 +1099 3 509.642 296.764 134.400 0.492 1098 +1100 3 510.430 295.936 134.400 0.492 1099 +1101 3 511.401 295.332 134.400 0.492 1100 +1102 3 512.372 294.726 134.400 0.492 1101 +1103 3 465.869 721.234 31.466 1.133 1 +1104 3 465.765 723.508 31.018 1.133 1103 +1105 3 464.760 725.278 30.685 1.133 1104 +1106 3 462.799 726.457 30.520 1.133 1105 +1107 3 465.020 701.493 26.809 2.161 1 +1108 3 463.702 697.350 25.408 1.953 1107 +1109 3 462.033 694.497 26.487 1.844 1108 +1110 3 460.405 691.572 27.610 1.734 1109 +1111 3 459.078 688.487 27.485 1.625 1110 +1112 3 459.451 685.130 26.931 1.515 1111 +1113 3 460.776 681.969 27.004 1.406 1112 +1114 3 461.654 679.968 27.608 1.333 1113 +1115 3 462.608 677.960 28.465 1.261 1114 +1116 3 463.039 675.716 28.946 1.188 1115 +1117 3 463.072 673.468 29.143 1.115 1116 +1118 3 463.514 671.342 28.702 1.042 1117 +1119 3 463.853 669.152 27.934 0.969 1118 +1120 3 463.092 667.052 27.270 0.896 1119 +1121 3 461.794 665.177 26.880 0.824 1120 +1122 3 460.706 663.346 26.928 0.821 1121 +1123 3 459.472 661.421 27.184 0.813 1122 +1124 3 458.325 659.471 27.564 0.806 1123 +1125 3 457.458 657.412 28.096 0.799 1124 +1126 3 457.274 655.152 28.364 0.792 1125 +1127 3 458.457 653.227 28.298 0.785 1126 +1128 3 458.734 652.123 28.231 0.781 1127 +1129 3 458.161 649.920 28.146 0.774 1128 +1130 3 457.712 647.690 28.131 0.766 1129 +1131 3 457.833 645.407 28.144 0.759 1130 +1132 3 457.863 643.119 28.169 0.752 1131 +1133 3 457.577 640.852 28.219 0.745 1132 +1134 3 456.623 638.779 28.311 0.738 1133 +1135 3 455.838 636.645 28.524 0.731 1134 +1136 3 455.919 634.364 28.743 0.723 1135 +1137 3 456.553 632.172 28.930 0.716 1136 +1138 3 456.935 629.984 29.252 0.709 1137 +1139 3 457.007 627.704 29.607 0.702 1138 +1140 3 456.283 625.542 29.801 0.695 1139 +1141 3 455.121 623.574 29.875 0.687 1140 +1142 3 454.304 621.444 29.942 0.680 1141 +1143 3 454.161 620.313 29.991 0.677 1142 +1144 3 454.396 619.203 30.073 0.673 1143 +1145 3 454.980 618.228 30.205 0.670 1144 +1146 3 455.498 617.209 30.339 0.666 1145 +1147 3 455.985 616.173 30.469 0.662 1146 +1148 3 456.459 615.133 30.590 0.659 1147 +1149 3 456.922 614.104 30.683 0.655 1148 +1150 3 457.230 613.079 30.921 0.652 1149 +1151 3 457.316 611.967 31.205 0.648 1150 +1152 3 457.198 610.833 31.463 0.644 1151 +1153 3 456.982 609.711 31.664 0.641 1152 +1154 3 456.629 608.624 31.806 0.637 1153 +1155 3 456.173 607.575 31.895 0.634 1154 +1156 3 455.370 605.438 31.947 0.626 1155 +1157 3 455.236 604.303 31.960 0.623 1156 +1158 3 455.211 603.160 31.976 0.619 1157 +1159 3 455.140 602.019 31.997 0.616 1158 +1160 3 455.008 600.883 32.026 0.612 1159 +1161 3 454.819 599.756 32.075 0.609 1160 +1162 3 454.546 598.648 32.140 0.605 1161 +1163 3 454.288 597.542 32.223 0.601 1162 +1164 3 454.210 596.406 32.288 0.598 1163 +1165 3 454.252 595.268 32.302 0.594 1164 +1166 3 454.081 594.144 32.252 0.591 1165 +1167 3 454.165 593.046 32.072 0.587 1166 +1168 3 454.620 592.030 31.815 0.583 1167 +1169 3 455.114 591.027 31.562 0.579 1168 +1170 3 455.187 589.906 31.306 0.576 1169 +1171 3 453.633 589.305 31.062 0.568 1170 +1172 3 452.516 589.491 30.962 0.565 1171 +1173 3 451.619 587.919 30.663 0.557 1172 +1174 3 451.631 586.775 30.492 0.554 1173 +1175 3 451.452 585.690 30.228 0.550 1174 +1176 3 451.112 584.637 29.867 0.546 1175 +1177 3 450.765 583.561 29.483 0.543 1176 +1178 3 450.252 582.560 29.096 0.539 1177 +1179 3 449.525 581.694 28.705 0.536 1178 +1180 3 448.612 581.035 28.321 0.532 1179 +1181 3 447.629 580.458 27.972 0.528 1180 +1182 3 446.711 579.803 27.621 0.525 1181 +1183 3 446.112 578.948 27.191 0.521 1182 +1184 3 445.922 577.887 26.733 0.517 1183 +1185 3 446.062 576.769 26.355 0.514 1184 +1186 3 446.539 575.742 26.074 0.510 1185 +1187 3 446.754 574.645 25.872 0.506 1186 +1188 3 446.581 573.525 25.731 0.503 1187 +1189 3 446.285 572.420 25.629 0.499 1188 +1190 3 446.054 571.301 25.533 0.496 1189 +1191 3 446.094 570.173 25.382 0.492 1190 +1192 3 446.183 569.038 25.174 0.488 1191 +1193 3 446.006 567.918 24.943 0.485 1192 +1194 3 445.419 566.988 24.635 0.481 1193 +1195 3 444.739 566.115 24.256 0.478 1194 +1196 3 444.056 565.253 23.833 0.474 1195 +1197 3 443.260 564.446 23.487 0.470 1196 +1198 3 442.259 563.945 23.196 0.467 1197 +1199 3 441.184 563.568 22.983 0.463 1198 +1200 3 440.306 562.861 22.876 0.459 1199 +1201 3 439.852 561.823 22.857 0.456 1200 +1202 3 439.557 560.719 22.920 0.452 1201 +1203 3 439.401 559.611 23.089 0.449 1202 +1204 3 439.269 558.496 23.322 0.445 1203 +1205 3 439.155 557.372 23.562 0.441 1204 +1206 3 439.272 556.248 23.769 0.438 1205 +1207 3 439.136 555.119 23.890 0.434 1206 +1208 3 438.681 554.078 23.858 0.431 1207 +1209 3 438.199 553.047 23.686 0.427 1208 +1210 3 437.946 551.961 23.370 0.423 1209 +1211 3 438.253 550.976 22.874 0.420 1210 +1212 3 438.925 550.124 22.321 0.416 1211 +1213 3 439.002 549.014 21.849 0.412 1212 +1214 3 438.465 548.009 21.465 0.408 1213 +1215 3 437.875 547.038 21.158 0.405 1214 +1216 3 437.321 546.037 20.964 0.401 1215 +1217 3 436.717 545.066 20.857 0.398 1216 +1218 3 436.068 544.126 20.797 0.394 1217 +1219 3 435.295 543.282 20.755 0.390 1218 +1220 3 434.602 542.384 20.720 0.387 1219 +1221 3 434.261 541.301 20.689 0.383 1220 +1222 3 434.175 540.166 20.670 0.380 1221 +1223 3 434.091 539.036 20.585 0.376 1222 +1224 3 433.980 537.936 20.413 0.372 1223 +1225 3 433.722 536.847 20.271 0.369 1224 +1226 3 433.316 535.828 20.018 0.365 1225 +1227 3 432.718 534.884 19.736 0.361 1226 +1228 3 431.934 534.053 19.519 0.358 1227 +1229 3 431.138 533.240 19.353 0.354 1228 +1230 3 430.405 532.371 19.179 0.351 1229 +1231 3 429.629 531.532 19.023 0.347 1230 +1232 3 428.796 530.748 18.890 0.343 1231 +1233 3 427.902 530.046 18.730 0.340 1232 +1234 3 427.311 529.236 18.519 0.336 1233 +1235 3 427.480 528.109 18.305 0.333 1234 +1236 3 427.749 527.003 18.057 0.329 1235 +1237 3 427.930 525.883 17.790 0.325 1236 +1238 3 427.885 524.750 17.516 0.322 1237 +1239 3 427.719 523.647 17.177 0.318 1238 +1240 3 427.662 522.555 16.757 0.315 1239 +1241 3 427.545 521.462 16.314 0.311 1240 +1242 3 426.995 520.497 15.928 0.307 1241 +1243 3 426.141 519.736 15.609 0.304 1242 +1244 3 425.442 518.865 15.330 0.300 1243 +1245 3 425.004 517.843 15.019 0.296 1244 +1246 3 424.443 516.911 14.662 0.293 1245 +1247 3 423.640 516.110 14.317 0.289 1246 +1248 3 422.718 515.444 14.009 0.285 1247 +1249 3 421.793 514.811 13.690 0.282 1248 +1250 3 421.625 513.863 13.344 0.278 1249 +1251 3 421.525 512.742 13.060 0.274 1250 +1252 3 420.995 511.750 12.790 0.270 1251 +1253 3 420.539 510.706 12.550 0.266 1252 +1254 3 420.143 509.634 12.356 0.263 1253 +1255 3 419.724 508.569 12.198 0.259 1254 +1256 3 419.380 507.478 12.052 0.256 1255 +1257 3 418.915 506.435 11.891 0.252 1256 +1258 3 418.084 505.659 11.710 0.248 1257 +1259 3 417.152 505.026 11.432 0.244 1258 +1260 3 416.792 504.049 10.985 0.241 1259 +1261 3 416.711 502.983 10.451 0.237 1260 +1262 3 416.695 501.888 9.904 0.234 1261 +1263 3 416.850 500.754 9.494 0.230 1262 +1264 3 416.906 499.611 8.998 0.227 1263 +1265 3 460.754 664.649 25.100 0.817 1121 +1266 3 458.917 663.607 23.907 0.800 1265 +1267 3 457.116 662.350 22.633 0.782 1266 +1268 3 455.335 660.924 21.845 0.764 1267 +1269 3 453.717 659.313 21.441 0.746 1268 +1270 3 452.030 657.774 21.249 0.728 1269 +1271 3 451.301 655.665 21.079 0.710 1270 +1272 3 452.224 653.646 20.770 0.692 1271 +1273 3 452.526 651.479 20.392 0.674 1272 +1274 3 452.142 650.406 20.296 0.665 1273 +1275 3 451.734 649.338 20.237 0.657 1274 +1276 3 451.404 648.242 20.204 0.648 1275 +1277 3 451.115 647.139 20.215 0.639 1276 +1278 3 450.897 646.017 20.238 0.630 1277 +1279 3 450.892 644.897 20.167 0.621 1278 +1280 3 451.123 643.787 20.062 0.612 1279 +1281 3 451.292 642.656 19.982 0.603 1280 +1282 3 451.289 641.513 19.938 0.594 1281 +1283 3 451.158 640.377 19.935 0.585 1282 +1284 3 450.759 639.308 19.976 0.577 1283 +1285 3 450.387 638.226 20.060 0.568 1284 +1286 3 450.087 637.134 20.223 0.559 1285 +1287 3 449.772 636.101 20.511 0.550 1286 +1288 3 449.187 635.134 20.799 0.541 1287 +1289 3 448.566 634.174 21.024 0.532 1288 +1290 3 448.011 633.173 21.182 0.523 1289 +1291 3 447.677 632.081 21.280 0.514 1290 +1292 3 447.454 630.958 21.320 0.505 1291 +1293 3 447.191 629.845 21.319 0.497 1292 +1294 3 446.783 628.777 21.299 0.488 1293 +1295 3 446.341 627.722 21.273 0.479 1294 +1296 3 445.807 626.711 21.240 0.470 1295 +1297 3 445.220 625.729 21.185 0.461 1296 +1298 3 444.606 624.774 21.082 0.452 1297 +1299 3 444.058 623.771 20.987 0.443 1298 +1300 3 443.610 622.719 20.915 0.435 1299 +1301 3 443.266 621.628 20.865 0.426 1300 +1302 3 442.961 620.525 20.835 0.417 1301 +1303 3 442.703 619.411 20.825 0.408 1302 +1304 3 442.619 618.270 20.829 0.399 1303 +1305 3 442.745 617.134 20.837 0.390 1304 +1306 3 442.679 615.992 20.849 0.381 1305 +1307 3 442.034 615.052 20.866 0.372 1306 +1308 3 441.092 614.404 20.892 0.363 1307 +1309 3 440.660 613.344 20.926 0.355 1308 +1310 3 440.384 612.234 20.966 0.346 1309 +1311 3 440.283 611.095 21.014 0.337 1310 +1312 3 440.529 609.996 21.134 0.328 1311 +1313 3 440.906 608.916 21.369 0.319 1312 +1314 4 463.842 700.329 34.233 1.550 1 +1315 4 463.139 696.973 34.522 1.544 1314 +1316 4 462.709 693.588 35.189 1.544 1315 +1317 4 462.876 690.346 36.819 1.544 1316 +1318 4 462.141 687.077 38.485 1.544 1317 +1319 4 461.227 683.801 39.427 1.544 1318 +1320 4 459.624 680.774 40.015 1.544 1319 +1321 4 458.101 677.701 40.403 1.544 1320 +1322 4 458.180 674.993 41.222 1.544 1321 +1323 4 459.258 672.095 39.810 1.529 1322 +1324 4 457.976 669.092 38.162 1.515 1323 +1325 4 457.784 665.729 37.229 1.501 1324 +1326 4 459.007 662.541 37.063 1.487 1325 +1327 4 459.944 659.280 36.972 1.473 1326 +1328 4 459.517 655.906 36.735 1.459 1327 +1329 4 459.311 653.664 36.323 1.450 1328 +1330 4 457.870 650.577 35.722 1.436 1329 +1331 4 456.689 647.479 34.988 1.421 1330 +1332 4 456.343 645.227 34.518 1.412 1331 +1333 4 455.535 643.090 34.282 1.403 1332 +1334 4 454.679 640.971 34.190 1.393 1333 +1335 4 455.071 637.723 34.002 1.379 1334 +1336 4 455.391 635.511 33.671 1.370 1335 +1337 4 455.222 633.234 33.352 1.360 1336 +1338 4 454.950 630.963 33.190 1.351 1337 +1339 4 454.771 628.683 33.134 1.342 1338 +1340 4 454.389 626.428 33.093 1.332 1339 +1341 4 453.757 624.236 33.003 1.323 1340 +1342 4 452.487 622.369 32.851 1.313 1341 +1343 4 451.708 620.355 32.789 1.304 1342 +1344 4 452.579 618.261 32.865 1.294 1343 +1345 4 452.770 616.042 33.068 1.285 1344 +1346 4 452.438 613.877 33.609 1.276 1345 +1347 4 451.751 611.716 34.212 1.266 1346 +1348 4 451.364 609.477 34.653 1.257 1347 +1349 4 450.123 607.643 35.136 1.248 1348 +1350 4 449.061 605.637 35.472 1.238 1349 +1351 4 449.095 603.394 35.749 1.229 1350 +1352 4 449.280 601.126 36.007 1.219 1351 +1353 4 449.260 598.865 36.034 1.210 1352 +1354 4 448.501 596.734 35.958 1.201 1353 +1355 4 447.257 594.826 35.788 1.191 1354 +1356 4 446.874 592.637 35.777 1.182 1355 +1357 4 447.009 590.365 35.747 1.173 1356 +1358 4 447.620 588.258 35.622 1.163 1357 +1359 4 448.679 586.258 35.627 1.154 1358 +1360 4 448.946 584.055 35.478 1.144 1359 +1361 4 448.533 581.830 35.130 1.135 1360 +1362 4 447.860 579.723 34.643 1.126 1361 +1363 4 447.311 577.812 34.898 1.116 1362 +1364 4 447.128 575.565 35.354 1.107 1363 +1365 4 447.155 573.279 35.479 1.097 1364 +1366 4 446.667 571.107 35.091 1.088 1365 +1367 4 447.202 569.126 34.287 1.078 1366 +1368 4 448.709 567.689 33.208 1.068 1367 +1369 4 448.847 565.479 32.514 1.059 1368 +1370 4 447.892 563.456 31.980 1.049 1369 +1371 4 446.796 561.479 31.576 1.040 1370 +1372 4 446.415 559.260 31.611 1.031 1371 +1373 4 446.034 557.035 31.779 1.021 1372 +1374 4 445.064 554.993 32.037 1.012 1373 +1375 4 444.725 552.761 32.267 1.002 1374 +1376 4 444.753 550.545 32.739 0.993 1375 +1377 4 445.183 548.301 33.077 0.984 1376 +1378 4 445.217 546.013 33.182 0.974 1377 +1379 4 445.264 543.728 33.104 0.965 1378 +1380 4 444.755 541.584 32.828 0.955 1379 +1381 4 444.997 539.339 32.704 0.946 1380 +1382 4 444.822 537.089 32.625 0.936 1381 +1383 4 443.778 535.060 32.533 0.927 1382 +1384 4 442.345 533.305 32.306 0.917 1383 +1385 4 441.290 531.379 31.882 0.908 1384 +1386 4 441.468 529.124 31.574 0.899 1385 +1387 4 441.686 526.884 31.493 0.889 1386 +1388 4 441.144 524.661 31.562 0.880 1387 +1389 4 440.628 522.433 31.666 0.870 1388 +1390 4 440.238 520.236 31.887 0.861 1389 +1391 4 440.073 518.032 32.153 0.852 1390 +1392 4 440.026 515.822 31.812 0.842 1391 +1393 4 439.172 513.716 31.238 0.833 1392 +1394 4 438.785 511.542 30.557 0.823 1393 +1395 4 438.772 509.305 29.865 0.814 1394 +1396 4 438.795 507.038 29.349 0.804 1395 +1397 4 439.228 504.796 29.054 0.795 1396 +1398 4 438.811 502.586 28.817 0.786 1397 +1399 4 437.753 500.590 28.356 0.776 1398 +1400 4 436.585 498.644 27.674 0.767 1399 +1401 4 435.624 496.649 26.772 0.758 1400 +1402 4 434.820 494.550 25.863 0.748 1401 +1403 4 433.733 492.643 25.077 0.739 1402 +1404 4 432.513 490.737 24.785 0.729 1403 +1405 4 431.699 488.626 24.854 0.720 1404 +1406 4 431.982 486.395 24.940 0.711 1405 +1407 4 431.470 484.187 24.841 0.701 1406 +1408 4 430.724 482.028 24.519 0.692 1407 +1409 4 429.413 480.257 23.889 0.683 1408 +1410 4 428.859 479.326 23.430 0.678 1409 +1411 4 428.387 477.159 22.546 0.669 1410 +1412 4 427.692 475.005 21.968 0.659 1411 +1413 4 427.365 473.919 21.908 0.655 1412 +1414 4 427.028 472.832 21.940 0.650 1413 +1415 4 426.900 471.705 21.993 0.645 1414 +1416 4 426.960 470.566 22.024 0.640 1415 +1417 4 426.838 469.438 22.006 0.635 1416 +1418 4 425.965 468.797 21.929 0.630 1417 +1419 4 424.816 466.964 21.481 0.621 1418 +1420 4 424.516 465.895 21.084 0.616 1419 +1421 4 424.176 464.806 20.710 0.611 1420 +1422 4 423.814 463.735 20.326 0.607 1421 +1423 4 423.516 462.682 19.897 0.602 1422 +1424 4 423.057 461.643 19.524 0.597 1423 +1425 4 422.433 460.686 19.278 0.593 1424 +1426 4 421.883 459.684 19.096 0.588 1425 +1427 4 421.593 458.588 18.903 0.583 1426 +1428 4 421.720 457.455 18.743 0.578 1427 +1429 4 422.008 456.347 18.616 0.574 1428 +1430 4 422.341 455.263 18.447 0.569 1429 +1431 4 422.150 454.137 18.300 0.564 1430 +1432 4 422.065 453.019 18.089 0.560 1431 +1433 4 421.998 451.881 17.892 0.555 1432 +1434 4 421.713 450.774 17.734 0.550 1433 +1435 4 421.076 449.823 17.607 0.546 1434 +1436 4 420.571 448.942 17.503 0.545 1435 +1437 4 420.142 447.883 17.410 0.543 1436 +1438 4 419.795 446.795 17.313 0.540 1437 +1439 4 419.358 445.750 17.167 0.538 1438 +1440 4 418.845 444.756 16.956 0.535 1439 +1441 4 418.461 443.690 16.736 0.533 1440 +1442 4 418.007 442.642 16.562 0.530 1441 +1443 4 417.488 441.623 16.447 0.528 1442 +1444 4 417.006 440.585 16.387 0.525 1443 +1445 4 416.487 439.567 16.379 0.523 1444 +1446 4 415.861 438.612 16.420 0.520 1445 +1447 4 415.153 437.716 16.494 0.518 1446 +1448 4 414.412 436.846 16.574 0.515 1447 +1449 4 413.686 435.966 16.670 0.513 1448 +1450 4 413.032 435.043 16.787 0.510 1449 +1451 4 412.555 434.014 16.894 0.508 1450 +1452 4 412.245 432.915 16.946 0.505 1451 +1453 4 411.935 431.823 16.905 0.503 1452 +1454 4 411.522 430.779 16.768 0.501 1453 +1455 4 411.107 429.746 16.550 0.498 1454 +1456 4 410.689 428.705 16.316 0.495 1455 +1457 4 410.278 427.647 16.172 0.493 1456 +1458 4 409.856 426.608 16.198 0.491 1457 +1459 4 409.164 425.738 16.343 0.488 1458 +1460 4 408.300 425.010 16.558 0.485 1459 +1461 4 407.531 424.202 16.866 0.483 1460 +1462 4 406.747 423.394 17.194 0.480 1461 +1463 4 405.961 422.568 17.469 0.478 1462 +1464 4 405.109 421.818 17.697 0.475 1463 +1465 4 404.220 421.108 17.870 0.473 1464 +1466 4 403.516 420.226 17.969 0.470 1465 +1467 4 403.078 419.174 17.997 0.468 1466 +1468 4 402.805 418.067 17.971 0.465 1467 +1469 4 402.595 416.943 17.912 0.463 1468 +1470 4 402.329 415.835 17.837 0.461 1469 +1471 4 401.888 414.786 17.767 0.458 1470 +1472 4 401.279 413.820 17.725 0.456 1471 +1473 4 400.594 412.906 17.708 0.453 1472 +1474 4 399.858 412.033 17.700 0.451 1473 +1475 4 399.015 411.269 17.672 0.448 1474 +1476 4 398.095 410.591 17.595 0.446 1475 +1477 4 397.318 409.781 17.460 0.443 1476 +1478 4 396.851 408.765 17.257 0.441 1477 +1479 4 396.661 407.666 16.988 0.438 1478 +1480 4 396.624 406.534 16.711 0.436 1479 +1481 4 396.550 405.396 16.484 0.433 1480 +1482 4 396.333 404.277 16.325 0.431 1481 +1483 4 395.956 403.202 16.212 0.428 1482 +1484 4 395.388 402.225 16.087 0.426 1483 +1485 4 394.757 401.288 15.913 0.423 1484 +1486 4 394.379 400.234 15.725 0.421 1485 +1487 4 394.473 399.123 15.546 0.418 1486 +1488 4 394.796 398.031 15.350 0.416 1487 +1489 4 394.971 396.923 15.112 0.413 1488 +1490 4 395.001 395.803 14.840 0.411 1489 +1491 4 394.891 394.680 14.585 0.408 1490 +1492 4 394.650 393.563 14.390 0.406 1491 +1493 4 394.434 392.441 14.261 0.403 1492 +1494 4 394.280 391.309 14.193 0.401 1493 +1495 4 394.224 390.168 14.174 0.398 1494 +1496 4 394.121 389.033 14.205 0.396 1495 +1497 4 393.747 387.974 14.285 0.393 1496 +1498 4 392.957 387.195 14.360 0.391 1497 +1499 4 392.236 386.332 14.402 0.388 1498 +1500 4 391.677 385.336 14.411 0.386 1499 +1501 4 391.293 384.265 14.388 0.383 1500 +1502 4 390.947 383.176 14.317 0.381 1501 +1503 4 390.480 382.146 14.178 0.378 1502 +1504 4 389.968 381.141 13.989 0.376 1503 +1505 4 389.527 380.092 13.817 0.373 1504 +1506 4 389.125 379.021 13.690 0.371 1505 +1507 4 388.278 378.369 13.607 0.368 1506 +1508 4 387.344 377.724 13.565 0.366 1507 +1509 4 386.530 376.923 13.558 0.363 1508 +1510 4 385.891 375.980 13.576 0.361 1509 +1511 4 385.158 375.110 13.609 0.358 1510 +1512 4 384.703 374.090 13.654 0.356 1511 +1513 4 384.391 372.990 13.710 0.353 1512 +1514 4 383.969 371.928 13.789 0.351 1513 +1515 4 383.440 370.943 13.948 0.348 1514 +1516 4 382.908 369.946 14.140 0.346 1515 +1517 4 382.412 368.917 14.294 0.343 1516 +1518 4 381.921 367.884 14.397 0.341 1517 +1519 4 381.515 366.816 14.451 0.338 1518 +1520 4 381.119 365.742 14.455 0.336 1519 +1521 4 380.677 364.687 14.412 0.333 1520 +1522 4 380.129 363.684 14.335 0.331 1521 +1523 4 379.493 362.735 14.225 0.328 1522 +1524 4 378.864 361.789 14.050 0.326 1523 +1525 4 378.217 360.859 13.812 0.323 1524 +1526 4 377.550 359.944 13.525 0.321 1525 +1527 4 376.878 359.032 13.200 0.318 1526 +1528 4 376.392 358.003 12.887 0.316 1527 +1529 4 376.001 356.929 12.603 0.314 1528 +1530 4 375.877 355.810 12.292 0.311 1529 +1531 4 375.902 354.693 11.932 0.309 1530 +1532 4 375.528 353.674 11.514 0.306 1531 +1533 4 375.023 352.702 11.056 0.304 1532 +1534 4 374.270 351.860 10.659 0.301 1533 +1535 4 373.443 351.070 10.358 0.299 1534 +1536 4 372.644 350.250 10.145 0.296 1535 +1537 4 371.846 349.433 9.997 0.294 1536 +1538 4 371.010 348.651 9.887 0.291 1537 +1539 4 370.201 347.844 9.787 0.289 1538 +1540 4 369.522 346.925 9.655 0.286 1539 +1541 4 368.875 346.004 9.440 0.284 1540 +1542 4 368.227 345.085 9.161 0.281 1541 +1543 4 367.558 344.180 8.847 0.279 1542 +1544 4 366.887 343.278 8.522 0.276 1543 +1545 4 366.393 342.252 8.262 0.274 1544 +1546 4 365.874 341.233 8.099 0.271 1545 +1547 4 365.322 340.234 8.019 0.269 1546 +1548 4 364.647 339.320 7.942 0.266 1547 +1549 4 363.716 338.663 7.895 0.264 1548 +1550 4 362.617 338.369 7.866 0.261 1549 +1551 4 361.574 337.903 7.843 0.259 1550 +1552 4 360.899 336.993 7.820 0.256 1551 +1553 4 360.498 335.923 7.799 0.254 1552 +1554 4 360.020 334.884 7.779 0.251 1553 +1555 4 359.477 333.878 7.755 0.249 1554 +1556 4 358.997 332.840 7.737 0.246 1555 +1557 4 358.474 331.824 7.691 0.244 1556 +1558 4 357.844 330.876 7.597 0.241 1557 +1559 4 357.270 329.931 7.406 0.239 1558 +1560 4 356.854 328.867 7.247 0.237 1559 +1561 4 356.402 327.827 7.180 0.234 1560 +1562 4 355.781 326.867 7.140 0.231 1561 +1563 4 355.074 325.971 7.149 0.229 1562 +1564 4 354.300 325.153 7.000 0.227 1563 +1565 4 421.468 449.197 17.886 0.541 1435 +1566 4 421.899 448.157 17.448 0.527 1565 +1567 4 422.047 447.051 17.229 0.512 1566 +1568 4 422.326 446.008 16.953 0.498 1567 +1569 4 422.881 445.015 16.681 0.484 1568 +1570 4 423.255 443.950 16.375 0.470 1569 +1571 4 423.558 442.863 16.043 0.456 1570 +1572 4 423.956 441.798 15.736 0.442 1571 +1573 4 424.493 440.801 15.451 0.428 1572 +1574 4 425.122 439.875 15.129 0.414 1573 +1575 4 425.645 438.886 14.798 0.399 1574 +1576 4 425.216 438.071 14.526 0.383 1575 +1577 4 424.344 437.347 14.342 0.368 1576 +1578 4 424.512 436.370 14.097 0.353 1577 +1579 4 425.460 435.859 13.803 0.338 1578 +1580 4 426.439 435.269 13.546 0.323 1579 +1581 4 427.417 434.718 13.244 0.309 1580 +1582 4 428.302 434.030 12.908 0.296 1581 +1583 4 429.130 433.241 12.638 0.282 1582 +1584 4 429.944 432.470 12.040 0.268 1583 +1585 4 456.731 674.846 41.208 1.544 1321 +1586 4 454.991 671.901 41.550 1.525 1585 +1587 4 453.676 668.731 41.503 1.505 1586 +1588 4 452.091 665.710 41.286 1.484 1587 +1589 4 450.153 662.883 41.206 1.464 1588 +1590 4 449.434 660.729 41.356 1.450 1589 +1591 4 448.981 658.496 41.389 1.437 1590 +1592 4 447.828 656.542 41.410 1.423 1591 +1593 4 446.139 655.019 41.593 1.409 1592 +1594 4 445.579 651.777 41.925 1.389 1593 +1595 4 445.474 648.482 42.518 1.368 1594 +1596 4 444.935 646.258 42.712 1.355 1595 +1597 4 444.619 643.993 42.769 1.341 1596 +1598 4 444.807 641.715 42.800 1.328 1597 +1599 4 443.583 639.844 42.856 1.314 1598 +1600 4 441.958 638.248 42.985 1.300 1599 +1601 4 440.489 636.502 43.184 1.287 1600 +1602 4 439.241 634.512 43.334 1.281 1601 +1603 4 438.154 632.499 43.377 1.273 1602 +1604 4 437.311 630.375 43.453 1.264 1603 +1605 4 436.324 628.315 43.590 1.256 1604 +1606 4 435.200 626.374 43.900 1.248 1605 +1607 4 433.709 624.761 44.394 1.239 1606 +1608 4 431.857 623.423 44.598 1.231 1607 +1609 4 430.205 621.881 44.396 1.223 1608 +1610 4 428.630 620.234 44.057 1.214 1609 +1611 4 427.057 618.605 43.891 1.206 1610 +1612 4 425.831 616.708 43.604 1.198 1611 +1613 4 424.880 614.636 43.378 1.189 1612 +1614 4 423.934 612.556 43.243 1.181 1613 +1615 4 422.867 610.534 43.173 1.173 1614 +1616 4 422.240 608.351 43.023 1.165 1615 +1617 4 421.328 606.268 42.847 1.156 1616 +1618 4 419.681 604.730 42.753 1.148 1617 +1619 4 417.919 603.271 42.732 1.140 1618 +1620 4 416.206 601.773 42.687 1.131 1619 +1621 4 414.913 600.000 42.769 1.123 1620 +1622 4 415.326 597.805 42.953 1.115 1621 +1623 4 415.666 595.625 43.299 1.106 1622 +1624 4 414.705 593.579 43.701 1.098 1623 +1625 4 413.070 592.006 43.963 1.090 1624 +1626 4 411.405 590.500 44.234 1.081 1625 +1627 4 409.591 589.129 44.372 1.073 1626 +1628 4 408.318 587.330 44.092 1.065 1627 +1629 4 407.627 585.166 43.660 1.056 1628 +1630 4 406.373 583.262 43.389 1.048 1629 +1631 4 405.204 581.298 43.306 1.040 1630 +1632 4 403.675 579.615 43.291 1.031 1631 +1633 4 401.944 578.118 43.283 1.023 1632 +1634 4 400.085 576.789 43.266 1.015 1633 +1635 4 398.230 575.451 43.233 1.007 1634 +1636 4 396.488 573.969 43.173 0.998 1635 +1637 4 395.032 572.222 43.026 0.990 1636 +1638 4 393.634 570.414 42.872 0.982 1637 +1639 4 392.104 568.714 42.816 0.973 1638 +1640 4 390.080 567.747 42.849 0.965 1639 +1641 4 388.056 566.805 42.965 0.956 1640 +1642 4 386.714 564.972 43.157 0.948 1641 +1643 4 385.782 562.893 43.273 0.940 1642 +1644 4 385.101 560.708 43.320 0.932 1643 +1645 4 384.314 558.561 43.341 0.923 1644 +1646 4 383.181 556.587 43.380 0.915 1645 +1647 4 381.465 555.110 43.458 0.907 1646 +1648 4 379.430 554.253 43.599 0.898 1647 +1649 4 378.180 552.385 43.932 0.890 1648 +1650 4 376.931 550.479 44.317 0.881 1649 +1651 4 375.725 548.539 44.596 0.873 1650 +1652 4 375.028 546.414 44.827 0.865 1651 +1653 4 374.865 544.134 44.944 0.856 1652 +1654 4 374.010 542.028 44.985 0.848 1653 +1655 4 372.766 540.113 44.988 0.840 1654 +1656 4 371.268 538.387 44.988 0.831 1655 +1657 4 370.198 536.416 44.989 0.823 1656 +1658 4 369.386 534.288 44.990 0.814 1657 +1659 4 368.336 532.257 44.993 0.806 1658 +1660 4 367.572 530.103 44.999 0.798 1659 +1661 4 366.300 528.215 45.010 0.789 1660 +1662 4 365.032 526.314 45.032 0.781 1661 +1663 4 363.942 524.303 45.074 0.773 1662 +1664 4 362.773 522.338 45.157 0.765 1663 +1665 4 361.650 520.348 45.320 0.756 1664 +1666 4 360.305 518.517 45.650 0.748 1665 +1667 4 358.979 516.666 46.015 0.739 1666 +1668 4 358.191 514.553 46.324 0.731 1667 +1669 4 357.810 512.319 46.476 0.723 1668 +1670 4 356.641 510.366 46.435 0.714 1669 +1671 4 354.941 508.852 46.429 0.706 1670 +1672 4 353.073 507.585 46.678 0.698 1671 +1673 4 351.118 506.411 47.020 0.689 1672 +1674 4 349.723 504.734 47.202 0.681 1673 +1675 4 349.339 503.658 47.239 0.676 1674 +1676 4 348.965 502.576 47.252 0.672 1675 +1677 4 348.761 501.451 47.259 0.668 1676 +1678 4 348.396 500.367 47.268 0.664 1677 +1679 4 347.943 499.316 47.281 0.660 1678 +1680 4 347.317 498.358 47.299 0.656 1679 +1681 4 346.807 497.335 47.320 0.651 1680 +1682 4 346.356 496.283 47.341 0.647 1681 +1683 4 345.684 495.378 47.426 0.643 1682 +1684 4 345.096 494.398 47.500 0.639 1683 +1685 4 344.218 493.664 47.545 0.635 1684 +1686 4 343.447 492.821 47.540 0.631 1685 +1687 4 342.893 491.833 47.463 0.626 1686 +1688 4 342.365 490.818 47.390 0.622 1687 +1689 4 341.739 489.861 47.324 0.618 1688 +1690 4 341.022 488.970 47.276 0.614 1689 +1691 4 340.309 488.075 47.248 0.610 1690 +1692 4 339.698 487.108 47.236 0.606 1691 +1693 4 339.088 486.141 47.236 0.602 1692 +1694 4 338.391 485.233 47.235 0.597 1693 +1695 4 337.689 484.330 47.235 0.593 1694 +1696 4 337.021 483.401 47.234 0.589 1695 +1697 4 336.406 482.436 47.233 0.585 1696 +1698 4 335.904 481.409 47.231 0.581 1697 +1699 4 335.607 480.304 47.228 0.577 1698 +1700 4 334.559 478.501 47.221 0.575 1699 +1701 4 333.635 477.844 47.214 0.574 1700 +1702 4 332.579 477.411 47.205 0.572 1701 +1703 4 331.520 476.978 47.193 0.571 1702 +1704 4 330.567 476.351 47.174 0.569 1703 +1705 4 329.737 475.565 47.149 0.568 1704 +1706 4 329.000 474.693 47.116 0.566 1705 +1707 4 328.345 473.754 47.075 0.565 1706 +1708 4 327.580 472.912 46.994 0.563 1707 +1709 4 326.623 472.304 46.875 0.562 1708 +1710 4 325.598 471.798 46.768 0.561 1709 +1711 4 324.716 471.073 46.679 0.559 1710 +1712 4 323.957 470.218 46.603 0.558 1711 +1713 4 323.289 469.291 46.542 0.556 1712 +1714 4 322.492 468.477 46.454 0.555 1713 +1715 4 321.662 467.699 46.345 0.553 1714 +1716 4 320.700 467.084 46.257 0.552 1715 +1717 4 319.706 466.519 46.191 0.550 1716 +1718 4 318.701 465.971 46.145 0.549 1717 +1719 4 317.772 465.305 46.119 0.547 1718 +1720 4 317.095 464.385 46.109 0.546 1719 +1721 4 316.475 463.424 46.107 0.544 1720 +1722 4 315.783 462.513 46.105 0.543 1721 +1723 4 314.768 461.991 46.102 0.541 1722 +1724 4 313.693 461.602 46.098 0.540 1723 +1725 4 312.764 460.934 46.093 0.538 1724 +1726 4 311.912 460.172 46.085 0.537 1725 +1727 4 311.398 459.149 46.074 0.535 1726 +1728 4 310.480 458.778 46.292 0.535 1727 +1729 4 309.381 458.480 46.255 0.535 1728 +1730 4 308.278 458.209 46.217 0.535 1729 +1731 4 307.187 457.885 46.145 0.535 1730 +1732 4 306.150 457.415 46.080 0.534 1731 +1733 4 305.176 456.816 46.036 0.534 1732 +1734 4 304.135 456.363 46.012 0.534 1733 +1735 4 303.065 455.961 45.997 0.534 1734 +1736 4 302.109 455.352 46.002 0.534 1735 +1737 4 301.092 454.853 46.055 0.533 1736 +1738 4 299.990 454.573 46.169 0.533 1737 +1739 4 298.910 454.213 46.320 0.533 1738 +1740 4 297.991 453.554 46.488 0.533 1739 +1741 4 297.202 452.733 46.698 0.532 1740 +1742 4 296.399 451.965 46.999 0.532 1741 +1743 4 295.494 451.301 47.339 0.532 1742 +1744 4 294.509 450.725 47.643 0.532 1743 +1745 4 293.541 450.329 48.034 0.532 1744 +1746 4 292.583 449.769 48.395 0.531 1745 +1747 4 291.717 449.027 48.658 0.531 1746 +1748 4 290.930 448.197 48.829 0.531 1747 +1749 4 290.087 447.425 48.933 0.531 1748 +1750 4 289.246 446.650 48.988 0.531 1749 +1751 4 288.401 445.879 49.002 0.530 1750 +1752 4 287.520 445.149 49.004 0.530 1751 +1753 4 286.708 444.346 49.006 0.530 1752 +1754 4 286.073 443.400 49.008 0.530 1753 +1755 4 285.581 442.369 49.011 0.529 1754 +1756 4 284.970 441.406 49.016 0.529 1755 +1757 4 284.202 440.561 49.022 0.529 1756 +1758 4 283.387 439.757 49.032 0.529 1757 +1759 4 282.471 439.078 49.044 0.529 1758 +1760 4 281.383 438.764 49.058 0.528 1759 +1761 4 280.253 438.596 49.084 0.528 1760 +1762 4 279.158 438.279 49.132 0.528 1761 +1763 4 278.244 437.609 49.174 0.528 1762 +1764 4 277.514 436.732 49.202 0.528 1763 +1765 4 277.188 435.647 49.218 0.527 1764 +1766 4 277.140 434.506 49.226 0.527 1765 +1767 4 276.913 433.396 49.186 0.527 1766 +1768 4 276.332 432.415 49.153 0.527 1767 +1769 4 275.481 431.651 49.146 0.527 1768 +1770 4 274.557 430.979 49.166 0.526 1769 +1771 4 273.569 430.411 49.218 0.526 1770 +1772 4 272.740 429.661 49.361 0.526 1771 +1773 4 271.729 429.144 49.511 0.526 1772 +1774 4 270.863 428.428 49.709 0.525 1773 +1775 4 270.041 427.633 49.864 0.525 1774 +1776 4 269.198 426.862 49.979 0.525 1775 +1777 4 268.251 426.225 50.060 0.525 1776 +1778 4 267.249 425.678 50.114 0.525 1777 +1779 4 266.297 425.044 50.157 0.524 1778 +1780 4 265.442 424.338 50.194 0.524 1779 +1781 4 264.836 423.376 50.260 0.524 1780 +1782 4 264.126 422.497 50.374 0.524 1781 +1783 4 263.316 421.691 50.475 0.524 1782 +1784 4 262.559 420.850 50.557 0.523 1783 +1785 4 261.951 419.882 50.622 0.523 1784 +1786 4 261.258 418.975 50.674 0.523 1785 +1787 4 260.307 418.515 50.715 0.523 1786 +1788 4 259.274 418.156 50.751 0.522 1787 +1789 4 258.480 417.360 50.824 0.522 1788 +1790 4 257.677 416.568 50.928 0.522 1789 +1791 4 256.758 415.887 51.018 0.522 1790 +1792 4 255.846 415.197 51.086 0.522 1791 +1793 4 255.197 414.293 51.134 0.521 1792 +1794 4 254.786 413.227 51.162 0.521 1793 +1795 4 254.248 412.231 51.173 0.521 1794 +1796 4 253.402 411.492 51.174 0.521 1795 +1797 4 252.427 410.893 51.175 0.520 1796 +1798 4 251.593 410.131 51.175 0.520 1797 +1799 4 250.847 409.264 51.176 0.520 1798 +1800 4 249.990 408.517 51.177 0.520 1799 +1801 4 249.133 407.763 51.178 0.520 1800 +1802 4 248.253 407.036 51.180 0.519 1801 +1803 4 247.265 406.467 51.183 0.519 1802 +1804 4 246.244 405.954 51.187 0.519 1803 +1805 4 245.469 405.159 51.192 0.519 1804 +1806 4 244.943 404.148 51.200 0.519 1805 +1807 4 244.237 403.271 51.210 0.518 1806 +1808 4 243.249 402.726 51.225 0.518 1807 +1809 4 242.157 402.391 51.246 0.518 1808 +1810 4 241.152 401.867 51.274 0.518 1809 +1811 4 240.176 401.269 51.315 0.517 1810 +1812 4 239.204 400.667 51.374 0.517 1811 +1813 4 238.358 399.906 51.451 0.517 1812 +1814 4 237.469 399.190 51.547 0.517 1813 +1815 4 236.488 398.629 51.708 0.517 1814 +1816 4 235.482 398.214 51.984 0.516 1815 +1817 4 234.474 397.722 52.280 0.516 1816 +1818 4 233.485 397.151 52.520 0.516 1817 +1819 4 232.504 396.562 52.697 0.516 1818 +1820 4 231.525 395.970 52.818 0.516 1819 +1821 4 230.526 395.413 52.887 0.515 1820 +1822 4 229.521 394.868 52.920 0.515 1821 +1823 4 228.521 394.312 52.939 0.515 1822 +1824 4 227.512 393.785 52.989 0.515 1823 +1825 4 226.507 393.248 53.056 0.515 1824 +1826 4 225.528 392.659 53.096 0.514 1825 +1827 4 224.483 392.204 53.099 0.514 1826 +1828 4 223.372 391.940 53.057 0.514 1827 +1829 4 222.289 391.631 52.922 0.514 1828 +1830 4 221.269 391.155 52.714 0.513 1829 +1831 4 220.586 390.276 52.512 0.513 1830 +1832 4 219.877 389.380 52.344 0.513 1831 +1833 4 218.808 389.122 52.208 0.513 1832 +1834 4 217.686 389.240 52.051 0.513 1833 +1835 4 216.552 389.138 51.919 0.512 1834 +1836 4 215.431 388.913 51.823 0.512 1835 +1837 4 214.407 388.411 51.749 0.512 1836 +1838 4 213.380 387.909 51.689 0.512 1837 +1839 4 212.283 387.587 51.640 0.512 1838 +1840 4 211.149 387.448 51.599 0.511 1839 +1841 4 210.027 387.223 51.553 0.511 1840 +1842 4 209.061 386.649 51.439 0.511 1841 +1843 4 208.191 385.909 51.327 0.511 1842 +1844 4 207.348 385.137 51.231 0.511 1843 +1845 4 206.418 384.472 51.151 0.510 1844 +1846 4 205.445 383.869 51.085 0.510 1845 +1847 4 204.353 383.535 51.032 0.510 1846 +1848 4 203.567 382.726 50.947 0.510 1847 +1849 4 202.867 381.827 50.840 0.509 1848 +1850 4 202.253 380.863 50.756 0.509 1849 +1851 4 201.574 379.942 50.695 0.509 1850 +1852 4 200.872 379.039 50.656 0.509 1851 +1853 4 199.879 378.479 50.638 0.509 1852 +1854 4 198.857 377.964 50.638 0.508 1853 +1855 4 197.822 377.478 50.649 0.508 1854 +1856 4 196.840 376.891 50.664 0.508 1855 +1857 4 195.949 376.173 50.686 0.508 1856 +1858 4 195.187 375.321 50.715 0.508 1857 +1859 4 194.674 374.300 50.752 0.507 1858 +1860 4 194.232 373.245 50.808 0.507 1859 +1861 4 193.566 372.326 50.917 0.507 1860 +1862 4 193.017 371.324 51.028 0.507 1861 +1863 4 192.531 370.289 51.122 0.507 1862 +1864 4 192.046 369.252 51.201 0.506 1863 +1865 4 191.559 368.217 51.268 0.506 1864 +1866 4 191.069 367.183 51.327 0.506 1865 +1867 4 190.537 366.170 51.387 0.506 1866 +1868 4 189.957 365.196 51.504 0.505 1867 +1869 4 189.259 364.292 51.638 0.505 1868 +1870 4 188.468 363.465 51.761 0.505 1869 +1871 4 187.666 362.649 51.876 0.505 1870 +1872 4 186.863 361.835 51.989 0.505 1871 +1873 4 186.091 360.996 52.137 0.504 1872 +1874 4 185.329 360.154 52.322 0.504 1873 +1875 4 184.516 359.349 52.496 0.504 1874 +1876 4 183.702 358.581 52.745 0.504 1875 +1877 4 182.987 357.719 53.035 0.504 1876 +1878 4 182.463 356.703 53.268 0.503 1877 +1879 4 181.812 355.762 53.453 0.503 1878 +1880 4 181.124 354.849 53.605 0.503 1879 +1881 4 180.607 353.831 53.757 0.503 1880 +1882 4 180.169 352.779 53.927 0.503 1881 +1883 4 179.665 351.756 54.116 0.502 1882 +1884 4 178.975 350.844 54.308 0.502 1883 +1885 4 178.278 349.950 54.549 0.502 1884 +1886 4 177.581 349.087 54.871 0.502 1885 +1887 4 176.901 348.211 55.236 0.501 1886 +1888 4 176.412 347.181 55.559 0.501 1887 +1889 4 175.923 346.152 55.838 0.501 1888 +1890 4 175.414 345.128 56.051 0.501 1889 +1891 4 174.898 344.106 56.194 0.501 1890 +1892 4 174.410 343.072 56.283 0.500 1891 +1893 4 174.007 342.001 56.343 0.500 1892 +1894 4 173.623 340.926 56.396 0.500 1893 +1895 4 173.428 339.807 56.490 0.500 1894 +1896 4 173.125 338.709 56.599 0.500 1895 +1897 4 172.626 337.680 56.687 0.499 1896 +1898 4 172.002 336.726 56.754 0.499 1897 +1899 4 171.184 335.928 56.804 0.499 1898 +1900 4 170.418 335.076 56.838 0.499 1899 +1901 4 169.682 334.202 56.863 0.499 1900 +1902 4 169.073 333.236 56.890 0.498 1901 +1903 4 168.598 332.195 56.928 0.498 1902 +1904 4 168.064 331.183 56.979 0.498 1903 +1905 4 167.484 330.198 57.044 0.498 1904 +1906 4 166.852 329.250 57.151 0.497 1905 +1907 4 166.168 328.351 57.319 0.497 1906 +1908 4 165.504 327.439 57.518 0.497 1907 +1909 4 164.969 326.427 57.677 0.497 1908 +1910 4 164.433 325.418 57.792 0.497 1909 +1911 4 163.782 324.477 57.868 0.496 1910 +1912 4 163.109 323.553 57.907 0.496 1911 +1913 4 162.362 322.686 57.920 0.496 1912 +1914 4 161.606 321.828 57.921 0.496 1913 +1915 4 160.915 320.916 57.921 0.496 1914 +1916 4 160.221 320.008 57.920 0.495 1915 +1917 4 159.514 319.108 57.920 0.495 1916 +1918 4 158.906 318.140 57.919 0.495 1917 +1919 4 158.319 317.158 57.919 0.495 1918 +1920 4 157.661 316.222 57.917 0.495 1919 +1921 4 156.996 315.292 57.916 0.494 1920 +1922 4 156.357 314.343 57.914 0.494 1921 +1923 4 155.789 313.351 57.911 0.494 1922 +1924 4 155.187 312.384 57.907 0.494 1923 +1925 4 154.360 311.592 57.901 0.493 1924 +1926 4 153.519 310.819 57.893 0.493 1925 +1927 4 152.753 309.969 57.882 0.493 1926 +1928 4 151.994 309.113 57.866 0.493 1927 +1929 4 151.286 308.215 57.844 0.493 1928 +1930 4 150.579 307.318 57.813 0.492 1929 +1931 4 149.740 306.540 57.768 0.492 1930 +1932 4 148.844 305.831 57.708 0.492 1931 +1933 4 147.949 305.119 57.630 0.492 1932 +1934 4 147.042 304.430 57.520 0.492 1933 +1935 4 146.061 303.886 57.317 0.491 1934 +1936 4 145.031 303.444 57.056 0.491 1935 +1937 4 143.956 303.057 56.832 0.491 1936 +1938 4 143.002 302.462 56.623 0.491 1937 +1939 4 142.302 301.606 56.358 0.490 1938 +1940 4 141.637 300.687 56.125 0.490 1939 +1941 4 140.912 299.802 55.977 0.490 1940 +1942 4 140.074 299.055 55.893 0.490 1941 +1943 4 139.014 298.625 55.858 0.490 1942 +1944 4 137.930 298.282 55.878 0.489 1943 +1945 4 136.806 298.101 55.971 0.489 1944 +1946 4 135.702 297.832 56.087 0.489 1945 +1947 4 134.671 297.350 56.186 0.489 1946 +1948 4 133.771 296.652 56.271 0.489 1947 +1949 4 133.075 295.758 56.347 0.488 1948 +1950 4 132.631 294.707 56.415 0.488 1949 +1951 4 132.298 293.614 56.494 0.488 1950 +1952 4 131.959 292.529 56.620 0.488 1951 +1953 4 131.728 291.416 56.776 0.487 1952 +1954 4 131.703 290.280 56.925 0.487 1953 +1955 4 131.897 289.154 57.077 0.487 1954 +1956 4 132.162 288.051 57.266 0.487 1955 +1957 4 132.449 286.968 57.517 0.487 1956 +1958 4 132.570 285.843 57.771 0.486 1957 +1959 4 132.683 284.722 57.994 0.486 1958 +1960 4 133.084 283.651 58.203 0.486 1959 +1961 4 133.520 282.599 58.424 0.486 1960 +1962 4 133.834 281.532 58.686 0.486 1961 +1963 4 133.904 280.418 59.001 0.485 1962 +1964 4 133.992 279.292 59.315 0.485 1963 +1965 4 134.282 278.199 59.581 0.485 1964 +1966 4 134.809 277.184 59.815 0.485 1965 +1967 4 135.400 276.206 60.028 0.485 1966 +1968 4 135.982 275.225 60.236 0.484 1967 +1969 4 136.388 274.178 60.500 0.484 1968 +1970 4 136.620 273.129 60.916 0.484 1969 +1971 4 136.913 272.113 61.457 0.484 1970 +1972 4 137.028 271.067 62.007 0.483 1971 +1973 4 136.867 269.951 62.511 0.483 1972 +1974 4 137.169 268.913 63.022 0.483 1973 +1975 4 137.879 268.061 63.488 0.483 1974 +1976 4 138.586 267.174 63.871 0.483 1975 +1977 4 139.065 266.146 64.233 0.482 1976 +1978 4 139.447 265.074 64.625 0.482 1977 +1979 4 139.682 264.073 65.159 0.482 1978 +1980 4 139.942 263.093 65.822 0.482 1979 +1981 4 140.664 262.276 66.403 0.481 1980 +1982 4 141.294 261.437 67.052 0.481 1981 +1983 4 141.857 260.573 67.763 0.481 1982 +1984 4 142.182 259.490 68.335 0.481 1983 +1985 4 142.144 258.351 68.774 0.481 1984 +1986 4 142.486 257.298 69.213 0.480 1985 +1987 4 143.038 256.317 69.655 0.480 1986 +1988 4 143.692 255.380 70.035 0.480 1987 +1989 4 144.147 254.332 70.399 0.480 1988 +1990 4 144.548 253.260 70.797 0.480 1989 +1991 4 145.064 252.242 71.269 0.479 1990 +1992 4 145.537 251.359 71.980 0.479 1991 +1993 4 146.042 250.653 72.951 0.479 1992 +1994 4 146.567 249.948 74.107 0.479 1993 +1995 4 147.250 249.091 75.233 0.479 1994 +1996 4 147.923 248.277 76.350 0.478 1995 +1997 4 148.435 247.327 77.405 0.478 1996 +1998 4 148.519 246.189 78.271 0.478 1997 +1999 4 148.499 245.112 79.127 0.478 1998 +2000 4 148.411 244.173 80.087 0.477 1999 +2001 4 148.387 243.294 81.157 0.477 2000 +2002 4 148.122 242.319 82.218 0.477 2001 +2003 4 147.783 241.333 83.220 0.477 2002 +2004 4 147.225 240.334 84.013 0.477 2003 +2005 4 146.671 239.334 84.620 0.476 2004 +2006 4 146.238 238.279 85.107 0.476 2005 +2007 4 146.084 237.162 85.579 0.476 2006 +2008 4 146.250 236.058 86.141 0.476 2007 +2009 4 146.336 234.968 86.829 0.476 2008 +2010 4 146.119 233.959 87.713 0.475 2009 +2011 4 145.822 233.029 88.773 0.475 2010 +2012 4 145.517 232.227 90.000 0.475 2011 +2013 4 145.050 231.255 91.197 0.475 2012 +2014 4 144.546 230.410 92.410 0.474 2013 +2015 4 143.936 229.746 93.654 0.474 2014 +2016 4 143.018 229.147 94.775 0.474 2015 +2017 4 142.083 228.506 95.720 0.474 2016 +2018 4 141.475 227.647 96.621 0.474 2017 +2019 4 141.331 226.709 97.669 0.473 2018 +2020 4 141.460 225.842 98.859 0.473 2019 +2021 4 141.776 225.041 100.163 0.473 2020 +2022 4 142.062 224.271 101.557 0.473 2021 +2023 4 142.323 223.398 102.925 0.472 2022 +2024 4 142.552 222.366 104.133 0.472 2023 +2025 4 142.713 221.283 105.125 0.472 2024 +2026 4 142.739 220.150 105.869 0.472 2025 +2027 4 142.668 219.008 106.391 0.472 2026 +2028 4 142.492 217.886 106.791 0.471 2027 +2029 4 142.195 216.801 107.173 0.471 2028 +2030 4 141.856 215.734 107.586 0.471 2029 +2031 4 141.517 214.667 108.042 0.471 2030 +2032 4 141.212 213.580 108.517 0.471 2031 +2033 4 140.950 212.467 108.967 0.470 2032 +2034 4 140.722 211.359 109.430 0.470 2033 +2035 4 140.544 210.286 109.981 0.470 2034 +2036 4 140.686 209.321 110.650 0.470 2035 +2037 4 141.162 208.424 111.402 0.469 2036 +2038 4 141.704 207.496 112.143 0.469 2037 +2039 4 142.055 206.453 112.774 0.469 2038 +2040 4 142.125 205.314 113.244 0.469 2039 +2041 4 142.056 204.174 113.565 0.469 2040 +2042 4 141.864 203.049 113.782 0.468 2041 +2043 4 141.926 201.939 113.945 0.468 2042 +2044 4 142.272 200.849 114.105 0.468 2043 +2045 4 142.675 199.779 114.311 0.468 2044 +2046 4 143.145 198.744 114.614 0.468 2045 +2047 4 143.602 197.704 115.026 0.467 2046 +2048 4 144.002 196.639 115.541 0.467 2047 +2049 4 144.548 195.694 116.215 0.467 2048 +2050 4 145.312 194.993 117.105 0.467 2049 +2051 4 146.211 194.521 118.188 0.467 2050 +2052 4 146.996 193.903 119.422 0.466 2051 +2053 4 147.409 193.082 120.815 0.466 2052 +2054 4 147.769 192.693 122.421 0.466 2053 +2055 4 148.428 192.912 124.110 0.466 2054 +2056 4 149.242 193.313 125.751 0.465 2055 +2057 4 149.707 193.860 127.376 0.465 2056 +2058 4 149.512 194.804 128.817 0.465 2057 +2059 4 149.140 195.823 130.020 0.465 2058 +2060 4 148.778 196.857 131.002 0.465 2059 +2061 4 148.481 197.933 131.800 0.464 2060 +2062 4 148.193 199.013 132.457 0.464 2061 +2063 4 148.115 200.139 132.971 0.464 2062 +2064 4 148.388 201.247 133.341 0.464 2063 +2065 4 149.005 202.205 133.605 0.464 2064 +2066 4 149.620 203.045 134.400 0.463 2065 +2067 4 311.404 458.277 46.059 0.535 1727 +2068 4 311.412 457.133 46.038 0.535 2067 +2069 4 311.404 455.989 46.008 0.534 2068 +2070 4 311.350 454.848 45.968 0.533 2069 +2071 4 310.937 453.800 45.912 0.533 2070 +2072 4 310.276 452.871 45.832 0.532 2071 +2073 4 309.536 452.002 45.711 0.531 2072 +2074 4 308.785 451.143 45.555 0.531 2073 +2075 4 308.044 450.292 45.349 0.530 2074 +2076 4 307.307 449.446 45.100 0.529 2075 +2077 4 306.613 448.544 44.885 0.529 2076 +2078 4 305.942 447.619 44.738 0.528 2077 +2079 4 305.636 446.533 44.661 0.527 2078 +2080 4 305.233 445.467 44.647 0.526 2079 +2081 4 304.843 444.391 44.683 0.526 2080 +2082 4 304.770 443.258 44.754 0.525 2081 +2083 4 304.945 442.206 44.970 0.524 2082 +2084 4 305.350 441.152 45.182 0.524 2083 +2085 4 305.705 440.065 45.352 0.523 2084 +2086 4 306.022 438.965 45.482 0.522 2085 +2087 4 306.360 437.873 45.577 0.522 2086 +2088 4 306.792 436.814 45.639 0.521 2087 +2089 4 307.219 435.753 45.682 0.520 2088 +2090 4 307.525 434.667 45.774 0.519 2089 +2091 4 307.805 433.560 45.845 0.519 2090 +2092 4 307.467 432.487 45.888 0.518 2091 +2093 4 307.151 431.388 45.895 0.517 2092 +2094 4 306.935 430.271 45.836 0.517 2093 +2095 4 306.754 429.144 45.737 0.516 2094 +2096 4 306.789 428.004 45.624 0.515 2095 +2097 4 306.745 426.863 45.504 0.515 2096 +2098 4 306.601 425.728 45.405 0.514 2097 +2099 4 306.641 424.586 45.327 0.513 2098 +2100 4 306.611 423.442 45.266 0.512 2099 +2101 4 306.749 422.309 45.200 0.512 2100 +2102 4 307.146 421.239 45.117 0.511 2101 +2103 4 307.561 420.173 45.038 0.510 2102 +2104 4 307.284 419.075 44.957 0.510 2103 +2105 4 306.605 418.156 44.872 0.509 2104 +2106 4 306.145 417.112 44.771 0.508 2105 +2107 4 305.956 415.992 44.622 0.508 2106 +2108 4 305.966 414.864 44.425 0.507 2107 +2109 4 306.158 413.747 44.210 0.506 2108 +2110 4 306.613 412.701 44.013 0.505 2109 +2111 4 307.203 411.722 43.870 0.505 2110 +2112 4 307.691 410.689 43.778 0.504 2111 +2113 4 308.081 409.614 43.732 0.503 2112 +2114 4 308.488 408.544 43.718 0.503 2113 +2115 4 308.843 407.456 43.725 0.502 2114 +2116 4 309.128 406.349 43.743 0.501 2115 +2117 4 309.378 405.232 43.767 0.501 2116 +2118 4 309.526 404.099 43.797 0.500 2117 +2119 4 309.590 402.958 43.848 0.499 2118 +2120 4 309.603 401.820 43.934 0.498 2119 +2121 4 309.659 400.680 44.025 0.498 2120 +2122 4 309.873 399.557 44.089 0.497 2121 +2123 4 310.170 398.454 44.127 0.496 2122 +2124 4 310.285 397.319 44.140 0.496 2123 +2125 4 310.144 396.183 44.129 0.495 2124 +2126 4 309.979 395.053 44.093 0.494 2125 +2127 4 309.895 393.917 44.014 0.494 2126 +2128 4 309.714 392.789 43.925 0.493 2127 +2129 4 309.420 391.684 43.843 0.492 2128 +2130 4 309.015 390.614 43.763 0.491 2129 +2131 4 308.526 389.580 43.683 0.491 2130 +2132 4 308.027 388.552 43.600 0.490 2131 +2133 4 307.591 387.513 43.496 0.489 2132 +2134 4 307.566 386.416 43.285 0.489 2133 +2135 4 307.753 385.293 43.074 0.488 2134 +2136 4 307.837 384.155 42.904 0.487 2135 +2137 4 307.702 383.022 42.772 0.487 2136 +2138 4 307.450 381.906 42.669 0.486 2137 +2139 4 307.277 380.776 42.590 0.485 2138 +2140 4 307.164 379.638 42.525 0.484 2139 +2141 4 307.072 378.497 42.449 0.484 2140 +2142 4 306.992 377.366 42.321 0.483 2141 +2143 4 306.987 376.258 42.106 0.482 2142 +2144 4 307.186 375.134 41.908 0.482 2143 +2145 4 307.305 374.000 41.748 0.481 2144 +2146 4 307.203 372.864 41.606 0.480 2145 +2147 4 307.129 371.743 41.450 0.480 2146 +2148 4 307.376 370.629 41.326 0.479 2147 +2149 4 307.656 369.526 41.241 0.478 2148 +2150 4 307.687 368.385 41.177 0.477 2149 +2151 4 307.594 367.245 41.127 0.477 2150 +2152 4 307.567 366.104 41.092 0.476 2151 +2153 4 307.602 364.968 41.072 0.475 2152 +2154 4 307.394 363.848 41.027 0.475 2153 +2155 4 306.987 362.783 40.931 0.474 2154 +2156 4 306.490 361.768 40.750 0.473 2155 +2157 4 305.982 360.773 40.488 0.473 2156 +2158 4 305.631 359.696 40.200 0.472 2157 +2159 4 305.311 358.610 39.916 0.471 2158 +2160 4 304.792 357.610 39.646 0.470 2159 +2161 4 304.131 356.685 39.422 0.470 2160 +2162 4 303.650 355.671 39.281 0.469 2161 +2163 4 303.549 354.537 39.225 0.468 2162 +2164 4 303.555 353.399 39.259 0.468 2163 +2165 4 303.479 352.262 39.345 0.467 2164 +2166 4 303.389 351.121 39.441 0.466 2165 +2167 4 303.285 349.982 39.532 0.466 2166 +2168 4 303.201 348.841 39.614 0.465 2167 +2169 4 302.961 347.743 39.703 0.464 2168 +2170 4 302.418 346.744 39.827 0.464 2169 +2171 4 301.975 345.718 39.956 0.463 2170 +2172 4 301.871 344.581 40.063 0.462 2171 +2173 4 301.733 343.454 40.186 0.461 2172 +2174 4 301.536 342.342 40.361 0.461 2173 +2175 4 301.578 341.201 40.558 0.460 2174 +2176 4 301.634 340.085 40.797 0.459 2175 +2177 4 301.468 339.030 41.152 0.459 2176 +2178 4 300.972 338.060 41.528 0.458 2177 +2179 4 300.247 337.175 41.813 0.457 2178 +2180 4 299.482 336.329 42.018 0.457 2179 +2181 4 298.727 335.487 42.160 0.456 2180 +2182 4 298.123 334.516 42.239 0.455 2181 +2183 4 297.453 333.590 42.269 0.454 2182 +2184 4 296.806 332.651 42.279 0.454 2183 +2185 4 296.313 331.622 42.286 0.453 2184 +2186 4 295.957 330.537 42.289 0.452 2185 +2187 4 295.732 329.416 42.295 0.452 2186 +2188 4 295.542 328.289 42.310 0.451 2187 +2189 4 295.326 327.167 42.317 0.450 2188 +2190 4 294.980 326.090 42.296 0.450 2189 +2191 4 294.319 325.172 42.240 0.449 2190 +2192 4 293.494 324.379 42.147 0.448 2191 +2193 4 292.621 323.651 42.013 0.448 2192 +2194 4 291.671 323.084 41.775 0.447 2193 +2195 4 290.740 322.535 41.393 0.446 2194 +2196 4 289.821 321.876 40.993 0.445 2195 +2197 4 289.070 321.024 40.611 0.445 2196 +2198 4 288.629 320.058 40.157 0.444 2197 +2199 4 288.509 319.041 39.588 0.443 2198 +2200 4 288.484 317.945 39.030 0.443 2199 +2201 4 288.217 316.863 38.558 0.442 2200 +2202 4 287.627 315.894 38.154 0.441 2201 +2203 4 286.920 314.999 37.827 0.440 2202 +2204 4 286.170 314.137 37.589 0.440 2203 +2205 4 285.404 313.290 37.398 0.439 2204 +2206 4 284.628 312.455 37.199 0.438 2205 +2207 4 283.744 311.755 37.001 0.438 2206 +2208 4 282.737 311.241 36.777 0.437 2207 +2209 4 281.743 310.728 36.494 0.436 2208 +2210 4 280.870 310.023 36.221 0.435 2209 +2211 4 280.282 309.066 36.005 0.435 2210 +2212 4 280.070 307.972 35.794 0.434 2211 +2213 4 280.122 306.857 35.564 0.433 2212 +2214 4 280.273 305.733 35.390 0.433 2213 +2215 4 280.559 304.629 35.300 0.432 2214 +2216 4 281.022 303.588 35.284 0.431 2215 +2217 4 281.497 302.569 35.381 0.431 2216 +2218 4 281.963 301.542 35.564 0.430 2217 +2219 4 282.454 300.513 35.751 0.429 2218 +2220 4 282.983 299.499 35.905 0.429 2219 +2221 4 283.501 298.479 36.028 0.428 2220 +2222 4 283.642 297.374 36.128 0.427 2221 +2223 4 283.582 296.231 36.213 0.426 2222 +2224 4 283.493 295.090 36.298 0.426 2223 +2225 4 283.214 293.989 36.392 0.425 2224 +2226 4 282.729 293.084 36.634 0.424 2225 +2227 4 282.139 292.170 36.937 0.424 2226 +2228 4 281.705 291.121 37.172 0.423 2227 +2229 4 281.552 290.001 37.295 0.422 2228 +2230 4 281.478 288.869 37.314 0.421 2229 +2231 4 281.270 287.748 37.297 0.421 2230 +2232 4 280.886 286.674 37.276 0.420 2231 +2233 4 280.529 285.588 37.267 0.419 2232 +2234 4 280.275 284.474 37.281 0.419 2233 +2235 4 279.925 283.387 37.316 0.418 2234 +2236 4 279.523 282.316 37.367 0.417 2235 +2237 4 279.314 281.196 37.427 0.417 2236 +2238 4 279.133 280.068 37.513 0.416 2237 +2239 4 278.992 278.935 37.627 0.415 2238 +2240 4 279.355 277.880 37.755 0.414 2239 +2241 4 279.804 276.853 37.956 0.414 2240 +2242 4 279.711 275.749 38.172 0.413 2241 +2243 4 279.305 274.695 38.400 0.412 2242 +2244 4 278.775 273.693 38.620 0.412 2243 +2245 4 278.419 272.613 38.789 0.411 2244 +2246 4 278.166 271.497 38.893 0.410 2245 +2247 4 278.220 270.374 38.889 0.410 2246 +2248 4 278.339 269.247 38.816 0.409 2247 +2249 4 278.286 268.109 38.745 0.408 2248 +2250 4 278.558 267.012 38.705 0.407 2249 +2251 4 278.766 265.893 38.731 0.407 2250 +2252 4 279.038 264.789 38.819 0.406 2251 +2253 4 279.197 263.699 39.005 0.405 2252 +2254 4 278.931 262.609 39.164 0.405 2253 +2255 4 278.248 261.711 39.242 0.404 2254 +2256 4 277.413 260.990 39.182 0.403 2255 +2257 4 276.503 260.338 39.050 0.403 2256 +2258 4 275.479 259.847 38.932 0.402 2257 +2259 4 274.517 259.232 38.888 0.401 2258 +2260 4 273.871 258.307 38.966 0.401 2259 +2261 4 273.510 257.271 39.229 0.400 2260 +2262 4 273.419 256.210 39.671 0.399 2261 +2263 4 273.495 255.096 40.162 0.398 2262 +2264 4 273.534 253.960 40.630 0.398 2263 +2265 4 273.525 252.827 41.072 0.397 2264 +2266 4 273.645 251.694 41.450 0.396 2265 +2267 4 273.821 250.563 41.759 0.396 2266 +2268 4 273.773 249.442 42.084 0.395 2267 +2269 4 273.406 248.402 42.466 0.394 2268 +2270 4 272.772 247.459 42.807 0.394 2269 +2271 4 272.099 246.542 43.154 0.393 2270 +2272 4 271.424 245.632 43.525 0.392 2271 +2273 4 270.749 244.721 43.916 0.391 2272 +2274 4 270.196 243.723 44.285 0.391 2273 +2275 4 269.801 242.664 44.677 0.390 2274 +2276 4 269.454 241.651 45.174 0.389 2275 +2277 4 269.038 240.682 45.751 0.389 2276 +2278 4 268.843 239.634 46.353 0.388 2277 +2279 4 268.679 238.556 46.717 0.387 2278 +2280 4 268.716 237.448 47.059 0.387 2279 +2281 4 268.716 236.325 47.364 0.386 2280 +2282 4 268.700 235.182 47.559 0.385 2281 +2283 4 268.679 234.040 47.663 0.384 2282 +2284 4 268.655 232.896 47.711 0.384 2283 +2285 4 268.710 231.753 47.731 0.383 2284 +2286 4 268.803 230.613 47.703 0.382 2285 +2287 4 268.883 229.481 47.608 0.382 2286 +2288 4 268.698 228.356 47.494 0.381 2287 +2289 4 268.255 227.304 47.402 0.380 2288 +2290 4 267.790 226.268 47.363 0.380 2289 +2291 4 267.514 225.161 47.311 0.379 2290 +2292 4 267.328 224.036 47.204 0.378 2291 +2293 4 267.082 222.977 46.960 0.378 2292 +2294 4 266.625 221.931 46.728 0.377 2293 +2295 4 266.287 220.839 46.511 0.376 2294 +2296 4 265.863 219.815 46.213 0.375 2295 +2297 4 265.401 218.783 45.911 0.375 2296 +2298 4 264.533 218.043 45.674 0.374 2297 +2299 4 263.586 217.401 45.489 0.373 2298 +2300 4 262.640 216.759 45.321 0.373 2299 +2301 4 261.542 216.440 45.157 0.372 2300 +2302 4 260.968 215.460 44.989 0.371 2301 +2303 4 261.075 214.323 44.788 0.371 2302 +2304 4 261.136 213.240 44.422 0.370 2303 +2305 4 260.670 212.266 43.922 0.369 2304 +2306 4 259.918 211.429 43.382 0.368 2305 +2307 4 259.119 210.638 42.872 0.368 2306 +2308 4 258.965 209.543 42.321 0.367 2307 +2309 4 259.251 208.471 41.695 0.366 2308 +2310 4 259.534 207.395 41.031 0.365 2309 +2311 4 259.731 206.346 40.337 0.365 2310 +2312 4 260.100 205.546 39.412 0.364 2311 +2313 4 260.388 204.663 38.356 0.363 2312 +2314 4 260.541 203.732 37.261 0.363 2313 +2315 4 260.437 202.741 36.225 0.362 2314 +2316 4 260.022 201.822 35.287 0.361 2315 +2317 4 259.762 200.756 34.595 0.361 2316 +2318 4 259.775 199.620 34.238 0.360 2317 +2319 4 259.637 198.521 34.164 0.359 2318 +2320 4 259.193 197.467 34.264 0.358 2319 +2321 4 258.811 196.428 34.539 0.358 2320 +2322 4 258.396 195.423 34.946 0.357 2321 +2323 4 257.985 194.422 35.416 0.356 2322 +2324 4 257.720 193.365 35.927 0.356 2323 +2325 4 257.381 192.279 36.371 0.355 2324 +2326 4 257.106 191.184 36.764 0.354 2325 +2327 4 256.952 190.117 37.183 0.353 2326 +2328 4 256.542 189.130 37.549 0.353 2327 +2329 4 255.851 188.220 37.786 0.352 2328 +2330 4 255.445 187.198 37.911 0.351 2329 +2331 4 255.530 186.094 37.999 0.351 2330 +2332 4 255.706 184.981 37.987 0.350 2331 +2333 4 255.872 183.851 37.825 0.349 2332 +2334 4 256.568 183.006 37.577 0.348 2333 +2335 4 257.654 182.912 37.185 0.348 2334 +2336 4 258.678 183.066 36.548 0.347 2335 +2337 4 259.396 183.016 35.580 0.346 2336 +2338 4 259.567 182.454 34.406 0.345 2337 +2339 4 258.935 181.501 33.399 0.345 2338 +2340 4 258.475 180.476 32.506 0.344 2339 +2341 4 258.251 179.471 31.569 0.343 2340 +2342 4 258.094 178.422 30.651 0.343 2341 +2343 4 257.913 177.440 29.753 0.342 2342 +2344 4 258.425 177.263 28.752 0.341 2343 +2345 4 259.445 177.328 27.757 0.340 2344 +2346 4 260.434 177.129 26.803 0.339 2345 +2347 4 261.410 176.702 26.003 0.339 2346 +2348 4 262.386 176.111 25.439 0.338 2347 +2349 4 263.316 175.447 25.087 0.337 2348 +2350 4 264.226 174.754 24.902 0.337 2349 +2351 4 265.128 174.050 24.824 0.336 2350 +2352 4 266.028 173.345 24.817 0.335 2351 +2353 4 266.874 172.576 24.844 0.335 2352 +2354 4 267.494 171.632 24.884 0.334 2353 +2355 4 267.863 170.556 24.933 0.333 2354 +2356 4 267.984 169.425 24.987 0.332 2355 +2357 4 267.963 168.370 25.159 0.332 2356 +2358 4 267.812 167.287 25.345 0.331 2357 +2359 4 268.022 166.201 25.454 0.330 2358 +2360 4 268.589 165.215 25.487 0.330 2359 +2361 4 269.328 164.360 25.411 0.329 2360 +2362 4 269.913 163.415 25.218 0.328 2361 +2363 4 270.607 162.607 24.900 0.328 2362 +2364 4 271.256 161.746 24.536 0.327 2363 +2365 4 271.866 160.795 24.274 0.326 2364 +2366 4 272.399 159.785 24.159 0.326 2365 +2367 4 272.868 158.743 24.188 0.325 2366 +2368 4 273.338 157.794 24.464 0.324 2367 +2369 4 273.789 156.869 24.960 0.323 2368 +2370 4 274.113 155.867 25.559 0.323 2369 +2371 4 274.297 154.788 26.139 0.322 2370 +2372 4 274.383 153.659 26.578 0.321 2371 +2373 4 274.360 152.523 26.862 0.321 2372 +2374 4 274.192 151.398 26.973 0.320 2373 +2375 4 273.664 150.405 26.906 0.319 2374 +2376 4 273.108 149.460 26.601 0.318 2375 +2377 4 273.478 148.773 25.981 0.318 2376 +2378 4 274.212 148.274 25.173 0.317 2377 +2379 4 274.758 147.369 24.373 0.316 2378 +2380 4 275.190 146.316 23.741 0.315 2379 +2381 4 275.655 145.303 23.310 0.315 2380 +2382 4 276.581 144.745 23.078 0.314 2381 +2383 4 277.719 144.693 23.008 0.313 2382 +2384 4 278.817 144.409 23.072 0.313 2383 +2385 4 279.881 144.042 23.243 0.312 2384 +2386 4 280.919 143.818 23.573 0.311 2385 +2387 4 281.863 143.479 24.080 0.310 2386 +2388 4 282.938 143.603 24.622 0.310 2387 +2389 4 283.852 144.247 25.156 0.309 2388 +2390 4 284.613 145.099 25.648 0.308 2389 +2391 4 285.374 145.953 26.097 0.308 2390 +2392 4 286.170 146.740 26.556 0.307 2391 +2393 4 287.067 147.260 27.171 0.306 2392 +2394 4 288.049 147.418 27.961 0.306 2393 +2395 4 289.036 147.171 28.853 0.305 2394 +2396 4 289.788 146.534 29.843 0.304 2395 +2397 4 290.340 145.696 30.874 0.303 2396 +2398 4 290.868 144.757 31.832 0.303 2397 +2399 4 291.325 143.726 32.625 0.302 2398 +2400 4 291.423 142.613 33.279 0.301 2399 +2401 4 291.185 141.544 33.902 0.301 2400 +2402 4 290.632 140.646 34.541 0.300 2401 +2403 4 289.799 139.931 35.189 0.299 2402 +2404 4 288.974 139.273 35.904 0.298 2403 +2405 4 288.094 138.648 36.617 0.298 2404 +2406 4 287.075 138.525 37.276 0.297 2405 +2407 4 286.117 139.028 37.913 0.296 2406 +2408 4 285.205 139.650 38.505 0.296 2407 +2409 4 284.181 140.105 38.985 0.295 2408 +2410 4 283.076 140.392 39.349 0.294 2409 +2411 4 281.965 140.501 39.680 0.294 2410 +2412 4 280.838 140.555 39.966 0.293 2411 +2413 4 279.705 140.690 40.162 0.292 2412 +2414 4 278.586 140.924 40.278 0.291 2413 +2415 4 277.455 141.090 40.339 0.291 2414 +2416 4 276.321 141.228 40.351 0.290 2415 +2417 4 275.188 141.393 40.319 0.289 2416 +2418 4 274.051 141.503 40.255 0.289 2417 +2419 4 272.908 141.548 40.171 0.288 2418 +2420 4 271.767 141.521 40.050 0.287 2419 +2421 4 270.666 141.425 39.832 0.287 2420 +2422 4 269.576 141.245 39.541 0.286 2421 +2423 4 268.506 140.881 39.287 0.285 2422 +2424 4 267.510 140.325 39.104 0.284 2423 +2425 4 266.674 139.555 38.989 0.284 2424 +2426 4 265.909 138.704 38.939 0.283 2425 +2427 4 265.208 137.803 38.948 0.282 2426 +2428 4 264.771 136.758 38.998 0.282 2427 +2429 4 264.334 135.704 39.078 0.281 2428 +2430 4 263.724 134.740 39.190 0.280 2429 +2431 4 262.917 133.937 39.341 0.280 2430 +2432 4 261.981 133.284 39.540 0.279 2431 +2433 4 261.370 132.387 39.858 0.278 2432 +2434 4 261.222 131.331 40.327 0.277 2433 +2435 4 261.223 130.259 40.902 0.277 2434 +2436 4 261.301 129.200 41.541 0.276 2435 +2437 4 261.588 128.250 42.239 0.275 2436 +2438 4 262.459 127.717 42.645 0.275 2437 +2439 4 263.502 127.484 43.004 0.274 2438 +2440 4 264.245 126.652 43.198 0.273 2439 +2441 4 264.577 125.565 43.234 0.272 2440 +2442 4 264.251 124.480 43.138 0.272 2441 +2443 4 263.818 123.422 42.937 0.271 2442 +2444 4 263.517 122.343 42.579 0.270 2443 +2445 4 263.693 121.295 42.011 0.270 2444 +2446 4 264.406 120.480 41.318 0.269 2445 +2447 4 265.455 120.118 40.566 0.268 2446 +2448 4 266.507 120.073 39.718 0.268 2447 +2449 4 267.479 120.314 38.798 0.267 2448 +2450 4 268.168 119.760 37.781 0.266 2449 +2451 4 268.605 118.770 36.843 0.265 2450 +2452 4 269.278 117.849 36.082 0.265 2451 +2453 4 269.871 116.898 35.405 0.264 2452 +2454 4 270.453 115.992 34.753 0.263 2453 +2455 4 271.244 115.363 34.162 0.263 2454 +2456 4 272.290 115.785 33.671 0.262 2455 +2457 4 273.246 116.333 33.180 0.261 2456 +2458 4 274.235 116.902 32.770 0.260 2457 +2459 4 275.221 117.479 32.446 0.260 2458 +2460 4 276.254 117.954 32.150 0.259 2459 +2461 4 277.310 118.359 31.841 0.258 2460 +2462 4 278.360 118.776 31.522 0.258 2461 +2463 4 279.404 119.238 31.235 0.257 2462 +2464 4 280.480 119.567 30.906 0.256 2463 +2465 4 281.581 119.702 30.526 0.256 2464 +2466 4 282.711 119.556 30.180 0.255 2465 +2467 4 283.821 119.291 29.854 0.254 2466 +2468 4 284.945 119.183 29.490 0.253 2467 +2469 4 286.047 119.191 29.017 0.253 2468 +2470 4 287.166 119.237 28.482 0.252 2469 +2471 4 288.265 119.302 27.874 0.251 2470 +2472 4 289.332 119.432 27.181 0.251 2471 +2473 4 290.352 119.781 26.441 0.250 2472 +2474 4 291.281 120.336 25.687 0.249 2473 +2475 4 292.183 120.981 24.981 0.249 2474 +2476 4 293.018 121.695 24.386 0.248 2475 +2477 4 293.482 122.728 23.832 0.247 2476 +2478 4 293.997 123.686 23.210 0.246 2477 +2479 4 294.764 124.464 22.511 0.246 2478 +2480 4 295.622 125.152 21.733 0.245 2479 +2481 4 296.458 125.824 20.844 0.244 2480 +2482 4 297.248 126.537 19.866 0.244 2481 +2483 4 297.797 127.403 18.821 0.243 2482 +2484 4 297.801 127.700 17.619 0.242 2483 +2485 4 297.470 127.040 16.309 0.242 2484 +2486 4 296.847 126.302 15.105 0.241 2485 +2487 4 296.058 126.562 14.068 0.240 2486 +2488 4 295.652 127.573 13.151 0.239 2487 +2489 4 295.431 128.624 12.304 0.239 2488 +2490 4 295.036 129.613 11.517 0.238 2489 +2491 4 294.610 130.632 10.798 0.237 2490 +2492 4 294.315 131.709 10.121 0.236 2491 +2493 4 294.285 132.832 9.513 0.236 2492 +2494 4 294.342 133.974 8.996 0.235 2493 +2495 4 294.511 135.005 8.416 0.234 2494 +2496 4 294.760 136.033 7.768 0.234 2495 +2497 4 294.659 137.105 7.107 0.233 2496 +2498 4 294.206 138.120 6.462 0.232 2497 +2499 4 293.518 139.002 5.841 0.232 2498 +2500 4 292.632 139.703 5.272 0.231 2499 +2501 4 291.539 139.725 4.771 0.230 2500 +2502 4 290.645 139.051 4.257 0.229 2501 +2503 4 289.720 138.520 3.655 0.229 2502 +2504 4 288.744 138.035 3.021 0.228 2503 +2505 4 287.719 137.910 2.333 0.227 2504 +2506 4 286.699 138.254 0.840 0.227 2505 +2507 4 335.648 478.957 48.957 0.574 1699 +2508 4 335.508 477.920 49.499 0.572 2507 +2509 4 334.795 477.191 50.137 0.569 2508 +2510 4 333.921 476.491 50.695 0.567 2509 +2511 4 333.368 475.501 51.173 0.565 2510 +2512 4 332.914 474.459 51.549 0.563 2511 +2513 4 332.218 473.578 51.808 0.560 2512 +2514 4 331.314 472.902 52.011 0.558 2513 +2515 4 330.598 472.036 52.231 0.556 2514 +2516 4 329.928 471.129 52.458 0.554 2515 +2517 4 329.332 470.153 52.632 0.551 2516 +2518 4 328.749 469.168 52.760 0.549 2517 +2519 4 328.203 468.164 52.850 0.547 2518 +2520 4 327.723 467.126 52.908 0.545 2519 +2521 4 327.243 466.087 52.946 0.543 2520 +2522 4 326.747 465.057 52.981 0.540 2521 +2523 4 326.237 464.033 53.028 0.538 2522 +2524 4 325.725 463.010 53.094 0.536 2523 +2525 4 325.221 461.985 53.194 0.534 2524 +2526 4 324.716 460.960 53.330 0.531 2525 +2527 4 324.254 459.920 53.498 0.529 2526 +2528 4 323.938 458.830 53.704 0.527 2527 +2529 4 323.733 457.716 53.942 0.525 2528 +2530 4 323.513 456.602 54.188 0.522 2529 +2531 4 323.229 455.495 54.402 0.520 2530 +2532 4 322.917 454.395 54.575 0.518 2531 +2533 4 322.601 453.295 54.720 0.516 2532 +2534 4 322.353 452.184 54.854 0.514 2533 +2535 4 322.320 451.041 54.995 0.511 2534 +2536 4 322.337 449.904 55.176 0.509 2535 +2537 4 322.219 448.784 55.455 0.507 2536 +2538 4 322.062 447.677 55.825 0.505 2537 +2539 4 321.904 446.571 56.258 0.502 2538 +2540 4 321.641 445.522 56.748 0.500 2539 +2541 4 321.082 444.610 57.278 0.498 2540 +2542 4 320.476 443.640 57.697 0.496 2541 +2543 4 319.936 442.638 58.020 0.493 2542 +2544 4 319.612 441.549 58.291 0.491 2543 +2545 4 319.454 440.435 58.582 0.489 2544 +2546 4 319.352 439.322 58.895 0.487 2545 +2547 4 319.161 438.194 59.166 0.485 2546 +2548 4 318.959 437.069 59.427 0.482 2547 +2549 4 318.806 435.948 59.712 0.480 2548 +2550 4 318.778 434.842 60.086 0.478 2549 +2551 4 318.753 433.744 60.532 0.476 2550 +2552 4 318.574 432.655 60.993 0.473 2551 +2553 4 318.125 431.603 61.394 0.471 2552 +2554 4 317.634 430.583 61.773 0.469 2553 +2555 4 317.060 429.636 62.191 0.467 2554 +2556 4 316.491 428.687 62.623 0.464 2555 +2557 4 315.958 427.698 63.037 0.462 2556 +2558 4 315.452 426.686 63.416 0.460 2557 +2559 4 314.980 425.648 63.723 0.458 2558 +2560 4 314.450 424.646 63.932 0.456 2559 +2561 4 313.696 423.788 64.080 0.453 2560 +2562 4 312.942 422.940 64.208 0.451 2561 +2563 4 312.406 421.932 64.348 0.449 2562 +2564 4 312.057 420.856 64.539 0.447 2563 +2565 4 311.890 419.738 64.825 0.444 2564 +2566 4 311.538 418.713 65.218 0.442 2565 +2567 4 310.990 417.785 65.710 0.440 2566 +2568 4 310.800 416.715 66.237 0.438 2567 +2569 4 311.014 415.614 66.748 0.435 2568 +2570 4 311.321 414.520 67.194 0.433 2569 +2571 4 311.209 413.436 67.567 0.431 2570 +2572 4 310.710 412.410 67.909 0.428 2571 +2573 4 310.410 411.368 68.308 0.426 2572 +2574 4 310.311 410.346 68.843 0.424 2573 +2575 4 309.981 409.346 69.415 0.422 2574 +2576 4 309.368 408.389 69.920 0.419 2575 +2577 4 308.615 407.533 70.353 0.417 2576 +2578 4 307.802 406.732 70.734 0.415 2577 +2579 4 307.044 405.889 71.085 0.413 2578 +2580 4 306.412 404.959 71.440 0.410 2579 +2581 4 305.862 403.982 71.832 0.408 2580 +2582 4 305.427 402.944 72.242 0.406 2581 +2583 4 305.123 401.847 72.631 0.404 2582 +2584 4 304.893 400.746 73.030 0.401 2583 +2585 4 304.758 399.643 73.466 0.399 2584 +2586 4 304.608 398.523 73.873 0.397 2585 +2587 4 304.215 397.462 74.229 0.395 2586 +2588 4 303.671 396.458 74.575 0.392 2587 +2589 4 303.134 395.476 74.972 0.390 2588 +2590 4 302.630 394.542 75.471 0.388 2589 +2591 4 302.159 393.604 76.049 0.386 2590 +2592 4 301.738 392.591 76.616 0.383 2591 +2593 4 301.425 391.503 77.086 0.381 2592 +2594 4 301.140 390.396 77.418 0.379 2593 +2595 4 300.788 389.308 77.617 0.377 2594 +2596 4 300.436 388.220 77.701 0.374 2595 +2597 4 300.221 387.101 77.708 0.372 2596 +2598 4 300.308 385.973 77.687 0.370 2597 +2599 4 300.526 384.851 77.669 0.368 2598 +2600 4 300.660 383.716 77.667 0.365 2599 +2601 4 300.686 382.573 77.684 0.363 2600 +2602 4 300.629 381.431 77.721 0.361 2601 +2603 4 300.529 380.292 77.783 0.359 2602 +2604 4 300.365 379.161 77.872 0.357 2603 +2605 4 300.132 378.040 77.996 0.354 2604 +2606 4 299.860 376.930 78.160 0.352 2605 +2607 4 299.647 375.813 78.405 0.350 2606 +2608 4 299.538 374.706 78.774 0.348 2607 +2609 4 299.473 373.608 79.259 0.345 2608 +2610 4 299.412 372.512 79.826 0.343 2609 +2611 4 299.353 371.414 80.443 0.341 2610 +2612 4 299.243 370.305 81.055 0.339 2611 +2613 4 299.064 369.185 81.612 0.336 2612 +2614 4 298.859 368.063 82.106 0.334 2613 +2615 4 298.649 366.941 82.559 0.332 2614 +2616 4 298.514 365.825 83.028 0.330 2615 +2617 4 298.475 364.729 83.567 0.328 2616 +2618 4 298.467 363.642 84.178 0.325 2617 +2619 4 298.462 362.556 84.840 0.323 2618 +2620 4 298.462 361.465 85.521 0.321 2619 +2621 4 298.495 360.349 86.161 0.319 2620 +2622 4 298.558 359.215 86.714 0.316 2621 +2623 4 298.629 358.078 87.184 0.314 2622 +2624 4 298.684 356.943 87.606 0.312 2623 +2625 4 298.717 355.813 88.018 0.310 2624 +2626 4 298.743 354.682 88.442 0.307 2625 +2627 4 298.726 353.546 88.871 0.305 2626 +2628 4 298.652 352.408 89.297 0.303 2627 +2629 4 298.677 351.330 89.822 0.301 2628 +2630 4 298.799 350.270 90.449 0.298 2629 +2631 4 298.900 349.147 91.059 0.296 2630 +2632 4 298.918 348.014 91.661 0.294 2631 +2633 4 298.861 346.907 92.313 0.292 2632 +2634 4 298.769 345.817 93.022 0.289 2633 +2635 4 298.666 344.732 93.773 0.287 2634 +2636 4 298.563 343.646 94.562 0.285 2635 +2637 4 298.459 342.560 95.391 0.283 2636 +2638 4 298.355 341.475 96.243 0.280 2637 +2639 4 298.251 340.390 97.099 0.278 2638 +2640 4 298.132 339.312 97.956 0.276 2639 +2641 4 297.870 338.320 98.856 0.274 2640 +2642 4 297.326 337.449 99.780 0.272 2641 +2643 4 296.401 336.840 100.606 0.269 2642 +2644 4 295.502 336.143 101.338 0.267 2643 +2645 4 294.819 335.247 102.036 0.265 2644 +2646 4 294.348 334.234 102.744 0.262 2645 +2647 4 294.153 333.267 103.585 0.260 2646 +2648 4 293.763 332.380 104.551 0.258 2647 +2649 4 293.279 331.521 105.604 0.256 2648 +2650 4 292.866 330.538 106.642 0.253 2649 +2651 4 292.503 329.478 107.577 0.251 2650 +2652 4 291.846 328.572 108.421 0.249 2651 +2653 4 291.090 327.745 109.198 0.247 2652 +2654 4 290.094 327.280 109.969 0.244 2653 +2655 4 289.254 326.566 110.761 0.242 2654 +2656 4 288.609 325.685 111.611 0.240 2655 +2657 4 288.542 324.649 112.585 0.238 2656 +2658 4 288.779 323.657 113.647 0.235 2657 +2659 4 288.774 322.702 114.780 0.233 2658 +2660 4 288.770 321.745 115.924 0.231 2659 +2661 4 288.764 320.790 117.031 0.229 2660 +2662 4 288.040 319.979 119.000 0.227 2661 +2663 4 441.781 634.506 44.587 1.280 1601 +2664 4 442.251 632.324 45.212 1.272 2663 +2665 4 441.913 630.065 45.552 1.265 2664 +2666 4 441.917 627.785 45.685 1.257 2665 +2667 4 441.062 625.820 45.821 1.249 2666 +2668 4 439.385 624.304 46.051 1.241 2667 +2669 4 438.748 622.207 46.654 1.233 2668 +2670 4 438.147 620.090 47.302 1.225 2669 +2671 4 437.211 618.036 47.967 1.217 2670 +2672 4 436.053 616.067 48.282 1.209 2671 +2673 4 434.643 614.268 48.396 1.202 2672 +2674 4 433.335 612.408 48.391 1.194 2673 +2675 4 433.234 610.172 48.562 1.186 2674 +2676 4 433.753 607.973 48.957 1.178 2675 +2677 4 432.749 605.951 49.557 1.170 2676 +2678 4 432.352 603.895 50.430 1.162 2677 +2679 4 432.197 601.750 51.576 1.155 2678 +2680 4 430.802 600.039 52.602 1.147 2679 +2681 4 429.252 598.378 53.180 1.139 2680 +2682 4 428.253 596.333 53.445 1.131 2681 +2683 4 427.329 594.293 53.791 1.124 2682 +2684 4 427.083 592.022 53.993 1.116 2683 +2685 4 426.243 589.898 54.088 1.108 2684 +2686 4 425.123 587.920 54.135 1.100 2685 +2687 4 424.108 585.871 54.226 1.092 2686 +2688 4 423.257 583.753 54.379 1.084 2687 +2689 4 423.686 581.587 54.792 1.077 2688 +2690 4 424.123 579.379 55.010 1.069 2689 +2691 4 423.019 577.379 55.046 1.061 2690 +2692 4 422.324 575.204 54.927 1.053 2691 +2693 4 421.628 573.044 54.830 1.045 2692 +2694 4 420.529 571.063 54.717 1.037 2693 +2695 4 419.704 568.932 54.828 1.030 2694 +2696 4 418.833 566.852 55.156 1.022 2695 +2697 4 418.032 564.803 55.767 1.014 2696 +2698 4 416.743 562.921 56.099 1.006 2697 +2699 4 415.193 561.256 56.138 0.998 2698 +2700 4 413.706 559.576 56.099 0.990 2699 +2701 4 413.203 557.367 56.297 0.982 2700 +2702 4 413.132 555.089 56.599 0.974 2701 +2703 4 413.101 552.803 56.866 0.967 2702 +2704 4 413.074 550.516 57.086 0.959 2703 +2705 4 412.758 548.323 57.393 0.951 2704 +2706 4 411.283 546.658 57.964 0.943 2705 +2707 4 410.284 544.711 58.685 0.935 2706 +2708 4 409.638 542.598 58.900 0.927 2707 +2709 4 409.021 540.446 58.868 0.919 2708 +2710 4 408.822 538.186 58.981 0.911 2709 +2711 4 408.333 535.961 59.147 0.904 2710 +2712 4 407.502 533.834 59.307 0.896 2711 +2713 4 406.570 531.766 59.592 0.888 2712 +2714 4 405.681 529.672 60.014 0.880 2713 +2715 4 405.043 527.495 60.347 0.872 2714 +2716 4 404.808 525.239 60.651 0.865 2715 +2717 4 404.177 523.081 61.143 0.857 2716 +2718 4 403.314 520.982 61.602 0.849 2717 +2719 4 402.801 518.765 61.821 0.841 2718 +2720 4 402.665 516.494 61.874 0.833 2719 +2721 4 403.016 514.235 61.898 0.826 2720 +2722 4 402.833 512.200 61.902 0.817 2721 +2723 4 402.302 510.243 62.063 0.809 2722 +2724 4 403.394 508.259 62.459 0.801 2723 +2725 4 404.061 506.116 62.887 0.793 2724 +2726 4 403.191 504.083 63.200 0.785 2725 +2727 4 401.727 502.332 63.449 0.777 2726 +2728 4 400.170 500.656 63.594 0.770 2727 +2729 4 398.620 498.984 63.696 0.762 2728 +2730 4 398.550 496.732 63.876 0.754 2729 +2731 4 397.808 494.574 64.016 0.746 2730 +2732 4 396.780 492.531 64.066 0.738 2731 +2733 4 395.965 490.395 64.042 0.730 2732 +2734 4 395.357 488.193 63.988 0.722 2733 +2735 4 395.015 485.945 63.834 0.715 2734 +2736 4 393.974 483.928 63.697 0.707 2735 +2737 4 393.822 481.654 63.661 0.699 2736 +2738 4 393.637 479.382 63.787 0.691 2737 +2739 4 393.544 477.103 63.869 0.683 2738 +2740 4 393.681 475.969 63.888 0.680 2739 +2741 4 394.042 474.888 63.952 0.676 2740 +2742 4 394.463 473.825 64.032 0.672 2741 +2743 4 394.701 472.740 64.206 0.668 2742 +2744 4 394.619 471.604 64.379 0.664 2743 +2745 4 394.434 470.475 64.521 0.660 2744 +2746 4 394.132 469.372 64.626 0.656 2745 +2747 4 393.923 468.247 64.697 0.652 2746 +2748 4 393.883 467.104 64.744 0.648 2747 +2749 4 394.107 465.983 64.776 0.644 2748 +2750 4 394.433 464.887 64.816 0.640 2749 +2751 4 394.540 463.749 64.872 0.637 2750 +2752 4 394.733 462.621 64.942 0.633 2751 +2753 4 394.778 461.479 65.038 0.629 2752 +2754 4 394.887 460.355 65.206 0.625 2753 +2755 4 394.972 459.251 65.461 0.621 2754 +2756 4 394.679 458.149 65.689 0.617 2755 +2757 4 394.192 457.115 65.864 0.613 2756 +2758 4 393.867 456.018 65.988 0.609 2757 +2759 4 393.514 454.929 66.065 0.605 2758 +2760 4 393.377 453.794 66.105 0.601 2759 +2761 4 393.291 452.653 66.122 0.597 2760 +2762 4 393.403 451.514 66.139 0.594 2761 +2763 4 393.813 450.447 66.158 0.590 2762 +2764 4 394.268 449.398 66.195 0.586 2763 +2765 4 394.423 448.267 66.256 0.582 2764 +2766 4 394.522 447.127 66.309 0.578 2765 +2767 4 394.689 445.995 66.353 0.574 2766 +2768 4 394.642 444.852 66.388 0.570 2767 +2769 4 394.721 443.712 66.428 0.566 2768 +2770 4 393.935 443.366 66.809 0.566 2769 +2771 4 393.245 442.578 68.439 0.564 2770 +2772 4 392.524 441.821 69.138 0.563 2771 +2773 4 391.629 441.245 69.951 0.561 2772 +2774 4 390.686 440.737 70.829 0.560 2773 +2775 4 389.744 440.228 71.733 0.558 2774 +2776 4 388.802 439.716 72.625 0.557 2775 +2777 4 387.865 439.166 73.461 0.555 2776 +2778 4 386.944 438.531 74.208 0.554 2777 +2779 4 386.025 437.895 74.884 0.552 2778 +2780 4 385.105 437.259 75.505 0.550 2779 +2781 4 384.203 436.600 76.082 0.549 2780 +2782 4 383.418 435.802 76.622 0.547 2781 +2783 4 382.782 434.872 77.128 0.546 2782 +2784 4 382.146 433.941 77.610 0.544 2783 +2785 4 381.510 433.011 78.069 0.543 2784 +2786 4 380.874 432.081 78.504 0.541 2785 +2787 4 380.238 431.151 78.918 0.540 2786 +2788 4 379.610 430.213 79.306 0.538 2787 +2789 4 379.032 429.232 79.643 0.536 2788 +2790 4 378.521 428.208 79.908 0.535 2789 +2791 4 378.015 427.182 80.129 0.533 2790 +2792 4 377.539 426.145 80.348 0.532 2791 +2793 4 377.086 425.098 80.595 0.530 2792 +2794 4 376.632 424.052 80.884 0.529 2793 +2795 4 376.178 423.007 81.225 0.527 2794 +2796 4 375.811 421.948 81.635 0.526 2795 +2797 4 375.830 420.848 82.164 0.524 2796 +2798 4 375.992 419.770 82.803 0.522 2797 +2799 4 376.153 418.693 83.521 0.521 2798 +2800 4 376.314 417.616 84.295 0.519 2799 +2801 4 376.476 416.538 85.097 0.518 2800 +2802 4 376.637 415.462 85.905 0.516 2801 +2803 4 376.798 414.384 86.700 0.515 2802 +2804 4 376.959 413.307 87.475 0.513 2803 +2805 4 377.159 412.228 88.216 0.512 2804 +2806 4 377.478 411.144 88.882 0.510 2805 +2807 4 377.806 410.061 89.491 0.508 2806 +2808 4 378.179 408.999 90.069 0.507 2807 +2809 4 378.732 408.032 90.657 0.505 2808 +2810 4 379.389 407.137 91.280 0.504 2809 +2811 4 379.916 406.175 91.940 0.502 2810 +2812 4 380.125 405.066 92.621 0.501 2811 +2813 4 380.337 403.960 93.329 0.499 2812 +2814 4 380.608 402.967 94.128 0.497 2813 +2815 4 381.011 402.221 95.131 0.496 2814 +2816 4 381.379 401.288 96.188 0.494 2815 +2817 4 381.700 400.218 97.181 0.493 2816 +2818 4 382.056 399.191 98.150 0.491 2817 +2819 4 382.419 398.237 99.141 0.490 2818 +2820 4 382.789 397.287 100.119 0.488 2819 +2821 4 383.171 396.234 100.988 0.486 2820 +2822 4 383.560 395.183 101.800 0.485 2821 +2823 4 383.979 394.158 102.598 0.483 2822 +2824 4 384.430 393.158 103.400 0.482 2823 +2825 4 384.859 392.140 104.193 0.480 2824 +2826 4 385.243 391.214 105.044 0.479 2825 +2827 4 385.392 390.381 106.025 0.477 2826 +2828 4 385.565 389.421 107.007 0.475 2827 +2829 4 385.836 388.370 107.862 0.474 2828 +2830 4 386.010 387.244 108.535 0.472 2829 +2831 4 386.324 386.154 109.035 0.471 2830 +2832 4 386.756 385.094 109.383 0.469 2831 +2833 4 387.363 384.151 109.656 0.468 2832 +2834 4 388.121 383.308 109.934 0.466 2833 +2835 4 388.887 382.463 110.226 0.464 2834 +2836 4 389.550 381.542 110.542 0.463 2835 +2837 4 389.855 380.485 110.927 0.461 2836 +2838 4 389.972 379.378 111.391 0.460 2837 +2839 4 390.090 378.270 111.907 0.458 2838 +2840 4 390.207 377.163 112.455 0.457 2839 +2841 4 390.325 376.056 113.019 0.455 2840 +2842 4 390.441 374.948 113.580 0.453 2841 +2843 4 390.559 373.841 114.121 0.452 2842 +2844 4 390.873 372.772 114.607 0.450 2843 +2845 4 391.295 371.719 115.023 0.449 2844 +2846 4 391.573 370.619 115.372 0.447 2845 +2847 4 391.769 369.497 115.667 0.446 2846 +2848 4 392.008 368.381 115.906 0.444 2847 +2849 4 392.288 367.272 116.096 0.443 2848 +2850 4 392.644 366.185 116.263 0.441 2849 +2851 4 393.019 365.117 116.465 0.439 2850 +2852 4 393.375 364.053 116.733 0.438 2851 +2853 4 393.730 362.990 117.052 0.436 2852 +2854 4 394.276 362.011 117.367 0.435 2853 +2855 4 394.959 361.094 117.646 0.433 2854 +2856 4 395.623 360.163 117.888 0.432 2855 +2857 4 396.199 359.178 118.095 0.430 2856 +2858 4 396.735 358.167 118.281 0.429 2857 +2859 4 397.256 357.150 118.485 0.427 2858 +2860 4 397.739 356.119 118.758 0.425 2859 +2861 4 398.202 355.085 119.122 0.424 2860 +2862 4 398.634 354.039 119.577 0.422 2861 +2863 4 398.964 352.969 120.133 0.421 2862 +2864 4 399.280 351.934 120.819 0.419 2863 +2865 4 399.622 350.935 121.631 0.418 2864 +2866 4 399.968 349.940 122.533 0.416 2865 +2867 4 400.313 348.945 123.499 0.415 2866 +2868 4 400.594 347.885 124.458 0.413 2867 +2869 4 400.819 346.775 125.368 0.411 2868 +2870 4 401.032 345.658 126.284 0.410 2869 +2871 4 401.208 344.576 127.256 0.408 2870 +2872 4 401.099 343.886 128.437 0.407 2871 +2873 4 401.355 343.439 129.809 0.405 2872 +2874 4 401.065 342.987 131.260 0.403 2873 +2875 4 401.174 342.205 134.400 0.402 2874 +2876 4 394.826 442.678 66.475 0.566 2769 +2877 4 394.846 441.534 66.504 0.565 2876 +2878 4 394.633 440.410 66.514 0.564 2877 +2879 4 394.226 439.342 66.502 0.563 2878 +2880 4 393.864 438.256 66.466 0.562 2879 +2881 4 393.923 437.116 66.404 0.561 2880 +2882 4 393.927 435.976 66.356 0.559 2881 +2883 4 393.972 434.874 66.177 0.558 2882 +2884 4 393.852 433.761 65.931 0.557 2883 +2885 4 393.617 432.650 65.682 0.556 2884 +2886 4 393.772 431.543 64.011 0.555 2885 +2887 4 394.060 430.494 63.568 0.554 2886 +2888 4 394.439 429.426 63.162 0.553 2887 +2889 4 394.706 428.317 62.839 0.553 2888 +2890 4 394.909 427.191 62.611 0.552 2889 +2891 4 394.778 426.067 62.471 0.551 2890 +2892 4 394.566 424.942 62.408 0.550 2891 +2893 4 394.356 423.818 62.378 0.549 2892 +2894 4 394.113 422.700 62.355 0.548 2893 +2895 4 393.840 421.589 62.329 0.547 2894 +2896 4 393.607 420.469 62.297 0.546 2895 +2897 4 393.363 419.353 62.248 0.545 2896 +2898 4 393.030 418.266 62.157 0.544 2897 +2899 4 392.709 417.171 62.054 0.543 2898 +2900 4 392.418 416.065 61.967 0.542 2899 +2901 4 392.100 414.965 61.901 0.541 2900 +2902 4 391.765 413.872 61.851 0.540 2901 +2903 4 391.430 412.778 61.817 0.540 2902 +2904 4 391.079 411.689 61.791 0.539 2903 +2905 4 390.716 410.604 61.763 0.538 2904 +2906 4 390.415 409.501 61.725 0.537 2905 +2907 4 390.337 408.365 61.673 0.536 2906 +2908 4 390.133 407.242 61.599 0.535 2907 +2909 4 389.777 406.156 61.492 0.534 2908 +2910 4 389.436 405.064 61.347 0.533 2909 +2911 4 389.103 403.969 61.161 0.532 2910 +2912 4 388.767 402.883 60.896 0.531 2911 +2913 4 388.447 401.933 60.416 0.530 2912 +2914 4 388.159 400.932 59.800 0.529 2913 +2915 4 387.983 399.813 59.247 0.529 2914 +2916 4 387.924 398.677 58.743 0.528 2915 +2917 4 387.895 397.561 58.248 0.527 2916 +2918 4 387.766 396.497 57.730 0.526 2917 +2919 4 387.447 395.563 57.158 0.525 2918 +2920 4 386.810 394.679 56.839 0.524 2919 +2921 4 386.378 393.634 56.667 0.523 2920 +2922 4 386.790 392.581 56.564 0.522 2921 +2923 4 387.237 391.541 56.493 0.521 2922 +2924 4 387.115 390.411 56.411 0.520 2923 +2925 4 387.094 389.268 56.329 0.519 2924 +2926 4 387.109 388.131 56.234 0.518 2925 +2927 4 386.674 387.072 56.149 0.517 2926 +2928 4 386.260 386.010 56.076 0.516 2927 +2929 4 386.029 384.929 55.927 0.515 2928 +2930 4 385.831 383.846 55.748 0.515 2929 +2931 4 386.111 382.768 55.730 0.514 2930 +2932 4 386.484 381.763 55.875 0.513 2931 +2933 4 386.495 380.619 56.024 0.512 2932 +2934 4 386.526 379.479 56.173 0.511 2933 +2935 4 386.791 378.372 56.327 0.510 2934 +2936 4 387.290 377.345 56.477 0.509 2935 +2937 4 387.787 376.317 56.603 0.508 2936 +2938 4 388.269 375.280 56.717 0.507 2937 +2939 4 388.660 374.206 56.826 0.506 2938 +2940 4 388.959 373.105 56.929 0.505 2939 +2941 4 389.063 371.968 57.045 0.504 2940 +2942 4 389.105 370.828 57.177 0.503 2941 +2943 4 389.108 369.690 57.318 0.502 2942 +2944 4 388.934 368.561 57.460 0.501 2943 +2945 4 388.750 367.435 57.601 0.501 2944 +2946 4 388.602 366.304 57.732 0.500 2945 +2947 4 388.635 365.163 57.839 0.499 2946 +2948 4 388.786 364.029 57.917 0.498 2947 +2949 4 388.903 362.893 57.977 0.497 2948 +2950 4 388.850 361.751 58.031 0.496 2949 +2951 4 388.696 360.617 58.086 0.495 2950 +2952 4 388.571 359.480 58.152 0.494 2951 +2953 4 388.493 358.340 58.240 0.493 2952 +2954 4 388.446 357.199 58.373 0.492 2953 +2955 4 388.442 356.065 58.572 0.491 2954 +2956 4 388.437 354.932 58.818 0.490 2955 +2957 4 388.439 353.792 59.085 0.490 2956 +2958 4 388.449 352.651 59.351 0.489 2957 +2959 4 388.458 351.508 59.613 0.488 2958 +2960 4 388.473 350.367 59.878 0.487 2959 +2961 4 388.523 349.246 60.187 0.486 2960 +2962 4 388.621 348.157 60.574 0.485 2961 +2963 4 388.737 347.039 60.966 0.484 2962 +2964 4 388.867 345.904 61.303 0.483 2963 +2965 4 388.997 344.770 61.590 0.482 2964 +2966 4 389.127 343.635 61.828 0.481 2965 +2967 4 389.259 342.502 62.026 0.480 2966 +2968 4 389.390 341.368 62.193 0.479 2967 +2969 4 389.521 340.235 62.343 0.478 2968 +2970 4 389.652 339.101 62.482 0.478 2969 +2971 4 389.784 337.966 62.603 0.477 2970 +2972 4 389.912 336.831 62.688 0.476 2971 +2973 4 390.038 335.695 62.714 0.475 2972 +2974 4 390.162 334.559 62.699 0.474 2973 +2975 4 390.258 333.422 62.658 0.473 2974 +2976 4 390.137 332.305 62.614 0.472 2975 +2977 4 389.688 331.253 62.590 0.471 2976 +2978 4 389.389 330.160 62.596 0.470 2977 +2979 4 389.329 329.018 62.641 0.469 2978 +2980 4 389.271 327.877 62.712 0.468 2979 +2981 4 389.213 326.736 62.798 0.467 2980 +2982 4 389.229 325.600 62.888 0.467 2981 +2983 4 389.458 324.478 62.961 0.466 2982 +2984 4 389.709 323.363 63.017 0.465 2983 +2985 4 389.978 322.252 63.067 0.464 2984 +2986 4 390.300 321.157 63.132 0.463 2985 +2987 4 390.642 320.069 63.203 0.462 2986 +2988 4 391.046 319.001 63.248 0.461 2987 +2989 4 391.504 317.956 63.245 0.460 2988 +2990 4 391.898 316.891 63.221 0.459 2989 +2991 4 392.115 315.768 63.209 0.458 2990 +2992 4 392.344 314.648 63.218 0.457 2991 +2993 4 392.647 313.545 63.255 0.456 2992 +2994 4 393.020 312.466 63.336 0.455 2993 +2995 4 393.458 311.417 63.489 0.454 2994 +2996 4 393.900 310.371 63.694 0.454 2995 +2997 4 394.314 309.314 63.927 0.453 2996 +2998 4 394.626 308.223 64.173 0.452 2997 +2999 4 394.869 307.114 64.414 0.451 2998 +3000 4 395.102 306.001 64.633 0.450 2999 +3001 4 395.237 304.876 64.802 0.449 3000 +3002 4 395.186 303.733 64.892 0.448 3001 +3003 4 395.086 302.596 64.907 0.447 3002 +3004 4 394.845 301.478 64.847 0.446 3003 +3005 4 394.635 300.363 64.727 0.445 3004 +3006 4 394.637 299.225 64.581 0.444 3005 +3007 4 394.626 298.153 64.323 0.443 3006 +3008 4 394.582 297.249 63.781 0.443 3007 +3009 4 394.587 296.314 63.064 0.442 3008 +3010 4 394.796 295.257 62.370 0.441 3009 +3011 4 395.144 294.168 61.826 0.440 3010 +3012 4 395.482 293.075 61.422 0.439 3011 +3013 4 395.791 291.975 61.142 0.438 3012 +3014 4 396.042 290.864 60.940 0.437 3013 +3015 4 396.258 289.752 60.757 0.436 3014 +3016 4 396.452 288.632 60.578 0.435 3015 +3017 4 396.595 287.500 60.424 0.434 3016 +3018 4 396.676 286.359 60.315 0.433 3017 +3019 4 396.644 285.217 60.248 0.432 3018 +3020 4 396.505 284.083 60.217 0.431 3019 +3021 4 396.317 282.955 60.213 0.430 3020 +3022 4 396.364 281.866 60.225 0.430 3021 +3023 4 396.855 280.833 60.248 0.429 3022 +3024 4 397.154 279.748 60.283 0.428 3023 +3025 4 397.222 278.607 60.325 0.427 3024 +3026 4 397.224 277.469 60.364 0.426 3025 +3027 4 397.069 276.349 60.449 0.425 3026 +3028 4 396.774 275.249 60.633 0.424 3027 +3029 4 396.558 274.140 60.922 0.423 3028 +3030 4 396.652 273.058 61.346 0.422 3029 +3031 4 397.046 272.058 61.913 0.421 3030 +3032 4 397.624 271.111 62.509 0.420 3031 +3033 4 398.314 270.245 63.126 0.419 3032 +3034 4 399.025 269.430 63.807 0.418 3033 +3035 4 399.698 268.568 64.508 0.417 3034 +3036 4 400.251 267.612 65.199 0.417 3035 +3037 4 400.664 266.587 65.875 0.416 3036 +3038 4 401.014 265.537 66.539 0.415 3037 +3039 4 401.308 264.472 67.179 0.414 3038 +3040 4 401.646 263.414 67.777 0.413 3039 +3041 4 402.084 262.380 68.321 0.412 3040 +3042 4 402.497 261.327 68.806 0.411 3041 +3043 4 402.736 260.218 69.207 0.410 3042 +3044 4 402.832 259.082 69.553 0.409 3043 +3045 4 402.834 257.953 69.906 0.408 3044 +3046 4 402.864 256.827 70.286 0.407 3045 +3047 4 403.075 255.717 70.678 0.406 3046 +3048 4 403.377 254.621 71.084 0.405 3047 +3049 4 403.690 253.538 71.531 0.405 3048 +3050 4 404.005 252.460 72.017 0.404 3049 +3051 4 404.291 251.379 72.539 0.403 3050 +3052 4 404.563 250.296 73.093 0.402 3051 +3053 4 404.842 249.214 73.671 0.401 3052 +3054 4 405.141 248.132 74.259 0.400 3053 +3055 4 405.402 247.045 74.854 0.399 3054 +3056 4 405.530 245.942 75.463 0.398 3055 +3057 4 405.596 244.834 76.092 0.397 3056 +3058 4 405.751 243.726 76.716 0.396 3057 +3059 4 405.971 242.616 77.323 0.395 3058 +3060 4 406.185 241.509 77.923 0.394 3059 +3061 4 406.149 240.509 78.618 0.393 3060 +3062 4 405.950 239.510 79.385 0.392 3061 +3063 4 405.726 238.450 80.133 0.392 3062 +3064 4 405.459 237.370 80.815 0.391 3063 +3065 4 405.118 236.292 81.389 0.390 3064 +3066 4 404.748 235.217 81.847 0.389 3065 +3067 4 404.379 234.141 82.200 0.388 3066 +3068 4 403.913 233.101 82.459 0.387 3067 +3069 4 403.366 232.098 82.644 0.386 3068 +3070 4 402.982 231.030 82.783 0.385 3069 +3071 4 402.785 229.904 82.901 0.384 3070 +3072 4 402.665 228.767 83.018 0.383 3071 +3073 4 402.840 227.666 83.187 0.382 3072 +3074 4 403.149 226.583 83.419 0.381 3073 +3075 4 403.457 225.501 83.692 0.381 3074 +3076 4 403.681 224.388 83.952 0.380 3075 +3077 4 403.824 223.253 84.159 0.379 3076 +3078 4 403.769 222.117 84.312 0.378 3077 +3079 4 403.364 221.061 84.420 0.377 3078 +3080 4 402.909 220.012 84.495 0.376 3079 +3081 4 402.544 218.930 84.563 0.375 3080 +3082 4 402.351 217.815 84.669 0.374 3081 +3083 4 402.211 216.693 84.813 0.373 3082 +3084 4 402.243 215.561 84.946 0.372 3083 +3085 4 402.472 214.443 85.023 0.371 3084 +3086 4 402.745 213.332 85.037 0.370 3085 +3087 4 403.140 212.263 84.966 0.369 3086 +3088 4 403.715 211.298 84.785 0.368 3087 +3089 4 404.333 210.359 84.522 0.368 3088 +3090 4 404.982 209.434 84.228 0.367 3089 +3091 4 405.659 208.524 83.941 0.366 3090 +3092 4 406.344 207.611 83.716 0.365 3091 +3093 4 406.941 206.637 83.561 0.364 3092 +3094 4 407.318 205.563 83.462 0.363 3093 +3095 4 407.326 204.434 83.422 0.362 3094 +3096 4 407.417 203.298 83.396 0.361 3095 +3097 4 407.184 202.191 83.346 0.360 3096 +3098 4 406.288 201.528 83.260 0.359 3097 +3099 4 405.162 201.401 83.135 0.358 3098 +3100 4 404.092 201.559 82.856 0.357 3099 +3101 4 402.981 201.675 82.505 0.356 3100 +3102 4 401.922 201.663 82.051 0.355 3101 +3103 4 400.782 201.678 81.690 0.355 3102 +3104 4 399.640 201.599 81.424 0.354 3103 +3105 4 398.498 201.613 81.231 0.353 3104 +3106 4 397.356 201.656 81.105 0.352 3105 +3107 4 396.246 201.931 81.037 0.351 3106 +3108 4 395.170 202.315 81.015 0.350 3107 +3109 4 394.179 202.886 81.011 0.349 3108 +3110 4 393.039 202.959 81.028 0.348 3109 +3111 4 391.902 203.077 81.053 0.347 3110 +3112 4 390.772 203.254 81.091 0.346 3111 +3113 4 389.634 203.344 81.184 0.345 3112 +3114 4 388.496 203.418 81.343 0.344 3113 +3115 4 387.358 203.488 81.554 0.343 3114 +3116 4 386.221 203.556 81.797 0.343 3115 +3117 4 385.094 203.665 82.081 0.342 3116 +3118 4 384.003 203.868 82.418 0.341 3117 +3119 4 382.909 204.140 83.160 0.340 3118 +3120 4 392.562 431.677 65.297 0.555 2885 +3121 4 392.111 430.631 65.212 0.554 3120 +3122 4 391.624 429.596 65.229 0.553 3121 +3123 4 391.205 428.545 65.379 0.552 3122 +3124 4 390.849 427.493 65.668 0.551 3123 +3125 4 390.512 426.403 65.968 0.550 3124 +3126 4 390.496 425.281 66.338 0.549 3125 +3127 4 390.525 424.160 66.758 0.548 3126 +3128 4 390.237 423.058 67.142 0.547 3127 +3129 4 389.889 421.977 67.529 0.546 3128 +3130 4 389.546 420.934 67.985 0.545 3129 +3131 4 389.201 419.891 68.502 0.544 3130 +3132 4 388.714 418.868 68.988 0.543 3131 +3133 4 388.134 417.881 69.400 0.541 3132 +3134 4 387.626 416.864 69.799 0.540 3133 +3135 4 387.354 415.839 70.285 0.539 3134 +3136 4 387.086 414.814 70.823 0.538 3135 +3137 4 386.839 413.712 71.294 0.537 3136 +3138 4 386.609 412.590 71.648 0.536 3137 +3139 4 386.365 411.473 71.902 0.535 3138 +3140 4 386.347 410.333 72.101 0.534 3139 +3141 4 386.388 409.198 72.260 0.533 3140 +3142 4 385.955 408.144 72.328 0.532 3141 +3143 4 385.506 407.097 72.352 0.531 3142 +3144 4 385.186 405.999 72.388 0.530 3143 +3145 4 384.829 404.912 72.458 0.529 3144 +3146 4 384.352 403.873 72.568 0.528 3145 +3147 4 383.891 402.838 72.783 0.527 3146 +3148 4 383.439 401.807 73.106 0.526 3147 +3149 4 383.134 400.734 73.520 0.525 3148 +3150 4 382.987 399.639 74.004 0.524 3149 +3151 4 382.862 398.544 74.520 0.523 3150 +3152 4 382.820 397.453 75.040 0.522 3151 +3153 4 382.752 396.347 75.504 0.521 3152 +3154 4 382.560 395.219 75.799 0.520 3153 +3155 4 382.360 394.093 75.948 0.519 3154 +3156 4 381.952 393.027 75.976 0.517 3155 +3157 4 381.553 391.988 75.828 0.516 3156 +3158 4 381.169 390.985 75.530 0.515 3157 +3159 4 380.366 390.173 75.265 0.514 3158 +3160 4 379.548 389.380 75.069 0.513 3159 +3161 4 379.052 388.355 74.939 0.512 3160 +3162 4 378.902 387.229 74.870 0.511 3161 +3163 4 379.090 386.101 74.857 0.510 3162 +3164 4 379.214 384.964 74.878 0.509 3163 +3165 4 379.277 383.822 74.908 0.508 3164 +3166 4 379.392 382.685 74.959 0.507 3165 +3167 4 379.582 381.563 75.044 0.506 3166 +3168 4 379.766 380.436 75.134 0.505 3167 +3169 4 379.941 379.306 75.195 0.504 3168 +3170 4 380.052 378.178 75.230 0.503 3169 +3171 4 379.774 377.068 75.238 0.502 3170 +3172 4 379.444 375.973 75.219 0.501 3171 +3173 4 379.085 374.888 75.169 0.500 3172 +3174 4 378.695 373.813 75.088 0.499 3173 +3175 4 378.305 372.739 74.987 0.498 3174 +3176 4 377.891 371.676 74.873 0.497 3175 +3177 4 377.310 370.695 74.756 0.496 3176 +3178 4 376.581 369.815 74.647 0.494 3177 +3179 4 375.939 368.871 74.523 0.493 3178 +3180 4 375.374 367.884 74.374 0.492 3179 +3181 4 374.809 366.897 74.212 0.491 3180 +3182 4 374.238 365.912 74.051 0.490 3181 +3183 4 373.638 364.938 73.927 0.489 3182 +3184 4 373.029 363.970 73.852 0.488 3183 +3185 4 372.418 363.003 73.821 0.487 3184 +3186 4 371.848 362.015 73.832 0.486 3185 +3187 4 371.483 360.933 73.888 0.485 3186 +3188 4 371.150 359.841 73.978 0.484 3187 +3189 4 370.823 358.746 74.085 0.483 3188 +3190 4 370.519 357.644 74.194 0.482 3189 +3191 4 370.260 356.530 74.288 0.481 3190 +3192 4 370.172 355.421 74.379 0.480 3191 +3193 4 370.618 354.373 74.491 0.479 3192 +3194 4 370.953 353.308 74.612 0.478 3193 +3195 4 370.791 352.177 74.717 0.477 3194 +3196 4 370.524 351.065 74.803 0.476 3195 +3197 4 370.229 349.961 74.877 0.475 3196 +3198 4 369.833 348.888 74.943 0.474 3197 +3199 4 369.427 347.822 75.022 0.473 3198 +3200 4 369.096 346.735 75.135 0.472 3199 +3201 4 368.747 345.646 75.247 0.471 3200 +3202 4 368.397 344.557 75.344 0.469 3201 +3203 4 368.107 343.453 75.430 0.468 3202 +3204 4 367.955 342.319 75.510 0.467 3203 +3205 4 367.801 341.185 75.589 0.466 3204 +3206 4 367.620 340.057 75.679 0.465 3205 +3207 4 367.312 338.973 75.832 0.464 3206 +3208 4 366.909 337.935 76.057 0.463 3207 +3209 4 366.619 336.830 76.263 0.462 3208 +3210 4 366.421 335.709 76.433 0.461 3209 +3211 4 366.441 334.569 76.584 0.460 3210 +3212 4 366.590 333.437 76.720 0.459 3211 +3213 4 366.730 332.303 76.834 0.458 3212 +3214 4 366.837 331.165 76.920 0.457 3213 +3215 4 366.915 330.025 76.984 0.456 3214 +3216 4 366.992 328.883 77.028 0.455 3215 +3217 4 367.048 327.740 77.057 0.454 3216 +3218 4 367.048 326.596 77.077 0.453 3217 +3219 4 367.020 325.454 77.095 0.452 3218 +3220 4 366.908 324.315 77.116 0.451 3219 +3221 4 366.766 323.180 77.145 0.450 3220 +3222 4 366.653 322.043 77.185 0.449 3221 +3223 4 366.625 320.901 77.251 0.448 3222 +3224 4 366.623 319.759 77.340 0.447 3223 +3225 4 366.562 318.623 77.439 0.446 3224 +3226 4 366.300 317.513 77.530 0.444 3225 +3227 4 365.966 316.420 77.605 0.443 3226 +3228 4 365.746 315.298 77.665 0.442 3227 +3229 4 365.620 314.162 77.716 0.441 3228 +3230 4 365.691 313.038 77.780 0.440 3229 +3231 4 366.032 311.953 77.871 0.439 3230 +3232 4 366.366 310.860 77.954 0.438 3231 +3233 4 366.630 309.751 78.010 0.437 3232 +3234 4 366.667 308.615 78.037 0.436 3233 +3235 4 366.539 307.477 78.036 0.435 3234 +3236 4 366.487 306.338 78.006 0.434 3235 +3237 4 366.683 305.226 77.948 0.433 3236 +3238 4 367.234 304.235 77.865 0.432 3237 +3239 4 367.763 303.257 77.733 0.431 3238 +3240 4 367.979 302.143 77.547 0.430 3239 +3241 4 368.122 301.008 77.344 0.429 3240 +3242 4 368.346 299.921 77.078 0.428 3241 +3243 4 368.482 298.849 76.751 0.427 3242 +3244 4 368.200 297.755 76.454 0.426 3243 +3245 4 367.686 296.734 76.178 0.425 3244 +3246 4 367.227 295.709 75.943 0.423 3245 +3247 4 366.852 294.650 75.693 0.422 3246 +3248 4 366.427 293.722 75.232 0.421 3247 +3249 4 366.031 292.864 74.524 0.420 3248 +3250 4 365.742 291.924 73.657 0.419 3249 +3251 4 365.452 290.932 72.723 0.418 3250 +3252 4 364.877 290.006 71.874 0.417 3251 +3253 4 364.268 289.061 71.142 0.416 3252 +3254 4 363.752 288.064 70.504 0.415 3253 +3255 4 363.355 287.014 69.953 0.414 3254 +3256 4 362.959 286.050 69.373 0.413 3255 +3257 4 362.737 285.012 68.796 0.412 3256 +3258 4 362.760 283.876 68.311 0.411 3257 +3259 4 362.808 282.733 67.923 0.410 3258 +3260 4 362.830 281.590 67.598 0.409 3259 +3261 4 362.781 280.489 67.239 0.408 3260 +3262 4 362.704 279.406 66.829 0.407 3261 +3263 4 362.659 278.287 66.429 0.406 3262 +3264 4 362.650 277.147 66.095 0.405 3263 +3265 4 362.677 276.003 65.832 0.403 3264 +3266 4 362.778 274.864 65.624 0.402 3265 +3267 4 362.731 273.726 65.456 0.401 3266 +3268 4 362.109 272.812 65.297 0.400 3267 +3269 4 361.343 271.963 65.119 0.399 3268 +3270 4 360.632 271.138 64.796 0.398 3269 +3271 4 359.942 270.300 64.349 0.397 3270 +3272 4 359.274 269.404 63.864 0.396 3271 +3273 4 358.619 268.492 63.375 0.395 3272 +3274 4 358.038 267.544 62.889 0.394 3273 +3275 4 357.481 266.563 62.455 0.393 3274 +3276 4 356.937 265.559 62.138 0.392 3275 +3277 4 356.453 264.524 61.918 0.391 3276 +3278 4 356.015 263.467 61.760 0.390 3277 +3279 4 355.373 262.529 61.641 0.389 3278 +3280 4 354.610 261.677 61.543 0.388 3279 +3281 4 353.901 260.795 61.394 0.387 3280 +3282 4 353.258 259.886 61.157 0.386 3281 +3283 4 352.762 258.865 60.931 0.385 3282 +3284 4 352.119 257.925 60.737 0.384 3283 +3285 4 351.087 257.494 60.572 0.383 3284 +3286 4 349.987 257.183 60.416 0.381 3285 +3287 4 349.259 256.348 60.211 0.380 3286 +3288 4 348.648 255.398 59.986 0.379 3287 +3289 4 348.403 254.285 59.802 0.378 3288 +3290 4 348.093 253.183 59.652 0.377 3289 +3291 4 347.630 252.138 59.527 0.376 3290 +3292 4 347.109 251.123 59.450 0.375 3291 +3293 4 346.450 250.192 59.400 0.374 3292 +3294 4 345.575 249.503 59.235 0.373 3293 +3295 4 344.760 248.740 58.983 0.372 3294 +3296 4 344.018 247.900 58.679 0.371 3295 +3297 4 343.338 246.987 58.395 0.370 3296 +3298 4 342.731 246.018 58.179 0.369 3297 +3299 4 342.122 245.049 58.033 0.368 3298 +3300 4 341.540 244.064 57.953 0.367 3299 +3301 4 340.965 243.076 57.917 0.366 3300 +3302 4 340.390 242.088 57.905 0.365 3301 +3303 4 339.848 241.080 57.898 0.364 3302 +3304 4 339.313 240.068 57.889 0.363 3303 +3305 4 338.982 238.975 57.876 0.362 3304 +3306 4 338.931 237.832 57.858 0.361 3305 +3307 4 339.028 236.692 57.833 0.360 3306 +3308 4 339.109 235.554 57.797 0.358 3307 +3309 4 338.734 234.473 57.747 0.357 3308 +3310 4 338.328 233.415 57.677 0.356 3309 +3311 4 337.305 232.904 57.585 0.355 3310 +3312 4 336.234 232.511 57.455 0.354 3311 +3313 4 335.113 232.394 57.239 0.353 3312 +3314 4 333.993 232.278 56.961 0.352 3313 +3315 4 332.871 232.163 56.643 0.351 3314 +3316 4 331.731 232.078 56.351 0.350 3315 +3317 4 330.591 232.002 56.106 0.349 3316 +3318 4 329.467 231.888 55.895 0.348 3317 +3319 4 328.632 231.152 55.629 0.347 3318 +3320 4 327.817 230.396 55.324 0.346 3319 +3321 4 326.949 229.665 55.041 0.345 3320 +3322 4 326.040 228.972 54.830 0.344 3321 +3323 4 325.118 228.294 54.682 0.343 3322 +3324 4 324.174 227.648 54.591 0.342 3323 +3325 4 323.231 226.999 54.551 0.341 3324 +3326 4 322.328 226.300 54.539 0.340 3325 +3327 4 321.556 225.456 54.536 0.339 3326 +3328 4 320.784 224.611 54.531 0.338 3327 +3329 4 319.996 223.787 54.525 0.337 3328 +3330 4 319.014 223.204 54.516 0.336 3329 +3331 4 317.958 222.763 54.503 0.335 3330 +3332 4 316.886 222.367 54.484 0.333 3331 +3333 4 315.775 222.094 54.459 0.332 3332 +3334 4 314.664 221.819 54.428 0.331 3333 +3335 4 313.577 221.498 54.386 0.330 3334 +3336 4 312.685 220.798 54.292 0.329 3335 +3337 4 311.726 220.180 54.187 0.328 3336 +3338 4 310.692 219.701 54.106 0.327 3337 +3339 4 309.569 219.504 54.046 0.326 3338 +3340 4 308.426 219.516 54.006 0.325 3339 +3341 4 307.296 219.363 53.985 0.324 3340 +3342 4 306.261 218.920 53.977 0.323 3341 +3343 4 305.393 218.195 53.974 0.322 3342 +3344 4 304.337 217.754 53.970 0.321 3343 +3345 4 303.282 217.311 53.964 0.320 3344 +3346 4 302.225 216.874 53.956 0.319 3345 +3347 4 301.164 216.447 53.944 0.318 3346 +3348 4 300.085 216.070 53.927 0.317 3347 +3349 4 298.975 215.793 53.905 0.316 3348 +3350 4 297.866 215.516 53.878 0.315 3349 +3351 4 296.754 215.265 53.836 0.314 3350 +3352 4 295.632 215.103 53.745 0.313 3351 +3353 4 294.521 214.842 53.659 0.312 3352 +3354 4 293.414 214.548 53.603 0.310 3353 +3355 4 292.295 214.309 53.577 0.309 3354 +3356 4 291.175 214.079 53.582 0.308 3355 +3357 4 290.072 213.782 53.616 0.307 3356 +3358 4 288.990 213.414 53.683 0.306 3357 +3359 4 287.952 212.957 53.806 0.305 3358 +3360 4 286.951 212.436 53.980 0.304 3359 +3361 4 285.986 211.838 54.156 0.303 3360 +3362 4 285.088 211.129 54.283 0.302 3361 +3363 4 284.174 210.445 54.361 0.301 3362 +3364 4 283.195 209.857 54.379 0.300 3363 +3365 4 282.203 209.291 54.351 0.299 3364 +3366 4 281.203 208.740 54.302 0.298 3365 +3367 4 280.171 208.246 54.270 0.297 3366 +3368 4 279.121 207.793 54.278 0.296 3367 +3369 4 278.082 207.316 54.329 0.295 3368 +3370 4 277.085 206.759 54.426 0.294 3369 +3371 4 276.189 206.076 54.600 0.293 3370 +3372 4 275.458 205.237 54.883 0.292 3371 +3373 4 274.735 204.382 55.219 0.291 3372 +3374 4 274.043 203.475 55.527 0.290 3373 +3375 4 273.365 202.557 55.796 0.289 3374 +3376 4 272.686 201.652 56.071 0.288 3375 +3377 4 271.977 200.781 56.350 0.287 3376 +3378 4 271.151 199.994 56.580 0.285 3377 +3379 4 270.286 199.245 56.756 0.284 3378 +3380 4 269.467 198.449 56.898 0.283 3379 +3381 4 268.723 197.579 57.018 0.282 3380 +3382 4 268.048 196.668 57.151 0.281 3381 +3383 4 267.404 195.759 57.333 0.280 3382 +3384 4 266.481 195.174 57.511 0.279 3383 +3385 4 265.359 194.956 57.637 0.278 3384 +3386 4 264.235 194.737 57.712 0.277 3385 +3387 4 263.113 194.519 57.736 0.276 3386 +3388 4 261.999 194.261 57.711 0.275 3387 +3389 4 260.940 193.851 57.634 0.274 3388 +3390 4 259.944 193.291 57.511 0.273 3389 +3391 4 258.946 192.739 57.356 0.272 3390 +3392 4 257.925 192.225 57.182 0.271 3391 +3393 4 256.881 191.758 57.000 0.270 3392 +3394 4 255.850 191.273 56.782 0.269 3393 +3395 4 254.844 190.756 56.487 0.268 3394 +3396 4 253.848 190.229 56.124 0.267 3395 +3397 4 252.861 189.684 55.708 0.266 3396 +3398 4 251.878 189.136 55.252 0.265 3397 +3399 4 250.900 188.674 54.726 0.264 3398 +3400 4 249.895 188.320 54.154 0.262 3399 +3401 4 248.825 187.928 53.666 0.261 3400 +3402 4 247.739 187.593 53.253 0.260 3401 +3403 4 246.635 187.371 52.854 0.259 3402 +3404 4 245.524 187.166 52.478 0.258 3403 +3405 4 244.404 186.933 52.167 0.257 3404 +3406 4 243.324 186.605 51.876 0.256 3405 +3407 4 242.363 186.083 51.514 0.255 3406 +3408 4 241.451 185.464 51.124 0.254 3407 +3409 4 240.502 184.827 50.798 0.253 3408 +3410 4 239.535 184.216 50.528 0.252 3409 +3411 4 238.540 183.653 50.292 0.251 3410 +3412 4 237.530 183.117 50.073 0.250 3411 +3413 4 236.506 182.653 49.806 0.249 3412 +3414 4 235.473 182.263 49.437 0.248 3413 +3415 4 234.419 181.878 49.019 0.247 3414 +3416 4 233.339 181.501 48.614 0.246 3415 +3417 4 232.275 181.164 48.168 0.245 3416 +3418 4 231.216 180.890 47.639 0.244 3417 +3419 4 230.106 180.767 47.112 0.243 3418 +3420 4 228.978 180.670 46.605 0.242 3419 +3421 4 227.872 180.436 46.056 0.241 3420 +3422 4 226.791 180.167 45.434 0.240 3421 +3423 4 225.757 179.869 44.705 0.238 3422 +3424 4 224.789 179.435 43.874 0.237 3423 +3425 4 223.862 178.870 42.972 0.236 3424 +3426 4 223.149 178.099 42.025 0.235 3425 +3427 4 222.898 177.116 41.024 0.234 3426 +3428 4 223.226 176.571 39.883 0.233 3427 +3429 4 224.081 176.791 38.699 0.232 3428 +3430 4 225.195 176.809 37.689 0.231 3429 +3431 4 226.096 176.246 36.777 0.230 3430 +3432 4 226.529 175.288 35.951 0.229 3431 +3433 4 226.578 174.159 35.318 0.228 3432 +3434 4 226.385 173.056 34.303 0.227 3433 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/485184849_reconstruction.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/485184849_reconstruction.swc new file mode 100644 index 0000000..bcf52c5 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/485184849_reconstruction.swc @@ -0,0 +1,10674 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/Users/alexh/Desktop/Working/Pvalb-IRES-Cre;Ai14-202470.03.02.01_GW_RD_FINAL_edited_axon.swc +# id,type,x,y,z,r,pid +1 1 332.904 440.3256 37.52 6.7038 -1 +2 3 334.6669 433.616 38.031 1.2547 1 +3 3 333.6808 431.5591 38.3328 0.662 2 +4 3 333.4302 429.31 38.7136 0.8881 3 +5 3 333.8306 427.0689 39.1205 0.7827 4 +6 3 334.0514 426.0645 39.3285 0.6399 5 +7 3 334.2917 424.9491 39.5324 0.5503 6 +8 3 334.5045 423.828 39.7107 0.5576 7 +9 3 334.6738 422.6977 39.8496 0.6486 8 +10 3 334.7927 421.5606 39.9361 0.5555 9 +11 3 335.2503 419.7302 39.9442 0.3803 10 +12 2 335.2503 418.3791 39.781 0.2479 11 +13 2 335.2503 417.2362 39.6376 0.163 12 +14 2 335.2446 416.0945 39.4747 0.1377 13 +15 2 335.2286 414.9528 39.303 0.1382 14 +16 2 335.1016 414.4906 39.1482 0.139 15 +17 2 334.6509 413.4427 38.9757 0.1403 16 +18 2 334.0823 412.452 38.8069 0.1431 17 +19 2 333.5526 411.4407 38.6355 0.1478 18 +20 2 332.9646 410.4638 38.4163 0.1574 19 +21 2 332.3938 409.4776 38.1735 0.172 20 +22 2 331.784 408.5132 37.9397 0.215 21 +23 2 331.1068 407.5958 37.7359 0.2169 22 +24 2 330.4192 406.684 37.5724 0.256 23 +25 2 329.7912 405.7288 37.4573 0.2684 24 +26 2 329.202 404.7483 37.3923 0.3557 25 +27 2 328.6186 403.7645 37.3626 0.4323 26 +28 2 328.0386 402.7784 37.3475 0.4209 27 +29 2 327.3968 401.8311 37.3405 0.4585 28 +30 2 326.652 400.9628 37.3405 0.4669 29 +31 2 325.9908 400.0293 37.3486 0.4398 30 +32 2 325.3067 399.113 37.3677 0.3675 31 +33 2 324.467 398.3362 37.4077 0.452 32 +34 2 323.5129 397.7059 37.4693 0.4596 33 +35 2 322.5611 397.0721 37.5441 0.4054 34 +36 2 321.8141 396.2061 37.6258 0.2908 35 +37 2 321.3496 395.1616 37.7096 0.259 36 +38 2 320.8337 394.1412 37.7938 0.3482 37 +39 2 320.0981 393.266 37.8792 0.369 38 +40 2 319.4323 392.3371 37.9694 0.3145 39 +41 2 318.7813 391.3967 38.0694 0.3192 40 +42 2 318.215 390.4037 38.1898 0.3836 41 +43 2 317.7185 389.3753 38.3398 0.462 42 +44 2 317.214 388.3514 38.5073 0.4671 43 +45 2 316.6455 387.3607 38.6809 0.4705 44 +46 2 316.0483 386.3871 38.8528 0.5046 45 +47 2 315.5163 385.377 39.0278 0.5473 46 +48 2 315.0988 384.3142 39.1975 0.4967 47 +49 2 314.727 383.2343 39.3506 0.4615 48 +50 2 314.4822 382.1177 39.4828 0.4547 49 +51 2 314.1962 381.0115 39.59 0.5018 50 +52 2 313.8839 379.911 39.671 0.5274 51 +53 2 313.5578 378.815 39.7261 0.5317 52 +54 2 313.289 377.703 39.7617 0.5197 53 +55 2 313.2364 376.5602 39.7846 0.4812 54 +56 2 313.2249 375.4162 39.8003 0.4878 55 +57 2 313.0922 374.2802 39.8146 0.4647 56 +58 2 313.0545 373.1362 39.8289 0.4797 57 +59 2 313.0533 371.9922 39.8426 0.4551 58 +60 2 313.0533 370.8482 39.8552 0.4354 59 +61 2 313.0533 369.7053 39.8656 0.502 60 +62 2 313.0533 368.5613 39.8734 0.5824 61 +63 2 313.0533 367.4173 39.8787 0.5968 62 +64 2 313.0533 366.2733 39.8818 0.5909 63 +65 2 312.9183 365.1362 39.8838 0.6249 64 +66 2 312.7296 364.0082 39.8854 0.5828 65 +67 2 312.5969 362.8722 39.8866 0.4442 66 +68 2 312.5957 361.7282 39.8882 0.3659 67 +69 2 312.5957 360.5842 39.8902 0.3836 68 +70 2 312.503 359.4437 39.893 0.4264 69 +71 2 312.3681 358.3077 39.8966 0.457 70 +72 2 312.3669 357.1637 39.9017 0.5211 71 +73 2 312.3669 356.0197 39.9081 0.4908 72 +74 2 312.3669 354.8757 39.9165 0.4714 73 +75 2 312.3669 353.7317 39.9274 0.486 74 +76 2 312.3669 352.5877 39.9417 0.4968 75 +77 2 312.3669 351.4437 39.9605 0.4806 76 +78 2 312.3669 350.2997 39.9843 0.3988 77 +79 2 312.3669 349.1557 40.0148 0.3832 78 +80 2 312.3669 348.0117 40.0537 0.38 79 +81 2 312.3669 346.8688 40.103 0.3638 80 +82 2 312.3337 345.7248 40.1638 0.3847 81 +83 2 311.9093 344.6632 40.2352 0.4036 82 +84 2 310.7973 343.2252 40.4258 0.4242 83 +85 2 310.2299 342.2345 40.5457 0.459 84 +86 2 309.7975 341.1751 40.6585 0.381 85 +87 2 309.3273 340.1341 40.7543 0.2489 86 +88 2 309.1694 339.0015 40.8251 0.1639 87 +89 2 308.9246 337.8838 40.8666 0.1382 88 +90 2 308.4876 336.8268 40.8783 0.1385 89 +91 2 308.1581 335.732 40.8663 0.1397 90 +92 2 308.0151 334.5971 40.8363 0.1417 91 +93 2 307.855 333.4646 40.7896 0.1454 92 +94 2 307.6536 332.3389 40.7285 0.1529 93 +95 2 307.3642 331.2315 40.6521 0.1634 94 +96 2 306.9249 330.1767 40.5544 0.199 95 +97 2 306.4742 329.1265 40.4334 0.1877 96 +98 2 306.0006 328.0866 40.2965 0.2009 97 +99 2 305.353 327.1462 40.1456 0.1701 98 +100 2 304.7353 326.1841 39.9846 0.1556 99 +101 2 304.415 325.0893 39.8174 0.1475 100 +102 2 304.1862 323.9705 39.6505 0.1561 101 +103 2 303.8876 322.8677 39.4974 0.172 102 +104 2 303.5798 321.7672 39.3733 0.2027 103 +105 2 303.2858 320.6621 39.2918 0.2546 104 +106 2 302.9552 319.5672 39.2602 0.374 105 +107 2 302.4999 318.5171 39.2806 0.4818 106 +108 2 302.0171 317.4806 39.3495 0.5484 107 +109 2 302.4221 316.5505 37.2061 0.26 108 +110 2 303.2378 315.8927 36.2334 0.2078 109 +111 2 304.1827 316.3766 35.3534 0.2025 110 +112 2 304.7216 317.3307 34.5442 0.2283 111 +113 2 305.3428 318.2436 33.8178 0.3373 112 +114 2 305.4583 319.303 33.1671 0.3432 113 +115 2 305.5773 320.4413 33.1657 0.2288 114 +116 2 305.694 321.5795 33.1719 0.1741 115 +117 2 305.8175 322.7167 33.1836 0.1581 116 +118 2 305.9353 323.8538 33.1895 0.1734 117 +119 2 306.028 324.9944 33.1713 0.2144 118 +120 2 306.1298 326.1338 33.1246 0.2313 119 +121 2 306.1802 327.2767 33.0529 0.2081 120 +122 2 306.179 328.4195 32.963 0.2009 121 +123 2 306.2168 329.5624 32.8591 0.2395 122 +124 2 306.2831 330.7029 32.7446 0.2877 123 +125 2 306.425 331.8378 32.6217 0.2633 124 +126 2 306.6686 332.9543 32.4962 0.2008 125 +127 2 306.8688 334.0789 32.3795 0.1652 126 +128 2 307.0668 335.2057 32.2834 0.1659 127 +129 2 307.1434 336.3463 32.2132 0.1885 128 +130 2 307.1548 337.4903 32.1712 0.2404 129 +131 2 307.2246 338.7441 30.4912 0.1372 130 +132 2 307.1057 339.8732 30.1451 0.1375 131 +133 2 306.9203 340.9921 29.7769 0.1377 132 +134 2 306.7281 342.1086 29.3902 0.1381 133 +135 2 306.5371 343.2252 28.9965 0.1388 134 +136 2 306.417 344.352 28.6166 0.14 135 +137 2 306.3254 345.4834 28.2696 0.1424 136 +138 2 306.2465 346.6171 27.9433 0.1466 137 +139 2 306.3049 347.752 27.6304 0.155 138 +140 2 306.3815 348.8868 27.3219 0.1676 139 +141 2 306.4284 350.0228 27.0108 0.2064 140 +142 2 306.3781 351.1577 26.6921 0.2023 141 +143 2 306.3197 352.2925 26.3644 0.2253 142 +144 2 306.2362 353.4251 26.0242 0.2287 143 +145 2 306.1378 354.5553 25.6724 0.1998 144 +146 2 306.012 355.6833 25.3219 0.2 145 +147 2 305.8358 356.8056 24.99 0.168 146 +148 2 305.6596 357.9301 24.6856 0.152 147 +149 2 305.4972 359.057 24.425 0.1413 148 +150 2 305.3462 360.1873 24.2188 0.1441 149 +151 2 305.2032 361.321 24.0729 0.1525 150 +152 2 305.0876 362.4581 23.9654 0.1525 151 +153 2 304.8085 363.5655 23.7838 0.2288 152 +154 2 307.5953 338.9169 32.2496 0.2662 130 +155 2 308.348 339.776 32.3624 0.206 154 +156 2 308.6695 340.8708 32.5142 0.1754 155 +157 2 309.031 341.953 32.7037 0.1787 156 +158 2 309.261 343.0707 32.928 0.2394 157 +159 2 309.6339 344.1472 33.1696 0.203 158 +160 2 310.1132 345.1814 33.4088 0.1744 159 +161 2 310.2997 346.306 33.6325 0.1596 160 +162 2 310.3066 347.4465 33.8344 0.1759 161 +163 2 310.3066 348.5882 34.0147 0.2219 162 +164 2 310.3066 349.7311 34.1785 0.2312 163 +165 2 310.3432 350.8728 34.3297 0.2738 164 +166 2 310.5068 352.0031 34.4649 0.3442 165 +167 2 310.5285 353.1459 34.5797 0.2875 166 +168 2 310.6681 354.2808 34.6713 0.2907 167 +169 2 310.8694 355.4065 34.7376 0.2279 168 +170 2 311.0845 356.5299 34.781 0.216 169 +171 2 311.406 357.6281 34.806 0.2591 170 +172 2 311.8269 358.692 34.8186 0.2519 171 +173 2 311.9505 359.8292 34.8239 0.2034 172 +174 2 312.2331 360.9377 34.8258 0.1694 173 +175 2 312.3669 362.0737 34.8264 0.178 174 +176 2 312.4081 363.2177 34.8264 0.1907 175 +177 2 312.5957 364.3457 34.8264 0.3432 176 +178 2 305.996 319.4448 32.6421 0.2884 113 +179 2 306.5302 320.4413 32.2095 0.1992 178 +180 2 307.1629 321.3862 31.9096 0.1536 179 +181 2 307.9717 322.1882 31.7316 0.1391 180 +182 2 308.8686 322.8974 31.6772 0.1391 181 +183 2 309.4543 323.8767 31.7103 0.1407 182 +184 2 309.8535 324.9475 31.7738 0.1435 183 +185 2 310.1087 326.0629 31.8164 0.1494 184 +186 2 310.2551 327.1966 31.8175 0.1571 185 +187 2 310.4564 328.3223 31.773 0.1865 186 +188 2 310.731 329.4331 31.6932 0.1683 187 +189 2 310.9735 330.5496 31.5888 0.1521 188 +190 2 311.1714 331.6753 31.4636 0.1406 189 +191 2 311.3728 332.7999 31.3118 0.1431 190 +192 2 311.6348 333.9107 31.1301 0.1479 191 +193 2 311.8933 335.0227 30.9257 0.1569 192 +194 2 312.1404 336.1358 30.7121 0.1753 193 +195 2 312.5786 337.1894 30.5169 0.1999 194 +196 2 313.043 338.2328 30.3526 0.2918 195 +197 2 313.4366 339.3058 30.2266 0.2384 196 +198 2 313.8987 340.3526 30.1476 0.1953 197 +199 2 314.3609 341.3982 30.0997 0.1868 198 +200 2 314.8231 342.445 30.0642 0.1671 199 +201 2 315.2853 343.4906 30.0202 0.1503 200 +202 2 315.7486 344.5362 29.951 0.1379 201 +203 2 316.2096 345.583 29.8472 0.1383 202 +204 2 316.6718 346.6274 29.7027 0.1391 203 +205 2 317.317 347.4225 30.8563 0.1153 204 +206 2 318.0846 348.2576 30.6368 0.1725 205 +207 2 318.5823 349.2861 30.5357 0.2049 206 +208 2 318.8374 350.3969 30.3167 0.2651 207 +209 2 318.9804 351.5192 29.913 0.3661 208 +210 2 318.4438 350.6783 29.0368 0.2941 209 +211 2 317.8593 349.7631 28.1593 0.2132 210 +212 2 317.2747 348.8502 27.2618 0.1561 211 +213 2 316.6935 347.9407 26.3357 0.1526 212 +214 2 316.5151 346.8734 25.5626 0.1634 213 +215 2 316.5276 345.7683 24.8499 0.1962 214 +216 2 316.0243 344.8016 24.2872 0.1959 215 +217 2 315.3848 343.8727 23.8136 0.2093 216 +218 2 314.711 342.9666 23.3723 0.1976 217 +219 2 314.0715 342.0331 22.9744 0.1939 218 +220 2 313.2855 341.2621 22.2895 0.2433 219 +221 2 312.6758 340.3366 21.6047 0.2118 220 +222 2 312.1633 339.3424 21.0113 0.1894 221 +223 2 311.6416 338.346 20.4999 0.1992 222 +224 2 312.042 338.2133 20.2421 0.1948 223 +225 2 313.067 337.7546 19.759 0.1901 224 +226 2 314.0509 337.1871 19.4576 0.2217 225 +227 2 315.005 336.5614 19.2455 0.2091 226 +228 2 315.8435 335.796 19.0536 0.1731 227 +229 2 316.5826 334.9266 18.8749 0.1451 228 +230 2 317.2781 334.0194 18.7831 0.1382 229 +231 2 317.9565 333.0985 18.8019 0.1389 230 +232 2 318.6486 332.1879 18.8674 0.1403 231 +233 2 319.2526 331.2189 18.8798 0.1429 232 +234 2 319.7457 330.1881 18.8096 0.1481 233 +235 2 320.2102 329.1437 18.7128 0.1555 234 +236 2 320.7433 328.1324 18.6364 0.1808 235 +237 2 321.313 327.1405 18.5868 0.1712 236 +238 2 321.758 326.0903 18.5415 0.1538 237 +239 2 322.131 325.0081 18.4783 0.1407 238 +240 2 322.4936 323.9247 18.3713 0.139 239 +241 2 323.291 323.1571 18.0931 0.1407 240 +242 2 324.2862 322.632 17.6218 0.1438 241 +243 2 325.2609 322.1024 16.9457 0.1493 242 +244 2 326.2116 321.5601 16.1336 0.1611 243 +245 2 326.882 320.7101 15.3 0.1793 244 +246 2 326.9598 319.6096 14.5651 0.2316 245 +247 2 327.0627 318.5056 13.8835 0.1986 246 +248 2 326.9907 317.4406 12.88 0.1144 247 +249 2 310.9381 338.298 19.723 0.1514 223 +250 2 309.8879 338.0898 18.8467 0.136 249 +251 2 309.4051 337.3095 17.8595 0.1622 250 +252 2 308.3824 337.0224 16.938 0.1967 251 +253 2 307.3013 337.2672 16.2529 0.1831 252 +254 2 306.2339 337.6093 15.6968 0.2012 253 +255 2 305.2272 338.0051 14.7854 0.1144 254 +256 2 319.1794 352.6277 30.4671 0.1158 209 +257 2 319.5261 353.7122 30.7191 0.2132 256 +258 2 319.8384 354.8127 30.8246 0.2958 257 +259 2 320.1084 355.9236 30.9196 0.3459 258 +260 2 320.3372 357.0435 31.0013 0.2546 259 +261 2 320.6415 358.1464 31.0775 0.1783 260 +262 2 320.797 359.2789 31.1693 0.1525 261 +263 2 320.8542 360.4149 31.4667 0.1144 262 +264 2 316.4212 346.4066 29.5509 0.14 204 +265 2 315.553 345.6928 29.0332 0.143 264 +266 2 314.7281 344.9332 28.4822 0.1482 265 +267 2 313.9742 344.0969 27.9917 0.1579 266 +268 2 313.2398 343.2355 27.5862 0.1737 267 +269 2 312.5454 342.3374 27.2443 0.2131 268 +270 2 311.899 341.3993 27.0117 0.2381 269 +271 2 311.2755 340.4407 26.9081 0.2232 270 +272 2 310.556 339.5529 26.8722 0.247 271 +273 2 309.6625 338.8459 26.8631 0.2067 272 +274 2 308.6821 338.2579 26.8616 0.1736 273 +275 2 307.7028 337.6653 26.8245 0.1534 274 +276 2 306.7041 337.1105 26.7221 0.1595 275 +277 2 305.6493 336.6723 26.5811 0.1895 276 +278 2 304.6243 336.1678 26.4708 0.1804 277 +279 2 303.6485 335.5718 26.3668 0.1706 278 +280 2 302.6864 334.9575 26.2028 0.1853 279 +281 2 301.8215 334.215 25.9879 0.1684 280 +282 2 300.975 333.4554 25.6964 0.1509 281 +283 2 300.0632 332.7827 25.3211 0.1377 282 +284 2 299.0588 332.2576 24.9446 0.1373 283 +285 2 298.0326 331.768 24.6181 0.1373 284 +286 2 297.0339 331.2189 24.4138 0.1373 285 +287 2 296.0386 330.6572 24.2363 0.1373 286 +288 2 295.0479 330.0898 24.0743 0.1373 287 +289 2 294.0309 329.5692 23.9355 0.1373 288 +290 2 294.2334 329.0373 26.1593 0.1373 289 +291 2 293.317 328.3932 26.7276 0.1372 290 +292 2 292.2863 327.9001 26.8599 0.1372 291 +293 2 291.2681 327.3808 26.9117 0.1371 292 +294 2 290.298 326.7744 26.8944 0.1368 293 +295 2 289.289 326.2356 26.8136 0.1364 294 +296 2 288.2594 325.7391 26.7121 0.1356 295 +297 2 287.2012 325.3078 26.5839 0.1342 296 +298 2 286.0698 325.1431 26.4928 0.1313 297 +299 2 284.9418 324.9589 26.388 0.1271 298 +300 2 283.8058 324.8342 26.2566 0.1144 299 +301 2 282.6767 324.9646 25.9344 0.1144 300 +302 2 293.2392 329.4171 23.6285 0.1373 289 +303 2 292.1467 329.6711 23.1815 0.1373 302 +304 2 291.053 329.9559 22.7393 0.1373 303 +305 2 289.9285 330.1161 22.411 0.1373 304 +306 2 288.7936 330.1881 22.115 0.1373 305 +307 2 288.2777 331.1903 21.9104 0.1373 306 +308 2 287.7938 332.2268 21.8199 0.1373 307 +309 2 287.0548 333.0985 21.8042 0.1373 308 +310 2 286.0389 333.6236 21.8371 0.1373 309 +311 2 285.0356 334.1727 21.9052 0.1373 310 +312 2 284.0426 334.739 22.0074 0.1373 311 +313 2 284.109 334.215 21.3179 0.116 312 +314 2 284.2199 333.2117 20.0178 0.1373 313 +315 2 284.3137 332.1146 19.2655 0.1373 314 +316 2 284.5391 331.037 18.5273 0.1373 315 +317 2 285.2987 330.4902 18.1683 0.1372 316 +318 2 286.4233 330.6309 18.1873 0.1372 317 +319 2 287.525 330.9226 18.4057 0.1371 318 +320 2 288.6392 331.14 18.7328 0.1369 319 +321 2 289.7786 331.1457 18.8793 0.1364 320 +322 2 290.7259 330.5233 18.7946 0.1356 321 +323 2 291.3505 329.567 18.6378 0.1342 322 +324 2 292.0014 328.63 18.4166 0.1313 323 +325 2 292.7199 327.7434 18.2175 0.1271 324 +326 2 293.4486 326.8648 18.0569 0.1144 325 +327 2 294.2654 326.0663 17.8884 0.1144 326 +328 2 283.132 335.16 22.1208 0.1373 312 +329 2 282.0932 335.6382 22.2375 0.1373 328 +330 2 281.0465 336.0969 22.3456 0.1373 329 +331 2 280.0398 336.638 22.4364 0.1373 330 +332 2 279.2081 337.4239 22.5053 0.1373 331 +333 2 278.5583 338.3643 22.5522 0.1373 332 +334 2 277.8021 339.2235 22.581 0.1373 333 +335 2 276.6604 339.2601 22.5966 0.1373 334 +336 2 275.5438 339.5095 22.6038 0.1373 335 +337 2 274.5062 339.9911 22.6066 0.1373 336 +338 2 273.5007 340.5356 22.6075 0.1373 337 +339 2 272.5431 341.1625 22.6078 0.1373 338 +340 2 271.581 341.7803 22.6078 0.1373 339 +341 2 270.6063 342.3809 22.6078 0.1373 340 +342 2 269.6145 342.9495 22.608 0.1373 341 +343 2 268.5906 343.4608 22.608 0.1373 342 +344 2 267.5885 344.0122 22.6083 0.1373 343 +345 2 266.8883 344.4893 22.6087 0.1373 344 +346 2 265.9079 345.0773 22.6091 0.1373 345 +347 2 264.8623 345.5315 22.6098 0.1373 346 +348 2 263.7755 345.8884 22.6107 0.1373 347 +349 2 262.6761 346.2064 22.6117 0.1373 348 +350 2 261.5722 346.5062 22.613 0.1373 349 +351 2 260.4819 346.8482 22.615 0.1373 350 +352 2 259.4089 347.2429 22.6176 0.1373 351 +353 2 258.3552 347.6879 22.6212 0.1373 352 +354 2 257.3279 348.1913 22.6258 0.1373 353 +355 2 256.3338 348.7564 22.6318 0.1373 354 +356 2 255.374 349.3787 22.6398 0.1373 355 +357 2 254.4107 349.9942 22.6503 0.1373 356 +358 2 253.4154 350.5582 22.6641 0.1373 357 +359 2 252.4019 351.089 22.682 0.1373 358 +360 2 251.3803 351.6027 22.705 0.1373 359 +361 2 250.345 352.0889 22.7347 0.1373 360 +362 2 249.2902 352.5305 22.7728 0.1373 361 +363 2 248.2102 352.9057 22.8209 0.1373 362 +364 2 247.1006 353.1711 22.8805 0.1373 363 +365 2 245.9737 353.369 22.9528 0.1373 364 +366 2 244.856 353.6047 23.0418 0.1373 365 +367 2 243.7475 353.8861 23.15 0.1373 366 +368 2 242.6413 354.1721 23.2708 0.1373 367 +369 2 241.5236 354.4078 23.3915 0.1373 368 +370 2 240.4711 354.7967 23.5007 0.1373 369 +371 2 239.5971 355.5174 23.5895 0.1373 370 +372 2 238.7322 356.2508 23.6534 0.1373 371 +373 2 237.7449 356.8262 23.6937 0.1373 372 +374 2 236.7966 357.4554 23.7159 0.1373 373 +375 2 236.0106 358.2756 23.7259 0.1373 374 +376 2 235.2613 359.1359 23.7287 0.1373 375 +377 2 234.3862 359.8658 23.7278 0.1373 376 +378 2 233.4366 360.5041 23.7247 0.1373 377 +379 2 232.4654 361.1082 23.72 0.1373 378 +380 2 231.4529 361.6367 23.7139 0.1373 379 +381 2 230.3936 362.068 23.7056 0.1373 380 +382 2 229.3709 362.5656 23.6941 0.1373 381 +383 2 228.5232 363.3115 23.6788 0.1373 382 +384 2 227.8997 364.2622 23.659 0.1373 383 +385 2 227.3014 365.2334 23.6333 0.1374 384 +386 2 226.6127 366.1464 23.6 0.1375 385 +387 2 225.8908 367.0341 23.557 0.1377 386 +388 2 225.1701 367.923 23.5015 0.1381 387 +389 2 224.4185 368.7821 23.4304 0.1387 388 +390 2 223.5079 369.4502 23.3411 0.14 389 +391 2 222.4577 369.8907 23.2307 0.1423 390 +392 2 221.396 370.3105 23.0917 0.1469 391 +393 2 220.4682 370.95 22.9209 0.1539 392 +394 2 219.6366 371.7314 22.727 0.1743 393 +395 2 218.7568 372.4544 22.5214 0.1759 394 +396 2 217.8268 373.1145 22.3124 0.1582 395 +397 2 216.8761 373.7459 22.1082 0.1445 396 +398 2 216.0421 374.5078 21.9224 0.1409 397 +399 2 215.5113 375.4997 21.7705 0.144 398 +400 2 215.2516 376.6071 21.656 0.15 399 +401 2 215.0514 377.7328 21.5751 0.1594 400 +402 2 214.5858 378.7567 21.5232 0.1861 401 +403 2 213.8308 379.6055 21.4941 0.1912 402 +404 2 213.0654 380.4532 21.4785 0.1953 403 +405 2 212.45 381.4119 21.4697 0.1786 404 +406 2 212.0049 382.4621 21.4636 0.1566 405 +407 2 211.7487 383.5729 21.4574 0.1432 406 +408 2 211.6183 384.7089 21.4495 0.1404 407 +409 2 211.5508 385.8506 21.4386 0.1431 408 +410 2 211.513 386.9946 21.4234 0.1479 409 +411 2 211.3494 388.1226 21.4019 0.1577 410 +412 2 210.8953 389.1591 21.3716 0.172 411 +413 2 210.2786 390.1223 21.3292 0.2177 412 +414 2 209.6506 391.0775 21.2698 0.2091 413 +415 2 209.0225 392.0328 21.1874 0.1737 414 +416 2 208.4025 392.9926 21.0758 0.146 415 +417 2 207.7847 393.9536 20.914 0.1387 416 +418 2 207.1544 394.9031 20.6755 0.1399 417 +419 2 206.5309 395.8537 20.3534 0.1423 418 +420 2 205.9932 396.8467 19.942 0.1467 419 +421 2 205.3686 397.7768 19.4186 0.1549 420 +422 2 204.4648 397.5446 18.8408 0.173 421 +423 2 203.5794 396.8536 18.3283 0.1972 422 +424 2 202.7042 396.1443 17.8442 0.2801 423 +425 2 201.8291 395.4328 17.3793 0.2466 424 +426 2 200.8567 394.8642 16.9228 0.2058 425 +427 2 199.7538 394.8951 16.4668 0.1811 426 +428 2 198.6304 394.9202 15.9396 0.2337 427 +429 2 197.5837 394.5427 15.3674 0.2032 428 +430 2 196.5426 394.1172 14.8526 0.1731 429 +431 2 195.4982 393.6882 14.3958 0.1549 430 +432 2 194.4457 393.2546 14.1429 0.1704 431 +433 2 193.368 392.8713 14.0649 0.1936 432 +434 2 192.2824 392.5098 14.1 0.2682 433 +435 2 191.191 392.1701 14.1969 0.2521 434 +436 2 190.0825 391.8898 14.3133 0.2882 435 +437 2 188.9533 391.7102 14.421 0.2593 436 +438 2 187.8162 391.5901 14.5065 0.2172 437 +439 2 186.6779 391.4791 14.5825 0.1942 438 +440 2 185.5408 391.3635 14.6642 0.2262 439 +441 2 184.4059 391.2263 14.7637 0.2658 440 +442 2 183.2745 391.0661 14.894 0.2102 441 +443 2 182.1465 390.8876 15.0611 0.164 442 +444 2 181.0186 390.7149 15.2615 0.1392 443 +445 2 179.8894 390.5547 15.4875 0.1407 444 +446 2 178.7534 390.4598 15.7271 0.1436 445 +447 2 177.614 390.4724 15.979 0.1494 446 +448 2 176.4849 390.6245 16.2337 0.1573 447 +449 2 175.4221 391.0341 16.4738 0.1869 448 +450 2 174.3834 391.5054 16.6902 0.1674 449 +451 2 173.3412 391.971 16.8794 0.1509 450 +452 2 172.2944 392.4286 17.0419 0.139 451 +453 2 171.2545 392.9022 17.1879 0.1405 452 +454 2 170.218 393.3816 17.3234 0.1431 453 +455 2 169.1598 393.8128 17.4511 0.1483 454 +456 2 168.0227 393.933 17.576 0.1567 455 +457 2 166.8799 393.9238 17.6925 0.178 456 +458 2 165.737 393.8964 17.7936 0.1909 457 +459 2 164.5953 393.9055 17.9743 0.3432 458 +460 2 266.7911 343.9745 22.5779 0.1204 344 +461 2 265.6677 343.9207 22.1247 0.1313 460 +462 2 264.5351 343.8681 21.7937 0.1373 461 +463 2 263.3957 343.8498 21.5303 0.1373 462 +464 2 262.2712 343.8715 21.0491 0.1373 463 +465 2 261.1958 343.6805 20.2579 0.1373 464 +466 2 260.1433 343.3945 19.4204 0.1373 465 +467 2 259.0565 343.2149 18.6573 0.1373 466 +468 2 257.964 343.0398 17.9531 0.1373 467 +469 2 256.8497 342.962 17.3489 0.1373 468 +470 2 255.724 342.9106 16.8625 0.1373 469 +471 2 254.5926 342.8602 16.4758 0.1373 470 +472 2 253.4543 342.803 16.2343 0.1373 471 +473 2 252.3126 342.8557 16.1095 0.1373 472 +474 2 251.1858 343.0513 16.0667 0.1373 473 +475 2 250.0841 343.3613 16.0848 0.1373 474 +476 2 248.9882 343.6862 16.1529 0.1373 475 +477 2 247.8808 343.9699 16.2544 0.1373 476 +478 2 246.7928 344.32 16.3653 0.1373 477 +479 2 245.7072 344.678 16.4721 0.1373 478 +480 2 244.6021 344.9721 16.5637 0.1373 479 +481 2 243.4638 345.083 16.6296 0.1373 480 +482 2 242.3198 345.1128 16.6582 0.1373 481 +483 2 241.1758 345.0945 16.6393 0.1373 482 +484 2 240.0341 345.0327 16.5724 0.1373 483 +485 2 238.8935 344.9652 16.469 0.1373 484 +486 2 237.7507 344.9412 16.3467 0.1373 485 +487 2 236.6158 344.8027 16.2124 0.1373 486 +488 2 235.4775 344.7055 16.1018 0.1373 487 +489 2 234.3347 344.6666 16.0366 0.1373 488 +490 2 233.1907 344.6746 16.0186 0.1373 489 +491 2 232.0467 344.7078 16.038 0.1373 490 +492 2 230.9027 344.7272 16.073 0.1373 491 +493 2 229.7598 344.6815 16.0999 0.1373 492 +494 2 228.7176 344.2102 16.0905 0.1373 493 +495 2 227.8516 343.4631 16.025 0.1373 494 +496 2 226.9467 342.7653 15.9062 0.1373 495 +497 2 226.4205 342.2459 16.9736 0.1154 496 +498 2 225.7089 341.357 16.9947 0.1357 497 +499 2 225.1072 340.3858 16.9491 0.1356 498 +500 2 224.3636 339.5175 16.8953 0.1342 499 +501 2 223.5147 338.7498 16.8647 0.1314 500 +502 2 222.6888 337.9582 16.8798 0.1272 501 +503 2 221.9268 337.1048 16.945 0.1146 502 +504 2 221.5059 336.0592 17.3986 0.1144 503 +505 2 226.234 343.4174 15.6911 0.1373 496 +506 2 225.4378 344.2319 15.45 0.1373 505 +507 2 224.7445 345.1334 15.186 0.1373 506 +508 2 224.1794 346.1218 14.9223 0.1373 507 +509 2 223.5902 347.0885 14.6781 0.1373 508 +510 2 222.7162 347.7977 14.4693 0.1373 509 +511 2 221.7244 348.229 14.2249 0.1374 510 +512 2 221.1695 349.2197 13.9303 0.1375 511 +513 2 220.3504 350.0114 13.7616 0.1376 512 +514 2 219.4592 350.7264 13.654 0.138 513 +515 2 218.5486 351.4185 13.5797 0.1386 514 +516 2 217.6014 352.0603 13.5406 0.1398 515 +517 2 216.6553 352.7032 13.5448 0.1419 516 +518 2 215.739 353.3885 13.5775 0.1456 517 +519 2 214.9656 354.2293 13.5078 0.1535 518 +520 2 214.0687 354.9386 13.4069 0.1652 519 +521 2 213.1581 355.6296 13.2718 0.1992 520 +522 2 212.1926 356.2405 13.1501 0.2034 521 +523 2 211.2099 356.825 13.0577 0.1525 522 +524 2 210.2592 357.4588 12.9212 0.1144 523 +525 2 301.412 316.9063 39.4666 0.5177 108 +526 2 300.6215 316.0826 39.634 0.4111 525 +527 2 300.419 314.9604 39.8286 0.4504 526 +528 2 300.1307 313.8575 40.042 0.5088 527 +529 2 299.4706 312.9275 40.2595 0.4691 528 +530 2 298.6252 312.1621 40.4692 0.4269 529 +531 2 298.1779 311.1119 40.6692 0.3103 530 +532 2 298.1779 310.2185 40.8514 0.2811 531 +533 2 298.1779 309.0768 41.0371 0.3477 532 +534 2 298.1264 307.9362 41.2272 0.4446 533 +535 2 297.6265 306.9135 41.4518 0.4296 534 +536 2 297.0362 305.9399 41.7222 0.5568 535 +537 2 297.0911 307.1022 44.151 0.17 536 +538 2 297.3233 308.1353 45.0957 0.2207 537 +539 2 297.8198 309.1157 45.8293 0.2988 538 +540 2 298.4776 310.0 46.564 0.4108 539 +541 2 299.1709 310.8626 47.2746 0.4869 540 +542 2 299.8058 311.7766 47.9248 0.444 541 +543 2 300.4739 312.6758 48.4865 0.3425 542 +544 2 301.2999 313.4354 48.979 0.2996 543 +545 2 302.2288 314.076 49.4183 0.4059 544 +546 2 303.192 314.6709 49.8257 0.4469 545 +547 2 304.0981 315.3505 50.2076 0.4475 546 +548 2 304.9263 316.1238 50.5574 0.4302 547 +549 2 305.7878 316.8651 50.8763 0.4481 548 +550 2 306.6961 317.5492 51.1644 0.4315 549 +551 2 307.601 318.2425 51.4147 0.3904 550 +552 2 308.491 318.9564 51.6202 0.4063 551 +553 2 309.3433 319.716 51.7818 0.3928 552 +554 2 310.1544 320.5213 51.9047 0.3591 553 +555 2 310.8202 321.4468 51.9971 0.2838 554 +556 2 311.3808 322.4433 52.066 0.2042 555 +557 2 312.0523 323.3676 52.1237 0.1561 556 +558 2 312.8108 324.2222 52.1797 0.1391 557 +559 2 313.5796 325.0699 52.2424 0.1373 558 +560 2 314.3403 325.9233 52.3188 0.1373 559 +561 2 314.9832 326.8671 52.4168 0.1373 560 +562 2 315.5369 327.8658 52.5398 0.1374 561 +563 2 316.1902 328.8028 52.6901 0.1375 562 +564 2 316.9235 329.6768 52.8665 0.1376 563 +565 2 317.6122 330.584 53.116 0.1379 564 +566 2 317.8444 331.6845 53.4173 0.1385 565 +567 2 318.0057 332.8102 53.7051 0.1395 566 +568 2 318.5399 333.8112 53.9627 0.1414 567 +569 2 319.2446 334.7081 54.1674 0.1448 568 +570 2 319.7732 335.7194 54.3136 0.1516 569 +571 2 320.2765 336.7467 54.3998 0.1614 570 +572 2 321.075 337.5612 54.4449 0.1946 571 +573 2 322.0223 338.2019 54.4636 0.1838 572 +574 2 322.6172 339.1754 54.4676 0.1816 573 +575 2 322.9729 340.2622 54.4628 0.191 574 +576 2 323.4157 341.317 54.4538 0.2593 575 +577 2 323.8458 342.3763 54.441 0.2533 576 +578 2 324.2657 343.4414 54.423 0.2067 577 +579 2 324.6306 344.5248 54.3976 0.1735 578 +580 2 325.0939 345.5704 54.3617 0.1928 579 +581 2 325.7391 346.5153 54.3113 0.1792 580 +582 2 326.3214 347.4992 54.2427 0.1699 581 +583 2 326.9678 348.443 54.1526 0.1865 582 +584 2 327.6862 349.3307 54.0078 0.1671 583 +585 2 328.4046 350.2173 53.7984 0.15 584 +586 2 329.1208 351.1028 53.5388 0.1373 585 +587 2 329.8369 351.9859 53.242 0.1373 586 +588 2 330.5519 352.8691 52.92 0.1373 587 +589 2 331.2669 353.7523 52.5826 0.1373 588 +590 2 331.9819 354.6343 52.2399 0.1373 589 +591 2 332.6969 355.5163 51.893 0.1373 590 +592 2 333.4119 356.3972 51.5427 0.1373 591 +593 2 334.1578 357.2529 51.1804 0.1374 592 +594 2 334.914 358.096 50.8066 0.1374 593 +595 2 335.6713 358.9403 50.4244 0.1376 594 +596 2 336.4275 359.7834 50.036 0.1379 595 +597 2 337.1826 360.6277 49.6434 0.1383 596 +598 2 337.9387 361.4708 49.2486 0.1391 597 +599 2 338.6949 362.314 48.8533 0.1407 598 +600 2 339.4511 363.1571 48.4576 0.1436 599 +601 2 340.2062 364.0014 48.062 0.1495 600 +602 2 340.9623 364.8445 47.6669 0.1574 601 +603 2 341.7345 365.6727 47.2718 0.187 602 +604 2 342.6028 366.3992 46.8703 0.1675 603 +605 2 343.3968 367.2068 46.4699 0.1511 604 +606 2 343.9505 368.1953 46.0852 0.1396 605 +607 2 344.5019 369.186 45.7055 0.1414 606 +608 2 345.051 370.1778 45.3382 0.1455 607 +609 2 345.6035 371.1697 44.9884 0.1499 608 +610 2 346.3117 372.0563 44.653 0.1735 609 +611 2 347.1514 372.8227 44.3262 0.1394 610 +612 2 347.9728 373.5732 43.68 0.1144 611 +613 2 296.2571 304.757 42.1781 0.5925 536 +614 2 295.6371 303.7995 42.3931 0.4874 613 +615 2 295.0387 302.8271 42.5751 0.3281 614 +616 2 294.4462 301.8501 42.7123 0.3104 615 +617 2 293.8753 300.8594 42.8033 0.3006 616 +618 2 293.309 299.8653 42.8585 0.2898 617 +619 2 292.7668 298.8586 42.8812 0.3483 618 +620 2 292.2359 297.845 42.8809 0.4177 619 +621 2 291.7772 296.7971 42.8658 0.3963 620 +622 2 291.323 295.7469 42.8408 0.3999 621 +623 2 290.7613 294.7505 42.8072 0.4203 622 +624 2 290.1916 293.7586 42.7647 0.3935 623 +625 2 289.7741 292.6947 42.7115 0.3165 624 +626 2 289.3759 291.6216 42.6482 0.3044 625 +627 2 288.6873 290.7098 42.569 0.4438 626 +628 2 287.8956 289.8839 42.4718 0.4896 627 +629 2 287.2481 288.9424 42.3651 0.4719 628 +630 2 286.6166 287.9894 42.2576 0.3614 629 +631 2 286.2151 286.9186 42.163 0.303 630 +632 2 285.817 285.8467 42.0907 0.283 631 +633 2 285.42 284.7736 42.0476 0.2759 632 +634 2 285.0242 283.7006 42.0356 0.3466 633 +635 2 284.3584 282.7705 42.0518 0.4142 634 +636 2 283.5656 281.9468 42.0921 0.3894 635 +637 2 282.6664 281.2387 42.1543 0.3863 636 +638 2 281.7237 280.5912 42.2405 0.4013 637 +639 2 280.6507 280.1988 42.3545 0.3284 638 +640 2 280.606 279.732 42.2456 0.1525 639 +641 2 280.4093 278.6063 42.2764 0.1353 640 +642 2 280.0398 277.5252 42.3038 0.1374 641 +643 2 279.8064 276.4064 42.3788 0.1374 642 +644 2 279.4083 275.3356 42.4637 0.1376 643 +645 2 278.8843 274.3198 42.5292 0.1378 644 +646 2 278.3329 273.3176 42.5712 0.1383 645 +647 2 277.8284 272.2914 42.602 0.1391 646 +648 2 277.3045 271.2744 42.5527 0.1406 647 +649 2 276.7496 270.2769 42.3604 0.1434 648 +650 2 276.1444 269.3102 42.1448 0.1492 649 +651 2 275.5267 268.3515 41.9423 0.1568 650 +652 2 274.9398 267.3734 41.7155 0.1857 651 +653 2 274.3552 266.3941 41.4862 0.1675 652 +654 2 273.877 265.3588 41.307 0.1504 653 +655 2 273.4858 264.2846 41.1995 0.1376 654 +656 2 273.0968 263.2081 41.146 0.1374 655 +657 2 272.6507 262.1556 41.1746 0.1374 656 +658 2 272.1873 261.11 41.2818 0.1375 657 +659 2 271.7526 260.0541 41.4428 0.1377 658 +660 2 271.3923 258.9707 41.6293 0.1382 659 +661 2 271.033 257.8885 41.8264 0.1389 660 +662 2 270.675 256.8051 42.0414 0.1403 661 +663 2 270.3203 255.7229 42.3066 0.1429 662 +664 2 270.8729 254.8878 42.4732 0.1478 663 +665 2 271.5044 253.9348 42.583 0.1567 664 +666 2 272.0867 252.951 42.7036 0.1743 665 +667 2 272.6003 251.9328 42.903 0.2007 666 +668 2 273.1128 250.917 43.2006 0.2804 667 +669 2 273.6093 249.9137 41.6438 0.2287 668 +670 2 274.1104 248.9001 41.2188 0.183 669 +671 2 274.5669 247.8533 41.0404 0.1555 670 +672 2 274.7648 246.7311 40.8061 0.1483 671 +673 2 274.965 245.6099 40.539 0.1528 672 +674 2 275.2075 244.498 40.2576 0.1897 673 +675 2 275.6193 243.4569 39.6866 0.1144 674 +676 2 273.8908 249.9182 44.296 0.3154 668 +677 2 274.4731 250.1596 45.9791 0.334 676 +678 2 275.0233 250.774 47.6664 0.3086 677 +679 2 275.9992 250.9307 49.0006 0.2536 678 +680 2 277.0528 250.933 50.0819 0.2181 679 +681 2 278.135 250.9318 50.9818 0.1835 680 +682 2 279.2412 250.9444 51.6947 0.1563 681 +683 2 280.3647 250.9639 52.2119 0.1421 682 +684 2 281.4995 251.005 52.5297 0.1373 683 +685 2 282.6401 251.06 52.6851 0.1373 684 +686 2 283.7829 251.0943 52.7587 0.1373 685 +687 2 284.9235 251.0485 52.8744 0.1373 686 +688 2 286.0595 250.9501 53.1034 0.1373 687 +689 2 287.1886 250.8346 53.4374 0.1373 688 +690 2 288.3166 250.8655 53.8037 0.1373 689 +691 2 289.3771 250.6195 54.3866 0.1373 690 +692 2 290.2225 249.9571 55.2633 0.1372 691 +693 2 290.9604 249.1929 56.3018 0.1372 692 +694 2 291.7578 248.4985 57.3726 0.1371 693 +695 2 292.6066 247.8659 58.4318 0.1368 694 +696 2 293.4394 247.2047 59.4395 0.1363 695 +697 2 294.0229 246.2792 60.2521 0.1355 696 +698 2 294.4084 245.2336 60.8891 0.1341 697 +699 2 294.7974 244.1776 61.3886 0.1313 698 +700 2 295.152 243.1 61.7476 0.127 699 +701 2 295.4929 242.0121 61.9903 0.1144 700 +702 2 295.8315 240.9264 62.2894 0.1144 701 +703 2 270.2894 255.4072 42.6619 0.1233 663 +704 2 270.0195 254.3341 43.3129 0.1457 703 +705 2 269.4097 253.3857 43.6232 0.1593 704 +706 2 268.5975 252.5941 43.92 0.1889 705 +707 2 267.7086 251.8836 44.2294 0.1808 706 +708 2 266.798 251.2052 44.5525 0.1709 707 +709 2 265.8576 250.5646 44.8484 0.1849 708 +710 2 264.9458 249.8805 45.0722 0.1693 709 +711 2 264.4024 248.8909 45.2466 0.1521 710 +712 2 263.9254 247.8533 45.3785 0.139 711 +713 2 263.4758 246.802 45.4597 0.1378 712 +714 2 263.1864 245.6957 45.435 0.1384 713 +715 2 262.9221 244.5849 45.3244 0.1394 714 +716 2 262.5823 243.4947 45.1531 0.1411 715 +717 2 262.167 242.4319 44.9456 0.1442 716 +718 2 261.7266 241.3794 44.7353 0.1507 717 +719 2 260.9556 240.5443 44.5614 0.1599 718 +720 2 260.149 239.7344 44.45 0.191 719 +721 2 259.2704 239.0022 44.4615 0.18 720 +722 2 258.2946 238.4142 44.6701 0.1703 721 +723 2 257.2913 237.8856 45.0405 0.1867 722 +724 2 256.1977 237.6248 45.5437 0.1676 723 +725 2 255.1063 237.3731 46.1182 0.151 724 +726 2 254.0321 237.0654 46.7188 0.1398 725 +727 2 252.9601 236.7474 47.301 0.1402 726 +728 2 251.8779 236.4396 47.8148 0.1512 727 +729 2 250.822 236.1502 48.6242 0.1144 728 +730 2 279.3945 279.5456 42.5202 0.3393 639 +731 2 278.3055 279.2081 42.691 0.3128 730 +732 2 277.2244 278.8523 42.9839 0.2919 731 +733 2 276.1273 279.1177 43.3348 0.21 732 +734 2 275.0428 279.4506 43.6918 0.1631 733 +735 2 273.9148 279.573 44.0502 0.1375 734 +736 2 272.812 279.851 44.371 0.1373 735 +737 2 271.7309 280.1965 44.6986 0.1373 736 +738 2 270.5915 280.2217 44.9408 0.1374 737 +739 2 269.4498 280.24 45.1158 0.1374 738 +740 2 268.3218 280.4276 45.2396 0.1376 739 +741 2 267.2498 280.8234 45.3272 0.1379 740 +742 2 266.1802 281.2272 45.3956 0.1383 741 +743 2 265.1174 281.6517 45.4558 0.1391 742 +744 2 264.0581 282.0829 45.528 0.1407 743 +745 2 263.0216 282.5657 45.6168 0.1435 744 +746 2 261.9852 283.0473 45.7234 0.1494 745 +747 2 261.1512 283.6216 45.8595 0.157 746 +748 2 260.1879 284.2348 46.0298 0.1867 747 +749 2 259.1274 284.6592 46.2174 0.1669 748 +750 2 258.0681 285.0825 46.41 0.15 749 +751 2 257.7958 285.1386 46.5811 0.1381 750 +752 2 256.677 285.3605 46.783 0.1373 751 +753 2 255.5616 285.603 46.9722 0.1373 752 +754 2 254.4553 285.8845 47.1467 0.1373 753 +755 2 253.3514 286.1796 47.3032 0.1373 754 +756 2 252.2932 286.6098 47.4407 0.1373 755 +757 2 251.243 287.0616 47.5602 0.1373 756 +758 2 250.3106 287.7229 47.6638 0.1373 757 +759 2 249.416 288.4333 47.7627 0.1373 758 +760 2 248.4425 289.0339 47.868 0.1373 759 +761 2 247.4541 289.607 47.9875 0.1373 760 +762 2 246.508 290.2477 48.1292 0.1373 761 +763 2 245.5768 290.9089 48.2958 0.1373 762 +764 2 244.6719 291.6022 48.5038 0.1373 763 +765 2 243.7178 292.2268 48.7494 0.1373 764 +766 2 242.6596 292.6501 48.9952 0.1374 765 +767 2 241.6185 293.1145 49.2184 0.1374 766 +768 2 240.709 293.857 49.4872 0.1378 767 +769 2 239.8785 294.6406 49.5914 0.1382 768 +770 2 239.1109 295.4883 49.6583 0.1389 769 +771 2 238.2918 296.2846 49.6975 0.1403 770 +772 2 237.3834 296.9767 49.7185 0.1428 771 +773 2 236.4625 297.6562 49.73 0.1479 772 +774 2 235.5816 298.3849 49.7347 0.1551 773 +775 2 234.7751 299.1949 49.7358 0.1793 774 +776 2 234.0292 300.062 49.7361 0.1718 775 +777 2 233.1701 300.8102 49.7361 0.154 776 +778 2 232.1737 301.3616 49.7358 0.1403 777 +779 2 231.1772 301.9233 49.7358 0.1373 778 +780 2 230.2483 302.5891 49.7356 0.1373 779 +781 2 229.4303 303.3842 49.7353 0.1373 780 +782 2 228.7234 304.2823 49.735 0.1374 781 +783 2 227.9969 305.1654 49.7347 0.1374 782 +784 2 227.203 305.988 49.7342 0.1376 783 +785 2 226.2729 306.6458 49.7336 0.1378 784 +786 2 225.2342 307.1205 49.7328 0.1382 785 +787 2 224.224 307.6536 49.7316 0.1389 786 +788 2 223.3134 308.3412 49.7302 0.1404 787 +789 2 222.4302 309.0688 49.7283 0.1429 788 +790 2 221.5287 309.7735 49.7263 0.1482 789 +791 2 220.5952 310.4336 49.7235 0.1555 790 +792 2 219.6343 311.0536 49.7202 0.1807 791 +793 2 218.6619 311.6565 49.7165 0.1709 792 +794 2 217.6883 312.2559 49.7123 0.1535 793 +795 2 216.7319 312.884 49.7078 0.14 794 +796 2 215.7996 313.5487 49.7036 0.1374 795 +797 2 214.8752 314.2213 49.7008 0.1376 796 +798 2 213.944 314.886 49.702 0.1378 797 +799 2 213.022 315.5632 49.7084 0.1382 798 +800 2 212.1148 316.2588 49.7221 0.139 799 +801 2 211.0737 316.7118 49.7532 0.1404 800 +802 2 210.0155 317.1454 49.819 0.143 801 +803 2 209.3634 318.0423 49.9374 0.1487 802 +804 2 208.4002 318.6109 50.1925 0.1569 803 +805 2 207.2951 318.8683 50.5361 0.1866 804 +806 2 206.3215 319.4506 50.8987 0.1668 805 +807 2 205.3388 320.0191 51.2361 0.1499 806 +808 2 204.3607 320.6014 51.5178 0.1373 807 +809 2 203.4684 321.3118 51.7258 0.1373 808 +810 2 202.5715 322.02 51.8532 0.1373 809 +811 2 201.6449 322.6904 51.9201 0.1373 810 +812 2 200.7091 323.3482 51.9487 0.1373 811 +813 2 199.7733 324.006 51.954 0.1373 812 +814 2 198.794 324.5986 51.9459 0.1373 813 +815 2 197.7701 325.1076 51.9302 0.1373 814 +816 2 198.0481 325.4646 53.146 0.1223 815 +817 2 198.5984 326.1727 54.8212 0.1373 816 +818 2 199.2299 327.0216 55.8802 0.1373 817 +819 2 199.8843 327.923 56.5037 0.1373 818 +820 2 200.5455 328.8359 56.9814 0.1373 819 +821 2 201.2124 329.7534 57.3331 0.1373 820 +822 2 201.8817 330.6778 57.5565 0.1373 821 +823 2 202.5463 331.6067 57.6724 0.1373 822 +824 2 203.211 332.5379 57.738 0.1373 823 +825 2 203.8745 333.4691 57.7665 0.1373 824 +826 2 204.5392 334.4004 57.7654 0.1373 825 +827 2 205.2027 335.3327 57.7416 0.1373 826 +828 2 205.9497 336.1987 57.6934 0.1373 827 +829 2 206.738 337.027 57.6246 0.1373 828 +830 2 207.5296 337.8507 57.5355 0.1373 829 +831 2 208.3213 338.6755 57.4258 0.1373 830 +832 2 209.114 339.4992 57.2933 0.1373 831 +833 2 209.9046 340.324 57.136 0.1373 832 +834 2 210.6951 341.1465 56.9548 0.1373 833 +835 2 211.3574 342.072 56.7078 0.1373 834 +836 2 211.8665 343.0867 56.3744 0.1373 835 +837 2 212.3607 344.106 55.9798 0.1373 836 +838 2 212.8526 345.1231 55.552 0.1373 837 +839 2 213.5871 345.9822 55.1583 0.1373 838 +840 2 214.4428 346.727 54.801 0.1373 839 +841 2 215.5639 346.5268 54.5348 0.1373 840 +842 2 216.6873 346.3277 54.3315 0.1373 841 +843 2 217.8119 346.1275 54.1764 0.1373 842 +844 2 217.0214 345.3244 53.4934 0.1144 843 +845 2 216.9253 344.1861 53.4159 0.1356 844 +846 2 216.8544 343.0444 53.3837 0.1342 845 +847 2 216.7834 341.9027 53.3476 0.1313 846 +848 2 216.7125 340.761 53.31 0.1271 847 +849 2 216.6416 339.6193 53.2731 0.1144 848 +850 2 216.5706 338.4776 53.2 0.1144 849 +851 2 218.2272 346.5508 54.1394 0.1373 843 +852 2 219.0302 347.3653 54.1422 0.1373 851 +853 2 219.8013 348.2096 54.154 0.1373 852 +854 2 220.5666 349.0596 54.1285 0.1373 853 +855 2 221.3834 349.8604 54.0831 0.1373 854 +856 2 222.2243 350.6349 54.0319 0.1373 855 +857 2 223.0434 351.4334 53.9787 0.1373 856 +858 2 223.7081 352.3589 53.9479 0.1373 857 +859 2 224.2881 353.345 53.9521 0.1373 858 +860 2 224.8555 354.338 53.9818 0.1373 859 +861 2 225.4218 355.3321 54.0215 0.1373 860 +862 2 225.9389 356.3526 54.0316 0.1373 861 +863 2 226.4273 357.3867 53.9997 0.1373 862 +864 2 226.8529 358.4472 53.9339 0.1373 863 +865 2 226.8277 359.5706 53.8577 0.1373 864 +866 2 226.5909 360.6883 53.79 0.1373 865 +867 2 226.3312 361.8014 53.7393 0.1373 866 +868 2 226.0727 362.9157 53.7104 0.1373 867 +869 2 225.9972 364.0551 53.7228 0.1373 868 +870 2 226.0178 365.198 53.7748 0.1373 869 +871 2 226.0521 366.3408 53.8521 0.1373 870 +872 2 225.9492 367.4768 53.9941 0.1373 871 +873 2 226.0807 368.6117 54.0809 0.1373 872 +874 2 226.2306 369.7454 54.1167 0.1372 873 +875 2 226.3793 370.8791 54.1111 0.1372 874 +876 2 226.5463 372.0116 54.0772 0.1371 875 +877 2 227.4078 372.7404 54.0442 0.1368 876 +878 2 228.3058 373.4496 54.0176 0.1364 877 +879 2 229.1238 374.2482 54.0092 0.1356 878 +880 2 229.3342 375.3693 54.0448 0.1342 879 +881 2 229.5333 376.4961 54.1083 0.1314 880 +882 2 230.1225 377.4754 54.1248 0.1271 881 +883 2 230.7334 378.4421 54.0974 0.1144 882 +884 2 231.3431 379.4076 53.9249 0.1144 883 +885 2 196.7222 325.4806 51.9086 0.1373 815 +886 2 195.6011 325.7094 51.8798 0.1373 885 +887 2 194.472 325.8867 51.8423 0.1373 886 +888 2 193.3955 326.2734 51.7936 0.1373 887 +889 2 192.3716 326.7836 51.7314 0.1373 888 +890 2 191.3672 327.3293 51.6505 0.1373 889 +891 2 190.3753 327.8979 51.5474 0.1373 890 +892 2 189.4258 328.5339 51.4192 0.1373 891 +893 2 188.5083 329.2157 51.2641 0.1373 892 +894 2 187.6354 329.949 51.0678 0.1373 893 +895 2 186.8438 330.7693 50.8192 0.1373 894 +896 2 186.2604 331.7142 50.5442 0.1373 895 +897 2 185.6701 332.6878 50.26 0.1373 896 +898 2 184.9425 333.5629 49.9881 0.1373 897 +899 2 184.224 334.4473 49.7395 0.1373 898 +900 2 183.6406 335.4277 49.5197 0.1373 899 +901 2 183.0926 336.4287 49.3228 0.1373 900 +902 2 182.468 337.3828 49.1372 0.1373 901 +903 2 181.7908 338.3025 48.9485 0.1373 902 +904 2 181.1009 339.2097 48.7113 0.1373 903 +905 2 181.372 339.5358 48.1807 0.1286 904 +906 2 181.8491 340.4269 47.1626 0.1218 905 +907 2 181.9601 341.5481 46.6746 0.1373 906 +908 2 182.1385 342.6532 46.1367 0.1374 907 +909 2 182.4268 343.732 45.5302 0.1375 908 +910 2 182.802 344.7455 44.8036 0.1377 909 +911 2 183.6051 345.3187 43.8124 0.138 910 +912 2 184.6416 345.3507 42.6334 0.1388 911 +913 2 185.654 345.4972 41.428 0.1403 912 +914 2 186.5704 345.9307 40.1772 0.143 913 +915 2 187.2488 346.6938 39.0415 0.148 914 +916 2 187.8574 347.5758 38.0649 0.1556 915 +917 2 188.5964 348.3697 37.2246 0.1772 916 +918 2 189.4086 349.1168 36.4935 0.181 917 +919 2 189.9406 350.048 35.8215 0.1674 918 +920 2 190.238 351.1245 35.2229 0.1622 919 +921 2 190.4268 352.2284 34.6968 0.1708 920 +922 2 190.5835 353.3427 34.1995 0.2118 921 +923 2 190.945 354.3986 33.7131 0.216 922 +924 2 191.5662 355.331 33.245 0.1818 923 +925 2 192.3258 356.165 32.7958 0.1567 924 +926 2 192.9196 357.1019 32.3534 0.1528 925 +927 2 193.1655 358.1898 31.9088 0.1663 926 +928 2 193.2502 359.3155 31.444 0.1889 927 +929 2 193.4458 360.4161 30.9148 0.2423 928 +930 2 193.7925 361.4662 30.2162 0.2875 929 +931 2 194.2054 362.4741 29.3686 0.2486 930 +932 2 194.6379 363.4671 28.4656 0.183 931 +933 2 195.1595 364.3892 27.4271 0.1442 932 +934 2 195.8803 365.1133 26.2073 0.1384 933 +935 2 195.8928 365.7322 25.0373 0.1398 934 +936 2 194.8324 365.3799 24.473 0.1423 935 +937 2 193.7227 365.1419 24.2546 0.1477 936 +938 2 192.5844 365.0939 24.05 0.156 937 +939 2 191.4495 365.1431 23.7486 0.1788 938 +940 2 190.3193 365.1934 23.3288 0.1831 939 +941 2 189.213 365.3204 22.7247 0.172 940 +942 2 188.1766 365.6407 21.8788 0.1697 941 +943 2 187.1939 366.0926 20.977 0.2009 942 +944 2 186.2707 366.6783 20.1701 0.2105 943 +945 2 185.6598 367.5615 19.3981 0.2314 944 +946 2 185.4996 368.6357 18.6588 0.258 945 +947 2 185.0054 369.5498 17.6929 0.2078 946 +948 2 184.1211 370.1881 16.8636 0.1562 947 +949 2 183.1269 370.6812 16.1948 0.1271 948 +950 2 182.1683 370.1595 15.4535 0.1144 949 +951 2 181.1547 370.267 14.1823 0.1144 950 +952 2 180.4568 339.3676 48.529 0.1373 904 +953 2 179.3723 339.7131 48.26 0.1373 952 +954 2 178.3736 340.2531 48.0236 0.1373 953 +955 2 177.5053 340.9864 47.8274 0.1374 954 +956 2 176.7217 341.8169 47.6804 0.1374 955 +957 2 175.9689 342.6783 47.5835 0.1376 956 +958 2 175.1967 343.5215 47.5264 0.1378 957 +959 2 174.3811 344.3223 47.4967 0.1382 958 +960 2 173.4773 345.0201 47.483 0.139 959 +961 2 172.4763 345.5704 47.4776 0.1406 960 +962 2 171.4398 346.0543 47.476 0.1435 961 +963 2 170.4068 346.5462 47.4757 0.1486 962 +964 2 169.3658 347.0187 47.4754 0.159 963 +965 2 168.2961 347.4248 47.4754 0.1736 964 +966 2 167.2219 347.816 47.4754 0.2237 965 +967 2 166.1763 348.2782 47.4751 0.2049 966 +968 2 165.1616 348.8067 47.4748 0.1697 967 +969 2 164.1446 349.3318 47.4746 0.1425 968 +970 2 163.123 349.8466 47.4743 0.1373 969 +971 2 162.1368 350.4244 47.4737 0.1373 970 +972 2 161.177 351.0456 47.4732 0.1373 971 +973 2 160.1611 351.5684 47.4726 0.1373 972 +974 2 159.0835 351.9493 47.4715 0.1373 973 +975 2 158.0161 352.36 47.4698 0.1373 974 +976 2 156.998 352.8782 47.4678 0.1373 975 +977 2 155.9409 353.3107 47.4653 0.1373 976 +978 2 154.8244 353.5475 47.4617 0.1373 977 +979 2 153.701 353.7626 47.4569 0.1373 978 +980 2 152.5913 354.0417 47.4508 0.1373 979 +981 2 151.4953 354.3677 47.4421 0.1373 980 +982 2 150.5538 354.9969 47.4306 0.1373 981 +983 2 149.7485 355.8069 47.4155 0.1373 982 +984 2 148.7966 356.4304 47.3959 0.1373 983 +985 2 147.8071 357.0046 47.3704 0.1373 984 +986 2 147.0429 357.8421 47.3368 0.1373 985 +987 2 146.3439 358.747 47.2937 0.1373 986 +988 2 145.439 359.4356 47.2396 0.1373 987 +989 2 144.4666 360.0385 47.171 0.1373 988 +990 2 143.6452 360.8268 47.0834 0.1373 989 +991 2 143.0412 361.7934 46.9756 0.1373 990 +992 2 142.6934 362.8779 46.8502 0.1373 991 +993 2 142.5046 364.0036 46.7208 0.1373 992 +994 2 141.9132 364.9657 46.5013 0.1373 993 +995 2 141.5185 366.0331 46.2731 0.1373 994 +996 2 141.173 367.1233 46.1546 0.1373 995 +997 2 140.251 367.7994 46.1835 0.1373 996 +998 2 140.426 368.3566 46.6606 0.1373 997 +999 2 141.1547 369.194 47.3329 0.1373 998 +1000 2 141.7851 370.0954 48.062 0.1373 999 +1001 2 142.2404 371.1033 48.7707 0.1373 1000 +1002 2 142.5779 372.1638 49.3878 0.1373 1001 +1003 2 142.7598 373.2723 49.8694 0.1373 1002 +1004 2 142.7884 374.4083 50.1956 0.1374 1003 +1005 2 142.8021 375.5489 50.391 0.1375 1004 +1006 2 142.7861 376.6929 50.4734 0.1377 1005 +1007 2 142.73 377.8346 50.4613 0.138 1006 +1008 2 142.6682 378.9763 50.3731 0.1386 1007 +1009 2 142.6351 380.118 50.2267 0.1397 1008 +1010 2 142.6419 381.2597 50.0354 0.1418 1009 +1011 2 142.6602 382.3992 49.8036 0.1457 1010 +1012 2 142.6248 383.5363 49.5334 0.1531 1011 +1013 2 142.5241 384.67 49.2316 0.1663 1012 +1014 2 142.4612 385.8026 48.9048 0.1928 1013 +1015 2 142.5149 386.9363 48.5682 0.2316 1014 +1016 2 142.6133 388.0665 48.225 0.1971 1015 +1017 2 142.6156 389.2002 47.8512 0.1718 1016 +1018 2 142.5687 390.3305 47.46 0.1664 1017 +1019 2 142.3639 391.439 47.0394 0.1858 1018 +1020 2 142.0196 392.5167 46.62 0.1702 1019 +1021 2 141.6741 393.5989 46.2916 0.1608 1020 +1022 2 141.3 394.6743 46.0236 0.1649 1021 +1023 2 140.8767 395.7336 45.8097 0.1815 1022 +1024 2 140.402 396.7712 45.6434 0.1624 1023 +1025 2 139.8883 397.7917 45.5171 0.1466 1024 +1026 2 139.3987 398.8247 45.4065 0.1373 1025 +1027 2 139.0887 399.8863 45.32 0.1373 1026 +1028 2 139.2797 401.0132 45.3054 0.1373 1027 +1029 2 139.5177 402.132 45.3334 0.1373 1028 +1030 2 139.6996 403.2611 45.3656 0.1373 1029 +1031 2 139.9226 404.3823 45.3874 0.1373 1030 +1032 2 140.2555 405.4759 45.393 0.1373 1031 +1033 2 140.6628 406.5444 45.3732 0.1373 1032 +1034 2 141.0323 407.6255 45.3194 0.1373 1033 +1035 2 141.2691 408.742 45.232 0.1373 1034 +1036 2 141.3961 409.878 45.1161 0.1373 1035 +1037 2 141.5711 410.9957 44.9725 0.1373 1036 +1038 2 142.031 412.0356 44.7404 0.1373 1037 +1039 2 142.5939 413.0149 44.3022 0.1373 1038 +1040 2 143.2185 413.953 43.8514 0.1373 1039 +1041 2 143.8935 414.8659 43.507 0.1373 1040 +1042 2 144.5524 415.7937 43.2236 0.1373 1041 +1043 2 145.2205 416.7169 42.9878 0.1373 1042 +1044 2 145.9344 417.6058 42.7748 0.1373 1043 +1045 2 146.5739 418.5358 42.5379 0.1373 1044 +1046 2 146.9434 419.6032 42.2374 0.1373 1045 +1047 2 147.1664 420.7174 41.9227 0.1373 1046 +1048 2 147.3964 421.8328 41.6634 0.1373 1047 +1049 2 147.6424 422.946 41.447 0.1373 1048 +1050 2 148.1686 423.9012 41.23 0.1373 1049 +1051 2 149.0506 424.6196 40.9962 0.1373 1050 +1052 2 150.0139 425.2282 40.8111 0.1373 1051 +1053 2 150.9451 425.8803 40.6333 0.1373 1052 +1054 2 151.7905 426.6456 40.4264 0.1373 1053 +1055 2 152.6165 427.4339 40.252 0.1373 1054 +1056 2 153.3749 428.2839 40.1523 0.1373 1055 +1057 2 153.9607 429.2597 40.1302 0.1373 1056 +1058 2 154.3691 430.3248 40.0646 0.1373 1057 +1059 2 154.6848 431.423 39.9269 0.1373 1058 +1060 2 154.9617 432.5304 39.7639 0.1373 1059 +1061 2 155.2465 433.6355 39.5623 0.1373 1060 +1062 2 155.5977 434.7189 39.3288 0.1373 1061 +1063 2 156.108 435.7313 39.0617 0.1373 1062 +1064 2 156.8767 436.5481 38.7397 0.1373 1063 +1065 2 157.8491 437.127 38.4681 0.1373 1064 +1066 2 158.7723 437.7894 38.3121 0.1373 1065 +1067 2 159.4072 438.7217 38.1794 0.1373 1066 +1068 2 159.7985 439.7914 38.1083 0.1374 1067 +1069 2 160.168 440.8736 38.1114 0.1375 1068 +1070 2 160.6062 441.9295 38.1774 0.1376 1069 +1071 2 161.1507 442.9339 38.2231 0.1378 1070 +1072 2 161.7776 443.8903 38.197 0.1383 1071 +1073 2 162.4652 444.8044 38.1716 0.1392 1072 +1074 2 163.0955 445.7585 38.2088 0.1409 1073 +1075 2 163.592 446.7869 38.2866 0.1436 1074 +1076 2 163.6229 447.9069 38.5263 0.1522 1075 +1077 2 163.6206 449.0486 38.7089 0.1525 1076 +1078 2 163.8494 450.1686 38.7584 0.2288 1077 +1079 2 140.1274 368.0191 44.7163 0.1188 997 +1080 2 139.6344 368.8839 43.5848 0.1368 1079 +1081 2 139.0738 369.8655 43.1844 0.1406 1080 +1082 2 138.4686 370.8276 42.8714 0.1432 1081 +1083 2 137.4459 371.2852 42.5824 0.1491 1082 +1084 2 136.3648 371.6467 42.3237 0.1567 1083 +1085 2 135.4896 372.3686 42.068 0.1855 1084 +1086 2 135.1064 373.4348 41.8222 0.1675 1085 +1087 2 134.8364 374.5422 41.5685 0.1505 1086 +1088 2 134.3067 375.5489 41.298 0.1376 1087 +1089 2 133.6284 376.4618 41.0122 0.1373 1088 +1090 2 133.0117 377.4182 40.7075 0.1373 1089 +1091 2 132.4672 378.4146 40.3833 0.1373 1090 +1092 2 131.8483 379.3664 40.0512 0.1373 1091 +1093 2 131.1276 380.245 39.7244 0.1373 1092 +1094 2 130.2822 381.0046 39.4103 0.1373 1093 +1095 2 129.3017 381.5812 39.1087 0.1373 1094 +1096 2 128.1966 381.8466 38.8167 0.1372 1095 +1097 2 127.0858 382.0937 38.5193 0.1372 1096 +1098 2 126.0894 382.636 38.1755 0.1371 1097 +1099 2 125.1536 383.2743 37.7891 0.1368 1098 +1100 2 124.2796 383.9939 37.3873 0.1364 1099 +1101 2 123.5783 384.8816 36.9802 0.1356 1100 +1102 2 123.0372 385.8712 36.5487 0.1342 1101 +1103 2 121.9676 386.2419 36.1413 0.1313 1102 +1104 2 120.8464 386.418 35.791 0.1269 1103 +1105 2 119.7082 386.418 35.5032 0.1144 1104 +1106 2 118.5802 386.418 35.0414 0.1144 1105 +1107 2 187.3506 330.9546 49.7888 0.1213 895 +1108 2 188.3848 331.204 48.9513 0.131 1107 +1109 2 189.4224 331.6044 48.349 0.1365 1108 +1110 2 190.3639 332.181 47.644 0.1357 1109 +1111 2 191.2104 332.8788 46.8591 0.1344 1110 +1112 2 191.4976 333.8924 46.0183 0.1312 1111 +1113 2 191.0823 334.9335 45.467 0.1268 1112 +1114 2 190.6659 335.9836 45.0204 0.1144 1113 +1115 2 190.2541 337.0178 44.3758 0.1144 1114 +1116 2 241.5499 292.7874 49.285 0.1309 767 +1117 2 241.3051 291.6731 49.4525 0.1203 1116 +1118 2 241.0008 290.5714 49.4175 0.1373 1117 +1119 2 240.6267 289.4926 49.2778 0.1373 1118 +1120 2 240.24 288.4196 49.0507 0.1373 1119 +1121 2 239.8568 287.3488 48.7637 0.1373 1120 +1122 2 239.6154 286.254 48.4823 0.1373 1121 +1123 2 239.6405 285.1123 48.3227 0.1373 1122 +1124 2 239.4117 284.0358 48.2675 0.1373 1123 +1125 2 238.7345 283.1183 48.2334 0.1373 1124 +1126 2 237.9234 282.3152 48.2012 0.1373 1125 +1127 2 237.062 281.5624 48.1953 0.1373 1126 +1128 2 236.2177 280.7914 48.2387 0.1373 1127 +1129 2 235.3746 280.0192 48.3221 0.1373 1128 +1130 2 234.552 279.2264 48.4347 0.1373 1129 +1131 2 233.773 278.3901 48.5439 0.1373 1130 +1132 2 233.0362 277.5218 48.776 0.1374 1131 +1133 2 232.3167 276.6913 49.4715 0.1376 1132 +1134 2 231.2928 276.5506 50.3289 0.1378 1133 +1135 2 230.2003 276.5414 51.158 0.1382 1134 +1136 2 229.102 276.4911 51.933 0.139 1135 +1137 2 228.0186 276.2726 52.6277 0.1404 1136 +1138 2 226.9547 275.9248 53.2036 0.1429 1137 +1139 2 225.9594 275.4077 53.716 0.1483 1138 +1140 2 224.9779 274.854 54.1932 0.1558 1139 +1141 2 223.9815 274.322 54.6361 0.1821 1140 +1142 2 222.9381 273.8793 55.0077 0.1698 1141 +1143 2 221.9566 273.3073 55.2728 0.1525 1142 +1144 2 220.9865 272.7033 55.4375 0.1392 1143 +1145 2 219.9889 272.1462 55.4988 0.1373 1144 +1146 2 218.8884 271.8533 55.4028 0.1373 1145 +1147 2 217.7821 271.5822 55.1667 0.1373 1146 +1148 2 216.6519 271.4678 54.8481 0.1373 1147 +1149 2 215.5136 271.4632 54.5877 0.1373 1148 +1150 2 214.373 271.4723 54.3866 0.1373 1149 +1151 2 213.2313 271.5284 54.2388 0.1374 1150 +1152 2 212.0965 271.6668 54.1346 0.1374 1151 +1153 2 210.9616 271.8041 54.0624 0.1375 1152 +1154 2 209.8233 271.9094 53.9994 0.1376 1153 +1155 2 208.6839 272.0146 53.9476 0.1379 1154 +1156 2 207.5468 272.1416 53.9353 0.1385 1155 +1157 2 206.4085 272.2537 54.0106 0.1396 1156 +1158 2 205.2748 272.1542 54.2587 0.1417 1157 +1159 2 204.1491 272.0375 54.6543 0.1454 1158 +1160 2 203.0211 272.0432 55.1323 0.153 1159 +1161 2 201.9068 272.1965 55.6326 0.1641 1160 +1162 2 200.7914 272.3509 56.1355 0.1989 1161 +1163 2 199.6772 272.5202 56.6065 0.1874 1162 +1164 2 198.5709 272.7582 57.0262 0.2001 1163 +1165 2 197.5596 273.257 57.4622 0.1682 1164 +1166 2 196.7291 274.0189 57.9471 0.1526 1165 +1167 2 195.9134 274.7991 58.3979 0.1442 1166 +1168 2 195.1298 275.6239 58.7054 0.1502 1167 +1169 2 194.345 276.451 58.914 0.1602 1168 +1170 2 193.5602 277.2816 59.0374 0.1844 1169 +1171 2 192.7468 278.0801 59.1956 0.1633 1170 +1172 2 191.8339 278.7436 59.6358 0.145 1171 +1173 2 190.8318 279.2584 60.0468 0.1381 1172 +1174 2 189.7633 279.6519 60.3025 0.1389 1173 +1175 2 188.6936 280.0501 60.4145 0.1403 1174 +1176 2 187.6549 280.5282 60.4352 0.1429 1175 +1177 2 186.6402 281.0556 60.4232 0.1476 1176 +1178 2 185.6254 281.5819 60.4187 0.1569 1177 +1179 2 184.5867 282.0601 60.4635 0.1713 1178 +1180 2 183.4976 282.3781 60.6217 0.2147 1179 +1181 2 182.3811 282.3289 60.9717 0.2158 1180 +1182 2 181.2588 282.3278 61.4113 0.1839 1181 +1183 2 180.132 282.4136 61.8293 0.1664 1182 +1184 2 178.9994 282.433 62.2051 0.1741 1183 +1185 2 177.8657 282.3804 62.5545 0.2219 1184 +1186 2 176.7331 282.2854 62.8821 0.2144 1185 +1187 2 175.5994 282.2099 63.2005 0.1836 1186 +1188 2 174.4623 282.1722 63.4936 0.1661 1187 +1189 2 173.3229 282.1562 63.7339 0.1742 1188 +1190 2 172.1812 282.155 63.9159 0.2226 1189 +1191 2 171.0383 282.1482 64.0441 0.2131 1190 +1192 2 169.8966 282.091 64.1376 0.1826 1191 +1193 2 168.7743 281.8885 64.2368 0.162 1192 +1194 2 167.6704 281.5956 64.3418 0.1786 1193 +1195 2 166.706 281.0144 64.5448 0.1712 1194 +1196 2 166.0196 280.1233 64.8808 0.1526 1195 +1197 2 165.1684 279.3774 65.1907 0.1391 1196 +1198 2 164.0954 279.0308 65.4326 0.1376 1197 +1199 2 162.9651 278.8786 65.6102 0.1378 1198 +1200 2 161.8222 278.8477 65.7168 0.1383 1199 +1201 2 160.6794 278.8054 65.7602 0.139 1200 +1202 2 159.5365 278.7619 65.7636 0.1405 1201 +1203 2 158.42 278.9907 65.7476 0.1431 1202 +1204 2 157.5242 279.6794 65.7563 0.1488 1203 +1205 2 156.7555 280.526 65.7664 0.1563 1204 +1206 2 155.9993 281.384 65.7264 0.1837 1205 +1207 2 155.1642 282.163 65.5998 0.1688 1206 +1208 2 154.3039 282.9123 65.4032 0.1516 1207 +1209 2 153.4241 283.6296 65.0527 0.1379 1208 +1210 2 152.5055 284.2851 64.61 0.1373 1209 +1211 2 151.6738 285.0551 64.2211 0.1373 1210 +1212 2 150.9416 285.9268 63.9514 0.1373 1211 +1213 2 150.2747 286.8534 63.7795 0.1373 1212 +1214 2 149.5837 287.764 63.6465 0.1372 1213 +1215 2 148.8733 288.6598 63.5454 0.1372 1214 +1216 2 148.1594 289.5533 63.4981 0.1371 1215 +1217 2 147.4444 290.4456 63.4536 0.1368 1216 +1218 2 146.7889 291.3837 63.4203 0.1364 1217 +1219 2 146.1288 292.3172 63.4071 0.1356 1218 +1220 2 145.3155 293.1214 63.4164 0.1342 1219 +1221 2 144.4918 293.9165 63.3923 0.1313 1220 +1222 2 143.6692 294.7104 63.3349 0.1271 1221 +1223 2 142.8501 295.5089 63.2447 0.1144 1222 +1224 2 142.0562 296.3177 62.8687 0.1144 1223 +1225 2 258.1733 285.4131 46.5293 0.2281 750 +1226 2 258.5177 286.4988 46.8068 0.1995 1225 +1227 2 258.8655 287.5879 46.9302 0.1994 1226 +1228 2 259.1572 288.6918 47.056 0.1669 1227 +1229 2 259.3654 289.8164 47.1738 0.15 1228 +1230 2 259.5976 290.9352 47.2755 0.1373 1229 +1231 2 259.9568 292.0209 47.355 0.1373 1230 +1232 2 260.3813 293.0836 47.4082 0.1373 1231 +1233 2 260.6856 294.1865 47.4412 0.1373 1232 +1234 2 260.8766 295.3144 47.46 0.1373 1233 +1235 2 261.1718 296.4196 47.4698 0.1373 1234 +1236 2 261.6236 297.4697 47.474 0.1373 1235 +1237 2 262.0618 298.5268 47.4754 0.1373 1236 +1238 2 262.4267 299.6113 47.476 0.1373 1237 +1239 2 262.7413 300.7107 47.476 0.1373 1238 +1240 2 262.993 301.8272 47.476 0.1374 1239 +1241 2 263.2081 302.9506 47.4762 0.1374 1240 +1242 2 263.4701 304.0638 47.4765 0.1376 1241 +1243 2 263.7847 305.1643 47.4768 0.1379 1242 +1244 2 264.1393 306.2522 47.4771 0.1383 1243 +1245 2 264.5523 307.3184 47.4779 0.1391 1244 +1246 2 264.9298 308.3984 47.4788 0.1407 1245 +1247 2 265.225 309.5035 47.4799 0.1435 1246 +1248 2 265.4858 310.6177 47.4816 0.1494 1247 +1249 2 265.7478 311.7308 47.4838 0.1571 1248 +1250 2 266.0109 312.8451 47.4872 0.1867 1249 +1251 2 266.2397 313.9651 47.4919 0.1669 1250 +1252 2 266.4273 315.0942 47.4986 0.15 1251 +1253 2 266.655 316.2153 47.5079 0.1373 1252 +1254 2 266.9593 317.3181 47.521 0.1373 1253 +1255 2 267.2693 318.4187 47.5398 0.1373 1254 +1256 2 267.4718 319.5455 47.5653 0.1373 1255 +1257 2 267.5908 320.6826 47.6014 0.1373 1256 +1258 2 267.7612 321.8141 47.6546 0.1373 1257 +1259 2 268.0072 322.9306 47.7296 0.1373 1258 +1260 2 268.2714 323.7589 47.8103 0.1373 1259 +1261 2 268.7748 324.7816 47.9279 0.1373 1260 +1262 2 269.3628 325.7586 48.1365 0.1373 1261 +1263 2 269.9051 326.7527 48.5321 0.1373 1262 +1264 2 270.4359 327.7549 48.8961 0.1373 1263 +1265 2 270.7219 328.8542 49.1985 0.1373 1264 +1266 2 270.9232 329.9799 49.3119 0.1373 1265 +1267 2 271.152 331.0999 49.2167 0.1373 1266 +1268 2 271.4026 332.2096 48.9236 0.1373 1267 +1269 2 271.1211 332.65 48.3736 0.1373 1268 +1270 2 270.7562 333.6968 47.7036 0.1373 1269 +1271 2 270.4965 334.7767 47.038 0.1373 1270 +1272 2 269.9863 335.7594 46.3711 0.1373 1271 +1273 2 269.4234 336.717 45.6963 0.1373 1272 +1274 2 268.9041 337.6745 44.8426 0.1373 1273 +1275 2 268.443 338.5176 43.0086 0.1292 1274 +1276 2 267.9431 339.4202 41.879 0.1373 1275 +1277 2 267.3391 340.3183 40.9816 0.1373 1276 +1278 2 266.5394 341.0356 40.0775 0.1373 1277 +1279 2 265.6734 341.6911 39.1975 0.1373 1278 +1280 2 264.9241 342.4736 38.3393 0.1373 1279 +1281 2 264.3395 343.3922 37.5049 0.1373 1280 +1282 2 263.7229 344.3017 36.7399 0.1373 1281 +1283 2 263.0536 345.1906 36.083 0.1374 1282 +1284 2 262.397 346.1 35.5421 0.1374 1283 +1285 2 261.7941 347.0541 35.1042 0.1376 1284 +1286 2 261.2095 348.0277 34.743 0.1378 1285 +1287 2 260.7279 349.055 34.4229 0.1382 1286 +1288 2 260.4694 350.1555 34.1068 0.1389 1287 +1289 2 260.2703 351.2766 33.826 0.1404 1288 +1290 2 260.0506 352.3943 33.5807 0.143 1289 +1291 2 259.9294 353.5269 33.3497 0.1483 1290 +1292 2 259.9454 354.6652 33.112 0.1558 1291 +1293 2 260.1525 355.7817 32.8471 0.1809 1292 +1294 2 260.5277 356.8525 32.5413 0.173 1293 +1295 2 260.9201 357.9164 32.1798 0.1568 1294 +1296 2 261.0905 359.0295 31.7621 0.1456 1295 +1297 2 260.991 360.1472 31.3001 0.1482 1296 +1298 2 260.6261 361.2066 30.7938 0.1556 1297 +1299 2 260.1284 362.211 30.2462 0.1812 1298 +1300 2 259.8607 363.2932 29.6948 0.1704 1299 +1301 2 259.704 364.4052 29.1606 0.153 1300 +1302 2 259.593 365.5229 28.6404 0.1396 1301 +1303 2 259.6056 366.6463 28.1305 0.1373 1302 +1304 2 259.6674 367.7708 27.6311 0.1373 1303 +1305 2 259.5736 368.8897 27.1323 0.1373 1304 +1306 2 259.1274 369.9113 26.6252 0.1373 1305 +1307 2 258.5737 370.8905 26.1221 0.1373 1306 +1308 2 258.012 371.8664 25.6305 0.1373 1307 +1309 2 257.448 372.8433 25.1586 0.1373 1308 +1310 2 256.6942 373.6842 24.7634 0.1373 1309 +1311 2 255.8259 374.4163 24.4626 0.1373 1310 +1312 2 254.9358 375.129 24.2344 0.1373 1311 +1313 2 254.0309 375.8257 24.0479 0.1373 1312 +1314 2 253.0368 376.3806 23.853 0.1373 1313 +1315 2 252.0186 376.8931 23.6278 0.1373 1314 +1316 2 251.0005 377.4033 23.36 0.1374 1315 +1317 2 249.9926 377.9273 23.0255 0.1374 1316 +1318 2 249.0008 378.4718 22.6062 0.1376 1317 +1319 2 248.0158 379.0186 22.1251 0.1378 1318 +1320 2 247.0331 379.5655 21.6119 0.1383 1319 +1321 2 246.0515 380.1123 21.0898 0.1391 1320 +1322 2 245.0677 380.658 20.579 0.1407 1321 +1323 2 244.5609 381.6476 20.1357 0.1436 1322 +1324 2 244.252 382.7401 19.7899 0.1495 1323 +1325 2 243.9603 383.8406 19.5197 0.1574 1324 +1326 2 243.5633 384.9091 19.3197 0.1865 1325 +1327 2 242.9845 385.8941 19.1915 0.1715 1326 +1328 2 242.3827 386.8653 19.1255 0.1572 1327 +1329 2 241.7798 387.8377 19.1115 0.1498 1328 +1330 2 241.1769 388.8101 19.1454 0.1566 1329 +1331 2 240.566 389.7757 19.2888 0.1851 1330 +1332 2 239.9563 390.7366 19.5616 0.1676 1331 +1333 2 239.3454 391.693 19.9256 0.1502 1332 +1334 2 238.7368 392.6471 20.3393 0.1373 1333 +1335 2 237.9291 393.4399 20.7282 0.1373 1334 +1336 2 236.9075 393.9421 21.0216 0.1373 1335 +1337 2 235.8814 394.4398 21.225 0.1373 1336 +1338 2 234.8529 394.9374 21.3556 0.1373 1337 +1339 2 233.8233 395.4362 21.4359 0.1373 1338 +1340 2 232.7937 395.9338 21.4886 0.1373 1339 +1341 2 231.7641 396.4326 21.5326 0.1373 1340 +1342 2 230.7345 396.9314 21.5799 0.1374 1341 +1343 2 229.6683 397.3432 21.6322 0.1375 1342 +1344 2 228.5243 397.3421 21.6966 0.1376 1343 +1345 2 227.3803 397.3421 21.77 0.1379 1344 +1346 2 226.2374 397.3421 21.8495 0.1384 1345 +1347 2 225.0934 397.3409 21.9346 0.1393 1346 +1348 2 223.9506 397.3409 22.0212 0.1413 1347 +1349 2 222.8066 397.3398 22.1054 0.144 1348 +1350 2 221.6626 397.3398 22.1847 0.1525 1349 +1351 2 220.5197 397.3387 22.2578 0.1525 1350 +1352 2 219.3769 397.3387 22.4 0.2288 1351 +1353 2 269.3022 338.2739 43.2583 0.1373 1274 +1354 2 269.595 339.3367 42.506 0.1373 1353 +1355 2 269.984 340.3858 41.9191 0.1373 1354 +1356 2 270.4141 341.4279 41.4546 0.1373 1355 +1357 2 271.0411 342.3717 41.0788 0.1373 1356 +1358 2 271.7297 343.2755 40.7355 0.1373 1357 +1359 2 272.3475 344.2285 40.4051 0.1373 1358 +1360 2 273.1586 344.4778 40.5118 0.1178 1359 +1361 2 274.2511 344.8119 40.4247 0.1345 1360 +1362 2 275.3734 345.0258 40.3421 0.1373 1361 +1363 2 276.4991 345.2226 40.1948 0.1373 1362 +1364 2 277.6122 345.4697 39.996 0.1373 1363 +1365 2 278.7276 345.7065 39.7547 0.1373 1364 +1366 2 279.8647 345.7431 39.5164 0.1373 1365 +1367 2 281.0042 345.6733 39.3159 0.1373 1366 +1368 2 282.1447 345.6504 39.1476 0.1373 1367 +1369 2 283.2853 345.7122 38.9936 0.1373 1368 +1370 2 284.3927 345.9811 38.792 0.1372 1369 +1371 2 285.4806 346.298 38.4168 0.1372 1370 +1372 2 286.6109 346.4329 38.1408 0.1371 1371 +1373 2 287.7354 346.6274 37.9352 0.1368 1372 +1374 2 288.8543 346.8551 37.7922 0.1364 1373 +1375 2 289.9582 347.1548 37.7034 0.1356 1374 +1376 2 291.0153 347.5918 37.6681 0.1342 1375 +1377 2 291.9511 348.2496 37.6701 0.1313 1376 +1378 2 292.8446 348.9635 37.6684 0.1271 1377 +1379 2 293.6785 349.7471 37.665 0.1144 1378 +1380 2 294.4393 350.6017 37.6594 0.1144 1379 +1381 2 272.3807 344.3165 40.3525 0.1373 1359 +1382 2 272.7674 345.3759 39.9034 0.1373 1381 +1383 2 273.122 346.457 39.62 0.1373 1382 +1384 2 273.5521 347.5106 39.4052 0.1373 1383 +1385 2 274.099 348.5127 39.2468 0.1373 1384 +1386 2 274.7499 349.4485 39.1149 0.1373 1385 +1387 2 275.5564 350.2482 38.9539 0.1373 1386 +1388 2 276.3309 351.0799 38.789 0.1373 1387 +1389 2 277.0127 351.9962 38.6467 0.1373 1388 +1390 2 277.6682 352.932 38.507 0.1373 1389 +1391 2 278.2894 353.8895 38.3194 0.1373 1390 +1392 2 278.6601 354.95 38.1111 0.1374 1391 +1393 2 278.8889 356.0677 37.9081 0.1375 1392 +1394 2 279.2573 357.1408 37.6597 0.1376 1393 +1395 2 279.7526 358.1635 37.3604 0.1378 1394 +1396 2 280.2892 359.1634 37.009 0.1383 1395 +1397 2 280.8566 360.1392 36.5624 0.1392 1396 +1398 2 281.5876 360.9812 36.0338 0.1409 1397 +1399 2 282.417 361.7328 35.4648 0.1439 1398 +1400 2 283.2521 362.4764 34.8706 0.1495 1399 +1401 2 284.0895 363.2177 34.2784 0.1605 1400 +1402 2 284.9464 363.943 33.7389 0.177 1401 +1403 2 285.7071 364.7621 33.2063 0.2267 1402 +1404 2 286.2162 365.7448 32.6155 0.2257 1403 +1405 2 286.5709 366.811 32.0984 0.2133 1404 +1406 2 286.8843 367.8921 31.5997 0.1788 1405 +1407 2 287.5341 368.7753 31.036 0.1533 1406 +1408 2 288.3166 369.5864 30.5651 0.1397 1407 +1409 2 289.1082 370.3986 30.2016 0.1373 1408 +1410 2 289.853 371.2589 29.9275 0.1373 1409 +1411 2 290.5394 372.1707 29.7332 0.1374 1410 +1412 2 291.3368 372.9863 29.6593 0.1374 1411 +1413 2 292.2302 373.699 29.6145 0.1375 1412 +1414 2 293.1717 374.3465 29.5868 0.1376 1413 +1415 2 294.0766 375.0467 29.612 0.1379 1414 +1416 2 294.8923 375.8463 29.701 0.1384 1415 +1417 2 295.549 376.7764 29.8665 0.1395 1416 +1418 2 296.0352 377.8014 30.191 0.1415 1417 +1419 2 296.5168 378.8242 30.625 0.1452 1418 +1420 2 297.0602 379.8149 31.0531 0.1526 1419 +1421 2 297.6036 380.809 31.4373 0.1632 1420 +1422 2 297.9456 381.8901 31.78 0.1989 1421 +1423 2 297.9548 383.0284 32.0415 0.1885 1422 +1424 2 297.456 382.851 32.0418 0.2016 1423 +1425 2 296.3841 382.4701 31.7632 0.1721 1424 +1426 2 295.3144 382.1132 31.3012 0.1613 1425 +1427 2 294.2219 381.9702 30.7432 0.1624 1426 +1428 2 293.1717 382.342 30.1977 0.1856 1427 +1429 2 292.1959 382.9037 29.7494 0.2237 1428 +1430 2 291.1308 383.2869 29.4174 0.2358 1429 +1431 2 290.0051 383.4219 29.2054 0.2263 1430 +1432 2 288.8875 383.256 29.0254 0.2359 1431 +1433 2 287.851 382.7858 28.7854 0.1879 1432 +1434 2 286.8603 382.2287 28.4544 0.1563 1433 +1435 2 285.8799 381.6681 28.0185 0.138 1434 +1436 2 284.9224 381.087 27.4486 0.1387 1435 +1437 2 283.982 380.499 26.7614 0.14 1436 +1438 2 283.0496 379.9155 25.9976 0.1422 1437 +1439 2 282.1218 379.3355 25.1814 0.1465 1438 +1440 2 281.1986 378.7578 24.3239 0.154 1439 +1441 2 280.2777 378.1824 23.436 0.1698 1440 +1442 2 279.3637 377.6069 22.5212 0.1893 1441 +1443 2 278.5377 376.9583 21.4924 0.1764 1442 +1444 2 277.8284 376.265 20.1813 0.1786 1443 +1445 2 276.8743 376.0465 18.9059 0.1765 1444 +1446 2 275.8333 376.1358 17.7726 0.1591 1445 +1447 2 274.7808 376.2753 16.7358 0.1467 1446 +1448 2 273.7363 376.559 15.8636 0.1467 1447 +1449 2 272.9241 377.274 15.3061 0.1557 1448 +1450 2 272.2297 378.1778 15.119 0.1707 1449 +1451 2 271.168 378.4524 14.9812 0.214 1450 +1452 2 270.0984 378.076 14.7976 0.2219 1451 +1453 2 269.2324 377.3358 14.6049 0.2567 1452 +1454 2 268.4842 376.4744 14.4044 0.3117 1453 +1455 2 268.0781 375.4082 14.2131 0.2334 1454 +1456 2 267.9545 374.2733 14.0454 0.1653 1455 +1457 2 268.7359 373.4394 13.9712 0.1145 1456 +1458 2 269.5195 372.6054 14.0 0.1144 1457 +1459 2 298.7853 383.3224 33.9791 0.224 1423 +1460 2 299.7635 383.7765 34.7592 0.2075 1459 +1461 2 300.7496 384.3428 35.0451 0.1917 1460 +1462 2 301.746 384.8919 35.3088 0.2293 1461 +1463 2 302.763 385.3999 35.6194 0.2024 1462 +1464 2 303.7835 385.8987 35.9674 0.1677 1463 +1465 2 304.8016 386.3974 36.3401 0.1411 1464 +1466 2 305.7168 387.0598 36.7335 0.1377 1465 +1467 2 306.5817 387.7885 37.1476 0.1381 1466 +1468 2 307.4397 388.5253 37.5738 0.1388 1467 +1469 2 308.2966 389.2632 38.003 0.1402 1468 +1470 2 309.1511 390.0022 38.4387 0.1425 1469 +1471 2 310.0057 390.7401 38.8867 0.147 1470 +1472 2 310.8603 391.4768 39.3509 0.1551 1471 +1473 2 311.7137 392.2135 39.83 0.171 1472 +1474 2 312.5763 392.924 40.4275 0.1975 1473 +1475 2 313.4949 393.5394 41.1365 0.2712 1474 +1476 2 314.5073 393.9616 41.9216 0.2933 1475 +1477 2 315.6033 394.1709 42.541 0.2193 1476 +1478 2 316.7187 394.3334 43.0091 0.1595 1477 +1479 2 317.8375 394.5198 43.3835 0.1313 1478 +1480 2 318.9541 394.7326 43.6988 0.127 1479 +1481 2 320.0729 394.9443 43.9723 0.1144 1480 +1482 2 321.1746 395.1536 44.52 0.1144 1481 +1483 2 271.5101 333.0481 49.7053 0.1149 1268 +1484 2 271.5799 334.1761 50.1351 0.1367 1483 +1485 2 271.4026 335.303 50.3294 0.1373 1484 +1486 2 271.2275 336.4298 50.5604 0.1373 1485 +1487 2 271.0662 337.5578 50.8071 0.1373 1486 +1488 2 270.9278 338.6892 51.037 0.1373 1487 +1489 2 270.7356 339.8138 51.2537 0.1373 1488 +1490 2 270.4588 339.8458 51.4184 0.1312 1489 +1491 2 269.3479 339.9774 51.9876 0.1214 1490 +1492 2 268.2188 340.1089 52.2976 0.1373 1491 +1493 2 267.0851 340.2416 52.4678 0.1373 1492 +1494 2 265.9514 340.3732 52.6767 0.1373 1493 +1495 2 264.8166 340.4636 52.9231 0.1373 1494 +1496 2 263.6794 340.4807 53.2112 0.1373 1495 +1497 2 262.572 340.6466 53.5615 0.1373 1496 +1498 2 261.5562 341.1339 53.9955 0.1373 1497 +1499 2 260.6066 341.7368 54.4986 0.1373 1498 +1500 2 259.7761 342.4575 55.0782 0.1373 1499 +1501 2 259.2647 343.4345 55.7357 0.1373 1500 +1502 2 258.8998 344.4824 56.4141 0.1373 1501 +1503 2 258.4948 345.5155 57.0945 0.1373 1502 +1504 2 258.0567 346.5359 57.759 0.1373 1503 +1505 2 257.6094 347.5552 58.4105 0.1373 1504 +1506 2 257.1609 348.5745 59.0537 0.1373 1505 +1507 2 256.7216 349.5972 59.6982 0.1373 1506 +1508 2 256.3235 350.6337 60.3702 0.1373 1507 +1509 2 255.9723 351.6816 61.0868 0.1373 1508 +1510 2 255.5868 352.7135 61.8304 0.1373 1509 +1511 2 255.1017 353.7019 62.5814 0.1373 1510 +1512 2 254.5022 354.6228 63.3284 0.1373 1511 +1513 2 253.7449 355.4191 64.0629 0.1373 1512 +1514 2 252.9453 356.1833 64.7517 0.1373 1513 +1515 2 252.1353 356.96 65.2658 0.1373 1514 +1516 2 251.2373 357.6533 65.5914 0.1373 1515 +1517 2 250.3747 358.3958 65.7496 0.1373 1516 +1518 2 249.4995 359.1291 65.7941 0.1373 1517 +1519 2 248.5248 359.7171 65.9548 0.1373 1518 +1520 2 247.4758 360.1644 66.1175 0.1373 1519 +1521 2 246.3512 360.2731 66.4023 0.1373 1520 +1522 2 245.2233 360.2788 66.8522 0.1373 1521 +1523 2 244.1559 360.6277 67.3336 0.1372 1522 +1524 2 243.0554 360.829 67.9031 0.1372 1523 +1525 2 241.9457 360.8142 68.5784 0.137 1524 +1526 2 240.8292 360.8817 69.1625 0.1368 1525 +1527 2 239.7069 360.9503 69.6699 0.1364 1526 +1528 2 238.5789 361.0201 70.1064 0.1356 1527 +1529 2 237.4475 361.091 70.4805 0.1342 1528 +1530 2 236.3412 361.3621 70.7577 0.1313 1529 +1531 2 235.2968 361.8232 70.9299 0.1271 1530 +1532 2 234.2512 362.2842 71.0366 0.1144 1531 +1533 2 233.2044 362.7452 71.12 0.1144 1532 +1534 2 270.8409 340.1764 51.3646 0.1373 1489 +1535 2 271.1909 341.2655 51.3834 0.1373 1534 +1536 2 271.5787 342.342 51.3904 0.1373 1535 +1537 2 271.8682 343.4482 51.4122 0.1373 1536 +1538 2 272.0455 344.1953 51.415 0.1373 1537 +1539 2 272.5397 345.2237 51.543 0.1373 1538 +1540 2 272.7662 346.3391 51.8034 0.1373 1539 +1541 2 272.7605 347.4774 52.0635 0.1373 1540 +1542 2 272.6884 348.6157 52.3026 0.1373 1541 +1543 2 272.6106 349.7528 52.5342 0.1373 1542 +1544 2 272.6209 350.8911 52.7719 0.1373 1543 +1545 2 272.7971 352.0191 52.9729 0.1373 1544 +1546 2 273.0373 353.1322 53.2314 0.1373 1545 +1547 2 273.265 354.2476 53.4957 0.1373 1546 +1548 2 273.4766 355.3687 53.7132 0.1373 1547 +1549 2 273.6986 356.4887 53.8888 0.1373 1548 +1550 2 273.9308 357.6064 54.0347 0.1374 1549 +1551 2 274.0578 358.7424 54.1649 0.1374 1550 +1552 2 274.1379 359.883 54.2912 0.1376 1551 +1553 2 274.2179 361.0212 54.4608 0.1379 1552 +1554 2 274.3026 362.1584 54.6882 0.1384 1553 +1555 2 274.4021 363.2921 54.9646 0.1394 1554 +1556 2 274.5806 364.4132 55.2787 0.1413 1555 +1557 2 274.9558 365.4851 55.6004 0.1448 1556 +1558 2 275.3722 366.5376 55.8975 0.1511 1557 +1559 2 275.4798 367.6724 56.1341 0.1633 1558 +1560 2 275.5381 368.8119 56.3195 0.1841 1559 +1561 2 275.529 369.9524 56.4766 0.2314 1560 +1562 2 275.3322 371.077 56.6278 0.1926 1561 +1563 2 274.9776 372.1306 56.973 0.1477 1562 +1564 2 275.1549 373.2128 57.447 0.1373 1563 +1565 2 275.3894 374.3237 57.8063 0.1373 1564 +1566 2 275.6239 375.4345 58.1456 0.1373 1565 +1567 2 275.8596 376.5465 58.4489 0.1373 1566 +1568 2 276.0952 377.6619 58.7037 0.1373 1567 +1569 2 276.3172 378.7807 58.8963 0.1373 1568 +1570 2 276.2531 379.9201 58.9462 0.1372 1569 +1571 2 276.1685 381.0607 58.8843 0.1372 1570 +1572 2 276.1582 382.2035 58.7908 0.1371 1571 +1573 2 276.1994 383.3464 58.7174 0.1368 1572 +1574 2 276.2428 384.4904 58.676 0.1364 1573 +1575 2 276.1364 385.6287 58.6866 0.1356 1574 +1576 2 275.5244 386.5942 58.7728 0.1342 1575 +1577 2 274.9112 387.5586 58.905 0.1313 1576 +1578 2 274.298 388.5218 59.0573 0.1271 1577 +1579 2 273.686 389.4862 59.2136 0.1144 1578 +1580 2 273.0762 390.4449 59.542 0.1144 1579 +1581 2 272.288 343.9997 51.1185 0.2118 1537 +1582 2 273.2112 344.6563 50.9933 0.1865 1581 +1583 2 274.1745 345.2729 50.9569 0.1541 1582 +1584 2 275.1377 345.8907 50.9272 0.139 1583 +1585 2 276.101 346.5084 50.9051 0.1373 1584 +1586 2 276.9956 347.2189 50.9236 0.1373 1585 +1587 2 277.8376 347.9922 50.997 0.1373 1586 +1588 2 278.6738 348.7713 51.1171 0.1373 1587 +1589 2 279.5089 349.5515 51.2708 0.1373 1588 +1590 2 280.3441 350.3294 51.4455 0.1373 1589 +1591 2 281.2341 351.0421 51.6664 0.1373 1590 +1592 2 281.972 351.9127 51.8487 0.1373 1591 +1593 2 282.7076 352.7867 52.0139 0.1373 1592 +1594 2 283.4432 353.6596 52.1676 0.1373 1593 +1595 2 284.1799 354.5336 52.3135 0.1373 1594 +1596 2 284.9143 355.4076 52.4546 0.1373 1595 +1597 2 285.6476 356.2839 52.621 0.1373 1596 +1598 2 286.3798 357.1591 52.8097 0.1373 1597 +1599 2 287.1257 358.0228 52.9976 0.1373 1598 +1600 2 287.9059 358.8579 53.1521 0.1373 1599 +1601 2 288.6861 359.693 53.2778 0.1373 1600 +1602 2 289.4663 360.5282 53.3786 0.1373 1601 +1603 2 290.2465 361.3644 53.4587 0.1374 1602 +1604 2 291.0279 362.2007 53.5265 0.1375 1603 +1605 2 291.8081 363.0358 53.5903 0.1376 1604 +1606 2 292.5883 363.8721 53.6558 0.1379 1605 +1607 2 293.3696 364.7072 53.7228 0.1384 1606 +1608 2 294.1499 365.5435 53.7933 0.1393 1607 +1609 2 294.7825 366.4964 53.8714 0.1413 1608 +1610 2 295.4014 367.4574 53.9538 0.144 1609 +1611 2 296.0203 368.4195 54.0364 0.1525 1610 +1612 2 296.6381 369.3816 54.1164 0.1526 1611 +1613 2 297.257 370.3414 54.2788 0.2288 1612 +1614 2 267.3048 323.315 47.462 0.1186 1259 +1615 2 266.3026 323.8618 47.3172 0.1337 1614 +1616 2 265.2993 324.4109 47.2648 0.1373 1615 +1617 2 264.2949 324.9589 47.2158 0.1373 1616 +1618 2 263.2916 325.5069 47.1618 0.1373 1617 +1619 2 262.2883 326.056 47.1075 0.1373 1618 +1620 2 261.2839 326.604 47.0571 0.1373 1619 +1621 2 260.2806 327.1531 47.0134 0.1373 1620 +1622 2 259.2762 327.7022 46.9762 0.1373 1621 +1623 2 258.2729 328.2502 46.9456 0.1373 1622 +1624 2 257.2593 328.7799 46.9868 0.1373 1623 +1625 2 256.2835 329.377 47.0246 0.1373 1624 +1626 2 255.3191 329.9914 47.04 0.1373 1625 +1627 2 254.357 330.6103 47.0361 0.1373 1626 +1628 2 253.4006 331.2383 47.0182 0.1373 1627 +1629 2 252.4453 331.8687 46.9907 0.1373 1628 +1630 2 251.4809 332.4842 46.9591 0.1373 1629 +1631 2 250.369 332.6889 46.956 0.1373 1630 +1632 2 249.2307 332.7999 46.9848 0.1373 1631 +1633 2 248.0924 332.9051 47.0392 0.1373 1632 +1634 2 246.9553 333.0333 47.1148 0.1373 1633 +1635 2 246.0652 333.7128 47.2156 0.1373 1634 +1636 2 245.2347 334.4976 47.334 0.1373 1635 +1637 2 244.4087 335.2881 47.4622 0.1373 1636 +1638 2 243.553 336.0454 47.5978 0.1373 1637 +1639 2 242.6252 336.7101 47.7372 0.1373 1638 +1640 2 241.6826 337.3564 47.8713 0.1373 1639 +1641 2 240.7674 338.0394 47.997 0.1373 1640 +1642 2 239.8957 338.7796 48.1138 0.1373 1641 +1643 2 239.0331 339.5289 48.2079 0.1373 1642 +1644 2 238.2311 340.3446 48.1841 0.1373 1643 +1645 2 237.4441 341.1728 48.0393 0.1373 1644 +1646 2 236.6593 341.9977 47.7912 0.1373 1645 +1647 2 235.8756 342.8213 47.4594 0.1373 1646 +1648 2 235.1801 343.7125 47.0442 0.1373 1647 +1649 2 234.6733 344.7124 46.5077 0.1373 1648 +1650 2 233.9583 345.5589 45.8324 0.1373 1649 +1651 2 233.2696 346.4341 45.1968 0.1373 1650 +1652 2 232.6061 347.3356 44.618 0.1373 1651 +1653 2 232.0135 348.2919 44.1106 0.1373 1652 +1654 2 231.4175 349.2529 43.6755 0.1373 1653 +1655 2 230.8192 350.2162 43.3121 0.1373 1654 +1656 2 229.8811 350.8625 43.0511 0.1372 1655 +1657 2 228.8892 351.4265 42.8669 0.1372 1656 +1658 2 227.8974 351.9939 42.7358 0.1371 1657 +1659 2 226.9032 352.5591 42.642 0.1368 1658 +1660 2 225.9091 353.1253 42.5729 0.1364 1659 +1661 2 224.8669 353.5955 42.5141 0.1356 1660 +1662 2 223.8144 354.044 42.457 0.1342 1661 +1663 2 222.762 354.4913 42.4015 0.1313 1662 +1664 2 221.7106 354.9397 42.3522 0.1271 1663 +1665 2 220.6604 355.3939 42.3181 0.1144 1664 +1666 2 219.6102 355.8481 42.28 0.1144 1665 +1667 2 261.4017 282.4502 45.0324 0.1162 746 +1668 2 260.6215 281.6402 44.525 0.1371 1667 +1669 2 259.8951 280.7593 44.354 0.1383 1668 +1670 2 259.0897 279.9494 44.1986 0.1391 1669 +1671 2 258.2557 279.1726 43.9888 0.1407 1670 +1672 2 257.4801 278.3398 43.7136 0.1435 1671 +1673 2 256.6392 277.5676 43.5215 0.1494 1672 +1674 2 255.8533 276.737 43.3784 0.1571 1673 +1675 2 255.1692 275.823 43.2244 0.1868 1674 +1676 2 254.683 275.1766 42.8974 0.1734 1675 +1677 2 253.9863 274.2854 42.4724 0.1559 1676 +1678 2 253.2244 273.4709 41.8902 0.1414 1677 +1679 2 252.6387 272.5523 41.1258 0.1378 1678 +1680 2 252.1982 271.5684 40.1954 0.1382 1679 +1681 2 251.4764 270.8775 38.9556 0.1392 1680 +1682 2 250.8895 270.0046 37.8809 0.1408 1681 +1683 2 250.3575 269.102 36.7517 0.144 1682 +1684 2 249.7981 268.2097 35.6611 0.1497 1683 +1685 2 248.9298 268.4339 35.4108 0.3339 1684 +1686 2 248.3818 269.4212 35.3763 0.2225 1685 +1687 2 248.0901 270.5263 35.3254 0.1579 1686 +1688 2 247.7893 271.6302 35.3203 0.1276 1687 +1689 2 247.5456 272.7468 35.3942 0.1145 1688 +1690 2 247.2893 273.8473 35.8369 0.1144 1689 +1691 2 249.5247 267.7452 34.7505 0.1628 1684 +1692 2 248.963 266.7957 34.0172 0.1822 1691 +1693 2 248.3887 265.837 33.4169 0.2329 1692 +1694 2 247.843 264.8509 32.9294 0.1942 1693 +1695 2 247.2825 263.867 32.538 0.1611 1694 +1696 2 246.6773 262.9084 32.1717 0.1375 1695 +1697 2 246.222 261.8742 31.778 0.1376 1696 +1698 2 246.0058 260.7611 31.421 0.1379 1697 +1699 2 245.7895 259.6468 31.0668 0.1385 1698 +1700 2 245.5676 258.5348 30.7 0.1395 1699 +1701 2 245.2759 257.4435 30.301 0.1414 1700 +1702 2 244.7016 256.4779 29.8276 0.145 1701 +1703 2 243.8951 255.7 29.2678 0.1516 1702 +1704 2 243.0931 254.9278 28.6219 0.1641 1703 +1705 2 242.3061 254.1545 27.8918 0.184 1704 +1706 2 241.7318 253.2679 26.9767 0.2355 1705 +1707 2 241.8713 252.2657 25.7964 0.1978 1706 +1708 2 242.4594 251.4077 24.6471 0.1736 1707 +1709 2 243.1778 250.6801 23.4501 0.172 1708 +1710 2 243.9054 250.4365 21.5224 0.1881 1709 +1711 2 243.9603 249.813 19.5025 0.182 1710 +1712 2 243.2682 249.1495 17.9866 0.2063 1711 +1713 2 242.5944 248.3544 16.8307 0.2073 1712 +1714 2 241.8885 247.5467 15.8645 0.2125 1713 +1715 2 241.1243 246.7997 14.8613 0.3432 1714 +1716 2 255.3156 275.0988 43.9611 0.1219 1675 +1717 2 255.5181 273.98 44.0541 0.1355 1716 +1718 2 255.581 272.8383 44.0563 0.1374 1717 +1719 2 255.5971 271.6943 44.0362 0.1375 1718 +1720 2 255.5502 270.5514 43.9824 0.1376 1719 +1721 2 255.3454 269.428 43.8712 0.1378 1720 +1722 2 255.1566 268.3035 43.6509 0.1384 1721 +1723 2 255.0491 267.1698 43.3874 0.1393 1722 +1724 2 254.8374 266.0498 43.1292 0.1411 1723 +1725 2 254.6498 264.9252 42.9167 0.1442 1724 +1726 2 254.4736 263.7961 42.7613 0.1506 1725 +1727 2 254.2929 262.667 42.6656 0.1595 1726 +1728 2 254.1179 261.5378 42.6051 0.1907 1727 +1729 2 253.9955 260.4007 42.5009 0.1773 1728 +1730 2 253.9016 259.2624 42.3581 0.1695 1729 +1731 2 254.0618 258.1299 42.3144 0.1681 1730 +1732 2 254.1751 256.9916 42.329 0.2201 1731 +1733 2 254.2323 255.8487 42.3732 0.1654 1732 +1734 2 254.2506 254.7127 42.693 0.1144 1733 +1735 2 297.7249 311.0479 40.6804 0.159 531 +1736 2 296.5957 310.8866 40.4751 0.1502 1735 +1737 2 295.4643 310.7264 40.3659 0.1694 1736 +1738 2 294.3329 310.5651 40.243 0.1929 1737 +1739 2 293.1923 310.5308 40.0453 0.2603 1738 +1740 2 292.0701 310.6921 39.7286 0.2706 1739 +1741 2 290.9661 310.9335 39.2969 0.2364 1740 +1742 2 289.956 311.4151 38.7444 0.2498 1741 +1743 2 289.3771 312.3555 38.1139 0.2016 1742 +1744 2 288.6289 313.1368 37.4186 0.1689 1743 +1745 2 287.6462 312.6152 36.7668 0.1525 1744 +1746 2 286.6647 312.0912 36.1259 0.1563 1745 +1747 2 285.7392 311.6004 35.0 0.2288 1746 +1748 2 313.4423 344.5053 40.2102 0.1372 83 +1749 2 314.5794 344.3875 40.3038 0.1373 1748 +1750 2 315.7188 344.2971 40.4023 0.1373 1749 +1751 2 316.8628 344.2971 40.495 0.1373 1750 +1752 2 318.0057 344.2971 40.5734 0.1373 1751 +1753 2 319.1463 344.2147 40.63 0.1373 1752 +1754 2 320.2754 344.0271 40.6605 0.1373 1753 +1755 2 321.4034 343.8384 40.668 0.1373 1754 +1756 2 321.7397 343.9676 40.8878 0.1236 1755 +1757 2 322.7979 344.3749 41.2076 0.1325 1756 +1758 2 323.8572 344.8016 41.3314 0.1377 1757 +1759 2 324.904 345.2603 41.4364 0.138 1758 +1760 2 325.9428 345.7385 41.5416 0.1385 1759 +1761 2 326.9792 346.2202 41.6352 0.1396 1760 +1762 2 328.0409 346.6457 41.7105 0.1416 1761 +1763 2 329.1357 346.9741 41.7623 0.1454 1762 +1764 2 330.1698 347.4534 41.7948 0.1522 1763 +1765 2 330.8356 348.348 41.8127 0.1664 1764 +1766 2 331.2704 349.4039 41.8211 0.1872 1765 +1767 2 331.8733 350.3706 41.8247 0.2506 1766 +1768 2 332.626 351.2309 41.8264 0.2479 1767 +1769 2 333.3319 352.1289 41.8275 0.2479 1768 +1770 2 333.9588 353.0853 41.8292 0.3073 1769 +1771 2 334.652 353.9948 41.8312 0.3588 1770 +1772 2 335.4265 354.8368 41.8337 0.3872 1771 +1773 2 336.2777 355.5998 41.837 0.3062 1772 +1774 2 337.1757 356.308 41.8418 0.2509 1773 +1775 2 337.9914 357.1088 41.8482 0.2809 1774 +1776 2 338.7098 357.9965 41.8564 0.3004 1775 +1777 2 339.4511 358.8682 41.8676 0.3046 1776 +1778 2 340.2302 359.7068 41.8824 0.3204 1777 +1779 2 340.9223 360.6163 41.902 0.2926 1778 +1780 2 341.5183 361.5909 41.9278 0.3229 1779 +1781 2 342.2001 362.5084 41.9616 0.34 1780 +1782 2 342.9723 363.3516 42.0062 0.3346 1781 +1783 2 343.7857 364.1546 42.0641 0.2585 1782 +1784 2 344.6792 364.8674 42.1392 0.2084 1783 +1785 2 345.5635 365.5927 42.2369 0.2314 1784 +1786 2 346.4009 366.3694 42.3606 0.2022 1785 +1787 2 347.3047 367.0661 42.513 0.1674 1786 +1788 2 347.9064 368.0214 42.7146 0.1403 1787 +1789 2 348.9761 368.1449 42.9884 0.1373 1788 +1790 2 350.0377 367.7399 43.2754 0.1373 1789 +1791 2 350.9506 367.0638 43.5921 0.1373 1790 +1792 2 351.5226 366.0857 43.9407 0.1373 1791 +1793 2 351.4036 364.9623 44.3086 0.1373 1792 +1794 2 350.9975 363.9053 44.7068 0.1373 1793 +1795 2 350.3111 363.0106 45.1606 0.1373 1794 +1796 2 349.7803 362.0165 45.6394 0.1373 1795 +1797 2 349.3513 360.9732 46.111 0.1373 1796 +1798 2 348.9303 359.9253 46.5668 0.1373 1797 +1799 2 348.5734 358.8545 47.0072 0.1373 1798 +1800 2 348.3205 357.7528 47.4396 0.1373 1799 +1801 2 348.0689 356.6512 47.8752 0.1373 1800 +1802 2 347.8378 355.546 48.3358 0.1373 1801 +1803 2 347.7016 354.4306 48.8611 0.1373 1802 +1804 2 347.6708 353.3141 49.4687 0.1373 1803 +1805 2 347.6605 352.1998 50.1021 0.1373 1804 +1806 2 347.7634 351.0913 50.7402 0.1373 1805 +1807 2 348.0208 350.0068 51.371 0.1373 1806 +1808 2 348.1158 349.6705 51.5648 0.127 1807 +1809 2 348.4349 348.7495 52.887 0.1266 1808 +1810 2 348.8651 347.8801 54.2909 0.1373 1809 +1811 2 349.4222 346.9878 55.3868 0.1373 1810 +1812 2 349.9816 346.1275 56.628 0.1373 1811 +1813 2 350.4026 345.1848 57.8077 0.1372 1812 +1814 2 350.6989 344.1644 58.8384 0.1372 1813 +1815 2 350.9609 343.1142 59.7355 0.1371 1814 +1816 2 351.1199 342.0354 60.569 0.1369 1815 +1817 2 351.1474 340.9372 61.3334 0.1365 1816 +1818 2 351.2172 339.8286 62.0035 0.1358 1817 +1819 2 351.2274 338.7052 62.5024 0.1345 1818 +1820 2 350.9792 337.6036 62.8253 0.1319 1819 +1821 2 350.1876 336.86 63.3167 0.1273 1820 +1822 2 349.6156 335.9264 64.0125 0.1144 1821 +1823 2 349.4909 334.9323 65.3629 0.1144 1822 +1824 2 347.9876 350.032 52.7223 0.1373 1807 +1825 2 348.7964 350.6829 53.5158 0.1373 1824 +1826 2 349.6773 351.383 54.0109 0.1373 1825 +1827 2 350.5662 352.0889 54.3586 0.1373 1826 +1828 2 351.4585 352.7982 54.5905 0.1373 1827 +1829 2 352.3543 353.5086 54.7394 0.1373 1828 +1830 2 353.2489 354.219 54.8383 0.1373 1829 +1831 2 354.1561 354.9134 54.9903 0.1373 1830 +1832 2 355.0919 355.5621 55.2698 0.1373 1831 +1833 2 356.0265 356.2027 55.6455 0.1373 1832 +1834 2 357.1476 356.2061 56.0406 0.1373 1833 +1835 2 358.2802 356.165 56.4326 0.1373 1834 +1836 2 359.3784 355.8767 56.7358 0.1373 1835 +1837 2 360.4595 355.5094 56.9377 0.1373 1836 +1838 2 361.5406 355.1411 57.066 0.1373 1837 +1839 2 362.6228 354.7727 57.1592 0.1373 1838 +1840 2 363.7394 354.5313 57.314 0.1373 1839 +1841 2 364.8616 354.3334 57.5526 0.1373 1840 +1842 2 365.9816 354.1366 57.8662 0.1373 1841 +1843 2 367.0924 353.9227 58.2593 0.1373 1842 +1844 2 368.1129 353.4468 58.7549 0.1373 1843 +1845 2 369.1036 352.9171 59.1464 0.1373 1844 +1846 2 369.893 352.1015 59.4899 0.1373 1845 +1847 2 370.624 351.2309 59.7878 0.1373 1846 +1848 2 371.355 350.358 60.0575 0.1373 1847 +1849 2 372.0837 349.4817 60.3142 0.1373 1848 +1850 2 372.7838 348.5837 60.5825 0.1373 1849 +1851 2 373.4645 347.673 60.8818 0.1373 1850 +1852 2 374.1429 346.7613 61.2119 0.1373 1851 +1853 2 374.819 345.8495 61.5686 0.1373 1852 +1854 2 375.5455 345.011 61.9982 0.1373 1853 +1855 2 376.5442 344.5225 62.636 0.1373 1854 +1856 2 377.5246 343.9711 63.1495 0.1373 1855 +1857 2 378.4924 343.3968 63.6415 0.1373 1856 +1858 2 379.4591 342.811 64.0763 0.1373 1857 +1859 2 380.4452 342.247 64.3902 0.1373 1858 +1860 2 381.4451 341.6968 64.566 0.1373 1859 +1861 2 382.4472 341.1454 64.6416 0.1373 1860 +1862 2 383.4494 340.594 64.6554 0.1373 1861 +1863 2 384.4584 340.0551 64.6402 0.1373 1862 +1864 2 385.4868 339.5541 64.6332 0.1373 1863 +1865 2 386.5256 339.0759 64.6576 0.1373 1864 +1866 2 387.5643 338.5977 64.715 0.1373 1865 +1867 2 388.6042 338.1206 64.8004 0.1373 1866 +1868 2 389.6338 337.6264 64.9188 0.1373 1867 +1869 2 390.6508 337.1059 65.0784 0.1373 1868 +1870 2 391.661 336.5762 65.2716 0.1373 1869 +1871 2 392.6723 336.0466 65.4844 0.1373 1870 +1872 2 393.6824 335.518 65.7048 0.1373 1871 +1873 2 394.6926 334.9884 65.9215 0.1373 1872 +1874 2 395.7027 334.4587 66.1245 0.1373 1873 +1875 2 396.7346 333.9702 66.2892 0.1373 1874 +1876 2 397.794 333.5412 66.3933 0.1373 1875 +1877 2 398.8613 333.1317 66.4426 0.1373 1876 +1878 2 399.9298 332.721 66.4538 0.1373 1877 +1879 2 400.9972 332.3114 66.4429 0.1373 1878 +1880 2 402.0657 331.9019 66.4236 0.1373 1879 +1881 2 403.1342 331.4923 66.4079 0.1373 1880 +1882 2 404.2015 331.0816 66.4031 0.1373 1881 +1883 2 405.2883 330.7361 66.516 0.1373 1882 +1884 2 406.1154 330.155 66.5994 0.1373 1883 +1885 2 407.1267 329.6242 66.6938 0.1374 1884 +1886 2 408.146 329.1071 66.778 0.1374 1885 +1887 2 409.1665 328.59 66.8382 0.1376 1886 +1888 2 410.1869 328.0729 66.8623 0.1378 1887 +1889 2 411.2074 327.5558 66.838 0.1383 1888 +1890 2 412.2255 327.0376 66.6974 0.139 1889 +1891 2 413.2414 326.5216 66.4524 0.1406 1890 +1892 2 414.2538 326.0057 66.129 0.1433 1891 +1893 2 415.264 325.4909 65.7516 0.149 1892 +1894 2 416.273 324.9784 65.3428 0.1566 1893 +1895 2 417.2809 324.4647 64.9216 0.1848 1894 +1896 2 418.2899 323.9522 64.5061 0.1682 1895 +1897 2 419.2989 323.442 64.0968 0.151 1896 +1898 2 420.4246 323.4351 63.7104 0.1381 1897 +1899 2 421.5423 323.6262 63.3483 0.1373 1898 +1900 2 422.6588 323.8298 63.0014 0.1373 1899 +1901 2 423.7765 324.0323 62.6629 0.1373 1900 +1902 2 424.8747 323.7829 62.2905 0.1373 1901 +1903 2 425.9112 323.3276 61.9024 0.1373 1902 +1904 2 426.9454 322.8654 61.4978 0.1373 1903 +1905 2 427.9784 322.4032 61.0893 0.1373 1904 +1906 2 429.0126 321.941 60.6911 0.1373 1905 +1907 2 430.0468 321.4789 60.3156 0.1373 1906 +1908 2 431.113 321.083 60.0074 0.1373 1907 +1909 2 432.2135 320.7833 59.801 0.1373 1908 +1910 2 433.3163 320.4824 59.6744 0.1373 1909 +1911 2 434.4203 320.1816 59.6095 0.1373 1910 +1912 2 435.5231 319.8807 59.5879 0.1373 1911 +1913 2 436.627 319.5798 59.5941 0.1373 1912 +1914 2 437.731 319.2801 59.6154 0.1373 1913 +1915 2 438.835 318.9804 59.6448 0.1373 1914 +1916 2 439.9389 318.6795 59.6842 0.1373 1915 +1917 2 441.0429 318.3798 59.7352 0.1373 1916 +1918 2 442.1857 318.358 59.8245 0.1374 1917 +1919 2 443.3286 318.3878 59.9488 0.1375 1918 +1920 2 444.4703 318.3912 60.0984 0.1376 1919 +1921 2 445.58 318.1178 60.2392 0.1379 1920 +1922 2 446.7217 318.1212 60.4052 0.1384 1921 +1923 2 447.8623 318.1681 60.597 0.1393 1922 +1924 2 449.0028 318.215 60.8009 0.1413 1923 +1925 2 450.1423 318.2619 61.0081 0.1441 1924 +1926 2 451.2817 318.31 61.2125 0.1525 1925 +1927 2 452.4223 318.3569 61.409 0.1529 1926 +1928 2 453.5548 318.4038 61.789 0.2288 1927 +1929 2 404.5584 331.5941 67.1006 0.1146 1883 +1930 2 403.8343 332.4453 67.7018 0.1369 1929 +1931 2 403.0964 333.3124 67.9616 0.1368 1930 +1932 2 402.3608 334.1796 68.2696 0.1364 1931 +1933 2 401.7511 335.1359 68.6367 0.1356 1932 +1934 2 401.3873 336.2067 69.0533 0.1342 1933 +1935 2 401.0258 337.2775 69.4879 0.1313 1934 +1936 2 400.662 338.3483 69.9152 0.1269 1935 +1937 2 400.2993 339.4191 70.3315 0.1144 1936 +1938 2 399.9458 340.459 71.12 0.1144 1937 +1939 2 321.5921 343.7137 40.6378 0.1374 1755 +1940 2 322.5474 343.0856 40.5381 0.1374 1939 +1941 2 323.3916 342.3168 40.4197 0.1375 1940 +1942 2 324.054 341.3879 40.2788 0.1376 1941 +1943 2 324.5551 340.3629 40.1114 0.1379 1942 +1944 2 324.8937 339.2738 39.9104 0.1385 1943 +1945 2 325.1728 338.1698 39.6684 0.1396 1944 +1946 2 325.4005 337.0544 39.3716 0.1416 1945 +1947 2 325.611 335.9402 39.0102 0.1452 1946 +1948 2 325.5881 334.8156 38.528 0.1519 1947 +1949 2 325.5824 333.6968 37.9445 0.1659 1948 +1950 2 325.5824 332.5814 37.3212 0.1854 1949 +1951 2 325.5927 331.466 36.7055 0.2513 1950 +1952 2 325.6465 330.3483 36.1192 0.2282 1951 +1953 2 325.8684 329.2501 35.5614 0.2159 1952 +1954 2 326.3878 328.2548 35.03 0.257 1953 +1955 2 327.2984 327.6038 34.4912 0.2504 1954 +1956 2 328.36 327.2446 33.938 0.2002 1955 +1957 2 327.9711 327.3648 33.9545 0.1695 1956 +1958 2 326.9998 327.8887 34.055 0.1242 1957 +1959 2 326.739 328.8474 34.2936 0.1399 1958 +1960 2 327.2149 329.8701 34.5932 0.1421 1959 +1961 2 327.7629 330.8642 34.904 0.1465 1960 +1962 2 328.1141 331.9362 35.2061 0.1534 1961 +1963 2 328.3726 333.0436 35.483 0.1726 1962 +1964 2 328.8096 334.0858 35.7241 0.1765 1963 +1965 2 329.3404 335.0948 35.9276 0.1582 1964 +1966 2 329.726 336.1644 36.099 0.1436 1965 +1967 2 329.9216 337.2867 36.241 0.1377 1966 +1968 2 329.9822 338.4261 36.3555 0.1381 1967 +1969 2 329.9868 339.5701 36.4445 0.1388 1968 +1970 2 329.9868 340.7141 36.5126 0.1401 1969 +1971 2 329.9868 341.8569 36.5674 0.1424 1970 +1972 2 329.9868 343.0009 36.6164 0.147 1971 +1973 2 330.1229 344.1289 36.6626 0.1543 1972 +1974 2 330.513 345.1963 36.7279 0.1744 1973 +1975 2 330.8311 346.2785 36.8455 0.1786 1974 +1976 2 330.9844 347.4111 36.9964 0.1625 1975 +1977 2 331.1537 348.5413 37.1202 0.1523 1976 +1978 2 331.7017 349.4943 37.0269 0.1572 1977 +1979 2 332.2542 350.4736 36.71 0.1729 1978 +1980 2 332.8422 351.4162 36.1119 0.2145 1979 +1981 2 333.5744 352.1255 34.9126 0.2398 1980 +1982 2 334.2493 352.757 33.3855 0.3052 1981 +1983 2 335.2412 353.0201 32.1927 0.2991 1982 +1984 2 336.2788 353.1231 31.078 0.2341 1983 +1985 2 336.9412 352.6792 29.3905 0.1477 1984 +1986 2 337.7511 351.9996 28.8803 0.1373 1985 +1987 2 338.6023 351.2366 28.9713 0.1373 1986 +1988 2 339.4511 350.4758 29.2032 0.1373 1987 +1989 2 340.2954 349.7174 29.5571 0.1373 1988 +1990 2 341.0356 348.8937 30.2568 0.1373 1989 +1991 2 341.7483 348.0689 31.1046 0.1373 1990 +1992 2 342.4152 347.2051 31.9362 0.1373 1991 +1993 2 343.0318 346.2865 32.6438 0.1373 1992 +1994 2 343.6427 345.3542 33.2716 0.1373 1993 +1995 2 344.2113 344.3852 33.7904 0.1373 1994 +1996 2 344.725 343.3762 34.183 0.1373 1995 +1997 2 345.2867 342.3992 34.5733 0.1373 1996 +1998 2 345.8792 341.4474 35.0451 0.1373 1997 +1999 2 346.4181 340.451 35.427 0.1373 1998 +2000 2 347.0107 339.4843 35.7916 0.1373 1999 +2001 2 347.7188 338.6023 36.1432 0.1373 2000 +2002 2 348.4864 337.7649 36.4686 0.1373 2001 +2003 2 349.2506 336.9206 36.757 0.1373 2002 +2004 2 349.9485 336.0248 37.0432 0.1373 2003 +2005 2 350.1349 334.9724 37.4055 0.1373 2004 +2006 2 349.7688 333.9176 37.828 0.1373 2005 +2007 2 349.6968 332.8159 38.2472 0.1373 2006 +2008 2 350.4289 332.0174 38.5675 0.1373 2007 +2009 2 351.4196 331.4626 38.8226 0.1373 2008 +2010 2 352.455 330.9855 39.0589 0.1373 2009 +2011 2 353.4788 330.489 39.3271 0.1373 2010 +2012 2 354.4684 329.9307 39.6603 0.1373 2011 +2013 2 355.4397 329.345 40.0184 0.1373 2012 +2014 2 356.3045 328.614 40.3844 0.1373 2013 +2015 2 357.0733 327.78 40.7364 0.1373 2014 +2016 2 357.9038 327.0055 41.0511 0.1373 2015 +2017 2 358.8259 326.3374 41.3028 0.1373 2016 +2018 2 359.8646 325.8695 41.5041 0.1373 2017 +2019 2 360.9686 325.5847 41.6805 0.1373 2018 +2020 2 362.1069 325.5973 41.8102 0.1373 2019 +2021 2 363.236 325.7769 41.8547 0.1373 2020 +2022 2 364.3674 325.9508 41.8345 0.1373 2021 +2023 2 365.5069 326.0469 41.8096 0.1373 2022 +2024 2 366.644 326.1647 41.8037 0.1373 2023 +2025 2 367.7811 326.2894 41.8107 0.1373 2024 +2026 2 368.9251 326.2791 41.8541 0.1373 2025 +2027 2 370.0646 326.1819 41.9474 0.1373 2026 +2028 2 371.2028 326.0812 42.0767 0.1373 2027 +2029 2 372.34 325.9794 42.2265 0.1373 2028 +2030 2 373.4782 325.8787 42.3892 0.1373 2029 +2031 2 374.6154 325.7769 42.558 0.1373 2030 +2032 2 375.7525 325.6751 42.7269 0.1373 2031 +2033 2 376.8897 325.5744 42.8924 0.1373 2032 +2034 2 378.0279 325.4726 43.0548 0.1373 2033 +2035 2 379.1079 325.1065 43.1973 0.1373 2034 +2036 2 380.2038 324.7805 43.3154 0.1373 2035 +2037 2 381.2643 324.3549 43.4434 0.1372 2036 +2038 2 382.3843 324.1398 43.5994 0.1372 2037 +2039 2 383.526 324.1341 43.7455 0.1371 2038 +2040 2 384.6677 324.1101 43.8894 0.1368 2039 +2041 2 385.8071 324.022 44.0381 0.1364 2040 +2042 2 386.9397 323.8687 44.1795 0.1356 2041 +2043 2 388.0745 323.7383 44.3302 0.1343 2042 +2044 2 389.2048 323.5781 44.4766 0.1315 2043 +2045 2 390.3179 323.3161 44.5782 0.1273 2044 +2046 2 391.3761 322.886 44.6944 0.1149 2045 +2047 2 392.487 322.8471 45.3172 0.1144 2046 +2048 2 328.5374 326.9598 33.5793 0.1737 1956 +2049 2 328.94 325.9176 33.0366 0.1627 2048 +2050 2 329.1986 324.8205 32.5702 0.1933 2049 +2051 2 329.7214 323.8252 32.1107 0.1868 2050 +2052 2 330.4192 322.9386 31.6686 0.1827 2051 +2053 2 331.1205 322.0509 31.2368 0.2087 2052 +2054 2 331.8138 321.1586 30.8129 0.2072 2053 +2055 2 332.3835 320.1827 30.389 0.2462 2054 +2056 2 333.4039 319.7411 29.9468 0.1987 2055 +2057 2 334.5353 319.7045 29.5672 0.1652 2056 +2058 2 335.4345 319.0158 29.2443 0.141 2057 +2059 2 336.0935 318.0858 29.0077 0.1441 2058 +2060 2 336.6083 317.0665 28.8593 0.1497 2059 +2061 2 337.0098 315.9945 28.8025 0.1615 2060 +2062 2 337.3862 314.9146 28.819 0.1769 2061 +2063 2 338.6789 314.2339 29.2152 0.2087 2062 +2064 2 339.7314 313.8164 29.5859 0.1733 2063 +2065 2 340.8342 313.6333 30.0863 0.145 2064 +2066 2 341.8478 313.2066 30.6824 0.1389 2065 +2067 2 342.5571 312.3875 31.4084 0.1404 2066 +2068 2 343.295 311.5661 32.1314 0.143 2067 +2069 2 344.0649 310.7642 32.788 0.1484 2068 +2070 2 344.7238 309.865 33.4006 0.1558 2069 +2071 2 345.1517 308.8411 34.0242 0.1822 2070 +2072 2 345.4056 307.7497 34.5736 0.1699 2071 +2073 2 346.1344 306.9283 35.1028 0.1521 2072 +2074 2 346.8494 306.0761 35.7412 0.1373 2073 +2075 2 346.6755 306.0303 36.4907 0.1918 2074 +2076 2 345.6939 305.7672 36.6918 0.1903 2075 +2077 2 344.6231 305.3805 36.4846 0.1565 2076 +2078 2 343.6301 304.8222 36.3168 0.1403 2077 +2079 2 343.1325 303.8453 36.1066 0.1378 2078 +2080 2 343.152 302.7207 35.8462 0.1383 2079 +2081 2 343.3441 301.5996 35.5564 0.1393 2080 +2082 2 343.5638 300.4853 35.229 0.141 2081 +2083 2 343.7217 299.3654 34.8222 0.1441 2082 +2084 2 343.6919 298.2397 34.3613 0.1504 2083 +2085 2 343.5318 297.1231 33.8979 0.1594 2084 +2086 2 343.3213 296.0123 33.4704 0.1885 2085 +2087 2 343.0856 294.906 33.0515 0.1817 2086 +2088 2 342.8396 293.8147 32.4744 0.1747 2087 +2089 2 342.8168 292.7084 31.7822 0.177 2088 +2090 2 342.4358 291.8069 31.0923 0.2116 2089 +2091 2 341.619 291.0382 30.5357 0.1737 2090 +2092 2 340.7736 290.2957 30.0336 0.1454 2091 +2093 2 339.8916 289.5819 29.6912 0.1398 2092 +2094 2 338.9992 288.8714 29.4767 0.1419 2093 +2095 2 338.1161 288.1484 29.3216 0.1461 2094 +2096 2 337.3256 287.3248 29.1964 0.1549 2095 +2097 2 336.4435 286.5972 29.1852 0.1684 2096 +2098 2 335.5215 285.9199 29.1978 0.2045 2097 +2099 2 334.5834 285.2656 29.2018 0.216 2098 +2100 2 333.7082 284.5288 29.209 0.182 2099 +2101 2 332.7896 283.8481 29.2149 0.1522 2100 +2102 2 332.0014 283.0199 29.2225 0.139 2101 +2103 2 331.291 282.1241 29.2247 0.1392 2102 +2104 2 330.5096 281.289 29.2236 0.1407 2103 +2105 2 329.7305 280.4505 29.2102 0.1437 2104 +2106 2 328.9011 279.6622 29.1634 0.1492 2105 +2107 2 328.0763 278.8706 29.1211 0.1601 2106 +2108 2 327.2389 278.0904 29.1542 0.1769 2107 +2109 2 326.374 277.3445 29.2888 0.2259 2108 +2110 2 325.3879 276.7679 29.3978 0.2324 2109 +2111 2 324.3904 276.2085 29.4658 0.3095 2110 +2112 2 323.3745 275.6811 29.4554 0.2462 2111 +2113 2 322.4982 274.9467 29.4126 0.2248 2112 +2114 2 321.6848 274.1424 29.3415 0.1669 2113 +2115 2 321.8198 273.7489 29.3196 0.1597 2114 +2116 2 322.1916 272.6678 29.2827 0.1436 2115 +2117 2 322.5634 271.5856 29.2891 0.1373 2116 +2118 2 322.934 270.5034 29.3348 0.1373 2117 +2119 2 323.3058 269.4223 29.416 0.1373 2118 +2120 2 323.6776 268.3412 29.5294 0.1373 2119 +2121 2 323.9682 267.2395 29.6974 0.1373 2120 +2122 2 324.2817 266.1493 29.932 0.1373 2121 +2123 2 324.8056 265.1472 30.2254 0.1373 2122 +2124 2 325.5572 264.312 30.5819 0.1373 2123 +2125 2 326.5056 263.7172 31.0274 0.1373 2124 +2126 2 327.5684 263.3648 31.5266 0.1373 2125 +2127 2 328.6792 263.1783 31.9953 0.1373 2126 +2128 2 329.8072 263.1051 32.4041 0.1373 2127 +2129 2 330.942 263.0777 32.7474 0.1373 2128 +2130 2 332.0803 263.0605 33.0355 0.1374 2129 +2131 2 333.2186 263.0182 33.2934 0.1375 2130 +2132 2 334.3386 262.842 33.5493 0.1376 2131 +2133 2 335.3842 262.4176 33.8304 0.1379 2132 +2134 2 336.3154 261.7735 34.1555 0.1385 2133 +2135 2 337.1757 261.0368 34.533 0.1395 2134 +2136 2 338.0177 260.2829 34.963 0.1414 2135 +2137 2 338.7864 259.4615 35.4334 0.1449 2136 +2138 2 339.4374 258.552 35.9881 0.1514 2137 +2139 2 340.1798 257.7569 36.7245 0.1645 2138 +2140 2 340.8559 257.6288 38.2508 0.2234 2139 +2141 2 341.754 257.8976 39.7944 0.2665 2140 +2142 2 342.6372 258.0017 41.554 0.2433 2141 +2143 2 343.5546 258.3324 43.0122 0.1804 2142 +2144 2 344.5316 258.6538 44.2378 0.1513 2143 +2145 2 345.5624 258.9627 45.1861 0.1393 2144 +2146 2 346.5485 259.4592 45.9043 0.1395 2145 +2147 2 347.4854 260.0747 46.4573 0.1412 2146 +2148 2 348.4292 260.6924 46.9123 0.145 2147 +2149 2 349.4909 260.522 47.5003 0.1496 2148 +2150 2 349.9279 259.5141 48.1802 0.1723 2149 +2151 2 350.4003 258.5154 48.8701 0.1385 2150 +2152 2 350.7458 257.6094 50.3569 0.1144 2151 +2153 2 321.3976 273.8519 29.055 0.1294 2114 +2154 2 320.5671 273.0762 28.8145 0.1872 2153 +2155 2 319.6714 272.367 28.7255 0.25 2154 +2156 2 318.7413 271.7011 28.6684 0.3249 2155 +2157 2 317.8272 271.0136 28.6742 0.2951 2156 +2158 2 316.9509 270.278 28.6916 0.2163 2157 +2159 2 316.0517 269.5722 28.6863 0.1586 2158 +2160 2 315.1228 268.9041 28.677 0.143 2159 +2161 2 314.266 268.1479 28.6527 0.1452 2160 +2162 2 313.6047 267.2178 28.6028 0.1519 2161 +2163 2 313.1906 266.155 28.5516 0.1655 2162 +2164 2 312.9115 265.0465 28.5774 0.1855 2163 +2165 2 312.852 263.9059 28.6367 0.2491 2164 +2166 2 313.2432 262.8363 28.7314 0.2403 2165 +2167 2 314.1252 262.1156 28.8926 0.1828 2166 +2168 2 315.0256 261.4143 29.0937 0.1275 2167 +2169 2 315.7989 260.6169 29.7626 0.1144 2168 +2170 2 343.0192 292.1684 30.9162 0.2974 2089 +2171 2 343.3018 291.0679 30.8126 0.1993 2170 +2172 2 343.3773 289.9285 30.7269 0.1532 2171 +2173 2 343.3796 288.7868 30.5813 0.138 2172 +2174 2 343.3796 287.6451 30.3853 0.1386 2173 +2175 2 343.3796 286.5045 30.1552 0.1397 2174 +2176 2 343.3796 285.3651 29.9096 0.1418 2175 +2177 2 343.3796 284.2257 29.6666 0.1458 2176 +2178 2 343.3796 283.0851 29.4364 0.1524 2177 +2179 2 343.3796 281.9445 29.218 0.1687 2178 +2180 2 343.3796 280.804 29.006 0.179 2179 +2181 2 343.335 279.6668 28.7627 0.1601 2180 +2182 2 343.1542 278.5503 28.399 0.1442 2181 +2183 2 342.914 277.4497 27.919 0.1373 2182 +2184 2 342.7607 276.3332 27.4628 0.1373 2183 +2185 2 342.676 275.2018 27.1027 0.1373 2184 +2186 2 342.6234 274.0646 26.8503 0.1373 2185 +2187 2 342.6486 272.9229 26.749 0.1373 2186 +2188 2 342.7069 271.7812 26.7785 0.1375 2187 +2189 2 342.6955 270.6384 26.811 0.1376 2188 +2190 2 342.6166 269.4967 26.7999 0.1378 2189 +2191 2 342.4656 268.3641 26.7368 0.1383 2190 +2192 2 342.2802 267.2361 26.6212 0.1391 2191 +2193 2 342.1464 266.1024 26.489 0.1406 2192 +2194 2 342.0629 264.963 26.3495 0.1436 2193 +2195 2 341.9862 263.8236 26.177 0.1489 2194 +2196 2 341.881 262.6876 25.9697 0.1593 2195 +2197 2 341.7792 261.555 25.6792 0.1756 2196 +2198 2 341.7036 260.4259 25.2649 0.2266 2197 +2199 2 341.5172 259.3173 24.7771 0.2204 2198 +2200 2 341.4268 258.1939 24.3434 0.1951 2199 +2201 2 341.5446 257.0648 24.0844 0.199 2200 +2202 2 341.3959 255.9425 23.9716 0.193 2201 +2203 2 341.0539 254.8523 23.9319 0.205 2202 +2204 2 340.6855 253.7689 23.9145 0.1872 2203 +2205 2 340.3446 252.6776 23.8857 0.1783 2204 +2206 2 339.9739 251.5953 23.8109 0.1966 2205 +2207 2 339.5461 250.536 23.6689 0.1948 2206 +2208 2 338.6789 249.8382 23.511 0.1942 2207 +2209 2 337.9479 248.9779 23.1844 0.2411 2208 +2210 2 337.6322 247.9048 22.6702 0.213 2209 +2211 2 337.2134 246.8649 22.1169 0.1938 2210 +2212 2 336.7295 245.8502 21.595 0.1893 2211 +2213 2 336.4435 245.3445 21.2237 0.2429 2212 +2214 2 335.8384 244.3973 20.715 0.2406 2213 +2215 2 335.1428 243.5027 20.3345 0.2575 2214 +2216 2 334.4759 242.5852 19.9839 0.2088 2215 +2217 2 333.8638 241.6334 19.5688 0.1693 2216 +2218 2 333.2518 240.6839 19.1263 0.1439 2217 +2219 2 332.618 239.7458 18.7239 0.1435 2218 +2220 2 331.9373 238.8375 18.3765 0.1493 2219 +2221 2 331.5209 237.7873 18.0628 0.1576 2220 +2222 2 331.2292 236.6947 17.6635 0.1869 2221 +2223 2 330.8757 235.6297 17.1081 0.1721 2222 +2224 2 330.4696 234.5783 16.6377 0.1608 2223 +2225 2 330.0932 233.5098 16.256 0.1529 2224 +2226 2 330.0863 232.3716 15.9799 0.1903 2225 +2227 2 330.0955 231.2333 15.7027 0.1144 2226 +2228 2 336.3097 244.9098 21.6919 0.1211 2212 +2229 2 335.8658 243.8814 22.2377 0.1988 2228 +2230 2 335.4048 242.8426 22.5539 0.2154 2229 +2231 2 334.7859 241.8885 22.8273 0.1802 2230 +2232 2 334.3454 240.8349 23.0031 0.1495 2231 +2233 2 333.9279 239.771 23.0899 0.1348 2232 +2234 2 333.5286 238.699 23.1038 0.1314 2233 +2235 2 333.1168 237.634 22.9444 0.1272 2234 +2236 2 332.9738 236.506 22.6371 0.1144 2235 +2237 2 333.0321 235.402 21.9218 0.1144 2236 +2238 2 347.9899 305.8896 36.3129 0.1373 2074 +2239 2 349.1213 305.726 36.363 0.1373 2238 +2240 2 350.2448 305.5212 36.2177 0.1373 2239 +2241 2 351.3224 305.1551 35.9503 0.1373 2240 +2242 2 352.3211 304.6094 35.6941 0.1373 2241 +2243 2 353.2729 303.9814 35.495 0.1374 2242 +2244 2 354.1744 303.2813 35.3125 0.1374 2243 +2245 2 355.077 302.5823 35.135 0.1376 2244 +2246 2 356.1444 302.1842 35.0112 0.1378 2245 +2247 2 357.2563 301.9199 34.9261 0.1383 2246 +2248 2 358.3855 301.7403 34.862 0.1391 2247 +2249 2 359.5237 301.6236 34.8104 0.1406 2248 +2250 2 360.6609 301.5046 34.7578 0.1433 2249 +2251 2 361.7282 301.1008 34.7259 0.149 2250 +2252 2 362.7933 300.6832 34.7729 0.1566 2251 +2253 2 363.8435 300.2291 34.8004 0.1853 2252 +2254 2 364.9314 299.8824 34.9087 0.1677 2253 +2255 2 366.0708 299.8504 35.0846 0.1505 2254 +2256 2 367.2103 299.911 35.2915 0.1377 2255 +2257 2 368.328 299.6857 35.4878 0.1373 2256 +2258 2 369.4628 299.5713 35.6913 0.1373 2257 +2259 2 370.6022 299.6079 35.9279 0.1374 2258 +2260 2 371.7417 299.6433 36.1715 0.1374 2259 +2261 2 372.8811 299.6136 36.4095 0.1376 2260 +2262 2 374.0228 299.6296 36.5688 0.1378 2261 +2263 2 375.1656 299.6674 36.638 0.1383 2262 +2264 2 376.0282 299.9339 36.8449 0.1405 2263 +2265 2 377.1379 300.189 37.0882 0.1432 2264 +2266 2 378.267 300.3183 37.3677 0.1488 2265 +2267 2 379.4053 300.3 37.5684 0.1569 2266 +2268 2 380.5138 300.0472 37.7353 0.1839 2267 +2269 2 381.5961 299.6788 37.7938 0.1772 2268 +2270 2 382.7103 299.4306 37.7107 0.1657 2269 +2271 2 383.8475 299.3585 37.5396 0.1611 2270 +2272 2 384.98 299.4695 37.319 0.1876 2271 +2273 2 386.0977 299.6914 37.0773 0.1814 2272 +2274 2 387.1857 300.0277 36.8315 0.1713 2273 +2275 2 388.2164 300.5013 36.5142 0.1843 2274 +2276 2 388.785 301.4463 36.1183 0.1691 2275 +2277 2 389.0801 302.5365 35.7053 0.1517 2276 +2278 2 389.5709 303.5535 35.294 0.1388 2277 +2279 2 390.2081 304.4905 34.9152 0.1384 2278 +2280 2 391.0123 305.2913 34.599 0.1394 2279 +2281 2 391.8921 306.0166 34.3694 0.1411 2280 +2282 2 392.813 306.6927 34.2261 0.1442 2281 +2283 2 393.7797 307.3013 34.1552 0.1507 2282 +2284 2 394.7864 307.8447 34.1449 0.1598 2283 +2285 2 395.8114 308.3526 34.1715 0.1906 2284 +2286 2 396.8639 308.8011 34.2034 0.1801 2285 +2287 2 397.9347 309.2049 34.2367 0.1705 2286 +2288 2 399.0261 309.5447 34.2871 0.1855 2287 +2289 2 400.1312 309.841 34.3392 0.1683 2288 +2290 2 401.2454 310.1006 34.3801 0.1512 2289 +2291 2 402.362 310.3478 34.4168 0.1382 2290 +2292 2 403.4934 310.5159 34.4618 0.1373 2291 +2293 2 404.6305 310.6349 34.5153 0.1374 2292 +2294 2 405.7619 310.8008 34.5722 0.1374 2293 +2295 2 406.8819 311.033 34.6259 0.1376 2294 +2296 2 408.011 311.2138 34.6651 0.1378 2295 +2297 2 409.1493 311.3236 34.6825 0.1383 2296 +2298 2 410.2899 311.4151 34.6769 0.1392 2297 +2299 2 411.4316 311.4815 34.6497 0.1407 2298 +2300 2 412.5744 311.5364 34.6018 0.1436 2299 +2301 2 413.7162 311.5959 34.5338 0.1495 2300 +2302 2 414.8579 311.6645 34.4428 0.1575 2301 +2303 2 415.9996 311.7194 34.3218 0.1867 2302 +2304 2 417.1413 311.7308 34.1684 0.1718 2303 +2305 2 418.2842 311.732 34.0043 0.1577 2304 +2306 2 419.4259 311.7228 33.8582 0.1509 2305 +2307 2 420.5687 311.7652 33.7562 0.1587 2306 +2308 2 421.6933 311.9665 33.7028 0.1889 2307 +2309 2 422.7011 312.503 33.7042 0.1752 2308 +2310 2 423.5877 313.2238 33.749 0.1648 2309 +2311 2 424.4274 314.0005 33.7775 0.1612 2310 +2312 2 425.3667 314.6526 33.7784 0.1927 2311 +2313 2 426.4706 314.9409 33.7929 0.1811 2312 +2314 2 427.6123 314.9329 33.8666 0.1763 2313 +2315 2 428.754 314.9867 34.0192 0.1805 2314 +2316 2 429.8809 315.156 34.2504 0.2423 2315 +2317 2 430.9951 315.3882 34.5262 0.2099 2316 +2318 2 432.1025 315.6559 34.781 0.1876 2317 +2319 2 433.2065 315.9419 34.9905 0.1816 2318 +2320 2 434.3196 316.1993 35.1571 0.2262 2319 +2321 2 435.4556 316.324 35.2881 0.2664 2320 +2322 2 436.5939 316.4293 35.38 0.2117 2321 +2323 2 437.7379 316.4498 35.4284 0.1665 2322 +2324 2 438.8807 316.427 35.4332 0.1438 2323 +2325 2 440.0247 316.3892 35.3892 0.1494 2324 +2326 2 441.1619 316.2725 35.2934 0.157 2325 +2327 2 442.2967 316.1455 35.1565 0.1867 2326 +2328 2 443.4327 316.0197 34.9938 0.1672 2327 +2329 2 444.5676 315.895 34.8244 0.1503 2328 +2330 2 445.7024 315.7692 34.6704 0.138 2329 +2331 2 446.8315 315.5896 34.5495 0.1385 2330 +2332 2 447.9526 315.3642 34.4672 0.1397 2331 +2333 2 449.0726 315.132 34.4165 0.1417 2332 +2334 2 450.1789 314.8425 34.389 0.1453 2333 +2335 2 451.2851 314.5508 34.365 0.1528 2334 +2336 2 452.3811 314.2202 34.326 0.1632 2335 +2337 2 453.4713 313.8747 34.2723 0.1988 2336 +2338 2 454.5615 313.5304 34.2152 0.1867 2337 +2339 2 454.8155 313.3382 34.323 0.1267 2338 +2340 2 455.7193 312.6655 34.8124 0.1363 2339 +2341 2 456.6345 311.986 35.0361 0.1373 2340 +2342 2 457.5668 311.3282 35.2335 0.1374 2341 +2343 2 458.5278 310.7093 35.3704 0.1374 2342 +2344 2 459.491 310.0938 35.4141 0.1375 2343 +2345 2 460.4314 309.4417 35.341 0.1377 2344 +2346 2 461.3672 308.7896 35.1422 0.1382 2345 +2347 2 462.3499 308.2176 34.8421 0.139 2346 +2348 2 463.3509 307.6834 34.4688 0.1406 2347 +2349 2 464.337 307.1285 34.0572 0.1432 2348 +2350 2 465.2968 306.5302 33.6386 0.1488 2349 +2351 2 466.2555 305.9296 33.2293 0.1561 2350 +2352 2 467.2474 305.3862 32.7986 0.1846 2351 +2353 2 468.2461 304.8588 32.3487 0.1641 2352 +2354 2 469.2516 304.3486 31.8858 0.1443 2353 +2355 2 470.3076 303.9516 31.4154 0.1272 2354 +2356 2 471.3635 303.5547 30.947 0.1144 2355 +2357 2 472.3118 303.1714 29.6962 0.1144 2356 +2358 2 455.2514 313.5269 34.1712 0.193 2338 +2359 2 456.3954 313.5235 34.1132 0.1866 2358 +2360 2 457.5382 313.5452 34.078 0.1603 2359 +2361 2 458.6776 313.6436 34.0432 0.145 2360 +2362 2 459.8022 313.8427 34.0105 0.1373 2361 +2363 2 460.8901 314.1813 33.9861 0.1373 2362 +2364 2 461.922 314.6732 33.9861 0.1373 2363 +2365 2 462.9173 315.2361 34.0362 0.1373 2364 +2366 2 463.8851 315.8424 34.167 0.1373 2365 +2367 2 464.8312 316.4784 34.4025 0.1373 2366 +2368 2 465.7807 317.0985 34.7603 0.1373 2367 +2369 2 466.7497 317.6694 35.266 0.1373 2368 +2370 2 467.7541 318.1292 35.9556 0.1373 2369 +2371 2 468.7746 318.5342 36.75 0.1373 2370 +2372 2 469.7561 319.0364 37.4682 0.1373 2371 +2373 2 470.7011 319.6359 38.0414 0.1373 2372 +2374 2 471.6209 320.2925 38.4628 0.1373 2373 +2375 2 472.5303 320.9767 38.7425 0.1373 2374 +2376 2 473.4547 321.6448 38.9018 0.1373 2375 +2377 2 474.3962 322.2957 38.9718 0.1373 2376 +2378 2 475.3366 322.9466 38.9816 0.1373 2377 +2379 2 476.2666 323.6113 38.9508 0.1373 2378 +2380 2 477.1876 324.2908 38.8872 0.1373 2379 +2381 2 478.0959 324.9841 38.7979 0.1373 2380 +2382 2 478.9951 325.6911 38.6994 0.1373 2381 +2383 2 479.8966 326.3946 38.6179 0.1373 2382 +2384 2 480.8072 327.0868 38.584 0.1373 2383 +2385 2 481.7201 327.7754 38.6226 0.1373 2384 +2386 2 482.649 328.4413 38.7506 0.1373 2385 +2387 2 483.6111 329.0522 38.9634 0.1373 2386 +2388 2 484.5732 329.6619 39.2067 0.1373 2387 +2389 2 485.485 330.346 39.4058 0.1373 2388 +2390 2 486.3373 331.1068 39.5259 0.1373 2389 +2391 2 487.1495 331.9122 39.5626 0.1373 2390 +2392 2 487.9457 332.7324 39.5254 0.1373 2391 +2393 2 488.7111 333.5812 39.4324 0.1373 2392 +2394 2 489.4501 334.453 39.3036 0.1373 2393 +2395 2 490.0747 335.4048 39.151 0.1373 2394 +2396 2 490.5804 336.4275 38.983 0.1373 2395 +2397 2 491.0334 337.4754 38.8086 0.1373 2396 +2398 2 491.3903 338.5576 38.6344 0.1373 2397 +2399 2 491.6695 339.6639 38.4594 0.1373 2398 +2400 2 491.9326 340.7747 38.2754 0.1373 2399 +2401 2 492.1946 341.8855 38.0733 0.1373 2400 +2402 2 492.4577 342.9952 37.8423 0.1373 2401 +2403 2 492.6819 344.1106 37.5743 0.1374 2402 +2404 2 492.873 345.2317 37.2691 0.1374 2403 +2405 2 493.1406 346.3334 36.9362 0.1375 2404 +2406 2 493.5502 347.3893 36.5873 0.1378 2405 +2407 2 494.0353 348.4155 36.2314 0.1381 2406 +2408 2 494.5821 349.4085 35.8747 0.1388 2407 +2409 2 495.1896 350.3672 35.5328 0.1402 2408 +2410 2 495.8199 351.3144 35.2262 0.1426 2409 +2411 2 496.5292 352.2033 34.9762 0.1474 2410 +2412 2 497.3002 353.0441 34.797 0.1546 2411 +2413 2 498.1308 353.8289 34.6926 0.177 2412 +2414 2 499.0288 354.5348 34.7172 0.1738 2413 +2415 2 499.9543 355.2028 34.8807 0.156 2414 +2416 2 500.8821 355.8641 35.1369 0.1425 2415 +2417 2 501.8476 356.467 35.4032 0.1405 2416 +2418 2 502.8635 356.9829 35.602 0.1433 2417 +2419 2 503.8977 357.4703 35.7115 0.1482 2418 +2420 2 505.0051 357.7128 35.6994 0.1584 2419 +2421 2 506.1422 357.8169 35.572 0.1729 2420 +2422 2 507.2805 357.9107 35.3898 0.2209 2421 +2423 2 508.3364 358.3008 35.1526 0.2064 2422 +2424 2 509.3466 358.8259 34.8737 0.1708 2423 +2425 2 510.3155 359.4196 34.5834 0.1433 2424 +2426 2 511.1781 360.1587 34.3213 0.1372 2425 +2427 2 511.8325 361.0842 34.1051 0.1372 2426 +2428 2 512.2706 362.1309 33.8495 0.1371 2427 +2429 2 512.4697 363.2497 33.6454 0.1369 2428 +2430 2 512.5314 364.3915 33.5924 0.1364 2429 +2431 2 512.5669 365.532 33.7554 0.1357 2430 +2432 2 512.5875 366.6612 34.195 0.1342 2431 +2433 2 512.5818 367.7823 34.7528 0.1313 2432 +2434 2 512.4662 368.8977 35.3046 0.1268 2433 +2435 2 512.1299 369.9776 35.7123 0.1144 2434 +2436 2 511.7959 371.0564 36.1665 0.1144 2435 +2437 2 375.915 299.4946 35.9092 0.3149 2263 +2438 2 377.0132 299.2658 35.3744 0.2157 2437 +2439 2 378.1355 299.0828 35.0647 0.1705 2438 +2440 2 379.2589 298.9295 34.6987 0.1659 2439 +2441 2 380.3834 298.7842 34.3347 0.1824 2440 +2442 2 381.5114 298.6435 34.0138 0.1645 2441 +2443 2 382.6463 298.5543 33.7557 0.1507 2442 +2444 2 383.7857 298.5451 33.5406 0.1451 2443 +2445 2 384.9137 298.5085 33.2822 0.1518 2444 +2446 2 385.8392 297.9731 32.8916 0.1692 2445 +2447 2 386.6217 297.1929 32.3985 0.1779 2446 +2448 2 387.6284 296.717 31.8466 0.159 2447 +2449 2 388.5424 296.1473 31.2136 0.1434 2448 +2450 2 389.0641 295.1966 30.497 0.1378 2449 +2451 2 389.4348 294.151 29.8144 0.1383 2450 +2452 2 389.786 293.0894 29.2289 0.1393 2451 +2453 2 390.2378 292.0632 28.7151 0.1409 2452 +2454 2 391.0203 291.2967 28.2248 0.1441 2453 +2455 2 392.0511 290.8734 27.7357 0.1501 2454 +2456 2 393.1493 290.6183 27.273 0.1617 2455 +2457 2 394.2602 290.4101 26.8438 0.1791 2456 +2458 2 395.3721 290.2053 26.4207 0.2309 2457 +2459 2 396.4818 289.9937 25.983 0.2323 2458 +2460 2 397.5903 289.7809 25.5158 0.2241 2459 +2461 2 398.6943 289.5704 25.0027 0.2017 2460 +2462 2 399.804 289.4503 24.4014 0.19 2461 +2463 2 400.8267 289.7741 23.6605 0.2268 2462 +2464 2 401.8929 290.0143 22.8891 0.2017 2463 +2465 2 402.9912 289.8793 22.2451 0.1669 2464 +2466 2 404.1134 289.8198 21.7336 0.1406 2465 +2467 2 405.2471 289.8141 21.3494 0.1375 2466 +2468 2 406.3843 289.7809 21.0855 0.1376 2467 +2469 2 407.4802 289.4755 20.9254 0.1379 2468 +2470 2 408.511 288.9847 20.8462 0.1384 2469 +2471 2 409.5966 288.6266 20.8273 0.1393 2470 +2472 2 410.7223 288.4356 20.8659 0.1411 2471 +2473 2 411.8492 288.2388 20.9635 0.1443 2472 +2474 2 412.9016 287.8052 21.1219 0.1502 2473 +2475 2 413.8134 287.1268 21.3375 0.1624 2474 +2476 2 414.8636 286.6978 21.6073 0.1797 2475 +2477 2 415.995 286.6143 21.8775 0.2401 2476 +2478 2 417.1356 286.6086 22.0826 0.2127 2477 +2479 2 418.2784 286.6086 22.1936 0.1901 2478 +2480 2 419.4224 286.6086 22.1913 0.1878 2479 +2481 2 420.5653 286.6086 22.07 0.2186 2480 +2482 2 421.7059 286.6086 21.8388 0.3365 2481 +2483 2 422.8418 286.6086 21.52 0.2724 2482 +2484 2 423.9756 286.6086 21.1444 0.2157 2483 +2485 2 425.1081 286.6086 20.7414 0.1831 2484 +2486 2 426.2407 286.6086 20.3398 0.2327 2485 +2487 2 427.3744 286.6086 19.9637 0.2501 2486 +2488 2 428.5092 286.6086 19.6219 0.3233 2487 +2489 2 429.6452 286.6589 19.3141 0.3625 2488 +2490 2 430.7778 286.7733 19.0407 0.3509 2489 +2491 2 431.9046 286.9438 18.806 0.389 2490 +2492 2 433.0223 287.1772 18.6108 0.272 2491 +2493 2 434.1423 287.4003 18.4518 0.1905 2492 +2494 2 435.2828 287.47 18.3235 0.1388 2493 +2495 2 436.4246 287.4277 18.2187 0.1375 2494 +2496 2 437.5583 287.2756 18.1287 0.1376 2495 +2497 2 438.6599 286.9724 18.0439 0.138 2496 +2498 2 439.733 286.5777 17.9549 0.1386 2497 +2499 2 440.6013 285.8364 17.8504 0.1398 2498 +2500 2 441.536 285.1786 17.7174 0.1419 2499 +2501 2 442.6308 284.8594 17.5414 0.1458 2500 +2502 2 443.7668 284.7748 17.311 0.1535 2501 +2503 2 444.8879 284.5849 17.0094 0.1648 2502 +2504 2 445.8877 284.0518 16.6337 0.2019 2503 +2505 2 446.7045 283.2693 16.2105 0.1923 2504 +2506 2 447.3704 282.3541 15.8028 0.2114 2505 +2507 2 448.1037 281.4915 15.444 0.1786 2506 +2508 2 449.1401 281.1151 14.6947 0.2288 2507 +2509 2 337.4903 314.1859 27.8176 0.1147 2062 +2510 2 337.5406 313.0556 27.4025 0.1886 2509 +2511 2 337.5578 311.9139 27.2225 0.1716 2510 +2512 2 337.957 310.8454 27.0209 0.1586 2511 +2513 2 338.1744 309.7254 26.8122 0.153 2512 +2514 2 338.219 308.586 26.596 0.1672 2513 +2515 2 338.2591 307.4466 26.3802 0.1878 2514 +2516 2 338.3792 306.3117 26.1764 0.2555 2515 +2517 2 338.7498 305.2329 25.9781 0.2373 2516 +2518 2 339.2669 304.2148 25.7915 0.2162 2517 +2519 2 339.8275 303.2401 25.2773 0.3432 2518 +2520 2 335.1726 415.3303 38.2673 0.1263 15 +2521 2 335.0662 416.0545 36.118 0.1997 2520 +2522 2 334.8763 416.8496 34.2546 0.3197 2521 +2523 2 334.3134 417.6847 33.0518 0.3324 2522 +2524 2 333.635 418.4752 31.9035 0.2723 2523 +2525 2 333.4543 419.3996 30.6057 0.2021 2524 +2526 2 333.3044 420.3617 29.1948 0.1788 2525 +2527 2 332.7393 421.2071 27.97 0.2256 2526 +2528 2 332.0849 422.025 26.8422 0.2041 2527 +2529 2 331.426 422.8476 25.7544 0.1695 2528 +2530 2 330.7624 423.6735 24.7005 0.1426 2529 +2531 2 330.0955 424.5052 23.6836 0.1373 2530 +2532 2 329.4262 425.3403 22.6934 0.1372 2531 +2533 2 328.7559 426.1778 21.7198 0.1372 2532 +2534 2 328.0832 427.0152 20.7623 0.1371 2533 +2535 2 327.4082 427.8571 19.8263 0.1369 2534 +2536 2 326.731 428.7014 18.9207 0.1364 2535 +2537 2 326.0514 429.5503 18.0508 0.1357 2536 +2538 2 325.3742 430.414 17.2673 0.1344 2537 +2539 2 324.6981 431.2949 16.5922 0.1317 2538 +2540 2 323.657 431.4642 15.9498 0.1268 2539 +2541 2 322.9581 430.5707 15.5724 0.1144 2540 +2542 2 322.2614 429.683 15.12 0.1144 2541 +2543 3 335.5272 419.6192 40.7016 0.2288 11 +2544 3 336.5591 419.1856 41.2885 0.1946 2543 +2545 3 337.591 418.7029 41.5204 0.1777 2544 +2546 3 338.235 417.7636 41.7698 0.1901 2545 +2547 3 338.6068 416.6871 42.0311 0.2283 2546 +2548 3 339.4202 415.8898 42.2988 0.3392 2547 +2549 3 340.4876 415.5591 42.0358 0.1339 2548 +2550 3 341.5881 415.2514 41.979 0.1864 2549 +2551 3 342.7104 415.0306 41.9745 0.2442 2550 +2552 3 343.8521 415.0066 42.0028 0.3033 2551 +2553 3 344.9869 415.1427 42.0577 0.2888 2552 +2554 3 346.1012 415.4013 42.1207 0.3113 2553 +2555 3 347.2166 415.6552 42.1674 0.3792 2554 +2556 3 348.3572 415.6953 42.1772 0.4055 2555 +2557 3 349.46 415.4058 42.1526 0.3071 2556 +2558 3 350.4335 414.8121 42.0902 0.2553 2557 +2559 3 351.3544 414.1349 41.9846 0.2202 2558 +2560 3 352.3406 413.5594 41.8278 0.2381 2559 +2561 3 353.3988 413.1339 41.6147 0.3194 2560 +2562 3 354.4936 412.8238 41.3448 0.3765 2561 +2563 3 355.5792 412.4898 41.0276 0.4135 2562 +2564 3 356.618 412.0333 40.6792 0.3477 2563 +2565 3 357.7059 411.7153 40.3141 0.311 2564 +2566 3 358.835 411.6238 39.9448 0.2236 2565 +2567 3 359.9653 411.5174 39.5903 0.1825 2566 +2568 3 361.0876 411.3401 39.2664 0.1712 2567 +2569 3 362.179 411.0209 38.9763 0.1956 2568 +2570 3 363.2292 410.5816 38.7142 0.2557 2569 +2571 3 364.2496 410.0748 38.4714 0.3067 2570 +2572 3 365.2483 409.5245 38.239 0.3706 2571 +2573 3 366.2081 408.9091 38.0111 0.4028 2572 +2574 3 367.1176 408.2204 37.7871 0.4355 2573 +2575 3 367.9676 407.4608 37.5715 0.3858 2574 +2576 3 368.7432 406.6234 37.382 0.3819 2575 +2577 3 369.4594 405.7333 37.2397 0.3605 2576 +2578 3 370.2144 404.8753 37.1622 0.4112 2577 +2579 3 371.0461 404.0905 37.1574 0.3949 2578 +2580 3 371.8698 403.2966 37.2347 0.3668 2579 +2581 3 372.634 402.4478 37.4058 0.2789 2580 +2582 3 373.4016 401.6058 37.6412 0.2891 2581 +2583 3 374.1738 400.7684 37.8988 0.244 2582 +2584 3 374.8144 399.8269 38.152 0.2735 2583 +2585 3 375.4116 398.8545 38.3779 0.2213 2584 +2586 3 376.0751 397.9255 38.5568 0.2048 2585 +2587 3 376.8336 397.071 38.6758 0.2252 2586 +2588 3 377.7854 396.4372 38.7307 0.2486 2587 +2589 3 378.7715 395.8595 38.7237 0.254 2588 +2590 3 379.7336 395.2394 38.6686 0.2213 2589 +2591 3 380.7175 394.6571 38.5784 0.2514 2590 +2592 3 381.7448 394.1549 38.4661 0.2026 2591 +2593 3 382.819 393.7659 38.3572 0.1729 2592 +2594 3 383.9241 393.4696 38.2802 0.1563 2593 +2595 3 384.9709 393.0098 38.2463 0.17 2594 +2596 3 385.9181 392.3691 38.2511 0.208 2595 +2597 3 386.6709 391.5077 38.285 0.2197 2596 +2598 3 387.0404 390.4266 38.3356 0.1862 2597 +2599 3 387.26 389.3043 38.3902 0.1623 2598 +2600 3 387.4659 388.1786 38.4392 0.1571 2599 +2601 3 387.673 387.0541 38.481 0.1864 2600 +2602 3 387.9464 385.9433 38.5182 0.1671 2601 +2603 3 388.2793 384.8485 38.5546 0.1501 2602 +2604 3 388.69 383.7811 38.5952 0.1374 2603 +2605 3 389.2426 382.7801 38.6439 0.1373 2604 +2606 3 389.8077 381.7848 38.7036 0.1373 2605 +2607 3 390.3603 380.7838 38.7764 0.1373 2606 +2608 3 390.9208 379.7874 38.8634 0.1373 2607 +2609 3 391.518 378.8127 38.9715 0.1373 2608 +2610 3 392.1518 377.8621 39.095 0.1373 2609 +2611 3 392.8347 376.9446 39.2193 0.1373 2610 +2612 3 393.4982 376.0145 39.3333 0.1373 2611 +2613 3 394.1286 375.0604 39.4293 0.1373 2612 +2614 3 394.8642 374.1852 39.5041 0.1373 2613 +2615 3 395.7485 373.4588 39.557 0.1373 2614 +2616 3 396.6488 372.7552 39.5942 0.1373 2615 +2617 3 397.564 372.0677 39.6234 0.1373 2616 +2618 3 398.4884 371.3927 39.6502 0.1373 2617 +2619 3 399.4219 370.7326 39.6802 0.1373 2618 +2620 3 400.3096 370.0108 39.7172 0.1373 2619 +2621 3 401.1116 369.1951 39.7642 0.1373 2620 +2622 3 401.9078 368.3737 39.8244 0.1373 2621 +2623 3 402.7029 367.5535 39.8997 0.1373 2622 +2624 3 403.4934 366.7264 39.9935 0.1373 2623 +2625 3 404.2747 365.8924 40.1094 0.1373 2624 +2626 3 405.0149 365.0218 40.2514 0.1373 2625 +2627 3 405.7219 364.1249 40.4197 0.1373 2626 +2628 3 406.5238 363.3127 40.6036 0.1373 2627 +2629 3 407.367 362.5428 40.7907 0.1372 2628 +2630 3 408.1861 361.7477 40.9811 0.1372 2629 +2631 3 408.9926 360.9412 41.1737 0.1371 2630 +2632 3 409.735 360.074 41.3504 0.1368 2631 +2633 3 410.4752 359.2034 41.4996 0.1364 2632 +2634 3 410.9294 358.1555 41.6186 0.1356 2633 +2635 3 411.3824 357.1053 41.7068 0.1342 2634 +2636 3 411.4945 355.967 41.7642 0.1313 2635 +2637 3 411.5517 354.8242 41.7967 0.1271 2636 +2638 3 411.5975 353.6813 41.8135 0.1144 2637 +2639 3 411.5975 352.5373 41.8236 0.1144 2638 +2640 3 339.6605 415.3933 42.4906 0.3459 2548 +2641 3 339.895 414.2893 42.812 0.3017 2640 +2642 3 340.0094 413.1602 43.1416 0.2202 2641 +2643 3 340.1364 412.031 43.4826 0.1788 2642 +2644 3 340.3594 410.9179 43.8113 0.1803 2643 +2645 3 340.6317 409.814 44.1104 0.2092 2644 +2646 3 340.8983 408.7066 44.3696 0.2892 2645 +2647 3 341.1316 407.59 44.5875 0.3279 2646 +2648 3 341.4051 406.4826 44.7754 0.3642 2647 +2649 3 341.5584 405.3524 44.9548 0.3913 2648 +2650 3 341.6087 404.213 45.141 0.3334 2649 +2651 3 341.651 403.0724 45.3407 0.3131 2650 +2652 3 341.7048 401.933 45.5557 0.3401 2651 +2653 3 341.8752 400.8073 45.789 0.3855 2652 +2654 3 342.2001 399.717 46.0449 0.3421 2653 +2655 3 342.5548 398.636 46.324 0.2738 2654 +2656 3 342.8797 397.5457 46.6242 0.2535 2655 +2657 3 343.2023 396.4555 46.9375 0.3293 2656 +2658 3 343.3842 395.3355 47.2464 0.4174 2657 +2659 3 343.3727 394.2007 47.5513 0.4336 2658 +2660 3 343.0547 393.1162 47.8548 0.4144 2659 +2661 3 342.7401 392.0236 48.1645 0.3891 2660 +2662 3 342.5868 390.8991 48.4929 0.3696 2661 +2663 3 342.4827 389.7688 48.8342 0.3148 2662 +2664 3 342.3683 388.6385 49.1694 0.3223 2663 +2665 3 342.2436 387.5094 49.4796 0.3949 2664 +2666 3 342.0777 386.3826 49.7591 0.442 2665 +2667 3 341.8272 385.2717 50.0144 0.3804 2666 +2668 3 341.6499 384.1449 50.2121 0.3999 2667 +2669 3 341.6087 383.0043 50.3401 0.398 2668 +2670 3 341.5732 381.8615 50.4185 0.3924 2669 +2671 3 341.436 380.7266 50.4672 0.3456 2670 +2672 3 341.1934 379.6089 50.4986 0.3369 2671 +2673 3 340.9715 378.4867 50.5215 0.3214 2672 +2674 3 340.8033 377.3553 50.5434 0.2529 2673 +2675 3 340.5699 376.2364 50.5711 0.2043 2674 +2676 3 340.2313 375.1439 50.6148 0.2135 2675 +2677 3 339.9476 374.0365 50.6892 0.2217 2676 +2678 3 339.8183 372.9028 50.8088 0.2426 2677 +2679 3 339.7188 371.7657 50.9835 0.3382 2678 +2680 3 339.4442 370.6606 51.2151 0.3537 2679 +2681 3 339.0839 369.5818 51.4956 0.3856 2680 +2682 3 338.9134 368.4595 51.7972 0.3102 2681 +2683 3 338.8963 367.3224 52.0864 0.3152 2682 +2684 3 338.8082 366.1875 52.3494 0.2728 2683 +2685 3 338.584 365.0698 52.5784 0.3263 2684 +2686 3 338.4181 363.9407 52.7652 0.2719 2685 +2687 3 338.3002 362.8047 52.9099 0.2607 2686 +2688 3 338.1458 361.6722 53.0194 0.2314 2687 +2689 3 337.9399 360.5476 53.1014 0.2801 2688 +2690 3 337.7019 359.4288 53.1639 0.2774 2689 +2691 3 337.5326 358.2985 53.2143 0.2634 2690 +2692 3 337.4583 357.1568 53.2627 0.2192 2691 +2693 3 337.3564 356.0174 53.3142 0.2255 2692 +2694 3 337.1746 354.8894 53.3705 0.2175 2693 +2695 3 336.9526 353.7671 53.4444 0.2455 2694 +2696 3 336.7719 352.638 53.5517 0.2806 2695 +2697 3 336.765 351.4974 53.6886 0.2487 2696 +2698 3 336.8897 350.3626 53.8401 0.2255 2697 +2699 3 336.9881 349.2243 53.9893 0.2684 2698 +2700 3 337.0224 348.0826 54.1223 0.2753 2699 +2701 3 336.956 346.942 54.236 0.2617 2700 +2702 3 336.7456 345.8186 54.3236 0.2164 2701 +2703 3 336.4607 344.7112 54.3794 0.2187 2702 +2704 3 336.1541 343.6096 54.4043 0.2171 2703 +2705 3 335.8246 342.5136 54.4062 0.1842 2704 +2706 3 335.486 341.4211 54.3948 0.1546 2705 +2707 3 335.144 340.3286 54.3766 0.1417 2706 +2708 3 334.7802 339.244 54.3609 0.1431 2707 +2709 3 334.3351 338.1916 54.3547 0.148 2708 +2710 3 333.8078 337.1757 54.3603 0.1575 2709 +2711 3 333.2895 336.1564 54.3785 0.1728 2710 +2712 3 332.8193 335.1131 54.4096 0.2121 2711 +2713 3 332.3846 334.056 54.4538 0.2329 2712 +2714 3 331.9785 332.9864 54.5132 0.2138 2713 +2715 3 331.6273 331.8984 54.5899 0.2185 2714 +2716 3 331.3733 330.7842 54.6862 0.2168 2715 +2717 3 331.1411 329.6653 54.8064 0.1835 2716 +2718 3 330.8688 328.5557 54.9578 0.1534 2717 +2719 3 330.5485 327.4597 55.1457 0.1395 2718 +2720 3 330.1687 326.3855 55.3638 0.139 2719 +2721 3 329.7626 325.3193 55.6046 0.1405 2720 +2722 3 329.3782 324.2474 55.8634 0.1432 2721 +2723 3 328.9778 323.1823 56.14 0.1483 2722 +2724 3 328.4607 322.1698 56.4312 0.1575 2723 +2725 3 327.8464 321.2123 56.7325 0.1758 2724 +2726 3 327.2355 320.2536 57.045 0.2043 2725 +2727 3 326.6967 319.2549 57.3843 0.2834 2726 +2728 3 326.1784 318.2459 57.7469 0.3043 2727 +2729 3 325.706 317.2129 58.079 0.3238 2728 +2730 3 325.333 316.1375 58.3629 0.2889 2729 +2731 3 324.9212 315.0748 58.6099 0.244 2730 +2732 3 324.483 314.0234 58.8482 0.2492 2731 +2733 3 324.0369 312.9744 59.0862 0.2666 2732 +2734 3 323.6239 311.9116 59.3253 0.2987 2733 +2735 3 323.2761 310.8271 59.5652 0.2538 2734 +2736 3 322.9077 309.7483 59.8055 0.2476 2735 +2737 3 322.3563 308.753 60.0538 0.2457 2736 +2738 3 321.5807 307.9236 60.3308 0.2332 2737 +2739 3 320.7398 307.1606 60.6628 0.2531 2738 +2740 3 319.915 306.3849 61.0579 0.2899 2739 +2741 3 318.9438 305.8221 61.5622 0.274 2740 +2742 3 317.8787 305.5006 62.1922 0.216 2741 +2743 3 317.15 304.6518 62.7819 0.2065 2742 +2744 3 316.5048 303.7331 63.301 0.1806 2743 +2745 3 315.633 303.0113 63.7218 0.1764 2744 +2746 3 314.8414 302.1956 64.0324 0.1812 2745 +2747 3 314.1275 301.3056 64.2312 0.2443 2746 +2748 3 313.702 300.2451 64.3406 0.209 2747 +2749 3 313.2695 299.1857 64.3966 0.1992 2748 +2750 3 312.7582 298.163 64.421 0.1398 2749 +2751 3 312.2468 297.1391 64.4311 0.1144 2750 +2752 3 334.4232 420.4497 41.2157 0.2377 10 +2753 3 334.0457 419.387 41.6668 0.2575 2752 +2754 3 333.2335 418.5999 42.0692 0.2859 2753 +2755 3 332.3045 417.9478 42.4203 0.4298 2754 +2756 3 331.2303 417.5772 42.747 0.4813 2755 +2757 3 330.9764 416.1758 43.1382 0.2613 2756 +2758 3 330.8597 415.0386 43.2426 0.2066 2757 +2759 3 330.6354 413.9175 43.2978 0.2239 2758 +2760 3 330.354 412.809 43.3171 0.3128 2759 +2761 3 330.0463 411.7073 43.3121 0.3758 2760 +2762 3 329.7237 410.6102 43.2986 0.403 2761 +2763 3 329.5269 409.4845 43.2866 0.4021 2762 +2764 3 329.3256 408.3577 43.2802 0.3907 2763 +2765 3 329.0155 407.2583 43.2793 0.3871 2764 +2766 3 328.5282 406.2241 43.2835 0.2959 2765 +2767 3 327.8567 405.3009 43.2925 0.2352 2766 +2768 3 327.2469 404.3342 43.3051 0.2587 2767 +2769 3 326.7401 403.3092 43.3222 0.2431 2768 +2770 3 326.2345 402.283 43.344 0.2663 2769 +2771 3 325.6648 401.2912 43.3717 0.2187 2770 +2772 3 325.1523 400.2684 43.4078 0.1914 2771 +2773 3 324.7873 399.1862 43.4538 0.1972 2772 +2774 3 324.491 398.0811 43.5106 0.1899 2773 +2775 3 324.2474 396.9646 43.5798 0.1879 2774 +2776 3 323.9694 395.8549 43.664 0.2173 2775 +2777 3 323.6788 394.7498 43.7693 0.2253 2776 +2778 3 323.3951 393.6424 43.8894 0.2759 2777 +2779 3 323.013 392.5659 44.0104 0.272 2778 +2780 3 322.56 391.5168 44.121 0.2426 2779 +2781 3 322.1435 390.4518 44.2126 0.2332 2780 +2782 3 321.7294 389.3856 44.2809 0.303 2781 +2783 3 321.202 388.372 44.3251 0.3518 2782 +2784 3 320.5374 387.4419 44.3509 0.3602 2783 +2785 3 319.8063 386.5622 44.3646 0.3041 2784 +2786 3 319.1314 385.639 44.3722 0.2937 2785 +2787 3 318.6029 384.6265 44.3772 0.4124 2786 +2788 3 318.1601 383.5718 44.3831 0.4436 2787 +2789 3 317.7071 382.5204 44.3946 0.4379 2788 +2790 3 317.2792 381.4599 44.4144 0.4135 2789 +2791 3 316.9006 380.3811 44.4472 0.4127 2790 +2792 3 316.5231 379.3012 44.4951 0.4003 2791 +2793 3 316.1318 378.2258 44.5556 0.4543 2792 +2794 3 315.752 377.1482 44.6214 0.4892 2793 +2795 3 315.3779 376.0671 44.6916 0.493 2794 +2796 3 315.0267 374.9792 44.772 0.4426 2795 +2797 3 314.7373 373.8729 44.8624 0.3862 2796 +2798 3 314.4513 372.7655 44.9565 0.3882 2797 +2799 3 314.1012 371.6776 45.0464 0.4235 2798 +2800 3 313.7248 370.5977 45.1321 0.3934 2799 +2801 3 313.3599 369.5143 45.2183 0.3882 2800 +2802 3 313.0064 368.4263 45.3071 0.3972 2801 +2803 3 312.7296 367.3178 45.3925 0.3571 2802 +2804 3 312.6174 366.1807 45.4717 0.2495 2803 +2805 3 312.5705 365.0378 45.5437 0.1766 2804 +2806 3 312.4916 363.8972 45.6092 0.1523 2805 +2807 3 312.4047 362.7567 45.67 0.1611 2806 +2808 3 312.2628 361.6218 45.7321 0.179 2807 +2809 3 311.9059 360.5373 45.8027 0.2269 2808 +2810 3 311.3236 359.5558 45.8858 0.244 2809 +2811 3 310.6967 358.6005 45.9889 0.3129 2810 +2812 3 310.2265 357.5606 46.1188 0.332 2811 +2813 3 309.8982 356.467 46.2697 0.3847 2812 +2814 3 309.6385 355.355 46.4335 0.347 2813 +2815 3 309.3651 354.2465 46.6004 0.306 2814 +2816 3 309.0219 353.1574 46.76 0.3453 2815 +2817 3 308.7164 352.0568 46.9087 0.4112 2816 +2818 3 308.4338 350.9495 47.0464 0.4063 2817 +2819 3 308.0895 349.8604 47.1685 0.366 2818 +2820 3 307.7749 348.761 47.2721 0.2806 2819 +2821 3 307.5061 347.649 47.3654 0.269 2820 +2822 3 307.2738 346.5302 47.4544 0.278 2821 +2823 3 306.9832 345.4239 47.5392 0.3186 2822 +2824 3 306.5062 344.3863 47.6216 0.2888 2823 +2825 3 305.8999 343.4185 47.7036 0.3225 2824 +2826 3 305.3096 342.4392 47.7868 0.3353 2825 +2827 3 304.8234 341.4051 47.8713 0.3239 2826 +2828 3 304.4642 340.3194 47.962 0.2335 2827 +2829 3 304.1919 339.2097 48.064 0.174 2828 +2830 3 303.8498 338.1184 48.1743 0.1513 2829 +2831 3 303.4048 337.0659 48.2835 0.1605 2830 +2832 3 302.8729 336.0546 48.3826 0.1757 2831 +2833 3 302.2723 335.0822 48.4652 0.2316 2832 +2834 3 301.7472 334.0663 48.5274 0.1997 2833 +2835 3 301.3433 332.9967 48.5691 0.1654 2834 +2836 3 300.8869 331.9476 48.5946 0.1393 2835 +2837 3 300.276 330.9809 48.6097 0.1374 2836 +2838 3 299.688 330.0005 48.6192 0.1375 2837 +2839 3 299.2544 328.9423 48.6262 0.1377 2838 +2840 3 298.8368 327.8784 48.634 0.1381 2839 +2841 3 298.2442 326.9014 48.6436 0.1386 2840 +2842 3 297.5681 325.9782 48.6564 0.1398 2841 +2843 3 296.9527 325.0138 48.673 0.1419 2842 +2844 3 296.4482 323.9888 48.6942 0.146 2843 +2845 3 296.1187 322.894 48.7231 0.1533 2844 +2846 3 295.9036 321.7706 48.7617 0.1679 2845 +2847 3 295.6439 320.6563 48.8107 0.1898 2846 +2848 3 295.3213 319.5592 48.8701 0.2556 2847 +2849 3 294.8969 318.4976 48.9479 0.2547 2848 +2850 3 294.4027 317.468 49.0563 0.2114 2849 +2851 3 293.8936 316.4441 49.1974 0.1789 2850 +2852 3 293.4291 315.4019 49.3637 0.1984 2851 +2853 3 293.11 314.306 49.5337 0.1916 2852 +2854 3 292.8709 313.1883 49.6857 0.1953 2853 +2855 3 292.6455 312.0683 49.8056 0.2161 2854 +2856 3 292.4991 310.9346 49.8907 0.3018 2855 +2857 3 292.4407 309.7929 49.9492 0.3462 2856 +2858 3 292.4156 308.6489 49.9943 0.3468 2857 +2859 3 292.3961 307.5049 50.0377 0.2731 2858 +2860 3 292.3767 306.3621 50.0861 0.2568 2859 +2861 3 292.316 305.2192 50.141 0.2728 2860 +2862 3 292.1753 304.0844 50.1962 0.2272 2861 +2863 3 291.9946 302.9552 50.2463 0.1926 2862 +2864 3 291.8069 301.8272 50.2869 0.1876 2863 +2865 3 291.6182 300.6981 50.3163 0.2346 2864 +2866 3 291.3825 299.5793 50.335 0.2841 2865 +2867 3 291.0748 298.4776 50.3454 0.2513 2866 +2868 3 290.7396 297.3839 50.3499 0.2354 2867 +2869 3 290.3987 296.2914 50.351 0.2767 2868 +2870 3 290.0566 295.2 50.3502 0.3518 2869 +2871 3 289.7157 294.1075 50.3479 0.4129 2870 +2872 3 289.3737 293.0162 50.3448 0.3611 2871 +2873 3 289.0327 291.9248 50.3406 0.386 2872 +2874 3 288.6907 290.8323 50.3353 0.4489 2873 +2875 3 288.3406 289.7432 50.3286 0.418 2874 +2876 3 287.9768 288.6587 50.3196 0.318 2875 +2877 3 287.6096 287.5753 50.3082 0.2912 2876 +2878 3 287.2412 286.4931 50.2942 0.3321 2877 +2879 3 286.85 285.4177 50.2771 0.3452 2878 +2880 3 286.3409 284.3938 50.2561 0.3727 2879 +2881 3 285.7712 283.402 50.2306 0.3869 2880 +2882 3 285.1912 282.4158 50.2018 0.3766 2881 +2883 3 284.6043 281.4343 50.1715 0.414 2882 +2884 3 283.9797 280.4756 50.1421 0.418 2883 +2885 3 283.3333 279.5318 50.1164 0.3259 2884 +2886 3 282.6847 278.5892 50.099 0.2882 2885 +2887 3 282.1676 277.5699 50.0982 0.3054 2886 +2888 3 281.7317 276.5117 50.1214 0.2851 2887 +2889 3 281.3119 275.4477 50.1729 0.3053 2888 +2890 3 280.8898 274.385 50.2524 0.371 2889 +2891 3 280.3406 273.384 50.3555 0.3757 2890 +2892 3 279.7046 272.4333 50.475 0.3073 2891 +2893 3 279.0502 271.4975 50.6064 0.2983 2892 +2894 3 278.3935 270.5617 50.7464 0.3438 2893 +2895 3 277.7952 269.5893 50.8987 0.382 2894 +2896 3 277.2392 268.5918 51.0695 0.3668 2895 +2897 3 276.6958 267.5885 51.261 0.4129 2896 +2898 3 276.1559 266.5829 51.4704 0.3336 2897 +2899 3 275.6743 265.5499 51.688 0.2425 2898 +2900 3 275.2201 264.5031 51.9025 0.1905 2899 +2901 3 274.7705 263.454 52.1032 0.2026 2900 +2902 3 274.3209 262.405 52.2841 0.2762 2901 +2903 3 274.171 261.2747 52.4401 0.3026 2902 +2904 3 274.1745 260.133 52.5694 0.2412 2903 +2905 3 274.1985 258.9902 52.6756 0.1919 2904 +2906 3 274.2877 257.8496 52.764 0.1992 2905 +2907 3 274.5829 256.7468 52.8422 0.1912 2906 +2908 3 274.9638 255.668 52.915 0.1954 2907 +2909 3 275.3539 254.5926 52.9852 0.2134 2908 +2910 3 275.7257 253.5115 53.0524 0.311 2909 +2911 3 275.8459 252.3756 53.111 0.2964 2910 +2912 3 275.8596 251.2316 53.1541 0.245 2911 +2913 3 275.8596 250.0876 53.1768 0.2163 2912 +2914 3 275.8596 248.9436 53.177 0.2749 2913 +2915 3 275.9145 247.8018 53.1535 0.2987 2914 +2916 3 276.0403 246.6647 53.1076 0.2333 2915 +2917 3 276.1879 245.531 53.0415 0.1804 2916 +2918 3 276.3378 244.3973 52.9609 0.1634 2917 +2919 3 276.4865 243.2636 52.8702 0.1956 2918 +2920 3 276.8171 242.1699 52.7758 0.1866 2919 +2921 3 277.2701 241.1197 52.684 0.1872 2920 +2922 3 277.7483 240.081 52.5986 0.198 2921 +2923 3 278.2311 239.0445 52.521 0.2849 2922 +2924 3 278.7745 238.0378 52.4482 0.2355 2923 +2925 3 279.3865 237.0723 52.3765 0.1895 2924 +2926 3 280.0192 236.1193 52.3046 0.1617 2925 +2927 3 280.6529 235.1675 52.246 0.1745 2926 +2928 3 281.3531 234.2637 52.1948 0.2305 2927 +2929 3 282.1184 233.4138 52.1469 0.1924 2928 +2930 3 282.9215 232.5992 52.1214 0.1541 2929 +2931 3 283.9259 232.0558 52.145 0.1159 2930 +2932 3 285.0242 231.8202 52.647 0.1144 2931 +2933 3 329.8793 417.6973 43.9236 0.5598 2756 +2934 3 328.7398 417.5978 43.9692 0.5747 2933 +2935 3 327.6096 417.425 44.0196 0.5663 2934 +2936 3 326.477 417.2683 44.1092 0.5019 2935 +2937 3 325.3353 417.2214 44.2688 0.3893 2936 +2938 3 324.2691 416.821 44.5096 0.2582 2937 +2939 3 323.5449 415.947 44.8263 0.2064 2938 +2940 3 322.8345 415.0638 45.2122 0.2098 2939 +2941 3 321.8884 414.4483 45.6627 0.3105 2940 +2942 3 321.3645 413.7265 46.1037 0.2767 2941 +2943 3 321.0361 412.6671 46.6816 0.2677 2942 +2944 3 320.8588 411.562 47.2525 0.2606 2943 +2945 3 320.5522 410.4844 47.808 0.2549 2944 +2946 3 320.1438 409.4387 48.3442 0.308 2945 +2947 3 319.8041 408.368 48.8642 0.3139 2946 +2948 3 319.629 407.2583 49.3727 0.3982 2947 +2949 3 319.4792 406.1429 49.8744 0.4447 2948 +2950 3 319.3041 405.0309 50.3776 0.4017 2949 +2951 3 319.2492 403.9086 50.8948 0.4519 2950 +2952 3 319.3613 402.7944 51.4416 0.4553 2951 +2953 3 319.5386 401.6904 52.0299 0.3876 2952 +2954 3 319.6553 400.583 52.6677 0.3326 2953 +2955 3 319.8635 399.4951 53.3602 0.2574 2954 +2956 3 320.3349 398.501 54.0963 0.2459 2955 +2957 3 321.043 397.6647 54.8727 0.2422 2956 +2958 3 321.6894 396.7827 55.6898 0.2279 2957 +2959 3 322.0326 395.7416 56.476 0.2361 2958 +2960 3 322.3609 394.6869 57.1942 0.3009 2959 +2961 3 322.8368 393.6824 57.8547 0.4064 2960 +2962 3 323.3733 392.7043 58.478 0.4687 2961 +2963 3 323.9087 391.725 59.0906 0.3679 2962 +2964 3 324.4693 390.7584 59.6957 0.3211 2963 +2965 3 325.0836 389.826 60.2977 0.3367 2964 +2966 3 325.8421 389.0069 60.8989 0.3617 2965 +2967 3 326.4976 388.1031 61.4989 0.3516 2966 +2968 3 326.8465 387.0438 62.0878 0.277 2967 +2969 3 327.0147 385.9364 62.6508 0.2808 2968 +2970 3 326.9255 384.8199 63.201 0.2381 2969 +2971 3 326.5971 383.7514 63.7734 0.2265 2970 +2972 3 326.2402 382.6932 64.3852 0.2901 2971 +2973 3 326.0915 381.5881 65.0012 0.2416 2972 +2974 3 325.945 380.4795 65.5948 0.1997 2973 +2975 3 325.7757 379.371 66.1444 0.1932 2974 +2976 3 325.7769 378.2464 66.6478 0.1796 2975 +2977 3 325.9748 377.1368 67.1146 0.1703 2976 +2978 3 326.1853 376.0271 67.5595 0.1861 2977 +2979 3 326.3695 374.9128 68.007 0.1682 2978 +2980 3 326.4827 373.7906 68.4746 0.1514 2979 +2981 3 326.4965 372.6649 68.9629 0.139 2980 +2982 3 326.4965 371.5392 69.4616 0.1394 2981 +2983 3 326.4862 370.4169 70.0031 0.1413 2982 +2984 3 326.3386 369.3107 70.6224 0.1448 2983 +2985 3 326.0308 368.2433 71.2818 0.1511 2984 +2986 3 325.6293 367.2068 71.9505 0.1642 2985 +2987 3 325.317 366.1406 72.6124 0.1821 2986 +2988 3 325.3433 365.0275 73.2561 0.2459 2987 +2989 3 325.3891 363.9133 73.8713 0.2153 2988 +2990 3 325.2575 362.8013 74.4416 0.1955 2989 +2991 3 325.4531 361.6916 74.9311 0.2081 2990 +2992 3 325.5847 360.5682 75.3444 0.2193 2991 +2993 3 325.4348 359.4437 75.7056 0.1852 2992 +2994 3 325.2198 358.3283 76.0427 0.1606 2993 +2995 3 324.9097 357.2357 76.3694 0.154 2994 +2996 3 324.5311 356.165 76.7024 0.1806 2995 +2997 3 323.9968 355.1651 77.0675 0.1563 2996 +2998 3 323.7703 354.0531 77.4172 0.1269 2997 +2999 3 323.291 353.0418 77.9957 0.1144 2998 +3000 3 320.9927 414.6565 46.2518 0.1191 2941 +3001 3 319.9596 414.8487 47.3564 0.1551 3000 +3002 3 318.8488 415.0306 47.8411 0.1696 3001 +3003 3 317.7426 415.24 48.342 0.2108 3002 +3004 3 316.7015 415.661 48.8698 0.2078 3003 +3005 3 315.9167 416.4595 49.4217 0.2509 3004 +3006 3 315.1628 417.2912 49.9579 0.2013 3005 +3007 3 314.4593 418.1709 50.451 0.1711 3006 +3008 3 313.8095 419.0941 50.9046 0.1528 3007 +3009 3 313.1666 420.0265 51.2943 0.1668 3008 +3010 3 312.1965 420.6179 51.6043 0.1881 3009 +3011 3 311.1291 421.0195 51.8283 0.25 3010 +3012 3 310.0583 421.4176 51.973 0.2543 3011 +3013 3 308.991 421.8283 52.0752 0.4576 3012 +3014 3 333.6956 425.0326 37.5542 0.3593 5 +3015 3 333.2072 424.0064 37.27 0.2705 3014 +3016 3 333.142 422.8716 37.0135 0.2917 3015 +3017 3 333.317 421.7448 36.7979 0.3907 3016 +3018 3 333.5424 420.6259 36.6358 0.421 3017 +3019 3 333.7014 419.4934 36.5263 0.3286 3018 +3020 3 333.5904 418.3562 36.4482 0.2995 3019 +3021 3 333.2106 417.2786 36.3647 0.3238 3020 +3022 3 332.793 416.2147 36.2639 0.3441 3021 +3023 3 332.3778 415.1496 36.1483 0.2849 3022 +3024 3 331.8069 414.1589 36.0326 0.3037 3023 +3025 3 331.1502 413.2231 35.9369 0.2708 3024 +3026 3 330.7258 412.1615 35.8795 0.3227 3025 +3027 3 330.4661 411.0484 35.863 0.3188 3026 +3028 3 330.0829 409.9696 35.8672 0.3529 3027 +3029 3 329.5361 408.9651 35.8621 0.3213 3028 +3030 3 328.9869 407.9618 35.8243 0.3855 3029 +3031 3 328.4973 406.9277 35.7577 0.4722 3030 +3032 3 328.0512 405.8752 35.6678 0.4542 3031 +3033 3 327.5878 404.8296 35.5625 0.3782 3032 +3034 3 327.3922 403.7039 35.4558 0.4359 3033 +3035 3 327.1451 402.5873 35.3724 0.4893 3034 +3036 3 326.8076 401.4948 35.3251 0.5116 3035 +3037 3 326.3317 400.4549 35.3038 0.4697 3036 +3038 3 325.7826 399.4516 35.2794 0.451 3037 +3039 3 325.6476 398.3156 35.2209 0.4703 3038 +3040 3 325.2586 396.8776 35.0974 0.4141 3039 +3041 3 324.8354 395.816 35.0244 0.4062 3040 +3042 3 324.34 394.7852 34.9709 0.4053 3041 +3043 3 323.9167 393.7225 34.9535 0.4874 3042 +3044 3 323.5175 392.6505 34.9642 0.5587 3043 +3045 3 323.0359 391.6129 34.9958 0.5785 3044 +3046 3 322.5119 390.5971 35.0577 0.4835 3045 +3047 3 322.0326 389.5583 35.1439 0.4716 3046 +3048 3 321.6848 388.4704 35.2405 0.4683 3047 +3049 3 321.3382 387.3801 35.3424 0.4368 3048 +3050 3 321.0442 386.2762 35.4452 0.3959 3049 +3051 3 320.8119 385.1562 35.5258 0.3323 3050 +3052 3 320.3623 384.106 35.562 0.3777 3051 +3053 3 319.6771 383.192 35.5438 0.4336 3052 +3054 3 318.9575 382.3031 35.4813 0.5122 3053 +3055 3 318.3397 381.3421 35.3909 0.5494 3054 +3056 3 317.7311 380.3743 35.287 0.5904 3055 +3057 3 317.0688 379.4431 35.1812 0.555 3056 +3058 3 316.3549 378.5496 35.0851 0.5843 3057 +3059 3 315.5724 377.7156 35.0053 0.5862 3058 +3060 3 314.8448 376.8336 34.9373 0.5441 3059 +3061 3 314.3186 375.8189 34.8726 0.4515 3060 +3062 3 313.9502 374.7378 34.8006 0.4474 3061 +3063 3 313.5555 373.6647 34.7057 0.5019 3062 +3064 3 313.1563 372.5939 34.5873 0.5654 3063 +3065 3 312.7742 371.5163 34.4582 0.5498 3064 +3066 3 312.4756 370.4135 34.3274 0.4963 3065 +3067 3 312.1541 369.3175 34.1956 0.4849 3066 +3068 3 311.8533 368.2147 34.0878 0.4744 3067 +3069 3 311.5695 367.1062 34.0203 0.424 3068 +3070 3 311.1932 366.0262 33.9892 0.3716 3069 +3071 3 310.882 364.9257 33.9842 0.2889 3070 +3072 3 310.4953 363.8492 34.0015 0.2942 3071 +3073 3 309.9531 362.8425 34.05 0.3113 3072 +3074 3 309.6122 361.7522 34.141 0.4517 3073 +3075 3 309.4955 360.6163 34.2768 0.5207 3074 +3076 3 309.2918 359.4928 34.4333 0.3739 3075 +3077 3 309.0985 358.366 34.5828 0.2781 3076 +3078 3 308.9063 357.2392 34.7091 0.2163 3077 +3079 3 308.6787 356.1192 34.8043 0.2345 3078 +3080 3 308.435 355.0015 34.8625 0.3105 3079 +3081 3 308.1387 353.8975 34.8841 0.3751 3080 +3082 3 307.8069 352.8016 34.8748 0.3108 3081 +3083 3 307.3859 351.7388 34.8387 0.2909 3082 +3084 3 306.7213 350.8087 34.7738 0.3086 3083 +3085 3 305.8759 350.04 34.6758 0.3147 3084 +3086 3 305.0716 349.2289 34.5517 0.2365 3085 +3087 3 304.5042 348.237 34.4165 0.1848 3086 +3088 3 304.0283 347.1983 34.2818 0.1891 3087 +3089 3 303.5524 346.1595 34.1527 0.1719 3088 +3090 3 303.2286 345.0636 34.0318 0.1588 3089 +3091 3 303.0193 343.9402 33.9189 0.1537 3090 +3092 3 302.7058 342.8408 33.8047 0.1647 3091 +3093 3 302.3786 341.746 33.6602 0.2005 3092 +3094 3 302.2528 340.6123 33.4636 0.1952 3093 +3095 3 302.1968 339.474 33.224 0.1966 3094 +3096 3 302.0423 338.346 32.9546 0.2494 3095 +3097 3 301.8032 337.234 32.6631 0.2198 3096 +3098 3 301.579 336.1186 32.3674 0.2179 3097 +3099 3 301.1271 335.0742 32.0883 0.1779 3098 +3100 3 300.4522 334.1578 31.8147 0.1702 3099 +3101 3 299.7795 333.2392 31.5389 0.1726 3100 +3102 3 299.2979 332.2062 31.2886 0.2128 3101 +3103 3 298.8162 331.172 31.0786 0.2286 3102 +3104 3 298.4913 329.8003 29.969 0.1393 3103 +3105 3 298.0234 328.7616 29.7769 0.1438 3104 +3106 3 297.2318 327.9425 29.6422 0.1499 3105 +3107 3 296.7227 326.922 29.5476 0.1582 3106 +3108 3 296.5545 325.7929 29.4921 0.1883 3107 +3109 3 296.2388 324.6947 29.4728 0.1729 3108 +3110 3 295.8064 323.6353 29.4888 0.1603 3109 +3111 3 295.3579 322.584 29.5176 0.1555 3110 +3112 3 294.8443 321.5612 29.5571 0.1711 3111 +3113 3 294.286 320.5625 29.6094 0.1955 3112 +3114 3 293.7826 319.5364 29.6769 0.2666 3113 +3115 3 293.3559 318.4759 29.7648 0.2723 3114 +3116 3 292.9475 317.4074 29.8777 0.2375 3115 +3117 3 292.5437 316.3389 30.0196 0.2557 3116 +3118 3 292.1707 315.2601 30.1944 0.2127 3117 +3119 3 291.76 314.1962 30.4094 0.1899 3118 +3120 3 291.2166 313.1963 30.6855 0.1869 3119 +3121 3 290.6172 312.2308 31.0131 0.2245 3120 +3122 3 290.036 311.2549 31.36 0.317 3121 +3123 3 289.4869 310.262 31.7027 0.3844 3122 +3124 3 288.8337 309.3319 32.0258 0.3401 3123 +3125 3 288.1461 308.4247 32.3042 0.2758 3124 +3126 3 287.6016 307.4225 32.506 0.2855 3125 +3127 3 287.1257 306.3826 32.62 0.3627 3126 +3128 3 286.6532 305.3416 32.6572 0.336 3127 +3129 3 286.1144 304.3326 32.6292 0.3186 3128 +3130 3 285.4978 303.3694 32.5466 0.2367 3129 +3131 3 284.8549 302.4244 32.44 0.2135 3130 +3132 3 284.2039 301.484 32.342 0.2272 3131 +3133 3 283.5187 300.5688 32.2582 0.3225 3132 +3134 3 282.8849 299.617 32.1874 0.3902 3133 +3135 3 282.2969 298.6355 32.1149 0.3622 3134 +3136 3 281.5762 297.7477 32.0337 0.2561 3135 +3137 3 280.6083 297.1403 31.9452 0.2036 3136 +3138 3 279.5089 296.8257 31.8545 0.2034 3137 +3139 3 278.4176 296.4848 31.7562 0.3051 3138 +3140 3 277.4989 295.8041 31.6504 0.2288 3139 +3141 3 298.751 330.5531 30.9378 0.2035 3103 +3142 3 298.6286 329.4171 30.8148 0.1998 3141 +3143 3 298.4902 328.2811 30.7549 0.1705 3142 +3144 3 298.322 327.1497 30.744 0.1529 3143 +3145 3 298.0989 326.0286 30.7714 0.1412 3144 +3146 3 297.7786 324.9303 30.83 0.1426 3145 +3147 3 297.4171 323.8458 30.9168 0.1472 3146 +3148 3 297.1414 322.7373 31.0316 0.1553 3147 +3149 3 296.9687 321.6081 31.1749 0.1717 3148 +3150 3 296.8085 320.4779 31.353 0.1969 3149 +3151 3 296.6175 319.3533 31.5745 0.2686 3150 +3152 3 296.455 318.2265 31.8368 0.2807 3151 +3153 3 296.2754 317.1019 32.1289 0.2576 3152 +3154 3 296.0066 315.998 32.4374 0.275 3153 +3155 3 295.6462 314.9192 32.7482 0.3237 3154 +3156 3 295.1795 313.8839 33.0613 0.3594 3155 +3157 3 294.6727 312.8657 33.3794 0.2666 3156 +3158 3 294.0824 311.8944 33.6815 0.1948 3157 +3159 3 293.6076 310.8614 33.9606 0.1665 3158 +3160 3 293.325 309.7586 34.2238 0.1852 3159 +3161 3 293.1363 308.6352 34.4817 0.2328 3160 +3162 3 292.9853 307.5072 34.7449 0.2814 3161 +3163 3 292.8434 306.3769 35.0246 0.2454 3162 +3164 3 292.4922 305.297 35.3321 0.2368 3163 +3165 3 291.9454 304.304 35.6678 0.2147 3164 +3166 3 291.1869 303.4632 36.0304 0.2287 3165 +3167 3 290.2843 302.7802 36.4235 0.3072 3166 +3168 3 289.3359 302.167 36.8665 0.3286 3167 +3169 3 288.3692 301.5893 37.3554 0.4458 3168 +3170 3 287.3968 301.0264 37.8759 0.4617 3169 +3171 3 286.3466 300.634 38.4314 0.4112 3170 +3172 3 285.2461 300.4476 39.0309 0.312 3171 +3173 3 284.1639 300.1925 39.6855 0.2376 3172 +3174 3 283.2761 299.5358 40.3785 0.2207 3173 +3175 3 282.4319 298.8162 41.0662 0.3053 3174 +3176 3 281.4457 298.3014 41.7192 0.2658 3175 +3177 3 280.4253 297.8438 42.306 0.2417 3176 +3178 3 279.5272 297.1654 42.8064 0.2917 3177 +3179 3 278.6876 296.407 43.2107 0.2674 3178 +3180 3 278.8729 295.3465 44.0843 0.1144 3179 +3181 3 326.0308 397.6887 33.108 0.1553 3039 +3182 3 326.4873 396.801 31.8926 0.2005 3181 +3183 3 326.6978 395.7336 31.1094 0.2615 3182 +3184 3 326.6658 394.632 30.3962 0.3384 3183 +3185 3 326.6921 393.5234 29.724 0.3871 3184 +3186 3 326.9506 392.4469 29.087 0.4273 3185 +3187 3 327.3579 391.4059 28.5046 0.348 3186 +3188 3 327.7571 390.3568 27.9584 0.2681 3187 +3189 3 328.0706 389.2803 27.4204 0.2563 3188 +3190 3 328.3166 388.1867 26.8652 0.3172 3189 +3191 3 328.6277 387.1124 26.2807 0.2945 3190 +3192 3 329.1116 386.1092 25.686 0.268 3191 +3193 3 329.6379 385.1219 25.1023 0.2418 3192 +3194 3 329.8301 384.0362 24.535 0.2858 3193 +3195 3 329.7855 382.9162 23.9994 0.2937 3194 +3196 3 330.1218 381.8729 23.4497 0.3404 3195 +3197 3 330.7281 380.9314 22.9046 0.4049 3196 +3198 3 331.1663 379.9041 22.3738 0.3427 3197 +3199 3 331.4751 378.823 21.8653 0.2765 3198 +3200 3 331.9762 377.8197 21.3718 0.2945 3199 +3201 3 332.5688 376.8622 20.8858 0.3252 3200 +3202 3 332.8491 375.788 20.3765 0.3468 3201 +3203 3 332.7827 374.6783 19.8125 0.4225 3202 +3204 3 332.1764 373.85 18.8416 0.3435 3203 +3205 3 331.4202 373.1328 17.6898 0.2081 3204 +3206 3 330.7212 372.3709 16.5553 0.1255 3205 +3207 3 330.1607 371.7611 14.6233 0.1144 3206 +3208 3 334.4953 426.1423 38.7652 0.3512 5 +3209 3 335.0822 425.163 38.5907 0.3931 3208 +3210 3 335.621 424.1563 38.4289 0.3953 3209 +3211 3 336.2662 423.2136 38.2956 0.2996 3210 +3212 3 336.9858 422.3236 38.2024 0.2612 3211 +3213 3 337.5681 421.3398 38.1595 0.3019 3212 +3214 3 337.9021 420.2461 38.1755 0.4082 3213 +3215 3 338.1412 419.1273 38.2435 0.4646 3214 +3216 3 338.3323 418.0004 38.3407 0.3452 3215 +3217 3 338.3426 416.8576 38.4364 0.2919 3216 +3218 3 338.1286 415.7342 38.5126 0.2808 3217 +3219 3 337.9742 414.6005 38.5557 0.2948 3218 +3220 3 337.9239 413.4576 38.5792 0.3826 3219 +3221 3 337.8346 412.317 38.5997 0.4745 3220 +3222 3 337.4708 411.2325 38.6238 0.5355 3221 +3223 3 337.0521 410.1686 38.656 0.4937 3222 +3224 3 336.6323 409.1047 38.701 0.3684 3223 +3225 3 336.193 408.0488 38.757 0.3643 3224 +3226 3 335.8498 406.9574 38.7996 0.3875 3225 +3227 3 335.748 405.818 38.7999 0.3991 3226 +3228 3 336.0351 404.7106 38.7691 0.4606 3227 +3229 3 336.1141 403.57 38.7282 0.495 3228 +3230 3 336.1667 402.4272 38.6848 0.4864 3229 +3231 3 336.4698 401.3244 38.6467 0.4795 3230 +3232 3 336.8359 400.2398 38.6224 0.5368 3231 +3233 3 337.2958 399.1931 38.6128 0.5315 3232 +3234 3 337.5052 398.0674 38.6112 0.4907 3233 +3235 3 337.6653 396.9348 38.6114 0.4513 3234 +3236 3 338.2968 395.9807 38.6123 0.5448 3235 +3237 3 338.9649 395.0529 38.6126 0.5969 3236 +3238 3 339.6101 394.108 38.61 0.5963 3237 +3239 3 340.149 392.2513 36.8449 0.6527 3238 +3240 3 340.245 391.1222 36.4879 0.5513 3239 +3241 3 340.4075 389.9999 36.1164 0.4477 3240 +3242 3 340.7541 388.9234 35.7162 0.3847 3241 +3243 3 341.1259 387.8538 35.3111 0.3258 3242 +3244 3 341.4131 386.7589 34.9146 0.2971 3243 +3245 3 341.619 385.6447 34.5358 0.3048 3244 +3246 3 341.9427 384.5579 34.1636 0.2621 3245 +3247 3 342.5182 383.5809 33.8089 0.2497 3246 +3248 3 343.2503 382.7126 33.4849 0.3344 3247 +3249 3 343.891 381.7722 33.1962 0.3164 3248 +3250 3 344.249 380.6935 32.9409 0.3722 3249 +3251 3 344.4664 379.5735 32.7141 0.3464 3250 +3252 3 344.8199 378.4901 32.506 0.2759 3251 +3253 3 345.353 377.4811 32.3019 0.231 3252 +3254 3 345.8495 376.4549 32.0841 0.2817 3253 +3255 3 346.1652 375.3601 31.8318 0.2958 3254 +3256 3 346.5805 374.3019 31.5322 0.2932 3255 +3257 3 347.2738 373.4062 31.173 0.3004 3256 +3258 3 347.8664 372.4406 30.774 0.2493 3257 +3259 3 348.3434 371.4156 30.3545 0.2456 3258 +3260 3 348.9898 370.4878 29.9312 0.239 3259 +3261 3 349.6785 369.5909 29.5201 0.2342 3260 +3262 3 350.3878 368.7078 29.1259 0.1901 3261 +3263 3 351.1828 367.9012 28.7328 0.1682 3262 +3264 3 352.1038 367.2446 28.3296 0.1673 3263 +3265 3 353.0624 366.6428 27.9136 0.205 3264 +3266 3 353.9364 365.9267 27.4794 0.2004 3265 +3267 3 354.7361 365.1339 26.9768 0.2252 3266 +3268 3 355.7371 364.6271 26.4447 0.2103 3267 +3269 3 356.8033 364.2725 25.9305 0.2549 3268 +3270 3 357.6224 363.498 25.453 0.2087 3269 +3271 3 358.4415 362.7178 25.0294 0.1836 3270 +3272 3 359.319 362.0005 24.6862 0.1864 3271 +3273 3 359.6679 360.916 24.4309 0.1776 3272 +3274 3 360.36 360.0168 24.08 0.1144 3273 +3275 3 339.6708 393.0418 38.619 0.4735 3238 +3276 3 339.6387 391.9001 38.635 0.4068 3275 +3277 3 339.4637 390.7721 38.663 0.3493 3276 +3278 3 339.2097 389.6567 38.7092 0.3081 3277 +3279 3 339.0656 388.5287 38.7699 0.2746 3278 +3280 3 339.1937 387.4019 38.8335 0.3348 3279 +3281 3 339.4843 386.2968 38.8965 0.3784 3280 +3282 3 339.7245 385.1802 38.9631 0.395 3281 +3283 3 339.9407 384.058 39.0328 0.39 3282 +3284 3 340.2634 382.962 39.1068 0.3238 3283 +3285 3 340.6249 381.8775 39.1933 0.3096 3284 +3286 3 340.817 380.761 39.3047 0.3308 3285 +3287 3 340.7004 379.6353 39.4436 0.3649 3286 +3288 3 340.4464 378.521 39.601 0.3974 3287 +3289 3 340.316 377.3919 39.769 0.423 3288 +3290 3 340.3869 376.257 39.9462 0.4161 3289 +3291 3 340.5619 375.129 40.1321 0.3653 3290 +3292 3 340.6981 373.9965 40.3197 0.3085 3291 +3293 3 340.7621 372.8571 40.5056 0.3243 3292 +3294 3 340.8571 371.7211 40.6963 0.3494 3293 +3295 3 341.0275 370.5931 40.8929 0.3503 3294 +3296 3 341.2094 369.4662 41.0883 0.3259 3295 +3297 3 341.3925 368.3394 41.2692 0.3309 3296 +3298 3 341.5458 367.208 41.4221 0.38 3297 +3299 3 341.6522 366.0697 41.536 0.3879 3298 +3300 3 341.7826 364.9337 41.6021 0.3332 3299 +3301 3 341.9199 363.7989 41.6195 0.2536 3300 +3302 3 341.9359 362.6583 41.6027 0.2071 3301 +3303 3 341.8558 361.5177 41.5668 0.2185 3302 +3304 3 341.8752 360.3783 41.5145 0.2603 3303 +3305 3 342.0297 359.2457 41.4476 0.2543 3304 +3306 3 342.159 358.1109 41.3731 0.2201 3305 +3307 3 342.1956 356.968 41.302 0.2252 3306 +3308 3 342.2276 355.8252 41.2462 0.2465 3307 +3309 3 342.1967 354.6835 41.214 0.3065 3308 +3310 3 341.9519 353.5738 41.2026 0.3383 3309 +3311 3 341.5526 352.503 41.2012 0.2861 3310 +3312 3 341.1488 351.4334 41.2017 0.2185 3311 +3313 3 340.8594 350.3294 41.1998 0.2026 3312 +3314 3 340.7232 349.1957 41.1947 0.214 3313 +3315 3 340.6489 348.054 41.1858 0.1971 3314 +3316 3 340.5253 346.9169 41.1687 0.1671 3315 +3317 3 340.3446 345.7877 41.1387 0.1527 3316 +3318 3 340.157 344.6597 41.0978 0.1551 3317 +3319 3 340.006 343.526 41.0533 0.1771 3318 +3320 3 339.935 342.3855 41.0152 0.1784 3319 +3321 3 339.9568 341.2426 40.9928 0.1635 3320 +3322 3 340.0197 340.0998 40.9948 0.1549 3321 +3323 3 340.0643 338.9569 41.025 0.1613 3322 +3324 3 340.046 337.814 41.0836 0.179 3323 +3325 3 339.9018 336.6826 41.1715 0.2285 3324 +3326 3 339.6021 335.5821 41.288 0.2404 3325 +3327 3 339.1914 334.517 41.4266 0.2263 3326 +3328 3 338.7098 333.4817 41.5764 0.2534 3327 +3329 3 338.1538 332.4842 41.7253 0.2747 3328 +3330 3 337.5235 331.5323 41.8642 0.2563 3329 +3331 3 336.8531 330.6068 41.9899 0.2596 3330 +3332 3 336.2022 329.6676 42.1011 0.2549 3331 +3333 3 335.6267 328.6815 42.1935 0.2131 3332 +3334 3 335.1474 327.6439 42.2584 0.1672 3333 +3335 3 334.7573 326.5697 42.2864 0.1448 3334 +3336 3 334.429 325.4737 42.2696 0.1426 3335 +3337 3 334.1235 324.372 42.2013 0.1472 3336 +3338 3 333.8329 323.2669 42.0773 0.1556 3337 +3339 3 333.5973 322.1504 41.9012 0.1718 3338 +3340 3 333.4371 321.0213 41.685 0.199 3339 +3341 3 333.2724 319.8944 41.4464 0.2635 3340 +3342 3 333.0195 318.7836 41.2056 0.3153 3341 +3343 3 332.6386 317.7117 40.9794 0.2961 3342 +3344 3 332.1169 316.7004 40.7784 0.2798 3343 +3345 3 331.5243 315.7234 40.6048 0.2921 3344 +3346 3 330.9535 314.7338 40.4538 0.3432 3345 +3347 3 330.5085 313.6859 40.3164 0.3402 3346 +3348 3 330.2705 312.574 40.1848 0.2886 3347 +3349 3 330.1984 311.4346 40.0546 0.2866 3348 +3350 3 330.2225 310.2928 39.9266 0.2847 3349 +3351 3 330.306 309.1534 39.8062 0.3152 3350 +3352 3 330.4261 308.0163 39.6998 0.3568 3351 +3353 3 330.4513 306.8757 39.611 0.3185 3352 +3354 3 330.3369 305.7397 39.5416 0.2733 3353 +3355 3 330.2293 304.6014 39.4904 0.2552 3354 +3356 3 330.2396 303.4597 39.4531 0.2454 3355 +3357 3 330.3712 302.3249 39.4299 0.2646 3356 +3358 3 330.5016 301.1877 39.4274 0.311 3357 +3359 3 330.4661 300.0495 39.4582 0.3417 3358 +3360 3 330.2534 298.9283 39.5368 0.3192 3359 +3361 3 330.0188 297.8095 39.6617 0.2811 3360 +3362 3 329.8472 296.6804 39.816 0.2415 3361 +3363 3 329.7397 295.5444 39.9778 0.2474 3362 +3364 3 329.6859 294.4038 40.1282 0.2624 3363 +3365 3 329.607 293.2633 40.2539 0.3297 3364 +3366 3 329.4411 292.133 40.3502 0.3888 3365 +3367 3 329.1917 291.0176 40.4194 0.487 3366 +3368 3 328.8691 289.9205 40.4664 0.5509 3367 +3369 3 328.4836 288.844 40.4933 0.5236 3368 +3370 3 328.0351 287.7926 40.495 0.4699 3369 +3371 3 327.5707 286.747 40.4659 0.4544 3370 +3372 3 327.1932 285.6682 40.4093 0.4409 3371 +3373 3 326.8728 284.5711 40.3211 0.3984 3372 +3374 3 326.334 283.577 40.1822 0.453 3373 +3375 3 325.5755 282.7293 39.9955 0.5107 3374 +3376 3 324.8251 281.8713 39.7813 0.4757 3375 +3377 3 324.2439 280.8955 39.5674 0.3701 3376 +3378 3 323.7371 279.8739 39.3812 0.3647 3377 +3379 3 323.0862 278.9392 39.2417 0.356 3378 +3380 3 322.3163 278.095 39.1588 0.3525 3379 +3381 3 321.5258 277.2678 39.1222 0.3767 3380 +3382 3 320.7604 276.419 39.1098 0.414 3381 +3383 3 320.0534 275.5198 39.0995 0.4594 3382 +3384 3 319.4334 274.56 39.0827 0.4563 3383 +3385 3 318.8706 273.5647 39.0659 0.4697 3384 +3386 3 318.2814 272.5843 39.0592 0.3833 3385 +3387 3 317.6751 271.6131 39.0734 0.3489 3386 +3388 3 317.1179 270.6155 39.1213 0.3373 3387 +3389 3 316.6054 269.5939 39.2148 0.2975 3388 +3390 3 316.1593 268.5426 39.3688 0.3129 3389 +3391 3 315.7543 267.4764 39.5898 0.2617 3390 +3392 3 314.9512 266.719 39.8835 0.2137 3391 +3393 3 313.8553 266.5154 40.2254 0.2067 3392 +3394 3 312.7238 266.4673 40.6216 0.2151 3393 +3395 3 311.7583 265.9411 41.1821 0.1818 3394 +3396 3 311.5169 264.8703 41.8312 0.1503 3395 +3397 3 311.3522 263.7652 42.4306 0.1381 3396 +3398 3 311.3304 262.6418 42.9584 0.1389 3397 +3399 3 311.3304 261.5115 43.3857 0.1403 3398 +3400 3 311.3304 260.3744 43.6979 0.1428 3399 +3401 3 311.3304 259.2327 43.8931 0.1472 3400 +3402 3 311.3304 258.0898 43.9995 0.1567 3401 +3403 3 311.4323 256.9504 44.053 0.1681 3402 +3404 3 311.5741 255.8156 44.0756 0.2203 3403 +3405 3 311.7858 254.691 44.0829 0.1652 3404 +3406 3 312.2468 253.6442 44.0843 0.1144 3405 +3407 3 331.2097 436.6351 28.0591 0.3163 1 +3408 3 331.1365 435.6249 26.8599 0.1752 3407 +3409 3 331.1308 434.5392 25.982 0.2455 3408 +3410 3 330.4009 433.8963 25.1547 0.244 3409 +3411 3 329.9216 432.9113 24.5706 0.2695 3410 +3412 3 329.6894 431.8085 24.1167 0.2199 3411 +3413 3 329.464 430.6988 23.7184 0.1994 3412 +3414 3 329.083 429.6326 23.3356 0.2009 3413 +3415 3 328.5888 428.6133 22.9526 0.2576 3414 +3416 3 328.1438 427.5711 22.5711 0.3296 3415 +3417 3 327.6313 426.561 22.1869 0.3299 3416 +3418 3 327.0353 425.5977 21.798 0.423 3417 +3419 3 326.4312 424.6402 21.3942 0.4113 3418 +3420 3 325.8409 423.677 20.9629 0.3743 3419 +3421 3 325.5103 422.6028 20.4719 0.2837 3420 +3422 3 324.991 421.5995 20.043 0.2129 3421 +3423 3 324.3823 420.6396 19.7173 0.1841 3422 +3424 3 323.7051 419.721 19.5024 0.2113 3423 +3425 3 323.1606 418.7166 19.4059 0.216 3424 +3426 3 322.8528 417.6218 19.6888 0.2288 3425 +3427 3 327.303 442.4729 37.4587 0.1206 1 +3428 3 326.1727 442.6514 37.4875 0.2078 3427 +3429 3 325.0459 442.847 37.5245 0.2742 3428 +3430 3 323.9476 443.1673 37.5757 0.3627 3429 +3431 3 322.8562 442.8264 37.6194 0.3526 3430 +3432 3 321.7637 442.4855 37.6387 0.2624 3431 +3433 3 321.3016 442.4283 38.2166 0.1186 3432 +3434 3 320.1736 442.3322 38.6033 0.178 3433 +3435 3 319.0502 442.1263 38.7545 0.2152 3434 +3436 3 318.016 441.6412 38.9141 0.276 3435 +3437 3 317.2541 440.7935 39.0967 0.4238 3436 +3438 3 316.6146 439.8486 39.2986 0.5278 3437 +3439 3 316.0174 438.8762 39.5147 0.5256 3438 +3440 3 315.4877 437.8671 39.741 0.4376 3439 +3441 3 314.8837 436.8993 39.9633 0.4439 3440 +3442 3 314.4959 435.8274 40.1752 0.4281 3441 +3443 3 313.8598 434.8802 40.3822 0.4238 3442 +3444 3 313.2169 433.9386 40.6188 0.4074 3443 +3445 3 312.6026 432.8976 40.973 0.4166 3444 +3446 3 312.0889 431.8806 41.1916 0.3623 3445 +3447 3 311.6485 430.827 41.3767 0.3033 3446 +3448 3 311.1794 429.7859 41.5223 0.3447 3447 +3449 3 310.7173 428.7403 41.6102 0.3489 3448 +3450 3 310.3741 427.6501 41.6402 0.298 3449 +3451 3 310.1144 426.5358 41.6178 0.2159 3450 +3452 3 309.7918 425.4387 41.5568 0.1752 3451 +3453 3 309.3662 424.3782 41.4742 0.1867 3452 +3454 3 308.8823 423.3429 41.3944 0.1732 3453 +3455 3 308.4007 422.3053 41.3395 0.159 3454 +3456 3 307.9419 421.2574 41.33 0.1524 3455 +3457 3 307.2567 420.3468 41.3935 0.1602 3456 +3458 3 306.3312 419.6867 41.5587 0.1914 3457 +3459 3 305.4995 418.9099 41.8172 0.1825 3458 +3460 3 304.7959 418.0176 42.1232 0.1778 3459 +3461 3 304.1347 417.0932 42.42 0.1855 3460 +3462 3 303.4769 416.162 42.6597 0.2356 3461 +3463 3 302.8362 415.2159 42.8148 0.2695 3462 +3464 3 302.2219 414.2516 42.8814 0.3025 3463 +3465 3 301.5996 413.2917 42.873 0.2729 3464 +3466 3 300.9452 412.3537 42.8112 0.2159 3465 +3467 3 300.1982 411.4888 42.716 0.2005 3466 +3468 3 299.3425 410.7315 42.5992 0.1694 3467 +3469 3 298.3895 410.1023 42.4628 0.152 3468 +3470 3 297.3679 409.5932 42.3024 0.1399 3469 +3471 3 296.3543 409.0669 42.1137 0.1407 3470 +3472 3 295.4048 408.4366 41.8866 0.1436 3471 +3473 3 294.5011 407.7456 41.6052 0.1495 3472 +3474 3 293.6122 407.0386 41.2644 0.1576 3473 +3475 3 292.8137 406.2344 40.8923 0.1874 3474 +3476 3 292.1078 405.3467 40.5345 0.1702 3475 +3477 3 291.2681 404.5802 40.2195 0.1556 3476 +3478 3 290.3083 403.9681 39.9683 0.1472 3477 +3479 3 289.2444 403.5563 39.7886 0.155 3478 +3480 3 288.1404 403.2577 39.6757 0.1711 3479 +3481 3 287.0376 402.9557 39.6124 0.1954 3480 +3482 3 286.111 402.2876 39.5814 0.2675 3481 +3483 3 285.5344 401.3026 39.5682 0.2704 3482 +3484 3 284.896 400.3531 39.564 0.2367 3483 +3485 3 284.4579 399.2972 39.5629 0.2387 3484 +3486 3 284.3343 398.16 39.5629 0.2649 3485 +3487 3 284.1936 397.0252 39.5629 0.2092 3486 +3488 3 283.4523 396.1558 39.5629 0.1613 3487 +3489 3 282.3381 395.9041 39.5629 0.1343 3488 +3490 3 281.6814 394.9683 39.5629 0.1313 3489 +3491 3 281.3943 393.8609 39.5629 0.1271 3490 +3492 3 280.7605 392.9079 39.5629 0.1144 3491 +3493 3 280.1976 391.9127 39.5629 0.1144 3492 +3494 3 311.9299 433.052 41.8429 0.2312 3444 +3495 3 310.9632 432.4514 42.1271 0.217 3494 +3496 3 309.9073 432.0259 42.3973 0.211 3495 +3497 3 308.9075 431.4813 42.6675 0.2865 3496 +3498 3 308.0254 430.7618 42.945 0.2334 3497 +3499 3 307.0485 430.1806 43.2477 0.1869 3498 +3500 3 305.9342 429.985 43.605 0.1571 3499 +3501 3 304.8039 429.9701 44.0314 0.1697 3500 +3502 3 303.6759 429.9587 44.5119 0.2111 3501 +3503 3 302.5525 429.9404 45.0262 0.2077 3502 +3504 3 301.4303 429.8855 45.5596 0.2505 3503 +3505 3 300.3229 429.7081 46.1129 0.2009 3504 +3506 3 299.2212 429.5034 46.6749 0.17 3505 +3507 3 298.1138 429.326 47.2326 0.1514 3506 +3508 3 297.0053 429.1556 47.7814 0.1604 3507 +3509 3 295.8853 429.0938 48.3325 0.1926 3508 +3510 3 294.7653 429.0664 48.8916 0.1792 3509 +3511 3 293.6454 429.095 49.4665 0.1699 3510 +3512 3 292.53 429.1624 50.0637 0.1866 3511 +3513 3 291.4432 428.905 50.6691 0.167 3512 +3514 3 290.3712 428.5916 51.2753 0.15 3513 +3515 3 289.2936 428.3022 51.8862 0.1373 3514 +3516 3 288.2239 427.9784 52.4922 0.1373 3515 +3517 3 287.1589 427.6421 53.0872 0.1372 3516 +3518 3 286.095 427.2954 53.6642 0.1372 3517 +3519 3 285.1351 426.7131 54.2111 0.137 3518 +3520 3 284.2062 426.0782 54.7145 0.1368 3519 +3521 3 283.2738 425.4422 55.1659 0.1364 3520 +3522 3 282.2809 424.8988 55.5764 0.1356 3521 +3523 3 281.3004 424.329 55.9493 0.1342 3522 +3524 3 280.3612 423.6907 56.2822 0.1313 3523 +3525 3 279.4655 422.9883 56.5729 0.127 3524 +3526 3 278.6178 422.2275 56.8254 0.1144 3525 +3527 3 277.8296 421.4256 57.3404 0.1144 3526 +3528 3 321.861 443.3606 37.6146 0.2124 3432 +3529 3 321.9868 444.4978 37.5348 0.2393 3528 +3530 3 321.9044 445.6372 37.4041 0.2722 3529 +3531 3 321.5978 446.7377 37.2355 0.3086 3530 +3532 3 321.2283 447.8177 37.0454 0.2669 3531 +3533 3 320.7868 448.869 36.8424 0.2629 3532 +3534 3 320.352 449.9238 36.6346 0.3533 3533 +3535 3 319.9596 450.9957 36.4277 0.3903 3534 +3536 3 319.6096 452.0813 36.2382 0.2939 3535 +3537 3 319.2824 453.1762 36.0816 0.2287 3536 +3538 3 318.8248 454.2229 35.9621 0.2442 3537 +3539 3 318.2631 455.2193 35.8761 0.2962 3538 +3540 3 317.9073 456.3061 35.8095 0.2793 3539 +3541 3 317.7963 457.4444 35.7437 0.2277 3540 +3542 3 317.6442 458.2864 36.6559 0.128 3541 +3543 3 317.5778 459.3698 37.5208 0.1869 3542 +3544 3 317.3216 460.468 37.9305 0.2652 3543 +3545 3 316.9795 461.5479 38.3158 0.2614 3544 +3546 3 316.7027 462.6462 38.7178 0.2974 3545 +3547 3 316.4304 463.7456 39.1182 0.296 3546 +3548 3 316.0243 464.8026 39.5007 0.2285 3547 +3549 3 315.625 465.8643 39.8462 0.1679 3548 +3550 3 315.2692 466.9442 40.1534 0.1396 3549 +3551 3 314.9238 468.0298 40.4208 0.1374 3550 +3552 3 314.5165 469.0938 40.6552 0.1375 3551 +3553 3 314.0692 470.144 40.8629 0.1376 3552 +3554 3 313.6402 471.2022 41.0402 0.1379 3553 +3555 3 313.202 472.2569 41.1838 0.1386 3554 +3556 3 312.7547 473.3094 41.2947 0.1397 3555 +3557 3 312.3246 474.3688 41.375 0.1418 3556 +3558 3 311.899 475.4304 41.4296 0.1456 3557 +3559 3 311.4677 476.4897 41.4677 0.1525 3558 +3560 3 311.0364 477.5491 41.4988 0.1664 3559 +3561 3 310.6612 478.629 41.5374 0.187 3560 +3562 3 310.4152 479.7456 41.6027 0.2502 3561 +3563 3 310.5834 480.8701 41.7178 0.2468 3562 +3564 3 311.0547 481.9066 41.909 0.1959 3563 +3565 3 310.9884 483.0311 42.2097 0.1522 3564 +3566 3 310.731 484.1328 42.6224 0.1378 3565 +3567 3 310.5342 485.2402 43.1287 0.1373 3566 +3568 3 310.4118 486.3533 43.7007 0.1373 3567 +3569 3 310.3546 487.4687 44.3075 0.1373 3568 +3570 3 310.3764 488.5852 44.9198 0.1373 3569 +3571 3 310.4519 489.7006 45.5146 0.1373 3570 +3572 3 310.4885 490.8195 46.0886 0.1373 3571 +3573 3 310.4278 491.9406 46.629 0.1373 3572 +3574 3 310.2105 493.0457 47.1164 0.1373 3573 +3575 3 309.8638 494.1222 47.5426 0.1373 3574 +3576 3 309.5195 495.2021 47.908 0.1373 3575 +3577 3 309.3387 496.3244 48.2255 0.1373 3576 +3578 3 308.9475 497.3929 48.524 0.1373 3577 +3579 3 308.2348 498.2795 48.7906 0.1373 3578 +3580 3 307.8984 499.3697 49.0207 0.1373 3579 +3581 3 307.5873 500.468 49.2136 0.1373 3580 +3582 3 307.1274 501.5136 49.3688 0.1373 3581 +3583 3 306.6446 502.5489 49.4872 0.1373 3582 +3584 3 306.0509 503.527 49.5751 0.1373 3583 +3585 3 305.3313 504.4148 49.6485 0.1373 3584 +3586 3 304.6872 505.3609 49.7193 0.1373 3585 +3587 3 304.1713 506.3813 49.7862 0.1373 3586 +3588 3 303.629 507.388 49.8462 0.1373 3587 +3589 3 303.0776 508.3902 49.8971 0.1373 3588 +3590 3 302.6578 509.4541 49.9369 0.1373 3589 +3591 3 302.3146 510.5455 49.9638 0.1373 3590 +3592 3 301.8433 511.5876 49.9794 0.1373 3591 +3593 3 301.778 512.7294 49.9876 0.1373 3592 +3594 3 301.6739 513.8688 49.9912 0.1372 3593 +3595 3 301.5229 515.0036 49.9926 0.1372 3594 +3596 3 301.3696 516.1373 49.9929 0.1371 3595 +3597 3 301.3113 517.279 49.9929 0.1368 3596 +3598 3 301.0173 518.3853 49.9929 0.1364 3597 +3599 3 300.9349 519.5259 49.9929 0.1356 3598 +3600 3 300.9246 520.6699 49.9929 0.1342 3599 +3601 3 300.9246 521.8139 49.9929 0.1313 3600 +3602 3 300.9246 522.9579 49.9929 0.1271 3601 +3603 3 300.8091 524.0961 49.9929 0.1144 3602 +3604 3 300.6958 525.2344 49.9929 0.1144 3603 +3605 3 316.6329 456.7809 35.6546 0.2204 3541 +3606 3 315.5427 456.4503 35.6328 0.2509 3605 +3607 3 314.4181 456.2409 35.6328 0.2805 3606 +3608 3 313.2798 456.2958 35.6457 0.3079 3607 +3609 3 312.1427 456.4137 35.6726 0.3605 3608 +3610 3 310.9998 456.4709 35.7123 0.3339 3609 +3611 3 309.857 456.4411 35.7563 0.2821 3610 +3612 3 308.7176 456.3405 35.793 0.2956 3611 +3613 3 307.585 456.1826 35.8173 0.3133 3612 +3614 3 306.4662 455.9458 35.8232 0.265 3613 +3615 3 305.3439 455.725 35.8039 0.2425 3614 +3616 3 304.2056 455.6312 35.758 0.2205 3615 +3617 3 303.0616 455.6129 35.7006 0.2469 3616 +3618 3 301.9176 455.6117 35.6437 0.2818 3617 +3619 3 300.7736 455.6117 35.5897 0.2642 3618 +3620 3 299.6308 455.6129 35.5306 0.2047 3619 +3621 3 298.4868 455.6277 35.4547 0.1617 3620 +3622 3 297.3473 455.7124 35.3464 0.1501 3621 +3623 3 296.2216 455.9 35.1896 0.1576 3622 +3624 3 295.1017 456.1208 34.9745 0.1756 3623 +3625 3 293.9886 456.3542 34.6968 0.2049 3624 +3626 3 292.8972 456.6665 34.3549 0.2802 3625 +3627 3 291.8504 457.0955 33.9534 0.319 3626 +3628 3 290.7899 457.4867 33.5163 0.2792 3627 +3629 3 289.7969 458.0221 33.0775 0.2539 3628 +3630 3 289.1666 458.9453 32.6536 0.3315 3629 +3631 3 288.8348 460.0253 32.2694 0.3354 3630 +3632 3 288.2743 461.0103 31.9281 0.3242 3631 +3633 3 287.3717 461.6944 31.6498 0.3303 3632 +3634 3 286.3718 462.2424 31.4502 0.318 3633 +3635 3 285.5538 463.0363 31.3236 0.3098 3634 +3636 3 284.9475 464.0053 31.2606 0.3243 3635 +3637 3 284.3824 464.9994 31.2556 0.3213 3636 +3638 3 283.7944 465.9798 31.3029 0.2503 3637 +3639 3 283.1961 466.9545 31.3869 0.2074 3638 +3640 3 282.5474 467.896 31.4737 0.2289 3639 +3641 3 281.7718 468.7357 31.5263 0.2425 3640 +3642 3 280.9321 469.5136 31.5358 0.309 3641 +3643 3 280.2754 470.4483 31.5157 0.336 3642 +3644 3 279.9013 471.5282 31.4835 0.3108 3643 +3645 3 279.6943 472.6516 31.458 0.2749 3644 +3646 3 279.414 473.7613 31.4513 0.2519 3645 +3647 3 278.9152 474.7897 31.4639 0.2223 3646 +3648 3 278.2082 475.6878 31.486 0.2228 3647 +3649 3 277.4063 476.5035 31.5042 0.2905 3648 +3650 3 276.5917 477.3065 31.5087 0.3241 3649 +3651 3 275.8047 478.1371 31.4961 0.291 3650 +3652 3 275.0599 479.0054 31.4653 0.2295 3651 +3653 3 274.3289 479.884 31.4098 0.21 3652 +3654 3 273.5636 480.734 31.3202 0.2716 3653 +3655 3 272.7388 481.5245 31.1903 0.2623 3654 +3656 3 271.8636 482.2589 31.0248 0.3056 3655 +3657 3 270.9587 482.9533 30.8398 0.2924 3656 +3658 3 269.9897 483.5574 30.6519 0.2853 3657 +3659 3 268.9498 484.0287 30.4755 0.2853 3658 +3660 3 267.9099 484.5012 30.317 0.2242 3659 +3661 3 266.9044 485.0423 30.1725 0.1854 3660 +3662 3 265.9274 485.636 30.0412 0.19 3661 +3663 3 264.9687 486.2572 29.9298 0.1737 3662 +3664 3 264.1221 487.026 29.8432 0.1624 3663 +3665 3 263.4598 487.9572 29.7853 0.1572 3664 +3666 3 262.8752 488.9399 29.7592 0.1859 3665 +3667 3 262.3181 489.9397 29.7651 0.1674 3666 +3668 3 261.6522 490.8698 29.7892 0.1504 3667 +3669 3 260.8961 491.7278 29.8063 0.1376 3668 +3670 3 260.2966 492.7025 29.7951 0.1373 3669 +3671 3 259.8996 493.7744 29.7402 0.1373 3670 +3672 3 259.4844 494.8395 29.6296 0.1373 3671 +3673 3 259.0176 495.8805 29.458 0.1373 3672 +3674 3 258.5005 496.8964 29.2239 0.1373 3673 +3675 3 257.9377 497.886 28.9299 0.1373 3674 +3676 3 257.4503 498.9121 28.6068 0.1373 3675 +3677 3 257.0671 499.9829 28.296 0.1373 3676 +3678 3 256.7239 501.0686 28.0255 0.1373 3677 +3679 3 256.4082 502.1645 27.8104 0.1373 3678 +3680 3 255.6886 503.0511 27.6575 0.1372 3679 +3681 3 254.7528 503.7078 27.5618 0.1372 3680 +3682 3 253.6134 503.813 27.5089 0.1371 3681 +3683 3 252.4705 503.8393 27.4828 0.1368 3682 +3684 3 251.3265 503.8656 27.4722 0.1364 3683 +3685 3 250.1825 503.892 27.4688 0.1356 3684 +3686 3 249.0385 503.892 27.468 0.1342 3685 +3687 3 247.8945 503.892 27.468 0.1313 3686 +3688 3 246.7505 503.892 27.468 0.1271 3687 +3689 3 245.6809 504.2958 27.468 0.1144 3688 +3690 3 244.657 504.8072 27.468 0.1144 3689 +3691 3 334.3923 445.159 43.934 0.1151 1 +3692 3 334.6097 446.2115 44.8907 0.1495 3691 +3693 3 334.5937 447.3177 45.6067 0.157 3692 +3694 3 334.4061 448.4251 46.1339 0.1858 3693 +3695 3 334.1201 449.5211 46.5105 0.1678 3694 +3696 3 333.6236 450.5461 46.7771 0.1508 3695 +3697 3 333.2312 451.6169 46.9781 0.1379 3696 +3698 3 333.1454 452.7529 47.1643 0.1375 3697 +3699 3 333.1397 453.8934 47.374 0.1378 3698 +3700 3 333.2392 455.0283 47.626 0.1382 3699 +3701 3 333.3765 456.1574 47.9349 0.1391 3700 +3702 3 333.5183 457.282 48.3162 0.1405 3701 +3703 3 333.6796 458.3974 48.7869 0.1432 3702 +3704 3 334.1029 459.4293 49.3867 0.1487 3703 +3705 3 334.5971 460.4142 50.141 0.1562 3704 +3706 3 335.0856 461.3786 51.051 0.1848 3705 +3707 3 335.5638 462.319 52.1346 0.1656 3706 +3708 3 335.8292 463.3086 53.3761 0.1467 3707 +3709 3 335.9905 464.3027 54.7042 0.1311 3708 +3710 3 336.1495 465.298 56.0308 0.1258 3709 +3711 3 336.2971 466.2246 57.5462 0.1144 3710 +3712 3 336.3943 466.8355 59.901 0.1144 3711 +3713 3 335.5935 444.8787 33.7901 0.1182 1 +3714 3 336.026 445.9198 33.3136 0.3504 3713 +3715 3 336.1266 447.05 32.9717 0.346 3714 +3716 3 336.2788 448.1803 32.7606 0.3999 3715 +3717 3 336.6632 449.258 32.6631 0.5395 3716 +3718 3 337.1379 450.2978 32.648 0.6082 3717 +3719 3 337.5086 451.3812 32.6906 0.4054 3718 +3720 3 337.893 452.4577 32.746 0.2572 3719 +3721 3 337.8312 453.6063 32.7701 0.2441 3720 +3722 3 337.5223 454.7057 32.7116 0.2122 3721 +3723 3 337.2157 455.8062 32.6018 0.1875 3722 +3724 3 337.5933 456.8781 32.4705 0.1945 3723 +3725 3 338.3666 457.7178 32.3568 0.1816 3724 +3726 3 339.0198 458.6559 32.2655 0.1773 3725 +3727 3 339.5632 459.6615 32.1748 0.1855 3726 +3728 3 340.0551 460.6934 32.0575 0.2368 3727 +3729 3 340.3766 461.7893 31.915 0.2718 3728 +3730 3 340.6912 462.8876 31.7573 0.2909 3729 +3731 3 340.801 463.2548 31.0148 0.26 3730 +3732 3 341.031 464.2455 29.8796 0.2662 3731 +3733 3 341.1591 465.3632 29.4524 0.2578 3732 +3734 3 341.1957 466.5015 29.197 0.2193 3733 +3735 3 341.2003 467.6409 28.9503 0.2232 3734 +3736 3 341.3547 468.7632 28.7095 0.2527 3735 +3737 3 341.7551 469.8236 28.4668 0.2667 3736 +3738 3 342.3088 470.8178 28.2159 0.3065 3737 +3739 3 342.922 471.7764 27.9451 0.3638 3738 +3740 3 343.5604 472.718 27.6537 0.3549 3739 +3741 3 344.209 473.6526 27.3555 0.2956 3740 +3742 3 344.781 474.6342 27.062 0.2759 3741 +3743 3 345.2489 475.6706 26.7813 0.3168 3742 +3744 3 345.6504 476.7357 26.5103 0.3464 3743 +3745 3 346.0142 477.8145 26.2368 0.3812 3744 +3746 3 346.5153 478.8281 25.9454 0.3721 3745 +3747 3 347.2292 479.7055 25.6315 0.355 3746 +3748 3 348.1146 480.4068 25.2994 0.3261 3747 +3749 3 349.1568 480.8209 24.9594 0.3118 3748 +3750 3 350.2734 481.0177 24.6279 0.2778 3749 +3751 3 351.3979 481.187 24.3129 0.2177 3750 +3752 3 352.3669 481.7167 24.0103 0.1691 3751 +3753 3 353.0796 482.5918 23.7419 0.1534 3752 +3754 3 353.0087 483.6363 23.4774 0.1621 3753 +3755 3 352.3898 484.5847 23.2473 0.1825 3754 +3756 3 351.6805 485.4781 23.0205 0.2273 3755 +3757 3 350.9414 486.3453 22.7785 0.2746 3756 +3758 3 350.3065 487.2879 22.5156 0.2464 3757 +3759 3 349.9862 488.3725 22.2312 0.2202 3758 +3760 3 350.0503 489.4993 21.9242 0.2453 3759 +3761 3 350.4655 490.5495 21.5961 0.2837 3760 +3762 3 351.1142 491.4784 21.2569 0.3439 3761 +3763 3 351.8017 492.381 20.9113 0.2918 3762 +3764 3 352.3417 493.3775 20.5518 0.2548 3763 +3765 3 352.7307 494.4414 20.1785 0.3069 3764 +3766 3 353.3164 495.4081 19.7987 0.2926 3765 +3767 3 354.219 496.083 19.4354 0.2374 3766 +3768 3 355.2006 496.655 19.1169 0.2028 3767 +3769 3 356.1078 497.3437 18.8518 0.235 3768 +3770 3 356.7633 498.2726 18.6428 0.2848 3769 +3771 3 357.0561 499.3709 18.4738 0.2484 3770 +3772 3 356.9841 500.5069 18.309 0.2552 3771 +3773 3 357.3433 501.5868 18.1363 0.1882 3772 +3774 3 357.3261 502.7274 18.0068 0.1407 3773 +3775 3 356.7186 503.6918 18.086 0.1144 3774 +3776 3 341.0756 464.0556 31.5717 0.3018 3730 +3777 3 341.4188 465.1458 31.5386 0.2671 3776 +3778 3 341.7231 466.2486 31.5938 0.2771 3777 +3779 3 341.9324 467.3698 31.7358 0.2818 3778 +3780 3 341.9656 468.5069 31.9486 0.2704 3779 +3781 3 341.7174 469.6086 32.1975 0.2361 3780 +3782 3 341.2655 470.653 32.4355 0.2366 3781 +3783 3 340.9452 471.7421 32.6416 0.2543 3782 +3784 3 340.9589 472.8713 32.8149 0.2551 3783 +3785 3 341.1831 473.9901 32.9585 0.298 3784 +3786 3 341.4874 475.0906 33.0795 0.3101 3785 +3787 3 341.8764 476.166 33.1853 0.3874 3786 +3788 3 342.3054 477.2253 33.2794 0.3931 3787 +3789 3 342.6543 478.3133 33.3553 0.3252 3788 +3790 3 342.9334 479.4218 33.4057 0.2739 3789 +3791 3 343.295 480.5052 33.4331 0.3218 3790 +3792 3 343.7777 481.5405 33.451 0.4035 3791 +3793 3 344.3772 482.5129 33.479 0.4335 3792 +3794 3 345.1837 483.3125 33.5289 0.3658 3793 +3795 3 346.1469 483.9223 33.5961 0.2883 3794 +3796 3 347.1537 484.4634 33.6739 0.2228 3795 +3797 3 348.1741 484.9782 33.7658 0.2116 3796 +3798 3 349.2323 485.4106 33.873 0.1983 3797 +3799 3 350.2859 485.8534 33.9895 0.1937 3798 +3800 3 351.2583 486.446 34.1194 0.2319 3799 +3801 3 352.2799 486.9505 34.2602 0.2192 3800 +3802 3 353.361 487.3165 34.3944 0.1934 3801 +3803 3 354.473 487.5785 34.5008 0.1949 3802 +3804 3 355.5941 487.8016 34.5632 0.1884 3803 +3805 3 356.7175 488.0167 34.5719 0.186 3804 +3806 3 357.8409 488.2329 34.522 0.1963 3805 +3807 3 358.9632 488.4491 34.4156 0.2578 3806 +3808 3 360.0843 488.671 34.2569 0.2807 3807 +3809 3 361.2008 488.9033 34.0469 0.2611 3808 +3810 3 362.3014 489.1973 33.7918 0.2817 3809 +3811 3 363.3069 489.7178 33.5132 0.2851 3810 +3812 3 364.3766 490.0907 33.2419 0.2657 3811 +3813 3 365.4039 490.5769 33.0103 0.2815 3812 +3814 3 366.3889 491.1547 32.8364 0.3374 3813 +3815 3 367.3659 491.7473 32.7205 0.3776 3814 +3816 3 368.3566 492.3181 32.6514 0.3862 3815 +3817 3 369.3713 492.8455 32.6127 0.3587 3816 +3818 3 370.3894 493.3672 32.587 0.3616 3817 +3819 3 371.3802 493.9392 32.5606 0.3643 3818 +3820 3 372.3743 494.5043 32.5265 0.3522 3819 +3821 3 373.4176 494.9722 32.4783 0.2989 3820 +3822 3 374.4587 495.4447 32.4215 0.2349 3821 +3823 3 375.4631 495.9904 32.3702 0.2058 3822 +3824 3 376.4424 496.5818 32.3411 0.2498 3823 +3825 3 377.4125 497.1881 32.349 0.2404 3824 +3826 3 378.4329 497.7006 32.3943 0.257 3825 +3827 3 379.4705 498.1834 32.4666 0.208 3826 +3828 3 380.4669 498.7428 32.5494 0.1686 3827 +3829 3 381.5057 499.2187 32.6284 0.1416 3828 +3830 3 382.5582 499.6649 32.6928 0.1373 3829 +3831 3 383.5924 500.1522 32.7387 0.1373 3830 +3832 3 384.6357 500.6224 32.7678 0.1373 3831 +3833 3 385.7225 500.9748 32.7852 0.1373 3832 +3834 3 386.8264 501.2779 32.7958 0.1373 3833 +3835 3 387.9235 501.5982 32.804 0.1373 3834 +3836 3 389.0046 501.9735 32.8124 0.1373 3835 +3837 3 390.0205 502.4951 32.8227 0.1373 3836 +3838 3 390.954 503.1541 32.8359 0.1373 3837 +3839 3 391.9264 503.7558 32.853 0.1373 3838 +3840 3 392.9663 504.2272 32.8745 0.1373 3839 +3841 3 394.0268 504.6562 32.9022 0.1373 3840 +3842 3 395.0873 505.0852 32.9375 0.1373 3841 +3843 3 396.1397 505.5336 32.9809 0.1373 3842 +3844 3 397.1693 506.0312 33.033 0.1373 3843 +3845 3 398.1749 506.5746 33.0952 0.1373 3844 +3846 3 399.1267 507.2073 33.1724 0.1373 3845 +3847 3 400.0271 507.912 33.2601 0.1374 3846 +3848 3 400.8851 508.667 33.3438 0.1374 3847 +3849 3 401.7831 509.3752 33.4107 0.1375 3848 +3850 3 402.7521 509.9815 33.451 0.1377 3849 +3851 3 403.7416 510.5558 33.4569 0.138 3850 +3852 3 404.7449 511.1037 33.4242 0.1388 3851 +3853 3 405.7905 511.5648 33.3645 0.1399 3852 +3854 3 406.8728 511.9331 33.2987 0.1423 3853 +3855 3 407.9641 512.2763 33.2458 0.1465 3854 +3856 3 409.0532 512.6264 33.2203 0.1545 3855 +3857 3 410.1171 513.0451 33.2321 0.1691 3856 +3858 3 411.1136 513.6045 33.2853 0.1974 3857 +3859 3 412.0471 514.2635 33.3785 0.2437 3858 +3860 3 412.8982 515.0242 33.5059 0.3601 3859 +3861 3 413.7001 515.8376 33.6566 0.4273 3860 +3862 3 414.3671 516.762 33.819 0.3928 3861 +3863 3 414.8075 517.8122 33.9833 0.3624 3862 +3864 3 415.3235 518.8303 34.1429 0.3399 3863 +3865 3 416.0545 519.702 34.2933 0.2813 3864 +3866 3 416.9354 520.425 34.4378 0.2703 3865 +3867 3 417.8872 521.0565 34.5853 0.2703 3866 +3868 3 418.7635 521.7876 34.7514 0.3483 3867 +3869 3 419.5917 522.5712 34.9468 0.4276 3868 +3870 3 420.5344 523.2095 35.1716 0.441 3869 +3871 3 421.5583 523.7072 35.4127 0.4402 3870 +3872 3 422.6062 524.1545 35.6516 0.3742 3871 +3873 3 423.6507 524.6144 35.8716 0.349 3872 +3874 3 424.6391 525.1829 36.0629 0.3084 3873 +3875 3 425.4502 525.9815 36.2225 0.271 3874 +3876 3 426.037 526.9573 36.3647 0.3201 3875 +3877 3 426.6068 527.9468 36.5126 0.2807 3876 +3878 3 427.3526 528.8083 36.6859 0.2888 3877 +3879 3 428.2553 529.5015 36.8939 0.2337 3878 +3880 3 429.2334 530.0861 37.1308 0.2202 3879 +3881 3 430.1898 530.7062 37.3842 0.2366 3880 +3882 3 431.0123 531.491 37.6359 0.3331 3881 +3883 3 431.7673 532.3444 37.87 0.4207 3882 +3884 3 432.615 533.1074 38.0752 0.4324 3883 +3885 3 433.5199 533.803 38.2486 0.3949 3884 +3886 3 434.3848 534.5489 38.3869 0.431 3885 +3887 3 435.1879 535.3623 38.4863 0.3843 3886 +3888 3 435.9384 536.2248 38.5753 0.2789 3887 +3889 3 436.6133 537.1469 38.6688 0.2072 3888 +3890 3 437.4885 537.8768 38.7912 0.2069 3889 +3891 3 438.2298 538.7405 38.99 0.2614 3890 +3892 3 438.8407 539.698 39.3193 0.3742 3891 +3893 3 439.6026 540.3238 40.6932 0.572 3892 +3894 3 337.2604 451.84 31.5636 0.2331 3720 +3895 3 336.2674 451.4476 30.6821 0.2486 3894 +3896 3 335.2286 451.761 29.8987 0.3036 3895 +3897 3 334.167 452.0688 29.1746 0.3071 3896 +3898 3 333.15 451.6215 28.5477 0.3329 3897 +3899 3 332.0529 451.3641 28.0624 0.2792 3898 +3900 3 331.3207 452.2255 27.7371 0.3303 3899 +3901 3 330.8597 451.6489 26.7439 0.2422 3900 +3902 3 329.9788 451.0117 25.9323 0.2265 3901 +3903 3 328.9023 450.6811 25.5651 0.2311 3902 +3904 3 327.7835 450.4992 25.201 0.3014 3903 +3905 3 326.7104 450.1468 24.7893 0.3494 3904 +3906 3 325.7426 449.5726 24.3344 0.3569 3905 +3907 3 324.7324 449.0783 23.8328 0.2961 3906 +3908 3 323.6307 448.9102 23.2676 0.292 3907 +3909 3 322.5325 448.7306 22.6239 0.3363 3908 +3910 3 321.4766 448.4068 21.8983 0.3518 3909 +3911 3 320.3806 448.2993 21.1507 0.4038 3910 +3912 3 319.2767 448.3267 20.4219 0.355 3911 +3913 3 318.2356 448.6951 19.7266 0.4257 3912 +3914 3 317.2964 449.2854 19.0603 0.3907 3913 +3915 3 316.4556 450.0118 18.3965 0.3146 3914 +3916 3 315.3814 450.2063 17.6514 0.2732 3915 +3917 3 314.3014 449.9535 16.9809 0.3746 3916 +3918 3 313.3656 449.3415 16.4099 0.4115 3917 +3919 3 312.7021 448.4297 15.9496 0.4124 3918 +3920 3 312.3097 447.3669 15.5691 0.4061 3919 +3921 3 311.6348 446.4517 15.2779 0.3177 3920 +3922 3 310.5708 446.0399 15.0657 0.3053 3921 +3923 3 309.5538 445.5388 14.6947 0.3432 3922 +3924 3 330.608 453.0274 27.4659 0.2653 3900 +3925 3 329.8598 453.8912 27.4137 0.2507 3924 +3926 3 329.2329 454.8475 27.431 0.2144 3925 +3927 3 328.8073 455.9069 27.4598 0.2395 3926 +3928 3 328.4104 456.98 27.4823 0.2584 3927 +3929 3 327.8784 457.9924 27.4954 0.2549 3928 +3930 3 327.2275 458.9316 27.4885 0.3113 3929 +3931 3 326.5148 459.8262 27.4492 0.3138 3930 +3932 3 325.7517 460.6774 27.3815 0.4069 3931 +3933 3 324.9589 461.5022 27.2962 0.4352 3932 +3934 3 324.1398 462.2996 27.1997 0.47 3933 +3935 3 323.355 463.1312 27.1012 0.4552 3934 +3936 3 322.6263 464.0121 27.0127 0.3809 3935 +3937 3 321.782 464.7832 26.9446 0.3304 3936 +3938 3 320.8291 465.4135 26.8999 0.337 3937 +3939 3 319.8395 465.9878 26.8725 0.3305 3938 +3940 3 318.866 466.5873 26.8558 0.3328 3939 +3941 3 317.9725 467.3 26.8532 0.3678 3940 +3942 3 317.1523 468.0973 26.8663 0.3982 3941 +3943 3 316.3732 468.9359 26.8923 0.4132 3942 +3944 3 315.498 469.6703 26.9356 0.4137 3943 +3945 3 314.5577 470.3213 27.0001 0.4264 3944 +3946 3 313.7077 471.0855 27.0842 0.3848 3945 +3947 3 312.9137 471.908 27.18 0.2998 3946 +3948 3 311.9905 472.5807 27.2686 0.2687 3947 +3949 3 311.1074 473.3071 27.3334 0.3629 3948 +3950 3 310.294 474.1114 27.3636 0.3869 3949 +3951 3 309.4886 474.9236 27.3463 0.4276 3950 +3952 3 308.8354 475.8617 27.2667 0.483 3951 +3953 3 308.4396 476.9313 27.135 0.4665 3952 +3954 3 307.9923 477.9826 26.9793 0.3437 3953 +3955 3 307.3619 478.9345 26.8173 0.3147 3954 +3956 3 306.5817 479.7673 26.6534 0.2836 3955 +3957 3 305.7043 480.4972 26.4845 0.2618 3956 +3958 3 304.9687 481.37 26.3098 0.2716 3957 +3959 3 304.6289 482.458 26.131 0.3886 3958 +3960 3 304.6987 483.5951 25.952 0.4722 3959 +3961 3 304.7422 484.7368 25.7743 0.3839 3960 +3962 3 304.4459 485.8374 25.5892 0.3702 3961 +3963 3 303.8739 486.8246 25.4057 0.3863 3962 +3964 3 303.3247 487.8256 25.2205 0.3405 3963 +3965 3 302.8603 488.8678 25.0205 0.2876 3964 +3966 3 302.604 489.9786 24.796 0.2531 3965 +3967 3 302.4587 491.1089 24.5459 0.2215 3966 +3968 3 302.2437 492.2266 24.2699 0.2373 3967 +3969 3 301.9657 493.3294 23.9667 0.2476 3968 +3970 3 301.7552 494.446 23.6429 0.2502 3969 +3971 3 301.6133 495.5728 23.3088 0.2201 3970 +3972 3 301.4566 496.6973 22.9671 0.22 3971 +3973 3 301.0916 497.7716 22.6028 0.2869 3972 +3974 3 300.5322 498.7543 22.1953 0.3152 3973 +3975 3 300.0323 499.7678 21.7617 0.2711 3974 +3976 3 299.9396 500.8947 21.3472 0.1924 3975 +3977 3 299.9374 502.0284 20.9635 0.1504 3976 +3978 3 299.9408 503.1621 20.5924 0.1381 3977 +3979 3 300.0701 504.2889 20.2314 0.1384 3978 +3980 3 300.2108 505.4158 19.8763 0.1398 3979 +3981 3 300.0975 506.5438 19.5077 0.1398 3980 +3982 3 299.9374 507.6637 19.1101 0.1522 3981 +3983 3 299.9374 508.7288 18.086 0.1144 3982 +3984 3 338.5691 443.0884 37.4245 0.2303 1 +3985 3 339.3264 443.9464 37.38 0.3937 3984 +3986 3 340.0975 444.7906 37.3206 0.5272 3985 +3987 3 340.8559 445.6475 37.2523 0.5884 3986 +3988 3 341.8352 446.2366 37.1605 0.5789 3987 +3989 3 342.8579 446.7457 37.0227 0.471 3988 +3990 3 343.3624 447.3555 36.8416 0.3673 3989 +3991 3 344.3463 447.9298 36.6125 0.3988 3990 +3992 3 345.1002 448.7832 36.3577 0.4825 3991 +3993 3 345.8209 449.6652 36.0886 0.54 3992 +3994 3 346.4524 450.6113 35.8179 0.5567 3993 +3995 3 347.0713 451.5677 35.5432 0.5638 3994 +3996 3 347.6033 452.5733 35.2509 0.5743 3995 +3997 3 348.1352 453.5788 34.953 0.6063 3996 +3998 3 348.7976 454.5043 34.6702 0.6054 3997 +3999 3 349.5057 455.5477 34.2521 0.5522 3998 +4000 3 350.2642 456.3999 34.0679 0.4755 3999 +4001 3 351.208 457.044 33.9144 0.4528 4000 +4002 3 352.6998 457.29 32.7774 0.3545 4001 +4003 3 353.822 457.4593 32.452 0.3922 4002 +4004 3 354.9569 457.4627 32.2073 0.3286 4003 +4005 3 355.9865 457.0372 31.9385 0.254 4004 +4006 3 356.8777 456.3359 31.6453 0.2519 4005 +4007 3 357.8661 455.7959 31.2995 0.2376 4006 +4008 3 358.8751 456.0853 30.8392 0.2394 4007 +4009 3 359.4288 457.0394 30.3271 0.222 4008 +4010 3 360.0934 457.9432 29.7973 0.2432 4009 +4011 3 360.9446 458.6754 29.2897 0.3296 4010 +4012 3 361.8872 459.2966 28.8333 0.3937 4011 +4013 3 362.8413 459.9086 28.4458 0.445 4012 +4014 3 363.697 460.6545 28.1338 0.4037 4013 +4015 3 364.2782 461.6315 27.8938 0.4254 4014 +4016 3 364.6523 462.7091 27.7181 0.3858 4015 +4017 3 365.0744 463.7707 27.5933 0.4019 4016 +4018 3 365.5515 464.8095 27.5081 0.4111 4017 +4019 3 366.0125 465.8562 27.4509 0.4453 4018 +4020 3 366.5033 466.8893 27.4119 0.4191 4019 +4021 3 367.089 467.872 27.382 0.373 4020 +4022 3 367.756 468.802 27.3541 0.3587 4021 +4023 3 368.4058 469.7424 27.323 0.425 4022 +4024 3 368.956 470.7457 27.2844 0.4473 4023 +4025 3 369.3759 471.8085 27.2346 0.4557 4024 +4026 3 369.6882 472.909 27.1704 0.4906 4025 +4027 3 369.9216 474.0278 27.0875 0.4562 4026 +4028 3 370.219 475.1318 26.9814 0.3312 4027 +4029 3 370.7487 476.1431 26.8476 0.2585 4028 +4030 3 371.4797 477.0183 26.6795 0.3201 4029 +4031 3 372.2015 477.9026 26.4686 0.2961 4030 +4032 3 372.7507 478.899 26.2115 0.3106 4031 +4033 3 373.1865 479.9492 25.9134 0.3436 4032 +4034 3 373.5789 481.0154 25.5767 0.3927 4033 +4035 3 374.0937 482.0244 25.2049 0.3228 4034 +4036 3 374.8476 482.8675 24.8049 0.3069 4035 +4037 3 375.6804 483.6317 24.3832 0.3556 4036 +4038 3 376.4286 484.4794 23.9451 0.314 4037 +4039 3 377.059 485.4164 23.5078 0.3324 4038 +4040 3 377.6927 486.3533 23.0898 0.3288 4039 +4041 3 378.3654 487.2651 22.6986 0.2946 4040 +4042 3 379.0999 488.1288 22.3343 0.2476 4041 +4043 3 379.983 488.8438 21.9976 0.1897 4042 +4044 3 380.9692 489.4089 21.6969 0.1666 4043 +4045 3 381.9759 489.942 21.4421 0.1684 4044 +4046 3 382.93 490.5678 21.2356 0.1898 4045 +4047 3 383.7388 491.3743 21.0788 0.257 4046 +4048 3 384.4286 492.2849 20.9716 0.2508 4047 +4049 3 384.9938 493.2791 20.8998 0.2018 4048 +4050 3 385.6035 494.2458 20.8363 0.1669 4049 +4051 3 386.3185 495.1392 20.7481 0.1645 4050 +4052 3 387.0747 495.9949 20.6079 0.2005 4051 +4053 3 387.991 496.6745 20.4144 0.1913 4052 +4054 3 389.0469 497.1023 20.1771 0.2074 4053 +4055 3 390.1623 497.33 19.9057 0.1826 4054 +4056 3 391.2674 497.6011 19.6235 0.176 4055 +4057 3 391.995 498.4763 19.3502 0.1987 4056 +4058 3 392.5442 499.475 19.1031 0.1866 4057 +4059 3 393.1951 500.4108 18.8762 0.1992 4058 +4060 3 393.7911 501.3843 18.6722 0.1664 4059 +4061 3 394.4752 502.2984 18.5 0.149 4060 +4062 3 395.4213 502.9379 18.3609 0.1356 4061 +4063 3 396.5333 503.2033 18.2546 0.1342 4062 +4064 3 397.6464 503.4664 18.1793 0.1313 4063 +4065 3 398.779 503.6254 18.132 0.1271 4064 +4066 3 399.923 503.6254 18.1056 0.1144 4065 +4067 3 401.067 503.6254 18.086 0.1144 4066 +4068 3 351.605 457.6057 33.8433 0.4183 4001 +4069 3 352.2433 458.5552 33.7719 0.3594 4068 +4070 3 352.94 459.4601 33.7372 0.3231 4069 +4071 3 353.7374 460.2792 33.7204 0.3241 4070 +4072 3 354.505 461.1258 33.6974 0.3662 4071 +4073 3 355.1422 462.073 33.6482 0.4193 4072 +4074 3 355.6673 463.0878 33.5712 0.4035 4073 +4075 3 356.1375 464.13 33.4807 0.4082 4074 +4076 3 356.6706 465.1401 33.3931 0.383 4075 +4077 3 357.3456 466.0599 33.3245 0.3146 4076 +4078 3 358.1178 466.903 33.2844 0.3033 4077 +4079 3 358.9208 467.7175 33.2752 0.2799 4078 +4080 3 359.7216 468.5344 33.2917 0.3131 4079 +4081 3 360.4755 469.3946 33.3301 0.3339 4080 +4082 3 361.0876 470.3567 33.3827 0.3171 4081 +4083 3 361.5086 471.4172 33.4342 0.2733 4082 +4084 3 361.8129 472.5189 33.4692 0.2928 4083 +4085 3 362.0371 473.64 33.474 0.3153 4084 +4086 3 362.1515 474.7772 33.4387 0.2752 4085 +4087 3 362.1881 475.92 33.3525 0.2547 4086 +4088 3 362.2121 477.0617 33.2083 0.2429 4087 +4089 3 362.2979 478.1989 33.0067 0.2813 4088 +4090 3 362.4249 479.3314 32.7558 0.3554 4089 +4091 3 362.5622 480.4606 32.4638 0.3701 4090 +4092 3 362.7784 481.576 32.1387 0.3076 4091 +4093 3 363.2234 482.6136 31.7912 0.2801 4092 +4094 3 363.9407 483.4841 31.4325 0.304 4093 +4095 3 364.7678 484.2586 31.068 0.3067 4094 +4096 3 365.4771 485.1395 30.6998 0.2777 4095 +4097 3 365.8466 486.2 30.3414 0.3255 4096 +4098 3 366.0686 487.3143 30.0138 0.3007 4097 +4099 3 366.5204 488.3519 29.7195 0.3077 4098 +4100 3 367.2023 489.2602 29.4622 0.3377 4099 +4101 3 367.9573 490.1136 29.2328 0.3839 4100 +4102 3 368.7478 490.9362 29.0209 0.3216 4101 +4103 3 369.5063 491.7884 28.821 0.3076 4102 +4104 3 370.1023 492.7586 28.632 0.2639 4103 +4105 3 370.4764 493.8339 28.4522 0.278 4104 +4106 3 370.7304 494.9459 28.2794 0.3112 4105 +4107 3 371.1113 496.0212 28.1095 0.3271 4106 +4108 3 371.6616 497.02 27.9405 0.2677 4107 +4109 3 372.3926 497.8928 27.7785 0.2447 4108 +4110 3 373.2083 498.6925 27.6352 0.2216 4109 +4111 3 373.937 499.5722 27.5166 0.2634 4110 +4112 3 374.5513 500.5355 27.4228 0.2419 4111 +4113 3 375.097 501.5399 27.3493 0.2347 4112 +4114 3 375.7148 502.502 27.2905 0.2833 4113 +4115 3 376.4778 503.3508 27.2411 0.3169 4114 +4116 3 377.274 504.1722 27.1975 0.287 4115 +4117 3 378.0234 505.036 27.1586 0.2215 4116 +4118 3 378.704 505.9546 27.1241 0.188 4117 +4119 3 379.3126 506.9236 27.0931 0.2101 4118 +4120 3 379.7714 507.9692 27.0643 0.2157 4119 +4121 3 380.0162 509.0834 27.0344 0.2442 4120 +4122 3 380.1581 510.2183 27.001 0.2791 4121 +4123 3 380.5436 511.2902 26.96 0.2448 4122 +4124 3 381.0984 512.2901 26.9088 0.2324 4123 +4125 3 381.4828 513.3643 26.8444 0.2064 4124 +4126 3 381.7116 514.4831 26.766 0.2135 4125 +4127 3 381.85 515.618 26.672 0.2624 4126 +4128 3 381.9782 516.754 26.5496 0.3215 4127 +4129 3 382.3591 517.827 26.4021 0.3944 4128 +4130 3 382.8728 518.8463 26.253 0.4792 4129 +4131 3 383.391 519.8645 26.1116 0.4422 4130 +4132 3 383.9207 520.8769 25.9794 0.4471 4131 +4133 3 384.5304 521.8436 25.8616 0.4189 4132 +4134 3 384.988 522.8892 25.7502 0.3879 4133 +4135 3 385.1688 524.0138 25.6281 0.4099 4134 +4136 3 385.5223 525.0983 25.4845 0.3969 4135 +4137 3 385.997 526.137 25.33 0.3567 4136 +4138 3 386.4077 527.2021 25.1765 0.3277 4137 +4139 3 386.696 528.3072 25.0335 0.3666 4138 +4140 3 386.9328 529.426 24.9096 0.334 4139 +4141 3 387.093 530.5575 24.8069 0.2856 4140 +4142 3 387.2474 531.69 24.7211 0.2988 4141 +4143 3 387.4888 532.8077 24.6429 0.3667 4142 +4144 3 387.9052 533.8716 24.5644 0.436 4143 +4145 3 388.3754 534.9138 24.4781 0.43 4144 +4146 3 388.9005 535.9285 24.3731 0.4026 4145 +4147 3 389.4382 536.9375 24.2496 0.3742 4146 +4148 3 389.85 538.0026 24.117 0.3175 4147 +4149 3 389.8466 539.1386 23.9859 0.3472 4148 +4150 3 389.651 540.2643 23.864 0.3902 4149 +4151 3 389.405 541.3808 23.7519 0.3693 4150 +4152 3 389.1305 542.4905 23.6496 0.2709 4151 +4153 3 388.8021 543.5853 23.546 0.2312 4152 +4154 3 388.42 544.6618 23.4225 0.2003 4153 +4155 3 388.1375 545.7681 23.2372 0.2055 4154 +4156 3 387.6524 546.7942 22.9363 0.2464 4155 +4157 3 387.4362 547.9051 22.553 0.3063 4156 +4158 3 387.4019 549.0353 22.1348 0.2836 4157 +4159 3 387.5003 550.1622 21.7179 0.3197 4158 +4160 3 387.6822 551.2799 21.3329 0.3288 4159 +4161 3 387.8137 552.409 21.0087 0.2948 4160 +4162 3 387.8526 553.5473 20.756 0.2481 4161 +4163 3 387.8572 554.689 20.5669 0.1909 4162 +4164 3 388.0116 555.8216 20.4287 0.1687 4163 +4165 3 388.2896 556.9301 20.3285 0.1722 4164 +4166 3 388.666 558.01 20.2521 0.1965 4165 +4167 3 389.1385 559.0511 20.1866 0.272 4166 +4168 3 389.6292 560.0841 20.1214 0.2654 4167 +4169 3 390.0971 561.1274 20.048 0.294 4168 +4170 3 390.5627 562.1719 19.9607 0.3576 4169 +4171 3 391.057 563.2026 19.8544 0.3171 4170 +4172 3 391.6541 564.1762 19.723 0.3386 4171 +4173 3 392.3165 565.1074 19.5629 0.3402 4172 +4174 3 392.9583 566.0512 19.3823 0.3154 4173 +4175 3 393.5909 567.0007 19.1907 0.2871 4174 +4176 3 394.2956 567.8988 18.9955 0.259 4175 +4177 3 395.0301 568.7728 18.8002 0.3157 4176 +4178 3 395.729 569.6742 18.5968 0.3455 4177 +4179 3 396.3331 570.6409 18.3784 0.3267 4178 +4180 3 396.6728 571.7289 18.1486 0.3054 4179 +4181 3 396.92 572.842 17.9143 0.3056 4180 +4182 3 396.8925 573.9803 17.6724 0.3408 4181 +4183 3 396.7449 575.1105 17.4221 0.353 4182 +4184 3 396.2759 576.1481 17.1724 0.298 4183 +4185 3 395.6398 577.0931 16.9341 0.3405 4184 +4186 3 395.0346 578.0598 16.7061 0.281 4185 +4187 3 394.4615 579.0459 16.487 0.2831 4186 +4188 3 394.0245 580.0995 16.2881 0.3014 4187 +4189 3 393.6264 581.1703 16.1221 0.2716 4188 +4190 3 393.0692 582.1679 15.9919 0.2978 4189 +4191 3 392.5842 583.2032 15.8945 0.2896 4190 +4192 3 392.6563 584.3426 15.8126 0.2123 4191 +4193 3 392.7752 585.4809 15.7553 0.1402 4192 +4194 3 392.4366 586.5723 15.8253 0.1144 4193 +4195 3 348.9234 456.2432 35.4239 0.4783 3998 +4196 3 349.0207 457.3826 35.5519 0.3713 4195 +4197 3 349.23 458.506 35.6437 0.3612 4196 +4198 3 349.5183 459.6123 35.7059 0.3824 4197 +4199 3 349.7711 460.7277 35.7476 0.3818 4198 +4200 3 350.0057 461.8477 35.7748 0.3618 4199 +4201 3 350.1956 462.9757 35.784 0.2976 4200 +4202 3 350.3088 464.1139 35.7781 0.3048 4201 +4203 3 350.4953 465.2431 35.7504 0.3581 4202 +4204 3 350.8339 466.3344 35.6891 0.4045 4203 +4205 3 351.2206 467.4098 35.5796 0.4248 4204 +4206 3 351.5432 468.5058 35.4172 0.438 4205 +4207 3 351.8498 469.6051 35.2106 0.4558 4206 +4208 3 352.1861 470.6942 34.9742 0.5155 4207 +4209 3 352.487 471.7925 34.7161 0.4972 4208 +4210 3 352.8268 472.8793 34.4378 0.4304 4209 +4211 3 353.1128 473.9798 34.1435 0.3268 4210 +4212 3 352.8634 475.0849 33.8444 0.362 4211 +4213 3 352.2422 476.0378 33.5667 0.3335 4212 +4214 3 351.8555 477.1086 33.322 0.3225 4213 +4215 3 351.9928 478.2389 33.1148 0.3131 4214 +4216 3 352.5877 479.2124 32.9476 0.3591 4215 +4217 3 353.2592 480.1368 32.8143 0.3649 4216 +4218 3 353.7751 481.1572 32.7023 0.4255 4217 +4219 3 354.163 482.2315 32.5895 0.4038 4218 +4220 3 354.3677 483.356 32.475 0.4524 4219 +4221 3 354.4284 484.4977 32.3683 0.4424 4220 +4222 3 354.5531 485.6349 32.2781 0.4611 4221 +4223 3 355.0827 486.6473 32.2132 0.4237 4222 +4224 3 355.8549 487.4904 32.1793 0.3644 4223 +4225 3 356.7209 488.2386 32.1779 0.4305 4224 +4226 3 357.5938 488.9776 32.2025 0.4947 4225 +4227 3 358.2184 489.9352 32.2493 0.4497 4226 +4228 3 358.0972 491.0712 32.3201 0.3633 4227 +4229 3 357.5183 492.0561 32.3935 0.3237 4228 +4230 3 357.0241 493.088 32.4503 0.3526 4229 +4231 3 356.7221 494.192 32.4761 0.3673 4230 +4232 3 356.7095 495.3348 32.4593 0.3552 4231 +4233 3 356.7656 496.4777 32.3954 0.2957 4232 +4234 3 356.8433 497.2522 32.3198 0.2628 4233 +4235 3 356.8811 498.3939 32.1874 0.2099 4234 +4236 3 356.9543 499.5322 32.0228 0.1817 4235 +4237 3 357.3181 500.6018 31.8273 0.1942 4236 +4238 3 357.8752 501.596 31.6159 0.1939 4237 +4239 3 358.3889 502.613 31.4048 0.1915 4238 +4240 3 358.7767 503.6849 31.2133 0.2287 4239 +4241 3 359.0364 504.7957 31.0579 0.2113 4240 +4242 3 359.1108 505.934 30.949 0.1813 4241 +4243 3 359.0135 507.0711 30.8888 0.1615 4242 +4244 3 359.1096 508.2048 30.8736 0.1817 4243 +4245 3 359.5123 509.2676 30.9008 0.1727 4244 +4246 3 359.9951 510.3052 30.954 0.1569 4245 +4247 3 360.4481 511.3554 31.0108 0.1465 4246 +4248 3 360.9377 512.3884 31.0512 0.1496 4247 +4249 3 361.5315 513.3643 31.0601 0.161 4248 +4250 3 362.1595 514.3207 31.0257 0.1772 4249 +4251 3 362.7338 515.3091 30.9389 0.2311 4250 +4252 3 363.2612 516.3227 30.8034 0.215 4251 +4253 3 363.7028 517.3751 30.6342 0.1896 4252 +4254 3 363.7325 518.4997 30.4396 0.1804 4253 +4255 3 363.4294 519.5945 30.2369 0.2092 4254 +4256 3 363.1205 520.6939 30.0404 0.2754 4255 +4257 3 362.9008 521.8139 29.8651 0.3704 4256 +4258 3 362.8185 522.951 29.7102 0.3883 4257 +4259 3 362.8722 524.0916 29.5585 0.3597 4258 +4260 3 362.8745 525.2333 29.3986 0.2754 4259 +4261 3 362.7532 526.3681 29.2272 0.2365 4260 +4262 3 362.5313 527.487 29.0315 0.2786 4261 +4263 3 362.2522 528.5909 28.7924 0.3114 4262 +4264 3 362.0348 529.7086 28.5104 0.2678 4263 +4265 3 361.885 530.8354 28.1988 0.2328 4264 +4266 3 361.766 531.9646 27.8701 0.2758 4265 +4267 3 361.6699 533.096 27.5341 0.2902 4266 +4268 3 361.631 534.232 27.1993 0.3003 4267 +4269 3 361.9719 535.3051 26.8546 0.2373 4268 +4270 3 362.2201 536.4124 26.5282 0.2004 4269 +4271 3 362.2739 537.5473 26.2355 0.2123 4270 +4272 3 362.2556 538.6856 25.9861 0.2172 4271 +4273 3 362.4123 539.8147 25.7783 0.2405 4272 +4274 3 362.839 540.8706 25.6071 0.3071 4273 +4275 3 363.4088 541.8602 25.4586 0.4332 4274 +4276 3 363.959 542.86 25.3051 0.4566 4275 +4277 3 364.4338 543.8988 25.1422 0.3567 4276 +4278 3 364.7964 544.981 24.984 0.3334 4277 +4279 3 365.0538 546.0941 24.839 0.3001 4278 +4280 3 365.2986 547.2107 24.7114 0.3746 4279 +4281 3 365.5778 548.3192 24.5994 0.3843 4280 +4282 3 365.9061 549.414 24.496 0.3426 4281 +4283 3 366.3099 550.4825 24.396 0.3816 4282 +4284 3 366.7618 551.5338 24.3017 0.4018 4283 +4285 3 367.1588 552.6058 24.2127 0.3234 4284 +4286 3 367.4116 553.72 24.1192 0.2822 4285 +4287 3 367.3418 554.8572 24.018 0.2897 4286 +4288 3 367.0101 555.9485 23.9174 0.2696 4287 +4289 3 366.7058 557.0514 23.8145 0.2136 4288 +4290 3 366.517 558.1782 23.6982 0.1839 4289 +4291 3 366.4461 559.3176 23.5637 0.194 4290 +4292 3 366.4724 560.4593 23.4132 0.2477 4291 +4293 3 366.6108 561.593 23.2506 0.3093 4292 +4294 3 366.8636 562.7061 23.0837 0.2952 4293 +4295 3 367.2423 563.7826 22.9224 0.3349 4294 +4296 3 367.7514 564.8054 22.7775 0.3712 4295 +4297 3 368.249 565.8338 22.6552 0.3213 4296 +4298 3 368.6494 566.9046 22.5567 0.2386 4297 +4299 3 368.9274 568.0132 22.4773 0.2167 4298 +4300 3 369.1413 569.1366 22.4081 0.1957 4299 +4301 3 369.3358 570.2634 22.3495 0.213 4300 +4302 3 369.0258 571.3571 22.3154 0.1926 4301 +4303 3 368.2147 572.1556 22.3154 0.2078 4302 +4304 3 367.3762 572.9335 22.3413 0.1851 4303 +4305 3 366.5731 573.748 22.3978 0.1796 4304 +4306 3 365.7837 574.5751 22.4937 0.2035 4305 +4307 3 364.9554 575.3622 22.6347 0.2002 4306 +4308 3 364.1581 576.179 22.8235 0.2094 4307 +4309 3 363.5941 577.1686 23.06 0.2551 4308 +4310 3 363.1468 578.2154 23.3346 0.3156 4309 +4311 3 362.6663 579.2461 23.6242 0.3272 4310 +4312 3 362.1355 580.2528 23.9097 0.2719 4311 +4313 3 361.242 580.9541 24.1948 0.192 4312 +4314 3 360.4264 581.748 24.4621 0.1473 4313 +4315 3 359.923 582.7708 24.6898 0.1315 4314 +4316 3 359.1748 583.6333 24.8629 0.1271 4315 +4317 3 358.1898 584.2133 24.9625 0.1145 4316 +4318 3 357.1762 584.7407 24.8682 0.1144 4317 +4319 3 357.357 496.7385 32.5346 0.1705 4233 +4320 3 358.3992 497.2041 32.4652 0.1683 4319 +4321 3 359.4231 497.7109 32.3638 0.2378 4320 +4322 3 360.4092 498.2886 32.279 0.2354 4321 +4323 3 361.2672 499.0368 32.1891 0.2345 4322 +4324 3 362.0268 499.8902 32.1087 0.2137 4323 +4325 3 362.8173 500.7162 32.0494 0.2386 4324 +4326 3 363.6501 501.4999 32.0202 0.2092 4325 +4327 3 364.4887 502.2789 32.0253 0.1709 4326 +4328 3 365.2986 503.0854 32.0636 0.1434 4327 +4329 3 365.9633 504.0109 32.1356 0.1374 4328 +4330 3 366.4827 505.028 32.2353 0.1374 4329 +4331 3 366.8373 506.1113 32.3478 0.1375 4330 +4332 3 367.1062 507.2221 32.4573 0.1377 4331 +4333 3 367.343 508.341 32.5517 0.138 4332 +4334 3 367.5706 509.461 32.6234 0.1386 4333 +4335 3 367.8395 510.5729 32.6698 0.1397 4334 +4336 3 368.1804 511.6643 32.6939 0.1417 4335 +4337 3 368.4904 512.7648 32.7015 0.1456 4336 +4338 3 368.6128 513.8985 32.6992 0.1526 4337 +4339 3 368.7146 515.038 32.6861 0.166 4338 +4340 3 369.1082 516.1007 32.6704 0.1895 4339 +4341 3 369.7214 517.0628 32.6718 0.2404 4340 +4342 3 370.2945 518.0524 32.6959 0.2987 4341 +4343 3 370.7944 519.0808 32.7373 0.3072 4342 +4344 3 371.2394 520.1333 32.7888 0.2792 4343 +4345 3 371.6959 521.1824 32.8426 0.3248 4344 +4346 3 372.2587 522.1765 32.8927 0.305 4345 +4347 3 372.8651 523.1466 32.9216 0.3118 4346 +4348 3 373.3959 524.1591 32.9028 0.3485 4347 +4349 3 373.9256 525.1726 32.8098 0.3879 4348 +4350 3 374.4838 526.1679 32.6292 0.4145 4349 +4351 3 375.0249 527.1701 32.3638 0.3662 4350 +4352 3 375.4654 528.2157 32.0309 0.3107 4351 +4353 3 375.7525 529.3105 31.6618 0.3383 4352 +4354 3 376.0328 530.4099 31.2855 0.4138 4353 +4355 3 376.4195 531.4749 30.9173 0.3516 4354 +4356 3 376.1644 532.5526 30.6023 0.2941 4355 +4357 3 375.8109 533.6394 30.4396 0.3571 4356 +4358 3 375.9264 534.7708 30.3887 0.3857 4357 +4359 3 376.1998 535.8805 30.3957 0.377 4358 +4360 3 376.368 537.0119 30.4223 0.2974 4359 +4361 3 376.4938 538.149 30.457 0.3323 4360 +4362 3 376.6677 539.2793 30.4895 0.2694 4361 +4363 3 376.7913 540.4164 30.5026 0.2637 4362 +4364 3 377.0121 541.5387 30.4884 0.2346 4363 +4365 3 377.393 542.6175 30.4394 0.2966 4364 +4366 3 377.7968 543.6871 30.3464 0.2864 4365 +4367 3 378.3025 544.711 30.2131 0.3475 4366 +4368 3 378.9271 545.6674 30.0583 0.3775 4367 +4369 3 379.6204 546.5746 29.8959 0.411 4368 +4370 3 380.3674 547.4383 29.7282 0.3431 4369 +4371 3 381.246 548.1659 29.5492 0.2895 4370 +4372 3 382.1566 548.8534 29.351 0.2558 4371 +4373 3 382.8087 549.787 29.129 0.2228 4372 +4374 3 383.2709 550.8291 28.8977 0.2529 4373 +4375 3 383.6621 551.8999 28.6742 0.207 4374 +4376 3 384.0374 552.9776 28.4701 0.1803 4375 +4377 3 384.4698 554.0335 28.2842 0.169 4376 +4378 3 384.9457 555.0711 28.1033 0.1934 4377 +4379 3 385.5211 556.0561 27.9059 0.2462 4378 +4380 3 386.4775 556.6693 27.665 0.3173 4379 +4381 3 387.6055 556.7974 27.3826 0.2463 4380 +4382 3 388.7381 556.6979 27.0735 0.1883 4381 +4383 3 389.8352 556.405 26.745 0.1575 4382 +4384 3 390.9368 556.127 26.4078 0.1867 4383 +4385 3 392.0728 556.1259 26.0739 0.1675 4384 +4386 3 393.2088 556.1659 25.757 0.1509 4385 +4387 3 394.3425 556.0767 25.4751 0.139 4386 +4388 3 395.4762 555.9577 25.2388 0.1405 4387 +4389 3 396.6179 555.9245 25.0546 0.143 4388 +4390 3 397.7436 556.1178 24.9191 0.1485 4389 +4391 3 398.7755 556.6109 24.8145 0.1554 4390 +4392 3 399.5294 557.4712 24.7573 0.1836 4391 +4393 3 400.2799 558.3349 24.7411 0.161 4392 +4394 3 400.9377 559.2707 24.7509 0.1398 4393 +4395 3 401.7019 560.1207 24.7761 0.1144 4394 +4396 3 402.5107 560.9295 24.8682 0.1144 4395 +4397 3 343.8464 447.495 37.6894 0.4578 3989 +4398 3 344.9217 447.8714 37.905 0.4345 4397 +4399 3 346.0589 447.9561 38.117 0.3027 4398 +4400 3 347.1376 448.329 38.3057 0.2567 4399 +4401 3 348.2816 448.3153 38.5053 0.225 4400 +4402 3 349.4256 448.3084 38.5412 0.225 4401 +4403 3 350.5685 448.3519 38.5316 0.2713 4402 +4404 3 351.7034 448.4892 38.5101 0.3621 4403 +4405 3 352.8325 448.6734 38.507 0.3751 4404 +4406 3 353.9639 448.8404 38.5392 0.381 4405 +4407 3 355.1033 448.9273 38.6098 0.3781 4406 +4408 3 356.229 448.7603 38.717 0.374 4407 +4409 3 357.3124 448.4045 38.848 0.3357 4408 +4410 3 358.3809 448.0007 38.9833 0.3213 4409 +4411 3 359.4574 447.6152 39.0967 0.2746 4410 +4412 3 360.5522 447.2857 39.1597 0.2588 4411 +4413 3 361.6676 447.034 39.1482 0.3297 4412 +4414 3 362.8047 446.9311 39.048 0.361 4413 +4415 3 363.9453 446.9436 38.8595 0.3158 4414 +4416 3 365.0733 447.0889 38.6016 0.3028 4415 +4417 3 366.2001 447.2457 38.299 0.3464 4416 +4418 3 367.3327 447.2251 37.9705 0.3897 4417 +4419 3 368.463 447.1141 37.6331 0.4049 4418 +4420 3 369.5955 447.0237 37.2999 0.4035 4419 +4421 3 370.7304 446.9585 36.981 0.3935 4420 +4422 3 371.8664 446.923 36.6825 0.3915 4421 +4423 3 373.0058 446.9047 36.4106 0.3072 4422 +4424 3 374.1429 446.835 36.1757 0.2524 4423 +4425 3 375.2675 446.6439 35.9937 0.2834 4424 +4426 3 376.3886 446.4231 35.8688 0.3052 4425 +4427 3 377.5166 446.2378 35.7885 0.3142 4426 +4428 3 378.6491 446.0742 35.7342 0.3337 4427 +4429 3 379.7714 445.8546 35.6857 0.3399 4428 +4430 3 380.8593 445.5045 35.6261 0.3024 4429 +4431 3 381.9896 445.3661 35.5387 0.2411 4430 +4432 3 383.1233 445.4828 35.4122 0.2465 4431 +4433 3 384.2639 445.5056 35.2475 0.2034 4432 +4434 3 385.3736 445.2551 35.0633 0.1668 4433 +4435 3 386.3723 444.7128 34.8933 0.1402 4434 +4436 3 387.3367 444.0985 34.7612 0.1373 4435 +4437 3 388.3045 443.4899 34.6741 0.1374 4436 +4438 3 389.2963 442.9213 34.6287 0.1374 4437 +4439 3 390.3328 442.4386 34.6237 0.1376 4438 +4440 3 391.4082 442.0473 34.6587 0.1378 4439 +4441 3 392.511 441.7487 34.7357 0.1383 4440 +4442 3 393.6367 441.5543 34.8597 0.139 4441 +4443 3 394.775 441.473 35.0308 0.1405 4442 +4444 3 395.9144 441.5165 35.2422 0.1432 4443 +4445 3 397.0401 441.6892 35.4855 0.1488 4444 +4446 3 398.112 442.0691 35.7535 0.1563 4445 +4447 3 399.145 442.5438 36.0422 0.1836 4446 +4448 3 400.1552 443.0632 36.3793 0.1688 4447 +4449 3 401.0349 443.7736 36.7716 0.1512 4448 +4450 3 401.8094 444.5984 37.1686 0.1381 4449 +4451 3 402.5244 445.4782 37.534 0.1373 4450 +4452 3 403.1948 446.3968 37.8442 0.1373 4451 +4453 3 403.8572 447.3246 38.0834 0.1373 4452 +4454 3 404.4967 448.2707 38.2474 0.1373 4453 +4455 3 405.1076 449.2374 38.3463 0.1373 4454 +4456 3 405.7962 450.1491 38.4003 0.1374 4455 +4457 3 406.6119 450.9499 38.4269 0.1375 4456 +4458 3 407.5157 451.6512 38.439 0.1376 4457 +4459 3 408.4732 452.277 38.4454 0.1379 4458 +4460 3 409.4799 452.8204 38.4504 0.1384 4459 +4461 3 410.5244 453.2848 38.4563 0.1394 4460 +4462 3 411.5883 453.7058 38.4639 0.1413 4461 +4463 3 412.658 454.1108 38.474 0.1446 4462 +4464 3 413.7459 454.4654 38.4871 0.1508 4463 +4465 3 414.8556 454.7434 38.5039 0.1627 4464 +4466 3 415.9756 454.9757 38.5258 0.183 4465 +4467 3 417.0944 455.2125 38.5535 0.2291 4466 +4468 3 418.2086 455.4733 38.5888 0.2737 4467 +4469 3 419.292 455.8394 38.6324 0.2326 4468 +4470 3 420.3193 456.3405 38.6851 0.1996 4469 +4471 3 421.3638 456.8061 38.7492 0.2146 4470 +4472 3 422.4586 457.1344 38.8282 0.2155 4471 +4473 3 423.5866 457.3174 38.9183 0.2627 4472 +4474 3 424.7283 457.3758 39.0076 0.2303 4473 +4475 3 425.8712 457.4158 39.0832 0.2195 4474 +4476 3 426.9888 457.6526 39.1348 0.2509 4475 +4477 3 428.0299 458.1251 39.1558 0.2948 4476 +4478 3 429.016 458.7051 39.1496 0.3508 4477 +4479 3 429.9941 459.2977 39.1314 0.3545 4478 +4480 3 431.0192 459.8056 39.121 0.4005 4479 +4481 3 432.0705 460.2552 39.1373 0.3819 4480 +4482 3 433.0681 460.8146 39.1969 0.3128 4481 +4483 3 433.9695 461.5159 39.3098 0.325 4482 +4484 3 434.7738 462.3259 39.4789 0.3211 4483 +4485 3 435.4396 463.2514 39.7051 0.365 4484 +4486 3 436.0127 464.2352 39.9792 0.3028 4485 +4487 3 436.9119 464.9262 40.2861 0.2267 4486 +4488 3 438.0273 465.1321 40.5947 0.2003 4487 +4489 3 439.1644 465.1653 40.8909 0.1685 4488 +4490 3 440.297 465.2762 41.1734 0.1523 4489 +4491 3 441.4193 465.4661 41.442 0.1412 4490 +4492 3 442.5495 465.6126 41.6959 0.1443 4491 +4493 3 443.6146 466.0164 41.9364 0.1502 4492 +4494 3 444.3765 466.8618 42.1764 0.1623 4493 +4495 3 444.5527 467.9864 42.4155 0.1788 4494 +4496 3 444.5881 469.1258 42.6423 0.2397 4495 +4497 3 444.8696 470.232 42.8509 0.2032 4496 +4498 3 445.5194 471.1701 43.0394 0.1754 4497 +4499 3 446.5364 471.6884 43.2079 0.1582 4498 +4500 3 447.59 472.1288 43.3656 0.1887 4499 +4501 3 448.5807 472.6974 43.5221 0.1709 4500 +4502 3 449.0749 473.727 43.6705 0.1567 4501 +4503 3 449.1298 474.8687 43.8024 0.1525 4502 +4504 3 449.1092 476.0115 43.9118 0.1526 4503 +4505 3 448.6825 477.0709 44.0843 0.2288 4504 +4506 3 347.3058 448.5818 39.0272 0.1323 4400 +4507 3 347.8893 449.3804 40.4253 0.2025 4506 +4508 3 348.8113 449.9798 41.1009 0.2097 4507 +4509 3 349.9004 449.8563 41.783 0.2382 4508 +4510 3 350.7824 449.1962 42.5006 0.2539 4509 +4511 3 351.2846 448.2146 43.2264 0.245 4510 +4512 3 351.6118 447.1553 43.92 0.2941 4511 +4513 3 351.947 446.0925 44.553 0.2916 4512 +4514 3 352.8371 445.413 45.129 0.2872 4513 +4515 3 353.885 445.0023 45.6257 0.2752 4514 +4516 3 355.0107 444.9096 46.0541 0.2725 4515 +4517 3 356.1455 444.9062 46.424 0.2856 4516 +4518 3 357.2804 444.9279 46.7664 0.223 4517 +4519 3 358.112 445.2368 48.9423 0.159 4518 +4520 3 359.0879 445.6967 49.8137 0.1988 4519 +4521 3 360.1232 446.0834 50.5288 0.1917 4520 +4522 3 361.1905 446.4002 51.1694 0.1938 4521 +4523 3 362.2339 446.8155 51.7132 0.2252 4522 +4524 3 363.2246 447.3612 52.1321 0.2642 4523 +4525 3 364.2942 447.749 52.4098 0.2115 4524 +4526 3 365.3982 448.0384 52.5829 0.1645 4525 +4527 3 366.4712 448.4308 52.6828 0.1383 4526 +4528 3 367.4208 449.068 52.7335 0.1373 4527 +4529 3 368.1815 449.9192 52.7514 0.1373 4528 +4530 3 369.0212 450.6971 52.75 0.1373 4529 +4531 3 370.0016 451.284 52.7383 0.1373 4530 +4532 3 370.8905 452.0047 52.7201 0.1373 4531 +4533 3 371.4419 453.0034 52.6954 0.1373 4532 +4534 3 371.8149 454.0845 52.6652 0.1373 4533 +4535 3 372.7564 454.7274 52.628 0.1373 4534 +4536 3 373.8375 455.0992 52.582 0.1373 4535 +4537 3 374.7813 455.7444 52.5244 0.1373 4536 +4538 3 375.415 456.6962 52.4619 0.1373 4537 +4539 3 375.5683 457.8299 52.4012 0.1373 4538 +4540 3 376.1438 458.8184 52.3474 0.1373 4539 +4541 3 376.7158 459.8091 52.3048 0.1373 4540 +4542 3 377.5612 460.579 52.2749 0.1373 4541 +4543 3 378.4318 461.3214 52.2564 0.1373 4542 +4544 3 379.0804 462.2641 52.2466 0.1373 4543 +4545 3 379.7622 463.1816 52.2421 0.1372 4544 +4546 3 380.5733 463.9892 52.2404 0.1372 4545 +4547 3 381.19 464.9525 52.2399 0.1371 4546 +4548 3 381.9198 465.8334 52.2399 0.1368 4547 +4549 3 382.9105 466.4054 52.2399 0.1364 4548 +4550 3 384.0385 466.5941 52.2399 0.1356 4549 +4551 3 385.1814 466.6468 52.2399 0.1342 4550 +4552 3 386.3254 466.6662 52.2399 0.1313 4551 +4553 3 387.4671 466.7417 52.2399 0.1271 4552 +4554 3 388.5722 467.0391 52.2399 0.1144 4553 +4555 3 389.7139 467.1044 52.2399 0.1144 4554 +4556 3 357.5309 444.2873 46.984 0.1934 4518 +4557 3 358.2219 443.3927 47.2368 0.1912 4556 +4558 3 359.1016 442.6708 47.4225 0.1793 4557 +4559 3 359.8086 441.7796 47.5605 0.1698 4558 +4560 3 360.5785 440.9354 47.6515 0.173 4559 +4561 3 361.5486 440.3382 47.7033 0.1942 4560 +4562 3 362.6171 439.9355 47.7316 0.2766 4561 +4563 3 363.6982 439.5614 47.7448 0.2326 4562 +4564 3 364.7152 439.0397 47.7501 0.1809 4563 +4565 3 365.6888 438.4403 47.7526 0.142 4564 +4566 3 366.6211 437.7779 47.7548 0.139 4565 +4567 3 367.5089 437.056 47.7582 0.1406 4566 +4568 3 368.4252 436.3719 47.7624 0.1433 4567 +4569 3 369.409 435.7896 47.768 0.1488 4568 +4570 3 370.4146 435.244 47.7758 0.1564 4569 +4571 3 371.419 434.696 47.7859 0.1842 4570 +4572 3 372.4509 434.2029 47.7996 0.1693 4571 +4573 3 373.4542 433.6538 47.8178 0.1525 4572 +4574 3 374.0571 432.6986 47.843 0.1398 4573 +4575 3 374.5685 431.6758 47.8752 0.1406 4574 +4576 3 375.6061 431.2342 47.9186 0.1434 4575 +4577 3 376.7467 431.1713 47.9732 0.1493 4576 +4578 3 377.8495 430.8739 48.0438 0.1569 4577 +4579 3 378.7429 430.1634 48.1348 0.1861 4578 +4580 3 379.4888 429.2986 48.2482 0.1673 4579 +4581 3 380.118 428.3445 48.3857 0.1503 4580 +4582 3 380.9005 427.5128 48.5506 0.1375 4581 +4583 3 381.7505 426.752 48.7721 0.1373 4582 +4584 3 382.1166 425.6755 49.03 0.1372 4583 +4585 3 382.1624 424.5373 49.2831 0.1372 4584 +4586 3 382.5788 423.4756 49.5104 0.1371 4585 +4587 3 382.9563 422.3991 49.6961 0.1368 4586 +4588 3 383.2125 421.2849 49.831 0.1364 4587 +4589 3 383.526 420.1855 49.9142 0.1356 4588 +4590 3 383.9104 419.1078 49.9593 0.1342 4589 +4591 3 384.4092 418.0782 49.9814 0.1313 4590 +4592 3 385.1619 417.2168 49.9901 0.1271 4591 +4593 3 385.806 416.2707 49.9926 0.1144 4592 +4594 3 386.7395 415.6106 49.9929 0.1144 4593 +4595 2 322.2751 237.5733 20.4092 0.1144 -1 +4596 2 322.2854 236.4396 20.6556 0.1457 4595 +4597 2 322.5748 235.3322 20.7133 0.192 4596 +4598 2 322.8643 234.226 20.7709 0.2231 4597 +4599 2 323.1548 233.1197 20.8254 0.172 4598 +4600 2 323.4443 232.0135 20.8738 0.1583 4599 +4601 2 323.7337 230.9061 20.9075 0.1482 4600 +4602 2 324.0334 229.8033 20.8863 0.1432 4601 +4603 2 324.3881 228.7165 20.7918 0.1405 4602 +4604 2 324.7416 227.6297 20.6233 0.139 4603 +4605 2 325.0939 226.5463 20.3752 0.1383 4604 +4606 2 325.4623 225.4755 20.0113 0.1378 4605 +4607 2 326.0194 224.502 19.5336 0.1375 4606 +4608 2 326.5994 223.5536 18.9981 0.1374 4607 +4609 2 327.1291 222.5927 19.7848 0.1373 4608 +4610 2 327.6668 221.6145 20.3528 0.1373 4609 +4611 2 328.0763 220.5678 20.7875 0.1373 4610 +4612 2 328.2308 219.4592 21.2738 0.1373 4611 +4613 2 328.2891 218.3358 21.7792 0.1373 4612 +4614 2 328.4275 217.2181 22.2514 0.146 4613 +4615 2 328.6186 216.1027 22.6612 0.1616 4614 +4616 2 328.8439 214.9896 22.9887 0.1804 4615 +4617 2 329.1311 213.8902 23.2933 0.1376 4616 +4618 2 300.8686 281.5029 13.911 0.167 -1 +4619 2 300.6192 280.9858 13.9383 0.1584 4618 +4620 2 300.1192 279.9562 13.9738 0.1436 4619 +4621 2 299.6147 278.9301 13.988 0.1375 4620 +4622 2 299.1102 277.9028 13.995 0.1377 4621 +4623 2 298.6057 276.8766 13.9943 0.1381 4622 +4624 2 298.1047 275.8481 13.9844 0.1387 4623 +4625 2 297.3885 275.0004 13.9644 0.14 4624 +4626 2 296.4115 274.4113 13.9358 0.1425 4625 +4627 2 295.4563 273.7901 13.8986 0.147 4626 +4628 2 294.5697 273.0671 13.8519 0.1556 4627 +4629 2 293.7529 272.2686 13.7974 0.1697 4628 +4630 2 292.9509 271.4529 13.7426 0.2048 4629 +4631 2 292.1421 270.6452 13.6969 0.2269 4630 +4632 2 291.394 269.7815 13.6658 0.2729 4631 +4633 2 290.6595 268.9052 13.6522 0.2619 4632 +4634 2 289.8324 268.1193 13.6576 0.208 4633 +4635 2 288.9115 267.4443 13.6818 0.1757 4634 +4636 2 288.193 266.592 13.7238 0.1784 4635 +4637 2 287.4975 265.6917 13.7789 0.2298 4636 +4638 2 286.6795 264.8943 13.8365 0.2356 4637 +4639 2 286.1338 263.9208 13.8883 0.2189 4638 +4640 2 285.722 262.8534 13.9302 0.2444 4639 +4641 2 285.1637 261.8605 13.9623 0.2512 4640 +4642 2 284.5906 260.872 13.9856 0.2127 4641 +4643 2 284.093 259.8424 14.002 0.1704 4642 +4644 2 283.3585 258.9913 14.0138 0.1554 4643 +4645 2 282.3392 258.52 14.02 0.1624 4644 +4646 2 281.2375 258.2157 14.0173 0.1921 4645 +4647 2 280.1118 258.0143 14.0015 0.1988 4646 +4648 2 278.9724 257.9377 13.9698 0.2004 4647 +4649 2 277.8284 257.9251 13.9208 0.2404 4648 +4650 2 276.6856 257.9354 13.8535 0.2489 4649 +4651 2 275.5416 257.956 13.7817 0.2076 4650 +4652 2 274.3987 257.9834 13.722 0.1621 4651 +4653 2 273.2593 258.0807 13.6846 0.1412 4652 +4654 2 272.1221 258.2077 13.6588 0.1378 4653 +4655 2 270.9839 258.3209 13.6389 0.1383 4654 +4656 2 269.8444 258.4227 13.6245 0.1391 4655 +4657 2 268.705 258.5246 13.6149 0.1406 4656 +4658 2 267.6022 258.3026 13.6078 0.1433 4657 +4659 2 266.52 257.932 13.6022 0.1488 4658 +4660 2 265.4423 257.5464 13.5944 0.1568 4659 +4661 2 264.4459 256.9962 13.5856 0.182 4660 +4662 2 263.589 256.2468 13.5715 0.1788 4661 +4663 2 262.8809 255.3522 13.5547 0.1669 4662 +4664 2 262.365 254.3364 13.5399 0.1616 4663 +4665 2 262.2689 253.2198 13.5393 0.1846 4664 +4666 2 262.3981 252.0838 13.5829 0.1832 4665 +4667 2 262.5709 250.9536 13.651 0.1755 4666 +4668 2 262.7448 249.8233 13.7511 0.1761 4667 +4669 2 262.8351 248.6862 13.8931 0.2199 4668 +4670 2 263.0296 247.5639 14.0775 0.2073 4669 +4671 2 263.2882 246.4531 14.2584 0.1716 4670 +4672 2 263.6108 245.3571 14.4033 0.1438 4671 +4673 2 264.0432 244.3001 14.5139 0.1373 4672 +4674 2 264.5077 243.2556 14.6172 0.1373 4673 +4675 2 264.9698 242.21 14.7211 0.1373 4674 +4676 2 265.4217 241.1598 14.8274 0.1373 4675 +4677 2 265.7867 240.1313 15.5644 0.1373 4676 +4678 2 265.5521 239.0537 16.002 0.1372 4677 +4679 2 264.5866 238.532 16.1611 0.1372 4678 +4680 2 263.4918 238.2071 16.3073 0.1371 4679 +4681 2 262.4725 237.7015 16.5372 0.1368 4680 +4682 2 261.6522 236.9281 16.9444 0.1364 4681 +4683 2 261.0802 235.9511 17.3456 0.1356 4682 +4684 2 260.5998 234.9204 17.6556 0.1342 4683 +4685 2 260.0895 233.9 17.88 0.1313 4684 +4686 2 259.5416 232.8978 18.025 0.1271 4685 +4687 2 258.9936 231.8934 18.0981 0.1144 4686 +4688 2 258.3484 230.9496 18.1359 0.1144 4687 +4689 2 299.9271 280.9115 13.8622 0.1862 4618 +4690 2 298.8254 280.6106 13.7992 0.1702 4689 +4691 2 297.7066 280.3715 13.7255 0.2036 4690 +4692 2 296.6632 279.9048 13.6494 0.2511 4691 +4693 2 295.597 279.4918 13.5748 0.2592 4692 +4694 2 294.4748 279.2767 13.5024 0.1923 4693 +4695 2 293.333 279.2104 13.4321 0.1691 4694 +4696 2 292.189 279.2092 13.3607 0.1913 4695 +4697 2 291.0462 279.2104 13.2871 0.2342 4696 +4698 2 289.9022 279.231 13.2121 0.2891 4697 +4699 2 288.7605 279.3042 13.1431 0.2012 4698 +4700 2 287.621 279.3923 13.0854 0.1754 4699 +4701 2 286.477 279.4334 13.0392 0.1571 4700 +4702 2 285.3342 279.4689 13.0045 0.1481 4701 +4703 2 284.1936 279.5616 12.9791 0.1431 4702 +4704 2 283.0542 279.6588 12.9613 0.1404 4703 +4705 2 281.9262 279.8521 12.948 0.139 4704 +4706 2 280.8966 280.3486 12.9382 0.1382 4705 +4707 2 279.9036 280.9172 12.9303 0.1377 4706 +4708 2 278.8969 281.4595 12.9235 0.1375 4707 +4709 2 277.9382 282.0829 12.9174 0.1374 4708 +4710 2 277.118 282.8803 12.9109 0.1374 4709 +4711 2 276.4133 283.7806 12.9036 0.1373 4710 +4712 2 275.5885 284.5734 12.8944 0.1373 4711 +4713 2 274.584 285.1203 12.8827 0.1373 4712 +4714 2 273.5762 285.6614 12.8667 0.1373 4713 +4715 2 273.1918 286.7356 12.8442 0.1373 4714 +4716 2 272.4001 287.5616 12.8128 0.1373 4715 +4717 2 271.7904 288.5282 12.7689 0.1373 4716 +4718 2 270.945 289.2993 12.7134 0.1373 4717 +4719 2 270.2311 290.1928 12.6476 0.1373 4718 +4720 2 269.5939 291.1411 12.5742 0.1373 4719 +4721 2 268.6547 291.7944 12.5087 0.1373 4720 +4722 2 267.7429 292.483 12.3578 0.1144 4721 +4723 2 301.5996 282.3552 14.3959 0.1146 4618 +4724 2 302.2276 283.3105 14.523 0.1807 4723 +4725 2 302.8019 284.3 14.5589 0.1567 4724 +4726 2 303.2595 285.3479 14.5855 0.1271 4725 +4727 2 303.613 286.4359 14.6182 0.1144 4726 +4728 2 287.0879 269.9039 25.0306 0.2696 -1 +4729 2 287.7663 269.7781 24.8207 0.5609 4728 +4730 2 288.8829 269.5756 24.4612 0.3351 4729 +4731 2 290.0074 269.3823 24.2711 0.2277 4730 +4732 2 291.1491 269.4234 24.1012 0.2179 4731 +4733 2 292.2909 269.4086 23.9305 0.234 4732 +4734 2 293.4291 269.3422 23.7086 0.2261 4733 +4735 2 294.548 269.1317 23.4433 0.1739 4734 +4736 2 295.6268 268.7691 23.1705 0.1397 4735 +4737 2 296.6609 268.2909 22.9219 0.1144 4736 +4738 2 297.6459 267.7246 22.5898 0.1144 4737 +4739 2 287.2515 270.6807 25.0923 0.2206 4728 +4740 2 287.2573 271.8224 25.1805 0.1784 4739 +4741 2 287.2893 272.9653 25.3146 0.1604 4740 +4742 2 287.6794 274.0315 25.5734 0.1907 4741 +4743 2 288.1942 275.0462 25.852 0.1753 4742 +4744 2 288.6026 276.1113 26.0863 0.1659 4743 +4745 2 288.9035 277.2106 26.3127 0.1639 4744 +4746 2 289.3073 278.2791 26.4926 0.1989 4745 +4747 2 289.7443 279.3351 26.578 0.1912 4746 +4748 2 290.0681 280.4322 26.6323 0.1896 4747 +4749 2 290.2271 281.5647 26.6634 0.2359 4748 +4750 2 290.3255 282.7041 26.6703 0.1968 4749 +4751 2 290.6115 283.8115 26.6544 0.1629 4750 +4752 2 290.902 284.9189 26.6512 0.1374 4751 +4753 2 291.3299 285.9794 26.6095 0.1375 4752 +4754 2 291.5038 286.3787 26.5261 0.1377 4753 +4755 2 291.9408 287.4334 26.329 0.138 4754 +4756 2 292.3984 288.4779 26.1268 0.1385 4755 +4757 2 293.0104 289.4366 25.886 0.1396 4756 +4758 2 293.6705 290.3655 25.6452 0.1417 4757 +4759 2 294.3649 291.2704 25.4484 0.1454 4758 +4760 2 294.9518 292.2485 25.3318 0.1522 4759 +4761 2 294.7928 293.3262 25.0631 0.1684 4760 +4762 2 294.7516 292.983 23.2768 0.4124 4761 +4763 2 294.9266 292.3012 21.0915 0.4029 4762 +4764 2 295.7801 292.451 19.7832 0.2919 4763 +4765 2 296.7387 292.9109 18.7446 0.2546 4764 +4766 2 297.7935 292.8892 17.6685 0.3584 4765 +4767 2 298.8551 292.9532 16.6391 0.2975 4766 +4768 2 299.8218 293.3994 15.6184 0.278 4767 +4769 2 300.864 293.6945 14.7358 0.2419 4768 +4770 2 301.9462 293.5115 13.9548 0.3059 4769 +4771 2 302.985 293.1214 13.2851 0.3285 4770 +4772 2 304.0855 292.9692 12.7386 0.2688 4771 +4773 2 304.8337 293.7563 11.8569 0.3432 4772 +4774 2 295.2572 294.0618 25.0062 0.1877 4761 +4775 2 295.9265 294.9884 25.1204 0.2571 4774 +4776 2 296.4516 295.9986 25.3847 0.2381 4775 +4777 2 297.3336 296.701 25.7891 0.2636 4776 +4778 2 296.7216 295.7961 26.6181 0.178 4777 +4779 2 296.3086 294.7768 27.0414 0.1528 4778 +4780 2 296.6735 293.7254 27.2705 0.1596 4779 +4781 2 297.3496 292.8091 27.3894 0.1794 4780 +4782 2 298.1424 291.9854 27.4277 0.2116 4781 +4783 2 298.9741 291.1995 27.4144 0.2937 4782 +4784 2 299.8664 290.4845 27.3635 0.3376 4783 +4785 2 300.8114 289.8416 27.2861 0.3343 4784 +4786 2 301.8135 289.2913 27.1777 0.2556 4785 +4787 2 302.8774 288.8772 27.074 0.207 4786 +4788 2 303.9322 288.4367 27.0025 0.233 4787 +4789 2 304.9012 287.8315 26.9309 0.201 4788 +4790 2 305.7534 287.0731 26.7937 0.1668 4789 +4791 2 306.4879 286.1991 26.6064 0.1412 4790 +4792 2 307.1995 285.3079 26.3954 0.1406 4791 +4793 2 307.9236 284.4293 26.143 0.1433 4792 +4794 2 308.6741 283.5759 25.8292 0.1492 4793 +4795 2 309.42 282.7179 25.5108 0.1571 4794 +4796 2 310.1304 281.8255 25.2933 0.186 4795 +4797 2 310.8545 280.9401 25.1867 0.169 4796 +4798 2 311.6027 280.0764 25.1601 0.1528 4797 +4799 2 312.3829 279.239 25.1776 0.1418 4798 +4800 2 313.1837 278.4221 25.2254 0.1448 4799 +4801 2 313.8953 277.5264 25.283 0.1509 4800 +4802 2 314.6183 276.6409 25.3375 0.1635 4801 +4803 2 315.4237 275.8287 25.3714 0.1811 4802 +4804 2 316.4922 275.4317 25.4082 0.243 4803 +4805 2 317.6202 275.2498 25.5367 0.2143 4804 +4806 2 318.7424 275.0405 25.7043 0.1922 4805 +4807 2 319.033 273.8908 25.7331 0.1329 4806 +4808 2 319.1771 272.7593 25.5555 0.149 4807 +4809 2 319.2561 271.6211 25.396 0.1598 4808 +4810 2 319.3041 270.4839 25.1193 0.1764 4809 +4811 2 319.3762 269.3525 24.7415 0.2248 4810 +4812 2 319.4506 268.2257 24.2925 0.2279 4811 +4813 2 319.5375 267.1057 23.7719 0.2139 4812 +4814 2 319.7377 266.0155 23.1054 0.1793 4813 +4815 2 320.129 264.979 22.44 0.1547 4814 +4816 2 320.6014 263.9586 21.9301 0.1419 4815 +4817 2 321.0728 262.9278 21.5695 0.1407 4816 +4818 2 321.3965 261.8387 21.3083 0.1435 4817 +4819 2 321.3187 260.7187 21.0599 0.1488 4818 +4820 2 321.1185 259.5965 20.803 0.1594 4819 +4821 2 320.8165 258.5017 20.4933 0.1743 4820 +4822 2 320.3726 257.4595 20.1421 0.2248 4821 +4823 2 320.6083 256.439 19.4986 0.2009 4822 +4824 2 321.2444 255.5376 18.7677 0.1675 4823 +4825 2 321.6814 254.5137 18.1248 0.1471 4824 +4826 2 321.9731 253.4349 17.526 0.1551 4825 +4827 2 322.0017 252.3161 16.9594 0.1713 4826 +4828 2 321.9754 251.1938 16.4141 0.1956 4827 +4829 2 322.2305 250.099 15.8962 0.2685 4828 +4830 2 322.2808 248.844 16.2132 0.1148 4829 +4831 2 323.0953 248.0421 16.312 0.1525 4830 +4832 2 324.0357 247.3923 16.3766 0.1525 4831 +4833 2 324.9681 246.7299 16.4598 0.2288 4832 +4834 2 321.4777 249.0717 14.9591 0.2373 4829 +4835 2 321.1437 248.0158 14.3312 0.2483 4834 +4836 2 321.1425 246.8958 13.7948 0.2002 4835 +4837 2 320.9709 245.777 13.3994 0.1664 4836 +4838 2 320.5076 244.7394 13.1172 0.1422 4837 +4839 2 320.0065 243.7143 12.9359 0.1436 4838 +4840 2 319.8109 242.5909 12.8331 0.1494 4839 +4841 2 320.058 241.479 12.7984 0.1578 4840 +4842 2 320.4538 240.4059 12.8628 0.1856 4841 +4843 2 320.8634 239.3374 12.9394 0.1782 4842 +4844 2 321.3107 238.2872 12.782 0.1144 4843 +4845 2 319.6954 274.7087 25.803 0.2028 4806 +4846 2 320.7879 274.3724 25.8199 0.2068 4845 +4847 2 321.9033 274.1253 25.8348 0.2185 4846 +4848 2 323.0347 274.0749 25.7832 0.2008 4847 +4849 2 324.1604 274.2465 25.5361 0.1653 4848 +4850 2 325.285 274.298 25.1829 0.1454 4849 +4851 2 326.4107 274.1607 24.8392 0.1424 4850 +4852 2 327.5375 274.0189 24.5228 0.147 4851 +4853 2 328.6735 273.9571 24.239 0.154 4852 +4854 2 329.8129 273.9457 23.9983 0.1745 4853 +4855 2 330.9546 273.9457 23.8 0.176 4854 +4856 2 332.0952 273.9171 23.6248 0.1584 4855 +4857 2 333.2346 273.8461 23.4542 0.1448 4856 +4858 2 334.374 273.7718 23.2813 0.1413 4857 +4859 2 335.5158 273.7306 23.1079 0.1447 4858 +4860 2 336.6575 273.718 22.9368 0.1513 4859 +4861 2 337.798 273.7489 22.77 0.1618 4860 +4862 2 338.9375 273.8336 22.6166 0.1894 4861 +4863 2 340.0609 274.0292 22.4908 0.2018 4862 +4864 2 341.1362 274.4021 22.4038 0.2136 4863 +4865 2 342.2242 274.7419 22.3611 0.2133 4864 +4866 2 343.3499 274.9364 22.3674 0.2322 4865 +4867 2 344.4664 275.1732 22.4266 0.217 4866 +4868 2 345.5475 275.5393 22.5408 0.1759 4867 +4869 2 346.6057 275.9683 22.711 0.1471 4868 +4870 2 347.6776 276.3538 22.9338 0.1373 4869 +4871 2 348.7873 276.5929 23.1994 0.1373 4870 +4872 2 349.921 276.6787 23.4774 0.1373 4871 +4873 2 351.0604 276.6924 23.7292 0.1373 4872 +4874 2 352.201 276.6924 23.9245 0.1373 4873 +4875 2 353.3438 276.6913 24.0349 0.1373 4874 +4876 2 354.4867 276.6432 24.0409 0.1374 4875 +4877 2 355.6055 276.4304 23.9484 0.1374 4876 +4878 2 356.6912 276.0781 23.7997 0.1375 4877 +4879 2 357.6842 275.529 23.6519 0.1376 4878 +4880 2 358.5388 274.7774 23.526 0.1379 4879 +4881 2 359.5306 274.2626 23.3668 0.1385 4880 +4882 2 360.6151 273.9079 23.1613 0.1394 4881 +4883 2 361.6779 273.4972 22.9373 0.1413 4882 +4884 2 362.6411 272.8989 22.6841 0.1447 4883 +4885 2 363.4957 272.1496 22.3969 0.1514 4884 +4886 2 364.2771 271.3248 22.0834 0.1616 4885 +4887 2 364.9978 270.4485 21.7517 0.1919 4886 +4888 2 365.7379 269.587 21.4047 0.1927 4887 +4889 2 366.477 268.7279 21.0395 0.202 4888 +4890 2 367.1393 267.8115 20.6304 0.1851 4889 +4891 2 367.7926 266.8895 20.1898 0.1718 4890 +4892 2 368.5979 266.1013 19.7851 0.1833 4891 +4893 2 369.5806 265.5499 19.4044 0.1712 4892 +4894 2 370.6171 265.09 19.0445 0.1539 4893 +4895 2 371.6353 264.5855 18.7337 0.1408 4894 +4896 2 372.4658 263.8201 18.4984 0.139 4895 +4897 2 373.3433 263.0948 18.2705 0.1404 4896 +4898 2 374.2756 262.4416 17.9996 0.1431 4897 +4899 2 375.2206 261.8101 17.6721 0.1484 4898 +4900 2 376.0843 261.0791 17.2874 0.1559 4899 +4901 2 376.8176 260.2211 16.8597 0.1823 4900 +4902 2 377.5086 259.3276 16.4134 0.1704 4901 +4903 2 378.2316 258.4605 15.9662 0.1534 4902 +4904 2 379.0186 257.6517 15.5222 0.1407 4903 +4905 2 379.9556 257.0271 15.0739 0.1401 4904 +4906 2 380.9909 256.5798 14.6346 0.1425 4905 +4907 2 382.0331 256.1324 14.2737 0.1468 4906 +4908 2 383.1519 255.9528 13.9642 0.156 4907 +4909 2 384.2936 255.9608 13.8092 0.1673 4908 +4910 2 385.4285 256.0981 13.8527 0.2177 4909 +4911 2 386.4638 256.5603 14.1396 0.1645 4910 +4912 2 387.5186 256.7605 15.1094 0.1144 4911 +4913 2 297.996 296.8817 26.7935 0.1174 4777 +4914 2 298.473 297.7969 27.9745 0.2434 4913 +4915 2 298.5245 298.9146 28.5208 0.2167 4914 +4916 2 298.695 300.0197 29.0984 0.2012 4915 +4917 2 299.1251 301.0528 29.6876 0.2053 4916 +4918 2 299.6388 302.0492 30.2417 0.284 4917 +4919 2 300.0735 303.0879 30.7264 0.2939 4918 +4920 2 300.2554 304.2056 31.122 0.3003 4919 +4921 2 300.2542 305.3416 31.4412 0.2527 4920 +4922 2 300.0506 306.4444 31.9967 0.1144 4921 +4923 2 290.1779 285.1889 26.892 0.1253 4753 +4924 2 289.2798 284.4842 27.0022 0.1778 4923 +4925 2 288.4653 283.6891 27.2648 0.2102 4924 +4926 2 287.7057 282.8494 27.624 0.21 4925 +4927 2 287.128 281.893 28.105 0.1762 4926 +4928 2 286.6978 280.8703 28.7277 0.1549 4927 +4929 2 285.9908 280.026 29.3056 0.1561 4928 +4930 2 285.0745 279.3648 29.7097 0.1706 4929 +4931 2 284.0552 278.9003 30.0614 0.2094 4930 +4932 2 282.9901 279.0193 30.3853 0.2245 4931 +4933 2 281.9983 279.5753 30.6191 0.1943 4932 +4934 2 280.9824 280.089 30.7244 0.1849 4933 +4935 2 279.8762 280.2274 30.76 0.1746 4934 +4936 2 278.8203 279.8556 30.835 0.156 4935 +4937 2 277.8662 279.2298 30.9137 0.1413 4936 +4938 2 277.2335 278.3123 30.8613 0.1373 4937 +4939 2 277.5458 277.2644 30.998 0.1373 4938 +4940 2 277.7621 276.1502 31.316 0.1373 4939 +4941 2 277.8559 275.0233 31.747 0.1374 4940 +4942 2 277.8273 273.9022 32.2599 0.1375 4941 +4943 2 277.0047 273.1369 32.7804 0.1376 4942 +4944 2 276.0941 272.4756 33.2886 0.1379 4943 +4945 2 275.084 271.9734 33.745 0.1384 4944 +4946 2 273.9949 271.6668 34.169 0.1393 4945 +4947 2 272.9492 271.231 34.5624 0.1413 4946 +4948 2 272.0352 270.5594 34.916 0.1441 4947 +4949 2 271.1394 269.8593 35.2262 0.1525 4948 +4950 2 270.2414 269.1592 35.4973 0.1532 4949 +4951 2 269.3262 268.4979 35.9478 0.2288 4950 +4952 2 286.5972 268.7176 24.9768 0.2258 4728 +4953 2 286.016 267.7326 24.9437 0.2095 4952 +4954 2 285.5744 266.679 24.9212 0.2252 4953 +4955 2 285.285 265.5727 24.9045 0.2414 4954 +4956 2 284.983 264.4688 24.8904 0.1817 4955 +4957 2 284.6398 263.3774 24.8742 0.1636 4956 +4958 2 284.2348 262.3192 24.851 0.1542 4957 +4959 2 283.4706 261.4681 24.8137 0.1745 4958 +4960 2 282.6755 260.6467 24.7548 0.2087 4959 +4961 2 281.8805 259.8241 24.6709 0.2606 4960 +4962 2 281.122 258.9753 24.5652 0.2403 4961 +4963 2 280.5671 257.9754 24.4442 0.2521 4962 +4964 2 280.0123 256.9767 24.3166 0.187 4963 +4965 2 279.3865 256.0203 24.1807 0.1666 4964 +4966 2 278.8511 255.0205 23.9949 0.1526 4965 +4967 2 278.6166 253.9062 23.732 0.1457 4966 +4968 2 278.4164 252.7908 23.3717 0.1418 4967 +4969 2 278.3615 251.664 22.9117 0.1397 4968 +4970 2 278.2586 250.5635 22.3161 0.1386 4969 +4971 2 277.8776 249.5384 21.7305 0.1379 4970 +4972 2 277.6282 248.4253 21.6122 0.1376 4971 +4973 2 277.2415 247.3534 21.6748 0.1375 4972 +4974 2 276.737 246.3307 21.871 0.1374 4973 +4975 2 276.2531 245.3022 22.1598 0.1373 4974 +4976 2 275.9442 244.2177 22.5158 0.1373 4975 +4977 2 275.6479 243.1252 22.852 0.1373 4976 +4978 2 275.3471 242.0292 23.1372 0.152 4977 +4979 2 275.1 240.9161 23.3559 0.1827 4978 +4980 2 274.878 239.795 23.4549 0.2205 4979 +4981 2 274.7842 238.659 23.3774 0.1985 4980 +4982 2 274.941 237.5402 23.1119 0.1665 4981 +4983 2 275.2167 236.4373 22.81 0.1531 4982 +4984 2 275.577 235.3574 22.5678 0.1549 4983 +4985 2 276.022 234.3061 22.3771 0.1764 4984 +4986 2 276.5231 233.2799 22.2149 0.2094 4985 +4987 2 277.1546 232.3315 22.0727 0.2103 4986 +4988 2 277.7895 231.3832 21.9118 0.1794 4987 +4989 2 278.3592 230.3947 21.7206 0.1594 4988 +4990 2 278.9861 229.4429 21.5185 0.1493 4989 +4991 2 279.7137 228.5655 21.3108 0.1438 4990 +4992 2 280.5305 227.7704 21.0974 0.1408 4991 +4993 2 281.3874 227.0176 20.8804 0.1392 4992 +4994 2 282.1905 226.21 20.6607 0.1575 4993 +4995 2 282.9409 225.3508 20.4387 0.1888 4994 +4996 2 283.672 224.4757 20.218 0.2362 4995 +4997 2 284.4522 223.6451 20.0057 0.2169 4996 +4998 2 285.3514 222.9484 19.815 0.2099 4997 +4999 2 286.2986 222.3089 19.6596 0.1793 4998 +5000 2 287.239 221.6855 19.2916 0.1506 4999 +5001 2 288.1828 221.0471 19.4792 0.1429 5000 +5002 2 289.1231 220.3962 19.5541 0.1403 5001 +5003 2 290.1687 219.9351 19.6602 0.1144 5002 +5004 2 320.5602 303.2527 23.0233 0.3432 -1 +5005 2 320.0351 302.2917 22.2088 0.3184 5004 +5006 2 319.2183 301.5138 21.771 0.2466 5005 +5007 2 318.2631 300.9155 21.2945 0.2444 5006 +5008 2 317.4371 300.1547 20.7599 0.2112 5007 +5009 2 316.6352 299.3802 20.1359 0.2116 5008 +5010 2 316.0723 298.4341 19.3885 0.1712 5009 +5011 2 315.6342 297.4148 18.768 0.2098 5010 +5012 2 315.8435 296.3235 18.1082 0.287 5011 +5013 2 315.9945 295.2115 17.5781 0.3573 5012 +5014 2 315.9808 294.0812 17.1643 0.2615 5013 +5015 2 315.8584 292.9578 16.7264 0.2035 5014 +5016 2 315.6971 291.8401 16.2848 0.173 5015 +5017 2 315.553 290.7133 15.9403 0.1581 5016 +5018 2 315.4477 289.5796 15.7 0.1627 5017 +5019 2 315.4168 288.439 15.4848 0.1754 5018 +5020 2 315.4008 287.2984 15.2811 0.1849 5019 +5021 2 315.2967 286.1659 15.0096 0.1646 5020 +5022 2 315.1411 285.0448 14.5935 0.1972 5021 +5023 2 314.918 283.9419 14.1438 0.2469 5022 +5024 2 314.4776 282.902 13.7508 0.256 5023 +5025 2 314.0394 281.8553 13.5848 0.1894 5024 +5026 2 313.7569 280.7479 13.5032 0.1676 5025 +5027 2 313.5601 279.6256 13.4704 0.1581 5026 +5028 2 313.5132 278.4828 13.4867 0.1652 5027 +5029 2 313.5109 277.3388 13.5447 0.1793 5028 +5030 2 313.5109 276.1959 13.6291 0.1775 5029 +5031 2 313.5109 275.0519 13.718 0.1553 5030 +5032 2 313.4995 273.9091 13.7961 0.1478 5031 +5033 2 313.4137 272.7708 13.8591 0.1428 5032 +5034 2 313.218 271.6439 13.9036 0.1454 5033 +5035 2 313.0522 270.5148 13.9279 0.1585 5034 +5036 2 312.9698 269.3742 13.9335 0.1864 5035 +5037 2 312.8783 268.2348 13.9221 0.2143 5036 +5038 2 312.8737 267.0931 13.8949 0.2298 5037 +5039 2 313.0545 265.9697 13.861 0.2209 5038 +5040 2 313.3347 264.8612 13.8384 0.1754 5039 +5041 2 313.4869 263.7309 13.8418 0.1592 5040 +5042 2 313.5098 262.588 13.8815 0.1597 5041 +5043 2 313.5109 261.444 13.9686 0.1835 5042 +5044 2 313.5258 260.3023 14.114 0.2168 5043 +5045 2 313.6265 259.1686 14.3255 0.2124 5044 +5046 2 313.6676 258.0464 14.629 0.1698 5045 +5047 2 313.1105 257.1289 14.9879 0.1549 5046 +5048 2 312.2857 256.3498 15.3451 0.1466 5047 +5049 2 311.4654 255.5662 15.6937 0.1423 5048 +5050 2 310.6726 254.7505 16.0032 0.14 5049 +5051 2 309.9256 253.8914 16.2556 0.1467 5050 +5052 2 309.2289 252.9887 16.4503 0.1694 5051 +5053 2 308.562 252.061 16.5946 0.2032 5052 +5054 2 307.8207 251.1938 16.6986 0.2103 5053 +5055 2 306.9707 250.4319 16.7721 0.1909 5054 +5056 2 306.0886 249.7032 16.8242 0.1841 5055 +5057 2 305.2066 248.9756 16.8617 0.1924 5056 +5058 2 304.2914 248.2903 16.8927 0.1747 5057 +5059 2 303.3442 247.6485 16.9307 0.1559 5058 +5060 2 302.4461 246.945 16.9911 0.1557 5059 +5061 2 301.6442 246.1327 17.0838 0.1745 5060 +5062 2 300.9063 245.2599 17.2073 0.2061 5061 +5063 2 300.2176 244.3492 17.3581 0.2116 5062 +5064 2 299.5644 243.4123 17.4992 0.1829 5063 +5065 2 298.9855 242.4273 17.5673 0.169 5064 +5066 2 298.5245 241.3829 17.5116 0.1741 5065 +5067 2 298.3804 240.2675 17.3234 0.1876 5066 +5068 2 298.7018 239.1967 17.0439 0.1687 5067 +5069 2 299.2761 238.2231 16.6708 0.1533 5068 +5070 2 299.9099 237.2908 16.2098 0.1461 5069 +5071 2 300.5242 236.347 15.7055 0.1514 5070 +5072 2 301.0974 235.3803 15.1949 0.1655 5071 +5073 2 301.7986 234.5006 14.7403 0.1844 5072 +5074 2 302.5354 233.6345 14.4262 0.1625 5073 +5075 2 303.041 232.6187 14.2175 0.1508 5074 +5076 2 303.3465 231.5204 14.0555 0.1446 5075 +5077 2 303.5535 230.397 13.9314 0.1412 5076 +5078 2 303.7846 229.277 13.8514 0.1611 5077 +5079 2 304.1152 228.1834 13.8091 0.1928 5078 +5080 2 304.5248 227.1149 13.7218 0.2305 5079 +5081 2 329.0624 325.0047 25.2031 0.1373 -1 +5082 2 329.0453 325.6545 25.652 0.2808 5081 +5083 2 328.9869 326.7859 25.7807 0.2532 5082 +5084 2 328.805 327.9127 25.7344 0.178 5083 +5085 2 328.5179 329.019 25.6836 0.144 5084 +5086 2 328.1758 330.1104 25.597 0.1378 5085 +5087 2 327.859 331.2086 25.4951 0.1382 5086 +5088 2 327.5752 332.316 25.4419 0.139 5087 +5089 2 327.2984 333.4268 25.4392 0.1405 5088 +5090 2 326.9426 334.5125 25.3519 0.1432 5089 +5091 2 326.4633 335.5455 25.1577 0.1488 5090 +5092 2 325.8993 336.5351 24.9018 0.1568 5091 +5093 2 325.3753 337.5452 24.6174 0.1837 5092 +5094 2 324.9463 338.5988 24.328 0.1733 5093 +5095 2 324.6031 339.6822 24.0149 0.1584 5094 +5096 2 324.515 340.8136 23.783 0.1505 5095 +5097 2 324.3583 341.945 23.6424 0.1565 5096 +5098 2 324.1227 343.0639 23.5527 0.1835 5097 +5099 2 323.9225 344.1896 23.4783 0.1709 5098 +5100 2 323.7657 345.321 23.3713 0.1546 5099 +5101 2 323.7783 346.4638 23.378 0.1432 5100 +5102 2 323.6525 347.5998 23.4237 0.1465 5101 +5103 2 323.3836 348.7106 23.3985 0.1546 5102 +5104 2 323.1354 349.8272 23.317 0.1691 5103 +5105 2 322.9146 350.9495 23.2442 0.1981 5104 +5106 2 322.8585 352.0912 23.1715 0.2414 5105 +5107 2 322.9638 353.2294 23.0822 0.3744 5106 +5108 2 322.7247 354.346 23.0828 0.3646 5107 +5109 2 322.4215 355.4477 23.1757 0.2679 5108 +5110 2 322.1149 356.5482 23.3295 0.1948 5109 +5111 2 321.8095 357.6476 23.5134 0.206 5110 +5112 2 321.5029 358.747 23.7085 0.2076 5111 +5113 2 321.3782 359.883 23.836 0.2034 5112 +5114 2 321.3874 361.027 23.8 0.3432 5113 +5115 2 329.4457 324.6466 24.5113 0.1373 5081 +5116 2 330.4982 324.2691 24.0071 0.1373 5115 +5117 2 331.6262 324.1135 23.7711 0.1373 5116 +5118 2 332.7656 324.1867 23.6339 0.1373 5117 +5119 2 333.9073 324.2611 23.5737 0.1374 5118 +5120 2 335.0479 324.3492 23.5818 0.1374 5119 +5121 2 336.1919 324.3572 23.6466 0.1376 5120 +5122 2 337.3256 324.5048 23.6888 0.1378 5121 +5123 2 338.4558 324.6821 23.7041 0.1383 5122 +5124 2 339.5987 324.6283 23.7273 0.1391 5123 +5125 2 340.7198 324.856 23.7553 0.1407 5124 +5126 2 341.8478 325.039 23.8207 0.1434 5125 +5127 2 342.9804 325.1992 23.9278 0.1494 5126 +5128 2 344.1232 325.2106 24.0193 0.1571 5127 +5129 2 345.2672 325.2106 24.0918 0.1867 5128 +5130 2 346.4112 325.2106 24.1461 0.1669 5129 +5131 2 347.5552 325.2106 24.185 0.15 5130 +5132 2 348.6992 325.2106 24.2122 0.1373 5131 +5133 2 349.8432 325.2106 24.2363 0.1373 5132 +5134 2 350.9861 325.2106 24.2687 0.1373 5133 +5135 2 352.082 325.5401 24.3138 0.1373 5134 +5136 2 353.0464 325.9393 23.9833 0.1196 5135 +5137 2 354.1229 326.1796 23.257 0.1416 5136 +5138 2 355.2429 326.3088 22.7927 0.1459 5137 +5139 2 356.3732 326.3489 22.3735 0.1537 5138 +5140 2 357.5069 326.374 22.0252 0.1666 5139 +5141 2 358.6348 326.493 21.7129 0.1967 5140 +5142 2 359.74 326.763 21.458 0.2228 5141 +5143 2 360.8245 327.1165 21.2652 0.185 5142 +5144 2 361.9044 327.4837 21.0426 0.1534 5143 +5145 2 362.9306 327.9631 20.7481 0.1373 5144 +5146 2 363.8195 328.6563 20.4285 0.1373 5145 +5147 2 364.5608 329.5178 20.1364 0.1373 5146 +5148 2 365.3089 330.3735 19.931 0.1373 5147 +5149 2 366.2013 331.077 19.8657 0.1373 5148 +5150 2 367.2549 331.3665 19.9871 0.1373 5149 +5151 2 368.3909 331.2738 20.2328 0.1373 5150 +5152 2 369.528 331.196 20.4259 0.1373 5151 +5153 2 370.6697 331.1411 20.4806 0.1373 5152 +5154 2 371.8114 331.0702 20.3848 0.1373 5153 +5155 2 372.9486 330.9935 20.1682 0.1373 5154 +5156 2 374.0766 330.862 19.8537 0.1373 5155 +5157 2 375.1817 330.6114 19.4905 0.1373 5156 +5158 2 376.2891 330.37 19.1446 0.1373 5157 +5159 2 377.4067 330.1573 18.8451 0.1374 5158 +5160 2 378.5107 329.8793 18.5924 0.1374 5159 +5161 2 379.5758 329.4777 18.3809 0.1375 5160 +5162 2 380.658 329.1242 18.1998 0.1377 5161 +5163 2 381.7688 328.8668 17.9899 0.1381 5162 +5164 2 382.8842 328.638 17.7068 0.1388 5163 +5165 2 383.9962 328.4058 17.3706 0.1401 5164 +5166 2 385.107 328.1816 16.992 0.1425 5165 +5167 2 386.2041 327.9116 16.5623 0.1471 5166 +5168 2 387.2737 327.5615 16.0814 0.1541 5167 +5169 2 388.3697 327.3224 15.5899 0.176 5168 +5170 2 389.3181 327.6736 14.7486 0.1666 5169 +5171 2 389.8832 328.6312 14.109 0.1482 5170 +5172 2 390.0033 329.7557 13.6978 0.1342 5171 +5173 2 390.0846 330.8917 13.4367 0.1313 5172 +5174 2 390.1795 332.03 13.2767 0.1271 5173 +5175 2 390.2573 333.1717 13.2396 0.1144 5174 +5176 2 390.2401 334.3123 13.449 0.1144 5175 +5177 2 353.091 324.9017 24.4677 0.1373 5135 +5178 2 354.0566 324.2908 24.5947 0.1373 5177 +5179 2 355.021 323.6776 24.7392 0.1373 5178 +5180 2 356.0208 323.1331 25.0015 0.1373 5179 +5181 2 356.0185 323.1239 25.4757 0.1144 5180 +5182 2 355.7165 322.0349 25.0467 0.1144 5181 +5183 2 355.3916 320.9503 24.64 0.1144 5182 +5184 2 356.3629 323.1159 25.0695 0.1373 5180 +5185 2 357.5023 323.061 25.2723 0.1373 5184 +5186 2 358.644 323.005 25.4183 0.1373 5185 +5187 2 359.7857 322.9466 25.5188 0.1373 5186 +5188 2 360.924 322.8482 25.5727 0.1373 5187 +5189 2 362.0543 322.6732 25.5754 0.1373 5188 +5190 2 363.18 322.4684 25.5384 0.1373 5189 +5191 2 364.3045 322.2637 25.4813 0.1373 5190 +5192 2 365.4302 322.0589 25.4088 0.1373 5191 +5193 2 366.5548 321.8541 25.3248 0.1373 5192 +5194 2 367.6805 321.6493 25.2327 0.1373 5193 +5195 2 368.805 321.4446 25.134 0.1373 5194 +5196 2 369.9296 321.2398 25.027 0.1373 5195 +5197 2 371.0541 321.035 24.9068 0.1373 5196 +5198 2 372.1787 320.8371 24.7681 0.1373 5197 +5199 2 373.3066 320.6529 24.6111 0.1373 5198 +5200 2 374.4278 320.4447 24.4364 0.1373 5199 +5201 2 375.5443 320.2319 24.17 0.1373 5200 +5202 2 376.67 320.1004 23.7836 0.1373 5201 +5203 2 377.8014 320.0752 23.4719 0.1373 5202 +5204 2 378.9317 320.2216 23.2883 0.1373 5203 +5205 2 380.0425 320.4836 23.2599 0.1373 5204 +5206 2 381.1419 320.7913 23.4159 0.1373 5205 +5207 2 382.255 321.019 23.7088 0.1373 5206 +5208 2 383.3796 321.17 24.0492 0.1373 5207 +5209 2 384.5076 321.3141 24.3662 0.1373 5208 +5210 2 385.6413 321.4228 24.5927 0.1373 5209 +5211 2 386.783 321.4537 24.7136 0.1373 5210 +5212 2 387.927 321.4365 24.7892 0.1373 5211 +5213 2 389.0698 321.4343 24.8734 0.1373 5212 +5214 2 390.2127 321.432 24.9783 0.1373 5213 +5215 2 391.3555 321.4057 25.1 0.1373 5214 +5216 2 392.4984 321.3805 25.24 0.1373 5215 +5217 2 393.6401 321.3999 25.3586 0.1373 5216 +5218 2 394.783 321.4583 25.4229 0.1373 5217 +5219 2 395.9247 321.5223 25.4482 0.1374 5218 +5220 2 397.0584 321.6619 25.4433 0.1375 5219 +5221 2 398.1955 321.7511 25.4145 0.1378 5220 +5222 2 399.3281 321.6367 25.3372 0.1381 5221 +5223 2 400.4435 321.3851 25.2831 0.1389 5222 +5224 2 401.5406 321.0636 25.2848 0.1403 5223 +5225 2 402.6079 320.6563 25.3178 0.143 5224 +5226 2 403.6455 320.177 25.4028 0.1477 5225 +5227 2 404.7323 319.8555 25.5679 0.1572 5226 +5228 2 405.8569 319.7205 25.9095 0.172 5227 +5229 2 406.938 319.8246 26.7022 0.2361 5228 +5230 2 407.0203 319.78 27.6091 0.1537 5229 +5231 2 407.7788 319.1302 28.3329 0.134 5230 +5232 2 408.4217 318.1956 28.5138 0.1376 5231 +5233 2 409.2683 317.4394 28.6835 0.1379 5232 +5234 2 410.3551 317.1248 28.8179 0.1386 5233 +5235 2 411.4533 316.8079 28.8926 0.1397 5234 +5236 2 412.5676 316.5494 28.8991 0.1418 5235 +5237 2 413.6727 316.2565 28.8338 0.1455 5236 +5238 2 414.7515 315.879 28.7014 0.1529 5237 +5239 2 415.7754 315.3768 28.5034 0.164 5238 +5240 2 416.6688 314.6744 28.2425 0.1978 5239 +5241 2 417.5817 313.9983 27.9163 0.1958 5240 +5242 2 418.569 313.448 27.5066 0.1968 5241 +5243 2 419.2806 312.5923 26.9534 0.2473 5242 +5244 2 419.7725 311.5947 26.308 0.2218 5243 +5245 2 420.5115 310.7756 25.5881 0.2203 5244 +5246 2 421.3089 310.0297 24.8224 0.1821 5245 +5247 2 422.4174 309.9679 24.1509 0.1784 5246 +5248 2 423.5385 309.9588 23.5966 0.1917 5247 +5249 2 424.6688 309.9588 23.1693 0.2309 5248 +5250 2 425.7899 309.9588 22.6075 0.3432 5249 +5251 2 407.0924 320.2651 27.2434 0.1962 5229 +5252 2 408.011 320.9217 27.6699 0.1625 5251 +5253 2 409.0486 321.3851 28.0123 0.1373 5252 +5254 2 410.14 321.7077 28.2811 0.1373 5253 +5255 2 411.2714 321.8575 28.4796 0.1373 5254 +5256 2 412.4143 321.8621 28.6328 0.1374 5255 +5257 2 413.556 321.861 28.7862 0.1374 5256 +5258 2 414.6668 321.591 28.9254 0.1376 5257 +5259 2 415.7754 321.3141 29.0436 0.1379 5258 +5260 2 416.9079 321.1597 29.1365 0.1383 5259 +5261 2 418.0451 321.0384 29.2074 0.1392 5260 +5262 2 419.1856 320.9492 29.2592 0.1409 5261 +5263 2 420.3296 320.9469 29.2967 0.1441 5262 +5264 2 421.4736 320.9469 29.3233 0.1497 5263 +5265 2 422.6165 320.8943 29.342 0.1614 5264 +5266 2 423.7536 320.7753 29.3555 0.1769 5265 +5267 2 424.8919 320.6552 29.3653 0.2362 5266 +5268 2 426.0336 320.5911 29.3723 0.1968 5267 +5269 2 427.1765 320.5339 29.3773 0.163 5268 +5270 2 428.317 320.4424 29.3807 0.1379 5269 +5271 2 429.4416 320.2319 29.3835 0.1383 5270 +5272 2 430.565 320.0191 29.3852 0.1392 5271 +5273 2 431.6506 319.6565 29.3866 0.1408 5272 +5274 2 432.7237 319.2595 29.3874 0.1438 5273 +5275 2 433.6801 318.6326 29.388 0.1493 5274 +5276 2 434.5518 317.8913 29.3885 0.1605 5275 +5277 2 435.3904 317.1134 29.3888 0.1751 5276 +5278 2 436.2118 316.3171 29.3891 0.233 5277 +5279 2 437.0503 315.5392 29.3894 0.1907 5278 +5280 2 437.8969 314.7693 29.3894 0.1525 5279 +5281 2 438.7171 313.9719 29.3894 0.1144 5280 +5282 2 439.5259 313.1631 29.3896 0.1144 5281 +5283 2 352.6414 326.0526 24.1278 0.1167 5135 +5284 2 353.4834 326.8259 24.0817 0.1356 5283 +5285 2 354.3265 327.5993 24.0675 0.1373 5284 +5286 2 355.1685 328.3738 24.058 0.1373 5285 +5287 2 356.046 329.1082 24.0547 0.1373 5286 +5288 2 357.1179 329.4937 24.0717 0.1373 5287 +5289 2 358.2344 329.7386 24.126 0.1373 5288 +5290 2 359.0787 330.4959 24.2323 0.1373 5289 +5291 2 359.5912 331.514 24.3916 0.1373 5290 +5292 2 360.5728 332.0826 24.6084 0.1373 5291 +5293 2 361.4891 332.7599 24.8626 0.1373 5292 +5294 2 362.4592 332.4967 23.1185 0.1302 5293 +5295 2 363.5277 332.7187 22.6957 0.1373 5294 +5296 2 364.5493 333.2175 22.4273 0.1373 5295 +5297 2 365.5412 333.7769 22.1702 0.1373 5296 +5298 2 366.5433 334.3203 21.9308 0.1373 5297 +5299 2 367.5809 334.7939 21.7207 0.1373 5298 +5300 2 368.662 335.1577 21.5564 0.1373 5299 +5301 2 369.7774 335.3968 21.4199 0.1373 5300 +5302 2 370.9123 335.526 21.3036 0.1373 5301 +5303 2 372.054 335.5535 21.1999 0.1374 5302 +5304 2 373.1945 335.4883 21.0975 0.1374 5303 +5305 2 374.3179 335.2904 20.9678 0.1375 5304 +5306 2 375.4128 334.9666 20.808 0.1377 5305 +5307 2 376.4778 334.5582 20.6256 0.1381 5306 +5308 2 377.4456 333.9656 20.3966 0.1388 5307 +5309 2 378.2464 333.1648 20.1258 0.1401 5308 +5310 2 378.8825 332.2256 19.8312 0.1424 5309 +5311 2 379.4511 331.2418 19.5238 0.1471 5310 +5312 2 380.0665 330.2888 19.1672 0.1536 5311 +5313 2 380.7278 329.4022 18.4746 0.1819 5312 +5314 2 381.3799 328.5271 17.6485 0.1597 5313 +5315 2 381.9484 327.5672 17.021 0.1387 5314 +5316 2 382.4941 326.5868 16.473 0.1144 5315 +5317 2 383.0215 325.6167 15.7455 0.1144 5316 +5318 2 362.4009 333.0161 25.1632 0.1373 5293 +5319 2 363.3069 333.6247 25.3375 0.1373 5318 +5320 2 364.1226 334.4026 25.4777 0.1373 5319 +5321 2 365.1579 334.8282 25.5821 0.1373 5320 +5322 2 366.1155 335.3464 25.6573 0.1373 5321 +5323 2 366.7298 336.2914 25.7129 0.1373 5322 +5324 2 367.5661 336.94 25.7521 0.1373 5323 +5325 2 368.6849 337.1059 25.7776 0.1373 5324 +5326 2 369.7843 337.3702 25.7949 0.1373 5325 +5327 2 370.489 338.1973 25.8056 0.1373 5326 +5328 2 371.0758 339.1788 25.8114 0.1373 5327 +5329 2 371.9533 339.887 25.8133 0.1373 5328 +5330 2 372.9543 340.4384 25.8121 0.1374 5329 +5331 2 373.8935 341.0882 25.8075 0.1374 5330 +5332 2 374.7584 341.8352 25.7991 0.1376 5331 +5333 2 375.6873 342.501 25.7865 0.1378 5332 +5334 2 376.7112 343.0067 25.7677 0.1382 5333 +5335 2 377.7877 343.3899 25.7406 0.139 5334 +5336 2 378.8939 343.6793 25.7018 0.1404 5335 +5337 2 380.0036 343.955 25.6479 0.143 5336 +5338 2 381.0595 344.3886 25.5748 0.1484 5337 +5339 2 381.9313 345.1151 25.4797 0.1559 5338 +5340 2 382.6669 345.9891 25.3675 0.1825 5339 +5341 2 383.4699 346.8002 25.2468 0.1697 5340 +5342 2 384.3737 347.4992 25.128 0.1523 5341 +5343 2 385.4136 347.9625 25.02 0.1388 5342 +5344 2 386.4947 348.332 24.9314 0.1373 5343 +5345 2 387.3344 349.0905 24.8589 0.1373 5344 +5346 2 388.0379 349.9908 24.8051 0.1373 5345 +5347 2 388.7884 350.8545 24.7627 0.1373 5346 +5348 2 389.5228 351.7308 24.7269 0.1373 5347 +5349 2 390.1452 352.6895 24.6928 0.1373 5348 +5350 2 390.7069 353.6859 24.6566 0.1373 5349 +5351 2 391.4413 354.5599 24.6142 0.1373 5350 +5352 2 392.4515 355.0839 24.5596 0.1373 5351 +5353 2 393.4044 355.7165 24.4847 0.1373 5352 +5354 2 394.1114 356.6111 24.3834 0.1373 5353 +5355 2 394.9649 357.3707 24.2516 0.1373 5354 +5356 2 396.0093 357.8272 24.0887 0.1373 5355 +5357 2 397.1041 358.1521 23.8939 0.1373 5356 +5358 2 398.1395 358.6303 23.6991 0.1372 5357 +5359 2 399.2446 358.9197 23.5289 0.1372 5358 +5360 2 400.2135 359.5237 23.3893 0.1371 5359 +5361 2 401.0738 360.2753 23.2827 0.1368 5360 +5362 2 402.0943 360.7913 23.2053 0.1364 5361 +5363 2 402.7212 361.7465 23.1515 0.1356 5362 +5364 2 403.2314 362.7704 23.1143 0.1342 5363 +5365 2 404.0402 363.5792 23.0874 0.1313 5364 +5366 2 404.9874 364.221 23.0684 0.1271 5365 +5367 2 405.8763 364.9406 23.0549 0.1144 5366 +5368 2 406.4197 365.9473 23.0306 0.1144 5367 +5369 2 328.8771 324.2817 25.2612 0.1373 5081 +5370 2 328.5934 323.1731 25.3 0.1373 5369 +5371 2 328.3097 322.0657 25.2455 0.1373 5370 +5372 2 328.0271 320.9595 25.0738 0.1373 5371 +5373 2 327.51 319.9654 24.76 0.1373 5372 +5374 2 326.8454 319.0502 24.3548 0.1373 5373 +5375 2 326.1704 318.1453 23.8996 0.1373 5374 +5376 2 325.4977 317.2426 23.4005 0.1548 5375 +5377 2 324.8262 316.3435 22.8624 0.1862 5376 +5378 2 324.1558 315.4454 22.299 0.2241 5377 +5379 2 323.4854 314.5474 21.7286 0.1949 5378 +5380 2 322.8116 313.6493 21.1952 0.1839 5379 +5381 2 322.1321 312.7444 20.795 0.2031 5380 +5382 2 321.4651 311.8178 20.6628 0.2351 5381 +5383 2 320.9069 310.8282 20.8998 0.1947 5382 +5384 2 320.3989 309.8581 21.6712 0.1635 5383 +5385 2 321.0075 308.8766 23.1028 0.1493 5384 +5386 2 321.5109 308.1581 24.7907 0.1427 5385 +5387 2 321.7134 307.2178 26.228 0.1396 5386 +5388 2 322.028 306.1733 27.0556 0.1387 5387 +5389 2 322.3483 305.0888 27.4594 0.1521 5388 +5390 2 322.6389 303.9825 27.5179 0.169 5389 +5391 2 322.8665 302.8637 27.3515 0.1839 5390 +5392 2 322.9592 301.7334 27.0098 0.1561 5391 +5393 2 322.9295 300.6043 26.576 0.1485 5392 +5394 2 322.9009 299.4809 26.0898 0.1431 5393 +5395 2 323.1091 298.3838 25.5473 0.1404 5394 +5396 2 323.5621 297.3576 25.01 0.1472 5395 +5397 2 324.0563 296.3452 24.5151 0.188 5396 +5398 2 324.4235 295.2927 24.0813 0.2427 5397 +5399 2 324.2828 294.2082 23.7526 0.2607 5398 +5400 2 323.6605 293.2552 23.5374 0.2117 5399 +5401 2 322.9237 292.3847 23.3615 0.2268 5400 +5402 2 322.163 291.5335 23.1991 0.2516 5401 +5403 2 321.5143 290.6012 23.0514 0.2573 5402 +5404 2 321.0236 289.5693 22.9298 0.249 5403 +5405 2 320.5259 288.5397 22.8607 0.2387 5404 +5406 2 320.0374 287.5089 22.8509 0.2574 5405 +5407 2 319.74 286.4107 22.8791 0.3221 5406 +5408 2 319.653 285.2724 22.9052 0.3825 5407 +5409 2 319.6965 284.1307 22.8536 0.4186 5408 +5410 2 319.5821 282.3964 22.6659 0.3269 5409 +5411 2 319.3339 281.2844 22.4921 0.3131 5410 +5412 2 319.0868 280.1713 22.2768 0.3103 5411 +5413 2 318.9289 279.0422 22.094 0.313 5412 +5414 2 318.8042 277.9051 22.0212 0.2675 5413 +5415 2 318.7321 276.7645 21.9965 0.2205 5414 +5416 2 318.7527 275.6216 21.9617 0.2127 5415 +5417 2 318.8099 274.4788 21.9526 0.1936 5416 +5418 2 318.8511 273.3359 22.0298 0.2019 5417 +5419 2 318.8751 272.1942 22.1635 0.2416 5418 +5420 2 318.9426 271.0914 22.1308 0.2439 5419 +5421 2 319.1428 270.1156 20.7825 0.1855 5420 +5422 2 319.3247 269.1832 19.2525 0.1626 5421 +5423 2 319.1886 268.1479 18.3089 0.1491 5422 +5424 2 318.7882 267.1091 17.6915 0.1436 5423 +5425 2 318.4038 266.0429 17.3302 0.1491 5424 +5426 2 318.1475 264.9344 17.1546 0.1631 5425 +5427 2 317.873 263.8258 17.1714 0.1812 5426 +5428 2 317.5378 262.7356 17.3734 0.1674 5427 +5429 2 317.1992 261.6522 17.7107 0.1523 5428 +5430 2 317.0974 260.5529 18.3058 0.1451 5429 +5431 2 317.4303 259.5324 19.1684 0.1411 5430 +5432 2 317.929 258.5875 20.1642 0.1392 5431 +5433 2 318.4518 257.67 21.194 0.1383 5432 +5434 2 318.4084 256.5672 21.9346 0.1378 5433 +5435 2 318.2917 255.4495 22.4486 0.1376 5434 +5436 2 318.1086 254.3295 22.8074 0.1374 5435 +5437 2 318.1189 253.8936 23.0117 0.1374 5436 +5438 2 318.1384 252.7634 23.4413 0.1373 5437 +5439 2 318.1384 251.6262 23.7447 0.1537 5438 +5440 2 318.0698 250.4891 23.9702 0.1846 5439 +5441 2 318.0766 249.3497 24.1368 0.2221 5440 +5442 2 318.1819 248.2125 24.2467 0.2143 5441 +5443 2 318.2208 247.0708 24.308 0.2224 5442 +5444 2 318.3489 245.9383 24.3537 0.2625 5443 +5445 2 318.5079 244.8068 24.4234 0.2489 5444 +5446 2 318.6337 243.6709 24.5284 0.2017 5445 +5447 2 318.7539 242.5337 24.6617 0.1711 5446 +5448 2 318.874 241.3977 24.813 0.164 5447 +5449 2 318.9941 240.2617 24.9741 0.1793 5448 +5450 2 319.1131 239.1257 25.1377 0.209 5449 +5451 2 318.4496 238.9805 25.3681 0.2212 5450 +5452 2 317.4589 239.5444 25.4731 0.2022 5451 +5453 2 316.4178 240.0146 25.5402 0.2394 5452 +5454 2 315.2887 240.1473 25.7077 0.2556 5453 +5455 2 314.1561 239.9998 25.8217 0.3017 5454 +5456 2 313.4583 239.1052 25.8556 0.2071 5455 +5457 2 312.9343 238.0893 25.8064 0.1788 5456 +5458 2 312.4138 237.0723 25.6694 0.1583 5457 +5459 2 311.7469 236.1571 25.2692 0.1144 5458 +5460 2 319.2332 253.7998 22.6538 0.2544 5436 +5461 2 320.1015 253.0597 22.7291 0.2215 5460 +5462 2 320.5854 252.0289 22.7492 0.1836 5461 +5463 2 320.8428 250.9147 22.7407 0.1762 5462 +5464 2 321.0979 249.7993 22.7345 0.1984 5463 +5465 2 321.3725 248.6884 22.748 0.1873 5464 +5466 2 321.6345 247.5753 22.7871 0.1997 5465 +5467 2 321.8964 246.4622 22.8545 0.1687 5466 +5468 2 322.1584 245.3491 22.947 0.1523 5467 +5469 2 322.4192 244.236 23.052 0.1411 5468 +5470 2 322.6812 243.1229 23.1598 0.1438 5469 +5471 2 322.942 242.0109 23.264 0.1494 5470 +5472 2 323.204 240.8978 23.3622 0.1607 5471 +5473 2 323.466 239.7847 23.4542 0.1756 5472 +5474 2 323.7589 238.6784 23.5307 0.2334 5473 +5475 2 324.1867 237.618 23.5772 0.1941 5474 +5476 2 324.5585 236.5369 23.6025 0.1573 5475 +5477 2 325.0241 235.4924 23.6343 0.1275 5476 +5478 2 325.6396 234.528 23.6893 0.1145 5477 +5479 2 326.2711 233.5751 23.5931 0.1144 5478 +5480 2 320.646 283.6422 22.5336 0.2873 5409 +5481 2 321.6768 283.6571 22.0711 0.2744 5480 +5482 2 322.6252 284.2668 21.7506 0.2034 5481 +5483 2 323.5598 284.9098 21.4198 0.1653 5482 +5484 2 324.4967 285.5447 21.0008 0.169 5483 +5485 2 325.4085 286.1968 20.4613 0.1915 5484 +5486 2 326.2985 286.8717 19.8463 0.2664 5485 +5487 2 327.3133 287.2836 19.1445 0.2402 5486 +5488 2 328.4001 287.5055 18.4765 0.1899 5487 +5489 2 329.4995 287.7217 17.9067 0.1556 5488 +5490 2 330.6011 287.9459 17.3909 0.1561 5489 +5491 2 331.7062 288.1644 16.9054 0.182 5490 +5492 2 332.7919 288.4585 16.406 0.1724 5491 +5493 2 333.8695 288.7879 15.9154 0.1564 5492 +5494 2 334.9758 288.9836 15.4112 0.1459 5493 +5495 2 336.0923 289.0865 14.8655 0.1494 5494 +5496 2 337.1803 289.3679 14.3798 0.1607 5495 +5497 2 338.203 289.8461 13.9465 0.1763 5496 +5498 2 339.1914 290.3964 13.5455 0.2313 5497 +5499 2 340.2496 290.8048 13.2127 0.2067 5498 +5500 2 341.365 291.0256 12.9695 0.1774 5499 +5501 2 342.4015 290.6138 12.7302 0.1541 5500 +5502 2 342.1956 289.5567 12.5467 0.1905 5501 +5503 2 341.1877 289.027 12.3533 0.1144 5502 +5504 2 320.0615 309.984 19.0924 0.3262 5384 +5505 2 319.0627 310.0046 17.9465 0.2865 5504 +5506 2 317.9885 309.6591 17.5202 0.214 5505 +5507 2 316.8983 309.3536 17.1213 0.2019 5506 +5508 2 315.776 309.1866 16.7731 0.1715 5507 +5509 2 315.2006 308.4258 14.772 0.2288 5508 +5510 2 314.5851 307.6216 13.4746 0.2199 5509 +5511 2 313.8758 306.7487 12.9855 0.2081 5510 +5512 2 313.1494 305.9971 11.8471 0.3432 5511 +5513 2 315.3242 310.1922 16.4034 0.1538 5508 +5514 2 314.4387 310.8683 16.2784 0.1641 5513 +5515 2 313.4091 311.3648 16.1969 0.1834 5514 +5516 2 312.3829 311.8693 16.1372 0.2408 5515 +5517 2 311.5615 312.6483 16.0284 0.2422 5516 +5518 2 311.4208 313.7409 15.8015 0.1877 5517 +5519 2 311.581 314.8677 15.5672 0.1314 5518 +5520 2 312.121 315.8687 15.68 0.1144 5519 +5521 2 298.8917 317.8947 16.2422 0.2212 -1 +5522 2 299.9179 318.739 16.1853 0.1234 5521 +5523 2 300.8148 319.4048 16.7519 0.1373 5522 +5524 2 301.7037 320.1095 17.0778 0.1373 5523 +5525 2 302.612 320.7181 17.6467 0.1373 5524 +5526 2 303.6153 320.9 18.8401 0.1373 5525 +5527 2 304.5545 321.1425 20.3081 0.1373 5526 +5528 2 305.4869 321.6036 21.4723 0.1373 5527 +5529 2 306.457 322.0303 22.5239 0.1373 5528 +5530 2 307.5015 322.3826 23.2803 0.1373 5529 +5531 2 308.5379 322.8139 23.8166 0.1373 5530 +5532 2 309.4898 323.4214 24.2582 0.1372 5531 +5533 2 310.4576 324.0105 24.6444 0.1372 5532 +5534 2 311.4426 324.5722 25.0163 0.1371 5533 +5535 2 312.4996 324.9772 25.4163 0.1368 5534 +5536 2 313.4823 325.5389 25.8203 0.1364 5535 +5537 2 314.3483 326.2677 26.2307 0.1356 5536 +5538 2 315.3344 326.8259 26.618 0.1342 5537 +5539 2 316.3229 327.3831 26.9844 0.1314 5538 +5540 2 317.3033 327.9539 27.3385 0.1271 5539 +5541 2 318.2391 328.5911 27.7335 0.1144 5540 +5542 2 319.001 329.3462 28.7039 0.1144 5541 +5543 2 298.4547 316.483 15.7277 0.2346 5521 +5544 2 298.4044 315.3493 15.4602 0.2485 5543 +5545 2 298.6435 314.2499 15.2168 0.2394 5544 +5546 2 299.2304 313.2855 15.0443 0.2164 5545 +5547 2 299.9946 312.4367 15.0177 0.2304 5546 +5548 2 300.0403 311.4574 15.4277 0.2731 5547 +5549 2 300.3172 311.6908 15.0231 0.1206 5548 +5550 2 301.1683 312.4081 15.6271 0.1632 5549 +5551 2 302.0812 313.0876 15.9013 0.1903 5550 +5552 2 302.9667 313.7088 16.8129 0.2288 5551 +5553 2 299.6399 310.779 16.2577 0.2942 5548 +5554 2 299.0256 309.8787 17.0844 0.2727 5553 +5555 2 298.3346 309.047 17.9934 0.2901 5554 +5556 2 297.6585 308.2222 19.0023 0.3276 5555 +5557 2 297.1757 307.3013 20.0624 0.3766 5556 +5558 2 297.0716 306.258 21.0846 0.3573 5557 +5559 2 297.4297 305.5487 22.6814 0.3211 5558 +5560 2 297.4011 305.6459 24.3363 0.3358 5559 +5561 2 297.2158 306.2625 26.4848 0.2659 5560 +5562 2 296.9504 307.2509 27.6588 0.2144 5561 +5563 2 297.3736 308.276 28.3276 0.1717 5562 +5564 2 297.8072 309.3113 28.8708 0.1571 5563 +5565 2 298.4433 310.2448 29.3084 0.1526 5564 +5566 2 299.2773 311.0227 29.489 0.1525 5565 +5567 2 300.1856 311.7125 29.2905 0.2288 5566 +5568 2 296.8131 305.2455 23.2798 0.3125 5559 +5569 2 295.835 304.7261 23.9535 0.265 5568 +5570 2 294.8397 304.1839 24.2938 0.2171 5569 +5571 2 293.9142 303.5169 24.3494 0.2285 5570 +5572 2 293.126 302.6921 24.2993 0.244 5571 +5573 2 292.4796 301.7506 24.2405 0.3195 5572 +5574 2 291.545 301.1328 24.3028 0.2993 5573 +5575 2 290.4776 300.729 24.4473 0.3173 5574 +5576 2 289.4858 300.173 24.6698 0.2981 5575 +5577 2 288.8383 299.2624 25.0294 0.2959 5576 +5578 2 288.3155 298.2614 25.4762 0.2738 5577 +5579 2 287.8235 297.2547 26.0485 0.3549 5578 +5580 2 287.2721 296.3154 26.894 0.2969 5579 +5581 2 286.5743 295.5181 27.928 0.2692 5580 +5582 2 286.2345 294.5217 29.0251 0.2253 5581 +5583 2 285.7826 293.571 30.1168 0.2752 5582 +5584 2 285.2564 292.6409 31.1136 0.251 5583 +5585 2 284.6444 291.7417 31.9774 0.2589 5584 +5586 2 283.8081 291.0336 32.7785 0.3443 5585 +5587 2 282.9238 290.3792 33.5474 0.3574 5586 +5588 2 282.5177 289.7191 33.2296 0.1199 5587 +5589 2 282.0875 288.677 32.7723 0.1391 5588 +5590 2 281.8713 287.5604 32.5276 0.1521 5589 +5591 2 282.2923 286.5159 32.034 0.1144 5590 +5592 2 282.3461 290.4216 34.608 0.2746 5587 +5593 2 281.265 290.5108 35.495 0.2401 5592 +5594 2 280.3315 290.2362 36.5543 0.2214 5593 +5595 2 279.5913 289.5201 37.7644 0.1766 5594 +5596 2 278.8466 289.448 39.4498 0.1416 5595 +5597 2 278.1716 290.1115 40.9973 0.1407 5596 +5598 2 278.0824 290.2854 41.3417 0.1415 5597 +5599 2 277.7277 291.1869 42.7896 0.1461 5598 +5600 2 277.5001 292.2062 43.9202 0.1529 5599 +5601 2 277.3742 293.277 44.8406 0.1704 5600 +5602 2 277.253 294.3604 45.6736 0.1763 5601 +5603 2 276.8995 295.3888 46.464 0.1553 5602 +5604 2 276.6753 296.479 46.9731 0.1406 5603 +5605 2 276.5952 297.6127 47.2654 0.1369 5604 +5606 2 276.4339 298.7419 47.4107 0.1365 5605 +5607 2 276.0712 299.8218 47.441 0.1358 5606 +5608 2 275.8058 300.9303 47.3757 0.1345 5607 +5609 2 276.4705 301.6877 47.1839 0.1314 5608 +5610 2 277.4555 301.1317 46.9448 0.127 5609 +5611 2 278.2448 300.3114 46.6687 0.1144 5610 +5612 2 279.0147 299.5061 46.0326 0.1144 5611 +5613 2 277.9028 289.901 41.8718 0.1148 5597 +5614 2 277.0127 289.2032 41.503 0.1525 5613 +5615 2 276.1124 288.5019 41.3395 0.1653 5614 +5616 2 275.2098 287.8007 41.2082 0.1908 5615 +5617 2 274.2969 287.1165 40.9954 0.2288 5616 +5618 2 298.3003 317.7769 16.42 0.2033 5521 +5619 2 297.1712 317.6373 16.633 0.1974 5618 +5620 2 296.0306 317.6362 16.7575 0.2183 5619 +5621 2 294.8992 317.5344 16.8715 0.2184 5620 +5622 2 293.7918 317.2552 16.9701 0.1862 5621 +5623 2 292.6649 317.0939 17.0574 0.1798 5622 +5624 2 291.6193 317.4554 17.1354 0.2184 5623 +5625 2 290.7751 318.2082 17.2124 0.2831 5624 +5626 2 289.8072 318.0926 17.2234 0.2571 5625 +5627 2 289.2078 317.1271 17.0146 0.1766 5626 +5628 2 288.6129 316.1661 16.5837 0.1822 5627 +5629 2 287.7904 315.3779 16.3715 0.2071 5628 +5630 2 286.9163 314.6423 16.2155 0.2415 5629 +5631 2 286.3032 313.6779 16.1317 0.1802 5630 +5632 2 285.6088 312.7685 16.1221 0.1631 5631 +5633 2 284.665 312.1244 16.261 0.1144 5632 +5634 2 317.2163 282.25 18.1994 0.2288 -1 +5635 2 317.3959 283.3505 18.8176 0.1782 5634 +5636 2 317.1866 284.4682 19.1111 0.1985 5635 +5637 2 317.1671 285.6088 19.2894 0.1755 5636 +5638 2 317.3284 286.7379 19.5115 0.1835 5637 +5639 2 317.5893 287.8453 19.7909 0.2062 5638 +5640 2 317.9462 288.9218 20.093 0.1918 5639 +5641 2 318.5582 289.8793 20.3318 0.1983 5640 +5642 2 318.898 290.965 20.5926 0.1657 5641 +5643 2 319.0273 292.0952 20.8744 0.1814 5642 +5644 2 319.0044 293.2358 21.0865 0.2084 5643 +5645 2 319.0433 294.3764 21.2567 0.2289 5644 +5646 2 238.2941 351.5501 25.844 0.1144 -1 +5647 2 239.4266 351.6622 25.5697 0.1145 5646 +5648 2 240.5603 351.6713 25.1852 0.1271 5647 +5649 2 241.6254 351.3418 24.6179 0.1314 5648 +5650 2 242.6824 351.6645 23.9855 0.1344 5649 +5651 2 243.6274 352.2799 23.5245 0.1358 5650 +5652 2 244.5849 352.8782 23.1918 0.1365 5651 +5653 2 245.412 353.6539 22.8196 0.1369 5652 +5654 2 246.2208 354.4467 22.4226 0.1371 5653 +5655 2 246.8924 355.3378 22.0804 0.1372 5654 +5656 2 247.215 356.4281 21.8431 0.1372 5655 +5657 2 247.4175 357.5526 21.6978 0.1373 5656 +5658 2 247.7206 358.6497 21.6766 0.1373 5657 +5659 2 248.2411 359.6599 21.7961 0.1373 5658 +5660 2 248.9344 360.5682 21.9724 0.1373 5659 +5661 2 249.6391 361.4674 22.1099 0.1373 5660 +5662 2 250.2958 362.4009 22.1781 0.1373 5661 +5663 2 250.798 363.4213 22.174 0.1373 5662 +5664 2 251.0428 364.5287 22.1041 0.1373 5663 +5665 2 251.0096 365.667 21.9806 0.1373 5664 +5666 2 250.8369 366.795 21.8161 0.1373 5665 +5667 2 250.703 367.9287 21.6538 0.1373 5666 +5668 2 250.7568 369.059 21.5436 0.1423 5667 +5669 2 250.9627 370.1812 21.4558 0.1572 5668 +5670 2 250.5875 371.0907 21.3444 0.1772 5669 +5671 2 249.7604 371.8572 21.1286 0.157 5670 +5672 2 250.4742 372.7484 20.9333 0.1493 5671 +5673 2 251.2865 373.5503 20.7775 0.1434 5672 +5674 2 251.9774 374.4598 20.6217 0.1407 5673 +5675 2 252.6387 375.3636 20.4326 0.1387 5674 +5676 2 253.4635 376.1152 21.048 0.1379 5675 +5677 2 254.3135 376.8679 21.3619 0.1377 5676 +5678 2 255.1989 377.5783 21.7008 0.1374 5677 +5679 2 255.9677 378.4043 22.1246 0.1374 5678 +5680 2 256.3727 379.4545 22.506 0.1488 5679 +5681 2 256.558 380.5756 22.7938 0.1652 5680 +5682 2 256.7445 381.7002 23.0012 0.1847 5681 +5683 2 256.9584 382.8224 23.1356 0.1601 5682 +5684 2 257.1552 383.9493 23.2132 0.1502 5683 +5685 2 257.3703 385.0704 23.3934 0.156 5684 +5686 2 257.7901 386.1309 23.5984 0.1702 5685 +5687 2 258.441 387.0713 23.6649 0.1884 5686 +5688 2 258.9867 388.0757 23.6229 0.158 5687 +5689 2 259.4718 389.111 23.5073 0.15 5688 +5690 2 259.8859 390.1749 23.351 0.1569 5689 +5691 2 260.1868 391.2766 23.1929 0.1713 5690 +5692 2 260.3286 392.408 23.0739 0.2009 5691 +5693 2 259.998 393.5028 23.0158 0.1881 5692 +5694 2 259.5336 394.5462 23.061 0.1963 5693 +5695 2 298.8425 389.214 37.4704 0.193 -1 +5696 2 299.6193 388.3422 37.9761 0.339 5695 +5697 2 300.3801 387.4911 38.1791 0.2369 5696 +5698 2 301.1386 386.64 38.4 0.1837 5697 +5699 2 301.873 385.7682 38.6322 0.187 5698 +5700 2 302.3386 384.7283 38.8685 0.1676 5699 +5701 2 302.9049 383.7354 39.0107 0.1511 5700 +5702 2 303.4735 382.7435 39.0723 0.1394 5701 +5703 2 304.042 381.7505 39.0743 0.1413 5702 +5704 2 304.6094 380.7575 39.0362 0.144 5703 +5705 2 305.3119 379.8549 38.9925 0.1525 5704 +5706 2 306.0211 378.9569 38.9542 0.1525 5705 +5707 2 306.7293 378.0588 38.92 0.2288 5706 +5708 2 299.6456 389.9164 37.7451 0.1716 5695 +5709 2 299.9751 391.0112 37.84 0.1837 5708 +5710 2 300.2863 392.1117 37.9005 0.1704 5709 +5711 2 300.5963 393.2122 37.9495 0.1529 5710 +5712 2 300.9063 394.3139 38.008 0.1395 5711 +5713 2 300.8251 395.4385 38.1735 0.1373 5712 +5714 2 300.6249 396.5584 38.4656 0.1373 5713 +5715 2 300.4201 397.6716 38.8618 0.1373 5714 +5716 2 300.2153 398.7801 39.3352 0.1373 5715 +5717 2 300.0117 399.8852 39.8611 0.1373 5716 +5718 2 299.577 400.9125 40.4396 0.1373 5717 +5719 2 298.9329 401.8208 41.0558 0.1373 5718 +5720 2 298.3506 402.7704 41.6853 0.1373 5719 +5721 2 297.8198 403.7508 42.3128 0.1373 5720 +5722 2 297.2936 404.7358 42.9274 0.1372 5721 +5723 2 296.6026 405.6155 43.4907 0.1372 5722 +5724 2 295.7823 406.3843 43.9816 0.1371 5723 +5725 2 294.9461 407.1462 44.4102 0.1368 5724 +5726 2 294.1075 407.9081 44.7826 0.1364 5725 +5727 2 293.2655 408.6734 45.0918 0.1356 5726 +5728 2 292.4236 409.441 45.3454 0.1343 5727 +5729 2 291.5804 410.2098 45.5524 0.1315 5728 +5730 2 290.7362 410.9774 45.7176 0.1274 5729 +5731 2 290.0257 411.8732 45.687 0.1148 5730 +5732 2 289.3599 412.7689 45.08 0.1144 5731 +5733 2 298.4376 389.6922 37.408 0.1752 5695 +5734 2 297.6985 390.5639 37.3106 0.1554 5733 +5735 2 296.8863 391.3635 37.2487 0.1474 5734 +5736 2 295.8899 391.8829 37.2268 0.1426 5735 +5737 2 294.8042 392.2444 37.2246 0.1402 5736 +5738 2 293.7186 392.6059 37.2187 0.1248 5737 +5739 2 292.6318 392.559 37.0569 0.1571 5738 +5740 2 292.9269 393.1104 37.2305 0.1743 5739 +5741 2 293.3994 394.1091 37.8871 0.1672 5740 +5742 2 294.1098 394.9877 38.3289 0.15 5741 +5743 2 294.9129 395.7954 38.5798 0.1374 5742 +5744 2 295.1051 395.3275 38.5496 0.1374 5743 +5745 2 295.5089 394.2613 38.3762 0.1376 5744 +5746 2 295.9059 393.1974 38.0517 0.1378 5745 +5747 2 296.3704 392.1666 37.6477 0.1383 5746 +5748 2 296.8588 391.1485 37.1958 0.1391 5747 +5749 2 297.3073 390.1154 36.7044 0.1407 5748 +5750 2 297.7306 389.0744 36.1858 0.1436 5749 +5751 2 298.155 388.0334 35.6597 0.1489 5750 +5752 2 298.5909 386.9958 35.1562 0.1594 5751 +5753 2 299.0393 385.9604 34.6965 0.1755 5752 +5754 2 299.5072 384.9308 34.2787 0.2209 5753 +5755 2 300.0254 383.9241 33.8895 0.23 5754 +5756 2 300.5883 382.9403 33.5143 0.2142 5755 +5757 2 301.1637 381.9633 33.1402 0.1865 5756 +5758 2 301.7048 380.9692 32.7566 0.1581 5757 +5759 2 302.1693 379.9373 32.3562 0.1443 5758 +5760 2 302.5788 378.8825 31.9404 0.1403 5759 +5761 2 302.9655 377.8209 31.512 0.1428 5760 +5762 2 303.2904 376.7409 31.0551 0.1478 5761 +5763 2 303.5467 375.6438 30.5631 0.1557 5762 +5764 2 303.7812 374.5433 30.0566 0.1792 5763 +5765 2 303.9059 373.4245 29.6125 0.1795 5764 +5766 2 303.859 372.2919 29.3073 0.1667 5765 +5767 2 303.7263 371.1582 29.1396 0.1603 5766 +5768 2 303.5867 370.0222 29.0646 0.1805 5767 +5769 2 304.0546 369.0681 28.9293 0.1764 5768 +5770 2 305.0018 368.4538 28.6404 0.164 5769 +5771 2 305.9811 367.8887 28.2058 0.1585 5770 +5772 2 306.9512 367.327 27.6543 0.1861 5771 +5773 2 307.9156 366.7675 27.0288 0.1719 5772 +5774 2 308.9189 366.2859 26.3838 0.1577 5773 +5775 2 309.9439 365.8455 25.7587 0.1504 5774 +5776 2 310.9712 365.4062 25.1598 0.1597 5775 +5777 2 312.0008 364.9657 24.587 0.1796 5776 +5778 2 313.0327 364.5253 24.0402 0.2127 5777 +5779 2 314.1447 364.5287 23.455 0.2989 5778 +5780 2 314.3003 365.7196 22.9798 0.1351 5779 +5781 2 314.4478 366.8533 22.9154 0.1494 5780 +5782 2 314.5954 367.9882 22.8569 0.1581 5781 +5783 2 314.886 369.0876 22.6795 0.1844 5782 +5784 2 315.355 370.1149 22.2905 0.184 5783 +5785 2 315.8733 371.1056 21.7068 0.1771 5784 +5786 2 316.3881 372.0849 20.9928 0.1799 5785 +5787 2 316.8033 373.1042 20.2363 0.2337 5786 +5788 2 317.0539 374.1784 19.519 0.2147 5787 +5789 2 317.2758 375.2686 18.8619 0.1911 5788 +5790 2 317.4966 376.3646 18.2734 0.1799 5789 +5791 2 317.7185 377.4662 17.7436 0.2303 5790 +5792 2 317.9908 378.5656 17.3593 0.2076 5791 +5793 2 318.2768 379.6661 17.0648 0.1771 5792 +5794 2 318.5628 380.7701 16.8238 0.1592 5793 +5795 2 318.8488 381.8741 16.6139 0.1663 5794 +5796 2 318.3706 382.8453 16.2029 0.2176 5795 +5797 2 317.6831 383.7136 15.5409 0.1627 5796 +5798 2 317.0871 384.4595 14.0 0.1144 5797 +5799 2 314.7258 363.1456 22.7002 0.2845 5779 +5800 2 315.1651 362.1 22.3412 0.2114 5799 +5801 2 315.6056 361.0521 22.0254 0.1887 5800 +5802 2 315.2967 360.0408 21.7027 0.1669 5801 +5803 2 314.3254 359.4425 21.5107 0.15 5802 +5804 2 313.353 358.8431 21.3528 0.1373 5803 +5805 2 312.3795 358.2436 21.2229 0.1373 5804 +5806 2 311.4071 357.643 21.112 0.1373 5805 +5807 2 310.4336 357.0435 21.0121 0.1373 5806 +5808 2 309.4612 356.4429 20.9157 0.1373 5807 +5809 2 308.4876 355.8423 20.82 0.1373 5808 +5810 2 307.5141 355.2429 20.7253 0.1373 5809 +5811 2 306.5417 354.6423 20.6321 0.1373 5810 +5812 2 305.5681 354.0428 20.5408 0.1373 5811 +5813 2 304.5946 353.4422 20.4529 0.1373 5812 +5814 2 303.6222 352.8416 20.3683 0.1373 5813 +5815 2 302.6486 352.2422 20.2888 0.1373 5814 +5816 2 301.7014 351.6004 20.2182 0.1373 5815 +5817 2 300.7988 350.898 20.1625 0.1372 5816 +5818 2 299.8973 350.1944 20.1188 0.1372 5817 +5819 2 298.9947 349.4909 20.0838 0.1371 5818 +5820 2 298.0932 348.7873 20.0547 0.1368 5819 +5821 2 297.1906 348.0849 20.0295 0.1364 5820 +5822 2 296.288 347.3813 20.0054 0.1356 5821 +5823 2 295.3865 346.6778 19.9819 0.1342 5822 +5824 2 294.4839 345.9742 19.9592 0.1313 5823 +5825 2 293.5813 345.2718 19.938 0.1271 5824 +5826 2 292.6798 344.5682 19.9183 0.1144 5825 +5827 2 291.7772 343.8647 19.88 0.1144 5826 +5828 2 294.9621 395.8675 39.8574 0.1146 5743 +5829 2 295.589 396.817 40.0498 0.1664 5828 +5830 2 296.0992 397.8409 40.1279 0.1991 5829 +5831 2 296.4333 398.9334 40.245 0.2158 5830 +5832 2 296.3177 400.0682 40.4608 0.1144 5831 +5833 2 292.1055 391.8166 36.7598 0.1713 5739 +5834 2 291.45 390.8922 36.3647 0.1973 5833 +5835 2 290.7018 390.0457 35.9598 0.2324 5834 +5836 2 289.7695 389.4153 35.5541 0.1905 5835 +5837 2 288.7753 388.8765 35.1422 0.1657 5836 +5838 2 287.7743 388.3525 34.7024 0.1527 5837 +5839 2 286.7608 387.8618 34.2093 0.1558 5838 +5840 2 285.7071 387.4591 33.7532 0.1685 5839 +5841 2 284.6078 387.1891 33.3752 0.1858 5840 +5842 2 283.4912 386.9797 33.0406 0.1632 5841 +5843 2 282.3712 386.7887 32.7281 0.1514 5842 +5844 2 281.2432 386.6365 32.4313 0.1448 5843 +5845 2 280.1073 386.6056 32.1479 0.1413 5844 +5846 2 278.9781 386.7315 31.8601 0.1395 5845 +5847 2 277.8753 387.006 31.5496 0.1385 5846 +5848 2 276.7668 387.2463 31.2094 0.1379 5847 +5849 2 275.6491 387.435 30.8302 0.1481 5848 +5850 2 274.5303 387.5941 30.3974 0.164 5849 +5851 2 273.4126 387.7336 29.9085 0.194 5850 +5852 2 272.2892 387.8286 29.4314 0.2102 5851 +5853 2 271.1738 387.9933 28.964 0.2504 5852 +5854 2 270.0744 387.8377 28.397 0.2616 5853 +5855 2 269.0745 387.3595 27.7649 0.2118 5854 +5856 2 268.117 386.7898 27.1307 0.2 5855 +5857 2 267.2201 386.1572 26.3474 0.2028 5856 +5858 2 266.3735 385.5314 25.2591 0.1662 5857 +5859 2 265.9354 385.7717 24.6604 0.1593 5858 +5860 2 265.0076 386.2682 23.5708 0.1481 5859 +5861 2 263.9952 386.7132 22.8834 0.1533 5860 +5862 2 262.9987 387.236 22.3982 0.1885 5861 +5863 2 262.0252 387.8229 22.0919 0.2526 5862 +5864 2 261.1878 387.1811 21.9808 0.2841 5863 +5865 2 260.2508 386.8699 20.8566 0.1971 5864 +5866 2 259.1824 386.6914 19.9619 0.1903 5865 +5867 2 258.0727 386.4993 19.4954 0.2084 5866 +5868 2 256.9767 386.227 19.06 0.2399 5867 +5869 2 256.383 385.3152 18.6353 0.1877 5868 +5870 2 255.8121 384.336 18.2702 0.1657 5869 +5871 2 255.0319 383.5134 17.9744 0.1637 5870 +5872 2 254.2597 382.6749 17.7286 0.1733 5871 +5873 2 253.4932 381.8306 17.504 0.1888 5872 +5874 2 252.8343 380.904 17.214 0.1625 5873 +5875 2 252.4213 379.8583 16.749 0.1508 5874 +5876 2 252.0346 378.8013 16.255 0.1443 5875 +5877 2 251.6628 377.7328 15.8257 0.1411 5876 +5878 2 251.3471 376.6426 15.4753 0.1394 5877 +5879 2 251.0256 375.5523 15.1721 0.1385 5878 +5880 2 250.5509 374.5227 14.8052 0.1379 5879 +5881 2 250.2088 373.5068 13.827 0.1144 5880 +5882 2 266.4159 386.3757 26.4026 0.1149 5858 +5883 2 266.4879 387.514 26.605 0.138 5882 +5884 2 266.6058 388.6511 26.7199 0.139 5883 +5885 2 266.5497 389.7928 26.8111 0.1405 5884 +5886 2 266.5211 390.9357 26.8797 0.1431 5885 +5887 2 266.52 392.0797 26.9282 0.1483 5886 +5888 2 266.4422 393.2214 26.9598 0.1567 5887 +5889 2 266.1779 394.3345 26.9727 0.178 5888 +5890 2 265.8015 395.4144 26.9716 0.1907 5889 +5891 2 265.3268 396.4555 26.9693 0.3432 5890 +5892 2 308.7965 365.2231 13.6304 0.3432 -1 +5893 2 309.3101 364.2851 14.6258 0.1907 5892 +5894 2 309.8524 363.2966 15.1003 0.1905 5893 +5895 2 310.3832 362.3059 15.6172 0.1876 5894 +5896 2 310.85 361.2729 15.9835 0.1944 5895 +5897 2 311.3018 360.2262 16.2068 0.1619 5896 +5898 2 311.7537 359.176 16.3088 0.1518 5897 +5899 2 312.2079 358.1258 16.318 0.1448 5898 +5900 2 312.7147 357.1133 16.291 0.1414 5899 +5901 2 313.6082 356.4006 16.3222 0.1395 5900 +5902 2 314.5382 355.7348 16.4359 0.1399 5901 +5903 2 315.466 355.0713 16.6237 0.1567 5902 +5904 2 316.3949 354.4101 16.8712 0.2132 5903 +5905 2 317.3502 353.8117 17.1718 0.2792 5904 +5906 2 318.4667 353.6253 17.5485 0.2939 5905 +5907 2 319.5958 353.599 17.9843 0.205 5906 +5908 2 320.7238 353.5726 18.4582 0.1805 5907 +5909 2 321.8495 353.5475 18.952 0.1882 5908 +5910 2 322.9752 353.5246 19.4503 0.2175 5909 +5911 2 324.0906 353.5898 19.9323 0.2636 5910 +5912 2 325.1465 353.9925 20.3614 0.2432 5911 +5913 2 326.1773 354.4627 20.7364 0.2512 5912 +5914 2 327.2012 354.958 21.0578 0.187 5913 +5915 2 328.225 355.4545 21.3333 0.1665 5914 +5916 2 329.2386 355.9762 21.5655 0.1525 5915 +5917 2 330.1962 356.5974 21.7448 0.1456 5916 +5918 2 331.1205 357.2689 21.8718 0.1417 5917 +5919 2 332.046 357.9404 21.9535 0.1397 5918 +5920 2 332.9715 358.6131 21.9937 0.1386 5919 +5921 2 333.8936 359.2892 21.9944 0.138 5920 +5922 2 334.7619 360.0225 21.948 0.1377 5921 +5923 2 335.3922 360.9732 21.8169 0.1418 5922 +5924 2 335.8864 362.0016 21.6013 0.1711 5923 +5925 2 336.3772 363.029 21.329 0.2199 5924 +5926 2 336.8519 364.062 21.0356 0.2583 5925 +5927 2 337.2798 365.1179 20.7682 0.2178 5926 +5928 2 337.6996 366.1772 20.5336 0.1776 5927 +5929 2 338.0863 367.2492 20.3351 0.1596 5928 +5930 2 338.3472 368.36 20.1677 0.1492 5929 +5931 2 338.5062 369.4914 20.0236 0.1485 5930 +5932 2 338.6652 370.6228 19.8931 0.1726 5931 +5933 2 338.8459 371.752 19.7707 0.2083 5932 +5934 2 339.0976 372.8662 19.6629 0.2419 5933 +5935 2 339.4179 373.9633 19.5729 0.2078 5934 +5936 2 339.7474 375.0581 19.4846 0.2034 5935 +5937 2 340.0929 376.1483 19.3712 0.1671 5936 +5938 2 340.3812 377.2512 19.2441 0.1545 5937 +5939 2 340.5059 378.3872 19.1304 0.1488 5938 +5940 2 340.602 379.5266 19.0296 0.1583 5939 +5941 2 340.7644 380.6568 18.9288 0.1735 5940 +5942 2 341.015 381.7722 18.8172 0.1823 5941 +5943 2 341.2666 382.8876 18.7037 0.1613 5942 +5944 2 341.5183 384.003 18.5931 0.1808 5943 +5945 2 341.77 385.1173 18.4917 0.213 5944 +5946 2 342.0354 386.2304 18.421 0.246 5945 +5947 2 342.334 387.3344 18.4207 0.2306 5946 +5948 2 342.6429 388.436 18.4868 0.2695 5947 +5949 2 342.9529 389.5354 18.5939 0.2807 5948 +5950 2 343.2915 390.6268 18.7099 0.2749 5949 +5951 2 343.6965 391.6953 18.7941 0.2273 5950 +5952 2 344.1621 392.7398 18.8271 0.2123 5951 +5953 2 344.7158 393.7408 18.7982 0.1723 5952 +5954 2 345.2867 394.7315 18.7178 0.1573 5953 +5955 2 345.8575 395.721 18.6008 0.1479 5954 +5956 2 346.4284 396.7117 18.4603 0.143 5955 +5957 2 346.9992 397.7013 18.3063 0.1404 5956 +5958 2 347.5689 398.6909 18.1429 0.1389 5957 +5959 2 348.1409 399.6793 17.9712 0.1382 5958 +5960 2 348.7198 400.662 17.7873 0.1378 5959 +5961 2 349.3238 401.6309 17.5835 0.1376 5960 +5962 2 349.9393 402.5908 17.3565 0.1374 5961 +5963 2 350.5559 403.5494 17.1075 0.1402 5962 +5964 2 351.1714 404.507 16.8385 0.1538 5963 +5965 2 351.7892 405.4622 16.5499 0.1768 5964 +5966 2 352.4309 406.4003 16.2272 0.213 5965 +5967 2 353.1093 407.3063 15.8463 0.227 5966 +5968 2 353.6367 408.289 15.4295 0.2481 5967 +5969 2 353.885 409.3941 15.041 0.2131 5968 +5970 2 354.1732 410.4878 14.6247 0.1878 5969 +5971 2 299.4923 364.3205 18.9882 0.1144 -1 +5972 2 299.6353 365.4508 19.2522 0.1144 5971 +5973 2 299.7806 366.5845 19.3223 0.1271 5972 +5974 2 300.2211 367.6198 19.5682 0.1609 5973 +5975 2 300.5357 366.89 20.1565 0.256 5974 +5976 2 300.6489 365.7688 20.6034 0.261 5975 +5977 2 301.46 365.4073 21.2256 0.2232 5976 +5978 2 302.4141 366.0239 21.5617 0.1787 5977 +5979 2 303.3796 366.6257 21.8157 0.1608 5978 +5980 2 304.4001 367.1233 22.1156 0.1451 5979 +5981 2 288.479 430.1188 15.2911 0.1144 -1 +5982 2 287.3797 429.8145 15.4908 0.1145 5981 +5983 2 286.2768 429.5102 15.5798 0.1654 5982 +5984 2 285.1752 429.2059 15.6753 0.2207 5983 +5985 2 284.0735 428.9096 15.7633 0.2816 5984 +5986 2 283.0187 429.3524 15.776 0.1947 5985 +5987 2 281.9971 429.8683 15.7218 0.1724 5986 +5988 2 280.9927 430.4037 15.614 0.1553 5987 +5989 2 280.6221 431.4676 15.4428 0.1469 5988 +5990 2 280.8966 432.5739 15.229 0.1404 5989 +5991 2 269.6259 446.4929 15.4557 0.2288 -1 +5992 2 270.707 446.1726 15.9347 0.1787 5991 +5993 2 271.7744 445.7722 16.1374 0.1989 5992 +5994 2 272.7422 445.1727 16.4195 0.1627 5993 +5995 2 273.7054 444.5721 16.7647 0.1525 5994 +5996 2 274.6675 443.975 17.1531 0.1452 5995 +5997 2 275.6296 443.3778 17.5666 0.1672 5996 +5998 2 276.657 442.9076 18.003 0.1996 5997 +5999 2 277.69 442.45 18.4389 0.2492 5998 +6000 2 278.7242 441.9913 18.8534 0.2073 5999 +6001 2 279.756 441.5199 19.2229 0.2097 6000 +6002 2 280.7834 441.0337 19.5276 0.1691 6001 +6003 2 281.8072 440.535 19.7575 0.1558 6002 +6004 2 282.7385 439.8703 19.7985 0.1469 6003 +6005 2 283.6445 439.1736 19.6796 0.1424 6004 +6006 2 284.5483 438.4769 19.4645 0.14 6005 +6007 2 285.4509 437.7825 19.211 0.1388 6006 +6008 2 286.3524 437.0846 18.9736 0.138 6007 +6009 2 287.2287 436.3548 18.865 0.1377 6008 +6010 2 288.0214 435.5391 19.1187 0.1375 6009 +6011 2 288.8531 434.7669 19.4666 0.1374 6010 +6012 2 289.6848 433.9993 19.8789 0.1374 6011 +6013 2 290.5154 433.2328 20.3181 0.1373 6012 +6014 2 291.3459 432.4663 20.7508 0.1413 6013 +6015 2 292.1776 431.6976 21.151 0.1554 6014 +6016 2 293.0116 430.9288 21.5141 0.1773 6015 +6017 2 293.8684 430.1829 21.8278 0.1953 6016 +6018 2 294.7653 429.4793 22.044 0.1907 6017 +6019 2 295.6233 428.7312 22.233 0.187 6018 +6020 2 296.4035 427.9006 22.4829 0.1597 6019 +6021 2 297.1815 427.0712 22.7905 0.1502 6020 +6022 2 297.9571 426.2441 23.1532 0.1441 6021 +6023 2 298.7327 425.4193 23.5668 0.141 6022 +6024 2 299.5198 424.6116 24.023 0.1393 6023 +6025 2 300.3812 423.8943 24.5139 0.1428 6024 +6026 2 301.3353 423.3017 25.0369 0.1659 6025 +6027 2 302.2894 422.7091 25.5765 0.2125 6026 +6028 2 303.2458 422.1223 26.12 0.2499 6027 +6029 2 304.2148 421.5537 26.646 0.2306 6028 +6030 2 305.1998 421.0069 27.1359 0.1857 6029 +6031 2 306.187 420.46 27.585 0.1813 6030 +6032 2 307.18 419.9155 27.989 0.1877 6031 +6033 2 307.9522 419.9578 28.5158 0.1613 6032 +6034 2 307.3162 420.9062 28.6793 0.1516 6033 +6035 2 306.6789 421.8557 28.751 0.1447 6034 +6036 2 306.0406 422.8052 28.756 0.1413 6035 +6037 2 305.3988 423.7525 28.7182 0.1394 6036 +6038 2 304.6987 424.6562 28.6639 0.1385 6037 +6039 2 303.9196 425.4936 28.6174 0.1379 6038 +6040 2 303.1142 426.3059 28.588 0.1376 6039 +6041 2 302.3077 427.117 28.5709 0.1363 6040 +6042 2 285.9062 367.0135 25.5377 0.1794 -1 +6043 2 286.7997 366.7298 24.7653 0.1145 6042 +6044 2 287.907 366.4712 24.4673 0.1866 6043 +6045 2 289.0305 366.2608 24.3362 0.1671 6044 +6046 2 290.1653 366.1246 24.1923 0.1503 6045 +6047 2 291.307 366.1338 24.0538 0.138 6046 +6048 2 292.4476 366.2081 23.9318 0.1384 6047 +6049 2 293.5767 366.3889 23.8328 0.1398 6048 +6050 2 294.7207 366.3854 23.7594 0.1398 6049 +6051 2 295.8613 366.2985 23.7073 0.1525 6050 +6052 2 296.9847 366.088 23.6138 0.1144 6051 +6053 2 285.3845 367.3876 25.5408 0.1755 6042 +6054 2 284.6055 368.217 25.583 0.1763 6053 +6055 2 283.8847 369.1047 25.6393 0.2246 6054 +6056 2 283.1823 370.0074 25.6812 0.2044 6055 +6057 2 282.6263 371.0049 25.6958 0.1693 6056 +6058 2 282.2511 372.0826 25.6847 0.1423 6057 +6059 2 282.1241 373.214 25.6584 0.1377 6058 +6060 2 282.2282 374.35 25.6441 0.138 6059 +6061 2 282.4868 375.4631 25.6714 0.1387 6060 +6062 2 282.7876 376.5659 25.7526 0.1399 6061 +6063 2 283.0645 377.6756 25.8582 0.1422 6062 +6064 2 283.172 378.8116 25.9527 0.1464 6063 +6065 2 283.18 379.9544 26.0014 0.1545 6064 +6066 2 283.1492 381.0984 25.9838 0.1674 6065 +6067 2 283.1103 382.2401 25.8928 0.2012 6066 +6068 2 283.0805 383.3819 25.7272 0.2165 6067 +6069 2 283.0439 384.5213 25.4987 0.1888 6068 +6070 2 282.9306 385.6538 25.2265 0.1607 6069 +6071 2 282.7362 386.775 24.9336 0.1505 6070 +6072 2 282.4719 387.8812 24.6385 0.1588 6071 +6073 2 282.1184 388.9623 24.3611 0.175 6072 +6074 2 281.75 390.0422 24.1389 0.2186 6073 +6075 2 281.3073 391.0947 23.9975 0.2329 6074 +6076 2 280.7147 392.0705 23.9312 0.2866 6075 +6077 2 280.0787 393.0212 23.9249 0.3063 6076 +6078 2 279.406 393.9467 23.9612 0.2517 6077 +6079 2 278.6944 394.8413 24.0234 0.2179 6078 +6080 2 277.9886 395.7416 24.1051 0.1763 6079 +6081 2 277.3033 396.6568 24.212 0.1582 6080 +6082 2 276.594 397.5514 24.3566 0.1504 6081 +6083 2 275.7921 398.3602 24.5948 0.1561 6082 +6084 2 274.9249 399.0844 25.0096 0.184 6083 +6085 2 274.0521 399.7891 25.5712 0.1684 6084 +6086 2 273.1861 400.4869 26.2247 0.151 6085 +6087 2 272.5225 401.3793 26.873 0.1385 6086 +6088 2 272.0661 402.3997 27.455 0.1391 6087 +6089 2 271.6176 403.4316 27.9689 0.1407 6088 +6090 2 271.1692 404.4681 28.4138 0.1435 6089 +6091 2 270.7184 405.5068 28.8025 0.1493 6090 +6092 2 270.2677 406.549 29.1469 0.1571 6091 +6093 2 269.8147 407.5923 29.4582 0.1864 6092 +6094 2 269.1832 408.5396 29.7002 0.1683 6093 +6095 2 268.4922 409.449 29.8732 0.152 6094 +6096 2 267.7978 410.3562 29.99 0.1403 6095 +6097 2 267.1034 411.2657 30.0642 0.1422 6096 +6098 2 266.4079 412.1729 30.1106 0.1463 6097 +6099 2 265.7134 413.0824 30.1445 0.1544 6098 +6100 2 264.979 413.9598 30.1476 0.1671 6099 +6101 2 264.216 414.8121 30.1031 0.2029 6100 +6102 2 263.7309 415.8474 30.1092 0.2104 6101 +6103 2 263.3957 416.94 30.1952 0.1695 6102 +6104 2 263.0628 418.0325 30.3419 0.127 6103 +6105 2 262.7333 419.1124 30.8 0.1144 6104 +6106 2 285.4577 366.7572 25.5793 0.1858 6042 +6107 2 284.4648 366.1898 25.6806 0.1787 6106 +6108 2 283.4729 365.6224 25.8041 0.1565 6107 +6109 2 282.4811 365.055 25.9505 0.1483 6108 +6110 2 281.4892 364.4887 26.116 0.1431 6109 +6111 2 280.4985 363.9224 26.2928 0.1404 6110 +6112 2 279.5147 363.3436 26.4725 0.139 6111 +6113 2 278.5766 362.696 26.6337 0.1382 6112 +6114 2 277.674 361.9948 26.7542 0.1377 6113 +6115 2 276.7496 361.3221 26.8345 0.1376 6114 +6116 2 275.8161 360.6609 26.9 0.1375 6115 +6117 2 274.8838 360.0008 26.9875 0.1373 6116 +6118 2 273.9228 359.383 27.1133 0.1373 6117 +6119 2 272.9023 358.8797 27.2883 0.1373 6118 +6120 2 271.8556 358.4312 27.5296 0.1373 6119 +6121 2 270.8283 357.9462 27.8564 0.1373 6120 +6122 2 269.8021 357.4577 28.1688 0.1373 6121 +6123 2 268.7736 356.9623 28.3626 0.1373 6122 +6124 2 267.7086 356.5573 28.4813 0.1373 6123 +6125 2 266.6058 356.2588 28.5379 0.1373 6124 +6126 2 265.4972 355.975 28.5018 0.1373 6125 +6127 2 264.3967 355.6685 28.3676 0.1373 6126 +6128 2 263.3213 355.2886 28.1912 0.1373 6127 +6129 2 262.421 354.6331 28.0311 0.1373 6128 +6130 2 261.6786 353.7637 27.9268 0.1373 6129 +6131 2 260.9338 352.8965 27.8995 0.1373 6130 +6132 2 260.141 352.0729 27.937 0.1373 6131 +6133 2 259.1892 351.4757 28.0241 0.1519 6132 +6134 2 258.1585 350.9826 28.11 0.1824 6133 +6135 2 257.1895 350.3797 28.1492 0.2196 6134 +6136 2 256.2983 349.6647 28.1324 0.2016 6135 +6137 2 255.4712 348.8765 28.0258 0.1678 6136 +6138 2 254.6201 348.1226 27.7873 0.1546 6137 +6139 2 253.7655 347.379 27.4145 0.1464 6138 +6140 2 252.9315 346.6137 27.011 0.1421 6139 +6141 2 252.069 345.8747 26.6792 0.1398 6140 +6142 2 251.2499 345.162 25.877 0.1383 6141 +6143 2 251.5084 344.1472 26.1584 0.1379 6142 +6144 2 251.7555 343.0478 26.6386 0.1376 6143 +6145 2 251.7887 341.9096 26.8722 0.1374 6144 +6146 2 251.8836 340.7747 27.1303 0.1374 6145 +6147 2 252.0163 339.6444 27.4073 0.1373 6146 +6148 2 252.236 338.5268 27.6762 0.1373 6147 +6149 2 252.3721 337.3965 27.9488 0.1373 6148 +6150 2 252.3904 336.2582 28.2302 0.1373 6149 +6151 2 251.9797 335.2012 28.5384 0.1373 6150 +6152 2 251.5347 334.1532 28.8252 0.1373 6151 +6153 2 251.0028 333.1465 29.094 0.1373 6152 +6154 2 250.3621 332.205 29.339 0.1373 6153 +6155 2 249.7489 331.2429 29.5515 0.1373 6154 +6156 2 249.1952 330.2442 29.7181 0.1373 6155 +6157 2 248.685 329.2215 29.8326 0.1373 6156 +6158 2 248.2102 328.1804 29.9062 0.1373 6157 +6159 2 247.8167 327.1074 29.9491 0.1373 6158 +6160 2 247.4461 326.024 29.986 0.1373 6159 +6161 2 247.0274 324.9601 30.0328 0.1373 6160 +6162 2 246.5903 323.903 30.098 0.1373 6161 +6163 2 246.1648 322.8425 30.177 0.1373 6162 +6164 2 245.7735 321.7672 30.2515 0.1373 6163 +6165 2 245.3903 320.6895 30.2996 0.1373 6164 +6166 2 244.9533 319.6325 30.317 0.1373 6165 +6167 2 244.5311 318.5685 30.3162 0.1373 6166 +6168 2 244.1731 317.4829 30.3083 0.1373 6167 +6169 2 243.8894 316.3743 30.3005 0.1373 6168 +6170 2 243.648 315.2555 30.2982 0.1498 6169 +6171 2 243.3494 314.1516 30.2949 0.1667 6170 +6172 2 243.0222 313.0556 30.2702 0.1865 6171 +6173 2 242.6481 311.9745 30.2008 0.1574 6172 +6174 2 242.1791 310.9323 30.0765 0.1495 6173 +6175 2 241.5876 309.9565 29.9096 0.1435 6174 +6176 2 240.9035 309.0424 29.7282 0.1534 6175 +6177 2 240.1782 308.1604 29.5481 0.1687 6176 +6178 2 239.3992 307.3253 29.3866 0.1877 6177 +6179 2 238.5194 306.5966 29.2496 0.1577 6178 +6180 2 237.5413 306.0051 29.1309 0.1508 6179 +6181 2 236.5151 305.5006 29.0206 0.1475 6180 +6182 2 235.5164 304.9618 28.6717 0.1248 6181 +6183 2 250.9925 345.0453 25.8654 0.1202 6142 +6184 2 249.9526 344.5717 25.7442 0.1468 6183 +6185 2 248.9756 343.9779 25.6955 0.157 6184 +6186 2 248.0386 343.3213 25.6592 0.1854 6185 +6187 2 247.072 342.7138 25.5205 0.1699 6186 +6188 2 246.0904 342.1304 25.3566 0.1543 6187 +6189 2 245.0837 341.5881 25.2836 0.1444 6188 +6190 2 243.9992 341.2255 25.2245 0.1495 6189 +6191 2 242.9009 340.9086 25.1448 0.1611 6190 +6192 2 241.7798 340.6786 25.1234 0.1763 6191 +6193 2 240.661 340.4407 25.1609 0.2348 6192 +6194 2 239.5994 340.0174 25.2284 0.1967 6193 +6195 2 238.6098 339.4431 25.3171 0.1621 6194 +6196 2 237.5276 339.0724 25.3366 0.1357 6195 +6197 2 236.4579 338.6675 25.2989 0.1342 6196 +6198 2 235.4329 338.1607 25.2362 0.1313 6197 +6199 2 234.3598 337.7649 25.1584 0.1271 6198 +6200 2 233.3199 337.2901 25.0497 0.1144 6199 +6201 2 232.3075 336.7696 24.7814 0.1144 6200 +6202 2 280.4047 315.3974 31.4418 0.1144 -1 +6203 2 279.4414 315.5964 30.0107 0.1144 6202 +6204 2 279.9551 316.3766 29.0965 0.1307 6203 +6205 2 281.0156 316.7187 28.4696 0.1761 6204 +6206 2 282.0921 317.0218 27.8784 0.244 6205 +6207 2 283.1755 317.2918 27.336 0.3066 6206 +6208 2 284.2954 317.1946 26.8451 0.2392 6207 +6209 2 285.3822 316.88 26.4389 0.1913 6208 +6210 2 286.4519 316.5128 26.0384 0.1808 6209 +6211 2 287.4895 316.1478 25.3002 0.1906 6210 +6212 2 288.5946 315.8538 25.247 0.2429 6211 +6213 2 289.7088 315.5953 25.1997 0.2779 6212 +6214 2 290.8414 315.4843 25.2417 0.2449 6213 +6215 2 291.9797 315.5324 25.435 0.1879 6214 +6216 2 293.1122 315.6525 25.7038 0.1653 6215 +6217 2 294.2448 315.776 25.9545 0.1522 6216 +6218 2 295.3762 315.9167 26.1565 0.1454 6217 +6219 2 296.4985 316.1295 26.3027 0.1416 6218 +6220 2 297.6127 316.3835 26.3829 0.1397 6219 +6221 2 298.7316 316.6249 26.4114 0.1385 6220 +6222 2 299.8664 316.7347 26.3911 0.138 6221 +6223 2 301.007 316.8091 26.3864 0.1376 6222 +6224 2 302.1476 316.8926 26.4605 0.163 6223 +6225 2 303.2504 316.6729 26.5347 0.2101 6224 +6226 2 304.3383 316.3194 26.5467 0.2841 6225 +6227 2 305.4251 315.9625 26.4754 0.2907 6226 +6228 2 306.4936 315.5598 26.3073 0.3164 6227 +6229 2 307.5884 315.2589 26.035 0.305 6228 +6230 2 308.6638 314.9752 25.4229 0.1669 6229 +6231 2 342.6497 284.8549 25.7026 0.2452 -1 +6232 2 341.4085 284.2623 25.9918 0.2054 6231 +6233 2 340.4132 283.6994 26.0814 0.1969 6232 +6234 2 339.4179 283.1366 26.1631 0.202 6233 +6235 2 338.4227 282.5726 26.2417 0.2064 6234 +6236 2 337.4297 282.0063 26.3253 0.2137 6235 +6237 2 336.439 281.4354 26.4198 0.2136 6236 +6238 2 335.4494 280.8634 26.5278 0.2264 6237 +6239 2 334.4598 280.2914 26.654 0.2403 6238 +6240 2 333.4131 279.9528 26.8047 0.2598 6239 +6241 2 332.2748 280.034 26.9726 0.2491 6240 +6242 2 331.1754 280.3029 27.1371 0.2385 6241 +6243 2 330.195 280.8669 27.2931 0.1903 6242 +6244 2 329.3004 281.5773 27.4385 0.167 6243 +6245 2 328.4058 282.2889 27.577 0.1708 6244 +6246 2 327.4231 282.8346 27.7035 0.1783 6245 +6247 2 326.3271 283.1617 27.8114 0.1603 6246 +6248 2 325.2266 283.4695 27.8941 0.1462 6247 +6249 2 324.1249 283.7772 27.941 0.1411 6248 +6250 2 323.0233 284.0849 27.9381 0.1443 6249 +6251 2 321.9033 284.2851 27.8675 0.1505 6250 +6252 2 320.7627 284.2943 27.7324 0.1611 6251 +6253 2 319.6233 284.2314 27.5621 0.186 6252 +6254 2 318.4827 284.1685 27.3748 0.2053 6253 +6255 2 317.3445 284.1788 27.181 0.209 6254 +6256 2 316.2073 284.2771 27.0053 0.2464 6255 +6257 2 315.2944 284.4144 26.9785 0.2912 6256 +6258 2 314.9146 285.4406 27.5795 0.2144 6257 +6259 2 314.457 286.4839 27.8315 0.1675 6258 +6260 2 313.9205 287.4883 28.1047 0.1445 6259 +6261 2 313.3622 288.4802 28.3816 0.1496 6260 +6262 2 312.8714 289.5086 28.6152 0.1613 6261 +6263 2 312.6152 290.6229 28.73 0.1766 6262 +6264 2 312.5156 291.7623 28.7546 0.2358 6263 +6265 2 312.6724 292.8949 28.7442 0.1961 6264 +6266 2 312.9835 293.9966 28.7176 0.1618 6265 +6267 2 313.2078 295.1177 28.6888 0.1356 6266 +6268 2 313.2981 296.2582 28.6686 0.1342 6267 +6269 2 313.3691 297.4 28.6644 0.1313 6268 +6270 2 313.6779 298.5016 28.6689 0.1271 6269 +6271 2 314.0738 299.5747 28.6726 0.1144 6270 +6272 2 314.4742 300.6466 28.6628 0.1144 6271 +6273 2 343.7285 285.1168 25.4446 0.1776 6231 +6274 2 344.8222 285.4383 25.2655 0.1608 6273 +6275 2 345.949 285.6042 25.0944 0.1494 6274 +6276 2 347.0907 285.6179 24.9203 0.1438 6275 +6277 2 348.2325 285.6179 24.7687 0.1408 6276 +6278 2 349.3753 285.6179 24.6649 0.1391 6277 +6279 2 350.5193 285.6248 24.6477 0.1383 6278 +6280 2 351.653 285.7243 24.7733 0.1378 6279 +6281 2 352.7821 285.8467 24.9148 0.1444 6280 +6282 2 353.8872 286.0721 25.0093 0.1602 6281 +6283 2 354.894 286.58 25.3393 0.1825 6282 +6284 2 355.9785 286.7619 25.9485 0.1569 6283 +6285 2 357.111 286.7642 26.34 0.1493 6284 +6286 2 358.2333 286.9713 26.5346 0.1433 6285 +6287 2 359.3716 287.0788 26.5765 0.1406 6286 +6288 2 360.5041 287.1772 26.4569 0.139 6287 +6289 2 361.639 287.0399 26.396 0.1382 6288 +6290 2 362.7796 286.9907 26.2593 0.1495 6289 +6291 2 363.919 286.9999 26.0463 0.1972 6290 +6292 2 365.0264 287.2001 25.9783 0.2527 6291 +6293 2 366.1258 287.4392 25.9731 0.2451 6292 +6294 2 367.2698 287.4483 26.0217 0.1859 6293 +6295 2 368.4126 287.4597 26.1187 0.1651 6294 +6296 2 369.4971 287.7194 26.2176 0.1642 6295 +6297 2 370.5656 288.1015 26.2938 0.1876 6296 +6298 2 371.5472 288.6106 26.3347 0.2405 6297 +6299 2 372.5139 289.1826 26.35 0.2722 6298 +6300 2 373.5286 289.694 26.3425 0.2902 6299 +6301 2 374.4815 290.3278 26.3185 0.255 6300 +6302 2 375.3132 291.0965 26.2871 0.2075 6301 +6303 2 376.1712 291.8367 26.2527 0.2137 6302 +6304 2 377.0693 292.5414 26.1761 0.2458 6303 +6305 2 378.1069 292.9086 26.0349 0.2368 6304 +6306 2 379.2314 293.1088 25.9209 0.2389 6305 +6307 2 380.3697 293.1706 25.8822 0.2275 6306 +6308 2 381.5091 293.1706 26.0794 0.1824 6307 +6309 2 382.62 292.9418 26.4006 0.1144 6308 +6310 2 336.0363 292.443 24.3928 0.2233 -1 +6311 2 337.2592 291.8756 22.9822 0.2087 6310 +6312 2 338.338 291.5404 22.5661 0.1971 6311 +6313 2 339.4259 291.2292 22.1688 0.2465 6312 +6314 2 340.5402 291.0142 21.8147 0.2225 6313 +6315 2 341.6579 290.8048 21.5031 0.2059 6314 +6316 2 342.771 290.5691 21.2145 0.2286 6315 +6317 2 343.8738 290.2969 20.8926 0.2391 6316 +6318 2 344.9995 290.1493 20.5379 0.3212 6317 +6319 2 346.1344 290.2191 20.2412 0.2718 6318 +6320 2 347.2726 290.2328 19.9824 0.265 6319 +6321 2 348.4018 290.0864 19.7012 0.2665 6320 +6322 2 349.5332 290.0383 19.3188 0.2075 6321 +6323 2 350.6646 290.1539 19.039 0.1638 6322 +6324 2 351.788 290.3495 18.8169 0.1426 6323 +6325 2 352.8954 290.6149 18.6752 0.1473 6324 +6326 2 353.8472 291.2201 18.7077 0.1569 6325 +6327 2 354.489 292.1639 18.7692 0.1743 6326 +6328 2 355.0015 293.1866 18.7862 0.2049 6327 +6329 2 355.5769 294.1739 18.7089 0.2053 6328 +6330 2 356.221 295.1177 18.5663 0.2216 6329 +6331 2 356.8994 296.0363 18.4215 0.218 6330 +6332 2 357.6361 296.9092 18.2739 0.2502 6331 +6333 2 358.3088 297.8107 18.1346 0.3237 6332 +6334 2 358.6806 298.8917 18.0147 0.3408 6333 +6335 2 359.2755 299.8252 17.9122 0.2841 6334 +6336 2 360.1712 300.5299 17.7477 0.24 6335 +6337 2 361.1173 301.1649 17.5028 0.1822 6336 +6338 2 362.0668 301.7895 17.1913 0.1528 6337 +6339 2 362.9443 302.5011 16.8015 0.1405 6338 +6340 2 363.6868 303.3465 16.3553 0.1433 6339 +6341 2 364.3743 304.2354 15.8358 0.1488 6340 +6342 2 365.3204 304.725 15.3125 0.1607 6341 +6343 2 366.4449 304.8566 14.9702 0.1779 6342 +6344 2 367.5786 304.987 14.8226 0.2296 6343 +6345 2 368.6929 304.8371 15.0056 0.2214 6344 +6346 2 369.5978 304.1793 15.4239 0.213 6345 +6347 2 370.3528 303.3408 15.8719 0.1703 6346 +6348 2 370.7967 302.3009 16.2572 0.1527 6347 +6349 2 370.561 301.1935 16.4612 0.1416 6348 +6350 2 370.0668 300.1639 16.4576 0.144 6349 +6351 2 369.7156 299.0771 16.3067 0.1525 6350 +6352 2 369.4354 297.9697 16.1221 0.1529 6351 +6353 2 369.1528 296.868 15.8267 0.2288 6352 +6354 2 336.2124 290.9409 24.3443 0.3001 6310 +6355 2 336.4024 289.8141 24.3244 0.2434 6354 +6356 2 336.6758 288.7033 24.2787 0.2346 6355 +6357 2 336.9846 287.6027 24.1956 0.2097 6356 +6358 2 337.2809 286.4988 24.0718 0.1756 6357 +6359 2 337.5589 285.3914 23.911 0.1502 6358 +6360 2 337.8289 284.2829 23.7202 0.148 6359 +6361 2 338.0955 283.1732 23.4969 0.1554 6360 +6362 2 338.3254 282.0589 23.2265 0.1791 6361 +6363 2 338.4375 280.9309 22.8896 0.1749 6362 +6364 2 338.4799 279.8007 22.471 0.1589 6363 +6365 2 338.5794 278.6807 21.959 0.1483 6364 +6366 2 338.8196 277.5916 21.3598 0.1524 6365 +6367 2 339.1708 276.5368 20.7089 0.1638 6366 +6368 2 339.3482 275.4363 20.1175 0.1972 6367 +6369 2 339.3687 274.3095 19.6549 0.1993 6368 +6370 2 339.3653 273.1746 19.3105 0.2024 6369 +6371 2 339.3207 272.0363 19.0716 0.2514 6370 +6372 2 339.0988 270.9186 18.9209 0.2457 6371 +6373 2 338.6972 269.8502 18.8379 0.253 6372 +6374 2 338.3574 268.7588 18.7972 0.2693 6373 +6375 2 338.2373 267.6239 18.7841 0.2295 6374 +6376 2 338.2339 266.4811 18.7912 0.1887 6375 +6377 2 338.2865 265.3382 18.8102 0.1862 6376 +6378 2 338.433 264.2045 18.8289 0.1703 6377 +6379 2 338.7647 263.112 18.8348 0.1531 6378 +6380 2 339.2372 262.071 18.8201 0.1401 6379 +6381 2 339.8366 261.0986 18.7785 0.139 6380 +6382 2 340.6066 260.2566 18.7049 0.1405 6381 +6383 2 341.3524 259.3906 18.5954 0.1432 6382 +6384 2 341.9759 258.4342 18.4562 0.1486 6383 +6385 2 342.5628 257.4549 18.2989 0.1562 6384 +6386 2 343.2995 256.5855 18.13 0.1834 6385 +6387 2 344.1244 255.7961 17.9701 0.1698 6386 +6388 2 344.5865 254.7642 17.8333 0.1525 6387 +6389 2 344.94 253.6774 17.7358 0.1402 6388 +6390 2 345.3267 252.6009 17.6666 0.1408 6389 +6391 2 345.6916 251.5164 17.6094 0.1439 6390 +6392 2 346.1149 250.4548 17.5472 0.1493 6391 +6393 2 346.8082 249.5499 17.4532 0.1606 6392 +6394 2 347.6959 248.8372 17.2587 0.1761 6393 +6395 2 347.9407 247.7401 16.9693 0.236 6394 +6396 2 348.3549 246.6796 16.6835 0.1967 6395 +6397 2 348.8868 245.6717 16.4255 0.163 6396 +6398 2 349.4783 244.697 16.2014 0.1376 6397 +6399 2 350.0079 243.6869 16.0124 0.1378 6398 +6400 2 350.493 242.6527 15.8556 0.1382 6399 +6401 2 350.9392 241.6002 15.7137 0.1391 6400 +6402 2 351.3682 240.5409 15.5705 0.1406 6401 +6403 2 351.6919 239.4461 15.4199 0.1433 6402 +6404 2 351.9356 238.3295 15.2682 0.149 6403 +6405 2 352.2719 237.2381 15.1304 0.1566 6404 +6406 2 352.7021 236.1788 15.0153 0.1857 6405 +6407 2 353.25 235.1755 14.9228 0.1652 6406 +6408 2 353.9056 234.2386 14.8525 0.1469 6407 +6409 2 354.7704 233.4904 14.7977 0.1313 6408 +6410 2 355.8458 233.1014 14.7602 0.1271 6409 +6411 2 356.5745 232.2183 14.7344 0.1144 6410 +6412 2 357.1145 231.2104 14.6947 0.1144 6411 +6413 2 335.9219 293.6488 24.4885 0.2023 6310 +6414 2 335.8418 294.7882 24.6536 0.208 6413 +6415 2 335.756 295.9242 24.9 0.2302 6414 +6416 2 335.5581 297.043 25.2326 0.2117 6415 +6417 2 335.3602 298.1619 25.5643 0.1722 6416 +6418 2 335.1211 299.2635 25.8731 0.157 6417 +6419 2 334.4518 300.1845 26.1386 0.1489 6418 +6420 2 333.6728 301.0161 26.381 0.1572 6419 +6421 2 332.896 301.8501 26.6078 0.1729 6420 +6422 2 332.1261 302.6921 26.8191 0.1999 6421 +6423 2 331.3688 303.5455 27.0303 0.1887 6422 +6424 2 330.6423 304.4195 27.2661 0.1962 6423 +6425 2 330.1573 305.4491 27.5353 0.1627 6424 +6426 2 329.726 306.5028 27.816 0.1523 6425 +6427 2 329.2798 307.5495 28.0972 0.1451 6426 +6428 2 328.7181 308.5402 28.3676 0.1416 6427 +6429 2 328.1255 309.5126 28.628 0.1396 6428 +6430 2 327.5089 310.4541 29.1178 0.1385 6429 +6431 2 326.6784 311.2401 29.234 0.1506 6430 +6432 2 325.8467 312.0249 29.2799 0.1799 6431 +6433 2 325.015 312.8096 29.3404 0.2163 6432 +6434 2 324.157 313.5658 29.426 0.2193 6433 +6435 2 323.2143 314.2122 29.5666 0.1989 6434 +6436 2 322.2728 314.8563 29.7478 0.205 6435 +6437 2 321.3347 315.506 29.9592 0.1667 6436 +6438 2 320.4081 316.1707 30.1795 0.1546 6437 +6439 2 319.4826 316.8365 30.3976 0.1463 6438 +6440 2 318.4347 317.2884 30.595 0.1422 6439 +6441 2 317.3788 317.7231 30.7681 0.1398 6440 +6442 2 316.3274 318.1567 31.08 0.1144 6441 +6443 2 282.0292 262.3432 40.6932 0.1144 -1 +6444 2 283.0988 261.9382 40.684 0.1398 6443 +6445 2 283.8859 261.1077 40.679 0.1738 6444 +6446 2 284.3046 260.0426 40.672 0.1498 6445 +6447 2 284.5631 258.9284 40.6633 0.1455 6446 +6448 2 285.1443 257.9434 40.6532 0.1414 6447 +6449 2 285.6625 256.9241 40.6428 0.1396 6448 +6450 2 286.2437 255.938 40.6328 0.1385 6449 +6451 2 286.8717 254.9816 40.6092 0.138 6450 +6452 2 287.4998 254.0263 40.5667 0.1398 6451 +6453 2 288.1187 253.0654 40.4272 0.1724 6452 +6454 2 288.6895 252.0747 40.3656 0.2209 6453 +6455 2 289.2432 251.076 40.2861 0.2578 6454 +6456 2 289.9251 250.1631 40.1853 0.2171 6455 +6457 2 290.7327 249.3542 40.0613 0.1772 6456 +6458 2 291.5358 248.5409 39.926 0.1647 6457 +6459 2 292.2897 247.6886 39.7919 0.1815 6458 +6460 2 292.8651 246.7013 39.6679 0.2165 6459 +6461 2 293.3422 245.6637 39.559 0.2598 6460 +6462 2 293.7689 244.6032 39.4657 0.243 6461 +6463 2 294.1464 243.5244 39.3842 0.2466 6462 +6464 2 294.4153 242.4147 39.307 0.1855 6463 +6465 2 294.5663 241.281 39.2263 0.1655 6464 +6466 2 294.7962 240.1748 39.137 0.152 6465 +6467 2 295.3751 239.1898 39.0303 0.1453 6466 +6468 2 296.0729 238.2941 38.9091 0.1416 6467 +6469 2 296.9584 237.5722 38.7876 0.1396 6468 +6470 2 297.8118 236.8137 38.6778 0.1385 6469 +6471 2 298.5748 235.9626 38.5874 0.138 6470 +6472 2 299.2681 235.0588 38.5199 0.1377 6471 +6473 2 299.8058 234.0487 38.4765 0.1375 6472 +6474 2 300.2668 233.0076 38.4521 0.1374 6473 +6475 2 300.5311 231.8945 38.4398 0.1374 6474 +6476 2 300.7507 230.7745 38.4345 0.1373 6475 +6477 2 300.7999 229.6317 38.4328 0.1373 6476 +6478 2 300.7999 228.4877 38.4325 0.1373 6477 +6479 2 300.7999 227.3437 38.4325 0.1373 6478 +6480 2 300.7999 226.1997 38.4325 0.1373 6479 +6481 2 300.7999 225.0557 38.4325 0.1373 6480 +6482 2 300.7999 223.9117 38.4325 0.1373 6481 +6483 2 300.7999 222.7677 38.4325 0.1373 6482 +6484 2 300.7851 221.6248 38.4325 0.1399 6483 +6485 2 300.6912 220.4854 38.4325 0.1562 6484 +6486 2 300.5036 219.3574 38.4325 0.1899 6485 +6487 2 301.1534 256.2285 46.1202 0.1373 -1 +6488 2 300.5094 256.1794 46.6161 0.1216 6487 +6489 2 299.5438 256.0329 45.6663 0.1739 6488 +6490 2 298.9055 255.4884 44.0978 0.2541 6489 +6491 2 299.013 255.1212 41.4588 0.1144 6490 +6492 2 300.9658 256.574 46.1412 0.1373 6487 +6493 2 300.2828 257.4904 46.1751 0.1373 6492 +6494 2 299.5999 258.4079 46.2132 0.1374 6493 +6495 2 299.1915 259.4741 46.2832 0.1374 6494 +6496 2 298.9341 260.5872 46.3918 0.1376 6495 +6497 2 298.6847 261.7026 46.5226 0.1378 6496 +6498 2 298.4524 262.8214 46.6161 0.1383 6497 +6499 2 298.2339 263.9448 46.6315 0.1391 6498 +6500 2 298.0166 265.0682 46.5833 0.1407 6499 +6501 2 297.8507 266.1996 46.5296 0.1435 6500 +6502 2 297.6928 267.3322 46.4839 0.1492 6501 +6503 2 297.5144 268.4625 46.4528 0.157 6502 +6504 2 297.3096 269.5882 46.4428 0.1861 6503 +6505 2 297.1037 270.7127 46.454 0.1678 6504 +6506 2 296.8108 271.819 46.4834 0.151 6505 +6507 2 296.5168 272.9241 46.5374 0.1387 6506 +6508 2 296.2205 274.0292 46.6102 0.1393 6507 +6509 2 295.9253 275.1331 46.678 0.141 6508 +6510 2 295.6302 276.2382 46.7684 0.1441 6509 +6511 2 295.8601 276.3218 47.1733 0.1469 6510 +6512 2 296.8474 276.5906 48.3795 0.1572 6511 +6513 2 297.9296 276.689 49.2332 0.1838 6512 +6514 2 299.0164 276.5631 50.0133 0.1781 6513 +6515 2 300.0906 276.3149 50.7525 0.1661 6514 +6516 2 301.0962 275.8722 51.4814 0.1624 6515 +6517 2 302.0217 275.2727 52.2116 0.177 6516 +6518 2 302.9495 274.6778 52.9645 0.2173 6517 +6519 2 303.9494 274.2328 53.7474 0.2598 6518 +6520 2 304.9755 273.845 54.5401 0.2222 6519 +6521 2 306.0063 273.4469 55.2703 0.1765 6520 +6522 2 307.0404 273.0259 55.8709 0.1531 6521 +6523 2 308.0815 272.5946 56.3601 0.1555 6522 +6524 2 309.0951 272.1004 56.8221 0.1807 6523 +6525 2 310.0881 271.5776 57.358 0.1702 6524 +6526 2 311.073 271.0525 57.9743 0.152 6525 +6527 2 311.8761 270.278 58.5309 0.1387 6526 +6528 2 312.5179 269.3525 58.998 0.1373 6527 +6529 2 312.8691 268.2863 59.4586 0.1373 6528 +6530 2 312.9275 267.1663 59.964 0.1373 6529 +6531 2 312.8863 266.0464 60.5144 0.1374 6530 +6532 2 312.9309 264.9218 61.0134 0.1374 6531 +6533 2 312.9915 263.7961 61.4883 0.1375 6532 +6534 2 313.1139 262.6761 61.9696 0.1377 6533 +6535 2 313.5235 261.6397 62.5551 0.1382 6534 +6536 2 313.9754 260.6238 63.2128 0.1389 6535 +6537 2 314.4925 259.6491 63.9472 0.1403 6536 +6538 2 315.5953 259.5542 64.6436 0.1427 6537 +6539 2 316.7038 259.4638 65.2982 0.1483 6538 +6540 2 317.8181 259.3826 65.8876 0.1534 6539 +6541 2 318.9175 259.6525 66.3032 0.1896 6540 +6542 2 320.0043 259.9454 66.796 0.1144 6541 +6543 2 295.4014 277.2461 45.1592 0.2278 6510 +6544 2 295.0513 278.3283 45.376 0.1799 6543 +6545 2 294.7081 279.4186 45.4586 0.1495 6544 +6546 2 294.4164 280.5225 45.6434 0.1357 6545 +6547 2 294.1258 281.6242 45.9057 0.1342 6546 +6548 2 293.8032 282.7144 46.2182 0.1313 6547 +6549 2 293.4028 283.7772 46.5576 0.127 6548 +6550 2 293.0013 284.8377 46.9078 0.1144 6549 +6551 2 292.5757 285.857 47.6406 0.1144 6550 +6552 2 301.2575 255.6497 46.111 0.1373 6487 +6553 2 301.7369 254.6487 46.0964 0.1373 6552 +6554 2 302.4027 253.7186 46.086 0.1373 6553 +6555 2 302.8282 252.6741 46.0788 0.1373 6554 +6556 2 303.1703 251.5828 46.0734 0.1373 6555 +6557 2 303.4883 250.4857 46.0698 0.1373 6556 +6558 2 303.7137 249.3645 46.0673 0.1373 6557 +6559 2 303.923 248.24 46.0748 0.1373 6558 +6560 2 304.0912 247.1097 46.1087 0.1373 6559 +6561 2 304.2537 245.9783 46.153 0.145 6560 +6562 2 304.4928 244.8595 46.1798 0.162 6561 +6563 2 304.6518 243.7303 46.16 0.195 6562 +6564 2 305.353 242.8334 45.9976 0.1179 6563 +6565 2 306.2168 242.1356 45.5305 0.1382 6564 +6566 2 307.2647 241.9446 44.732 0.1392 6565 +6567 2 308.3343 242.1779 43.9323 0.1409 6566 +6568 2 309.3788 242.4205 42.9923 0.144 6567 +6569 2 310.3924 242.3724 41.7816 0.1512 6568 +6570 2 311.3865 242.0967 40.5787 0.166 6569 +6571 2 312.4756 242.1734 39.8874 0.2023 6570 +6572 2 313.5796 242.4205 39.4666 0.2152 6571 +6573 2 314.6858 242.6802 39.1628 0.1838 6572 +6574 2 315.7978 242.941 38.983 0.1534 6573 +6575 2 316.9109 243.2018 38.9486 0.1387 6574 +6576 2 318.0171 243.4867 39.0807 0.1373 6575 +6577 2 319.1199 243.775 39.3148 0.1373 6576 +6578 2 320.2205 244.0644 39.6264 0.1374 6577 +6579 2 321.3187 244.3435 39.9972 0.1375 6578 +6580 2 322.4364 244.5174 40.4116 0.1376 6579 +6581 2 323.5575 244.681 40.791 0.1378 6580 +6582 2 324.6832 244.8457 41.0917 0.1384 6581 +6583 2 325.7071 244.9887 42.0608 0.1409 6582 +6584 2 326.8111 244.7897 42.4004 0.1439 6583 +6585 2 327.9013 244.4499 42.5676 0.1501 6584 +6586 2 328.9801 244.0724 42.6776 0.1591 6585 +6587 2 330.0577 243.688 42.744 0.1879 6586 +6588 2 331.1205 243.267 42.7543 0.1818 6587 +6589 2 332.1478 242.766 42.6832 0.1722 6588 +6590 2 333.1625 242.2409 42.5435 0.186 6589 +6591 2 334.1086 241.6025 42.4066 0.1729 6590 +6592 2 334.9872 240.8703 42.3245 0.1581 6591 +6593 2 335.8487 240.1187 42.301 0.1503 6592 +6594 2 336.8382 239.5525 42.3433 0.1561 6593 +6595 2 337.8655 239.0491 42.4374 0.1829 6594 +6596 2 338.8906 238.5457 42.555 0.1694 6595 +6597 2 340.0128 238.3661 42.6432 0.1519 6596 +6598 2 341.1545 238.3009 42.6818 0.1386 6597 +6599 2 342.2974 238.246 42.6703 0.1371 6598 +6600 2 343.4391 238.1751 42.6146 0.1368 6599 +6601 2 344.5797 238.0984 42.5264 0.1364 6600 +6602 2 345.7157 237.9932 42.3195 0.1356 6601 +6603 2 346.8219 237.7404 41.993 0.1342 6602 +6604 2 347.9522 237.6157 41.68 0.1314 6603 +6605 2 349.0927 237.6225 41.4784 0.1272 6604 +6606 2 350.2367 237.6122 41.4333 0.1144 6605 +6607 2 351.3773 237.5562 41.603 0.1144 6606 +6608 2 285.0299 324.3332 42.9545 0.1144 -1 +6609 2 284.2325 323.5495 43.5512 0.1144 6608 +6610 2 283.4191 322.7533 43.8113 0.1271 6609 +6611 2 282.6172 321.9456 44.0994 0.1314 6610 +6612 2 281.9113 321.051 44.3618 0.1342 6611 +6613 2 281.2158 320.1484 44.59 0.1356 6612 +6614 2 280.6472 319.16 44.8112 0.1364 6613 +6615 2 280.2903 318.0778 45.0632 0.1364 6614 +6616 2 178.6596 438.8853 42.3615 0.1373 -1 +6617 2 179.0612 439.6369 41.3241 0.1224 6616 +6618 2 179.5908 440.6402 40.9965 0.1374 6617 +6619 2 180.0313 441.6904 40.8184 0.1375 6618 +6620 2 180.3379 442.7886 40.6179 0.1377 6619 +6621 2 180.6284 443.8892 40.369 0.1381 6620 +6622 2 180.9648 444.9725 40.0112 0.1388 6621 +6623 2 181.1604 446.057 39.3999 0.1404 6622 +6624 2 180.5827 446.8064 38.4185 0.144 6623 +6625 2 179.656 447.399 37.6547 0.1505 6624 +6626 2 178.6871 447.9492 37.0202 0.1595 6625 +6627 2 177.654 448.3679 36.4174 0.1881 6626 +6628 2 176.5695 448.3096 35.7157 0.1829 6627 +6629 2 175.5376 447.9401 34.932 0.1746 6628 +6630 2 174.4966 448.1357 33.978 0.1947 6629 +6631 2 173.7667 448.8736 32.8409 0.1801 6630 +6632 2 172.8435 449.4147 31.8738 0.1823 6631 +6633 2 172.1045 450.1777 30.8658 0.1373 6632 +6634 2 171.4215 450.8115 29.2412 0.1144 6633 +6635 2 178.1757 439.9286 42.1977 0.1373 6616 +6636 2 177.6483 440.9422 42.2047 0.1373 6635 +6637 2 177.0008 441.8814 42.2201 0.1373 6636 +6638 2 176.4014 442.8481 42.1795 0.1373 6637 +6639 2 176.2126 443.9418 42.0286 0.1373 6638 +6640 2 176.2881 445.0801 41.8435 0.1373 6639 +6641 2 176.3876 446.2172 41.6881 0.1373 6640 +6642 2 176.5203 447.3532 41.5817 0.1373 6641 +6643 2 176.7617 448.4686 41.5573 0.1373 6642 +6644 2 177.0088 449.5851 41.5685 0.1373 6643 +6645 2 177.2617 450.7005 41.5604 0.1374 6644 +6646 2 177.5534 451.8068 41.5072 0.1374 6645 +6647 2 177.8016 452.9222 41.4014 0.1375 6646 +6648 2 178.0876 454.0261 41.2387 0.1378 6647 +6649 2 178.4114 455.1198 41.0155 0.1382 6648 +6650 2 178.7122 456.2169 40.7324 0.1388 6649 +6651 2 178.8427 457.3369 40.3452 0.1402 6650 +6652 2 178.5246 458.3791 39.8045 0.1426 6651 +6653 2 177.9435 459.316 39.0866 0.1476 6652 +6654 2 177.3337 460.2003 38.1259 0.1551 6653 +6655 2 176.9779 461.1418 36.8508 0.1827 6654 +6656 2 176.4037 461.9495 35.4855 0.1682 6655 +6657 2 175.4587 462.208 34.095 0.1501 6656 +6658 2 174.5458 462.6027 32.7158 0.137 6657 +6659 2 173.7141 463.2102 31.4978 0.1368 6658 +6660 2 172.8492 463.8314 30.4738 0.1363 6659 +6661 2 171.9546 464.4514 29.6128 0.1356 6660 +6662 2 171.0509 465.0806 28.8582 0.1342 6661 +6663 2 170.1689 465.7487 28.217 0.1313 6662 +6664 2 170.2146 466.8744 27.7234 0.1269 6663 +6665 2 170.3164 468.0035 27.3556 0.1144 6664 +6666 2 170.424 469.1292 26.9284 0.1144 6665 +6667 2 178.7168 437.5274 42.7076 0.1373 6616 +6668 2 178.7992 436.396 42.9775 0.1373 6667 +6669 2 178.6848 435.2634 43.241 0.1403 6668 +6670 2 178.5132 434.1354 43.4392 0.1541 6669 +6671 2 178.2981 433.0132 43.5725 0.1717 6670 +6672 2 177.9892 431.9206 43.6643 0.1795 6671 +6673 2 177.4836 430.8956 43.7206 0.1583 6672 +6674 2 177.066 429.8305 43.7357 0.1649 6673 +6675 2 176.6839 428.7529 43.7363 0.178 6674 +6676 2 176.4151 427.6524 43.8668 0.1787 6675 +6677 2 176.3533 426.5141 44.1081 0.1554 6676 +6678 2 176.2424 425.3827 44.3276 0.1347 6677 +6679 2 176.0216 424.3199 43.9244 0.1598 6678 +6680 2 176.1337 424.3199 44.1546 0.157 6679 +6681 2 177.2502 424.305 44.6191 0.1707 6680 +6682 2 178.3485 424.0339 44.9823 0.1952 6681 +6683 2 179.4215 423.6541 45.2794 0.2657 6682 +6684 2 180.4832 423.2388 45.4924 0.2731 6683 +6685 2 181.5448 422.8167 45.6386 0.2399 6684 +6686 2 182.6133 422.4083 45.7383 0.2584 6685 +6687 2 183.6681 421.9678 45.7906 0.2188 6686 +6688 2 184.6622 421.4027 45.7472 0.2016 6687 +6689 2 185.59 420.7369 45.5896 0.2001 6688 +6690 2 186.504 420.0528 45.416 0.2898 6689 +6691 2 187.4684 419.4396 45.2875 0.2396 6690 +6692 2 188.4282 418.8195 45.2012 0.1964 6691 +6693 2 189.3972 418.2109 45.1923 0.1872 6692 +6694 2 190.373 417.6138 45.2746 0.1677 6693 +6695 2 191.445 417.2168 45.3617 0.1512 6694 +6696 2 192.5604 416.964 45.4261 0.1394 6695 +6697 2 193.6872 416.7684 45.4703 0.1409 6696 +6698 2 194.8209 416.6185 45.5283 0.1441 6697 +6699 2 195.9546 416.4698 45.6011 0.1497 6698 +6700 2 197.0849 416.2959 45.6938 0.1613 6699 +6701 2 198.2266 416.3577 45.7682 0.1768 6700 +6702 2 199.3626 416.4915 45.8214 0.2361 6701 +6703 2 199.7481 415.8863 45.96 0.2091 6702 +6704 2 200.3487 414.9208 46.2594 0.1714 6703 +6705 2 201.0065 413.9964 46.5914 0.1434 6704 +6706 2 201.8325 413.222 46.8807 0.1374 6705 +6707 2 202.7626 412.5653 47.1184 0.1374 6706 +6708 2 203.6766 411.8823 47.3082 0.1375 6707 +6709 2 204.5666 411.1673 47.4496 0.1377 6708 +6710 2 205.5253 410.5484 47.595 0.138 6709 +6711 2 206.5263 410.0027 47.7907 0.1386 6710 +6712 2 207.5822 409.5737 48.0001 0.1398 6711 +6713 2 208.6748 409.2488 48.2115 0.142 6712 +6714 2 209.765 408.9148 48.4235 0.1459 6713 +6715 2 210.8289 408.5052 48.6368 0.1536 6714 +6716 2 211.8677 408.0351 48.8496 0.166 6715 +6717 2 212.8915 407.5328 49.0624 0.1979 6716 +6718 2 213.9017 407.002 49.2792 0.2141 6717 +6719 2 214.8157 406.3259 49.4987 0.1882 6718 +6720 2 215.652 405.5514 49.7115 0.1569 6719 +6721 2 216.5592 404.8627 49.9164 0.1403 6720 +6722 2 217.5591 404.3193 50.1192 0.1376 6721 +6723 2 218.5921 403.8343 50.3196 0.1378 6722 +6724 2 219.6194 403.3378 50.5137 0.1382 6723 +6725 2 220.6307 402.8093 50.7069 0.1389 6724 +6726 2 221.5699 402.1629 50.8934 0.1404 6725 +6727 2 222.4085 401.3918 51.0591 0.143 6726 +6728 2 223.1727 400.543 51.1988 0.1483 6727 +6729 2 223.8705 399.6381 51.3181 0.1559 6728 +6730 2 224.5809 398.7423 51.4192 0.181 6729 +6731 2 225.5156 398.1097 51.5018 0.1729 6730 +6732 2 226.6275 397.9747 51.5673 0.1567 6731 +6733 2 227.7704 397.9438 51.6194 0.1456 6732 +6734 2 228.9007 397.7814 51.6592 0.1481 6733 +6735 2 230.0172 397.532 51.688 0.1554 6734 +6736 2 231.1372 397.2998 51.7093 0.1804 6735 +6737 2 232.2274 396.9588 51.7275 0.1711 6736 +6738 2 233.2902 396.5379 51.7451 0.1536 6737 +6739 2 234.3198 396.0402 51.7647 0.14 6738 +6740 2 235.2991 395.4499 51.7891 0.1373 6739 +6741 2 236.3081 394.9145 51.8193 0.1373 6740 +6742 2 237.3422 394.4237 51.8563 0.1373 6741 +6743 2 238.3627 393.9078 51.8983 0.1373 6742 +6744 2 239.3351 393.3072 51.9408 0.1373 6743 +6745 2 240.28 392.6631 51.9817 0.1373 6744 +6746 2 241.2032 391.987 52.0218 0.1373 6745 +6747 2 242.0612 391.232 52.0663 0.1373 6746 +6748 2 242.8872 390.4415 52.1315 0.1373 6747 +6749 2 243.7189 389.6578 52.2413 0.1373 6748 +6750 2 244.5792 388.9074 52.4308 0.1373 6749 +6751 2 245.4612 388.2015 52.8564 0.1373 6750 +6752 2 246.3364 387.5151 53.5083 0.1373 6751 +6753 2 247.199 386.839 54.308 0.1373 6752 +6754 2 248.0535 386.1698 55.1914 0.1373 6753 +6755 2 248.9058 385.504 56.1016 0.1373 6754 +6756 2 249.7169 384.7798 56.9696 0.1373 6755 +6757 2 250.2717 383.82 57.6562 0.1373 6756 +6758 2 250.83 382.8488 58.2266 0.1373 6757 +6759 2 251.3906 381.8706 58.7045 0.1373 6758 +6760 2 251.9546 380.8902 59.1133 0.1373 6759 +6761 2 252.5197 379.9064 59.4745 0.1373 6760 +6762 2 253.229 379.0198 59.8024 0.1373 6761 +6763 2 253.9623 378.1503 60.1118 0.1373 6762 +6764 2 254.6956 377.2798 60.3999 0.1373 6763 +6765 2 255.4312 376.4103 60.664 0.1373 6764 +6766 2 256.1656 375.5386 60.9031 0.1373 6765 +6767 2 256.9012 374.6669 61.1173 0.1373 6766 +6768 2 257.4709 373.6762 61.2273 0.1373 6767 +6769 2 258.0212 372.674 61.2581 0.1373 6768 +6770 2 258.6081 371.6913 61.2506 0.1373 6769 +6771 2 259.3883 370.8551 61.2741 0.1373 6770 +6772 2 260.1685 370.0188 61.3432 0.1373 6771 +6773 2 260.1891 370.203 60.893 0.1189 6772 +6774 2 260.3115 371.3218 60.7992 0.137 6773 +6775 2 260.4362 372.4589 60.8168 0.1391 6774 +6776 2 260.4762 373.6029 60.8098 0.1406 6775 +6777 2 260.4796 374.7458 60.7715 0.1434 6776 +6778 2 260.4796 375.8898 60.711 0.1491 6777 +6779 2 260.4785 377.0338 60.6418 0.1567 6778 +6780 2 260.4785 378.1778 60.576 0.1854 6779 +6781 2 260.4785 379.3207 60.5282 0.1681 6780 +6782 2 260.4785 380.4647 60.5088 0.1512 6781 +6783 2 260.6261 381.5984 60.5794 0.1386 6782 +6784 2 260.8698 382.7138 60.7583 0.1389 6783 +6785 2 261.1191 383.8257 61.0117 0.1402 6784 +6786 2 261.3674 384.9354 61.3046 0.1425 6785 +6787 2 261.5447 386.0622 61.5426 0.1477 6786 +6788 2 261.714 387.1914 61.717 0.154 6787 +6789 2 261.881 388.3216 61.8271 0.1806 6788 +6790 2 262.2357 389.4096 61.8568 0.1568 6789 +6791 2 262.6933 390.4575 61.8159 0.1271 6790 +6792 2 263.1497 391.5031 61.6 0.1144 6791 +6793 2 260.546 369.2008 61.6532 0.1373 6772 +6794 2 261.0196 368.1724 62.0628 0.1373 6793 +6795 2 261.4921 367.1485 62.5296 0.1373 6794 +6796 2 261.9634 366.1269 63.0381 0.1373 6795 +6797 2 262.4347 365.1065 63.5538 0.1373 6796 +6798 2 263.0777 364.1901 64.0455 0.1373 6797 +6799 2 264.089 363.7828 64.4333 0.1373 6798 +6800 2 265.2215 363.7165 64.6845 0.1373 6799 +6801 2 266.3632 363.6982 64.8357 0.1373 6800 +6802 2 267.5072 363.681 64.9158 0.1373 6801 +6803 2 268.6501 363.6627 64.9488 0.1373 6802 +6804 2 269.7941 363.6444 64.9569 0.1374 6803 +6805 2 270.9381 363.6273 64.9569 0.1374 6804 +6806 2 272.0821 363.609 64.9558 0.1376 6805 +6807 2 273.2261 363.5918 64.9538 0.1378 6806 +6808 2 274.3701 363.5735 64.9516 0.1382 6807 +6809 2 275.5141 363.5563 64.9482 0.1389 6808 +6810 2 276.6455 363.4008 64.9435 0.1404 6809 +6811 2 277.7129 363.0038 64.937 0.1429 6810 +6812 2 278.7345 362.4913 64.9278 0.1483 6811 +6813 2 279.7503 361.9639 64.9146 0.1556 6812 +6814 2 280.7902 361.488 64.8967 0.1811 6813 +6815 2 281.8519 361.0624 64.8715 0.1707 6814 +6816 2 282.9158 360.6437 64.8365 0.1532 6815 +6817 2 283.9774 360.2181 64.787 0.1397 6816 +6818 2 285.0379 359.7891 64.7172 0.1373 6817 +6819 2 286.0972 359.3601 64.6206 0.1373 6818 +6820 2 287.1852 359.0124 64.4916 0.1373 6819 +6821 2 288.2743 358.6692 64.3031 0.1373 6820 +6822 2 289.2982 358.1795 64.0125 0.1373 6821 +6823 2 290.274 357.6052 63.6227 0.1373 6822 +6824 2 291.1903 356.9509 63.1341 0.1373 6823 +6825 2 292.0849 356.2702 62.6161 0.1373 6824 +6826 2 293.0516 355.6856 62.1956 0.1373 6825 +6827 2 294.0515 355.1434 61.8971 0.1373 6826 +6828 2 295.0559 354.6011 61.7033 0.1373 6827 +6829 2 296.0626 354.0588 61.5896 0.1373 6828 +6830 2 297.0693 353.5166 61.528 0.1373 6829 +6831 2 298.0761 352.9732 61.4897 0.1373 6830 +6832 2 299.0839 352.4321 61.4494 0.1373 6831 +6833 2 299.9259 351.6633 61.381 0.1372 6832 +6834 2 301.0207 351.3704 61.273 0.1372 6833 +6835 2 301.9611 352.0202 61.1598 0.1371 6834 +6836 2 302.9003 352.67 61.0408 0.1368 6835 +6837 2 303.8407 353.3198 60.9202 0.1364 6836 +6838 2 304.781 353.9708 60.7995 0.1356 6837 +6839 2 305.7214 354.6206 60.6847 0.1342 6838 +6840 2 306.6618 355.2703 60.5769 0.1313 6839 +6841 2 307.6022 355.9213 60.4755 0.1271 6840 +6842 2 308.5425 356.5711 60.3817 0.1144 6841 +6843 2 309.4817 357.2197 60.2 0.1144 6842 +6844 2 199.1441 416.9136 45.3236 0.1806 6702 +6845 2 198.6533 417.8906 44.6225 0.125 6844 +6846 2 198.2277 418.9465 44.4567 0.1375 6845 +6847 2 197.8651 420.031 44.3738 0.1377 6846 +6848 2 197.3697 421.0526 44.3061 0.1381 6847 +6849 2 196.7394 422.0067 44.2358 0.1387 6848 +6850 2 196.1182 422.9665 44.126 0.14 6849 +6851 2 195.6194 423.987 43.9524 0.1425 6850 +6852 2 195.2797 425.0726 43.7032 0.1469 6851 +6853 2 194.9845 426.1709 43.3852 0.1555 6852 +6854 2 194.6241 427.244 43.0161 0.169 6853 +6855 2 194.2318 428.3067 42.6373 0.2061 6854 +6856 2 194.2523 429.3684 42.2492 0.2166 6855 +6857 2 194.7671 430.3717 41.8342 0.1796 6856 +6858 2 195.378 431.3223 41.4106 0.1501 6857 +6859 2 195.9729 432.2821 40.9755 0.1376 6858 +6860 2 196.4465 433.3014 40.516 0.1379 6859 +6861 2 196.8584 434.3493 40.026 0.1385 6860 +6862 2 197.2977 435.3789 39.457 0.1395 6861 +6863 2 197.6855 436.4223 38.8209 0.1415 6862 +6864 2 197.9589 437.5056 38.2469 0.1452 6863 +6865 2 198.0344 438.5696 37.3713 0.1583 6864 +6866 2 197.9864 439.6804 36.7172 0.1782 6865 +6867 2 198.0058 440.7912 36.1651 0.2104 6866 +6868 2 198.3582 441.8586 35.6748 0.2151 6867 +6869 2 198.9324 442.7886 35.1655 0.2402 6868 +6870 2 199.8236 443.4155 34.5358 0.191 6869 +6871 2 200.4254 444.3536 33.8985 0.1609 6870 +6872 2 201.0019 445.3031 33.2315 0.1461 6871 +6873 2 201.5774 446.2527 32.5626 0.1538 6872 +6874 2 202.1654 447.1999 31.9318 0.1671 6873 +6875 2 202.7111 448.1769 31.3748 0.195 6874 +6876 2 203.1149 449.2248 30.8736 0.2312 6875 +6877 2 203.4032 450.3139 30.3906 0.1974 6876 +6878 2 203.648 451.4132 29.8987 0.1737 6877 +6879 2 203.7887 452.5275 29.3821 0.1691 6878 +6880 2 203.8208 453.6486 28.84 0.1988 6879 +6881 2 203.7796 454.7675 28.2764 0.2386 6880 +6882 2 203.6606 455.8794 27.6946 0.2114 6881 +6883 2 203.4615 456.9788 27.0945 0.1991 6882 +6884 2 203.2419 458.0725 26.4751 0.2196 6883 +6885 2 203.0543 459.1707 25.8358 0.2776 6884 +6886 2 202.9067 460.2735 25.19 0.2779 6885 +6887 2 202.7774 461.3809 24.5566 0.261 6886 +6888 2 202.6585 462.4906 23.9392 0.2306 6887 +6889 2 202.52 463.5991 23.3383 0.2011 6888 +6890 2 202.361 464.7065 22.7584 0.1933 6889 +6891 2 202.2329 465.8208 22.2085 0.1677 6890 +6892 2 202.1356 466.9419 21.7011 0.1567 6891 +6893 2 202.0293 468.0653 21.243 0.1561 6892 +6894 2 201.916 469.191 20.8403 0.1738 6893 +6895 2 201.8542 470.3247 20.4925 0.1971 6894 +6896 2 201.8256 471.4607 20.1829 0.1909 6895 +6897 2 201.805 472.5978 19.8937 0.2026 6896 +6898 2 201.8451 473.7361 19.6198 0.2262 6897 +6899 2 201.9457 474.8698 19.3442 0.1888 6898 +6900 2 202.0693 475.999 19.0268 0.1582 6899 +6901 2 202.2317 477.1224 18.6689 0.1419 6900 +6902 2 202.5029 478.216 18.2914 0.1458 6901 +6903 2 203.0726 479.1667 17.8822 0.1546 6902 +6904 2 204.0221 479.7684 17.5181 0.1704 6903 +6905 2 205.0586 480.242 17.284 0.2114 6904 +6906 2 206.1236 480.6539 17.1444 0.2133 6905 +6907 2 207.2013 481.0371 17.0908 0.177 6906 +6908 2 208.2789 481.4204 17.0976 0.1482 6907 +6909 2 209.3566 481.8025 17.1398 0.1379 6908 +6910 2 210.4342 482.1857 17.1953 0.1385 6909 +6911 2 211.5119 482.5689 17.2484 0.1396 6910 +6912 2 212.5895 482.9522 17.2917 0.1415 6911 +6913 2 213.6672 483.3377 17.3231 0.1452 6912 +6914 2 214.7128 483.7965 17.2859 0.1523 6913 +6915 2 215.7344 484.3078 17.1644 0.1641 6914 +6916 2 216.2252 485.2127 17.0664 0.1964 6915 +6917 2 216.3212 486.351 17.0614 0.2074 6916 +6918 2 216.3784 487.4927 17.1406 0.2255 6917 +6919 2 216.2652 488.615 17.4812 0.2431 6918 +6920 2 216.2538 489.7487 17.8443 0.2256 6919 +6921 2 216.1622 490.8812 18.1573 0.2604 6920 +6922 2 215.8602 491.9795 18.4248 0.2171 6921 +6923 2 215.6246 493.0949 18.6477 0.2122 6922 +6924 2 215.3477 494.2023 18.8292 0.1676 6923 +6925 2 215.1612 495.3303 18.9612 0.1502 6924 +6926 2 215.1143 496.472 19.0545 0.1374 6925 +6927 2 215.0869 497.616 19.1004 0.1373 6926 +6928 2 214.9622 498.7531 19.0955 0.1373 6927 +6929 2 214.4737 499.7861 19.0386 0.1374 6928 +6930 2 213.88 500.7631 18.9327 0.1374 6929 +6931 2 213.539 501.8534 18.7877 0.1375 6930 +6932 2 213.4864 502.9939 18.6355 0.1377 6931 +6933 2 213.1478 504.0842 18.4856 0.1382 6932 +6934 2 213.0631 505.2236 18.3511 0.1389 6933 +6935 2 213.0506 506.3676 18.2385 0.1403 6934 +6936 2 213.0494 507.5104 18.1484 0.1428 6935 +6937 2 213.0494 508.6544 18.0761 0.1475 6936 +6938 2 213.0643 509.7973 18.014 0.1566 6937 +6939 2 213.1386 510.939 17.9562 0.1705 6938 +6940 2 213.2656 512.0761 17.8975 0.2112 6939 +6941 2 213.2782 513.219 17.8347 0.2147 6940 +6942 2 213.2782 514.363 17.7664 0.2282 6941 +6943 2 213.3663 515.5036 17.6936 0.3332 6942 +6944 2 213.5436 516.6327 17.6239 0.253 6943 +6945 2 213.7175 517.763 17.5648 0.1823 6944 +6946 2 214.0996 518.8418 17.5171 0.1272 6945 +6947 2 214.4577 519.9274 17.4805 0.1144 6946 +6948 2 215.3386 520.6573 17.4132 0.1144 6947 +6949 2 175.5708 424.7043 43.6965 0.1667 6679 +6950 2 174.7151 425.4502 43.3488 0.1826 6949 +6951 2 173.8788 426.2258 43.1474 0.1708 6950 +6952 2 173.1856 426.9866 42.5272 0.1693 6951 +6953 2 172.4809 427.8857 42.3797 0.2004 6952 +6954 2 171.8768 428.857 42.3223 0.238 6953 +6955 2 171.1985 429.7779 42.2898 0.1779 6954 +6956 2 170.5235 430.7023 42.2755 0.1747 6955 +6957 2 169.8394 431.6186 42.2909 0.1797 6956 +6958 2 169.145 432.5281 42.3366 0.1936 6957 +6959 2 168.4288 433.4193 42.411 0.1608 6958 +6960 2 167.779 434.3596 42.506 0.1513 6959 +6961 2 167.0583 435.2474 42.616 0.1446 6960 +6962 2 166.5035 436.2015 42.8876 0.1405 6961 +6963 2 165.9887 437.2151 43.1953 0.139 6962 +6964 2 165.3778 438.168 43.5305 0.1381 6963 +6965 2 164.6513 439.042 43.8318 0.1377 6964 +6966 2 163.9512 439.9366 44.1 0.1376 6965 +6967 2 163.274 440.8496 44.3951 0.1375 6966 +6968 2 162.5029 441.6778 44.7686 0.1373 6967 +6969 2 161.6815 442.458 45.1517 0.1373 6968 +6970 2 160.8681 443.2485 45.505 0.1373 6969 +6971 2 160.0662 444.0539 45.8399 0.1373 6970 +6972 2 159.2814 444.8753 46.1518 0.1373 6971 +6973 2 158.5206 445.7218 46.4352 0.1373 6972 +6974 2 157.6363 446.406 46.76 0.1373 6973 +6975 2 156.5873 446.8121 47.1789 0.1373 6974 +6976 2 155.5211 447.1816 47.6403 0.1373 6975 +6977 2 154.5018 447.6609 48.1037 0.1373 6976 +6978 2 153.5019 448.1574 48.701 0.1373 6977 +6979 2 152.5124 448.6699 49.3335 0.1373 6978 +6980 2 151.5697 449.2877 49.7935 0.1373 6979 +6981 2 150.6545 449.9615 50.0982 0.1373 6980 +6982 2 149.6775 450.5484 50.2799 0.1373 6981 +6983 2 148.6285 450.9991 50.3658 0.1373 6982 +6984 2 147.5325 451.3263 50.3765 0.1373 6983 +6985 2 146.424 451.6054 50.346 0.1373 6984 +6986 2 145.3155 451.888 50.2953 0.1373 6985 +6987 2 144.1955 452.1191 50.2306 0.1373 6986 +6988 2 143.0709 452.3262 50.1598 0.1373 6987 +6989 2 141.951 452.5584 50.097 0.1373 6988 +6990 2 140.8539 452.8776 50.0444 0.1373 6989 +6991 2 139.8037 453.3283 50.0142 0.1373 6990 +6992 2 138.8416 453.9415 49.9811 0.1373 6991 +6993 2 137.8966 454.5867 49.9425 0.1373 6992 +6994 2 136.9139 455.1713 49.908 0.1373 6993 +6995 2 136.2344 456.0693 50.0444 0.1373 6994 +6996 2 136.0205 457.1767 50.4011 0.1502 6995 +6997 2 135.8054 458.2933 50.7116 0.1671 6996 +6998 2 135.5583 459.4052 50.981 0.1866 6997 +6999 2 135.532 460.5435 51.2347 0.1568 6998 +7000 2 135.397 461.6715 51.5696 0.1144 6999 +7001 2 166.547 435.4098 42.2573 0.1202 6961 +7002 2 165.4624 435.7542 42.0521 0.1347 7001 +7003 2 164.3734 436.1008 41.9852 0.1373 7002 +7004 2 163.2831 436.4463 41.9171 0.1373 7003 +7005 2 162.1929 436.7929 41.8415 0.1373 7004 +7006 2 161.1027 437.1384 41.7614 0.1373 7005 +7007 2 160.0136 437.485 41.6797 0.1373 7006 +7008 2 158.9233 437.8317 41.5999 0.1373 7007 +7009 2 157.8331 438.1772 41.5229 0.1373 7008 +7010 2 156.7429 438.5238 41.4495 0.1372 7009 +7011 2 155.6538 438.8704 41.3818 0.1372 7010 +7012 2 154.5636 439.2171 41.3218 0.1371 7011 +7013 2 153.4733 439.5637 41.2717 0.1368 7012 +7014 2 152.3831 439.9092 41.2317 0.1364 7013 +7015 2 151.3581 440.4125 41.2174 0.1356 7014 +7016 2 150.4234 441.0703 41.2462 0.1343 7015 +7017 2 149.4968 441.7419 41.3056 0.1316 7016 +7018 2 148.5713 442.4123 41.3804 0.1275 7017 +7019 2 147.5096 442.8321 41.3899 0.1147 7018 +7020 2 146.3828 442.9339 41.0054 0.1144 7019 +7021 2 302.4622 379.2166 27.16 0.1144 -1 +7022 2 303.5913 379.1273 26.7737 0.1774 7021 +7023 2 304.7296 379.0919 26.4994 0.249 7022 +7024 2 305.7946 379.4808 26.1495 0.2166 7023 +7025 2 306.8551 379.8915 25.8714 0.1756 7024 +7026 2 307.7955 380.539 25.7102 0.1587 7025 +7027 2 308.6798 381.2517 25.5651 0.15 7026 +7028 2 309.1603 382.2893 25.4545 0.1708 7027 +7029 2 309.6339 383.3304 25.42 0.2022 7028 +7030 2 309.9954 384.4137 25.4695 0.2343 7029 +7031 2 310.1201 385.5497 25.5735 0.1768 7030 +7032 2 310.2814 386.6766 25.6641 0.1612 7031 +7033 2 310.8019 387.6959 25.7136 0.1515 7032 +7034 2 311.3533 388.6969 25.6838 0.1722 7033 +7035 2 311.8498 389.7265 25.5566 0.2045 7034 +7036 2 312.2834 390.7824 25.3722 0.2469 7035 +7037 2 312.7158 391.8394 25.2038 0.2079 7036 +7038 2 313.154 392.8954 25.0714 0.2069 7037 +7039 2 313.607 393.9444 24.9834 0.1683 7038 +7040 2 314.0589 394.9957 24.9032 0.1554 7039 +7041 2 314.5119 396.0459 24.8347 0.1468 7040 +7042 2 314.9649 397.0961 24.7796 0.1425 7041 +7043 2 315.418 398.1452 24.721 0.14 7042 +7044 2 315.8859 399.1862 24.5142 0.138 7043 +7045 2 316.3652 400.2215 24.3272 0.1377 7044 +7046 2 316.9177 401.2019 24.2316 0.1375 7045 +7047 2 317.8112 401.9158 24.1513 0.1374 7046 +7048 2 318.6623 402.6743 24.0846 0.1374 7047 +7049 2 319.3693 403.5735 24.0259 0.1373 7048 +7050 2 320.0763 404.4726 23.9762 0.1373 7049 +7051 2 320.7833 405.3718 23.9357 0.1373 7050 +7052 2 321.4892 406.2722 23.8997 0.1373 7051 +7053 2 322.1962 407.1713 23.8582 0.1333 7052 +7054 2 286.2288 419.2611 39.1784 0.1144 -1 +7055 2 285.0905 419.2234 38.9088 0.1144 7054 +7056 2 283.9477 419.1868 38.7974 0.1397 7055 +7057 2 282.8323 419.4293 38.652 0.1609 7056 +7058 2 281.7169 419.673 38.481 0.1836 7057 +7059 2 280.6015 419.9155 38.2925 0.1681 7058 +7060 2 279.4861 420.1592 38.0937 0.1781 7059 +7061 2 278.3718 420.4017 37.8918 0.1924 7060 +7062 2 277.2312 420.4497 37.69 0.1602 7061 +7063 2 276.0918 420.3925 37.4914 0.151 7062 +7064 2 274.9512 420.3365 37.2968 0.1444 7063 +7065 2 273.8118 420.2793 37.1073 0.1412 7064 +7066 2 272.6713 420.2232 36.9258 0.1394 7065 +7067 2 271.5307 420.1752 36.7542 0.1512 7066 +7068 2 270.389 420.1649 36.5926 0.1804 7067 +7069 2 269.2461 420.1546 36.4437 0.2166 7068 +7070 2 268.1033 420.1683 36.3432 0.2064 7069 +7071 2 266.9593 420.1912 36.2908 0.1691 7070 +7072 2 265.8164 420.2141 36.2681 0.1555 7071 +7073 2 264.6724 420.2358 36.258 0.147 7072 +7074 2 263.5284 420.2633 36.2435 0.1425 7073 +7075 2 262.4267 420.5676 36.1544 0.1401 7074 +7076 2 261.3251 420.8684 35.9993 0.1388 7075 +7077 2 260.2245 421.1716 35.7916 0.1381 7076 +7078 2 259.1263 421.4736 35.5477 0.1377 7077 +7079 2 258.0281 421.7756 35.2814 0.1375 7078 +7080 2 256.9298 422.0777 35.0076 0.1374 7079 +7081 2 255.8327 422.3808 34.7374 0.1377 7080 +7082 2 254.7345 422.6828 34.4669 0.1503 7081 +7083 2 253.6362 422.9837 34.2026 0.1679 7082 +7084 2 252.5391 423.2926 33.9517 0.2122 7083 +7085 2 251.4604 423.6598 33.7338 0.217 7084 +7086 2 250.4708 424.2238 33.5275 0.2447 7085 +7087 2 284.093 367.2572 41.72 0.1144 -1 +7088 2 284.7336 368.2033 41.8457 0.1144 7087 +7089 2 285.3731 369.1516 41.907 0.1271 7088 +7090 2 286.0149 370.0989 41.9672 0.1314 7089 +7091 2 286.6029 371.0793 41.9793 0.1344 7090 +7092 2 287.1246 372.0974 41.9003 0.1615 7091 +7093 2 287.6451 373.1145 41.7477 0.1965 7092 +7094 2 288.1644 374.1303 41.538 0.2343 7093 +7095 2 288.6461 375.1634 41.2989 0.1762 7094 +7096 2 289.1185 376.1998 41.0497 0.161 7095 +7097 2 289.5922 377.2363 40.8094 0.1498 7096 +7098 2 290.0669 378.2739 40.5874 0.1571 7097 +7099 2 290.5428 379.3104 40.3866 0.1711 7098 +7100 2 291.1091 380.3022 40.2385 0.1877 7099 +7101 2 291.7017 381.2803 40.1411 0.1579 7100 +7102 2 292.2954 382.2584 40.0828 0.1498 7101 +7103 2 292.888 383.2366 40.0532 0.1437 7102 +7104 2 293.4806 384.2147 40.042 0.1401 7103 +7105 2 278.7642 389.5961 49.7812 0.1373 -1 +7106 2 277.5241 390.1223 48.8712 0.1374 7105 +7107 2 276.538 389.6315 48.5929 0.1374 7106 +7108 2 275.5702 389.0275 48.4142 0.1376 7107 +7109 2 274.6 388.4212 48.3263 0.1378 7108 +7110 2 273.599 387.8675 48.3594 0.1383 7109 +7111 2 272.5958 387.3218 48.5019 0.1391 7110 +7112 2 271.5936 386.7772 48.7197 0.1407 7111 +7113 2 270.5926 386.2338 48.963 0.1435 7112 +7114 2 269.6214 385.6413 49.2744 0.1493 7113 +7115 2 268.6947 384.9892 49.6471 0.1574 7114 +7116 2 268.109 384.0133 49.9055 0.1872 7115 +7117 2 267.5336 383.0272 50.0716 0.1691 7116 +7118 2 266.957 382.0399 50.1626 0.1537 7117 +7119 2 266.3793 381.0527 50.1934 0.1436 7118 +7120 2 265.7798 380.078 50.1953 0.1491 7119 +7121 2 265.1758 379.1067 50.1894 0.1567 7120 +7122 2 264.5706 378.1366 50.1906 0.1858 7121 +7123 2 264.0295 377.1288 50.1768 0.1663 7122 +7124 2 263.5021 376.114 50.1306 0.1486 7123 +7125 2 262.9747 375.0982 50.0556 0.1344 7124 +7126 2 262.4473 374.0846 49.9556 0.1314 7125 +7127 2 262.1018 372.9966 49.7843 0.1271 7126 +7128 2 261.8719 371.8801 49.5289 0.1144 7127 +7129 2 261.65 370.7944 48.839 0.1144 7128 +7130 2 278.135 388.793 50.4605 0.1373 7105 +7131 2 277.4429 387.9075 50.9872 0.1373 7130 +7132 2 276.7416 387.0118 51.2588 0.1373 7131 +7133 2 276.0312 386.1194 51.466 0.1373 7132 +7134 2 275.3116 385.2306 51.5505 0.1373 7133 +7135 2 274.5932 384.3405 51.527 0.1373 7134 +7136 2 274.0372 383.3418 51.415 0.1373 7135 +7137 2 273.6974 382.2516 51.2361 0.1373 7136 +7138 2 273.3599 381.1625 51.0269 0.1373 7137 +7139 2 273.0156 380.0746 50.8206 0.1373 7138 +7140 2 272.4585 379.0781 50.6481 0.1373 7139 +7141 2 271.6005 378.3231 50.5319 0.1373 7140 +7142 2 270.7413 377.568 50.4591 0.1373 7141 +7143 2 269.8833 376.8119 50.4 0.1144 7142 +7144 2 279.3762 390.3763 49.1207 0.1152 7105 +7145 2 280.0455 391.2331 48.2471 0.2228 7144 +7146 2 280.5752 392.2284 47.7991 0.3536 7145 +7147 2 281.0957 393.2306 47.3528 0.3055 7146 +7148 2 281.7889 394.1252 46.9535 0.2187 7147 +7149 2 282.4845 395.0221 46.5987 0.1512 7148 +7150 2 283.18 395.9224 46.2958 0.1386 7149 +7151 2 283.8767 396.8239 46.0522 0.1393 7150 +7152 2 284.5769 397.7253 45.8539 0.1413 7151 +7153 2 285.2747 398.6291 45.6851 0.144 7152 +7154 2 285.9737 399.5328 45.537 0.1525 7153 +7155 2 286.7505 400.3714 45.4675 0.1525 7154 +7156 2 287.5478 401.1916 45.5414 0.2288 7155 +7157 2 300.1913 415.4974 36.68 0.2065 -1 +7158 2 299.8607 414.4849 37.4371 0.2473 7157 +7159 2 299.5118 413.4061 37.7961 0.1976 7158 +7160 2 299.1617 412.3285 38.1906 0.1627 7159 +7161 2 298.8117 411.2531 38.6095 0.137 7160 +7162 2 298.401 410.1972 38.9841 0.1368 7161 +7163 2 297.9102 409.1699 39.2591 0.1364 7162 +7164 2 297.4171 408.1403 39.4478 0.1356 7163 +7165 2 297.0488 407.0581 39.5791 0.1342 7164 +7166 2 296.8669 405.9301 39.6819 0.1313 7165 +7167 2 296.685 404.801 39.7692 0.1271 7166 +7168 2 296.5031 403.6718 39.8527 0.1144 7167 +7169 2 296.3212 402.545 40.04 0.1144 7168 +7170 2 300.2188 416.5041 37.9193 0.2108 7157 +7171 2 300.3904 417.6344 37.9352 0.1696 7170 +7172 2 300.5791 418.7635 37.9336 0.1562 7171 +7173 2 300.7679 419.8915 37.9207 0.1471 7172 +7174 2 300.9578 421.0195 37.8997 0.1427 7173 +7175 2 301.1466 422.1474 37.8734 0.1401 7174 +7176 2 301.3365 423.2754 37.8053 0.1144 7175 +7177 2 301.4429 414.9219 36.9457 0.1805 7157 +7178 2 302.4816 414.4449 37.0429 0.1501 7177 +7179 2 303.5204 413.9667 37.1437 0.1366 7178 +7180 2 304.5591 413.4885 37.2313 0.1356 7179 +7181 2 305.2226 412.5584 37.2252 0.1342 7180 +7182 2 305.8553 411.6055 37.1406 0.1313 7181 +7183 2 306.4879 410.6548 36.9975 0.1271 7182 +7184 2 307.1194 409.703 36.8194 0.1144 7183 +7185 2 307.7452 408.7615 36.4 0.1144 7184 +7186 2 322.9306 424.4011 35.5849 0.1144 -1 +7187 2 322.9112 423.2606 35.7935 0.1144 7186 +7188 2 322.8929 422.1177 35.8842 0.1271 7187 +7189 2 322.8746 420.9737 35.9876 0.1313 7188 +7190 2 322.8562 419.8308 36.0951 0.1342 7189 +7191 2 322.8379 418.688 36.1967 0.1611 7190 +7192 2 322.8196 417.5451 36.2844 0.1959 7191 +7193 2 322.751 416.4034 36.3429 0.2354 7192 +7194 2 322.4616 415.296 36.3367 0.1764 7193 +7195 2 322.1721 414.1898 36.2799 0.1612 7194 +7196 2 321.8838 413.0835 36.1841 0.1497 7195 +7197 2 321.5944 411.9773 36.0615 0.1571 7196 +7198 2 321.3061 410.8722 35.9226 0.1964 7197 +7199 2 321.0178 409.7671 35.7795 0.2481 7198 +7200 2 320.7307 408.6608 35.6418 0.2565 7199 +7201 2 320.59 407.5271 35.4928 0.2021 7200 +7202 2 320.5625 406.3854 35.3273 0.1978 7201 +7203 2 320.4333 405.2506 35.1982 0.202 7202 +7204 2 320.1106 404.1535 35.1672 0.1654 7203 +7205 2 319.6233 403.1181 35.1576 0.1542 7204 +7206 2 319.1234 402.0897 35.156 0.16 7205 +7207 2 318.6623 401.0429 35.1551 0.1987 7206 +7208 2 318.3615 399.9413 35.1453 0.2489 7207 +7209 2 318.3901 398.7973 35.0983 0.255 7208 +7210 2 318.4187 397.6544 35.023 0.1889 7209 +7211 2 318.4221 396.5127 34.939 0.166 7210 +7212 2 312.8176 418.5038 39.3954 0.1144 -1 +7213 2 313.2421 417.4456 39.1591 0.1144 7212 +7214 2 313.6665 416.384 39.058 0.1271 7213 +7215 2 314.0932 415.3235 38.9376 0.1313 7214 +7216 2 314.1092 414.1818 38.8052 0.1342 7215 +7217 2 314.0577 413.0401 38.6663 0.1356 7216 +7218 2 314.0063 411.8983 38.526 0.1364 7217 +7219 2 313.9548 410.7566 38.386 0.1368 7218 +7220 2 313.9044 409.6161 38.2491 0.1371 7219 +7221 2 313.853 408.4744 38.1181 0.1372 7220 +7222 2 313.8015 407.3326 37.9949 0.1372 7221 +7223 2 313.75 406.1909 37.8815 0.1373 7222 +7224 2 313.6985 405.0515 37.6608 0.1144 7223 +7225 2 302.2322 426.7909 40.4124 0.1144 -1 +7226 2 302.5777 425.7041 40.6414 0.1144 7225 +7227 2 302.9255 424.615 40.7397 0.1271 7226 +7228 2 303.2721 423.526 40.8562 0.1313 7227 +7229 2 303.6176 422.4369 40.9861 0.1342 7228 +7230 2 303.9642 421.3478 41.1242 0.1483 7229 +7231 2 304.3109 420.2598 41.2658 0.166 7230 +7232 2 304.6564 419.1708 41.4067 0.1862 7231 +7233 2 305.003 418.0817 41.5467 0.1569 7232 +7234 2 305.3496 416.9926 41.6856 0.1492 7233 +7235 2 305.6951 415.9035 41.8225 0.1435 7234 +7236 2 306.0417 414.8144 41.9569 0.1407 7235 +7237 2 306.3884 413.7265 42.0882 0.1391 7236 +7238 2 306.7339 412.6362 42.2145 0.1383 7237 +7239 2 307.0805 411.5471 42.3338 0.1379 7238 +7240 2 307.4283 410.458 42.4432 0.1504 7239 +7241 2 307.7749 409.369 42.5415 0.1927 7240 +7242 2 308.0826 408.2684 42.6261 0.2461 7241 +7243 2 307.6788 407.1976 42.6684 0.2556 7242 +7244 2 307.2773 406.1269 42.6787 0.1886 7243 +7245 2 328.0786 399.1954 41.6394 0.4576 -1 +7246 2 329.0762 398.6623 42.0669 0.2299 7245 +7247 2 330.0829 398.1246 42.2537 0.2034 7246 +7248 2 331.0885 397.588 42.4673 0.1694 7247 +7249 2 332.0952 397.0504 42.6927 0.1553 7248 +7250 2 333.0985 396.5104 42.9139 0.1468 7249 +7251 2 333.8558 395.657 43.0948 0.1428 7250 +7252 2 334.3637 394.6331 43.2057 0.1659 7251 +7253 2 334.8717 393.6081 43.2606 0.1986 7252 +7254 2 335.3613 392.575 43.2701 0.2361 7253 +7255 2 335.5203 391.4436 43.2104 0.177 7254 +7256 2 335.3693 390.3111 43.0676 0.1602 7255 +7257 2 309.9691 381.2025 43.6786 0.1144 -1 +7258 2 311.0639 381.2426 44.478 0.1146 7257 +7259 2 312.1987 381.1877 44.821 0.1272 7258 +7260 2 313.3279 381.0572 45.131 0.1314 7259 +7261 2 314.4581 380.9257 45.4059 0.1342 7260 +7262 2 315.5907 380.7953 45.6431 0.1351 7261 +7263 2 101.9129 387.6867 55.0483 0.1379 -1 +7264 2 102.2485 387.5437 55.0057 0.2193 7263 +7265 2 103.301 387.0964 54.9825 0.1865 7264 +7266 2 104.3538 386.648 54.9559 0.1605 7265 +7267 2 105.4062 386.2007 54.9184 0.1557 7266 +7268 2 106.4589 385.7534 54.868 0.1686 7267 +7269 2 107.5112 385.3049 54.8013 0.2051 7268 +7270 2 108.6475 385.2031 54.6902 0.2161 7269 +7271 2 109.7895 385.1756 54.5378 0.1806 7270 +7272 2 110.9267 385.0796 54.3494 0.1505 7271 +7273 2 112.0192 384.7535 54.129 0.1375 7272 +7274 2 113.1105 384.424 53.8871 0.1373 7273 +7275 2 114.2011 384.0946 53.6337 0.1373 7274 +7276 2 115.2923 383.7662 53.3786 0.1373 7275 +7277 2 116.3826 383.4368 53.1266 0.1373 7276 +7278 2 117.4739 383.1073 52.8811 0.1373 7277 +7279 2 118.5653 382.7778 52.6462 0.1373 7278 +7280 2 119.6635 382.4747 52.423 0.1373 7279 +7281 2 120.7812 382.7058 52.2388 0.1373 7280 +7282 2 121.9001 382.9403 52.085 0.1373 7281 +7283 2 123.0178 383.1736 51.9537 0.1372 7282 +7284 2 124.1366 383.407 51.8395 0.1372 7283 +7285 2 125.2566 383.6404 51.7362 0.1371 7284 +7286 2 126.3754 383.8738 51.6396 0.1368 7285 +7287 2 127.4942 384.1083 51.5455 0.1364 7286 +7288 2 128.6142 384.3417 51.4545 0.1356 7287 +7289 2 129.733 384.575 51.3685 0.1342 7288 +7290 2 130.853 384.8084 51.289 0.1313 7289 +7291 2 131.981 384.9938 51.2179 0.1271 7290 +7292 2 133.117 384.8599 51.1697 0.1144 7291 +7293 2 134.253 384.7249 51.1162 0.1144 7292 +7294 2 100.6198 387.8515 55.7158 0.1385 7263 +7295 2 99.4899 387.9876 55.9961 0.1394 7294 +7296 2 98.3595 388.0951 56.3083 0.1413 7295 +7297 2 97.2224 388.0803 56.6045 0.1448 7296 +7298 2 96.0855 388.0082 56.8593 0.1511 7297 +7299 2 94.9469 387.9373 57.0651 0.1636 7298 +7300 2 93.807 387.8606 57.2104 0.1822 7299 +7301 2 92.6686 387.7565 57.2642 0.1629 7300 +7302 2 91.5346 387.6078 57.1906 0.1466 7301 +7303 2 90.4016 387.4602 57.055 0.1373 7302 +7304 2 89.2687 387.3126 56.9128 0.1373 7303 +7305 2 88.1357 387.26 56.8999 0.1373 7304 +7306 2 87.012 387.4087 57.244 0.1373 7305 +7307 2 85.9101 387.57 57.8754 0.1374 7306 +7308 2 84.8171 387.7405 58.5894 0.1375 7307 +7309 2 83.7215 387.9167 59.2687 0.1376 7308 +7310 2 82.6213 388.0951 59.8996 0.1378 7309 +7311 2 81.5149 388.2747 60.459 0.1383 7310 +7312 2 80.4032 388.4555 60.9479 0.1392 7311 +7313 2 79.287 388.6305 61.3872 0.141 7312 +7314 2 78.1605 388.6591 61.7742 0.1441 7313 +7315 2 77.027 388.5905 62.1135 0.1501 7314 +7316 2 75.8924 388.6042 62.4271 0.1597 7315 +7317 2 74.7812 388.817 62.7292 0.1853 7316 +7318 2 73.6863 389.1247 63.0311 0.1953 7317 +7319 2 72.5917 389.4325 63.3402 0.1918 7318 +7320 2 71.6239 389.9816 63.679 0.2219 7319 +7321 2 70.8912 390.835 64.0391 0.2162 7320 +7322 2 70.2392 391.7628 64.4129 0.1854 7321 +7323 2 69.588 392.6894 64.8024 0.1649 7322 +7324 2 68.8646 393.5566 65.2134 0.1799 7323 +7325 2 67.9243 394.1492 65.6415 0.1791 7324 +7326 2 66.8994 394.6239 66.082 0.1661 7325 +7327 2 65.8748 395.0987 66.5297 0.1617 7326 +7328 2 64.8506 395.5746 66.9785 0.172 7327 +7329 2 63.826 396.0494 67.424 0.2177 7328 +7330 2 62.7406 396.2713 67.9722 0.1966 7329 +7331 2 61.6205 396.444 68.3556 0.1628 7330 +7332 2 60.4995 396.6168 68.7173 0.1373 7331 +7333 2 59.3775 396.7895 69.062 0.1372 7332 +7334 2 58.2548 396.9623 69.3946 0.1371 7333 +7335 2 57.1323 397.1407 69.7127 0.1368 7334 +7336 2 56.01 397.3261 70.014 0.1364 7335 +7337 2 54.8881 397.5114 70.3175 0.1356 7336 +7338 2 53.7658 397.6967 70.6188 0.1342 7337 +7339 2 52.6433 397.8821 70.9136 0.1314 7338 +7340 2 51.5316 398.1177 71.2326 0.1271 7339 +7341 2 50.4387 398.4186 71.6078 0.1144 7340 +7342 2 49.3879 398.7057 72.4615 0.1144 7341 +7343 2 101.982 388.1214 54.8845 0.1377 7263 +7344 2 102.1584 389.23 54.3463 0.1374 7343 +7345 2 102.3373 390.3545 54.0887 0.1374 7344 +7346 2 102.5161 391.4791 53.818 0.1373 7345 +7347 2 102.695 392.6036 53.5354 0.1495 7346 +7348 2 102.874 393.7282 53.263 0.1663 7347 +7349 2 103.0529 394.8527 53.0208 0.1862 7348 +7350 2 103.0222 395.9956 52.9015 0.1825 7349 +7351 2 102.9272 397.135 52.9077 0.2084 7350 +7352 2 102.9575 398.2779 53.002 0.2422 7351 +7353 2 103.0357 399.4173 53.1555 0.1806 7352 +7354 2 103.1141 400.5567 53.3439 0.1633 7353 +7355 2 103.1926 401.695 53.5455 0.1507 7354 +7356 2 103.2709 402.8333 53.7396 0.1446 7355 +7357 2 103.3493 403.9716 53.9213 0.1413 7356 +7358 2 103.4279 405.111 54.0904 0.1395 7357 +7359 2 103.5064 406.2504 54.2444 0.1384 7358 +7360 2 103.8489 407.3418 54.3516 0.1379 7359 +7361 2 104.1956 408.4309 54.4208 0.1376 7360 +7362 2 104.5426 409.5211 54.4608 0.1375 7361 +7363 2 104.8895 410.6113 54.4802 0.1374 7362 +7364 2 105.2364 411.7016 54.4866 0.1144 7363 +7365 2 250.7076 328.0431 62.8656 0.1373 -1 +7366 2 251.6949 327.5112 61.9466 0.1153 7365 +7367 2 252.5071 327.0044 60.4162 0.1361 7366 +7368 2 253.4726 326.4862 59.6299 0.1372 7367 +7369 2 254.4153 325.9416 58.7698 0.137 7368 +7370 2 255.3076 325.3376 57.834 0.1368 7369 +7371 2 256.1828 324.7175 56.8579 0.1363 7370 +7372 2 257.0488 324.0941 55.846 0.1355 7371 +7373 2 257.9182 323.474 54.8442 0.134 7372 +7374 2 258.83 322.8951 53.9199 0.1311 7373 +7375 2 259.7326 322.282 53.083 0.1264 7374 +7376 2 260.6295 321.6573 52.2724 0.1144 7375 +7377 2 261.4543 321.1014 50.8897 0.1144 7376 +7378 2 250.5166 328.3932 63.4771 0.1373 7365 +7379 2 249.845 329.3118 63.735 0.1373 7378 +7380 2 249.1518 330.219 63.9173 0.1373 7379 +7381 2 248.4585 331.1262 64.0662 0.1373 7380 +7382 2 247.7641 332.0346 64.1903 0.1373 7381 +7383 2 247.0697 332.9429 64.3003 0.1373 7382 +7384 2 246.3753 333.8501 64.4162 0.1373 7383 +7385 2 245.682 334.7584 64.5655 0.1373 7384 +7386 2 244.9887 335.6645 64.7623 0.1373 7385 +7387 2 244.1834 336.4584 65.077 0.1373 7386 +7388 2 243.2979 337.1574 65.5404 0.1373 7387 +7389 2 242.4079 337.8346 66.1245 0.1373 7388 +7390 2 241.5236 338.5062 66.7962 0.1373 7389 +7391 2 240.645 339.1743 67.5276 0.1373 7390 +7392 2 239.7687 339.8401 68.2926 0.1373 7391 +7393 2 239.4129 340.8056 69.1345 0.1373 7392 +7394 2 239.3774 341.8936 69.984 0.1373 7393 +7395 2 239.3751 342.9838 70.8282 0.1372 7394 +7396 2 239.3397 344.0774 71.6464 0.1372 7395 +7397 2 239.2973 345.1757 72.4184 0.1371 7396 +7398 2 239.255 346.2819 73.1242 0.1368 7397 +7399 2 239.2127 347.3973 73.7428 0.1364 7398 +7400 2 238.4554 348.2244 74.079 0.1356 7399 +7401 2 237.6019 348.9864 74.1622 0.1342 7400 +7402 2 236.7497 349.7483 74.072 0.1313 7401 +7403 2 235.8985 350.5079 73.869 0.127 7402 +7404 2 235.0497 351.2663 73.6042 0.1144 7403 +7405 2 234.2146 352.0122 73.0234 0.1144 7404 +7406 2 249.7661 328.6129 63.6252 0.1373 7365 +7407 2 248.8086 329.1791 64.2874 0.1372 7406 +7408 2 247.8282 329.7042 64.9396 0.1144 7407 +7409 2 299.9705 303.065 79.1465 0.1144 -1 +7410 2 300.9406 303.6702 79.1689 0.1153 7409 +7411 2 301.8455 304.3612 78.8998 0.1275 7410 +7412 2 302.6635 305.1494 78.6288 0.1319 7411 +7413 2 303.3716 306.0463 78.563 0.1345 7412 +7414 2 304.0374 306.9764 78.6024 0.1357 7413 +7415 2 304.7422 307.8767 78.673 0.1365 7414 +7416 2 305.4446 308.7793 78.7184 0.1369 7415 +7417 2 306.1092 309.7071 78.661 0.1371 7416 +7418 2 306.6263 310.7184 78.4154 0.1372 7417 +7419 2 307.0199 311.7766 77.9708 0.1372 7418 +7420 2 307.5083 312.765 77.2747 0.1373 7419 +7421 2 308.1616 313.5979 76.2488 0.1373 7420 +7422 2 308.9612 314.2419 75.0212 0.1373 7421 +7423 2 309.8821 314.7464 73.9488 0.1373 7422 +7424 2 310.7973 315.2761 72.9215 0.1373 7423 +7425 2 311.6302 315.9236 71.841 0.1373 7424 +7426 2 312.4436 316.5928 70.747 0.1373 7425 +7427 2 313.2421 317.2827 69.6713 0.1373 7426 +7428 2 314.0543 317.984 68.7039 0.1373 7427 +7429 2 314.9363 318.6395 67.9487 0.1373 7428 +7430 2 315.8595 319.2721 67.3663 0.1373 7429 +7431 2 316.6855 319.8327 66.1206 0.1373 7430 +7432 2 317.555 320.4081 65.0068 0.1373 7431 +7433 2 318.4885 321.0236 64.468 0.1373 7432 +7434 2 319.4117 321.591 63.607 0.1195 7433 +7435 2 312.4012 375.6724 50.5926 0.1144 -1 +7436 2 312.9115 374.6508 50.7674 0.1271 7435 +7437 2 313.4217 373.627 50.8234 0.1568 7436 +7438 2 313.9594 372.618 50.9082 0.1807 7437 +7439 2 314.6332 371.6982 51.1263 0.1538 7438 +7440 2 315.3058 370.7841 51.4564 0.146 7439 +7441 2 277.7392 393.0178 47.0448 0.1144 -1 +7442 2 278.8386 392.7226 47.3337 0.127 7441 +7443 2 279.9414 392.4252 47.4558 0.1566 7442 +7444 2 281.0442 392.1289 47.6095 0.1806 7443 +7445 2 282.147 391.8314 47.7957 0.1542 7444 +7446 2 283.2487 391.5351 48.0138 0.1603 7445 +7447 2 284.3606 391.7674 48.3227 0.1723 7446 +7448 2 285.4589 392.0454 48.7024 0.1893 7447 +7449 2 286.5731 392.2341 49.1319 0.1585 7448 +7450 2 287.7023 392.2296 49.5911 0.1501 7449 +7451 2 288.8303 392.225 50.0595 0.1438 7450 +7452 2 289.9582 392.2215 50.5184 0.1409 7451 +7453 2 291.0874 392.2341 50.9499 0.1392 7452 +7454 2 292.1776 392.5453 51.3047 0.1383 7453 +7455 2 293.2335 392.9732 51.5819 0.1378 7454 +7456 2 294.2894 393.4022 51.8003 0.1376 7455 +7457 2 295.3476 393.83 51.9789 0.1374 7456 +7458 2 296.407 394.259 52.1346 0.1374 7457 +7459 2 297.4652 394.688 52.2911 0.1373 7458 +7460 2 298.5234 395.117 52.4541 0.1373 7459 +7461 2 299.5633 395.5849 52.6271 0.1373 7460 +7462 2 300.3938 396.3663 52.8441 0.1373 7461 +7463 2 301.2232 397.1465 53.0992 0.1363 7462 +7464 2 376.0957 394.3951 46.5545 0.1669 -1 +7465 2 376.7604 394.831 46.1098 0.1235 7464 +7466 2 377.6767 395.5002 45.7747 0.1422 7465 +7467 2 378.5862 396.1901 45.631 0.1548 7466 +7468 2 379.4957 396.8833 45.493 0.1681 7467 +7469 2 380.4132 397.5617 45.3211 0.2027 7468 +7470 2 381.2986 398.2813 45.115 0.2183 7469 +7471 2 381.8409 399.2709 44.9165 0.191 7470 +7472 2 382.2241 400.3439 44.7317 0.1657 7471 +7473 2 382.5033 401.4502 44.5362 0.1616 7472 +7474 2 382.7561 402.5622 44.3223 0.1747 7473 +7475 2 383.0066 403.6753 44.0899 0.2279 7474 +7476 2 383.9607 404.1638 43.7604 0.199 7475 +7477 2 385.0864 404.2644 43.3714 0.1639 7476 +7478 2 386.2144 404.3445 42.9458 0.1378 7477 +7479 2 387.3412 404.4234 42.5135 0.1373 7478 +7480 2 388.4475 404.1672 42.1747 0.1373 7479 +7481 2 389.5034 403.7336 41.9563 0.1373 7480 +7482 2 390.5605 403.2989 41.8412 0.1373 7481 +7483 2 391.6175 402.863 41.7998 0.1373 7482 +7484 2 392.6757 402.4272 41.8026 0.1373 7483 +7485 2 393.7328 401.9913 41.8214 0.1373 7484 +7486 2 394.791 401.5554 41.832 0.1373 7485 +7487 2 395.8652 401.1642 41.818 0.1373 7486 +7488 2 397.0035 401.0464 41.7466 0.1373 7487 +7489 2 398.1406 400.932 41.6287 0.1373 7488 +7490 2 399.2766 400.8176 41.4758 0.1373 7489 +7491 2 400.4126 400.7032 41.2997 0.1373 7490 +7492 2 401.5486 400.5888 41.1093 0.1372 7491 +7493 2 402.6834 400.4744 40.9147 0.1372 7492 +7494 2 403.8194 400.36 40.7226 0.1371 7493 +7495 2 404.9554 400.2444 40.5339 0.1368 7494 +7496 2 406.0948 400.3016 40.3533 0.1364 7495 +7497 2 407.232 400.4034 40.1786 0.1356 7496 +7498 2 408.3702 400.5064 40.0117 0.1342 7497 +7499 2 409.5074 400.6094 39.8552 0.1313 7498 +7500 2 410.6445 400.7123 39.7102 0.1271 7499 +7501 2 411.7828 400.8153 39.5772 0.1144 7500 +7502 2 412.9176 400.9182 39.3201 0.1144 7501 +7503 2 377.0075 394.5176 46.4514 0.1544 7464 +7504 2 378.14 394.6708 46.4215 0.1409 7503 +7505 2 379.2738 394.8241 46.4545 0.1373 7504 +7506 2 380.4075 394.9774 46.5086 0.1373 7505 +7507 2 381.5057 395.2806 46.5629 0.1373 7506 +7508 2 382.4735 395.872 46.5898 0.1373 7507 +7509 2 383.4013 396.5413 46.5872 0.1373 7508 +7510 2 384.3279 397.2117 46.5618 0.1373 7509 +7511 2 385.2557 397.8809 46.52 0.1373 7510 +7512 2 386.1824 398.5513 46.4682 0.1373 7511 +7513 2 387.1102 399.2217 46.412 0.1373 7512 +7514 2 388.0368 399.8909 46.3546 0.1373 7513 +7515 2 388.9634 400.5613 46.2969 0.1373 7514 +7516 2 389.8901 401.2317 46.2386 0.1373 7515 +7517 2 390.8133 401.9066 46.1793 0.1373 7516 +7518 2 391.7296 402.5919 46.1166 0.1373 7517 +7519 2 392.6437 403.2794 46.0538 0.1373 7518 +7520 2 393.5577 403.967 45.9956 0.1373 7519 +7521 2 394.4718 404.6545 45.946 0.1373 7520 +7522 2 395.3321 405.4061 45.9158 0.1373 7521 +7523 2 396.0436 406.2962 45.9234 0.1373 7522 +7524 2 396.6603 407.2594 45.9729 0.1373 7523 +7525 2 397.286 408.217 46.051 0.1373 7524 +7526 2 397.9804 409.123 46.1378 0.1373 7525 +7527 2 398.7343 409.9821 46.2182 0.1373 7526 +7528 2 399.5054 410.8276 46.2938 0.1373 7527 +7529 2 400.2833 411.6661 46.3733 0.1373 7528 +7530 2 401.067 412.4989 46.4601 0.1373 7529 +7531 2 401.8506 413.3306 46.5522 0.1373 7530 +7532 2 402.6354 414.1635 46.6452 0.1373 7531 +7533 2 403.4179 414.9963 46.7314 0.1373 7532 +7534 2 404.1946 415.8348 46.7936 0.1373 7533 +7535 2 404.9657 416.6814 46.8168 0.1373 7534 +7536 2 405.7333 417.5291 46.8023 0.1373 7535 +7537 2 406.5021 418.3757 46.7569 0.1373 7536 +7538 2 407.2732 419.2199 46.6872 0.1373 7537 +7539 2 408.2227 419.8366 46.5864 0.1373 7538 +7540 2 409.3438 419.9441 46.4615 0.1373 7539 +7541 2 410.4855 419.9693 46.3165 0.1373 7540 +7542 2 411.6272 419.9944 46.1538 0.1373 7541 +7543 2 412.7689 420.0196 45.9791 0.1373 7542 +7544 2 413.9095 420.0745 45.7881 0.1373 7543 +7545 2 415.0455 420.1718 45.5784 0.1373 7544 +7546 2 416.1815 420.2747 45.3639 0.1374 7545 +7547 2 417.3175 420.3788 45.1601 0.1374 7546 +7548 2 418.4546 420.4818 44.9792 0.1375 7547 +7549 2 419.5517 420.7941 44.8916 0.1376 7548 +7550 2 420.6191 421.2036 44.9168 0.1379 7549 +7551 2 421.683 421.6212 45.0316 0.1385 7550 +7552 2 422.7458 422.0388 45.2094 0.1396 7551 +7553 2 423.8074 422.4575 45.4233 0.1415 7552 +7554 2 424.8679 422.8739 45.6492 0.145 7553 +7555 2 425.9295 423.2914 45.8643 0.1522 7554 +7556 2 426.9923 423.709 46.0586 0.1626 7555 +7557 2 428.1031 423.9664 46.2176 0.1956 7556 +7558 2 429.2277 423.8017 46.3117 0.1913 7557 +7559 2 430.3408 423.542 46.3378 0.1888 7558 +7560 2 431.383 423.963 46.3151 0.2321 7559 +7561 2 432.1689 424.7889 46.2661 0.1952 7560 +7562 2 432.7535 425.7682 46.0824 0.1577 7561 +7563 2 433.2671 426.7818 45.7654 0.1271 7562 +7564 2 433.7773 427.7908 45.3505 0.1144 7563 +7565 2 434.2613 428.7483 44.3758 0.1144 7564 +7566 2 374.9666 393.7751 46.7323 0.1828 7464 +7567 2 373.9656 393.226 46.8955 0.156 7566 +7568 2 372.9715 392.6643 47.0546 0.1486 7567 +7569 2 372.0448 391.9996 47.1962 0.1431 7568 +7570 2 371.212 391.216 47.3102 0.1405 7569 +7571 2 370.3792 390.4323 47.3922 0.139 7570 +7572 2 369.5463 389.6487 47.416 0.1383 7571 +7573 2 368.7135 388.865 47.3222 0.1379 7572 +7574 2 367.9653 388.722 47.2223 0.1377 7573 +7575 2 366.843 388.5093 47.0694 0.1375 7574 +7576 2 365.7208 388.2953 46.921 0.1374 7575 +7577 2 364.5962 388.0917 46.7914 0.146 7576 +7578 2 363.4591 387.991 46.6925 0.1616 7577 +7579 2 362.3174 387.935 46.6085 0.1804 7578 +7580 2 361.1745 387.8789 46.5312 0.1665 7579 +7581 2 360.0328 387.8229 46.4601 0.1518 7580 +7582 2 358.8911 387.7668 46.394 0.1454 7581 +7583 2 357.7482 387.7108 46.3324 0.1416 7582 +7584 2 356.6054 387.6547 46.275 0.1396 7583 +7585 2 355.4637 387.5986 46.2235 0.1386 7584 +7586 2 354.3208 387.5426 46.1793 0.138 7585 +7587 2 353.178 387.4865 46.144 0.1377 7586 +7588 2 352.0466 387.6044 46.1219 0.1375 7587 +7589 2 350.9369 387.8755 46.1121 0.1374 7588 +7590 2 349.8341 388.1798 46.1138 0.146 7589 +7591 2 348.7312 388.483 46.1283 0.1615 7590 +7592 2 347.633 388.8033 46.158 0.1804 7591 +7593 2 346.5531 389.1808 46.2028 0.1665 7592 +7594 2 345.4834 389.5846 46.2535 0.1518 7593 +7595 2 344.4126 389.9862 46.3042 0.1453 7594 +7596 2 343.3419 390.3889 46.3509 0.1416 7595 +7597 2 342.2711 390.7927 46.3898 0.1396 7596 +7598 2 341.3193 391.3578 46.5312 0.1379 7597 +7599 2 340.5963 392.2398 46.7396 0.1376 7598 +7600 2 339.871 393.1242 46.8362 0.1374 7599 +7601 2 339.1457 394.0085 46.9403 0.1374 7600 +7602 2 338.4215 394.8916 47.0515 0.1373 7601 +7603 2 337.6962 395.7748 47.164 0.1494 7602 +7604 2 336.9709 396.6591 47.2758 0.1662 7603 +7605 2 336.2502 397.5469 47.36 0.1858 7604 +7606 2 335.4894 398.4014 47.3572 0.1577 7605 +7607 2 334.6841 399.2125 47.3973 0.162 7606 +7608 2 333.8764 400.0225 47.4863 0.173 7607 +7609 2 333.0699 400.8324 47.623 0.1898 7608 +7610 2 332.2485 401.6229 47.8442 0.1592 7609 +7611 2 331.4271 402.41 48.1348 0.1503 7610 +7612 2 330.6068 403.1959 48.4705 0.144 7611 +7613 2 329.7877 403.9819 48.8197 0.1409 7612 +7614 2 328.995 404.7964 49.1411 0.1392 7613 +7615 2 328.2216 405.6315 49.4133 0.1383 7614 +7616 2 327.4471 406.4689 49.6362 0.1379 7615 +7617 2 326.6726 407.3075 49.8179 0.1375 7616 +7618 2 325.8993 408.1414 50.12 0.1144 7617 +7619 2 369.8792 388.706 48.3232 0.142 7573 +7620 2 371.0106 388.5756 48.5478 0.1555 7619 +7621 2 372.1524 388.5161 48.6318 0.1813 7620 +7622 2 373.2895 388.6111 48.7242 0.1704 7621 +7623 2 374.4243 388.7461 48.8566 0.1529 7622 +7624 2 375.558 388.8845 49.0272 0.1394 7623 +7625 2 376.6906 389.0218 49.2288 0.1373 7624 +7626 2 377.822 389.1591 49.4673 0.1373 7625 +7627 2 378.9534 389.2872 49.7389 0.1373 7626 +7628 2 380.086 389.3089 50.1091 0.1373 7627 +7629 2 381.2163 389.3021 50.5512 0.1373 7628 +7630 2 382.3477 389.3924 50.8816 0.1373 7629 +7631 2 383.4814 389.5217 51.0726 0.1373 7630 +7632 2 384.6174 389.6533 51.1434 0.1373 7631 +7633 2 385.7534 389.7871 51.1188 0.1373 7632 +7634 2 386.8894 389.921 51.0255 0.1373 7633 +7635 2 388.0242 390.0537 50.9043 0.1373 7634 +7636 2 389.1602 390.1875 50.7914 0.1373 7635 +7637 2 390.2916 390.0388 50.7296 0.1373 7636 +7638 2 391.3979 389.7494 50.7262 0.1373 7637 +7639 2 392.5018 389.4496 50.7713 0.1373 7638 +7640 2 393.6058 389.151 50.8539 0.1373 7639 +7641 2 394.7086 388.8502 50.965 0.1373 7640 +7642 2 395.8034 388.523 51.0978 0.1373 7641 +7643 2 396.8742 388.1272 51.2498 0.1373 7642 +7644 2 397.9438 387.7256 51.4184 0.1373 7643 +7645 2 399.0112 387.3229 51.6015 0.1373 7644 +7646 2 400.0888 386.9466 51.8148 0.1373 7645 +7647 2 401.1791 386.6194 52.0831 0.1373 7646 +7648 2 402.2704 386.2979 52.3855 0.1373 7647 +7649 2 403.3881 386.0863 52.6739 0.1373 7648 +7650 2 404.5195 385.9559 52.9248 0.1373 7649 +7651 2 405.6532 385.83 53.1409 0.1374 7650 +7652 2 406.7812 385.6435 53.2538 0.1375 7651 +7653 2 407.9104 385.4651 53.2787 0.1376 7652 +7654 2 409.0338 385.6721 53.3632 0.1378 7653 +7655 2 410.156 385.8895 53.513 0.1384 7654 +7656 2 411.2749 386.1069 53.7286 0.1393 7655 +7657 2 412.3937 386.3254 53.9924 0.1413 7656 +7658 2 413.5102 386.5416 54.2867 0.1441 7657 +7659 2 414.605 386.8459 54.5874 0.1525 7658 +7660 2 415.558 387.4682 54.8755 0.1533 7659 +7661 2 416.4961 388.0814 55.44 0.2288 7660 +7662 2 333.2621 364.6717 63.7988 0.2288 -1 +7663 2 332.5642 363.8092 63.1114 0.2288 7662 +7664 2 331.8492 362.9248 62.8169 0.1789 7663 +7665 2 331.061 362.1103 62.4322 0.1609 7664 +7666 2 330.2705 361.3049 61.9833 0.1496 7665 +7667 2 329.488 360.4938 61.5096 0.1439 7666 +7668 2 328.8485 359.5569 61.1621 0.1409 7667 +7669 2 328.2262 358.6017 60.921 0.1392 7668 +7670 2 327.6107 357.6407 60.7284 0.1388 7669 +7671 2 327.0124 356.6695 60.4979 0.1514 7670 +7672 2 326.4164 355.7005 60.2297 0.1683 7671 +7673 2 325.8341 354.7247 59.9217 0.1851 7672 +7674 2 325.4154 353.671 59.5498 0.1576 7673 +7675 2 324.9921 352.6208 59.1581 0.1642 7674 +7676 2 324.515 351.589 58.8358 0.1898 7675 +7677 2 324.0186 350.5628 58.5978 0.2329 7676 +7678 2 323.5301 349.5309 58.4156 0.2365 7677 +7679 2 323.0656 348.4876 58.261 0.2161 7678 +7680 2 322.5897 347.4488 58.1249 0.1746 7679 +7681 2 322.0955 346.4181 57.9942 0.1584 7680 +7682 2 321.6036 345.3873 57.8497 0.1461 7681 +7683 2 324.4933 268.7233 69.3862 0.1144 -1 +7684 2 325.3582 269.4395 69.9079 0.1145 7683 +7685 2 325.921 270.4324 70.114 0.1271 7684 +7686 2 326.4152 271.4609 70.3209 0.1313 7685 +7687 2 326.9243 272.4814 70.5362 0.1342 7686 +7688 2 327.4792 273.4766 70.8016 0.1356 7687 +7689 2 328.0351 274.4685 71.1099 0.1364 7688 +7690 2 328.59 275.458 71.4627 0.1368 7689 +7691 2 329.178 276.4213 71.9236 0.1501 7690 +7692 2 329.766 277.3788 72.4444 0.1676 7691 +7693 2 330.37 278.3238 72.9814 0.1847 7692 +7694 2 331.1354 279.1486 73.486 0.1543 7693 +7695 2 305.9925 247.5364 76.8482 0.1144 -1 +7696 2 306.8471 248.2972 76.8939 0.1145 7695 +7697 2 307.6777 249.0831 76.9045 0.1271 7696 +7698 2 308.4544 249.9228 76.8956 0.1313 7697 +7699 2 308.8846 250.9822 76.844 0.1342 7698 +7700 2 308.8651 252.125 76.7332 0.1356 7699 +7701 2 308.7462 253.261 76.7351 0.1351 7700 +7702 2 290.671 304.2662 77.2937 0.3432 -1 +7703 2 291.7692 304.5637 77.5872 0.1906 7702 +7704 2 292.8217 305.0087 77.7006 0.1778 7703 +7705 2 293.8696 305.464 77.8078 0.1566 7704 +7706 2 294.7184 306.2305 77.8901 0.1482 7705 +7707 2 295.5215 307.045 77.9458 0.1431 7706 +7708 2 296.2754 307.9053 77.9747 0.1405 7707 +7709 2 296.9813 308.8056 77.978 0.139 7708 +7710 2 297.686 309.7071 77.9727 0.1382 7709 +7711 2 298.3987 310.6017 77.9691 0.1377 7710 +7712 2 299.1171 311.4918 77.9766 0.1375 7711 +7713 2 299.8367 312.3806 77.9979 0.1374 7712 +7714 2 300.5723 313.2569 78.0343 0.1374 7713 +7715 2 301.3136 314.1287 78.0867 0.1373 7714 +7716 2 302.0503 315.0027 78.1606 0.1373 7715 +7717 2 302.6704 315.9625 78.3 0.1373 7716 +7718 2 303.2527 316.9441 78.4994 0.1375 7717 +7719 2 303.8315 317.9256 78.7335 0.1505 7718 +7720 2 304.4024 318.9117 78.9844 0.1676 7719 +7721 2 304.9424 319.915 79.2484 0.185 7720 +7722 2 305.4743 320.924 79.4592 0.1565 7721 +7723 2 305.9834 321.9479 79.4909 0.1489 7722 +7724 2 306.4936 322.9706 79.3775 0.1432 7723 +7725 2 307.0313 323.9762 79.1512 0.1406 7724 +7726 2 307.6513 324.928 78.843 0.139 7725 +7727 2 308.26 325.8867 78.4888 0.1383 7726 +7728 2 308.7919 326.8877 78.1228 0.1378 7727 +7729 2 309.2621 327.9207 77.7652 0.1376 7728 +7730 2 309.722 328.9583 77.4298 0.1374 7729 +7731 2 310.1178 330.0257 77.1585 0.1374 7730 +7732 2 310.469 331.1091 76.9412 0.1373 7731 +7733 2 310.6086 332.2393 76.7026 0.1349 7732 +7734 2 324.1501 262.445 86.6466 0.1144 -1 +7735 2 324.6901 263.4529 86.6186 0.1145 7734 +7736 2 325.4131 264.3406 86.6001 0.1271 7735 +7737 2 326.0835 265.2661 86.5091 0.1314 7736 +7738 2 326.8397 266.1241 86.401 0.1342 7737 +7739 2 327.6782 266.8998 86.287 0.1356 7738 +7740 2 328.6243 267.5404 86.149 0.1364 7739 +7741 2 329.6642 268.0106 85.9642 0.1368 7740 +7742 2 330.5279 268.7542 85.7273 0.1371 7741 +7743 2 331.2818 269.6042 85.4084 0.1372 7742 +7744 2 332.0105 270.4679 84.9635 0.1372 7743 +7745 2 332.4967 271.4575 84.236 0.1373 7744 +7746 2 333.1763 272.2777 83.2698 0.1373 7745 +7747 2 334.0709 272.8429 82.2268 0.1373 7746 +7748 2 335.049 273.1826 81.1096 0.1302 7747 +7749 2 353.3976 274.1504 29.2348 0.1912 -1 +7750 2 354.2888 273.9972 28.9134 0.1973 7749 +7751 2 355.3916 273.7066 28.7815 0.2293 7750 +7752 2 356.4429 273.265 28.5813 0.1906 7751 +7753 2 357.4577 272.7456 28.3259 0.158 7752 +7754 2 358.4587 272.2068 28.054 0.1373 7753 +7755 2 359.3819 271.5467 27.7399 0.1373 7754 +7756 2 360.2364 270.802 27.3864 0.1373 7755 +7757 2 361.1505 270.1281 27.0546 0.1373 7756 +7758 2 362.0943 269.4921 26.7881 0.1373 7757 +7759 2 363.1056 268.9716 26.6083 0.1373 7758 +7760 2 364.1981 268.6409 26.5095 0.1373 7759 +7761 2 365.3078 268.3744 26.4745 0.1373 7760 +7762 2 366.3477 267.9122 26.4965 0.1373 7761 +7763 2 367.3041 267.2853 26.5379 0.1373 7762 +7764 2 368.2525 266.6447 26.5496 0.1374 7763 +7765 2 369.1757 265.9697 26.539 0.1375 7764 +7766 2 370.1298 265.3428 26.5425 0.1377 7765 +7767 2 371.1525 264.8326 26.5455 0.138 7766 +7768 2 372.1924 264.3567 26.5139 0.1387 7767 +7769 2 373.1945 263.8121 26.4268 0.1399 7768 +7770 2 374.0983 263.1189 26.2479 0.1423 7769 +7771 2 374.9105 262.3215 25.9696 0.1466 7770 +7772 2 375.6713 261.4795 25.6285 0.1549 7771 +7773 2 376.4229 260.6295 25.2834 0.169 7772 +7774 2 377.2237 259.8218 25.0126 0.2028 7773 +7775 2 378.1446 259.1595 24.8478 0.227 7774 +7776 2 379.1902 258.7087 24.7406 0.195 7775 +7777 2 380.2805 258.3655 24.6472 0.1739 7776 +7778 2 381.3604 257.9903 24.5504 0.1808 7777 +7779 2 382.3523 257.4503 24.4041 0.1998 7778 +7780 2 383.1565 256.6541 24.1689 0.204 7779 +7781 2 383.8578 255.7572 23.8648 0.2052 7780 +7782 2 384.5556 254.8603 23.5599 0.2022 7781 +7783 2 385.3038 254.0046 23.2966 0.202 7782 +7784 2 386.148 253.2416 23.0581 0.1904 7783 +7785 2 387.0232 252.5094 22.8457 0.2123 7784 +7786 2 387.8286 251.7029 22.7116 0.2164 7785 +7787 2 388.5436 250.8117 22.688 0.1791 7786 +7788 2 389.222 249.8908 22.7026 0.1493 7787 +7789 2 389.8832 248.9573 22.678 0.1373 7788 +7790 2 390.5593 248.0352 22.6306 0.1373 7789 +7791 2 391.2549 247.1269 22.6049 0.1373 7790 +7792 2 391.9699 246.2346 22.602 0.1373 7791 +7793 2 392.7832 245.4372 22.6184 0.1373 7792 +7794 2 393.6984 244.7531 22.657 0.1373 7793 +7795 2 394.5953 244.0461 22.7339 0.1373 7794 +7796 2 395.3721 243.2144 22.8865 0.1373 7795 +7797 2 396.0322 242.2855 23.0723 0.1373 7796 +7798 2 396.6214 241.3062 23.199 0.1373 7797 +7799 2 397.1625 240.2995 23.212 0.1373 7798 +7800 2 397.7196 239.3019 23.0978 0.1373 7799 +7801 2 398.2493 238.2929 22.8898 0.1373 7800 +7802 2 398.7206 237.2553 22.6457 0.1373 7801 +7803 2 399.1668 236.2063 22.3876 0.1373 7802 +7804 2 399.7548 235.2384 22.155 0.1373 7803 +7805 2 400.6425 234.5589 21.9795 0.1373 7804 +7806 2 401.7156 234.1894 21.8565 0.1373 7805 +7807 2 402.8253 233.9194 21.7368 0.1373 7806 +7808 2 403.9132 233.5716 21.5967 0.1374 7807 +7809 2 404.9783 233.1575 21.498 0.1374 7808 +7810 2 406.0148 232.6747 21.4392 0.1376 7809 +7811 2 407.0318 232.1519 21.4021 0.1378 7810 +7812 2 408.0442 231.62 21.3887 0.1382 7811 +7813 2 409.0658 231.104 21.4232 0.1391 7812 +7814 2 410.0016 230.4542 21.4719 0.1406 7813 +7815 2 410.7132 229.5733 21.4421 0.1435 7814 +7816 2 411.3458 228.6215 21.3386 0.1486 7815 +7817 2 412.0242 227.7018 21.2245 0.1591 7816 +7818 2 412.7277 226.8003 21.156 0.1741 7817 +7819 2 413.4199 225.8897 21.1278 0.2247 7818 +7820 2 414.0845 224.9596 21.0365 0.2065 7819 +7821 2 414.7778 224.0547 20.8167 0.1717 7820 +7822 2 415.7044 223.4049 20.5561 0.1479 7821 +7823 2 416.6391 222.7505 20.3522 0.1523 7822 +7824 2 417.5589 222.0721 20.2399 0.1629 7823 +7825 2 418.4866 221.4029 20.2292 0.1959 7824 +7826 2 419.4396 220.7703 20.298 0.1925 7825 +7827 2 420.4372 220.2143 20.4227 0.1907 7826 +7828 2 421.2071 219.3792 20.5704 0.2337 7827 +7829 2 421.9816 218.544 20.824 0.2026 7828 +7830 2 422.8178 217.7764 21.1712 0.1702 7829 +7831 2 423.6461 216.9951 21.4383 0.1507 7830 +7832 2 424.4583 216.1943 21.6288 0.1611 7831 +7833 2 425.2511 215.3706 21.7513 0.1836 7832 +7834 2 425.9306 214.4508 21.8131 0.2128 7833 +7835 2 426.4203 213.4166 21.7845 0.3282 7834 +7836 2 426.4981 212.2761 21.7435 0.246 7835 +7837 2 426.5907 211.1366 21.7515 0.1652 7836 +7838 2 426.7898 210.0098 21.8028 0.1144 7837 +7839 2 353.7099 273.4881 29.3418 0.1936 7749 +7840 2 354.2133 272.4653 29.5778 0.1781 7839 +7841 2 354.6961 271.4312 29.7007 0.189 7840 +7842 2 355.0541 270.3478 29.8374 0.2034 7841 +7843 2 355.3058 269.2335 30.007 0.1939 7842 +7844 2 355.6845 268.1719 30.1596 0.19 7843 +7845 2 356.404 267.3002 30.2134 0.1609 7844 +7846 2 357.3684 266.7076 30.2067 0.1599 7845 +7847 2 358.453 266.3484 30.2571 0.1833 7846 +7848 2 359.5398 266.0109 30.4875 0.2196 7847 +7849 2 360.6002 265.6048 30.8059 0.2062 7848 +7850 2 361.6687 265.2135 31.1032 0.1696 7849 +7851 2 362.7384 264.8211 31.355 0.1625 7850 +7852 2 363.8057 264.4207 31.5736 0.1688 7851 +7853 2 364.8422 263.9494 31.7948 0.183 7852 +7854 2 365.6773 263.2115 32.0284 0.1798 7853 +7855 2 366.2539 262.2357 32.2857 0.1768 7854 +7856 2 366.7275 261.2004 32.5548 0.1885 7855 +7857 2 367.0982 260.1239 32.7748 0.1728 7856 +7858 2 367.1668 258.9993 32.8521 0.1546 7857 +7859 2 366.6863 258.0086 32.7216 0.1465 7858 +7860 2 365.7322 257.4492 32.4246 0.142 7859 +7861 2 364.7415 256.8989 32.0751 0.1398 7860 +7862 2 363.9133 256.1302 31.7579 0.1587 7861 +7863 2 363.1834 255.2584 31.4888 0.1902 7862 +7864 2 362.489 254.3535 31.2732 0.228 7863 +7865 2 361.8152 253.4315 31.1035 0.1898 7864 +7866 2 361.2031 252.4716 30.8406 0.164 7865 +7867 2 360.7547 251.4283 30.5474 0.1512 7866 +7868 2 360.1037 250.4971 30.3268 0.1448 7867 +7869 2 359.4311 249.5739 30.1804 0.1413 7868 +7870 2 358.7035 248.6907 30.1459 0.1394 7869 +7871 2 357.8157 247.9757 30.1963 0.1384 7870 +7872 2 357.2746 246.9862 30.4136 0.1379 7871 +7873 2 356.9474 245.8994 30.7289 0.1376 7872 +7874 2 356.7724 244.7771 31.0489 0.1374 7873 +7875 2 356.6466 243.6468 31.3513 0.1374 7874 +7876 2 356.4418 242.5257 31.5986 0.1373 7875 +7877 2 356.213 241.408 31.7808 0.1611 7876 +7878 2 356.0917 240.272 31.9138 0.1948 7877 +7879 2 356.038 239.1292 31.9015 0.2466 7878 +7880 2 355.824 238.0069 31.7864 0.208 7879 +7881 2 355.6113 236.8846 31.6072 0.2107 7880 +7882 2 355.3092 235.7841 31.4462 0.1708 7881 +7883 2 355.0381 234.6756 31.2458 0.1565 7882 +7884 2 354.7761 233.5648 31.0391 0.1473 7883 +7885 2 354.5096 232.4551 30.8708 0.1427 7884 +7886 2 354.4695 231.3122 30.7558 0.1402 7885 +7887 2 354.4673 230.1694 30.8501 0.1144 7886 +7888 2 352.733 275.0542 29.3695 0.1222 7749 +7889 2 352.217 276.0724 29.4137 0.1524 7888 +7890 2 351.6862 277.0848 29.489 0.1837 7889 +7891 2 351.0433 278.0275 29.685 0.168 7890 +7892 2 350.3248 278.9141 29.8528 0.1508 7891 +7893 2 349.7094 279.8762 29.9891 0.138 7892 +7894 2 349.1408 280.8692 30.0138 0.1376 7893 +7895 2 348.5974 281.8759 29.9508 0.138 7894 +7896 2 348.1432 282.9215 29.7312 0.1385 7895 +7897 2 347.6582 283.9522 29.4574 0.1396 7896 +7898 2 347.2543 285.0162 29.1914 0.1415 7897 +7899 2 346.8505 286.0824 28.9422 0.1451 7898 +7900 2 346.4467 287.1486 28.7204 0.1523 7899 +7901 2 346.0417 288.2148 28.523 0.1626 7900 +7902 2 345.6367 289.2821 28.3438 0.1966 7901 +7903 2 345.1116 290.2969 28.1865 0.1865 7902 +7904 2 344.5854 291.3116 28.0462 0.1808 7903 +7905 2 344.0591 292.3252 27.9204 0.2203 7904 +7906 2 343.8292 293.4452 27.7819 0.1651 7905 +7907 2 343.6507 294.5663 27.4425 0.1144 7906 +7908 2 373.2151 227.0016 37.0448 0.1372 -1 +7909 2 373.1431 227.4867 36.8007 0.1371 7908 +7910 2 372.9509 228.6112 36.6234 0.1368 7909 +7911 2 372.7289 229.7335 36.6016 0.1364 7910 +7912 2 372.5859 230.8684 36.6341 0.1356 7911 +7913 2 372.4326 232.0021 36.6318 0.1342 7912 +7914 2 372.3423 233.1426 36.5663 0.1314 7913 +7915 2 372.2965 234.2843 36.4725 0.1272 7914 +7916 2 372.253 235.4272 36.3997 0.1146 7915 +7917 2 372.0826 236.5483 36.0318 0.1144 7916 +7918 2 373.2449 225.7524 37.4545 0.1372 7908 +7919 2 373.3101 224.6187 37.7863 0.1373 7918 +7920 2 373.2586 223.4941 38.0657 0.1373 7919 +7921 2 372.8891 222.4233 38.2763 0.1373 7920 +7922 2 372.8593 221.2851 38.4023 0.1373 7921 +7923 2 373.0607 220.1605 38.4905 0.1373 7922 +7924 2 373.2941 219.0405 38.5619 0.1373 7923 +7925 2 373.5057 217.916 38.6238 0.1373 7924 +7926 2 373.7082 216.7914 38.6812 0.1373 7925 +7927 2 373.9725 215.6795 38.7262 0.1373 7926 +7928 2 374.3626 214.6052 38.7775 0.1373 7927 +7929 2 374.9872 213.666 38.95 0.1373 7928 +7930 2 375.7193 212.8492 39.7474 0.1373 7929 +7931 2 376.3405 211.9054 40.1579 0.1373 7930 +7932 2 376.9286 210.941 40.6073 0.1373 7931 +7933 2 377.5028 209.9698 41.0693 0.1373 7932 +7934 2 378.1915 209.0809 41.5834 0.1373 7933 +7935 2 378.9637 208.4597 42.9783 0.1144 7934 +7936 2 362.3094 356.8639 35.28 0.1144 -1 +7937 2 361.782 355.8492 35.2072 0.1144 7936 +7938 2 361.2546 354.8345 35.1476 0.1271 7937 +7939 2 361.7969 353.8278 35.0672 0.1314 7938 +7940 2 362.5462 352.9663 34.9941 0.1342 7939 +7941 2 362.9477 351.8944 34.9409 0.1356 7940 +7942 2 363.3321 350.8179 34.9056 0.1364 7941 +7943 2 363.8 349.7769 34.8961 0.1368 7942 +7944 2 364.6294 348.9898 34.9135 0.1371 7943 +7945 2 365.5778 348.3503 34.9426 0.1372 7944 +7946 2 366.525 347.7096 34.974 0.1372 7945 +7947 2 367.4734 347.069 35.0014 0.1373 7946 +7948 2 368.4103 346.4135 35.0204 0.1373 7947 +7949 2 369.3004 345.6939 35.0249 0.1373 7948 +7950 2 370.1378 344.9149 35.0118 0.1373 7949 +7951 2 370.9763 344.1369 34.9798 0.1373 7950 +7952 2 371.8126 343.3567 34.9252 0.1373 7951 +7953 2 372.6386 342.5662 34.8586 0.1373 7952 +7954 2 373.2277 341.611 34.7892 0.1373 7953 +7955 2 373.1968 340.467 34.7309 0.1373 7954 +7956 2 373.1602 339.3241 34.7038 0.1373 7955 +7957 2 373.0229 338.1927 34.7077 0.1373 7956 +7958 2 372.6065 337.1276 34.7052 0.1373 7957 +7959 2 372.1581 336.082 34.5834 0.1373 7958 +7960 2 371.9213 334.9678 34.3291 0.1373 7959 +7961 2 371.6822 333.8558 34.0147 0.1373 7960 +7962 2 371.3893 332.7656 33.6196 0.1373 7961 +7963 2 370.8768 331.7726 33.1318 0.1373 7962 +7964 2 370.1275 330.9386 32.5707 0.1373 7963 +7965 2 369.4102 330.0886 31.9351 0.1373 7964 +7966 2 368.8862 329.1288 31.2421 0.1373 7965 +7967 2 368.7089 328.0306 30.6202 0.1373 7966 +7968 2 368.6494 326.9072 30.1106 0.1373 7967 +7969 2 368.5282 325.7883 29.6542 0.1373 7968 +7970 2 368.217 324.705 29.2606 0.1373 7969 +7971 2 367.7525 323.6685 28.9145 0.1373 7970 +7972 2 367.2881 322.632 28.5841 0.1373 7971 +7973 2 366.8236 321.5956 28.2601 0.1373 7972 +7974 2 366.358 320.5591 27.9339 0.1373 7973 +7975 2 365.8809 319.5272 27.6035 0.1373 7974 +7976 2 365.3867 318.5045 27.2777 0.1373 7975 +7977 2 364.8834 317.4852 26.9745 0.1414 7976 +7978 2 364.3789 316.4636 26.7124 0.1639 7977 +7979 2 363.8778 315.4523 26.317 0.2234 7978 +7980 2 363.2966 314.5153 25.6004 0.2816 7979 +7981 2 362.6812 313.5853 24.9791 0.2436 7980 +7982 2 362.0794 312.6209 24.6785 0.1928 7981 +7983 2 361.4731 311.6588 24.3924 0.1904 7982 +7984 2 360.8599 310.7001 24.0969 0.2095 7983 +7985 2 360.2456 309.7426 23.8063 0.2412 7984 +7986 2 359.7079 308.7381 23.5709 0.1873 7985 +7987 2 359.2354 307.6982 23.417 0.1655 7986 +7988 2 358.7973 306.6423 23.3178 0.1523 7987 +7989 2 358.4873 305.543 23.2202 0.1454 7988 +7990 2 358.1933 304.4378 23.1145 0.1416 7989 +7991 2 357.9015 303.3327 22.9977 0.1396 7990 +7992 2 357.6075 302.2276 22.8694 0.1616 7991 +7993 2 357.3158 301.1237 22.7345 0.1942 7992 +7994 2 357.023 300.0186 22.6055 0.233 7993 +7995 2 356.7244 298.9158 22.512 0.2055 7994 +7996 2 356.4246 297.8118 22.4501 0.2192 7995 +7997 2 356.1272 296.7067 22.4124 0.2578 7996 +7998 2 356.0494 295.5673 22.3904 0.2177 7997 +7999 2 356.0014 294.4244 22.3747 0.2144 7998 +8000 2 355.9247 293.2838 22.3683 0.1753 7999 +8001 2 355.8446 292.1421 22.3622 0.1586 8000 +8002 2 355.7646 291.0004 22.3519 0.1485 8001 +8003 2 355.5392 289.8804 22.2811 0.1434 8002 +8004 2 355.2566 288.7731 22.1524 0.1406 8003 +8005 2 354.8677 287.7 21.9875 0.1508 8004 +8006 2 354.5405 286.6052 21.8587 0.1666 8005 +8007 2 354.2202 285.5081 21.7673 0.2213 8006 +8008 2 354.1469 284.3721 21.5639 0.2456 8007 +8009 2 354.2236 283.2361 21.2911 0.2974 8008 +8010 2 354.6892 282.2168 20.7334 0.1187 8009 +8011 2 367.3476 310.1567 19.0551 0.3432 -1 +8012 2 366.6268 311.0433 19.1933 0.2162 8011 +8013 2 365.929 311.9494 19.2519 0.2499 8012 +8014 2 365.2369 312.86 19.3219 0.2853 8013 +8015 2 364.69 313.8644 19.402 0.2373 8014 +8016 2 364.2267 314.91 19.4919 0.1871 8015 +8017 2 363.7806 315.9625 19.5883 0.1777 8016 +8018 2 363.53 317.0779 19.6779 0.1817 8017 +8019 2 363.3653 318.2093 19.7526 0.1947 8018 +8020 2 363.3744 319.3533 19.8159 0.1613 8019 +8021 2 363.5094 320.4893 19.8789 0.1517 8020 +8022 2 363.6936 321.6173 19.9551 0.1447 8021 +8023 2 363.9785 322.7247 20.0608 0.1414 8022 +8024 2 364.2954 323.8229 20.211 0.1395 8023 +8025 2 364.6374 324.9109 20.4159 0.1384 8024 +8026 2 364.9932 325.9931 20.6764 0.138 8025 +8027 2 365.4702 327.0238 20.9989 0.1376 8026 +8028 2 365.9393 328.034 21.5748 0.1375 8027 +8029 2 366.6417 328.9194 21.9907 0.1374 8028 +8030 2 367.4013 329.7683 22.2363 0.1373 8029 +8031 2 368.1335 330.6435 22.3892 0.1373 8030 +8032 2 368.7364 331.6124 22.4653 0.1373 8031 +8033 2 369.1757 332.6672 22.479 0.1396 8032 +8034 2 369.4948 333.7654 22.461 0.1531 8033 +8035 2 369.8072 334.866 22.453 0.1706 8034 +8036 2 370.2098 335.9333 22.4568 0.1811 8035 +8037 2 370.7441 336.9458 22.461 0.1556 8036 +8038 2 371.2463 337.9731 22.4651 0.1483 8037 +8039 2 371.7176 339.0152 22.4685 0.1429 8038 +8040 2 372.1684 340.0666 22.4705 0.1404 8039 +8041 2 372.5894 341.1294 22.4701 0.139 8040 +8042 2 372.9062 342.2287 22.4689 0.1406 8041 +8043 2 373.1579 343.3441 22.467 0.1537 8042 +8044 2 373.4577 344.4447 22.4629 0.171 8043 +8045 2 373.9107 345.4949 22.4581 0.1811 8044 +8046 2 374.2161 346.5851 22.4557 0.1556 8045 +8047 2 374.2116 347.7291 22.4552 0.1482 8046 +8048 2 374.2299 348.8731 22.4401 0.143 8047 +8049 2 374.2836 350.016 22.4144 0.1404 8048 +8050 2 374.3923 351.1542 22.398 0.1341 8049 +8051 2 342.9254 335.0536 23.0082 0.144 -1 +8052 2 343.7548 334.5925 22.5178 0.1147 8051 +8053 2 344.5579 334.0503 21.0307 0.1295 8052 +8054 2 344.7924 333.0287 20.1579 0.1271 8053 +8055 2 344.7421 331.9819 19.0973 0.1144 8054 +8056 2 344.6472 331.1422 17.2088 0.1144 8055 +8057 2 343.0719 335.3522 23.0057 0.1471 8051 +8058 2 343.6084 336.3623 23.0019 0.1564 8057 +8059 2 344.3863 337.1791 22.9991 0.1821 8058 +8060 2 345.4331 337.5898 22.9943 0.1773 8059 +8061 2 346.378 338.2042 22.9857 0.1638 8060 +8062 2 346.9031 339.204 22.972 0.1577 8061 +8063 2 347.6936 340.0162 22.9501 0.1838 8062 +8064 2 348.6432 340.6512 22.9204 0.1688 8063 +8065 2 349.5092 341.3971 22.8856 0.1515 8064 +8066 2 350.2894 342.2333 22.8518 0.1384 8065 +8067 2 351.224 342.8877 22.8313 0.1373 8066 +8068 2 352.3474 343.0536 22.8485 0.1373 8067 +8069 2 353.4091 343.4711 22.9275 0.1373 8068 +8070 2 353.774 344.535 23.0807 0.1373 8069 +8071 2 353.7877 345.6756 23.2816 0.1373 8070 +8072 2 353.8335 346.815 23.5217 0.1373 8071 +8073 2 353.9422 347.9476 23.7907 0.1374 8072 +8074 2 354.0039 349.0847 24.0699 0.1374 8073 +8075 2 354.0154 350.223 24.3493 0.1376 8074 +8076 2 354.0154 351.3613 24.6285 0.1379 8075 +8077 2 354.1046 352.4961 24.9101 0.1383 8076 +8078 2 354.3769 353.6024 25.1566 0.1391 8077 +8079 2 354.6114 354.7189 25.3612 0.1407 8078 +8080 2 354.8551 355.8343 25.5291 0.1434 8079 +8081 2 355.1537 356.9372 25.6672 0.1493 8080 +8082 2 355.4488 358.0423 25.782 0.1569 8081 +8083 2 355.7954 359.1313 25.8826 0.1865 8082 +8084 2 356.2931 360.1609 25.9782 0.1667 8083 +8085 2 356.6065 361.2603 26.07 0.1496 8084 +8086 2 356.9532 362.3494 26.1513 0.1364 8085 +8087 2 357.0504 363.4888 26.2185 0.1356 8086 +8088 2 357.2792 364.61 26.2721 0.1342 8087 +8089 2 357.7906 365.6327 26.3124 0.1313 8088 +8090 2 358.1109 366.7309 26.3418 0.1271 8089 +8091 2 358.1338 367.8749 26.3625 0.1144 8090 +8092 2 358.5925 368.9228 26.4006 0.1144 8091 +8093 2 342.8488 334.6726 23.0049 0.1413 8051 +8094 2 342.3546 333.643 22.9951 0.1393 8093 +8095 2 341.5801 332.8033 22.9909 0.1383 8094 +8096 2 340.9955 331.8206 22.987 0.1379 8095 +8097 2 340.5356 330.7739 22.9814 0.1376 8096 +8098 2 340.2164 329.6756 22.9769 0.1374 8097 +8099 2 339.9499 328.5625 22.985 0.1374 8098 +8100 2 339.5495 327.4917 23.015 0.1373 8099 +8101 2 339.1228 326.4301 23.0668 0.1373 8100 +8102 2 338.64 325.3936 23.1375 0.1373 8101 +8103 2 337.9696 324.4681 23.2263 0.1373 8102 +8104 2 337.337 323.5152 23.327 0.1373 8103 +8105 2 336.94 322.4433 23.4296 0.1373 8104 +8106 2 336.5591 321.3656 23.5254 0.1622 8105 +8107 2 335.74 320.5717 23.6171 0.1962 8106 +8108 2 335.0856 319.6336 23.7002 0.2357 8107 +8109 2 334.5674 318.6143 23.7742 0.1775 8108 +8110 2 333.9919 317.6259 23.8407 0.1616 8109 +8111 2 333.5263 316.5814 23.901 0.1499 8110 +8112 2 332.5139 316.0643 24.1326 0.1144 8111 +8113 2 346.8608 376.5121 18.0863 0.2502 -1 +8114 2 346.028 376.2399 17.6978 0.2295 8113 +8115 2 344.9572 375.8578 17.3989 0.2275 8114 +8116 2 343.8441 375.6255 17.0894 0.1773 8115 +8117 2 342.7538 375.3018 16.8071 0.1445 8116 +8118 2 341.7723 374.7218 16.588 0.1273 8117 +8119 2 341.1179 373.7928 16.2974 0.1144 8118 +8120 2 340.5505 372.8285 15.7119 0.1144 8119 +8121 2 347.3825 376.7467 18.3639 0.2355 8113 +8122 2 348.3972 377.059 19.2939 0.215 8121 +8123 2 348.9383 377.2226 21.455 0.2322 8122 +8124 2 349.4199 377.1905 21.7724 0.2685 8123 +8125 2 350.5479 377.115 22.17 0.2344 8124 +8126 2 351.6793 377.0327 22.5488 0.2016 8125 +8127 2 352.741 376.646 22.9269 0.2141 8126 +8128 2 353.6951 376.0317 23.2439 0.2312 8127 +8129 2 354.6549 375.4242 23.5798 0.2118 8128 +8130 2 355.6742 374.9357 23.9957 0.2021 8129 +8131 2 356.7564 374.66 24.5854 0.2555 8130 +8132 2 357.8478 374.6657 25.4062 0.2361 8131 +8133 2 358.9197 374.7161 26.3763 0.2497 8132 +8134 2 359.2435 375.6518 27.8628 0.2503 8133 +8135 2 359.2423 376.5076 29.5663 0.2621 8134 +8136 2 360.0122 376.6712 31.3088 0.1983 8135 +8137 2 360.7318 377.3164 32.625 0.168 8136 +8138 2 361.3827 378.14 33.7299 0.1942 8137 +8139 2 361.9673 378.9797 34.977 0.1895 8138 +8140 2 362.5954 379.8583 35.9013 0.2036 8139 +8141 2 363.2761 380.7495 36.4552 0.1759 8140 +8142 2 363.9659 381.6533 36.7643 0.1665 8141 +8143 2 364.6592 382.5616 36.8995 0.1687 8142 +8144 2 365.3524 383.4711 36.9074 0.1909 8143 +8145 2 366.0708 384.3623 36.8351 0.2595 8144 +8146 2 366.8877 385.1619 36.7651 0.2529 8145 +8147 2 367.7216 385.4056 34.6945 0.1345 8146 +8148 2 368.8416 385.4914 34.2706 0.1373 8147 +8149 2 369.9742 385.417 33.9192 0.1373 8148 +8150 2 371.1044 385.3152 33.5824 0.1373 8149 +8151 2 372.237 385.2111 33.2696 0.1373 8150 +8152 2 373.373 385.1345 32.9986 0.1373 8151 +8153 2 374.5136 385.1219 32.788 0.1373 8152 +8154 2 375.6553 385.1253 32.6197 0.1373 8153 +8155 2 376.7981 385.131 32.4845 0.1373 8154 +8156 2 377.8929 384.8187 32.4024 0.1373 8155 +8157 2 378.9534 384.3897 32.3697 0.1373 8156 +8158 2 380.0093 383.9504 32.3658 0.1373 8157 +8159 2 381.0653 383.51 32.3744 0.1373 8158 +8160 2 382.1257 383.0798 32.3705 0.1373 8159 +8161 2 383.1988 382.6852 32.307 0.1373 8160 +8162 2 384.2742 382.2996 32.1863 0.1373 8161 +8163 2 385.3495 381.9141 32.0312 0.1373 8162 +8164 2 386.4443 381.5881 31.8928 0.1373 8163 +8165 2 387.562 381.3467 31.8209 0.1373 8164 +8166 2 388.6843 381.1236 31.8186 0.1373 8165 +8167 2 389.8066 380.9017 31.8738 0.1373 8166 +8168 2 390.9345 380.7152 31.9777 0.1373 8167 +8169 2 392.0717 380.6031 32.0905 0.1373 8168 +8170 2 393.2111 380.5116 32.1882 0.1373 8169 +8171 2 394.3517 380.4235 32.2624 0.1373 8170 +8172 2 395.4934 380.3651 32.3084 0.1373 8171 +8173 2 396.6374 380.3514 32.3224 0.1373 8172 +8174 2 397.7665 380.5299 32.3044 0.1373 8173 +8175 2 398.2447 381.5423 32.2476 0.1373 8174 +8176 2 398.6531 382.6108 32.1616 0.1373 8175 +8177 2 399.0615 383.6782 32.0552 0.1373 8176 +8178 2 399.4688 384.7455 31.9362 0.1373 8177 +8179 2 399.8772 385.8129 31.8111 0.1373 8178 +8180 2 400.2845 386.8814 31.6851 0.1373 8179 +8181 2 401.2763 387.4339 31.5627 0.1373 8180 +8182 2 402.3093 387.9235 31.4468 0.1373 8181 +8183 2 403.3424 388.412 31.3359 0.1373 8182 +8184 2 404.3754 388.9017 31.2301 0.1373 8183 +8185 2 405.3878 389.4325 31.1321 0.1373 8184 +8186 2 406.3213 390.0937 31.054 0.1373 8185 +8187 2 407.3178 390.6543 30.9792 0.1373 8186 +8188 2 408.3611 391.1222 30.8986 0.1373 8187 +8189 2 409.4056 391.5878 30.8162 0.1374 8188 +8190 2 410.45 392.0511 30.7373 0.1375 8189 +8191 2 411.5929 392.0259 30.6844 0.1376 8190 +8192 2 412.7323 391.931 30.6572 0.1378 8191 +8193 2 413.8752 391.8829 30.6583 0.1384 8192 +8194 2 415.0077 392.0454 30.7037 0.1393 8193 +8195 2 416.1392 392.2101 30.7762 0.141 8194 +8196 2 417.2797 392.2993 30.8442 0.1442 8195 +8197 2 418.4237 392.3199 30.8862 0.1501 8196 +8198 2 419.562 392.2135 30.8823 0.162 8197 +8199 2 420.6957 392.0602 30.8344 0.178 8198 +8200 2 421.8283 391.8978 30.7633 0.2382 8199 +8201 2 422.9482 391.6656 30.7168 0.2006 8200 +8202 2 424.0682 391.4345 30.6961 0.1694 8201 +8203 2 425.1882 391.2022 30.6995 0.1525 8202 +8204 2 426.3082 390.97 30.7216 0.1525 8203 +8205 2 427.4281 390.7378 30.8 0.2288 8204 +8206 2 367.4883 385.7488 36.7231 0.21 8146 +8207 2 368.3062 386.5484 36.6873 0.1769 8206 +8208 2 369.1253 387.3481 36.6562 0.1767 8207 +8209 2 370.0142 388.0654 36.5831 0.2316 8208 +8210 2 370.8505 388.8445 36.4722 0.2002 8209 +8211 2 371.665 389.6453 36.3314 0.1663 8210 +8212 2 372.4784 390.4483 36.1682 0.141 8211 +8213 2 373.2906 391.2491 35.9876 0.1406 8212 +8214 2 374.1029 392.0522 35.7944 0.1435 8213 +8215 2 374.9151 392.853 35.5942 0.1485 8214 +8216 2 375.7274 393.655 35.3878 0.1587 8215 +8217 2 376.5396 394.4558 35.1778 0.1744 8216 +8218 2 377.2363 395.3515 34.8522 0.2218 8217 +8219 2 377.9993 396.1935 34.524 0.2264 8218 +8220 2 378.7967 397.0069 34.2759 0.2976 8219 +8221 2 379.5723 397.8454 34.1009 0.2275 8220 +8222 2 380.4921 398.5227 33.9881 0.1766 8221 +8223 2 381.5377 398.986 33.9284 0.1388 8222 +8224 2 382.3088 399.8303 33.9111 0.1391 8223 +8225 2 382.7046 400.9034 33.9094 0.1407 8224 +8226 2 383.1965 401.9364 33.9088 0.1435 8225 +8227 2 383.6793 402.9729 33.908 0.1494 8226 +8228 2 384.5293 403.7382 33.9066 0.1571 8227 +8229 2 385.5703 404.213 33.9049 0.1867 8228 +8230 2 386.5256 404.841 33.9024 0.1669 8229 +8231 2 387.3778 405.6052 33.899 0.1501 8230 +8232 2 388.2107 406.3888 33.8943 0.1374 8231 +8233 2 388.9817 407.2343 33.8876 0.1374 8232 +8234 2 389.6922 408.1312 33.878 0.1376 8233 +8235 2 390.1234 409.1905 33.8652 0.1379 8234 +8236 2 390.5502 410.2521 33.8467 0.1383 8235 +8237 2 391.0318 411.2897 33.8212 0.1392 8236 +8238 2 391.5146 412.3273 33.7854 0.1409 8237 +8239 2 391.8921 413.4061 33.735 0.1442 8238 +8240 2 392.2604 414.4895 33.665 0.1498 8239 +8241 2 392.4675 415.6141 33.57 0.1614 8240 +8242 2 392.6105 416.7478 33.4317 0.1769 8241 +8243 2 392.869 417.8586 33.2282 0.2361 8242 +8244 2 393.1688 418.2842 33.0428 0.2083 8243 +8245 2 393.806 419.2234 32.6841 0.1691 8244 +8246 2 394.3688 420.2038 32.2675 0.1417 8245 +8247 2 394.9935 421.1293 31.6677 0.1373 8246 +8248 2 395.5186 422.1177 31.1077 0.1373 8247 +8249 2 395.9899 423.1427 30.6446 0.1373 8248 +8250 2 396.3468 424.2192 30.2753 0.1373 8249 +8251 2 396.8708 425.2282 30.0009 0.1373 8250 +8252 2 397.5663 426.132 29.8166 0.1373 8251 +8253 2 398.3339 426.9786 29.708 0.1373 8252 +8254 2 399.1244 427.8045 29.643 0.1373 8253 +8255 2 399.9058 428.6396 29.6069 0.1373 8254 +8256 2 400.678 429.4851 29.5963 0.1373 8255 +8257 2 401.4479 430.3305 29.6108 0.1373 8256 +8258 2 402.2167 431.177 29.6509 0.1373 8257 +8259 2 402.9214 432.0774 29.7164 0.1373 8258 +8260 2 403.586 433.0074 29.8057 0.1373 8259 +8261 2 404.3342 433.8712 29.9174 0.1373 8260 +8262 2 405.1121 434.7097 30.0373 0.1373 8261 +8263 2 405.7471 435.6592 30.1437 0.1373 8262 +8264 2 406.3385 436.6373 30.2282 0.1373 8263 +8265 2 407.0764 437.5091 30.2904 0.1373 8264 +8266 2 407.8452 438.3556 30.3335 0.1373 8265 +8267 2 408.4149 439.3452 30.3691 0.1373 8266 +8268 2 408.9068 440.3782 30.3075 0.1373 8267 +8269 2 409.6767 441.2214 30.273 0.1373 8268 +8270 2 410.5198 441.9947 30.2985 0.1374 8269 +8271 2 411.2108 442.9042 30.396 0.1375 8270 +8272 2 411.689 443.9418 30.504 0.1376 8271 +8273 2 412.1615 444.9828 30.6166 0.1378 8272 +8274 2 412.6339 446.0239 30.7292 0.1384 8273 +8275 2 413.1053 447.0649 30.8193 0.1393 8274 +8276 2 413.5777 448.1071 30.8826 0.141 8275 +8277 2 414.0514 449.1481 30.9187 0.1443 8276 +8278 2 414.5238 450.1903 30.933 0.15 8277 +8279 2 414.9963 451.2314 30.9229 0.162 8278 +8280 2 415.2194 452.3525 30.8188 0.178 8279 +8281 2 415.4196 453.4759 30.6376 0.2384 8280 +8282 2 415.653 454.5936 30.4293 0.2014 8281 +8283 2 415.8875 455.709 30.2106 0.1715 8282 +8284 2 416.1231 456.8255 29.9947 0.154 8283 +8285 2 416.3599 457.9409 29.794 0.1654 8284 +8286 2 416.5956 459.0586 29.6198 0.2027 8285 +8287 2 416.2776 460.1317 29.4806 0.1942 8286 +8288 2 416.0614 461.2539 29.3762 0.2128 8287 +8289 2 416.249 462.3819 29.3278 0.193 8288 +8290 2 416.4446 463.5088 29.323 0.193 8289 +8291 2 416.6402 464.6367 29.349 0.2424 8290 +8292 2 416.575 465.7785 29.3849 0.2088 8291 +8293 2 416.4583 466.9167 29.4218 0.1826 8292 +8294 2 416.5029 468.0596 29.4596 0.1869 8293 +8295 2 416.7603 469.1738 29.5 0.1673 8294 +8296 2 417.0418 469.2985 28.8963 0.1485 8295 +8297 2 417.8449 469.6555 27.1072 0.1375 8296 +8298 2 418.6914 470.0318 25.5251 0.2031 8297 +8299 2 419.5574 470.6176 24.4949 0.2213 8298 +8300 2 420.1798 471.487 23.5733 0.1894 8299 +8301 2 420.9394 472.2238 22.7422 0.1709 8300 +8302 2 421.9907 472.4892 22.0662 0.1795 8301 +8303 2 423.1073 472.448 21.5422 0.2306 8302 +8304 2 424.1071 471.9881 21.1238 0.2371 8303 +8305 2 424.9525 471.2376 20.7829 0.2308 8304 +8306 2 425.8929 470.6244 20.4194 0.2211 8305 +8307 2 426.9614 470.2744 19.9805 0.189 8306 +8308 2 428.0791 470.1989 19.4914 0.1561 8307 +8309 2 429.167 470.4677 19.0351 0.1404 8308 +8310 2 430.287 470.4231 18.6434 0.1392 8309 +8311 2 431.0489 469.6257 18.4144 0.1409 8310 +8312 2 431.685 468.6762 18.3453 0.144 8311 +8313 2 432.313 467.721 18.3861 0.1495 8312 +8314 2 433.0875 466.8813 18.457 0.1609 8313 +8315 2 433.9181 466.0942 18.5142 0.1764 8314 +8316 2 434.7555 465.3151 18.5377 0.233 8315 +8317 2 435.8743 465.2671 18.5016 0.2011 8316 +8318 2 437.0091 465.4078 18.4143 0.1694 8317 +8319 2 438.1428 465.5542 18.2912 0.1484 8318 +8320 2 439.2754 465.7018 18.1434 0.1559 8319 +8321 2 440.408 465.8494 17.9757 0.1734 8320 +8322 2 441.5394 465.997 17.7913 0.1966 8321 +8323 2 442.68 466.0484 17.6048 0.2837 8322 +8324 2 443.7873 466.315 17.3543 0.2305 8323 +8325 2 444.881 466.6227 17.0476 0.1813 8324 +8326 2 446.0147 466.6994 16.7213 0.1471 8325 +8327 2 447.1496 466.6307 16.4141 0.1556 8326 +8328 2 448.2878 466.6216 16.1215 0.1686 8327 +8329 2 449.4032 466.8447 15.8361 0.2087 8328 +8330 2 450.4454 467.3011 15.5593 0.2048 8329 +8331 2 451.4693 467.8022 15.3065 0.2372 8330 +8332 2 452.4737 468.341 15.0866 0.2164 8331 +8333 2 453.4313 468.9599 14.84 0.3432 8332 +8334 2 416.988 470.16 29.54 0.1519 8295 +8335 2 417.2454 471.2742 29.5862 0.1393 8334 +8336 2 417.5028 472.3885 29.636 0.1394 8335 +8337 2 417.7591 473.5039 29.687 0.1412 8336 +8338 2 418.0165 474.6181 29.7377 0.1445 8337 +8339 2 418.2739 475.7324 29.7861 0.1505 8338 +8340 2 418.5313 476.8467 29.8315 0.1626 8339 +8341 2 418.7887 477.9621 29.8724 0.1795 8340 +8342 2 419.038 479.0786 29.9071 0.239 8341 +8343 2 419.2794 480.1963 29.9323 0.212 8342 +8344 2 419.5208 481.314 29.9449 0.1896 8343 +8345 2 419.7622 482.4328 29.9412 0.1797 8344 +8346 2 420.0036 483.5505 29.9183 0.236 8345 +8347 2 420.2049 484.6762 29.8402 0.2065 8346 +8348 2 420.3994 485.803 29.7083 0.1781 8347 +8349 2 420.5939 486.9276 29.5327 0.1644 8348 +8350 2 420.7872 488.0521 29.3224 0.1796 8349 +8351 2 420.9806 489.1755 29.087 0.2394 8350 +8352 2 421.0698 490.3104 28.8201 0.212 8351 +8353 2 421.095 491.4475 28.5261 0.1897 8352 +8354 2 421.1133 492.5847 28.2156 0.1802 8353 +8355 2 421.1396 493.7207 27.8953 0.2383 8354 +8356 2 421.5388 494.7823 27.5946 0.2084 8355 +8357 2 421.9724 495.8336 27.3132 0.1825 8356 +8358 2 422.4083 496.8861 27.048 0.1729 8357 +8359 2 422.8441 497.9386 26.7919 0.1963 8358 +8360 2 423.28 498.9922 26.5425 0.2677 8359 +8361 2 423.7731 500.0172 26.2709 0.2766 8360 +8362 2 424.2787 501.0377 25.9841 0.2463 8361 +8363 2 424.6265 502.1199 25.6812 0.2694 8362 +8364 2 424.567 503.2513 25.3531 0.2491 8363 +8365 2 424.6345 504.3907 25.1512 0.1981 8364 +8366 2 424.7363 505.5302 25.0805 0.1603 8365 +8367 2 424.837 506.6696 25.1234 0.1559 8366 +8368 2 424.9388 507.8079 25.2583 0.1736 8367 +8369 2 425.0395 508.9439 25.4635 0.1968 8368 +8370 2 425.1413 510.0787 25.7166 0.2857 8369 +8371 2 425.1642 511.5041 26.3297 0.1766 8370 +8372 2 425.1825 512.6367 26.7322 0.1381 8371 +8373 2 425.2008 513.7658 27.1699 0.1383 8372 +8374 2 425.2191 514.895 27.6246 0.1392 8373 +8375 2 425.2374 516.0229 28.0798 0.141 8374 +8376 2 425.2019 517.1544 28.4827 0.144 8375 +8377 2 425.1482 518.2892 28.8257 0.1501 8376 +8378 2 425.0944 519.4252 29.1217 0.1585 8377 +8379 2 425.0406 520.5635 29.384 0.1892 8378 +8380 2 424.9868 521.7018 29.6237 0.1717 8379 +8381 2 424.9331 522.84 29.8519 0.1587 8380 +8382 2 424.8782 523.9795 30.0796 0.1539 8381 +8383 2 424.8244 525.1177 30.3089 0.1653 8382 +8384 2 424.7706 526.2572 30.5388 0.2025 8383 +8385 2 424.0671 527.1964 30.1031 0.1162 8384 +8386 2 423.2159 527.956 29.9037 0.176 8385 +8387 2 422.3213 528.663 29.6548 0.2357 8386 +8388 2 421.405 529.3402 29.4266 0.196 8387 +8389 2 420.4761 530.0038 29.2466 0.1617 8388 +8390 2 419.546 530.6684 29.1119 0.1356 8389 +8391 2 418.6159 531.3331 29.0198 0.1342 8390 +8392 2 417.6858 531.9978 28.9626 0.1313 8391 +8393 2 416.7546 532.6624 28.9262 0.1271 8392 +8394 2 415.8246 533.3282 28.8968 0.1144 8393 +8395 2 414.8933 533.9929 28.84 0.1144 8394 +8396 2 425.6687 527.1335 31.045 0.1956 8384 +8397 2 426.5015 527.9114 31.2978 0.2099 8396 +8398 2 427.324 528.6996 31.5333 0.1902 8397 +8399 2 428.0299 529.5885 31.7442 0.1995 8398 +8400 2 428.4589 530.6455 31.9152 0.172 8399 +8401 2 428.7392 531.7529 32.0505 0.1618 8400 +8402 2 428.9382 532.8775 32.191 0.1617 8401 +8403 2 429.0194 534.0146 32.3901 0.1855 8402 +8404 2 429.1361 535.1472 32.6474 0.1672 8403 +8405 2 429.3924 536.2546 32.9414 0.1533 8404 +8406 2 429.7539 537.3334 33.2416 0.1471 8405 +8407 2 430.176 538.3893 33.5196 0.1555 8406 +8408 2 430.6222 539.4383 33.7548 0.1711 8407 +8409 2 431.018 540.508 33.9279 0.2001 8408 +8410 2 431.2583 541.6245 34.02 0.1951 8409 +8411 2 431.3727 542.7628 34.022 0.2059 8410 +8412 2 431.4779 543.9011 33.9357 0.2439 8411 +8413 2 431.6312 545.0313 33.7719 0.2179 8412 +8414 2 431.8714 546.1467 33.5482 0.2105 8413 +8415 2 432.1025 547.261 33.306 0.2299 8414 +8416 2 432.2066 548.397 33.1159 0.1934 8415 +8417 2 432.3714 549.5135 33.0238 0.165 8416 +8418 2 433.0006 550.4127 33.049 0.1534 8417 +8419 2 434.0302 550.9012 33.1999 0.1673 8418 +8420 2 435.0621 551.3737 33.4477 0.1997 8419 +8421 2 435.9784 552.0406 33.7154 0.2236 8420 +8422 2 436.6945 552.9101 33.9301 0.188 8421 +8423 2 437.0927 553.966 34.0654 0.1611 8422 +8424 2 437.2391 555.0997 34.1228 0.1526 8423 +8425 2 437.4004 556.2277 34.1242 0.1697 8424 +8426 2 437.7882 557.295 34.1256 0.178 8425 +8427 2 438.2527 558.3361 34.2216 0.1592 8426 +8428 2 438.5204 559.4354 34.4921 0.144 8427 +8429 2 438.6874 560.5463 34.9958 0.1373 8428 +8430 2 438.9013 561.6251 35.758 0.1373 8429 +8431 2 439.0375 562.6878 36.7206 0.1373 8430 +8432 2 439.0661 563.7426 37.795 0.1373 8431 +8433 2 439.2194 564.7802 38.8923 0.1373 8432 +8434 2 439.6369 565.7629 39.8555 0.1373 8433 +8435 2 439.9092 566.8234 40.6188 0.1373 8434 +8436 2 440.0236 567.9377 41.169 0.1373 8435 +8437 2 440.186 569.0588 41.5271 0.1373 8436 +8438 2 440.4091 570.1788 41.7068 0.1373 8437 +8439 2 440.7134 571.2804 41.725 0.1373 8438 +8440 2 441.0669 572.3661 41.6016 0.1373 8439 +8441 2 441.2831 573.4826 41.3504 0.1373 8440 +8442 2 441.3678 574.6118 40.9746 0.1373 8441 +8443 2 442.1114 575.3805 40.469 0.1373 8442 +8444 2 443.1341 575.8496 39.9711 0.1373 8443 +8445 2 443.8423 576.7224 39.51 0.1373 8444 +8446 2 444.3914 577.7143 39.1222 0.1374 8445 +8447 2 444.6259 578.8251 38.7923 0.1374 8446 +8448 2 444.7712 579.9542 38.5148 0.1376 8447 +8449 2 444.8822 581.0879 38.2693 0.1378 8448 +8450 2 444.9519 582.2262 38.0408 0.1383 8449 +8451 2 445.0869 583.3588 37.8202 0.1392 8450 +8452 2 445.3981 584.4559 37.6023 0.1409 8451 +8453 2 445.8626 585.4969 37.3828 0.1441 8452 +8454 2 446.5364 586.4167 37.1594 0.1497 8453 +8455 2 447.1496 587.3765 36.93 0.1615 8454 +8456 2 447.4767 588.469 36.6929 0.1771 8455 +8457 2 447.733 589.5798 36.4675 0.236 8456 +8458 2 447.765 590.7204 36.295 0.1965 8457 +8459 2 447.7673 591.8644 36.1948 0.163 8458 +8460 2 447.884 593.0016 36.1746 0.1383 8459 +8461 2 448.1048 594.1238 36.2267 0.1391 8460 +8462 2 448.5796 595.1637 36.332 0.1407 8461 +8463 2 449.2396 596.0949 36.4734 0.1435 8462 +8464 2 449.6069 597.1772 36.6411 0.1495 8463 +8465 2 449.9169 598.2742 36.8312 0.1588 8464 +8466 2 450.1629 599.329 37.7006 0.1669 8465 +8467 2 450.4546 600.4101 38.2634 0.1502 8466 +8468 2 450.7486 601.4935 38.8077 0.1375 8467 +8469 2 451.0414 602.5791 39.3221 0.1373 8468 +8470 2 451.3366 603.6671 39.795 0.1373 8469 +8471 2 451.6306 604.7596 40.2139 0.1373 8470 +8472 2 451.9258 605.8544 40.577 0.1373 8471 +8473 2 452.2198 606.9515 40.9198 0.1373 8472 +8474 2 452.5138 608.0486 41.2446 0.1373 8473 +8475 2 452.8078 609.148 41.5548 0.1373 8474 +8476 2 453.1029 610.2462 41.8513 0.1373 8475 +8477 2 453.3969 611.3456 42.1333 0.1373 8476 +8478 2 453.6921 612.445 42.4001 0.1373 8477 +8479 2 453.9872 613.5466 42.649 0.1373 8478 +8480 2 454.2824 614.6472 42.8767 0.1373 8479 +8481 2 454.8372 615.6447 43.0405 0.1373 8480 +8482 2 455.4207 616.6286 43.1463 0.1373 8481 +8483 2 456.0053 617.6113 43.209 0.1373 8482 +8484 2 456.5898 618.594 43.2401 0.1373 8483 +8485 2 457.1756 619.5767 43.2508 0.1373 8484 +8486 2 457.759 620.5605 43.2516 0.1374 8485 +8487 2 458.3447 621.5444 43.2516 0.1375 8486 +8488 2 458.9293 622.527 43.2513 0.1376 8487 +8489 2 459.5139 623.5097 43.251 0.1378 8488 +8490 2 460.0996 624.4936 43.2505 0.1384 8489 +8491 2 460.6842 625.4763 43.2499 0.1393 8490 +8492 2 461.2688 626.4601 43.2488 0.141 8491 +8493 2 461.8534 627.4428 43.2471 0.1442 8492 +8494 2 462.4334 628.4289 43.2454 0.1505 8493 +8495 2 462.9745 629.4368 43.244 0.1594 8494 +8496 2 463.5019 630.4527 43.2407 0.1908 8495 +8497 2 463.9892 631.4869 43.23 0.1759 8496 +8498 2 464.4743 632.5233 43.2211 0.1661 8497 +8499 2 464.9605 633.5586 43.2247 0.1677 8498 +8500 2 465.4467 634.594 43.2508 0.1887 8499 +8501 2 465.9329 635.6293 43.3073 0.2551 8500 +8502 2 466.0244 636.7653 43.472 0.2445 8501 +8503 2 465.8505 637.8898 43.7531 0.1909 8502 +8504 2 465.6778 639.0121 44.1106 0.1511 8503 +8505 2 465.505 640.1309 44.5029 0.1411 8504 +8506 2 465.33 641.2509 44.8918 0.1443 8505 +8507 2 465.1767 642.3743 45.2424 0.1507 8506 +8508 2 465.2854 643.476 45.4731 0.1634 8507 +8509 2 465.9306 644.4198 45.4532 0.1836 8508 +8510 2 466.5758 645.3613 45.2673 0.165 8509 +8511 2 467.2165 646.3039 45.0027 0.151 8510 +8512 2 467.8411 647.258 44.7885 0.146 8511 +8513 2 468.4508 648.2247 44.711 0.1537 8512 +8514 2 469.0617 649.1914 44.763 0.167 8513 +8515 2 469.6967 650.1386 44.9268 0.1971 8514 +8516 2 470.4483 650.9863 45.1718 0.2256 8515 +8517 2 471.3303 651.7048 45.4647 0.1898 8516 +8518 2 472.2112 652.4243 45.7685 0.1626 8517 +8519 2 473.0932 653.1439 46.06 0.1527 8518 +8520 2 473.9752 653.8635 46.3285 0.1687 8519 +8521 2 474.8069 654.6368 46.5461 0.1821 8520 +8522 2 475.5173 655.5314 46.667 0.1653 8521 +8523 2 476.1763 656.4661 46.6894 0.1539 8522 +8524 2 476.8352 657.4007 46.6354 0.1525 8523 +8525 2 477.4427 658.3663 46.5214 0.1686 8524 +8526 2 477.8751 659.4165 46.3588 0.1802 8525 +8527 2 478.1645 660.5193 46.1636 0.1623 8526 +8528 2 478.4551 661.6232 45.9508 0.1486 8527 +8529 2 478.7457 662.7261 45.7276 0.1437 8528 +8530 2 479.0351 663.8289 45.4986 0.1493 8529 +8531 2 479.3246 664.9317 45.267 0.1595 8530 +8532 2 479.614 666.0345 45.036 0.1783 8531 +8533 2 479.9034 667.1373 44.8078 0.2145 8532 +8534 2 480.194 668.239 44.5822 0.2742 8533 +8535 2 480.3725 669.3567 44.3624 0.2885 8534 +8536 2 480.3667 670.4973 44.1526 0.2194 8535 +8537 2 480.3473 671.639 43.9502 0.1701 8536 +8538 2 480.3278 672.7795 43.7508 0.1549 8537 +8539 2 480.3084 673.9201 43.5509 0.1694 8538 +8540 2 480.289 675.0618 43.3471 0.1989 8539 +8541 2 480.4045 676.1806 43.0984 0.2484 8540 +8542 2 480.7191 677.2755 42.8271 0.2279 8541 +8543 2 481.0268 678.3714 42.5594 0.1789 8542 +8544 2 481.3334 679.4674 42.2741 0.1483 8543 +8545 2 481.64 680.5633 41.9798 0.1432 8544 +8546 2 481.9466 681.6593 41.6867 0.148 8545 +8547 2 482.2532 682.7552 41.4028 0.1579 8546 +8548 2 482.5609 683.8512 41.1368 0.1722 8547 +8549 2 482.8698 684.9483 40.894 0.2186 8548 +8550 2 483.2805 686.011 40.7123 0.2084 8549 +8551 2 483.7324 687.0612 40.5952 0.1728 8550 +8552 2 484.1854 688.1114 40.5289 0.1448 8551 +8553 2 484.5355 689.1982 40.5017 0.1373 8552 +8554 2 484.7814 690.3148 40.5031 0.1373 8553 +8555 2 485.0022 691.437 40.5227 0.1373 8554 +8556 2 485.2242 692.5593 40.5524 0.1373 8555 +8557 2 485.3042 693.6964 40.5978 0.1373 8556 +8558 2 485.2299 694.8359 40.6655 0.1373 8557 +8559 2 485.1189 695.9741 40.752 0.1373 8558 +8560 2 485.0091 697.1124 40.8528 0.1374 8559 +8561 2 484.8981 698.2496 40.9637 0.1374 8560 +8562 2 484.7872 699.3878 41.0796 0.1376 8561 +8563 2 484.6773 700.525 41.197 0.1378 8562 +8564 2 484.5664 701.6632 41.3137 0.1382 8563 +8565 2 484.4554 702.8004 41.4285 0.1389 8564 +8566 2 484.3456 703.9387 41.5414 0.1403 8565 +8567 2 484.2346 705.0758 41.6508 0.1429 8566 +8568 2 484.1236 706.2141 41.7556 0.148 8567 +8569 2 484.0138 707.3524 41.8544 0.1554 8568 +8570 2 483.9028 708.4895 41.9462 0.1793 8569 +8571 2 483.8994 709.6312 42.0224 0.1741 8570 +8572 2 483.9955 710.7706 42.077 0.1577 8571 +8573 2 484.1145 711.9089 42.1137 0.1464 8572 +8574 2 484.2323 713.046 42.138 0.148 8573 +8575 2 484.3513 714.1843 42.1537 0.1554 8574 +8576 2 484.4691 715.3215 42.1616 0.1793 8575 +8577 2 484.1797 716.3991 42.1842 0.1734 8576 +8578 2 483.6649 717.4196 42.2201 0.1567 8577 +8579 2 483.1272 718.4297 42.2467 0.1452 8578 +8580 2 482.593 719.441 42.2388 0.1465 8579 +8581 2 482.3973 720.5495 42.0988 0.154 8580 +8582 2 482.3024 721.6821 41.8015 0.1696 8581 +8583 2 482.2086 722.8078 41.3515 0.1913 8582 +8584 2 482.1148 723.9221 40.7638 0.2638 8583 +8585 2 482.0564 725.0192 39.993 0.2391 8584 +8586 2 482.4042 725.8222 38.3505 0.1669 8585 +8587 2 482.8149 726.4858 36.3059 0.1374 8586 +8588 2 483.2142 727.131 34.2093 0.1374 8587 +8589 2 482.8092 726.5452 32.9706 0.2274 8588 +8590 2 482.2967 725.7833 34.5825 0.1727 8589 +8591 2 482.0438 724.6977 35.2089 0.1384 8590 +8592 2 481.8036 723.6143 35.8711 0.1144 8591 +8593 2 481.5805 722.6053 37.0734 0.1144 8592 +8594 2 483.2393 727.6172 33.4407 0.1375 8588 +8595 2 483.2942 728.6925 32.5805 0.1376 8594 +8596 2 483.3526 729.8194 32.1423 0.1379 8595 +8597 2 483.4121 730.9588 31.9466 0.1384 8596 +8598 2 483.6878 732.0616 31.8612 0.1394 8597 +8599 2 484.2724 733.0352 31.7556 0.1413 8598 +8600 2 484.9153 733.9778 31.5627 0.1446 8599 +8601 2 485.5571 734.9182 31.2945 0.1515 8600 +8602 2 486.1977 735.8574 30.9781 0.1614 8601 +8603 2 486.8361 736.7955 30.639 0.1927 8602 +8604 2 487.4767 737.7336 30.2988 0.1889 8603 +8605 2 488.0201 738.7311 29.9748 0.1977 8604 +8606 2 488.2741 739.834 29.6982 0.1722 8605 +8607 2 488.48 740.9551 29.4582 0.1532 8606 +8608 2 488.6859 742.0773 29.2438 0.1402 8607 +8609 2 488.8918 743.1985 29.0444 0.1391 8608 +8610 2 489.0989 744.3219 28.8515 0.1407 8609 +8611 2 489.3048 745.4441 28.6538 0.1436 8610 +8612 2 489.5107 746.5652 28.4421 0.1489 8611 +8613 2 489.7178 747.6875 28.2108 0.1595 8612 +8614 2 489.9226 748.8075 27.9567 0.1743 8613 +8615 2 490.1285 749.9275 27.6783 0.2262 8614 +8616 2 490.8915 750.7111 27.2923 0.2017 8615 +8617 2 491.7999 751.3781 26.8203 0.166 8616 +8618 2 492.7105 752.037 26.2963 0.1391 8617 +8619 2 493.4678 752.8641 25.7678 0.1373 8618 +8620 2 493.8648 753.9223 25.3506 0.1374 8619 +8621 2 494.2549 754.9885 25.0099 0.1374 8620 +8622 2 494.645 756.0582 24.7394 0.1375 8621 +8623 2 495.0363 757.1289 24.5186 0.1377 8622 +8624 2 495.4286 758.2009 24.3276 0.1382 8623 +8625 2 495.8199 759.2739 24.1473 0.1389 8624 +8626 2 496.2123 760.3459 23.9664 0.1402 8625 +8627 2 496.6035 761.4178 23.784 0.1427 8626 +8628 2 496.9959 762.4897 23.5996 0.1473 8627 +8629 2 497.3883 763.5617 23.4121 0.1562 8628 +8630 2 497.7796 764.6347 23.2209 0.1703 8629 +8631 2 498.172 765.7055 23.0246 0.2082 8630 +8632 2 498.323 766.8358 22.8166 0.2222 8631 +8633 2 498.3539 767.9752 22.5988 0.1921 8632 +8634 2 498.3802 769.1146 22.3679 0.1719 8633 +8635 2 498.4076 770.2541 22.123 0.1772 8634 +8636 2 498.4339 771.3935 21.8632 0.2065 8635 +8637 2 498.5335 772.5272 21.5758 0.286 8636 +8638 2 498.7806 773.6346 21.2453 0.3156 8637 +8639 2 499.0311 774.742 20.881 0.2745 8638 +8640 2 499.2816 775.8471 20.4921 0.1978 8639 +8641 2 499.531 776.951 20.0876 0.1578 8640 +8642 2 499.7804 778.0538 19.6759 0.151 8641 +8643 2 500.0298 779.1578 19.2658 0.1598 8642 +8644 2 500.0092 780.2892 18.855 0.1919 8643 +8645 2 499.8971 781.4161 18.4528 0.1773 8644 +8646 2 499.7839 782.5429 18.0648 0.1667 8645 +8647 2 499.7084 783.6743 17.7078 0.1805 8646 +8648 2 499.7747 784.8103 17.4229 0.1565 8647 +8649 2 499.8433 785.9486 17.196 0.127 8648 +8650 2 499.912 787.0823 16.8515 0.1144 8649 +8651 2 425.8643 511.201 25.1604 0.246 8370 +8652 2 426.4832 512.1596 25.0011 0.2322 8651 +8653 2 427.1021 513.1195 24.8426 0.1871 8652 +8654 2 427.721 514.0793 24.6559 0.1548 8653 +8655 2 428.3388 515.038 24.443 0.1399 8654 +8656 2 428.9565 515.9966 24.2088 0.1387 8655 +8657 2 429.6098 516.929 23.9331 0.1398 8656 +8658 2 430.3064 517.8247 23.5929 0.1421 8657 +8659 2 430.8247 518.828 23.1857 0.1463 8658 +8660 2 430.7606 519.94 22.738 0.1542 8659 +8661 2 430.3156 520.9822 22.4282 0.1696 8660 +8662 2 429.8363 522.0186 22.2341 0.1929 8661 +8663 2 429.7482 523.1535 22.1026 0.2616 8662 +8664 2 429.8614 524.2895 21.9943 0.2646 8663 +8665 2 429.9873 525.4255 21.8818 0.2268 8664 +8666 2 430.112 526.5615 21.7396 0.22 8665 +8667 2 430.2573 527.6894 21.4425 0.2174 8666 +8668 2 430.4071 528.8094 21.0053 0.1814 8667 +8669 2 430.6096 529.9157 20.4975 0.1532 8668 +8670 2 431.0237 530.9647 20.0332 0.1436 8669 +8671 2 431.439 532.0161 19.5988 0.1494 8670 +8672 2 431.8554 533.0685 19.1967 0.157 8671 +8673 2 432.2741 534.121 18.7983 0.1868 8672 +8674 2 432.6951 535.1724 18.3941 0.1671 8673 +8675 2 433.115 536.2225 17.9764 0.1503 8674 +8676 2 433.5337 537.2716 17.5409 0.1379 8675 +8677 2 433.9535 538.3206 17.0962 0.1384 8676 +8678 2 434.3722 539.3685 16.643 0.1394 8677 +8679 2 434.7909 540.4176 16.1973 0.1413 8678 +8680 2 435.2108 541.4678 15.7692 0.1441 8679 +8681 2 435.6306 542.5191 15.3662 0.1525 8680 +8682 2 436.0516 543.5705 14.9872 0.154 8681 +8683 2 436.4623 544.5989 14.28 0.2288 8682 +8684 2 417.0658 459.6237 29.5386 0.1376 8286 +8685 2 417.7934 460.4978 29.787 0.1418 8684 +8686 2 418.5232 461.3741 29.9858 0.1566 8685 +8687 2 419.2531 462.2515 30.1633 0.1821 8686 +8688 2 419.8537 463.217 30.3943 0.1762 8687 +8689 2 420.2793 464.2684 30.6914 0.1624 8688 +8690 2 420.6419 465.3437 31.047 0.1563 8689 +8691 2 420.9966 466.4191 31.4434 0.1652 8690 +8692 2 421.5125 467.4178 31.8968 0.1992 8691 +8693 2 422.3717 468.1065 32.4495 0.2044 8692 +8694 2 423.3303 468.6774 33.0596 0.2258 8693 +8695 2 424.3485 469.1567 33.5594 0.2328 8694 +8696 2 425.3987 469.5857 33.913 0.2143 8695 +8697 2 426.458 470.0078 34.1404 0.2059 8696 +8698 2 427.5139 470.446 34.2695 0.2557 8697 +8699 2 428.5275 470.9734 34.3459 0.2589 8698 +8700 2 429.5331 471.519 34.4028 0.2179 8699 +8701 2 430.5375 472.0647 34.4677 0.2018 8700 +8702 2 431.5431 472.6104 34.5481 0.1725 8701 +8703 2 432.5475 473.1561 34.641 0.1553 8702 +8704 2 433.552 473.7018 34.7418 0.1448 8703 +8705 2 434.5564 474.2486 34.8474 0.1489 8704 +8706 2 435.5608 474.7943 34.9574 0.1567 8705 +8707 2 436.5618 475.3446 35.072 0.1842 8706 +8708 2 437.3752 476.1408 35.2083 0.1708 8707 +8709 2 438.144 476.9851 35.3598 0.1551 8708 +8710 2 438.9105 477.8316 35.5158 0.1445 8709 +8711 2 439.6758 478.6793 35.6647 0.1488 8710 +8712 2 440.4423 479.527 35.7966 0.1563 8711 +8713 2 441.3369 480.2363 35.8831 0.1838 8712 +8714 2 442.4226 480.5738 35.882 0.1687 8713 +8715 2 443.5299 480.8598 35.8044 0.1515 8714 +8716 2 444.6362 481.1435 35.6692 0.1384 8715 +8717 2 445.7424 481.4272 35.4945 0.1373 8716 +8718 2 446.8475 481.7109 35.2974 0.1373 8717 +8719 2 447.9526 481.9947 35.093 0.1373 8718 +8720 2 449.0578 482.2784 34.8916 0.1373 8719 +8721 2 450.164 482.5621 34.6956 0.1374 8720 +8722 2 451.2691 482.8446 34.5072 0.1374 8721 +8723 2 452.3754 483.1284 34.3302 0.1376 8722 +8724 2 453.4816 483.4121 34.1692 0.1378 8723 +8725 2 454.589 483.6958 34.0304 0.1383 8724 +8726 2 455.6952 483.9806 33.9175 0.139 8725 +8727 2 456.7935 484.2998 33.8386 0.1406 8726 +8728 2 457.6378 485.0583 33.8579 0.1434 8727 +8729 2 458.45 485.8625 33.9601 0.1491 8728 +8730 2 459.2611 486.6668 34.1197 0.1569 8729 +8731 2 460.1351 487.4012 34.2994 0.1855 8730 +8732 2 461.0629 488.0659 34.4697 0.1689 8731 +8733 2 461.9952 488.726 34.6167 0.1525 8732 +8734 2 462.9288 489.3872 34.7301 0.1409 8733 +8735 2 463.8611 490.0473 34.8104 0.1426 8734 +8736 2 464.7958 490.7085 34.8586 0.147 8735 +8737 2 465.7659 491.3148 34.8566 0.1559 8736 +8738 2 466.7726 491.8559 34.7883 0.1691 8737 +8739 2 467.7816 492.3925 34.6716 0.2094 8738 +8740 2 468.5847 493.199 34.4666 0.2075 8739 +8741 2 469.3958 493.9998 34.2227 0.2499 8740 +8742 2 470.3888 494.5649 34.0701 0.2004 8741 +8743 2 471.3852 495.1255 33.9951 0.1687 8742 +8744 2 472.3816 495.6872 33.9783 0.1486 8743 +8745 2 473.1321 496.5498 33.9268 0.1553 8744 +8746 2 473.8334 497.4524 33.8512 0.1836 8745 +8747 2 474.498 498.3836 33.7509 0.1609 8746 +8748 2 475.1261 499.3377 33.6244 0.1398 8747 +8749 2 475.785 500.2712 33.4905 0.1144 8748 +8750 2 476.5561 501.1063 33.1696 0.1144 8749 +8751 2 391.6678 418.6662 34.2404 0.2134 8243 +8752 2 390.7218 419.3023 34.4812 0.159 8751 +8753 2 389.778 419.9361 34.7774 0.1373 8752 +8754 2 388.9039 420.6259 35.1358 0.1373 8753 +8755 2 388.5585 421.6784 35.6168 0.1373 8754 +8756 2 388.6179 422.7984 36.1715 0.1373 8755 +8757 2 388.7198 423.9081 36.7942 0.1373 8756 +8758 2 388.8216 425.0143 37.4657 0.1373 8757 +8759 2 388.6854 426.0073 38.1833 0.1373 8758 +8760 2 387.7519 426.5793 38.9404 0.1373 8759 +8761 2 387.0907 426.9225 40.339 0.1373 8760 +8762 2 387.7611 426.807 40.7971 0.1373 8761 +8763 2 388.8628 426.6182 41.386 0.1373 8762 +8764 2 389.9839 426.5026 41.841 0.1373 8763 +8765 2 391.1153 426.4843 42.2486 0.1373 8764 +8766 2 392.2479 426.5038 42.6474 0.1373 8765 +8767 2 393.3747 426.5804 43.0634 0.1373 8766 +8768 2 393.8941 427.3229 43.5781 0.1373 8767 +8769 2 394.1229 428.4086 44.249 0.1373 8768 +8770 2 394.4558 429.445 45.099 0.1373 8769 +8771 2 394.8173 430.4597 46.0382 0.1373 8770 +8772 2 395.1788 431.4756 46.975 0.1373 8771 +8773 2 395.5792 431.7239 49.1117 0.1214 8772 +8774 2 396.3171 431.8474 51.1042 0.1276 8773 +8775 2 397.1293 432.2844 52.4334 0.1369 8774 +8776 2 396.7815 433.0829 53.4996 0.1364 8775 +8777 2 396.0139 433.8242 54.5056 0.1356 8776 +8778 2 394.9649 434.1732 55.2238 0.1342 8777 +8779 2 393.838 434.2613 55.6466 0.1314 8778 +8780 2 392.6997 434.3516 55.8155 0.1271 8779 +8781 2 391.5592 434.4409 55.7976 0.1144 8780 +8782 2 390.4278 434.5301 55.44 0.1144 8781 +8783 2 395.2497 431.7914 47.1562 0.1373 8772 +8784 2 395.4934 432.8907 47.6294 0.1373 8783 +8785 2 395.7405 434.0039 47.8002 0.1373 8784 +8786 2 395.9887 435.1204 47.7635 0.1373 8785 +8787 2 396.5504 436.0013 47.549 0.1373 8786 +8788 2 397.6064 436.3799 47.206 0.1373 8787 +8789 2 398.716 436.6099 46.825 0.1373 8788 +8790 2 399.8234 436.8387 46.4139 0.1373 8789 +8791 2 400.9308 437.0686 45.9754 0.1373 8790 +8792 2 402.0394 437.2757 45.5185 0.1373 8791 +8793 2 403.1548 437.445 45.054 0.1373 8792 +8794 2 404.2713 437.5903 44.5648 0.1373 8793 +8795 2 405.381 437.7264 43.9718 0.1373 8794 +8796 2 405.9495 437.1693 43.099 0.1373 8795 +8797 2 405.7448 436.1088 42.2537 0.1373 8796 +8798 2 406.7172 436.412 41.4448 0.1373 8797 +8799 2 407.7445 436.7781 40.6008 0.1373 8798 +8800 2 408.7787 437.0961 39.695 0.1373 8799 +8801 2 409.8208 437.2734 38.6232 0.1373 8800 +8802 2 410.4981 437.5869 37.4284 0.1374 8801 +8803 2 409.6595 438.2378 36.4078 0.1374 8802 +8804 2 408.7409 438.8304 35.5947 0.1377 8803 +8805 2 407.8703 439.5134 34.8821 0.1379 8804 +8806 2 406.9803 440.1746 34.195 0.1384 8805 +8807 2 406.0582 440.7043 33.3295 0.1396 8806 +8808 2 405.6418 441.2008 31.4488 0.1439 8807 +8809 2 405.8489 442.2475 30.4368 0.1497 8808 +8810 2 406.0628 443.308 29.5257 0.1572 8809 +8811 2 406.2973 444.3776 28.719 0.1861 8810 +8812 2 406.5902 445.4461 28.0165 0.1684 8811 +8813 2 406.8876 446.5215 27.4079 0.152 8812 +8814 2 407.4024 447.5202 26.8801 0.1402 8813 +8815 2 408.2044 448.3061 26.3932 0.1416 8814 +8816 2 409.2946 448.5452 25.9003 0.1453 8815 +8817 2 410.3928 448.3222 25.4057 0.1521 8816 +8818 2 411.4968 448.1105 24.8799 0.1647 8817 +8819 2 412.6099 448.1048 24.2522 0.1913 8818 +8820 2 413.556 448.1048 22.68 0.2288 8819 +8821 2 386.3357 427.0518 41.7673 0.117 8761 +8822 2 385.2489 427.2382 42.3934 0.1346 8821 +8823 2 384.1541 427.5471 42.635 0.1373 8822 +8824 2 383.534 428.46 42.9288 0.1373 8823 +8825 2 383.1153 429.5148 43.2793 0.1373 8824 +8826 2 382.9769 430.6371 43.6822 0.1373 8825 +8827 2 383.1874 431.7456 44.1126 0.1373 8826 +8828 2 383.0673 432.869 44.5164 0.1373 8827 +8829 2 382.2584 433.6698 44.8092 0.1373 8828 +8830 2 381.4462 434.4706 45.0134 0.1373 8829 +8831 2 380.6317 435.2737 45.1478 0.1373 8830 +8832 2 379.8183 436.0756 45.2326 0.1373 8831 +8833 2 379.0038 436.8787 45.2892 0.1373 8832 +8834 2 378.1892 437.6818 45.3379 0.1372 8833 +8835 2 377.3736 438.4849 45.3933 0.1372 8834 +8836 2 376.559 439.288 45.4572 0.1371 8835 +8837 2 375.7022 440.0442 45.5347 0.1368 8836 +8838 2 374.7195 440.6288 45.6414 0.1364 8837 +8839 2 373.7368 441.2122 45.7727 0.1356 8838 +8840 2 372.7552 441.7968 45.9194 0.1342 8839 +8841 2 371.7737 442.3802 46.0715 0.1313 8840 +8842 2 370.7921 442.9648 46.2216 0.1271 8841 +8843 2 369.8094 443.5482 46.3632 0.1144 8842 +8844 2 368.8313 444.1305 46.6368 0.1144 8843 +8845 2 359.9882 374.5719 25.576 0.128 8133 +8846 2 361.1116 374.4015 25.3359 0.1348 8845 +8847 2 362.2304 374.1818 25.1203 0.1373 8846 +8848 2 363.3504 373.9736 24.8478 0.1373 8847 +8849 2 364.4715 374.0422 24.3814 0.1373 8848 +8850 2 365.5686 374.2996 23.8951 0.1373 8849 +8851 2 366.6966 374.4301 23.555 0.1374 8850 +8852 2 367.8074 374.6726 23.2565 0.1374 8851 +8853 2 369.0681 375.0535 22.7517 0.1376 8852 +8854 2 370.0703 375.5969 22.5297 0.1379 8853 +8855 2 371.0301 376.2147 22.3303 0.1383 8854 +8856 2 372.046 376.781 21.9369 0.1402 8855 +8857 2 372.9257 377.4971 21.6973 0.1426 8856 +8858 2 373.627 378.3872 21.4565 0.1476 8857 +8859 2 373.9793 379.4465 21.1276 0.1551 8858 +8860 2 373.7562 380.5184 20.615 0.1822 8859 +8861 2 373.1888 381.4885 20.1431 0.1695 8860 +8862 2 372.5871 382.4472 19.7399 0.1523 8861 +8863 2 371.9888 383.4116 19.3739 0.139 8862 +8864 2 371.6433 384.4915 19.116 0.1376 8863 +8865 2 371.3767 385.6024 18.9813 0.1378 8864 +8866 2 371.1159 386.7166 18.944 0.1383 8865 +8867 2 370.8551 387.8297 18.9678 0.1391 8866 +8868 2 370.4352 388.8914 19.0466 0.1407 8867 +8869 2 369.6298 389.6853 19.1918 0.1436 8868 +8870 2 368.7478 390.4106 19.379 0.1496 8869 +8871 2 367.8646 391.1313 19.587 0.1577 8870 +8872 2 366.8236 391.5855 19.8183 0.1869 8871 +8873 2 365.6933 391.5569 20.0685 0.1733 8872 +8874 2 364.555 391.4768 20.3022 0.1601 8873 +8875 2 363.4133 391.51 20.3916 0.1556 8874 +8876 2 362.2728 391.5935 20.2969 0.1681 8875 +8877 2 361.1333 391.5992 20.0399 0.2067 8876 +8878 2 360.0282 391.3635 19.6118 0.2077 8877 +8879 2 358.9311 391.1222 19.0833 0.2187 8878 +8880 2 357.8398 390.8831 18.4921 0.3016 8879 +8881 2 356.8182 390.66 17.36 0.2288 8880 +8882 2 371.1136 375.9161 22.3954 0.1308 8855 +8883 2 371.4042 374.8316 22.2204 0.1257 8882 +8884 2 371.6799 373.754 21.6067 0.1456 8883 +8885 2 371.9865 372.6637 21.2169 0.1522 8884 +8886 2 371.991 371.6341 20.5512 0.1723 8885 +8887 2 371.2406 370.918 19.5888 0.172 8886 +8888 2 370.7944 369.9799 18.7407 0.1531 8887 +8889 2 370.6915 368.8817 18.0608 0.1389 8888 +8890 2 370.6606 367.7605 17.5072 0.1346 8889 +8891 2 370.5233 366.6531 16.9113 0.1316 8890 +8892 2 370.4055 365.5366 16.3799 0.1273 8891 +8893 2 370.3094 364.4258 15.7675 0.1144 8892 +8894 2 370.267 363.4923 14.152 0.1144 8893 +8895 2 368.4961 373.6807 22.0622 0.2696 8852 +8896 2 368.4286 372.6397 21.0778 0.232 8895 +8897 2 367.9676 371.6559 20.2166 0.215 8896 +8898 2 367.8486 370.5862 19.2791 0.1763 8897 +8899 2 368.1861 369.5772 18.2569 0.143 8898 +8900 2 368.2742 368.5121 17.3099 0.126 8899 +8901 2 367.9482 367.4757 16.4471 0.1144 8900 +8902 2 367.5535 366.549 15.12 0.1144 8901 +8903 2 348.3183 376.6814 21.0832 0.2297 8123 +8904 2 347.4488 376.0031 20.3554 0.1967 8903 +8905 2 346.5233 375.4654 19.3968 0.1652 8904 +8906 2 345.5738 375.0478 18.2246 0.1519 8905 +8907 2 344.5865 374.7218 17.0594 0.161 8906 +8908 2 343.5535 374.4609 16.0401 0.1786 8907 +8909 2 342.4816 374.263 15.2713 0.2317 8908 +8910 2 341.4268 373.8409 14.9701 0.197 8909 +8911 2 340.4006 373.3444 14.7382 0.1717 8910 +8912 2 339.3916 372.8136 14.5146 0.165 8911 +8913 2 338.3666 372.3262 14.2319 0.1979 8912 +8914 2 337.3164 371.903 14.0459 0.2288 8913 +8915 2 404.73 327.3567 18.086 0.1144 -1 +8916 2 403.6512 327.7228 17.8831 0.1145 8915 +8917 2 403.0609 328.7021 17.8875 0.1271 8916 +8918 2 402.6251 329.7603 17.9527 0.1314 8917 +8919 2 402.1183 330.7842 18.0792 0.1342 8918 +8920 2 401.4662 331.7211 18.2614 0.1356 8919 +8921 2 400.6116 332.475 18.4665 0.1364 8920 +8922 2 399.566 332.9326 18.6448 0.1368 8921 +8923 2 398.4644 333.2197 18.7884 0.1371 8922 +8924 2 397.6384 333.9965 18.8953 0.1372 8923 +8925 2 397.3272 335.0959 18.9636 0.1372 8924 +8926 2 397.0275 336.1987 19.0014 0.1373 8925 +8927 2 396.507 337.2169 19.0139 0.1373 8926 +8928 2 395.951 338.2167 19.0025 0.1373 8927 +8929 2 395.3424 339.1857 18.9659 0.1373 8928 +8930 2 394.672 340.1112 18.9032 0.1373 8929 +8931 2 393.9204 340.9726 18.8154 0.1373 8930 +8932 2 393.0841 341.7517 18.7052 0.1373 8931 +8933 2 392.138 342.3889 18.5819 0.1373 8932 +8934 2 391.0707 342.7904 18.4565 0.1373 8933 +8935 2 389.9358 342.9151 18.3236 0.1373 8934 +8936 2 388.793 342.9518 18.188 0.1373 8935 +8937 2 387.6513 343.0009 18.0582 0.1373 8936 +8938 2 386.513 343.0948 17.9373 0.1373 8937 +8939 2 385.3919 343.3178 17.8319 0.1373 8938 +8940 2 384.2868 343.6038 17.8099 0.1373 8939 +8941 2 383.1531 343.7297 17.9528 0.1373 8940 +8942 2 382.0113 343.7194 18.1114 0.1373 8941 +8943 2 380.8731 343.8063 18.2408 0.1373 8942 +8944 2 379.7531 344.0305 18.3598 0.1373 8943 +8945 2 378.6651 344.376 18.4455 0.1373 8944 +8946 2 377.6882 344.9252 18.4545 0.1373 8945 +8947 2 377.075 345.8747 18.3894 0.1373 8946 +8948 2 376.6998 346.9546 18.3326 0.141 8947 +8949 2 376.2742 348.0151 18.2994 0.155 8948 +8950 2 375.8463 349.0767 18.2277 0.1729 8949 +8951 2 375.3315 350.0903 18.108 0.1773 8950 +8952 2 374.6406 350.9998 18.004 0.1545 8951 +8953 2 373.8958 351.8669 17.966 0.1474 8952 +8954 2 373.19 352.7673 17.9902 0.1425 8953 +8955 2 372.4212 353.5921 18.0816 0.1401 8954 +8956 2 371.4168 354.1058 18.2797 0.1388 8955 +8957 2 370.3254 354.4249 18.6015 0.1381 8956 +8958 2 369.2329 354.5565 19.0951 0.1377 8957 +8959 2 368.1095 354.4558 19.5373 0.1374 8958 +8960 2 366.9895 354.6652 19.5969 0.1374 8959 +8961 2 365.8638 354.8654 19.5388 0.1373 8960 +8962 2 364.7266 354.9821 19.4148 0.1373 8961 +8963 2 363.5849 355.0107 19.269 0.1492 8962 +8964 2 362.4421 354.9809 19.1676 0.1664 8963 +8965 2 361.3015 354.9054 19.1852 0.1866 8964 +8966 2 360.1781 355.1193 19.2344 0.1572 8965 +8967 2 359.1256 355.5678 19.2475 0.1624 8966 +8968 2 358.0697 356.0036 19.2599 0.1737 8967 +8969 2 357.1511 356.6843 19.2835 0.1889 8968 +8970 2 356.3549 357.5011 19.3165 0.1585 8969 +8971 2 355.3035 357.945 19.3623 0.1499 8970 +8972 2 354.1687 358.0766 19.4245 0.1438 8971 +8973 2 353.051 358.3191 19.5106 0.1408 8972 +8974 2 351.939 358.5845 19.6207 0.1392 8973 +8975 2 350.8248 358.8373 19.7516 0.1383 8974 +8976 2 349.7517 359.2274 19.8966 0.1378 8975 +8977 2 348.7358 359.74 20.0375 0.1387 8976 +8978 2 347.9259 360.5419 20.2078 0.1546 8977 +8979 2 347.2337 361.4354 20.5884 0.1859 8978 +8980 2 346.5828 362.3689 20.8821 0.1581 8979 +8981 2 346.1893 363.4396 21.0166 0.1496 8980 +8982 2 345.4239 364.2851 21.1488 0.1685 8981 +8983 2 344.2982 364.4349 21.2664 0.1993 8982 +8984 2 343.2503 364.8902 21.3602 0.2371 8983 +8985 2 342.3328 365.5709 21.4744 0.1173 8984 +8986 2 373.27 364.4246 34.7637 0.1373 -1 +8987 2 372.4349 364.7278 34.4285 0.1274 8986 +8988 2 371.3664 365.1145 34.0934 0.139 8987 +8989 2 370.2945 365.4908 33.7812 0.1406 8988 +8990 2 369.2043 365.8295 33.6552 0.1434 8989 +8991 2 368.1072 366.1486 33.7761 0.149 8990 +8992 2 367.0169 366.4632 34.1152 0.1576 8991 +8993 2 365.937 366.7744 34.6251 0.1828 8992 +8994 2 364.8925 367.1073 35.4102 0.1822 8993 +8995 2 363.9407 367.4803 36.6422 0.1705 8994 +8996 2 363.0999 368.1506 37.5925 0.1858 8995 +8997 2 362.2899 368.8954 38.3603 0.1667 8996 +8998 2 361.4708 369.6504 38.9978 0.1502 8997 +8999 2 360.6437 370.4112 39.5125 0.1377 8998 +9000 2 359.8109 371.1788 39.9132 0.1379 8999 +9001 2 358.8751 371.824 40.2335 0.1384 9000 +9002 2 357.8043 372.2073 40.5191 0.1393 9001 +9003 2 356.7347 372.6008 40.7728 0.1413 9002 +9004 2 355.6925 373.0664 40.9469 0.144 9003 +9005 2 354.648 373.5309 41.0584 0.1525 9004 +9006 2 353.6024 373.9953 41.1222 0.1525 9005 +9007 2 352.5579 374.4609 41.16 0.2288 9006 +9008 2 373.4691 364.3766 34.7894 0.1373 8986 +9009 2 374.5788 364.1089 34.9742 0.1373 9008 +9010 2 375.637 363.8526 34.9695 0.1373 9009 +9011 2 376.4858 363.6479 33.1598 0.1373 9010 +9012 2 377.369 363.7623 34.1544 0.1373 9011 +9013 2 378.4558 364.0677 34.4551 0.1373 9012 +9014 2 379.5163 364.4933 34.4781 0.1373 9013 +9015 2 380.5756 364.4864 34.1936 0.1373 9014 +9016 2 381.3604 363.7211 33.747 0.1373 9015 +9017 2 382.0949 362.8574 33.3777 0.1373 9016 +9018 2 382.994 362.1721 33.0809 0.1373 9017 +9019 2 384.0431 361.7488 32.7751 0.1373 9018 +9020 2 385.1551 361.5154 32.4842 0.1373 9019 +9021 2 386.2705 361.2809 32.2647 0.1373 9020 +9022 2 387.3687 360.9686 32.1056 0.1373 9021 +9023 2 388.4315 360.551 31.9847 0.1373 9022 +9024 2 389.5 360.1426 31.8914 0.1373 9023 +9025 2 390.5936 359.8132 31.799 0.1373 9024 +9026 2 391.709 359.5649 31.6487 0.1373 9025 +9027 2 392.8404 359.407 31.5333 0.1373 9026 +9028 2 393.9581 359.6118 31.4871 0.1373 9027 +9029 2 395.0644 359.9035 31.4541 0.1373 9028 +9030 2 396.1683 360.2044 31.3718 0.1373 9029 +9031 2 397.2643 360.527 31.2435 0.1373 9030 +9032 2 398.3511 360.8782 31.082 0.1373 9031 +9033 2 399.3841 361.3644 30.9288 0.1373 9032 +9034 2 400.4561 361.7603 30.7938 0.1373 9033 +9035 2 401.592 361.8186 30.6169 0.1373 9034 +9036 2 402.7292 361.7339 30.3803 0.1373 9035 +9037 2 403.8617 361.6298 30.0821 0.1374 9036 +9038 2 404.9909 361.5154 29.727 0.1374 9037 +9039 2 406.1166 361.4045 29.3177 0.1376 9038 +9040 2 407.2457 361.3736 28.8677 0.1378 9039 +9041 2 408.3725 361.3702 28.3914 0.1383 9040 +9042 2 409.4982 361.3702 27.8974 0.1391 9041 +9043 2 410.6239 361.3702 27.3876 0.1407 9042 +9044 2 411.6753 361.7488 26.8241 0.1437 9043 +9045 2 412.5081 362.5016 26.2835 0.1489 9044 +9046 2 412.9829 363.5209 25.7704 0.1595 9045 +9047 2 413.0549 364.6454 25.2972 0.175 9046 +9048 2 413.0561 365.7768 24.8788 0.224 9047 +9049 2 413.1053 366.9094 24.515 0.2162 9048 +9050 2 413.7425 367.7788 23.5922 0.3432 9049 +9051 2 375.6232 363.4374 31.9234 0.1166 9011 +9052 2 374.6394 363.2646 30.5631 0.1373 9051 +9053 2 373.6235 363.1445 29.3124 0.1373 9052 +9054 2 372.5974 363.0106 28.1232 0.1373 9053 +9055 2 371.5769 362.9409 26.8717 0.1373 9054 +9056 2 370.6045 362.8047 25.5287 0.1373 9055 +9057 2 369.7454 362.3231 24.1114 0.1373 9056 +9058 2 369.1253 361.6195 22.7828 0.1373 9057 +9059 2 369.0189 360.5934 21.6338 0.1373 9058 +9060 2 369.3084 360.2914 19.6728 0.1373 9059 +9061 2 370.076 360.8656 18.5187 0.1373 9060 +9062 2 371.0907 361.2317 18.0758 0.1373 9061 +9063 2 372.221 361.1368 17.8647 0.1373 9062 +9064 2 373.3547 361.0144 17.7151 0.1373 9063 +9065 2 374.4918 360.9045 17.5963 0.1373 9064 +9066 2 375.5821 360.5934 17.4892 0.1373 9065 +9067 2 376.6151 360.1072 17.3818 0.1373 9066 +9068 2 377.7008 359.7949 17.2899 0.1373 9067 +9069 2 378.7635 360.0591 17.2882 0.1373 9068 +9070 2 379.7668 360.6048 17.4185 0.1373 9069 +9071 2 380.761 361.1654 17.6139 0.1374 9070 +9072 2 381.7425 361.7259 18.026 0.1374 9071 +9073 2 382.3294 362.6652 18.5489 0.1376 9072 +9074 2 382.8442 363.6776 18.8854 0.1378 9073 +9075 2 383.2892 364.7312 18.9613 0.1383 9074 +9076 2 383.0181 365.6853 19.6948 0.115 9075 +9077 2 382.9883 366.8133 19.2775 0.1356 9076 +9078 2 383.2274 367.9264 19.0683 0.1356 9077 +9079 2 383.4105 369.0498 18.7839 0.1342 9078 +9080 2 383.4596 370.1835 18.4455 0.1313 9079 +9081 2 384.0042 371.1822 18.1502 0.127 9080 +9082 2 384.9766 371.7737 17.8879 0.1144 9081 +9083 2 386.076 372.0116 17.3737 0.1144 9082 +9084 2 383.4608 364.6317 18.8742 0.1389 9075 +9085 2 384.4732 364.1272 18.4632 0.1408 9084 +9086 2 385.3919 363.4831 17.921 0.1437 9085 +9087 2 386.1892 362.7029 17.3161 0.1492 9086 +9088 2 387.2554 362.3517 16.7971 0.1602 9087 +9089 2 388.3605 362.1458 16.2794 0.1749 9088 +9090 2 389.4714 362.0016 15.7262 0.2324 9089 +9091 2 390.5467 362.3403 15.2472 0.19 9090 +9092 2 391.6495 362.6011 14.868 0.152 9091 +9093 2 392.7524 362.8768 14.5555 0.1144 9092 +9094 2 393.8369 363.1742 14.0384 0.1144 9093 +9095 2 372.6969 364.1512 35.3853 0.1373 8986 +9096 2 371.689 363.6719 36.0004 0.1373 9095 +9097 2 370.6629 363.1834 36.297 0.1373 9096 +9098 2 369.623 362.7224 36.5873 0.1373 9097 +9099 2 368.5053 362.4867 36.7343 0.1373 9098 +9100 2 367.3842 362.2556 36.7634 0.1373 9099 +9101 2 366.2585 362.0566 36.7181 0.1373 9100 +9102 2 365.1293 361.8781 36.6285 0.1372 9101 +9103 2 364.0025 361.7008 36.4 0.1144 9102 +9104 2 382.9632 349.1671 16.2635 0.1144 -1 +9105 2 381.937 349.643 16.685 0.1144 9104 +9106 2 380.8284 349.9176 16.8203 0.1271 9105 +9107 2 379.8675 350.5193 17.1979 0.1313 9106 +9108 2 379.0347 351.2355 17.8769 0.1858 9107 +9109 2 378.275 352.0614 18.3638 0.2279 9108 +9110 2 377.8438 353.0899 18.8209 0.1832 9109 +9111 2 377.8506 354.211 19.285 0.1627 9110 +9112 2 377.8998 355.3413 19.6991 0.1508 9111 +9113 2 377.8712 356.4761 20.0283 0.1446 9112 +9114 2 377.6275 357.5847 20.3234 0.1413 9113 +9115 2 377.2157 358.6429 20.6525 0.1394 9114 +9116 2 376.8428 359.7159 20.9677 0.15 9115 +9117 2 376.4343 360.7764 21.2846 0.166 9116 +9118 2 376.0385 361.8415 21.6231 0.1852 9117 +9119 2 375.6553 362.9008 22.1024 0.1583 9118 +9120 2 375.1862 363.9121 22.734 0.1491 9119 +9121 2 374.7595 364.9509 23.2631 0.1434 9120 +9122 2 374.3751 366.0148 23.6704 0.1419 9121 +9123 2 373.9976 367.0879 23.9828 0.1666 9122 +9124 2 373.6315 368.1667 24.2399 0.2126 9123 +9125 2 373.3032 369.258 24.4783 0.2646 9124 +9126 2 373.063 370.37 24.7738 0.2235 9125 +9127 2 372.8502 371.4831 25.1406 0.1794 9126 +9128 2 372.6202 372.5962 25.4571 0.1608 9127 +9129 2 372.4326 373.7196 25.7128 0.1499 9128 +9130 2 372.2954 374.8522 25.9259 0.1441 9129 +9131 2 372.0952 375.9756 26.1263 0.1409 9130 +9132 2 371.9487 377.107 26.3236 0.1393 9131 +9133 2 371.8114 378.2396 26.5342 0.1384 9132 +9134 2 371.6742 379.371 26.7724 0.1378 9133 +9135 2 371.5357 380.5013 27.0389 0.1376 9134 +9136 2 371.3779 381.627 27.3574 0.1399 9135 +9137 2 371.1971 382.7458 27.7414 0.1666 9136 +9138 2 371.0164 383.8623 28.1562 0.2019 9137 +9139 2 370.8768 384.9812 28.5642 0.227 9138 +9140 2 370.9923 386.1092 28.9192 0.1764 9139 +9141 2 371.2234 387.2223 29.1735 0.1751 9140 +9142 2 371.6318 388.2896 29.2127 0.1822 9141 +9143 2 372.0643 389.3444 29.0332 0.189 9142 +9144 2 372.4029 390.4289 28.7202 0.1813 9143 +9145 2 372.7324 391.5123 28.3248 0.2179 9144 +9146 2 373.0847 392.5865 27.8949 0.2549 9145 +9147 2 373.5103 393.6344 27.4805 0.2493 9146 +9148 2 373.9656 394.672 27.0981 0.2193 9147 +9149 2 374.509 395.6661 26.7486 0.234 9148 +9150 2 375.1451 396.6076 26.4262 0.2429 9149 +9151 2 375.7731 397.5549 26.109 0.2146 9150 +9152 2 376.3623 398.525 25.7556 0.2379 9151 +9153 2 377.0395 399.4265 25.3723 0.2686 9152 +9154 2 377.8483 400.2192 24.9901 0.2494 9153 +9155 2 378.6011 401.0647 24.5996 0.2467 9154 +9156 2 379.2955 401.9593 24.1976 0.1862 9155 +9157 2 379.9865 402.855 23.7906 0.1657 9156 +9158 2 380.6774 403.7519 23.3833 0.1553 9157 +9159 2 381.3936 404.6259 22.9758 0.1623 9158 +9160 2 382.1578 405.4588 22.5655 0.1762 9159 +9161 2 382.9025 406.2927 22.1464 0.1814 9160 +9162 2 383.8864 406.8201 21.7392 0.1563 9161 +9163 2 385.0006 407.0112 21.3409 0.1485 9162 +9164 2 386.1309 407.0924 20.9546 0.1431 9163 +9165 2 387.2623 407.1633 20.5844 0.1471 9164 +9166 2 388.3891 407.296 20.2343 0.1731 9165 +9167 2 389.4977 407.5134 19.8969 0.2076 9166 +9168 2 390.4838 408.0339 19.5612 0.2215 9167 +9169 2 391.2091 408.8988 19.2233 0.1731 9168 +9170 2 391.7205 409.9089 18.8801 0.1586 9169 +9171 2 392.0717 410.9866 18.5236 0.1484 9170 +9172 2 392.3165 412.0928 18.1439 0.1433 9171 +9173 2 392.551 413.2014 17.7503 0.1405 9172 +9174 2 392.8656 414.287 17.3614 0.139 9173 +9175 2 393.3049 415.3326 16.9946 0.1382 9174 +9176 2 393.7854 416.3599 16.6645 0.1378 9175 +9177 2 394.3631 417.3404 16.3865 0.1376 9176 +9178 2 394.9957 418.2887 16.1722 0.1374 9177 +9179 2 395.6753 419.2074 16.0262 0.1374 9178 +9180 2 396.3663 420.118 15.9339 0.131 9179 +9181 2 348.8342 412.5882 17.9606 0.1144 -1 +9182 2 348.6912 411.4579 17.7006 0.1144 9181 +9183 2 348.8605 410.3276 17.5967 0.1272 9182 +9184 2 349.0298 409.1974 17.492 0.1441 9183 +9185 2 349.1991 408.0671 17.3943 0.1639 9184 +9186 2 349.4623 406.954 17.3238 0.1848 9185 +9187 2 349.8649 405.8832 17.3019 0.1563 9186 +9188 2 350.2699 404.8124 17.3194 0.1747 9187 +9189 2 350.6715 403.7416 17.359 0.2285 9188 +9190 2 351.0776 402.6731 17.4114 0.2985 9189 +9191 2 351.6267 401.6767 17.4626 0.2758 9190 +9192 2 352.7009 401.282 17.4695 0.2012 9191 +9193 2 353.7751 400.8896 17.4497 0.1739 9192 +9194 2 354.8574 400.5224 17.4277 0.1565 9193 +9195 2 355.9991 400.4686 17.4768 0.1477 9194 +9196 2 357.1385 400.5476 17.6155 0.1429 9195 +9197 2 358.2745 400.6574 17.8257 0.1403 9196 +9198 2 359.4013 400.8221 18.0879 0.139 9197 +9199 2 360.5236 401.0052 18.3851 0.1382 9198 +9200 2 361.5978 401.3655 18.7081 0.1377 9199 +9201 2 362.5027 402.0519 19.0452 0.1375 9200 +9202 2 363.4065 402.7383 19.396 0.1374 9201 +9203 2 364.3091 403.4259 19.7625 0.1387 9202 +9204 2 365.2117 404.11 20.1466 0.1645 9203 +9205 2 366.1132 404.7952 20.5485 0.1985 9204 +9206 2 366.9826 405.5137 20.9845 0.2332 9205 +9207 2 367.6267 406.4357 21.4852 0.1767 9206 +9208 2 368.1381 407.4333 22.0377 0.1746 9207 +9209 2 368.6483 408.432 22.6024 0.1809 9208 +9210 2 369.1413 409.4342 23.1857 0.1844 9209 +9211 2 363.5689 425.2248 20.4364 0.2288 -1 +9212 2 363.8732 426.3265 20.3283 0.1144 9211 +9213 2 364.1775 427.4281 20.2205 0.1144 9212 +9214 2 363.4534 426.1114 20.2999 0.1949 9211 +9215 2 363.315 427.2462 20.1856 0.1608 9214 +9216 2 363.1811 428.3811 20.1018 0.1426 9215 +9217 2 363.0461 429.5171 20.0245 0.1391 9216 +9218 2 362.91 430.6531 19.9716 0.1407 9217 +9219 2 362.7613 431.7868 19.9871 0.1436 9218 +9220 2 362.6 432.9182 20.1061 0.1492 9219 +9221 2 362.4352 434.0473 20.3042 0.1593 9220 +9222 2 362.2693 435.1753 20.535 0.1795 9221 +9223 2 362.1046 436.3033 20.7586 0.2108 9222 +9224 2 361.8529 437.4164 20.9051 0.3063 9223 +9225 2 361.2134 438.3396 20.7531 0.3043 9224 +9226 2 360.4904 439.2068 20.3036 0.3499 9225 +9227 2 360.5144 438.1978 19.6196 0.121 9226 +9228 2 360.5419 437.0618 19.8809 0.1267 9227 +9229 2 359.8898 436.1317 20.0087 0.1144 9228 +9230 2 358.9735 435.4705 20.44 0.1144 9229 +9231 2 360.4218 440.0293 19.9095 0.2921 9226 +9232 2 360.3154 441.1561 19.5002 0.2291 9231 +9233 2 360.4206 442.2841 19.1408 0.2022 9232 +9234 2 360.638 443.4007 18.8511 0.1714 9233 +9235 2 360.8702 444.5172 18.6332 0.1557 9234 +9236 2 361.1036 445.6349 18.4551 0.1468 9235 +9237 2 361.337 446.7526 18.2864 0.1533 9236 +9238 2 361.5704 447.8714 18.1254 0.168 9237 +9239 2 361.8037 448.9891 17.9707 0.1898 9238 +9240 2 362.0371 450.1068 17.8224 0.2558 9239 +9241 2 362.1767 451.2416 17.6858 0.2535 9240 +9242 2 362.2453 452.3822 17.565 0.2088 9241 +9243 2 362.7109 453.421 17.4556 0.1741 9242 +9244 2 363.6261 454.0982 17.3664 0.1921 9243 +9245 2 364.3732 454.9642 17.3093 0.1783 9244 +9246 2 364.976 455.9355 17.2857 0.1696 9245 +9247 2 366.0022 456.4343 17.3059 0.178 9246 +9248 2 367.1371 456.5738 17.3656 0.1907 9247 +9249 2 368.2696 456.7123 17.575 0.3432 9248 +9250 2 363.2189 425.719 22.3202 0.2528 9211 +9251 2 362.5061 425.1081 22.5835 0.2058 9250 +9252 2 361.6424 424.3645 22.8119 0.1748 9251 +9253 2 360.7467 423.6575 23.0393 0.1768 9252 +9254 2 359.8452 422.9608 23.2748 0.2352 9253 +9255 2 359.0478 422.1474 23.5402 0.1973 9254 +9256 2 358.2997 421.2906 23.8356 0.1634 9255 +9257 2 357.5561 420.4303 24.1481 0.1383 9256 +9258 2 356.8342 419.5528 24.4542 0.1391 9257 +9259 2 356.2256 418.5885 24.7039 0.1408 9258 +9260 2 355.6055 417.6309 24.9006 0.1437 9259 +9261 2 354.9592 416.6894 25.0589 0.1496 9260 +9262 2 354.3426 415.8005 25.1938 0.1575 9261 +9263 2 353.8781 414.7572 25.3278 0.1875 9262 +9264 2 353.4468 413.699 25.4738 0.1686 9263 +9265 2 353.0533 412.6271 25.6358 0.153 9264 +9266 2 352.6941 411.5426 25.805 0.1428 9265 +9267 2 352.3371 410.458 25.9741 0.1476 9266 +9268 2 351.9962 409.3678 26.1376 0.1559 9267 +9269 2 351.6564 408.2776 26.2924 0.1735 9268 +9270 2 351.2824 407.1976 26.44 0.1966 9269 +9271 2 350.8236 406.152 26.5858 0.2854 9270 +9272 2 350.3626 405.1064 26.7338 0.2264 9271 +9273 2 349.9061 404.0597 26.8806 0.1756 9272 +9274 2 349.4542 403.0106 27.0217 0.1376 9273 +9275 2 349.0092 401.9581 27.1539 0.1377 9274 +9276 2 348.7255 400.8507 27.2754 0.1381 9275 +9277 2 348.4521 399.7411 27.3868 0.1389 9276 +9278 2 348.1478 398.6382 27.4927 0.1401 9277 +9279 2 347.7932 397.5514 27.6014 0.1427 9278 +9280 2 347.4374 396.4658 27.7163 0.1471 9279 +9281 2 347.0907 395.3767 27.8312 0.1559 9280 +9282 2 346.759 394.2819 27.9351 0.1697 9281 +9283 2 346.4318 393.1871 28.0188 0.2075 9282 +9284 2 346.2499 392.058 28.0762 0.2182 9283 +9285 2 346.1595 390.9174 28.1042 0.1832 9284 +9286 2 346.0703 389.7768 28.1016 0.1565 9285 +9287 2 345.9502 388.6385 28.0711 0.15 9286 +9288 2 345.8278 387.5014 28.0137 0.1581 9287 +9289 2 345.6802 386.3677 27.9305 0.1887 9288 +9290 2 345.5097 385.2374 27.8236 0.1707 9289 +9291 2 346.0348 385.9192 27.6383 0.158 9290 +9292 2 346.7304 386.8207 27.3538 0.1503 9291 +9293 2 347.7909 387.2017 27.0197 0.1618 9292 +9294 2 348.9211 387.0884 26.6899 0.1775 9293 +9295 2 348.8022 387.2703 27.0905 0.2207 9294 +9296 2 348.3377 387.9865 28.9288 0.3287 9295 +9297 2 347.9087 388.6374 30.935 0.2969 9296 +9298 2 347.3356 389.4451 32.328 0.3145 9297 +9299 2 346.9432 390.3099 33.8136 0.2892 9298 +9300 2 347.013 391.3155 35.0059 0.2231 9299 +9301 2 347.2932 392.3554 35.9388 0.1704 9300 +9302 2 347.6971 393.3758 36.7086 0.1484 9301 +9303 2 348.4452 394.1137 37.4214 0.1477 9302 +9304 2 349.468 394.5324 38.1158 0.1578 9303 +9305 2 350.5193 394.8916 38.7766 0.1728 9304 +9306 2 351.5741 395.2634 39.3728 0.2202 9305 +9307 2 352.6323 395.6444 39.8835 0.2103 9306 +9308 2 353.6962 396.0288 40.2993 0.1765 9307 +9309 2 354.8093 396.007 40.4939 0.1517 9308 +9310 2 355.7554 395.4099 40.3124 0.1556 9309 +9311 2 356.308 394.418 40.0747 0.173 9310 +9312 2 356.809 393.393 39.8723 0.1959 9311 +9313 2 357.1728 392.3108 39.7032 0.2825 9312 +9314 2 357.1991 391.1702 39.5503 0.2281 9313 +9315 2 357.206 390.0274 39.44 0.1769 9314 +9316 2 357.2129 388.8834 39.3674 0.1383 9315 +9317 2 357.2209 387.7405 39.3072 0.1375 9316 +9318 2 356.8834 386.648 39.3543 0.1376 9317 +9319 2 356.4452 385.5932 39.5144 0.138 9318 +9320 2 355.7726 384.6723 39.7275 0.1384 9319 +9321 2 355.0999 383.7514 39.9686 0.1398 9320 +9322 2 354.4295 382.8316 40.2156 0.1399 9321 +9323 2 353.7568 381.9107 40.4502 0.1522 9322 +9324 2 353.0899 380.9978 40.88 0.1144 9323 +9325 2 349.7849 387.1456 26.3577 0.2217 9294 +9326 2 350.9243 387.22 26.1995 0.1856 9325 +9327 2 352.0557 387.1742 26.0152 0.1566 9326 +9328 2 353.0304 386.6834 25.5696 0.1501 9327 +9329 2 354.0417 386.3585 24.787 0.1648 9328 +9330 2 355.085 386.6503 23.9743 0.185 9329 +9331 2 356.1089 387.0392 23.1622 0.2507 9330 +9332 2 357.0504 387.6181 22.4547 0.2298 9331 +9333 2 357.9279 388.3182 21.9211 0.2317 9332 +9334 2 358.8659 388.9531 21.5328 0.2175 9333 +9335 2 359.8532 389.5194 21.2483 0.1826 9334 +9336 2 360.7924 390.1612 20.9831 0.1522 9335 +9337 2 361.6676 390.8888 20.6761 0.1382 9336 +9338 2 362.5347 391.6187 20.3205 0.1375 9337 +9339 2 363.3996 392.3497 19.924 0.1376 9338 +9340 2 364.2908 393.0487 19.5122 0.138 9339 +9341 2 365.2643 393.6275 19.1323 0.1385 9340 +9342 2 366.2859 394.1217 18.7841 0.1395 9341 +9343 2 367.4036 394.3196 18.463 0.1414 9342 +9344 2 368.5304 394.4741 18.1625 0.145 9343 +9345 2 369.6573 394.6274 17.8735 0.1514 9344 +9346 2 370.7853 394.7807 17.5915 0.1645 9345 +9347 2 371.9133 394.9351 17.3136 0.1829 9346 +9348 2 372.9852 395.3149 17.0283 0.2465 9347 +9349 2 373.8478 396.0517 16.7242 0.2205 9348 +9350 2 374.7149 396.7907 16.4646 0.2076 9349 +9351 2 375.5946 397.5171 16.2608 0.2125 9350 +9352 2 376.4744 398.2447 16.0995 0.3098 9351 +9353 2 376.9102 399.296 15.9356 0.2902 9352 +9354 2 377.2912 400.3725 15.7674 0.2298 9353 +9355 2 377.6687 401.4502 15.5912 0.2068 9354 +9356 2 378.0474 402.5267 15.4038 0.1807 9355 +9357 2 378.4238 403.6043 15.2109 0.1723 9356 +9358 2 378.7692 404.6923 15.0289 0.191 9357 +9359 2 378.9889 405.8134 14.8836 0.1755 9358 +9360 2 379.2028 406.9368 14.7707 0.1661 9359 +9361 2 379.4168 408.0591 14.6834 0.1644 9360 +9362 2 379.6341 409.1825 14.6139 0.1996 9361 +9363 2 380.1123 410.2212 14.5657 0.193 9362 +9364 2 380.6042 411.2543 14.53 0.1929 9363 +9365 2 381.0961 412.2862 14.5002 0.2417 9364 +9366 2 381.9061 413.0938 14.4602 0.2089 9365 +9367 2 382.7412 413.8752 14.4121 0.1825 9366 +9368 2 383.55 414.6828 14.3608 0.1862 9367 +9369 2 384.2181 415.6118 14.3196 0.1662 9368 +9370 2 384.8771 416.5464 14.2834 0.1484 9369 +9371 2 385.7179 417.322 14.2523 0.1343 9370 +9372 2 386.529 418.1286 14.2384 0.1314 9371 +9373 2 387.1971 419.0575 14.2466 0.1271 9372 +9374 2 388.0185 419.8537 14.2121 0.1144 9373 +9375 2 388.8673 420.6156 14.0 0.1144 9374 +9376 2 345.5006 384.3611 28.1193 0.4536 9290 +9377 2 345.52 383.2171 28.1814 0.3155 9376 +9378 2 345.5864 382.0754 28.2131 0.2066 9377 +9379 2 345.6573 380.9337 28.2646 0.1512 9378 +9380 2 345.7271 379.792 28.3335 0.1385 9379 +9381 2 345.3107 378.7281 28.4242 0.1394 9380 +9382 2 344.7879 377.7122 28.5314 0.1413 9381 +9383 2 344.2662 376.6952 28.649 0.1447 9382 +9384 2 343.7434 375.6782 28.7675 0.1509 9383 +9385 2 343.2206 374.6623 28.8812 0.1634 9384 +9386 2 342.6966 373.6464 28.9859 0.1807 9385 +9387 2 342.1738 372.6294 29.0791 0.2427 9386 +9388 2 341.6064 371.6364 29.1547 0.2119 9387 +9389 2 340.7701 370.8562 29.1805 0.178 9388 +9390 2 339.9327 370.0771 29.12 0.2288 9389 +9391 2 354.9878 418.0542 24.9005 0.3694 9261 +9392 2 354.8745 419.1902 24.8342 0.3126 9391 +9393 2 354.6869 420.3182 24.7876 0.2451 9392 +9394 2 354.5164 421.4496 24.7207 0.1942 9393 +9395 2 354.386 422.5844 24.6212 0.169 9394 +9396 2 354.2693 423.7216 24.4954 0.1645 9395 +9397 2 354.2419 424.8622 24.3735 0.1873 9396 +9398 2 354.3243 426.0016 24.2825 0.1931 9397 +9399 2 354.4432 427.1399 24.2268 0.1924 9398 +9400 2 354.5656 428.277 24.2017 0.2074 9399 +9401 2 354.688 429.4141 24.1989 0.2698 9400 +9402 2 354.8105 430.5513 24.2072 0.3322 9401 +9403 2 354.9317 431.6895 24.2158 0.2903 9402 +9404 2 355.1102 432.8187 24.2146 0.2145 9403 +9405 2 355.3996 433.9238 24.1939 0.1749 9404 +9406 2 355.7577 435.0094 24.149 0.1842 9405 +9407 2 356.1318 436.0905 24.0804 0.2206 9406 +9408 2 356.5608 437.1499 24.016 0.3105 9407 +9409 2 357.0001 438.2058 23.9498 0.3694 9408 +9410 2 357.3524 439.2914 23.824 0.3069 9409 +9411 2 357.6384 440.3954 23.6126 0.2172 9410 +9412 2 357.9118 441.5005 23.3349 0.1754 9411 +9413 2 358.3363 442.5518 23.0412 0.1981 9412 +9414 2 359.3018 442.9305 22.8639 0.2055 9413 +9415 2 360.2433 443.5482 22.7525 0.2289 9414 +9416 2 360.8977 444.4783 22.6071 0.2358 9415 +9417 2 361.4651 445.4702 22.4577 0.2296 9416 +9418 2 362.0245 446.4654 22.2993 0.1831 9417 +9419 2 362.5508 447.479 22.1208 0.1521 9418 +9420 2 362.9534 448.5452 21.9151 0.1382 9419 +9421 2 363.5495 449.5176 21.7217 0.1373 9420 +9422 2 364.1695 450.4763 21.544 0.1374 9421 +9423 2 364.5207 451.5585 21.3667 0.1374 9422 +9424 2 364.7964 452.6671 21.1833 0.1376 9423 +9425 2 365.0653 453.7756 20.9887 0.1378 9424 +9426 2 365.389 454.8704 20.7871 0.1383 9425 +9427 2 365.7997 455.9343 20.5845 0.1391 9426 +9428 2 366.048 457.044 20.3144 0.1406 9427 +9429 2 366.2093 458.1674 19.9635 0.1434 9428 +9430 2 366.3626 459.2885 19.5573 0.1492 9429 +9431 2 366.5159 460.4085 19.122 0.157 9430 +9432 2 366.938 461.4587 18.7286 0.1861 9431 +9433 2 367.4745 462.4609 18.3993 0.1678 9432 +9434 2 368.0156 463.463 18.1327 0.1511 9433 +9435 2 368.5568 464.4663 17.9192 0.1387 9434 +9436 2 369.1002 465.4707 17.7453 0.1391 9435 +9437 2 369.6424 466.4763 17.5981 0.1407 9436 +9438 2 370.1835 467.483 17.4695 0.1434 9437 +9439 2 370.7269 468.4886 17.3622 0.1491 9438 +9440 2 371.2692 469.4953 17.2828 0.1568 9439 +9441 2 371.8126 470.502 17.2387 0.1858 9440 +9442 2 372.356 471.5088 17.2357 0.1669 9441 +9443 2 372.7724 472.5727 17.3404 0.1494 9442 +9444 2 373.1156 473.6595 17.5797 0.1356 9443 +9445 2 373.4554 474.744 17.912 0.1342 9444 +9446 2 373.7951 475.8239 18.2986 0.1313 9445 +9447 2 374.1338 476.905 18.7055 0.1269 9446 +9448 2 374.4735 477.9838 19.1131 0.1144 9447 +9449 2 374.8019 479.034 19.88 0.1144 9448 +9450 2 364.038 426.4889 21.9903 0.2845 9250 +9451 2 364.7472 427.3709 21.579 0.2632 9450 +9452 2 365.4531 428.2507 21.1181 0.2967 9451 +9453 2 366.2093 429.0835 20.6094 0.2428 9452 +9454 2 365.7391 429.9632 20.1305 0.1956 9453 +9455 2 365.2346 430.9677 19.6063 0.1682 9454 +9456 2 365.9542 431.4093 18.5877 0.1491 9455 +9457 2 366.2905 432.2009 17.1203 0.1919 9456 +9458 2 366.2951 433.2374 15.937 0.2529 9457 +9459 2 366.2676 434.3539 15.3641 0.3338 9458 +9460 2 366.2161 435.2737 13.72 0.1144 9459 +9461 2 367.0044 429.3855 20.7952 0.1248 9453 +9462 2 368.0557 429.8271 20.6131 0.1456 9461 +9463 2 369.0407 430.398 20.5164 0.1521 9462 +9464 2 369.9582 431.0821 20.4271 0.1679 9463 +9465 2 370.8974 431.7296 20.3377 0.1792 9464 +9466 2 371.8904 432.297 20.2292 0.1602 9465 +9467 2 372.825 432.9376 20.0571 0.1444 9466 +9468 2 373.6304 433.7396 19.7672 0.136 9467 +9469 2 374.4827 434.4649 19.3517 0.135 9468 +9470 2 375.5008 434.9259 18.8634 0.133 9469 +9471 2 376.5201 435.2417 17.9754 0.1277 9470 +9472 2 375.939 436.0013 16.8804 0.1144 9471 +9473 2 375.5008 436.8673 15.4 0.1144 9472 +9474 2 345.0876 412.1226 21.59 0.1144 -1 +9475 2 346.0932 412.6236 22.1104 0.1144 9474 +9476 2 347.228 412.7323 22.3322 0.1271 9475 +9477 2 348.3514 412.5607 22.5527 0.1314 9476 +9478 2 349.3147 413.1613 22.7769 0.1343 9477 +9479 2 349.9324 414.1211 22.9839 0.1356 9478 +9480 2 350.5502 415.081 23.1715 0.1364 9479 +9481 2 351.1691 416.0408 23.3419 0.1358 9480 +9482 2 362.8013 259.2922 42.1252 0.2288 -1 +9483 2 362.2018 260.2669 42.1506 0.1525 9482 +9484 2 361.7122 261.2999 42.1319 0.1525 9483 +9485 2 361.3324 262.3787 42.0882 0.1567 9484 +9486 2 360.7821 263.382 42.0232 0.1709 9485 +9487 2 360.1438 264.3304 41.9272 0.1888 9486 +9488 2 359.4219 265.2158 41.7836 0.1583 9487 +9489 2 358.8431 266.1996 41.5822 0.15 9488 +9490 2 358.4083 267.2544 41.3834 0.1438 9489 +9491 2 358.0022 268.3206 41.1888 0.1408 9490 +9492 2 357.5137 269.3525 41.004 0.1392 9491 +9493 2 356.9783 270.3466 40.563 0.1383 9492 +9494 2 356.4601 271.3648 40.4832 0.1378 9493 +9495 2 356.0254 272.4207 40.6059 0.1376 9494 +9496 2 355.6444 273.4972 40.7526 0.1374 9495 +9497 2 355.2086 274.552 40.8864 0.1374 9496 +9498 2 354.7052 275.5793 40.9923 0.1373 9497 +9499 2 354.179 276.5929 41.0796 0.1373 9498 +9500 2 353.5452 277.5413 41.151 0.1373 9499 +9501 2 352.789 278.3993 41.1894 0.1373 9500 +9502 2 351.9733 279.1966 41.1771 0.1373 9501 +9503 2 351.0444 279.859 41.1894 0.1373 9502 +9504 2 350.1006 280.4894 41.2798 0.1373 9503 +9505 2 349.2689 281.2741 41.3966 0.1373 9504 +9506 2 348.4304 282.0486 41.524 0.1373 9505 +9507 2 347.7451 282.9181 41.6265 0.1373 9506 +9508 2 347.5678 284.0232 41.6377 0.1373 9507 +9509 2 347.6833 285.1603 41.6091 0.1492 9508 +9510 2 347.8469 286.2929 41.6128 0.1787 9509 +9511 2 348.1192 287.3991 41.6354 0.2154 9510 +9512 2 348.7095 288.3406 41.6618 0.2076 9511 +9513 2 349.254 289.2867 41.7278 0.1692 9512 +9514 2 349.5149 290.3987 41.8746 0.1379 9513 +9515 2 356.7793 322.6217 38.859 0.1144 -1 +9516 2 356.5047 321.5452 39.5268 0.1144 9515 +9517 2 356.1398 320.4664 39.7911 0.1271 9516 +9518 2 355.8023 319.3785 40.0576 0.1313 9517 +9519 2 355.6341 318.2516 40.3066 0.1342 9518 +9520 2 355.6765 317.1122 40.5252 0.1356 9519 +9521 2 355.7417 315.9728 40.707 0.1364 9520 +9522 2 355.8252 314.8334 40.8472 0.1368 9521 +9523 2 356.0551 313.7134 40.9584 0.1371 9522 +9524 2 356.1936 312.5786 41.0374 0.1372 9523 +9525 2 356.332 311.4426 41.0766 0.1372 9524 +9526 2 356.5425 310.318 41.0698 0.1373 9525 +9527 2 356.8147 309.2072 41.0155 0.1373 9526 +9528 2 357.0573 308.0895 40.9279 0.1501 9527 +9529 2 357.4211 307.0061 40.81 0.1671 9528 +9530 2 357.9198 305.9788 40.6689 0.1994 9529 +9531 2 358.5674 305.0373 40.5171 0.1996 9530 +9532 2 359.4013 304.2571 40.3701 0.2283 9531 +9533 2 360.3714 303.6531 40.2357 0.2122 9532 +9534 2 361.3816 303.12 40.1268 0.1723 9533 +9535 2 362.3517 302.5136 40.0492 0.1573 9534 +9536 2 363.2635 301.8227 40.0075 0.1479 9535 +9537 2 364.1055 301.0482 40.0078 0.1431 9536 +9538 2 364.8502 300.181 40.0501 0.1404 9537 +9539 2 365.5 299.2395 40.1215 0.139 9538 +9540 2 366.1589 298.3049 40.199 0.1382 9539 +9541 2 366.8648 297.4045 40.2626 0.1377 9540 +9542 2 367.5844 296.5156 40.3038 0.1375 9541 +9543 2 368.3634 295.6782 40.3178 0.1374 9542 +9544 2 369.1997 294.8992 40.308 0.1374 9543 +9545 2 369.7431 293.8993 40.1554 0.1373 9544 +9546 2 370.2464 292.8754 39.9417 0.1373 9545 +9547 2 370.8951 291.9408 39.8222 0.1373 9546 +9548 2 371.6753 291.1068 39.7362 0.1373 9547 +9549 2 372.3789 290.2111 39.6536 0.1373 9548 +9550 2 372.7873 289.1586 39.5822 0.1373 9549 +9551 2 373.4954 288.3235 39.5234 0.1373 9550 +9552 2 374.4015 287.6256 39.4761 0.1373 9551 +9553 2 375.2034 286.818 39.4327 0.1462 9552 +9554 2 375.9699 285.968 39.3856 0.1619 9553 +9555 2 376.8611 285.2621 39.3266 0.1809 9554 +9556 2 377.8598 284.7084 39.2521 0.1658 9555 +9557 2 378.839 284.1204 39.1586 0.1517 9556 +9558 2 379.7714 283.4615 39.0438 0.1542 9557 +9559 2 380.7541 282.8815 38.9021 0.1662 9558 +9560 2 381.7917 282.4067 38.7288 0.1922 9559 +9561 2 382.7813 281.845 38.5232 0.1916 9560 +9562 2 383.7102 281.1849 38.2931 0.196 9561 +9563 2 384.6666 280.5671 38.057 0.1736 9562 +9564 2 385.7385 280.2125 37.8378 0.1559 9563 +9565 2 386.7624 279.7286 37.6524 0.1475 9564 +9566 2 387.4064 278.8328 37.511 0.1611 9565 +9567 2 388.2061 278.0492 37.4142 0.1902 9566 +9568 2 389.1854 277.4635 37.3556 0.2268 9567 +9569 2 390.2012 276.9361 37.3243 0.194 9568 +9570 2 391.2697 276.5357 37.3097 0.1662 9569 +9571 2 392.1483 275.8459 37.3033 0.1275 9570 +9572 2 357.4714 276.2909 47.245 0.1144 -1 +9573 2 357.2266 277.0928 45.3404 0.1144 9572 +9574 2 357.23 278.127 44.1403 0.1264 9573 +9575 2 357.0836 279.2538 44.0748 0.1311 9574 +9576 2 357.0882 280.3967 44.1297 0.134 9575 +9577 2 356.952 281.5315 44.2179 0.1355 9576 +9578 2 356.507 282.5829 44.294 0.1363 9577 +9579 2 355.7634 283.45 44.3274 0.1368 9578 +9580 2 355.2337 284.4625 44.406 0.137 9579 +9581 2 354.918 285.5584 44.5796 0.1372 9580 +9582 2 354.7235 286.6807 44.8487 0.1377 9581 +9583 2 354.5153 287.7961 45.1651 0.164 9582 +9584 2 354.6583 288.9195 45.4437 0.1981 9583 +9585 2 355.3138 289.853 45.6571 0.2342 9584 +9586 2 355.832 290.8712 45.7792 0.1896 9585 +9587 2 356.4841 291.8081 45.8181 0.1914 9586 +9588 2 356.8662 292.8869 45.7761 0.1988 9587 +9589 2 357.2037 293.9794 45.682 0.1908 9588 +9590 2 357.6098 295.0468 45.5498 0.2271 9589 +9591 2 358.1292 296.0615 45.3239 0.2714 9590 +9592 2 358.7584 297.0053 44.9952 0.2213 9591 +9593 2 369.6607 318.5754 60.9655 0.2028 -1 +9594 2 370.6823 318.2471 62.5243 0.1594 9593 +9595 2 371.7302 317.8753 63.1806 0.1824 9594 +9596 2 372.777 317.4657 63.6913 0.17 9595 +9597 2 373.818 317.015 64.0408 0.1527 9596 +9598 2 374.8602 316.554 64.3003 0.1393 9597 +9599 2 375.8074 315.9259 64.5389 0.1373 9598 +9600 2 376.694 315.2098 64.7525 0.1373 9599 +9601 2 377.5646 314.4707 64.9303 0.1373 9600 +9602 2 378.4158 313.7065 64.9928 0.1373 9601 +9603 2 379.2589 312.9332 64.9488 0.1373 9602 +9604 2 380.0963 312.1553 64.8813 0.1373 9603 +9605 2 380.9486 311.3922 64.8228 0.1373 9604 +9606 2 381.8077 310.636 64.7858 0.1373 9605 +9607 2 382.62 309.8318 64.7948 0.1373 9606 +9608 2 383.2766 308.8972 64.7959 0.1373 9607 +9609 2 383.9012 307.9396 64.766 0.1373 9608 +9610 2 384.6311 307.0599 64.7329 0.1373 9609 +9611 2 385.3919 306.2053 64.7066 0.1373 9610 +9612 2 386.2739 305.4777 64.6898 0.1373 9611 +9613 2 387.2097 304.8211 64.687 0.1373 9612 +9614 2 388.0151 304.0111 64.7055 0.1373 9613 +9615 2 388.7998 303.1794 64.7371 0.1373 9614 +9616 2 389.6338 302.3958 64.7842 0.1373 9615 +9617 2 390.4655 301.6122 64.8754 0.1373 9616 +9618 2 391.359 300.8995 65.004 0.1373 9617 +9619 2 392.2959 300.2462 65.1325 0.1372 9618 +9620 2 393.2214 299.5736 65.2 0.1372 9619 +9621 2 394.0966 298.838 65.2459 0.1371 9620 +9622 2 394.9443 298.0726 65.1146 0.1368 9621 +9623 2 395.8286 297.3485 64.9536 0.1364 9622 +9624 2 396.8033 296.7536 64.8203 0.1356 9623 +9625 2 397.8088 296.2079 64.7203 0.1342 9624 +9626 2 398.8236 295.6817 64.6528 0.1313 9625 +9627 2 399.8394 295.1554 64.615 0.1271 9626 +9628 2 400.9045 294.7379 64.6058 0.1144 9627 +9629 2 402.0256 294.5091 64.6044 0.1144 9628 +9630 2 369.266 318.6589 59.684 0.2213 9593 +9631 2 368.7615 318.8431 57.7377 0.1144 9630 +9632 2 369.4285 318.0309 59.3188 0.132 9631 +9633 2 370.1801 317.2587 60.179 0.1373 9632 +9634 2 370.9935 316.507 60.8745 0.1373 9633 +9635 2 371.8069 315.7566 61.5854 0.1373 9634 +9636 2 372.6122 314.997 62.2885 0.1373 9635 +9637 2 373.4451 314.2625 62.9608 0.1373 9636 +9638 2 374.2802 313.5224 63.5768 0.1374 9637 +9639 2 375.0707 312.7284 64.136 0.1374 9638 +9640 2 375.7971 311.8681 64.6265 0.1375 9639 +9641 2 376.5407 311.017 65.0541 0.1377 9640 +9642 2 377.2718 310.1498 65.4214 0.138 9641 +9643 2 378.195 309.4886 65.5917 0.1387 9642 +9644 2 379.0438 308.7244 65.5572 0.14 9643 +9645 2 379.6719 307.7692 65.5592 0.1424 9644 +9646 2 380.4532 306.9341 65.6068 0.1466 9645 +9647 2 381.1957 306.0646 65.7076 0.1552 9646 +9648 2 381.921 305.1814 65.8672 0.1681 9647 +9649 2 382.5879 304.2571 66.0864 0.2062 9648 +9650 2 383.1153 303.2458 66.2998 0.2076 9649 +9651 2 383.4871 302.167 66.4978 0.2041 9650 +9652 2 383.7994 301.0768 66.869 0.3432 9651 +9653 2 368.6597 319.0136 55.8967 0.1373 9631 +9654 2 368.5808 319.0319 56.8243 0.1373 9653 +9655 2 367.6187 319.2492 58.0054 0.1373 9654 +9656 2 366.5605 319.4883 58.8899 0.1373 9655 +9657 2 365.4943 319.7835 59.6042 0.1373 9656 +9658 2 364.4532 320.2022 60.1294 0.1373 9657 +9659 2 363.4957 320.8096 60.478 0.1373 9658 +9660 2 362.688 321.6127 60.7076 0.1373 9659 +9661 2 361.9364 322.4719 60.8728 0.1373 9660 +9662 2 360.8382 322.727 60.6592 0.1373 9661 +9663 2 359.812 323.1365 60.296 0.1373 9662 +9664 2 358.8648 323.7657 60.006 0.1373 9663 +9665 2 357.9153 324.3961 59.7506 0.1373 9664 +9666 2 356.9658 325.0276 59.5392 0.1373 9665 +9667 2 356.0139 325.659 59.383 0.1373 9666 +9668 2 355.053 326.278 59.2791 0.1373 9667 +9669 2 354.0302 326.7802 59.2099 0.1373 9668 +9670 2 352.964 327.1932 59.1682 0.1373 9669 +9671 2 351.8967 327.6061 59.1545 0.1373 9670 +9672 2 350.8305 328.0203 59.1685 0.1373 9671 +9673 2 349.8077 328.5236 59.2242 0.1373 9672 +9674 2 348.9589 329.2649 59.3547 0.1373 9673 +9675 2 348.2119 330.1287 59.5582 0.1373 9674 +9676 2 347.4122 330.9386 59.7856 0.1373 9675 +9677 2 346.5725 331.7108 60.0018 0.1373 9676 +9678 2 345.7317 332.4819 60.1899 0.1373 9677 +9679 2 344.8897 333.2541 60.3341 0.1373 9678 +9680 2 344.0477 334.0274 60.4254 0.1373 9679 +9681 2 343.2046 334.8008 60.468 0.1373 9680 +9682 2 342.2962 335.4883 60.3551 0.1373 9681 +9683 2 341.3456 336.1095 60.041 0.1373 9682 +9684 2 340.2679 336.3657 59.5944 0.1373 9683 +9685 2 339.4099 335.6347 59.3443 0.1373 9684 +9686 2 338.5588 334.8728 59.2169 0.1373 9685 +9687 2 337.7054 334.1098 59.2024 0.1372 9686 +9688 2 336.8542 333.3467 59.292 0.1372 9687 +9689 2 336.002 332.586 59.4471 0.1371 9688 +9690 2 335.152 331.8241 59.6299 0.1368 9689 +9691 2 334.5113 330.8814 59.8307 0.1364 9690 +9692 2 334.1224 329.8095 60.0457 0.1356 9691 +9693 2 333.7311 328.7376 60.2703 0.1342 9692 +9694 2 333.3422 327.6668 60.4962 0.1313 9693 +9695 2 332.952 326.5948 60.7146 0.127 9694 +9696 2 332.5631 325.5218 60.9213 0.1144 9695 +9697 2 332.1764 324.4578 61.32 0.1144 9696 +9698 2 368.2673 319.8052 54.1296 0.1415 9653 +9699 2 367.7045 320.3783 52.2595 0.1774 9698 +9700 2 367.4288 319.8349 50.5546 0.2333 9699 +9701 2 367.7033 318.8603 49.3234 0.2176 9700 +9702 2 368.2158 318.0343 47.8856 0.2108 9701 +9703 2 367.8772 317.2678 48.4632 0.18 9702 +9704 2 367.4059 316.2439 48.9056 0.1595 9703 +9705 2 367.0627 315.1709 49.3422 0.1471 9704 +9706 2 367.2366 314.9123 49.646 0.144 9705 +9707 2 368.1541 314.3632 50.3798 0.1399 9706 +9708 2 369.1379 314.028 50.8738 0.1385 9707 +9709 2 370.1218 313.6688 50.8575 0.1378 9708 +9710 2 371.1136 313.3416 49.84 0.1144 9709 +9711 2 366.1464 314.4295 49.87 0.1145 9705 +9712 2 365.2609 313.7123 50.0982 0.1144 9711 +9713 2 364.3915 313.0076 50.68 0.1144 9712 +9714 2 368.7078 318.8397 47.035 0.1352 9702 +9715 2 369.3141 319.7068 45.9763 0.171 9714 +9716 2 369.981 320.5374 44.9543 0.1693 9715 +9717 2 370.4158 321.2112 43.0004 0.1517 9716 +9718 2 370.7304 322.2602 43.0906 0.1382 9717 +9719 2 371.2966 323.2509 43.1273 0.1372 9718 +9720 2 372.062 324.0986 43.1284 0.1371 9719 +9721 2 372.9509 324.8182 43.1158 0.1368 9720 +9722 2 373.9107 325.4405 43.0844 0.1364 9721 +9723 2 374.9334 325.9496 43.0195 0.1356 9722 +9724 2 376.0031 326.3557 42.9285 0.1343 9723 +9725 2 376.646 327.2835 42.7946 0.1314 9724 +9726 2 377.1288 328.3177 42.6322 0.1272 9725 +9727 2 377.4822 329.4022 42.4267 0.1146 9726 +9728 2 378.0222 330.3632 41.6794 0.1144 9727 +9729 2 391.7491 365.6659 52.3852 0.1373 -1 +9730 2 392.7009 365.5446 51.5024 0.1158 9729 +9731 2 393.83 365.4005 51.3562 0.1359 9730 +9732 2 394.9649 365.2563 51.305 0.1373 9731 +9733 2 396.0162 364.8102 51.2747 0.1373 9732 +9734 2 397.0366 364.2954 51.266 0.1373 9733 +9735 2 398.0559 363.7748 51.2736 0.1373 9734 +9736 2 399.0741 363.2532 51.2907 0.1373 9735 +9737 2 400.0923 362.7327 51.3097 0.1373 9736 +9738 2 401.1116 362.2133 51.319 0.1373 9737 +9739 2 402.1309 361.6928 51.3072 0.1373 9738 +9740 2 403.1239 361.1253 51.263 0.1373 9739 +9741 2 403.9475 360.336 51.1574 0.1373 9740 +9742 2 404.7415 359.5146 50.9869 0.1372 9741 +9743 2 405.5331 358.6943 50.7506 0.1372 9742 +9744 2 406.3225 357.8764 50.4501 0.1371 9743 +9745 2 406.6657 356.8067 50.0125 0.1368 9744 +9746 2 406.5822 355.6936 49.4245 0.1364 9745 +9747 2 406.4838 354.592 48.7085 0.1356 9746 +9748 2 406.3877 353.4983 47.9217 0.1341 9747 +9749 2 406.2893 352.4081 47.1094 0.1312 9748 +9750 2 406.1955 351.3167 46.3075 0.1267 9749 +9751 2 406.1989 350.2367 45.4098 0.1144 9750 +9752 2 406.2321 349.2975 43.8141 0.1144 9751 +9753 2 392.4755 366.0537 52.5448 0.1373 9729 +9754 2 393.4788 366.5879 52.8634 0.1373 9753 +9755 2 394.4775 367.1188 53.2801 0.1373 9754 +9756 2 395.4716 367.6496 53.7541 0.1373 9755 +9757 2 396.4658 368.1792 54.2438 0.1373 9756 +9758 2 397.4622 368.7089 54.7114 0.1373 9757 +9759 2 398.4609 369.2409 55.1242 0.1373 9758 +9760 2 398.9322 370.2625 55.3624 0.1373 9759 +9761 2 399.296 371.347 55.4296 0.1373 9760 +9762 2 399.6575 372.4315 55.3725 0.1373 9761 +9763 2 400.0179 373.516 55.2266 0.1373 9762 +9764 2 400.535 374.533 55.0264 0.1373 9763 +9765 2 401.3255 375.3533 54.8069 0.1373 9764 +9766 2 402.14 376.1518 54.5896 0.1373 9765 +9767 2 402.9557 376.9491 54.3698 0.1373 9766 +9768 2 403.5266 377.9341 54.1251 0.1373 9767 +9769 2 403.6512 379.0633 53.8378 0.1373 9768 +9770 2 403.7588 380.1947 53.5164 0.1373 9769 +9771 2 403.8675 381.3249 53.1698 0.1373 9770 +9772 2 403.9761 382.4541 52.8091 0.1373 9771 +9773 2 404.0837 383.5832 52.4448 0.1373 9772 +9774 2 404.3971 384.6734 52.0864 0.1373 9773 +9775 2 404.7872 385.7396 51.7415 0.1373 9774 +9776 2 405.1808 386.8047 51.4119 0.1372 9775 +9777 2 406.0868 387.4922 51.1328 0.1372 9776 +9778 2 407.0295 388.134 50.8964 0.1371 9777 +9779 2 407.9733 388.7758 50.6943 0.1368 9778 +9780 2 408.9171 389.4176 50.5173 0.1364 9779 +9781 2 409.8609 390.0617 50.3544 0.1356 9780 +9782 2 410.8047 390.7046 50.2012 0.1342 9781 +9783 2 411.7496 391.3464 50.0556 0.1313 9782 +9784 2 412.6934 391.9905 49.9181 0.1271 9783 +9785 2 413.6384 392.6334 49.7913 0.1144 9784 +9786 2 414.5799 393.2752 49.5457 0.1144 9785 +9787 2 390.8636 365.6499 52.3611 0.1373 9729 +9788 2 389.7574 365.3902 52.3704 0.1373 9787 +9789 2 388.6614 365.063 52.4216 0.1373 9788 +9790 2 387.5655 364.7369 52.5014 0.1373 9789 +9791 2 386.4695 364.4098 52.5944 0.1373 9790 +9792 2 385.3736 364.0826 52.6854 0.1373 9791 +9793 2 384.2776 363.7565 52.7598 0.1373 9792 +9794 2 383.1748 363.4545 52.8063 0.1373 9793 +9795 2 382.0674 363.1674 52.838 0.1373 9794 +9796 2 380.96 362.8814 52.8662 0.1373 9795 +9797 2 379.8526 362.5942 52.8976 0.1373 9796 +9798 2 378.7452 362.3082 52.939 0.1373 9797 +9799 2 377.6378 362.0234 52.9998 0.1373 9798 +9800 2 376.5179 361.79 53.0914 0.1373 9799 +9801 2 375.3853 361.8426 53.221 0.1373 9800 +9802 2 374.2504 361.9685 53.3845 0.1373 9801 +9803 2 373.1167 362.0954 53.5923 0.1373 9802 +9804 2 371.9991 362.3105 53.8574 0.1373 9803 +9805 2 370.8997 362.5965 54.1789 0.1373 9804 +9806 2 369.806 362.8974 54.5516 0.1373 9805 +9807 2 368.7467 363.2921 54.9542 0.1373 9806 +9808 2 367.7136 363.76 55.312 0.1373 9807 +9809 2 366.8282 364.4658 55.5414 0.1373 9808 +9810 2 366.1235 365.3627 55.5758 0.1373 9809 +9811 2 365.4794 366.3031 55.3574 0.1373 9810 +9812 2 365.1019 367.3533 54.8279 0.1373 9811 +9813 2 364.7736 368.4103 54.1184 0.1373 9812 +9814 2 364.4635 369.4502 53.2406 0.1373 9813 +9815 2 364.3262 370.4867 52.1175 0.1373 9814 +9816 2 364.2164 371.5014 50.8525 0.1373 9815 +9817 2 364.1112 372.4933 49.481 0.1373 9816 +9818 2 363.9567 373.4485 47.9889 0.1373 9817 +9819 2 363.3767 373.786 46.0695 0.1373 9818 +9820 2 363.8789 373.3364 43.9569 0.1373 9819 +9821 2 364.547 373.8031 42.2954 0.1373 9820 +9822 2 365.1488 374.62 41.006 0.1373 9821 +9823 2 365.9748 374.7824 39.5486 0.1373 9822 +9824 2 366.636 373.929 38.619 0.1373 9823 +9825 2 367.3029 373.0721 37.7378 0.1373 9824 +9826 2 367.971 372.2096 36.8936 0.1373 9825 +9827 2 368.6426 371.3435 36.0937 0.1373 9826 +9828 2 369.3187 370.4718 35.3517 0.1373 9827 +9829 2 369.9993 369.5932 34.6867 0.1373 9828 +9830 2 370.6857 368.7078 34.1219 0.1497 9829 +9831 2 371.379 367.8166 33.6846 0.167 9830 +9832 2 371.8824 367.2114 33.7366 0.1567 9831 +9833 2 372.4658 366.5239 35.4578 0.1495 9832 +9834 2 372.5791 365.4348 36.2561 0.1434 9833 +9835 2 372.6454 364.3491 37.1213 0.1407 9834 +9836 2 372.7152 363.268 38.019 0.1391 9835 +9837 2 372.9474 362.2201 38.9875 0.1383 9836 +9838 2 373.206 361.1963 40.0355 0.1355 9837 +9839 2 373.4302 360.3108 41.72 0.1144 9838 +9840 2 372.8239 417.4445 24.6431 0.2368 -1 +9841 2 372.5825 416.4743 25.4013 0.1225 9840 +9842 2 372.34 415.4264 26.3504 0.1427 9841 +9843 2 372.086 414.3305 26.8362 0.1513 9842 +9844 2 371.8332 413.2345 27.3487 0.1647 9843 +9845 2 372.0414 412.1237 27.7606 0.1826 9844 +9846 2 371.9785 410.9912 28.1151 0.2464 9845 +9847 2 371.5941 409.9227 28.4304 0.2174 9846 +9848 2 371.188 408.8587 28.7076 0.2122 9847 +9849 2 370.9466 407.7479 28.9988 0.1682 9848 +9850 2 370.767 406.6256 29.3188 0.1504 9849 +9851 2 370.5885 405.5045 29.6688 0.1375 9850 +9852 2 370.4112 404.3846 30.0275 0.1375 9851 +9853 2 369.6939 403.5014 30.3167 0.1376 9852 +9854 2 368.9034 402.6788 30.5435 0.138 9853 +9855 2 368.1106 401.8575 30.7166 0.1384 9854 +9856 2 367.518 400.8816 30.8823 0.1398 9855 +9857 2 367.0364 399.8463 31.0607 0.1398 9856 +9858 2 366.6051 398.7892 31.2483 0.1522 9857 +9859 2 366.3969 397.6773 31.6596 0.1144 9858 +9860 2 373.5778 418.0782 24.7838 0.1997 9840 +9861 2 374.4529 418.8138 24.8506 0.1663 9860 +9862 2 375.2881 419.5952 24.9247 0.1424 9861 +9863 2 376.0854 420.4154 25.0073 0.1446 9862 +9864 2 376.8771 421.2402 25.0909 0.1514 9863 +9865 2 377.6722 422.0628 25.1464 0.161 9864 +9866 2 378.473 422.8785 25.1325 0.1935 9865 +9867 2 378.9523 423.9149 25.09 0.1824 9866 +9868 2 379.1799 425.0349 25.0498 0.1757 9867 +9869 2 379.411 426.1549 25.0193 0.1968 9868 +9870 2 379.7394 427.2508 25.0112 0.1873 9869 +9871 2 380.0746 428.3445 25.0252 0.1853 9870 +9872 2 380.4486 429.4256 25.0515 0.212 9871 +9873 2 381.0023 430.4266 25.0587 0.2281 9872 +9874 2 381.5858 431.4104 25.0419 0.2 9873 +9875 2 382.1475 432.4068 25.0072 0.1994 9874 +9876 2 382.3694 433.528 24.9787 0.1675 9875 +9877 2 382.5696 434.6548 24.9554 0.1503 9876 +9878 2 382.771 435.7805 24.9336 0.1375 9877 +9879 2 382.9712 436.9062 24.9087 0.1374 9878 +9880 2 383.1714 438.033 24.873 0.1374 9879 +9881 2 383.335 439.1644 24.815 0.1376 9880 +9882 2 383.1256 440.2867 24.6817 0.1378 9881 +9883 2 382.8968 441.4055 24.4891 0.1383 9882 +9884 2 382.6669 442.5221 24.2565 0.1391 9883 +9885 2 382.4998 443.6478 24.0025 0.1407 9884 +9886 2 383.0181 444.6636 23.7706 0.1435 9885 +9887 2 383.5443 445.6749 23.5649 0.1494 9886 +9888 2 384.0728 446.6874 23.3862 0.1571 9887 +9889 2 384.6277 447.6861 23.2258 0.1867 9888 +9890 2 385.3633 448.559 23.0717 0.1669 9889 +9891 2 386.2144 449.3209 22.9277 0.15 9890 +9892 2 387.1822 449.9295 22.7976 0.1373 9891 +9893 2 387.49 450.2475 22.7271 0.1373 9892 +9894 2 387.8926 451.2657 22.5451 0.1373 9893 +9895 2 387.9899 452.4005 22.3441 0.1373 9894 +9896 2 388.0437 453.5388 22.1205 0.1373 9895 +9897 2 388.0974 454.6782 21.887 0.1373 9896 +9898 2 388.1523 455.8165 21.6588 0.1374 9897 +9899 2 388.2038 456.9571 21.4518 0.1374 9898 +9900 2 388.1352 458.0942 21.3249 0.1376 9899 +9901 2 387.9922 459.2291 21.2965 0.1378 9900 +9902 2 387.84 460.3628 21.3466 0.1382 9901 +9903 2 387.6879 461.4965 21.4492 0.139 9902 +9904 2 387.5357 462.629 21.5795 0.1405 9903 +9905 2 387.3824 463.7604 21.7144 0.1433 9904 +9906 2 387.2303 464.8941 21.8328 0.1482 9905 +9907 2 387.0781 466.0267 21.9253 0.1583 9906 +9908 2 387.5803 466.9682 21.9377 0.1736 9907 +9909 2 388.507 467.6237 21.8599 0.225 9908 +9910 2 389.5251 468.1397 21.7334 0.2039 9909 +9911 2 390.5593 468.6259 21.5796 0.1689 9910 +9912 2 391.5935 469.1086 21.4126 0.1419 9911 +9913 2 392.6277 469.5926 21.2453 0.1373 9912 +9914 2 393.663 470.0765 21.0872 0.1373 9913 +9915 2 394.6983 470.5604 20.9375 0.1373 9914 +9916 2 395.7748 470.3602 20.8028 0.1373 9915 +9917 2 396.7872 469.8351 20.6896 0.1373 9916 +9918 2 397.7837 469.2734 20.5824 0.1373 9917 +9919 2 398.7778 468.7117 20.4661 0.1373 9918 +9920 2 399.7731 468.1488 20.3302 0.1373 9919 +9921 2 400.7672 467.586 20.168 0.1374 9920 +9922 2 401.8655 467.6832 19.8702 0.1375 9921 +9923 2 402.9305 468.0584 19.4433 0.1376 9922 +9924 2 403.983 468.4531 18.9339 0.138 9923 +9925 2 405.1098 468.5126 18.4787 0.1384 9924 +9926 2 406.2401 468.4165 18.1151 0.1394 9925 +9927 2 407.3738 468.3147 17.835 0.1412 9926 +9928 2 408.5098 468.2129 17.6315 0.1445 9927 +9929 2 409.647 468.1099 17.47 0.1512 9928 +9930 2 410.7852 468.0093 17.3375 0.1606 9929 +9931 2 411.9269 467.9303 17.2715 0.1926 9930 +9932 2 413.0687 467.9646 17.151 0.1825 9931 +9933 2 414.2058 468.0516 16.9401 0.1653 9932 +9934 2 415.3155 468.1385 16.2898 0.2288 9933 +9935 2 386.0691 449.5073 21.7494 0.1165 9892 +9936 2 385.0224 449.1092 21.1934 0.1365 9935 +9937 2 383.9744 448.7123 20.6196 0.1383 9936 +9938 2 382.9895 448.1597 20.193 0.1391 9937 +9939 2 381.9999 447.5992 19.8793 0.1407 9938 +9940 2 381.0069 447.0363 19.669 0.1434 9939 +9941 2 380.0128 446.4735 19.5509 0.1491 9940 +9942 2 379.0175 445.9095 19.4893 0.1568 9941 +9943 2 377.9513 445.4965 19.4361 0.1858 9942 +9944 2 376.8668 445.1327 19.3637 0.1671 9943 +9945 2 375.7823 444.7723 19.2777 0.1499 9944 +9946 2 374.6966 444.412 19.1878 0.1366 9945 +9947 2 373.6121 444.0516 19.1094 0.1356 9946 +9948 2 372.5264 443.6901 19.0463 0.1342 9947 +9949 2 371.4408 443.3297 19.0016 0.1314 9948 +9950 2 370.3803 442.903 18.9821 0.1272 9949 +9951 2 369.8518 441.894 19.0643 0.1144 9950 +9952 2 369.337 440.8862 19.4734 0.1144 9951 +9953 2 372.1524 416.5807 24.8084 0.1919 9840 +9954 2 371.4534 415.6816 25.0648 0.1912 9953 +9955 2 370.7521 414.7789 25.1829 0.1989 9954 +9956 2 370.0508 413.8763 25.3137 0.1776 9955 +9957 2 369.3507 412.9737 25.4574 0.1824 9956 +9958 2 368.6494 412.0722 25.6057 0.1944 9957 +9959 2 367.9482 411.1696 25.752 0.1629 9958 +9960 2 367.2469 410.267 25.8903 0.1522 9959 +9961 2 366.5456 409.3655 26.0195 0.1573 9960 +9962 2 366.175 408.2867 26.1098 0.1707 9961 +9963 2 365.9141 407.1725 26.1649 0.2009 9962 +9964 2 365.8192 406.0331 26.2223 0.2007 9963 +9965 2 365.9084 404.8936 26.287 0.2286 9964 +9966 2 366.541 403.9441 26.3514 0.2131 9965 +9967 2 367.2469 403.0438 26.4125 0.1729 9966 +9968 2 367.9527 402.1446 26.4732 0.1576 9967 +9969 2 368.5522 401.1699 26.5259 0.1479 9968 +9970 2 368.9297 400.09 26.5611 0.1431 9969 +9971 2 369.2786 399.0009 26.5824 0.1404 9970 +9972 2 369.6287 397.9118 26.6 0.1144 9971 +9973 2 340.1512 417.6183 33.4079 0.1144 -1 +9974 2 341.0905 418.2533 33.0294 0.1396 9973 +9975 2 342.0366 418.8928 32.8975 0.1862 9974 +9976 2 343.0158 419.4785 32.6785 0.2299 9975 +9977 2 344.0626 419.9029 32.2358 0.1732 9976 +9978 2 345.099 420.3205 31.6355 0.1588 9977 +9979 2 346.1035 420.7735 30.9266 0.1509 9978 +9980 2 346.9535 421.4805 30.203 0.1723 9979 +9981 2 347.7806 422.2104 29.4913 0.2041 9980 +9982 2 348.4063 423.1198 28.828 0.2308 9981 +9983 2 348.7198 424.186 28.182 0.1702 9982 +9984 2 365.5629 393.1974 32.7768 0.2086 -1 +9985 2 364.8102 393.4399 32.7382 0.1908 9984 +9986 2 363.7222 393.7923 32.6883 0.185 9985 +9987 2 362.6343 394.1435 32.6466 0.1933 9986 +9988 2 361.5452 394.4958 32.6124 0.173 9987 +9989 2 360.4572 394.847 32.5506 0.1554 9988 +9990 2 359.3682 395.1994 32.5066 0.1459 9989 +9991 2 358.2688 395.0644 33.0596 0.1416 9990 +9992 2 357.1465 394.8756 33.3211 0.152 9991 +9993 2 356.0242 394.6892 33.6151 0.1802 9992 +9994 2 354.9031 394.5015 33.9388 0.2163 9993 +9995 2 353.8014 394.2258 34.2737 0.207 9994 +9996 2 353.1128 393.3266 34.5965 0.1821 9995 +9997 2 352.4572 392.3966 34.8891 0.1853 9996 +9998 2 351.8006 391.4665 35.1546 0.1964 9997 +9999 2 350.8534 390.8304 35.371 0.1624 9998 +10000 2 349.7837 390.4312 35.5306 0.1522 9999 +10001 2 348.7118 390.0342 35.6471 0.1577 10000 +10002 2 347.6399 389.6361 35.7319 0.1711 10001 +10003 2 346.5679 389.2368 35.7938 0.1889 10002 +10004 2 345.496 388.8387 35.84 0.1584 10003 +10005 2 344.4241 388.4395 35.8753 0.1628 10004 +10006 2 343.3522 388.0414 35.901 0.1735 10005 +10007 2 342.2802 387.6421 35.9153 0.1903 10006 +10008 2 341.1831 387.3138 35.905 0.1844 10007 +10009 2 340.0654 387.0724 35.8582 0.2097 10008 +10010 2 338.9478 386.8299 35.7834 0.243 10009 +10011 2 337.8312 386.5873 35.6882 0.1805 10010 +10012 2 336.7135 386.3448 35.579 0.1635 10011 +10013 2 335.5958 386.1034 35.4628 0.1508 10012 +10014 2 334.4793 385.8609 35.3433 0.1447 10013 +10015 2 333.3627 385.6184 35.226 0.1413 10014 +10016 2 332.2451 385.3758 35.1134 0.1395 10015 +10017 2 331.1285 385.1345 35.0076 0.1384 10016 +10018 2 330.0108 384.8919 34.9096 0.1378 10017 +10019 2 328.8954 384.6494 34.72 0.1144 10018 +10020 2 366.1544 392.4298 32.8574 0.2203 9984 +10021 2 367.129 391.8303 32.9473 0.1865 10020 +10022 2 368.1026 391.2308 33.0406 0.1652 10021 +10023 2 369.0761 390.6325 33.133 0.1526 10022 +10024 2 370.0485 390.0342 33.32 0.2288 10023 +10025 2 341.4405 376.2273 43.6576 0.1144 -1 +10026 2 341.1991 377.345 43.6055 0.1144 10025 +10027 2 340.9578 378.4638 43.5834 0.1271 10026 +10028 2 340.7164 379.5815 43.5582 0.1313 10027 +10029 2 340.475 380.7003 43.5324 0.1342 10028 +10030 2 340.2336 381.818 43.5081 0.1356 10029 +10031 2 409.1333 351.4311 41.2345 0.1144 -1 +10032 2 410.2167 351.7102 40.6496 0.1144 10031 +10033 2 411.3298 351.9104 40.3774 0.1272 10032 +10034 2 412.2907 351.2995 40.1411 0.1314 10033 +10035 2 413.2528 350.6852 39.9344 0.1338 10034 +10036 2 362.0417 406.795 46.48 0.2288 -1 +10037 2 361.7397 405.6967 46.2087 0.1528 10036 +10038 2 361.4354 404.595 46.1012 0.1525 10037 +10039 2 361.1322 403.4934 45.9609 0.1441 10038 +10040 2 360.7512 402.4192 45.7444 0.1413 10039 +10041 2 360.2685 401.3907 45.4056 0.1393 10040 +10042 2 359.7869 400.3668 44.9845 0.1384 10041 +10043 2 359.3075 399.3464 44.5147 0.1384 10042 +10044 2 358.8282 398.3271 44.028 0.1512 10043 +10045 2 358.3523 397.3043 43.5588 0.1684 10044 +10046 2 357.9347 396.2519 43.1726 0.1848 10045 +10047 2 357.5355 395.1856 42.8876 0.1565 10046 +10048 2 357.1351 394.1172 42.7008 0.149 10047 +10049 2 356.7438 393.0429 42.6177 0.1433 10048 +10050 2 356.4807 391.931 42.7081 0.1406 10049 +10051 2 356.3549 390.8018 43.0262 0.139 10050 +10052 2 356.2313 389.6819 43.5 0.1382 10051 +10053 2 356.1078 388.5688 44.0695 0.1378 10052 +10054 2 355.9842 387.4591 44.6852 0.1399 10053 +10055 2 355.8606 386.3505 45.3009 0.1534 10054 +10056 2 355.7222 385.2386 45.8623 0.1711 10055 +10057 2 355.5289 384.1243 46.2916 0.1807 10056 +10058 2 355.3104 383.0089 46.5917 0.1556 10057 +10059 2 355.0919 381.8889 46.7888 0.1483 10058 +10060 2 354.8722 380.7667 46.907 0.1429 10059 +10061 2 354.6526 379.6444 46.968 0.1404 10060 +10062 2 354.4341 378.5221 46.9902 0.139 10061 +10063 2 354.2156 377.3987 46.9848 0.1382 10062 +10064 2 354.0314 376.2719 46.9501 0.1378 10063 +10065 2 353.9662 375.1302 46.8538 0.1376 10064 +10066 2 353.9056 373.9896 46.7149 0.1374 10065 +10067 2 353.8461 372.8502 46.5052 0.1327 10066 +10068 2 342.1098 282.4376 62.7208 0.1144 -1 +10069 2 341.3604 282.7819 64.6604 0.1345 10068 +10070 2 340.4636 283.2086 66.0072 0.1391 10069 +10071 2 339.5323 283.6388 67.2462 0.1408 10070 +10072 2 338.5462 283.8893 68.516 0.144 10071 +10073 2 338.5382 283.9156 71.2818 0.1502 10072 +10074 2 338.5542 283.9385 74.081 0.1587 10073 +10075 2 338.9912 283.0908 72.8582 0.188 10074 +10076 2 339.5003 282.0955 72.2711 0.1718 10075 +10077 2 339.9968 281.098 71.631 0.1623 10076 +10078 2 340.5036 280.1118 70.9548 0.1641 10077 +10079 2 341.0962 279.1852 70.1828 0.1876 10078 +10080 2 341.7368 278.3032 69.3392 0.2305 10079 +10081 2 342.2734 277.3754 68.5034 0.2509 10080 +10082 2 342.4598 276.2909 67.7359 0.2414 10081 +10083 2 342.596 275.2155 66.8774 0.1626 10082 +10084 2 339.1811 306.783 70.2204 0.2016 -1 +10085 2 338.2419 306.3563 70.5354 0.115 10084 +10086 2 337.2157 305.8896 71.0044 0.1373 10085 +10087 2 336.177 305.4171 71.2127 0.138 10086 +10088 2 335.1268 304.9755 71.4504 0.1384 10087 +10089 2 334.064 304.5637 71.7041 0.1398 10088 +10090 2 332.9932 304.1736 71.9536 0.1399 10089 +10091 2 331.8527 304.1438 72.1353 0.1524 10090 +10092 2 330.7121 304.1141 72.3481 0.1144 10091 +10093 2 339.6662 307.4042 69.7847 0.2513 10084 +10094 2 340.3434 308.3229 69.6116 0.221 10093 +10095 2 340.9692 309.2747 69.3846 0.1724 10094 +10096 2 341.4291 310.3031 69.0544 0.1437 10095 +10097 2 341.6499 311.4048 68.5838 0.1373 10096 +10098 2 341.9141 312.4836 67.9848 0.1373 10097 +10099 2 342.4896 312.2422 67.422 0.1373 10098 +10100 2 343.1382 311.3144 67.0247 0.1373 10099 +10101 2 343.7892 310.3809 66.7436 0.1373 10100 +10102 2 344.4481 309.4486 66.551 0.1373 10101 +10103 2 345.1082 308.5162 66.4238 0.1373 10102 +10104 2 345.7706 307.585 66.29 0.1373 10103 +10105 2 346.5233 306.7293 66.1293 0.1374 10104 +10106 2 347.3745 305.9697 65.9756 0.1374 10105 +10107 2 348.2542 305.2398 65.8501 0.1376 10106 +10108 2 349.2438 304.6769 65.7597 0.1378 10107 +10109 2 350.2859 304.2068 65.7146 0.1382 10108 +10110 2 351.3338 303.7503 65.723 0.1389 10109 +10111 2 352.32 303.1806 65.8899 0.1404 10110 +10112 2 353.2569 302.54 66.25 0.143 10111 +10113 2 354.179 301.8947 66.7444 0.1488 10112 +10114 2 355.0976 301.2484 67.2745 0.1566 10113 +10115 2 356.0139 300.5814 67.6424 0.1847 10114 +10116 2 356.9143 299.8813 67.8664 0.1683 10115 +10117 2 357.7768 299.1308 67.9678 0.1512 10116 +10118 2 358.6348 298.3735 67.9773 0.1382 10117 +10119 2 359.5443 297.6814 67.916 0.1373 10118 +10120 2 360.4721 297.0133 67.816 0.1373 10119 +10121 2 361.4045 296.3521 67.7079 0.1373 10120 +10122 2 362.4913 296.01 67.6245 0.1373 10121 +10123 2 363.5918 295.6965 67.5584 0.1373 10122 +10124 2 364.6923 295.3854 67.5016 0.1373 10123 +10125 2 365.7929 295.0742 67.4456 0.1373 10124 +10126 2 366.8842 294.7344 67.3378 0.1373 10125 +10127 2 367.971 294.3855 67.1664 0.1373 10126 +10128 2 369.0567 294.032 66.9628 0.1373 10127 +10129 2 370.1412 293.6774 66.7486 0.1373 10128 +10130 2 371.2051 293.2701 66.5115 0.1373 10129 +10131 2 372.2462 292.8102 66.2449 0.1373 10130 +10132 2 373.278 292.3275 65.9834 0.1373 10131 +10133 2 374.2688 291.7612 65.793 0.1373 10132 +10134 2 375.2583 291.1903 65.6569 0.1373 10133 +10135 2 376.281 290.679 65.5575 0.1372 10134 +10136 2 377.3598 290.3014 65.4758 0.1372 10135 +10137 2 378.4421 289.9296 65.3948 0.1371 10136 +10138 2 379.538 289.6059 65.2929 0.1368 10137 +10139 2 380.6454 289.3233 65.1566 0.1364 10138 +10140 2 381.7528 289.0453 64.988 0.1356 10139 +10141 2 382.8396 288.7078 64.7097 0.1342 10140 +10142 2 383.9207 288.3624 64.3465 0.1313 10141 +10143 2 384.9869 287.9711 64.0161 0.1269 10142 +10144 2 386.0474 287.557 63.7524 0.1144 10143 +10145 2 387.1044 287.1451 63.383 0.1144 10144 +10146 2 339.5598 305.8415 68.6196 0.2112 10084 +10147 2 339.8904 305.0201 66.8486 0.2316 10146 +10148 2 340.221 303.9883 65.966 0.2124 10147 +10149 2 340.4533 302.9518 64.9706 0.1673 10148 +10150 2 340.6271 302.0618 63.2646 0.1144 10149 +10151 2 394.9534 346.7498 47.3441 0.1144 -1 +10152 2 394.2682 345.9696 48.5215 0.1144 10151 +10153 2 393.9353 344.9217 49.1641 0.1272 10152 +10154 2 392.9709 344.4492 49.9271 0.1317 10153 +10155 2 391.8909 344.662 50.6307 0.1344 10154 +10156 2 390.8922 345.1608 51.2361 0.1357 10155 +10157 2 389.8901 345.6676 51.7647 0.1364 10156 +10158 2 388.92 346.2408 52.2166 0.1368 10157 +10159 2 388.086 347.0049 52.6131 0.1371 10158 +10160 2 387.3733 347.887 52.976 0.1372 10159 +10161 2 386.6285 348.7427 53.3047 0.1372 10160 +10162 2 385.7854 349.5069 53.5763 0.1373 10161 +10163 2 384.8324 350.1281 53.8504 0.1373 10162 +10164 2 383.8234 350.6497 54.1668 0.1373 10163 +10165 2 382.8213 351.1817 54.5272 0.1373 10164 +10166 2 381.8889 351.8189 54.8775 0.1373 10165 +10167 2 381.1488 352.678 55.2084 0.1373 10166 +10168 2 380.5299 353.623 55.6458 0.1373 10167 +10169 2 379.9304 354.5542 56.2988 0.1314 10168 +10170 2 348.0563 262.7779 85.0223 0.139 -1 +10171 2 348.3263 262.8409 84.5656 0.1397 10170 +10172 2 349.1294 263.0628 82.6764 0.1422 10171 +10173 2 349.2483 263.827 81.1451 0.149 10172 +10174 2 348.5734 264.6976 80.4042 0.1566 10173 +10175 2 347.744 265.4355 79.7275 0.183 10174 +10176 2 346.9958 266.2683 79.1521 0.1606 10175 +10177 2 346.2854 267.1446 78.6909 0.1396 10176 +10178 2 345.4537 267.9168 78.3292 0.1144 10177 +10179 2 344.725 268.7576 77.6838 0.1144 10178 +10180 2 347.6444 263.6565 85.0147 0.1383 10170 +10181 2 346.9866 264.5889 85.0077 0.1378 10180 +10182 2 346.1332 265.3439 85.0097 0.1375 10181 +10183 2 345.2031 266.0086 85.0242 0.1374 10182 +10184 2 344.2376 266.6206 85.1063 0.1374 10183 +10185 2 343.3499 267.3299 85.4036 0.1373 10184 +10186 2 342.4518 268.0175 85.8298 0.1373 10185 +10187 2 341.5069 268.6432 86.2 0.1373 10186 +10188 2 340.8411 269.5664 86.4833 0.1373 10187 +10189 2 340.3629 270.6029 86.6695 0.1373 10188 +10190 2 340.0975 271.7149 86.751 0.1373 10189 +10191 2 339.9613 272.8509 86.7376 0.1373 10190 +10192 2 339.9064 273.988 86.4674 0.1144 10191 +10193 2 347.9819 262.588 85.456 0.1144 10170 +10194 2 285.7369 441.552 13.769 0.1144 -1 +10195 2 286.4828 440.9845 15.3753 0.1257 10194 +10196 2 287.3408 440.3302 16.2527 0.154 10195 +10197 2 288.0455 439.566 17.3778 0.178 10196 +10198 2 288.4562 438.6794 18.7982 0.1515 10197 +10199 2 288.9344 437.7482 19.9224 0.1347 10198 +10200 2 295.4746 446.208 22.96 0.1144 -1 +10201 2 294.4313 446.6668 23.1939 0.1524 10200 +10202 2 293.3845 447.1255 23.3329 0.1398 10201 +10203 2 292.3389 447.5854 23.4994 0.1398 10202 +10204 2 291.2933 448.0442 23.6842 0.1384 10203 +10205 2 290.2168 448.4228 23.8766 0.138 10204 +10206 2 289.1391 448.8004 24.0358 0.1504 10205 +10207 2 288.0615 449.1802 24.1479 0.1673 10206 +10208 2 287.001 449.608 24.1993 0.1868 10207 +10209 2 286.1281 450.347 24.174 0.1831 10208 +10210 2 285.2541 451.0849 24.1267 0.2223 10209 +10211 2 284.3778 451.8205 24.0528 0.2713 10210 +10212 2 283.4935 452.5435 23.9312 0.2294 10211 +10213 2 282.5714 453.215 23.7116 0.2088 10212 +10214 2 281.5418 453.6955 23.3998 0.2359 10213 +10215 2 280.5145 454.1806 23.0616 0.278 10214 +10216 2 279.5639 454.7961 22.7057 0.2317 10215 +10217 2 278.8294 455.6609 22.3516 0.1843 10216 +10218 2 278.0114 456.4491 22.0105 0.1635 10217 +10219 2 277.2129 457.2522 21.6477 0.1517 10218 +10220 2 276.6535 458.2361 21.2391 0.1587 10219 +10221 2 276.0769 459.213 20.8897 0.1726 10220 +10222 2 275.5907 460.2358 20.4971 0.1868 10221 +10223 2 275.2327 461.3043 20.0311 0.1577 10222 +10224 2 275.0336 462.4037 19.4871 0.1496 10223 +10225 2 274.3918 463.312 18.8403 0.1472 10224 +10226 2 273.6826 464.0979 17.9851 0.1794 10225 +10227 2 273.7031 464.9479 16.4804 0.2337 10226 +10228 2 273.98 465.9867 16.3828 0.1721 10227 +10229 2 291.0027 444.2655 13.3319 0.1144 -1 +10230 2 290.9295 445.3981 13.6778 0.1144 10229 +10231 2 290.8586 446.5387 13.8395 0.1271 10230 +10232 2 290.9741 447.6735 14.0042 0.1314 10231 +10233 2 291.4866 448.6951 14.1163 0.1342 10232 +10234 2 291.9888 449.7224 14.1885 0.1353 10233 +10235 2 315.6285 438.5101 15.2474 0.2288 -1 +10236 2 316.5128 439.2274 14.9655 0.2035 10235 +10237 2 317.6327 439.447 14.8335 0.2453 10236 +10238 2 318.755 439.6541 14.645 0.1798 10237 +10239 2 325.4428 464.988 14.7342 0.1144 -1 +10240 2 326.3317 464.3862 15.7024 0.1144 10239 +10241 2 326.4335 463.272 16.0338 0.127 10240 +10242 2 325.468 462.8292 16.6648 0.1319 10241 +10243 2 324.3984 463.0306 17.5232 0.1346 10242 +10244 2 323.3493 463.1964 18.5591 0.1405 10243 +10245 2 322.87 463.0008 20.1056 0.1632 10244 +10246 2 323.7005 462.4071 21.2552 0.1843 10245 +10247 2 324.5928 461.8168 22.2424 0.1604 10246 +10248 2 325.4943 461.2196 23.1607 0.1614 10247 +10249 2 326.4152 460.6373 24.0138 0.1719 10248 +10250 2 327.4883 460.6648 24.8362 0.1901 10249 +10251 2 328.4973 461.135 25.4772 0.1718 10250 +10252 2 329.512 461.6109 26.0449 0.1798 10251 +10253 2 330.5668 462.0021 26.54 0.1933 10252 +10254 2 331.6891 462.1485 26.9549 0.1609 10253 +10255 2 332.8239 462.1852 27.2933 0.1514 10254 +10256 2 333.9428 462.2183 27.8679 0.1151 10255 +10257 2 289.7729 460.0733 27.8438 0.1144 -1 +10258 2 289.5967 458.9522 27.5023 0.1144 10257 +10259 2 289.4194 457.8231 27.355 0.1524 10258 +10260 2 289.2421 456.6951 27.1809 0.2034 10259 +10261 2 289.0648 455.5683 26.9871 0.2626 10260 +10262 2 288.463 454.5981 26.7914 0.2246 10261 +10263 2 287.692 453.7573 26.5988 0.1804 10262 +10264 2 286.9198 452.9165 26.404 0.1614 10263 +10265 2 286.1476 452.0768 26.1962 0.1628 10264 +10266 2 285.3777 451.2359 25.9708 0.1738 10265 +10267 2 284.6455 450.3711 25.7137 0.1901 10266 +10268 2 285.0596 449.3209 25.2609 0.1583 10267 +10269 2 285.4852 448.2833 24.712 0.1495 10268 +10270 2 285.8925 447.2342 24.2061 0.1458 10269 +10271 2 286.2723 446.1657 23.8563 0.1562 10270 +10272 2 286.6567 445.0915 23.6328 0.172 10271 +10273 2 287.0891 444.0379 23.5187 0.183 10272 +10274 2 287.7297 443.0941 23.4858 0.1584 10273 +10275 2 288.5099 442.259 23.4894 0.1641 10274 +10276 2 289.1437 441.3163 23.5166 0.1763 10275 +10277 2 289.607 440.297 23.5582 0.184 10276 +10278 2 290.4719 439.5488 23.5399 0.1572 10277 +10279 2 291.3928 438.8716 23.4307 0.143 10278 +10280 2 296.8474 457.6286 27.7553 0.2288 -1 +10281 2 297.3256 456.591 27.8823 0.178 10280 +10282 2 297.8049 455.5522 27.9336 0.2118 10281 +10283 2 298.2831 454.5135 27.9874 0.2429 10282 +10284 2 298.9364 453.5743 28.0711 0.1806 10283 +10285 2 299.6937 452.7243 28.1971 0.1632 10284 +10286 2 299.9099 451.6066 28.2601 0.1506 10285 +10287 2 299.6411 450.4958 28.2016 0.1445 10286 +10288 2 299.6342 449.4078 28.0308 0.1378 10287 +10289 2 292.5769 527.1541 24.2239 0.2288 -1 +10290 2 293.5824 526.6141 24.4032 0.1526 10289 +10291 2 294.5903 526.073 24.4795 0.1525 10290 +10292 2 295.5982 525.5319 24.5708 0.144 10291 +10293 2 296.6049 524.9919 24.6732 0.1413 10292 +10294 2 297.6127 524.4519 24.7836 0.1393 10293 +10295 2 298.6195 523.9108 24.8994 0.1384 10294 +10296 2 299.7623 523.8948 25.0159 0.1379 10295 +10297 2 300.8686 524.1842 25.1337 0.1376 10296 +10298 2 301.9737 524.4737 25.2611 0.1375 10297 +10299 2 303.0799 524.762 25.4036 0.1501 10298 +10300 2 304.1885 525.0342 25.5694 0.167 10299 +10301 2 305.3027 524.8832 25.8066 0.1851 10300 +10302 2 306.0589 524.0355 26.131 0.1565 10301 +10303 2 306.8139 523.189 26.5151 0.1489 10302 +10304 2 307.5713 522.3493 26.9276 0.1432 10303 +10305 2 308.3915 521.5828 27.3324 0.1405 10304 +10306 2 309.4486 521.2178 27.6638 0.139 10305 +10307 2 310.5868 521.2979 27.8592 0.1382 10306 +10308 2 311.7274 521.378 27.9491 0.1378 10307 +10309 2 312.8691 521.4581 27.9562 0.1376 10308 +10310 2 314.0097 521.5382 27.8985 0.1374 10309 +10311 2 315.1503 521.5976 27.8004 0.1374 10310 +10312 2 316.2748 521.4718 27.6682 0.1373 10311 +10313 2 317.3193 521.0096 27.4968 0.1373 10312 +10314 2 318.3477 520.5211 27.2489 0.133 10313 +10315 2 365.889 474.3116 18.0835 0.1144 -1 +10316 2 365.6762 475.4327 17.8939 0.1144 10315 +10317 2 365.4622 476.5561 17.8095 0.1271 10316 +10318 2 365.2483 477.6795 17.711 0.1313 10317 +10319 2 365.0904 478.812 17.6228 0.1342 10318 +10320 2 365.103 479.956 17.601 0.1356 10319 +10321 2 365.119 481.1 17.6193 0.1364 10320 +10322 2 365.2151 482.2395 17.5766 0.1368 10321 +10323 2 365.3192 483.3778 17.4694 0.1371 10322 +10324 2 365.4153 484.5149 17.3047 0.1372 10323 +10325 2 365.3021 485.6486 17.0701 0.1372 10324 +10326 2 365.0401 486.756 16.7741 0.1373 10325 +10327 2 364.6763 487.8313 16.465 0.1379 10326 +10328 2 364.0791 488.8015 16.2036 0.1507 10327 +10329 2 363.4854 489.775 15.978 0.1677 10328 +10330 2 362.9718 490.7886 15.7744 0.186 10329 +10331 2 362.9054 491.928 15.5631 0.1702 10330 +10332 2 362.8299 493.0651 15.3453 0.1797 10331 +10333 2 362.6297 494.1863 15.1149 0.1912 10332 +10334 2 362.1687 495.2284 14.8698 0.1599 10333 +10335 2 361.7442 496.2855 14.6425 0.1508 10334 +10336 2 361.401 497.3746 14.4812 0.1443 10335 +10337 2 360.9572 498.4282 14.3765 0.1412 10336 +10338 2 360.4023 499.4281 14.3162 0.1394 10337 +10339 2 359.8475 500.4291 14.2879 0.1384 10338 +10340 2 359.2915 501.4289 14.28 0.1378 10339 +10341 2 358.7367 502.4288 14.28 0.1376 10340 +10342 2 358.1807 503.4286 14.28 0.1375 10341 +10343 2 357.6258 504.4285 14.28 0.1374 10342 +10344 2 357.055 505.4192 14.28 0.1373 10343 +10345 2 356.3297 506.2966 14.28 0.1373 10344 +10346 2 355.3287 506.8503 14.28 0.1373 10345 +10347 2 354.3277 507.404 14.28 0.1373 10346 +10348 2 353.3267 507.9577 14.28 0.1373 10347 +10349 2 352.3268 508.5126 14.28 0.1373 10348 +10350 2 351.3441 509.096 14.28 0.1356 10349 +10351 2 367.9047 471.304 19.6907 0.1144 -1 +10352 2 368.0614 472.4365 19.7263 0.2034 10351 +10353 2 368.1575 473.5771 19.7437 0.1823 10352 +10354 2 368.2662 474.7154 19.761 0.2105 10353 +10355 2 368.5785 475.8159 19.7694 0.2048 10354 +10356 2 368.9251 476.9061 19.7545 0.2314 10355 +10357 2 369.2535 478.0021 19.7072 0.2142 10356 +10358 2 369.5967 479.0935 19.6262 0.1734 10357 +10359 2 369.9364 480.1848 19.5177 0.1579 10358 +10360 2 370.2476 481.2842 19.3855 0.1481 10359 +10361 2 370.529 482.3916 19.2347 0.1432 10360 +10362 2 370.7086 483.5185 19.0729 0.1405 10361 +10363 2 370.8756 484.6487 18.9003 0.1645 10362 +10364 2 371.0438 485.7779 18.7175 0.1977 10363 +10365 2 371.2909 486.8921 18.5285 0.2365 10364 +10366 2 371.6032 487.9892 18.333 0.1898 10365 +10367 2 371.927 489.084 18.1394 0.1913 10366 +10368 2 372.1867 490.196 17.9567 0.1991 10367 +10369 2 372.5859 491.2656 17.787 0.1639 10368 +10370 2 372.9795 492.3376 17.6294 0.1528 10369 +10371 2 387.832 476.6568 36.6478 0.1373 -1 +10372 2 388.0814 476.9954 36.3992 0.1261 10371 +10373 2 388.7449 477.8911 35.772 0.1287 10372 +10374 2 389.4153 478.8006 35.3562 0.1369 10373 +10375 2 389.9907 479.781 35.0949 0.1365 10374 +10376 2 390.414 480.8404 35.0104 0.1358 10375 +10377 2 390.7996 481.9157 35.1064 0.1345 10376 +10378 2 391.0364 483.022 35.4435 0.1319 10377 +10379 2 390.3522 482.7085 36.2222 0.1271 10378 +10380 2 389.5297 482.1113 37.438 0.1144 10379 +10381 2 388.8959 481.6526 39.48 0.1144 10380 +10382 2 387.4934 476.5218 37.3156 0.1373 10371 +10383 2 386.5015 476.1259 38.2805 0.1373 10382 +10384 2 385.5372 475.6123 39.1118 0.1373 10383 +10385 2 384.8496 474.7406 39.7695 0.1373 10384 +10386 2 384.1609 473.8562 40.336 0.1373 10385 +10387 2 383.4699 472.9674 40.8299 0.1373 10386 +10388 2 382.7755 472.0762 41.2698 0.1373 10387 +10389 2 382.08 471.1816 41.6662 0.1373 10388 +10390 2 381.3844 470.287 42.0473 0.1373 10389 +10391 2 380.6889 469.3935 42.4343 0.1374 10390 +10392 2 379.9933 468.4989 42.8299 0.1374 10391 +10393 2 379.2978 467.6066 43.2359 0.1376 10392 +10394 2 378.6079 466.712 43.6783 0.1378 10393 +10395 2 377.9181 465.8196 44.1507 0.1383 10394 +10396 2 377.2306 464.9273 44.6432 0.1391 10395 +10397 2 376.5442 464.0361 45.1458 0.1406 10396 +10398 2 375.8566 463.145 45.6481 0.1433 10397 +10399 2 375.1691 462.2538 46.1415 0.1492 10398 +10400 2 374.4804 461.3603 46.6158 0.1568 10399 +10401 2 373.7997 460.4589 47.0574 0.1858 10400 +10402 2 373.1408 459.5368 47.4401 0.1675 10401 +10403 2 372.5207 458.585 47.7655 0.1505 10402 +10404 2 371.9236 457.6149 48.0348 0.1375 10403 +10405 2 371.3275 456.6425 48.2513 0.1372 10404 +10406 2 370.7258 455.6724 48.4182 0.1371 10405 +10407 2 369.7614 455.0626 48.4604 0.1368 10406 +10408 2 368.7867 454.4632 48.4089 0.1364 10407 +10409 2 367.8132 453.8648 48.295 0.1356 10408 +10410 2 366.8408 453.2654 48.1449 0.1342 10409 +10411 2 365.8775 452.6511 47.9833 0.1313 10410 +10412 2 365.3295 451.6478 47.8814 0.1271 10411 +10413 2 364.7827 450.6433 47.8383 0.1144 10412 +10414 2 364.2359 449.6389 47.88 0.1144 10413 +10415 2 388.4463 476.746 36.1091 0.1373 10371 +10416 2 389.5091 476.9004 35.1456 0.1373 10415 +10417 2 390.5067 477.2207 34.0953 0.1445 10416 +10418 2 391.3979 477.7733 32.996 0.161 10417 +10419 2 392.2582 478.4151 32.0298 0.1812 10418 +10420 2 393.1173 479.0992 31.2542 0.1652 10419 +10421 2 393.9753 479.7982 30.5399 0.1516 10420 +10422 2 394.7944 480.5429 29.841 0.1452 10421 +10423 2 395.4945 481.3986 29.16 0.1415 10422 +10424 2 396.1512 482.2967 28.5068 0.1396 10423 +10425 2 396.8113 483.1959 27.8875 0.1386 10424 +10426 2 397.4725 484.0985 27.3079 0.138 10425 +10427 2 398.1406 485.0011 26.7714 0.1377 10426 +10428 2 398.8602 485.8671 26.2827 0.1375 10427 +10429 2 399.6003 486.7171 25.8066 0.1374 10428 +10430 2 400.3405 487.5671 25.3219 0.1373 10429 +10431 2 401.1047 488.3919 24.8154 0.1373 10430 +10432 2 402.0325 488.9994 24.2745 0.1373 10431 +10433 2 403.0278 489.5176 23.7327 0.1373 10432 +10434 2 403.9887 490.0999 23.2183 0.1373 10433 +10435 2 404.9005 490.7577 22.704 0.1373 10434 +10436 2 405.7127 491.531 22.1917 0.1373 10435 +10437 2 406.509 492.3296 21.7239 0.1373 10436 +10438 2 407.3612 493.0743 21.334 0.1373 10437 +10439 2 408.2593 493.771 21.0333 0.1373 10438 +10440 2 409.1344 494.4254 20.2906 0.1373 10439 +10441 2 410.0691 495.0797 20.0873 0.1373 10440 +10442 2 411.0117 495.7261 19.9728 0.1373 10441 +10443 2 411.9979 496.3027 19.8834 0.1561 10442 +10444 2 413.0412 496.7671 19.7978 0.1879 10443 +10445 2 414.1234 497.1344 19.7348 0.2261 10444 +10446 2 415.2537 497.2041 19.6719 0.1905 10445 +10447 2 416.3622 496.9502 19.5705 0.1648 10446 +10448 2 417.4467 496.5944 19.417 0.1523 10447 +10449 2 418.5267 496.2249 19.2136 0.1553 10448 +10450 2 419.5323 495.6986 18.9448 0.188 10449 +10451 2 420.4623 495.0477 18.6155 0.238 10450 +10452 2 421.4656 494.5272 18.2402 0.2659 10451 +10453 2 422.2367 495.169 17.8379 0.2229 10452 +10454 2 422.9288 496.0681 17.4941 0.2414 10453 +10455 2 423.6838 496.9181 17.1838 0.2331 10454 +10456 2 424.3622 497.8333 16.9465 0.2796 10455 +10457 2 424.9605 498.8057 16.7997 0.2492 10456 +10458 2 425.5451 499.7896 16.7241 0.2652 10457 +10459 2 426.1297 500.7723 16.6933 0.1967 10458 +10460 2 426.5667 501.8293 16.693 0.1712 10459 +10461 2 426.8619 502.9333 16.7076 0.1552 10460 +10462 2 427.4865 503.8885 16.6929 0.1469 10461 +10463 2 428.0779 504.8666 16.6199 0.1425 10462 +10464 2 428.5012 505.9271 16.4633 0.1401 10463 +10465 2 429.0847 506.9064 16.2534 0.1388 10464 +10466 2 429.6395 507.9005 15.9921 0.1381 10465 +10467 2 430.1634 508.9107 15.6973 0.1377 10466 +10468 2 430.0056 510.0318 15.3868 0.1375 10467 +10469 2 429.4782 511.0408 15.0999 0.1374 10468 +10470 2 428.8776 512.0086 14.8633 0.1373 10469 +10471 2 428.1866 512.9124 14.56 0.1144 10470 +10472 2 392.1838 620.2448 16.023 0.2288 -1 +10473 2 391.6141 619.3067 16.8121 0.2668 10472 +10474 2 391.0238 618.3343 17.1009 0.1907 10473 +10475 2 390.4541 617.3482 17.3792 0.1693 10474 +10476 2 390.2333 616.2305 17.6179 0.1539 10475 +10477 2 390.0205 615.1094 17.8132 0.1464 10476 +10478 2 389.81 613.9859 17.9616 0.1422 10477 +10479 2 389.5972 612.8625 18.061 0.1399 10478 +10480 2 389.3924 611.738 18.1322 0.1386 10479 +10481 2 389.2037 610.61 18.183 0.1381 10480 +10482 2 389.0138 609.482 18.2199 0.1377 10481 +10483 2 388.8273 608.3529 18.2464 0.1375 10482 +10484 2 388.6385 607.2249 18.2651 0.1374 10483 +10485 2 388.4498 606.0969 18.2788 0.1374 10484 +10486 2 388.2633 604.9678 18.2883 0.1373 10485 +10487 2 388.0734 603.8398 18.2955 0.1373 10486 +10488 2 387.8858 602.7107 18.3008 0.1373 10487 +10489 2 387.6924 601.5838 18.3047 0.1373 10488 +10490 2 387.3916 600.4799 18.3078 0.1373 10489 +10491 2 386.9672 599.4182 18.3103 0.1373 10490 +10492 2 386.5416 598.3555 18.3129 0.1373 10491 +10493 2 386.1172 597.2938 18.3154 0.1373 10492 +10494 2 385.6927 596.2311 18.3185 0.1373 10493 +10495 2 385.2683 595.1694 18.3221 0.1373 10494 +10496 2 384.8416 594.1078 18.3269 0.1373 10495 +10497 2 384.4183 593.045 18.3334 0.1373 10496 +10498 2 383.9962 591.9811 18.3421 0.1373 10497 +10499 2 383.6404 590.8943 18.3544 0.1373 10498 +10500 2 383.2983 589.8018 18.3716 0.1373 10499 +10501 2 382.9574 588.7104 18.3952 0.1373 10500 +10502 2 382.62 587.6179 18.4283 0.1373 10501 +10503 2 382.3351 586.5094 18.4747 0.1373 10502 +10504 2 382.1463 585.3814 18.5405 0.1373 10503 +10505 2 381.9587 584.2534 18.6331 0.1373 10504 +10506 2 381.77 583.1265 18.7599 0.1373 10505 +10507 2 381.5789 582.0008 18.9264 0.1373 10506 +10508 2 381.3295 580.8877 19.1337 0.1374 10507 +10509 2 381.0172 579.7918 19.3726 0.1501 10508 +10510 2 380.7038 578.6958 19.6227 0.1671 10509 +10511 2 380.3926 577.5999 19.8633 0.1863 10510 +10512 2 380.11 576.4948 20.0761 0.1569 10511 +10513 2 379.848 575.3828 20.2544 0.1493 10512 +10514 2 379.5849 574.2708 20.4033 0.1434 10513 +10515 2 379.3229 573.1589 20.5272 0.1407 10514 +10516 2 379.0335 572.0538 20.6318 0.1391 10515 +10517 2 378.5599 571.0127 20.7211 0.1383 10516 +10518 2 378.0485 569.99 20.7982 0.1378 10517 +10519 2 377.5372 568.9684 20.9782 0.1376 10518 +10520 2 377.0464 567.9514 21.2367 0.1374 10519 +10521 2 376.6963 566.8898 21.6667 0.1373 10520 +10522 2 376.376 565.7961 21.902 0.1467 10521 +10523 2 376.0694 564.7013 22.1992 0.1721 10522 +10524 2 375.7434 563.6133 22.5491 0.2071 10523 +10525 2 375.3739 562.5426 22.9382 0.2089 10524 +10526 2 374.9746 561.4844 23.3489 0.1781 10525 +10527 2 374.5696 560.4284 23.7633 0.1588 10526 +10528 2 374.1795 559.3645 24.1643 0.1489 10527 +10529 2 373.8192 558.2903 24.5356 0.1436 10528 +10530 2 373.4725 557.2081 24.8692 0.1407 10529 +10531 2 373.1259 556.1247 25.1666 0.1487 10530 +10532 2 372.7713 555.0425 25.4362 0.1637 10531 +10533 2 372.3926 553.9683 25.6915 0.1824 10532 +10534 2 372.0025 552.8986 25.9471 0.1743 10533 +10535 2 371.6009 551.8324 26.2183 0.1769 10534 +10536 2 371.1147 550.8063 26.5297 0.1897 10535 +10537 2 370.5725 549.811 26.9014 0.1875 10536 +10538 2 370.0771 548.7951 27.3227 0.2054 10537 +10539 2 369.6218 547.7586 27.7339 0.2369 10538 +10540 2 369.1459 546.7279 28.0834 0.1932 10539 +10541 2 368.6197 545.72 28.3749 0.1671 10540 +10542 2 368.0797 544.7167 28.6163 0.1535 10541 +10543 2 367.5397 543.7112 28.817 0.146 10542 +10544 2 366.9998 542.7056 28.9904 0.142 10543 +10545 2 366.4587 541.6989 29.1502 0.16 10544 +10546 2 365.9176 540.6933 29.304 0.2011 10545 +10547 2 365.3787 539.6866 29.4515 0.255 10546 +10548 2 364.9703 538.6215 29.5851 0.2343 10547 +10549 2 364.7404 537.5038 29.6929 0.2004 10548 +10550 2 364.5459 536.377 29.7833 0.1921 10549 +10551 2 364.3869 535.2444 29.8679 0.1983 10550 +10552 2 364.4223 534.1061 29.9681 0.1706 10551 +10553 2 364.65 532.9885 30.0969 0.1551 10552 +10554 2 364.9097 531.8765 30.254 0.1679 10553 +10555 2 365.1694 530.7645 30.4335 0.2063 10554 +10556 2 365.4291 529.6526 30.6275 0.2588 10555 +10557 2 365.6281 528.5303 30.828 0.2346 10556 +10558 2 365.7505 527.3954 31.0279 0.1897 10557 +10559 2 365.81 526.256 31.2234 0.1656 10558 +10560 2 365.6087 525.1383 31.4168 0.1631 10559 +10561 2 365.1648 524.0904 31.6 0.1942 10560 +10562 2 364.69 523.0517 31.7741 0.2534 10561 +10563 2 364.2153 522.0129 31.9399 0.284 10562 +10564 2 363.7382 520.9753 32.0914 0.2465 10563 +10565 2 363.2589 519.9377 32.223 0.1956 10564 +10566 2 362.7784 518.9012 32.335 0.1689 10565 +10567 2 362.2979 517.8636 32.4299 0.1543 10566 +10568 2 361.8175 516.826 32.5102 0.1464 10567 +10569 2 361.3358 515.7884 32.5772 0.1422 10568 +10570 2 360.8817 514.7382 32.6278 0.14 10569 +10571 2 360.4572 513.6766 32.657 0.1387 10570 +10572 2 360.0431 512.6104 32.6634 0.138 10571 +10573 2 359.6278 511.5442 32.6477 0.1377 10572 +10574 2 359.2126 510.478 32.6127 0.1375 10573 +10575 2 358.5925 509.5239 32.4506 0.1374 10574 +10576 2 357.9141 508.6087 32.2067 0.1374 10575 +10577 2 357.3593 507.6111 32.0278 0.1373 10576 +10578 2 356.8136 506.6078 31.904 0.1379 10577 +10579 2 356.4098 505.537 31.8416 0.1637 10578 +10580 2 356.0986 504.4365 31.8366 0.1979 10579 +10581 2 355.6993 503.3657 31.8802 0.234 10580 +10582 2 355.1193 502.3807 31.9634 0.1761 10581 +10583 2 354.4764 501.4358 32.0614 0.1607 10582 +10584 2 353.9605 500.4153 32.1087 0.1492 10583 +10585 2 353.3267 499.4807 31.7845 0.1429 10584 +10586 2 352.7821 498.5174 31.3146 0.1398 10585 +10587 2 352.4424 497.4284 31.1914 0.1385 10586 +10588 2 352.1255 496.3313 31.3144 0.1591 10587 +10589 2 351.6061 495.3211 31.5554 0.2033 10588 +10590 2 350.8499 494.4734 31.792 0.2586 10589 +10591 2 350.1978 493.5388 31.9749 0.2314 10590 +10592 2 349.9187 492.4394 32.0662 0.1867 10591 +10593 2 349.7414 491.3102 32.0765 0.1642 10592 +10594 2 349.5698 490.1788 32.0396 0.1517 10593 +10595 2 349.3982 489.0474 31.9861 0.1451 10594 +10596 2 349.1843 487.924 31.9337 0.1414 10595 +10597 2 348.8113 486.8441 31.8822 0.1395 10596 +10598 2 348.3972 485.7779 31.8332 0.1385 10597 +10599 2 347.9796 484.7128 31.7906 0.1379 10598 +10600 2 347.5747 483.6432 31.761 0.1489 10599 +10601 2 347.1765 482.5712 31.7481 0.1765 10600 +10602 2 346.7773 481.4993 31.7559 0.2123 10601 +10603 2 346.3689 480.4308 31.8111 0.2076 10602 +10604 2 345.949 479.368 31.9435 0.1731 10603 +10605 2 345.5269 478.3075 32.1381 0.1569 10604 +10606 2 345.1082 477.2471 32.3571 0.1477 10605 +10607 2 344.7044 476.1786 32.5427 0.1429 10606 +10608 2 344.304 475.1089 32.6841 0.1404 10607 +10609 2 343.9024 474.0381 32.7818 0.1389 10608 +10610 2 343.4997 472.9685 32.8404 0.1381 10609 +10611 2 343.0982 471.8966 32.872 0.1378 10610 +10612 2 342.6966 470.8258 32.888 0.1491 10611 +10613 2 342.2951 469.755 32.8955 0.1655 10612 +10614 2 341.8936 468.6831 32.8888 0.185 10613 +10615 2 341.4966 467.61 32.8681 0.1598 10614 +10616 2 341.1088 466.5346 32.8432 0.15 10615 +10617 2 340.7244 465.457 32.7925 0.144 10616 +10618 2 340.3411 464.3805 32.6914 0.1409 10617 +10619 2 339.6342 463.503 32.2787 0.1391 10618 +10620 2 338.7899 462.8144 31.4331 0.1382 10619 +10621 2 338.0291 462.0719 30.45 0.1378 10620 +10622 2 337.4056 461.1842 29.5638 0.1376 10621 +10623 2 336.7844 460.2873 28.7193 0.1374 10622 +10624 2 336.1575 459.3846 27.9427 0.1374 10623 +10625 2 335.5947 458.4374 27.2602 0.1373 10624 +10626 2 335.2984 457.3678 26.6871 0.1373 10625 +10627 2 335.2378 456.2421 26.2109 0.1373 10626 +10628 2 335.1771 455.1129 25.7919 0.1373 10627 +10629 2 335.1176 453.9804 25.4229 0.1373 10628 +10630 2 335.057 452.8455 25.0959 0.1373 10629 +10631 2 334.9964 451.7095 24.8039 0.1373 10630 +10632 2 334.9357 450.5758 24.4678 0.1313 10631 +10633 2 371.8194 445.6235 60.2977 0.1144 -1 +10634 2 370.791 445.2471 59.4896 0.1389 10633 +10635 2 369.7259 444.857 59.1276 0.1726 10634 +10636 2 368.6208 444.627 58.6751 0.1502 10635 +10637 2 367.5077 444.6877 58.079 0.1454 10636 +10638 2 366.4518 445.0503 57.4762 0.1413 10637 +10639 2 365.4874 445.6166 56.9038 0.1384 10638 +10640 2 508.3558 622.7227 58.9803 0.1144 -1 +10641 2 509.2733 623.361 58.3839 0.1144 10640 +10642 2 510.2091 624.0108 58.1182 0.1398 10641 +10643 2 511.1415 624.6595 57.813 0.1611 10642 +10644 2 511.9206 625.4809 57.4868 0.1822 10643 +10645 2 512.3152 626.5494 57.2076 0.1551 10644 +10646 2 512.7099 627.6178 56.9604 0.1483 10645 +10647 2 513.1057 628.6875 56.7437 0.1429 10646 +10648 2 513.489 629.7617 56.5401 0.1404 10647 +10649 2 513.8619 630.8405 56.3346 0.139 10648 +10650 2 514.236 631.9181 56.1215 0.1382 10649 +10651 2 514.609 632.9958 55.8986 0.1377 10650 +10652 2 514.9808 634.0734 55.6682 0.1375 10651 +10653 2 515.3537 635.1511 55.4333 0.1374 10652 +10654 2 515.7266 636.2276 55.1961 0.1379 10653 +10655 2 516.0984 637.3052 54.9567 0.1507 10654 +10656 2 516.4714 638.3817 54.7142 0.1677 10655 +10657 2 516.8432 639.4594 54.467 0.1865 10656 +10658 2 517.2161 640.5359 54.2156 0.1835 10657 +10659 2 517.5994 641.6078 53.961 0.2106 10658 +10660 2 518.2652 642.5207 53.6682 0.2507 10659 +10661 2 519.2044 643.1591 53.3501 0.2102 10660 +10662 2 520.0487 643.9187 53.0491 0.2073 10661 +10663 2 520.7991 644.7767 52.8032 0.1703 10662 +10664 2 521.5507 645.6347 52.6025 0.1719 10663 +10665 2 522.2875 646.5053 52.4404 0.1938 10664 +10666 2 522.8869 647.4743 52.3236 0.222 10665 +10667 2 523.2713 648.5519 52.2533 0.2191 10666 +10668 2 523.65 649.6307 52.2018 0.2012 10667 +10669 2 523.9703 650.7278 52.1184 0.2 10668 +10670 2 524.198 651.8466 51.9498 0.1651 10669 +10671 2 524.4233 652.9597 51.6589 0.1478 10670 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc new file mode 100644 index 0000000..7376d58 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc @@ -0,0 +1,1534 @@ +#name E:/Vaa3D-2.938/169250.03.02.01/169250.03.02.01_470218928_Nivi7.swc +#comment +##n,type,x,y,z,radius,parent +1 1 414.8144 408.5224 15.12 6.4406 -1 +2 3 415.7685 414.0582 14.8882 0.3686 1 +3 3 415.6495 414.9757 16.5147 0.5339 2 +4 3 415.3658 416.0739 16.8563 0.661 3 +5 3 415.6415 417.1756 16.515 0.6991 4 +6 3 416.1872 418.1366 17.2357 0.7118 5 +7 3 416.8393 419.0758 17.3597 0.7245 6 +8 3 417.5886 419.9407 17.36 0.7627 7 +9 3 418.4752 420.6625 17.36 0.8008 8 +10 3 419.4945 422.4128 17.3135 0.5466 9 +11 3 420.1923 423.3166 17.1464 0.5212 10 +12 3 420.6133 424.3393 16.4335 0.4957 11 +13 3 421.135 425.3369 15.9295 0.4957 12 +14 3 421.3546 426.458 16.0826 0.4449 13 +15 3 421.6567 427.5608 16.0269 0.3559 14 +16 3 421.5423 428.5184 17.4675 0.2669 15 +17 3 421.4713 429.6498 17.4583 0.2924 16 +18 3 421.4118 430.7492 17.8839 0.3432 17 +19 3 420.9199 431.7662 17.7391 0.3686 18 +20 3 420.174 432.6116 17.9446 0.3686 19 +21 3 419.371 433.3804 17.7316 0.3432 20 +22 3 419.0014 434.3562 16.9249 0.3559 21 +23 3 418.7212 435.324 15.9732 0.3686 22 +24 3 418.4203 436.4211 16.0723 0.3813 23 +25 3 418.1846 437.4965 16.7093 0.394 24 +26 3 417.7648 438.4963 17.4961 0.394 25 +27 3 417.1802 439.1278 16.5441 0.3813 26 +28 3 416.543 439.733 16.4973 0.3432 27 +29 3 415.8188 440.2512 18.1639 0.3178 28 +30 3 414.8453 440.6013 18.958 0.3051 29 +31 3 413.7242 440.6082 18.9213 0.2796 30 +32 3 412.6202 440.8038 19.0162 0.2796 31 +33 3 412.118 441.6995 19.4015 0.3051 32 +34 3 412.285 442.7749 20.083 0.394 33 +35 3 412.817 443.729 20.869 0.4449 34 +36 3 413.5102 444.6316 21.0196 0.4957 35 +37 3 413.556 445.7585 21.2654 0.5212 36 +38 3 413.143 447.0741 19.6034 0.4322 37 +39 3 412.6168 448.0808 19.8881 0.394 38 +40 3 412.0562 449.0143 20.657 0.3432 39 +41 3 411.5151 449.926 21.4312 0.3051 40 +42 3 410.8848 450.8744 21.2789 0.2924 41 +43 3 410.2292 451.8056 21.1624 0.2542 42 +44 3 409.6698 452.7929 20.9762 0.2034 43 +45 3 409.2568 453.8294 20.4523 0.178 44 +46 3 409.0704 454.9436 20.1698 0.178 45 +47 3 409.1802 456.0339 20.5537 0.1907 46 +48 3 409.1585 457.0211 21.546 0.2034 47 +49 3 408.7409 458.0141 22.437 0.2161 48 +50 3 408.4881 459.1055 22.78 0.2161 49 +51 3 408.4904 460.2426 22.8189 0.2034 50 +52 3 408.6723 461.3706 22.8502 0.1907 51 +53 3 408.9983 462.462 22.8077 0.2034 52 +54 3 409.3038 463.5351 23.119 0.2161 53 +55 3 409.2202 464.6299 23.3598 0.2288 54 +56 3 408.6654 465.5977 23.214 0.2161 55 +57 3 408.1895 466.6021 23.0574 0.178 56 +58 3 407.7937 467.658 22.6853 0.1398 57 +59 3 407.1096 468.5458 22.4742 0.1271 58 +60 3 406.1921 469.0686 23.1949 0.1525 59 +61 3 405.2128 469.4415 24.3166 0.178 60 +62 3 404.4051 470.0868 25.3742 0.178 61 +63 3 403.5494 470.7869 25.4982 0.178 62 +64 3 402.6651 471.4756 25.8037 0.1907 63 +65 3 401.6881 472.0396 26.0574 0.2415 64 +66 3 400.9526 472.8244 26.6879 0.2542 65 +67 3 400.4972 473.8471 26.6627 0.2415 66 +68 3 400.1929 474.9465 26.6081 0.2034 67 +69 3 399.693 475.809 27.7763 0.2161 68 +70 3 398.9185 476.6007 27.4254 0.2669 69 +71 3 397.9564 477.1212 26.6462 0.3051 70 +72 3 396.9051 477.5262 26.1811 0.3051 71 +73 3 395.9258 478.0753 25.664 0.2669 72 +74 3 395.0358 478.7617 26.1218 0.2415 73 +75 3 394.2796 479.5877 26.6865 0.2415 74 +76 3 394.2979 480.4628 28.3556 0.2542 75 +77 3 393.9936 481.4684 28.3256 0.2669 76 +78 3 393.1653 482.2029 28.7921 0.2542 77 +79 3 392.3051 482.9499 28.8492 0.2288 78 +80 3 391.4688 483.6088 29.6657 0.2161 79 +81 3 390.4838 483.9257 30.6312 0.2415 80 +82 3 389.5057 484.3719 30.3834 0.2924 81 +83 3 388.6191 485.0594 29.8824 0.3305 82 +84 3 387.6398 485.6314 29.7548 0.3305 83 +85 3 386.7441 486.3178 29.9541 0.3051 84 +86 3 385.8312 486.9253 29.412 0.2542 85 +87 3 385.0429 487.7295 29.0755 0.2288 86 +88 3 385.0704 488.8312 29.4 0.2288 87 +89 3 413.8923 446.5295 21.2332 0.3305 37 +90 3 414.0719 447.6209 21.6059 0.3051 89 +91 3 413.9209 448.7306 21.5765 0.2796 90 +92 3 413.8763 449.846 21.0935 0.2542 91 +93 3 413.8466 450.9797 20.9381 0.1907 92 +94 3 413.2814 451.9166 21.294 0.1652 93 +95 3 412.3491 452.5172 21.782 0.178 94 +96 3 411.2897 452.8616 22.3804 0.2288 95 +97 3 410.3208 453.2002 23.5788 0.2542 96 +98 3 409.218 453.2986 24.0853 0.2796 97 +99 3 408.5087 454.065 24.8021 0.2796 98 +100 3 408.4114 455.1507 25.4965 0.2796 99 +101 3 408.6185 456.1403 26.7708 0.2669 100 +102 3 409.0178 457.1332 27.7544 0.2796 101 +103 3 409.3953 458.1548 28.5242 0.2669 102 +104 3 408.9789 458.8973 30.2677 0.2542 103 +105 3 407.9515 459.356 30.3562 0.2161 104 +106 3 407.2068 460.1763 29.6979 0.2161 105 +107 3 406.6874 461.1681 29.3798 0.2161 106 +108 3 406.4792 462.2847 29.687 0.2288 107 +109 3 406.4232 463.3829 30.3103 0.2288 108 +110 3 406.5341 464.4182 31.3561 0.2161 109 +111 3 406.2985 465.481 32.097 0.2161 110 +112 3 406.0285 466.4706 33.1758 0.2288 111 +113 3 406.0239 467.5745 33.2567 0.2669 112 +114 3 406.2035 468.611 32.58 0.3051 113 +115 3 406.7515 469.6063 32.415 0.3051 114 +116 3 407.2846 470.6004 32.1434 0.2669 115 +117 3 407.645 471.5591 32.5606 0.2161 116 +118 3 407.2034 472.337 33.9486 0.1907 117 +119 3 406.4735 473.1492 34.613 0.2034 118 +120 3 405.9187 473.9901 35.7904 0.2034 119 +121 3 405.0687 474.5941 35.7104 0.2161 120 +122 3 404.0654 474.7108 36.834 0.2161 121 +123 3 403.9075 475.8354 36.5403 0.2415 122 +124 3 403.4785 476.8672 37.0034 0.2542 123 +125 3 402.8218 477.4598 38.7218 0.2542 124 +126 3 401.8952 477.6989 39.7194 0.2288 125 +127 3 401.8106 478.7697 39.459 0.2161 126 +128 3 402.3219 479.7604 39.1384 0.2288 127 +129 3 402.5622 480.8266 39.7446 0.2415 128 +130 3 402.6571 481.8173 41.1012 0.2415 129 +131 3 402.4009 482.8252 41.4795 0.2161 130 +132 3 402.0702 483.7393 42.0918 0.2034 131 +133 3 401.9547 484.7162 43.3311 0.178 132 +134 3 402.219 485.747 43.3927 0.178 133 +135 3 402.6194 486.7777 43.4686 0.178 134 +136 3 402.4889 487.773 44.448 0.1907 135 +137 3 401.8826 488.5932 45.6378 0.2034 136 +138 3 401.1402 489.3986 46.3901 0.2415 137 +139 3 400.3096 490.1685 46.5377 0.2796 138 +140 3 399.526 490.9934 46.478 0.3051 139 +141 3 398.8945 491.9131 46.9462 0.2924 140 +142 3 398.3488 492.8844 47.5555 0.2669 141 +143 3 397.9038 493.9197 48.0208 0.2415 142 +144 3 397.4176 494.9424 48.3753 0.2415 143 +145 3 396.7392 495.8245 48.909 0.2542 144 +146 3 396.1649 496.79 49.1725 0.2415 145 +147 3 395.9716 497.8963 49.2988 0.2161 146 +148 3 395.9476 498.8549 50.664 0.1907 147 +149 3 396.3045 499.8765 51.3192 0.1907 148 +150 3 396.5962 500.9336 52.0904 0.178 149 +151 3 396.2679 502.0101 52.1452 0.2034 150 +152 3 396.1672 503.1312 52.64 0.2796 151 +153 3 421.7573 429.151 15.1718 0.483 15 +154 3 421.9244 430.2653 14.6978 0.4195 153 +155 3 422.0662 431.3841 14.2232 0.3305 154 +156 3 422.12 432.5018 14.6902 0.2796 155 +157 3 422.1966 433.6206 15.2452 0.3432 156 +158 3 422.1406 434.7543 14.9027 0.3813 157 +159 3 421.882 435.8388 14.28 0.394 158 +160 3 420.8296 436.9577 13.186 0.3686 159 +161 3 420.0779 437.6166 11.8448 0.3305 160 +162 3 419.8777 438.5249 12.0445 0.2542 161 +163 3 419.5426 439.3578 13.6772 0.2161 162 +164 3 419.181 440.3679 13.2686 0.2415 163 +165 3 418.8436 441.4559 13.2356 0.2924 164 +166 3 418.4638 442.5335 13.3319 0.3178 165 +167 3 417.8883 443.5128 13.5985 0.3305 166 +168 3 417.4856 444.5767 13.8382 0.3559 167 +169 3 417.425 445.7161 14.0258 0.4195 168 +170 3 417.1299 446.8155 14.273 0.4449 169 +171 3 416.5865 447.8039 13.8558 0.4195 170 +172 3 416.2936 448.7008 12.376 0.3559 171 +173 3 415.7605 449.6686 13.0239 0.3178 172 +174 3 414.9368 450.4317 12.8534 0.2924 173 +175 3 413.9015 450.8493 13.2983 0.2796 174 +176 3 412.9165 451.3961 12.8517 0.2542 175 +177 3 411.8961 451.872 12.549 0.2288 176 +178 3 411.0358 452.611 12.2189 0.1907 177 +179 3 410.1926 453.3478 11.7572 0.178 178 +180 3 409.5314 454.2675 11.6967 0.1907 179 +181 3 408.9949 455.2662 11.655 0.2288 180 +182 3 408.3291 456.1162 12.3222 0.2669 181 +183 3 407.6003 456.7546 13.6881 0.3051 182 +184 3 406.7217 457.3151 13.9454 0.3305 183 +185 3 405.9839 458.0702 12.8789 0.3432 184 +186 3 405.3981 458.9682 12.0534 0.3305 185 +187 3 404.9257 460.0001 11.8423 0.3178 186 +188 3 404.4543 461.0309 11.6248 0.2796 187 +189 3 404.007 462.073 11.3347 0.2542 188 +190 3 403.5037 463.0832 11.6222 0.2161 189 +191 3 402.95 464.0304 12.3953 0.2034 190 +192 3 402.4466 464.9994 13.2031 0.1907 191 +193 3 402.2075 466.0519 13.0155 0.1907 192 +194 3 402.0451 467.1581 12.6353 0.1907 193 +195 3 401.8174 468.2792 12.644 0.1907 194 +196 3 401.4708 469.3626 12.7716 0.178 195 +197 3 400.8519 470.2995 13.1191 0.1652 196 +198 3 400.1106 471.145 13.6234 0.1398 197 +199 3 399.7113 472.1791 13.8687 0.1271 198 +200 3 399.3109 473.2328 13.4935 0.1271 199 +201 3 398.6508 474.148 13.701 0.1525 200 +202 3 398.2596 475.1776 14.3612 0.2034 201 +203 3 398.2722 476.2609 15.1833 0.2542 202 +204 3 397.8409 477.2917 15.3742 0.2924 203 +205 3 397.349 478.2858 14.7389 0.2924 204 +206 3 397.2231 479.3955 15.0836 0.2669 205 +207 3 397.2792 480.5315 14.9005 0.2542 206 +208 3 397.1751 481.6686 14.9134 0.2542 207 +209 3 397.0458 482.7508 15.7142 0.2542 208 +210 3 396.7403 483.8239 15.141 0.2288 209 +211 3 396.3079 484.865 15.4974 0.2034 210 +212 3 396.2908 485.9987 15.5518 0.2161 211 +213 3 396.5653 487.0992 15.3952 0.2415 212 +214 3 396.9634 488.154 15.8682 0.2542 213 +215 3 397.2746 489.2122 16.3523 0.2288 214 +216 3 397.0938 490.3138 16.4032 0.2034 215 +217 3 396.7529 491.3457 15.7492 0.1907 216 +218 3 396.2805 492.3787 16.0202 0.1907 217 +219 3 395.7016 493.3626 16.1857 0.2034 218 +220 3 395.133 494.3418 16.1364 0.2161 219 +221 3 394.5118 495.2742 15.7651 0.2288 220 +222 3 393.8357 496.1757 16.1616 0.2034 221 +223 3 393.1825 497.084 16.5472 0.178 222 +224 3 392.6608 498.0953 16.4119 0.1398 223 +225 3 392.3851 499.1878 16.1297 0.1398 224 +226 3 392.3954 500.3158 15.8334 0.1652 225 +227 3 392.5579 501.4381 16.0118 0.2034 226 +228 3 392.6654 502.5626 16.3489 0.2288 227 +229 3 392.5304 503.6563 15.9905 0.2161 228 +230 3 392.8485 504.6058 15.703 0.2161 229 +231 3 393.679 505.3712 15.9558 0.2161 230 +232 3 394.5942 506.0484 15.9706 0.2415 231 +233 3 395.5815 506.6032 15.6699 0.2415 232 +234 3 396.6225 507.0711 15.5168 0.2288 233 +235 3 397.7082 507.3892 15.7598 0.178 234 +236 3 398.8064 507.3571 16.3929 0.1398 235 +237 3 399.7822 507.8559 16.4368 0.1398 236 +238 3 400.7066 508.5206 16.1647 0.178 237 +239 3 401.5143 509.3237 15.9827 0.2542 238 +240 3 401.7728 510.224 14.56 0.3432 239 +241 3 421.5491 436.4589 14.488 0.4703 159 +242 3 421.8203 437.5217 13.7939 0.4068 241 +243 3 422.0651 438.5936 13.0189 0.3686 242 +244 3 422.2927 439.7056 13.3171 0.3559 243 +245 3 422.2698 440.8347 13.734 0.3686 244 +246 3 422.1818 441.9741 13.6581 0.394 245 +247 3 422.2733 443.0895 13.221 0.3813 246 +248 3 422.8235 443.9956 12.1755 0.3686 247 +249 3 423.4642 444.8307 11.0984 0.3178 248 +250 3 424.2181 445.4484 9.6359 0.2924 249 +251 3 424.9697 446.1234 8.7802 0.2542 250 +252 3 425.5749 446.7126 10.1234 0.2415 251 +253 3 426.3116 447.4619 9.7479 0.2415 252 +254 3 427.0907 448.1551 10.7674 0.2669 253 +255 3 427.7439 449.0646 10.9533 0.2796 254 +256 3 428.5241 449.838 10.7607 0.2796 255 +257 3 429.4873 450.3917 11.4128 0.2415 256 +258 3 430.0822 451.2325 12.0772 0.2288 257 +259 3 430.549 452.2255 11.9157 0.1907 258 +260 3 431.3635 452.9805 11.7505 0.1907 259 +261 3 432.3531 453.5491 11.7524 0.178 260 +262 3 432.9765 454.4563 11.5486 0.2034 261 +263 3 433.3655 455.5316 11.5206 0.2034 262 +264 3 433.9215 456.3004 10.0691 0.2034 263 +265 3 434.704 456.9857 9.4102 0.1907 264 +266 3 434.998 457.8448 11.1104 0.1907 265 +267 3 435.4053 458.7234 12.5023 0.1907 266 +268 3 436.0333 459.6272 12.6302 0.1907 267 +269 3 436.5424 460.508 11.4363 0.1907 268 +270 3 437.2688 461.2986 11.0706 0.2034 269 +271 3 437.7985 462.2629 11.3011 0.2034 270 +272 3 438.3053 463.2548 10.8296 0.2161 271 +273 3 438.9173 464.2066 10.6515 0.2161 272 +274 3 439.4241 465.227 10.5636 0.2415 273 +275 3 439.7845 466.2898 10.7484 0.2415 274 +276 3 440.2101 467.3286 11.062 0.2288 275 +277 3 440.7695 468.2895 10.5963 0.2034 276 +278 3 441.584 469.0068 10.0509 0.2034 277 +279 3 442.5221 469.6532 9.9355 0.2161 278 +280 3 443.3355 470.4048 9.3864 0.2288 279 +281 3 444.1877 471.1427 9.3254 0.2288 280 +282 3 445.1121 471.8142 9.3856 0.2288 281 +283 3 446.0284 472.4869 9.1188 0.2161 282 +284 3 446.7331 473.3586 9.3332 0.2034 283 +285 3 447.4413 474.2452 9.205 0.178 284 +286 3 448.2112 475.0895 9.2305 0.1652 285 +287 3 448.7786 476.0767 9.1448 0.178 286 +288 3 449.3632 477.048 9.52 0.2415 287 +289 3 420.3742 420.9268 17.3779 0.4703 9 +290 3 421.5137 420.857 17.5042 0.483 289 +291 3 422.6565 420.8238 17.5941 0.483 290 +292 3 423.7811 420.6694 17.2483 0.4703 291 +293 3 424.8816 420.3605 17.3186 0.4957 292 +294 3 426.0245 420.3571 17.4199 0.483 293 +295 3 427.2634 421.0252 16.7042 0.4576 294 +296 3 428.1111 421.6658 15.6918 0.4449 295 +297 3 429.0984 422.2161 15.4381 0.4068 296 +298 3 429.8386 422.9951 16.2999 0.3813 297 +299 3 430.422 423.9161 17.1332 0.3559 298 +300 3 430.9597 424.8965 17.7167 0.3178 299 +301 3 431.6941 425.7533 17.3169 0.2924 300 +302 3 432.0613 426.8333 17.3177 0.2415 301 +303 3 432.1918 427.9658 17.0853 0.2669 302 +304 3 432.6986 428.9874 16.8622 0.3178 303 +305 3 432.829 429.699 16.4027 0.2542 304 +306 3 433.1047 430.6405 15.0086 0.3305 305 +307 3 433.4376 431.6804 15.3588 0.3813 306 +308 3 433.4616 432.6608 16.8 0.4195 307 +309 3 433.2431 433.2214 17.6039 0.2161 308 +310 3 433.2236 434.2773 18.4173 0.2415 309 +311 3 433.4399 435.3892 18.4122 0.2542 310 +312 3 433.8734 436.4108 17.8545 0.2796 311 +313 3 434.4626 437.3295 17.0316 0.2669 312 +314 3 434.9968 438.3167 16.613 0.2415 313 +315 3 435.8034 439.0683 16.8876 0.2161 314 +316 3 436.8616 439.471 16.7415 0.2415 315 +317 3 437.8763 439.9881 16.5043 0.2924 316 +318 3 438.8075 440.5704 17.2301 0.3432 317 +319 3 439.1233 441.6012 18.0578 0.3559 318 +320 3 439.2148 442.7188 17.5605 0.3432 319 +321 3 439.2411 443.8617 17.6568 0.3051 320 +322 3 439.296 444.9634 17.185 0.2796 321 +323 3 439.2411 446.0033 16.83 0.2669 322 +324 3 438.8853 446.9288 18.1132 0.2542 323 +325 3 438.7229 447.8817 19.2805 0.2542 324 +326 3 439.002 448.9285 19.0991 0.2415 325 +327 3 439.4161 449.9592 18.7183 0.2542 326 +328 3 439.8737 450.9991 18.935 0.2415 327 +329 3 440.345 451.9612 19.7576 0.2415 328 +330 3 440.9617 452.8364 20.4445 0.2288 329 +331 3 441.4707 453.8042 20.921 0.2415 330 +332 3 442.0828 454.6862 20.7435 0.2669 331 +333 3 442.8321 455.5191 20.7046 0.2796 332 +334 3 443.4224 456.4743 21.1523 0.2924 333 +335 3 443.92 457.4181 20.5523 0.3051 334 +336 3 444.5584 458.323 20.1698 0.3305 335 +337 3 444.9222 459.3755 20.3045 0.3305 336 +338 3 445.3718 460.4085 20.1572 0.3178 337 +339 3 445.7768 461.4232 20.7444 0.3051 338 +340 3 446.1406 462.4666 21.4645 0.2924 339 +341 3 446.6691 463.4676 21.6219 0.2796 340 +342 3 447.2765 464.4114 22.0833 0.2542 341 +343 3 447.8302 465.4009 22.3874 0.2542 342 +344 3 448.1517 466.4912 22.4692 0.2542 343 +345 3 448.6619 467.4842 22.9284 0.2796 344 +346 3 449.2076 468.4749 23.3388 0.2796 345 +347 3 449.8746 469.3935 23.1501 0.2796 346 +348 3 450.6731 470.1554 22.4619 0.2669 347 +349 3 451.5345 470.8818 22.6814 0.2796 348 +350 3 452.1923 471.7833 23.238 0.3051 349 +351 3 452.8044 472.7431 23.1594 0.3559 350 +352 3 453.2482 473.7922 22.9827 0.394 351 +353 3 453.3512 474.9213 23.1829 0.394 352 +354 3 453.4061 476.0619 23.3503 0.3432 353 +355 3 453.4496 477.1956 23.6936 0.2796 354 +356 3 453.3741 478.3236 24.1259 0.2542 355 +357 3 453.8134 479.3612 24.3421 0.2669 356 +358 3 454.6702 480.0933 23.9915 0.2796 357 +359 3 455.4298 480.8221 23.4203 0.2669 358 +360 3 456.4674 481.2156 24.0178 0.2415 359 +361 3 457.5622 481.5279 24.2298 0.2288 360 +362 3 458.6067 481.942 24.6854 0.2161 361 +363 3 459.5997 482.482 24.7352 0.1907 362 +364 3 460.5607 483.022 24.0943 0.1907 363 +365 3 461.4015 483.7507 23.4559 0.2288 364 +366 3 462.3956 484.2106 23.0728 0.2669 365 +367 3 463.4058 484.6362 23.4788 0.2542 366 +368 3 464.0464 485.4861 23.5088 0.2161 367 +369 3 464.3565 486.4654 22.3975 0.2034 368 +370 3 464.901 487.3486 22.2583 0.2288 369 +371 3 465.5302 488.2729 22.1032 0.2288 370 +372 3 465.9443 489.3243 22.1194 0.2161 371 +373 3 466.2978 490.4111 22.1878 0.1907 372 +374 3 466.6204 491.5013 22.451 0.2034 373 +375 3 467.1902 492.444 22.0301 0.2288 374 +376 3 467.5059 493.5262 21.9974 0.2669 375 +377 3 467.9486 494.5203 22.5758 0.3051 376 +378 3 468.1809 495.598 22.0374 0.3051 377 +379 3 468.7952 496.5463 21.8355 0.2669 378 +380 3 469.477 497.4112 22.2468 0.1907 379 +381 3 470.47 497.9512 21.9666 0.1398 380 +382 3 471.4996 498.2429 21.3632 0.1271 381 +383 3 472.6093 498.2143 21.3332 0.1398 382 +384 3 473.6297 498.689 21.2612 0.1525 383 +385 3 474.5404 499.2553 21.2744 0.1398 384 +386 3 475.4624 499.777 21.9915 0.1525 385 +387 3 476.0562 500.6453 21.2089 0.178 386 +388 3 476.4188 501.6097 21.8036 0.2288 387 +389 3 477.1887 502.375 22.2925 0.2415 388 +390 3 478.1359 503.0054 22.1418 0.2288 389 +391 3 479.0694 503.6597 22.2667 0.2034 390 +392 3 479.8016 504.5234 22.4787 0.178 391 +393 3 480.448 505.4043 21.7697 0.178 392 +394 3 481.06 506.3573 21.7974 0.1652 393 +395 3 481.8231 507.205 21.9271 0.1652 394 +396 3 482.3951 508.1225 21.0613 0.1525 395 +397 3 483.2256 508.7368 19.88 0.1907 396 +398 3 433.9467 433.0315 16.2554 0.1525 308 +399 3 434.5953 433.6481 14.5919 0.1652 398 +400 3 435.6958 433.7259 13.9961 0.1907 399 +401 3 436.7083 434.1949 13.8625 0.2161 400 +402 3 437.8305 434.1068 14.2601 0.2288 401 +403 3 438.9356 434.2052 14.8229 0.2288 402 +404 3 440.0133 433.9295 14.9223 0.2288 403 +405 3 441.0223 433.6309 14.1876 0.2415 404 +406 3 442.1446 433.7339 14.5827 0.2669 405 +407 3 443.2382 434.0325 14.7224 0.3051 406 +408 3 444.325 434.3676 14.5113 0.3178 407 +409 3 445.3878 434.7726 14.4337 0.3051 408 +410 3 446.446 435.0895 13.8989 0.2669 409 +411 3 447.4722 435.4361 13.7329 0.2542 410 +412 3 448.4594 435.9967 13.7931 0.2796 411 +413 3 449.5108 436.3674 13.314 0.3305 412 +414 3 450.6022 436.5355 12.6112 0.3813 413 +415 3 451.7244 436.5893 12.444 0.3813 414 +416 3 452.8101 436.8501 12.7361 0.3559 415 +417 3 453.6017 437.3626 11.7267 0.3051 416 +418 3 454.5204 437.6498 11.5307 0.2924 417 +419 3 455.5019 437.8957 12.7725 0.2924 418 +420 3 456.5018 438.3099 13.4848 0.2924 419 +421 3 457.5428 438.7068 13.0687 0.2796 420 +422 3 458.5701 439.1267 12.3973 0.2796 421 +423 3 459.5734 439.5717 11.611 0.2796 422 +424 3 460.6636 439.8257 11.6886 0.2796 423 +425 3 461.7916 439.7673 12.0036 0.2542 424 +426 3 462.8018 439.7113 10.8951 0.2669 425 +427 3 463.9149 439.7994 10.5633 0.2542 426 +428 3 464.9662 439.9916 11.4733 0.2542 427 +429 3 466.0725 439.9138 11.1432 0.2161 428 +430 3 467.1261 439.5031 10.7456 0.2034 429 +431 3 468.2495 439.6918 10.6529 0.1907 430 +432 3 469.2688 440.2112 10.64 0.2034 431 +433 3 432.7226 429.1121 17.598 0.1652 304 +434 3 433.4284 429.4896 18.6074 0.2161 433 +435 3 434.4443 429.7905 17.736 0.2669 434 +436 3 435.4853 430.1703 17.8595 0.3051 435 +437 3 436.3422 430.39 19.5054 0.3305 436 +438 3 437.3569 430.724 20.4061 0.3178 437 +439 3 438.4048 431.177 20.5887 0.2669 438 +440 3 439.2743 431.8829 21.1495 0.2034 439 +441 3 440.1094 432.6608 20.9689 0.1652 440 +442 3 440.2318 433.3781 22.388 0.178 441 +443 3 440.4423 434.418 23.273 0.2161 442 +444 3 440.7855 435.3892 24.3858 0.2542 443 +445 3 441.1573 436.3262 23.8218 0.2542 444 +446 3 441.0395 437.2791 24.7338 0.2288 445 +447 3 441.1973 438.3579 25.4083 0.2034 446 +448 3 441.7842 439.288 26.0859 0.2034 447 +449 3 441.8185 440.3702 26.9472 0.2288 448 +450 3 441.6755 441.465 27.5293 0.2542 449 +451 3 441.9741 442.5381 27.7606 0.2669 450 +452 3 442.3562 443.5402 27.0626 0.2796 451 +453 3 442.7486 444.5698 27.2101 0.3051 452 +454 3 443.2291 445.548 26.7375 0.3178 453 +455 3 443.5139 446.6359 26.4919 0.3178 454 +456 3 443.8834 447.4733 27.8149 0.2924 455 +457 3 444.023 448.4068 29.1508 0.2796 456 +458 3 443.8148 449.4879 28.9282 0.2415 457 +459 3 443.8937 450.5255 27.8975 0.2415 458 +460 3 444.2735 451.5746 27.5937 0.2415 459 +461 3 444.5939 452.3788 29.1805 0.2796 460 +462 3 445.3626 452.9107 30.6872 0.2669 461 +463 3 445.9964 453.8145 31.3488 0.2415 462 +464 3 446.1028 454.9379 31.717 0.2034 463 +465 3 445.6315 455.9606 32.1457 0.2034 464 +466 3 444.913 456.7008 33.3357 0.2161 465 +467 3 444.3399 457.6057 34.2574 0.2288 466 +468 3 443.4579 458.3276 34.2227 0.2288 467 +469 3 442.601 458.99 33.3934 0.2542 468 +470 3 441.6526 459.6134 33.5616 0.2669 469 +471 3 440.5773 459.8571 33.6389 0.2669 470 +472 3 439.5831 459.7347 34.6735 0.2288 471 +473 3 438.7606 460.412 35.0826 0.2161 472 +474 3 438.3739 461.4782 35.4404 0.2161 473 +475 3 438.0204 462.5512 35.87 0.2161 474 +476 3 437.5972 463.5797 36.3653 0.1907 475 +477 3 436.8204 464.2386 37.3173 0.1652 476 +478 3 435.7588 464.4983 37.8434 0.1652 477 +479 3 434.6331 464.655 38.0481 0.2034 478 +480 3 433.5989 465.052 38.3827 0.2415 479 +481 3 432.8839 465.6366 39.6301 0.2796 480 +482 3 432.6802 466.2921 41.8065 0.2669 481 +483 3 432.44 467.2233 43.2524 0.2415 482 +484 3 432.1391 468.3216 43.3936 0.178 483 +485 3 431.288 469.04 43.96 0.1525 484 +486 3 441.3232 433.1905 20.1667 0.2542 441 +487 3 442.2395 433.8597 20.3403 0.3051 486 +488 3 443.1822 434.4466 20.9404 0.3305 487 +489 3 444.1225 435.0689 20.8468 0.3432 488 +490 3 445.1224 435.5002 20.0567 0.3305 489 +491 3 446.0113 435.9864 18.7603 0.3051 490 +492 3 446.859 436.5355 18.7345 0.2796 491 +493 3 447.7158 437.2151 19.0733 0.2796 492 +494 3 448.6974 437.7665 19.1786 0.2924 493 +495 3 449.5222 438.5089 19.3158 0.2796 494 +496 3 450.442 438.557 20.4137 0.2415 495 +497 3 451.5082 438.311 21.1462 0.2034 496 +498 3 452.3605 438.8956 21.7308 0.2034 497 +499 3 453.0434 439.7936 21.3662 0.2034 498 +500 3 453.8408 440.5338 22.2113 0.2161 499 +501 3 454.5306 441.4399 22.3289 0.2161 500 +502 3 455.304 442.1537 21.4315 0.2288 501 +503 3 456.3794 442.3871 21.957 0.2288 502 +504 3 457.3929 442.5358 23.1087 0.2288 503 +505 3 458.1869 443.1696 23.6748 0.2542 504 +506 3 458.8424 444.0539 23.5735 0.2796 505 +507 3 459.8045 444.6019 24.1324 0.3051 506 +508 3 460.8787 444.9176 24.5162 0.2924 507 +509 3 461.9632 445.1304 24.019 0.2542 508 +510 3 463.0283 445.3066 23.1059 0.2161 509 +511 3 464.1219 445.4484 23.0653 0.1907 510 +512 3 465.1744 445.7596 23.2148 0.1907 511 +513 3 465.9077 446.5204 23.5253 0.178 512 +514 3 466.6113 447.3795 23.8479 0.1525 513 +515 3 467.6111 447.8646 23.7622 0.1398 514 +516 3 468.7117 448.1734 23.683 0.1525 515 +517 3 469.66 448.7626 23.4368 0.1907 516 +518 3 470.6256 449.2854 22.7704 0.2034 517 +519 3 471.6483 449.7613 22.4644 0.2034 518 +520 3 472.6997 450.204 22.6173 0.2034 519 +521 3 473.7544 450.6227 22.9592 0.2288 520 +522 3 474.8229 451.006 22.8547 0.2415 521 +523 3 475.9303 451.2702 22.64 0.2288 522 +524 3 476.9862 451.4979 23.3814 0.1907 523 +525 3 478.0913 451.6821 23.4783 0.1652 524 +526 3 478.764 452.452 24.36 0.1525 525 +527 3 427.2886 420.0013 17.3099 0.394 294 +528 3 428.3491 419.5895 17.4538 0.4068 527 +529 3 429.4565 419.3767 17.2584 0.4068 528 +530 3 430.4037 418.9717 17.9315 0.4068 529 +531 3 431.3704 418.4191 17.5484 0.3559 530 +532 3 432.4171 418.1228 17.8377 0.3051 531 +533 3 433.0372 417.5932 18.9356 0.2542 532 +534 3 433.9352 417.1722 17.841 0.2796 533 +535 3 434.6056 416.3954 18.3996 0.3051 534 +536 3 434.8962 415.4436 19.4362 0.3432 535 +537 3 434.2967 414.6417 20.0684 0.3305 536 +538 3 435.0026 414.0388 19.9548 0.3305 537 +539 3 436.0905 414.0868 19.8374 0.3686 538 +540 3 437.0732 414.5341 20.1942 0.4322 539 +541 3 438.1245 414.7721 20.6618 0.4576 540 +542 3 439.0466 414.938 21.8781 0.4068 541 +543 3 440.0533 415.248 22.1024 0.3305 542 +544 3 440.6665 415.0432 24.1704 0.2924 543 +545 3 441.7007 414.5913 24.3342 0.2924 544 +546 3 442.8264 414.6417 24.7117 0.3051 545 +547 3 443.9269 414.8739 24.9343 0.3051 546 +548 3 445.0618 414.7629 25.0275 0.3178 547 +549 3 446.1508 414.5421 24.9743 0.3432 548 +550 3 447.2354 414.3328 24.6036 0.3686 549 +551 3 448.3405 414.5593 24.4367 0.394 550 +552 3 449.2877 415.1816 24.5176 0.394 551 +553 3 450.291 415.6964 24.5574 0.4068 552 +554 3 451.2588 416.1048 25.0919 0.394 553 +555 3 452.0001 416.797 23.9562 0.3686 554 +556 3 452.873 417.3838 23.0236 0.3178 555 +557 3 453.9712 417.6515 22.7388 0.2796 556 +558 3 455.0283 417.584 23.6062 0.3051 557 +559 3 455.9309 418.2807 23.4024 0.3559 558 +560 3 456.8758 418.8985 23.3906 0.4068 559 +561 3 457.7499 419.5334 23.1232 0.4068 560 +562 3 458.4855 420.3468 22.3608 0.394 561 +563 3 459.2577 421.0549 22.9684 0.394 562 +564 3 460.222 421.3535 24.11 0.394 563 +565 3 461.334 421.3695 24.5809 0.3813 564 +566 3 462.4025 421.4622 23.8568 0.3432 565 +567 3 463.4047 421.9152 23.952 0.3178 566 +568 3 464.3851 422.1955 25.1952 0.2796 567 +569 3 464.9605 423.1713 25.412 0.2542 568 +570 3 465.703 423.9435 25.158 0.2288 569 +571 3 466.7303 423.7502 25.1826 0.2288 570 +572 3 467.7702 424.1369 25.6264 0.2288 571 +573 3 468.8284 424.4995 25.1902 0.2288 572 +574 3 469.8831 424.6642 25.0802 0.2415 573 +575 3 470.8635 424.8908 24.1368 0.2288 574 +576 3 471.3738 425.7476 25.2694 0.2288 575 +577 3 472.1174 425.7774 25.8978 0.2161 576 +578 3 473.1367 425.2934 25.4814 0.2288 577 +579 3 474.2383 425.1333 25.8182 0.2034 578 +580 3 475.3457 425.1573 25.7858 0.1907 579 +581 3 476.3925 425.3735 25.8454 0.2034 580 +582 3 477.3443 425.9753 26.0151 0.2542 581 +583 3 478.0261 426.7097 27.1309 0.2796 582 +584 3 479.0054 427.1879 27.4504 0.2542 583 +585 3 479.9641 427.0403 26.4505 0.2161 584 +586 3 480.9067 427.0644 26.7333 0.1907 585 +587 3 481.9889 426.9534 26.8579 0.2034 586 +588 3 483.0105 426.7784 25.6889 0.2161 587 +589 3 484.1099 426.4832 25.482 0.2161 588 +590 3 485.1921 426.6148 26.1064 0.2161 589 +591 3 486.1005 427.1124 27.27 0.2034 590 +592 3 486.9768 427.713 28.2114 0.2161 591 +593 3 487.9549 428.2289 28.0375 0.2034 592 +594 3 488.909 428.0207 28.2551 0.2161 593 +595 3 490.0049 427.9544 28.5113 0.2161 594 +596 3 491.03 428.4246 28.3074 0.2415 595 +597 3 492.0378 428.6957 29.3762 0.2415 596 +598 3 493.0537 429.1499 29.5904 0.2415 597 +599 3 494.0593 429.4542 30.2117 0.2161 598 +600 3 495.1335 429.3329 29.6738 0.2034 599 +601 3 496.1745 429.1258 29.6136 0.2034 600 +602 3 497.2682 429.119 30.333 0.2161 601 +603 3 498.2292 428.9462 31.3855 0.2542 602 +604 3 498.4774 427.9887 32.7664 0.2669 603 +605 3 498.7989 426.9854 32.975 0.2669 604 +606 3 499.3617 426.2384 33.4216 0.2288 605 +607 3 500.3856 426.14 32.76 0.2034 606 +608 3 409.576 406.4106 15.2239 0.3813 1 +609 3 408.5945 405.85 15.6554 0.483 608 +610 3 407.5408 405.4244 15.9838 0.5084 609 +611 3 406.5284 404.9154 15.6111 0.4703 610 +612 3 405.5629 404.3399 16.1291 0.4449 611 +613 3 404.5928 403.7348 16.2364 0.4449 612 +614 3 403.5906 403.1834 16.24 0.4449 613 +615 3 402.4478 403.1422 16.2403 0.394 614 +616 3 401.4193 403.6444 16.2414 0.3305 615 +617 3 400.5842 404.4257 16.245 0.3051 616 +618 3 399.7422 405.2002 16.2607 0.3305 617 +619 3 399.367 405.556 16.3604 0.2161 618 +620 3 398.8476 406.4243 17.099 0.1652 619 +621 3 398.7446 407.3818 18.6099 0.1398 620 +622 3 398.0559 407.979 19.626 0.1144 621 +623 3 397.0321 407.8932 20.6665 0.1144 622 +624 3 396.0917 407.812 22.2194 0.1144 623 +625 3 395.1193 407.359 22.9026 0.1144 624 +626 3 394.235 406.6428 23.0966 0.1144 625 +627 3 393.1539 406.5936 23.6499 0.1398 626 +628 3 392.4343 407.4047 24.2712 0.178 627 +629 3 392.4023 408.4629 25.2109 0.2161 628 +630 3 393.0578 409.3587 25.7667 0.2288 629 +631 3 393.5257 410.3997 25.8499 0.2669 630 +632 3 393.393 411.5014 26.4844 0.3305 631 +633 3 393.0189 412.4761 27.6315 0.4195 632 +634 3 392.8462 413.4519 29.0256 0.4322 633 +635 3 392.7432 414.5684 29.5529 0.394 634 +636 3 392.384 415.6427 29.3213 0.3178 635 +637 3 391.4894 416.2741 29.0363 0.2669 636 +638 3 390.3637 416.1895 29.4423 0.2924 637 +639 3 389.2952 416.138 30.2716 0.2924 638 +640 3 388.3628 416.5945 31.4154 0.3432 639 +641 3 387.4865 417.1665 32.4727 0.2924 640 +642 3 386.4546 417.592 33.0504 0.2924 641 +643 3 385.6115 418.251 33.469 0.2161 642 +644 3 385.2042 419.2989 33.9811 0.2288 643 +645 3 384.4961 419.9841 34.3353 0.2288 644 +646 3 383.4425 419.7897 34.8989 0.2924 645 +647 3 382.4198 419.3652 35.6017 0.3178 646 +648 3 381.3307 419.1524 36.1362 0.3559 647 +649 3 380.2027 419.2325 36.3675 0.3686 648 +650 3 379.0804 419.4487 36.4428 0.3432 649 +651 3 377.957 419.6478 36.6411 0.3051 650 +652 3 376.8908 419.5345 37.3674 0.2669 651 +653 3 375.9928 419.0666 38.5983 0.2669 652 +654 3 375.0787 418.5244 39.5914 0.2669 653 +655 3 374.0274 418.1972 40.2475 0.2669 654 +656 3 372.9291 417.981 40.8201 0.2924 655 +657 3 371.8847 417.5955 41.3899 0.2924 656 +658 3 370.8093 417.266 41.8452 0.3051 657 +659 3 369.7671 417.5451 42.2145 0.2924 658 +660 3 369.226 418.4763 42.5466 0.3305 659 +661 3 368.5957 419.3835 43.1525 0.3178 660 +662 3 368.0511 420.0734 44.8381 0.3305 661 +663 3 367.8257 420.69 47.0974 0.3305 662 +664 3 367.6152 421.556 48.7878 0.3813 663 +665 3 367.184 422.5387 49.6588 0.3686 664 +666 3 366.6291 423.5225 50.0685 0.3432 665 +667 3 366.0377 424.4492 50.8158 0.3051 666 +668 3 365.6567 425.4891 51.4326 0.2924 667 +669 3 365.2735 426.4958 52.3561 0.2669 668 +670 3 364.6534 427.3721 53.2714 0.2288 669 +671 3 363.9853 428.134 54.5538 0.2161 670 +672 3 363.2886 428.6991 56.2691 0.2034 671 +673 3 362.5851 429.4954 57.195 0.2161 672 +674 3 361.7648 430.0857 58.45 0.2034 673 +675 3 360.9423 430.756 59.4804 0.2161 674 +676 3 360.4641 431.7605 59.9995 0.2034 675 +677 3 359.955 432.5761 61.4709 0.2034 676 +678 3 358.9872 432.8896 62.72 0.1652 677 +679 3 399.208 405.1693 15.1729 0.3686 618 +680 3 398.366 404.698 13.6867 0.3813 679 +681 3 397.4508 404.0539 13.1463 0.394 680 +682 3 396.4852 403.4716 13.587 0.4195 681 +683 3 395.3858 403.2051 13.9765 0.4576 682 +684 3 394.2624 403.4019 14.0958 0.4957 683 +685 3 393.1322 403.5025 14.4547 0.5084 684 +686 3 392.0225 403.6146 15.0685 0.483 685 +687 3 390.954 404.007 15.3448 0.4195 686 +688 3 390.0159 404.6259 15.869 0.3813 687 +689 3 389.103 405.2963 16.2551 0.3686 688 +690 3 388.1443 405.9129 16.4914 0.3813 689 +691 3 387.1216 406.3717 17.0419 0.3813 690 +692 3 386.0188 406.6497 17.3426 0.3813 691 +693 3 384.8748 406.6291 17.3457 0.3686 692 +694 3 383.7456 406.4472 17.2712 0.3432 693 +695 3 382.6291 406.239 16.9361 0.2924 694 +696 3 381.5126 406.1783 16.3453 0.2669 695 +697 3 380.3937 405.9381 16.3184 0.2542 696 +698 3 379.403 405.3753 16.5628 0.2924 697 +699 3 378.3734 404.9154 17.0313 0.2924 698 +700 3 377.25 404.7449 17.3519 0.2924 699 +701 3 376.1278 404.523 17.3239 0.2415 700 +702 3 374.9929 404.9199 17.5249 0.2669 701 +703 3 373.9118 405.1991 18.123 0.3305 702 +704 3 372.7827 405.2975 18.4041 0.3686 703 +705 3 371.6398 405.2883 18.3369 0.3813 704 +706 3 370.5302 405.1236 17.836 0.394 705 +707 3 369.4319 404.8467 17.4611 0.394 706 +708 3 368.3703 404.4246 17.367 0.3686 707 +709 3 367.4162 403.7988 17.3606 0.3051 708 +710 3 366.3557 403.3824 17.3653 0.2415 709 +711 3 365.325 403.7977 17.3992 0.2161 710 +712 3 364.3754 404.4292 17.591 0.2034 711 +713 3 363.2875 404.7369 17.9687 0.2161 712 +714 3 362.1629 404.5767 17.7646 0.2034 713 +715 3 361.1494 404.0619 17.4952 0.2161 714 +716 3 360.0957 403.6432 17.8475 0.2034 715 +717 3 359.0227 403.5471 18.7821 0.2288 716 +718 3 357.905 403.7313 19.1559 0.2542 717 +719 3 356.8994 404.1855 18.433 0.2924 718 +720 3 355.8172 404.38 17.6593 0.2796 719 +721 3 354.6789 404.3811 17.3958 0.2542 720 +722 3 353.5418 404.2599 17.4079 0.2415 721 +723 3 352.5328 403.7245 17.5888 0.2796 722 +724 3 351.5981 403.1216 18.2414 0.3178 723 +725 3 350.7058 402.4123 18.461 0.3305 724 +726 3 349.7231 401.8266 18.4772 0.3178 725 +727 3 348.682 401.3518 18.4643 0.3051 726 +728 3 347.593 401.0052 18.3775 0.3178 727 +729 3 346.4993 400.7569 17.8147 0.3178 728 +730 3 345.3702 400.7009 17.3886 0.3051 729 +731 3 344.2536 400.4549 17.3345 0.2669 730 +732 3 343.1806 400.0637 17.1786 0.2542 731 +733 3 342.3523 399.3441 16.3825 0.2415 732 +734 3 341.5801 398.5021 16.242 0.2542 733 +735 3 340.5505 398.0033 16.24 0.2415 734 +736 3 339.4912 397.5732 16.2403 0.2669 735 +737 3 338.5359 396.9428 16.2408 0.2924 736 +738 3 337.7248 396.1363 16.2431 0.3432 737 +739 3 336.8771 394.7978 16.329 0.2669 738 +740 3 336.4367 393.7511 16.6387 0.2924 739 +741 3 335.9242 392.7466 17.0901 0.3051 740 +742 3 335.3419 391.7685 17.3471 0.2669 741 +743 3 334.7436 390.795 17.4815 0.2415 742 +744 3 334.326 389.7436 17.8139 0.2288 743 +745 3 334.2871 388.6248 18.2487 0.2542 744 +746 3 334.3271 387.4854 18.438 0.2542 745 +747 3 334.0434 386.3849 18.4033 0.2288 746 +748 3 333.4554 385.4159 18.1544 0.2034 747 +749 3 332.7839 384.5064 17.733 0.1907 748 +750 3 332.0826 383.6072 17.5101 0.178 749 +751 3 331.4214 382.6806 17.7206 0.1907 750 +752 3 330.7945 381.7288 17.9698 0.2288 751 +753 3 330.0509 380.8696 17.7192 0.3051 752 +754 3 329.1425 380.189 17.4381 0.3432 753 +755 3 328.1427 379.6353 17.3648 0.3178 754 +756 3 327.2183 378.9626 17.36 0.2415 755 +757 3 326.5342 378.052 17.36 0.1652 756 +758 3 326.016 377.0327 17.3589 0.1271 757 +759 3 325.4588 376.0339 17.3541 0.1398 758 +760 3 324.6626 375.2171 17.3278 0.178 759 +761 3 323.6902 374.6234 17.1699 0.2288 760 +762 3 322.6858 374.1029 16.7479 0.2415 761 +763 3 321.7042 373.5366 16.3685 0.2288 762 +764 3 320.7799 372.8651 16.2784 0.2034 763 +765 3 319.9242 372.1077 16.3951 0.2034 764 +766 3 319.0364 371.395 16.6676 0.2161 765 +767 3 318.0789 370.7944 17.0937 0.2415 766 +768 3 317.134 370.2178 17.7873 0.2415 767 +769 3 316.3606 369.3873 18.086 0.2669 768 +770 3 315.6605 368.4881 17.8794 0.2796 769 +771 3 314.9032 367.6416 17.533 0.3305 770 +772 3 314.06 366.8728 17.3799 0.3305 771 +773 3 313.1872 366.1326 17.3597 0.3305 772 +774 3 312.3429 365.3604 17.3541 0.2669 773 +775 3 311.6359 364.4624 17.323 0.2542 774 +776 3 310.8385 363.6456 17.1573 0.2161 775 +777 3 309.8387 363.2292 16.2884 0.2288 776 +778 3 308.7942 362.8516 15.6125 0.1907 777 +779 3 307.8996 362.179 16.1476 0.1907 778 +780 3 307.0107 361.5326 16.9168 0.178 779 +781 3 306.1939 360.9091 18.1496 0.1907 780 +782 3 305.4549 360.0465 18.4584 0.1907 781 +783 3 304.5202 359.3865 18.4741 0.1907 782 +784 3 303.4174 359.0844 18.443 0.2034 783 +785 3 302.2917 358.9014 18.244 0.2288 784 +786 3 301.2472 358.5994 17.3774 0.2542 785 +787 3 300.6306 357.7071 16.4881 0.2542 786 +788 3 300.1856 356.8136 15.12 0.2288 787 +789 3 336.5236 395.4545 15.8169 0.2161 738 +790 3 335.4677 395.6249 15.9572 0.2034 789 +791 3 334.429 395.9727 16.354 0.2288 790 +792 3 333.5561 396.6614 16.0087 0.2288 791 +793 3 332.7198 397.4245 15.6758 0.2161 792 +794 3 331.8206 398.0662 15.0637 0.178 793 +795 3 331.0805 398.8716 14.4516 0.178 794 +796 3 330.1378 399.4859 14.7476 0.1652 795 +797 3 329.2798 400.1437 15.3667 0.1907 796 +798 3 328.28 400.6597 15.0948 0.2034 797 +799 3 327.1771 400.948 15.2197 0.2542 798 +800 3 326.1121 401.2626 14.9369 0.2669 799 +801 3 325.166 401.735 14.8296 0.2669 800 +802 3 324.2371 402.2624 15.2429 0.2161 801 +803 3 323.3047 402.9179 15.1519 0.178 802 +804 3 322.4547 403.6593 15.398 0.1652 803 +805 3 321.4674 404.1077 15.5344 0.2161 804 +806 3 320.4058 404.4349 15.0167 0.2669 805 +807 3 319.3682 404.7666 15.3252 0.3178 806 +808 3 318.3397 405.2059 15.8337 0.3051 807 +809 3 317.4543 405.8729 15.416 0.3051 808 +810 3 316.5585 406.5719 15.2048 0.2924 809 +811 3 315.5015 406.9277 15.5529 0.3051 810 +812 3 314.433 407.2228 16.2375 0.2924 811 +813 3 313.4491 407.7662 16.6023 0.2796 812 +814 3 312.5751 408.4972 16.525 0.2669 813 +815 3 311.5318 408.932 16.5108 0.2542 814 +816 3 310.6052 409.4959 15.7114 0.2415 815 +817 3 309.7952 409.8952 14.0 0.2288 816 +818 3 375.8806 404.1523 15.6237 0.2415 701 +819 3 375.7788 403.1948 14.4864 0.2161 818 +820 3 375.7342 402.0519 14.436 0.1907 819 +821 3 375.558 400.9342 14.3072 0.2161 820 +822 3 374.9895 400.0248 14.6616 0.2796 821 +823 3 374.1292 399.3395 14.8022 0.3178 822 +824 3 373.1648 398.7687 14.8904 0.2924 823 +825 3 372.1409 398.3854 14.4376 0.2669 824 +826 3 371.2646 397.7699 13.6167 0.2542 825 +827 3 370.6263 396.8467 13.512 0.2669 826 +828 3 370.0176 395.9098 13.0158 0.2542 827 +829 3 369.2569 395.0712 12.8288 0.2288 828 +830 3 368.4961 394.3929 13.9574 0.2288 829 +831 3 367.8109 393.7213 12.8106 0.2542 830 +832 3 367.1691 392.8016 12.4958 0.3051 831 +833 3 366.6348 391.7925 12.3592 0.3178 832 +834 3 365.9645 390.8773 12.6658 0.3178 833 +835 3 365.0504 390.3328 13.6578 0.2924 834 +836 3 364.7289 389.8592 12.4785 0.178 835 +837 3 363.7085 389.5492 12.574 0.1907 836 +838 3 362.6709 389.087 12.4261 0.1907 837 +839 3 361.814 388.3697 12.899 0.2161 838 +840 3 361.0338 387.6032 13.5598 0.2415 839 +841 3 360.2673 387.0861 11.9347 0.2669 840 +842 3 359.2595 386.7486 11.1958 0.2415 841 +843 3 358.1612 386.5233 11.6124 0.2161 842 +844 3 357.1476 386.2316 12.1327 0.178 843 +845 3 356.1444 386.0977 12.7039 0.178 844 +846 3 355.0484 385.9192 12.0369 0.178 845 +847 3 354.1641 385.2798 11.6301 0.2161 846 +848 3 353.8872 384.2273 12.1526 0.2288 847 +849 3 353.5143 383.2766 13.3756 0.2542 848 +850 3 352.6231 382.6131 13.2958 0.2542 849 +851 3 351.7869 382.2973 11.6094 0.2924 850 +852 3 350.7104 381.9816 12.0772 0.3051 851 +853 3 349.5755 381.8695 12.3161 0.3051 852 +854 3 348.5654 381.4188 12.8344 0.2669 853 +855 3 348.3034 380.3308 12.5871 0.2288 854 +856 3 347.5975 379.6341 11.2823 0.2034 855 +857 3 346.6331 379.1765 10.5073 0.1907 856 +858 3 345.8186 378.4032 10.8609 0.2161 857 +859 3 344.8828 377.8129 11.5433 0.2288 858 +860 3 343.8681 377.3656 12.0226 0.2415 859 +861 3 342.7664 377.3244 12.6683 0.2034 860 +862 3 341.746 377.1104 12.794 0.1907 861 +863 3 340.9017 376.4698 11.9188 0.1652 862 +864 3 340.0769 375.915 10.5459 0.178 863 +865 3 339.1194 375.3967 10.9444 0.1652 864 +866 3 338.1126 375.1256 10.0523 0.1652 865 +867 3 337.4342 374.4712 9.6838 0.1525 866 +868 3 337.1974 373.7311 9.2943 0.1652 867 +869 3 336.3017 373.1339 10.0537 0.1907 868 +870 3 335.3956 372.4372 10.1556 0.2161 869 +871 3 334.5422 371.6867 10.3236 0.2288 870 +872 3 333.746 370.966 9.9005 0.2161 871 +873 3 332.9006 370.4158 10.1909 0.1907 872 +874 3 332.0403 369.8987 9.548 0.1525 873 +875 3 331.4465 369.0944 8.2648 0.1398 874 +876 3 330.8574 368.1323 8.6489 0.1652 875 +877 3 330.044 367.3384 8.96 0.2161 876 +878 3 365.2723 389.5126 12.3609 0.2288 835 +879 3 365.3089 388.3972 12.7406 0.2161 878 +880 3 365.3135 387.3161 13.4971 0.2161 879 +881 3 365.1945 386.2041 13.685 0.2288 880 +882 3 364.896 385.194 13.5094 0.2415 881 +883 3 364.6443 384.2147 12.4432 0.2669 882 +884 3 363.9339 383.4585 11.8628 0.2924 883 +885 3 363.0198 383.0707 12.2265 0.2796 884 +886 3 362.1252 382.7172 13.7298 0.2415 885 +887 3 361.0739 382.4975 14.5516 0.2034 886 +888 3 359.9859 382.2676 14.2708 0.2161 887 +889 3 359.2091 382.2539 15.6988 0.2415 888 +890 3 358.1143 382.3442 16.3769 0.2796 889 +891 3 356.9806 382.2424 16.13 0.2669 890 +892 3 355.8801 382.0651 15.5753 0.2542 891 +893 3 354.7441 382.0399 15.8438 0.2288 892 +894 3 353.6573 381.7379 15.9004 0.2542 893 +895 3 352.7821 381.0172 15.9564 0.2669 894 +896 3 351.9047 380.4349 17.0274 0.2796 895 +897 3 351.0112 380.0242 18.3036 0.2415 896 +898 3 349.8958 379.983 18.2804 0.2288 897 +899 3 349.0115 380.2176 18.3271 0.1907 898 +900 3 348.2542 380.4258 20.2182 0.2034 899 +901 3 347.1319 380.4715 19.9973 0.1907 900 +902 3 346.2808 379.7268 20.4064 0.2034 901 +903 3 345.4994 378.9614 21.1781 0.1652 902 +904 3 344.6929 378.1652 20.8482 0.1652 903 +905 3 343.8281 377.5006 20.3529 0.2034 904 +906 3 343.359 376.6105 19.1307 0.2669 905 +907 3 342.676 375.7491 19.1097 0.3051 906 +908 3 341.8501 375.0776 20.0525 0.2669 907 +909 3 340.8948 374.6497 20.244 0.2288 908 +910 3 339.8321 374.4049 20.5884 0.1652 909 +911 3 338.7167 374.2779 20.8376 0.1398 910 +912 3 337.6276 374.4609 20.3302 0.1271 911 +913 3 336.6243 374.6257 19.1103 0.1398 912 +914 3 335.7583 375.0043 17.5806 0.1525 913 +915 3 335.2767 375.3258 15.2032 0.1398 914 +916 3 334.7927 375.9401 13.1737 0.1398 915 +917 3 333.9336 376.6048 12.32 0.1525 916 +918 4 417.8826 404.2438 16.2112 0.1907 1 +919 4 418.6617 403.4156 16.5152 0.2669 918 +920 4 419.5494 402.7212 16.996 0.3178 919 +921 4 420.4177 401.9913 17.3516 0.3432 920 +922 4 421.2528 401.2145 17.5703 0.3813 921 +923 4 422.0719 400.4423 18.0701 0.4322 922 +924 4 422.8865 399.6518 18.4279 0.4957 923 +925 4 423.8211 398.994 18.471 0.4957 924 +926 4 424.7889 398.3843 18.4444 0.483 925 +927 4 425.6378 397.6189 18.3282 0.4576 926 +928 4 426.3265 396.7255 17.8595 0.4576 927 +929 4 426.9545 395.7862 17.4224 0.4703 928 +930 4 427.5883 394.839 17.183 0.4703 929 +931 4 428.1534 393.8735 16.6026 0.4703 930 +932 4 428.5149 392.8404 15.7884 0.4576 931 +933 4 428.8261 391.7605 15.258 0.483 932 +934 4 429.2094 390.684 15.122 0.5212 933 +935 4 429.7367 389.6693 15.1203 0.5466 934 +936 4 430.4392 388.7667 15.122 0.5212 935 +937 4 431.2194 387.9304 15.1276 0.483 936 +938 4 431.8794 386.9958 15.1556 0.4576 937 +939 4 432.4926 386.0314 15.3023 0.483 938 +940 4 432.8679 384.9938 16.0384 0.483 939 +941 4 433.187 383.9378 16.7815 0.4703 940 +942 4 433.465 382.8293 16.9322 0.3813 941 +943 4 433.2465 381.7917 15.8844 0.3051 942 +944 4 433.2202 380.6935 15.3969 0.2796 943 +945 4 433.4833 380.2885 15.9138 0.2161 944 +946 4 434.4214 379.665 16.3817 0.2288 945 +947 4 435.2359 378.9191 17.113 0.2542 946 +948 4 435.9956 378.0828 17.5501 0.2669 947 +949 4 436.5973 377.1505 18.2277 0.2669 948 +950 4 437.1201 376.1392 18.5153 0.2796 949 +951 4 437.1704 375.0089 18.9188 0.2924 950 +952 4 436.9611 373.913 19.5294 0.2924 951 +953 4 437.31 372.8239 19.5992 0.2669 952 +954 4 438.0799 371.9773 19.6 0.2542 953 +955 4 438.8716 371.1514 19.6003 0.2669 954 +956 4 439.5912 370.2625 19.6011 0.2924 955 +957 4 440.3393 369.3965 19.6056 0.3178 956 +958 4 441.3552 368.8714 19.6291 0.3051 957 +959 4 441.8231 368.9606 19.7282 0.2415 958 +960 4 442.9431 369.0658 20.1312 0.2415 959 +961 4 444.0528 368.9125 20.5503 0.2034 960 +962 4 445.1704 368.6918 20.706 0.178 961 +963 4 446.3007 368.7261 20.7203 0.1907 962 +964 4 447.4207 368.9526 20.722 0.2288 963 +965 4 448.5532 369.0704 20.734 0.2669 964 +966 4 449.6858 368.9583 20.8177 0.2924 965 +967 4 450.8081 368.7821 21.1067 0.2924 966 +968 4 451.9383 368.6414 21.336 0.2669 967 +969 4 453.0332 368.4469 20.8888 0.2415 968 +970 4 454.1062 368.2994 20.011 0.2288 969 +971 4 455.2193 368.2811 19.8976 0.2415 970 +972 4 456.2821 368.3463 20.8253 0.2669 971 +973 4 457.3655 368.3977 21.6591 0.3178 972 +974 4 458.4877 368.3257 22.1435 0.3559 973 +975 4 459.6134 368.2582 22.6036 0.3813 974 +976 4 460.7506 368.2136 22.7035 0.3559 975 +977 4 461.8797 368.0889 22.4378 0.3051 976 +978 4 463.0077 367.9184 22.3107 0.2542 977 +979 4 464.1425 367.9253 22.4608 0.2161 978 +980 4 465.2705 368.0751 22.7388 0.2161 979 +981 4 466.4065 368.1655 22.8004 0.1907 980 +982 4 467.5368 368.1083 22.4792 0.1907 981 +983 4 468.5927 367.7422 22.0679 0.178 982 +984 4 469.509 367.0776 21.9904 0.1907 983 +985 4 470.3579 366.3614 22.5686 0.1907 984 +986 4 471.1896 365.7688 23.7899 0.1907 985 +987 4 472.1425 365.3135 24.8046 0.1907 986 +988 4 473.1424 364.8124 25.3397 0.178 987 +989 4 474.0633 364.1489 25.3364 0.1525 988 +990 4 474.8161 363.2955 25.2274 0.1398 989 +991 4 475.499 362.3792 25.1012 0.1652 990 +992 4 476.0424 361.3839 24.8108 0.2034 991 +993 4 476.5675 360.3863 25.1084 0.2415 992 +994 4 477.2631 359.502 25.5441 0.2415 993 +995 4 477.7813 358.525 26.1691 0.2669 994 +996 4 478.2824 357.5194 26.6826 0.2542 995 +997 4 478.9848 356.7701 27.816 0.2415 996 +998 4 479.9 356.1249 28.0294 0.178 997 +999 4 480.6184 355.2578 28.3545 0.1525 998 +1000 4 481.4284 354.457 28.5085 0.1398 999 +1001 4 482.4637 354.0211 28.1747 0.178 1000 +1002 4 483.5688 354.2293 27.7522 0.1907 1001 +1003 4 484.5355 354.8093 28.1806 0.2161 1002 +1004 4 485.3992 355.5552 28.0 0.2034 1003 +1005 4 441.8322 368.3417 19.6039 0.2542 958 +1006 4 442.6365 367.5283 19.544 0.2542 1005 +1007 4 443.0826 366.5056 19.3245 0.2924 1006 +1008 4 443.1581 365.3753 19.1517 0.3178 1007 +1009 4 443.0769 364.2473 19.4793 0.3432 1008 +1010 4 443.0483 363.1102 19.7378 0.3432 1009 +1011 4 443.3984 362.0508 20.1359 0.3305 1010 +1012 4 444.0207 361.115 20.5783 0.3178 1011 +1013 4 444.8295 360.3154 20.7105 0.3051 1012 +1014 4 445.6646 359.5329 20.7248 0.3051 1013 +1015 4 446.3911 358.652 20.7438 0.3051 1014 +1016 4 446.9963 357.6842 20.8429 0.3051 1015 +1017 4 447.3944 356.6283 21.219 0.3051 1016 +1018 4 447.6415 355.5335 21.7412 0.3051 1017 +1019 4 447.7833 354.4123 22.1581 0.3051 1018 +1020 4 447.9607 353.3004 22.6436 0.3178 1019 +1021 4 448.3279 352.2273 22.923 0.3051 1020 +1022 4 448.9205 351.256 22.9928 0.2796 1021 +1023 4 449.7258 350.4518 23.1165 0.2161 1022 +1024 4 450.3997 349.5515 23.5231 0.178 1023 +1025 4 451.0884 348.6523 23.903 0.1525 1024 +1026 4 452.0058 347.9899 23.8246 0.178 1025 +1027 4 452.7906 347.2017 23.2515 0.2034 1026 +1028 4 453.159 346.1572 22.685 0.2288 1027 +1029 4 453.2288 345.0224 22.6797 0.2288 1028 +1030 4 453.1521 343.8853 22.9085 0.2288 1029 +1031 4 452.9874 342.7584 23.1518 0.2161 1030 +1032 4 452.9439 341.6293 23.5712 0.178 1031 +1033 4 453.151 340.5173 23.9464 0.1398 1032 +1034 4 453.4622 339.4179 24.0705 0.1398 1033 +1035 4 453.7722 338.3174 24.08 0.1652 1034 +1036 4 454.1119 337.2249 24.08 0.2034 1035 +1037 4 454.5295 336.1598 24.08 0.2161 1036 +1038 4 454.931 335.089 24.08 0.2542 1037 +1039 4 455.2228 333.9839 24.0806 0.2796 1038 +1040 4 455.5522 332.888 24.0828 0.2924 1039 +1041 4 456.0087 331.8401 24.1035 0.2542 1040 +1042 4 456.5395 330.8288 24.2483 0.2288 1041 +1043 4 457.068 329.8266 24.6336 0.2288 1042 +1044 4 457.6549 328.8611 25.0659 0.2669 1043 +1045 4 458.3116 327.9379 25.4556 0.2924 1044 +1046 4 458.9877 327.0364 25.9392 0.3051 1045 +1047 4 459.6764 326.1372 26.3222 0.3051 1046 +1048 4 460.3696 325.2426 26.7294 0.2924 1047 +1049 4 461.0228 324.3229 27.1984 0.2669 1048 +1050 4 461.4667 323.2727 27.358 0.2415 1049 +1051 4 461.7195 322.1676 27.0301 0.2415 1050 +1052 4 461.9255 321.0579 26.5815 0.2796 1051 +1053 4 462.1863 319.9459 26.6837 0.3178 1052 +1054 4 462.5844 318.9117 27.3666 0.3432 1053 +1055 4 463.034 317.8924 28.0092 0.3305 1054 +1056 4 463.4401 316.8239 27.9706 0.3305 1055 +1057 4 463.6987 315.7143 28.194 0.3305 1056 +1058 4 463.781 314.6389 29.1231 0.3686 1057 +1059 4 463.8405 313.5178 29.6447 0.4068 1058 +1060 4 464.0933 312.4035 29.7604 0.4449 1059 +1061 4 464.5406 311.359 30.0947 0.4576 1060 +1062 4 465.068 310.3638 30.5673 0.4576 1061 +1063 4 465.7144 309.4245 30.7661 0.483 1062 +1064 4 466.4649 308.5608 30.7104 0.4957 1063 +1065 4 467.2016 307.6948 30.42 0.5084 1064 +1066 4 467.8926 306.8002 29.9897 0.4957 1065 +1067 4 468.6087 305.9113 29.8724 0.5084 1066 +1068 4 469.2368 304.9744 30.2957 0.5084 1067 +1069 4 469.6017 303.9093 30.7555 0.4957 1068 +1070 4 469.6532 302.7813 31.1441 0.4576 1069 +1071 4 469.4598 301.6739 31.663 0.4449 1070 +1072 4 469.3123 300.5482 31.9911 0.4322 1071 +1073 4 469.3603 299.418 32.3327 0.4195 1072 +1074 4 469.7184 298.3575 32.695 0.394 1073 +1075 4 470.4803 297.5132 32.48 0.394 1074 +1076 4 471.3555 296.7936 32.1591 0.4195 1075 +1077 4 472.1986 296.0226 32.2675 0.4195 1076 +1078 4 472.9685 295.1817 32.3302 0.394 1077 +1079 4 473.5737 294.2208 32.233 0.3432 1078 +1080 4 473.9603 293.174 32.7496 0.3305 1079 +1081 4 474.0839 292.0804 33.5017 0.3305 1080 +1082 4 474.1983 290.9661 33.9948 0.3432 1081 +1083 4 474.5598 289.8885 34.1505 0.3432 1082 +1084 4 475.1455 288.908 34.1827 0.3432 1083 +1085 4 475.8354 287.9951 34.263 0.3432 1084 +1086 4 476.5023 287.0788 34.5394 0.3432 1085 +1087 4 477.0114 286.0744 35.0193 0.3432 1086 +1088 4 477.5045 285.0482 35.2526 0.3432 1087 +1089 4 478.0524 284.0438 35.3237 0.3305 1088 +1090 4 478.6244 283.0599 35.5208 0.2924 1089 +1091 4 479.1175 282.0635 36.1455 0.2542 1090 +1092 4 479.471 281.0339 36.9673 0.2542 1091 +1093 4 479.6998 279.9288 37.3386 0.3178 1092 +1094 4 480.0327 278.842 37.1398 0.3559 1093 +1095 4 480.4491 277.7975 36.6484 0.3432 1094 +1096 4 480.9673 276.7828 36.5 0.2669 1095 +1097 4 481.5702 275.8173 36.717 0.2542 1096 +1098 4 482.1983 274.8883 37.2655 0.2924 1097 +1099 4 482.8561 273.9788 37.7818 0.3813 1098 +1100 4 483.3995 273.0099 38.4014 0.4195 1099 +1101 4 483.801 271.9643 38.9617 0.4322 1100 +1102 4 484.3021 270.9758 39.5587 0.4068 1101 +1103 4 485.024 270.095 39.825 0.4068 1102 +1104 4 485.7367 269.2164 40.1181 0.394 1103 +1105 4 486.2835 268.2405 40.6526 0.394 1104 +1106 4 486.7548 267.2041 40.8607 0.3813 1105 +1107 4 487.3634 266.2374 40.9116 0.3559 1106 +1108 4 488.0533 265.3291 41.0572 0.3432 1107 +1109 4 488.8198 264.4997 41.4809 0.3178 1108 +1110 4 489.5988 263.6828 41.9115 0.3432 1109 +1111 4 490.3356 262.8123 41.9958 0.3432 1110 +1112 4 490.9545 261.8513 42.0022 0.3686 1111 +1113 4 491.4796 260.8377 42.0137 0.3686 1112 +1114 4 491.8628 259.7612 42.082 0.3686 1113 +1115 4 492.1808 258.6744 42.3987 0.3178 1114 +1116 4 492.4039 257.5899 43.0895 0.2669 1115 +1117 4 492.6636 256.5157 43.6268 0.2415 1116 +1118 4 493.3237 255.6176 43.8295 0.2542 1117 +1119 4 494.1977 254.9084 43.573 0.2542 1118 +1120 4 494.9585 254.0778 43.9765 0.2415 1119 +1121 4 495.5682 253.1169 44.2299 0.2669 1120 +1122 4 496.1288 252.1204 44.24 0.3305 1121 +1123 4 496.6276 251.0931 44.24 0.394 1122 +1124 4 497.1801 250.0944 44.2408 0.4068 1123 +1125 4 497.6652 249.0591 44.2439 0.3813 1124 +1126 4 498.2566 248.081 44.2593 0.3686 1125 +1127 4 498.8378 247.1029 44.3408 0.3559 1126 +1128 4 499.2736 246.0572 44.6631 0.3432 1127 +1129 4 499.7495 245.0448 45.2012 0.2796 1128 +1130 4 500.1854 243.99 45.3611 0.2161 1129 +1131 4 500.6647 242.9513 45.3718 0.1525 1130 +1132 4 501.0628 241.8816 45.4443 0.1398 1131 +1133 4 501.4324 240.82 45.7716 0.1652 1132 +1134 4 502.0318 239.8808 46.3943 0.2161 1133 +1135 4 502.7194 238.9896 46.8552 0.2542 1134 +1136 4 503.5133 238.1888 47.2749 0.2415 1135 +1137 4 504.3713 237.4383 47.2114 0.2288 1136 +1138 4 505.211 236.6833 46.9571 0.2288 1137 +1139 4 505.8802 235.7773 47.2982 0.2542 1138 +1140 4 506.2589 234.7477 47.948 0.2415 1139 +1141 4 506.2932 233.6277 48.4722 0.1907 1140 +1142 4 506.3653 232.526 48.743 0.1652 1141 +1143 4 506.8881 231.5113 48.8684 0.178 1142 +1144 4 507.4795 230.5446 49.2282 0.2415 1143 +1145 4 508.0607 229.5756 49.6283 0.2542 1144 +1146 4 508.6224 228.5804 49.6605 0.2542 1145 +1147 4 509.1818 227.5851 49.5485 0.2161 1146 +1148 4 509.7286 226.5818 49.672 0.2034 1147 +1149 4 510.2286 225.5602 49.9223 0.1907 1148 +1150 4 510.5729 224.4814 50.2026 0.2034 1149 +1151 4 510.8864 223.4095 50.673 0.2288 1150 +1152 4 511.495 222.4565 50.9477 0.2669 1151 +1153 4 512.2638 221.6111 50.9793 0.2924 1152 +1154 4 513.0634 220.7931 51.0577 0.2924 1153 +1155 4 513.8631 219.9855 51.3369 0.2542 1154 +1156 4 514.6295 219.1584 51.7818 0.1907 1155 +1157 4 515.348 218.2752 52.015 0.178 1156 +1158 4 516.0595 217.3829 51.9126 0.2034 1157 +1159 4 516.6979 216.4482 51.5704 0.3051 1158 +1160 4 517.2093 215.4381 51.2333 0.3686 1159 +1161 4 517.7 214.4096 51.3204 0.4576 1160 +1162 4 518.2034 213.4029 51.8064 0.4703 1161 +1163 4 518.7308 212.4214 52.4367 0.4957 1162 +1164 4 519.3337 211.4913 53.1143 0.483 1163 +1165 4 520.0281 210.6207 53.7541 0.483 1164 +1166 4 520.7305 209.7387 54.1464 0.4449 1165 +1167 4 521.3185 208.7651 54.122 0.3559 1166 +1168 4 521.7773 207.7264 53.7816 0.3051 1167 +1169 4 522.2852 206.7185 53.5161 0.2796 1168 +1170 4 522.9659 205.809 53.7121 0.3432 1169 +1171 4 523.7243 204.967 54.0977 0.3686 1170 +1172 4 524.4782 204.1113 54.2895 0.4195 1171 +1173 4 525.2173 203.2385 54.322 0.4322 1172 +1174 4 525.9918 202.3988 54.3284 0.4576 1173 +1175 4 526.7914 201.5808 54.3528 0.4322 1174 +1176 4 527.5762 200.7503 54.467 0.3813 1175 +1177 4 528.3141 199.8877 54.7912 0.3178 1176 +1178 4 529.0234 199.0148 55.2992 0.2669 1177 +1179 4 529.7647 198.1648 55.7519 0.2415 1178 +1180 4 530.5071 197.3091 55.7522 0.2542 1179 +1181 4 531.1272 196.3745 55.2608 0.3051 1180 +1182 4 531.6271 195.3643 55.1004 0.3686 1181 +1183 4 532.1476 194.3748 55.6396 0.394 1182 +1184 4 532.7905 193.471 56.2724 0.3686 1183 +1185 4 533.5971 192.6851 56.6656 0.3305 1184 +1186 4 534.5157 192.025 57.0497 0.3051 1185 +1187 4 535.3966 191.3248 57.4538 0.3559 1186 +1188 4 536.1013 190.4394 57.6503 0.4195 1187 +1189 4 536.6241 189.4247 57.6764 0.483 1188 +1190 4 537.0542 188.3653 57.664 0.4322 1189 +1191 4 537.442 187.29 57.575 0.3432 1190 +1192 4 537.7361 186.1952 57.265 0.2415 1191 +1193 4 538.0827 185.1267 56.8378 0.2288 1192 +1194 4 538.6124 184.1211 56.6625 0.2415 1193 +1195 4 539.1935 183.1521 56.9904 0.2669 1194 +1196 4 539.6957 182.2243 57.9933 0.2415 1195 +1197 4 540.0721 181.2393 59.0075 0.2415 1196 +1198 4 540.5732 180.2452 59.5022 0.2288 1197 +1199 4 541.3877 179.4902 59.9348 0.2542 1198 +1200 4 542.2331 178.734 60.121 0.2415 1199 +1201 4 542.7422 177.7387 60.305 0.2669 1200 +1202 4 543.1655 176.6919 60.7309 0.3178 1201 +1203 4 543.7512 175.7218 61.0112 0.3813 1202 +1204 4 544.4376 174.8089 61.1341 0.4322 1203 +1205 4 545.1332 173.9086 61.4228 0.4068 1204 +1206 4 545.7612 172.9705 61.8517 0.3813 1205 +1207 4 546.4179 172.0404 62.0718 0.3305 1206 +1208 4 547.1878 171.1996 61.9791 0.3432 1207 +1209 4 548.0263 170.4423 61.5717 0.3559 1208 +1210 4 548.786 169.6037 61.1999 0.394 1209 +1211 4 549.3934 168.6416 61.2209 0.394 1210 +1212 4 549.9734 167.6749 61.6641 0.3813 1211 +1213 4 550.6164 166.746 62.0886 0.3178 1212 +1214 4 551.3302 165.8583 62.3258 0.2415 1213 +1215 4 552.1619 165.0964 62.7326 0.1907 1214 +1216 4 553.0474 164.3882 63.1151 0.178 1215 +1217 4 553.7097 163.4707 63.1481 0.2161 1216 +1218 4 554.2074 162.4503 62.8586 0.2161 1217 +1219 4 555.0688 161.7364 63.0011 0.2288 1218 +1220 4 556.1785 161.5191 63.2559 0.2288 1219 +1221 4 557.1555 160.9402 63.3847 0.2796 1220 +1222 4 557.9437 160.1268 63.7448 0.3051 1221 +1223 4 558.7079 159.3077 64.3082 0.2796 1222 +1224 4 559.5087 158.5184 64.832 0.2161 1223 +1225 4 560.3964 157.8285 65.3447 0.1907 1224 +1226 4 560.886 156.8046 65.2392 0.2288 1225 +1227 4 561.9191 156.323 65.4396 0.2669 1226 +1228 4 562.8388 155.6652 65.0538 0.2669 1227 +1229 4 563.8902 155.2202 65.2123 0.2161 1228 +1230 4 564.8145 154.6036 65.5908 0.2034 1229 +1231 4 565.3831 153.6712 66.3491 0.1907 1230 +1232 4 566.2297 152.9208 66.5487 0.2161 1231 +1233 4 567.2627 152.4437 66.6935 0.1907 1232 +1234 4 568.3484 152.1497 67.1779 0.1907 1233 +1235 4 569.4271 151.8946 67.664 0.1652 1234 +1236 4 570.2726 151.2093 68.3402 0.1652 1235 +1237 4 570.856 150.2804 69.1054 0.1398 1236 +1238 4 571.571 149.4258 69.7385 0.1271 1237 +1239 4 572.2334 148.5278 70.3492 0.1144 1238 +1240 4 572.9152 147.6412 70.7935 0.1144 1239 +1241 4 573.7412 146.853 70.8347 0.1144 1240 +1242 4 574.3509 145.9103 70.784 0.1144 1241 +1243 4 574.693 144.8201 70.6577 0.1144 1242 +1244 4 575.2204 143.8305 70.56 0.1144 1243 +1245 4 576.0509 143.0561 70.7482 0.1144 1244 +1246 4 576.9455 142.5424 71.6853 0.1144 1245 +1247 4 577.9351 142.1786 72.4679 0.1271 1246 +1248 4 578.8171 141.4991 72.6986 0.1525 1247 +1249 4 579.5069 140.5953 72.9848 0.178 1248 +1250 4 580.3501 139.9638 73.619 0.178 1249 +1251 4 581.3019 139.4193 74.2899 0.1525 1250 +1252 4 582.1633 138.6814 74.5898 0.1398 1251 +1253 4 583.0831 138.0328 74.9073 0.1398 1252 +1254 4 584.0681 137.4619 75.1097 0.1525 1253 +1255 4 585.1114 137.018 75.2102 0.1525 1254 +1256 4 586.181 136.6302 75.4656 0.1525 1255 +1257 4 587.1763 136.1509 76.1211 0.1525 1256 +1258 4 588.1842 135.7345 76.9266 0.1398 1257 +1259 4 589.2481 135.3489 77.2178 0.1271 1258 +1260 4 590.0912 134.6625 77.9108 0.1144 1259 +1261 4 590.7627 133.7485 78.1071 0.1144 1260 +1262 4 591.694 133.1044 78.12 0.1144 1261 +1263 4 592.203 132.1023 78.12 0.1144 1262 +1264 4 592.2545 130.9628 78.12 0.1144 1263 +1265 4 593.1285 130.2524 78.12 0.1398 1264 +1266 4 594.0792 129.6152 78.12 0.1907 1265 +1267 4 432.7855 379.5861 15.1883 0.3813 944 +1268 4 432.3794 378.5187 15.2043 0.3305 1267 +1269 4 431.9538 377.4639 15.4969 0.2924 1268 +1270 4 431.5832 376.4035 16.0068 0.2669 1269 +1271 4 431.2125 375.327 16.1736 0.2669 1270 +1272 4 430.859 374.2436 15.9807 0.2669 1271 +1273 4 430.4392 373.2003 15.5008 0.2415 1272 +1274 4 429.7344 372.3274 15.1698 0.2288 1273 +1275 4 428.7804 371.7188 15.0592 0.2161 1274 +1276 4 427.6821 371.4431 14.9531 0.2288 1275 +1277 4 426.5759 371.1639 15.073 0.2034 1276 +1278 4 425.743 370.5061 15.8942 0.1907 1277 +1279 4 424.9971 369.6619 16.2106 0.2034 1278 +1280 4 424.2787 368.7718 16.24 0.2796 1279 +1281 4 423.5534 367.8864 16.2397 0.3432 1280 +1282 4 422.7641 367.0593 16.238 0.3813 1281 +1283 4 421.9484 366.2573 16.2327 0.3686 1282 +1284 4 421.1053 365.484 16.2064 0.3432 1283 +1285 4 420.1649 364.8399 16.0611 0.3051 1284 +1286 4 419.1216 364.4349 15.573 0.2669 1285 +1287 4 418.2109 363.8469 14.747 0.2669 1286 +1288 4 417.6 362.9271 14.1554 0.2796 1287 +1289 4 416.9743 361.9742 14.0112 0.3051 1288 +1290 4 416.3325 361.027 14.0 0.2924 1289 +1291 4 415.542 360.2056 14.0 0.2924 1290 +1292 4 414.5925 359.5729 14.0 0.3178 1291 +1293 4 413.7116 358.8465 14.0 0.3559 1292 +1294 4 412.9474 357.9965 14.0008 0.3559 1293 +1295 4 412.2884 357.063 14.0042 0.2924 1294 +1296 4 411.7634 356.0483 14.0263 0.2161 1295 +1297 4 411.3275 354.9924 14.1529 0.1907 1296 +1298 4 410.7624 354.0097 14.4917 0.2161 1297 +1299 4 410.0782 353.0967 14.6748 0.2542 1298 +1300 4 409.4731 352.1404 14.3363 0.2542 1299 +1301 4 408.9571 351.1256 14.065 0.2415 1300 +1302 4 408.567 350.0526 14.0045 0.2161 1301 +1303 4 408.2192 348.9623 14.0022 0.1907 1302 +1304 4 408.0145 347.8378 14.0148 0.1525 1303 +1305 4 408.0991 346.7018 14.0997 0.1271 1304 +1306 4 408.3474 345.5864 14.2066 0.1144 1305 +1307 4 408.6528 344.4847 14.11 0.1144 1306 +1308 4 409.1836 343.4746 14.1131 0.1398 1307 +1309 4 409.3781 342.3637 14.2369 0.178 1308 +1310 4 408.8061 341.3788 13.9762 0.2288 1309 +1311 4 408.2055 340.4292 13.4532 0.2415 1310 +1312 4 407.6324 339.4408 13.2989 0.2542 1311 +1313 4 407.0444 338.4604 13.2255 0.2415 1312 +1314 4 406.4037 337.5223 12.9178 0.2542 1313 +1315 4 405.715 336.6083 12.8803 0.2542 1314 +1316 4 405.0366 335.6874 12.8822 0.2796 1315 +1317 4 404.3662 334.7607 12.8909 0.2796 1316 +1318 4 403.713 333.8226 12.9338 0.2669 1317 +1319 4 402.982 332.9463 13.1244 0.2288 1318 +1320 4 402.1915 332.141 13.5626 0.2034 1319 +1321 4 401.584 331.1869 13.7536 0.1907 1320 +1322 4 401.3381 330.0818 13.3683 0.2034 1321 +1323 4 401.155 328.9629 13.0029 0.2034 1322 +1324 4 400.9194 327.8441 12.9514 0.2034 1323 +1325 4 400.6322 326.7424 13.1916 0.1907 1324 +1326 4 400.2227 325.6934 13.6335 0.1907 1325 +1327 4 399.5843 324.7587 13.9412 0.178 1326 +1328 4 398.7275 324.0025 13.9969 0.1652 1327 +1329 4 397.794 323.3436 13.9838 0.178 1328 +1330 4 396.7987 322.7807 13.9121 0.2161 1329 +1331 4 395.7531 322.3403 13.627 0.2415 1330 +1332 4 394.7246 321.9399 13.1566 0.2288 1331 +1333 4 393.965 321.1231 13.4946 0.2415 1332 +1334 4 393.4388 320.1084 13.5055 0.2924 1333 +1335 4 392.8668 319.1371 13.1827 0.3559 1334 +1336 4 392.2513 318.2082 12.773 0.3432 1335 +1337 4 391.7125 317.2049 13.0141 0.2924 1336 +1338 4 391.2102 316.1959 13.1648 0.2288 1337 +1339 4 390.7675 315.1846 13.3658 0.2034 1338 +1340 4 390.2104 314.2396 14.1053 0.178 1339 +1341 4 389.7471 313.2066 14.2864 0.178 1340 +1342 4 389.4233 312.1656 13.65 0.1907 1341 +1343 4 389.2666 311.128 12.5566 0.2288 1342 +1344 4 389.0801 310.056 11.7642 0.2542 1343 +1345 4 388.8731 308.9566 11.2566 0.2415 1344 +1346 4 388.4784 307.9408 10.9614 0.2288 1345 +1347 4 387.7439 307.0656 10.8175 0.2288 1346 +1348 4 387.4122 306.0337 10.2435 0.2796 1347 +1349 4 386.6949 305.2329 10.4885 0.3305 1348 +1350 4 386.06 304.3074 10.2015 0.3559 1349 +1351 4 385.5497 303.3362 9.4259 0.3559 1350 +1352 4 385.1962 302.302 8.6097 0.3178 1351 +1353 4 384.8004 301.293 9.3607 0.2924 1352 +1354 4 384.1255 300.451 10.2819 0.2669 1353 +1355 4 383.24 299.728 10.36 0.2542 1354 +1356 4 433.4948 381.6235 18.1658 0.2924 943 +1357 4 434.1228 381.4668 20.2387 0.2034 1356 +1358 4 435.1067 381.4634 21.6325 0.1652 1357 +1359 4 436.1672 381.659 22.4507 0.178 1358 +1360 4 436.6911 382.4678 22.3471 0.2288 1359 +1361 4 436.7083 383.5981 22.1788 0.2542 1360 +1362 4 436.6362 384.7203 22.5845 0.2542 1361 +1363 4 436.6419 385.8449 23.0667 0.2415 1362 +1364 4 436.6934 386.9774 22.9566 0.2034 1363 +1365 4 437.0206 388.0288 22.3874 0.2034 1364 +1366 4 437.4542 389.0767 22.2429 0.2034 1365 +1367 4 438.0296 390.0422 21.9145 0.2542 1366 +1368 4 438.605 391.0181 22.008 0.2669 1367 +1369 4 439.2159 391.9813 22.1278 0.2924 1368 +1370 4 440.1883 392.495 22.0937 0.2669 1369 +1371 4 441.2946 392.7821 22.1236 0.2669 1370 +1372 4 442.2052 393.4319 22.2919 0.2542 1371 +1373 4 442.6628 394.4501 22.0623 0.2924 1372 +1374 4 442.8676 395.5712 21.9512 0.3178 1373 +1375 4 443.0678 396.6957 21.7955 0.3432 1374 +1376 4 443.578 397.6979 22.1746 0.3178 1375 +1377 4 444.1752 398.4712 20.8544 0.2924 1376 +1378 4 444.8215 399.4093 20.6668 0.2796 1377 +1379 4 445.5239 400.2353 21.56 0.3305 1378 +1380 4 446.2469 400.7832 21.866 0.2415 1379 +1381 4 447.2445 401.0967 22.9942 0.2542 1380 +1382 4 448.3073 401.4468 22.468 0.2415 1381 +1383 4 449.3438 401.8712 22.9359 0.2034 1382 +1384 4 450.45 401.8735 23.4702 0.1652 1383 +1385 4 451.4704 401.798 22.7223 0.1525 1384 +1386 4 452.3536 401.2237 22.8262 0.178 1385 +1387 4 453.3615 401.1001 23.6088 0.2034 1386 +1388 4 454.3076 401.5692 24.2589 0.2415 1387 +1389 4 455.1564 402.2487 25.0524 0.2669 1388 +1390 4 456.0762 402.8825 24.876 0.3051 1389 +1391 4 457.0074 403.4728 24.1343 0.3432 1390 +1392 4 457.8631 404.1638 23.4262 0.3432 1391 +1393 4 458.8138 404.6854 23.5626 0.3305 1392 +1394 4 459.6478 405.1979 24.885 0.2924 1393 +1395 4 460.4909 405.6372 26.4256 0.2669 1394 +1396 4 461.31 406.3351 27.1762 0.2161 1395 +1397 4 462.0994 407.0741 28.0036 0.1652 1396 +1398 4 462.7903 407.8131 27.83 0.1398 1397 +1399 4 462.7194 408.9388 27.9446 0.1398 1398 +1400 4 462.6725 410.0451 27.6965 0.1652 1399 +1401 4 462.7091 411.1399 28.5046 0.178 1400 +1402 4 462.8578 412.2129 29.0987 0.2034 1401 +1403 4 463.1896 413.1853 29.6456 0.2161 1402 +1404 4 463.2296 413.9427 31.7198 0.2161 1403 +1405 4 463.5328 414.7023 31.9715 0.2161 1404 +1406 4 463.8234 415.4711 33.2511 0.2288 1405 +1407 4 463.892 414.8647 35.1758 0.2669 1406 +1408 4 464.3496 414.684 37.4198 0.2796 1407 +1409 4 464.496 415.7216 38.4462 0.2796 1408 +1410 4 465.274 416.4412 39.0706 0.2542 1409 +1411 4 466.3505 416.8187 38.8654 0.2288 1410 +1412 4 467.276 417.3861 38.7335 0.178 1411 +1413 4 468.0504 417.8712 39.6371 0.1652 1412 +1414 4 469.1235 417.7362 40.3908 0.1652 1413 +1415 4 470.0845 417.9467 41.4809 0.2161 1414 +1416 4 471.0031 418.3608 42.7941 0.2542 1415 +1417 4 472.067 418.6846 43.1575 0.3178 1416 +1418 4 473.1492 419.0495 43.0648 0.3305 1417 +1419 4 474.2521 419.3046 43.3112 0.3051 1418 +1420 4 475.3331 419.0644 43.7108 0.2288 1419 +1421 4 476.3216 418.5232 44.1465 0.1907 1420 +1422 4 477.3409 418.8584 44.2198 0.1907 1421 +1423 4 478.4677 418.9431 44.093 0.2288 1422 +1424 4 479.5648 419.038 44.7714 0.2796 1423 +1425 4 480.6116 419.387 45.4728 0.3178 1424 +1426 4 481.6274 419.9063 45.5703 0.3686 1425 +1427 4 482.7497 420.102 45.7131 0.3813 1426 +1428 4 483.7976 420.5344 45.36 0.3686 1427 +1429 4 445.461 401.679 21.9845 0.2924 1379 +1430 4 445.1659 402.7727 21.7115 0.2924 1429 +1431 4 445.1945 403.8549 21.4799 0.3051 1430 +1432 4 445.771 404.8067 21.3013 0.3051 1431 +1433 4 446.2687 405.7619 21.8425 0.2924 1432 +1434 4 446.3808 406.851 21.9724 0.2924 1433 +1435 4 446.2904 407.979 21.6037 0.2669 1434 +1436 4 445.9415 409.0509 21.4144 0.2542 1435 +1437 4 445.5422 410.0588 22.0562 0.2542 1436 +1438 4 445.0618 411.0598 22.4006 0.3051 1437 +1439 4 444.833 412.1512 22.5826 0.3686 1438 +1440 4 444.9577 413.2792 22.7581 0.3686 1439 +1441 4 444.9039 414.4094 22.9611 0.3178 1440 +1442 4 444.8009 415.5466 22.9653 0.2415 1441 +1443 4 444.6534 416.6711 23.2529 0.2288 1442 +1444 4 444.7128 417.7991 23.1344 0.2669 1443 +1445 4 445.191 418.815 22.8724 0.3051 1444 +1446 4 445.6635 419.8263 23.3646 0.3051 1445 +1447 4 446.0021 420.8948 23.0208 0.2669 1446 +1448 4 446.3842 421.9129 22.1598 0.2542 1447 +1449 4 446.8464 422.9162 22.7094 0.2415 1448 +1450 4 447.2182 423.9858 22.678 0.2415 1449 +1451 4 447.2743 425.1173 22.5464 0.2288 1450 +1452 4 447.3784 426.2132 23.0896 0.2161 1451 +1453 4 447.0329 427.284 23.5656 0.2034 1452 +1454 4 446.6851 428.3308 24.3158 0.1907 1453 +1455 4 446.3842 429.3981 24.9298 0.2034 1454 +1456 4 446.2687 430.5009 24.7372 0.2034 1455 +1457 4 446.4254 431.5568 23.8924 0.1907 1456 +1458 4 446.764 432.6459 23.868 0.178 1457 +1459 4 446.9414 433.7453 24.3768 0.178 1458 +1460 4 446.8853 434.8561 24.2586 0.2161 1459 +1461 4 446.9528 435.9075 25.2084 0.2415 1460 +1462 4 446.8544 436.9714 26.1985 0.2796 1461 +1463 4 446.6153 438.0673 26.7252 0.2924 1462 +1464 4 446.6268 439.1736 26.0543 0.3178 1463 +1465 4 446.6965 440.3016 25.655 0.3305 1464 +1466 4 446.7228 441.3987 26.4359 0.3178 1465 +1467 4 446.6794 442.5404 26.4902 0.2669 1466 +1468 4 446.5535 443.6512 26.9503 0.2288 1467 +1469 4 446.5867 444.7025 27.4691 0.2161 1468 +1470 4 446.7526 445.7745 26.7058 0.2415 1469 +1471 4 446.8327 446.883 26.2136 0.2415 1470 +1472 4 446.9642 447.9526 25.7807 0.2669 1471 +1473 4 447.042 449.0566 26.4443 0.2669 1472 +1474 4 446.8727 450.1182 27.3179 0.2924 1473 +1475 4 446.7778 451.1844 28.2324 0.2669 1474 +1476 4 446.5879 452.2529 27.8597 0.2796 1475 +1477 4 446.6782 453.3615 27.8678 0.2796 1476 +1478 4 447.288 454.2664 27.3767 0.3051 1477 +1479 4 447.7994 455.2468 27.7934 0.2924 1478 +1480 4 447.9675 456.3485 27.4842 0.2796 1479 +1481 4 447.9732 457.3529 26.3096 0.2796 1480 +1482 4 448.3107 458.4225 26.8122 0.2924 1481 +1483 4 448.734 459.4773 26.8652 0.3051 1482 +1484 4 448.9731 460.5858 26.6375 0.3051 1483 +1485 4 449.2271 461.6406 25.8059 0.2796 1484 +1486 4 449.3964 462.6771 25.9274 0.2288 1485 +1487 4 449.7682 463.7032 26.2332 0.1652 1486 +1488 4 450.005 464.798 25.9854 0.1525 1487 +1489 4 450.0976 465.91 26.3864 0.1907 1488 +1490 4 450.1194 467.0002 25.9826 0.2415 1489 +1491 4 450.1869 468.1282 25.6676 0.2542 1490 +1492 4 450.291 468.6716 23.4268 0.2415 1491 +1493 2 414.4174 413.7882 15.3527 0.1907 1 +1494 2 414.3522 414.9185 15.0766 0.2669 1493 +1495 2 414.287 416.0213 14.3632 0.3305 1494 +1496 2 414.1326 417.1093 13.5979 0.3813 1495 +1497 2 413.9564 418.1938 12.8352 0.4068 1496 +1498 2 413.9335 419.2989 12.136 0.4068 1497 +1499 2 414.0605 420.412 11.6236 0.3559 1498 +1500 2 414.3236 421.4896 11.0018 0.3051 1499 +1501 2 414.2561 422.4826 10.0867 0.2796 1500 +1502 2 413.4931 423.2537 9.6502 0.2924 1501 +1503 2 412.5207 423.8463 9.8403 0.3051 1502 +1504 2 411.7462 424.6322 9.9644 0.2796 1503 +1505 2 411.3744 425.5829 9.0264 0.2669 1504 +1506 2 411.0152 426.5496 8.2065 0.2288 1505 +1507 2 410.6914 427.6249 8.4067 0.2288 1506 +1508 2 410.4683 428.7243 8.9289 0.2034 1507 +1509 2 410.2933 429.8111 9.6664 0.2161 1508 +1510 2 410.0622 430.899 9.6303 0.2034 1509 +1511 2 409.8243 432.011 9.4004 0.2288 1510 +1512 2 409.0624 432.6619 9.9117 0.2415 1511 +1513 2 409.0944 433.576 10.92 0.2796 1512 +1514 3 420.0002 408.7546 10.0285 0.3051 1 +1515 3 421.0904 408.6276 9.3506 0.3686 1514 +1516 3 422.1371 408.2124 9.3579 0.4195 1515 +1517 3 423.0867 407.5866 9.5656 0.394 1516 +1518 3 424.0556 406.9952 9.8697 0.3432 1517 +1519 3 425.1138 406.5833 9.9075 0.2796 1518 +1520 3 426.2075 406.2676 9.6527 0.2161 1519 +1521 3 427.332 406.2401 9.4366 0.178 1520 +1522 3 428.4509 406.4277 9.1146 0.1652 1521 +1523 3 429.3329 406.6771 10.3457 0.178 1522 +1524 3 430.0079 407.1073 12.3208 0.178 1523 +1525 3 430.9288 407.169 13.7455 0.178 1524 +1526 3 431.765 406.4987 13.9502 0.1907 1525 +1527 3 432.4629 405.6029 13.6391 0.2415 1526 +1528 3 433.3735 404.9245 13.7175 0.2669 1527 +1529 3 434.1926 404.1558 14.2106 0.2669 1528 +1530 3 435.0655 403.4911 14.9923 0.2161 1529 +1531 3 435.864 403.3744 13.16 0.1652 1530 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Nr5a1_471087815_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Nr5a1_471087815_m.swc new file mode 100644 index 0000000..7376d58 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Nr5a1_471087815_m.swc @@ -0,0 +1,1534 @@ +#name E:/Vaa3D-2.938/169250.03.02.01/169250.03.02.01_470218928_Nivi7.swc +#comment +##n,type,x,y,z,radius,parent +1 1 414.8144 408.5224 15.12 6.4406 -1 +2 3 415.7685 414.0582 14.8882 0.3686 1 +3 3 415.6495 414.9757 16.5147 0.5339 2 +4 3 415.3658 416.0739 16.8563 0.661 3 +5 3 415.6415 417.1756 16.515 0.6991 4 +6 3 416.1872 418.1366 17.2357 0.7118 5 +7 3 416.8393 419.0758 17.3597 0.7245 6 +8 3 417.5886 419.9407 17.36 0.7627 7 +9 3 418.4752 420.6625 17.36 0.8008 8 +10 3 419.4945 422.4128 17.3135 0.5466 9 +11 3 420.1923 423.3166 17.1464 0.5212 10 +12 3 420.6133 424.3393 16.4335 0.4957 11 +13 3 421.135 425.3369 15.9295 0.4957 12 +14 3 421.3546 426.458 16.0826 0.4449 13 +15 3 421.6567 427.5608 16.0269 0.3559 14 +16 3 421.5423 428.5184 17.4675 0.2669 15 +17 3 421.4713 429.6498 17.4583 0.2924 16 +18 3 421.4118 430.7492 17.8839 0.3432 17 +19 3 420.9199 431.7662 17.7391 0.3686 18 +20 3 420.174 432.6116 17.9446 0.3686 19 +21 3 419.371 433.3804 17.7316 0.3432 20 +22 3 419.0014 434.3562 16.9249 0.3559 21 +23 3 418.7212 435.324 15.9732 0.3686 22 +24 3 418.4203 436.4211 16.0723 0.3813 23 +25 3 418.1846 437.4965 16.7093 0.394 24 +26 3 417.7648 438.4963 17.4961 0.394 25 +27 3 417.1802 439.1278 16.5441 0.3813 26 +28 3 416.543 439.733 16.4973 0.3432 27 +29 3 415.8188 440.2512 18.1639 0.3178 28 +30 3 414.8453 440.6013 18.958 0.3051 29 +31 3 413.7242 440.6082 18.9213 0.2796 30 +32 3 412.6202 440.8038 19.0162 0.2796 31 +33 3 412.118 441.6995 19.4015 0.3051 32 +34 3 412.285 442.7749 20.083 0.394 33 +35 3 412.817 443.729 20.869 0.4449 34 +36 3 413.5102 444.6316 21.0196 0.4957 35 +37 3 413.556 445.7585 21.2654 0.5212 36 +38 3 413.143 447.0741 19.6034 0.4322 37 +39 3 412.6168 448.0808 19.8881 0.394 38 +40 3 412.0562 449.0143 20.657 0.3432 39 +41 3 411.5151 449.926 21.4312 0.3051 40 +42 3 410.8848 450.8744 21.2789 0.2924 41 +43 3 410.2292 451.8056 21.1624 0.2542 42 +44 3 409.6698 452.7929 20.9762 0.2034 43 +45 3 409.2568 453.8294 20.4523 0.178 44 +46 3 409.0704 454.9436 20.1698 0.178 45 +47 3 409.1802 456.0339 20.5537 0.1907 46 +48 3 409.1585 457.0211 21.546 0.2034 47 +49 3 408.7409 458.0141 22.437 0.2161 48 +50 3 408.4881 459.1055 22.78 0.2161 49 +51 3 408.4904 460.2426 22.8189 0.2034 50 +52 3 408.6723 461.3706 22.8502 0.1907 51 +53 3 408.9983 462.462 22.8077 0.2034 52 +54 3 409.3038 463.5351 23.119 0.2161 53 +55 3 409.2202 464.6299 23.3598 0.2288 54 +56 3 408.6654 465.5977 23.214 0.2161 55 +57 3 408.1895 466.6021 23.0574 0.178 56 +58 3 407.7937 467.658 22.6853 0.1398 57 +59 3 407.1096 468.5458 22.4742 0.1271 58 +60 3 406.1921 469.0686 23.1949 0.1525 59 +61 3 405.2128 469.4415 24.3166 0.178 60 +62 3 404.4051 470.0868 25.3742 0.178 61 +63 3 403.5494 470.7869 25.4982 0.178 62 +64 3 402.6651 471.4756 25.8037 0.1907 63 +65 3 401.6881 472.0396 26.0574 0.2415 64 +66 3 400.9526 472.8244 26.6879 0.2542 65 +67 3 400.4972 473.8471 26.6627 0.2415 66 +68 3 400.1929 474.9465 26.6081 0.2034 67 +69 3 399.693 475.809 27.7763 0.2161 68 +70 3 398.9185 476.6007 27.4254 0.2669 69 +71 3 397.9564 477.1212 26.6462 0.3051 70 +72 3 396.9051 477.5262 26.1811 0.3051 71 +73 3 395.9258 478.0753 25.664 0.2669 72 +74 3 395.0358 478.7617 26.1218 0.2415 73 +75 3 394.2796 479.5877 26.6865 0.2415 74 +76 3 394.2979 480.4628 28.3556 0.2542 75 +77 3 393.9936 481.4684 28.3256 0.2669 76 +78 3 393.1653 482.2029 28.7921 0.2542 77 +79 3 392.3051 482.9499 28.8492 0.2288 78 +80 3 391.4688 483.6088 29.6657 0.2161 79 +81 3 390.4838 483.9257 30.6312 0.2415 80 +82 3 389.5057 484.3719 30.3834 0.2924 81 +83 3 388.6191 485.0594 29.8824 0.3305 82 +84 3 387.6398 485.6314 29.7548 0.3305 83 +85 3 386.7441 486.3178 29.9541 0.3051 84 +86 3 385.8312 486.9253 29.412 0.2542 85 +87 3 385.0429 487.7295 29.0755 0.2288 86 +88 3 385.0704 488.8312 29.4 0.2288 87 +89 3 413.8923 446.5295 21.2332 0.3305 37 +90 3 414.0719 447.6209 21.6059 0.3051 89 +91 3 413.9209 448.7306 21.5765 0.2796 90 +92 3 413.8763 449.846 21.0935 0.2542 91 +93 3 413.8466 450.9797 20.9381 0.1907 92 +94 3 413.2814 451.9166 21.294 0.1652 93 +95 3 412.3491 452.5172 21.782 0.178 94 +96 3 411.2897 452.8616 22.3804 0.2288 95 +97 3 410.3208 453.2002 23.5788 0.2542 96 +98 3 409.218 453.2986 24.0853 0.2796 97 +99 3 408.5087 454.065 24.8021 0.2796 98 +100 3 408.4114 455.1507 25.4965 0.2796 99 +101 3 408.6185 456.1403 26.7708 0.2669 100 +102 3 409.0178 457.1332 27.7544 0.2796 101 +103 3 409.3953 458.1548 28.5242 0.2669 102 +104 3 408.9789 458.8973 30.2677 0.2542 103 +105 3 407.9515 459.356 30.3562 0.2161 104 +106 3 407.2068 460.1763 29.6979 0.2161 105 +107 3 406.6874 461.1681 29.3798 0.2161 106 +108 3 406.4792 462.2847 29.687 0.2288 107 +109 3 406.4232 463.3829 30.3103 0.2288 108 +110 3 406.5341 464.4182 31.3561 0.2161 109 +111 3 406.2985 465.481 32.097 0.2161 110 +112 3 406.0285 466.4706 33.1758 0.2288 111 +113 3 406.0239 467.5745 33.2567 0.2669 112 +114 3 406.2035 468.611 32.58 0.3051 113 +115 3 406.7515 469.6063 32.415 0.3051 114 +116 3 407.2846 470.6004 32.1434 0.2669 115 +117 3 407.645 471.5591 32.5606 0.2161 116 +118 3 407.2034 472.337 33.9486 0.1907 117 +119 3 406.4735 473.1492 34.613 0.2034 118 +120 3 405.9187 473.9901 35.7904 0.2034 119 +121 3 405.0687 474.5941 35.7104 0.2161 120 +122 3 404.0654 474.7108 36.834 0.2161 121 +123 3 403.9075 475.8354 36.5403 0.2415 122 +124 3 403.4785 476.8672 37.0034 0.2542 123 +125 3 402.8218 477.4598 38.7218 0.2542 124 +126 3 401.8952 477.6989 39.7194 0.2288 125 +127 3 401.8106 478.7697 39.459 0.2161 126 +128 3 402.3219 479.7604 39.1384 0.2288 127 +129 3 402.5622 480.8266 39.7446 0.2415 128 +130 3 402.6571 481.8173 41.1012 0.2415 129 +131 3 402.4009 482.8252 41.4795 0.2161 130 +132 3 402.0702 483.7393 42.0918 0.2034 131 +133 3 401.9547 484.7162 43.3311 0.178 132 +134 3 402.219 485.747 43.3927 0.178 133 +135 3 402.6194 486.7777 43.4686 0.178 134 +136 3 402.4889 487.773 44.448 0.1907 135 +137 3 401.8826 488.5932 45.6378 0.2034 136 +138 3 401.1402 489.3986 46.3901 0.2415 137 +139 3 400.3096 490.1685 46.5377 0.2796 138 +140 3 399.526 490.9934 46.478 0.3051 139 +141 3 398.8945 491.9131 46.9462 0.2924 140 +142 3 398.3488 492.8844 47.5555 0.2669 141 +143 3 397.9038 493.9197 48.0208 0.2415 142 +144 3 397.4176 494.9424 48.3753 0.2415 143 +145 3 396.7392 495.8245 48.909 0.2542 144 +146 3 396.1649 496.79 49.1725 0.2415 145 +147 3 395.9716 497.8963 49.2988 0.2161 146 +148 3 395.9476 498.8549 50.664 0.1907 147 +149 3 396.3045 499.8765 51.3192 0.1907 148 +150 3 396.5962 500.9336 52.0904 0.178 149 +151 3 396.2679 502.0101 52.1452 0.2034 150 +152 3 396.1672 503.1312 52.64 0.2796 151 +153 3 421.7573 429.151 15.1718 0.483 15 +154 3 421.9244 430.2653 14.6978 0.4195 153 +155 3 422.0662 431.3841 14.2232 0.3305 154 +156 3 422.12 432.5018 14.6902 0.2796 155 +157 3 422.1966 433.6206 15.2452 0.3432 156 +158 3 422.1406 434.7543 14.9027 0.3813 157 +159 3 421.882 435.8388 14.28 0.394 158 +160 3 420.8296 436.9577 13.186 0.3686 159 +161 3 420.0779 437.6166 11.8448 0.3305 160 +162 3 419.8777 438.5249 12.0445 0.2542 161 +163 3 419.5426 439.3578 13.6772 0.2161 162 +164 3 419.181 440.3679 13.2686 0.2415 163 +165 3 418.8436 441.4559 13.2356 0.2924 164 +166 3 418.4638 442.5335 13.3319 0.3178 165 +167 3 417.8883 443.5128 13.5985 0.3305 166 +168 3 417.4856 444.5767 13.8382 0.3559 167 +169 3 417.425 445.7161 14.0258 0.4195 168 +170 3 417.1299 446.8155 14.273 0.4449 169 +171 3 416.5865 447.8039 13.8558 0.4195 170 +172 3 416.2936 448.7008 12.376 0.3559 171 +173 3 415.7605 449.6686 13.0239 0.3178 172 +174 3 414.9368 450.4317 12.8534 0.2924 173 +175 3 413.9015 450.8493 13.2983 0.2796 174 +176 3 412.9165 451.3961 12.8517 0.2542 175 +177 3 411.8961 451.872 12.549 0.2288 176 +178 3 411.0358 452.611 12.2189 0.1907 177 +179 3 410.1926 453.3478 11.7572 0.178 178 +180 3 409.5314 454.2675 11.6967 0.1907 179 +181 3 408.9949 455.2662 11.655 0.2288 180 +182 3 408.3291 456.1162 12.3222 0.2669 181 +183 3 407.6003 456.7546 13.6881 0.3051 182 +184 3 406.7217 457.3151 13.9454 0.3305 183 +185 3 405.9839 458.0702 12.8789 0.3432 184 +186 3 405.3981 458.9682 12.0534 0.3305 185 +187 3 404.9257 460.0001 11.8423 0.3178 186 +188 3 404.4543 461.0309 11.6248 0.2796 187 +189 3 404.007 462.073 11.3347 0.2542 188 +190 3 403.5037 463.0832 11.6222 0.2161 189 +191 3 402.95 464.0304 12.3953 0.2034 190 +192 3 402.4466 464.9994 13.2031 0.1907 191 +193 3 402.2075 466.0519 13.0155 0.1907 192 +194 3 402.0451 467.1581 12.6353 0.1907 193 +195 3 401.8174 468.2792 12.644 0.1907 194 +196 3 401.4708 469.3626 12.7716 0.178 195 +197 3 400.8519 470.2995 13.1191 0.1652 196 +198 3 400.1106 471.145 13.6234 0.1398 197 +199 3 399.7113 472.1791 13.8687 0.1271 198 +200 3 399.3109 473.2328 13.4935 0.1271 199 +201 3 398.6508 474.148 13.701 0.1525 200 +202 3 398.2596 475.1776 14.3612 0.2034 201 +203 3 398.2722 476.2609 15.1833 0.2542 202 +204 3 397.8409 477.2917 15.3742 0.2924 203 +205 3 397.349 478.2858 14.7389 0.2924 204 +206 3 397.2231 479.3955 15.0836 0.2669 205 +207 3 397.2792 480.5315 14.9005 0.2542 206 +208 3 397.1751 481.6686 14.9134 0.2542 207 +209 3 397.0458 482.7508 15.7142 0.2542 208 +210 3 396.7403 483.8239 15.141 0.2288 209 +211 3 396.3079 484.865 15.4974 0.2034 210 +212 3 396.2908 485.9987 15.5518 0.2161 211 +213 3 396.5653 487.0992 15.3952 0.2415 212 +214 3 396.9634 488.154 15.8682 0.2542 213 +215 3 397.2746 489.2122 16.3523 0.2288 214 +216 3 397.0938 490.3138 16.4032 0.2034 215 +217 3 396.7529 491.3457 15.7492 0.1907 216 +218 3 396.2805 492.3787 16.0202 0.1907 217 +219 3 395.7016 493.3626 16.1857 0.2034 218 +220 3 395.133 494.3418 16.1364 0.2161 219 +221 3 394.5118 495.2742 15.7651 0.2288 220 +222 3 393.8357 496.1757 16.1616 0.2034 221 +223 3 393.1825 497.084 16.5472 0.178 222 +224 3 392.6608 498.0953 16.4119 0.1398 223 +225 3 392.3851 499.1878 16.1297 0.1398 224 +226 3 392.3954 500.3158 15.8334 0.1652 225 +227 3 392.5579 501.4381 16.0118 0.2034 226 +228 3 392.6654 502.5626 16.3489 0.2288 227 +229 3 392.5304 503.6563 15.9905 0.2161 228 +230 3 392.8485 504.6058 15.703 0.2161 229 +231 3 393.679 505.3712 15.9558 0.2161 230 +232 3 394.5942 506.0484 15.9706 0.2415 231 +233 3 395.5815 506.6032 15.6699 0.2415 232 +234 3 396.6225 507.0711 15.5168 0.2288 233 +235 3 397.7082 507.3892 15.7598 0.178 234 +236 3 398.8064 507.3571 16.3929 0.1398 235 +237 3 399.7822 507.8559 16.4368 0.1398 236 +238 3 400.7066 508.5206 16.1647 0.178 237 +239 3 401.5143 509.3237 15.9827 0.2542 238 +240 3 401.7728 510.224 14.56 0.3432 239 +241 3 421.5491 436.4589 14.488 0.4703 159 +242 3 421.8203 437.5217 13.7939 0.4068 241 +243 3 422.0651 438.5936 13.0189 0.3686 242 +244 3 422.2927 439.7056 13.3171 0.3559 243 +245 3 422.2698 440.8347 13.734 0.3686 244 +246 3 422.1818 441.9741 13.6581 0.394 245 +247 3 422.2733 443.0895 13.221 0.3813 246 +248 3 422.8235 443.9956 12.1755 0.3686 247 +249 3 423.4642 444.8307 11.0984 0.3178 248 +250 3 424.2181 445.4484 9.6359 0.2924 249 +251 3 424.9697 446.1234 8.7802 0.2542 250 +252 3 425.5749 446.7126 10.1234 0.2415 251 +253 3 426.3116 447.4619 9.7479 0.2415 252 +254 3 427.0907 448.1551 10.7674 0.2669 253 +255 3 427.7439 449.0646 10.9533 0.2796 254 +256 3 428.5241 449.838 10.7607 0.2796 255 +257 3 429.4873 450.3917 11.4128 0.2415 256 +258 3 430.0822 451.2325 12.0772 0.2288 257 +259 3 430.549 452.2255 11.9157 0.1907 258 +260 3 431.3635 452.9805 11.7505 0.1907 259 +261 3 432.3531 453.5491 11.7524 0.178 260 +262 3 432.9765 454.4563 11.5486 0.2034 261 +263 3 433.3655 455.5316 11.5206 0.2034 262 +264 3 433.9215 456.3004 10.0691 0.2034 263 +265 3 434.704 456.9857 9.4102 0.1907 264 +266 3 434.998 457.8448 11.1104 0.1907 265 +267 3 435.4053 458.7234 12.5023 0.1907 266 +268 3 436.0333 459.6272 12.6302 0.1907 267 +269 3 436.5424 460.508 11.4363 0.1907 268 +270 3 437.2688 461.2986 11.0706 0.2034 269 +271 3 437.7985 462.2629 11.3011 0.2034 270 +272 3 438.3053 463.2548 10.8296 0.2161 271 +273 3 438.9173 464.2066 10.6515 0.2161 272 +274 3 439.4241 465.227 10.5636 0.2415 273 +275 3 439.7845 466.2898 10.7484 0.2415 274 +276 3 440.2101 467.3286 11.062 0.2288 275 +277 3 440.7695 468.2895 10.5963 0.2034 276 +278 3 441.584 469.0068 10.0509 0.2034 277 +279 3 442.5221 469.6532 9.9355 0.2161 278 +280 3 443.3355 470.4048 9.3864 0.2288 279 +281 3 444.1877 471.1427 9.3254 0.2288 280 +282 3 445.1121 471.8142 9.3856 0.2288 281 +283 3 446.0284 472.4869 9.1188 0.2161 282 +284 3 446.7331 473.3586 9.3332 0.2034 283 +285 3 447.4413 474.2452 9.205 0.178 284 +286 3 448.2112 475.0895 9.2305 0.1652 285 +287 3 448.7786 476.0767 9.1448 0.178 286 +288 3 449.3632 477.048 9.52 0.2415 287 +289 3 420.3742 420.9268 17.3779 0.4703 9 +290 3 421.5137 420.857 17.5042 0.483 289 +291 3 422.6565 420.8238 17.5941 0.483 290 +292 3 423.7811 420.6694 17.2483 0.4703 291 +293 3 424.8816 420.3605 17.3186 0.4957 292 +294 3 426.0245 420.3571 17.4199 0.483 293 +295 3 427.2634 421.0252 16.7042 0.4576 294 +296 3 428.1111 421.6658 15.6918 0.4449 295 +297 3 429.0984 422.2161 15.4381 0.4068 296 +298 3 429.8386 422.9951 16.2999 0.3813 297 +299 3 430.422 423.9161 17.1332 0.3559 298 +300 3 430.9597 424.8965 17.7167 0.3178 299 +301 3 431.6941 425.7533 17.3169 0.2924 300 +302 3 432.0613 426.8333 17.3177 0.2415 301 +303 3 432.1918 427.9658 17.0853 0.2669 302 +304 3 432.6986 428.9874 16.8622 0.3178 303 +305 3 432.829 429.699 16.4027 0.2542 304 +306 3 433.1047 430.6405 15.0086 0.3305 305 +307 3 433.4376 431.6804 15.3588 0.3813 306 +308 3 433.4616 432.6608 16.8 0.4195 307 +309 3 433.2431 433.2214 17.6039 0.2161 308 +310 3 433.2236 434.2773 18.4173 0.2415 309 +311 3 433.4399 435.3892 18.4122 0.2542 310 +312 3 433.8734 436.4108 17.8545 0.2796 311 +313 3 434.4626 437.3295 17.0316 0.2669 312 +314 3 434.9968 438.3167 16.613 0.2415 313 +315 3 435.8034 439.0683 16.8876 0.2161 314 +316 3 436.8616 439.471 16.7415 0.2415 315 +317 3 437.8763 439.9881 16.5043 0.2924 316 +318 3 438.8075 440.5704 17.2301 0.3432 317 +319 3 439.1233 441.6012 18.0578 0.3559 318 +320 3 439.2148 442.7188 17.5605 0.3432 319 +321 3 439.2411 443.8617 17.6568 0.3051 320 +322 3 439.296 444.9634 17.185 0.2796 321 +323 3 439.2411 446.0033 16.83 0.2669 322 +324 3 438.8853 446.9288 18.1132 0.2542 323 +325 3 438.7229 447.8817 19.2805 0.2542 324 +326 3 439.002 448.9285 19.0991 0.2415 325 +327 3 439.4161 449.9592 18.7183 0.2542 326 +328 3 439.8737 450.9991 18.935 0.2415 327 +329 3 440.345 451.9612 19.7576 0.2415 328 +330 3 440.9617 452.8364 20.4445 0.2288 329 +331 3 441.4707 453.8042 20.921 0.2415 330 +332 3 442.0828 454.6862 20.7435 0.2669 331 +333 3 442.8321 455.5191 20.7046 0.2796 332 +334 3 443.4224 456.4743 21.1523 0.2924 333 +335 3 443.92 457.4181 20.5523 0.3051 334 +336 3 444.5584 458.323 20.1698 0.3305 335 +337 3 444.9222 459.3755 20.3045 0.3305 336 +338 3 445.3718 460.4085 20.1572 0.3178 337 +339 3 445.7768 461.4232 20.7444 0.3051 338 +340 3 446.1406 462.4666 21.4645 0.2924 339 +341 3 446.6691 463.4676 21.6219 0.2796 340 +342 3 447.2765 464.4114 22.0833 0.2542 341 +343 3 447.8302 465.4009 22.3874 0.2542 342 +344 3 448.1517 466.4912 22.4692 0.2542 343 +345 3 448.6619 467.4842 22.9284 0.2796 344 +346 3 449.2076 468.4749 23.3388 0.2796 345 +347 3 449.8746 469.3935 23.1501 0.2796 346 +348 3 450.6731 470.1554 22.4619 0.2669 347 +349 3 451.5345 470.8818 22.6814 0.2796 348 +350 3 452.1923 471.7833 23.238 0.3051 349 +351 3 452.8044 472.7431 23.1594 0.3559 350 +352 3 453.2482 473.7922 22.9827 0.394 351 +353 3 453.3512 474.9213 23.1829 0.394 352 +354 3 453.4061 476.0619 23.3503 0.3432 353 +355 3 453.4496 477.1956 23.6936 0.2796 354 +356 3 453.3741 478.3236 24.1259 0.2542 355 +357 3 453.8134 479.3612 24.3421 0.2669 356 +358 3 454.6702 480.0933 23.9915 0.2796 357 +359 3 455.4298 480.8221 23.4203 0.2669 358 +360 3 456.4674 481.2156 24.0178 0.2415 359 +361 3 457.5622 481.5279 24.2298 0.2288 360 +362 3 458.6067 481.942 24.6854 0.2161 361 +363 3 459.5997 482.482 24.7352 0.1907 362 +364 3 460.5607 483.022 24.0943 0.1907 363 +365 3 461.4015 483.7507 23.4559 0.2288 364 +366 3 462.3956 484.2106 23.0728 0.2669 365 +367 3 463.4058 484.6362 23.4788 0.2542 366 +368 3 464.0464 485.4861 23.5088 0.2161 367 +369 3 464.3565 486.4654 22.3975 0.2034 368 +370 3 464.901 487.3486 22.2583 0.2288 369 +371 3 465.5302 488.2729 22.1032 0.2288 370 +372 3 465.9443 489.3243 22.1194 0.2161 371 +373 3 466.2978 490.4111 22.1878 0.1907 372 +374 3 466.6204 491.5013 22.451 0.2034 373 +375 3 467.1902 492.444 22.0301 0.2288 374 +376 3 467.5059 493.5262 21.9974 0.2669 375 +377 3 467.9486 494.5203 22.5758 0.3051 376 +378 3 468.1809 495.598 22.0374 0.3051 377 +379 3 468.7952 496.5463 21.8355 0.2669 378 +380 3 469.477 497.4112 22.2468 0.1907 379 +381 3 470.47 497.9512 21.9666 0.1398 380 +382 3 471.4996 498.2429 21.3632 0.1271 381 +383 3 472.6093 498.2143 21.3332 0.1398 382 +384 3 473.6297 498.689 21.2612 0.1525 383 +385 3 474.5404 499.2553 21.2744 0.1398 384 +386 3 475.4624 499.777 21.9915 0.1525 385 +387 3 476.0562 500.6453 21.2089 0.178 386 +388 3 476.4188 501.6097 21.8036 0.2288 387 +389 3 477.1887 502.375 22.2925 0.2415 388 +390 3 478.1359 503.0054 22.1418 0.2288 389 +391 3 479.0694 503.6597 22.2667 0.2034 390 +392 3 479.8016 504.5234 22.4787 0.178 391 +393 3 480.448 505.4043 21.7697 0.178 392 +394 3 481.06 506.3573 21.7974 0.1652 393 +395 3 481.8231 507.205 21.9271 0.1652 394 +396 3 482.3951 508.1225 21.0613 0.1525 395 +397 3 483.2256 508.7368 19.88 0.1907 396 +398 3 433.9467 433.0315 16.2554 0.1525 308 +399 3 434.5953 433.6481 14.5919 0.1652 398 +400 3 435.6958 433.7259 13.9961 0.1907 399 +401 3 436.7083 434.1949 13.8625 0.2161 400 +402 3 437.8305 434.1068 14.2601 0.2288 401 +403 3 438.9356 434.2052 14.8229 0.2288 402 +404 3 440.0133 433.9295 14.9223 0.2288 403 +405 3 441.0223 433.6309 14.1876 0.2415 404 +406 3 442.1446 433.7339 14.5827 0.2669 405 +407 3 443.2382 434.0325 14.7224 0.3051 406 +408 3 444.325 434.3676 14.5113 0.3178 407 +409 3 445.3878 434.7726 14.4337 0.3051 408 +410 3 446.446 435.0895 13.8989 0.2669 409 +411 3 447.4722 435.4361 13.7329 0.2542 410 +412 3 448.4594 435.9967 13.7931 0.2796 411 +413 3 449.5108 436.3674 13.314 0.3305 412 +414 3 450.6022 436.5355 12.6112 0.3813 413 +415 3 451.7244 436.5893 12.444 0.3813 414 +416 3 452.8101 436.8501 12.7361 0.3559 415 +417 3 453.6017 437.3626 11.7267 0.3051 416 +418 3 454.5204 437.6498 11.5307 0.2924 417 +419 3 455.5019 437.8957 12.7725 0.2924 418 +420 3 456.5018 438.3099 13.4848 0.2924 419 +421 3 457.5428 438.7068 13.0687 0.2796 420 +422 3 458.5701 439.1267 12.3973 0.2796 421 +423 3 459.5734 439.5717 11.611 0.2796 422 +424 3 460.6636 439.8257 11.6886 0.2796 423 +425 3 461.7916 439.7673 12.0036 0.2542 424 +426 3 462.8018 439.7113 10.8951 0.2669 425 +427 3 463.9149 439.7994 10.5633 0.2542 426 +428 3 464.9662 439.9916 11.4733 0.2542 427 +429 3 466.0725 439.9138 11.1432 0.2161 428 +430 3 467.1261 439.5031 10.7456 0.2034 429 +431 3 468.2495 439.6918 10.6529 0.1907 430 +432 3 469.2688 440.2112 10.64 0.2034 431 +433 3 432.7226 429.1121 17.598 0.1652 304 +434 3 433.4284 429.4896 18.6074 0.2161 433 +435 3 434.4443 429.7905 17.736 0.2669 434 +436 3 435.4853 430.1703 17.8595 0.3051 435 +437 3 436.3422 430.39 19.5054 0.3305 436 +438 3 437.3569 430.724 20.4061 0.3178 437 +439 3 438.4048 431.177 20.5887 0.2669 438 +440 3 439.2743 431.8829 21.1495 0.2034 439 +441 3 440.1094 432.6608 20.9689 0.1652 440 +442 3 440.2318 433.3781 22.388 0.178 441 +443 3 440.4423 434.418 23.273 0.2161 442 +444 3 440.7855 435.3892 24.3858 0.2542 443 +445 3 441.1573 436.3262 23.8218 0.2542 444 +446 3 441.0395 437.2791 24.7338 0.2288 445 +447 3 441.1973 438.3579 25.4083 0.2034 446 +448 3 441.7842 439.288 26.0859 0.2034 447 +449 3 441.8185 440.3702 26.9472 0.2288 448 +450 3 441.6755 441.465 27.5293 0.2542 449 +451 3 441.9741 442.5381 27.7606 0.2669 450 +452 3 442.3562 443.5402 27.0626 0.2796 451 +453 3 442.7486 444.5698 27.2101 0.3051 452 +454 3 443.2291 445.548 26.7375 0.3178 453 +455 3 443.5139 446.6359 26.4919 0.3178 454 +456 3 443.8834 447.4733 27.8149 0.2924 455 +457 3 444.023 448.4068 29.1508 0.2796 456 +458 3 443.8148 449.4879 28.9282 0.2415 457 +459 3 443.8937 450.5255 27.8975 0.2415 458 +460 3 444.2735 451.5746 27.5937 0.2415 459 +461 3 444.5939 452.3788 29.1805 0.2796 460 +462 3 445.3626 452.9107 30.6872 0.2669 461 +463 3 445.9964 453.8145 31.3488 0.2415 462 +464 3 446.1028 454.9379 31.717 0.2034 463 +465 3 445.6315 455.9606 32.1457 0.2034 464 +466 3 444.913 456.7008 33.3357 0.2161 465 +467 3 444.3399 457.6057 34.2574 0.2288 466 +468 3 443.4579 458.3276 34.2227 0.2288 467 +469 3 442.601 458.99 33.3934 0.2542 468 +470 3 441.6526 459.6134 33.5616 0.2669 469 +471 3 440.5773 459.8571 33.6389 0.2669 470 +472 3 439.5831 459.7347 34.6735 0.2288 471 +473 3 438.7606 460.412 35.0826 0.2161 472 +474 3 438.3739 461.4782 35.4404 0.2161 473 +475 3 438.0204 462.5512 35.87 0.2161 474 +476 3 437.5972 463.5797 36.3653 0.1907 475 +477 3 436.8204 464.2386 37.3173 0.1652 476 +478 3 435.7588 464.4983 37.8434 0.1652 477 +479 3 434.6331 464.655 38.0481 0.2034 478 +480 3 433.5989 465.052 38.3827 0.2415 479 +481 3 432.8839 465.6366 39.6301 0.2796 480 +482 3 432.6802 466.2921 41.8065 0.2669 481 +483 3 432.44 467.2233 43.2524 0.2415 482 +484 3 432.1391 468.3216 43.3936 0.178 483 +485 3 431.288 469.04 43.96 0.1525 484 +486 3 441.3232 433.1905 20.1667 0.2542 441 +487 3 442.2395 433.8597 20.3403 0.3051 486 +488 3 443.1822 434.4466 20.9404 0.3305 487 +489 3 444.1225 435.0689 20.8468 0.3432 488 +490 3 445.1224 435.5002 20.0567 0.3305 489 +491 3 446.0113 435.9864 18.7603 0.3051 490 +492 3 446.859 436.5355 18.7345 0.2796 491 +493 3 447.7158 437.2151 19.0733 0.2796 492 +494 3 448.6974 437.7665 19.1786 0.2924 493 +495 3 449.5222 438.5089 19.3158 0.2796 494 +496 3 450.442 438.557 20.4137 0.2415 495 +497 3 451.5082 438.311 21.1462 0.2034 496 +498 3 452.3605 438.8956 21.7308 0.2034 497 +499 3 453.0434 439.7936 21.3662 0.2034 498 +500 3 453.8408 440.5338 22.2113 0.2161 499 +501 3 454.5306 441.4399 22.3289 0.2161 500 +502 3 455.304 442.1537 21.4315 0.2288 501 +503 3 456.3794 442.3871 21.957 0.2288 502 +504 3 457.3929 442.5358 23.1087 0.2288 503 +505 3 458.1869 443.1696 23.6748 0.2542 504 +506 3 458.8424 444.0539 23.5735 0.2796 505 +507 3 459.8045 444.6019 24.1324 0.3051 506 +508 3 460.8787 444.9176 24.5162 0.2924 507 +509 3 461.9632 445.1304 24.019 0.2542 508 +510 3 463.0283 445.3066 23.1059 0.2161 509 +511 3 464.1219 445.4484 23.0653 0.1907 510 +512 3 465.1744 445.7596 23.2148 0.1907 511 +513 3 465.9077 446.5204 23.5253 0.178 512 +514 3 466.6113 447.3795 23.8479 0.1525 513 +515 3 467.6111 447.8646 23.7622 0.1398 514 +516 3 468.7117 448.1734 23.683 0.1525 515 +517 3 469.66 448.7626 23.4368 0.1907 516 +518 3 470.6256 449.2854 22.7704 0.2034 517 +519 3 471.6483 449.7613 22.4644 0.2034 518 +520 3 472.6997 450.204 22.6173 0.2034 519 +521 3 473.7544 450.6227 22.9592 0.2288 520 +522 3 474.8229 451.006 22.8547 0.2415 521 +523 3 475.9303 451.2702 22.64 0.2288 522 +524 3 476.9862 451.4979 23.3814 0.1907 523 +525 3 478.0913 451.6821 23.4783 0.1652 524 +526 3 478.764 452.452 24.36 0.1525 525 +527 3 427.2886 420.0013 17.3099 0.394 294 +528 3 428.3491 419.5895 17.4538 0.4068 527 +529 3 429.4565 419.3767 17.2584 0.4068 528 +530 3 430.4037 418.9717 17.9315 0.4068 529 +531 3 431.3704 418.4191 17.5484 0.3559 530 +532 3 432.4171 418.1228 17.8377 0.3051 531 +533 3 433.0372 417.5932 18.9356 0.2542 532 +534 3 433.9352 417.1722 17.841 0.2796 533 +535 3 434.6056 416.3954 18.3996 0.3051 534 +536 3 434.8962 415.4436 19.4362 0.3432 535 +537 3 434.2967 414.6417 20.0684 0.3305 536 +538 3 435.0026 414.0388 19.9548 0.3305 537 +539 3 436.0905 414.0868 19.8374 0.3686 538 +540 3 437.0732 414.5341 20.1942 0.4322 539 +541 3 438.1245 414.7721 20.6618 0.4576 540 +542 3 439.0466 414.938 21.8781 0.4068 541 +543 3 440.0533 415.248 22.1024 0.3305 542 +544 3 440.6665 415.0432 24.1704 0.2924 543 +545 3 441.7007 414.5913 24.3342 0.2924 544 +546 3 442.8264 414.6417 24.7117 0.3051 545 +547 3 443.9269 414.8739 24.9343 0.3051 546 +548 3 445.0618 414.7629 25.0275 0.3178 547 +549 3 446.1508 414.5421 24.9743 0.3432 548 +550 3 447.2354 414.3328 24.6036 0.3686 549 +551 3 448.3405 414.5593 24.4367 0.394 550 +552 3 449.2877 415.1816 24.5176 0.394 551 +553 3 450.291 415.6964 24.5574 0.4068 552 +554 3 451.2588 416.1048 25.0919 0.394 553 +555 3 452.0001 416.797 23.9562 0.3686 554 +556 3 452.873 417.3838 23.0236 0.3178 555 +557 3 453.9712 417.6515 22.7388 0.2796 556 +558 3 455.0283 417.584 23.6062 0.3051 557 +559 3 455.9309 418.2807 23.4024 0.3559 558 +560 3 456.8758 418.8985 23.3906 0.4068 559 +561 3 457.7499 419.5334 23.1232 0.4068 560 +562 3 458.4855 420.3468 22.3608 0.394 561 +563 3 459.2577 421.0549 22.9684 0.394 562 +564 3 460.222 421.3535 24.11 0.394 563 +565 3 461.334 421.3695 24.5809 0.3813 564 +566 3 462.4025 421.4622 23.8568 0.3432 565 +567 3 463.4047 421.9152 23.952 0.3178 566 +568 3 464.3851 422.1955 25.1952 0.2796 567 +569 3 464.9605 423.1713 25.412 0.2542 568 +570 3 465.703 423.9435 25.158 0.2288 569 +571 3 466.7303 423.7502 25.1826 0.2288 570 +572 3 467.7702 424.1369 25.6264 0.2288 571 +573 3 468.8284 424.4995 25.1902 0.2288 572 +574 3 469.8831 424.6642 25.0802 0.2415 573 +575 3 470.8635 424.8908 24.1368 0.2288 574 +576 3 471.3738 425.7476 25.2694 0.2288 575 +577 3 472.1174 425.7774 25.8978 0.2161 576 +578 3 473.1367 425.2934 25.4814 0.2288 577 +579 3 474.2383 425.1333 25.8182 0.2034 578 +580 3 475.3457 425.1573 25.7858 0.1907 579 +581 3 476.3925 425.3735 25.8454 0.2034 580 +582 3 477.3443 425.9753 26.0151 0.2542 581 +583 3 478.0261 426.7097 27.1309 0.2796 582 +584 3 479.0054 427.1879 27.4504 0.2542 583 +585 3 479.9641 427.0403 26.4505 0.2161 584 +586 3 480.9067 427.0644 26.7333 0.1907 585 +587 3 481.9889 426.9534 26.8579 0.2034 586 +588 3 483.0105 426.7784 25.6889 0.2161 587 +589 3 484.1099 426.4832 25.482 0.2161 588 +590 3 485.1921 426.6148 26.1064 0.2161 589 +591 3 486.1005 427.1124 27.27 0.2034 590 +592 3 486.9768 427.713 28.2114 0.2161 591 +593 3 487.9549 428.2289 28.0375 0.2034 592 +594 3 488.909 428.0207 28.2551 0.2161 593 +595 3 490.0049 427.9544 28.5113 0.2161 594 +596 3 491.03 428.4246 28.3074 0.2415 595 +597 3 492.0378 428.6957 29.3762 0.2415 596 +598 3 493.0537 429.1499 29.5904 0.2415 597 +599 3 494.0593 429.4542 30.2117 0.2161 598 +600 3 495.1335 429.3329 29.6738 0.2034 599 +601 3 496.1745 429.1258 29.6136 0.2034 600 +602 3 497.2682 429.119 30.333 0.2161 601 +603 3 498.2292 428.9462 31.3855 0.2542 602 +604 3 498.4774 427.9887 32.7664 0.2669 603 +605 3 498.7989 426.9854 32.975 0.2669 604 +606 3 499.3617 426.2384 33.4216 0.2288 605 +607 3 500.3856 426.14 32.76 0.2034 606 +608 3 409.576 406.4106 15.2239 0.3813 1 +609 3 408.5945 405.85 15.6554 0.483 608 +610 3 407.5408 405.4244 15.9838 0.5084 609 +611 3 406.5284 404.9154 15.6111 0.4703 610 +612 3 405.5629 404.3399 16.1291 0.4449 611 +613 3 404.5928 403.7348 16.2364 0.4449 612 +614 3 403.5906 403.1834 16.24 0.4449 613 +615 3 402.4478 403.1422 16.2403 0.394 614 +616 3 401.4193 403.6444 16.2414 0.3305 615 +617 3 400.5842 404.4257 16.245 0.3051 616 +618 3 399.7422 405.2002 16.2607 0.3305 617 +619 3 399.367 405.556 16.3604 0.2161 618 +620 3 398.8476 406.4243 17.099 0.1652 619 +621 3 398.7446 407.3818 18.6099 0.1398 620 +622 3 398.0559 407.979 19.626 0.1144 621 +623 3 397.0321 407.8932 20.6665 0.1144 622 +624 3 396.0917 407.812 22.2194 0.1144 623 +625 3 395.1193 407.359 22.9026 0.1144 624 +626 3 394.235 406.6428 23.0966 0.1144 625 +627 3 393.1539 406.5936 23.6499 0.1398 626 +628 3 392.4343 407.4047 24.2712 0.178 627 +629 3 392.4023 408.4629 25.2109 0.2161 628 +630 3 393.0578 409.3587 25.7667 0.2288 629 +631 3 393.5257 410.3997 25.8499 0.2669 630 +632 3 393.393 411.5014 26.4844 0.3305 631 +633 3 393.0189 412.4761 27.6315 0.4195 632 +634 3 392.8462 413.4519 29.0256 0.4322 633 +635 3 392.7432 414.5684 29.5529 0.394 634 +636 3 392.384 415.6427 29.3213 0.3178 635 +637 3 391.4894 416.2741 29.0363 0.2669 636 +638 3 390.3637 416.1895 29.4423 0.2924 637 +639 3 389.2952 416.138 30.2716 0.2924 638 +640 3 388.3628 416.5945 31.4154 0.3432 639 +641 3 387.4865 417.1665 32.4727 0.2924 640 +642 3 386.4546 417.592 33.0504 0.2924 641 +643 3 385.6115 418.251 33.469 0.2161 642 +644 3 385.2042 419.2989 33.9811 0.2288 643 +645 3 384.4961 419.9841 34.3353 0.2288 644 +646 3 383.4425 419.7897 34.8989 0.2924 645 +647 3 382.4198 419.3652 35.6017 0.3178 646 +648 3 381.3307 419.1524 36.1362 0.3559 647 +649 3 380.2027 419.2325 36.3675 0.3686 648 +650 3 379.0804 419.4487 36.4428 0.3432 649 +651 3 377.957 419.6478 36.6411 0.3051 650 +652 3 376.8908 419.5345 37.3674 0.2669 651 +653 3 375.9928 419.0666 38.5983 0.2669 652 +654 3 375.0787 418.5244 39.5914 0.2669 653 +655 3 374.0274 418.1972 40.2475 0.2669 654 +656 3 372.9291 417.981 40.8201 0.2924 655 +657 3 371.8847 417.5955 41.3899 0.2924 656 +658 3 370.8093 417.266 41.8452 0.3051 657 +659 3 369.7671 417.5451 42.2145 0.2924 658 +660 3 369.226 418.4763 42.5466 0.3305 659 +661 3 368.5957 419.3835 43.1525 0.3178 660 +662 3 368.0511 420.0734 44.8381 0.3305 661 +663 3 367.8257 420.69 47.0974 0.3305 662 +664 3 367.6152 421.556 48.7878 0.3813 663 +665 3 367.184 422.5387 49.6588 0.3686 664 +666 3 366.6291 423.5225 50.0685 0.3432 665 +667 3 366.0377 424.4492 50.8158 0.3051 666 +668 3 365.6567 425.4891 51.4326 0.2924 667 +669 3 365.2735 426.4958 52.3561 0.2669 668 +670 3 364.6534 427.3721 53.2714 0.2288 669 +671 3 363.9853 428.134 54.5538 0.2161 670 +672 3 363.2886 428.6991 56.2691 0.2034 671 +673 3 362.5851 429.4954 57.195 0.2161 672 +674 3 361.7648 430.0857 58.45 0.2034 673 +675 3 360.9423 430.756 59.4804 0.2161 674 +676 3 360.4641 431.7605 59.9995 0.2034 675 +677 3 359.955 432.5761 61.4709 0.2034 676 +678 3 358.9872 432.8896 62.72 0.1652 677 +679 3 399.208 405.1693 15.1729 0.3686 618 +680 3 398.366 404.698 13.6867 0.3813 679 +681 3 397.4508 404.0539 13.1463 0.394 680 +682 3 396.4852 403.4716 13.587 0.4195 681 +683 3 395.3858 403.2051 13.9765 0.4576 682 +684 3 394.2624 403.4019 14.0958 0.4957 683 +685 3 393.1322 403.5025 14.4547 0.5084 684 +686 3 392.0225 403.6146 15.0685 0.483 685 +687 3 390.954 404.007 15.3448 0.4195 686 +688 3 390.0159 404.6259 15.869 0.3813 687 +689 3 389.103 405.2963 16.2551 0.3686 688 +690 3 388.1443 405.9129 16.4914 0.3813 689 +691 3 387.1216 406.3717 17.0419 0.3813 690 +692 3 386.0188 406.6497 17.3426 0.3813 691 +693 3 384.8748 406.6291 17.3457 0.3686 692 +694 3 383.7456 406.4472 17.2712 0.3432 693 +695 3 382.6291 406.239 16.9361 0.2924 694 +696 3 381.5126 406.1783 16.3453 0.2669 695 +697 3 380.3937 405.9381 16.3184 0.2542 696 +698 3 379.403 405.3753 16.5628 0.2924 697 +699 3 378.3734 404.9154 17.0313 0.2924 698 +700 3 377.25 404.7449 17.3519 0.2924 699 +701 3 376.1278 404.523 17.3239 0.2415 700 +702 3 374.9929 404.9199 17.5249 0.2669 701 +703 3 373.9118 405.1991 18.123 0.3305 702 +704 3 372.7827 405.2975 18.4041 0.3686 703 +705 3 371.6398 405.2883 18.3369 0.3813 704 +706 3 370.5302 405.1236 17.836 0.394 705 +707 3 369.4319 404.8467 17.4611 0.394 706 +708 3 368.3703 404.4246 17.367 0.3686 707 +709 3 367.4162 403.7988 17.3606 0.3051 708 +710 3 366.3557 403.3824 17.3653 0.2415 709 +711 3 365.325 403.7977 17.3992 0.2161 710 +712 3 364.3754 404.4292 17.591 0.2034 711 +713 3 363.2875 404.7369 17.9687 0.2161 712 +714 3 362.1629 404.5767 17.7646 0.2034 713 +715 3 361.1494 404.0619 17.4952 0.2161 714 +716 3 360.0957 403.6432 17.8475 0.2034 715 +717 3 359.0227 403.5471 18.7821 0.2288 716 +718 3 357.905 403.7313 19.1559 0.2542 717 +719 3 356.8994 404.1855 18.433 0.2924 718 +720 3 355.8172 404.38 17.6593 0.2796 719 +721 3 354.6789 404.3811 17.3958 0.2542 720 +722 3 353.5418 404.2599 17.4079 0.2415 721 +723 3 352.5328 403.7245 17.5888 0.2796 722 +724 3 351.5981 403.1216 18.2414 0.3178 723 +725 3 350.7058 402.4123 18.461 0.3305 724 +726 3 349.7231 401.8266 18.4772 0.3178 725 +727 3 348.682 401.3518 18.4643 0.3051 726 +728 3 347.593 401.0052 18.3775 0.3178 727 +729 3 346.4993 400.7569 17.8147 0.3178 728 +730 3 345.3702 400.7009 17.3886 0.3051 729 +731 3 344.2536 400.4549 17.3345 0.2669 730 +732 3 343.1806 400.0637 17.1786 0.2542 731 +733 3 342.3523 399.3441 16.3825 0.2415 732 +734 3 341.5801 398.5021 16.242 0.2542 733 +735 3 340.5505 398.0033 16.24 0.2415 734 +736 3 339.4912 397.5732 16.2403 0.2669 735 +737 3 338.5359 396.9428 16.2408 0.2924 736 +738 3 337.7248 396.1363 16.2431 0.3432 737 +739 3 336.8771 394.7978 16.329 0.2669 738 +740 3 336.4367 393.7511 16.6387 0.2924 739 +741 3 335.9242 392.7466 17.0901 0.3051 740 +742 3 335.3419 391.7685 17.3471 0.2669 741 +743 3 334.7436 390.795 17.4815 0.2415 742 +744 3 334.326 389.7436 17.8139 0.2288 743 +745 3 334.2871 388.6248 18.2487 0.2542 744 +746 3 334.3271 387.4854 18.438 0.2542 745 +747 3 334.0434 386.3849 18.4033 0.2288 746 +748 3 333.4554 385.4159 18.1544 0.2034 747 +749 3 332.7839 384.5064 17.733 0.1907 748 +750 3 332.0826 383.6072 17.5101 0.178 749 +751 3 331.4214 382.6806 17.7206 0.1907 750 +752 3 330.7945 381.7288 17.9698 0.2288 751 +753 3 330.0509 380.8696 17.7192 0.3051 752 +754 3 329.1425 380.189 17.4381 0.3432 753 +755 3 328.1427 379.6353 17.3648 0.3178 754 +756 3 327.2183 378.9626 17.36 0.2415 755 +757 3 326.5342 378.052 17.36 0.1652 756 +758 3 326.016 377.0327 17.3589 0.1271 757 +759 3 325.4588 376.0339 17.3541 0.1398 758 +760 3 324.6626 375.2171 17.3278 0.178 759 +761 3 323.6902 374.6234 17.1699 0.2288 760 +762 3 322.6858 374.1029 16.7479 0.2415 761 +763 3 321.7042 373.5366 16.3685 0.2288 762 +764 3 320.7799 372.8651 16.2784 0.2034 763 +765 3 319.9242 372.1077 16.3951 0.2034 764 +766 3 319.0364 371.395 16.6676 0.2161 765 +767 3 318.0789 370.7944 17.0937 0.2415 766 +768 3 317.134 370.2178 17.7873 0.2415 767 +769 3 316.3606 369.3873 18.086 0.2669 768 +770 3 315.6605 368.4881 17.8794 0.2796 769 +771 3 314.9032 367.6416 17.533 0.3305 770 +772 3 314.06 366.8728 17.3799 0.3305 771 +773 3 313.1872 366.1326 17.3597 0.3305 772 +774 3 312.3429 365.3604 17.3541 0.2669 773 +775 3 311.6359 364.4624 17.323 0.2542 774 +776 3 310.8385 363.6456 17.1573 0.2161 775 +777 3 309.8387 363.2292 16.2884 0.2288 776 +778 3 308.7942 362.8516 15.6125 0.1907 777 +779 3 307.8996 362.179 16.1476 0.1907 778 +780 3 307.0107 361.5326 16.9168 0.178 779 +781 3 306.1939 360.9091 18.1496 0.1907 780 +782 3 305.4549 360.0465 18.4584 0.1907 781 +783 3 304.5202 359.3865 18.4741 0.1907 782 +784 3 303.4174 359.0844 18.443 0.2034 783 +785 3 302.2917 358.9014 18.244 0.2288 784 +786 3 301.2472 358.5994 17.3774 0.2542 785 +787 3 300.6306 357.7071 16.4881 0.2542 786 +788 3 300.1856 356.8136 15.12 0.2288 787 +789 3 336.5236 395.4545 15.8169 0.2161 738 +790 3 335.4677 395.6249 15.9572 0.2034 789 +791 3 334.429 395.9727 16.354 0.2288 790 +792 3 333.5561 396.6614 16.0087 0.2288 791 +793 3 332.7198 397.4245 15.6758 0.2161 792 +794 3 331.8206 398.0662 15.0637 0.178 793 +795 3 331.0805 398.8716 14.4516 0.178 794 +796 3 330.1378 399.4859 14.7476 0.1652 795 +797 3 329.2798 400.1437 15.3667 0.1907 796 +798 3 328.28 400.6597 15.0948 0.2034 797 +799 3 327.1771 400.948 15.2197 0.2542 798 +800 3 326.1121 401.2626 14.9369 0.2669 799 +801 3 325.166 401.735 14.8296 0.2669 800 +802 3 324.2371 402.2624 15.2429 0.2161 801 +803 3 323.3047 402.9179 15.1519 0.178 802 +804 3 322.4547 403.6593 15.398 0.1652 803 +805 3 321.4674 404.1077 15.5344 0.2161 804 +806 3 320.4058 404.4349 15.0167 0.2669 805 +807 3 319.3682 404.7666 15.3252 0.3178 806 +808 3 318.3397 405.2059 15.8337 0.3051 807 +809 3 317.4543 405.8729 15.416 0.3051 808 +810 3 316.5585 406.5719 15.2048 0.2924 809 +811 3 315.5015 406.9277 15.5529 0.3051 810 +812 3 314.433 407.2228 16.2375 0.2924 811 +813 3 313.4491 407.7662 16.6023 0.2796 812 +814 3 312.5751 408.4972 16.525 0.2669 813 +815 3 311.5318 408.932 16.5108 0.2542 814 +816 3 310.6052 409.4959 15.7114 0.2415 815 +817 3 309.7952 409.8952 14.0 0.2288 816 +818 3 375.8806 404.1523 15.6237 0.2415 701 +819 3 375.7788 403.1948 14.4864 0.2161 818 +820 3 375.7342 402.0519 14.436 0.1907 819 +821 3 375.558 400.9342 14.3072 0.2161 820 +822 3 374.9895 400.0248 14.6616 0.2796 821 +823 3 374.1292 399.3395 14.8022 0.3178 822 +824 3 373.1648 398.7687 14.8904 0.2924 823 +825 3 372.1409 398.3854 14.4376 0.2669 824 +826 3 371.2646 397.7699 13.6167 0.2542 825 +827 3 370.6263 396.8467 13.512 0.2669 826 +828 3 370.0176 395.9098 13.0158 0.2542 827 +829 3 369.2569 395.0712 12.8288 0.2288 828 +830 3 368.4961 394.3929 13.9574 0.2288 829 +831 3 367.8109 393.7213 12.8106 0.2542 830 +832 3 367.1691 392.8016 12.4958 0.3051 831 +833 3 366.6348 391.7925 12.3592 0.3178 832 +834 3 365.9645 390.8773 12.6658 0.3178 833 +835 3 365.0504 390.3328 13.6578 0.2924 834 +836 3 364.7289 389.8592 12.4785 0.178 835 +837 3 363.7085 389.5492 12.574 0.1907 836 +838 3 362.6709 389.087 12.4261 0.1907 837 +839 3 361.814 388.3697 12.899 0.2161 838 +840 3 361.0338 387.6032 13.5598 0.2415 839 +841 3 360.2673 387.0861 11.9347 0.2669 840 +842 3 359.2595 386.7486 11.1958 0.2415 841 +843 3 358.1612 386.5233 11.6124 0.2161 842 +844 3 357.1476 386.2316 12.1327 0.178 843 +845 3 356.1444 386.0977 12.7039 0.178 844 +846 3 355.0484 385.9192 12.0369 0.178 845 +847 3 354.1641 385.2798 11.6301 0.2161 846 +848 3 353.8872 384.2273 12.1526 0.2288 847 +849 3 353.5143 383.2766 13.3756 0.2542 848 +850 3 352.6231 382.6131 13.2958 0.2542 849 +851 3 351.7869 382.2973 11.6094 0.2924 850 +852 3 350.7104 381.9816 12.0772 0.3051 851 +853 3 349.5755 381.8695 12.3161 0.3051 852 +854 3 348.5654 381.4188 12.8344 0.2669 853 +855 3 348.3034 380.3308 12.5871 0.2288 854 +856 3 347.5975 379.6341 11.2823 0.2034 855 +857 3 346.6331 379.1765 10.5073 0.1907 856 +858 3 345.8186 378.4032 10.8609 0.2161 857 +859 3 344.8828 377.8129 11.5433 0.2288 858 +860 3 343.8681 377.3656 12.0226 0.2415 859 +861 3 342.7664 377.3244 12.6683 0.2034 860 +862 3 341.746 377.1104 12.794 0.1907 861 +863 3 340.9017 376.4698 11.9188 0.1652 862 +864 3 340.0769 375.915 10.5459 0.178 863 +865 3 339.1194 375.3967 10.9444 0.1652 864 +866 3 338.1126 375.1256 10.0523 0.1652 865 +867 3 337.4342 374.4712 9.6838 0.1525 866 +868 3 337.1974 373.7311 9.2943 0.1652 867 +869 3 336.3017 373.1339 10.0537 0.1907 868 +870 3 335.3956 372.4372 10.1556 0.2161 869 +871 3 334.5422 371.6867 10.3236 0.2288 870 +872 3 333.746 370.966 9.9005 0.2161 871 +873 3 332.9006 370.4158 10.1909 0.1907 872 +874 3 332.0403 369.8987 9.548 0.1525 873 +875 3 331.4465 369.0944 8.2648 0.1398 874 +876 3 330.8574 368.1323 8.6489 0.1652 875 +877 3 330.044 367.3384 8.96 0.2161 876 +878 3 365.2723 389.5126 12.3609 0.2288 835 +879 3 365.3089 388.3972 12.7406 0.2161 878 +880 3 365.3135 387.3161 13.4971 0.2161 879 +881 3 365.1945 386.2041 13.685 0.2288 880 +882 3 364.896 385.194 13.5094 0.2415 881 +883 3 364.6443 384.2147 12.4432 0.2669 882 +884 3 363.9339 383.4585 11.8628 0.2924 883 +885 3 363.0198 383.0707 12.2265 0.2796 884 +886 3 362.1252 382.7172 13.7298 0.2415 885 +887 3 361.0739 382.4975 14.5516 0.2034 886 +888 3 359.9859 382.2676 14.2708 0.2161 887 +889 3 359.2091 382.2539 15.6988 0.2415 888 +890 3 358.1143 382.3442 16.3769 0.2796 889 +891 3 356.9806 382.2424 16.13 0.2669 890 +892 3 355.8801 382.0651 15.5753 0.2542 891 +893 3 354.7441 382.0399 15.8438 0.2288 892 +894 3 353.6573 381.7379 15.9004 0.2542 893 +895 3 352.7821 381.0172 15.9564 0.2669 894 +896 3 351.9047 380.4349 17.0274 0.2796 895 +897 3 351.0112 380.0242 18.3036 0.2415 896 +898 3 349.8958 379.983 18.2804 0.2288 897 +899 3 349.0115 380.2176 18.3271 0.1907 898 +900 3 348.2542 380.4258 20.2182 0.2034 899 +901 3 347.1319 380.4715 19.9973 0.1907 900 +902 3 346.2808 379.7268 20.4064 0.2034 901 +903 3 345.4994 378.9614 21.1781 0.1652 902 +904 3 344.6929 378.1652 20.8482 0.1652 903 +905 3 343.8281 377.5006 20.3529 0.2034 904 +906 3 343.359 376.6105 19.1307 0.2669 905 +907 3 342.676 375.7491 19.1097 0.3051 906 +908 3 341.8501 375.0776 20.0525 0.2669 907 +909 3 340.8948 374.6497 20.244 0.2288 908 +910 3 339.8321 374.4049 20.5884 0.1652 909 +911 3 338.7167 374.2779 20.8376 0.1398 910 +912 3 337.6276 374.4609 20.3302 0.1271 911 +913 3 336.6243 374.6257 19.1103 0.1398 912 +914 3 335.7583 375.0043 17.5806 0.1525 913 +915 3 335.2767 375.3258 15.2032 0.1398 914 +916 3 334.7927 375.9401 13.1737 0.1398 915 +917 3 333.9336 376.6048 12.32 0.1525 916 +918 4 417.8826 404.2438 16.2112 0.1907 1 +919 4 418.6617 403.4156 16.5152 0.2669 918 +920 4 419.5494 402.7212 16.996 0.3178 919 +921 4 420.4177 401.9913 17.3516 0.3432 920 +922 4 421.2528 401.2145 17.5703 0.3813 921 +923 4 422.0719 400.4423 18.0701 0.4322 922 +924 4 422.8865 399.6518 18.4279 0.4957 923 +925 4 423.8211 398.994 18.471 0.4957 924 +926 4 424.7889 398.3843 18.4444 0.483 925 +927 4 425.6378 397.6189 18.3282 0.4576 926 +928 4 426.3265 396.7255 17.8595 0.4576 927 +929 4 426.9545 395.7862 17.4224 0.4703 928 +930 4 427.5883 394.839 17.183 0.4703 929 +931 4 428.1534 393.8735 16.6026 0.4703 930 +932 4 428.5149 392.8404 15.7884 0.4576 931 +933 4 428.8261 391.7605 15.258 0.483 932 +934 4 429.2094 390.684 15.122 0.5212 933 +935 4 429.7367 389.6693 15.1203 0.5466 934 +936 4 430.4392 388.7667 15.122 0.5212 935 +937 4 431.2194 387.9304 15.1276 0.483 936 +938 4 431.8794 386.9958 15.1556 0.4576 937 +939 4 432.4926 386.0314 15.3023 0.483 938 +940 4 432.8679 384.9938 16.0384 0.483 939 +941 4 433.187 383.9378 16.7815 0.4703 940 +942 4 433.465 382.8293 16.9322 0.3813 941 +943 4 433.2465 381.7917 15.8844 0.3051 942 +944 4 433.2202 380.6935 15.3969 0.2796 943 +945 4 433.4833 380.2885 15.9138 0.2161 944 +946 4 434.4214 379.665 16.3817 0.2288 945 +947 4 435.2359 378.9191 17.113 0.2542 946 +948 4 435.9956 378.0828 17.5501 0.2669 947 +949 4 436.5973 377.1505 18.2277 0.2669 948 +950 4 437.1201 376.1392 18.5153 0.2796 949 +951 4 437.1704 375.0089 18.9188 0.2924 950 +952 4 436.9611 373.913 19.5294 0.2924 951 +953 4 437.31 372.8239 19.5992 0.2669 952 +954 4 438.0799 371.9773 19.6 0.2542 953 +955 4 438.8716 371.1514 19.6003 0.2669 954 +956 4 439.5912 370.2625 19.6011 0.2924 955 +957 4 440.3393 369.3965 19.6056 0.3178 956 +958 4 441.3552 368.8714 19.6291 0.3051 957 +959 4 441.8231 368.9606 19.7282 0.2415 958 +960 4 442.9431 369.0658 20.1312 0.2415 959 +961 4 444.0528 368.9125 20.5503 0.2034 960 +962 4 445.1704 368.6918 20.706 0.178 961 +963 4 446.3007 368.7261 20.7203 0.1907 962 +964 4 447.4207 368.9526 20.722 0.2288 963 +965 4 448.5532 369.0704 20.734 0.2669 964 +966 4 449.6858 368.9583 20.8177 0.2924 965 +967 4 450.8081 368.7821 21.1067 0.2924 966 +968 4 451.9383 368.6414 21.336 0.2669 967 +969 4 453.0332 368.4469 20.8888 0.2415 968 +970 4 454.1062 368.2994 20.011 0.2288 969 +971 4 455.2193 368.2811 19.8976 0.2415 970 +972 4 456.2821 368.3463 20.8253 0.2669 971 +973 4 457.3655 368.3977 21.6591 0.3178 972 +974 4 458.4877 368.3257 22.1435 0.3559 973 +975 4 459.6134 368.2582 22.6036 0.3813 974 +976 4 460.7506 368.2136 22.7035 0.3559 975 +977 4 461.8797 368.0889 22.4378 0.3051 976 +978 4 463.0077 367.9184 22.3107 0.2542 977 +979 4 464.1425 367.9253 22.4608 0.2161 978 +980 4 465.2705 368.0751 22.7388 0.2161 979 +981 4 466.4065 368.1655 22.8004 0.1907 980 +982 4 467.5368 368.1083 22.4792 0.1907 981 +983 4 468.5927 367.7422 22.0679 0.178 982 +984 4 469.509 367.0776 21.9904 0.1907 983 +985 4 470.3579 366.3614 22.5686 0.1907 984 +986 4 471.1896 365.7688 23.7899 0.1907 985 +987 4 472.1425 365.3135 24.8046 0.1907 986 +988 4 473.1424 364.8124 25.3397 0.178 987 +989 4 474.0633 364.1489 25.3364 0.1525 988 +990 4 474.8161 363.2955 25.2274 0.1398 989 +991 4 475.499 362.3792 25.1012 0.1652 990 +992 4 476.0424 361.3839 24.8108 0.2034 991 +993 4 476.5675 360.3863 25.1084 0.2415 992 +994 4 477.2631 359.502 25.5441 0.2415 993 +995 4 477.7813 358.525 26.1691 0.2669 994 +996 4 478.2824 357.5194 26.6826 0.2542 995 +997 4 478.9848 356.7701 27.816 0.2415 996 +998 4 479.9 356.1249 28.0294 0.178 997 +999 4 480.6184 355.2578 28.3545 0.1525 998 +1000 4 481.4284 354.457 28.5085 0.1398 999 +1001 4 482.4637 354.0211 28.1747 0.178 1000 +1002 4 483.5688 354.2293 27.7522 0.1907 1001 +1003 4 484.5355 354.8093 28.1806 0.2161 1002 +1004 4 485.3992 355.5552 28.0 0.2034 1003 +1005 4 441.8322 368.3417 19.6039 0.2542 958 +1006 4 442.6365 367.5283 19.544 0.2542 1005 +1007 4 443.0826 366.5056 19.3245 0.2924 1006 +1008 4 443.1581 365.3753 19.1517 0.3178 1007 +1009 4 443.0769 364.2473 19.4793 0.3432 1008 +1010 4 443.0483 363.1102 19.7378 0.3432 1009 +1011 4 443.3984 362.0508 20.1359 0.3305 1010 +1012 4 444.0207 361.115 20.5783 0.3178 1011 +1013 4 444.8295 360.3154 20.7105 0.3051 1012 +1014 4 445.6646 359.5329 20.7248 0.3051 1013 +1015 4 446.3911 358.652 20.7438 0.3051 1014 +1016 4 446.9963 357.6842 20.8429 0.3051 1015 +1017 4 447.3944 356.6283 21.219 0.3051 1016 +1018 4 447.6415 355.5335 21.7412 0.3051 1017 +1019 4 447.7833 354.4123 22.1581 0.3051 1018 +1020 4 447.9607 353.3004 22.6436 0.3178 1019 +1021 4 448.3279 352.2273 22.923 0.3051 1020 +1022 4 448.9205 351.256 22.9928 0.2796 1021 +1023 4 449.7258 350.4518 23.1165 0.2161 1022 +1024 4 450.3997 349.5515 23.5231 0.178 1023 +1025 4 451.0884 348.6523 23.903 0.1525 1024 +1026 4 452.0058 347.9899 23.8246 0.178 1025 +1027 4 452.7906 347.2017 23.2515 0.2034 1026 +1028 4 453.159 346.1572 22.685 0.2288 1027 +1029 4 453.2288 345.0224 22.6797 0.2288 1028 +1030 4 453.1521 343.8853 22.9085 0.2288 1029 +1031 4 452.9874 342.7584 23.1518 0.2161 1030 +1032 4 452.9439 341.6293 23.5712 0.178 1031 +1033 4 453.151 340.5173 23.9464 0.1398 1032 +1034 4 453.4622 339.4179 24.0705 0.1398 1033 +1035 4 453.7722 338.3174 24.08 0.1652 1034 +1036 4 454.1119 337.2249 24.08 0.2034 1035 +1037 4 454.5295 336.1598 24.08 0.2161 1036 +1038 4 454.931 335.089 24.08 0.2542 1037 +1039 4 455.2228 333.9839 24.0806 0.2796 1038 +1040 4 455.5522 332.888 24.0828 0.2924 1039 +1041 4 456.0087 331.8401 24.1035 0.2542 1040 +1042 4 456.5395 330.8288 24.2483 0.2288 1041 +1043 4 457.068 329.8266 24.6336 0.2288 1042 +1044 4 457.6549 328.8611 25.0659 0.2669 1043 +1045 4 458.3116 327.9379 25.4556 0.2924 1044 +1046 4 458.9877 327.0364 25.9392 0.3051 1045 +1047 4 459.6764 326.1372 26.3222 0.3051 1046 +1048 4 460.3696 325.2426 26.7294 0.2924 1047 +1049 4 461.0228 324.3229 27.1984 0.2669 1048 +1050 4 461.4667 323.2727 27.358 0.2415 1049 +1051 4 461.7195 322.1676 27.0301 0.2415 1050 +1052 4 461.9255 321.0579 26.5815 0.2796 1051 +1053 4 462.1863 319.9459 26.6837 0.3178 1052 +1054 4 462.5844 318.9117 27.3666 0.3432 1053 +1055 4 463.034 317.8924 28.0092 0.3305 1054 +1056 4 463.4401 316.8239 27.9706 0.3305 1055 +1057 4 463.6987 315.7143 28.194 0.3305 1056 +1058 4 463.781 314.6389 29.1231 0.3686 1057 +1059 4 463.8405 313.5178 29.6447 0.4068 1058 +1060 4 464.0933 312.4035 29.7604 0.4449 1059 +1061 4 464.5406 311.359 30.0947 0.4576 1060 +1062 4 465.068 310.3638 30.5673 0.4576 1061 +1063 4 465.7144 309.4245 30.7661 0.483 1062 +1064 4 466.4649 308.5608 30.7104 0.4957 1063 +1065 4 467.2016 307.6948 30.42 0.5084 1064 +1066 4 467.8926 306.8002 29.9897 0.4957 1065 +1067 4 468.6087 305.9113 29.8724 0.5084 1066 +1068 4 469.2368 304.9744 30.2957 0.5084 1067 +1069 4 469.6017 303.9093 30.7555 0.4957 1068 +1070 4 469.6532 302.7813 31.1441 0.4576 1069 +1071 4 469.4598 301.6739 31.663 0.4449 1070 +1072 4 469.3123 300.5482 31.9911 0.4322 1071 +1073 4 469.3603 299.418 32.3327 0.4195 1072 +1074 4 469.7184 298.3575 32.695 0.394 1073 +1075 4 470.4803 297.5132 32.48 0.394 1074 +1076 4 471.3555 296.7936 32.1591 0.4195 1075 +1077 4 472.1986 296.0226 32.2675 0.4195 1076 +1078 4 472.9685 295.1817 32.3302 0.394 1077 +1079 4 473.5737 294.2208 32.233 0.3432 1078 +1080 4 473.9603 293.174 32.7496 0.3305 1079 +1081 4 474.0839 292.0804 33.5017 0.3305 1080 +1082 4 474.1983 290.9661 33.9948 0.3432 1081 +1083 4 474.5598 289.8885 34.1505 0.3432 1082 +1084 4 475.1455 288.908 34.1827 0.3432 1083 +1085 4 475.8354 287.9951 34.263 0.3432 1084 +1086 4 476.5023 287.0788 34.5394 0.3432 1085 +1087 4 477.0114 286.0744 35.0193 0.3432 1086 +1088 4 477.5045 285.0482 35.2526 0.3432 1087 +1089 4 478.0524 284.0438 35.3237 0.3305 1088 +1090 4 478.6244 283.0599 35.5208 0.2924 1089 +1091 4 479.1175 282.0635 36.1455 0.2542 1090 +1092 4 479.471 281.0339 36.9673 0.2542 1091 +1093 4 479.6998 279.9288 37.3386 0.3178 1092 +1094 4 480.0327 278.842 37.1398 0.3559 1093 +1095 4 480.4491 277.7975 36.6484 0.3432 1094 +1096 4 480.9673 276.7828 36.5 0.2669 1095 +1097 4 481.5702 275.8173 36.717 0.2542 1096 +1098 4 482.1983 274.8883 37.2655 0.2924 1097 +1099 4 482.8561 273.9788 37.7818 0.3813 1098 +1100 4 483.3995 273.0099 38.4014 0.4195 1099 +1101 4 483.801 271.9643 38.9617 0.4322 1100 +1102 4 484.3021 270.9758 39.5587 0.4068 1101 +1103 4 485.024 270.095 39.825 0.4068 1102 +1104 4 485.7367 269.2164 40.1181 0.394 1103 +1105 4 486.2835 268.2405 40.6526 0.394 1104 +1106 4 486.7548 267.2041 40.8607 0.3813 1105 +1107 4 487.3634 266.2374 40.9116 0.3559 1106 +1108 4 488.0533 265.3291 41.0572 0.3432 1107 +1109 4 488.8198 264.4997 41.4809 0.3178 1108 +1110 4 489.5988 263.6828 41.9115 0.3432 1109 +1111 4 490.3356 262.8123 41.9958 0.3432 1110 +1112 4 490.9545 261.8513 42.0022 0.3686 1111 +1113 4 491.4796 260.8377 42.0137 0.3686 1112 +1114 4 491.8628 259.7612 42.082 0.3686 1113 +1115 4 492.1808 258.6744 42.3987 0.3178 1114 +1116 4 492.4039 257.5899 43.0895 0.2669 1115 +1117 4 492.6636 256.5157 43.6268 0.2415 1116 +1118 4 493.3237 255.6176 43.8295 0.2542 1117 +1119 4 494.1977 254.9084 43.573 0.2542 1118 +1120 4 494.9585 254.0778 43.9765 0.2415 1119 +1121 4 495.5682 253.1169 44.2299 0.2669 1120 +1122 4 496.1288 252.1204 44.24 0.3305 1121 +1123 4 496.6276 251.0931 44.24 0.394 1122 +1124 4 497.1801 250.0944 44.2408 0.4068 1123 +1125 4 497.6652 249.0591 44.2439 0.3813 1124 +1126 4 498.2566 248.081 44.2593 0.3686 1125 +1127 4 498.8378 247.1029 44.3408 0.3559 1126 +1128 4 499.2736 246.0572 44.6631 0.3432 1127 +1129 4 499.7495 245.0448 45.2012 0.2796 1128 +1130 4 500.1854 243.99 45.3611 0.2161 1129 +1131 4 500.6647 242.9513 45.3718 0.1525 1130 +1132 4 501.0628 241.8816 45.4443 0.1398 1131 +1133 4 501.4324 240.82 45.7716 0.1652 1132 +1134 4 502.0318 239.8808 46.3943 0.2161 1133 +1135 4 502.7194 238.9896 46.8552 0.2542 1134 +1136 4 503.5133 238.1888 47.2749 0.2415 1135 +1137 4 504.3713 237.4383 47.2114 0.2288 1136 +1138 4 505.211 236.6833 46.9571 0.2288 1137 +1139 4 505.8802 235.7773 47.2982 0.2542 1138 +1140 4 506.2589 234.7477 47.948 0.2415 1139 +1141 4 506.2932 233.6277 48.4722 0.1907 1140 +1142 4 506.3653 232.526 48.743 0.1652 1141 +1143 4 506.8881 231.5113 48.8684 0.178 1142 +1144 4 507.4795 230.5446 49.2282 0.2415 1143 +1145 4 508.0607 229.5756 49.6283 0.2542 1144 +1146 4 508.6224 228.5804 49.6605 0.2542 1145 +1147 4 509.1818 227.5851 49.5485 0.2161 1146 +1148 4 509.7286 226.5818 49.672 0.2034 1147 +1149 4 510.2286 225.5602 49.9223 0.1907 1148 +1150 4 510.5729 224.4814 50.2026 0.2034 1149 +1151 4 510.8864 223.4095 50.673 0.2288 1150 +1152 4 511.495 222.4565 50.9477 0.2669 1151 +1153 4 512.2638 221.6111 50.9793 0.2924 1152 +1154 4 513.0634 220.7931 51.0577 0.2924 1153 +1155 4 513.8631 219.9855 51.3369 0.2542 1154 +1156 4 514.6295 219.1584 51.7818 0.1907 1155 +1157 4 515.348 218.2752 52.015 0.178 1156 +1158 4 516.0595 217.3829 51.9126 0.2034 1157 +1159 4 516.6979 216.4482 51.5704 0.3051 1158 +1160 4 517.2093 215.4381 51.2333 0.3686 1159 +1161 4 517.7 214.4096 51.3204 0.4576 1160 +1162 4 518.2034 213.4029 51.8064 0.4703 1161 +1163 4 518.7308 212.4214 52.4367 0.4957 1162 +1164 4 519.3337 211.4913 53.1143 0.483 1163 +1165 4 520.0281 210.6207 53.7541 0.483 1164 +1166 4 520.7305 209.7387 54.1464 0.4449 1165 +1167 4 521.3185 208.7651 54.122 0.3559 1166 +1168 4 521.7773 207.7264 53.7816 0.3051 1167 +1169 4 522.2852 206.7185 53.5161 0.2796 1168 +1170 4 522.9659 205.809 53.7121 0.3432 1169 +1171 4 523.7243 204.967 54.0977 0.3686 1170 +1172 4 524.4782 204.1113 54.2895 0.4195 1171 +1173 4 525.2173 203.2385 54.322 0.4322 1172 +1174 4 525.9918 202.3988 54.3284 0.4576 1173 +1175 4 526.7914 201.5808 54.3528 0.4322 1174 +1176 4 527.5762 200.7503 54.467 0.3813 1175 +1177 4 528.3141 199.8877 54.7912 0.3178 1176 +1178 4 529.0234 199.0148 55.2992 0.2669 1177 +1179 4 529.7647 198.1648 55.7519 0.2415 1178 +1180 4 530.5071 197.3091 55.7522 0.2542 1179 +1181 4 531.1272 196.3745 55.2608 0.3051 1180 +1182 4 531.6271 195.3643 55.1004 0.3686 1181 +1183 4 532.1476 194.3748 55.6396 0.394 1182 +1184 4 532.7905 193.471 56.2724 0.3686 1183 +1185 4 533.5971 192.6851 56.6656 0.3305 1184 +1186 4 534.5157 192.025 57.0497 0.3051 1185 +1187 4 535.3966 191.3248 57.4538 0.3559 1186 +1188 4 536.1013 190.4394 57.6503 0.4195 1187 +1189 4 536.6241 189.4247 57.6764 0.483 1188 +1190 4 537.0542 188.3653 57.664 0.4322 1189 +1191 4 537.442 187.29 57.575 0.3432 1190 +1192 4 537.7361 186.1952 57.265 0.2415 1191 +1193 4 538.0827 185.1267 56.8378 0.2288 1192 +1194 4 538.6124 184.1211 56.6625 0.2415 1193 +1195 4 539.1935 183.1521 56.9904 0.2669 1194 +1196 4 539.6957 182.2243 57.9933 0.2415 1195 +1197 4 540.0721 181.2393 59.0075 0.2415 1196 +1198 4 540.5732 180.2452 59.5022 0.2288 1197 +1199 4 541.3877 179.4902 59.9348 0.2542 1198 +1200 4 542.2331 178.734 60.121 0.2415 1199 +1201 4 542.7422 177.7387 60.305 0.2669 1200 +1202 4 543.1655 176.6919 60.7309 0.3178 1201 +1203 4 543.7512 175.7218 61.0112 0.3813 1202 +1204 4 544.4376 174.8089 61.1341 0.4322 1203 +1205 4 545.1332 173.9086 61.4228 0.4068 1204 +1206 4 545.7612 172.9705 61.8517 0.3813 1205 +1207 4 546.4179 172.0404 62.0718 0.3305 1206 +1208 4 547.1878 171.1996 61.9791 0.3432 1207 +1209 4 548.0263 170.4423 61.5717 0.3559 1208 +1210 4 548.786 169.6037 61.1999 0.394 1209 +1211 4 549.3934 168.6416 61.2209 0.394 1210 +1212 4 549.9734 167.6749 61.6641 0.3813 1211 +1213 4 550.6164 166.746 62.0886 0.3178 1212 +1214 4 551.3302 165.8583 62.3258 0.2415 1213 +1215 4 552.1619 165.0964 62.7326 0.1907 1214 +1216 4 553.0474 164.3882 63.1151 0.178 1215 +1217 4 553.7097 163.4707 63.1481 0.2161 1216 +1218 4 554.2074 162.4503 62.8586 0.2161 1217 +1219 4 555.0688 161.7364 63.0011 0.2288 1218 +1220 4 556.1785 161.5191 63.2559 0.2288 1219 +1221 4 557.1555 160.9402 63.3847 0.2796 1220 +1222 4 557.9437 160.1268 63.7448 0.3051 1221 +1223 4 558.7079 159.3077 64.3082 0.2796 1222 +1224 4 559.5087 158.5184 64.832 0.2161 1223 +1225 4 560.3964 157.8285 65.3447 0.1907 1224 +1226 4 560.886 156.8046 65.2392 0.2288 1225 +1227 4 561.9191 156.323 65.4396 0.2669 1226 +1228 4 562.8388 155.6652 65.0538 0.2669 1227 +1229 4 563.8902 155.2202 65.2123 0.2161 1228 +1230 4 564.8145 154.6036 65.5908 0.2034 1229 +1231 4 565.3831 153.6712 66.3491 0.1907 1230 +1232 4 566.2297 152.9208 66.5487 0.2161 1231 +1233 4 567.2627 152.4437 66.6935 0.1907 1232 +1234 4 568.3484 152.1497 67.1779 0.1907 1233 +1235 4 569.4271 151.8946 67.664 0.1652 1234 +1236 4 570.2726 151.2093 68.3402 0.1652 1235 +1237 4 570.856 150.2804 69.1054 0.1398 1236 +1238 4 571.571 149.4258 69.7385 0.1271 1237 +1239 4 572.2334 148.5278 70.3492 0.1144 1238 +1240 4 572.9152 147.6412 70.7935 0.1144 1239 +1241 4 573.7412 146.853 70.8347 0.1144 1240 +1242 4 574.3509 145.9103 70.784 0.1144 1241 +1243 4 574.693 144.8201 70.6577 0.1144 1242 +1244 4 575.2204 143.8305 70.56 0.1144 1243 +1245 4 576.0509 143.0561 70.7482 0.1144 1244 +1246 4 576.9455 142.5424 71.6853 0.1144 1245 +1247 4 577.9351 142.1786 72.4679 0.1271 1246 +1248 4 578.8171 141.4991 72.6986 0.1525 1247 +1249 4 579.5069 140.5953 72.9848 0.178 1248 +1250 4 580.3501 139.9638 73.619 0.178 1249 +1251 4 581.3019 139.4193 74.2899 0.1525 1250 +1252 4 582.1633 138.6814 74.5898 0.1398 1251 +1253 4 583.0831 138.0328 74.9073 0.1398 1252 +1254 4 584.0681 137.4619 75.1097 0.1525 1253 +1255 4 585.1114 137.018 75.2102 0.1525 1254 +1256 4 586.181 136.6302 75.4656 0.1525 1255 +1257 4 587.1763 136.1509 76.1211 0.1525 1256 +1258 4 588.1842 135.7345 76.9266 0.1398 1257 +1259 4 589.2481 135.3489 77.2178 0.1271 1258 +1260 4 590.0912 134.6625 77.9108 0.1144 1259 +1261 4 590.7627 133.7485 78.1071 0.1144 1260 +1262 4 591.694 133.1044 78.12 0.1144 1261 +1263 4 592.203 132.1023 78.12 0.1144 1262 +1264 4 592.2545 130.9628 78.12 0.1144 1263 +1265 4 593.1285 130.2524 78.12 0.1398 1264 +1266 4 594.0792 129.6152 78.12 0.1907 1265 +1267 4 432.7855 379.5861 15.1883 0.3813 944 +1268 4 432.3794 378.5187 15.2043 0.3305 1267 +1269 4 431.9538 377.4639 15.4969 0.2924 1268 +1270 4 431.5832 376.4035 16.0068 0.2669 1269 +1271 4 431.2125 375.327 16.1736 0.2669 1270 +1272 4 430.859 374.2436 15.9807 0.2669 1271 +1273 4 430.4392 373.2003 15.5008 0.2415 1272 +1274 4 429.7344 372.3274 15.1698 0.2288 1273 +1275 4 428.7804 371.7188 15.0592 0.2161 1274 +1276 4 427.6821 371.4431 14.9531 0.2288 1275 +1277 4 426.5759 371.1639 15.073 0.2034 1276 +1278 4 425.743 370.5061 15.8942 0.1907 1277 +1279 4 424.9971 369.6619 16.2106 0.2034 1278 +1280 4 424.2787 368.7718 16.24 0.2796 1279 +1281 4 423.5534 367.8864 16.2397 0.3432 1280 +1282 4 422.7641 367.0593 16.238 0.3813 1281 +1283 4 421.9484 366.2573 16.2327 0.3686 1282 +1284 4 421.1053 365.484 16.2064 0.3432 1283 +1285 4 420.1649 364.8399 16.0611 0.3051 1284 +1286 4 419.1216 364.4349 15.573 0.2669 1285 +1287 4 418.2109 363.8469 14.747 0.2669 1286 +1288 4 417.6 362.9271 14.1554 0.2796 1287 +1289 4 416.9743 361.9742 14.0112 0.3051 1288 +1290 4 416.3325 361.027 14.0 0.2924 1289 +1291 4 415.542 360.2056 14.0 0.2924 1290 +1292 4 414.5925 359.5729 14.0 0.3178 1291 +1293 4 413.7116 358.8465 14.0 0.3559 1292 +1294 4 412.9474 357.9965 14.0008 0.3559 1293 +1295 4 412.2884 357.063 14.0042 0.2924 1294 +1296 4 411.7634 356.0483 14.0263 0.2161 1295 +1297 4 411.3275 354.9924 14.1529 0.1907 1296 +1298 4 410.7624 354.0097 14.4917 0.2161 1297 +1299 4 410.0782 353.0967 14.6748 0.2542 1298 +1300 4 409.4731 352.1404 14.3363 0.2542 1299 +1301 4 408.9571 351.1256 14.065 0.2415 1300 +1302 4 408.567 350.0526 14.0045 0.2161 1301 +1303 4 408.2192 348.9623 14.0022 0.1907 1302 +1304 4 408.0145 347.8378 14.0148 0.1525 1303 +1305 4 408.0991 346.7018 14.0997 0.1271 1304 +1306 4 408.3474 345.5864 14.2066 0.1144 1305 +1307 4 408.6528 344.4847 14.11 0.1144 1306 +1308 4 409.1836 343.4746 14.1131 0.1398 1307 +1309 4 409.3781 342.3637 14.2369 0.178 1308 +1310 4 408.8061 341.3788 13.9762 0.2288 1309 +1311 4 408.2055 340.4292 13.4532 0.2415 1310 +1312 4 407.6324 339.4408 13.2989 0.2542 1311 +1313 4 407.0444 338.4604 13.2255 0.2415 1312 +1314 4 406.4037 337.5223 12.9178 0.2542 1313 +1315 4 405.715 336.6083 12.8803 0.2542 1314 +1316 4 405.0366 335.6874 12.8822 0.2796 1315 +1317 4 404.3662 334.7607 12.8909 0.2796 1316 +1318 4 403.713 333.8226 12.9338 0.2669 1317 +1319 4 402.982 332.9463 13.1244 0.2288 1318 +1320 4 402.1915 332.141 13.5626 0.2034 1319 +1321 4 401.584 331.1869 13.7536 0.1907 1320 +1322 4 401.3381 330.0818 13.3683 0.2034 1321 +1323 4 401.155 328.9629 13.0029 0.2034 1322 +1324 4 400.9194 327.8441 12.9514 0.2034 1323 +1325 4 400.6322 326.7424 13.1916 0.1907 1324 +1326 4 400.2227 325.6934 13.6335 0.1907 1325 +1327 4 399.5843 324.7587 13.9412 0.178 1326 +1328 4 398.7275 324.0025 13.9969 0.1652 1327 +1329 4 397.794 323.3436 13.9838 0.178 1328 +1330 4 396.7987 322.7807 13.9121 0.2161 1329 +1331 4 395.7531 322.3403 13.627 0.2415 1330 +1332 4 394.7246 321.9399 13.1566 0.2288 1331 +1333 4 393.965 321.1231 13.4946 0.2415 1332 +1334 4 393.4388 320.1084 13.5055 0.2924 1333 +1335 4 392.8668 319.1371 13.1827 0.3559 1334 +1336 4 392.2513 318.2082 12.773 0.3432 1335 +1337 4 391.7125 317.2049 13.0141 0.2924 1336 +1338 4 391.2102 316.1959 13.1648 0.2288 1337 +1339 4 390.7675 315.1846 13.3658 0.2034 1338 +1340 4 390.2104 314.2396 14.1053 0.178 1339 +1341 4 389.7471 313.2066 14.2864 0.178 1340 +1342 4 389.4233 312.1656 13.65 0.1907 1341 +1343 4 389.2666 311.128 12.5566 0.2288 1342 +1344 4 389.0801 310.056 11.7642 0.2542 1343 +1345 4 388.8731 308.9566 11.2566 0.2415 1344 +1346 4 388.4784 307.9408 10.9614 0.2288 1345 +1347 4 387.7439 307.0656 10.8175 0.2288 1346 +1348 4 387.4122 306.0337 10.2435 0.2796 1347 +1349 4 386.6949 305.2329 10.4885 0.3305 1348 +1350 4 386.06 304.3074 10.2015 0.3559 1349 +1351 4 385.5497 303.3362 9.4259 0.3559 1350 +1352 4 385.1962 302.302 8.6097 0.3178 1351 +1353 4 384.8004 301.293 9.3607 0.2924 1352 +1354 4 384.1255 300.451 10.2819 0.2669 1353 +1355 4 383.24 299.728 10.36 0.2542 1354 +1356 4 433.4948 381.6235 18.1658 0.2924 943 +1357 4 434.1228 381.4668 20.2387 0.2034 1356 +1358 4 435.1067 381.4634 21.6325 0.1652 1357 +1359 4 436.1672 381.659 22.4507 0.178 1358 +1360 4 436.6911 382.4678 22.3471 0.2288 1359 +1361 4 436.7083 383.5981 22.1788 0.2542 1360 +1362 4 436.6362 384.7203 22.5845 0.2542 1361 +1363 4 436.6419 385.8449 23.0667 0.2415 1362 +1364 4 436.6934 386.9774 22.9566 0.2034 1363 +1365 4 437.0206 388.0288 22.3874 0.2034 1364 +1366 4 437.4542 389.0767 22.2429 0.2034 1365 +1367 4 438.0296 390.0422 21.9145 0.2542 1366 +1368 4 438.605 391.0181 22.008 0.2669 1367 +1369 4 439.2159 391.9813 22.1278 0.2924 1368 +1370 4 440.1883 392.495 22.0937 0.2669 1369 +1371 4 441.2946 392.7821 22.1236 0.2669 1370 +1372 4 442.2052 393.4319 22.2919 0.2542 1371 +1373 4 442.6628 394.4501 22.0623 0.2924 1372 +1374 4 442.8676 395.5712 21.9512 0.3178 1373 +1375 4 443.0678 396.6957 21.7955 0.3432 1374 +1376 4 443.578 397.6979 22.1746 0.3178 1375 +1377 4 444.1752 398.4712 20.8544 0.2924 1376 +1378 4 444.8215 399.4093 20.6668 0.2796 1377 +1379 4 445.5239 400.2353 21.56 0.3305 1378 +1380 4 446.2469 400.7832 21.866 0.2415 1379 +1381 4 447.2445 401.0967 22.9942 0.2542 1380 +1382 4 448.3073 401.4468 22.468 0.2415 1381 +1383 4 449.3438 401.8712 22.9359 0.2034 1382 +1384 4 450.45 401.8735 23.4702 0.1652 1383 +1385 4 451.4704 401.798 22.7223 0.1525 1384 +1386 4 452.3536 401.2237 22.8262 0.178 1385 +1387 4 453.3615 401.1001 23.6088 0.2034 1386 +1388 4 454.3076 401.5692 24.2589 0.2415 1387 +1389 4 455.1564 402.2487 25.0524 0.2669 1388 +1390 4 456.0762 402.8825 24.876 0.3051 1389 +1391 4 457.0074 403.4728 24.1343 0.3432 1390 +1392 4 457.8631 404.1638 23.4262 0.3432 1391 +1393 4 458.8138 404.6854 23.5626 0.3305 1392 +1394 4 459.6478 405.1979 24.885 0.2924 1393 +1395 4 460.4909 405.6372 26.4256 0.2669 1394 +1396 4 461.31 406.3351 27.1762 0.2161 1395 +1397 4 462.0994 407.0741 28.0036 0.1652 1396 +1398 4 462.7903 407.8131 27.83 0.1398 1397 +1399 4 462.7194 408.9388 27.9446 0.1398 1398 +1400 4 462.6725 410.0451 27.6965 0.1652 1399 +1401 4 462.7091 411.1399 28.5046 0.178 1400 +1402 4 462.8578 412.2129 29.0987 0.2034 1401 +1403 4 463.1896 413.1853 29.6456 0.2161 1402 +1404 4 463.2296 413.9427 31.7198 0.2161 1403 +1405 4 463.5328 414.7023 31.9715 0.2161 1404 +1406 4 463.8234 415.4711 33.2511 0.2288 1405 +1407 4 463.892 414.8647 35.1758 0.2669 1406 +1408 4 464.3496 414.684 37.4198 0.2796 1407 +1409 4 464.496 415.7216 38.4462 0.2796 1408 +1410 4 465.274 416.4412 39.0706 0.2542 1409 +1411 4 466.3505 416.8187 38.8654 0.2288 1410 +1412 4 467.276 417.3861 38.7335 0.178 1411 +1413 4 468.0504 417.8712 39.6371 0.1652 1412 +1414 4 469.1235 417.7362 40.3908 0.1652 1413 +1415 4 470.0845 417.9467 41.4809 0.2161 1414 +1416 4 471.0031 418.3608 42.7941 0.2542 1415 +1417 4 472.067 418.6846 43.1575 0.3178 1416 +1418 4 473.1492 419.0495 43.0648 0.3305 1417 +1419 4 474.2521 419.3046 43.3112 0.3051 1418 +1420 4 475.3331 419.0644 43.7108 0.2288 1419 +1421 4 476.3216 418.5232 44.1465 0.1907 1420 +1422 4 477.3409 418.8584 44.2198 0.1907 1421 +1423 4 478.4677 418.9431 44.093 0.2288 1422 +1424 4 479.5648 419.038 44.7714 0.2796 1423 +1425 4 480.6116 419.387 45.4728 0.3178 1424 +1426 4 481.6274 419.9063 45.5703 0.3686 1425 +1427 4 482.7497 420.102 45.7131 0.3813 1426 +1428 4 483.7976 420.5344 45.36 0.3686 1427 +1429 4 445.461 401.679 21.9845 0.2924 1379 +1430 4 445.1659 402.7727 21.7115 0.2924 1429 +1431 4 445.1945 403.8549 21.4799 0.3051 1430 +1432 4 445.771 404.8067 21.3013 0.3051 1431 +1433 4 446.2687 405.7619 21.8425 0.2924 1432 +1434 4 446.3808 406.851 21.9724 0.2924 1433 +1435 4 446.2904 407.979 21.6037 0.2669 1434 +1436 4 445.9415 409.0509 21.4144 0.2542 1435 +1437 4 445.5422 410.0588 22.0562 0.2542 1436 +1438 4 445.0618 411.0598 22.4006 0.3051 1437 +1439 4 444.833 412.1512 22.5826 0.3686 1438 +1440 4 444.9577 413.2792 22.7581 0.3686 1439 +1441 4 444.9039 414.4094 22.9611 0.3178 1440 +1442 4 444.8009 415.5466 22.9653 0.2415 1441 +1443 4 444.6534 416.6711 23.2529 0.2288 1442 +1444 4 444.7128 417.7991 23.1344 0.2669 1443 +1445 4 445.191 418.815 22.8724 0.3051 1444 +1446 4 445.6635 419.8263 23.3646 0.3051 1445 +1447 4 446.0021 420.8948 23.0208 0.2669 1446 +1448 4 446.3842 421.9129 22.1598 0.2542 1447 +1449 4 446.8464 422.9162 22.7094 0.2415 1448 +1450 4 447.2182 423.9858 22.678 0.2415 1449 +1451 4 447.2743 425.1173 22.5464 0.2288 1450 +1452 4 447.3784 426.2132 23.0896 0.2161 1451 +1453 4 447.0329 427.284 23.5656 0.2034 1452 +1454 4 446.6851 428.3308 24.3158 0.1907 1453 +1455 4 446.3842 429.3981 24.9298 0.2034 1454 +1456 4 446.2687 430.5009 24.7372 0.2034 1455 +1457 4 446.4254 431.5568 23.8924 0.1907 1456 +1458 4 446.764 432.6459 23.868 0.178 1457 +1459 4 446.9414 433.7453 24.3768 0.178 1458 +1460 4 446.8853 434.8561 24.2586 0.2161 1459 +1461 4 446.9528 435.9075 25.2084 0.2415 1460 +1462 4 446.8544 436.9714 26.1985 0.2796 1461 +1463 4 446.6153 438.0673 26.7252 0.2924 1462 +1464 4 446.6268 439.1736 26.0543 0.3178 1463 +1465 4 446.6965 440.3016 25.655 0.3305 1464 +1466 4 446.7228 441.3987 26.4359 0.3178 1465 +1467 4 446.6794 442.5404 26.4902 0.2669 1466 +1468 4 446.5535 443.6512 26.9503 0.2288 1467 +1469 4 446.5867 444.7025 27.4691 0.2161 1468 +1470 4 446.7526 445.7745 26.7058 0.2415 1469 +1471 4 446.8327 446.883 26.2136 0.2415 1470 +1472 4 446.9642 447.9526 25.7807 0.2669 1471 +1473 4 447.042 449.0566 26.4443 0.2669 1472 +1474 4 446.8727 450.1182 27.3179 0.2924 1473 +1475 4 446.7778 451.1844 28.2324 0.2669 1474 +1476 4 446.5879 452.2529 27.8597 0.2796 1475 +1477 4 446.6782 453.3615 27.8678 0.2796 1476 +1478 4 447.288 454.2664 27.3767 0.3051 1477 +1479 4 447.7994 455.2468 27.7934 0.2924 1478 +1480 4 447.9675 456.3485 27.4842 0.2796 1479 +1481 4 447.9732 457.3529 26.3096 0.2796 1480 +1482 4 448.3107 458.4225 26.8122 0.2924 1481 +1483 4 448.734 459.4773 26.8652 0.3051 1482 +1484 4 448.9731 460.5858 26.6375 0.3051 1483 +1485 4 449.2271 461.6406 25.8059 0.2796 1484 +1486 4 449.3964 462.6771 25.9274 0.2288 1485 +1487 4 449.7682 463.7032 26.2332 0.1652 1486 +1488 4 450.005 464.798 25.9854 0.1525 1487 +1489 4 450.0976 465.91 26.3864 0.1907 1488 +1490 4 450.1194 467.0002 25.9826 0.2415 1489 +1491 4 450.1869 468.1282 25.6676 0.2542 1490 +1492 4 450.291 468.6716 23.4268 0.2415 1491 +1493 2 414.4174 413.7882 15.3527 0.1907 1 +1494 2 414.3522 414.9185 15.0766 0.2669 1493 +1495 2 414.287 416.0213 14.3632 0.3305 1494 +1496 2 414.1326 417.1093 13.5979 0.3813 1495 +1497 2 413.9564 418.1938 12.8352 0.4068 1496 +1498 2 413.9335 419.2989 12.136 0.4068 1497 +1499 2 414.0605 420.412 11.6236 0.3559 1498 +1500 2 414.3236 421.4896 11.0018 0.3051 1499 +1501 2 414.2561 422.4826 10.0867 0.2796 1500 +1502 2 413.4931 423.2537 9.6502 0.2924 1501 +1503 2 412.5207 423.8463 9.8403 0.3051 1502 +1504 2 411.7462 424.6322 9.9644 0.2796 1503 +1505 2 411.3744 425.5829 9.0264 0.2669 1504 +1506 2 411.0152 426.5496 8.2065 0.2288 1505 +1507 2 410.6914 427.6249 8.4067 0.2288 1506 +1508 2 410.4683 428.7243 8.9289 0.2034 1507 +1509 2 410.2933 429.8111 9.6664 0.2161 1508 +1510 2 410.0622 430.899 9.6303 0.2034 1509 +1511 2 409.8243 432.011 9.4004 0.2288 1510 +1512 2 409.0624 432.6619 9.9117 0.2415 1511 +1513 2 409.0944 433.576 10.92 0.2796 1512 +1514 3 420.0002 408.7546 10.0285 0.3051 1 +1515 3 421.0904 408.6276 9.3506 0.3686 1514 +1516 3 422.1371 408.2124 9.3579 0.4195 1515 +1517 3 423.0867 407.5866 9.5656 0.394 1516 +1518 3 424.0556 406.9952 9.8697 0.3432 1517 +1519 3 425.1138 406.5833 9.9075 0.2796 1518 +1520 3 426.2075 406.2676 9.6527 0.2161 1519 +1521 3 427.332 406.2401 9.4366 0.178 1520 +1522 3 428.4509 406.4277 9.1146 0.1652 1521 +1523 3 429.3329 406.6771 10.3457 0.178 1522 +1524 3 430.0079 407.1073 12.3208 0.178 1523 +1525 3 430.9288 407.169 13.7455 0.178 1524 +1526 3 431.765 406.4987 13.9502 0.1907 1525 +1527 3 432.4629 405.6029 13.6391 0.2415 1526 +1528 3 433.3735 404.9245 13.7175 0.2669 1527 +1529 3 434.1926 404.1558 14.2106 0.2669 1528 +1530 3 435.0655 403.4911 14.9923 0.2161 1529 +1531 3 435.864 403.3744 13.16 0.1652 1530 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb-IRES-Cre_Ai14-169125.03.01.01_491119617_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb-IRES-Cre_Ai14-169125.03.01.01_491119617_m.swc new file mode 100755 index 0000000..67f4709 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb-IRES-Cre_Ai14-169125.03.01.01_491119617_m.swc @@ -0,0 +1,1239 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/Users/alexh/Desktop/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_p.swc_Z_T10.swc_pruned.swc +# id,type,x,y,z,r,pid +1 1 312.0832 372.8296 27.44 5.1972 -1 +2 3 310.5926 376.7913 27.4061 0.2161 1 +3 3 310.5274 377.8643 27.154 0.2796 2 +4 3 310.6829 378.9637 27.0068 0.2924 3 +5 3 310.6372 380.0368 26.7489 0.2542 4 +6 3 310.1784 380.9817 26.6762 0.2161 5 +7 3 309.7906 381.945 26.7835 0.1907 6 +8 3 309.6373 383.0558 26.7836 0.1907 7 +9 3 308.9521 383.9264 26.6633 0.2288 8 +10 3 308.0803 384.6437 26.4746 0.2796 9 +11 3 307.3013 385.4811 26.2807 0.3686 10 +12 3 306.6515 386.418 26.0403 0.4576 11 +13 3 306.163 386.8493 25.7348 0.2542 12 +14 3 305.2078 387.4522 25.4678 0.2415 13 +15 3 304.1713 387.935 25.2622 0.2415 14 +16 3 303.1646 388.4772 25.0959 0.2034 15 +17 3 302.6612 389.4794 24.9498 0.2415 16 +18 3 302.0526 390.4449 24.811 0.2669 17 +19 3 301.1488 391.113 24.62 0.3051 18 +20 3 300.2908 391.8269 24.3497 0.2669 19 +21 3 299.3196 392.4252 24.0991 0.2542 20 +22 3 298.2831 392.9057 23.8647 0.2542 21 +23 3 297.186 392.9846 23.5735 0.3178 22 +24 3 296.0592 393.1093 23.3124 0.3178 23 +25 3 295.0021 393.4719 23.063 0.3051 24 +26 3 293.9371 393.8781 22.9508 0.2415 25 +27 3 292.9361 394.3848 22.9953 0.2161 26 +28 3 292.4899 394.9992 23.0872 0.2161 27 +29 3 291.9008 395.9762 23.2314 0.2034 28 +30 3 291.2498 396.8708 23.4707 0.2288 29 +31 3 290.5634 397.7688 23.722 0.2415 30 +32 3 289.8049 398.6234 23.9202 0.2669 31 +33 3 288.9069 399.3235 24.0704 0.2796 32 +34 3 288.05 400.0785 24.1916 0.2796 33 +35 3 287.2355 400.8816 24.2892 0.3051 34 +36 3 286.429 401.6904 24.3839 0.2924 35 +37 3 285.6545 402.4855 24.5584 0.2924 36 +38 3 284.9018 403.3321 24.7359 0.2415 37 +39 3 284.2554 404.2564 24.8239 0.2415 38 +40 3 283.5427 405.1282 24.8327 0.2669 39 +41 3 282.6424 405.7802 24.9117 0.3305 40 +42 3 281.8976 406.5742 25.0986 0.3432 41 +43 3 281.2192 407.4836 25.2538 0.3305 42 +44 3 280.3715 408.2387 25.3483 0.3051 43 +45 3 279.5433 409.0258 25.4418 0.3178 44 +46 3 278.7242 409.8083 25.5686 0.3178 45 +47 3 277.8204 410.4638 25.7277 0.3051 46 +48 3 276.9144 411.1582 25.8234 0.2796 47 +49 3 275.99 411.832 25.8643 0.2669 48 +50 3 275.0862 412.523 25.8273 0.2796 49 +51 3 274.3198 413.3215 25.661 0.3051 50 +52 3 273.7043 414.2813 25.4893 0.3432 51 +53 3 273.2352 415.3235 25.3404 0.3813 52 +54 3 272.6312 416.2947 25.2273 0.3813 53 +55 3 272.0638 417.2877 25.1458 0.3686 54 +56 3 271.3637 418.1915 25.0867 0.3178 55 +57 3 270.7059 419.1284 25.0363 0.3051 56 +58 3 270.0423 420.0596 24.9728 0.3051 57 +59 3 269.3731 420.9874 24.8882 0.3559 58 +60 3 268.586 421.8157 24.7686 0.3813 59 +61 3 267.8001 422.5936 24.5414 0.3813 60 +62 3 266.9776 423.3807 24.311 0.3432 61 +63 3 266.0761 424.0842 24.1178 0.3051 62 +64 3 265.1609 424.7066 23.8816 0.2542 63 +65 3 264.2091 425.3117 23.6686 0.2161 64 +66 3 263.39 426.0634 23.5784 0.2034 65 +67 3 262.4485 426.3825 23.7465 0.2415 66 +68 3 261.4246 426.879 23.9453 0.2542 67 +69 3 260.395 427.3572 24.1395 0.2542 68 +70 3 259.3414 427.7485 24.278 0.2288 69 +71 3 258.2923 428.0265 24.39 0.2542 70 +72 3 257.392 428.5435 24.2938 0.2924 71 +73 3 256.6942 428.9554 24.2717 0.3305 72 +74 3 255.9357 429.7276 24.2923 0.3305 73 +75 3 255.009 430.2584 24.2964 0.3178 74 +76 3 254.1831 430.6634 24.1574 0.3051 75 +77 3 253.4395 431.3852 24.0637 0.3051 76 +78 3 252.5277 431.884 24.1234 0.2796 77 +79 3 251.7738 432.3588 24.0224 0.2415 78 +80 3 250.6882 432.5556 23.9471 0.2161 79 +81 3 249.8427 432.9193 24.0307 0.2415 80 +82 3 249.2787 433.8025 24.1411 0.2924 81 +83 3 248.7285 434.3962 24.0467 0.3178 82 +84 3 248.1485 435.3538 23.9541 0.2924 83 +85 3 247.668 436.1122 23.7658 0.2415 84 +86 3 247.0262 436.9714 23.5842 0.1907 85 +87 3 246.2517 437.4587 23.6739 0.178 86 +88 3 245.5562 438.0468 23.8488 0.178 87 +89 3 245.134 438.883 23.8818 0.2034 88 +90 3 244.4739 439.6072 23.9025 0.2034 89 +91 3 243.7864 440.4022 23.8069 0.2034 90 +92 3 243.7098 441.2465 23.5581 0.2034 91 +93 3 243.1275 441.8002 23.5154 0.2161 92 +94 3 242.9478 442.8413 23.399 0.2161 93 +95 3 242.6138 443.8125 23.3516 0.178 94 +96 3 242.1299 444.6373 23.1821 0.1398 95 +97 3 241.2925 445.3638 23.0645 0.1271 96 +98 3 240.4253 445.4736 22.7559 0.1398 97 +99 3 239.7824 446.0433 22.3097 0.1525 98 +100 3 239.4335 446.732 22.1138 0.1525 99 +101 3 238.818 447.4481 22.0854 0.1525 100 +102 3 237.7221 447.6506 22.0551 0.1525 101 +103 3 236.9979 448.4366 21.9355 0.1398 102 +104 3 236.3058 449.3312 21.8575 0.1398 103 +105 3 235.6834 450.0702 21.8347 0.1398 104 +106 3 234.8907 450.8378 21.8192 0.1652 105 +107 3 234.2695 451.3938 21.8123 0.1652 106 +108 3 233.6059 452.2896 21.7928 0.1652 107 +109 3 232.7434 452.8227 21.8077 0.1525 108 +110 3 231.835 453.4747 21.876 0.178 109 +111 3 230.9301 454.0753 21.9993 0.2161 110 +112 3 229.9703 454.6027 22.0559 0.2542 111 +113 3 228.9716 454.8544 22.1288 0.2415 112 +114 3 227.9523 454.5226 22.2789 0.2034 113 +115 3 227.0405 454.7366 22.5421 0.1525 114 +116 3 226.3587 455.4573 22.7588 0.1271 115 +117 3 225.5636 456.1849 22.9421 0.1144 116 +118 3 224.6953 456.925 23.1072 0.1271 117 +119 3 223.9014 457.5966 23.2891 0.1398 118 +120 3 223.5399 458.6731 23.4492 0.1525 119 +121 3 222.8787 459.4556 23.5668 0.1525 120 +122 3 221.8399 459.7736 23.8008 0.1652 121 +123 3 220.9453 460.2884 24.0753 0.178 122 +124 3 220.3905 461.2459 24.4107 0.178 123 +125 3 219.7624 461.7253 24.9044 0.1525 124 +126 3 219.7624 462.8521 25.3945 0.1271 125 +127 3 219.6011 463.94 25.9113 0.1144 126 +128 3 218.9627 464.798 26.3921 0.1144 127 +129 3 218.401 465.6538 26.9193 0.1144 128 +130 3 217.7101 466.3127 27.3618 0.1144 129 +131 3 217.1381 467.2794 27.6772 0.1525 130 +132 3 217.1312 468.3536 28.0 0.1907 131 +133 3 292.6455 393.8414 22.9662 0.2924 27 +134 3 292.0746 392.8542 23.3116 0.2924 133 +135 3 291.2876 392.0408 23.4433 0.2924 134 +136 3 290.2534 391.6084 23.6401 0.2669 135 +137 3 289.1517 391.4962 23.9475 0.2669 136 +138 3 288.0489 391.2583 24.2949 0.2288 137 +139 3 286.9461 391.1222 24.6924 0.2288 138 +140 3 285.8227 391.0581 25.0825 0.2034 139 +141 3 284.7485 390.7835 25.4601 0.1907 140 +142 3 283.7189 390.3259 25.744 0.1907 141 +143 3 282.5897 390.1784 25.9115 0.2161 142 +144 3 281.4812 389.985 26.0399 0.2542 143 +145 3 280.4322 389.5297 26.0997 0.2542 144 +146 3 279.3785 389.238 26.0567 0.2415 145 +147 3 278.3855 388.992 25.9222 0.2415 146 +148 3 277.515 388.3937 25.9297 0.2288 147 +149 3 276.5689 388.0963 26.0949 0.2288 148 +150 3 275.6582 387.6215 26.2266 0.2288 149 +151 3 274.7751 387.816 26.2169 0.2669 150 +152 3 273.7821 387.6661 26.1616 0.2796 151 +153 3 272.7708 387.4362 26.1039 0.2796 152 +154 3 272.097 387.0964 26.2076 0.2542 153 +155 3 271.7 386.7498 25.977 0.2542 154 +156 3 270.6979 386.4661 25.7438 0.2542 155 +157 3 269.706 386.3185 25.6619 0.2669 156 +158 3 269.1146 385.9684 25.3793 0.2669 157 +159 3 268.395 385.2466 25.0951 0.2415 158 +160 3 267.688 384.6414 24.9246 0.2288 159 +161 3 266.9867 384.2776 24.5694 0.2161 160 +162 3 266.1276 383.6164 24.3098 0.2542 161 +163 3 265.2947 382.9071 24.1924 0.2924 162 +164 3 264.4482 382.5948 24.0114 0.3305 163 +165 3 263.6359 382.0331 23.8341 0.3305 164 +166 3 263.0308 381.1465 23.7612 0.3051 165 +167 3 262.2929 380.3731 23.6092 0.2542 166 +168 3 261.5184 379.562 23.5142 0.2161 167 +169 3 260.7336 378.9935 23.5596 0.2034 168 +170 3 259.8928 378.4661 23.4175 0.2288 169 +171 3 259.1961 377.7923 23.1691 0.2415 170 +172 3 258.4525 377.2248 22.9844 0.2415 171 +173 3 257.4252 377.0544 22.8706 0.2161 172 +174 3 256.6392 376.4538 22.6657 0.2034 173 +175 3 255.819 375.7788 22.4349 0.178 174 +176 3 255.2115 375.343 22.2313 0.1907 175 +177 3 254.1808 375.3041 22.0299 0.2288 176 +178 3 253.0814 375.4002 21.8467 0.2796 177 +179 3 251.9706 375.5054 21.6943 0.2796 178 +180 3 250.9204 375.8543 21.6107 0.2288 179 +181 3 250.1322 375.9333 21.3548 0.178 180 +182 3 249.2273 375.5752 21.0076 0.1907 181 +183 3 249.0053 375.5752 20.3531 0.2288 182 +184 3 248.3109 376.058 19.7943 0.2542 183 +185 3 247.4529 375.8463 19.5082 0.2161 184 +186 3 246.4073 375.4356 19.3254 0.2034 185 +187 3 245.3972 375.0215 19.2832 0.2288 186 +188 3 244.9087 375.3578 19.3163 0.2796 187 +189 3 243.9694 375.2743 19.2528 0.3051 188 +190 3 242.9124 374.9826 19.1552 0.3051 189 +191 3 242.1734 374.8259 19.2736 0.3051 190 +192 3 241.3703 374.1646 19.2431 0.2924 191 +193 3 240.2606 374.088 19.158 0.2796 192 +194 3 239.2436 373.8169 19.1511 0.2669 193 +195 3 238.6384 373.508 18.9884 0.2542 194 +196 3 237.904 372.9074 18.805 0.2415 195 +197 3 237.2748 372.0917 18.5419 0.2161 196 +198 3 236.816 371.3447 18.1324 0.2034 197 +199 3 235.8585 370.8345 17.6519 0.1652 198 +200 3 234.83 370.4764 17.1075 0.1398 199 +201 3 233.8016 370.1183 16.5562 0.1144 200 +202 3 232.9848 369.4537 16.0868 0.1144 201 +203 3 232.6896 368.4755 15.7613 0.1144 202 +204 3 232.6896 367.3315 15.5629 0.1144 203 +205 3 232.6164 366.191 15.4547 0.1144 204 +206 3 232.3681 365.1797 15.4099 0.1271 205 +207 3 231.2665 364.8777 15.4 0.1398 206 +208 3 230.8592 363.9064 15.4 0.178 207 +209 3 230.8592 362.7624 15.4 0.1907 208 +210 3 306.4433 388.0608 26.5065 0.2542 12 +211 3 306.0303 389.111 26.9685 0.2542 210 +212 3 305.7065 390.1875 27.1429 0.2288 211 +213 3 305.5144 391.28 27.4454 0.2415 212 +214 3 305.0545 392.273 27.848 0.2288 213 +215 3 304.463 393.2077 28.334 0.2669 214 +216 3 303.7217 393.9902 28.894 0.2669 215 +217 3 302.7859 394.6034 29.4347 0.3051 216 +218 3 301.8112 395.1765 29.9393 0.3178 217 +219 3 300.864 395.7771 30.422 0.3305 218 +220 3 300.0518 396.5596 30.837 0.3178 219 +221 3 299.537 397.5617 31.1965 0.2924 220 +222 3 299.0576 398.5662 31.5854 0.2796 221 +223 3 298.4707 399.5317 31.9752 0.2415 222 +224 3 297.686 400.3497 32.3462 0.2288 223 +225 3 296.987 401.1951 32.7824 0.2288 224 +226 3 296.598 402.2407 33.2282 0.2796 225 +227 3 296.4939 403.3481 33.7084 0.2924 226 +228 3 296.2994 404.4566 34.1911 0.2669 227 +229 3 295.867 405.5068 34.6455 0.2034 228 +230 3 295.5867 406.4861 35.2114 0.2034 229 +231 3 295.2458 407.5168 35.8056 0.2415 230 +232 3 294.6704 408.4949 36.3202 0.3051 231 +233 3 294.2105 409.5406 36.769 0.3178 232 +234 3 293.7895 410.6045 37.1921 0.3305 233 +235 3 293.3662 411.6661 37.6351 0.3305 234 +236 3 293.0402 412.7106 38.1993 0.3432 235 +237 3 292.3801 413.4771 38.9458 0.3432 236 +238 3 291.5038 413.6624 39.8958 0.3432 237 +239 3 290.7751 414.2024 40.9643 0.3178 238 +240 3 290.1562 414.9528 42.04 0.2924 239 +241 3 289.5887 415.82 42.968 0.2542 240 +242 3 288.7422 416.3062 43.6248 0.2415 241 +243 3 287.8361 416.7935 44.0423 0.2161 242 +244 3 287.2172 417.4033 44.2963 0.1907 243 +245 3 286.7036 418.3802 44.4553 0.1907 244 +246 3 285.7895 418.9031 44.6342 0.2161 245 +247 3 285.1042 419.602 44.83 0.2542 246 +248 3 284.316 420.2187 44.8879 0.2415 247 +249 3 283.5976 420.8032 45.0318 0.1907 248 +250 3 282.9181 421.5949 45.1265 0.1398 249 +251 3 282.3998 422.3785 45.0643 0.1144 250 +252 3 282.2282 423.4596 44.9327 0.1144 251 +253 3 282.1104 424.5087 44.6944 0.1271 252 +254 3 282.1573 425.5932 44.5606 0.1652 253 +255 3 282.1596 426.2487 44.6382 0.2161 254 +256 3 282.3014 427.3218 44.8 0.2669 255 +257 3 309.8341 368.9766 27.3356 0.3432 1 +258 3 309.7941 367.8692 26.8131 0.4195 257 +259 3 309.7906 366.7401 26.587 0.4703 258 +260 3 309.7643 365.5972 26.3855 0.483 259 +261 3 309.5847 364.499 26.1427 0.483 260 +262 3 309.0813 363.4797 25.9402 0.4449 261 +263 3 308.499 362.5119 25.8791 0.3813 262 +264 3 308.1044 361.464 25.9507 0.3432 263 +265 3 307.6548 360.4126 26.0272 0.3432 264 +266 3 307.4878 359.2812 26.0886 0.3813 265 +267 3 307.3768 358.1418 26.1268 0.394 266 +268 3 307.0748 357.039 26.1228 0.3559 267 +269 3 307.0496 355.8973 26.0691 0.3051 268 +270 3 307.0507 354.7533 25.9752 0.2542 269 +271 3 307.0553 353.6104 25.8441 0.2034 270 +272 3 307.0828 352.6105 25.6113 0.3432 271 +273 3 307.283 351.4997 25.3431 0.3559 272 +274 3 307.4809 350.4026 25.037 0.3559 273 +275 3 307.3997 349.2735 24.7606 0.3305 274 +276 3 307.0027 348.2039 24.5825 0.3432 275 +277 3 306.5405 347.1571 24.5017 0.3559 276 +278 3 306.0269 346.1366 24.5233 0.3813 277 +279 3 305.424 345.2009 24.6844 0.3686 278 +280 3 304.7788 344.2639 24.8917 0.3559 279 +281 3 304.1507 343.3075 25.0726 0.3432 280 +282 3 303.5684 342.3226 25.2195 0.3432 281 +283 3 303.0387 341.309 25.3374 0.3432 282 +284 3 302.4747 340.3137 25.4301 0.3305 283 +285 3 302.6303 339.8584 25.6203 0.3051 284 +286 3 302.5056 338.7967 25.7292 0.2924 285 +287 3 302.2574 337.8552 25.8355 0.2669 286 +288 3 302.3592 336.7742 25.9984 0.2415 287 +289 3 302.1647 335.7125 26.0881 0.2288 288 +290 3 302.0995 334.7538 26.0562 0.2288 289 +291 3 301.6705 333.778 26.0881 0.2415 290 +292 3 301.6728 332.7324 26.0336 0.2542 291 +293 3 301.5584 331.8755 26.0124 0.2796 292 +294 3 301.2175 330.9089 26.0872 0.2924 293 +295 3 301.317 329.8655 26.0023 0.3178 294 +296 3 300.9143 329.1608 26.0363 0.1144 295 +297 3 300.9349 328.1186 25.8946 0.1271 296 +298 3 300.9864 327.0124 25.7001 0.1398 297 +299 3 300.9761 325.8707 25.5304 0.178 298 +300 3 300.7519 324.9612 25.5709 0.2034 299 +301 3 300.1227 324.221 25.5376 0.2415 300 +302 3 300.0712 323.1663 25.56 0.2415 301 +303 3 300.0243 322.06 25.6053 0.2669 302 +304 3 300.1902 320.9686 25.6517 0.2924 303 +305 3 300.4899 319.9905 25.5322 0.3178 304 +306 3 300.745 318.9255 25.3466 0.2924 305 +307 3 301.1809 317.8913 25.2024 0.2415 306 +308 3 301.3868 316.8056 25.0944 0.2288 307 +309 3 301.3719 315.8767 25.267 0.2542 308 +310 3 301.1431 314.7796 25.5158 0.3051 309 +311 3 300.904 313.6905 25.8251 0.3305 310 +312 3 300.5322 312.7662 26.2112 0.3305 311 +313 3 299.9511 311.9585 26.419 0.3178 312 +314 3 299.5267 311.2366 26.5889 0.2924 313 +315 3 298.7281 310.5777 26.5288 0.2924 314 +316 3 297.9708 309.9611 26.4983 0.2669 315 +317 3 297.4217 309.0688 26.3755 0.2669 316 +318 3 297.1986 308.2039 26.1546 0.2415 317 +319 3 296.5957 307.3631 25.9897 0.2415 318 +320 3 296.4653 306.3815 25.9622 0.2161 319 +321 3 296.0066 305.5144 26.0745 0.1907 320 +322 3 295.4929 304.6689 26.3033 0.1652 321 +323 3 294.8077 303.978 26.4294 0.1398 322 +324 3 294.1567 303.4826 26.6365 0.1271 323 +325 3 294.1293 302.6406 27.0128 0.1271 324 +326 3 294.2368 301.5744 27.2464 0.1652 325 +327 3 293.8375 301.1649 27.1086 0.2161 326 +328 3 293.015 300.4899 27.0205 0.2542 327 +329 3 293.0928 299.3962 27.0103 0.2669 328 +330 3 293.0207 298.3426 26.9177 0.2796 329 +331 3 292.8995 297.2798 26.8907 0.3178 330 +332 3 292.7885 296.2102 26.9643 0.3305 331 +333 3 292.5128 295.2058 26.9632 0.3305 332 +334 3 291.9625 294.5697 27.0266 0.2796 333 +335 3 291.4512 293.7083 26.9749 0.2796 334 +336 3 291.2475 292.6489 26.9602 0.2542 335 +337 3 291.2349 291.7761 26.7004 0.2542 336 +338 3 291.9076 291.72 26.2793 0.2161 337 +339 3 292.3069 291.2361 25.7337 0.2288 338 +340 3 291.9785 290.1939 25.3728 0.2542 339 +341 3 291.8252 289.4995 25.3764 0.2796 340 +342 3 292.2897 288.7525 25.4441 0.2669 341 +343 3 292.3492 287.7686 25.6862 0.2415 342 +344 3 292.1696 286.8466 25.9554 0.2415 343 +345 3 292.4064 286.2196 26.2485 0.2415 344 +346 3 292.4064 285.5092 26.2791 0.2415 345 +347 3 292.5208 284.4133 26.2969 0.2415 346 +348 3 292.8926 283.7463 26.5847 0.2924 347 +349 3 293.0013 283.1434 27.2103 0.3305 348 +350 3 293.1592 282.1047 27.7777 0.3559 349 +351 3 292.8411 281.5464 28.429 0.3305 350 +352 3 292.6764 281.0568 29.2068 0.3178 351 +353 3 293.0436 280.1496 29.9023 0.2924 352 +354 3 293.5378 279.3351 30.289 0.2796 353 +355 3 294.0252 278.604 30.6037 0.2796 354 +356 3 294.9266 278.0378 30.8073 0.2924 355 +357 3 295.8224 277.4955 30.8176 0.2924 356 +358 3 296.8074 277.0024 30.7642 0.2669 357 +359 3 297.8427 276.7267 30.6155 0.2288 358 +360 3 298.4822 276.371 30.546 0.2161 359 +361 3 299.3024 275.7646 30.4391 0.2034 360 +362 3 299.8035 274.9547 30.3052 0.2161 361 +363 3 300.0357 275.1148 29.8617 0.1907 362 +364 3 300.5048 274.4765 29.3059 0.1907 363 +365 3 300.7576 274.242 29.1259 0.1652 364 +366 3 300.7931 273.4675 29.0814 0.1652 365 +367 3 300.6432 273.0019 28.7605 0.1398 366 +368 3 301.0676 272.844 28.2808 0.1271 367 +369 3 301.317 271.9666 27.8818 0.1144 368 +370 3 301.5584 271.4117 27.7106 0.1271 369 +371 3 301.6442 270.2826 27.6524 0.1525 370 +372 3 301.6728 269.2175 27.8357 0.1907 371 +373 3 301.8341 268.8308 28.4458 0.2034 372 +374 3 302.6612 268.2932 29.0842 0.1907 373 +375 3 303.581 267.72 29.5898 0.1525 374 +376 3 304.4985 267.3093 29.8292 0.1271 375 +377 3 305.5716 266.9581 29.9477 0.1144 376 +378 3 306.5634 266.4742 29.9432 0.1271 377 +379 3 306.9478 265.7981 30.0188 0.1398 378 +380 3 307.6399 264.9195 30.0762 0.1652 379 +381 3 308.0792 264.0341 30.1336 0.1907 380 +382 3 308.7587 263.2195 30.2725 0.2288 381 +383 3 309.6328 262.7413 30.2492 0.2669 382 +384 3 310.596 262.3192 30.24 0.2924 383 +385 3 301.7803 329.2398 25.1208 0.2669 295 +386 3 302.6292 328.6048 24.637 0.3051 385 +387 3 303.0731 327.8567 24.283 0.3305 386 +388 3 303.3064 326.9083 24.0321 0.3559 387 +389 3 303.692 326.0823 23.762 0.3178 388 +390 3 304.0706 325.3319 23.5107 0.2796 389 +391 3 304.5065 324.3457 23.3394 0.2161 390 +392 3 304.8554 323.3699 23.0615 0.1907 391 +393 3 304.3212 322.4764 22.7951 0.2161 392 +394 3 304.0683 321.6722 22.5207 0.3051 393 +395 3 304.5328 320.9698 22.2153 0.3813 394 +396 3 304.9149 320.01 22.1042 0.3813 395 +397 3 304.9664 318.9403 21.9108 0.3178 396 +398 3 305.3874 317.9233 21.6728 0.2669 397 +399 3 305.7569 316.848 21.482 0.2924 398 +400 3 305.9079 315.8332 21.2863 0.3559 399 +401 3 305.7615 314.8402 21.0765 0.3813 400 +402 3 305.7043 314.0086 20.6456 0.3432 401 +403 3 305.7226 312.9504 20.2604 0.3178 402 +404 3 306.3243 312.1598 19.898 0.3432 403 +405 3 306.6938 311.136 19.6729 0.394 404 +406 3 306.4776 310.048 19.4207 0.3813 405 +407 3 306.2728 309.1752 19.101 0.3432 406 +408 3 305.9536 308.5906 18.6618 0.3051 407 +409 3 306.2271 307.728 18.4777 0.3178 408 +410 3 306.3003 307.1571 18.5158 0.3178 409 +411 3 306.2202 306.2385 18.4359 0.3305 410 +412 3 305.8324 305.472 18.219 0.3051 411 +413 3 306.0543 304.6483 17.7611 0.2669 412 +414 3 305.9125 303.7331 17.2116 0.1907 413 +415 3 306.3277 303.2332 16.9831 0.1398 414 +416 3 306.5028 302.3924 16.6385 0.1398 415 +417 3 306.6847 301.6236 16.1085 0.1907 416 +418 3 306.4776 300.5402 15.6458 0.2669 417 +419 3 306.4021 299.5415 15.1915 0.3178 418 +420 3 306.6481 298.4707 14.9926 0.3432 419 +421 3 307.1548 297.4983 14.8385 0.3432 420 +422 3 307.5083 296.4276 14.8704 0.3305 421 +423 3 308.0392 295.7034 15.2563 0.2924 422 +424 3 308.1261 294.7299 15.8638 0.2415 423 +425 3 308.3172 294.3867 16.782 0.1907 424 +426 3 308.5379 293.8272 17.5666 0.1652 425 +427 3 308.6478 293.0402 18.3929 0.1398 426 +428 3 308.9944 292.1776 19.32 0.1271 427 +429 3 301.7563 339.7005 25.1784 0.2161 284 +430 3 300.7198 339.2406 24.9536 0.2415 429 +431 3 299.8596 338.5531 24.8019 0.2669 430 +432 3 299.2475 337.6127 24.7258 0.2924 431 +433 3 298.584 336.7032 24.6149 0.3051 432 +434 3 298.1012 335.669 24.5324 0.3178 433 +435 3 297.4766 334.7241 24.5367 0.3432 434 +436 3 296.8074 333.8272 24.6354 0.3686 435 +437 3 295.9677 333.055 24.7217 0.3432 436 +438 3 295.1497 332.2554 24.7578 0.2796 437 +439 3 294.58 331.2658 24.7405 0.2161 438 +440 3 293.8501 330.3941 24.6308 0.2161 439 +441 3 292.9281 329.79 24.3863 0.2669 440 +442 3 291.9122 329.2649 24.1543 0.2924 441 +443 3 291.0954 328.4641 23.9476 0.2924 442 +444 3 290.3941 327.6359 24.0705 0.3305 443 +445 3 289.9731 326.5754 23.8261 0.3432 444 +446 3 289.5922 325.508 23.6902 0.3051 445 +447 3 289.106 324.4739 23.5706 0.2542 446 +448 3 288.5031 323.5049 23.4638 0.2415 447 +449 3 287.9848 322.5348 23.2276 0.2669 448 +450 3 287.4334 321.5361 22.9706 0.2796 449 +451 3 286.8923 320.5294 22.7264 0.2924 450 +452 3 286.2116 319.6176 22.4712 0.2796 451 +453 3 285.3342 318.9369 22.1382 0.2924 452 +454 3 284.5483 318.1338 21.7875 0.2796 453 +455 3 284.0644 317.1328 21.412 0.3178 454 +456 3 283.6754 316.0609 21.0729 0.3432 455 +457 3 283.2533 315.0096 20.8309 0.3686 456 +458 3 282.751 314.131 20.7204 0.3178 457 +459 3 282.099 313.6791 20.4266 0.2669 458 +460 3 281.1414 313.1506 20.155 0.2415 459 +461 3 280.5111 312.9858 19.7528 0.2796 460 +462 3 279.9883 312.4344 19.6923 0.3051 461 +463 3 279.1726 311.8727 19.6164 0.3178 462 +464 3 278.2094 311.3465 19.5002 0.3051 463 +465 3 277.2335 310.874 19.4737 0.3051 464 +466 3 276.2577 310.342 19.3979 0.2924 465 +467 3 275.4512 309.7449 19.3922 0.2924 466 +468 3 274.9089 308.9761 19.2034 0.3051 467 +469 3 274.7613 307.982 19.056 0.3305 468 +470 3 273.9949 307.4958 18.9676 0.3432 469 +471 3 273.5144 306.7899 18.9872 0.3305 470 +472 3 272.7399 306.1367 18.9579 0.3178 471 +473 3 272.4093 305.3805 18.8374 0.2924 472 +474 3 271.5158 304.8314 18.7374 0.2669 473 +475 3 270.834 304.3749 18.6399 0.2415 474 +476 3 270.7082 303.5444 18.3895 0.2161 475 +477 3 270.7139 302.4542 18.1673 0.2161 476 +478 3 270.556 301.6739 18.3 0.2161 477 +479 3 270.2174 300.8331 18.5557 0.2415 478 +480 3 270.9656 300.2531 18.6548 0.2669 479 +481 3 271.0102 299.3917 18.6056 0.3305 480 +482 3 270.8317 298.4341 18.4992 0.3686 481 +483 3 270.7402 297.4068 18.3066 0.3686 482 +484 3 269.9657 296.7433 18.0308 0.3051 483 +485 3 269.5744 295.7663 17.7531 0.2542 484 +486 3 269.5275 294.842 17.593 0.2415 485 +487 3 268.7084 294.572 17.3522 0.2542 486 +488 3 268.1616 294.0114 17.0878 0.2669 487 +489 3 267.2498 293.5698 16.8773 0.2924 488 +490 3 266.2866 293.3811 16.7364 0.2924 489 +491 3 265.7706 292.5139 16.6472 0.2924 490 +492 3 265.2719 291.593 16.709 0.2415 491 +493 3 264.6072 290.8048 17.08 0.2288 492 +494 3 290.4033 328.0706 23.5414 0.178 443 +495 3 289.7752 328.0123 23.4394 0.1525 494 +496 3 288.8131 327.8704 23.4036 0.1398 495 +497 3 288.288 327.5123 23.172 0.1398 496 +498 3 287.4792 327.184 22.8222 0.1525 497 +499 3 286.7264 327.0936 22.2419 0.1525 498 +500 3 285.9428 326.6063 21.8892 0.1652 499 +501 3 285.2942 326.4747 21.4873 0.1907 500 +502 3 284.4819 326.0572 21.0901 0.2034 501 +503 3 283.5198 325.6579 20.8874 0.2034 502 +504 3 282.6824 324.9429 20.7248 0.178 503 +505 3 281.7638 324.4842 20.4453 0.1652 504 +506 3 280.8772 323.8023 20.1363 0.1525 505 +507 3 279.9036 323.2441 19.8739 0.1525 506 +508 3 278.9404 322.8368 19.5804 0.1525 507 +509 3 278.0698 322.3792 19.1994 0.1398 508 +510 3 276.9521 322.274 18.8616 0.1271 509 +511 3 275.8298 322.1504 18.6142 0.1271 510 +512 3 274.9032 321.8518 18.4266 0.1398 511 +513 3 274.3392 321.0201 18.2238 0.178 512 +514 3 273.3428 320.5099 18.0422 0.2161 513 +515 3 272.3212 320.034 17.9376 0.2669 514 +516 3 271.4277 319.4197 17.8639 0.2796 515 +517 3 270.5537 318.7756 17.8009 0.2796 516 +518 3 269.5573 318.3683 17.9213 0.2669 517 +519 3 268.6352 318.1144 18.1324 0.2542 518 +520 3 267.7864 318.3741 18.2798 0.2288 519 +521 3 267.0725 317.8032 18.4059 0.1907 520 +522 3 266.1413 317.6648 18.6572 0.1652 521 +523 3 265.0511 317.5744 18.8646 0.1398 522 +524 3 263.9288 317.4611 18.9288 0.1398 523 +525 3 263.2344 317.1225 18.8982 0.1652 524 +526 3 262.7848 316.2165 18.9367 0.2034 525 +527 3 262.4336 315.8492 18.706 0.2161 526 +528 3 261.6511 315.6353 18.3306 0.2161 527 +529 3 260.864 315.6296 17.9597 0.2288 528 +530 3 259.7715 315.6353 17.7304 0.2669 529 +531 3 258.8346 315.1823 17.6414 0.2796 530 +532 3 257.8015 314.9203 17.5772 0.2796 531 +533 3 256.8326 314.497 17.6167 0.3051 532 +534 3 255.8911 314.473 17.4702 0.3178 533 +535 3 254.9804 314.012 17.4313 0.3305 534 +536 3 254.1922 313.5704 17.5915 0.2924 535 +537 3 253.5104 312.8966 17.7729 0.3051 536 +538 3 252.6181 312.5408 17.5942 0.2796 537 +539 3 251.7566 312.4138 17.4342 0.2796 538 +540 3 251.3322 312.7101 17.4841 0.2415 539 +541 3 250.3964 312.3463 17.3243 0.2034 540 +542 3 249.781 311.6336 17.0783 0.2034 541 +543 3 249.6322 310.9289 16.9829 0.2288 542 +544 3 249.0751 310.7104 16.8945 0.2415 543 +545 3 248.3006 310.4736 16.822 0.2542 544 +546 3 247.6691 309.9096 16.9025 0.2415 545 +547 3 247.0125 309.5893 17.2721 0.2542 546 +548 3 246.1636 309.3914 17.737 0.2415 547 +549 3 246.278 308.8994 17.8004 0.2288 548 +550 3 246.6464 308.5116 17.6462 0.2034 549 +551 3 246.0469 308.0426 17.4109 0.178 550 +552 3 245.8456 307.7749 17.5289 0.1652 551 +553 3 246.0744 307.0496 17.92 0.1525 552 +554 3 307.5175 353.1997 23.016 0.2924 271 +555 3 307.1079 353.4194 20.8559 0.2796 554 +556 3 306.1733 353.7763 19.9752 0.2415 555 +557 3 305.3004 353.9181 18.9884 0.1907 556 +558 3 304.256 353.7042 18.0517 0.1652 557 +559 3 303.168 353.6642 17.222 0.1525 558 +560 3 302.286 354.0817 16.6125 0.1525 559 +561 3 302.1373 355.0839 16.3645 0.1652 560 +562 3 302.5102 356.1112 16.2271 0.1907 561 +563 3 302.6143 357.1053 15.9687 0.2161 562 +564 3 301.968 357.8981 15.6558 0.2161 563 +565 3 300.9315 358.2653 15.433 0.2034 564 +566 3 300.4544 358.9998 15.3889 0.178 565 +567 3 301.0928 359.5867 15.1285 0.178 566 +568 3 302.016 359.5592 14.0 0.1907 567 +569 3 306.1218 356.5768 26.1514 0.3178 268 +570 3 305.2238 356.245 25.3151 0.3178 569 +571 3 304.2125 356.0048 25.013 0.2669 570 +572 3 303.295 355.6799 24.6758 0.2415 571 +573 3 302.3295 355.6582 24.4741 0.1907 572 +574 3 301.2072 355.5998 24.315 0.178 573 +575 3 300.2485 355.3058 23.9959 0.2034 574 +576 3 299.3287 355.2886 23.5747 0.2542 575 +577 3 298.3483 354.9958 23.2335 0.2796 576 +578 3 297.4926 354.8654 22.9176 0.2796 577 +579 3 296.5488 354.5256 22.6169 0.2796 578 +580 3 295.5993 354.1069 22.2623 0.3051 579 +581 3 294.7299 353.377 21.9665 0.3305 580 +582 3 293.9634 352.598 21.8116 0.3305 581 +583 3 293.0184 352.1415 21.6098 0.3305 582 +584 3 292.2256 351.6416 21.4664 0.3305 583 +585 3 291.3596 351.0272 21.2988 0.3305 584 +586 3 290.4227 350.525 21.1207 0.3178 585 +587 3 289.4 350.1475 20.9316 0.3178 586 +588 3 289.0064 349.333 20.6644 0.3305 587 +589 3 288.2239 348.5757 20.5314 0.3305 588 +590 3 287.549 347.7691 20.4404 0.2796 589 +591 3 286.6429 347.2852 20.2373 0.2415 590 +592 3 285.9348 346.6148 20.0866 0.2161 591 +593 3 285.0036 346.2064 20.0199 0.2288 592 +594 3 284.3469 345.8655 19.9058 0.2034 593 +595 3 283.7074 345.4114 19.7821 0.178 594 +596 3 283.14 344.9137 19.7084 0.1525 595 +597 3 282.6481 344.1816 19.8512 0.1652 596 +598 3 281.837 343.6679 19.7941 0.1907 597 +599 3 280.9881 343.2629 19.7782 0.2161 598 +600 3 280.0512 342.914 19.7619 0.2415 599 +601 3 279.3019 342.382 19.6693 0.2542 600 +602 3 278.3855 341.8924 19.643 0.2796 601 +603 3 277.4875 341.341 19.5268 0.2796 602 +604 3 276.6135 340.8399 19.4505 0.2796 603 +605 3 275.7555 340.0986 19.4006 0.2669 604 +606 3 275.1126 339.3035 19.3308 0.2542 605 +607 3 274.4033 338.4764 19.289 0.2161 606 +608 3 273.8862 337.4617 19.2863 0.1652 607 +609 3 273.1323 336.6517 19.3334 0.1525 608 +610 3 272.4882 335.7766 19.3854 0.1907 609 +611 3 272.59 335.1714 19.4716 0.2034 610 +612 3 272.3841 334.0732 19.6067 0.2415 611 +613 3 271.9368 333.198 19.6451 0.2669 612 +614 3 271.239 332.4819 19.711 0.2669 613 +615 3 270.3421 331.8138 19.7954 0.2161 614 +616 3 269.7083 330.8986 19.7466 0.178 615 +617 3 269.3182 329.9376 19.6099 0.1398 616 +618 3 268.8743 328.9149 19.4934 0.1271 617 +619 3 268.117 328.0843 19.3737 0.1271 618 +620 3 267.2075 327.5478 19.3017 0.1398 619 +621 3 266.1836 327.0971 19.2026 0.1525 620 +622 3 265.0934 326.8786 19.1838 0.1398 621 +623 3 264.2228 326.5068 19.3462 0.1271 622 +624 3 263.3477 326.3889 19.221 0.1144 623 +625 3 262.3993 325.9336 18.9627 0.1144 624 +626 3 261.2667 325.8112 18.7286 0.1271 625 +627 3 260.1273 325.7837 18.5231 0.1398 626 +628 3 259.3677 325.1683 18.3219 0.1525 627 +629 3 258.7145 324.419 18.0564 0.1398 628 +630 3 257.8553 323.7051 17.9092 0.1271 629 +631 3 257.0213 322.9947 17.7948 0.1144 630 +632 3 256.3155 322.171 17.6884 0.1144 631 +633 3 255.7137 321.2741 17.586 0.1398 632 +634 3 255.3111 320.8989 17.3414 0.1907 633 +635 3 254.6452 320.0088 17.1527 0.2669 634 +636 3 253.7346 319.3339 16.9988 0.3178 635 +637 3 253.07 318.5823 16.8885 0.3432 636 +638 3 252.379 317.7082 16.7994 0.3432 637 +639 3 251.4546 317.428 16.6979 0.3559 638 +640 3 250.4948 317.0173 16.6612 0.394 639 +641 3 249.7386 316.2005 16.6207 0.4195 640 +642 3 249.0133 315.3493 16.5682 0.4195 641 +643 3 248.129 314.6561 16.5915 0.3686 642 +644 3 247.4655 314.1058 16.607 0.3432 643 +645 3 246.6178 313.5178 16.6138 0.3178 644 +646 3 245.5848 313.1094 16.7088 0.3178 645 +647 3 244.7119 312.4584 16.8742 0.3051 646 +648 3 243.7784 311.8372 16.9921 0.3305 647 +649 3 242.9662 311.1165 17.0095 0.3432 648 +650 3 242.4765 310.4702 16.9188 0.3432 649 +651 3 241.6872 309.9073 16.7731 0.2924 650 +652 3 241.4115 309.452 16.8914 0.2415 651 +653 3 241.4206 309.4703 16.7192 0.1907 652 +654 3 241.0774 308.4647 16.5911 0.1652 653 +655 3 241.4069 307.633 16.2854 0.178 654 +656 3 241.1506 306.7842 16.0791 0.2161 655 +657 3 240.5752 306.6137 16.2299 0.2415 656 +658 3 240.1954 305.6962 16.2999 0.2288 657 +659 3 240.2617 305.0339 16.5835 0.1907 658 +660 3 240.637 304.4173 16.7325 0.1907 659 +661 3 240.6301 303.9196 16.658 0.2034 660 +662 3 240.3738 303.0834 16.337 0.2669 661 +663 3 239.9803 302.4015 15.8964 0.3051 662 +664 3 239.3591 301.579 15.4512 0.3305 663 +665 3 238.7471 300.9978 15.1843 0.3051 664 +666 3 238.0195 300.4075 14.9135 0.2669 665 +667 3 237.9165 300.014 14.4202 0.2542 666 +668 3 237.2736 299.3196 14.0618 0.2288 667 +669 3 236.6936 299.156 12.88 0.2034 668 +670 3 312.0306 368.2181 26.4565 0.1652 1 +671 3 311.78 367.1565 26.0539 0.2161 670 +672 3 311.2504 366.223 25.6456 0.2542 671 +673 3 310.9037 365.2781 25.2424 0.2415 672 +674 3 311.2183 364.1935 25.0865 0.2161 673 +675 3 311.8498 363.6547 22.9597 0.394 674 +676 3 312.7696 362.9752 22.8166 0.4195 675 +677 3 313.6047 362.1938 22.761 0.4068 676 +678 3 314.4742 361.4502 22.689 0.394 677 +679 3 315.4214 360.813 22.585 0.3686 678 +680 3 316.2851 360.1198 22.38 0.3432 679 +681 3 317.1465 359.3739 22.1784 0.3051 680 +682 3 318.0148 358.6314 22.0202 0.2669 681 +683 3 318.8362 357.8363 21.9011 0.2542 682 +684 3 319.6416 357.023 21.8161 0.2415 683 +685 3 320.4333 356.197 21.7585 0.2542 684 +686 3 321.1666 355.3218 21.7178 0.2669 685 +687 3 321.8404 354.3986 21.6683 0.3178 686 +688 3 322.5485 353.5017 21.5986 0.3559 687 +689 3 323.2601 352.6105 21.5044 0.3559 688 +690 3 324.1169 351.8612 21.381 0.3305 689 +691 3 325.047 351.2286 21.1907 0.2924 690 +692 3 325.8169 350.469 20.8882 0.2924 691 +693 3 326.5079 349.6098 20.5327 0.2796 692 +694 3 327.3293 348.8342 20.2038 0.2796 693 +695 3 328.1415 348.046 19.9946 0.2669 694 +696 3 328.8657 347.1971 19.8737 0.2924 695 +697 3 329.5349 346.2865 19.7442 0.3432 696 +698 3 330.3106 345.4571 19.6287 0.3686 697 +699 3 331.1239 344.6792 19.498 0.3559 698 +700 3 331.9099 343.8727 19.3525 0.3051 699 +701 3 332.5951 342.9655 19.2674 0.2924 700 +702 3 333.2735 342.0823 19.3308 0.2924 701 +703 3 334.0423 341.2644 19.5024 0.3051 702 +704 3 334.8465 340.4761 19.745 0.3051 703 +705 3 335.6896 339.7302 20.0198 0.2924 704 +706 3 336.6186 339.0736 20.2432 0.2796 705 +707 3 337.5704 338.4398 20.3798 0.2669 706 +708 3 338.4787 337.7466 20.4312 0.2669 707 +709 3 339.3905 337.0556 20.4037 0.2542 708 +710 3 340.4155 336.797 20.2257 0.2288 709 +711 3 340.888 336.7021 20.1628 0.2034 710 +712 3 341.7357 336.2182 20.0404 0.178 711 +713 3 342.6898 335.8143 19.8458 0.1907 712 +714 3 343.5409 335.6496 19.4928 0.2288 713 +715 3 344.1221 334.8843 19.1644 0.2924 714 +716 3 344.5465 334.0194 19.0036 0.3178 715 +717 3 345.0476 333.0459 18.9499 0.2796 716 +718 3 345.3461 332.1272 18.9787 0.2161 717 +719 3 345.8907 331.3127 19.0743 0.1652 718 +720 3 346.5256 330.8276 19.0996 0.1525 719 +721 3 346.7864 330.0337 19.1131 0.178 720 +722 3 347.0107 329.2009 19.1314 0.1907 721 +723 3 347.3138 328.5774 18.8302 0.2288 722 +724 3 346.5519 328.328 18.278 0.2415 723 +725 3 346.5359 327.9951 17.5548 0.2796 724 +726 3 346.6 327.2984 16.9373 0.2924 725 +727 3 346.2888 326.4496 16.4776 0.2796 726 +728 3 346.2888 326.1544 16.6053 0.2542 727 +729 3 346.7773 325.3822 16.9248 0.2288 728 +730 3 347.204 324.721 17.3381 0.2288 729 +731 3 347.2635 323.7509 17.6196 0.2415 730 +732 3 347.3962 322.8585 17.6284 0.2415 731 +733 3 347.744 321.9651 17.7499 0.2669 732 +734 3 347.911 320.9641 17.6345 0.2796 733 +735 3 348.5459 320.1141 17.5773 0.3305 734 +736 3 348.8056 319.3693 17.5348 0.3686 735 +737 3 349.2781 318.3969 17.4328 0.394 736 +738 3 349.8352 317.7185 17.2824 0.394 737 +739 3 350.1326 316.8537 17.0248 0.3686 738 +740 3 350.31 315.8206 16.8238 0.3559 739 +741 3 350.5582 314.7338 16.7394 0.3305 740 +742 3 350.8797 313.782 16.8484 0.3051 741 +743 3 351.526 313.0636 17.0705 0.2796 742 +744 3 352.0946 312.2262 17.1183 0.2415 743 +745 3 353.0052 311.5707 17.1229 0.2288 744 +746 3 353.774 310.9575 16.8834 0.2034 745 +747 3 354.5439 310.4724 16.4563 0.2288 746 +748 3 355.1411 310.008 16.0947 0.2288 747 +749 3 355.8458 309.3994 15.7024 0.2542 748 +750 3 356.2656 308.6054 15.3663 0.2669 749 +751 3 356.9337 307.8401 15.2337 0.2924 750 +752 3 357.595 307.053 15.156 0.3178 751 +753 3 358.3042 306.4273 15.323 0.3178 752 +754 3 358.9231 305.8244 15.3232 0.3051 753 +755 3 359.1668 304.828 15.3692 0.2796 754 +756 3 359.4459 303.8464 15.3289 0.2415 755 +757 3 359.6622 302.8454 15.1279 0.2288 756 +758 3 360.0889 302.1704 15.1466 0.2161 757 +759 3 360.5488 301.5893 15.088 0.2542 758 +760 3 361.4491 301.2072 15.1174 0.2796 759 +761 3 362.1458 300.7187 15.3244 0.2924 760 +762 3 362.759 300.2199 15.7738 0.2796 761 +763 3 363.1182 299.2921 16.067 0.2542 762 +764 3 363.5632 298.433 16.0795 0.2415 763 +765 3 363.6467 297.7626 16.3378 0.2034 764 +766 3 363.8389 297.0968 16.3876 0.1907 765 +767 3 364.3114 296.717 16.2865 0.1907 766 +768 3 364.1558 295.9128 16.3122 0.2161 767 +769 3 364.2496 294.9186 16.1338 0.2288 768 +770 3 364.2302 294.5823 15.6426 0.2161 769 +771 3 363.8721 293.8639 15.3348 0.2034 770 +772 3 364.4784 293.0928 15.4 0.178 771 +773 3 311.2515 363.5666 25.2348 0.3051 674 +774 3 311.6279 362.8608 25.8851 0.2415 773 +775 3 311.7995 362.4352 26.9718 0.2034 774 +776 3 312.0535 362.0497 28.2769 0.2034 775 +777 3 311.5078 361.1825 29.5103 0.2542 776 +778 3 310.7596 360.3772 30.5687 0.3051 777 +779 3 310.1064 359.4757 31.4614 0.3305 778 +780 3 310.2482 358.7836 32.2636 0.3432 779 +781 3 311.0708 358.1349 33.0408 0.3305 780 +782 3 311.3007 357.1156 33.777 0.2924 781 +783 3 310.8854 356.0746 34.4226 0.2669 782 +784 3 310.453 355.0518 35.0809 0.2542 783 +785 3 310.9861 354.1298 35.7501 0.2796 784 +786 3 311.9345 353.5864 36.4512 0.3051 785 +787 3 312.4516 352.5831 37.1185 0.3559 786 +788 3 311.7903 351.3453 37.9336 0.2924 787 +789 3 311.2183 350.4884 38.8044 0.3178 788 +790 3 310.8305 349.4863 39.6676 0.394 789 +791 3 310.3603 348.5288 40.5087 0.4322 790 +792 3 309.7723 347.6341 41.2989 0.4195 791 +793 3 309.0219 346.8276 41.9978 0.3305 792 +794 3 308.2005 346.0703 42.5617 0.2669 793 +795 3 307.3882 345.2649 42.9654 0.2288 794 +796 3 306.5634 344.479 43.2656 0.2288 795 +797 3 305.6402 344.0008 43.5504 0.2415 796 +798 3 304.9469 343.2915 43.7738 0.2542 797 +799 3 304.5317 342.4106 43.871 0.2669 798 +800 3 304.2834 341.5046 43.8942 0.2542 799 +801 3 303.6393 340.5951 43.8172 0.2415 800 +802 3 302.8088 339.8389 43.7298 0.2415 801 +803 3 301.9863 339.2589 43.5498 0.2415 802 +804 3 301.2461 338.4261 43.4185 0.2161 803 +805 3 300.5551 337.6642 43.4053 0.1907 804 +806 3 299.7463 336.9 43.4238 0.1907 805 +807 3 298.8277 336.2433 43.4358 0.2288 806 +808 3 297.9788 335.5398 43.5313 0.2415 807 +809 3 297.3634 334.6154 43.6545 0.2415 808 +810 3 296.3921 334.2642 43.8102 0.2415 809 +811 3 295.581 333.5732 43.876 0.2796 810 +812 3 295.0216 333.0184 43.7287 0.3305 811 +813 3 294.2654 332.3503 43.6517 0.3559 812 +814 3 293.6602 331.5873 43.5747 0.3432 813 +815 3 292.999 330.9363 43.5184 0.3051 814 +816 3 292.2623 330.0955 43.5025 0.2669 815 +817 3 291.6205 329.1997 43.4168 0.2161 816 +818 3 290.8254 328.4127 43.2939 0.178 817 +819 3 290.1253 327.5238 43.1701 0.178 818 +820 3 289.5441 326.7115 43.0237 0.2034 819 +821 3 288.9744 326.1292 42.9148 0.2415 820 +822 3 288.439 325.206 42.8165 0.2415 821 +823 3 288.4367 324.1616 42.672 0.2669 822 +824 3 288.1393 323.1789 42.518 0.2542 823 +825 3 287.5558 322.2545 42.317 0.2542 824 +826 3 286.977 321.2947 42.0647 0.2161 825 +827 3 286.4233 320.4584 41.7133 0.2161 826 +828 3 285.3388 320.1701 41.3792 0.2034 827 +829 3 284.6798 319.3682 41.046 0.1907 828 +830 3 283.9557 318.5926 40.7084 0.178 829 +831 3 283.2899 317.9885 40.2514 0.2034 830 +832 3 282.2248 317.6122 39.832 0.2669 831 +833 3 281.7706 316.8617 39.5746 0.3051 832 +834 3 281.535 315.8595 39.3047 0.3305 833 +835 3 280.9172 315.7486 38.892 0.3305 834 +836 3 280.3063 314.9981 38.633 0.3305 835 +837 3 279.4643 314.5279 38.3944 0.2796 836 +838 3 278.8523 313.718 38.3426 0.2161 837 +839 3 278.2505 312.8977 38.2178 0.178 838 +840 3 277.5664 312.2594 37.9406 0.2034 839 +841 3 276.9944 311.406 37.6701 0.2288 840 +842 3 276.3858 310.8957 37.6356 0.2669 841 +843 3 275.6823 310.7035 37.4242 0.2542 842 +844 3 274.6092 310.5068 37.1468 0.2669 843 +845 3 273.551 310.2597 36.8746 0.2161 844 +846 3 272.9492 309.5824 36.58 0.1907 845 +847 3 271.9677 309.1614 36.3611 0.1525 846 +848 3 271.1429 308.5242 36.2768 0.1652 847 +849 3 270.3375 307.8207 36.2886 0.1907 848 +850 3 269.4612 307.1308 36.3012 0.2288 849 +851 3 268.7794 306.2568 36.304 0.2669 850 +852 3 268.0552 305.4217 36.2365 0.3178 851 +853 3 267.601 304.5808 36.0578 0.3432 852 +854 3 267.2407 303.8464 35.7664 0.3686 853 +855 3 266.9581 303.176 35.5068 0.3432 854 +856 3 266.7511 302.4221 35.3324 0.3432 855 +857 3 266.1344 301.6877 35.1803 0.3305 856 +858 3 265.6746 300.872 34.8939 0.3305 857 +859 3 265.4034 300.2096 34.6836 0.2669 858 +860 3 265.0145 299.3356 34.5775 0.2542 859 +861 3 264.542 298.33 34.4187 0.2796 860 +862 3 264.2114 297.678 34.0164 0.3051 861 +863 3 263.9711 296.9435 33.5138 0.3305 862 +864 3 263.6405 296.1393 33.292 0.3305 863 +865 3 263.6771 295.0982 33.2038 0.3051 864 +866 3 264.0249 294.2746 33.2158 0.2415 865 +867 3 264.0352 293.293 33.0912 0.2034 866 +868 3 264.2732 292.3069 33.0204 0.2034 867 +869 3 264.2365 291.4512 32.6942 0.2669 868 +870 3 264.0924 290.4273 32.415 0.3178 869 +871 3 263.4632 289.7134 32.1426 0.3178 870 +872 3 263.3442 288.6564 31.9542 0.2924 871 +873 3 263.3156 287.8956 31.656 0.2796 872 +874 3 262.8683 287.1257 31.1956 0.3051 873 +875 3 262.397 286.2528 30.9394 0.3305 874 +876 3 261.706 286.0812 30.9904 0.3305 875 +877 3 261.2633 285.2244 30.9366 0.2924 876 +878 3 260.5609 284.5483 30.7415 0.2542 877 +879 3 260.0621 283.9797 30.7602 0.2288 878 +880 3 259.4054 283.2716 30.756 0.2542 879 +881 3 258.5371 282.6424 30.5911 0.2924 880 +882 3 257.9194 281.8839 30.3332 0.3305 881 +883 3 257.4 281.2135 30.0126 0.3305 882 +884 3 256.9859 280.4276 29.7847 0.2796 883 +885 3 256.2331 279.9368 29.4297 0.2288 884 +886 3 255.4804 279.454 29.3224 0.2034 885 +887 3 255.0617 278.945 29.3465 0.2924 886 +888 3 254.0424 278.5732 29.0458 0.2161 887 +889 3 253.2107 278.326 28.6756 0.1907 888 +890 3 252.4259 277.6522 28.4844 0.1652 889 +891 3 252.3653 276.8594 28.177 0.1525 890 +892 3 251.6789 276.1193 27.9011 0.1525 891 +893 3 251.108 275.2384 27.6942 0.1652 892 +894 3 250.9833 274.1356 27.4711 0.1652 893 +895 3 250.1585 273.5304 27.2781 0.1652 894 +896 3 249.3851 273.1597 27.0616 0.1398 895 +897 3 248.7331 273.4126 27.1299 0.1271 896 +898 3 247.6051 273.4046 27.1559 0.1398 897 +899 3 246.8775 272.9984 27.3873 0.1652 898 +900 3 245.8216 272.8223 27.4537 0.1907 899 +901 3 244.7782 272.844 27.3467 0.1907 900 +902 3 243.6354 272.8749 27.2435 0.2034 901 +903 3 242.6046 273.1426 27.1461 0.2288 902 +904 3 241.5819 273.1506 27.1317 0.2288 903 +905 3 240.8669 272.5717 27.1083 0.2034 904 +906 3 240.4562 272.1565 26.9258 0.1525 905 +907 3 239.4438 272.0432 26.7345 0.1398 906 +908 3 238.7974 271.9288 26.8365 0.1398 907 +909 3 238.1225 271.2676 26.9754 0.1525 908 +910 3 237.3537 271.3568 26.9015 0.1525 909 +911 3 236.8069 270.969 26.7094 0.1525 910 +912 3 236.7028 270.6704 26.8857 0.1525 911 +913 3 236.3504 269.9291 27.2303 0.1398 912 +914 3 236.3195 268.824 27.5174 0.1525 913 +915 3 235.6834 268.0495 27.6303 0.178 914 +916 3 235.5839 267.2064 27.5405 0.2415 915 +917 3 236.1216 266.4376 27.16 0.2796 916 +918 3 254.4988 278.0858 29.3009 0.2161 887 +919 3 254.2037 277.0505 29.2172 0.2288 918 +920 3 253.9428 276.0632 29.1648 0.2161 919 +921 3 253.5825 275.0805 29.1774 0.178 920 +922 3 253.5104 274.0955 29.0276 0.1398 921 +923 3 253.5104 272.9515 28.8971 0.1271 922 +924 3 253.1409 271.8865 28.7991 0.1398 923 +925 3 252.5437 270.9347 28.6737 0.1652 924 +926 3 252.252 269.9291 28.523 0.178 925 +927 3 252.5758 268.951 28.4032 0.1907 926 +928 3 252.5986 267.9626 28.385 0.178 927 +929 3 252.7096 266.9856 28.3077 0.1652 928 +930 3 252.1856 266.155 28.2187 0.1525 929 +931 3 251.4398 265.3817 28.1347 0.1525 930 +932 3 250.3678 265.0648 28.0372 0.1525 931 +933 3 249.2593 265.2684 27.9082 0.1652 932 +934 3 248.3418 265.2833 27.6754 0.2034 933 +935 3 247.6989 264.4962 27.5281 0.2288 934 +936 3 247.0205 263.8693 27.332 0.2288 935 +937 3 246.27 263.0342 27.2152 0.178 936 +938 3 245.3274 262.5503 27.2302 0.1652 937 +939 3 244.5918 261.9863 27.1094 0.178 938 +940 3 243.7155 261.7278 26.9824 0.2288 939 +941 3 243.2991 260.9475 26.7182 0.2415 940 +942 3 243.2144 260.1753 26.5705 0.2415 941 +943 3 242.9295 259.3185 26.4671 0.2161 942 +944 3 242.4422 258.5062 26.3182 0.2034 943 +945 3 242.1825 257.4721 26.1734 0.178 944 +946 3 241.9423 256.3807 26.1706 0.178 945 +947 3 241.5682 255.3648 26.2538 0.178 946 +948 3 240.8726 254.4817 26.3888 0.2034 947 +949 3 240.121 253.6992 26.5295 0.2161 948 +950 3 239.6222 252.8 26.6758 0.2288 949 +951 3 239.5033 251.7406 26.7541 0.2161 950 +952 3 239.5628 250.6069 26.8465 0.1907 951 +953 3 239.5467 249.4641 26.9228 0.1525 952 +954 3 239.1029 248.4688 27.0769 0.1271 953 +955 3 238.389 247.6291 27.2775 0.1144 954 +956 3 237.7507 246.7574 27.4628 0.1271 955 +957 3 237.5722 245.6362 27.6341 0.1525 956 +958 3 236.9636 244.8126 27.8311 0.1907 957 +959 3 236.7348 243.8916 28.0711 0.2161 958 +960 3 236.236 243.1057 28.3002 0.2288 959 +961 3 235.6915 242.3873 28.5676 0.2161 960 +962 3 234.8049 241.956 28.6269 0.2034 961 +963 3 233.7661 241.7615 28.63 0.1907 962 +964 3 232.939 241.1232 28.6331 0.2034 963 +965 3 231.9746 240.5683 28.5334 0.2034 964 +966 3 231.0537 239.8968 28.4284 0.1907 965 +967 3 230.0881 239.3728 28.3461 0.1525 966 +968 3 229.4864 238.5972 28.3444 0.1398 967 +969 3 229.0631 237.5745 28.3388 0.1525 968 +970 3 228.3561 236.6822 28.327 0.178 969 +971 3 227.8745 236.0129 28.1621 0.178 970 +972 3 227.4272 235.124 28.14 0.1525 971 +973 3 227.2201 234.0567 28.1109 0.1271 972 +974 3 226.9696 233.0774 28.0773 0.1271 973 +975 3 226.7946 232.0192 28.049 0.1525 974 +976 3 225.956 231.66 27.8662 0.178 975 +977 3 226.0567 230.8901 27.7763 0.178 976 +978 3 225.8256 229.8468 27.7679 0.1525 977 +979 3 225.8256 228.7028 27.7862 0.1271 978 +980 3 225.8256 227.5588 27.827 0.1271 979 +981 3 225.7112 226.4331 27.9254 0.1398 980 +982 3 225.4984 225.5476 28.0946 0.1525 981 +983 3 225.6986 224.5661 28.184 0.1652 982 +984 3 225.7112 223.4232 28.28 0.1907 983 +985 3 312.7742 352.0122 37.4774 0.394 787 +986 3 313.4629 352.018 38.3967 0.3559 985 +987 3 314.5531 352.1232 38.6876 0.3051 986 +988 3 315.6937 352.1232 38.9348 0.2415 987 +989 3 316.6272 352.2319 39.2417 0.2161 988 +990 3 317.2449 351.6645 39.3697 0.2161 989 +991 3 317.8615 351.5501 39.2776 0.2034 990 +992 3 318.8236 351.3087 39.3064 0.1652 991 +993 3 319.9539 351.1966 39.3487 0.1271 992 +994 3 320.9915 350.827 39.4274 0.1271 993 +995 3 322.0085 350.4781 39.5951 0.1525 994 +996 3 323.1388 350.2997 39.7211 0.178 995 +997 3 324.0357 349.9496 39.6729 0.178 996 +998 3 325.0436 349.9496 39.7023 0.1525 997 +999 3 326.0537 349.7242 39.5601 0.1525 998 +1000 3 326.9049 349.1271 39.3716 0.1907 999 +1001 3 327.8933 348.6546 39.1054 0.2669 1000 +1002 3 328.9126 348.3091 38.8923 0.2924 1001 +1003 3 329.9422 348.1512 38.8685 0.2924 1002 +1004 3 330.8162 347.6513 38.8301 0.2542 1003 +1005 3 331.6685 347.0953 38.8276 0.2415 1004 +1006 3 332.443 346.5176 38.892 0.2161 1005 +1007 3 333.5298 346.2716 38.936 0.2161 1006 +1008 3 334.6006 345.9422 38.997 0.2415 1007 +1009 3 335.7148 345.75 39.0253 0.2796 1008 +1010 3 336.6552 345.2066 39.0023 0.2796 1009 +1011 3 337.6367 344.7204 38.9726 0.2415 1010 +1012 3 338.5222 344.1083 38.9012 0.2034 1011 +1013 3 339.3493 343.7068 38.9642 0.1907 1012 +1014 3 340.1306 343.1268 38.8984 0.178 1013 +1015 3 341.1374 342.8007 38.8783 0.1525 1014 +1016 3 341.6968 342.0343 38.7988 0.1271 1015 +1017 3 342.7699 341.8272 38.7881 0.1271 1016 +1018 3 343.8807 341.8272 38.8634 0.1398 1017 +1019 3 344.9995 341.6831 38.8962 0.1525 1018 +1020 3 345.9765 341.2277 39.069 0.1398 1019 +1021 3 346.9214 340.809 39.2314 0.1271 1020 +1022 3 347.9201 340.3514 39.3316 0.1271 1021 +1023 3 348.7152 339.768 39.4064 0.1398 1022 +1024 3 349.8158 339.5861 39.4806 0.1525 1023 +1025 3 350.4941 338.9157 39.667 0.1398 1024 +1026 3 351.184 338.0497 39.8174 0.1398 1025 +1027 3 351.9779 337.2375 39.9162 0.1398 1026 +1028 3 352.7627 336.4161 39.9535 0.1525 1027 +1029 3 353.4537 335.7834 40.0506 0.1398 1028 +1030 3 354.0062 334.8179 40.1078 0.1398 1029 +1031 3 354.6022 333.9977 40.0308 0.1398 1030 +1032 3 354.8688 333.2232 40.0719 0.1525 1031 +1033 3 354.8688 332.1146 40.0719 0.1398 1032 +1034 3 354.926 330.9821 40.0912 0.1398 1033 +1035 3 355.5575 330.1161 40.1478 0.1525 1034 +1036 3 355.6868 329.2466 40.4278 0.178 1035 +1037 3 356.0872 328.233 40.5877 0.2034 1036 +1038 3 356.928 327.6416 40.6 0.2034 1037 +1039 2 313.9491 377.5497 28.194 0.2034 1 +1040 2 314.3346 378.4878 29.2018 0.3051 1039 +1041 2 315.2921 379.0438 29.589 0.394 1040 +1042 2 316.1364 379.7222 30.0359 0.4449 1041 +1043 2 316.2531 380.8536 30.3794 0.4576 1042 +1044 2 316.5425 381.9599 30.8286 0.4449 1043 +1045 3 314.7499 376.7741 26.964 0.1398 1 +1046 3 315.3905 377.7213 27.3486 0.178 1045 +1047 3 315.8264 378.5427 27.5753 0.2288 1046 +1048 3 316.9498 378.5324 27.7516 0.2288 1047 +1049 3 317.5115 378.2064 28.1551 0.2288 1048 +1050 3 318.6543 378.2064 28.4707 0.2288 1049 +1051 3 319.7903 378.3094 28.7 0.2924 1050 +1052 3 320.6632 378.2762 28.7129 0.3432 1051 +1053 3 321.3084 377.6104 28.7862 0.3686 1052 +1054 3 322.314 377.091 28.8644 0.3432 1053 +1055 3 323.3836 376.7192 28.8966 0.3051 1054 +1056 3 324.5196 376.3852 28.908 0.2669 1055 +1057 3 325.341 376.6426 28.9402 0.2288 1056 +1058 3 325.9519 376.4424 29.1088 0.178 1057 +1059 3 327.0158 376.1472 29.2435 0.1652 1058 +1060 3 327.7938 375.7274 29.2118 0.1907 1059 +1061 3 328.5396 375.621 29.2611 0.2415 1060 +1062 3 329.3553 375.3624 29.491 0.2669 1061 +1063 3 330.2305 375.5535 29.8371 0.2796 1062 +1064 3 331.1937 375.2675 30.287 0.2669 1063 +1065 3 332.0037 375.0032 30.4433 0.2924 1064 +1066 3 332.9761 374.6886 30.4528 0.2924 1065 +1067 3 333.9359 374.6108 30.3929 0.2796 1066 +1068 3 335.025 374.4312 30.3517 0.2669 1067 +1069 3 335.7148 373.842 30.4018 0.2924 1068 +1070 3 336.7101 373.4771 30.2957 0.3432 1069 +1071 3 337.5178 373.2231 30.2212 0.3178 1070 +1072 3 338.5462 372.8857 30.0871 0.2796 1071 +1073 3 339.6216 372.8548 29.8626 0.2161 1072 +1074 3 340.6043 372.6569 29.5411 0.2288 1073 +1075 3 341.1408 372.4784 28.9601 0.2288 1074 +1076 3 341.6625 372.8799 28.4068 0.2288 1075 +1077 3 342.1189 373.3616 27.9405 0.2924 1076 +1078 3 342.7962 374.0514 27.5187 0.3178 1077 +1079 3 343.7068 374.231 27.3008 0.3178 1078 +1080 3 344.4401 374.0777 26.9836 0.3178 1079 +1081 3 345.2009 374.0571 26.5343 0.3559 1080 +1082 3 345.6035 374.088 25.9309 0.394 1081 +1083 3 345.8312 374.7378 25.4952 0.4068 1082 +1084 3 346.6251 375.0032 25.1943 0.3813 1083 +1085 3 347.4351 375.3922 24.9897 0.3686 1084 +1086 3 348.3251 375.1187 24.6704 0.3559 1085 +1087 3 349.3765 375.232 24.3519 0.3305 1086 +1088 3 349.7208 375.7079 23.8489 0.2669 1087 +1089 3 350.334 376.249 23.4171 0.2288 1088 +1090 3 351.1096 376.0248 22.8845 0.2288 1089 +1091 3 351.9287 375.6804 22.5597 0.2669 1090 +1092 3 352.789 375.4333 22.1403 0.2924 1091 +1093 3 353.83 375.4436 21.6722 0.2924 1092 +1094 3 354.6526 375.4608 21.38 0.2796 1093 +1095 3 355.7531 375.6919 21.1154 0.2669 1094 +1096 3 356.4029 376.336 20.7913 0.2796 1095 +1097 3 357.3604 376.2616 20.4935 0.2924 1096 +1098 3 358.4026 376.5407 20.3386 0.2924 1097 +1099 3 358.9586 376.948 20.0357 0.3051 1098 +1100 3 359.7891 377.4193 19.9097 0.3178 1099 +1101 3 360.6368 377.52 19.9634 0.3432 1100 +1102 3 361.6813 377.6424 19.9676 0.3178 1101 +1103 3 362.767 377.7042 19.977 0.2669 1102 +1104 3 363.6307 378.2339 19.9051 0.2288 1103 +1105 3 364.269 378.664 19.769 0.2161 1104 +1106 3 365.1053 379.1674 19.8225 0.2542 1105 +1107 3 365.8992 379.538 19.7543 0.2796 1106 +1108 3 366.5845 380.2233 19.6962 0.3178 1107 +1109 3 367.1439 380.7976 19.8747 0.3305 1108 +1110 3 367.8566 381.4039 19.8759 0.3432 1109 +1111 3 368.4389 381.8111 20.0472 0.3432 1110 +1112 3 369.226 382.4266 20.1998 0.3305 1111 +1113 3 370.0279 383.1416 20.3099 0.2924 1112 +1114 3 370.6549 383.987 20.4018 0.2288 1113 +1115 3 371.0964 384.956 20.2879 0.1907 1114 +1116 3 371.6238 385.9067 20.1303 0.1907 1115 +1117 3 372.356 386.7098 20.0312 0.2161 1116 +1118 3 373.135 387.5106 19.8731 0.2161 1117 +1119 3 373.7803 388.2484 19.8415 0.2034 1118 +1120 3 374.4426 389.151 19.7465 0.2161 1119 +1121 3 375.113 390.0571 19.6347 0.2288 1120 +1122 3 375.9092 390.7812 19.5953 0.2288 1121 +1123 3 376.8302 391.2457 19.5019 0.178 1122 +1124 3 377.9238 391.4951 19.4766 0.1652 1123 +1125 3 379.0518 391.6759 19.4762 0.178 1124 +1126 3 380.1798 391.7822 19.5452 0.2161 1125 +1127 3 381.2083 391.7159 19.5652 0.2034 1126 +1128 3 382.1726 391.7662 19.6695 0.178 1127 +1129 3 383.2457 391.9905 19.8845 0.1652 1128 +1130 3 384.3817 392.0488 20.0929 0.1907 1129 +1131 3 385.48 391.9767 20.3231 0.2161 1130 +1132 3 386.434 392.0259 20.3778 0.2288 1131 +1133 3 387.3744 392.5602 20.4951 0.2161 1132 +1134 3 388.2828 393.0464 20.5096 0.2161 1133 +1135 3 389.2334 393.6424 20.4527 0.2161 1134 +1136 3 390.1097 394.3254 20.4748 0.2542 1135 +1137 3 391.1325 394.7246 20.5796 0.2796 1136 +1138 3 392.0133 395.4064 20.6886 0.2924 1137 +1139 3 393.0761 395.7771 20.7928 0.2542 1138 +1140 3 394.0405 395.9224 20.8632 0.1907 1139 +1141 3 395.1193 396.1523 20.9177 0.1525 1140 +1142 3 396.237 396.2816 20.8521 0.1525 1141 +1143 3 397.3421 396.1672 20.8145 0.1907 1142 +1144 3 398.3351 396.0082 20.6202 0.2034 1143 +1145 3 399.4047 395.7176 20.4589 0.1907 1144 +1146 3 400.1929 395.1456 20.2086 0.1652 1145 +1147 3 401.3369 395.1376 20.0206 0.1525 1146 +1148 3 402.4134 394.807 19.8931 0.1525 1147 +1149 3 403.3389 394.8756 19.9549 0.1525 1148 +1150 3 404.3228 394.3334 19.9747 0.178 1149 +1151 3 405.3009 393.7614 19.9515 0.2034 1150 +1152 3 406.2447 393.3678 19.8199 0.2161 1151 +1153 3 407.0055 393.1928 19.725 0.1907 1152 +1154 3 407.5958 393.1528 19.3499 0.1652 1153 +1155 3 408.543 392.7352 18.9755 0.1525 1154 +1156 3 409.6412 392.9514 18.6439 0.1652 1155 +1157 3 410.7852 392.964 18.393 0.2034 1156 +1158 3 411.9006 393.075 18.1576 0.2415 1157 +1159 3 412.9199 393.2271 18.0737 0.2415 1158 +1160 3 413.6704 393.3507 18.0688 0.1907 1159 +1161 3 414.5936 393.3072 17.9672 0.1652 1160 +1162 3 415.7319 393.2786 17.8797 0.1652 1161 +1163 3 416.8393 393.1928 17.8559 0.2161 1162 +1164 3 417.7945 393.4216 18.009 0.2415 1163 +1165 3 418.6651 393.3667 17.9108 0.2924 1164 +1166 3 419.7473 393.0784 17.8544 0.2924 1165 +1167 3 420.8284 393.0933 17.7585 0.2796 1166 +1168 3 421.7276 393.2431 17.7549 0.2288 1167 +1169 3 422.7091 393.29 17.5565 0.2034 1168 +1170 3 423.5614 392.9823 17.4204 0.1907 1169 +1171 3 424.6379 392.8496 17.2933 0.2034 1170 +1172 3 425.2694 392.6643 16.9705 0.2288 1171 +1173 3 426.0942 392.1643 16.5892 0.2669 1172 +1174 3 426.1434 391.407 16.1474 0.2924 1173 +1175 3 426.9763 390.8533 15.9284 0.2924 1174 +1176 3 427.9349 390.4541 15.7711 0.2669 1175 +1177 3 428.8547 390.0651 15.8837 0.2161 1176 +1178 3 429.8992 389.9896 16.2134 0.1907 1177 +1179 3 430.8304 390.2184 17.36 0.1907 1178 +1180 3 328.2433 375.4802 28.4889 0.2161 1060 +1181 3 328.7753 374.6692 29.927 0.178 1180 +1182 3 328.6712 374.3557 30.6424 0.1907 1181 +1183 3 329.1345 373.476 31.3424 0.2034 1182 +1184 3 329.2707 372.4509 31.9715 0.2669 1183 +1185 3 330.0108 371.7371 32.615 0.2796 1184 +1186 3 330.9455 371.1182 33.1386 0.2924 1185 +1187 3 331.4031 370.537 33.5846 0.2415 1186 +1188 3 331.4305 369.4994 33.9388 0.2415 1187 +1189 3 331.4099 368.3897 34.2289 0.2415 1188 +1190 3 330.926 367.4837 34.5817 0.2542 1189 +1191 3 330.6743 366.4026 34.9527 0.2161 1190 +1192 3 330.7167 365.3375 35.4015 0.1652 1191 +1193 3 330.5016 364.3262 35.8991 0.1398 1192 +1194 3 330.0657 363.7188 36.1648 0.1398 1193 +1195 3 329.5269 362.8585 36.5929 0.1652 1194 +1196 3 329.1013 362.3483 37.2929 0.1907 1195 +1197 3 328.3646 361.8083 37.8815 0.2415 1196 +1198 3 327.6473 361.1402 38.3998 0.2669 1197 +1199 3 326.7847 360.5899 38.831 0.2669 1198 +1200 3 325.9656 360.2605 39.3246 0.2161 1199 +1201 3 325.3536 359.963 39.746 0.1907 1200 +1202 3 324.5963 359.2263 40.1156 0.1652 1201 +1203 3 323.5953 358.7893 40.504 0.1652 1202 +1204 3 323.5827 358.485 41.2 0.1398 1203 +1205 3 322.9512 357.762 41.8113 0.1398 1204 +1206 3 322.6538 357.1568 42.5743 0.1652 1205 +1207 3 322.0326 356.6695 43.4902 0.2034 1206 +1208 3 321.9216 355.538 44.3153 0.2288 1207 +1209 3 322.3792 354.9889 45.1766 0.2034 1208 +1210 3 322.2225 354.6389 46.291 0.1907 1209 +1211 3 321.5086 354.1778 47.4001 0.1652 1210 +1212 3 321.1094 353.4605 48.5386 0.1652 1211 +1213 3 320.7707 353.2672 49.7728 0.1398 1212 +1214 3 319.748 353.0384 51.8 0.1398 1213 +1215 3 324.1158 376.376 28.849 0.4576 1055 +1216 3 324.761 376.0294 27.3397 0.2796 1215 +1217 3 324.435 375.6713 26.6316 0.2288 1216 +1218 3 325.0104 375.4608 25.7059 0.1907 1217 +1219 3 325.492 375.232 25.1487 0.2034 1218 +1220 3 326.0812 375.0879 24.8377 0.2288 1219 +1221 3 326.5308 374.7744 24.2382 0.2542 1220 +1222 3 326.7893 374.5834 23.3485 0.2542 1221 +1223 3 326.8145 375.1222 22.2912 0.2288 1222 +1224 3 327.5203 375.3464 21.174 0.1907 1223 +1225 3 328.5751 375.232 20.3301 0.1907 1224 +1226 3 329.3954 374.7824 19.8917 0.2161 1225 +1227 3 329.9605 373.8935 19.6917 0.2415 1226 +1228 3 330.8414 373.7448 19.4887 0.2288 1227 +1229 3 331.6456 374.1074 19.4594 0.2034 1228 +1230 3 332.3755 374.4667 19.5418 0.2034 1229 +1231 3 332.5677 374.1509 19.7905 0.2415 1230 +1232 3 333.3708 374.0914 20.2338 0.2796 1231 +1233 3 333.9862 373.4096 20.5382 0.2924 1232 +1234 3 334.342 372.8365 21.0667 0.2415 1233 +1235 3 334.9724 372.6008 21.7393 0.1907 1234 +1236 3 336.1072 372.6008 22.96 0.178 1235 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc new file mode 100644 index 0000000..4fe67b4 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc @@ -0,0 +1,1250 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/February 2015/169125.03.01.01/reconstructions/Pvalb-IRES-Cre; Ai14(IVSCC)-169125.03.01.01.DS.swc +# id,type,x,y,z,r,pid +1 1 312.0832 372.8296 27.44 5.1972 -1 +2 3 310.5926 376.7913 27.4061 0.2161 1 +3 3 310.5274 377.8643 27.3406 0.2796 2 +4 3 310.6829 378.9637 26.7414 0.2924 3 +5 3 310.6372 380.0368 25.7981 0.2542 4 +6 3 310.1784 380.9817 26.6462 0.2161 5 +7 3 309.7906 381.945 27.8124 0.1907 6 +8 3 309.6373 383.0558 27.412 0.1907 7 +9 3 308.9521 383.9264 26.7898 0.2288 8 +10 3 308.0803 384.6437 26.3326 0.2796 9 +11 3 307.3013 385.4811 26.2685 0.3686 10 +12 3 306.6515 386.418 26.0495 0.4576 11 +13 3 306.163 386.8493 25.4593 0.2542 12 +14 3 305.2078 387.4522 25.2165 0.2415 13 +15 3 304.1713 387.935 25.1997 0.2415 14 +16 3 303.1646 388.4772 25.1983 0.2034 15 +17 3 302.6612 389.4794 25.1899 0.2415 16 +18 3 302.0526 390.4449 25.1437 0.2669 17 +19 3 301.1488 391.113 24.7388 0.3051 18 +20 3 300.2908 391.8269 24.1321 0.2669 19 +21 3 299.3196 392.4252 24.0517 0.2542 20 +22 3 298.2831 392.9057 23.9078 0.2542 21 +23 3 297.186 392.9846 23.1896 0.3178 22 +24 3 296.0592 393.1093 22.8334 0.3178 23 +25 3 295.0021 393.4719 22.2421 0.3051 24 +26 3 293.9371 393.8781 22.4277 0.2415 25 +27 3 292.9361 394.3848 22.9662 0.2161 26 +28 3 292.4899 394.9992 22.9832 0.2161 27 +29 3 291.9008 395.9762 23.1025 0.2034 28 +30 3 291.2498 396.8708 23.7213 0.2288 29 +31 3 290.5634 397.7688 24.0411 0.2415 30 +32 3 289.8049 398.6234 24.0806 0.2669 31 +33 3 288.9069 399.3235 24.0828 0.2796 32 +34 3 288.05 400.0785 24.0904 0.2796 33 +35 3 287.2355 400.8816 24.1237 0.3051 34 +36 3 286.429 401.6904 24.2673 0.2924 35 +37 3 285.6545 402.4855 24.8928 0.2924 36 +38 3 284.9018 403.3321 25.1149 0.2415 37 +39 3 284.2554 404.2564 24.7358 0.2415 38 +40 3 283.5427 405.1282 24.2746 0.2669 39 +41 3 282.6424 405.7802 24.6834 0.3305 40 +42 3 281.8976 406.5742 25.4755 0.3432 41 +43 3 281.2192 407.4836 25.5206 0.3305 42 +44 3 280.3715 408.2387 25.2538 0.3051 43 +45 3 279.5433 409.0258 25.2843 0.3178 44 +46 3 278.7242 409.8083 25.6662 0.3178 45 +47 3 277.8204 410.4638 26.264 0.3051 46 +48 3 276.9144 411.1582 26.3071 0.2796 47 +49 3 275.99 411.832 26.2576 0.2669 48 +50 3 275.0862 412.523 25.9955 0.2796 49 +51 3 274.3198 413.3215 25.3011 0.3051 50 +52 3 273.7043 414.2813 25.2031 0.3432 51 +53 3 273.2352 415.3235 25.2 0.3813 52 +54 3 272.6312 416.2947 25.2 0.3813 53 +55 3 272.0638 417.2877 25.2 0.3686 54 +56 3 271.3637 418.1915 25.1997 0.3178 55 +57 3 270.7059 419.1284 25.1983 0.3051 56 +58 3 270.0423 420.0596 25.1919 0.3051 57 +59 3 269.3731 420.9874 25.1605 0.3559 58 +60 3 268.586 421.8157 25.0281 0.3813 59 +61 3 267.8001 422.5936 24.3247 0.3813 60 +62 3 266.9776 423.3807 24.0618 0.3432 61 +63 3 266.0761 424.0842 23.9635 0.3051 62 +64 3 265.1609 424.7066 23.259 0.2542 63 +65 3 264.2091 425.3117 22.7979 0.2161 64 +66 3 263.39 426.0634 22.9298 0.2034 65 +67 3 262.4485 426.3825 24.1791 0.2415 66 +68 3 261.4246 426.879 24.4507 0.2542 67 +69 3 260.395 427.3572 24.6235 0.2542 68 +70 3 259.3414 427.7485 24.5118 0.2288 69 +71 3 258.2923 428.0265 24.6938 0.2542 70 +72 3 257.392 428.5435 23.7191 0.2924 71 +73 3 256.6942 428.9554 24.3012 0.3305 72 +74 3 255.9357 429.7276 24.64 0.3305 73 +75 3 255.009 430.2584 24.6344 0.3178 74 +76 3 254.1831 430.6634 23.6824 0.3051 75 +77 3 253.4395 431.3852 23.7252 0.3051 76 +78 3 252.5277 431.884 24.5468 0.2796 77 +79 3 251.7738 432.3588 23.6477 0.2415 78 +80 3 250.6882 432.5556 23.6606 0.2161 79 +81 3 249.8427 432.9193 24.5949 0.2415 80 +82 3 249.2787 433.8025 24.9186 0.2924 81 +83 3 248.7285 434.3962 23.8501 0.3178 82 +84 3 248.1485 435.3538 23.8171 0.2924 83 +85 3 247.668 436.1122 22.9415 0.2415 84 +86 3 247.0262 436.9714 22.675 0.1907 85 +87 3 246.2517 437.4587 24.2332 0.178 86 +88 3 245.5562 438.0468 24.8853 0.178 87 +89 3 245.134 438.883 24.1363 0.2034 88 +90 3 244.4739 439.6072 24.2189 0.2034 89 +91 3 243.7864 440.4022 23.6132 0.2034 90 +92 3 243.7098 441.2465 22.68 0.2034 91 +93 3 243.1275 441.8002 24.0089 0.2161 92 +94 3 242.9478 442.8413 23.6141 0.2161 93 +95 3 242.6138 443.8125 23.9828 0.178 94 +96 3 242.1299 444.6373 23.2663 0.1398 95 +97 3 241.2925 445.3638 23.4889 0.1271 96 +98 3 240.4253 445.4736 22.202 0.1398 97 +99 3 239.7824 446.0433 21.0 0.1525 98 +100 3 239.4335 446.732 21.884 0.1525 99 +101 3 238.818 447.4481 22.6209 0.1525 100 +102 3 237.7221 447.6506 22.398 0.1525 101 +103 3 236.9979 448.4366 21.6418 0.1398 102 +104 3 236.3058 449.3312 21.5261 0.1398 103 +105 3 235.6834 450.0702 21.7196 0.1398 104 +106 3 234.8907 450.8378 21.84 0.1652 105 +107 3 234.2695 451.3938 21.8378 0.1652 106 +108 3 233.6059 452.2896 21.56 0.1652 107 +109 3 232.7434 452.8227 21.56 0.1525 108 +110 3 231.835 453.4747 21.8126 0.178 109 +111 3 230.9301 454.0753 22.1673 0.2161 110 +112 3 229.9703 454.6027 21.7403 0.2542 111 +113 3 228.9716 454.8544 21.7193 0.2415 112 +114 3 227.9523 454.5226 22.12 0.2034 113 +115 3 227.0405 454.7366 22.96 0.1525 114 +116 3 226.3587 455.4573 22.96 0.1271 115 +117 3 225.5636 456.1849 22.96 0.1144 116 +118 3 224.6953 456.925 22.96 0.1271 117 +119 3 223.9014 457.5966 23.2285 0.1398 118 +120 3 223.5399 458.6731 23.24 0.1525 119 +121 3 222.8787 459.4556 22.965 0.1525 120 +122 3 221.8399 459.7736 23.5074 0.1652 121 +123 3 220.9453 460.2884 23.6846 0.178 122 +124 3 220.3905 461.2459 24.0321 0.178 123 +125 3 219.7624 461.7253 25.1622 0.1525 124 +126 3 219.7624 462.8521 25.4906 0.1271 125 +127 3 219.6011 463.94 26.1092 0.1144 126 +128 3 218.9627 464.798 26.5496 0.1144 127 +129 3 218.401 465.6538 27.594 0.1144 128 +130 3 217.7101 466.3127 28.0 0.1144 129 +131 3 217.1381 467.2794 28.1078 0.1525 130 +132 3 217.1312 468.3536 28.0 0.1907 131 +133 3 292.6455 393.8414 22.9662 0.2924 27 +134 3 292.0746 392.8542 22.9704 0.2924 133 +135 3 291.2876 392.0408 23.0171 0.2924 134 +136 3 290.2534 391.6084 23.2767 0.2669 135 +137 3 289.1517 391.4962 23.949 0.2669 136 +138 3 288.0489 391.2583 24.3723 0.2288 137 +139 3 286.9461 391.1222 25.0146 0.2288 138 +140 3 285.8227 391.0581 25.4668 0.2034 139 +141 3 284.7485 390.7835 26.0232 0.1907 140 +142 3 283.7189 390.3259 26.1685 0.1907 141 +143 3 282.5897 390.1784 26.0893 0.2161 142 +144 3 281.4812 389.985 26.3085 0.2542 143 +145 3 280.4322 389.5297 26.2489 0.2542 144 +146 3 279.3785 389.238 25.7748 0.2415 145 +147 3 278.3855 388.992 25.1258 0.2415 146 +148 3 277.515 388.3937 25.8048 0.2288 147 +149 3 276.5689 388.0963 26.8097 0.2288 148 +150 3 275.6582 387.6215 26.88 0.2288 149 +151 3 274.7751 387.816 26.1974 0.2669 150 +152 3 273.7821 387.6661 25.9529 0.2796 151 +153 3 272.7708 387.4362 26.04 0.2796 152 +154 3 272.097 387.0964 27.4336 0.2542 153 +155 3 271.7 386.7498 25.6819 0.2542 154 +156 3 270.6979 386.4661 25.48 0.2542 155 +157 3 269.706 386.3185 26.3113 0.2669 156 +158 3 269.1146 385.9684 25.0883 0.2669 157 +159 3 268.395 385.2466 24.8786 0.2415 158 +160 3 267.688 384.6414 25.4072 0.2288 159 +161 3 266.9867 384.2776 23.8 0.2161 160 +162 3 266.1276 383.6164 23.9599 0.2542 161 +163 3 265.2947 382.9071 24.575 0.2924 162 +164 3 264.4482 382.5948 23.8286 0.3305 163 +165 3 263.6359 382.0331 23.5626 0.3305 164 +166 3 263.0308 381.1465 24.0075 0.3051 165 +167 3 262.2929 380.3731 23.2772 0.2542 166 +168 3 261.5184 379.562 23.56 0.2161 167 +169 3 260.7336 378.9935 24.5227 0.2034 168 +170 3 259.8928 378.4661 23.4346 0.2288 169 +171 3 259.1961 377.7923 22.68 0.2415 170 +172 3 258.4525 377.2248 22.9205 0.2415 171 +173 3 257.4252 377.0544 23.24 0.2161 172 +174 3 256.6392 376.4538 22.6789 0.2034 173 +175 3 255.819 375.7788 22.3219 0.178 174 +176 3 255.2115 375.343 22.094 0.1907 175 +177 3 254.1808 375.3041 21.887 0.2288 176 +178 3 253.0814 375.4002 21.9601 0.2796 177 +179 3 251.9706 375.5054 22.1746 0.2796 178 +180 3 250.9204 375.8543 22.6898 0.2288 179 +181 3 250.1322 375.9333 21.784 0.178 180 +182 3 249.2273 375.5752 21.1434 0.1907 181 +183 3 249.0053 375.5752 18.7698 0.2288 182 +184 3 248.3109 376.058 18.4478 0.2542 183 +185 3 247.4529 375.8463 19.32 0.2161 184 +186 3 246.4073 375.4356 19.32 0.2034 185 +187 3 245.3972 375.0215 19.5734 0.2288 186 +188 3 244.9087 375.3578 19.7109 0.2796 187 +189 3 243.9694 375.2743 18.8563 0.3051 188 +190 3 242.9124 374.9826 18.613 0.3051 189 +191 3 242.1734 374.8259 20.1127 0.3051 190 +192 3 241.3703 374.1646 19.4435 0.2924 191 +193 3 240.2606 374.088 19.2363 0.2796 192 +194 3 239.2436 373.8169 19.8934 0.2669 193 +195 3 238.6384 373.508 19.1668 0.2542 194 +196 3 237.904 372.9074 19.3164 0.2415 195 +197 3 237.2748 372.0917 19.1453 0.2161 196 +198 3 236.816 371.3447 18.1594 0.2034 197 +199 3 235.8585 370.8345 17.4675 0.1652 198 +200 3 234.83 370.4764 16.611 0.1398 199 +201 3 233.8016 370.1183 15.7545 0.1144 200 +202 3 232.9848 369.4537 15.4 0.1144 201 +203 3 232.6896 368.4755 15.4 0.1144 202 +204 3 232.6896 367.3315 15.4 0.1144 203 +205 3 232.6164 366.191 15.4 0.1144 204 +206 3 232.3681 365.1797 15.4 0.1271 205 +207 3 231.2665 364.8777 15.4 0.1398 206 +208 3 230.8592 363.9064 15.4 0.178 207 +209 3 230.8592 362.7624 15.4 0.1907 208 +210 3 306.4433 388.0608 26.5065 0.2542 12 +211 3 306.0303 389.111 26.4446 0.2542 210 +212 3 305.7065 390.1875 26.502 0.2288 211 +213 3 305.5144 391.28 27.1065 0.2415 212 +214 3 305.0545 392.273 27.7141 0.2288 213 +215 3 304.463 393.2077 28.4032 0.2669 214 +216 3 303.7217 393.9902 29.2457 0.2669 215 +217 3 302.7859 394.6034 29.6803 0.3051 216 +218 3 301.8112 395.1765 30.0818 0.3178 217 +219 3 300.864 395.7771 30.6298 0.3305 218 +220 3 300.0518 396.5596 30.8322 0.3178 219 +221 3 299.537 397.5617 30.9798 0.2924 220 +222 3 299.0576 398.5662 31.5577 0.2796 221 +223 3 298.4707 399.5317 31.9015 0.2415 222 +224 3 297.686 400.3497 32.0855 0.2288 223 +225 3 296.987 401.1951 32.7701 0.2288 224 +226 3 296.598 402.2407 33.1243 0.2796 225 +227 3 296.4939 403.3481 33.6806 0.2924 226 +228 3 296.2994 404.4566 34.1166 0.2669 227 +229 3 295.867 405.5068 34.3272 0.2034 228 +230 3 295.5867 406.4861 35.4684 0.2034 229 +231 3 295.2458 407.5168 36.2978 0.2415 230 +232 3 294.6704 408.4949 36.4008 0.3051 231 +233 3 294.2105 409.5406 36.4048 0.3178 232 +234 3 293.7895 410.6045 36.4274 0.3305 233 +235 3 293.3662 411.6661 36.5674 0.3305 234 +236 3 293.0402 412.7106 37.343 0.3432 235 +237 3 292.3801 413.4771 38.5918 0.3432 236 +238 3 291.5038 413.6624 40.2956 0.3432 237 +239 3 290.7751 414.2024 41.9924 0.3178 238 +240 3 290.1562 414.9528 43.4591 0.2924 239 +241 3 289.5887 415.82 44.24 0.2542 240 +242 3 288.7422 416.3062 44.24 0.2415 241 +243 3 287.8361 416.7935 44.1582 0.2161 242 +244 3 287.2172 417.4033 44.1952 0.1907 243 +245 3 286.7036 418.3802 44.2963 0.1907 244 +246 3 285.7895 418.9031 44.8767 0.2161 245 +247 3 285.1042 419.602 45.36 0.2542 246 +248 3 284.316 420.2187 44.8 0.2415 247 +249 3 283.5976 420.8032 45.6084 0.1907 248 +250 3 282.9181 421.5949 45.7148 0.1398 249 +251 3 282.3998 422.3785 45.0178 0.1144 250 +252 3 282.2282 423.4596 44.6365 0.1144 251 +253 3 282.1104 424.5087 43.7388 0.1271 252 +254 3 282.1573 425.5932 43.9438 0.1652 253 +255 3 282.1596 426.2487 45.1063 0.2161 254 +256 3 282.3014 427.3218 44.8 0.2669 255 +257 3 309.8341 368.9766 27.3356 0.3432 1 +258 3 309.7941 367.8692 26.7624 0.4195 257 +259 3 309.7906 366.7401 26.3228 0.4703 258 +260 3 309.7643 365.5972 26.1934 0.483 259 +261 3 309.5847 364.499 25.5623 0.483 260 +262 3 309.0813 363.4797 25.3084 0.4449 261 +263 3 308.499 362.5119 25.7272 0.3813 262 +264 3 308.1044 361.464 26.2956 0.3432 263 +265 3 307.6548 360.4126 26.3197 0.3432 264 +266 3 307.4878 359.2812 26.32 0.3813 265 +267 3 307.3768 358.1418 26.32 0.394 266 +268 3 307.0748 357.039 26.3197 0.3559 267 +269 3 307.0496 355.8973 26.3172 0.3051 268 +270 3 307.0507 354.7533 26.2984 0.2542 269 +271 3 307.0553 353.6104 26.1772 0.2034 270 +272 3 307.0828 352.6105 25.5343 0.3432 271 +273 3 307.283 351.4997 25.1034 0.3559 272 +274 3 307.4809 350.4026 24.4773 0.3559 273 +275 3 307.3997 349.2735 24.096 0.3305 274 +276 3 307.0027 348.2039 24.0856 0.3432 275 +277 3 306.5405 347.1571 24.1139 0.3559 276 +278 3 306.0269 346.1366 24.2662 0.3813 277 +279 3 305.424 345.2009 24.9024 0.3686 278 +280 3 304.7788 344.2639 25.1969 0.3559 279 +281 3 304.1507 343.3075 25.2 0.3432 280 +282 3 303.5684 342.3226 25.2 0.3432 281 +283 3 303.0387 341.309 25.1994 0.3432 282 +284 3 302.4747 340.3137 25.1966 0.3305 283 +285 3 302.6303 339.8584 26.0229 0.3051 284 +286 3 302.5056 338.7967 25.7527 0.2924 285 +287 3 302.2574 337.8552 25.8852 0.2669 286 +288 3 302.3592 336.7742 26.4726 0.2415 287 +289 3 302.1647 335.7125 26.32 0.2288 288 +290 3 302.0995 334.7538 25.76 0.2288 289 +291 3 301.6705 333.778 26.2718 0.2415 290 +292 3 301.6728 332.7324 25.7723 0.2542 291 +293 3 301.5584 331.8755 26.01 0.2796 292 +294 3 301.2175 330.9089 26.7624 0.2924 293 +295 3 301.317 329.8655 25.8532 0.3178 294 +296 3 300.9143 329.1608 26.6 0.1144 295 +297 3 300.9349 328.1186 25.6236 0.1271 296 +298 3 300.9864 327.0124 25.0527 0.1398 297 +299 3 300.9761 325.8707 24.92 0.178 298 +300 3 300.7519 324.9612 26.04 0.2034 299 +301 3 300.1227 324.221 25.48 0.2415 300 +302 3 300.0712 323.1663 25.8308 0.2415 301 +303 3 300.0243 322.06 25.9627 0.2669 302 +304 3 300.1902 320.9686 26.1288 0.2924 303 +305 3 300.4899 319.9905 25.2162 0.3178 304 +306 3 300.745 318.9255 24.6338 0.2924 305 +307 3 301.1809 317.8913 24.36 0.2415 306 +308 3 301.3868 316.8056 24.08 0.2288 307 +309 3 301.3719 315.8767 25.3949 0.2542 308 +310 3 301.1431 314.7796 25.7961 0.3051 309 +311 3 300.904 313.6905 26.2492 0.3305 310 +312 3 300.5322 312.7662 27.1765 0.3305 311 +313 3 299.9511 311.9585 26.7476 0.3178 312 +314 3 299.5267 311.2366 27.16 0.2924 313 +315 3 298.7281 310.5777 26.3374 0.2924 314 +316 3 297.9708 309.9611 26.717 0.2669 315 +317 3 297.4217 309.0688 26.2268 0.2669 316 +318 3 297.1986 308.2039 25.4047 0.2415 317 +319 3 296.5957 307.3631 25.2 0.2415 318 +320 3 296.4653 306.3815 25.5682 0.2161 319 +321 3 296.0066 305.5144 26.04 0.1907 320 +322 3 295.4929 304.6689 26.7464 0.1652 321 +323 3 294.8077 303.978 26.1408 0.1398 322 +324 3 294.1567 303.4826 26.7235 0.1271 323 +325 3 294.1293 302.6406 28.2878 0.1271 324 +326 3 294.2368 301.5744 28.1999 0.1652 325 +327 3 293.8375 301.1649 26.32 0.2161 326 +328 3 293.015 300.4899 26.6 0.2542 327 +329 3 293.0928 299.3962 27.0323 0.2669 328 +330 3 293.0207 298.3426 26.6 0.2796 329 +331 3 292.8995 297.2798 26.9385 0.3178 330 +332 3 292.7885 296.2102 27.4229 0.3305 331 +333 3 292.5128 295.2058 26.9578 0.3305 332 +334 3 291.9625 294.5697 27.72 0.2796 333 +335 3 291.4512 293.7083 27.44 0.2796 334 +336 3 291.2475 292.6489 27.9812 0.2542 335 +337 3 291.2349 291.7761 26.7338 0.2542 336 +338 3 291.9076 291.72 25.48 0.2161 337 +339 3 292.3069 291.2361 23.9173 0.2288 338 +340 3 291.9785 290.1939 24.0724 0.2542 339 +341 3 291.8252 289.4995 25.5035 0.2796 340 +342 3 292.2897 288.7525 25.48 0.2669 341 +343 3 292.3492 287.7686 26.1618 0.2415 342 +344 3 292.1696 286.8466 26.2441 0.2415 343 +345 3 292.4064 286.2196 26.5037 0.2415 344 +346 3 292.4064 285.5092 25.0272 0.2415 345 +347 3 292.5208 284.4133 24.64 0.2415 346 +348 3 292.8926 283.7463 25.8023 0.2924 347 +349 3 293.0013 283.1434 27.8916 0.3305 348 +350 3 293.1592 282.1047 27.8317 0.3559 349 +351 3 292.8411 281.5464 28.7456 0.3305 350 +352 3 292.6764 281.0568 30.2599 0.3178 351 +353 3 293.0436 280.1496 31.0741 0.2924 352 +354 3 293.5378 279.3351 30.5595 0.2796 353 +355 3 294.0252 278.604 31.1926 0.2796 354 +356 3 294.9266 278.0378 31.309 0.2924 355 +357 3 295.8224 277.4955 30.8216 0.2924 356 +358 3 296.8074 277.0024 30.8904 0.2669 357 +359 3 297.8427 276.7267 30.52 0.2288 358 +360 3 298.4822 276.371 31.08 0.2161 359 +361 3 299.3024 275.7646 31.08 0.2034 360 +362 3 299.8035 274.9547 31.0453 0.2161 361 +363 3 300.0357 275.1148 29.0368 0.1907 362 +364 3 300.5048 274.4765 27.8421 0.1907 363 +365 3 300.7576 274.242 29.6722 0.1652 364 +366 3 300.7931 273.4675 30.5452 0.1652 365 +367 3 300.6432 273.0019 28.6852 0.1398 366 +368 3 301.0676 272.844 26.9069 0.1271 367 +369 3 301.317 271.9666 26.1671 0.1144 368 +370 3 301.5584 271.4117 26.6 0.1271 369 +371 3 301.6442 270.2826 26.6596 0.1525 370 +372 3 301.6728 269.2175 27.4072 0.1907 371 +373 3 301.8341 268.8308 29.7044 0.2034 372 +374 3 302.6612 268.2932 30.42 0.1907 373 +375 3 303.581 267.72 30.5497 0.1525 374 +376 3 304.4985 267.3093 29.8306 0.1271 375 +377 3 305.5716 266.9581 29.6887 0.1144 376 +378 3 306.5634 266.4742 29.4 0.1271 377 +379 3 306.9478 265.7981 30.24 0.1398 378 +380 3 307.6399 264.9195 30.24 0.1652 379 +381 3 308.0792 264.0341 30.2403 0.1907 380 +382 3 308.7587 263.2195 30.7994 0.2288 381 +383 3 309.6328 262.7413 29.9695 0.2669 382 +384 3 310.596 262.3192 30.24 0.2924 383 +385 3 301.7803 329.2398 25.1208 0.2669 295 +386 3 302.6292 328.6048 25.1552 0.3051 385 +387 3 303.0731 327.8567 23.6205 0.3305 386 +388 3 303.3064 326.9083 23.9865 0.3559 387 +389 3 303.692 326.0823 23.6636 0.3178 388 +390 3 304.0706 325.3319 23.5407 0.2796 389 +391 3 304.5065 324.3457 23.8202 0.2161 390 +392 3 304.8554 323.3699 22.9236 0.1907 391 +393 3 304.3212 322.4764 22.5865 0.2161 392 +394 3 304.0683 321.6722 22.3101 0.3051 393 +395 3 304.5328 320.9698 21.7448 0.3813 394 +396 3 304.9149 320.01 22.6696 0.3813 395 +397 3 304.9664 318.9403 22.0805 0.3178 396 +398 3 305.3874 317.9233 21.56 0.2669 397 +399 3 305.7569 316.848 21.7216 0.2924 398 +400 3 305.9079 315.8332 21.6532 0.3559 399 +401 3 305.7615 314.8402 21.56 0.3813 400 +402 3 305.7043 314.0086 20.1015 0.3432 401 +403 3 305.7226 312.9504 19.8926 0.3178 402 +404 3 306.3243 312.1598 19.6 0.3432 403 +405 3 306.6938 311.136 20.102 0.394 404 +406 3 306.4776 310.048 19.6238 0.3813 405 +407 3 306.2728 309.1752 18.7606 0.3432 406 +408 3 305.9536 308.5906 17.3617 0.3051 407 +409 3 306.2271 307.728 18.4929 0.3178 408 +410 3 306.3003 307.1571 19.88 0.3178 409 +411 3 306.2202 306.2385 19.4522 0.3305 410 +412 3 305.8324 305.472 18.692 0.3051 411 +413 3 306.0543 304.6483 17.0626 0.2669 412 +414 3 305.9125 303.7331 16.1081 0.1907 413 +415 3 306.3277 303.2332 17.9668 0.1398 414 +416 3 306.5028 302.3924 17.1954 0.1398 415 +417 3 306.6847 301.6236 15.4 0.1907 416 +418 3 306.4776 300.5402 14.8081 0.2669 417 +419 3 306.4021 299.5415 13.7206 0.3178 418 +420 3 306.6481 298.4707 14.2313 0.3432 419 +421 3 307.1548 297.4983 13.6046 0.3432 420 +422 3 307.5083 296.4276 13.433 0.3305 421 +423 3 308.0392 295.7034 14.5746 0.2924 422 +424 3 308.1261 294.7299 15.6968 0.2415 423 +425 3 308.3172 294.3867 18.051 0.1907 424 +426 3 308.5379 293.8272 18.3327 0.1652 425 +427 3 308.6478 293.0402 19.8005 0.1398 426 +428 3 308.9944 292.1776 19.32 0.1271 427 +429 3 301.7563 339.7005 25.1784 0.2161 284 +430 3 300.7198 339.2406 25.0488 0.2415 429 +431 3 299.8596 338.5531 24.4076 0.2669 430 +432 3 299.2475 337.6127 24.6694 0.2924 431 +433 3 298.584 336.7032 24.2603 0.3051 432 +434 3 298.1012 335.669 24.1738 0.3178 433 +435 3 297.4766 334.7241 24.5151 0.3432 434 +436 3 296.8074 333.8272 25.0947 0.3686 435 +437 3 295.9677 333.055 25.1944 0.3432 436 +438 3 295.1497 332.2554 25.1891 0.2796 437 +439 3 294.58 331.2658 25.1412 0.2161 438 +440 3 293.8501 330.3941 24.841 0.2161 439 +441 3 292.9281 329.79 24.1032 0.2669 440 +442 3 291.9122 329.2649 24.0794 0.2924 441 +443 3 291.0954 328.4641 24.0778 0.2924 442 +444 3 290.3941 327.6359 24.0705 0.3305 443 +445 3 289.9731 326.5754 24.0218 0.3432 444 +446 3 289.5922 325.508 23.6622 0.3051 445 +447 3 289.106 324.4739 23.7756 0.2542 446 +448 3 288.5031 323.5049 23.9355 0.2415 447 +449 3 287.9848 322.5348 23.1792 0.2669 448 +450 3 287.4334 321.5361 22.9522 0.2796 449 +451 3 286.8923 320.5294 22.9141 0.2924 450 +452 3 286.2116 319.6176 22.7242 0.2796 451 +453 3 285.3342 318.9369 22.0601 0.2924 452 +454 3 284.5483 318.1338 21.6026 0.2796 453 +455 3 284.0644 317.1328 20.9616 0.3178 454 +456 3 283.6754 316.0609 20.7477 0.3432 455 +457 3 283.2533 315.0096 20.9504 0.3686 456 +458 3 282.751 314.131 21.5046 0.3178 457 +459 3 282.099 313.6791 20.1116 0.2669 458 +460 3 281.1414 313.1506 19.8066 0.2415 459 +461 3 280.5111 312.9858 18.4475 0.2796 460 +462 3 279.9883 312.4344 20.0788 0.3051 461 +463 3 279.1726 311.8727 19.88 0.3178 462 +464 3 278.2094 311.3465 19.4373 0.3051 463 +465 3 277.2335 310.874 19.6932 0.3051 464 +466 3 276.2577 310.342 19.3332 0.2924 465 +467 3 275.4512 309.7449 19.7425 0.2924 466 +468 3 274.9089 308.9761 18.7628 0.3051 467 +469 3 274.7613 307.982 18.7228 0.3305 468 +470 3 273.9949 307.4958 18.8647 0.3432 469 +471 3 273.5144 306.7899 19.5331 0.3305 470 +472 3 272.7399 306.1367 19.32 0.3178 471 +473 3 272.4093 305.3805 18.76 0.2924 472 +474 3 271.5158 304.8314 18.6668 0.2669 473 +475 3 270.834 304.3749 18.5816 0.2415 474 +476 3 270.7082 303.5444 17.3958 0.2161 475 +477 3 270.7139 302.4542 17.08 0.2161 476 +478 3 270.556 301.6739 18.9095 0.2161 477 +479 3 270.2174 300.8331 19.88 0.2415 478 +480 3 270.9656 300.2531 19.3606 0.2669 479 +481 3 271.0102 299.3917 18.7132 0.3305 480 +482 3 270.8317 298.4341 18.4951 0.3686 481 +483 3 270.7402 297.4068 18.2034 0.3686 482 +484 3 269.9657 296.7433 17.8536 0.3051 483 +485 3 269.5744 295.7663 17.6047 0.2542 484 +486 3 269.5275 294.842 17.9556 0.2415 485 +487 3 268.7084 294.572 17.1433 0.2542 486 +488 3 268.1616 294.0114 16.5211 0.2669 487 +489 3 267.2498 293.5698 16.3058 0.2924 488 +490 3 266.2866 293.3811 16.2333 0.2924 489 +491 3 265.7706 292.5139 16.1266 0.2924 490 +492 3 265.2719 291.593 16.7759 0.2415 491 +493 3 264.6072 290.8048 17.08 0.2288 492 +494 3 290.4033 328.0706 22.5728 0.178 443 +495 3 289.7752 328.0123 24.1357 0.1525 494 +496 3 288.8131 327.8704 24.6543 0.1398 495 +497 3 288.288 327.5123 23.602 0.1398 496 +498 3 287.4792 327.184 22.8407 0.1525 497 +499 3 286.7264 327.0936 21.0204 0.1525 498 +500 3 285.9428 326.6063 21.8238 0.1652 499 +501 3 285.2942 326.4747 21.2932 0.1907 500 +502 3 284.4819 326.0572 20.72 0.2034 501 +503 3 283.5198 325.6579 21.28 0.2034 502 +504 3 282.6824 324.9429 21.252 0.178 503 +505 3 281.7638 324.4842 20.3174 0.1652 504 +506 3 280.8772 323.8023 20.0189 0.1525 505 +507 3 279.9036 323.2441 20.0203 0.1525 506 +508 3 278.9404 322.8368 19.6031 0.1525 507 +509 3 278.0698 322.3792 18.7673 0.1398 508 +510 3 276.9521 322.274 18.48 0.1271 509 +511 3 275.8298 322.1504 18.48 0.1271 510 +512 3 274.9032 321.8518 18.48 0.1398 511 +513 3 274.3392 321.0201 18.0141 0.178 512 +514 3 273.3428 320.5099 17.64 0.2161 513 +515 3 272.3212 320.034 17.6308 0.2669 514 +516 3 271.4277 319.4197 17.4751 0.2796 515 +517 3 270.5537 318.7756 17.1772 0.2796 516 +518 3 269.5573 318.3683 18.0026 0.2669 517 +519 3 268.6352 318.1144 18.5111 0.2542 518 +520 3 267.7864 318.3741 18.2311 0.2288 519 +521 3 267.0725 317.8032 18.2185 0.1907 520 +522 3 266.1413 317.6648 19.2688 0.1652 521 +523 3 265.0511 317.5744 19.567 0.1398 522 +524 3 263.9288 317.4611 19.32 0.1398 523 +525 3 263.2344 317.1225 19.1408 0.1652 524 +526 3 262.7848 316.2165 19.908 0.2034 525 +527 3 262.4336 315.8492 18.5679 0.2161 526 +528 3 261.6511 315.6353 17.5641 0.2161 527 +529 3 260.864 315.6296 17.08 0.2288 528 +530 3 259.7715 315.6353 17.3732 0.2669 529 +531 3 258.8346 315.1823 17.8254 0.2796 530 +532 3 257.8015 314.9203 17.668 0.2796 531 +533 3 256.8326 314.497 17.9544 0.3051 532 +534 3 255.8911 314.473 16.6197 0.3178 533 +535 3 254.9804 314.012 17.0663 0.3305 534 +536 3 254.1922 313.5704 18.4369 0.2924 535 +537 3 253.5104 312.8966 19.0089 0.3051 536 +538 3 253.0528 312.7696 18.2 0.1652 537 +539 3 252.6181 312.5408 16.998 0.2796 537 +540 3 251.7566 312.4138 16.9548 0.2796 539 +541 3 251.3322 312.7101 18.2 0.2415 540 +542 3 250.3964 312.3463 17.1422 0.2034 541 +543 3 249.781 311.6336 16.4004 0.2034 542 +544 3 249.6322 310.9289 16.7597 0.2288 543 +545 3 249.0751 310.7104 16.2016 0.2415 544 +546 3 248.3006 310.4736 15.9664 0.2542 545 +547 3 247.6691 309.9096 16.7026 0.2415 546 +548 3 247.0125 309.5893 18.4528 0.2542 547 +549 3 246.1636 309.3914 19.6 0.2415 548 +550 3 246.278 308.8994 17.7568 0.2288 549 +551 3 246.6464 308.5116 16.4433 0.2034 550 +552 3 246.0469 308.0426 15.7161 0.178 551 +553 3 245.8456 307.7749 17.827 0.1652 552 +554 3 246.0744 307.0496 17.92 0.1525 553 +555 3 307.5175 353.1997 23.016 0.2924 271 +556 3 307.1079 353.4194 20.7553 0.2796 555 +557 3 306.1733 353.7763 19.4611 0.2415 556 +558 3 305.3004 353.9181 17.8702 0.1907 557 +559 3 304.256 353.7042 16.879 0.1652 558 +560 3 303.168 353.6642 16.0686 0.1525 559 +561 3 302.286 354.0817 15.9202 0.1525 560 +562 3 302.1373 355.0839 16.8627 0.1652 561 +563 3 302.5102 356.1112 16.9459 0.1907 562 +564 3 302.6143 357.1053 15.9138 0.2161 563 +565 3 301.968 357.8981 15.2757 0.2161 564 +566 3 300.9315 358.2653 15.6022 0.2034 565 +567 3 300.4544 358.9998 16.791 0.178 566 +568 3 301.0928 359.5867 15.6106 0.178 567 +569 3 302.016 359.5592 14.0 0.1907 568 +570 3 306.1218 356.5768 26.1514 0.3178 268 +571 3 305.2238 356.245 24.876 0.3178 570 +572 3 304.2125 356.0048 24.7976 0.2669 571 +573 3 303.295 355.6799 24.3214 0.2415 572 +574 3 302.3295 355.6582 24.92 0.1907 573 +575 3 301.2072 355.5998 25.121 0.178 574 +576 3 300.2485 355.3058 24.0128 0.2034 575 +577 3 299.3287 355.2886 22.96 0.2542 576 +578 3 298.3483 354.9958 23.0737 0.2796 577 +579 3 297.4926 354.8654 22.8934 0.2796 578 +580 3 296.5488 354.5256 22.6873 0.2796 579 +581 3 295.5993 354.1069 21.8565 0.3051 580 +582 3 294.7299 353.377 21.56 0.3305 581 +583 3 293.9634 352.598 22.0142 0.3305 582 +584 3 293.0184 352.1415 21.5642 0.3305 583 +585 3 292.2256 351.6416 21.7003 0.3305 584 +586 3 291.3596 351.0272 21.3592 0.3305 585 +587 3 290.4227 350.525 21.0731 0.3178 586 +588 3 289.4 350.1475 20.8603 0.3178 587 +589 3 289.0064 349.333 20.16 0.3305 588 +590 3 288.2239 348.5757 20.6489 0.3305 589 +591 3 287.549 347.7691 20.7827 0.2796 590 +592 3 286.6429 347.2852 19.8761 0.2415 591 +593 3 285.9348 346.6148 19.8573 0.2161 592 +594 3 285.0036 346.2064 20.1401 0.2288 593 +595 3 284.3469 345.8655 19.6622 0.2034 594 +596 3 283.7074 345.4114 19.4219 0.178 595 +597 3 283.14 344.9137 19.4622 0.1525 596 +598 3 282.6481 344.1816 20.6951 0.1652 597 +599 3 281.837 343.6679 19.6288 0.1907 598 +600 3 280.9881 343.2629 19.88 0.2161 599 +601 3 280.0512 342.914 19.88 0.2415 600 +602 3 279.3019 342.382 19.4384 0.2542 601 +603 3 278.3855 341.8924 19.8755 0.2796 602 +604 3 277.4875 341.341 19.3486 0.2796 603 +605 3 276.6135 340.8399 19.32 0.2796 604 +606 3 275.7555 340.0986 19.3869 0.2669 605 +607 3 275.1126 339.3035 19.1041 0.2542 606 +608 3 274.4033 338.4764 19.0551 0.2161 607 +609 3 273.8862 337.4617 19.164 0.1652 608 +610 3 273.1323 336.6517 19.32 0.1525 609 +611 3 272.4882 335.7766 19.32 0.1907 610 +612 3 272.264 335.2423 19.32 0.2034 611 +613 3 271.5856 334.5056 19.32 0.2415 612 +614 3 272.59 335.1714 19.5513 0.2034 611 +615 3 272.3841 334.0732 19.9839 0.2415 614 +616 3 271.9368 333.198 19.6078 0.2669 615 +617 3 271.239 332.4819 19.9755 0.2669 616 +618 3 270.3421 331.8138 20.3748 0.2161 617 +619 3 269.7083 330.8986 19.8016 0.178 618 +620 3 269.3182 329.9376 19.3113 0.1398 619 +621 3 268.8743 328.9149 19.32 0.1271 620 +622 3 268.117 328.0843 19.1159 0.1271 621 +623 3 267.2075 327.5478 19.3166 0.1398 622 +624 3 266.1836 327.0971 19.04 0.1525 623 +625 3 265.0934 326.8786 19.3945 0.1398 624 +626 3 264.2228 326.5068 20.72 0.1271 625 +627 3 263.3477 326.3889 19.3189 0.1144 626 +628 3 262.3993 325.9336 18.48 0.1144 627 +629 3 261.2667 325.8112 18.48 0.1271 628 +630 3 260.1273 325.7837 18.48 0.1398 629 +631 3 259.3677 325.1683 18.3674 0.1525 630 +632 3 258.7145 324.419 17.7086 0.1398 631 +633 3 257.8553 323.7051 17.92 0.1271 632 +634 3 257.0213 322.9947 17.92 0.1144 633 +635 3 256.3155 322.171 17.92 0.1144 634 +636 3 255.7137 321.2741 17.897 0.1398 635 +637 3 255.3111 320.8989 16.849 0.1907 636 +638 3 254.6452 320.0088 16.8566 0.2669 637 +639 3 253.7346 319.3339 16.8582 0.3178 638 +640 3 253.07 318.5823 16.9044 0.3432 639 +641 3 252.379 317.7082 16.8224 0.3432 640 +642 3 251.4546 317.428 16.4956 0.3559 641 +643 3 250.4948 317.0173 16.6286 0.394 642 +644 3 249.7386 316.2005 16.52 0.4195 643 +645 3 249.0133 315.3493 16.2977 0.4195 644 +646 3 248.129 314.6561 16.6116 0.3686 645 +647 3 247.4655 314.1058 16.4615 0.3432 646 +648 3 246.6178 313.5178 16.3047 0.3178 647 +649 3 245.5848 313.1094 16.87 0.3178 648 +650 3 244.7119 312.4584 17.4672 0.3051 649 +651 3 243.7784 311.8372 17.4846 0.3305 650 +652 3 242.9662 311.1165 17.1632 0.3432 651 +653 3 242.4765 310.4702 16.6365 0.3432 652 +654 3 241.6872 309.9073 16.3302 0.2924 653 +655 3 241.4115 309.452 18.1269 0.2415 654 +656 3 241.4206 309.4703 16.52 0.1907 655 +657 3 241.0774 308.4647 16.5217 0.1652 656 +658 3 241.4069 307.633 14.966 0.178 657 +659 3 241.1506 306.7842 14.9271 0.2161 658 +660 3 240.5752 306.6137 16.8932 0.2415 659 +661 3 240.1954 305.6962 16.6281 0.2288 660 +662 3 240.2617 305.0339 18.0849 0.1907 661 +663 3 240.637 304.4173 17.92 0.1907 662 +664 3 240.6301 303.9196 17.0405 0.2034 663 +665 3 240.3738 303.0834 15.96 0.2669 664 +666 3 239.9803 302.4015 15.3524 0.3051 665 +667 3 239.3591 301.579 15.1256 0.3305 666 +668 3 238.7471 300.9978 16.1073 0.3051 667 +669 3 238.0195 300.4075 15.8668 0.2669 668 +670 3 237.9165 300.014 14.0358 0.2542 669 +671 3 237.2736 299.3196 14.2419 0.2288 670 +672 3 236.6936 299.156 12.88 0.2034 671 +673 3 312.0306 368.2181 26.1411 0.1652 1 +674 3 311.78 367.1565 25.3375 0.2161 673 +675 3 311.2504 366.223 24.3908 0.2542 674 +676 3 310.9037 365.2781 23.0723 0.2415 675 +677 3 311.2183 364.1935 22.96 0.2161 676 +678 3 311.8498 363.6547 22.9597 0.394 677 +679 3 312.7696 362.9752 22.958 0.4195 678 +680 3 313.6047 362.1938 22.9513 0.4068 679 +681 3 314.4742 361.4502 22.9222 0.394 680 +682 3 315.4214 360.813 22.7665 0.3686 681 +683 3 316.2851 360.1198 22.0604 0.3432 682 +684 3 317.1465 359.3739 21.84 0.3051 683 +685 3 318.0148 358.6314 21.84 0.2669 684 +686 3 318.8362 357.8363 21.84 0.2542 685 +687 3 319.6416 357.023 21.84 0.2415 686 +688 3 320.4333 356.197 21.84 0.2542 687 +689 3 321.1666 355.3218 21.84 0.2669 688 +690 3 321.8404 354.3986 21.8394 0.3178 689 +691 3 322.5485 353.5017 21.8375 0.3559 690 +692 3 323.2601 352.6105 21.8285 0.3559 691 +693 3 324.1169 351.8612 21.7795 0.3305 692 +694 3 325.047 351.2286 21.429 0.2924 693 +695 3 325.8169 350.469 20.6265 0.2924 694 +696 3 326.5079 349.6098 19.9601 0.2796 695 +697 3 327.3293 348.8342 19.6504 0.2796 696 +698 3 328.1415 348.046 19.936 0.2669 697 +699 3 328.8657 347.1971 20.151 0.2924 698 +700 3 329.5349 346.2865 19.7893 0.3432 699 +701 3 330.3106 345.4571 19.5244 0.3686 700 +702 3 331.1239 344.6792 19.0999 0.3559 701 +703 3 331.9099 343.8727 18.6348 0.3051 702 +704 3 332.5951 342.9655 18.5945 0.2924 703 +705 3 333.2735 342.0823 19.14 0.2924 704 +706 3 334.0423 341.2644 19.6092 0.3051 705 +707 3 334.8465 340.4761 20.097 0.3051 706 +708 3 335.6896 339.7302 20.5808 0.2924 707 +709 3 336.6186 339.0736 20.7189 0.2796 708 +710 3 337.5704 338.4398 20.7152 0.2669 709 +711 3 338.4787 337.7466 20.6982 0.2669 710 +712 3 339.3905 337.0556 20.6136 0.2542 711 +713 3 340.4155 336.797 19.9066 0.2288 712 +714 3 340.888 336.7021 20.7054 0.2034 713 +715 3 341.7357 336.2182 20.4498 0.178 714 +716 3 342.6898 335.8143 19.9534 0.1907 715 +717 3 343.5409 335.6496 18.6522 0.2288 716 +718 3 344.1221 334.8843 18.1961 0.2924 717 +719 3 344.5465 334.0194 18.6458 0.3178 718 +720 3 345.0476 333.0459 19.0036 0.2796 719 +721 3 345.3461 332.1272 19.264 0.2161 720 +722 3 345.8907 331.3127 19.6795 0.1652 721 +723 3 346.5256 330.8276 19.49 0.1525 722 +724 3 346.7864 330.0337 19.9335 0.178 723 +725 3 347.0107 329.2009 20.7088 0.1907 724 +726 3 347.3138 328.5774 19.2556 0.2288 725 +727 3 346.5519 328.328 17.5574 0.2415 726 +728 3 346.5359 327.9951 15.68 0.2796 727 +729 3 346.6 327.2984 15.0192 0.2924 728 +730 3 346.2888 326.4496 14.6462 0.2796 729 +731 3 346.2888 326.1544 17.2052 0.2542 730 +732 3 346.7773 325.3822 17.92 0.2288 731 +733 3 347.204 324.721 18.5643 0.2288 732 +734 3 347.2635 323.7509 18.1902 0.2415 733 +735 3 347.3962 322.8585 17.0125 0.2415 734 +736 3 347.744 321.9651 18.2 0.2669 735 +737 3 347.911 320.9641 17.3768 0.2796 736 +738 3 348.5459 320.1141 17.8315 0.3305 737 +739 3 348.8056 319.3693 18.0029 0.3686 738 +740 3 349.2781 318.3969 17.5647 0.394 739 +741 3 349.8352 317.7185 17.08 0.394 740 +742 3 350.1326 316.8537 16.2173 0.3686 741 +743 3 350.31 315.8206 16.0096 0.3559 742 +744 3 350.5582 314.7338 16.387 0.3305 743 +745 3 350.8797 313.782 17.4628 0.3051 744 +746 3 351.526 313.0636 18.3985 0.2796 745 +747 3 352.0946 312.2262 17.7682 0.2415 746 +748 3 353.0052 311.5707 17.92 0.2288 747 +749 3 353.774 310.9575 16.8146 0.2034 748 +750 3 354.5439 310.4724 15.6842 0.2288 749 +751 3 355.1411 310.008 15.7872 0.2288 750 +752 3 355.8458 309.3994 15.0598 0.2542 751 +753 3 356.2656 308.6054 14.56 0.2669 752 +754 3 356.9337 307.8401 15.12 0.2924 753 +755 3 357.595 307.053 14.9226 0.3178 754 +756 3 358.3042 306.4273 16.2442 0.3178 755 +757 3 358.9231 305.8244 15.3765 0.3051 756 +758 3 359.1668 304.828 15.6624 0.2796 757 +759 3 359.4459 303.8464 15.2127 0.2415 758 +760 3 359.6622 302.8454 14.082 0.2288 759 +761 3 360.0889 302.1704 15.0889 0.2161 760 +762 3 360.5488 301.5893 14.4393 0.2542 761 +763 3 361.4491 301.2072 14.4878 0.2796 762 +764 3 362.1458 300.7187 15.4 0.2924 763 +765 3 362.759 300.2199 17.0999 0.2796 764 +766 3 363.1182 299.2921 16.681 0.2542 765 +767 3 363.5632 298.433 15.4311 0.2415 766 +768 3 363.6467 297.7626 17.2939 0.2034 767 +769 3 363.8389 297.0968 16.7356 0.1907 768 +770 3 364.3114 296.717 16.2686 0.1907 769 +771 3 364.1558 295.9128 17.3474 0.2161 770 +772 3 364.2496 294.9186 16.1381 0.2288 771 +773 3 364.2302 294.5823 13.8012 0.2161 772 +774 3 363.8721 293.8639 14.3632 0.2034 773 +775 3 364.4784 293.0928 15.4 0.178 774 +776 3 311.2515 363.5666 23.2739 0.3051 677 +777 3 311.6279 362.8608 25.2036 0.2415 776 +778 3 311.7995 362.4352 27.6895 0.2034 777 +779 3 312.0535 362.0497 29.6856 0.2034 778 +780 3 311.5078 361.1825 30.4539 0.2542 779 +781 3 310.7596 360.3772 30.875 0.3051 780 +782 3 310.1064 359.4757 31.3404 0.3305 781 +783 3 310.2482 358.7836 32.2291 0.3432 782 +784 3 311.0708 358.1349 33.3287 0.3305 783 +785 3 311.3007 357.1156 34.0796 0.2924 784 +786 3 310.8854 356.0746 34.2222 0.2669 785 +787 3 310.453 355.0518 34.853 0.2542 786 +788 3 310.9861 354.1298 35.4858 0.2796 787 +789 3 311.9345 353.5864 36.2782 0.3051 788 +790 3 312.4516 352.5831 36.6072 0.3559 789 +791 3 311.7903 351.3453 38.0428 0.2924 790 +792 3 311.2183 350.4884 39.1381 0.3178 791 +793 3 310.8305 349.4863 40.0814 0.394 792 +794 3 310.3603 348.5288 41.0603 0.4322 793 +795 3 309.7723 347.6341 41.9689 0.4195 794 +796 3 309.0219 346.8276 42.6549 0.3305 795 +797 3 308.2005 346.0703 43.1046 0.2669 796 +798 3 307.3882 345.2649 43.169 0.2288 797 +799 3 306.5634 344.479 43.379 0.2288 798 +800 3 305.6402 344.0008 44.0409 0.2415 799 +801 3 304.9469 343.2915 44.3948 0.2542 800 +802 3 304.5317 342.4106 44.1983 0.2669 801 +803 3 304.2834 341.5046 44.1126 0.2542 802 +804 3 303.6393 340.5951 43.68 0.2415 803 +805 3 302.8088 339.8389 43.68 0.2415 804 +806 3 301.9863 339.2589 43.0254 0.2415 805 +807 3 301.2461 338.4261 43.001 0.2161 806 +808 3 300.5551 337.6642 43.4 0.1907 807 +809 3 299.7463 336.9 43.3958 0.1907 808 +810 3 298.8277 336.2433 43.1981 0.2288 809 +811 3 297.9788 335.5398 43.68 0.2415 810 +812 3 297.3634 334.6154 43.96 0.2415 811 +813 3 296.3921 334.2642 44.4906 0.2415 812 +814 3 295.581 333.5732 44.3167 0.2796 813 +815 3 295.0216 333.0184 43.12 0.3305 814 +816 3 294.2654 332.3503 43.4904 0.3559 815 +817 3 293.6602 331.5873 43.5422 0.3432 816 +818 3 292.999 330.9363 43.68 0.3051 817 +819 3 292.2623 330.0955 43.96 0.2669 818 +820 3 291.6205 329.1997 43.4826 0.2161 819 +821 3 290.8254 328.4127 43.12 0.178 820 +822 3 290.1253 327.5238 43.12 0.178 821 +823 3 289.5441 326.7115 42.9195 0.2034 822 +824 3 288.9744 326.1292 43.0903 0.2415 823 +825 3 288.439 325.206 43.1589 0.2415 824 +826 3 288.4367 324.1616 42.8431 0.2669 825 +827 3 288.1393 323.1789 42.7966 0.2542 826 +828 3 287.5558 322.2545 42.56 0.2542 827 +829 3 286.977 321.2947 42.2531 0.2161 828 +830 3 286.4233 320.4584 41.5663 0.2161 829 +831 3 285.3388 320.1701 41.44 0.2034 830 +832 3 284.6798 319.3682 41.1695 0.1907 831 +833 3 283.9557 318.5926 40.8853 0.178 832 +834 3 283.2899 317.9885 39.7424 0.2034 833 +835 3 282.2248 317.6122 39.3862 0.2669 834 +836 3 281.7706 316.8617 39.8717 0.3051 835 +837 3 281.535 315.8595 39.4708 0.3305 836 +838 3 280.9172 315.7486 38.099 0.3305 837 +839 3 280.3063 314.9981 38.456 0.3305 838 +840 3 279.4643 314.5279 38.0993 0.2796 839 +841 3 278.8523 313.718 39.058 0.2161 840 +842 3 278.2505 312.8977 38.6389 0.178 841 +843 3 277.5664 312.2594 37.4657 0.2034 842 +844 3 276.9944 311.406 37.1272 0.2288 843 +845 3 276.3858 310.8957 38.5666 0.2669 844 +846 3 275.6823 310.7035 37.5376 0.2542 845 +847 3 274.6092 310.5068 36.96 0.2669 846 +848 3 273.551 310.2597 36.5106 0.2161 847 +849 3 272.9492 309.5824 35.8218 0.1907 848 +850 3 271.9677 309.1614 35.84 0.1525 849 +851 3 271.1429 308.5242 36.4 0.1652 850 +852 3 270.3375 307.8207 36.7111 0.1907 851 +853 3 269.4612 307.1308 36.7223 0.2288 852 +854 3 268.7794 306.2568 36.7875 0.2669 853 +855 3 268.0552 305.4217 36.5316 0.3178 854 +856 3 267.601 304.5808 36.0287 0.3432 855 +857 3 267.2407 303.8464 35.3214 0.3686 856 +858 3 266.9581 303.176 35.2694 0.3432 857 +859 3 266.7511 302.4221 35.5496 0.3432 858 +860 3 266.1344 301.6877 35.5541 0.3305 859 +861 3 265.6746 300.872 34.5332 0.3305 860 +862 3 265.6368 300.5288 35.56 0.2415 861 +863 3 265.4034 300.2096 34.7141 0.2669 861 +864 3 265.0145 299.3356 35.2612 0.2542 863 +865 3 264.542 298.33 35.0022 0.2796 864 +866 3 264.2114 297.678 33.3169 0.3051 865 +867 3 263.9711 296.9435 32.0051 0.3305 866 +868 3 263.6405 296.1393 33.0145 0.3305 867 +869 3 263.6771 295.0982 33.6196 0.3051 868 +870 3 264.0249 294.2746 34.2286 0.2415 869 +871 3 264.0352 293.293 33.3214 0.2034 870 +872 3 264.2732 292.3069 33.532 0.2034 871 +873 3 264.2365 291.4512 32.0158 0.2669 872 +874 3 264.0924 290.4273 32.3109 0.3178 873 +875 3 263.4632 289.7134 32.2 0.3178 874 +876 3 263.3442 288.6564 32.48 0.2924 875 +877 3 263.3156 287.8956 31.4336 0.2796 876 +878 3 262.8683 287.1257 29.8343 0.3051 877 +879 3 262.397 286.2528 30.2599 0.3305 878 +880 3 261.706 286.0812 31.92 0.3305 879 +881 3 261.2633 285.2244 31.2833 0.2924 880 +882 3 260.5609 284.5483 30.24 0.2542 881 +883 3 260.0621 283.9797 31.3284 0.2288 882 +884 3 259.4054 283.2716 31.3894 0.2542 883 +885 3 258.5371 282.6424 30.7597 0.2924 884 +886 3 257.9194 281.8839 30.2347 0.3305 885 +887 3 257.4 281.2135 29.4294 0.3305 886 +888 3 256.9859 280.4276 29.5809 0.2796 887 +889 3 256.2331 279.9368 28.4547 0.2288 888 +890 3 255.4804 279.454 29.4 0.2034 889 +891 3 255.2092 279.1349 29.9348 0.2924 890 +892 3 254.6544 279.5936 30.8 0.2669 891 +893 3 255.0617 278.945 29.9289 0.2924 890 +894 3 254.0424 278.5732 29.0458 0.2161 893 +895 3 253.2107 278.326 29.1578 0.1907 894 +896 3 252.4259 277.6522 28.5659 0.1652 895 +897 3 252.3653 276.8594 27.72 0.1525 896 +898 3 251.6789 276.1193 27.587 0.1525 897 +899 3 251.108 275.2384 27.6749 0.1652 898 +900 3 250.9833 274.1356 27.1768 0.1652 899 +901 3 250.1585 273.5304 26.8562 0.1652 900 +902 3 249.3851 273.1597 26.1033 0.1398 901 +903 3 248.7331 273.4126 27.44 0.1271 902 +904 3 247.6051 273.4046 27.1631 0.1398 903 +905 3 246.8775 272.9984 28.56 0.1652 904 +906 3 245.8216 272.8223 27.83 0.1907 905 +907 3 244.7782 272.844 26.88 0.1907 906 +908 3 243.6354 272.8749 26.9052 0.2034 907 +909 3 242.6046 273.1426 27.0446 0.2288 908 +910 3 241.5819 273.1506 27.4898 0.2288 909 +911 3 240.8669 272.5717 27.5058 0.2034 910 +912 3 240.4562 272.1565 26.2601 0.1525 911 +913 3 239.4438 272.0432 25.76 0.1398 912 +914 3 238.7974 271.9288 27.3535 0.1398 913 +915 3 238.1225 271.2676 27.6744 0.1525 914 +916 3 237.3537 271.3568 26.3194 0.1525 915 +917 3 236.8069 270.969 25.1166 0.1525 916 +918 3 236.7028 270.6704 27.0304 0.1525 917 +919 3 236.3504 269.9291 28.4668 0.1398 918 +920 3 236.3195 268.824 28.8728 0.1525 919 +921 3 235.6834 268.0495 28.2523 0.178 920 +922 3 235.5839 267.2064 27.1216 0.2415 921 +923 3 236.1216 266.4376 27.16 0.2796 922 +924 3 254.4988 278.0858 29.4 0.2161 893 +925 3 254.2037 277.0505 29.0338 0.2288 924 +926 3 253.9428 276.0632 29.1939 0.2161 925 +927 3 253.5825 275.0805 29.6388 0.178 926 +928 3 253.5104 274.0955 28.84 0.1398 927 +929 3 253.5104 272.9515 28.84 0.1271 928 +930 3 253.1409 271.8865 28.8534 0.1398 929 +931 3 252.5437 270.9347 28.5692 0.1652 930 +932 3 252.252 269.9291 28.28 0.178 931 +933 3 252.5758 268.951 28.273 0.1907 932 +934 3 252.5986 267.9626 28.7207 0.178 933 +935 3 252.7096 266.9856 28.3861 0.1652 934 +936 3 252.1856 266.155 28.28 0.1525 935 +937 3 251.4398 265.3817 28.28 0.1525 936 +938 3 250.3678 265.0648 28.2072 0.1525 937 +939 3 249.2593 265.2684 28.0101 0.1652 938 +940 3 248.3418 265.2833 27.2443 0.2034 939 +941 3 247.6989 264.4962 27.4792 0.2288 940 +942 3 247.0205 263.8693 26.9744 0.2288 941 +943 3 246.27 263.0342 27.2429 0.178 942 +944 3 245.3274 262.5503 28.0 0.1652 943 +945 3 244.5918 261.9863 27.1821 0.178 944 +946 3 243.7155 261.7278 27.0357 0.2288 945 +947 3 243.2991 260.9475 26.0495 0.2415 946 +948 3 243.2144 260.1753 26.4396 0.2415 947 +949 3 242.9295 259.3185 26.5426 0.2161 948 +950 3 242.4422 258.5062 25.9938 0.2034 949 +951 3 242.1825 257.4721 25.48 0.178 950 +952 3 241.9423 256.3807 25.9484 0.178 951 +953 3 241.5682 255.3648 26.2539 0.178 952 +954 3 240.8726 254.4817 26.6224 0.2034 953 +955 3 240.121 253.6992 26.7128 0.2161 954 +956 3 239.6222 252.8 26.7966 0.2288 955 +957 3 239.5033 251.7406 26.4695 0.2161 956 +958 3 239.5628 250.6069 26.6647 0.1907 957 +959 3 239.5467 249.4641 26.6 0.1525 958 +960 3 239.1029 248.4688 27.0866 0.1271 959 +961 3 238.389 247.6291 27.44 0.1144 960 +962 3 237.7507 246.7574 27.44 0.1271 961 +963 3 237.5722 245.6362 27.44 0.1525 962 +964 3 236.9636 244.8126 27.7875 0.1907 963 +965 3 236.7348 243.8916 28.338 0.2161 964 +966 3 236.236 243.1057 28.716 0.2288 965 +967 3 235.6915 242.3873 29.461 0.2161 966 +968 3 234.8049 241.956 28.6479 0.2034 967 +969 3 233.7661 241.7615 28.56 0.1907 968 +970 3 232.939 241.1232 28.8002 0.2034 969 +971 3 231.9746 240.5683 28.3027 0.2034 970 +972 3 231.0537 239.8968 28.222 0.1907 971 +973 3 230.0881 239.3728 28.2402 0.1525 972 +974 3 229.4864 238.5972 28.56 0.1398 973 +975 3 229.0631 237.5745 28.56 0.1525 974 +976 3 228.3561 236.6822 28.56 0.178 975 +977 3 227.8745 236.0129 27.5131 0.178 976 +978 3 227.4272 235.124 28.28 0.1525 977 +979 3 227.2201 234.0567 28.28 0.1271 978 +980 3 226.9696 233.0774 28.28 0.1271 979 +981 3 226.7946 232.0192 28.28 0.1525 980 +982 3 225.956 231.66 27.1432 0.178 981 +983 3 226.0567 230.8901 27.3364 0.178 982 +984 3 225.8256 229.8468 27.72 0.1525 983 +985 3 225.8256 228.7028 27.72 0.1271 984 +986 3 225.8256 227.5588 27.72 0.1271 985 +987 3 225.7112 226.4331 27.9947 0.1398 986 +988 3 225.4984 225.5476 28.4824 0.1525 987 +989 3 225.6986 224.5661 28.285 0.1652 988 +990 3 225.7112 223.4232 28.28 0.1907 989 +991 3 312.7742 352.0122 37.4774 0.394 790 +992 3 313.4629 352.018 39.2 0.3559 991 +993 3 314.5531 352.1232 39.0611 0.3051 992 +994 3 315.6937 352.1232 39.2 0.2415 993 +995 3 316.6272 352.2319 40.0697 0.2161 994 +996 3 317.2449 351.6645 39.4985 0.2161 995 +997 3 317.8615 351.5501 38.3634 0.2034 996 +998 3 318.8236 351.3087 39.2 0.1652 997 +999 3 319.9539 351.1966 39.256 0.1271 998 +1000 3 320.9915 350.827 39.5508 0.1271 999 +1001 3 322.0085 350.4781 40.32 0.1525 1000 +1002 3 323.1388 350.2997 40.32 0.178 1001 +1003 3 324.0357 349.9496 39.5024 0.178 1002 +1004 3 325.0436 349.9496 40.32 0.1525 1003 +1005 3 326.0537 349.7242 39.48 0.1525 1004 +1006 3 326.9049 349.1271 39.1737 0.1907 1005 +1007 3 327.8933 348.6546 38.4574 0.2669 1006 +1008 3 328.9126 348.3091 38.2824 0.2924 1007 +1009 3 329.9422 348.1512 39.0362 0.2924 1008 +1010 3 330.8162 347.6513 38.8066 0.2542 1009 +1011 3 331.6685 347.0953 38.7383 0.2415 1010 +1012 3 332.443 346.5176 39.0572 0.2161 1011 +1013 3 333.5298 346.2716 38.9567 0.2161 1012 +1014 3 334.6006 345.9422 39.2 0.2415 1013 +1015 3 335.7148 345.75 39.2 0.2796 1014 +1016 3 336.6552 345.2066 38.92 0.2796 1015 +1017 3 337.6367 344.7204 38.906 0.2415 1016 +1018 3 338.5222 344.1083 38.64 0.2034 1017 +1019 3 339.3493 343.7068 39.4472 0.1907 1018 +1020 3 340.1306 343.1268 38.703 0.178 1019 +1021 3 341.1374 342.8007 38.8433 0.1525 1020 +1022 3 341.6968 342.0343 38.2917 0.1271 1021 +1023 3 342.7699 341.8272 38.4994 0.1271 1022 +1024 3 343.8807 341.8272 38.92 0.1398 1023 +1025 3 344.9995 341.6831 38.64 0.1525 1024 +1026 3 345.9765 341.2277 39.3921 0.1398 1025 +1027 3 346.9214 340.809 39.48 0.1271 1026 +1028 3 347.9201 340.3514 39.2 0.1271 1027 +1029 3 348.7152 339.768 39.17 0.1398 1028 +1030 3 349.8158 339.5861 39.2465 0.1525 1029 +1031 3 350.4941 338.9157 40.054 0.1398 1030 +1032 3 351.184 338.0497 40.1649 0.1398 1031 +1033 3 351.9779 337.2375 40.04 0.1398 1032 +1034 3 352.7627 336.4161 39.7754 0.1525 1033 +1035 3 353.4537 335.7834 40.304 0.1398 1034 +1036 3 354.0062 334.8179 40.2942 0.1398 1035 +1037 3 354.6022 333.9977 39.5335 0.1398 1036 +1038 3 354.8688 333.2232 40.1047 0.1525 1037 +1039 3 354.8688 332.1146 39.76 0.1398 1038 +1040 3 354.926 330.9821 39.76 0.1398 1039 +1041 3 355.5575 330.1161 39.9524 0.1525 1040 +1042 3 355.6868 329.2466 41.44 0.178 1041 +1043 3 356.0872 328.233 41.0396 0.2034 1042 +1044 3 356.928 327.6416 40.6 0.2034 1043 +1045 2 313.9491 377.5497 28.194 0.2034 1 +1046 2 314.3346 378.4878 29.4406 0.3051 1045 +1047 2 315.2921 379.0438 29.8995 0.394 1046 +1048 2 316.1364 379.7222 30.7801 0.4449 1047 +1049 2 316.2531 380.8536 30.8048 0.4576 1048 +1050 2 316.5425 381.9599 30.8286 0.4449 1049 +1051 3 314.7499 376.7741 26.964 0.1398 1 +1052 3 315.3905 377.7213 26.8498 0.178 1051 +1053 3 315.8264 378.5427 27.6531 0.2288 1052 +1054 3 316.9498 378.5324 27.44 0.2288 1053 +1055 3 317.5115 378.2064 29.1007 0.2288 1054 +1056 3 318.6543 378.2064 29.12 0.2288 1055 +1057 3 319.7903 378.3094 29.12 0.2924 1056 +1058 3 320.6632 378.2762 28.1529 0.3432 1057 +1059 3 321.3084 377.6104 28.7398 0.3686 1058 +1060 3 322.314 377.091 28.9512 0.3432 1059 +1061 3 323.3836 376.7192 28.9022 0.3051 1060 +1062 3 324.5196 376.3852 28.6958 0.2669 1061 +1063 3 325.341 376.6426 28.6843 0.2288 1062 +1064 3 325.9519 376.4424 29.4493 0.178 1063 +1065 3 327.0158 376.1472 29.4 0.1652 1064 +1066 3 327.7938 375.7274 28.28 0.1907 1065 +1067 3 328.5396 375.621 28.4964 0.2415 1066 +1068 3 329.3553 375.3624 29.5546 0.2669 1067 +1069 3 330.2305 375.5535 30.5978 0.2796 1068 +1070 3 331.1937 375.2675 31.8942 0.2669 1069 +1071 3 332.0037 375.0032 30.6956 0.2924 1070 +1072 3 332.9761 374.6886 30.0754 0.2924 1071 +1073 3 333.9359 374.6108 29.9622 0.2796 1072 +1074 3 335.025 374.4312 30.3635 0.2669 1073 +1075 3 335.7148 373.842 31.2332 0.2924 1074 +1076 3 336.7101 373.4771 30.5354 0.3432 1075 +1077 3 337.5178 373.2231 30.7376 0.3178 1076 +1078 3 338.5462 372.8857 30.6348 0.2796 1077 +1079 3 339.6216 372.8548 30.3873 0.2161 1078 +1080 3 340.6043 372.6569 29.9838 0.2288 1079 +1081 3 341.1408 372.4784 28.2072 0.2288 1080 +1082 3 341.6625 372.8799 27.72 0.2288 1081 +1083 3 342.1189 373.3616 27.72 0.2924 1082 +1084 3 342.7962 374.0514 27.47 0.3178 1083 +1085 3 343.7068 374.231 28.3346 0.3178 1084 +1086 3 344.4401 374.0777 27.4652 0.3178 1085 +1087 3 345.2009 374.0571 26.1884 0.3559 1086 +1088 3 345.6035 374.088 24.6884 0.394 1087 +1089 3 345.8312 374.7378 25.1006 0.4068 1088 +1090 3 346.6251 375.0032 25.5178 0.3813 1089 +1091 3 347.4351 375.3922 25.951 0.3686 1090 +1092 3 348.3251 375.1187 24.9511 0.3559 1091 +1093 3 349.3765 375.232 24.64 0.3305 1092 +1094 3 349.7208 375.7079 23.2184 0.2669 1093 +1095 3 350.334 376.249 23.3806 0.2288 1094 +1096 3 351.1096 376.0248 22.3401 0.2288 1095 +1097 3 351.9287 375.6804 23.0812 0.2669 1096 +1098 3 352.789 375.4333 21.9601 0.2924 1097 +1099 3 353.83 375.4436 21.0022 0.2924 1098 +1100 3 354.6526 375.4608 21.4315 0.2796 1099 +1101 3 355.7531 375.6919 21.28 0.2669 1100 +1102 3 356.4029 376.336 20.44 0.2796 1101 +1103 3 357.3604 376.2616 20.1211 0.2924 1102 +1104 3 358.4026 376.5407 20.4168 0.2924 1103 +1105 3 358.9586 376.948 19.04 0.3051 1104 +1106 3 359.7891 377.4193 19.6935 0.3178 1105 +1107 3 360.6368 377.52 20.55 0.3432 1106 +1108 3 361.6813 377.6424 20.1704 0.3178 1107 +1109 3 362.767 377.7042 20.2118 0.2669 1108 +1110 3 363.6307 378.2339 19.6834 0.2288 1109 +1111 3 364.269 378.664 19.0453 0.2161 1110 +1112 3 365.1053 379.1674 20.1905 0.2542 1111 +1113 3 365.8992 379.538 19.4121 0.2796 1112 +1114 3 366.5845 380.2233 19.1332 0.3178 1113 +1115 3 367.1439 380.7976 20.44 0.3305 1114 +1116 3 367.8566 381.4039 19.3466 0.3432 1115 +1117 3 368.4389 381.8111 20.44 0.3432 1116 +1118 3 369.226 382.4266 20.7158 0.3305 1117 +1119 3 370.0279 383.1416 20.713 0.2924 1118 +1120 3 370.6549 383.987 20.9905 0.2288 1119 +1121 3 371.0964 384.956 20.0603 0.1907 1120 +1122 3 371.6238 385.9067 19.6862 0.1907 1121 +1123 3 372.356 386.7098 20.0836 0.2161 1122 +1124 3 373.135 387.5106 19.6006 0.2161 1123 +1125 3 373.7803 388.2484 20.2082 0.2034 1124 +1126 3 374.4426 389.151 19.7098 0.2161 1125 +1127 3 375.113 390.0571 19.3166 0.2288 1126 +1128 3 375.9092 390.7812 19.6 0.2288 1127 +1129 3 376.8302 391.2457 19.1556 0.178 1128 +1130 3 377.9238 391.4951 19.32 0.1652 1129 +1131 3 379.0518 391.6759 19.32 0.178 1130 +1132 3 380.1798 391.7822 19.516 0.2161 1131 +1133 3 381.2083 391.7159 19.0711 0.2034 1132 +1134 3 382.1726 391.7662 19.4855 0.178 1133 +1135 3 383.2457 391.9905 20.2056 0.1652 1134 +1136 3 384.3817 392.0488 20.454 0.1907 1135 +1137 3 385.48 391.9767 20.9412 0.2161 1136 +1138 3 386.434 392.0259 20.1698 0.2288 1137 +1139 3 387.3744 392.5602 20.72 0.2161 1138 +1140 3 388.2828 393.0464 20.3428 0.2161 1139 +1141 3 389.2334 393.6424 19.9416 0.2161 1140 +1142 3 390.1097 394.3254 20.3162 0.2542 1141 +1143 3 391.1325 394.7246 20.8312 0.2796 1142 +1144 3 392.0133 395.4064 20.9084 0.2924 1143 +1145 3 393.0761 395.7771 21.1176 0.2542 1144 +1146 3 394.0405 395.9224 21.1081 0.1907 1145 +1147 3 395.1193 396.1523 21.3027 0.1525 1146 +1148 3 396.237 396.2816 20.8933 0.1525 1147 +1149 3 397.3421 396.1672 21.28 0.1907 1148 +1150 3 398.3351 396.0082 20.3633 0.2034 1149 +1151 3 399.4047 395.7176 20.417 0.1907 1150 +1152 3 400.1929 395.1456 19.6 0.1652 1151 +1153 3 401.3369 395.1376 19.6 0.1525 1152 +1154 3 402.4134 394.807 19.6 0.1525 1153 +1155 3 403.3389 394.8756 20.6735 0.1525 1154 +1156 3 404.3228 394.3334 20.503 0.178 1155 +1157 3 405.3009 393.7614 20.4666 0.2034 1156 +1158 3 406.2447 393.3678 19.9531 0.2161 1157 +1159 3 407.0055 393.1928 20.4142 0.1907 1158 +1160 3 407.5958 393.1528 18.769 0.1652 1159 +1161 3 408.543 392.7352 18.4736 0.1525 1160 +1162 3 409.6412 392.9514 18.2 0.1652 1161 +1163 3 410.7852 392.964 18.177 0.2034 1162 +1164 3 411.9006 393.075 17.7422 0.2415 1163 +1165 3 412.9199 393.2271 18.2246 0.2415 1164 +1166 3 413.6704 393.3507 18.3546 0.1907 1165 +1167 3 414.5936 393.3072 17.64 0.1652 1166 +1168 3 415.7319 393.2786 17.5336 0.1652 1167 +1169 3 416.8393 393.1928 17.801 0.2161 1168 +1170 3 417.7945 393.4216 19.0028 0.2415 1169 +1171 3 418.6651 393.3667 17.7052 0.2924 1170 +1172 3 419.7473 393.0784 17.9161 0.2924 1171 +1173 3 420.8284 393.0933 17.6568 0.2796 1172 +1174 3 421.7276 393.2431 18.4052 0.2288 1173 +1175 3 422.7091 393.29 17.4513 0.2034 1174 +1176 3 423.5614 392.9823 17.9018 0.1907 1175 +1177 3 424.6379 392.8496 17.92 0.2034 1176 +1178 3 425.2694 392.6643 16.6939 0.2288 1177 +1179 3 426.0942 392.1643 15.8841 0.2669 1178 +1180 3 426.1434 391.407 14.6555 0.2924 1179 +1181 3 426.9763 390.8533 14.9456 0.2924 1180 +1182 3 427.9349 390.4541 14.5032 0.2669 1181 +1183 3 428.8547 390.0651 15.4031 0.2161 1182 +1184 3 429.8992 389.9896 16.3702 0.1907 1183 +1185 3 430.8304 390.2184 17.36 0.1907 1184 +1186 3 341.2243 372.5573 28.089 0.1652 1082 +1187 3 340.34 372.4098 28.9332 0.2288 1186 +1188 3 328.2433 375.4802 28.4889 0.2161 1066 +1189 3 328.7753 374.6692 29.5291 0.178 1188 +1190 3 328.6712 374.3557 31.3818 0.1907 1189 +1191 3 329.1345 373.476 31.92 0.2034 1190 +1192 3 329.2707 372.4509 32.2176 0.2669 1191 +1193 3 330.0108 371.7371 33.1324 0.2796 1192 +1194 3 330.9455 371.1182 33.32 0.2924 1193 +1195 3 331.4031 370.537 33.7296 0.2415 1194 +1196 3 331.4305 369.4994 33.847 0.2415 1195 +1197 3 331.4099 368.3897 33.7924 0.2415 1196 +1198 3 330.926 367.4837 34.44 0.2542 1197 +1199 3 330.6743 366.4026 34.839 0.2161 1198 +1200 3 330.7167 365.3375 35.5491 0.1652 1199 +1201 3 330.5016 364.3262 36.2132 0.1398 1200 +1202 3 330.0657 363.7188 35.0115 0.1398 1201 +1203 3 329.5269 362.8585 36.0828 0.1652 1202 +1204 3 329.1013 362.3483 38.2687 0.1907 1203 +1205 3 328.3646 361.8083 38.3583 0.2415 1204 +1206 3 327.6473 361.1402 38.6028 0.2669 1205 +1207 3 326.7847 360.5899 38.5532 0.2669 1206 +1208 3 325.9656 360.2605 39.3156 0.2161 1207 +1209 3 325.3536 359.963 39.48 0.1907 1208 +1210 3 324.5963 359.2263 39.48 0.1652 1209 +1211 3 323.5953 358.7893 39.4834 0.1652 1210 +1212 3 323.5827 358.485 41.4355 0.1398 1211 +1213 3 322.9512 357.762 41.16 0.1398 1212 +1214 3 322.6538 357.1568 42.336 0.1652 1213 +1215 3 322.0326 356.6695 43.68 0.2034 1214 +1216 3 321.9216 355.538 43.6122 0.2288 1215 +1217 3 322.3792 354.9889 44.133 0.2034 1216 +1218 3 322.2225 354.6389 46.4366 0.1907 1217 +1219 3 321.5086 354.1778 47.4281 0.1652 1218 +1220 3 321.1094 353.4605 49.0557 0.1652 1219 +1221 3 320.7707 353.2672 51.4408 0.1398 1220 +1222 3 319.748 353.0384 51.8 0.1398 1221 +1223 3 325.5172 376.5453 29.1396 0.2161 1063 +1224 3 326.5674 376.2158 29.4557 0.2542 1223 +1225 3 327.5398 375.8166 29.12 0.2415 1224 +1226 3 324.1158 376.376 28.849 0.4576 1061 +1227 3 324.761 376.0294 27.6923 0.2796 1226 +1228 3 324.435 375.6713 26.054 0.2288 1227 +1229 3 325.0104 375.4608 24.0803 0.1907 1228 +1230 3 325.492 375.232 25.6948 0.2034 1229 +1231 3 326.0812 375.0879 27.1382 0.2288 1230 +1232 3 326.5308 374.7744 25.347 0.2542 1231 +1233 3 326.7893 374.5834 22.8903 0.2542 1232 +1234 3 326.8145 375.1222 20.6702 0.2288 1233 +1235 3 327.5203 375.3464 18.7687 0.1907 1234 +1236 3 328.5751 375.232 18.951 0.1907 1235 +1237 3 329.3954 374.7824 19.9116 0.2161 1236 +1238 3 329.9605 373.8935 19.88 0.2415 1237 +1239 3 330.8414 373.7448 18.6074 0.2288 1238 +1240 3 331.6456 374.1074 18.6435 0.2034 1239 +1241 3 332.3755 374.4667 18.6777 0.2034 1240 +1242 3 332.5677 374.1509 19.3404 0.2415 1241 +1243 3 333.3708 374.0914 20.4873 0.2796 1242 +1244 3 333.9862 373.4096 19.6 0.2924 1243 +1245 3 334.342 372.8365 21.0227 0.2415 1244 +1246 3 334.9724 372.6008 22.6467 0.1907 1245 +1247 3 336.1072 372.6008 22.96 0.178 1246 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc new file mode 100644 index 0000000..c270082 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc @@ -0,0 +1,1966 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/MouseCellTypes/176847.04.02.01/176847.04.02.01_MDF.swc_sorted.swc +# id,type,x,y,z,r,pid +1 1 237.4944 233.8336 35.28 5.9212 -1 +2 3 232.5043 230.7745 35.28 0.2669 1 +3 3 231.4495 231.199 35.28 0.2796 2 +4 3 230.3513 231.5181 35.28 0.2796 3 +5 3 229.2084 231.5159 35.28 0.2542 4 +6 3 228.0793 231.3282 35.28 0.2542 5 +7 3 226.9616 231.0846 35.28 0.2669 6 +8 3 225.8176 231.0617 35.28 0.3305 7 +9 3 224.6816 230.9313 35.2803 0.4576 8 +10 3 223.2768 230.103 35.2825 0.4068 9 +11 3 222.4268 229.3377 35.2898 0.3813 10 +12 3 221.523 228.6364 35.3265 0.3051 11 +13 3 220.8629 227.775 35.6944 0.4322 12 +14 3 220.4488 226.75 35.6216 0.4322 13 +15 3 220.1548 225.6803 34.9891 0.4068 14 +16 3 219.823 224.6198 34.3207 0.3305 15 +17 3 219.6572 223.5159 33.8643 0.2542 16 +18 3 219.7075 222.4039 33.2562 0.2288 17 +19 3 219.9523 221.3102 33.0162 0.2669 18 +20 3 220.5003 220.3138 32.8628 0.3178 19 +21 3 220.9121 219.2648 32.3744 0.3432 20 +22 3 220.7828 218.1482 31.9312 0.3559 21 +23 3 220.2623 217.1312 31.9368 0.3686 22 +24 3 220.2383 215.9895 32.0306 0.4068 23 +25 3 220.7977 214.4005 32.426 0.2288 24 +26 3 220.7211 213.2908 31.92 0.2796 25 +27 3 220.53 212.1754 31.6366 0.3305 26 +28 3 220.3333 211.0783 31.2928 0.3178 27 +29 3 219.7956 210.0899 31.5381 0.2924 28 +30 3 219.2911 209.1106 31.6926 0.2796 29 +31 3 219.0497 208.0135 31.1898 0.3051 30 +32 3 218.7763 206.921 30.8129 0.3178 31 +33 3 218.464 205.8205 30.77 0.2924 32 +34 3 218.2889 204.7039 30.5665 0.2542 33 +35 3 218.2821 203.5714 30.5469 0.2669 34 +36 3 218.321 202.4342 30.8241 0.3051 35 +37 3 218.5555 201.3246 31.1539 0.3178 36 +38 3 218.6104 200.208 31.7103 0.2924 37 +39 3 218.2374 199.159 31.2561 0.2924 38 +40 3 217.7867 198.1259 30.7882 0.3178 39 +41 3 217.2685 197.1112 30.5396 0.3305 40 +42 3 216.8612 196.156 29.3952 0.3051 41 +43 3 216.5695 195.0589 29.6587 0.3305 42 +44 3 216.0856 194.0224 29.741 0.3686 43 +45 3 214.9896 193.582 29.5781 0.2034 44 +46 3 214.1545 192.8349 29.1992 0.2161 45 +47 3 213.5436 191.9152 28.5219 0.1907 46 +48 3 212.808 191.0903 27.9535 0.1652 47 +49 3 212.3847 190.2243 26.7529 0.1907 48 +50 3 212.3012 189.141 26.1708 0.2415 49 +51 3 211.8299 188.1388 25.5808 0.2924 50 +52 3 211.6045 187.1424 24.353 0.2924 51 +53 3 211.8516 186.0933 23.4917 0.2542 52 +54 3 211.7727 184.9791 24.0668 0.2415 53 +55 3 210.9628 184.2446 23.9061 0.2415 54 +56 3 210.218 183.5571 23.1552 0.2796 55 +57 3 209.8805 182.6064 21.8562 0.2924 56 +58 3 209.6472 181.5928 21.107 0.2924 57 +59 3 209.4355 180.4889 21.1991 0.2669 58 +60 3 209.0706 179.4593 20.4764 0.2161 59 +61 3 208.7606 178.3965 20.16 0.178 60 +62 3 208.232 177.5488 20.16 0.178 61 +63 3 207.3752 177.1427 19.32 0.2161 62 +64 3 206.9748 176.1005 18.9241 0.2669 63 +65 3 206.3364 175.1773 18.48 0.2796 64 +66 3 205.9452 174.1111 18.48 0.2924 65 +67 3 205.4041 173.1158 18.2104 0.2669 66 +68 3 204.9098 172.1583 17.3872 0.2542 67 +69 3 204.7657 171.0383 17.1268 0.2161 68 +70 3 204.2257 170.0808 16.8725 0.2288 69 +71 3 203.1778 169.6403 16.8 0.2542 70 +72 3 202.218 169.0477 16.5819 0.3051 71 +73 3 201.3737 168.3247 16.1622 0.3051 72 +74 3 201.344 167.2093 15.7676 0.2669 73 +75 3 200.6576 166.5664 14.84 0.2161 74 +76 3 215.9494 194.0602 30.8 0.178 44 +77 3 215.7618 193.6575 30.8 0.1907 76 +78 3 215.7584 192.5135 30.8 0.2161 77 +79 3 215.4381 191.4347 30.8 0.2288 78 +80 3 215.064 190.3547 30.8 0.2161 79 +81 3 214.8638 189.229 30.8 0.2034 80 +82 3 214.7288 188.0953 30.8 0.178 81 +83 3 214.7391 186.9513 30.8 0.1525 82 +84 3 215.0354 185.868 31.0607 0.1398 83 +85 3 215.2894 184.8304 32.0354 0.1398 84 +86 3 215.6955 183.8339 32.737 0.1652 85 +87 3 215.9929 182.7346 32.76 0.178 86 +88 3 216.2858 181.634 32.76 0.1907 87 +89 3 216.5066 180.5587 32.2216 0.1907 88 +90 3 216.8406 179.505 31.92 0.178 89 +91 3 216.9024 178.3633 31.92 0.178 90 +92 3 216.9024 177.2193 31.92 0.178 91 +93 3 216.8258 176.0833 31.9827 0.2161 92 +94 3 216.6072 174.9965 32.5234 0.2542 93 +95 3 216.5592 173.8891 32.9048 0.2924 94 +96 3 216.5592 172.7795 33.488 0.2796 95 +97 3 216.5592 171.6366 33.6 0.2542 96 +98 3 216.5592 170.4926 33.6 0.2161 97 +99 3 216.51 169.3566 33.7218 0.2034 98 +100 3 216.4448 168.2229 33.88 0.1907 99 +101 3 216.4448 167.0812 33.9674 0.2161 100 +102 3 216.4448 165.9555 34.4448 0.2415 101 +103 3 216.4448 164.8744 35.0708 0.2415 102 +104 3 216.4448 163.7991 35.84 0.1907 103 +105 3 216.4448 162.6551 35.84 0.1525 104 +106 3 216.4448 161.5111 35.84 0.1398 105 +107 3 216.454 160.3671 35.84 0.1652 106 +108 3 216.5992 159.2334 35.84 0.178 107 +109 3 216.6736 158.0962 35.8672 0.1907 108 +110 3 216.6736 156.9591 36.1334 0.178 109 +111 3 216.8086 155.838 36.4 0.1652 110 +112 3 216.9996 154.7123 36.4 0.1525 111 +113 3 217.2239 153.6037 36.7189 0.1525 112 +114 3 217.2456 152.6611 37.7877 0.1398 113 +115 3 217.3497 151.5262 37.8 0.1271 114 +116 3 217.9183 150.6305 37.8 0.1144 115 +117 3 217.9732 149.4968 37.9033 0.1144 116 +118 3 218.2924 148.4569 38.64 0.1144 117 +119 3 218.7889 147.441 38.64 0.1271 118 +120 3 218.8472 146.3016 38.7374 0.1398 119 +121 3 219.0428 145.2148 39.3775 0.1525 120 +122 3 219.4341 144.176 39.6724 0.1398 121 +123 3 220.0427 143.2139 39.76 0.1271 122 +124 3 220.8538 142.4635 39.76 0.1144 123 +125 3 221.5081 141.6592 40.04 0.1144 124 +126 3 221.8182 140.569 40.04 0.1144 125 +127 3 222.2254 139.552 40.2016 0.1144 126 +128 3 222.4325 138.4595 40.6 0.1144 127 +129 3 222.7368 137.4161 40.6 0.1144 128 +130 3 222.7665 136.2744 40.6428 0.1144 129 +131 3 222.8706 135.1945 41.4442 0.1144 130 +132 3 223.0731 134.1271 42.0 0.1144 131 +133 3 223.2367 133.038 42.1842 0.1144 132 +134 3 223.4678 131.941 42.28 0.1144 133 +135 3 223.8808 130.9319 42.3525 0.1144 134 +136 3 224.3487 130.0717 43.12 0.1144 135 +137 3 224.8887 129.0787 43.2149 0.1144 136 +138 3 225.5041 128.239 44.3254 0.1144 137 +139 3 226.3141 127.6304 44.8 0.1144 138 +140 3 226.4376 126.5104 44.8 0.1144 139 +141 3 226.9021 125.6455 44.0115 0.1144 140 +142 3 227.3597 124.7383 43.4 0.1144 141 +143 3 227.7658 123.6893 43.4 0.1144 142 +144 3 227.8848 122.5682 43.12 0.1144 143 +145 3 228.3504 121.7079 42.5508 0.1144 144 +146 3 228.4911 120.6268 42.28 0.1144 145 +147 3 228.7931 119.5263 42.28 0.1144 146 +148 3 229.4441 118.722 42.9234 0.1144 147 +149 3 229.5711 117.6238 43.1978 0.1144 148 +150 3 229.7152 116.5324 43.68 0.1144 149 +151 3 229.706 115.4056 43.2849 0.1144 150 +152 3 229.4898 114.2952 43.12 0.1144 151 +153 3 229.4864 113.1517 43.12 0.1144 152 +154 3 229.4864 112.071 42.4463 0.1271 153 +155 3 229.4864 110.9306 42.28 0.1398 154 +156 3 229.4864 109.7952 42.1574 0.1652 155 +157 3 229.3434 108.8181 40.8668 0.1652 156 +158 3 229.1993 107.8714 39.4064 0.1652 157 +159 3 229.1432 106.7387 39.2 0.1525 158 +160 3 229.1398 105.5947 39.2 0.1525 159 +161 3 229.0288 104.4855 38.787 0.178 160 +162 3 229.0288 103.3659 38.36 0.2161 161 +163 3 228.8206 102.2481 38.36 0.2542 162 +164 3 228.6993 101.1362 38.0685 0.2415 163 +165 3 228.9144 100.2135 36.533 0.1907 164 +166 3 228.959 99.2882 35.0347 0.1398 165 +167 3 229.6809 98.7205 33.88 0.1144 166 +168 3 230.2872 97.835 33.88 0.1144 167 +169 3 230.81 96.8919 33.88 0.1144 168 +170 3 231.7824 96.2999 33.88 0.1144 169 +171 3 232.6416 95.581 33.88 0.1144 170 +172 3 233.0946 94.7028 33.88 0.1144 171 +173 3 233.7489 93.8609 33.88 0.1144 172 +174 3 234.52 93.3316 33.88 0.1271 173 +175 3 234.7545 92.236 33.88 0.1398 174 +176 3 235.5439 91.411 33.88 0.1525 175 +177 3 236.4648 90.971 34.384 0.1398 176 +178 3 236.5872 89.8573 34.44 0.1271 177 +179 3 237.4017 89.2013 33.8918 0.1144 178 +180 3 238.4348 89.1176 32.9459 0.1144 179 +181 3 239.1406 88.8369 31.351 0.1144 180 +182 3 239.5536 87.9258 30.2865 0.1144 181 +183 3 240.3361 87.2805 30.0434 0.1144 182 +184 3 241.0671 86.6914 29.12 0.1144 183 +185 3 241.8816 86.0381 28.84 0.1144 184 +186 3 243.005 85.8469 28.84 0.1144 185 +187 3 244.0644 85.4372 28.84 0.1144 186 +188 3 244.3332 84.347 28.8691 0.1144 187 +189 3 244.7531 83.4076 29.3272 0.1271 188 +190 3 245.8456 83.1688 29.4 0.1652 189 +191 3 218.8655 216.0352 29.6892 0.2288 24 +192 3 217.9709 215.4472 29.1472 0.2924 191 +193 3 217.3886 214.532 28.2688 0.3305 192 +194 3 216.7743 213.6306 27.501 0.3305 193 +195 3 216.0398 212.7897 26.9248 0.3178 194 +196 3 215.3271 211.934 26.3796 0.2924 195 +197 3 214.5435 211.1252 26.2102 0.3051 196 +198 3 213.5974 210.5166 25.7942 0.3178 197 +199 3 212.6971 209.8954 25.0183 0.3305 198 +200 3 211.8745 209.1552 24.3177 0.2924 199 +201 3 211.0348 208.4048 23.8599 0.2542 200 +202 3 210.115 207.8911 23.098 0.2288 201 +203 3 209.0717 207.7767 22.1598 0.2161 202 +204 3 207.9472 207.787 21.7213 0.1907 203 +205 3 206.9393 207.5765 20.9392 0.1652 204 +206 3 206.7494 208.2595 18.9126 0.1652 205 +207 3 205.7415 208.4505 18.3109 0.1652 206 +208 3 219.9901 228.7828 36.1637 0.178 12 +209 3 218.9582 228.649 35.8758 0.2288 208 +210 3 217.9652 228.6398 34.5369 0.2669 209 +211 3 216.8967 228.7188 33.6361 0.2924 210 +212 3 215.819 228.4968 33.8341 0.3305 211 +213 3 214.7391 228.1616 34.1113 0.3305 212 +214 3 213.666 227.823 33.7378 0.3178 213 +215 3 212.6181 227.5141 33.0005 0.2796 214 +216 3 211.5485 227.6537 32.3075 0.2669 215 +217 3 210.4674 227.7372 32.9966 0.2924 216 +218 3 209.3612 227.4672 33.04 0.3051 217 +219 3 208.2183 227.4226 33.04 0.3178 218 +220 3 207.0743 227.4055 33.04 0.3051 219 +221 3 205.9475 227.2384 33.0397 0.2924 220 +222 3 204.8321 226.9822 33.0383 0.2796 221 +223 3 203.7018 226.8243 33.0285 0.2669 222 +224 3 202.6321 226.4182 32.982 0.2542 223 +225 3 201.5522 226.0441 32.9017 0.2288 224 +226 3 200.5135 225.8199 33.9307 0.2034 225 +227 3 199.4587 225.9629 32.9574 0.2161 226 +228 3 198.436 225.7409 31.9197 0.2796 227 +229 3 197.3 225.6117 31.9183 0.3559 228 +230 3 196.1605 225.5018 31.9099 0.4195 229 +231 3 195.0646 225.2021 31.8469 0.4195 230 +232 3 193.9915 224.8509 31.4586 0.394 231 +233 3 192.8887 224.6484 30.9543 0.3305 232 +234 3 191.787 224.3727 30.8157 0.2796 233 +235 3 190.6979 224.0249 30.896 0.2288 234 +236 3 189.6088 223.7229 31.2715 0.2161 235 +237 3 188.5095 223.4884 31.4448 0.2161 236 +238 3 187.3975 223.6303 31.2682 0.2161 237 +239 3 186.321 223.7664 32.1437 0.1907 238 +240 3 185.2445 223.7653 31.1996 0.1907 239 +241 3 184.1497 223.7584 30.3957 0.2161 240 +242 3 183.0091 223.7069 30.3064 0.2542 241 +243 3 181.8949 223.509 30.2042 0.2542 242 +244 3 180.8618 223.6898 29.3157 0.2415 243 +245 3 179.9295 224.2503 30.1753 0.2161 244 +246 3 178.845 224.2503 29.8222 0.2034 245 +247 3 177.7135 224.184 29.4879 0.1907 246 +248 3 176.6233 223.9849 28.8907 0.2161 247 +249 3 175.5102 223.8064 28.5891 0.2415 248 +250 3 174.3685 223.7607 28.5614 0.2669 249 +251 3 173.2245 223.7309 28.5698 0.2415 250 +252 3 172.1022 223.5353 28.6236 0.2034 251 +253 3 170.98 223.342 28.8436 0.1652 252 +254 3 169.8485 223.2539 28.6614 0.1652 253 +255 3 168.7514 222.9702 28.5998 0.178 254 +256 3 167.8706 222.6418 27.5915 0.1907 255 +257 3 166.9302 222.0996 27.44 0.178 256 +258 3 165.9555 221.5196 27.3546 0.1652 257 +259 3 164.9293 221.0997 26.88 0.1652 258 +260 3 163.9455 220.5987 26.6 0.1907 259 +261 3 162.925 220.1148 26.6 0.2161 260 +262 3 161.8554 219.751 26.4146 0.2034 261 +263 3 160.8761 219.1687 26.32 0.178 262 +264 3 159.7756 218.9078 26.2284 0.1525 263 +265 3 158.7414 218.6218 25.529 0.1652 264 +266 3 157.6409 218.3759 25.2 0.1652 265 +267 3 156.5129 218.2752 24.943 0.1652 266 +268 3 155.3769 218.2752 24.6954 0.1525 267 +269 3 154.2444 218.2706 24.36 0.1525 268 +270 3 153.1095 218.1528 24.36 0.1525 269 +271 3 152.0262 218.0132 23.5824 0.1525 270 +272 3 150.9199 217.8176 23.3666 0.1525 271 +273 3 149.7988 217.8176 22.8351 0.1525 272 +274 3 148.6582 217.8176 22.68 0.1398 273 +275 3 147.5302 217.9663 22.5543 0.1271 274 +276 3 146.4286 218.1608 22.12 0.1144 275 +277 3 145.2846 218.1608 22.12 0.1144 276 +278 3 144.1417 218.1802 22.12 0.1144 277 +279 3 143.0206 218.4045 22.12 0.1144 278 +280 3 141.9544 218.7969 22.12 0.1144 279 +281 3 140.8161 218.8472 22.12 0.1271 280 +282 3 139.6767 218.9147 22.12 0.1398 281 +283 3 138.5418 218.9616 22.0276 0.1525 282 +284 3 137.455 218.8472 21.2582 0.1398 283 +285 3 136.327 218.8472 20.7978 0.1271 284 +286 3 135.1945 218.7328 20.72 0.1144 285 +287 3 134.0699 218.6195 20.4736 0.1144 286 +288 3 132.9305 218.6687 20.44 0.1144 287 +289 3 131.8014 218.8472 20.44 0.1144 288 +290 3 130.6574 218.8472 20.44 0.1271 289 +291 3 129.5145 218.8346 20.44 0.1398 290 +292 3 128.4975 218.4296 19.88 0.1525 291 +293 3 127.365 218.3896 19.7089 0.1398 292 +294 3 126.285 218.0819 19.6 0.1271 293 +295 3 125.1948 217.8062 19.5782 0.1144 294 +296 3 124.1103 217.487 19.32 0.1144 295 +297 3 122.9869 217.2753 19.32 0.1144 296 +298 3 121.8909 217.0168 19.1425 0.1144 297 +299 3 120.7526 216.9367 19.04 0.1144 298 +300 3 119.6269 216.788 19.04 0.1271 299 +301 3 118.5184 216.9024 19.04 0.1652 300 +302 3 224.1199 231.1955 36.0307 0.2034 9 +303 3 223.271 231.8064 37.0908 0.2161 302 +304 3 222.4096 232.518 37.329 0.2288 303 +305 3 221.5814 233.265 36.7937 0.2288 304 +306 3 220.7645 234.0441 36.5649 0.2415 305 +307 3 219.8962 234.7534 37.0205 0.2796 306 +308 3 219.0726 235.497 37.6709 0.3305 307 +309 3 218.4182 236.3882 38.3275 0.3432 308 +310 3 217.8714 237.3789 38.61 0.3305 309 +311 3 217.3062 238.373 38.64 0.2924 310 +312 3 216.6564 239.3134 38.6403 0.2796 311 +313 3 216.0822 240.2983 38.6408 0.2669 312 +314 3 215.5445 241.3085 38.645 0.2796 313 +315 3 214.8981 242.2489 38.6641 0.3178 314 +316 3 214.2312 243.1778 38.7545 0.3559 315 +317 3 213.682 244.1525 39.2815 0.3686 316 +318 3 213.0792 245.0894 39.902 0.3305 317 +319 3 212.5895 246.0744 40.6006 0.2924 318 +320 3 211.9935 247.0376 40.6193 0.2796 319 +321 3 211.2842 247.8785 39.8541 0.3051 320 +322 3 210.5829 248.7056 39.0071 0.3305 321 +323 3 209.7902 249.4995 39.5382 0.3432 322 +324 3 209.018 250.2786 40.3292 0.3432 323 +325 3 208.2812 251.1263 40.8374 0.3432 324 +326 3 207.4724 251.9351 40.8736 0.3432 325 +327 3 206.6281 252.705 40.8514 0.3178 326 +328 3 205.7038 253.3743 40.7123 0.2796 327 +329 3 204.8629 254.0961 40.0336 0.2288 328 +330 3 204.0747 254.8066 39.1622 0.2288 329 +331 3 203.2327 255.5364 39.6494 0.2288 330 +332 3 202.6813 256.5374 39.7046 0.2288 331 +333 3 202.1928 257.5636 39.4624 0.2034 332 +334 3 201.5751 258.4628 39.2529 0.2288 333 +335 3 200.6427 259.1011 39.6486 0.2796 334 +336 3 199.7401 259.7898 39.7603 0.3051 335 +337 3 199.0251 260.6753 39.7614 0.2669 336 +338 3 198.4348 261.6545 39.767 0.2288 337 +339 3 197.7679 262.58 39.7911 0.2161 338 +340 3 197.0448 263.4575 39.9608 0.2161 339 +341 3 196.3424 264.3418 40.3609 0.2161 340 +342 3 195.505 265.0785 40.3273 0.2542 341 +343 3 194.6276 265.7684 39.8247 0.3178 342 +344 3 193.8565 266.6103 39.76 0.3559 343 +345 3 193.1381 267.5004 39.76 0.3305 344 +346 3 192.3133 268.2806 39.76 0.2796 345 +347 3 191.3329 268.8594 39.7603 0.2542 346 +348 3 190.4188 269.5264 39.7608 0.2415 347 +349 3 189.6443 270.365 39.7636 0.2542 348 +350 3 188.7554 271.0159 40.1682 0.2161 349 +351 3 187.7064 271.4506 40.32 0.1907 350 +352 3 186.6024 271.7252 40.32 0.1398 351 +353 3 185.5957 272.2617 40.3365 0.1398 352 +354 3 184.6931 272.9527 40.6 0.1398 353 +355 3 183.8557 273.7192 40.6 0.1652 354 +356 3 183.2242 274.5875 41.1188 0.1652 355 +357 3 182.9736 275.6708 41.44 0.1652 356 +358 3 182.3181 276.5803 41.44 0.1398 357 +359 3 181.2199 276.8137 41.5184 0.1271 358 +360 3 180.7406 277.7071 41.72 0.1271 359 +361 3 180.2269 278.6978 42.2223 0.1525 360 +362 3 179.5394 279.5902 42.5401 0.178 361 +363 3 178.5784 280.1656 42.84 0.1907 362 +364 3 177.4824 280.4184 43.1147 0.178 363 +365 3 176.6347 281.0774 43.12 0.1652 364 +366 3 175.866 281.9205 43.12 0.1652 365 +367 3 175.0114 282.6549 43.2135 0.178 366 +368 3 174.1694 283.3711 43.68 0.1907 367 +369 3 173.0506 283.5907 43.68 0.1652 368 +370 3 172.0748 284.1433 43.68 0.1398 369 +371 3 171.2419 284.9143 43.68 0.1144 370 +372 3 170.5933 285.6957 43.96 0.1144 371 +373 3 169.8565 286.5674 43.96 0.1144 372 +374 3 168.9368 287.2138 43.9863 0.1144 373 +375 3 167.9701 287.7572 44.52 0.1144 374 +376 3 167.2013 288.5957 44.52 0.1144 375 +377 3 166.4932 289.4686 44.52 0.1144 376 +378 3 165.4956 290.0143 44.52 0.1144 377 +379 3 164.72 290.822 44.8935 0.1144 378 +380 3 164.0622 291.5072 45.92 0.1144 379 +381 3 163.6835 292.5586 45.92 0.1144 380 +382 3 162.7798 293.245 45.92 0.1144 381 +383 3 161.9252 294.0 45.92 0.1144 382 +384 3 160.9528 294.5892 45.92 0.1144 383 +385 3 160.0605 295.2847 45.92 0.1144 384 +386 3 159.4873 296.2697 45.92 0.1144 385 +387 3 158.9817 297.2947 45.92 0.1144 386 +388 3 158.3834 298.2683 45.92 0.1144 387 +389 3 157.5906 299.0176 45.92 0.1144 388 +390 3 156.8127 299.8493 45.9413 0.1144 389 +391 3 156.148 300.7404 46.48 0.1271 390 +392 3 155.4479 301.6259 46.76 0.1525 391 +393 3 154.5956 302.3855 46.76 0.178 392 +394 3 153.6495 303.009 47.0246 0.178 393 +395 3 152.7263 303.684 47.04 0.1525 394 +396 3 151.7173 304.1965 46.8524 0.1271 395 +397 3 150.7586 304.8016 46.76 0.1144 396 +398 3 149.856 305.4892 46.6203 0.1144 397 +399 3 148.8939 306.0966 46.48 0.1144 398 +400 3 148.0668 306.8448 46.48 0.1144 399 +401 3 147.1195 307.474 46.48 0.1144 400 +402 3 146.3611 308.3149 46.48 0.1271 401 +403 3 145.6564 309.1832 46.6612 0.1398 402 +404 3 144.6577 309.452 47.6 0.1525 403 +405 3 143.6807 309.9702 47.6 0.1398 404 +406 3 142.8055 310.6589 47.836 0.1271 405 +407 3 142.1878 311.3774 48.72 0.1144 406 +408 3 141.2394 311.8109 48.72 0.1144 407 +409 3 140.1675 312.1633 48.72 0.1144 408 +410 3 139.1081 312.59 48.72 0.1144 409 +411 3 138.0385 312.9824 48.6329 0.1144 410 +412 3 137.0432 313.4766 48.44 0.1144 411 +413 3 135.9941 313.9182 48.44 0.1144 412 +414 3 135.0755 314.5863 48.6951 0.1144 413 +415 3 134.0596 315.1091 48.72 0.1144 414 +416 3 133.0609 315.6651 48.72 0.1144 415 +417 3 132.1148 316.2885 48.4448 0.1398 416 +418 3 131.266 317.0299 48.6114 0.1652 417 +419 3 130.2089 317.4486 48.72 0.1907 418 +420 3 129.1759 317.8112 49.275 0.1652 419 +421 3 128.2859 318.4988 49.28 0.1398 420 +422 3 127.6715 319.4517 49.0244 0.1144 421 +423 3 126.7872 320.1495 49.0 0.1144 422 +424 3 125.7828 320.5488 49.0 0.1144 423 +425 3 124.6731 320.757 49.0596 0.1144 424 +426 3 123.6927 321.3347 49.28 0.1144 425 +427 3 122.7764 321.988 49.6667 0.1144 426 +428 3 121.7765 322.5005 49.84 0.1144 427 +429 3 121.097 323.299 49.84 0.1144 428 +430 3 120.5696 324.3057 49.9288 0.1144 429 +431 3 119.834 325.1511 50.4 0.1144 430 +432 3 119.0607 325.9531 50.9158 0.1144 431 +433 3 118.3457 326.8271 51.24 0.1144 432 +434 3 117.5174 327.6096 51.24 0.1271 433 +435 3 116.7475 328.4207 51.7913 0.1398 434 +436 3 115.925 329.146 52.2684 0.1525 435 +437 3 115.1642 329.7855 53.5248 0.1398 436 +438 3 114.3723 330.5176 53.2927 0.1271 437 +439 3 113.7229 331.4568 53.2 0.1144 438 +440 3 112.7701 332.0609 53.2 0.1144 439 +441 3 111.718 332.4944 53.2 0.1144 440 +442 3 110.7486 333.063 53.2 0.1144 441 +443 3 109.967 333.8913 53.2 0.1144 442 +444 3 109.1294 334.6669 53.2 0.1398 443 +445 3 108.5156 335.5009 53.683 0.1907 444 +446 3 107.7837 336.3738 53.76 0.2415 445 +447 3 107.2058 337.3015 53.76 0.2415 446 +448 3 106.2723 337.9582 53.8331 0.1907 447 +449 3 105.5559 338.8356 54.04 0.1398 448 +450 3 104.908 339.7772 54.04 0.1144 449 +451 3 104.1519 340.634 54.04 0.1144 450 +452 3 103.1077 341.0859 54.04 0.1144 451 +453 3 102.0581 341.5343 54.0862 0.1144 452 +454 3 101.8118 342.5491 54.32 0.1144 453 +455 3 101.6026 343.3865 54.8733 0.1144 454 +456 3 101.1508 343.1931 57.4014 0.1144 455 +457 3 100.4262 343.2755 58.8 0.1144 456 +458 3 99.3275 343.4105 58.8 0.1144 457 +459 3 98.8076 344.2285 59.2567 0.1144 458 +460 3 97.6953 344.4092 59.36 0.1144 459 +461 3 96.6997 344.9698 59.36 0.1144 460 +462 3 95.6858 345.4846 59.6268 0.1144 461 +463 3 94.7804 345.9696 60.5268 0.1144 462 +464 3 94.1035 346.8173 61.0176 0.1144 463 +465 3 93.3807 347.6788 61.04 0.1144 464 +466 3 92.7652 348.6168 61.2567 0.1144 465 +467 3 92.1127 349.5309 61.6 0.1144 466 +468 3 91.2521 350.2402 61.6 0.1144 467 +469 3 90.4192 351.0044 61.6 0.1144 468 +470 3 89.5734 351.7651 61.6 0.1144 469 +471 3 88.7967 352.5819 61.6 0.1144 470 +472 3 87.992 353.3667 61.6123 0.1144 471 +473 3 87.0861 353.965 62.16 0.1144 472 +474 3 86.2486 354.5828 62.7312 0.1144 473 +475 3 85.446 355.0312 63.84 0.1144 474 +476 3 84.7198 355.8847 63.84 0.1144 475 +477 3 84.2332 356.9074 63.973 0.1144 476 +478 3 83.7408 357.8432 64.68 0.1398 477 +479 3 82.8438 358.2722 64.68 0.1144 478 +480 3 81.9626 358.9506 64.4 0.1144 479 +481 3 81.2031 359.7846 64.4 0.1144 480 +482 3 80.4524 360.6346 64.4 0.1144 481 +483 3 79.7633 361.52 64.4 0.1144 482 +484 3 79.0041 362.2133 64.4 0.1144 483 +485 3 78.1748 362.9718 64.5162 0.1144 484 +486 3 77.7279 363.9899 64.68 0.1144 485 +487 3 76.9223 364.7164 64.68 0.1144 486 +488 3 75.9201 365.2552 64.6638 0.1144 487 +489 3 75.0315 365.9061 64.12 0.1144 488 +490 3 74.6171 366.7836 63.2976 0.1144 489 +491 3 74.0669 367.7045 62.9244 0.1144 490 +492 3 73.9024 368.7364 62.16 0.1144 491 +493 3 73.9024 369.8804 62.16 0.1144 492 +494 3 73.9024 371.0244 62.16 0.1144 493 +495 3 73.9024 372.1684 62.16 0.1144 494 +496 3 73.9024 373.3124 62.16 0.1144 495 +497 3 73.9024 374.4564 62.16 0.1144 496 +498 3 73.9024 375.5992 62.2776 0.1144 497 +499 3 73.5174 376.5396 62.7542 0.1271 498 +500 3 73.1628 377.5841 63.0 0.1398 499 +501 3 72.6368 378.5553 63.0 0.1652 500 +502 3 71.9363 379.3618 63.0 0.1652 501 +503 3 71.2712 380.1718 62.72 0.1652 502 +504 3 70.8321 381.0252 62.72 0.1398 503 +505 3 69.8133 381.5148 62.72 0.1271 504 +506 3 68.8119 381.8489 62.72 0.1144 505 +507 3 68.3347 382.8213 62.3829 0.1398 506 +508 3 67.8392 383.812 61.88 0.1652 507 +509 3 83.5032 357.0699 66.7646 0.178 478 +510 3 83.0829 356.0769 67.6987 0.1398 509 +511 3 82.6625 355.0839 68.6328 0.1144 510 +512 3 82.2813 354.0623 69.4529 0.1144 511 +513 3 81.9674 352.9926 70.077 0.1144 512 +514 3 81.6533 351.9219 70.7011 0.1144 513 +515 3 81.3393 350.8522 71.3252 0.1271 514 +516 3 81.0253 349.7826 71.9494 0.1398 515 +517 3 80.5544 349.0001 73.211 0.1525 516 +518 3 79.8958 348.5642 75.236 0.1398 517 +519 3 79.1332 348.1878 77.0781 0.1398 518 +520 3 78.2696 347.8721 78.7427 0.1398 519 +521 3 77.406 347.5552 80.4076 0.1525 520 +522 3 76.5425 347.2383 82.0725 0.1398 521 +523 3 75.7549 346.9775 83.9941 0.1271 522 +524 3 74.9835 346.7304 85.9709 0.1144 523 +525 3 74.2122 346.4821 87.9474 0.1144 524 +526 3 73.4408 346.2339 89.9242 0.1144 525 +527 3 72.4419 345.9227 90.9412 0.1144 526 +528 3 71.3976 345.6001 91.7672 0.1144 527 +529 3 70.3534 345.2764 92.5932 0.1144 528 +530 3 69.3092 344.9538 93.4192 0.1144 529 +531 3 68.265 344.63 94.2455 0.1144 530 +532 3 67.2208 344.3074 95.0715 0.1144 531 +533 3 240.6827 238.4599 38.6478 0.2796 1 +534 3 241.4549 238.6247 40.6739 0.2415 533 +535 3 242.3736 238.4977 43.2348 0.2161 534 +536 3 242.7145 238.993 45.3995 0.2034 535 +537 3 242.528 239.8968 46.7916 0.2669 536 +538 3 242.2191 240.6187 48.3557 0.3051 537 +539 3 242.4628 241.718 48.8544 0.3178 538 +540 3 243.1698 241.964 49.3766 0.3305 539 +541 3 244.2715 242.0384 49.9397 0.3559 540 +542 3 245.3903 241.8519 49.8896 0.3305 541 +543 3 246.5045 241.5956 49.84 0.3178 542 +544 3 247.6039 241.2788 49.8408 0.2796 543 +545 3 248.6987 240.947 49.845 0.3051 544 +546 3 249.781 240.6987 50.4 0.3051 545 +547 3 250.8849 240.8623 50.6097 0.2924 546 +548 3 251.8436 241.3829 51.249 0.2796 547 +549 3 252.8823 241.7627 51.52 0.2796 548 +550 3 253.7586 242.4022 51.8885 0.3051 549 +551 3 254.3615 242.9353 52.92 0.2542 550 +552 3 255.0365 242.9856 52.92 0.2161 551 +553 3 256.1782 243.0439 52.92 0.2288 552 +554 3 257.3165 243.1 53.0754 0.2669 553 +555 3 258.4353 243.1 53.6396 0.2669 554 +556 3 259.5747 243.1 53.7608 0.2924 555 +557 3 260.5654 243.5954 54.04 0.3051 556 +558 3 260.6627 243.839 54.04 0.1525 557 +559 3 261.2255 244.7828 54.04 0.178 558 +560 3 262.0996 245.4795 54.04 0.2161 559 +561 3 262.8786 246.3009 54.04 0.2669 560 +562 3 263.8224 246.9061 54.04 0.2669 561 +563 3 264.844 247.4129 54.04 0.2415 562 +564 3 265.7775 248.0592 54.04 0.2034 563 +565 3 266.8151 248.4768 54.04 0.178 564 +566 3 267.9145 248.7514 54.1671 0.178 565 +567 3 269.0059 249.0808 54.32 0.178 566 +568 3 270.024 249.5808 54.32 0.1907 567 +569 3 271.0308 250.0452 54.7688 0.2034 568 +570 3 272.0318 250.4651 55.4022 0.2161 569 +571 3 272.9492 251.132 55.6083 0.2288 570 +572 3 273.9079 251.6445 56.2598 0.2034 571 +573 3 274.512 252.1399 58.0854 0.1652 572 +574 3 275.1412 252.6581 59.691 0.1271 573 +575 3 275.8825 253.491 59.92 0.1144 574 +576 3 276.4465 254.4325 60.0603 0.1144 575 +577 3 276.5917 255.4644 60.7684 0.1144 576 +578 3 276.6192 256.5706 61.2942 0.1144 577 +579 3 276.7336 257.4069 62.7645 0.1144 578 +580 3 276.6787 258.5326 63.0 0.1144 579 +581 3 276.6192 259.672 63.0 0.1144 580 +582 3 276.3561 260.5746 64.0808 0.1144 581 +583 3 276.1616 261.4566 65.6936 0.1144 582 +584 3 275.8035 262.389 66.4457 0.1144 583 +585 3 275.4649 263.4106 67.3935 0.1144 584 +586 3 275.1263 264.4322 68.3413 0.1144 585 +587 3 274.8082 265.4629 69.2227 0.1271 586 +588 3 274.7751 266.6058 69.2227 0.1398 587 +589 3 274.7682 267.6628 69.7432 0.1525 588 +590 3 274.8357 268.4785 71.6993 0.1398 589 +591 3 275.4901 269.1569 72.8255 0.1271 590 +592 3 276.4007 269.7758 73.593 0.1144 591 +593 3 277.3102 270.3936 74.3607 0.1144 592 +594 3 278.2197 271.0125 75.1282 0.1144 593 +595 3 279.1291 271.6314 75.896 0.1144 594 +596 3 280.0901 272.1965 76.4898 0.1144 595 +597 3 281.0888 272.7216 76.9479 0.1144 596 +598 3 282.0887 273.2455 77.406 0.1144 597 +599 3 283.0874 273.7695 77.8641 0.1144 598 +600 3 284.0872 274.2946 78.3224 0.1144 599 +601 3 285.0859 274.8185 78.7805 0.1144 600 +602 3 286.0858 275.3425 79.2386 0.1144 601 +603 3 287.0857 275.8676 79.6967 0.1144 602 +604 3 288.0844 276.3915 80.155 0.1144 603 +605 3 289.0842 276.9155 80.6131 0.1144 604 +606 3 289.988 277.5939 81.0566 0.1144 605 +607 3 290.8917 278.2711 81.5004 0.1144 606 +608 3 291.7955 278.9484 81.944 0.1144 607 +609 3 292.6993 279.6268 82.3878 0.1144 608 +610 3 293.611 280.2846 82.8509 0.1144 609 +611 3 294.6532 280.6392 83.6136 0.1144 610 +612 3 295.6954 280.9927 84.376 0.1144 611 +613 3 296.7376 281.3474 85.1388 0.1144 612 +614 3 297.7798 281.7008 85.9015 0.1144 613 +615 3 298.7613 282.2008 86.5225 0.1144 614 +616 3 299.6719 282.8666 86.9812 0.1144 615 +617 3 300.5826 283.5324 87.4401 0.1144 616 +618 3 301.4943 284.1982 87.8987 0.1144 617 +619 3 302.405 284.864 88.3574 0.1144 618 +620 3 303.3167 285.531 88.816 0.1144 619 +621 3 304.0477 286.3535 89.4768 0.1144 620 +622 3 304.7147 287.2332 90.2101 0.1144 621 +623 3 305.3816 288.113 90.9434 0.1144 622 +624 3 306.0486 288.9927 91.677 0.1144 623 +625 3 306.7156 289.8736 92.4106 0.1144 624 +626 3 307.41 290.7339 93.1157 0.1144 625 +627 3 308.1524 291.5621 93.7706 0.1144 626 +628 3 308.8949 292.3904 94.4255 0.1144 627 +629 3 309.6385 293.2175 95.0804 0.1144 628 +630 3 310.3809 294.0458 95.7354 0.1144 629 +631 3 311.1234 294.874 96.3903 0.1144 630 +632 3 311.867 295.7011 97.0452 0.1398 631 +633 3 312.6094 296.5294 97.7001 0.1652 632 +634 3 260.8698 243.1378 55.44 0.1525 557 +635 3 261.5012 242.2958 55.44 0.1525 634 +636 3 262.3123 241.5716 55.6696 0.1525 635 +637 3 263.2882 241.1792 56.3637 0.1525 636 +638 3 264.1885 240.5386 56.84 0.1398 637 +639 3 264.9641 239.7389 56.847 0.1271 638 +640 3 265.6562 238.858 57.2592 0.1144 639 +641 3 266.4696 238.1682 58.0983 0.1144 640 +642 3 267.4146 237.6019 58.52 0.1144 641 +643 3 268.5105 237.2782 58.52 0.1144 642 +644 3 269.261 236.4877 58.52 0.1271 643 +645 3 270.0195 235.7727 58.8512 0.1398 644 +646 3 270.9312 235.1778 59.5689 0.1652 645 +647 3 271.6336 234.3427 59.92 0.1652 646 +648 3 272.1965 233.4069 60.3764 0.1652 647 +649 3 272.4402 232.4654 61.754 0.1398 648 +650 3 273.0133 231.5891 62.44 0.1398 649 +651 3 273.7958 230.7848 62.44 0.1398 650 +652 3 274.4616 229.9932 62.6772 0.1525 651 +653 3 274.9032 229.2061 64.0926 0.1398 652 +654 3 275.0256 228.0873 64.3922 0.1271 653 +655 3 275.6399 227.219 65.24 0.1144 654 +656 3 276.3504 226.3976 65.814 0.1144 655 +657 3 276.8777 225.4229 66.3289 0.1144 656 +658 3 277.6637 224.6061 66.5552 0.1144 657 +659 3 278.429 223.7996 66.64 0.1144 658 +660 3 279.1063 222.8855 66.64 0.1144 659 +661 3 279.8762 222.0859 67.1698 0.1144 660 +662 3 280.7147 221.3823 67.7331 0.1144 661 +663 3 281.3096 220.5941 68.32 0.1144 662 +664 3 281.9811 219.8574 68.8576 0.1144 663 +665 3 282.7785 219.0611 69.16 0.1144 664 +666 3 283.3391 218.0979 69.44 0.1144 665 +667 3 284.1467 217.3852 69.44 0.1144 666 +668 3 284.7164 216.4059 69.44 0.1144 667 +669 3 285.1534 215.4358 69.6578 0.1144 668 +670 3 285.4852 214.3719 70.2937 0.1144 669 +671 3 285.817 213.308 70.9296 0.1144 670 +672 3 286.1487 212.244 71.5652 0.1144 671 +673 3 286.4793 211.1813 72.2011 0.1144 672 +674 3 286.8111 210.1173 72.837 0.1271 673 +675 3 287.1429 209.0534 73.4726 0.1525 674 +676 3 287.4746 207.9895 74.1084 0.178 675 +677 3 287.8487 206.9336 74.6382 0.178 676 +678 3 288.2846 205.8868 75.0184 0.1525 677 +679 3 288.7193 204.8401 75.399 0.1271 678 +680 3 289.154 203.7933 75.7795 0.1144 679 +681 3 289.5899 202.7477 76.16 0.1144 680 +682 3 290.0246 201.7009 76.5402 0.1144 681 +683 3 290.4605 200.6542 76.9208 0.1144 682 +684 3 290.8952 199.6074 77.3013 0.1144 683 +685 3 291.331 198.5618 77.6815 0.1144 684 +686 3 291.8413 197.5631 77.985 0.1144 685 +687 3 292.6512 196.7543 77.985 0.1144 686 +688 3 293.253 195.8391 78.2849 0.1144 687 +689 3 293.579 194.7797 78.9852 0.1144 688 +690 3 293.905 193.7215 79.6852 0.1144 689 +691 3 294.2311 192.6633 80.3855 0.1144 690 +692 3 294.6063 191.5983 80.7699 0.1144 691 +693 3 295.0056 190.5298 81.0015 0.1144 692 +694 3 295.4048 189.4624 81.233 0.1144 693 +695 3 295.8041 188.3939 81.4646 0.1144 694 +696 3 296.2033 187.3266 81.6962 0.1144 695 +697 3 296.6026 186.2581 81.928 0.1144 696 +698 3 296.9618 185.3314 82.7375 0.1144 697 +699 3 297.3839 184.3259 83.587 0.1144 698 +700 3 297.8049 183.3214 84.4365 0.1144 699 +701 3 298.2271 182.3158 85.286 0.1144 700 +702 3 298.6492 181.3114 86.1356 0.1144 701 +703 3 299.1011 180.3116 86.9193 0.1144 702 +704 3 299.6308 179.3289 87.5336 0.1144 703 +705 3 300.1593 178.3462 88.1476 0.1144 704 +706 3 300.689 177.3635 88.762 0.1271 705 +707 3 301.2175 176.3808 89.376 0.1398 706 +708 3 254.8054 243.9683 52.92 0.1652 551 +709 3 255.3294 244.9842 52.92 0.178 708 +710 3 255.8064 245.9817 53.2 0.2034 709 +711 3 256.5283 246.81 53.2 0.2161 710 +712 3 256.7742 247.9174 53.2165 0.2415 711 +713 3 257.1312 248.9538 53.48 0.2669 712 +714 3 257.8473 249.8153 53.48 0.2924 713 +715 3 258.0864 250.9204 53.48 0.2924 714 +716 3 258.0864 252.0644 53.4951 0.2542 715 +717 3 258.107 253.1649 54.1083 0.2161 716 +718 3 258.2088 254.2654 54.6 0.178 717 +719 3 258.7248 255.2436 54.8688 0.1652 718 +720 3 258.9696 256.3338 54.88 0.1398 719 +721 3 259.4684 257.2822 55.16 0.1525 720 +722 3 259.8802 258.3175 55.3938 0.178 721 +723 3 260.5574 259.2098 55.5794 0.2161 722 +724 3 260.9498 260.2669 55.9868 0.2288 723 +725 3 261.5081 261.2541 56.1061 0.2161 724 +726 3 261.873 262.2998 56.546 0.2034 725 +727 3 262.2528 263.374 56.56 0.1652 726 +728 3 262.5823 264.4653 56.56 0.1652 727 +729 3 262.9919 265.5327 56.56 0.178 728 +730 3 263.2344 266.5966 57.0668 0.2288 729 +731 3 263.263 267.736 57.1318 0.2288 730 +732 3 263.5753 268.7656 57.4 0.2034 731 +733 3 263.7744 269.881 57.4 0.1525 732 +734 3 263.954 271.009 57.4 0.1271 733 +735 3 264.1496 272.1336 57.4 0.1144 734 +736 3 264.5408 273.1483 57.4 0.1271 735 +737 3 265.2616 274.0097 57.7466 0.1525 736 +738 3 266.0143 274.6652 58.8056 0.178 737 +739 3 266.5886 275.4924 59.4961 0.178 738 +740 3 266.8952 276.5345 60.039 0.1525 739 +741 3 266.8952 277.6294 60.5783 0.1271 740 +742 3 266.655 278.707 60.7841 0.1144 741 +743 3 266.1184 279.5833 61.32 0.1144 742 +744 3 266.0075 280.121 63.488 0.1144 743 +745 3 265.9514 280.5568 66.0733 0.1144 744 +746 3 265.6551 281.035 68.2111 0.1144 745 +747 3 264.7685 281.6185 69.2541 0.1144 746 +748 3 263.8808 282.2031 70.2968 0.1144 747 +749 3 263.4792 283.1389 71.2821 0.1144 748 +750 3 263.2218 284.181 72.2501 0.1144 749 +751 3 262.9656 285.2232 73.218 0.1144 750 +752 3 262.7082 286.2654 74.1863 0.1144 751 +753 3 262.6555 287.2996 75.3242 0.1144 752 +754 3 262.6933 288.3303 76.5363 0.1144 753 +755 3 262.7299 289.3611 77.7484 0.1144 754 +756 3 262.7665 290.3918 78.9603 0.1144 755 +757 3 263.4083 291.2098 79.2994 0.1144 756 +758 3 264.2743 291.8024 79.4774 0.1144 757 +759 3 265.0534 291.275 81.0698 0.1144 758 +760 3 265.8336 290.7476 82.6619 0.1144 759 +761 3 266.6126 290.2202 84.2542 0.1144 760 +762 3 267.3917 289.6928 85.8466 0.1144 761 +763 3 268.1708 289.1654 87.439 0.1144 762 +764 3 268.951 288.6381 89.031 0.1144 763 +765 3 269.7941 288.1747 90.4616 0.1144 764 +766 3 270.8466 287.9185 91.359 0.1144 765 +767 3 271.9002 287.6634 92.2564 0.1144 766 +768 3 272.9527 287.4071 93.1538 0.1144 767 +769 3 274.0063 287.152 94.0512 0.1144 768 +770 3 275.0588 286.8958 94.9488 0.1144 769 +771 3 276.1124 286.6406 95.8462 0.1144 770 +772 3 277.1649 286.3844 96.7436 0.1144 771 +773 3 278.2185 286.1293 97.641 0.1144 772 +774 3 279.271 285.873 98.5387 0.1144 773 +775 3 280.2297 286.1052 99.9306 0.1144 774 +776 3 281.1838 286.3592 101.3446 0.1144 775 +777 3 282.139 286.612 102.7586 0.1144 776 +778 3 283.0931 286.866 104.1723 0.1271 777 +779 3 284.0472 287.1188 105.5863 0.1398 778 +780 3 241.6746 240.6633 49.56 0.3051 539 +781 3 240.7376 240.0089 49.56 0.2415 780 +782 3 239.7286 239.4701 49.56 0.2288 781 +783 3 238.7436 238.905 49.56 0.2542 782 +784 3 237.9211 238.111 49.56 0.2924 783 +785 3 237.0871 237.3297 49.56 0.2796 784 +786 3 236.0701 236.8355 49.84 0.2542 785 +787 3 235.1435 236.1742 49.8778 0.2161 786 +788 3 234.5555 235.5542 51.24 0.2415 787 +789 3 233.6574 234.9936 51.5852 0.2542 788 +790 3 233.1175 234.0144 51.8 0.2796 789 +791 3 232.2274 233.3028 51.8686 0.2542 790 +792 3 231.398 232.5946 52.3494 0.2415 791 +793 3 231.088 231.6589 53.2 0.2288 792 +794 3 230.5229 230.834 53.2 0.2415 793 +795 3 229.61 230.1579 53.3341 0.2669 794 +796 3 228.7382 229.5447 54.1635 0.2924 795 +797 3 227.775 228.9888 54.588 0.2796 796 +798 3 226.7465 228.498 54.6 0.2542 797 +799 3 225.6895 228.0598 54.637 0.2415 798 +800 3 224.7274 227.4684 54.9755 0.2542 799 +801 3 223.7241 226.9547 55.3235 0.2542 800 +802 3 222.7002 226.496 55.72 0.2415 801 +803 3 221.6008 226.2317 55.72 0.2288 802 +804 3 220.4717 226.0567 55.72 0.2288 803 +805 3 219.4192 225.7112 56.28 0.2161 804 +806 3 218.4777 225.0866 56.56 0.2161 805 +807 3 217.5133 224.4814 56.56 0.2415 806 +808 3 216.4608 224.081 56.7403 0.3051 807 +809 3 215.6429 223.318 57.1637 0.3432 808 +810 3 214.6464 222.7929 57.4 0.3305 809 +811 3 213.5368 222.5286 57.4 0.2669 810 +812 3 212.8892 222.1488 59.08 0.2034 811 +813 3 212.1422 221.3045 59.08 0.1525 812 +814 3 211.3643 220.4831 59.08 0.1652 813 +815 3 210.599 219.8207 59.08 0.2161 814 +816 3 209.6929 219.2419 59.1007 0.2796 815 +817 3 208.9974 218.7374 60.1138 0.2796 816 +818 3 208.1062 218.3919 61.299 0.2288 817 +819 3 207.1063 217.9778 61.6 0.2034 818 +820 3 206.0939 217.4469 61.6 0.2034 819 +821 3 205.03 217.0809 61.6 0.2288 820 +822 3 204.0633 216.4723 61.6 0.2034 821 +823 3 203.0325 215.9872 61.6 0.1652 822 +824 3 201.9606 215.7115 61.6 0.1271 823 +825 3 201.0443 215.0388 61.6 0.1144 824 +826 3 200.0639 214.4554 61.6 0.1144 825 +827 3 199.0606 213.9452 61.6 0.1271 826 +828 3 198.1991 213.2405 61.6 0.1525 827 +829 3 197.3022 212.5815 61.8377 0.1907 828 +830 3 196.5564 211.7761 61.88 0.2034 829 +831 3 196.1468 210.7442 61.88 0.2034 830 +832 3 195.624 209.8611 61.88 0.178 831 +833 3 195.5817 208.7182 61.88 0.1652 832 +834 3 195.3666 207.6028 61.88 0.1398 833 +835 3 195.2808 206.7162 62.9541 0.1271 834 +836 3 195.2808 205.6111 63.5513 0.1144 835 +837 3 195.2808 204.4717 63.7003 0.1144 836 +838 3 195.2911 203.3426 64.12 0.1144 837 +839 3 195.5474 202.2306 64.12 0.1144 838 +840 3 195.6926 201.1038 64.12 0.1144 839 +841 3 195.9729 199.9964 64.12 0.1271 840 +842 3 196.2578 198.9176 64.12 0.1398 841 +843 3 196.5838 197.8342 64.12 0.1525 842 +844 3 196.6822 196.7028 64.3765 0.1398 843 +845 3 196.768 195.5668 64.4 0.1271 844 +846 3 197.0975 194.599 65.4251 0.1271 845 +847 3 197.1112 193.5168 66.08 0.1398 846 +848 3 197.0952 192.3762 66.1046 0.1525 847 +849 3 196.7783 191.3374 66.8682 0.1525 848 +850 3 196.307 190.5275 67.76 0.1525 849 +851 3 196.0942 189.4086 67.76 0.1525 850 +852 3 195.5657 188.4408 68.32 0.1398 851 +853 3 194.7294 187.7167 68.4536 0.1271 852 +854 3 194.4445 186.6848 69.1807 0.1144 853 +855 3 193.8233 185.7501 69.6508 0.1271 854 +856 3 193.439 184.6851 69.72 0.1398 855 +857 3 193.2239 183.6086 70.2388 0.1525 856 +858 3 193.1221 182.5275 70.56 0.1398 857 +859 3 192.4574 181.8045 70.9923 0.1271 858 +860 3 192.1531 180.7634 71.8796 0.1144 859 +861 3 191.8488 179.7213 72.7672 0.1144 860 +862 3 191.5445 178.6802 73.6548 0.1144 861 +863 3 191.2402 177.6392 74.5424 0.1144 862 +864 3 190.9347 176.597 75.43 0.1144 863 +865 3 190.6304 175.556 76.3174 0.1144 864 +866 3 190.3261 174.5149 77.205 0.1144 865 +867 3 189.8022 173.5402 77.5468 0.1144 866 +868 3 189.1398 172.6067 77.5468 0.1144 867 +869 3 188.4774 171.6744 77.5468 0.1144 868 +870 3 187.8151 170.742 77.5468 0.1144 869 +871 3 186.9193 170.067 77.9691 0.1144 870 +872 3 185.9915 169.4264 78.4476 0.1144 871 +873 3 185.0637 168.7858 78.9261 0.1144 872 +874 3 184.1325 168.144 79.2994 0.1144 873 +875 3 183.1864 167.501 79.2994 0.1144 874 +876 3 182.2392 166.8581 79.2994 0.1144 875 +877 3 181.2931 166.2163 79.2994 0.1144 876 +878 3 180.347 165.5734 79.2994 0.1144 877 +879 3 179.4844 164.8344 79.4066 0.1144 878 +880 3 178.7054 164.0016 79.6208 0.1144 879 +881 3 177.9263 163.1687 79.835 0.1144 880 +882 3 177.1473 162.3359 80.0492 0.1144 881 +883 3 176.3682 161.5031 80.2634 0.1144 882 +884 3 175.588 160.6702 80.4776 0.1271 883 +885 3 174.8089 159.8362 80.6921 0.1398 884 +886 3 174.0299 159.0034 80.9063 0.1525 885 +887 3 173.2519 158.1752 81.1983 0.1398 886 +888 3 172.4763 157.3549 81.6564 0.1271 887 +889 3 171.7007 156.5358 82.1145 0.1144 888 +890 3 170.925 155.7156 82.5726 0.1144 889 +891 3 170.1483 154.8965 83.0304 0.1144 890 +892 3 169.3726 154.0762 83.4884 0.1144 891 +893 3 168.597 153.2571 83.9465 0.1144 892 +894 3 167.8214 152.4369 84.4046 0.1144 893 +895 3 167.0457 151.6178 84.8627 0.1144 894 +896 3 166.0848 151.0572 85.2944 0.1144 895 +897 3 165.0495 150.603 85.7158 0.1144 896 +898 3 164.0141 150.1477 86.137 0.1144 897 +899 3 162.9239 149.8468 86.3092 0.1144 898 +900 3 161.7971 149.6512 86.3092 0.1144 899 +901 3 160.6714 149.4808 86.3092 0.1144 900 +902 3 159.58 149.8251 86.3092 0.1144 901 +903 3 158.4715 149.5711 86.3092 0.1144 902 +904 3 157.6226 148.9133 86.5875 0.1144 903 +905 3 156.9374 148.0153 87.0402 0.1144 904 +906 3 156.2521 147.1184 87.4927 0.1144 905 +907 3 155.5668 146.2215 87.9455 0.1144 906 +908 3 154.8816 145.3235 88.398 0.1144 907 +909 3 154.1963 144.4266 88.8507 0.1144 908 +910 3 153.5111 143.5297 89.3035 0.1144 909 +911 3 152.827 142.6316 89.756 0.1144 910 +912 3 152.1417 141.7347 90.2087 0.1144 911 +913 3 151.4564 140.8378 90.6615 0.1144 912 +914 3 150.7712 139.9398 91.114 0.1271 913 +915 3 150.0859 139.0429 91.5667 0.1398 914 +916 3 241.9972 239.7961 42.4637 0.2288 534 +917 3 242.0429 240.9378 42.4147 0.2796 916 +918 3 241.9125 242.0693 42.4371 0.3178 917 +919 3 241.5556 243.1538 42.3444 0.3559 918 +920 3 241.2627 244.2451 41.9922 0.3432 919 +921 3 241.1552 245.3823 41.946 0.3432 920 +922 3 241.1552 246.5171 41.6836 0.3305 921 +923 3 241.1552 247.6291 41.0589 0.3686 922 +924 3 241.1495 248.7708 40.88 0.4068 923 +925 3 241.1174 249.9137 40.88 0.4322 924 +926 3 241.0008 251.0508 40.88 0.4195 925 +927 3 240.8349 252.1811 40.8814 0.394 926 +928 3 240.8532 253.3159 40.8915 0.3813 927 +929 3 241.1312 254.4256 40.9223 0.3559 928 +930 3 241.4057 254.8546 41.0052 0.3432 929 +931 3 241.9263 255.8373 41.4901 0.3432 930 +932 3 242.353 256.8051 42.5244 0.3178 931 +933 3 242.9181 257.7649 43.0377 0.2796 932 +934 3 243.4958 258.7442 42.8288 0.2796 933 +935 3 243.934 259.7669 42.3074 0.3051 934 +936 3 244.2085 260.8663 42.049 0.3305 935 +937 3 244.5998 261.9325 42.2979 0.3559 936 +938 3 245.0517 262.9598 42.8252 0.3686 937 +939 3 245.5241 263.9906 43.1113 0.3686 938 +940 3 245.9554 265.0499 43.066 0.3432 939 +941 3 246.421 266.0852 42.8109 0.3178 940 +942 3 246.9896 267.0531 42.2999 0.3178 941 +943 3 247.6314 267.9877 42.0118 0.3305 942 +944 3 248.2995 268.9144 42.0109 0.3432 943 +945 3 248.9973 269.8181 42.058 0.3305 944 +946 3 249.6448 270.7493 42.3279 0.3051 945 +947 3 250.1505 271.7172 42.4556 0.2669 946 +948 3 250.2042 272.8268 42.0574 0.2542 947 +949 3 250.0509 273.9594 42.0 0.2415 948 +950 3 250.131 275.0794 41.9994 0.2542 949 +951 3 250.4365 276.181 41.9969 0.2415 950 +952 3 250.6641 277.301 41.9787 0.2669 951 +953 3 250.7648 278.4359 41.8659 0.2542 952 +954 3 250.7659 279.5581 41.405 0.2415 953 +955 3 250.7717 280.677 40.9312 0.1907 954 +956 3 250.8117 281.8187 40.88 0.1907 955 +957 3 251.0245 282.9329 40.88 0.2161 956 +958 3 251.4535 283.9923 40.88 0.2542 957 +959 3 251.8974 285.0448 40.88 0.2415 958 +960 3 252.1708 286.1476 40.88 0.2034 959 +961 3 252.4087 287.2595 40.88 0.1652 960 +962 3 252.7588 288.3486 40.8811 0.1652 961 +963 3 252.9887 289.464 40.8873 0.2034 962 +964 3 253.0379 290.6046 40.9391 0.2415 963 +965 3 253.0459 291.7463 40.9116 0.2669 964 +966 3 253.0539 292.8903 40.9035 0.2542 965 +967 3 253.0608 294.032 41.0455 0.2542 966 +968 3 253.1066 295.1428 41.6777 0.2669 967 +969 3 253.4257 296.2194 41.4974 0.2796 968 +970 3 253.8822 297.2432 40.9441 0.2669 969 +971 3 254.381 298.2694 40.88 0.2288 970 +972 3 254.8798 299.299 40.88 0.2161 971 +973 3 255.3683 300.3332 40.88 0.2288 972 +974 3 255.7675 301.4051 40.88 0.2415 973 +975 3 256.0352 302.5159 40.88 0.2415 974 +976 3 256.24 303.6416 40.88 0.2034 975 +977 3 256.256 304.7845 40.88 0.1907 976 +978 3 256.2549 305.9285 40.88 0.1907 977 +979 3 256.2457 307.0725 40.8794 0.2415 978 +980 3 256.1839 308.2142 40.8766 0.3051 979 +981 3 255.8716 309.3124 40.8587 0.3559 980 +982 3 255.5307 310.4038 40.7509 0.394 981 +983 3 255.4415 311.5192 40.2097 0.4068 982 +984 3 255.4941 312.6312 39.9403 0.4068 983 +985 3 255.7515 313.7271 40.3894 0.394 984 +986 3 255.9975 314.8208 40.8551 0.3686 985 +987 3 256.1874 315.9373 40.9156 0.3686 986 +988 3 255.978 317.0379 41.2118 0.3305 987 +989 3 255.5742 318.0881 41.7043 0.2924 988 +990 3 255.0823 319.1062 42.0538 0.2161 989 +991 3 254.9015 320.2193 42.4514 0.2034 990 +992 3 254.8832 321.345 42.9346 0.2288 991 +993 3 254.8821 322.4581 42.3979 0.2924 992 +994 3 254.8775 323.5976 42.28 0.3178 993 +995 3 254.8317 324.6958 42.9554 0.3051 994 +996 3 254.6338 325.7963 43.4034 0.2796 995 +997 3 254.1842 326.8271 43.8948 0.2669 996 +998 3 253.7678 327.8727 43.8463 0.2415 997 +999 3 253.6843 328.9526 43.2625 0.2288 998 +1000 3 254.0881 330.0085 43.0408 0.2034 999 +1001 3 254.7036 330.9546 42.7059 0.2161 1000 +1002 3 255.2195 331.903 42.0913 0.2161 1001 +1003 3 255.3282 333.0378 41.9972 0.2542 1002 +1004 3 255.247 334.1761 41.9821 0.2924 1003 +1005 3 254.961 335.2767 41.8956 0.3305 1004 +1006 3 254.5789 336.3326 41.5209 0.3559 1005 +1007 3 254.4439 337.4308 40.9612 0.3559 1006 +1008 3 254.5503 338.5645 40.9083 0.3559 1007 +1009 3 254.786 339.6811 41.0337 0.3432 1008 +1010 3 254.8866 340.7804 41.6478 0.3559 1009 +1011 3 254.9107 341.8901 42.2962 0.3686 1010 +1012 3 255.1314 342.9563 43.1029 0.3686 1011 +1013 3 255.3133 344.0706 43.2737 0.3305 1012 +1014 3 255.3442 345.2123 43.1642 0.2796 1013 +1015 3 255.3602 346.3552 43.2387 0.2415 1014 +1016 3 255.4701 347.4603 43.8556 0.2415 1015 +1017 3 255.7286 348.5276 44.6281 0.2542 1016 +1018 3 255.8007 349.6293 45.3202 0.2669 1017 +1019 3 255.8396 350.7607 45.6966 0.2924 1018 +1020 3 256.0741 351.8681 45.4474 0.3305 1019 +1021 3 256.5466 352.9057 45.4188 0.3686 1020 +1022 3 257.0122 353.9433 45.7064 0.3686 1021 +1023 3 257.3462 355.0026 46.3456 0.3432 1022 +1024 3 257.591 356.1158 46.4738 0.3051 1023 +1025 3 257.5316 357.2506 46.48 0.2542 1024 +1026 3 257.3062 358.3706 46.4803 0.2288 1025 +1027 3 257.2879 359.502 46.4822 0.2034 1026 +1028 3 257.6174 360.5968 46.4932 0.2415 1027 +1029 3 257.9594 361.6756 46.5674 0.2415 1028 +1030 3 257.9297 362.791 46.916 0.2796 1029 +1031 3 257.5556 363.8355 47.5132 0.2669 1030 +1032 3 257.1998 364.9005 47.6694 0.3178 1031 +1033 3 257.1712 366.0251 48.0399 0.3432 1032 +1034 3 257.1678 367.0799 49.0921 0.3813 1033 +1035 3 257.1449 368.1083 50.2642 0.3559 1034 +1036 3 257.0065 369.2054 50.5201 0.3178 1035 +1037 3 256.6278 370.2579 50.2874 0.2542 1036 +1038 3 256.3201 371.3149 50.7184 0.2288 1037 +1039 3 256.4837 372.4223 50.9897 0.2161 1038 +1040 3 257.0259 373.4005 51.2366 0.2542 1039 +1041 3 257.7649 374.2459 51.774 0.2542 1040 +1042 3 258.0875 375.3338 52.0772 0.2669 1041 +1043 3 258.2019 376.4721 52.0836 0.2542 1042 +1044 3 258.7019 377.5006 52.1004 0.2924 1043 +1045 3 259.3128 378.4638 52.1906 0.3051 1044 +1046 3 259.3414 379.5803 52.7772 0.3178 1045 +1047 3 259.0336 380.666 53.1936 0.2924 1046 +1048 3 258.973 381.8089 53.1558 0.2669 1047 +1049 3 258.8071 382.9288 52.8713 0.2415 1048 +1050 3 258.5486 383.9001 51.6541 0.2288 1049 +1051 3 258.5749 385.0235 52.1587 0.2288 1050 +1052 3 258.695 386.1023 52.8917 0.2288 1051 +1053 3 258.981 387.1788 52.6616 0.2161 1052 +1054 3 259.1023 388.2404 53.4971 0.2288 1053 +1055 3 259.3745 389.3158 53.0928 0.2288 1054 +1056 3 259.2487 390.4335 53.076 0.2542 1055 +1057 3 258.4879 391.2606 53.2053 0.2288 1056 +1058 3 257.7695 392.1495 53.2804 0.2161 1057 +1059 3 257.5293 393.2443 53.7457 0.1907 1058 +1060 3 257.2101 394.3357 53.5021 0.1907 1059 +1061 3 257.1518 395.4648 53.0905 0.178 1060 +1062 3 256.9207 396.5356 52.3426 0.1652 1061 +1063 3 256.7525 397.3615 52.7078 0.178 1062 +1064 3 256.7033 398.4998 52.5518 0.2034 1063 +1065 3 256.645 399.6186 53.0986 0.2288 1064 +1066 3 256.4436 400.7386 53.1997 0.2288 1065 +1067 3 256.5614 401.8689 53.1983 0.2288 1066 +1068 3 256.2148 402.9568 53.1882 0.2288 1067 +1069 3 255.7057 403.9716 53.1331 0.2161 1068 +1070 3 255.6131 405.0904 52.7808 0.2161 1069 +1071 3 254.9084 405.9576 52.7556 0.1271 1070 +1072 3 254.0069 406.3477 53.9748 0.1525 1071 +1073 3 253.2004 407.1393 54.3497 0.1907 1072 +1074 3 252.4362 407.9859 54.4796 0.2034 1073 +1075 3 251.7418 408.8782 54.885 0.1907 1074 +1076 3 251.0748 409.7728 55.0449 0.1525 1075 +1077 3 250.4536 410.6788 54.2718 0.1271 1076 +1078 3 249.7844 411.4785 54.2175 0.1144 1077 +1079 3 249.0499 412.2118 55.2782 0.1144 1078 +1080 3 248.5329 413.1922 55.8146 0.1398 1079 +1081 3 248.0158 414.176 55.9532 0.178 1080 +1082 3 247.2962 415.0592 55.7525 0.2415 1081 +1083 3 246.5892 415.955 55.6077 0.2669 1082 +1084 3 245.8273 416.7821 55.9518 0.2796 1083 +1085 3 245.0425 417.5852 56.4718 0.2415 1084 +1086 3 244.2795 418.4249 56.7983 0.2161 1085 +1087 3 243.5896 419.3126 57.2698 0.1907 1086 +1088 3 242.8518 420.166 57.4882 0.1907 1087 +1089 3 241.9754 420.7643 58.1658 0.178 1088 +1090 3 241.1255 421.4027 58.8 0.1525 1089 +1091 3 240.3327 422.2207 58.8 0.1271 1090 +1092 3 239.6977 423.1496 58.8 0.1144 1091 +1093 3 239.3889 424.2158 58.8 0.1144 1092 +1094 3 238.834 425.2145 58.819 0.1144 1093 +1095 3 238.3021 426.2132 59.08 0.1144 1094 +1096 3 237.5333 427.0049 59.08 0.1144 1095 +1097 3 236.7531 427.8057 59.08 0.1144 1096 +1098 3 236.411 428.8376 59.619 0.1144 1097 +1099 3 235.5187 429.5182 59.64 0.1144 1098 +1100 3 234.774 430.3762 59.64 0.1144 1099 +1101 3 234.1654 431.328 59.64 0.1144 1100 +1102 3 233.9503 432.4423 59.7985 0.1144 1101 +1103 3 233.5831 433.4547 60.5346 0.1271 1102 +1104 3 232.4871 433.7053 60.76 0.1398 1103 +1105 3 232.0032 434.5713 61.035 0.1525 1104 +1106 3 232.0032 435.7153 61.04 0.1398 1105 +1107 3 231.7458 436.7918 61.339 0.1271 1106 +1108 3 231.2928 437.7996 61.8579 0.1144 1107 +1109 3 230.5675 438.676 61.88 0.1144 1108 +1110 3 229.8159 439.5134 61.88 0.1144 1109 +1111 3 228.8572 440.059 61.9853 0.1144 1110 +1112 3 228.0495 440.6768 62.44 0.1144 1111 +1113 3 227.3929 441.5657 62.9698 0.1144 1112 +1114 3 226.663 442.3368 63.5522 0.1144 1113 +1115 3 225.765 443.038 63.56 0.1144 1114 +1116 3 224.8498 443.7198 63.56 0.1144 1115 +1117 3 223.9826 444.4143 64.0192 0.1144 1116 +1118 3 223.1715 445.2059 64.12 0.1144 1117 +1119 3 222.3078 445.9552 64.12 0.1144 1118 +1120 3 221.483 446.7263 64.3986 0.1271 1119 +1121 3 220.6948 447.542 64.4 0.1525 1120 +1122 3 219.68 448.0156 64.5372 0.1907 1121 +1123 3 219.0531 448.6516 65.8 0.2034 1122 +1124 3 218.4205 449.6012 65.8 0.1907 1123 +1125 3 217.6838 450.474 65.8 0.1525 1124 +1126 3 217.0477 451.3721 66.2245 0.1271 1125 +1127 3 216.4334 452.2392 66.64 0.1144 1126 +1128 3 215.7092 453.1212 66.64 0.1144 1127 +1129 3 215.048 454.0502 66.7044 0.1144 1128 +1130 3 214.4611 454.9905 67.34 0.1144 1129 +1131 3 214.0424 455.884 68.32 0.1144 1130 +1132 3 213.6992 456.925 68.32 0.1144 1131 +1133 3 213.3137 457.8208 68.32 0.1144 1132 +1134 3 212.3836 458.1731 68.32 0.1144 1133 +1135 3 211.8894 459.1753 68.5017 0.1271 1134 +1136 3 211.0897 459.9383 68.8246 0.1398 1135 +1137 3 210.385 460.579 70.2822 0.1525 1136 +1138 3 209.7032 461.3146 70.56 0.1525 1137 +1139 3 208.8486 462.0044 70.56 0.1652 1138 +1140 3 208.041 462.8132 70.56 0.2161 1139 +1141 3 207.7504 463.7776 70.28 0.2796 1140 +1142 3 255.8991 405.8008 53.2 0.2034 1070 +1143 3 256.4585 406.7698 53.2 0.2161 1142 +1144 3 256.8131 407.8577 53.2 0.178 1143 +1145 3 257.0374 408.9789 53.2 0.1398 1144 +1146 3 257.2673 410.0908 53.2 0.1144 1145 +1147 3 257.2856 411.2348 53.2 0.1144 1146 +1148 3 257.4 412.3697 53.2 0.1271 1147 +1149 3 257.3222 413.5091 53.2081 0.1398 1148 +1150 3 257.3108 414.6462 53.4486 0.1525 1149 +1151 3 257.392 415.7857 53.48 0.1525 1150 +1152 3 257.2719 416.9216 53.48 0.178 1151 +1153 3 257.1266 418.0554 53.48 0.2161 1152 +1154 3 256.7902 419.1158 53.8745 0.2415 1153 +1155 3 256.7136 420.2473 54.04 0.2161 1154 +1156 3 256.8108 421.381 54.1915 0.1652 1155 +1157 3 256.828 422.5101 54.6176 0.1271 1156 +1158 3 256.828 423.6507 54.8279 0.1144 1157 +1159 3 256.7262 424.7855 54.88 0.1144 1158 +1160 3 256.8131 425.9238 54.88 0.1271 1159 +1161 3 256.828 427.0666 54.88 0.1398 1160 +1162 3 256.7891 428.2095 54.88 0.1525 1161 +1163 3 256.4345 429.2768 54.88 0.1398 1162 +1164 3 256.232 430.4025 54.88 0.1271 1163 +1165 3 255.9643 431.5122 54.88 0.1144 1164 +1166 3 255.3763 432.4915 54.88 0.1144 1165 +1167 3 254.9347 433.5257 54.88 0.1144 1166 +1168 3 254.1762 434.3493 54.88 0.1144 1167 +1169 3 253.968 435.4567 54.88 0.1144 1168 +1170 3 253.7381 436.5561 54.8772 0.1144 1169 +1171 3 253.4269 437.6452 54.6 0.1398 1170 +1172 3 253.2816 438.7629 54.332 0.1652 1171 +1173 3 253.2816 439.9069 54.32 0.1907 1172 +1174 3 253.2816 441.0463 54.474 0.1652 1173 +1175 3 253.2816 442.1857 54.6 0.1398 1174 +1176 3 253.2816 443.3297 54.6 0.1144 1175 +1177 3 253.3171 444.4726 54.6 0.1144 1176 +1178 3 253.4635 445.604 54.49 0.1144 1177 +1179 3 253.5127 446.7389 54.2696 0.1144 1178 +1180 3 253.6248 447.8119 53.48 0.1144 1179 +1181 3 253.6248 448.9559 53.48 0.1144 1180 +1182 3 253.6248 450.0999 53.48 0.1144 1181 +1183 3 253.6248 451.2348 53.76 0.1144 1182 +1184 3 253.6248 452.3788 53.76 0.1144 1183 +1185 3 253.6248 453.5228 53.76 0.1144 1184 +1186 3 253.6248 454.6668 53.76 0.1144 1185 +1187 3 253.6248 455.8108 53.76 0.1144 1186 +1188 3 253.6248 456.9548 53.76 0.1144 1187 +1189 3 253.6248 458.0931 53.655 0.1144 1188 +1190 3 253.7369 459.0723 52.6481 0.1144 1189 +1191 3 253.7392 460.2152 52.64 0.1144 1190 +1192 3 253.7392 461.3592 52.64 0.1144 1191 +1193 3 253.7392 462.5032 52.64 0.1144 1192 +1194 3 253.7392 463.6472 52.64 0.1144 1193 +1195 3 253.7392 464.7912 52.64 0.1144 1194 +1196 3 253.7392 465.9352 52.694 0.1144 1195 +1197 3 253.7392 467.0746 52.92 0.1144 1196 +1198 3 253.7278 468.2175 52.9298 0.1144 1197 +1199 3 253.3331 468.937 54.32 0.1144 1198 +1200 3 253.1672 470.0559 54.1615 0.1144 1199 +1201 3 253.1672 471.1976 54.04 0.1144 1200 +1202 3 253.4829 472.234 53.366 0.1144 1201 +1203 3 253.7266 473.3071 52.92 0.1144 1202 +1204 3 253.7392 474.45 52.92 0.1144 1203 +1205 3 253.7392 475.594 52.92 0.1144 1204 +1206 3 253.7392 476.7288 53.2 0.1144 1205 +1207 3 253.7632 477.8728 53.2 0.1144 1206 +1208 3 254.0538 478.9631 53.3014 0.1144 1207 +1209 3 254.206 480.0647 53.48 0.1144 1208 +1210 3 254.4004 481.1904 53.48 0.1144 1209 +1211 3 254.4256 482.2944 54.0212 0.1144 1210 +1212 3 254.4313 483.4086 54.5112 0.1144 1211 +1213 3 254.8363 484.4485 54.6 0.1144 1212 +1214 3 255.1944 485.5205 54.6 0.1144 1213 +1215 3 255.2264 486.6622 54.6 0.1144 1214 +1216 3 255.2264 487.805 54.5437 0.1398 1215 +1217 3 255.2264 488.9433 54.2685 0.1907 1216 +1218 3 255.2424 489.9683 53.1927 0.2542 1217 +1219 3 255.6989 490.9716 52.64 0.2669 1218 +1220 3 256.1244 492.0344 52.64 0.2288 1219 +1221 3 256.1244 493.1773 52.64 0.178 1220 +1222 3 256.0283 494.3167 52.64 0.1652 1221 +1223 3 255.7801 495.4309 52.64 0.178 1222 +1224 3 255.5696 496.5292 52.9197 0.178 1223 +1225 3 255.5696 497.6526 53.2 0.1525 1224 +1226 3 255.6954 498.7737 53.2 0.1271 1225 +1227 3 256.256 499.7038 53.7107 0.1144 1226 +1228 3 256.2938 500.5766 52.08 0.1144 1227 +1229 3 256.2434 500.7414 52.36 0.1144 1228 +1230 3 256.3841 500.969 52.36 0.1271 1229 +1231 3 256.5992 502.065 52.36 0.1398 1230 +1232 3 256.5992 503.2033 52.5294 0.1652 1231 +1233 3 256.5992 504.3438 52.64 0.1652 1232 +1234 3 256.6839 505.4753 52.7649 0.1652 1233 +1235 3 257.1254 506.5014 52.92 0.1525 1234 +1236 3 257.4538 507.5951 52.92 0.1525 1235 +1237 3 257.9857 508.5778 52.92 0.1525 1236 +1238 3 258.6996 509.3752 53.0505 0.1652 1237 +1239 3 259.2773 510.3556 53.2459 0.178 1238 +1240 3 259.8024 511.2502 53.9904 0.2034 1239 +1241 3 259.783 512.3278 54.6 0.2034 1240 +1242 3 259.4592 513.2705 55.16 0.2034 1241 +1243 3 259.5084 514.411 55.16 0.178 1242 +1244 3 259.7887 515.5047 55.16 0.1525 1243 +1245 3 259.6686 516.6418 55.16 0.1271 1244 +1246 3 259.5736 517.7813 55.16 0.1144 1245 +1247 3 259.4786 518.9173 55.16 0.1144 1246 +1248 3 259.4592 520.0601 55.16 0.1144 1247 +1249 3 259.4592 521.2041 55.16 0.1144 1248 +1250 3 259.4592 522.3481 55.16 0.1144 1249 +1251 3 259.4592 523.4921 55.16 0.1144 1250 +1252 3 259.4592 524.5194 56.1921 0.1144 1251 +1253 3 259.4592 525.6325 56.56 0.1144 1252 +1254 3 259.3036 526.764 56.56 0.1144 1253 +1255 3 259.116 527.8896 56.5799 0.1144 1254 +1256 3 259.116 529.0073 57.0494 0.1144 1255 +1257 3 259.076 530.1445 57.12 0.1144 1256 +1258 3 258.7625 531.237 57.12 0.1144 1257 +1259 3 258.5474 532.3421 57.12 0.1144 1258 +1260 3 258.544 533.3271 58.2722 0.1144 1259 +1261 3 258.504 534.4299 58.9375 0.1144 1260 +1262 3 258.4113 535.559 59.08 0.1144 1261 +1263 3 258.0006 536.5932 59.08 0.1144 1262 +1264 3 257.972 537.7349 59.08 0.1144 1263 +1265 3 257.9011 538.8274 59.6008 0.1144 1264 +1266 3 257.4583 539.7644 60.7578 0.1144 1265 +1267 3 257.1277 540.8283 61.04 0.1144 1266 +1268 3 256.7159 541.8945 61.0708 0.1144 1267 +1269 3 256.7136 542.9996 61.6 0.1144 1268 +1270 3 256.4848 543.8873 62.5806 0.1144 1269 +1271 3 256.4848 545.0233 62.72 0.1144 1270 +1272 3 256.4848 546.1673 62.72 0.1144 1271 +1273 3 256.4848 547.1946 63.6913 0.1144 1272 +1274 3 256.4848 548.3055 64.12 0.1144 1273 +1275 3 256.4848 549.4495 64.12 0.1144 1274 +1276 3 256.5123 550.5923 64.12 0.1271 1275 +1277 3 256.7136 551.7077 64.12 0.1525 1276 +1278 3 257.1357 552.6767 64.4815 0.178 1277 +1279 3 257.7993 553.4317 65.52 0.178 1278 +1280 3 258.1836 554.4934 65.52 0.1525 1279 +1281 3 258.5703 555.5664 65.52 0.1271 1280 +1282 3 258.7579 556.6944 65.52 0.1144 1281 +1283 3 259.3002 557.6645 65.52 0.1144 1282 +1284 3 259.4592 558.7593 65.52 0.1144 1283 +1285 3 259.4592 559.9033 65.52 0.1144 1284 +1286 3 259.7498 560.7865 65.8423 0.1144 1285 +1287 3 259.9683 561.8127 66.9578 0.1144 1286 +1288 3 260.1868 562.84 68.0733 0.1144 1287 +1289 3 260.4053 563.8662 69.1888 0.1144 1288 +1290 3 260.6226 564.8923 70.3044 0.1144 1289 +1291 3 260.8412 565.9185 71.4199 0.1144 1290 +1292 3 260.8023 567.0007 72.0658 0.1144 1291 +1293 3 260.6009 568.1173 72.4156 0.1144 1292 +1294 3 260.3996 569.235 72.7653 0.1144 1293 +1295 3 260.1971 570.3515 73.115 0.1144 1294 +1296 3 259.9957 571.468 73.4644 0.1144 1295 +1297 3 259.7944 572.5857 73.8142 0.1144 1296 +1298 3 259.593 573.7023 74.1639 0.1144 1297 +1299 3 259.3917 574.82 74.5136 0.1144 1298 +1300 3 259.1892 575.9365 74.8633 0.1144 1299 +1301 3 258.9879 577.053 75.213 0.1144 1300 +1302 3 258.6481 578.1318 75.511 0.1144 1301 +1303 3 258.2122 579.1843 75.7733 0.1144 1302 +1304 3 257.7764 580.2368 76.0357 0.1144 1303 +1305 3 257.3405 581.2893 76.298 0.1144 1304 +1306 3 256.9046 582.3418 76.5604 0.1144 1305 +1307 3 256.7445 583.4457 76.6083 0.1144 1306 +1308 3 256.7822 584.5886 76.5005 0.1144 1307 +1309 3 256.8211 585.7314 76.3924 0.1144 1308 +1310 3 256.86 586.8731 76.2846 0.1144 1309 +1311 3 256.8989 588.016 76.1768 0.1144 1310 +1312 3 256.9378 589.1589 76.0687 0.1144 1311 +1313 3 256.9756 590.3006 75.9609 0.1144 1312 +1314 3 257.0145 591.4434 75.8531 0.1144 1313 +1315 3 257.0534 592.5863 75.745 0.1144 1314 +1316 3 257.0923 593.728 75.6372 0.1144 1315 +1317 3 257.1312 594.8708 75.5292 0.1144 1316 +1318 3 257.1701 596.0137 75.4214 0.1144 1317 +1319 3 256.9733 597.0994 75.3561 0.1271 1318 +1320 3 256.6106 598.1187 75.3561 0.1525 1319 +1321 3 256.7548 599.2409 75.4191 0.178 1320 +1322 3 256.7742 600.3849 75.521 0.178 1321 +1323 3 256.7948 601.5278 75.6227 0.1525 1322 +1324 3 256.8143 602.6706 75.7243 0.1271 1323 +1325 3 256.8337 603.8135 75.826 0.1144 1324 +1326 3 256.8543 604.9564 75.9276 0.1144 1325 +1327 3 256.8738 606.1004 76.0292 0.1144 1326 +1328 3 256.8944 607.2432 76.1309 0.1271 1327 +1329 3 256.9138 608.3861 76.2325 0.1652 1328 +1330 3 256.5981 500.8398 52.08 0.2034 1228 +1331 3 256.828 501.93 52.0551 0.2034 1330 +1332 3 256.828 503.034 51.3906 0.2034 1331 +1333 3 256.828 504.1722 51.24 0.1652 1332 +1334 3 257.0374 505.1984 50.96 0.1398 1333 +1335 3 257.273 506.2909 50.68 0.1144 1334 +1336 3 257.6288 507.3057 50.68 0.1144 1335 +1337 3 258.0258 507.9268 49.2192 0.1271 1336 +1338 3 258.544 508.5492 47.6896 0.1525 1337 +1339 3 258.5509 509.6566 47.1794 0.178 1338 +1340 3 258.8758 510.6793 46.48 0.178 1339 +1341 3 258.8872 511.8233 46.48 0.1652 1340 +1342 3 258.8426 512.8094 45.3306 0.1525 1341 +1343 3 258.7728 513.8139 44.151 0.1525 1342 +1344 3 258.671 514.943 43.958 0.1398 1343 +1345 3 258.5612 516.047 43.5095 0.1271 1344 +1346 3 258.1974 517.0319 42.84 0.1271 1345 +1347 3 258.0406 518.1645 42.84 0.1652 1346 +1348 3 257.972 519.3028 42.7512 0.2034 1347 +1349 3 257.6094 520.3324 42.009 0.2161 1348 +1350 3 257.4847 521.4546 41.72 0.1907 1349 +1351 3 257.4046 522.5906 41.6326 0.2034 1350 +1352 3 257.7226 523.6523 41.3837 0.2542 1351 +1353 3 258.3678 524.5206 40.8456 0.3051 1352 +1354 3 258.6584 525.422 40.0632 0.2796 1353 +1355 3 258.6859 526.5649 40.04 0.2288 1354 +1356 3 259.1926 527.5327 39.7222 0.1907 1355 +1357 3 259.7978 528.4594 39.2613 0.1907 1356 +1358 3 260.3321 529.4283 38.92 0.1652 1357 +1359 3 260.3744 530.5678 38.8805 0.1398 1358 +1360 3 260.387 531.6809 38.36 0.1144 1359 +1361 3 260.7759 532.7368 38.36 0.1144 1360 +1362 3 261.2873 533.4964 37.4413 0.1144 1361 +1363 3 261.404 534.4619 36.4 0.1144 1362 +1364 3 261.8799 535.4881 36.4 0.1144 1363 +1365 3 261.976 536.6092 36.3927 0.1271 1364 +1366 3 261.976 537.68 35.7056 0.1525 1365 +1367 3 262.4714 538.6089 35.28 0.178 1366 +1368 3 263.2172 539.4463 34.9297 0.178 1367 +1369 3 264.1004 540.0847 34.72 0.1525 1368 +1370 3 265.0351 540.6796 34.72 0.1398 1369 +1371 3 265.5647 541.6646 34.4669 0.1398 1370 +1372 3 266.0269 542.6678 33.88 0.1525 1371 +1373 3 266.7305 543.3886 33.0394 0.1398 1372 +1374 3 267.2258 544.1585 31.645 0.1271 1373 +1375 3 268.077 544.7922 31.8298 0.1144 1374 +1376 3 268.848 545.5221 32.2 0.1144 1375 +1377 3 268.9544 546.6032 31.92 0.1144 1376 +1378 3 241.0259 254.9621 40.3556 0.4195 929 +1379 3 240.7491 255.9963 39.4316 0.3559 1378 +1380 3 240.1965 256.947 38.8573 0.2924 1379 +1381 3 239.342 257.6929 38.6224 0.2669 1380 +1382 3 238.492 258.4559 38.5112 0.2669 1381 +1383 3 237.6397 259.2064 38.2323 0.2415 1382 +1384 3 236.776 259.9202 38.523 0.2034 1383 +1385 3 235.7715 260.4099 38.729 0.178 1384 +1386 3 234.8518 261.0002 38.1262 0.1907 1385 +1387 3 234.0601 261.7918 37.6088 0.2415 1386 +1388 3 233.1621 262.4874 37.4693 0.2669 1387 +1389 3 232.2309 263.1394 37.1731 0.2796 1388 +1390 3 231.2585 263.6771 36.5442 0.2415 1389 +1391 3 230.2918 264.272 36.3698 0.2288 1390 +1392 3 229.3068 264.8497 36.2247 0.2161 1391 +1393 3 228.4122 265.4904 35.5292 0.2288 1392 +1394 3 227.5633 266.2385 35.2262 0.2161 1393 +1395 3 226.7923 267.0771 34.9933 0.2034 1394 +1396 3 226.2203 267.9969 34.1695 0.1907 1395 +1397 3 225.6826 268.943 33.3029 0.1907 1396 +1398 3 225.0946 269.9119 33.0593 0.1907 1397 +1399 3 224.5615 270.9232 33.0366 0.2034 1398 +1400 3 224.049 271.946 33.0215 0.2288 1399 +1401 3 223.5662 272.9824 32.9342 0.2542 1400 +1402 3 223.3237 274.0715 32.4075 0.2669 1401 +1403 3 223.2299 275.2052 32.4461 0.2669 1402 +1404 3 222.9805 276.3149 32.69 0.2542 1403 +1405 3 223.1132 277.4028 32.0418 0.2415 1404 +1406 3 222.921 278.5171 31.8049 0.2034 1405 +1407 3 222.3067 279.4517 31.2903 0.2034 1406 +1408 3 221.5676 280.3029 30.8081 0.2161 1407 +1409 3 220.6307 280.9515 30.6561 0.2542 1408 +1410 3 219.799 281.6825 29.967 0.2542 1409 +1411 3 218.8792 282.3529 29.6834 0.2415 1410 +1412 3 217.8645 282.8792 29.6657 0.2542 1411 +1413 3 216.8681 283.442 29.5963 0.2924 1412 +1414 3 216.0078 284.1742 29.1654 0.3305 1413 +1415 3 215.3019 285.0001 28.2937 0.3432 1414 +1416 3 214.8524 285.9725 27.3112 0.3559 1415 +1417 3 214.1339 286.691 26.0282 0.3813 1416 +1418 3 213.3205 287.2962 24.7307 0.3813 1417 +1419 3 212.5998 287.9254 23.2058 0.3305 1418 +1420 3 211.9386 288.7422 22.1634 0.2415 1419 +1421 3 211.2602 289.6562 22.3306 0.178 1420 +1422 3 210.5692 290.5451 21.8576 0.178 1421 +1423 3 209.8554 291.3459 20.9138 0.1907 1422 +1424 3 209.0317 291.8859 19.5966 0.2034 1423 +1425 3 208.073 292.0003 18.1381 0.178 1424 +1426 3 207.6223 292.856 17.92 0.1652 1425 +1427 3 207.1212 293.8055 17.92 0.1525 1426 +1428 3 206.1797 294.4347 17.712 0.1398 1427 +1429 3 205.3366 295.1108 16.8314 0.1398 1428 +1430 3 204.5975 295.9436 16.6172 0.1652 1429 +1431 3 203.9432 296.6804 17.64 0.2161 1430 +1432 3 203.2579 297.4423 18.1815 0.2415 1431 +1433 3 202.6779 298.3563 17.6616 0.2288 1432 +1434 3 202.385 299.3837 16.8328 0.1907 1433 +1435 3 201.9904 300.4338 16.52 0.178 1434 +1436 3 201.511 301.4612 16.2582 0.178 1435 +1437 3 201.2296 302.5651 16.2014 0.1907 1436 +1438 3 200.7159 303.398 15.4339 0.1907 1437 +1439 3 199.9758 304.2239 14.8506 0.1907 1438 +1440 3 199.3992 305.1048 14.28 0.1907 1439 +1441 3 241.813 228.7279 37.5626 0.3686 1 +1442 3 242.3976 227.7658 37.7896 0.4449 1441 +1443 3 242.8586 226.7397 38.2886 0.4322 1442 +1444 3 243.275 225.6952 38.6366 0.3686 1443 +1445 3 243.4272 224.5752 38.7629 0.3432 1444 +1446 3 243.3471 223.461 39.2529 0.3686 1445 +1447 3 242.9936 222.4325 39.8796 0.4068 1446 +1448 3 242.4811 221.467 40.6227 0.4068 1447 +1449 3 242.234 220.4419 41.6968 0.394 1448 +1450 3 242.6756 219.4158 42.2038 0.4068 1449 +1451 3 243.219 218.4502 42.8907 0.4322 1450 +1452 3 243.5954 217.3737 43.1203 0.4576 1451 +1453 3 244.5037 215.9918 43.1284 0.2542 1452 +1454 3 245.3972 215.2916 43.1791 0.2924 1453 +1455 3 246.429 214.8054 43.3756 0.3051 1454 +1456 3 247.1063 214.174 44.24 0.2415 1455 +1457 3 247.8934 213.4555 44.24 0.178 1456 +1458 3 248.693 212.6582 44.24 0.1271 1457 +1459 3 249.527 211.9798 44.24 0.1144 1458 +1460 3 250.6069 211.648 44.24 0.1144 1459 +1461 3 251.3974 210.8472 43.9852 0.1144 1460 +1462 3 252.3458 210.2386 43.68 0.1525 1461 +1463 3 253.2816 209.5808 43.68 0.2415 1462 +1464 3 253.4944 209.4344 43.68 0.1144 1463 +1465 3 254.2609 208.7251 43.12 0.1144 1464 +1466 3 255.2127 208.208 43.12 0.1271 1465 +1467 3 256.0535 207.7424 42.5779 0.1398 1466 +1468 3 256.6095 206.7677 42.4074 0.1525 1467 +1469 3 257.1426 205.7804 42.28 0.1398 1468 +1470 3 257.8336 204.8915 42.0 0.1271 1469 +1471 3 258.4605 203.9363 42.0 0.1398 1470 +1472 3 259.2178 203.084 42.0 0.1907 1471 +1473 3 260.0015 202.2592 42.0 0.2415 1472 +1474 3 260.943 201.7524 41.8981 0.2542 1473 +1475 3 261.4909 201.4012 39.9728 0.2161 1474 +1476 3 262.4794 200.8956 39.76 0.1907 1475 +1477 3 263.3259 200.1428 39.76 0.1652 1476 +1478 3 264.1954 199.5159 39.76 0.178 1477 +1479 3 264.6209 198.8238 38.9211 0.1907 1478 +1480 3 264.7605 197.8354 37.5533 0.2288 1479 +1481 3 265.2478 196.9796 36.8018 0.2415 1480 +1482 3 266.2008 196.6021 35.7311 0.2288 1481 +1483 3 266.8975 196.0221 34.3294 0.2034 1482 +1484 3 267.3139 195.1492 32.8378 0.1907 1483 +1485 3 268.0872 194.4834 31.5717 0.1907 1484 +1486 3 268.7599 193.8016 30.0639 0.178 1485 +1487 3 269.3708 193.1026 28.4362 0.178 1486 +1488 3 269.8719 192.1794 27.326 0.1652 1487 +1489 3 270.373 191.2562 26.2161 0.178 1488 +1490 3 270.874 190.3044 25.4108 0.1652 1489 +1491 3 271.3751 189.2759 25.4108 0.1652 1490 +1492 3 271.8075 188.3116 24.6176 0.1652 1491 +1493 3 272.1885 187.3964 23.2201 0.1907 1492 +1494 3 253.4772 209.6986 44.2061 0.2924 1463 +1495 3 254.5068 209.8096 44.8 0.2288 1494 +1496 3 255.6405 209.924 44.8 0.178 1495 +1497 3 256.7845 209.924 44.8 0.1525 1496 +1498 3 257.9285 209.924 44.8 0.1652 1497 +1499 3 259.021 209.9515 45.1455 0.178 1498 +1500 3 260.0175 210.3278 45.6238 0.2034 1499 +1501 3 261.134 210.52 45.92 0.2034 1500 +1502 3 262.2437 210.7248 46.216 0.2034 1501 +1503 3 263.3728 210.7248 46.6763 0.2034 1502 +1504 3 264.4528 210.7248 47.5518 0.2161 1503 +1505 3 265.4629 210.7248 48.6612 0.2288 1504 +1506 3 266.4101 210.3793 49.28 0.2161 1505 +1507 3 267.4008 210.0384 49.8187 0.2034 1506 +1508 3 268.3744 209.9755 51.0804 0.178 1507 +1509 3 269.1821 209.6952 52.7083 0.1652 1508 +1510 3 270.318 209.6952 52.92 0.1525 1509 +1511 3 271.4323 209.5808 53.3932 0.1525 1510 +1512 3 272.5397 209.5316 54.021 0.1398 1511 +1513 3 273.5979 209.2262 54.4026 0.1271 1512 +1514 3 274.4239 208.5432 55.0984 0.1144 1513 +1515 3 275.2521 207.8248 55.9 0.1144 1514 +1516 3 276.0804 207.1075 56.7017 0.1144 1515 +1517 3 276.9361 206.5698 57.9446 0.1271 1516 +1518 3 277.8044 206.1168 59.3914 0.1398 1517 +1519 3 278.6967 205.7164 60.8247 0.1525 1518 +1520 3 279.6554 205.4647 62.2205 0.1398 1519 +1521 3 280.6152 205.213 63.6163 0.1271 1520 +1522 3 281.5739 204.9602 65.0118 0.1144 1521 +1523 3 282.552 204.5758 66.0999 0.1144 1522 +1524 3 283.5335 204.1594 67.1149 0.1144 1523 +1525 3 284.5151 203.7441 68.1296 0.1144 1524 +1526 3 285.4966 203.3277 69.1446 0.1271 1525 +1527 3 286.3581 202.6756 70.0437 0.1398 1526 +1528 3 287.2104 202.0041 70.933 0.1652 1527 +1529 3 288.2319 201.5259 71.3658 0.1652 1528 +1530 3 289.2627 201.058 71.776 0.1652 1529 +1531 3 290.2923 200.5901 72.186 0.1525 1530 +1532 3 291.323 200.1222 72.5962 0.1525 1531 +1533 3 292.4007 199.8316 73.1254 0.1525 1532 +1534 3 293.5001 199.6246 73.71 0.1398 1533 +1535 3 294.5994 199.4175 74.2949 0.1271 1534 +1536 3 295.6988 199.2104 74.8796 0.1144 1535 +1537 3 296.7982 199.0034 75.4645 0.1144 1536 +1538 3 297.8701 198.7105 76.0754 0.1144 1537 +1539 3 298.9089 198.3078 76.7203 0.1144 1538 +1540 3 299.9465 197.9051 77.3648 0.1144 1539 +1541 3 300.9841 197.5024 78.0097 0.1144 1540 +1542 3 302.0217 197.0986 78.6545 0.1144 1541 +1543 3 303.0593 196.6959 79.2994 0.1144 1542 +1544 3 243.2899 216.2652 43.6612 0.178 1452 +1545 3 242.5555 215.4484 44.3646 0.2542 1544 +1546 3 241.6036 214.8729 45.0136 0.3051 1545 +1547 3 240.7674 214.1213 45.5104 0.3432 1546 +1548 3 240.2022 213.1764 46.2297 0.3432 1547 +1549 3 239.6794 212.2383 47.1904 0.3432 1548 +1550 3 238.9233 211.4432 47.976 0.3686 1549 +1551 3 238.19 210.5875 48.447 0.3813 1550 +1552 3 237.6969 209.5957 47.7705 0.4195 1551 +1553 3 237.7426 208.4871 47.9394 0.4195 1552 +1554 3 238.1819 207.4861 48.7449 0.4068 1553 +1555 3 238.6807 206.524 49.6034 0.3432 1554 +1556 3 238.9507 205.5139 50.1231 0.2924 1555 +1557 3 238.4279 204.5541 50.7265 0.2924 1556 +1558 3 237.5962 203.8734 51.52 0.3051 1557 +1559 3 236.7165 202.7992 51.52 0.2161 1558 +1560 3 236.2463 201.765 51.52 0.2034 1559 +1561 3 235.8104 200.74 51.7409 0.1652 1560 +1562 3 235.7784 199.6005 51.8 0.1271 1561 +1563 3 235.5118 198.5721 51.8392 0.1398 1562 +1564 3 235.346 197.4876 52.36 0.1652 1563 +1565 3 234.9707 196.4237 52.542 0.1907 1564 +1566 3 234.4514 195.465 53.2 0.1907 1565 +1567 3 233.9686 194.4411 53.2 0.1907 1566 +1568 3 233.5934 193.4161 53.2 0.1907 1567 +1569 3 233.1186 192.3888 53.2 0.1652 1568 +1570 3 232.6038 191.3718 53.2 0.1398 1569 +1571 3 232.4425 190.2483 53.2 0.1144 1570 +1572 3 231.8774 189.578 54.3158 0.1398 1571 +1573 3 231.3431 188.5667 54.32 0.178 1572 +1574 3 230.5377 187.7887 54.32 0.2161 1573 +1575 3 229.8593 186.9124 54.6 0.2161 1574 +1576 3 229.2908 185.9412 54.8836 0.1907 1575 +1577 3 229.0185 185.137 56.0 0.178 1576 +1578 3 228.6787 184.0456 56.0 0.1652 1577 +1579 3 228.4454 182.9496 56.1243 0.1652 1578 +1580 3 228.1925 181.9177 56.9265 0.1525 1579 +1581 3 227.8333 180.8447 57.12 0.1652 1580 +1582 3 227.2201 180.1114 58.212 0.2034 1581 +1583 3 226.7179 179.1412 58.5298 0.2415 1582 +1584 3 226.0555 178.4903 59.852 0.2542 1583 +1585 3 225.471 177.7032 61.2545 0.2288 1584 +1586 3 224.9493 176.7503 61.917 0.2034 1585 +1587 3 224.4963 175.7459 62.44 0.1907 1586 +1588 3 223.6406 175.0377 62.44 0.178 1587 +1589 3 223.2928 174.3948 63.2789 0.1525 1588 +1590 3 222.8066 173.9052 64.4 0.1271 1589 +1591 3 222.1671 172.9762 64.4 0.1144 1590 +1592 3 221.6225 171.9718 64.4 0.1144 1591 +1593 3 220.832 171.1664 64.4 0.1144 1592 +1594 3 220.5655 170.0842 64.4 0.1144 1593 +1595 3 220.1285 169.0775 64.4 0.1144 1594 +1596 3 219.7464 168.192 64.8844 0.1144 1595 +1597 3 219.076 167.6818 66.4132 0.1144 1596 +1598 3 218.7328 166.9885 68.04 0.1144 1597 +1599 3 218.5623 165.8651 68.04 0.1144 1598 +1600 3 218.2946 164.7577 68.04 0.1144 1599 +1601 3 218.1608 163.624 68.04 0.1144 1600 +1602 3 218.0533 162.4892 68.04 0.1144 1601 +1603 3 217.8542 161.3704 68.2312 0.1271 1602 +1604 3 217.8176 160.3545 69.3342 0.1398 1603 +1605 3 217.8176 159.3237 70.3875 0.1525 1604 +1606 3 217.8176 158.1866 70.56 0.1398 1605 +1607 3 217.8942 157.054 70.56 0.1271 1606 +1608 3 218.1391 155.9695 70.761 0.1144 1607 +1609 3 218.4193 154.9491 71.4 0.1144 1608 +1610 3 218.7328 153.8714 71.6783 0.1144 1609 +1611 3 219.0497 152.7892 71.96 0.1144 1610 +1612 3 219.3162 151.7138 72.5049 0.1144 1611 +1613 3 219.5954 150.6259 72.8 0.1144 1612 +1614 3 219.9306 149.5437 72.8 0.1144 1613 +1615 3 219.9912 148.4043 72.8 0.1144 1614 +1616 3 220.1056 147.2671 72.8 0.1144 1615 +1617 3 220.252 146.3107 73.6221 0.1144 1616 +1618 3 220.8572 145.5992 73.9007 0.1144 1617 +1619 3 220.9808 144.5295 74.8434 0.1144 1618 +1620 3 221.1055 143.4599 75.7859 0.1144 1619 +1621 3 221.229 142.3891 76.7284 0.1144 1620 +1622 3 221.3526 141.3195 77.6709 0.1144 1621 +1623 3 221.5608 140.2395 78.416 0.1144 1622 +1624 3 221.8102 139.155 79.0622 0.1144 1623 +1625 3 222.0607 138.0694 79.7084 0.1144 1624 +1626 3 222.3101 136.9848 80.3547 0.1144 1625 +1627 3 222.5606 135.9003 81.0009 0.1144 1626 +1628 3 222.81 134.8158 81.6472 0.1144 1627 +1629 3 222.9473 133.7096 82.2273 0.1144 1628 +1630 3 222.9976 132.5873 82.7568 0.1144 1629 +1631 3 223.048 131.465 83.2863 0.1144 1630 +1632 3 223.0994 130.3428 83.8158 0.1144 1631 +1633 3 223.1498 129.2205 84.3452 0.1144 1632 +1634 3 223.2001 128.0983 84.8747 0.1144 1633 +1635 3 223.0125 126.9897 85.26 0.1144 1634 +1636 3 222.754 125.8835 85.6027 0.1144 1635 +1637 3 222.4966 124.7784 85.9454 0.1144 1636 +1638 3 222.2392 123.6721 86.2884 0.1144 1637 +1639 3 221.9806 122.5659 86.6312 0.1144 1638 +1640 3 221.7232 121.4608 86.9739 0.1144 1639 +1641 3 221.4658 120.3545 87.3169 0.1144 1640 +1642 3 221.2073 119.2494 87.6596 0.1144 1641 +1643 3 220.9499 118.1432 88.0023 0.1144 1642 +1644 3 221.2233 117.0609 88.0617 0.1144 1643 +1645 3 221.6088 115.9844 88.0617 0.1144 1644 +1646 3 221.9932 114.9068 88.0617 0.1144 1645 +1647 3 222.3787 113.8295 88.0617 0.1144 1646 +1648 3 222.7631 112.7522 88.0617 0.1271 1647 +1649 3 223.1486 111.6749 88.0617 0.1398 1648 +1650 3 223.4186 110.5707 88.2725 0.1525 1649 +1651 3 223.6383 109.4548 88.5749 0.1398 1650 +1652 3 223.8579 108.339 88.8773 0.1271 1651 +1653 3 224.0776 107.2231 89.18 0.1144 1652 +1654 3 224.2972 106.1071 89.4824 0.1144 1653 +1655 3 224.5169 104.9913 89.7848 0.1144 1654 +1656 3 224.7365 103.8754 90.0875 0.1144 1655 +1657 3 224.9562 102.7596 90.3899 0.1144 1656 +1658 3 225.1758 101.6437 90.6903 0.1144 1657 +1659 3 225.4378 100.5298 90.6903 0.1144 1658 +1660 3 225.6986 99.416 90.6903 0.1144 1659 +1661 3 226.2615 98.491 91.4805 0.1144 1660 +1662 3 226.8666 97.5917 92.3782 0.1144 1661 +1663 3 227.4707 96.6925 93.2758 0.1144 1662 +1664 3 228.0758 95.7932 94.1738 0.1144 1663 +1665 3 228.6799 94.8939 95.0715 0.1398 1664 +1666 3 237.65 203.7464 53.2 0.178 1558 +1667 3 238.7722 203.6686 53.4531 0.1907 1666 +1668 3 239.763 203.6045 54.32 0.1652 1667 +1669 3 240.4242 202.8529 54.32 0.1398 1668 +1670 3 241.2616 202.1128 54.5784 0.1144 1669 +1671 3 242.0521 201.2914 54.6 0.1144 1670 +1672 3 242.5177 200.3281 54.6 0.1144 1671 +1673 3 243.2407 199.7573 55.3714 0.1144 1672 +1674 3 243.8287 198.9748 56.7398 0.1144 1673 +1675 3 244.4785 198.2849 58.0633 0.1144 1674 +1676 3 245.3411 197.5928 58.329 0.1144 1675 +1677 3 245.865 196.6639 58.5239 0.1398 1676 +1678 3 246.5938 196.2189 60.0678 0.1652 1677 +1679 3 247.5204 195.8528 60.7866 0.1907 1678 +1680 3 248.4356 195.8528 62.3742 0.1652 1679 +1681 3 249.4309 195.7384 63.1907 0.1398 1680 +1682 3 250.512 195.7384 63.84 0.1271 1681 +1683 3 251.5313 195.7384 64.7592 0.1525 1682 +1684 3 252.6684 195.7384 64.9883 0.178 1683 +1685 3 253.5298 195.2442 66.103 0.178 1684 +1686 3 254.492 194.7523 66.36 0.178 1685 +1687 3 255.0537 194.3656 67.6404 0.178 1686 +1688 3 255.6176 194.3015 70.0711 0.2034 1687 +1689 3 256.1816 194.2363 72.5021 0.1907 1688 +1690 3 256.8886 194.0338 74.5766 0.178 1689 +1691 3 257.7123 193.717 76.356 0.1398 1690 +1692 3 258.5371 193.3989 78.1351 0.1271 1691 +1693 3 259.3608 193.0809 79.9145 0.1144 1692 +1694 3 260.1834 192.7388 81.6693 0.1144 1693 +1695 3 261.0025 192.3522 83.3806 0.1144 1694 +1696 3 261.8216 191.9655 85.0917 0.1144 1695 +1697 3 262.6418 191.5697 86.767 0.1144 1696 +1698 3 263.5318 190.8936 87.3712 0.1144 1697 +1699 3 264.4207 190.2175 87.9754 0.1144 1698 +1700 3 265.3096 189.5414 88.5797 0.1144 1699 +1701 3 266.1996 188.8652 89.1839 0.1144 1700 +1702 3 267.0885 188.1891 89.7882 0.1144 1701 +1703 3 267.9774 187.513 90.3921 0.1144 1702 +1704 3 268.8503 186.8918 91.2559 0.1144 1703 +1705 3 269.7277 186.3198 92.3835 0.1144 1704 +1706 3 270.6052 185.7478 93.5113 0.1144 1705 +1707 3 271.4163 185.2205 94.9892 0.1144 1706 +1708 3 272.2091 184.7057 96.565 0.1144 1707 +1709 3 273.003 184.1897 98.1406 0.1144 1708 +1710 3 273.7958 183.6749 99.7164 0.1144 1709 +1711 3 274.6847 183.2059 100.767 0.1144 1710 +1712 3 275.6697 183.0423 101.6364 0.1398 1711 +1713 3 276.5574 183.0995 103.3959 0.178 1712 +1714 2 243.2087 232.2354 37.4839 0.4068 1 +1715 2 243.767 231.2379 37.52 0.4068 1714 +1716 2 244.4007 230.2861 37.52 0.4068 1715 +1717 2 245.2942 229.5848 37.5194 0.4068 1716 +1718 2 246.2563 228.967 37.5175 0.394 1717 +1719 2 247.3053 228.514 37.5049 0.3432 1718 +1720 2 248.3269 228.0003 37.4402 0.2796 1719 +1721 2 249.4343 227.8551 36.955 0.2542 1720 +1722 2 250.4296 227.6754 35.6776 0.2669 1721 +1723 2 251.4798 227.3197 35.0406 0.2924 1722 +1724 2 252.4053 226.7545 34.167 0.3051 1723 +1725 2 253.4029 226.3312 33.3416 0.2796 1724 +1726 2 254.2757 225.7684 32.2375 0.2542 1725 +1727 2 255.1337 225.0282 31.9421 0.2288 1726 +1728 2 256.0558 224.351 31.92 0.2542 1727 +1729 2 257.0076 223.7172 31.92 0.2796 1728 +1730 2 257.9686 223.0972 31.92 0.2924 1729 +1731 2 258.9158 222.4554 31.92 0.2542 1730 +1732 2 259.7669 221.7152 32.1191 0.2034 1731 +1733 2 260.6226 220.9968 32.2 0.1652 1732 +1734 2 261.6808 220.5769 32.1538 0.1525 1733 +1735 2 262.5766 219.8985 31.7307 0.1525 1734 +1736 2 263.4643 219.1893 31.57 0.1398 1735 +1737 2 264.2983 218.4376 31.36 0.1398 1736 +1738 2 265.2238 217.8119 30.8918 0.1398 1737 +1739 2 266.1813 217.2021 30.7936 0.1525 1738 +1740 2 267.1995 216.7079 30.52 0.1398 1739 +1741 2 268.1204 216.033 30.5155 0.1271 1740 +1742 2 268.9281 215.2367 30.24 0.1144 1741 +1743 2 269.6191 214.3261 30.24 0.1144 1742 +1744 2 270.4416 213.5436 30.24 0.1271 1743 +1745 2 271.2252 212.7428 29.9785 0.1652 1744 +1746 2 272.177 212.2921 29.136 0.2161 1745 +1747 2 273.265 212.021 29.12 0.2415 1746 +1748 2 274.3026 211.5588 29.12 0.2415 1747 +1749 2 275.4409 211.4387 29.12 0.2288 1748 +1750 2 276.5826 211.4238 29.12 0.2288 1749 +1751 2 277.7152 211.5805 29.12 0.2161 1750 +1752 2 278.85 211.6892 29.12 0.2034 1751 +1753 2 279.6588 212.3001 28.2528 0.1907 1752 +1754 2 280.4493 212.8252 27.0959 0.1907 1753 +1755 2 281.5338 213.1215 26.8976 0.1907 1754 +1756 2 282.6058 213.4693 27.16 0.1907 1755 +1757 2 283.6651 213.8868 27.16 0.1907 1756 +1758 2 284.7794 214.0424 27.16 0.1907 1757 +1759 2 285.7735 214.1568 25.9151 0.2034 1758 +1760 2 286.8855 214.2106 25.48 0.2034 1759 +1761 2 287.7686 214.8226 24.9452 0.1907 1760 +1762 2 288.8451 214.8432 24.2466 0.178 1761 +1763 2 289.7226 214.5046 23.2562 0.1907 1762 +1764 2 290.7522 214.2815 22.8841 0.2161 1763 +1765 2 291.8573 214.508 22.68 0.2034 1764 +1766 2 292.9544 214.8169 22.68 0.1652 1765 +1767 2 294.0961 214.8432 22.68 0.1398 1766 +1768 2 295.2321 214.754 22.68 0.1398 1767 +1769 2 296.3601 214.8009 22.68 0.1652 1768 +1770 2 297.4743 214.9576 22.68 0.178 1769 +1771 2 298.5909 214.7757 22.4 0.1907 1770 +1772 2 299.7108 214.8432 22.1388 0.1907 1771 +1773 2 300.8548 214.8432 22.12 0.178 1772 +1774 2 301.9988 214.8432 22.12 0.1652 1773 +1775 2 303.1291 214.8432 21.8492 0.1525 1774 +1776 2 303.9139 214.0561 21.84 0.1525 1775 +1777 2 304.6564 213.2553 21.84 0.1525 1776 +1778 2 305.7912 213.1272 21.84 0.1652 1777 +1779 3 240.9744 238.9724 35.8481 0.1907 1 +1780 3 241.8393 239.3534 34.4294 0.2288 1779 +1781 3 242.6127 239.6783 32.5332 0.3305 1780 +1782 3 243.4649 240.3967 31.9152 0.3813 1781 +1783 3 244.3939 241.0648 31.8844 0.3813 1782 +1784 3 245.2622 241.7936 31.7251 0.3051 1783 +1785 3 245.9314 242.7065 31.5266 0.2796 1784 +1786 3 246.5137 243.6457 32.0214 0.2924 1785 +1787 3 247.2344 244.4511 32.8115 0.3178 1786 +1788 3 248.105 245.1821 32.8485 0.3178 1787 +1789 3 248.9596 245.8227 32.0754 0.2924 1788 +1790 3 249.7638 246.3535 30.6043 0.3051 1789 +1791 3 250.6801 246.8683 29.7587 0.3305 1790 +1792 3 251.5267 247.6177 29.6792 0.3813 1791 +1793 3 252.1502 248.5763 29.675 0.394 1792 +1794 3 252.6856 249.583 29.652 0.394 1793 +1795 3 253.1294 250.6332 29.5142 0.394 1794 +1796 3 253.6648 251.6251 29.0752 0.4195 1795 +1797 3 254.2609 252.5712 28.5202 0.4322 1796 +1798 3 254.9175 253.4829 28.0885 0.4195 1797 +1799 3 255.652 254.3123 27.4582 0.3813 1798 +1800 3 256.4162 255.1589 27.2401 0.3305 1799 +1801 3 256.9573 256.129 26.747 0.2796 1800 +1802 3 257.5567 257.0808 26.8142 0.2415 1801 +1803 3 258.4319 257.5945 26.4874 0.2796 1802 +1804 3 259.4752 257.6917 25.3949 0.3432 1803 +1805 3 260.8526 258.0429 26.038 0.1144 1804 +1806 3 261.992 258.0933 26.2035 0.1144 1805 +1807 3 263.1314 258.1299 26.297 0.1271 1806 +1808 3 264.256 258.3198 26.341 0.1398 1807 +1809 3 265.3119 258.7476 26.4592 0.178 1808 +1810 3 266.409 258.9009 26.8358 0.2161 1809 +1811 3 267.4958 258.6298 26.4174 0.2669 1810 +1812 3 268.6341 258.6584 26.4706 0.2669 1811 +1813 3 269.7438 258.8666 26.6 0.2415 1812 +1814 3 270.8637 259.0943 26.6 0.2034 1813 +1815 3 271.9997 259.1549 26.542 0.1907 1814 +1816 3 273.0785 259.5095 26.32 0.178 1815 +1817 3 274.1859 259.7955 26.32 0.1652 1816 +1818 3 275.1755 260.3458 26.32 0.1652 1817 +1819 3 276.2302 260.7233 26.255 0.178 1818 +1820 3 277.1615 261.3651 25.8807 0.2034 1819 +1821 3 278.2631 261.65 25.76 0.2161 1820 +1822 3 279.4003 261.7701 25.7351 0.2415 1821 +1823 3 280.4665 262.1144 25.48 0.2288 1822 +1824 3 281.5292 262.5057 25.48 0.2034 1823 +1825 3 282.5508 262.9987 25.366 0.1525 1824 +1826 3 283.6697 263.12 24.9897 0.1271 1825 +1827 3 284.7942 263.12 24.64 0.1144 1826 +1828 3 285.9359 263.1589 24.64 0.1144 1827 +1829 3 287.0662 263.2344 24.3919 0.1398 1828 +1830 3 288.1953 263.2882 24.08 0.178 1829 +1831 3 289.289 263.6062 24.071 0.2288 1830 +1832 3 290.2294 264.1485 23.4178 0.2415 1831 +1833 3 291.1457 264.7067 22.5285 0.2288 1832 +1834 3 292.0746 265.2284 21.5891 0.1907 1833 +1835 3 293.1832 265.4995 21.56 0.1525 1834 +1836 3 294.2013 265.8553 20.7606 0.1271 1835 +1837 3 295.2241 266.2809 20.5058 0.1144 1836 +1838 3 296.3143 266.5817 20.44 0.1144 1837 +1839 3 297.2741 267.1423 20.2667 0.1144 1838 +1840 3 298.3575 267.4672 20.16 0.1144 1839 +1841 3 298.8128 267.8127 18.4341 0.1144 1840 +1842 3 299.3413 268.1765 17.0419 0.1144 1841 +1843 3 300.4144 268.538 16.8 0.1144 1842 +1844 3 301.4932 268.6936 17.1382 0.1144 1843 +1845 3 302.1167 268.7496 19.276 0.1144 1844 +1846 3 303.2115 269.0608 19.3351 0.1144 1845 +1847 3 304.2262 269.4063 20.0796 0.1144 1846 +1848 3 305.3496 269.5424 20.2199 0.1144 1847 +1849 3 306.4787 269.6408 20.4386 0.1144 1848 +1850 3 307.482 269.7415 19.6 0.1398 1849 +1851 3 308.5276 270.1567 19.7602 0.1652 1850 +1852 3 309.6488 270.3604 19.88 0.1907 1851 +1853 3 310.7779 270.548 19.88 0.178 1852 +1854 3 311.891 270.3318 20.1359 0.1907 1853 +1855 3 312.9732 269.9634 20.16 0.2415 1854 +1856 3 314.0989 269.8582 20.16 0.2924 1855 +1857 3 315.2349 269.7552 20.16 0.2924 1856 +1858 3 316.3492 269.9611 20.16 0.2542 1857 +1859 3 317.4589 270.1956 20.16 0.2542 1858 +1860 3 318.5239 270.5606 20.16 0.2796 1859 +1861 3 319.51 271.1188 19.934 0.2669 1860 +1862 3 320.5465 271.573 19.88 0.2288 1861 +1863 3 321.5258 272.1462 19.88 0.2034 1862 +1864 3 322.5428 272.6518 19.88 0.2161 1863 +1865 3 323.625 272.9618 19.88 0.2288 1864 +1866 3 324.7564 273.0888 19.88 0.2161 1865 +1867 3 325.8798 273.3039 19.88 0.2034 1866 +1868 3 326.9769 273.6276 19.88 0.1652 1867 +1869 3 328.0706 273.9617 19.88 0.1398 1868 +1870 3 329.1974 274.1024 19.88 0.1144 1869 +1871 3 330.3243 274.1745 20.1183 0.1144 1870 +1872 3 331.4019 274.3026 20.72 0.1144 1871 +1873 3 332.5276 274.1848 20.4565 0.1398 1872 +1874 3 333.5938 273.9891 19.88 0.1907 1873 +1875 3 334.7264 273.8736 19.7537 0.2669 1874 +1876 3 335.8452 273.9811 19.2934 0.2924 1875 +1877 3 336.9217 274.258 18.8513 0.2924 1876 +1878 3 338.0326 274.528 18.76 0.2542 1877 +1879 3 339.0576 274.981 18.5517 0.2415 1878 +1880 3 340.0574 275.5061 18.3386 0.2034 1879 +1881 3 341.0813 275.9923 18.2 0.178 1880 +1882 3 342.2127 276.0106 18.2 0.1652 1881 +1883 3 343.3384 275.8241 18.114 0.178 1882 +1884 3 344.4607 275.966 17.92 0.1907 1883 +1885 3 345.5486 276.3183 17.9068 0.1907 1884 +1886 3 346.5862 276.7565 17.64 0.1907 1885 +1887 3 347.5278 277.3994 17.5619 0.178 1886 +1888 3 348.5882 277.7632 17.36 0.1652 1887 +1889 3 349.7322 277.7632 17.36 0.1525 1888 +1890 3 350.8202 277.8902 16.8622 0.1525 1889 +1891 3 351.8967 278.2448 16.8 0.1525 1890 +1892 3 353.0373 278.3295 16.8 0.1525 1891 +1893 3 354.1721 278.3352 16.52 0.1525 1892 +1894 3 355.3058 278.2219 16.5508 0.1398 1893 +1895 3 356.4429 278.2208 16.8 0.1271 1894 +1896 3 357.5618 278.0675 17.057 0.1144 1895 +1897 3 358.7001 277.992 17.08 0.1144 1896 +1898 3 359.8383 277.9451 17.08 0.1271 1897 +1899 3 360.8233 277.5596 16.8179 0.1525 1898 +1900 3 361.5452 277.3056 18.5954 0.178 1899 +1901 3 362.6183 277.42 19.0509 0.178 1900 +1902 3 363.5998 277.3502 19.8408 0.1652 1901 +1903 3 364.7415 277.3056 19.88 0.1525 1902 +1904 3 365.8626 277.3056 20.2392 0.1525 1903 +1905 3 366.9826 277.3056 20.72 0.1398 1904 +1906 3 368.1266 277.3056 20.72 0.1271 1905 +1907 3 369.2706 277.309 20.72 0.1271 1906 +1908 3 370.402 277.436 20.72 0.1652 1907 +1909 3 371.5117 277.6911 20.72 0.2034 1908 +1910 3 372.4967 278.1728 20.72 0.2161 1909 +1911 3 373.4805 278.6304 20.72 0.178 1910 +1912 3 374.5262 278.9552 20.72 0.1398 1911 +1913 3 375.494 279.4563 20.72 0.1398 1912 +1914 3 376.622 279.5398 20.72 0.1652 1913 +1915 3 377.6905 279.9151 20.72 0.1907 1914 +1916 3 378.4524 280.6232 20.72 0.1652 1915 +1917 3 379.4385 281.1128 20.5556 0.1398 1916 +1918 3 380.5527 281.1952 20.6713 0.1144 1917 +1919 3 381.6956 281.2021 20.7138 0.1144 1918 +1920 3 382.62 281.5098 19.4432 0.1271 1919 +1921 3 383.661 281.8072 19.32 0.1398 1920 +1922 3 384.6689 282.2603 19.32 0.1652 1921 +1923 3 385.663 282.7568 19.32 0.178 1922 +1924 3 386.7978 282.8094 19.1024 0.1907 1923 +1925 3 387.5403 283.5198 18.7415 0.178 1924 +1926 3 388.428 283.823 17.6638 0.1652 1925 +1927 3 389.4988 283.5759 17.9186 0.1525 1926 +1928 3 390.5765 283.3688 18.3478 0.1652 1927 +1929 3 391.7022 283.3688 18.76 0.2034 1928 +1930 3 392.4103 283.3802 17.1839 0.2669 1929 +1931 3 393.5268 283.4832 17.0579 0.3051 1930 +1932 3 394.6262 283.6926 16.8 0.2796 1931 +1933 3 395.7691 283.712 16.8 0.2161 1932 +1934 3 396.9039 283.617 16.7838 0.1652 1933 +1935 3 398.0376 283.712 16.6628 0.1525 1934 +1936 3 399.1588 283.5976 17.0492 0.1398 1935 +1937 3 400.265 283.4363 17.08 0.1271 1936 +1938 3 401.3793 283.2361 17.08 0.1271 1937 +1939 3 402.5187 283.1377 17.08 0.1398 1938 +1940 3 403.6432 283.0256 17.3687 0.1652 1939 +1941 3 404.7472 283.14 17.92 0.1652 1940 +1942 3 259.243 257.5876 23.8 0.2288 1804 +1943 3 259.3448 258.7236 23.8 0.2796 1942 +1944 3 259.3654 259.8619 23.5942 0.2669 1943 +1945 3 259.4569 260.999 23.52 0.2415 1944 +1946 3 259.7509 261.8959 22.96 0.2542 1945 +1947 3 260.5552 262.5572 22.12 0.2924 1946 +1948 3 261.2496 263.4655 22.12 0.3432 1947 +1949 3 261.936 264.3807 22.12 0.3432 1948 +1950 3 262.5549 265.3005 21.5533 0.3178 1949 +1951 3 263.0056 266.1894 20.4375 0.2669 1950 +1952 3 263.2207 267.1457 19.1559 0.2542 1951 +1953 3 264.0009 267.9591 19.04 0.2415 1952 +1954 3 264.7136 268.8354 18.7194 0.2288 1953 +1955 3 265.3405 269.5264 18.2 0.2161 1954 +1956 3 266.0498 270.2174 17.8942 0.2288 1955 +1957 3 266.7007 271.0113 17.36 0.2542 1956 +1958 3 267.4924 271.8258 17.36 0.2415 1957 +1959 3 268.1273 272.749 17.36 0.2034 1958 +1960 3 268.1536 273.8461 16.7597 0.1525 1959 +1961 3 268.1536 274.9741 16.2963 0.1271 1960 +1962 3 268.1925 276.0037 15.2967 0.1144 1961 +1963 3 269.2976 276.0472 15.12 0.1144 1962 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb_469628681_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb_469628681_m.swc new file mode 100644 index 0000000..4fe67b4 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb_469628681_m.swc @@ -0,0 +1,1250 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/February 2015/169125.03.01.01/reconstructions/Pvalb-IRES-Cre; Ai14(IVSCC)-169125.03.01.01.DS.swc +# id,type,x,y,z,r,pid +1 1 312.0832 372.8296 27.44 5.1972 -1 +2 3 310.5926 376.7913 27.4061 0.2161 1 +3 3 310.5274 377.8643 27.3406 0.2796 2 +4 3 310.6829 378.9637 26.7414 0.2924 3 +5 3 310.6372 380.0368 25.7981 0.2542 4 +6 3 310.1784 380.9817 26.6462 0.2161 5 +7 3 309.7906 381.945 27.8124 0.1907 6 +8 3 309.6373 383.0558 27.412 0.1907 7 +9 3 308.9521 383.9264 26.7898 0.2288 8 +10 3 308.0803 384.6437 26.3326 0.2796 9 +11 3 307.3013 385.4811 26.2685 0.3686 10 +12 3 306.6515 386.418 26.0495 0.4576 11 +13 3 306.163 386.8493 25.4593 0.2542 12 +14 3 305.2078 387.4522 25.2165 0.2415 13 +15 3 304.1713 387.935 25.1997 0.2415 14 +16 3 303.1646 388.4772 25.1983 0.2034 15 +17 3 302.6612 389.4794 25.1899 0.2415 16 +18 3 302.0526 390.4449 25.1437 0.2669 17 +19 3 301.1488 391.113 24.7388 0.3051 18 +20 3 300.2908 391.8269 24.1321 0.2669 19 +21 3 299.3196 392.4252 24.0517 0.2542 20 +22 3 298.2831 392.9057 23.9078 0.2542 21 +23 3 297.186 392.9846 23.1896 0.3178 22 +24 3 296.0592 393.1093 22.8334 0.3178 23 +25 3 295.0021 393.4719 22.2421 0.3051 24 +26 3 293.9371 393.8781 22.4277 0.2415 25 +27 3 292.9361 394.3848 22.9662 0.2161 26 +28 3 292.4899 394.9992 22.9832 0.2161 27 +29 3 291.9008 395.9762 23.1025 0.2034 28 +30 3 291.2498 396.8708 23.7213 0.2288 29 +31 3 290.5634 397.7688 24.0411 0.2415 30 +32 3 289.8049 398.6234 24.0806 0.2669 31 +33 3 288.9069 399.3235 24.0828 0.2796 32 +34 3 288.05 400.0785 24.0904 0.2796 33 +35 3 287.2355 400.8816 24.1237 0.3051 34 +36 3 286.429 401.6904 24.2673 0.2924 35 +37 3 285.6545 402.4855 24.8928 0.2924 36 +38 3 284.9018 403.3321 25.1149 0.2415 37 +39 3 284.2554 404.2564 24.7358 0.2415 38 +40 3 283.5427 405.1282 24.2746 0.2669 39 +41 3 282.6424 405.7802 24.6834 0.3305 40 +42 3 281.8976 406.5742 25.4755 0.3432 41 +43 3 281.2192 407.4836 25.5206 0.3305 42 +44 3 280.3715 408.2387 25.2538 0.3051 43 +45 3 279.5433 409.0258 25.2843 0.3178 44 +46 3 278.7242 409.8083 25.6662 0.3178 45 +47 3 277.8204 410.4638 26.264 0.3051 46 +48 3 276.9144 411.1582 26.3071 0.2796 47 +49 3 275.99 411.832 26.2576 0.2669 48 +50 3 275.0862 412.523 25.9955 0.2796 49 +51 3 274.3198 413.3215 25.3011 0.3051 50 +52 3 273.7043 414.2813 25.2031 0.3432 51 +53 3 273.2352 415.3235 25.2 0.3813 52 +54 3 272.6312 416.2947 25.2 0.3813 53 +55 3 272.0638 417.2877 25.2 0.3686 54 +56 3 271.3637 418.1915 25.1997 0.3178 55 +57 3 270.7059 419.1284 25.1983 0.3051 56 +58 3 270.0423 420.0596 25.1919 0.3051 57 +59 3 269.3731 420.9874 25.1605 0.3559 58 +60 3 268.586 421.8157 25.0281 0.3813 59 +61 3 267.8001 422.5936 24.3247 0.3813 60 +62 3 266.9776 423.3807 24.0618 0.3432 61 +63 3 266.0761 424.0842 23.9635 0.3051 62 +64 3 265.1609 424.7066 23.259 0.2542 63 +65 3 264.2091 425.3117 22.7979 0.2161 64 +66 3 263.39 426.0634 22.9298 0.2034 65 +67 3 262.4485 426.3825 24.1791 0.2415 66 +68 3 261.4246 426.879 24.4507 0.2542 67 +69 3 260.395 427.3572 24.6235 0.2542 68 +70 3 259.3414 427.7485 24.5118 0.2288 69 +71 3 258.2923 428.0265 24.6938 0.2542 70 +72 3 257.392 428.5435 23.7191 0.2924 71 +73 3 256.6942 428.9554 24.3012 0.3305 72 +74 3 255.9357 429.7276 24.64 0.3305 73 +75 3 255.009 430.2584 24.6344 0.3178 74 +76 3 254.1831 430.6634 23.6824 0.3051 75 +77 3 253.4395 431.3852 23.7252 0.3051 76 +78 3 252.5277 431.884 24.5468 0.2796 77 +79 3 251.7738 432.3588 23.6477 0.2415 78 +80 3 250.6882 432.5556 23.6606 0.2161 79 +81 3 249.8427 432.9193 24.5949 0.2415 80 +82 3 249.2787 433.8025 24.9186 0.2924 81 +83 3 248.7285 434.3962 23.8501 0.3178 82 +84 3 248.1485 435.3538 23.8171 0.2924 83 +85 3 247.668 436.1122 22.9415 0.2415 84 +86 3 247.0262 436.9714 22.675 0.1907 85 +87 3 246.2517 437.4587 24.2332 0.178 86 +88 3 245.5562 438.0468 24.8853 0.178 87 +89 3 245.134 438.883 24.1363 0.2034 88 +90 3 244.4739 439.6072 24.2189 0.2034 89 +91 3 243.7864 440.4022 23.6132 0.2034 90 +92 3 243.7098 441.2465 22.68 0.2034 91 +93 3 243.1275 441.8002 24.0089 0.2161 92 +94 3 242.9478 442.8413 23.6141 0.2161 93 +95 3 242.6138 443.8125 23.9828 0.178 94 +96 3 242.1299 444.6373 23.2663 0.1398 95 +97 3 241.2925 445.3638 23.4889 0.1271 96 +98 3 240.4253 445.4736 22.202 0.1398 97 +99 3 239.7824 446.0433 21.0 0.1525 98 +100 3 239.4335 446.732 21.884 0.1525 99 +101 3 238.818 447.4481 22.6209 0.1525 100 +102 3 237.7221 447.6506 22.398 0.1525 101 +103 3 236.9979 448.4366 21.6418 0.1398 102 +104 3 236.3058 449.3312 21.5261 0.1398 103 +105 3 235.6834 450.0702 21.7196 0.1398 104 +106 3 234.8907 450.8378 21.84 0.1652 105 +107 3 234.2695 451.3938 21.8378 0.1652 106 +108 3 233.6059 452.2896 21.56 0.1652 107 +109 3 232.7434 452.8227 21.56 0.1525 108 +110 3 231.835 453.4747 21.8126 0.178 109 +111 3 230.9301 454.0753 22.1673 0.2161 110 +112 3 229.9703 454.6027 21.7403 0.2542 111 +113 3 228.9716 454.8544 21.7193 0.2415 112 +114 3 227.9523 454.5226 22.12 0.2034 113 +115 3 227.0405 454.7366 22.96 0.1525 114 +116 3 226.3587 455.4573 22.96 0.1271 115 +117 3 225.5636 456.1849 22.96 0.1144 116 +118 3 224.6953 456.925 22.96 0.1271 117 +119 3 223.9014 457.5966 23.2285 0.1398 118 +120 3 223.5399 458.6731 23.24 0.1525 119 +121 3 222.8787 459.4556 22.965 0.1525 120 +122 3 221.8399 459.7736 23.5074 0.1652 121 +123 3 220.9453 460.2884 23.6846 0.178 122 +124 3 220.3905 461.2459 24.0321 0.178 123 +125 3 219.7624 461.7253 25.1622 0.1525 124 +126 3 219.7624 462.8521 25.4906 0.1271 125 +127 3 219.6011 463.94 26.1092 0.1144 126 +128 3 218.9627 464.798 26.5496 0.1144 127 +129 3 218.401 465.6538 27.594 0.1144 128 +130 3 217.7101 466.3127 28.0 0.1144 129 +131 3 217.1381 467.2794 28.1078 0.1525 130 +132 3 217.1312 468.3536 28.0 0.1907 131 +133 3 292.6455 393.8414 22.9662 0.2924 27 +134 3 292.0746 392.8542 22.9704 0.2924 133 +135 3 291.2876 392.0408 23.0171 0.2924 134 +136 3 290.2534 391.6084 23.2767 0.2669 135 +137 3 289.1517 391.4962 23.949 0.2669 136 +138 3 288.0489 391.2583 24.3723 0.2288 137 +139 3 286.9461 391.1222 25.0146 0.2288 138 +140 3 285.8227 391.0581 25.4668 0.2034 139 +141 3 284.7485 390.7835 26.0232 0.1907 140 +142 3 283.7189 390.3259 26.1685 0.1907 141 +143 3 282.5897 390.1784 26.0893 0.2161 142 +144 3 281.4812 389.985 26.3085 0.2542 143 +145 3 280.4322 389.5297 26.2489 0.2542 144 +146 3 279.3785 389.238 25.7748 0.2415 145 +147 3 278.3855 388.992 25.1258 0.2415 146 +148 3 277.515 388.3937 25.8048 0.2288 147 +149 3 276.5689 388.0963 26.8097 0.2288 148 +150 3 275.6582 387.6215 26.88 0.2288 149 +151 3 274.7751 387.816 26.1974 0.2669 150 +152 3 273.7821 387.6661 25.9529 0.2796 151 +153 3 272.7708 387.4362 26.04 0.2796 152 +154 3 272.097 387.0964 27.4336 0.2542 153 +155 3 271.7 386.7498 25.6819 0.2542 154 +156 3 270.6979 386.4661 25.48 0.2542 155 +157 3 269.706 386.3185 26.3113 0.2669 156 +158 3 269.1146 385.9684 25.0883 0.2669 157 +159 3 268.395 385.2466 24.8786 0.2415 158 +160 3 267.688 384.6414 25.4072 0.2288 159 +161 3 266.9867 384.2776 23.8 0.2161 160 +162 3 266.1276 383.6164 23.9599 0.2542 161 +163 3 265.2947 382.9071 24.575 0.2924 162 +164 3 264.4482 382.5948 23.8286 0.3305 163 +165 3 263.6359 382.0331 23.5626 0.3305 164 +166 3 263.0308 381.1465 24.0075 0.3051 165 +167 3 262.2929 380.3731 23.2772 0.2542 166 +168 3 261.5184 379.562 23.56 0.2161 167 +169 3 260.7336 378.9935 24.5227 0.2034 168 +170 3 259.8928 378.4661 23.4346 0.2288 169 +171 3 259.1961 377.7923 22.68 0.2415 170 +172 3 258.4525 377.2248 22.9205 0.2415 171 +173 3 257.4252 377.0544 23.24 0.2161 172 +174 3 256.6392 376.4538 22.6789 0.2034 173 +175 3 255.819 375.7788 22.3219 0.178 174 +176 3 255.2115 375.343 22.094 0.1907 175 +177 3 254.1808 375.3041 21.887 0.2288 176 +178 3 253.0814 375.4002 21.9601 0.2796 177 +179 3 251.9706 375.5054 22.1746 0.2796 178 +180 3 250.9204 375.8543 22.6898 0.2288 179 +181 3 250.1322 375.9333 21.784 0.178 180 +182 3 249.2273 375.5752 21.1434 0.1907 181 +183 3 249.0053 375.5752 18.7698 0.2288 182 +184 3 248.3109 376.058 18.4478 0.2542 183 +185 3 247.4529 375.8463 19.32 0.2161 184 +186 3 246.4073 375.4356 19.32 0.2034 185 +187 3 245.3972 375.0215 19.5734 0.2288 186 +188 3 244.9087 375.3578 19.7109 0.2796 187 +189 3 243.9694 375.2743 18.8563 0.3051 188 +190 3 242.9124 374.9826 18.613 0.3051 189 +191 3 242.1734 374.8259 20.1127 0.3051 190 +192 3 241.3703 374.1646 19.4435 0.2924 191 +193 3 240.2606 374.088 19.2363 0.2796 192 +194 3 239.2436 373.8169 19.8934 0.2669 193 +195 3 238.6384 373.508 19.1668 0.2542 194 +196 3 237.904 372.9074 19.3164 0.2415 195 +197 3 237.2748 372.0917 19.1453 0.2161 196 +198 3 236.816 371.3447 18.1594 0.2034 197 +199 3 235.8585 370.8345 17.4675 0.1652 198 +200 3 234.83 370.4764 16.611 0.1398 199 +201 3 233.8016 370.1183 15.7545 0.1144 200 +202 3 232.9848 369.4537 15.4 0.1144 201 +203 3 232.6896 368.4755 15.4 0.1144 202 +204 3 232.6896 367.3315 15.4 0.1144 203 +205 3 232.6164 366.191 15.4 0.1144 204 +206 3 232.3681 365.1797 15.4 0.1271 205 +207 3 231.2665 364.8777 15.4 0.1398 206 +208 3 230.8592 363.9064 15.4 0.178 207 +209 3 230.8592 362.7624 15.4 0.1907 208 +210 3 306.4433 388.0608 26.5065 0.2542 12 +211 3 306.0303 389.111 26.4446 0.2542 210 +212 3 305.7065 390.1875 26.502 0.2288 211 +213 3 305.5144 391.28 27.1065 0.2415 212 +214 3 305.0545 392.273 27.7141 0.2288 213 +215 3 304.463 393.2077 28.4032 0.2669 214 +216 3 303.7217 393.9902 29.2457 0.2669 215 +217 3 302.7859 394.6034 29.6803 0.3051 216 +218 3 301.8112 395.1765 30.0818 0.3178 217 +219 3 300.864 395.7771 30.6298 0.3305 218 +220 3 300.0518 396.5596 30.8322 0.3178 219 +221 3 299.537 397.5617 30.9798 0.2924 220 +222 3 299.0576 398.5662 31.5577 0.2796 221 +223 3 298.4707 399.5317 31.9015 0.2415 222 +224 3 297.686 400.3497 32.0855 0.2288 223 +225 3 296.987 401.1951 32.7701 0.2288 224 +226 3 296.598 402.2407 33.1243 0.2796 225 +227 3 296.4939 403.3481 33.6806 0.2924 226 +228 3 296.2994 404.4566 34.1166 0.2669 227 +229 3 295.867 405.5068 34.3272 0.2034 228 +230 3 295.5867 406.4861 35.4684 0.2034 229 +231 3 295.2458 407.5168 36.2978 0.2415 230 +232 3 294.6704 408.4949 36.4008 0.3051 231 +233 3 294.2105 409.5406 36.4048 0.3178 232 +234 3 293.7895 410.6045 36.4274 0.3305 233 +235 3 293.3662 411.6661 36.5674 0.3305 234 +236 3 293.0402 412.7106 37.343 0.3432 235 +237 3 292.3801 413.4771 38.5918 0.3432 236 +238 3 291.5038 413.6624 40.2956 0.3432 237 +239 3 290.7751 414.2024 41.9924 0.3178 238 +240 3 290.1562 414.9528 43.4591 0.2924 239 +241 3 289.5887 415.82 44.24 0.2542 240 +242 3 288.7422 416.3062 44.24 0.2415 241 +243 3 287.8361 416.7935 44.1582 0.2161 242 +244 3 287.2172 417.4033 44.1952 0.1907 243 +245 3 286.7036 418.3802 44.2963 0.1907 244 +246 3 285.7895 418.9031 44.8767 0.2161 245 +247 3 285.1042 419.602 45.36 0.2542 246 +248 3 284.316 420.2187 44.8 0.2415 247 +249 3 283.5976 420.8032 45.6084 0.1907 248 +250 3 282.9181 421.5949 45.7148 0.1398 249 +251 3 282.3998 422.3785 45.0178 0.1144 250 +252 3 282.2282 423.4596 44.6365 0.1144 251 +253 3 282.1104 424.5087 43.7388 0.1271 252 +254 3 282.1573 425.5932 43.9438 0.1652 253 +255 3 282.1596 426.2487 45.1063 0.2161 254 +256 3 282.3014 427.3218 44.8 0.2669 255 +257 3 309.8341 368.9766 27.3356 0.3432 1 +258 3 309.7941 367.8692 26.7624 0.4195 257 +259 3 309.7906 366.7401 26.3228 0.4703 258 +260 3 309.7643 365.5972 26.1934 0.483 259 +261 3 309.5847 364.499 25.5623 0.483 260 +262 3 309.0813 363.4797 25.3084 0.4449 261 +263 3 308.499 362.5119 25.7272 0.3813 262 +264 3 308.1044 361.464 26.2956 0.3432 263 +265 3 307.6548 360.4126 26.3197 0.3432 264 +266 3 307.4878 359.2812 26.32 0.3813 265 +267 3 307.3768 358.1418 26.32 0.394 266 +268 3 307.0748 357.039 26.3197 0.3559 267 +269 3 307.0496 355.8973 26.3172 0.3051 268 +270 3 307.0507 354.7533 26.2984 0.2542 269 +271 3 307.0553 353.6104 26.1772 0.2034 270 +272 3 307.0828 352.6105 25.5343 0.3432 271 +273 3 307.283 351.4997 25.1034 0.3559 272 +274 3 307.4809 350.4026 24.4773 0.3559 273 +275 3 307.3997 349.2735 24.096 0.3305 274 +276 3 307.0027 348.2039 24.0856 0.3432 275 +277 3 306.5405 347.1571 24.1139 0.3559 276 +278 3 306.0269 346.1366 24.2662 0.3813 277 +279 3 305.424 345.2009 24.9024 0.3686 278 +280 3 304.7788 344.2639 25.1969 0.3559 279 +281 3 304.1507 343.3075 25.2 0.3432 280 +282 3 303.5684 342.3226 25.2 0.3432 281 +283 3 303.0387 341.309 25.1994 0.3432 282 +284 3 302.4747 340.3137 25.1966 0.3305 283 +285 3 302.6303 339.8584 26.0229 0.3051 284 +286 3 302.5056 338.7967 25.7527 0.2924 285 +287 3 302.2574 337.8552 25.8852 0.2669 286 +288 3 302.3592 336.7742 26.4726 0.2415 287 +289 3 302.1647 335.7125 26.32 0.2288 288 +290 3 302.0995 334.7538 25.76 0.2288 289 +291 3 301.6705 333.778 26.2718 0.2415 290 +292 3 301.6728 332.7324 25.7723 0.2542 291 +293 3 301.5584 331.8755 26.01 0.2796 292 +294 3 301.2175 330.9089 26.7624 0.2924 293 +295 3 301.317 329.8655 25.8532 0.3178 294 +296 3 300.9143 329.1608 26.6 0.1144 295 +297 3 300.9349 328.1186 25.6236 0.1271 296 +298 3 300.9864 327.0124 25.0527 0.1398 297 +299 3 300.9761 325.8707 24.92 0.178 298 +300 3 300.7519 324.9612 26.04 0.2034 299 +301 3 300.1227 324.221 25.48 0.2415 300 +302 3 300.0712 323.1663 25.8308 0.2415 301 +303 3 300.0243 322.06 25.9627 0.2669 302 +304 3 300.1902 320.9686 26.1288 0.2924 303 +305 3 300.4899 319.9905 25.2162 0.3178 304 +306 3 300.745 318.9255 24.6338 0.2924 305 +307 3 301.1809 317.8913 24.36 0.2415 306 +308 3 301.3868 316.8056 24.08 0.2288 307 +309 3 301.3719 315.8767 25.3949 0.2542 308 +310 3 301.1431 314.7796 25.7961 0.3051 309 +311 3 300.904 313.6905 26.2492 0.3305 310 +312 3 300.5322 312.7662 27.1765 0.3305 311 +313 3 299.9511 311.9585 26.7476 0.3178 312 +314 3 299.5267 311.2366 27.16 0.2924 313 +315 3 298.7281 310.5777 26.3374 0.2924 314 +316 3 297.9708 309.9611 26.717 0.2669 315 +317 3 297.4217 309.0688 26.2268 0.2669 316 +318 3 297.1986 308.2039 25.4047 0.2415 317 +319 3 296.5957 307.3631 25.2 0.2415 318 +320 3 296.4653 306.3815 25.5682 0.2161 319 +321 3 296.0066 305.5144 26.04 0.1907 320 +322 3 295.4929 304.6689 26.7464 0.1652 321 +323 3 294.8077 303.978 26.1408 0.1398 322 +324 3 294.1567 303.4826 26.7235 0.1271 323 +325 3 294.1293 302.6406 28.2878 0.1271 324 +326 3 294.2368 301.5744 28.1999 0.1652 325 +327 3 293.8375 301.1649 26.32 0.2161 326 +328 3 293.015 300.4899 26.6 0.2542 327 +329 3 293.0928 299.3962 27.0323 0.2669 328 +330 3 293.0207 298.3426 26.6 0.2796 329 +331 3 292.8995 297.2798 26.9385 0.3178 330 +332 3 292.7885 296.2102 27.4229 0.3305 331 +333 3 292.5128 295.2058 26.9578 0.3305 332 +334 3 291.9625 294.5697 27.72 0.2796 333 +335 3 291.4512 293.7083 27.44 0.2796 334 +336 3 291.2475 292.6489 27.9812 0.2542 335 +337 3 291.2349 291.7761 26.7338 0.2542 336 +338 3 291.9076 291.72 25.48 0.2161 337 +339 3 292.3069 291.2361 23.9173 0.2288 338 +340 3 291.9785 290.1939 24.0724 0.2542 339 +341 3 291.8252 289.4995 25.5035 0.2796 340 +342 3 292.2897 288.7525 25.48 0.2669 341 +343 3 292.3492 287.7686 26.1618 0.2415 342 +344 3 292.1696 286.8466 26.2441 0.2415 343 +345 3 292.4064 286.2196 26.5037 0.2415 344 +346 3 292.4064 285.5092 25.0272 0.2415 345 +347 3 292.5208 284.4133 24.64 0.2415 346 +348 3 292.8926 283.7463 25.8023 0.2924 347 +349 3 293.0013 283.1434 27.8916 0.3305 348 +350 3 293.1592 282.1047 27.8317 0.3559 349 +351 3 292.8411 281.5464 28.7456 0.3305 350 +352 3 292.6764 281.0568 30.2599 0.3178 351 +353 3 293.0436 280.1496 31.0741 0.2924 352 +354 3 293.5378 279.3351 30.5595 0.2796 353 +355 3 294.0252 278.604 31.1926 0.2796 354 +356 3 294.9266 278.0378 31.309 0.2924 355 +357 3 295.8224 277.4955 30.8216 0.2924 356 +358 3 296.8074 277.0024 30.8904 0.2669 357 +359 3 297.8427 276.7267 30.52 0.2288 358 +360 3 298.4822 276.371 31.08 0.2161 359 +361 3 299.3024 275.7646 31.08 0.2034 360 +362 3 299.8035 274.9547 31.0453 0.2161 361 +363 3 300.0357 275.1148 29.0368 0.1907 362 +364 3 300.5048 274.4765 27.8421 0.1907 363 +365 3 300.7576 274.242 29.6722 0.1652 364 +366 3 300.7931 273.4675 30.5452 0.1652 365 +367 3 300.6432 273.0019 28.6852 0.1398 366 +368 3 301.0676 272.844 26.9069 0.1271 367 +369 3 301.317 271.9666 26.1671 0.1144 368 +370 3 301.5584 271.4117 26.6 0.1271 369 +371 3 301.6442 270.2826 26.6596 0.1525 370 +372 3 301.6728 269.2175 27.4072 0.1907 371 +373 3 301.8341 268.8308 29.7044 0.2034 372 +374 3 302.6612 268.2932 30.42 0.1907 373 +375 3 303.581 267.72 30.5497 0.1525 374 +376 3 304.4985 267.3093 29.8306 0.1271 375 +377 3 305.5716 266.9581 29.6887 0.1144 376 +378 3 306.5634 266.4742 29.4 0.1271 377 +379 3 306.9478 265.7981 30.24 0.1398 378 +380 3 307.6399 264.9195 30.24 0.1652 379 +381 3 308.0792 264.0341 30.2403 0.1907 380 +382 3 308.7587 263.2195 30.7994 0.2288 381 +383 3 309.6328 262.7413 29.9695 0.2669 382 +384 3 310.596 262.3192 30.24 0.2924 383 +385 3 301.7803 329.2398 25.1208 0.2669 295 +386 3 302.6292 328.6048 25.1552 0.3051 385 +387 3 303.0731 327.8567 23.6205 0.3305 386 +388 3 303.3064 326.9083 23.9865 0.3559 387 +389 3 303.692 326.0823 23.6636 0.3178 388 +390 3 304.0706 325.3319 23.5407 0.2796 389 +391 3 304.5065 324.3457 23.8202 0.2161 390 +392 3 304.8554 323.3699 22.9236 0.1907 391 +393 3 304.3212 322.4764 22.5865 0.2161 392 +394 3 304.0683 321.6722 22.3101 0.3051 393 +395 3 304.5328 320.9698 21.7448 0.3813 394 +396 3 304.9149 320.01 22.6696 0.3813 395 +397 3 304.9664 318.9403 22.0805 0.3178 396 +398 3 305.3874 317.9233 21.56 0.2669 397 +399 3 305.7569 316.848 21.7216 0.2924 398 +400 3 305.9079 315.8332 21.6532 0.3559 399 +401 3 305.7615 314.8402 21.56 0.3813 400 +402 3 305.7043 314.0086 20.1015 0.3432 401 +403 3 305.7226 312.9504 19.8926 0.3178 402 +404 3 306.3243 312.1598 19.6 0.3432 403 +405 3 306.6938 311.136 20.102 0.394 404 +406 3 306.4776 310.048 19.6238 0.3813 405 +407 3 306.2728 309.1752 18.7606 0.3432 406 +408 3 305.9536 308.5906 17.3617 0.3051 407 +409 3 306.2271 307.728 18.4929 0.3178 408 +410 3 306.3003 307.1571 19.88 0.3178 409 +411 3 306.2202 306.2385 19.4522 0.3305 410 +412 3 305.8324 305.472 18.692 0.3051 411 +413 3 306.0543 304.6483 17.0626 0.2669 412 +414 3 305.9125 303.7331 16.1081 0.1907 413 +415 3 306.3277 303.2332 17.9668 0.1398 414 +416 3 306.5028 302.3924 17.1954 0.1398 415 +417 3 306.6847 301.6236 15.4 0.1907 416 +418 3 306.4776 300.5402 14.8081 0.2669 417 +419 3 306.4021 299.5415 13.7206 0.3178 418 +420 3 306.6481 298.4707 14.2313 0.3432 419 +421 3 307.1548 297.4983 13.6046 0.3432 420 +422 3 307.5083 296.4276 13.433 0.3305 421 +423 3 308.0392 295.7034 14.5746 0.2924 422 +424 3 308.1261 294.7299 15.6968 0.2415 423 +425 3 308.3172 294.3867 18.051 0.1907 424 +426 3 308.5379 293.8272 18.3327 0.1652 425 +427 3 308.6478 293.0402 19.8005 0.1398 426 +428 3 308.9944 292.1776 19.32 0.1271 427 +429 3 301.7563 339.7005 25.1784 0.2161 284 +430 3 300.7198 339.2406 25.0488 0.2415 429 +431 3 299.8596 338.5531 24.4076 0.2669 430 +432 3 299.2475 337.6127 24.6694 0.2924 431 +433 3 298.584 336.7032 24.2603 0.3051 432 +434 3 298.1012 335.669 24.1738 0.3178 433 +435 3 297.4766 334.7241 24.5151 0.3432 434 +436 3 296.8074 333.8272 25.0947 0.3686 435 +437 3 295.9677 333.055 25.1944 0.3432 436 +438 3 295.1497 332.2554 25.1891 0.2796 437 +439 3 294.58 331.2658 25.1412 0.2161 438 +440 3 293.8501 330.3941 24.841 0.2161 439 +441 3 292.9281 329.79 24.1032 0.2669 440 +442 3 291.9122 329.2649 24.0794 0.2924 441 +443 3 291.0954 328.4641 24.0778 0.2924 442 +444 3 290.3941 327.6359 24.0705 0.3305 443 +445 3 289.9731 326.5754 24.0218 0.3432 444 +446 3 289.5922 325.508 23.6622 0.3051 445 +447 3 289.106 324.4739 23.7756 0.2542 446 +448 3 288.5031 323.5049 23.9355 0.2415 447 +449 3 287.9848 322.5348 23.1792 0.2669 448 +450 3 287.4334 321.5361 22.9522 0.2796 449 +451 3 286.8923 320.5294 22.9141 0.2924 450 +452 3 286.2116 319.6176 22.7242 0.2796 451 +453 3 285.3342 318.9369 22.0601 0.2924 452 +454 3 284.5483 318.1338 21.6026 0.2796 453 +455 3 284.0644 317.1328 20.9616 0.3178 454 +456 3 283.6754 316.0609 20.7477 0.3432 455 +457 3 283.2533 315.0096 20.9504 0.3686 456 +458 3 282.751 314.131 21.5046 0.3178 457 +459 3 282.099 313.6791 20.1116 0.2669 458 +460 3 281.1414 313.1506 19.8066 0.2415 459 +461 3 280.5111 312.9858 18.4475 0.2796 460 +462 3 279.9883 312.4344 20.0788 0.3051 461 +463 3 279.1726 311.8727 19.88 0.3178 462 +464 3 278.2094 311.3465 19.4373 0.3051 463 +465 3 277.2335 310.874 19.6932 0.3051 464 +466 3 276.2577 310.342 19.3332 0.2924 465 +467 3 275.4512 309.7449 19.7425 0.2924 466 +468 3 274.9089 308.9761 18.7628 0.3051 467 +469 3 274.7613 307.982 18.7228 0.3305 468 +470 3 273.9949 307.4958 18.8647 0.3432 469 +471 3 273.5144 306.7899 19.5331 0.3305 470 +472 3 272.7399 306.1367 19.32 0.3178 471 +473 3 272.4093 305.3805 18.76 0.2924 472 +474 3 271.5158 304.8314 18.6668 0.2669 473 +475 3 270.834 304.3749 18.5816 0.2415 474 +476 3 270.7082 303.5444 17.3958 0.2161 475 +477 3 270.7139 302.4542 17.08 0.2161 476 +478 3 270.556 301.6739 18.9095 0.2161 477 +479 3 270.2174 300.8331 19.88 0.2415 478 +480 3 270.9656 300.2531 19.3606 0.2669 479 +481 3 271.0102 299.3917 18.7132 0.3305 480 +482 3 270.8317 298.4341 18.4951 0.3686 481 +483 3 270.7402 297.4068 18.2034 0.3686 482 +484 3 269.9657 296.7433 17.8536 0.3051 483 +485 3 269.5744 295.7663 17.6047 0.2542 484 +486 3 269.5275 294.842 17.9556 0.2415 485 +487 3 268.7084 294.572 17.1433 0.2542 486 +488 3 268.1616 294.0114 16.5211 0.2669 487 +489 3 267.2498 293.5698 16.3058 0.2924 488 +490 3 266.2866 293.3811 16.2333 0.2924 489 +491 3 265.7706 292.5139 16.1266 0.2924 490 +492 3 265.2719 291.593 16.7759 0.2415 491 +493 3 264.6072 290.8048 17.08 0.2288 492 +494 3 290.4033 328.0706 22.5728 0.178 443 +495 3 289.7752 328.0123 24.1357 0.1525 494 +496 3 288.8131 327.8704 24.6543 0.1398 495 +497 3 288.288 327.5123 23.602 0.1398 496 +498 3 287.4792 327.184 22.8407 0.1525 497 +499 3 286.7264 327.0936 21.0204 0.1525 498 +500 3 285.9428 326.6063 21.8238 0.1652 499 +501 3 285.2942 326.4747 21.2932 0.1907 500 +502 3 284.4819 326.0572 20.72 0.2034 501 +503 3 283.5198 325.6579 21.28 0.2034 502 +504 3 282.6824 324.9429 21.252 0.178 503 +505 3 281.7638 324.4842 20.3174 0.1652 504 +506 3 280.8772 323.8023 20.0189 0.1525 505 +507 3 279.9036 323.2441 20.0203 0.1525 506 +508 3 278.9404 322.8368 19.6031 0.1525 507 +509 3 278.0698 322.3792 18.7673 0.1398 508 +510 3 276.9521 322.274 18.48 0.1271 509 +511 3 275.8298 322.1504 18.48 0.1271 510 +512 3 274.9032 321.8518 18.48 0.1398 511 +513 3 274.3392 321.0201 18.0141 0.178 512 +514 3 273.3428 320.5099 17.64 0.2161 513 +515 3 272.3212 320.034 17.6308 0.2669 514 +516 3 271.4277 319.4197 17.4751 0.2796 515 +517 3 270.5537 318.7756 17.1772 0.2796 516 +518 3 269.5573 318.3683 18.0026 0.2669 517 +519 3 268.6352 318.1144 18.5111 0.2542 518 +520 3 267.7864 318.3741 18.2311 0.2288 519 +521 3 267.0725 317.8032 18.2185 0.1907 520 +522 3 266.1413 317.6648 19.2688 0.1652 521 +523 3 265.0511 317.5744 19.567 0.1398 522 +524 3 263.9288 317.4611 19.32 0.1398 523 +525 3 263.2344 317.1225 19.1408 0.1652 524 +526 3 262.7848 316.2165 19.908 0.2034 525 +527 3 262.4336 315.8492 18.5679 0.2161 526 +528 3 261.6511 315.6353 17.5641 0.2161 527 +529 3 260.864 315.6296 17.08 0.2288 528 +530 3 259.7715 315.6353 17.3732 0.2669 529 +531 3 258.8346 315.1823 17.8254 0.2796 530 +532 3 257.8015 314.9203 17.668 0.2796 531 +533 3 256.8326 314.497 17.9544 0.3051 532 +534 3 255.8911 314.473 16.6197 0.3178 533 +535 3 254.9804 314.012 17.0663 0.3305 534 +536 3 254.1922 313.5704 18.4369 0.2924 535 +537 3 253.5104 312.8966 19.0089 0.3051 536 +538 3 253.0528 312.7696 18.2 0.1652 537 +539 3 252.6181 312.5408 16.998 0.2796 537 +540 3 251.7566 312.4138 16.9548 0.2796 539 +541 3 251.3322 312.7101 18.2 0.2415 540 +542 3 250.3964 312.3463 17.1422 0.2034 541 +543 3 249.781 311.6336 16.4004 0.2034 542 +544 3 249.6322 310.9289 16.7597 0.2288 543 +545 3 249.0751 310.7104 16.2016 0.2415 544 +546 3 248.3006 310.4736 15.9664 0.2542 545 +547 3 247.6691 309.9096 16.7026 0.2415 546 +548 3 247.0125 309.5893 18.4528 0.2542 547 +549 3 246.1636 309.3914 19.6 0.2415 548 +550 3 246.278 308.8994 17.7568 0.2288 549 +551 3 246.6464 308.5116 16.4433 0.2034 550 +552 3 246.0469 308.0426 15.7161 0.178 551 +553 3 245.8456 307.7749 17.827 0.1652 552 +554 3 246.0744 307.0496 17.92 0.1525 553 +555 3 307.5175 353.1997 23.016 0.2924 271 +556 3 307.1079 353.4194 20.7553 0.2796 555 +557 3 306.1733 353.7763 19.4611 0.2415 556 +558 3 305.3004 353.9181 17.8702 0.1907 557 +559 3 304.256 353.7042 16.879 0.1652 558 +560 3 303.168 353.6642 16.0686 0.1525 559 +561 3 302.286 354.0817 15.9202 0.1525 560 +562 3 302.1373 355.0839 16.8627 0.1652 561 +563 3 302.5102 356.1112 16.9459 0.1907 562 +564 3 302.6143 357.1053 15.9138 0.2161 563 +565 3 301.968 357.8981 15.2757 0.2161 564 +566 3 300.9315 358.2653 15.6022 0.2034 565 +567 3 300.4544 358.9998 16.791 0.178 566 +568 3 301.0928 359.5867 15.6106 0.178 567 +569 3 302.016 359.5592 14.0 0.1907 568 +570 3 306.1218 356.5768 26.1514 0.3178 268 +571 3 305.2238 356.245 24.876 0.3178 570 +572 3 304.2125 356.0048 24.7976 0.2669 571 +573 3 303.295 355.6799 24.3214 0.2415 572 +574 3 302.3295 355.6582 24.92 0.1907 573 +575 3 301.2072 355.5998 25.121 0.178 574 +576 3 300.2485 355.3058 24.0128 0.2034 575 +577 3 299.3287 355.2886 22.96 0.2542 576 +578 3 298.3483 354.9958 23.0737 0.2796 577 +579 3 297.4926 354.8654 22.8934 0.2796 578 +580 3 296.5488 354.5256 22.6873 0.2796 579 +581 3 295.5993 354.1069 21.8565 0.3051 580 +582 3 294.7299 353.377 21.56 0.3305 581 +583 3 293.9634 352.598 22.0142 0.3305 582 +584 3 293.0184 352.1415 21.5642 0.3305 583 +585 3 292.2256 351.6416 21.7003 0.3305 584 +586 3 291.3596 351.0272 21.3592 0.3305 585 +587 3 290.4227 350.525 21.0731 0.3178 586 +588 3 289.4 350.1475 20.8603 0.3178 587 +589 3 289.0064 349.333 20.16 0.3305 588 +590 3 288.2239 348.5757 20.6489 0.3305 589 +591 3 287.549 347.7691 20.7827 0.2796 590 +592 3 286.6429 347.2852 19.8761 0.2415 591 +593 3 285.9348 346.6148 19.8573 0.2161 592 +594 3 285.0036 346.2064 20.1401 0.2288 593 +595 3 284.3469 345.8655 19.6622 0.2034 594 +596 3 283.7074 345.4114 19.4219 0.178 595 +597 3 283.14 344.9137 19.4622 0.1525 596 +598 3 282.6481 344.1816 20.6951 0.1652 597 +599 3 281.837 343.6679 19.6288 0.1907 598 +600 3 280.9881 343.2629 19.88 0.2161 599 +601 3 280.0512 342.914 19.88 0.2415 600 +602 3 279.3019 342.382 19.4384 0.2542 601 +603 3 278.3855 341.8924 19.8755 0.2796 602 +604 3 277.4875 341.341 19.3486 0.2796 603 +605 3 276.6135 340.8399 19.32 0.2796 604 +606 3 275.7555 340.0986 19.3869 0.2669 605 +607 3 275.1126 339.3035 19.1041 0.2542 606 +608 3 274.4033 338.4764 19.0551 0.2161 607 +609 3 273.8862 337.4617 19.164 0.1652 608 +610 3 273.1323 336.6517 19.32 0.1525 609 +611 3 272.4882 335.7766 19.32 0.1907 610 +612 3 272.264 335.2423 19.32 0.2034 611 +613 3 271.5856 334.5056 19.32 0.2415 612 +614 3 272.59 335.1714 19.5513 0.2034 611 +615 3 272.3841 334.0732 19.9839 0.2415 614 +616 3 271.9368 333.198 19.6078 0.2669 615 +617 3 271.239 332.4819 19.9755 0.2669 616 +618 3 270.3421 331.8138 20.3748 0.2161 617 +619 3 269.7083 330.8986 19.8016 0.178 618 +620 3 269.3182 329.9376 19.3113 0.1398 619 +621 3 268.8743 328.9149 19.32 0.1271 620 +622 3 268.117 328.0843 19.1159 0.1271 621 +623 3 267.2075 327.5478 19.3166 0.1398 622 +624 3 266.1836 327.0971 19.04 0.1525 623 +625 3 265.0934 326.8786 19.3945 0.1398 624 +626 3 264.2228 326.5068 20.72 0.1271 625 +627 3 263.3477 326.3889 19.3189 0.1144 626 +628 3 262.3993 325.9336 18.48 0.1144 627 +629 3 261.2667 325.8112 18.48 0.1271 628 +630 3 260.1273 325.7837 18.48 0.1398 629 +631 3 259.3677 325.1683 18.3674 0.1525 630 +632 3 258.7145 324.419 17.7086 0.1398 631 +633 3 257.8553 323.7051 17.92 0.1271 632 +634 3 257.0213 322.9947 17.92 0.1144 633 +635 3 256.3155 322.171 17.92 0.1144 634 +636 3 255.7137 321.2741 17.897 0.1398 635 +637 3 255.3111 320.8989 16.849 0.1907 636 +638 3 254.6452 320.0088 16.8566 0.2669 637 +639 3 253.7346 319.3339 16.8582 0.3178 638 +640 3 253.07 318.5823 16.9044 0.3432 639 +641 3 252.379 317.7082 16.8224 0.3432 640 +642 3 251.4546 317.428 16.4956 0.3559 641 +643 3 250.4948 317.0173 16.6286 0.394 642 +644 3 249.7386 316.2005 16.52 0.4195 643 +645 3 249.0133 315.3493 16.2977 0.4195 644 +646 3 248.129 314.6561 16.6116 0.3686 645 +647 3 247.4655 314.1058 16.4615 0.3432 646 +648 3 246.6178 313.5178 16.3047 0.3178 647 +649 3 245.5848 313.1094 16.87 0.3178 648 +650 3 244.7119 312.4584 17.4672 0.3051 649 +651 3 243.7784 311.8372 17.4846 0.3305 650 +652 3 242.9662 311.1165 17.1632 0.3432 651 +653 3 242.4765 310.4702 16.6365 0.3432 652 +654 3 241.6872 309.9073 16.3302 0.2924 653 +655 3 241.4115 309.452 18.1269 0.2415 654 +656 3 241.4206 309.4703 16.52 0.1907 655 +657 3 241.0774 308.4647 16.5217 0.1652 656 +658 3 241.4069 307.633 14.966 0.178 657 +659 3 241.1506 306.7842 14.9271 0.2161 658 +660 3 240.5752 306.6137 16.8932 0.2415 659 +661 3 240.1954 305.6962 16.6281 0.2288 660 +662 3 240.2617 305.0339 18.0849 0.1907 661 +663 3 240.637 304.4173 17.92 0.1907 662 +664 3 240.6301 303.9196 17.0405 0.2034 663 +665 3 240.3738 303.0834 15.96 0.2669 664 +666 3 239.9803 302.4015 15.3524 0.3051 665 +667 3 239.3591 301.579 15.1256 0.3305 666 +668 3 238.7471 300.9978 16.1073 0.3051 667 +669 3 238.0195 300.4075 15.8668 0.2669 668 +670 3 237.9165 300.014 14.0358 0.2542 669 +671 3 237.2736 299.3196 14.2419 0.2288 670 +672 3 236.6936 299.156 12.88 0.2034 671 +673 3 312.0306 368.2181 26.1411 0.1652 1 +674 3 311.78 367.1565 25.3375 0.2161 673 +675 3 311.2504 366.223 24.3908 0.2542 674 +676 3 310.9037 365.2781 23.0723 0.2415 675 +677 3 311.2183 364.1935 22.96 0.2161 676 +678 3 311.8498 363.6547 22.9597 0.394 677 +679 3 312.7696 362.9752 22.958 0.4195 678 +680 3 313.6047 362.1938 22.9513 0.4068 679 +681 3 314.4742 361.4502 22.9222 0.394 680 +682 3 315.4214 360.813 22.7665 0.3686 681 +683 3 316.2851 360.1198 22.0604 0.3432 682 +684 3 317.1465 359.3739 21.84 0.3051 683 +685 3 318.0148 358.6314 21.84 0.2669 684 +686 3 318.8362 357.8363 21.84 0.2542 685 +687 3 319.6416 357.023 21.84 0.2415 686 +688 3 320.4333 356.197 21.84 0.2542 687 +689 3 321.1666 355.3218 21.84 0.2669 688 +690 3 321.8404 354.3986 21.8394 0.3178 689 +691 3 322.5485 353.5017 21.8375 0.3559 690 +692 3 323.2601 352.6105 21.8285 0.3559 691 +693 3 324.1169 351.8612 21.7795 0.3305 692 +694 3 325.047 351.2286 21.429 0.2924 693 +695 3 325.8169 350.469 20.6265 0.2924 694 +696 3 326.5079 349.6098 19.9601 0.2796 695 +697 3 327.3293 348.8342 19.6504 0.2796 696 +698 3 328.1415 348.046 19.936 0.2669 697 +699 3 328.8657 347.1971 20.151 0.2924 698 +700 3 329.5349 346.2865 19.7893 0.3432 699 +701 3 330.3106 345.4571 19.5244 0.3686 700 +702 3 331.1239 344.6792 19.0999 0.3559 701 +703 3 331.9099 343.8727 18.6348 0.3051 702 +704 3 332.5951 342.9655 18.5945 0.2924 703 +705 3 333.2735 342.0823 19.14 0.2924 704 +706 3 334.0423 341.2644 19.6092 0.3051 705 +707 3 334.8465 340.4761 20.097 0.3051 706 +708 3 335.6896 339.7302 20.5808 0.2924 707 +709 3 336.6186 339.0736 20.7189 0.2796 708 +710 3 337.5704 338.4398 20.7152 0.2669 709 +711 3 338.4787 337.7466 20.6982 0.2669 710 +712 3 339.3905 337.0556 20.6136 0.2542 711 +713 3 340.4155 336.797 19.9066 0.2288 712 +714 3 340.888 336.7021 20.7054 0.2034 713 +715 3 341.7357 336.2182 20.4498 0.178 714 +716 3 342.6898 335.8143 19.9534 0.1907 715 +717 3 343.5409 335.6496 18.6522 0.2288 716 +718 3 344.1221 334.8843 18.1961 0.2924 717 +719 3 344.5465 334.0194 18.6458 0.3178 718 +720 3 345.0476 333.0459 19.0036 0.2796 719 +721 3 345.3461 332.1272 19.264 0.2161 720 +722 3 345.8907 331.3127 19.6795 0.1652 721 +723 3 346.5256 330.8276 19.49 0.1525 722 +724 3 346.7864 330.0337 19.9335 0.178 723 +725 3 347.0107 329.2009 20.7088 0.1907 724 +726 3 347.3138 328.5774 19.2556 0.2288 725 +727 3 346.5519 328.328 17.5574 0.2415 726 +728 3 346.5359 327.9951 15.68 0.2796 727 +729 3 346.6 327.2984 15.0192 0.2924 728 +730 3 346.2888 326.4496 14.6462 0.2796 729 +731 3 346.2888 326.1544 17.2052 0.2542 730 +732 3 346.7773 325.3822 17.92 0.2288 731 +733 3 347.204 324.721 18.5643 0.2288 732 +734 3 347.2635 323.7509 18.1902 0.2415 733 +735 3 347.3962 322.8585 17.0125 0.2415 734 +736 3 347.744 321.9651 18.2 0.2669 735 +737 3 347.911 320.9641 17.3768 0.2796 736 +738 3 348.5459 320.1141 17.8315 0.3305 737 +739 3 348.8056 319.3693 18.0029 0.3686 738 +740 3 349.2781 318.3969 17.5647 0.394 739 +741 3 349.8352 317.7185 17.08 0.394 740 +742 3 350.1326 316.8537 16.2173 0.3686 741 +743 3 350.31 315.8206 16.0096 0.3559 742 +744 3 350.5582 314.7338 16.387 0.3305 743 +745 3 350.8797 313.782 17.4628 0.3051 744 +746 3 351.526 313.0636 18.3985 0.2796 745 +747 3 352.0946 312.2262 17.7682 0.2415 746 +748 3 353.0052 311.5707 17.92 0.2288 747 +749 3 353.774 310.9575 16.8146 0.2034 748 +750 3 354.5439 310.4724 15.6842 0.2288 749 +751 3 355.1411 310.008 15.7872 0.2288 750 +752 3 355.8458 309.3994 15.0598 0.2542 751 +753 3 356.2656 308.6054 14.56 0.2669 752 +754 3 356.9337 307.8401 15.12 0.2924 753 +755 3 357.595 307.053 14.9226 0.3178 754 +756 3 358.3042 306.4273 16.2442 0.3178 755 +757 3 358.9231 305.8244 15.3765 0.3051 756 +758 3 359.1668 304.828 15.6624 0.2796 757 +759 3 359.4459 303.8464 15.2127 0.2415 758 +760 3 359.6622 302.8454 14.082 0.2288 759 +761 3 360.0889 302.1704 15.0889 0.2161 760 +762 3 360.5488 301.5893 14.4393 0.2542 761 +763 3 361.4491 301.2072 14.4878 0.2796 762 +764 3 362.1458 300.7187 15.4 0.2924 763 +765 3 362.759 300.2199 17.0999 0.2796 764 +766 3 363.1182 299.2921 16.681 0.2542 765 +767 3 363.5632 298.433 15.4311 0.2415 766 +768 3 363.6467 297.7626 17.2939 0.2034 767 +769 3 363.8389 297.0968 16.7356 0.1907 768 +770 3 364.3114 296.717 16.2686 0.1907 769 +771 3 364.1558 295.9128 17.3474 0.2161 770 +772 3 364.2496 294.9186 16.1381 0.2288 771 +773 3 364.2302 294.5823 13.8012 0.2161 772 +774 3 363.8721 293.8639 14.3632 0.2034 773 +775 3 364.4784 293.0928 15.4 0.178 774 +776 3 311.2515 363.5666 23.2739 0.3051 677 +777 3 311.6279 362.8608 25.2036 0.2415 776 +778 3 311.7995 362.4352 27.6895 0.2034 777 +779 3 312.0535 362.0497 29.6856 0.2034 778 +780 3 311.5078 361.1825 30.4539 0.2542 779 +781 3 310.7596 360.3772 30.875 0.3051 780 +782 3 310.1064 359.4757 31.3404 0.3305 781 +783 3 310.2482 358.7836 32.2291 0.3432 782 +784 3 311.0708 358.1349 33.3287 0.3305 783 +785 3 311.3007 357.1156 34.0796 0.2924 784 +786 3 310.8854 356.0746 34.2222 0.2669 785 +787 3 310.453 355.0518 34.853 0.2542 786 +788 3 310.9861 354.1298 35.4858 0.2796 787 +789 3 311.9345 353.5864 36.2782 0.3051 788 +790 3 312.4516 352.5831 36.6072 0.3559 789 +791 3 311.7903 351.3453 38.0428 0.2924 790 +792 3 311.2183 350.4884 39.1381 0.3178 791 +793 3 310.8305 349.4863 40.0814 0.394 792 +794 3 310.3603 348.5288 41.0603 0.4322 793 +795 3 309.7723 347.6341 41.9689 0.4195 794 +796 3 309.0219 346.8276 42.6549 0.3305 795 +797 3 308.2005 346.0703 43.1046 0.2669 796 +798 3 307.3882 345.2649 43.169 0.2288 797 +799 3 306.5634 344.479 43.379 0.2288 798 +800 3 305.6402 344.0008 44.0409 0.2415 799 +801 3 304.9469 343.2915 44.3948 0.2542 800 +802 3 304.5317 342.4106 44.1983 0.2669 801 +803 3 304.2834 341.5046 44.1126 0.2542 802 +804 3 303.6393 340.5951 43.68 0.2415 803 +805 3 302.8088 339.8389 43.68 0.2415 804 +806 3 301.9863 339.2589 43.0254 0.2415 805 +807 3 301.2461 338.4261 43.001 0.2161 806 +808 3 300.5551 337.6642 43.4 0.1907 807 +809 3 299.7463 336.9 43.3958 0.1907 808 +810 3 298.8277 336.2433 43.1981 0.2288 809 +811 3 297.9788 335.5398 43.68 0.2415 810 +812 3 297.3634 334.6154 43.96 0.2415 811 +813 3 296.3921 334.2642 44.4906 0.2415 812 +814 3 295.581 333.5732 44.3167 0.2796 813 +815 3 295.0216 333.0184 43.12 0.3305 814 +816 3 294.2654 332.3503 43.4904 0.3559 815 +817 3 293.6602 331.5873 43.5422 0.3432 816 +818 3 292.999 330.9363 43.68 0.3051 817 +819 3 292.2623 330.0955 43.96 0.2669 818 +820 3 291.6205 329.1997 43.4826 0.2161 819 +821 3 290.8254 328.4127 43.12 0.178 820 +822 3 290.1253 327.5238 43.12 0.178 821 +823 3 289.5441 326.7115 42.9195 0.2034 822 +824 3 288.9744 326.1292 43.0903 0.2415 823 +825 3 288.439 325.206 43.1589 0.2415 824 +826 3 288.4367 324.1616 42.8431 0.2669 825 +827 3 288.1393 323.1789 42.7966 0.2542 826 +828 3 287.5558 322.2545 42.56 0.2542 827 +829 3 286.977 321.2947 42.2531 0.2161 828 +830 3 286.4233 320.4584 41.5663 0.2161 829 +831 3 285.3388 320.1701 41.44 0.2034 830 +832 3 284.6798 319.3682 41.1695 0.1907 831 +833 3 283.9557 318.5926 40.8853 0.178 832 +834 3 283.2899 317.9885 39.7424 0.2034 833 +835 3 282.2248 317.6122 39.3862 0.2669 834 +836 3 281.7706 316.8617 39.8717 0.3051 835 +837 3 281.535 315.8595 39.4708 0.3305 836 +838 3 280.9172 315.7486 38.099 0.3305 837 +839 3 280.3063 314.9981 38.456 0.3305 838 +840 3 279.4643 314.5279 38.0993 0.2796 839 +841 3 278.8523 313.718 39.058 0.2161 840 +842 3 278.2505 312.8977 38.6389 0.178 841 +843 3 277.5664 312.2594 37.4657 0.2034 842 +844 3 276.9944 311.406 37.1272 0.2288 843 +845 3 276.3858 310.8957 38.5666 0.2669 844 +846 3 275.6823 310.7035 37.5376 0.2542 845 +847 3 274.6092 310.5068 36.96 0.2669 846 +848 3 273.551 310.2597 36.5106 0.2161 847 +849 3 272.9492 309.5824 35.8218 0.1907 848 +850 3 271.9677 309.1614 35.84 0.1525 849 +851 3 271.1429 308.5242 36.4 0.1652 850 +852 3 270.3375 307.8207 36.7111 0.1907 851 +853 3 269.4612 307.1308 36.7223 0.2288 852 +854 3 268.7794 306.2568 36.7875 0.2669 853 +855 3 268.0552 305.4217 36.5316 0.3178 854 +856 3 267.601 304.5808 36.0287 0.3432 855 +857 3 267.2407 303.8464 35.3214 0.3686 856 +858 3 266.9581 303.176 35.2694 0.3432 857 +859 3 266.7511 302.4221 35.5496 0.3432 858 +860 3 266.1344 301.6877 35.5541 0.3305 859 +861 3 265.6746 300.872 34.5332 0.3305 860 +862 3 265.6368 300.5288 35.56 0.2415 861 +863 3 265.4034 300.2096 34.7141 0.2669 861 +864 3 265.0145 299.3356 35.2612 0.2542 863 +865 3 264.542 298.33 35.0022 0.2796 864 +866 3 264.2114 297.678 33.3169 0.3051 865 +867 3 263.9711 296.9435 32.0051 0.3305 866 +868 3 263.6405 296.1393 33.0145 0.3305 867 +869 3 263.6771 295.0982 33.6196 0.3051 868 +870 3 264.0249 294.2746 34.2286 0.2415 869 +871 3 264.0352 293.293 33.3214 0.2034 870 +872 3 264.2732 292.3069 33.532 0.2034 871 +873 3 264.2365 291.4512 32.0158 0.2669 872 +874 3 264.0924 290.4273 32.3109 0.3178 873 +875 3 263.4632 289.7134 32.2 0.3178 874 +876 3 263.3442 288.6564 32.48 0.2924 875 +877 3 263.3156 287.8956 31.4336 0.2796 876 +878 3 262.8683 287.1257 29.8343 0.3051 877 +879 3 262.397 286.2528 30.2599 0.3305 878 +880 3 261.706 286.0812 31.92 0.3305 879 +881 3 261.2633 285.2244 31.2833 0.2924 880 +882 3 260.5609 284.5483 30.24 0.2542 881 +883 3 260.0621 283.9797 31.3284 0.2288 882 +884 3 259.4054 283.2716 31.3894 0.2542 883 +885 3 258.5371 282.6424 30.7597 0.2924 884 +886 3 257.9194 281.8839 30.2347 0.3305 885 +887 3 257.4 281.2135 29.4294 0.3305 886 +888 3 256.9859 280.4276 29.5809 0.2796 887 +889 3 256.2331 279.9368 28.4547 0.2288 888 +890 3 255.4804 279.454 29.4 0.2034 889 +891 3 255.2092 279.1349 29.9348 0.2924 890 +892 3 254.6544 279.5936 30.8 0.2669 891 +893 3 255.0617 278.945 29.9289 0.2924 890 +894 3 254.0424 278.5732 29.0458 0.2161 893 +895 3 253.2107 278.326 29.1578 0.1907 894 +896 3 252.4259 277.6522 28.5659 0.1652 895 +897 3 252.3653 276.8594 27.72 0.1525 896 +898 3 251.6789 276.1193 27.587 0.1525 897 +899 3 251.108 275.2384 27.6749 0.1652 898 +900 3 250.9833 274.1356 27.1768 0.1652 899 +901 3 250.1585 273.5304 26.8562 0.1652 900 +902 3 249.3851 273.1597 26.1033 0.1398 901 +903 3 248.7331 273.4126 27.44 0.1271 902 +904 3 247.6051 273.4046 27.1631 0.1398 903 +905 3 246.8775 272.9984 28.56 0.1652 904 +906 3 245.8216 272.8223 27.83 0.1907 905 +907 3 244.7782 272.844 26.88 0.1907 906 +908 3 243.6354 272.8749 26.9052 0.2034 907 +909 3 242.6046 273.1426 27.0446 0.2288 908 +910 3 241.5819 273.1506 27.4898 0.2288 909 +911 3 240.8669 272.5717 27.5058 0.2034 910 +912 3 240.4562 272.1565 26.2601 0.1525 911 +913 3 239.4438 272.0432 25.76 0.1398 912 +914 3 238.7974 271.9288 27.3535 0.1398 913 +915 3 238.1225 271.2676 27.6744 0.1525 914 +916 3 237.3537 271.3568 26.3194 0.1525 915 +917 3 236.8069 270.969 25.1166 0.1525 916 +918 3 236.7028 270.6704 27.0304 0.1525 917 +919 3 236.3504 269.9291 28.4668 0.1398 918 +920 3 236.3195 268.824 28.8728 0.1525 919 +921 3 235.6834 268.0495 28.2523 0.178 920 +922 3 235.5839 267.2064 27.1216 0.2415 921 +923 3 236.1216 266.4376 27.16 0.2796 922 +924 3 254.4988 278.0858 29.4 0.2161 893 +925 3 254.2037 277.0505 29.0338 0.2288 924 +926 3 253.9428 276.0632 29.1939 0.2161 925 +927 3 253.5825 275.0805 29.6388 0.178 926 +928 3 253.5104 274.0955 28.84 0.1398 927 +929 3 253.5104 272.9515 28.84 0.1271 928 +930 3 253.1409 271.8865 28.8534 0.1398 929 +931 3 252.5437 270.9347 28.5692 0.1652 930 +932 3 252.252 269.9291 28.28 0.178 931 +933 3 252.5758 268.951 28.273 0.1907 932 +934 3 252.5986 267.9626 28.7207 0.178 933 +935 3 252.7096 266.9856 28.3861 0.1652 934 +936 3 252.1856 266.155 28.28 0.1525 935 +937 3 251.4398 265.3817 28.28 0.1525 936 +938 3 250.3678 265.0648 28.2072 0.1525 937 +939 3 249.2593 265.2684 28.0101 0.1652 938 +940 3 248.3418 265.2833 27.2443 0.2034 939 +941 3 247.6989 264.4962 27.4792 0.2288 940 +942 3 247.0205 263.8693 26.9744 0.2288 941 +943 3 246.27 263.0342 27.2429 0.178 942 +944 3 245.3274 262.5503 28.0 0.1652 943 +945 3 244.5918 261.9863 27.1821 0.178 944 +946 3 243.7155 261.7278 27.0357 0.2288 945 +947 3 243.2991 260.9475 26.0495 0.2415 946 +948 3 243.2144 260.1753 26.4396 0.2415 947 +949 3 242.9295 259.3185 26.5426 0.2161 948 +950 3 242.4422 258.5062 25.9938 0.2034 949 +951 3 242.1825 257.4721 25.48 0.178 950 +952 3 241.9423 256.3807 25.9484 0.178 951 +953 3 241.5682 255.3648 26.2539 0.178 952 +954 3 240.8726 254.4817 26.6224 0.2034 953 +955 3 240.121 253.6992 26.7128 0.2161 954 +956 3 239.6222 252.8 26.7966 0.2288 955 +957 3 239.5033 251.7406 26.4695 0.2161 956 +958 3 239.5628 250.6069 26.6647 0.1907 957 +959 3 239.5467 249.4641 26.6 0.1525 958 +960 3 239.1029 248.4688 27.0866 0.1271 959 +961 3 238.389 247.6291 27.44 0.1144 960 +962 3 237.7507 246.7574 27.44 0.1271 961 +963 3 237.5722 245.6362 27.44 0.1525 962 +964 3 236.9636 244.8126 27.7875 0.1907 963 +965 3 236.7348 243.8916 28.338 0.2161 964 +966 3 236.236 243.1057 28.716 0.2288 965 +967 3 235.6915 242.3873 29.461 0.2161 966 +968 3 234.8049 241.956 28.6479 0.2034 967 +969 3 233.7661 241.7615 28.56 0.1907 968 +970 3 232.939 241.1232 28.8002 0.2034 969 +971 3 231.9746 240.5683 28.3027 0.2034 970 +972 3 231.0537 239.8968 28.222 0.1907 971 +973 3 230.0881 239.3728 28.2402 0.1525 972 +974 3 229.4864 238.5972 28.56 0.1398 973 +975 3 229.0631 237.5745 28.56 0.1525 974 +976 3 228.3561 236.6822 28.56 0.178 975 +977 3 227.8745 236.0129 27.5131 0.178 976 +978 3 227.4272 235.124 28.28 0.1525 977 +979 3 227.2201 234.0567 28.28 0.1271 978 +980 3 226.9696 233.0774 28.28 0.1271 979 +981 3 226.7946 232.0192 28.28 0.1525 980 +982 3 225.956 231.66 27.1432 0.178 981 +983 3 226.0567 230.8901 27.3364 0.178 982 +984 3 225.8256 229.8468 27.72 0.1525 983 +985 3 225.8256 228.7028 27.72 0.1271 984 +986 3 225.8256 227.5588 27.72 0.1271 985 +987 3 225.7112 226.4331 27.9947 0.1398 986 +988 3 225.4984 225.5476 28.4824 0.1525 987 +989 3 225.6986 224.5661 28.285 0.1652 988 +990 3 225.7112 223.4232 28.28 0.1907 989 +991 3 312.7742 352.0122 37.4774 0.394 790 +992 3 313.4629 352.018 39.2 0.3559 991 +993 3 314.5531 352.1232 39.0611 0.3051 992 +994 3 315.6937 352.1232 39.2 0.2415 993 +995 3 316.6272 352.2319 40.0697 0.2161 994 +996 3 317.2449 351.6645 39.4985 0.2161 995 +997 3 317.8615 351.5501 38.3634 0.2034 996 +998 3 318.8236 351.3087 39.2 0.1652 997 +999 3 319.9539 351.1966 39.256 0.1271 998 +1000 3 320.9915 350.827 39.5508 0.1271 999 +1001 3 322.0085 350.4781 40.32 0.1525 1000 +1002 3 323.1388 350.2997 40.32 0.178 1001 +1003 3 324.0357 349.9496 39.5024 0.178 1002 +1004 3 325.0436 349.9496 40.32 0.1525 1003 +1005 3 326.0537 349.7242 39.48 0.1525 1004 +1006 3 326.9049 349.1271 39.1737 0.1907 1005 +1007 3 327.8933 348.6546 38.4574 0.2669 1006 +1008 3 328.9126 348.3091 38.2824 0.2924 1007 +1009 3 329.9422 348.1512 39.0362 0.2924 1008 +1010 3 330.8162 347.6513 38.8066 0.2542 1009 +1011 3 331.6685 347.0953 38.7383 0.2415 1010 +1012 3 332.443 346.5176 39.0572 0.2161 1011 +1013 3 333.5298 346.2716 38.9567 0.2161 1012 +1014 3 334.6006 345.9422 39.2 0.2415 1013 +1015 3 335.7148 345.75 39.2 0.2796 1014 +1016 3 336.6552 345.2066 38.92 0.2796 1015 +1017 3 337.6367 344.7204 38.906 0.2415 1016 +1018 3 338.5222 344.1083 38.64 0.2034 1017 +1019 3 339.3493 343.7068 39.4472 0.1907 1018 +1020 3 340.1306 343.1268 38.703 0.178 1019 +1021 3 341.1374 342.8007 38.8433 0.1525 1020 +1022 3 341.6968 342.0343 38.2917 0.1271 1021 +1023 3 342.7699 341.8272 38.4994 0.1271 1022 +1024 3 343.8807 341.8272 38.92 0.1398 1023 +1025 3 344.9995 341.6831 38.64 0.1525 1024 +1026 3 345.9765 341.2277 39.3921 0.1398 1025 +1027 3 346.9214 340.809 39.48 0.1271 1026 +1028 3 347.9201 340.3514 39.2 0.1271 1027 +1029 3 348.7152 339.768 39.17 0.1398 1028 +1030 3 349.8158 339.5861 39.2465 0.1525 1029 +1031 3 350.4941 338.9157 40.054 0.1398 1030 +1032 3 351.184 338.0497 40.1649 0.1398 1031 +1033 3 351.9779 337.2375 40.04 0.1398 1032 +1034 3 352.7627 336.4161 39.7754 0.1525 1033 +1035 3 353.4537 335.7834 40.304 0.1398 1034 +1036 3 354.0062 334.8179 40.2942 0.1398 1035 +1037 3 354.6022 333.9977 39.5335 0.1398 1036 +1038 3 354.8688 333.2232 40.1047 0.1525 1037 +1039 3 354.8688 332.1146 39.76 0.1398 1038 +1040 3 354.926 330.9821 39.76 0.1398 1039 +1041 3 355.5575 330.1161 39.9524 0.1525 1040 +1042 3 355.6868 329.2466 41.44 0.178 1041 +1043 3 356.0872 328.233 41.0396 0.2034 1042 +1044 3 356.928 327.6416 40.6 0.2034 1043 +1045 2 313.9491 377.5497 28.194 0.2034 1 +1046 2 314.3346 378.4878 29.4406 0.3051 1045 +1047 2 315.2921 379.0438 29.8995 0.394 1046 +1048 2 316.1364 379.7222 30.7801 0.4449 1047 +1049 2 316.2531 380.8536 30.8048 0.4576 1048 +1050 2 316.5425 381.9599 30.8286 0.4449 1049 +1051 3 314.7499 376.7741 26.964 0.1398 1 +1052 3 315.3905 377.7213 26.8498 0.178 1051 +1053 3 315.8264 378.5427 27.6531 0.2288 1052 +1054 3 316.9498 378.5324 27.44 0.2288 1053 +1055 3 317.5115 378.2064 29.1007 0.2288 1054 +1056 3 318.6543 378.2064 29.12 0.2288 1055 +1057 3 319.7903 378.3094 29.12 0.2924 1056 +1058 3 320.6632 378.2762 28.1529 0.3432 1057 +1059 3 321.3084 377.6104 28.7398 0.3686 1058 +1060 3 322.314 377.091 28.9512 0.3432 1059 +1061 3 323.3836 376.7192 28.9022 0.3051 1060 +1062 3 324.5196 376.3852 28.6958 0.2669 1061 +1063 3 325.341 376.6426 28.6843 0.2288 1062 +1064 3 325.9519 376.4424 29.4493 0.178 1063 +1065 3 327.0158 376.1472 29.4 0.1652 1064 +1066 3 327.7938 375.7274 28.28 0.1907 1065 +1067 3 328.5396 375.621 28.4964 0.2415 1066 +1068 3 329.3553 375.3624 29.5546 0.2669 1067 +1069 3 330.2305 375.5535 30.5978 0.2796 1068 +1070 3 331.1937 375.2675 31.8942 0.2669 1069 +1071 3 332.0037 375.0032 30.6956 0.2924 1070 +1072 3 332.9761 374.6886 30.0754 0.2924 1071 +1073 3 333.9359 374.6108 29.9622 0.2796 1072 +1074 3 335.025 374.4312 30.3635 0.2669 1073 +1075 3 335.7148 373.842 31.2332 0.2924 1074 +1076 3 336.7101 373.4771 30.5354 0.3432 1075 +1077 3 337.5178 373.2231 30.7376 0.3178 1076 +1078 3 338.5462 372.8857 30.6348 0.2796 1077 +1079 3 339.6216 372.8548 30.3873 0.2161 1078 +1080 3 340.6043 372.6569 29.9838 0.2288 1079 +1081 3 341.1408 372.4784 28.2072 0.2288 1080 +1082 3 341.6625 372.8799 27.72 0.2288 1081 +1083 3 342.1189 373.3616 27.72 0.2924 1082 +1084 3 342.7962 374.0514 27.47 0.3178 1083 +1085 3 343.7068 374.231 28.3346 0.3178 1084 +1086 3 344.4401 374.0777 27.4652 0.3178 1085 +1087 3 345.2009 374.0571 26.1884 0.3559 1086 +1088 3 345.6035 374.088 24.6884 0.394 1087 +1089 3 345.8312 374.7378 25.1006 0.4068 1088 +1090 3 346.6251 375.0032 25.5178 0.3813 1089 +1091 3 347.4351 375.3922 25.951 0.3686 1090 +1092 3 348.3251 375.1187 24.9511 0.3559 1091 +1093 3 349.3765 375.232 24.64 0.3305 1092 +1094 3 349.7208 375.7079 23.2184 0.2669 1093 +1095 3 350.334 376.249 23.3806 0.2288 1094 +1096 3 351.1096 376.0248 22.3401 0.2288 1095 +1097 3 351.9287 375.6804 23.0812 0.2669 1096 +1098 3 352.789 375.4333 21.9601 0.2924 1097 +1099 3 353.83 375.4436 21.0022 0.2924 1098 +1100 3 354.6526 375.4608 21.4315 0.2796 1099 +1101 3 355.7531 375.6919 21.28 0.2669 1100 +1102 3 356.4029 376.336 20.44 0.2796 1101 +1103 3 357.3604 376.2616 20.1211 0.2924 1102 +1104 3 358.4026 376.5407 20.4168 0.2924 1103 +1105 3 358.9586 376.948 19.04 0.3051 1104 +1106 3 359.7891 377.4193 19.6935 0.3178 1105 +1107 3 360.6368 377.52 20.55 0.3432 1106 +1108 3 361.6813 377.6424 20.1704 0.3178 1107 +1109 3 362.767 377.7042 20.2118 0.2669 1108 +1110 3 363.6307 378.2339 19.6834 0.2288 1109 +1111 3 364.269 378.664 19.0453 0.2161 1110 +1112 3 365.1053 379.1674 20.1905 0.2542 1111 +1113 3 365.8992 379.538 19.4121 0.2796 1112 +1114 3 366.5845 380.2233 19.1332 0.3178 1113 +1115 3 367.1439 380.7976 20.44 0.3305 1114 +1116 3 367.8566 381.4039 19.3466 0.3432 1115 +1117 3 368.4389 381.8111 20.44 0.3432 1116 +1118 3 369.226 382.4266 20.7158 0.3305 1117 +1119 3 370.0279 383.1416 20.713 0.2924 1118 +1120 3 370.6549 383.987 20.9905 0.2288 1119 +1121 3 371.0964 384.956 20.0603 0.1907 1120 +1122 3 371.6238 385.9067 19.6862 0.1907 1121 +1123 3 372.356 386.7098 20.0836 0.2161 1122 +1124 3 373.135 387.5106 19.6006 0.2161 1123 +1125 3 373.7803 388.2484 20.2082 0.2034 1124 +1126 3 374.4426 389.151 19.7098 0.2161 1125 +1127 3 375.113 390.0571 19.3166 0.2288 1126 +1128 3 375.9092 390.7812 19.6 0.2288 1127 +1129 3 376.8302 391.2457 19.1556 0.178 1128 +1130 3 377.9238 391.4951 19.32 0.1652 1129 +1131 3 379.0518 391.6759 19.32 0.178 1130 +1132 3 380.1798 391.7822 19.516 0.2161 1131 +1133 3 381.2083 391.7159 19.0711 0.2034 1132 +1134 3 382.1726 391.7662 19.4855 0.178 1133 +1135 3 383.2457 391.9905 20.2056 0.1652 1134 +1136 3 384.3817 392.0488 20.454 0.1907 1135 +1137 3 385.48 391.9767 20.9412 0.2161 1136 +1138 3 386.434 392.0259 20.1698 0.2288 1137 +1139 3 387.3744 392.5602 20.72 0.2161 1138 +1140 3 388.2828 393.0464 20.3428 0.2161 1139 +1141 3 389.2334 393.6424 19.9416 0.2161 1140 +1142 3 390.1097 394.3254 20.3162 0.2542 1141 +1143 3 391.1325 394.7246 20.8312 0.2796 1142 +1144 3 392.0133 395.4064 20.9084 0.2924 1143 +1145 3 393.0761 395.7771 21.1176 0.2542 1144 +1146 3 394.0405 395.9224 21.1081 0.1907 1145 +1147 3 395.1193 396.1523 21.3027 0.1525 1146 +1148 3 396.237 396.2816 20.8933 0.1525 1147 +1149 3 397.3421 396.1672 21.28 0.1907 1148 +1150 3 398.3351 396.0082 20.3633 0.2034 1149 +1151 3 399.4047 395.7176 20.417 0.1907 1150 +1152 3 400.1929 395.1456 19.6 0.1652 1151 +1153 3 401.3369 395.1376 19.6 0.1525 1152 +1154 3 402.4134 394.807 19.6 0.1525 1153 +1155 3 403.3389 394.8756 20.6735 0.1525 1154 +1156 3 404.3228 394.3334 20.503 0.178 1155 +1157 3 405.3009 393.7614 20.4666 0.2034 1156 +1158 3 406.2447 393.3678 19.9531 0.2161 1157 +1159 3 407.0055 393.1928 20.4142 0.1907 1158 +1160 3 407.5958 393.1528 18.769 0.1652 1159 +1161 3 408.543 392.7352 18.4736 0.1525 1160 +1162 3 409.6412 392.9514 18.2 0.1652 1161 +1163 3 410.7852 392.964 18.177 0.2034 1162 +1164 3 411.9006 393.075 17.7422 0.2415 1163 +1165 3 412.9199 393.2271 18.2246 0.2415 1164 +1166 3 413.6704 393.3507 18.3546 0.1907 1165 +1167 3 414.5936 393.3072 17.64 0.1652 1166 +1168 3 415.7319 393.2786 17.5336 0.1652 1167 +1169 3 416.8393 393.1928 17.801 0.2161 1168 +1170 3 417.7945 393.4216 19.0028 0.2415 1169 +1171 3 418.6651 393.3667 17.7052 0.2924 1170 +1172 3 419.7473 393.0784 17.9161 0.2924 1171 +1173 3 420.8284 393.0933 17.6568 0.2796 1172 +1174 3 421.7276 393.2431 18.4052 0.2288 1173 +1175 3 422.7091 393.29 17.4513 0.2034 1174 +1176 3 423.5614 392.9823 17.9018 0.1907 1175 +1177 3 424.6379 392.8496 17.92 0.2034 1176 +1178 3 425.2694 392.6643 16.6939 0.2288 1177 +1179 3 426.0942 392.1643 15.8841 0.2669 1178 +1180 3 426.1434 391.407 14.6555 0.2924 1179 +1181 3 426.9763 390.8533 14.9456 0.2924 1180 +1182 3 427.9349 390.4541 14.5032 0.2669 1181 +1183 3 428.8547 390.0651 15.4031 0.2161 1182 +1184 3 429.8992 389.9896 16.3702 0.1907 1183 +1185 3 430.8304 390.2184 17.36 0.1907 1184 +1186 3 341.2243 372.5573 28.089 0.1652 1082 +1187 3 340.34 372.4098 28.9332 0.2288 1186 +1188 3 328.2433 375.4802 28.4889 0.2161 1066 +1189 3 328.7753 374.6692 29.5291 0.178 1188 +1190 3 328.6712 374.3557 31.3818 0.1907 1189 +1191 3 329.1345 373.476 31.92 0.2034 1190 +1192 3 329.2707 372.4509 32.2176 0.2669 1191 +1193 3 330.0108 371.7371 33.1324 0.2796 1192 +1194 3 330.9455 371.1182 33.32 0.2924 1193 +1195 3 331.4031 370.537 33.7296 0.2415 1194 +1196 3 331.4305 369.4994 33.847 0.2415 1195 +1197 3 331.4099 368.3897 33.7924 0.2415 1196 +1198 3 330.926 367.4837 34.44 0.2542 1197 +1199 3 330.6743 366.4026 34.839 0.2161 1198 +1200 3 330.7167 365.3375 35.5491 0.1652 1199 +1201 3 330.5016 364.3262 36.2132 0.1398 1200 +1202 3 330.0657 363.7188 35.0115 0.1398 1201 +1203 3 329.5269 362.8585 36.0828 0.1652 1202 +1204 3 329.1013 362.3483 38.2687 0.1907 1203 +1205 3 328.3646 361.8083 38.3583 0.2415 1204 +1206 3 327.6473 361.1402 38.6028 0.2669 1205 +1207 3 326.7847 360.5899 38.5532 0.2669 1206 +1208 3 325.9656 360.2605 39.3156 0.2161 1207 +1209 3 325.3536 359.963 39.48 0.1907 1208 +1210 3 324.5963 359.2263 39.48 0.1652 1209 +1211 3 323.5953 358.7893 39.4834 0.1652 1210 +1212 3 323.5827 358.485 41.4355 0.1398 1211 +1213 3 322.9512 357.762 41.16 0.1398 1212 +1214 3 322.6538 357.1568 42.336 0.1652 1213 +1215 3 322.0326 356.6695 43.68 0.2034 1214 +1216 3 321.9216 355.538 43.6122 0.2288 1215 +1217 3 322.3792 354.9889 44.133 0.2034 1216 +1218 3 322.2225 354.6389 46.4366 0.1907 1217 +1219 3 321.5086 354.1778 47.4281 0.1652 1218 +1220 3 321.1094 353.4605 49.0557 0.1652 1219 +1221 3 320.7707 353.2672 51.4408 0.1398 1220 +1222 3 319.748 353.0384 51.8 0.1398 1221 +1223 3 325.5172 376.5453 29.1396 0.2161 1063 +1224 3 326.5674 376.2158 29.4557 0.2542 1223 +1225 3 327.5398 375.8166 29.12 0.2415 1224 +1226 3 324.1158 376.376 28.849 0.4576 1061 +1227 3 324.761 376.0294 27.6923 0.2796 1226 +1228 3 324.435 375.6713 26.054 0.2288 1227 +1229 3 325.0104 375.4608 24.0803 0.1907 1228 +1230 3 325.492 375.232 25.6948 0.2034 1229 +1231 3 326.0812 375.0879 27.1382 0.2288 1230 +1232 3 326.5308 374.7744 25.347 0.2542 1231 +1233 3 326.7893 374.5834 22.8903 0.2542 1232 +1234 3 326.8145 375.1222 20.6702 0.2288 1233 +1235 3 327.5203 375.3464 18.7687 0.1907 1234 +1236 3 328.5751 375.232 18.951 0.1907 1235 +1237 3 329.3954 374.7824 19.9116 0.2161 1236 +1238 3 329.9605 373.8935 19.88 0.2415 1237 +1239 3 330.8414 373.7448 18.6074 0.2288 1238 +1240 3 331.6456 374.1074 18.6435 0.2034 1239 +1241 3 332.3755 374.4667 18.6777 0.2034 1240 +1242 3 332.5677 374.1509 19.3404 0.2415 1241 +1243 3 333.3708 374.0914 20.4873 0.2796 1242 +1244 3 333.9862 373.4096 19.6 0.2924 1243 +1245 3 334.342 372.8365 21.0227 0.2415 1244 +1246 3 334.9724 372.6008 22.6467 0.1907 1245 +1247 3 336.1072 372.6008 22.96 0.178 1246 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb_470522102_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb_470522102_m.swc new file mode 100644 index 0000000..c270082 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Pvalb_470522102_m.swc @@ -0,0 +1,1966 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/MouseCellTypes/176847.04.02.01/176847.04.02.01_MDF.swc_sorted.swc +# id,type,x,y,z,r,pid +1 1 237.4944 233.8336 35.28 5.9212 -1 +2 3 232.5043 230.7745 35.28 0.2669 1 +3 3 231.4495 231.199 35.28 0.2796 2 +4 3 230.3513 231.5181 35.28 0.2796 3 +5 3 229.2084 231.5159 35.28 0.2542 4 +6 3 228.0793 231.3282 35.28 0.2542 5 +7 3 226.9616 231.0846 35.28 0.2669 6 +8 3 225.8176 231.0617 35.28 0.3305 7 +9 3 224.6816 230.9313 35.2803 0.4576 8 +10 3 223.2768 230.103 35.2825 0.4068 9 +11 3 222.4268 229.3377 35.2898 0.3813 10 +12 3 221.523 228.6364 35.3265 0.3051 11 +13 3 220.8629 227.775 35.6944 0.4322 12 +14 3 220.4488 226.75 35.6216 0.4322 13 +15 3 220.1548 225.6803 34.9891 0.4068 14 +16 3 219.823 224.6198 34.3207 0.3305 15 +17 3 219.6572 223.5159 33.8643 0.2542 16 +18 3 219.7075 222.4039 33.2562 0.2288 17 +19 3 219.9523 221.3102 33.0162 0.2669 18 +20 3 220.5003 220.3138 32.8628 0.3178 19 +21 3 220.9121 219.2648 32.3744 0.3432 20 +22 3 220.7828 218.1482 31.9312 0.3559 21 +23 3 220.2623 217.1312 31.9368 0.3686 22 +24 3 220.2383 215.9895 32.0306 0.4068 23 +25 3 220.7977 214.4005 32.426 0.2288 24 +26 3 220.7211 213.2908 31.92 0.2796 25 +27 3 220.53 212.1754 31.6366 0.3305 26 +28 3 220.3333 211.0783 31.2928 0.3178 27 +29 3 219.7956 210.0899 31.5381 0.2924 28 +30 3 219.2911 209.1106 31.6926 0.2796 29 +31 3 219.0497 208.0135 31.1898 0.3051 30 +32 3 218.7763 206.921 30.8129 0.3178 31 +33 3 218.464 205.8205 30.77 0.2924 32 +34 3 218.2889 204.7039 30.5665 0.2542 33 +35 3 218.2821 203.5714 30.5469 0.2669 34 +36 3 218.321 202.4342 30.8241 0.3051 35 +37 3 218.5555 201.3246 31.1539 0.3178 36 +38 3 218.6104 200.208 31.7103 0.2924 37 +39 3 218.2374 199.159 31.2561 0.2924 38 +40 3 217.7867 198.1259 30.7882 0.3178 39 +41 3 217.2685 197.1112 30.5396 0.3305 40 +42 3 216.8612 196.156 29.3952 0.3051 41 +43 3 216.5695 195.0589 29.6587 0.3305 42 +44 3 216.0856 194.0224 29.741 0.3686 43 +45 3 214.9896 193.582 29.5781 0.2034 44 +46 3 214.1545 192.8349 29.1992 0.2161 45 +47 3 213.5436 191.9152 28.5219 0.1907 46 +48 3 212.808 191.0903 27.9535 0.1652 47 +49 3 212.3847 190.2243 26.7529 0.1907 48 +50 3 212.3012 189.141 26.1708 0.2415 49 +51 3 211.8299 188.1388 25.5808 0.2924 50 +52 3 211.6045 187.1424 24.353 0.2924 51 +53 3 211.8516 186.0933 23.4917 0.2542 52 +54 3 211.7727 184.9791 24.0668 0.2415 53 +55 3 210.9628 184.2446 23.9061 0.2415 54 +56 3 210.218 183.5571 23.1552 0.2796 55 +57 3 209.8805 182.6064 21.8562 0.2924 56 +58 3 209.6472 181.5928 21.107 0.2924 57 +59 3 209.4355 180.4889 21.1991 0.2669 58 +60 3 209.0706 179.4593 20.4764 0.2161 59 +61 3 208.7606 178.3965 20.16 0.178 60 +62 3 208.232 177.5488 20.16 0.178 61 +63 3 207.3752 177.1427 19.32 0.2161 62 +64 3 206.9748 176.1005 18.9241 0.2669 63 +65 3 206.3364 175.1773 18.48 0.2796 64 +66 3 205.9452 174.1111 18.48 0.2924 65 +67 3 205.4041 173.1158 18.2104 0.2669 66 +68 3 204.9098 172.1583 17.3872 0.2542 67 +69 3 204.7657 171.0383 17.1268 0.2161 68 +70 3 204.2257 170.0808 16.8725 0.2288 69 +71 3 203.1778 169.6403 16.8 0.2542 70 +72 3 202.218 169.0477 16.5819 0.3051 71 +73 3 201.3737 168.3247 16.1622 0.3051 72 +74 3 201.344 167.2093 15.7676 0.2669 73 +75 3 200.6576 166.5664 14.84 0.2161 74 +76 3 215.9494 194.0602 30.8 0.178 44 +77 3 215.7618 193.6575 30.8 0.1907 76 +78 3 215.7584 192.5135 30.8 0.2161 77 +79 3 215.4381 191.4347 30.8 0.2288 78 +80 3 215.064 190.3547 30.8 0.2161 79 +81 3 214.8638 189.229 30.8 0.2034 80 +82 3 214.7288 188.0953 30.8 0.178 81 +83 3 214.7391 186.9513 30.8 0.1525 82 +84 3 215.0354 185.868 31.0607 0.1398 83 +85 3 215.2894 184.8304 32.0354 0.1398 84 +86 3 215.6955 183.8339 32.737 0.1652 85 +87 3 215.9929 182.7346 32.76 0.178 86 +88 3 216.2858 181.634 32.76 0.1907 87 +89 3 216.5066 180.5587 32.2216 0.1907 88 +90 3 216.8406 179.505 31.92 0.178 89 +91 3 216.9024 178.3633 31.92 0.178 90 +92 3 216.9024 177.2193 31.92 0.178 91 +93 3 216.8258 176.0833 31.9827 0.2161 92 +94 3 216.6072 174.9965 32.5234 0.2542 93 +95 3 216.5592 173.8891 32.9048 0.2924 94 +96 3 216.5592 172.7795 33.488 0.2796 95 +97 3 216.5592 171.6366 33.6 0.2542 96 +98 3 216.5592 170.4926 33.6 0.2161 97 +99 3 216.51 169.3566 33.7218 0.2034 98 +100 3 216.4448 168.2229 33.88 0.1907 99 +101 3 216.4448 167.0812 33.9674 0.2161 100 +102 3 216.4448 165.9555 34.4448 0.2415 101 +103 3 216.4448 164.8744 35.0708 0.2415 102 +104 3 216.4448 163.7991 35.84 0.1907 103 +105 3 216.4448 162.6551 35.84 0.1525 104 +106 3 216.4448 161.5111 35.84 0.1398 105 +107 3 216.454 160.3671 35.84 0.1652 106 +108 3 216.5992 159.2334 35.84 0.178 107 +109 3 216.6736 158.0962 35.8672 0.1907 108 +110 3 216.6736 156.9591 36.1334 0.178 109 +111 3 216.8086 155.838 36.4 0.1652 110 +112 3 216.9996 154.7123 36.4 0.1525 111 +113 3 217.2239 153.6037 36.7189 0.1525 112 +114 3 217.2456 152.6611 37.7877 0.1398 113 +115 3 217.3497 151.5262 37.8 0.1271 114 +116 3 217.9183 150.6305 37.8 0.1144 115 +117 3 217.9732 149.4968 37.9033 0.1144 116 +118 3 218.2924 148.4569 38.64 0.1144 117 +119 3 218.7889 147.441 38.64 0.1271 118 +120 3 218.8472 146.3016 38.7374 0.1398 119 +121 3 219.0428 145.2148 39.3775 0.1525 120 +122 3 219.4341 144.176 39.6724 0.1398 121 +123 3 220.0427 143.2139 39.76 0.1271 122 +124 3 220.8538 142.4635 39.76 0.1144 123 +125 3 221.5081 141.6592 40.04 0.1144 124 +126 3 221.8182 140.569 40.04 0.1144 125 +127 3 222.2254 139.552 40.2016 0.1144 126 +128 3 222.4325 138.4595 40.6 0.1144 127 +129 3 222.7368 137.4161 40.6 0.1144 128 +130 3 222.7665 136.2744 40.6428 0.1144 129 +131 3 222.8706 135.1945 41.4442 0.1144 130 +132 3 223.0731 134.1271 42.0 0.1144 131 +133 3 223.2367 133.038 42.1842 0.1144 132 +134 3 223.4678 131.941 42.28 0.1144 133 +135 3 223.8808 130.9319 42.3525 0.1144 134 +136 3 224.3487 130.0717 43.12 0.1144 135 +137 3 224.8887 129.0787 43.2149 0.1144 136 +138 3 225.5041 128.239 44.3254 0.1144 137 +139 3 226.3141 127.6304 44.8 0.1144 138 +140 3 226.4376 126.5104 44.8 0.1144 139 +141 3 226.9021 125.6455 44.0115 0.1144 140 +142 3 227.3597 124.7383 43.4 0.1144 141 +143 3 227.7658 123.6893 43.4 0.1144 142 +144 3 227.8848 122.5682 43.12 0.1144 143 +145 3 228.3504 121.7079 42.5508 0.1144 144 +146 3 228.4911 120.6268 42.28 0.1144 145 +147 3 228.7931 119.5263 42.28 0.1144 146 +148 3 229.4441 118.722 42.9234 0.1144 147 +149 3 229.5711 117.6238 43.1978 0.1144 148 +150 3 229.7152 116.5324 43.68 0.1144 149 +151 3 229.706 115.4056 43.2849 0.1144 150 +152 3 229.4898 114.2952 43.12 0.1144 151 +153 3 229.4864 113.1517 43.12 0.1144 152 +154 3 229.4864 112.071 42.4463 0.1271 153 +155 3 229.4864 110.9306 42.28 0.1398 154 +156 3 229.4864 109.7952 42.1574 0.1652 155 +157 3 229.3434 108.8181 40.8668 0.1652 156 +158 3 229.1993 107.8714 39.4064 0.1652 157 +159 3 229.1432 106.7387 39.2 0.1525 158 +160 3 229.1398 105.5947 39.2 0.1525 159 +161 3 229.0288 104.4855 38.787 0.178 160 +162 3 229.0288 103.3659 38.36 0.2161 161 +163 3 228.8206 102.2481 38.36 0.2542 162 +164 3 228.6993 101.1362 38.0685 0.2415 163 +165 3 228.9144 100.2135 36.533 0.1907 164 +166 3 228.959 99.2882 35.0347 0.1398 165 +167 3 229.6809 98.7205 33.88 0.1144 166 +168 3 230.2872 97.835 33.88 0.1144 167 +169 3 230.81 96.8919 33.88 0.1144 168 +170 3 231.7824 96.2999 33.88 0.1144 169 +171 3 232.6416 95.581 33.88 0.1144 170 +172 3 233.0946 94.7028 33.88 0.1144 171 +173 3 233.7489 93.8609 33.88 0.1144 172 +174 3 234.52 93.3316 33.88 0.1271 173 +175 3 234.7545 92.236 33.88 0.1398 174 +176 3 235.5439 91.411 33.88 0.1525 175 +177 3 236.4648 90.971 34.384 0.1398 176 +178 3 236.5872 89.8573 34.44 0.1271 177 +179 3 237.4017 89.2013 33.8918 0.1144 178 +180 3 238.4348 89.1176 32.9459 0.1144 179 +181 3 239.1406 88.8369 31.351 0.1144 180 +182 3 239.5536 87.9258 30.2865 0.1144 181 +183 3 240.3361 87.2805 30.0434 0.1144 182 +184 3 241.0671 86.6914 29.12 0.1144 183 +185 3 241.8816 86.0381 28.84 0.1144 184 +186 3 243.005 85.8469 28.84 0.1144 185 +187 3 244.0644 85.4372 28.84 0.1144 186 +188 3 244.3332 84.347 28.8691 0.1144 187 +189 3 244.7531 83.4076 29.3272 0.1271 188 +190 3 245.8456 83.1688 29.4 0.1652 189 +191 3 218.8655 216.0352 29.6892 0.2288 24 +192 3 217.9709 215.4472 29.1472 0.2924 191 +193 3 217.3886 214.532 28.2688 0.3305 192 +194 3 216.7743 213.6306 27.501 0.3305 193 +195 3 216.0398 212.7897 26.9248 0.3178 194 +196 3 215.3271 211.934 26.3796 0.2924 195 +197 3 214.5435 211.1252 26.2102 0.3051 196 +198 3 213.5974 210.5166 25.7942 0.3178 197 +199 3 212.6971 209.8954 25.0183 0.3305 198 +200 3 211.8745 209.1552 24.3177 0.2924 199 +201 3 211.0348 208.4048 23.8599 0.2542 200 +202 3 210.115 207.8911 23.098 0.2288 201 +203 3 209.0717 207.7767 22.1598 0.2161 202 +204 3 207.9472 207.787 21.7213 0.1907 203 +205 3 206.9393 207.5765 20.9392 0.1652 204 +206 3 206.7494 208.2595 18.9126 0.1652 205 +207 3 205.7415 208.4505 18.3109 0.1652 206 +208 3 219.9901 228.7828 36.1637 0.178 12 +209 3 218.9582 228.649 35.8758 0.2288 208 +210 3 217.9652 228.6398 34.5369 0.2669 209 +211 3 216.8967 228.7188 33.6361 0.2924 210 +212 3 215.819 228.4968 33.8341 0.3305 211 +213 3 214.7391 228.1616 34.1113 0.3305 212 +214 3 213.666 227.823 33.7378 0.3178 213 +215 3 212.6181 227.5141 33.0005 0.2796 214 +216 3 211.5485 227.6537 32.3075 0.2669 215 +217 3 210.4674 227.7372 32.9966 0.2924 216 +218 3 209.3612 227.4672 33.04 0.3051 217 +219 3 208.2183 227.4226 33.04 0.3178 218 +220 3 207.0743 227.4055 33.04 0.3051 219 +221 3 205.9475 227.2384 33.0397 0.2924 220 +222 3 204.8321 226.9822 33.0383 0.2796 221 +223 3 203.7018 226.8243 33.0285 0.2669 222 +224 3 202.6321 226.4182 32.982 0.2542 223 +225 3 201.5522 226.0441 32.9017 0.2288 224 +226 3 200.5135 225.8199 33.9307 0.2034 225 +227 3 199.4587 225.9629 32.9574 0.2161 226 +228 3 198.436 225.7409 31.9197 0.2796 227 +229 3 197.3 225.6117 31.9183 0.3559 228 +230 3 196.1605 225.5018 31.9099 0.4195 229 +231 3 195.0646 225.2021 31.8469 0.4195 230 +232 3 193.9915 224.8509 31.4586 0.394 231 +233 3 192.8887 224.6484 30.9543 0.3305 232 +234 3 191.787 224.3727 30.8157 0.2796 233 +235 3 190.6979 224.0249 30.896 0.2288 234 +236 3 189.6088 223.7229 31.2715 0.2161 235 +237 3 188.5095 223.4884 31.4448 0.2161 236 +238 3 187.3975 223.6303 31.2682 0.2161 237 +239 3 186.321 223.7664 32.1437 0.1907 238 +240 3 185.2445 223.7653 31.1996 0.1907 239 +241 3 184.1497 223.7584 30.3957 0.2161 240 +242 3 183.0091 223.7069 30.3064 0.2542 241 +243 3 181.8949 223.509 30.2042 0.2542 242 +244 3 180.8618 223.6898 29.3157 0.2415 243 +245 3 179.9295 224.2503 30.1753 0.2161 244 +246 3 178.845 224.2503 29.8222 0.2034 245 +247 3 177.7135 224.184 29.4879 0.1907 246 +248 3 176.6233 223.9849 28.8907 0.2161 247 +249 3 175.5102 223.8064 28.5891 0.2415 248 +250 3 174.3685 223.7607 28.5614 0.2669 249 +251 3 173.2245 223.7309 28.5698 0.2415 250 +252 3 172.1022 223.5353 28.6236 0.2034 251 +253 3 170.98 223.342 28.8436 0.1652 252 +254 3 169.8485 223.2539 28.6614 0.1652 253 +255 3 168.7514 222.9702 28.5998 0.178 254 +256 3 167.8706 222.6418 27.5915 0.1907 255 +257 3 166.9302 222.0996 27.44 0.178 256 +258 3 165.9555 221.5196 27.3546 0.1652 257 +259 3 164.9293 221.0997 26.88 0.1652 258 +260 3 163.9455 220.5987 26.6 0.1907 259 +261 3 162.925 220.1148 26.6 0.2161 260 +262 3 161.8554 219.751 26.4146 0.2034 261 +263 3 160.8761 219.1687 26.32 0.178 262 +264 3 159.7756 218.9078 26.2284 0.1525 263 +265 3 158.7414 218.6218 25.529 0.1652 264 +266 3 157.6409 218.3759 25.2 0.1652 265 +267 3 156.5129 218.2752 24.943 0.1652 266 +268 3 155.3769 218.2752 24.6954 0.1525 267 +269 3 154.2444 218.2706 24.36 0.1525 268 +270 3 153.1095 218.1528 24.36 0.1525 269 +271 3 152.0262 218.0132 23.5824 0.1525 270 +272 3 150.9199 217.8176 23.3666 0.1525 271 +273 3 149.7988 217.8176 22.8351 0.1525 272 +274 3 148.6582 217.8176 22.68 0.1398 273 +275 3 147.5302 217.9663 22.5543 0.1271 274 +276 3 146.4286 218.1608 22.12 0.1144 275 +277 3 145.2846 218.1608 22.12 0.1144 276 +278 3 144.1417 218.1802 22.12 0.1144 277 +279 3 143.0206 218.4045 22.12 0.1144 278 +280 3 141.9544 218.7969 22.12 0.1144 279 +281 3 140.8161 218.8472 22.12 0.1271 280 +282 3 139.6767 218.9147 22.12 0.1398 281 +283 3 138.5418 218.9616 22.0276 0.1525 282 +284 3 137.455 218.8472 21.2582 0.1398 283 +285 3 136.327 218.8472 20.7978 0.1271 284 +286 3 135.1945 218.7328 20.72 0.1144 285 +287 3 134.0699 218.6195 20.4736 0.1144 286 +288 3 132.9305 218.6687 20.44 0.1144 287 +289 3 131.8014 218.8472 20.44 0.1144 288 +290 3 130.6574 218.8472 20.44 0.1271 289 +291 3 129.5145 218.8346 20.44 0.1398 290 +292 3 128.4975 218.4296 19.88 0.1525 291 +293 3 127.365 218.3896 19.7089 0.1398 292 +294 3 126.285 218.0819 19.6 0.1271 293 +295 3 125.1948 217.8062 19.5782 0.1144 294 +296 3 124.1103 217.487 19.32 0.1144 295 +297 3 122.9869 217.2753 19.32 0.1144 296 +298 3 121.8909 217.0168 19.1425 0.1144 297 +299 3 120.7526 216.9367 19.04 0.1144 298 +300 3 119.6269 216.788 19.04 0.1271 299 +301 3 118.5184 216.9024 19.04 0.1652 300 +302 3 224.1199 231.1955 36.0307 0.2034 9 +303 3 223.271 231.8064 37.0908 0.2161 302 +304 3 222.4096 232.518 37.329 0.2288 303 +305 3 221.5814 233.265 36.7937 0.2288 304 +306 3 220.7645 234.0441 36.5649 0.2415 305 +307 3 219.8962 234.7534 37.0205 0.2796 306 +308 3 219.0726 235.497 37.6709 0.3305 307 +309 3 218.4182 236.3882 38.3275 0.3432 308 +310 3 217.8714 237.3789 38.61 0.3305 309 +311 3 217.3062 238.373 38.64 0.2924 310 +312 3 216.6564 239.3134 38.6403 0.2796 311 +313 3 216.0822 240.2983 38.6408 0.2669 312 +314 3 215.5445 241.3085 38.645 0.2796 313 +315 3 214.8981 242.2489 38.6641 0.3178 314 +316 3 214.2312 243.1778 38.7545 0.3559 315 +317 3 213.682 244.1525 39.2815 0.3686 316 +318 3 213.0792 245.0894 39.902 0.3305 317 +319 3 212.5895 246.0744 40.6006 0.2924 318 +320 3 211.9935 247.0376 40.6193 0.2796 319 +321 3 211.2842 247.8785 39.8541 0.3051 320 +322 3 210.5829 248.7056 39.0071 0.3305 321 +323 3 209.7902 249.4995 39.5382 0.3432 322 +324 3 209.018 250.2786 40.3292 0.3432 323 +325 3 208.2812 251.1263 40.8374 0.3432 324 +326 3 207.4724 251.9351 40.8736 0.3432 325 +327 3 206.6281 252.705 40.8514 0.3178 326 +328 3 205.7038 253.3743 40.7123 0.2796 327 +329 3 204.8629 254.0961 40.0336 0.2288 328 +330 3 204.0747 254.8066 39.1622 0.2288 329 +331 3 203.2327 255.5364 39.6494 0.2288 330 +332 3 202.6813 256.5374 39.7046 0.2288 331 +333 3 202.1928 257.5636 39.4624 0.2034 332 +334 3 201.5751 258.4628 39.2529 0.2288 333 +335 3 200.6427 259.1011 39.6486 0.2796 334 +336 3 199.7401 259.7898 39.7603 0.3051 335 +337 3 199.0251 260.6753 39.7614 0.2669 336 +338 3 198.4348 261.6545 39.767 0.2288 337 +339 3 197.7679 262.58 39.7911 0.2161 338 +340 3 197.0448 263.4575 39.9608 0.2161 339 +341 3 196.3424 264.3418 40.3609 0.2161 340 +342 3 195.505 265.0785 40.3273 0.2542 341 +343 3 194.6276 265.7684 39.8247 0.3178 342 +344 3 193.8565 266.6103 39.76 0.3559 343 +345 3 193.1381 267.5004 39.76 0.3305 344 +346 3 192.3133 268.2806 39.76 0.2796 345 +347 3 191.3329 268.8594 39.7603 0.2542 346 +348 3 190.4188 269.5264 39.7608 0.2415 347 +349 3 189.6443 270.365 39.7636 0.2542 348 +350 3 188.7554 271.0159 40.1682 0.2161 349 +351 3 187.7064 271.4506 40.32 0.1907 350 +352 3 186.6024 271.7252 40.32 0.1398 351 +353 3 185.5957 272.2617 40.3365 0.1398 352 +354 3 184.6931 272.9527 40.6 0.1398 353 +355 3 183.8557 273.7192 40.6 0.1652 354 +356 3 183.2242 274.5875 41.1188 0.1652 355 +357 3 182.9736 275.6708 41.44 0.1652 356 +358 3 182.3181 276.5803 41.44 0.1398 357 +359 3 181.2199 276.8137 41.5184 0.1271 358 +360 3 180.7406 277.7071 41.72 0.1271 359 +361 3 180.2269 278.6978 42.2223 0.1525 360 +362 3 179.5394 279.5902 42.5401 0.178 361 +363 3 178.5784 280.1656 42.84 0.1907 362 +364 3 177.4824 280.4184 43.1147 0.178 363 +365 3 176.6347 281.0774 43.12 0.1652 364 +366 3 175.866 281.9205 43.12 0.1652 365 +367 3 175.0114 282.6549 43.2135 0.178 366 +368 3 174.1694 283.3711 43.68 0.1907 367 +369 3 173.0506 283.5907 43.68 0.1652 368 +370 3 172.0748 284.1433 43.68 0.1398 369 +371 3 171.2419 284.9143 43.68 0.1144 370 +372 3 170.5933 285.6957 43.96 0.1144 371 +373 3 169.8565 286.5674 43.96 0.1144 372 +374 3 168.9368 287.2138 43.9863 0.1144 373 +375 3 167.9701 287.7572 44.52 0.1144 374 +376 3 167.2013 288.5957 44.52 0.1144 375 +377 3 166.4932 289.4686 44.52 0.1144 376 +378 3 165.4956 290.0143 44.52 0.1144 377 +379 3 164.72 290.822 44.8935 0.1144 378 +380 3 164.0622 291.5072 45.92 0.1144 379 +381 3 163.6835 292.5586 45.92 0.1144 380 +382 3 162.7798 293.245 45.92 0.1144 381 +383 3 161.9252 294.0 45.92 0.1144 382 +384 3 160.9528 294.5892 45.92 0.1144 383 +385 3 160.0605 295.2847 45.92 0.1144 384 +386 3 159.4873 296.2697 45.92 0.1144 385 +387 3 158.9817 297.2947 45.92 0.1144 386 +388 3 158.3834 298.2683 45.92 0.1144 387 +389 3 157.5906 299.0176 45.92 0.1144 388 +390 3 156.8127 299.8493 45.9413 0.1144 389 +391 3 156.148 300.7404 46.48 0.1271 390 +392 3 155.4479 301.6259 46.76 0.1525 391 +393 3 154.5956 302.3855 46.76 0.178 392 +394 3 153.6495 303.009 47.0246 0.178 393 +395 3 152.7263 303.684 47.04 0.1525 394 +396 3 151.7173 304.1965 46.8524 0.1271 395 +397 3 150.7586 304.8016 46.76 0.1144 396 +398 3 149.856 305.4892 46.6203 0.1144 397 +399 3 148.8939 306.0966 46.48 0.1144 398 +400 3 148.0668 306.8448 46.48 0.1144 399 +401 3 147.1195 307.474 46.48 0.1144 400 +402 3 146.3611 308.3149 46.48 0.1271 401 +403 3 145.6564 309.1832 46.6612 0.1398 402 +404 3 144.6577 309.452 47.6 0.1525 403 +405 3 143.6807 309.9702 47.6 0.1398 404 +406 3 142.8055 310.6589 47.836 0.1271 405 +407 3 142.1878 311.3774 48.72 0.1144 406 +408 3 141.2394 311.8109 48.72 0.1144 407 +409 3 140.1675 312.1633 48.72 0.1144 408 +410 3 139.1081 312.59 48.72 0.1144 409 +411 3 138.0385 312.9824 48.6329 0.1144 410 +412 3 137.0432 313.4766 48.44 0.1144 411 +413 3 135.9941 313.9182 48.44 0.1144 412 +414 3 135.0755 314.5863 48.6951 0.1144 413 +415 3 134.0596 315.1091 48.72 0.1144 414 +416 3 133.0609 315.6651 48.72 0.1144 415 +417 3 132.1148 316.2885 48.4448 0.1398 416 +418 3 131.266 317.0299 48.6114 0.1652 417 +419 3 130.2089 317.4486 48.72 0.1907 418 +420 3 129.1759 317.8112 49.275 0.1652 419 +421 3 128.2859 318.4988 49.28 0.1398 420 +422 3 127.6715 319.4517 49.0244 0.1144 421 +423 3 126.7872 320.1495 49.0 0.1144 422 +424 3 125.7828 320.5488 49.0 0.1144 423 +425 3 124.6731 320.757 49.0596 0.1144 424 +426 3 123.6927 321.3347 49.28 0.1144 425 +427 3 122.7764 321.988 49.6667 0.1144 426 +428 3 121.7765 322.5005 49.84 0.1144 427 +429 3 121.097 323.299 49.84 0.1144 428 +430 3 120.5696 324.3057 49.9288 0.1144 429 +431 3 119.834 325.1511 50.4 0.1144 430 +432 3 119.0607 325.9531 50.9158 0.1144 431 +433 3 118.3457 326.8271 51.24 0.1144 432 +434 3 117.5174 327.6096 51.24 0.1271 433 +435 3 116.7475 328.4207 51.7913 0.1398 434 +436 3 115.925 329.146 52.2684 0.1525 435 +437 3 115.1642 329.7855 53.5248 0.1398 436 +438 3 114.3723 330.5176 53.2927 0.1271 437 +439 3 113.7229 331.4568 53.2 0.1144 438 +440 3 112.7701 332.0609 53.2 0.1144 439 +441 3 111.718 332.4944 53.2 0.1144 440 +442 3 110.7486 333.063 53.2 0.1144 441 +443 3 109.967 333.8913 53.2 0.1144 442 +444 3 109.1294 334.6669 53.2 0.1398 443 +445 3 108.5156 335.5009 53.683 0.1907 444 +446 3 107.7837 336.3738 53.76 0.2415 445 +447 3 107.2058 337.3015 53.76 0.2415 446 +448 3 106.2723 337.9582 53.8331 0.1907 447 +449 3 105.5559 338.8356 54.04 0.1398 448 +450 3 104.908 339.7772 54.04 0.1144 449 +451 3 104.1519 340.634 54.04 0.1144 450 +452 3 103.1077 341.0859 54.04 0.1144 451 +453 3 102.0581 341.5343 54.0862 0.1144 452 +454 3 101.8118 342.5491 54.32 0.1144 453 +455 3 101.6026 343.3865 54.8733 0.1144 454 +456 3 101.1508 343.1931 57.4014 0.1144 455 +457 3 100.4262 343.2755 58.8 0.1144 456 +458 3 99.3275 343.4105 58.8 0.1144 457 +459 3 98.8076 344.2285 59.2567 0.1144 458 +460 3 97.6953 344.4092 59.36 0.1144 459 +461 3 96.6997 344.9698 59.36 0.1144 460 +462 3 95.6858 345.4846 59.6268 0.1144 461 +463 3 94.7804 345.9696 60.5268 0.1144 462 +464 3 94.1035 346.8173 61.0176 0.1144 463 +465 3 93.3807 347.6788 61.04 0.1144 464 +466 3 92.7652 348.6168 61.2567 0.1144 465 +467 3 92.1127 349.5309 61.6 0.1144 466 +468 3 91.2521 350.2402 61.6 0.1144 467 +469 3 90.4192 351.0044 61.6 0.1144 468 +470 3 89.5734 351.7651 61.6 0.1144 469 +471 3 88.7967 352.5819 61.6 0.1144 470 +472 3 87.992 353.3667 61.6123 0.1144 471 +473 3 87.0861 353.965 62.16 0.1144 472 +474 3 86.2486 354.5828 62.7312 0.1144 473 +475 3 85.446 355.0312 63.84 0.1144 474 +476 3 84.7198 355.8847 63.84 0.1144 475 +477 3 84.2332 356.9074 63.973 0.1144 476 +478 3 83.7408 357.8432 64.68 0.1398 477 +479 3 82.8438 358.2722 64.68 0.1144 478 +480 3 81.9626 358.9506 64.4 0.1144 479 +481 3 81.2031 359.7846 64.4 0.1144 480 +482 3 80.4524 360.6346 64.4 0.1144 481 +483 3 79.7633 361.52 64.4 0.1144 482 +484 3 79.0041 362.2133 64.4 0.1144 483 +485 3 78.1748 362.9718 64.5162 0.1144 484 +486 3 77.7279 363.9899 64.68 0.1144 485 +487 3 76.9223 364.7164 64.68 0.1144 486 +488 3 75.9201 365.2552 64.6638 0.1144 487 +489 3 75.0315 365.9061 64.12 0.1144 488 +490 3 74.6171 366.7836 63.2976 0.1144 489 +491 3 74.0669 367.7045 62.9244 0.1144 490 +492 3 73.9024 368.7364 62.16 0.1144 491 +493 3 73.9024 369.8804 62.16 0.1144 492 +494 3 73.9024 371.0244 62.16 0.1144 493 +495 3 73.9024 372.1684 62.16 0.1144 494 +496 3 73.9024 373.3124 62.16 0.1144 495 +497 3 73.9024 374.4564 62.16 0.1144 496 +498 3 73.9024 375.5992 62.2776 0.1144 497 +499 3 73.5174 376.5396 62.7542 0.1271 498 +500 3 73.1628 377.5841 63.0 0.1398 499 +501 3 72.6368 378.5553 63.0 0.1652 500 +502 3 71.9363 379.3618 63.0 0.1652 501 +503 3 71.2712 380.1718 62.72 0.1652 502 +504 3 70.8321 381.0252 62.72 0.1398 503 +505 3 69.8133 381.5148 62.72 0.1271 504 +506 3 68.8119 381.8489 62.72 0.1144 505 +507 3 68.3347 382.8213 62.3829 0.1398 506 +508 3 67.8392 383.812 61.88 0.1652 507 +509 3 83.5032 357.0699 66.7646 0.178 478 +510 3 83.0829 356.0769 67.6987 0.1398 509 +511 3 82.6625 355.0839 68.6328 0.1144 510 +512 3 82.2813 354.0623 69.4529 0.1144 511 +513 3 81.9674 352.9926 70.077 0.1144 512 +514 3 81.6533 351.9219 70.7011 0.1144 513 +515 3 81.3393 350.8522 71.3252 0.1271 514 +516 3 81.0253 349.7826 71.9494 0.1398 515 +517 3 80.5544 349.0001 73.211 0.1525 516 +518 3 79.8958 348.5642 75.236 0.1398 517 +519 3 79.1332 348.1878 77.0781 0.1398 518 +520 3 78.2696 347.8721 78.7427 0.1398 519 +521 3 77.406 347.5552 80.4076 0.1525 520 +522 3 76.5425 347.2383 82.0725 0.1398 521 +523 3 75.7549 346.9775 83.9941 0.1271 522 +524 3 74.9835 346.7304 85.9709 0.1144 523 +525 3 74.2122 346.4821 87.9474 0.1144 524 +526 3 73.4408 346.2339 89.9242 0.1144 525 +527 3 72.4419 345.9227 90.9412 0.1144 526 +528 3 71.3976 345.6001 91.7672 0.1144 527 +529 3 70.3534 345.2764 92.5932 0.1144 528 +530 3 69.3092 344.9538 93.4192 0.1144 529 +531 3 68.265 344.63 94.2455 0.1144 530 +532 3 67.2208 344.3074 95.0715 0.1144 531 +533 3 240.6827 238.4599 38.6478 0.2796 1 +534 3 241.4549 238.6247 40.6739 0.2415 533 +535 3 242.3736 238.4977 43.2348 0.2161 534 +536 3 242.7145 238.993 45.3995 0.2034 535 +537 3 242.528 239.8968 46.7916 0.2669 536 +538 3 242.2191 240.6187 48.3557 0.3051 537 +539 3 242.4628 241.718 48.8544 0.3178 538 +540 3 243.1698 241.964 49.3766 0.3305 539 +541 3 244.2715 242.0384 49.9397 0.3559 540 +542 3 245.3903 241.8519 49.8896 0.3305 541 +543 3 246.5045 241.5956 49.84 0.3178 542 +544 3 247.6039 241.2788 49.8408 0.2796 543 +545 3 248.6987 240.947 49.845 0.3051 544 +546 3 249.781 240.6987 50.4 0.3051 545 +547 3 250.8849 240.8623 50.6097 0.2924 546 +548 3 251.8436 241.3829 51.249 0.2796 547 +549 3 252.8823 241.7627 51.52 0.2796 548 +550 3 253.7586 242.4022 51.8885 0.3051 549 +551 3 254.3615 242.9353 52.92 0.2542 550 +552 3 255.0365 242.9856 52.92 0.2161 551 +553 3 256.1782 243.0439 52.92 0.2288 552 +554 3 257.3165 243.1 53.0754 0.2669 553 +555 3 258.4353 243.1 53.6396 0.2669 554 +556 3 259.5747 243.1 53.7608 0.2924 555 +557 3 260.5654 243.5954 54.04 0.3051 556 +558 3 260.6627 243.839 54.04 0.1525 557 +559 3 261.2255 244.7828 54.04 0.178 558 +560 3 262.0996 245.4795 54.04 0.2161 559 +561 3 262.8786 246.3009 54.04 0.2669 560 +562 3 263.8224 246.9061 54.04 0.2669 561 +563 3 264.844 247.4129 54.04 0.2415 562 +564 3 265.7775 248.0592 54.04 0.2034 563 +565 3 266.8151 248.4768 54.04 0.178 564 +566 3 267.9145 248.7514 54.1671 0.178 565 +567 3 269.0059 249.0808 54.32 0.178 566 +568 3 270.024 249.5808 54.32 0.1907 567 +569 3 271.0308 250.0452 54.7688 0.2034 568 +570 3 272.0318 250.4651 55.4022 0.2161 569 +571 3 272.9492 251.132 55.6083 0.2288 570 +572 3 273.9079 251.6445 56.2598 0.2034 571 +573 3 274.512 252.1399 58.0854 0.1652 572 +574 3 275.1412 252.6581 59.691 0.1271 573 +575 3 275.8825 253.491 59.92 0.1144 574 +576 3 276.4465 254.4325 60.0603 0.1144 575 +577 3 276.5917 255.4644 60.7684 0.1144 576 +578 3 276.6192 256.5706 61.2942 0.1144 577 +579 3 276.7336 257.4069 62.7645 0.1144 578 +580 3 276.6787 258.5326 63.0 0.1144 579 +581 3 276.6192 259.672 63.0 0.1144 580 +582 3 276.3561 260.5746 64.0808 0.1144 581 +583 3 276.1616 261.4566 65.6936 0.1144 582 +584 3 275.8035 262.389 66.4457 0.1144 583 +585 3 275.4649 263.4106 67.3935 0.1144 584 +586 3 275.1263 264.4322 68.3413 0.1144 585 +587 3 274.8082 265.4629 69.2227 0.1271 586 +588 3 274.7751 266.6058 69.2227 0.1398 587 +589 3 274.7682 267.6628 69.7432 0.1525 588 +590 3 274.8357 268.4785 71.6993 0.1398 589 +591 3 275.4901 269.1569 72.8255 0.1271 590 +592 3 276.4007 269.7758 73.593 0.1144 591 +593 3 277.3102 270.3936 74.3607 0.1144 592 +594 3 278.2197 271.0125 75.1282 0.1144 593 +595 3 279.1291 271.6314 75.896 0.1144 594 +596 3 280.0901 272.1965 76.4898 0.1144 595 +597 3 281.0888 272.7216 76.9479 0.1144 596 +598 3 282.0887 273.2455 77.406 0.1144 597 +599 3 283.0874 273.7695 77.8641 0.1144 598 +600 3 284.0872 274.2946 78.3224 0.1144 599 +601 3 285.0859 274.8185 78.7805 0.1144 600 +602 3 286.0858 275.3425 79.2386 0.1144 601 +603 3 287.0857 275.8676 79.6967 0.1144 602 +604 3 288.0844 276.3915 80.155 0.1144 603 +605 3 289.0842 276.9155 80.6131 0.1144 604 +606 3 289.988 277.5939 81.0566 0.1144 605 +607 3 290.8917 278.2711 81.5004 0.1144 606 +608 3 291.7955 278.9484 81.944 0.1144 607 +609 3 292.6993 279.6268 82.3878 0.1144 608 +610 3 293.611 280.2846 82.8509 0.1144 609 +611 3 294.6532 280.6392 83.6136 0.1144 610 +612 3 295.6954 280.9927 84.376 0.1144 611 +613 3 296.7376 281.3474 85.1388 0.1144 612 +614 3 297.7798 281.7008 85.9015 0.1144 613 +615 3 298.7613 282.2008 86.5225 0.1144 614 +616 3 299.6719 282.8666 86.9812 0.1144 615 +617 3 300.5826 283.5324 87.4401 0.1144 616 +618 3 301.4943 284.1982 87.8987 0.1144 617 +619 3 302.405 284.864 88.3574 0.1144 618 +620 3 303.3167 285.531 88.816 0.1144 619 +621 3 304.0477 286.3535 89.4768 0.1144 620 +622 3 304.7147 287.2332 90.2101 0.1144 621 +623 3 305.3816 288.113 90.9434 0.1144 622 +624 3 306.0486 288.9927 91.677 0.1144 623 +625 3 306.7156 289.8736 92.4106 0.1144 624 +626 3 307.41 290.7339 93.1157 0.1144 625 +627 3 308.1524 291.5621 93.7706 0.1144 626 +628 3 308.8949 292.3904 94.4255 0.1144 627 +629 3 309.6385 293.2175 95.0804 0.1144 628 +630 3 310.3809 294.0458 95.7354 0.1144 629 +631 3 311.1234 294.874 96.3903 0.1144 630 +632 3 311.867 295.7011 97.0452 0.1398 631 +633 3 312.6094 296.5294 97.7001 0.1652 632 +634 3 260.8698 243.1378 55.44 0.1525 557 +635 3 261.5012 242.2958 55.44 0.1525 634 +636 3 262.3123 241.5716 55.6696 0.1525 635 +637 3 263.2882 241.1792 56.3637 0.1525 636 +638 3 264.1885 240.5386 56.84 0.1398 637 +639 3 264.9641 239.7389 56.847 0.1271 638 +640 3 265.6562 238.858 57.2592 0.1144 639 +641 3 266.4696 238.1682 58.0983 0.1144 640 +642 3 267.4146 237.6019 58.52 0.1144 641 +643 3 268.5105 237.2782 58.52 0.1144 642 +644 3 269.261 236.4877 58.52 0.1271 643 +645 3 270.0195 235.7727 58.8512 0.1398 644 +646 3 270.9312 235.1778 59.5689 0.1652 645 +647 3 271.6336 234.3427 59.92 0.1652 646 +648 3 272.1965 233.4069 60.3764 0.1652 647 +649 3 272.4402 232.4654 61.754 0.1398 648 +650 3 273.0133 231.5891 62.44 0.1398 649 +651 3 273.7958 230.7848 62.44 0.1398 650 +652 3 274.4616 229.9932 62.6772 0.1525 651 +653 3 274.9032 229.2061 64.0926 0.1398 652 +654 3 275.0256 228.0873 64.3922 0.1271 653 +655 3 275.6399 227.219 65.24 0.1144 654 +656 3 276.3504 226.3976 65.814 0.1144 655 +657 3 276.8777 225.4229 66.3289 0.1144 656 +658 3 277.6637 224.6061 66.5552 0.1144 657 +659 3 278.429 223.7996 66.64 0.1144 658 +660 3 279.1063 222.8855 66.64 0.1144 659 +661 3 279.8762 222.0859 67.1698 0.1144 660 +662 3 280.7147 221.3823 67.7331 0.1144 661 +663 3 281.3096 220.5941 68.32 0.1144 662 +664 3 281.9811 219.8574 68.8576 0.1144 663 +665 3 282.7785 219.0611 69.16 0.1144 664 +666 3 283.3391 218.0979 69.44 0.1144 665 +667 3 284.1467 217.3852 69.44 0.1144 666 +668 3 284.7164 216.4059 69.44 0.1144 667 +669 3 285.1534 215.4358 69.6578 0.1144 668 +670 3 285.4852 214.3719 70.2937 0.1144 669 +671 3 285.817 213.308 70.9296 0.1144 670 +672 3 286.1487 212.244 71.5652 0.1144 671 +673 3 286.4793 211.1813 72.2011 0.1144 672 +674 3 286.8111 210.1173 72.837 0.1271 673 +675 3 287.1429 209.0534 73.4726 0.1525 674 +676 3 287.4746 207.9895 74.1084 0.178 675 +677 3 287.8487 206.9336 74.6382 0.178 676 +678 3 288.2846 205.8868 75.0184 0.1525 677 +679 3 288.7193 204.8401 75.399 0.1271 678 +680 3 289.154 203.7933 75.7795 0.1144 679 +681 3 289.5899 202.7477 76.16 0.1144 680 +682 3 290.0246 201.7009 76.5402 0.1144 681 +683 3 290.4605 200.6542 76.9208 0.1144 682 +684 3 290.8952 199.6074 77.3013 0.1144 683 +685 3 291.331 198.5618 77.6815 0.1144 684 +686 3 291.8413 197.5631 77.985 0.1144 685 +687 3 292.6512 196.7543 77.985 0.1144 686 +688 3 293.253 195.8391 78.2849 0.1144 687 +689 3 293.579 194.7797 78.9852 0.1144 688 +690 3 293.905 193.7215 79.6852 0.1144 689 +691 3 294.2311 192.6633 80.3855 0.1144 690 +692 3 294.6063 191.5983 80.7699 0.1144 691 +693 3 295.0056 190.5298 81.0015 0.1144 692 +694 3 295.4048 189.4624 81.233 0.1144 693 +695 3 295.8041 188.3939 81.4646 0.1144 694 +696 3 296.2033 187.3266 81.6962 0.1144 695 +697 3 296.6026 186.2581 81.928 0.1144 696 +698 3 296.9618 185.3314 82.7375 0.1144 697 +699 3 297.3839 184.3259 83.587 0.1144 698 +700 3 297.8049 183.3214 84.4365 0.1144 699 +701 3 298.2271 182.3158 85.286 0.1144 700 +702 3 298.6492 181.3114 86.1356 0.1144 701 +703 3 299.1011 180.3116 86.9193 0.1144 702 +704 3 299.6308 179.3289 87.5336 0.1144 703 +705 3 300.1593 178.3462 88.1476 0.1144 704 +706 3 300.689 177.3635 88.762 0.1271 705 +707 3 301.2175 176.3808 89.376 0.1398 706 +708 3 254.8054 243.9683 52.92 0.1652 551 +709 3 255.3294 244.9842 52.92 0.178 708 +710 3 255.8064 245.9817 53.2 0.2034 709 +711 3 256.5283 246.81 53.2 0.2161 710 +712 3 256.7742 247.9174 53.2165 0.2415 711 +713 3 257.1312 248.9538 53.48 0.2669 712 +714 3 257.8473 249.8153 53.48 0.2924 713 +715 3 258.0864 250.9204 53.48 0.2924 714 +716 3 258.0864 252.0644 53.4951 0.2542 715 +717 3 258.107 253.1649 54.1083 0.2161 716 +718 3 258.2088 254.2654 54.6 0.178 717 +719 3 258.7248 255.2436 54.8688 0.1652 718 +720 3 258.9696 256.3338 54.88 0.1398 719 +721 3 259.4684 257.2822 55.16 0.1525 720 +722 3 259.8802 258.3175 55.3938 0.178 721 +723 3 260.5574 259.2098 55.5794 0.2161 722 +724 3 260.9498 260.2669 55.9868 0.2288 723 +725 3 261.5081 261.2541 56.1061 0.2161 724 +726 3 261.873 262.2998 56.546 0.2034 725 +727 3 262.2528 263.374 56.56 0.1652 726 +728 3 262.5823 264.4653 56.56 0.1652 727 +729 3 262.9919 265.5327 56.56 0.178 728 +730 3 263.2344 266.5966 57.0668 0.2288 729 +731 3 263.263 267.736 57.1318 0.2288 730 +732 3 263.5753 268.7656 57.4 0.2034 731 +733 3 263.7744 269.881 57.4 0.1525 732 +734 3 263.954 271.009 57.4 0.1271 733 +735 3 264.1496 272.1336 57.4 0.1144 734 +736 3 264.5408 273.1483 57.4 0.1271 735 +737 3 265.2616 274.0097 57.7466 0.1525 736 +738 3 266.0143 274.6652 58.8056 0.178 737 +739 3 266.5886 275.4924 59.4961 0.178 738 +740 3 266.8952 276.5345 60.039 0.1525 739 +741 3 266.8952 277.6294 60.5783 0.1271 740 +742 3 266.655 278.707 60.7841 0.1144 741 +743 3 266.1184 279.5833 61.32 0.1144 742 +744 3 266.0075 280.121 63.488 0.1144 743 +745 3 265.9514 280.5568 66.0733 0.1144 744 +746 3 265.6551 281.035 68.2111 0.1144 745 +747 3 264.7685 281.6185 69.2541 0.1144 746 +748 3 263.8808 282.2031 70.2968 0.1144 747 +749 3 263.4792 283.1389 71.2821 0.1144 748 +750 3 263.2218 284.181 72.2501 0.1144 749 +751 3 262.9656 285.2232 73.218 0.1144 750 +752 3 262.7082 286.2654 74.1863 0.1144 751 +753 3 262.6555 287.2996 75.3242 0.1144 752 +754 3 262.6933 288.3303 76.5363 0.1144 753 +755 3 262.7299 289.3611 77.7484 0.1144 754 +756 3 262.7665 290.3918 78.9603 0.1144 755 +757 3 263.4083 291.2098 79.2994 0.1144 756 +758 3 264.2743 291.8024 79.4774 0.1144 757 +759 3 265.0534 291.275 81.0698 0.1144 758 +760 3 265.8336 290.7476 82.6619 0.1144 759 +761 3 266.6126 290.2202 84.2542 0.1144 760 +762 3 267.3917 289.6928 85.8466 0.1144 761 +763 3 268.1708 289.1654 87.439 0.1144 762 +764 3 268.951 288.6381 89.031 0.1144 763 +765 3 269.7941 288.1747 90.4616 0.1144 764 +766 3 270.8466 287.9185 91.359 0.1144 765 +767 3 271.9002 287.6634 92.2564 0.1144 766 +768 3 272.9527 287.4071 93.1538 0.1144 767 +769 3 274.0063 287.152 94.0512 0.1144 768 +770 3 275.0588 286.8958 94.9488 0.1144 769 +771 3 276.1124 286.6406 95.8462 0.1144 770 +772 3 277.1649 286.3844 96.7436 0.1144 771 +773 3 278.2185 286.1293 97.641 0.1144 772 +774 3 279.271 285.873 98.5387 0.1144 773 +775 3 280.2297 286.1052 99.9306 0.1144 774 +776 3 281.1838 286.3592 101.3446 0.1144 775 +777 3 282.139 286.612 102.7586 0.1144 776 +778 3 283.0931 286.866 104.1723 0.1271 777 +779 3 284.0472 287.1188 105.5863 0.1398 778 +780 3 241.6746 240.6633 49.56 0.3051 539 +781 3 240.7376 240.0089 49.56 0.2415 780 +782 3 239.7286 239.4701 49.56 0.2288 781 +783 3 238.7436 238.905 49.56 0.2542 782 +784 3 237.9211 238.111 49.56 0.2924 783 +785 3 237.0871 237.3297 49.56 0.2796 784 +786 3 236.0701 236.8355 49.84 0.2542 785 +787 3 235.1435 236.1742 49.8778 0.2161 786 +788 3 234.5555 235.5542 51.24 0.2415 787 +789 3 233.6574 234.9936 51.5852 0.2542 788 +790 3 233.1175 234.0144 51.8 0.2796 789 +791 3 232.2274 233.3028 51.8686 0.2542 790 +792 3 231.398 232.5946 52.3494 0.2415 791 +793 3 231.088 231.6589 53.2 0.2288 792 +794 3 230.5229 230.834 53.2 0.2415 793 +795 3 229.61 230.1579 53.3341 0.2669 794 +796 3 228.7382 229.5447 54.1635 0.2924 795 +797 3 227.775 228.9888 54.588 0.2796 796 +798 3 226.7465 228.498 54.6 0.2542 797 +799 3 225.6895 228.0598 54.637 0.2415 798 +800 3 224.7274 227.4684 54.9755 0.2542 799 +801 3 223.7241 226.9547 55.3235 0.2542 800 +802 3 222.7002 226.496 55.72 0.2415 801 +803 3 221.6008 226.2317 55.72 0.2288 802 +804 3 220.4717 226.0567 55.72 0.2288 803 +805 3 219.4192 225.7112 56.28 0.2161 804 +806 3 218.4777 225.0866 56.56 0.2161 805 +807 3 217.5133 224.4814 56.56 0.2415 806 +808 3 216.4608 224.081 56.7403 0.3051 807 +809 3 215.6429 223.318 57.1637 0.3432 808 +810 3 214.6464 222.7929 57.4 0.3305 809 +811 3 213.5368 222.5286 57.4 0.2669 810 +812 3 212.8892 222.1488 59.08 0.2034 811 +813 3 212.1422 221.3045 59.08 0.1525 812 +814 3 211.3643 220.4831 59.08 0.1652 813 +815 3 210.599 219.8207 59.08 0.2161 814 +816 3 209.6929 219.2419 59.1007 0.2796 815 +817 3 208.9974 218.7374 60.1138 0.2796 816 +818 3 208.1062 218.3919 61.299 0.2288 817 +819 3 207.1063 217.9778 61.6 0.2034 818 +820 3 206.0939 217.4469 61.6 0.2034 819 +821 3 205.03 217.0809 61.6 0.2288 820 +822 3 204.0633 216.4723 61.6 0.2034 821 +823 3 203.0325 215.9872 61.6 0.1652 822 +824 3 201.9606 215.7115 61.6 0.1271 823 +825 3 201.0443 215.0388 61.6 0.1144 824 +826 3 200.0639 214.4554 61.6 0.1144 825 +827 3 199.0606 213.9452 61.6 0.1271 826 +828 3 198.1991 213.2405 61.6 0.1525 827 +829 3 197.3022 212.5815 61.8377 0.1907 828 +830 3 196.5564 211.7761 61.88 0.2034 829 +831 3 196.1468 210.7442 61.88 0.2034 830 +832 3 195.624 209.8611 61.88 0.178 831 +833 3 195.5817 208.7182 61.88 0.1652 832 +834 3 195.3666 207.6028 61.88 0.1398 833 +835 3 195.2808 206.7162 62.9541 0.1271 834 +836 3 195.2808 205.6111 63.5513 0.1144 835 +837 3 195.2808 204.4717 63.7003 0.1144 836 +838 3 195.2911 203.3426 64.12 0.1144 837 +839 3 195.5474 202.2306 64.12 0.1144 838 +840 3 195.6926 201.1038 64.12 0.1144 839 +841 3 195.9729 199.9964 64.12 0.1271 840 +842 3 196.2578 198.9176 64.12 0.1398 841 +843 3 196.5838 197.8342 64.12 0.1525 842 +844 3 196.6822 196.7028 64.3765 0.1398 843 +845 3 196.768 195.5668 64.4 0.1271 844 +846 3 197.0975 194.599 65.4251 0.1271 845 +847 3 197.1112 193.5168 66.08 0.1398 846 +848 3 197.0952 192.3762 66.1046 0.1525 847 +849 3 196.7783 191.3374 66.8682 0.1525 848 +850 3 196.307 190.5275 67.76 0.1525 849 +851 3 196.0942 189.4086 67.76 0.1525 850 +852 3 195.5657 188.4408 68.32 0.1398 851 +853 3 194.7294 187.7167 68.4536 0.1271 852 +854 3 194.4445 186.6848 69.1807 0.1144 853 +855 3 193.8233 185.7501 69.6508 0.1271 854 +856 3 193.439 184.6851 69.72 0.1398 855 +857 3 193.2239 183.6086 70.2388 0.1525 856 +858 3 193.1221 182.5275 70.56 0.1398 857 +859 3 192.4574 181.8045 70.9923 0.1271 858 +860 3 192.1531 180.7634 71.8796 0.1144 859 +861 3 191.8488 179.7213 72.7672 0.1144 860 +862 3 191.5445 178.6802 73.6548 0.1144 861 +863 3 191.2402 177.6392 74.5424 0.1144 862 +864 3 190.9347 176.597 75.43 0.1144 863 +865 3 190.6304 175.556 76.3174 0.1144 864 +866 3 190.3261 174.5149 77.205 0.1144 865 +867 3 189.8022 173.5402 77.5468 0.1144 866 +868 3 189.1398 172.6067 77.5468 0.1144 867 +869 3 188.4774 171.6744 77.5468 0.1144 868 +870 3 187.8151 170.742 77.5468 0.1144 869 +871 3 186.9193 170.067 77.9691 0.1144 870 +872 3 185.9915 169.4264 78.4476 0.1144 871 +873 3 185.0637 168.7858 78.9261 0.1144 872 +874 3 184.1325 168.144 79.2994 0.1144 873 +875 3 183.1864 167.501 79.2994 0.1144 874 +876 3 182.2392 166.8581 79.2994 0.1144 875 +877 3 181.2931 166.2163 79.2994 0.1144 876 +878 3 180.347 165.5734 79.2994 0.1144 877 +879 3 179.4844 164.8344 79.4066 0.1144 878 +880 3 178.7054 164.0016 79.6208 0.1144 879 +881 3 177.9263 163.1687 79.835 0.1144 880 +882 3 177.1473 162.3359 80.0492 0.1144 881 +883 3 176.3682 161.5031 80.2634 0.1144 882 +884 3 175.588 160.6702 80.4776 0.1271 883 +885 3 174.8089 159.8362 80.6921 0.1398 884 +886 3 174.0299 159.0034 80.9063 0.1525 885 +887 3 173.2519 158.1752 81.1983 0.1398 886 +888 3 172.4763 157.3549 81.6564 0.1271 887 +889 3 171.7007 156.5358 82.1145 0.1144 888 +890 3 170.925 155.7156 82.5726 0.1144 889 +891 3 170.1483 154.8965 83.0304 0.1144 890 +892 3 169.3726 154.0762 83.4884 0.1144 891 +893 3 168.597 153.2571 83.9465 0.1144 892 +894 3 167.8214 152.4369 84.4046 0.1144 893 +895 3 167.0457 151.6178 84.8627 0.1144 894 +896 3 166.0848 151.0572 85.2944 0.1144 895 +897 3 165.0495 150.603 85.7158 0.1144 896 +898 3 164.0141 150.1477 86.137 0.1144 897 +899 3 162.9239 149.8468 86.3092 0.1144 898 +900 3 161.7971 149.6512 86.3092 0.1144 899 +901 3 160.6714 149.4808 86.3092 0.1144 900 +902 3 159.58 149.8251 86.3092 0.1144 901 +903 3 158.4715 149.5711 86.3092 0.1144 902 +904 3 157.6226 148.9133 86.5875 0.1144 903 +905 3 156.9374 148.0153 87.0402 0.1144 904 +906 3 156.2521 147.1184 87.4927 0.1144 905 +907 3 155.5668 146.2215 87.9455 0.1144 906 +908 3 154.8816 145.3235 88.398 0.1144 907 +909 3 154.1963 144.4266 88.8507 0.1144 908 +910 3 153.5111 143.5297 89.3035 0.1144 909 +911 3 152.827 142.6316 89.756 0.1144 910 +912 3 152.1417 141.7347 90.2087 0.1144 911 +913 3 151.4564 140.8378 90.6615 0.1144 912 +914 3 150.7712 139.9398 91.114 0.1271 913 +915 3 150.0859 139.0429 91.5667 0.1398 914 +916 3 241.9972 239.7961 42.4637 0.2288 534 +917 3 242.0429 240.9378 42.4147 0.2796 916 +918 3 241.9125 242.0693 42.4371 0.3178 917 +919 3 241.5556 243.1538 42.3444 0.3559 918 +920 3 241.2627 244.2451 41.9922 0.3432 919 +921 3 241.1552 245.3823 41.946 0.3432 920 +922 3 241.1552 246.5171 41.6836 0.3305 921 +923 3 241.1552 247.6291 41.0589 0.3686 922 +924 3 241.1495 248.7708 40.88 0.4068 923 +925 3 241.1174 249.9137 40.88 0.4322 924 +926 3 241.0008 251.0508 40.88 0.4195 925 +927 3 240.8349 252.1811 40.8814 0.394 926 +928 3 240.8532 253.3159 40.8915 0.3813 927 +929 3 241.1312 254.4256 40.9223 0.3559 928 +930 3 241.4057 254.8546 41.0052 0.3432 929 +931 3 241.9263 255.8373 41.4901 0.3432 930 +932 3 242.353 256.8051 42.5244 0.3178 931 +933 3 242.9181 257.7649 43.0377 0.2796 932 +934 3 243.4958 258.7442 42.8288 0.2796 933 +935 3 243.934 259.7669 42.3074 0.3051 934 +936 3 244.2085 260.8663 42.049 0.3305 935 +937 3 244.5998 261.9325 42.2979 0.3559 936 +938 3 245.0517 262.9598 42.8252 0.3686 937 +939 3 245.5241 263.9906 43.1113 0.3686 938 +940 3 245.9554 265.0499 43.066 0.3432 939 +941 3 246.421 266.0852 42.8109 0.3178 940 +942 3 246.9896 267.0531 42.2999 0.3178 941 +943 3 247.6314 267.9877 42.0118 0.3305 942 +944 3 248.2995 268.9144 42.0109 0.3432 943 +945 3 248.9973 269.8181 42.058 0.3305 944 +946 3 249.6448 270.7493 42.3279 0.3051 945 +947 3 250.1505 271.7172 42.4556 0.2669 946 +948 3 250.2042 272.8268 42.0574 0.2542 947 +949 3 250.0509 273.9594 42.0 0.2415 948 +950 3 250.131 275.0794 41.9994 0.2542 949 +951 3 250.4365 276.181 41.9969 0.2415 950 +952 3 250.6641 277.301 41.9787 0.2669 951 +953 3 250.7648 278.4359 41.8659 0.2542 952 +954 3 250.7659 279.5581 41.405 0.2415 953 +955 3 250.7717 280.677 40.9312 0.1907 954 +956 3 250.8117 281.8187 40.88 0.1907 955 +957 3 251.0245 282.9329 40.88 0.2161 956 +958 3 251.4535 283.9923 40.88 0.2542 957 +959 3 251.8974 285.0448 40.88 0.2415 958 +960 3 252.1708 286.1476 40.88 0.2034 959 +961 3 252.4087 287.2595 40.88 0.1652 960 +962 3 252.7588 288.3486 40.8811 0.1652 961 +963 3 252.9887 289.464 40.8873 0.2034 962 +964 3 253.0379 290.6046 40.9391 0.2415 963 +965 3 253.0459 291.7463 40.9116 0.2669 964 +966 3 253.0539 292.8903 40.9035 0.2542 965 +967 3 253.0608 294.032 41.0455 0.2542 966 +968 3 253.1066 295.1428 41.6777 0.2669 967 +969 3 253.4257 296.2194 41.4974 0.2796 968 +970 3 253.8822 297.2432 40.9441 0.2669 969 +971 3 254.381 298.2694 40.88 0.2288 970 +972 3 254.8798 299.299 40.88 0.2161 971 +973 3 255.3683 300.3332 40.88 0.2288 972 +974 3 255.7675 301.4051 40.88 0.2415 973 +975 3 256.0352 302.5159 40.88 0.2415 974 +976 3 256.24 303.6416 40.88 0.2034 975 +977 3 256.256 304.7845 40.88 0.1907 976 +978 3 256.2549 305.9285 40.88 0.1907 977 +979 3 256.2457 307.0725 40.8794 0.2415 978 +980 3 256.1839 308.2142 40.8766 0.3051 979 +981 3 255.8716 309.3124 40.8587 0.3559 980 +982 3 255.5307 310.4038 40.7509 0.394 981 +983 3 255.4415 311.5192 40.2097 0.4068 982 +984 3 255.4941 312.6312 39.9403 0.4068 983 +985 3 255.7515 313.7271 40.3894 0.394 984 +986 3 255.9975 314.8208 40.8551 0.3686 985 +987 3 256.1874 315.9373 40.9156 0.3686 986 +988 3 255.978 317.0379 41.2118 0.3305 987 +989 3 255.5742 318.0881 41.7043 0.2924 988 +990 3 255.0823 319.1062 42.0538 0.2161 989 +991 3 254.9015 320.2193 42.4514 0.2034 990 +992 3 254.8832 321.345 42.9346 0.2288 991 +993 3 254.8821 322.4581 42.3979 0.2924 992 +994 3 254.8775 323.5976 42.28 0.3178 993 +995 3 254.8317 324.6958 42.9554 0.3051 994 +996 3 254.6338 325.7963 43.4034 0.2796 995 +997 3 254.1842 326.8271 43.8948 0.2669 996 +998 3 253.7678 327.8727 43.8463 0.2415 997 +999 3 253.6843 328.9526 43.2625 0.2288 998 +1000 3 254.0881 330.0085 43.0408 0.2034 999 +1001 3 254.7036 330.9546 42.7059 0.2161 1000 +1002 3 255.2195 331.903 42.0913 0.2161 1001 +1003 3 255.3282 333.0378 41.9972 0.2542 1002 +1004 3 255.247 334.1761 41.9821 0.2924 1003 +1005 3 254.961 335.2767 41.8956 0.3305 1004 +1006 3 254.5789 336.3326 41.5209 0.3559 1005 +1007 3 254.4439 337.4308 40.9612 0.3559 1006 +1008 3 254.5503 338.5645 40.9083 0.3559 1007 +1009 3 254.786 339.6811 41.0337 0.3432 1008 +1010 3 254.8866 340.7804 41.6478 0.3559 1009 +1011 3 254.9107 341.8901 42.2962 0.3686 1010 +1012 3 255.1314 342.9563 43.1029 0.3686 1011 +1013 3 255.3133 344.0706 43.2737 0.3305 1012 +1014 3 255.3442 345.2123 43.1642 0.2796 1013 +1015 3 255.3602 346.3552 43.2387 0.2415 1014 +1016 3 255.4701 347.4603 43.8556 0.2415 1015 +1017 3 255.7286 348.5276 44.6281 0.2542 1016 +1018 3 255.8007 349.6293 45.3202 0.2669 1017 +1019 3 255.8396 350.7607 45.6966 0.2924 1018 +1020 3 256.0741 351.8681 45.4474 0.3305 1019 +1021 3 256.5466 352.9057 45.4188 0.3686 1020 +1022 3 257.0122 353.9433 45.7064 0.3686 1021 +1023 3 257.3462 355.0026 46.3456 0.3432 1022 +1024 3 257.591 356.1158 46.4738 0.3051 1023 +1025 3 257.5316 357.2506 46.48 0.2542 1024 +1026 3 257.3062 358.3706 46.4803 0.2288 1025 +1027 3 257.2879 359.502 46.4822 0.2034 1026 +1028 3 257.6174 360.5968 46.4932 0.2415 1027 +1029 3 257.9594 361.6756 46.5674 0.2415 1028 +1030 3 257.9297 362.791 46.916 0.2796 1029 +1031 3 257.5556 363.8355 47.5132 0.2669 1030 +1032 3 257.1998 364.9005 47.6694 0.3178 1031 +1033 3 257.1712 366.0251 48.0399 0.3432 1032 +1034 3 257.1678 367.0799 49.0921 0.3813 1033 +1035 3 257.1449 368.1083 50.2642 0.3559 1034 +1036 3 257.0065 369.2054 50.5201 0.3178 1035 +1037 3 256.6278 370.2579 50.2874 0.2542 1036 +1038 3 256.3201 371.3149 50.7184 0.2288 1037 +1039 3 256.4837 372.4223 50.9897 0.2161 1038 +1040 3 257.0259 373.4005 51.2366 0.2542 1039 +1041 3 257.7649 374.2459 51.774 0.2542 1040 +1042 3 258.0875 375.3338 52.0772 0.2669 1041 +1043 3 258.2019 376.4721 52.0836 0.2542 1042 +1044 3 258.7019 377.5006 52.1004 0.2924 1043 +1045 3 259.3128 378.4638 52.1906 0.3051 1044 +1046 3 259.3414 379.5803 52.7772 0.3178 1045 +1047 3 259.0336 380.666 53.1936 0.2924 1046 +1048 3 258.973 381.8089 53.1558 0.2669 1047 +1049 3 258.8071 382.9288 52.8713 0.2415 1048 +1050 3 258.5486 383.9001 51.6541 0.2288 1049 +1051 3 258.5749 385.0235 52.1587 0.2288 1050 +1052 3 258.695 386.1023 52.8917 0.2288 1051 +1053 3 258.981 387.1788 52.6616 0.2161 1052 +1054 3 259.1023 388.2404 53.4971 0.2288 1053 +1055 3 259.3745 389.3158 53.0928 0.2288 1054 +1056 3 259.2487 390.4335 53.076 0.2542 1055 +1057 3 258.4879 391.2606 53.2053 0.2288 1056 +1058 3 257.7695 392.1495 53.2804 0.2161 1057 +1059 3 257.5293 393.2443 53.7457 0.1907 1058 +1060 3 257.2101 394.3357 53.5021 0.1907 1059 +1061 3 257.1518 395.4648 53.0905 0.178 1060 +1062 3 256.9207 396.5356 52.3426 0.1652 1061 +1063 3 256.7525 397.3615 52.7078 0.178 1062 +1064 3 256.7033 398.4998 52.5518 0.2034 1063 +1065 3 256.645 399.6186 53.0986 0.2288 1064 +1066 3 256.4436 400.7386 53.1997 0.2288 1065 +1067 3 256.5614 401.8689 53.1983 0.2288 1066 +1068 3 256.2148 402.9568 53.1882 0.2288 1067 +1069 3 255.7057 403.9716 53.1331 0.2161 1068 +1070 3 255.6131 405.0904 52.7808 0.2161 1069 +1071 3 254.9084 405.9576 52.7556 0.1271 1070 +1072 3 254.0069 406.3477 53.9748 0.1525 1071 +1073 3 253.2004 407.1393 54.3497 0.1907 1072 +1074 3 252.4362 407.9859 54.4796 0.2034 1073 +1075 3 251.7418 408.8782 54.885 0.1907 1074 +1076 3 251.0748 409.7728 55.0449 0.1525 1075 +1077 3 250.4536 410.6788 54.2718 0.1271 1076 +1078 3 249.7844 411.4785 54.2175 0.1144 1077 +1079 3 249.0499 412.2118 55.2782 0.1144 1078 +1080 3 248.5329 413.1922 55.8146 0.1398 1079 +1081 3 248.0158 414.176 55.9532 0.178 1080 +1082 3 247.2962 415.0592 55.7525 0.2415 1081 +1083 3 246.5892 415.955 55.6077 0.2669 1082 +1084 3 245.8273 416.7821 55.9518 0.2796 1083 +1085 3 245.0425 417.5852 56.4718 0.2415 1084 +1086 3 244.2795 418.4249 56.7983 0.2161 1085 +1087 3 243.5896 419.3126 57.2698 0.1907 1086 +1088 3 242.8518 420.166 57.4882 0.1907 1087 +1089 3 241.9754 420.7643 58.1658 0.178 1088 +1090 3 241.1255 421.4027 58.8 0.1525 1089 +1091 3 240.3327 422.2207 58.8 0.1271 1090 +1092 3 239.6977 423.1496 58.8 0.1144 1091 +1093 3 239.3889 424.2158 58.8 0.1144 1092 +1094 3 238.834 425.2145 58.819 0.1144 1093 +1095 3 238.3021 426.2132 59.08 0.1144 1094 +1096 3 237.5333 427.0049 59.08 0.1144 1095 +1097 3 236.7531 427.8057 59.08 0.1144 1096 +1098 3 236.411 428.8376 59.619 0.1144 1097 +1099 3 235.5187 429.5182 59.64 0.1144 1098 +1100 3 234.774 430.3762 59.64 0.1144 1099 +1101 3 234.1654 431.328 59.64 0.1144 1100 +1102 3 233.9503 432.4423 59.7985 0.1144 1101 +1103 3 233.5831 433.4547 60.5346 0.1271 1102 +1104 3 232.4871 433.7053 60.76 0.1398 1103 +1105 3 232.0032 434.5713 61.035 0.1525 1104 +1106 3 232.0032 435.7153 61.04 0.1398 1105 +1107 3 231.7458 436.7918 61.339 0.1271 1106 +1108 3 231.2928 437.7996 61.8579 0.1144 1107 +1109 3 230.5675 438.676 61.88 0.1144 1108 +1110 3 229.8159 439.5134 61.88 0.1144 1109 +1111 3 228.8572 440.059 61.9853 0.1144 1110 +1112 3 228.0495 440.6768 62.44 0.1144 1111 +1113 3 227.3929 441.5657 62.9698 0.1144 1112 +1114 3 226.663 442.3368 63.5522 0.1144 1113 +1115 3 225.765 443.038 63.56 0.1144 1114 +1116 3 224.8498 443.7198 63.56 0.1144 1115 +1117 3 223.9826 444.4143 64.0192 0.1144 1116 +1118 3 223.1715 445.2059 64.12 0.1144 1117 +1119 3 222.3078 445.9552 64.12 0.1144 1118 +1120 3 221.483 446.7263 64.3986 0.1271 1119 +1121 3 220.6948 447.542 64.4 0.1525 1120 +1122 3 219.68 448.0156 64.5372 0.1907 1121 +1123 3 219.0531 448.6516 65.8 0.2034 1122 +1124 3 218.4205 449.6012 65.8 0.1907 1123 +1125 3 217.6838 450.474 65.8 0.1525 1124 +1126 3 217.0477 451.3721 66.2245 0.1271 1125 +1127 3 216.4334 452.2392 66.64 0.1144 1126 +1128 3 215.7092 453.1212 66.64 0.1144 1127 +1129 3 215.048 454.0502 66.7044 0.1144 1128 +1130 3 214.4611 454.9905 67.34 0.1144 1129 +1131 3 214.0424 455.884 68.32 0.1144 1130 +1132 3 213.6992 456.925 68.32 0.1144 1131 +1133 3 213.3137 457.8208 68.32 0.1144 1132 +1134 3 212.3836 458.1731 68.32 0.1144 1133 +1135 3 211.8894 459.1753 68.5017 0.1271 1134 +1136 3 211.0897 459.9383 68.8246 0.1398 1135 +1137 3 210.385 460.579 70.2822 0.1525 1136 +1138 3 209.7032 461.3146 70.56 0.1525 1137 +1139 3 208.8486 462.0044 70.56 0.1652 1138 +1140 3 208.041 462.8132 70.56 0.2161 1139 +1141 3 207.7504 463.7776 70.28 0.2796 1140 +1142 3 255.8991 405.8008 53.2 0.2034 1070 +1143 3 256.4585 406.7698 53.2 0.2161 1142 +1144 3 256.8131 407.8577 53.2 0.178 1143 +1145 3 257.0374 408.9789 53.2 0.1398 1144 +1146 3 257.2673 410.0908 53.2 0.1144 1145 +1147 3 257.2856 411.2348 53.2 0.1144 1146 +1148 3 257.4 412.3697 53.2 0.1271 1147 +1149 3 257.3222 413.5091 53.2081 0.1398 1148 +1150 3 257.3108 414.6462 53.4486 0.1525 1149 +1151 3 257.392 415.7857 53.48 0.1525 1150 +1152 3 257.2719 416.9216 53.48 0.178 1151 +1153 3 257.1266 418.0554 53.48 0.2161 1152 +1154 3 256.7902 419.1158 53.8745 0.2415 1153 +1155 3 256.7136 420.2473 54.04 0.2161 1154 +1156 3 256.8108 421.381 54.1915 0.1652 1155 +1157 3 256.828 422.5101 54.6176 0.1271 1156 +1158 3 256.828 423.6507 54.8279 0.1144 1157 +1159 3 256.7262 424.7855 54.88 0.1144 1158 +1160 3 256.8131 425.9238 54.88 0.1271 1159 +1161 3 256.828 427.0666 54.88 0.1398 1160 +1162 3 256.7891 428.2095 54.88 0.1525 1161 +1163 3 256.4345 429.2768 54.88 0.1398 1162 +1164 3 256.232 430.4025 54.88 0.1271 1163 +1165 3 255.9643 431.5122 54.88 0.1144 1164 +1166 3 255.3763 432.4915 54.88 0.1144 1165 +1167 3 254.9347 433.5257 54.88 0.1144 1166 +1168 3 254.1762 434.3493 54.88 0.1144 1167 +1169 3 253.968 435.4567 54.88 0.1144 1168 +1170 3 253.7381 436.5561 54.8772 0.1144 1169 +1171 3 253.4269 437.6452 54.6 0.1398 1170 +1172 3 253.2816 438.7629 54.332 0.1652 1171 +1173 3 253.2816 439.9069 54.32 0.1907 1172 +1174 3 253.2816 441.0463 54.474 0.1652 1173 +1175 3 253.2816 442.1857 54.6 0.1398 1174 +1176 3 253.2816 443.3297 54.6 0.1144 1175 +1177 3 253.3171 444.4726 54.6 0.1144 1176 +1178 3 253.4635 445.604 54.49 0.1144 1177 +1179 3 253.5127 446.7389 54.2696 0.1144 1178 +1180 3 253.6248 447.8119 53.48 0.1144 1179 +1181 3 253.6248 448.9559 53.48 0.1144 1180 +1182 3 253.6248 450.0999 53.48 0.1144 1181 +1183 3 253.6248 451.2348 53.76 0.1144 1182 +1184 3 253.6248 452.3788 53.76 0.1144 1183 +1185 3 253.6248 453.5228 53.76 0.1144 1184 +1186 3 253.6248 454.6668 53.76 0.1144 1185 +1187 3 253.6248 455.8108 53.76 0.1144 1186 +1188 3 253.6248 456.9548 53.76 0.1144 1187 +1189 3 253.6248 458.0931 53.655 0.1144 1188 +1190 3 253.7369 459.0723 52.6481 0.1144 1189 +1191 3 253.7392 460.2152 52.64 0.1144 1190 +1192 3 253.7392 461.3592 52.64 0.1144 1191 +1193 3 253.7392 462.5032 52.64 0.1144 1192 +1194 3 253.7392 463.6472 52.64 0.1144 1193 +1195 3 253.7392 464.7912 52.64 0.1144 1194 +1196 3 253.7392 465.9352 52.694 0.1144 1195 +1197 3 253.7392 467.0746 52.92 0.1144 1196 +1198 3 253.7278 468.2175 52.9298 0.1144 1197 +1199 3 253.3331 468.937 54.32 0.1144 1198 +1200 3 253.1672 470.0559 54.1615 0.1144 1199 +1201 3 253.1672 471.1976 54.04 0.1144 1200 +1202 3 253.4829 472.234 53.366 0.1144 1201 +1203 3 253.7266 473.3071 52.92 0.1144 1202 +1204 3 253.7392 474.45 52.92 0.1144 1203 +1205 3 253.7392 475.594 52.92 0.1144 1204 +1206 3 253.7392 476.7288 53.2 0.1144 1205 +1207 3 253.7632 477.8728 53.2 0.1144 1206 +1208 3 254.0538 478.9631 53.3014 0.1144 1207 +1209 3 254.206 480.0647 53.48 0.1144 1208 +1210 3 254.4004 481.1904 53.48 0.1144 1209 +1211 3 254.4256 482.2944 54.0212 0.1144 1210 +1212 3 254.4313 483.4086 54.5112 0.1144 1211 +1213 3 254.8363 484.4485 54.6 0.1144 1212 +1214 3 255.1944 485.5205 54.6 0.1144 1213 +1215 3 255.2264 486.6622 54.6 0.1144 1214 +1216 3 255.2264 487.805 54.5437 0.1398 1215 +1217 3 255.2264 488.9433 54.2685 0.1907 1216 +1218 3 255.2424 489.9683 53.1927 0.2542 1217 +1219 3 255.6989 490.9716 52.64 0.2669 1218 +1220 3 256.1244 492.0344 52.64 0.2288 1219 +1221 3 256.1244 493.1773 52.64 0.178 1220 +1222 3 256.0283 494.3167 52.64 0.1652 1221 +1223 3 255.7801 495.4309 52.64 0.178 1222 +1224 3 255.5696 496.5292 52.9197 0.178 1223 +1225 3 255.5696 497.6526 53.2 0.1525 1224 +1226 3 255.6954 498.7737 53.2 0.1271 1225 +1227 3 256.256 499.7038 53.7107 0.1144 1226 +1228 3 256.2938 500.5766 52.08 0.1144 1227 +1229 3 256.2434 500.7414 52.36 0.1144 1228 +1230 3 256.3841 500.969 52.36 0.1271 1229 +1231 3 256.5992 502.065 52.36 0.1398 1230 +1232 3 256.5992 503.2033 52.5294 0.1652 1231 +1233 3 256.5992 504.3438 52.64 0.1652 1232 +1234 3 256.6839 505.4753 52.7649 0.1652 1233 +1235 3 257.1254 506.5014 52.92 0.1525 1234 +1236 3 257.4538 507.5951 52.92 0.1525 1235 +1237 3 257.9857 508.5778 52.92 0.1525 1236 +1238 3 258.6996 509.3752 53.0505 0.1652 1237 +1239 3 259.2773 510.3556 53.2459 0.178 1238 +1240 3 259.8024 511.2502 53.9904 0.2034 1239 +1241 3 259.783 512.3278 54.6 0.2034 1240 +1242 3 259.4592 513.2705 55.16 0.2034 1241 +1243 3 259.5084 514.411 55.16 0.178 1242 +1244 3 259.7887 515.5047 55.16 0.1525 1243 +1245 3 259.6686 516.6418 55.16 0.1271 1244 +1246 3 259.5736 517.7813 55.16 0.1144 1245 +1247 3 259.4786 518.9173 55.16 0.1144 1246 +1248 3 259.4592 520.0601 55.16 0.1144 1247 +1249 3 259.4592 521.2041 55.16 0.1144 1248 +1250 3 259.4592 522.3481 55.16 0.1144 1249 +1251 3 259.4592 523.4921 55.16 0.1144 1250 +1252 3 259.4592 524.5194 56.1921 0.1144 1251 +1253 3 259.4592 525.6325 56.56 0.1144 1252 +1254 3 259.3036 526.764 56.56 0.1144 1253 +1255 3 259.116 527.8896 56.5799 0.1144 1254 +1256 3 259.116 529.0073 57.0494 0.1144 1255 +1257 3 259.076 530.1445 57.12 0.1144 1256 +1258 3 258.7625 531.237 57.12 0.1144 1257 +1259 3 258.5474 532.3421 57.12 0.1144 1258 +1260 3 258.544 533.3271 58.2722 0.1144 1259 +1261 3 258.504 534.4299 58.9375 0.1144 1260 +1262 3 258.4113 535.559 59.08 0.1144 1261 +1263 3 258.0006 536.5932 59.08 0.1144 1262 +1264 3 257.972 537.7349 59.08 0.1144 1263 +1265 3 257.9011 538.8274 59.6008 0.1144 1264 +1266 3 257.4583 539.7644 60.7578 0.1144 1265 +1267 3 257.1277 540.8283 61.04 0.1144 1266 +1268 3 256.7159 541.8945 61.0708 0.1144 1267 +1269 3 256.7136 542.9996 61.6 0.1144 1268 +1270 3 256.4848 543.8873 62.5806 0.1144 1269 +1271 3 256.4848 545.0233 62.72 0.1144 1270 +1272 3 256.4848 546.1673 62.72 0.1144 1271 +1273 3 256.4848 547.1946 63.6913 0.1144 1272 +1274 3 256.4848 548.3055 64.12 0.1144 1273 +1275 3 256.4848 549.4495 64.12 0.1144 1274 +1276 3 256.5123 550.5923 64.12 0.1271 1275 +1277 3 256.7136 551.7077 64.12 0.1525 1276 +1278 3 257.1357 552.6767 64.4815 0.178 1277 +1279 3 257.7993 553.4317 65.52 0.178 1278 +1280 3 258.1836 554.4934 65.52 0.1525 1279 +1281 3 258.5703 555.5664 65.52 0.1271 1280 +1282 3 258.7579 556.6944 65.52 0.1144 1281 +1283 3 259.3002 557.6645 65.52 0.1144 1282 +1284 3 259.4592 558.7593 65.52 0.1144 1283 +1285 3 259.4592 559.9033 65.52 0.1144 1284 +1286 3 259.7498 560.7865 65.8423 0.1144 1285 +1287 3 259.9683 561.8127 66.9578 0.1144 1286 +1288 3 260.1868 562.84 68.0733 0.1144 1287 +1289 3 260.4053 563.8662 69.1888 0.1144 1288 +1290 3 260.6226 564.8923 70.3044 0.1144 1289 +1291 3 260.8412 565.9185 71.4199 0.1144 1290 +1292 3 260.8023 567.0007 72.0658 0.1144 1291 +1293 3 260.6009 568.1173 72.4156 0.1144 1292 +1294 3 260.3996 569.235 72.7653 0.1144 1293 +1295 3 260.1971 570.3515 73.115 0.1144 1294 +1296 3 259.9957 571.468 73.4644 0.1144 1295 +1297 3 259.7944 572.5857 73.8142 0.1144 1296 +1298 3 259.593 573.7023 74.1639 0.1144 1297 +1299 3 259.3917 574.82 74.5136 0.1144 1298 +1300 3 259.1892 575.9365 74.8633 0.1144 1299 +1301 3 258.9879 577.053 75.213 0.1144 1300 +1302 3 258.6481 578.1318 75.511 0.1144 1301 +1303 3 258.2122 579.1843 75.7733 0.1144 1302 +1304 3 257.7764 580.2368 76.0357 0.1144 1303 +1305 3 257.3405 581.2893 76.298 0.1144 1304 +1306 3 256.9046 582.3418 76.5604 0.1144 1305 +1307 3 256.7445 583.4457 76.6083 0.1144 1306 +1308 3 256.7822 584.5886 76.5005 0.1144 1307 +1309 3 256.8211 585.7314 76.3924 0.1144 1308 +1310 3 256.86 586.8731 76.2846 0.1144 1309 +1311 3 256.8989 588.016 76.1768 0.1144 1310 +1312 3 256.9378 589.1589 76.0687 0.1144 1311 +1313 3 256.9756 590.3006 75.9609 0.1144 1312 +1314 3 257.0145 591.4434 75.8531 0.1144 1313 +1315 3 257.0534 592.5863 75.745 0.1144 1314 +1316 3 257.0923 593.728 75.6372 0.1144 1315 +1317 3 257.1312 594.8708 75.5292 0.1144 1316 +1318 3 257.1701 596.0137 75.4214 0.1144 1317 +1319 3 256.9733 597.0994 75.3561 0.1271 1318 +1320 3 256.6106 598.1187 75.3561 0.1525 1319 +1321 3 256.7548 599.2409 75.4191 0.178 1320 +1322 3 256.7742 600.3849 75.521 0.178 1321 +1323 3 256.7948 601.5278 75.6227 0.1525 1322 +1324 3 256.8143 602.6706 75.7243 0.1271 1323 +1325 3 256.8337 603.8135 75.826 0.1144 1324 +1326 3 256.8543 604.9564 75.9276 0.1144 1325 +1327 3 256.8738 606.1004 76.0292 0.1144 1326 +1328 3 256.8944 607.2432 76.1309 0.1271 1327 +1329 3 256.9138 608.3861 76.2325 0.1652 1328 +1330 3 256.5981 500.8398 52.08 0.2034 1228 +1331 3 256.828 501.93 52.0551 0.2034 1330 +1332 3 256.828 503.034 51.3906 0.2034 1331 +1333 3 256.828 504.1722 51.24 0.1652 1332 +1334 3 257.0374 505.1984 50.96 0.1398 1333 +1335 3 257.273 506.2909 50.68 0.1144 1334 +1336 3 257.6288 507.3057 50.68 0.1144 1335 +1337 3 258.0258 507.9268 49.2192 0.1271 1336 +1338 3 258.544 508.5492 47.6896 0.1525 1337 +1339 3 258.5509 509.6566 47.1794 0.178 1338 +1340 3 258.8758 510.6793 46.48 0.178 1339 +1341 3 258.8872 511.8233 46.48 0.1652 1340 +1342 3 258.8426 512.8094 45.3306 0.1525 1341 +1343 3 258.7728 513.8139 44.151 0.1525 1342 +1344 3 258.671 514.943 43.958 0.1398 1343 +1345 3 258.5612 516.047 43.5095 0.1271 1344 +1346 3 258.1974 517.0319 42.84 0.1271 1345 +1347 3 258.0406 518.1645 42.84 0.1652 1346 +1348 3 257.972 519.3028 42.7512 0.2034 1347 +1349 3 257.6094 520.3324 42.009 0.2161 1348 +1350 3 257.4847 521.4546 41.72 0.1907 1349 +1351 3 257.4046 522.5906 41.6326 0.2034 1350 +1352 3 257.7226 523.6523 41.3837 0.2542 1351 +1353 3 258.3678 524.5206 40.8456 0.3051 1352 +1354 3 258.6584 525.422 40.0632 0.2796 1353 +1355 3 258.6859 526.5649 40.04 0.2288 1354 +1356 3 259.1926 527.5327 39.7222 0.1907 1355 +1357 3 259.7978 528.4594 39.2613 0.1907 1356 +1358 3 260.3321 529.4283 38.92 0.1652 1357 +1359 3 260.3744 530.5678 38.8805 0.1398 1358 +1360 3 260.387 531.6809 38.36 0.1144 1359 +1361 3 260.7759 532.7368 38.36 0.1144 1360 +1362 3 261.2873 533.4964 37.4413 0.1144 1361 +1363 3 261.404 534.4619 36.4 0.1144 1362 +1364 3 261.8799 535.4881 36.4 0.1144 1363 +1365 3 261.976 536.6092 36.3927 0.1271 1364 +1366 3 261.976 537.68 35.7056 0.1525 1365 +1367 3 262.4714 538.6089 35.28 0.178 1366 +1368 3 263.2172 539.4463 34.9297 0.178 1367 +1369 3 264.1004 540.0847 34.72 0.1525 1368 +1370 3 265.0351 540.6796 34.72 0.1398 1369 +1371 3 265.5647 541.6646 34.4669 0.1398 1370 +1372 3 266.0269 542.6678 33.88 0.1525 1371 +1373 3 266.7305 543.3886 33.0394 0.1398 1372 +1374 3 267.2258 544.1585 31.645 0.1271 1373 +1375 3 268.077 544.7922 31.8298 0.1144 1374 +1376 3 268.848 545.5221 32.2 0.1144 1375 +1377 3 268.9544 546.6032 31.92 0.1144 1376 +1378 3 241.0259 254.9621 40.3556 0.4195 929 +1379 3 240.7491 255.9963 39.4316 0.3559 1378 +1380 3 240.1965 256.947 38.8573 0.2924 1379 +1381 3 239.342 257.6929 38.6224 0.2669 1380 +1382 3 238.492 258.4559 38.5112 0.2669 1381 +1383 3 237.6397 259.2064 38.2323 0.2415 1382 +1384 3 236.776 259.9202 38.523 0.2034 1383 +1385 3 235.7715 260.4099 38.729 0.178 1384 +1386 3 234.8518 261.0002 38.1262 0.1907 1385 +1387 3 234.0601 261.7918 37.6088 0.2415 1386 +1388 3 233.1621 262.4874 37.4693 0.2669 1387 +1389 3 232.2309 263.1394 37.1731 0.2796 1388 +1390 3 231.2585 263.6771 36.5442 0.2415 1389 +1391 3 230.2918 264.272 36.3698 0.2288 1390 +1392 3 229.3068 264.8497 36.2247 0.2161 1391 +1393 3 228.4122 265.4904 35.5292 0.2288 1392 +1394 3 227.5633 266.2385 35.2262 0.2161 1393 +1395 3 226.7923 267.0771 34.9933 0.2034 1394 +1396 3 226.2203 267.9969 34.1695 0.1907 1395 +1397 3 225.6826 268.943 33.3029 0.1907 1396 +1398 3 225.0946 269.9119 33.0593 0.1907 1397 +1399 3 224.5615 270.9232 33.0366 0.2034 1398 +1400 3 224.049 271.946 33.0215 0.2288 1399 +1401 3 223.5662 272.9824 32.9342 0.2542 1400 +1402 3 223.3237 274.0715 32.4075 0.2669 1401 +1403 3 223.2299 275.2052 32.4461 0.2669 1402 +1404 3 222.9805 276.3149 32.69 0.2542 1403 +1405 3 223.1132 277.4028 32.0418 0.2415 1404 +1406 3 222.921 278.5171 31.8049 0.2034 1405 +1407 3 222.3067 279.4517 31.2903 0.2034 1406 +1408 3 221.5676 280.3029 30.8081 0.2161 1407 +1409 3 220.6307 280.9515 30.6561 0.2542 1408 +1410 3 219.799 281.6825 29.967 0.2542 1409 +1411 3 218.8792 282.3529 29.6834 0.2415 1410 +1412 3 217.8645 282.8792 29.6657 0.2542 1411 +1413 3 216.8681 283.442 29.5963 0.2924 1412 +1414 3 216.0078 284.1742 29.1654 0.3305 1413 +1415 3 215.3019 285.0001 28.2937 0.3432 1414 +1416 3 214.8524 285.9725 27.3112 0.3559 1415 +1417 3 214.1339 286.691 26.0282 0.3813 1416 +1418 3 213.3205 287.2962 24.7307 0.3813 1417 +1419 3 212.5998 287.9254 23.2058 0.3305 1418 +1420 3 211.9386 288.7422 22.1634 0.2415 1419 +1421 3 211.2602 289.6562 22.3306 0.178 1420 +1422 3 210.5692 290.5451 21.8576 0.178 1421 +1423 3 209.8554 291.3459 20.9138 0.1907 1422 +1424 3 209.0317 291.8859 19.5966 0.2034 1423 +1425 3 208.073 292.0003 18.1381 0.178 1424 +1426 3 207.6223 292.856 17.92 0.1652 1425 +1427 3 207.1212 293.8055 17.92 0.1525 1426 +1428 3 206.1797 294.4347 17.712 0.1398 1427 +1429 3 205.3366 295.1108 16.8314 0.1398 1428 +1430 3 204.5975 295.9436 16.6172 0.1652 1429 +1431 3 203.9432 296.6804 17.64 0.2161 1430 +1432 3 203.2579 297.4423 18.1815 0.2415 1431 +1433 3 202.6779 298.3563 17.6616 0.2288 1432 +1434 3 202.385 299.3837 16.8328 0.1907 1433 +1435 3 201.9904 300.4338 16.52 0.178 1434 +1436 3 201.511 301.4612 16.2582 0.178 1435 +1437 3 201.2296 302.5651 16.2014 0.1907 1436 +1438 3 200.7159 303.398 15.4339 0.1907 1437 +1439 3 199.9758 304.2239 14.8506 0.1907 1438 +1440 3 199.3992 305.1048 14.28 0.1907 1439 +1441 3 241.813 228.7279 37.5626 0.3686 1 +1442 3 242.3976 227.7658 37.7896 0.4449 1441 +1443 3 242.8586 226.7397 38.2886 0.4322 1442 +1444 3 243.275 225.6952 38.6366 0.3686 1443 +1445 3 243.4272 224.5752 38.7629 0.3432 1444 +1446 3 243.3471 223.461 39.2529 0.3686 1445 +1447 3 242.9936 222.4325 39.8796 0.4068 1446 +1448 3 242.4811 221.467 40.6227 0.4068 1447 +1449 3 242.234 220.4419 41.6968 0.394 1448 +1450 3 242.6756 219.4158 42.2038 0.4068 1449 +1451 3 243.219 218.4502 42.8907 0.4322 1450 +1452 3 243.5954 217.3737 43.1203 0.4576 1451 +1453 3 244.5037 215.9918 43.1284 0.2542 1452 +1454 3 245.3972 215.2916 43.1791 0.2924 1453 +1455 3 246.429 214.8054 43.3756 0.3051 1454 +1456 3 247.1063 214.174 44.24 0.2415 1455 +1457 3 247.8934 213.4555 44.24 0.178 1456 +1458 3 248.693 212.6582 44.24 0.1271 1457 +1459 3 249.527 211.9798 44.24 0.1144 1458 +1460 3 250.6069 211.648 44.24 0.1144 1459 +1461 3 251.3974 210.8472 43.9852 0.1144 1460 +1462 3 252.3458 210.2386 43.68 0.1525 1461 +1463 3 253.2816 209.5808 43.68 0.2415 1462 +1464 3 253.4944 209.4344 43.68 0.1144 1463 +1465 3 254.2609 208.7251 43.12 0.1144 1464 +1466 3 255.2127 208.208 43.12 0.1271 1465 +1467 3 256.0535 207.7424 42.5779 0.1398 1466 +1468 3 256.6095 206.7677 42.4074 0.1525 1467 +1469 3 257.1426 205.7804 42.28 0.1398 1468 +1470 3 257.8336 204.8915 42.0 0.1271 1469 +1471 3 258.4605 203.9363 42.0 0.1398 1470 +1472 3 259.2178 203.084 42.0 0.1907 1471 +1473 3 260.0015 202.2592 42.0 0.2415 1472 +1474 3 260.943 201.7524 41.8981 0.2542 1473 +1475 3 261.4909 201.4012 39.9728 0.2161 1474 +1476 3 262.4794 200.8956 39.76 0.1907 1475 +1477 3 263.3259 200.1428 39.76 0.1652 1476 +1478 3 264.1954 199.5159 39.76 0.178 1477 +1479 3 264.6209 198.8238 38.9211 0.1907 1478 +1480 3 264.7605 197.8354 37.5533 0.2288 1479 +1481 3 265.2478 196.9796 36.8018 0.2415 1480 +1482 3 266.2008 196.6021 35.7311 0.2288 1481 +1483 3 266.8975 196.0221 34.3294 0.2034 1482 +1484 3 267.3139 195.1492 32.8378 0.1907 1483 +1485 3 268.0872 194.4834 31.5717 0.1907 1484 +1486 3 268.7599 193.8016 30.0639 0.178 1485 +1487 3 269.3708 193.1026 28.4362 0.178 1486 +1488 3 269.8719 192.1794 27.326 0.1652 1487 +1489 3 270.373 191.2562 26.2161 0.178 1488 +1490 3 270.874 190.3044 25.4108 0.1652 1489 +1491 3 271.3751 189.2759 25.4108 0.1652 1490 +1492 3 271.8075 188.3116 24.6176 0.1652 1491 +1493 3 272.1885 187.3964 23.2201 0.1907 1492 +1494 3 253.4772 209.6986 44.2061 0.2924 1463 +1495 3 254.5068 209.8096 44.8 0.2288 1494 +1496 3 255.6405 209.924 44.8 0.178 1495 +1497 3 256.7845 209.924 44.8 0.1525 1496 +1498 3 257.9285 209.924 44.8 0.1652 1497 +1499 3 259.021 209.9515 45.1455 0.178 1498 +1500 3 260.0175 210.3278 45.6238 0.2034 1499 +1501 3 261.134 210.52 45.92 0.2034 1500 +1502 3 262.2437 210.7248 46.216 0.2034 1501 +1503 3 263.3728 210.7248 46.6763 0.2034 1502 +1504 3 264.4528 210.7248 47.5518 0.2161 1503 +1505 3 265.4629 210.7248 48.6612 0.2288 1504 +1506 3 266.4101 210.3793 49.28 0.2161 1505 +1507 3 267.4008 210.0384 49.8187 0.2034 1506 +1508 3 268.3744 209.9755 51.0804 0.178 1507 +1509 3 269.1821 209.6952 52.7083 0.1652 1508 +1510 3 270.318 209.6952 52.92 0.1525 1509 +1511 3 271.4323 209.5808 53.3932 0.1525 1510 +1512 3 272.5397 209.5316 54.021 0.1398 1511 +1513 3 273.5979 209.2262 54.4026 0.1271 1512 +1514 3 274.4239 208.5432 55.0984 0.1144 1513 +1515 3 275.2521 207.8248 55.9 0.1144 1514 +1516 3 276.0804 207.1075 56.7017 0.1144 1515 +1517 3 276.9361 206.5698 57.9446 0.1271 1516 +1518 3 277.8044 206.1168 59.3914 0.1398 1517 +1519 3 278.6967 205.7164 60.8247 0.1525 1518 +1520 3 279.6554 205.4647 62.2205 0.1398 1519 +1521 3 280.6152 205.213 63.6163 0.1271 1520 +1522 3 281.5739 204.9602 65.0118 0.1144 1521 +1523 3 282.552 204.5758 66.0999 0.1144 1522 +1524 3 283.5335 204.1594 67.1149 0.1144 1523 +1525 3 284.5151 203.7441 68.1296 0.1144 1524 +1526 3 285.4966 203.3277 69.1446 0.1271 1525 +1527 3 286.3581 202.6756 70.0437 0.1398 1526 +1528 3 287.2104 202.0041 70.933 0.1652 1527 +1529 3 288.2319 201.5259 71.3658 0.1652 1528 +1530 3 289.2627 201.058 71.776 0.1652 1529 +1531 3 290.2923 200.5901 72.186 0.1525 1530 +1532 3 291.323 200.1222 72.5962 0.1525 1531 +1533 3 292.4007 199.8316 73.1254 0.1525 1532 +1534 3 293.5001 199.6246 73.71 0.1398 1533 +1535 3 294.5994 199.4175 74.2949 0.1271 1534 +1536 3 295.6988 199.2104 74.8796 0.1144 1535 +1537 3 296.7982 199.0034 75.4645 0.1144 1536 +1538 3 297.8701 198.7105 76.0754 0.1144 1537 +1539 3 298.9089 198.3078 76.7203 0.1144 1538 +1540 3 299.9465 197.9051 77.3648 0.1144 1539 +1541 3 300.9841 197.5024 78.0097 0.1144 1540 +1542 3 302.0217 197.0986 78.6545 0.1144 1541 +1543 3 303.0593 196.6959 79.2994 0.1144 1542 +1544 3 243.2899 216.2652 43.6612 0.178 1452 +1545 3 242.5555 215.4484 44.3646 0.2542 1544 +1546 3 241.6036 214.8729 45.0136 0.3051 1545 +1547 3 240.7674 214.1213 45.5104 0.3432 1546 +1548 3 240.2022 213.1764 46.2297 0.3432 1547 +1549 3 239.6794 212.2383 47.1904 0.3432 1548 +1550 3 238.9233 211.4432 47.976 0.3686 1549 +1551 3 238.19 210.5875 48.447 0.3813 1550 +1552 3 237.6969 209.5957 47.7705 0.4195 1551 +1553 3 237.7426 208.4871 47.9394 0.4195 1552 +1554 3 238.1819 207.4861 48.7449 0.4068 1553 +1555 3 238.6807 206.524 49.6034 0.3432 1554 +1556 3 238.9507 205.5139 50.1231 0.2924 1555 +1557 3 238.4279 204.5541 50.7265 0.2924 1556 +1558 3 237.5962 203.8734 51.52 0.3051 1557 +1559 3 236.7165 202.7992 51.52 0.2161 1558 +1560 3 236.2463 201.765 51.52 0.2034 1559 +1561 3 235.8104 200.74 51.7409 0.1652 1560 +1562 3 235.7784 199.6005 51.8 0.1271 1561 +1563 3 235.5118 198.5721 51.8392 0.1398 1562 +1564 3 235.346 197.4876 52.36 0.1652 1563 +1565 3 234.9707 196.4237 52.542 0.1907 1564 +1566 3 234.4514 195.465 53.2 0.1907 1565 +1567 3 233.9686 194.4411 53.2 0.1907 1566 +1568 3 233.5934 193.4161 53.2 0.1907 1567 +1569 3 233.1186 192.3888 53.2 0.1652 1568 +1570 3 232.6038 191.3718 53.2 0.1398 1569 +1571 3 232.4425 190.2483 53.2 0.1144 1570 +1572 3 231.8774 189.578 54.3158 0.1398 1571 +1573 3 231.3431 188.5667 54.32 0.178 1572 +1574 3 230.5377 187.7887 54.32 0.2161 1573 +1575 3 229.8593 186.9124 54.6 0.2161 1574 +1576 3 229.2908 185.9412 54.8836 0.1907 1575 +1577 3 229.0185 185.137 56.0 0.178 1576 +1578 3 228.6787 184.0456 56.0 0.1652 1577 +1579 3 228.4454 182.9496 56.1243 0.1652 1578 +1580 3 228.1925 181.9177 56.9265 0.1525 1579 +1581 3 227.8333 180.8447 57.12 0.1652 1580 +1582 3 227.2201 180.1114 58.212 0.2034 1581 +1583 3 226.7179 179.1412 58.5298 0.2415 1582 +1584 3 226.0555 178.4903 59.852 0.2542 1583 +1585 3 225.471 177.7032 61.2545 0.2288 1584 +1586 3 224.9493 176.7503 61.917 0.2034 1585 +1587 3 224.4963 175.7459 62.44 0.1907 1586 +1588 3 223.6406 175.0377 62.44 0.178 1587 +1589 3 223.2928 174.3948 63.2789 0.1525 1588 +1590 3 222.8066 173.9052 64.4 0.1271 1589 +1591 3 222.1671 172.9762 64.4 0.1144 1590 +1592 3 221.6225 171.9718 64.4 0.1144 1591 +1593 3 220.832 171.1664 64.4 0.1144 1592 +1594 3 220.5655 170.0842 64.4 0.1144 1593 +1595 3 220.1285 169.0775 64.4 0.1144 1594 +1596 3 219.7464 168.192 64.8844 0.1144 1595 +1597 3 219.076 167.6818 66.4132 0.1144 1596 +1598 3 218.7328 166.9885 68.04 0.1144 1597 +1599 3 218.5623 165.8651 68.04 0.1144 1598 +1600 3 218.2946 164.7577 68.04 0.1144 1599 +1601 3 218.1608 163.624 68.04 0.1144 1600 +1602 3 218.0533 162.4892 68.04 0.1144 1601 +1603 3 217.8542 161.3704 68.2312 0.1271 1602 +1604 3 217.8176 160.3545 69.3342 0.1398 1603 +1605 3 217.8176 159.3237 70.3875 0.1525 1604 +1606 3 217.8176 158.1866 70.56 0.1398 1605 +1607 3 217.8942 157.054 70.56 0.1271 1606 +1608 3 218.1391 155.9695 70.761 0.1144 1607 +1609 3 218.4193 154.9491 71.4 0.1144 1608 +1610 3 218.7328 153.8714 71.6783 0.1144 1609 +1611 3 219.0497 152.7892 71.96 0.1144 1610 +1612 3 219.3162 151.7138 72.5049 0.1144 1611 +1613 3 219.5954 150.6259 72.8 0.1144 1612 +1614 3 219.9306 149.5437 72.8 0.1144 1613 +1615 3 219.9912 148.4043 72.8 0.1144 1614 +1616 3 220.1056 147.2671 72.8 0.1144 1615 +1617 3 220.252 146.3107 73.6221 0.1144 1616 +1618 3 220.8572 145.5992 73.9007 0.1144 1617 +1619 3 220.9808 144.5295 74.8434 0.1144 1618 +1620 3 221.1055 143.4599 75.7859 0.1144 1619 +1621 3 221.229 142.3891 76.7284 0.1144 1620 +1622 3 221.3526 141.3195 77.6709 0.1144 1621 +1623 3 221.5608 140.2395 78.416 0.1144 1622 +1624 3 221.8102 139.155 79.0622 0.1144 1623 +1625 3 222.0607 138.0694 79.7084 0.1144 1624 +1626 3 222.3101 136.9848 80.3547 0.1144 1625 +1627 3 222.5606 135.9003 81.0009 0.1144 1626 +1628 3 222.81 134.8158 81.6472 0.1144 1627 +1629 3 222.9473 133.7096 82.2273 0.1144 1628 +1630 3 222.9976 132.5873 82.7568 0.1144 1629 +1631 3 223.048 131.465 83.2863 0.1144 1630 +1632 3 223.0994 130.3428 83.8158 0.1144 1631 +1633 3 223.1498 129.2205 84.3452 0.1144 1632 +1634 3 223.2001 128.0983 84.8747 0.1144 1633 +1635 3 223.0125 126.9897 85.26 0.1144 1634 +1636 3 222.754 125.8835 85.6027 0.1144 1635 +1637 3 222.4966 124.7784 85.9454 0.1144 1636 +1638 3 222.2392 123.6721 86.2884 0.1144 1637 +1639 3 221.9806 122.5659 86.6312 0.1144 1638 +1640 3 221.7232 121.4608 86.9739 0.1144 1639 +1641 3 221.4658 120.3545 87.3169 0.1144 1640 +1642 3 221.2073 119.2494 87.6596 0.1144 1641 +1643 3 220.9499 118.1432 88.0023 0.1144 1642 +1644 3 221.2233 117.0609 88.0617 0.1144 1643 +1645 3 221.6088 115.9844 88.0617 0.1144 1644 +1646 3 221.9932 114.9068 88.0617 0.1144 1645 +1647 3 222.3787 113.8295 88.0617 0.1144 1646 +1648 3 222.7631 112.7522 88.0617 0.1271 1647 +1649 3 223.1486 111.6749 88.0617 0.1398 1648 +1650 3 223.4186 110.5707 88.2725 0.1525 1649 +1651 3 223.6383 109.4548 88.5749 0.1398 1650 +1652 3 223.8579 108.339 88.8773 0.1271 1651 +1653 3 224.0776 107.2231 89.18 0.1144 1652 +1654 3 224.2972 106.1071 89.4824 0.1144 1653 +1655 3 224.5169 104.9913 89.7848 0.1144 1654 +1656 3 224.7365 103.8754 90.0875 0.1144 1655 +1657 3 224.9562 102.7596 90.3899 0.1144 1656 +1658 3 225.1758 101.6437 90.6903 0.1144 1657 +1659 3 225.4378 100.5298 90.6903 0.1144 1658 +1660 3 225.6986 99.416 90.6903 0.1144 1659 +1661 3 226.2615 98.491 91.4805 0.1144 1660 +1662 3 226.8666 97.5917 92.3782 0.1144 1661 +1663 3 227.4707 96.6925 93.2758 0.1144 1662 +1664 3 228.0758 95.7932 94.1738 0.1144 1663 +1665 3 228.6799 94.8939 95.0715 0.1398 1664 +1666 3 237.65 203.7464 53.2 0.178 1558 +1667 3 238.7722 203.6686 53.4531 0.1907 1666 +1668 3 239.763 203.6045 54.32 0.1652 1667 +1669 3 240.4242 202.8529 54.32 0.1398 1668 +1670 3 241.2616 202.1128 54.5784 0.1144 1669 +1671 3 242.0521 201.2914 54.6 0.1144 1670 +1672 3 242.5177 200.3281 54.6 0.1144 1671 +1673 3 243.2407 199.7573 55.3714 0.1144 1672 +1674 3 243.8287 198.9748 56.7398 0.1144 1673 +1675 3 244.4785 198.2849 58.0633 0.1144 1674 +1676 3 245.3411 197.5928 58.329 0.1144 1675 +1677 3 245.865 196.6639 58.5239 0.1398 1676 +1678 3 246.5938 196.2189 60.0678 0.1652 1677 +1679 3 247.5204 195.8528 60.7866 0.1907 1678 +1680 3 248.4356 195.8528 62.3742 0.1652 1679 +1681 3 249.4309 195.7384 63.1907 0.1398 1680 +1682 3 250.512 195.7384 63.84 0.1271 1681 +1683 3 251.5313 195.7384 64.7592 0.1525 1682 +1684 3 252.6684 195.7384 64.9883 0.178 1683 +1685 3 253.5298 195.2442 66.103 0.178 1684 +1686 3 254.492 194.7523 66.36 0.178 1685 +1687 3 255.0537 194.3656 67.6404 0.178 1686 +1688 3 255.6176 194.3015 70.0711 0.2034 1687 +1689 3 256.1816 194.2363 72.5021 0.1907 1688 +1690 3 256.8886 194.0338 74.5766 0.178 1689 +1691 3 257.7123 193.717 76.356 0.1398 1690 +1692 3 258.5371 193.3989 78.1351 0.1271 1691 +1693 3 259.3608 193.0809 79.9145 0.1144 1692 +1694 3 260.1834 192.7388 81.6693 0.1144 1693 +1695 3 261.0025 192.3522 83.3806 0.1144 1694 +1696 3 261.8216 191.9655 85.0917 0.1144 1695 +1697 3 262.6418 191.5697 86.767 0.1144 1696 +1698 3 263.5318 190.8936 87.3712 0.1144 1697 +1699 3 264.4207 190.2175 87.9754 0.1144 1698 +1700 3 265.3096 189.5414 88.5797 0.1144 1699 +1701 3 266.1996 188.8652 89.1839 0.1144 1700 +1702 3 267.0885 188.1891 89.7882 0.1144 1701 +1703 3 267.9774 187.513 90.3921 0.1144 1702 +1704 3 268.8503 186.8918 91.2559 0.1144 1703 +1705 3 269.7277 186.3198 92.3835 0.1144 1704 +1706 3 270.6052 185.7478 93.5113 0.1144 1705 +1707 3 271.4163 185.2205 94.9892 0.1144 1706 +1708 3 272.2091 184.7057 96.565 0.1144 1707 +1709 3 273.003 184.1897 98.1406 0.1144 1708 +1710 3 273.7958 183.6749 99.7164 0.1144 1709 +1711 3 274.6847 183.2059 100.767 0.1144 1710 +1712 3 275.6697 183.0423 101.6364 0.1398 1711 +1713 3 276.5574 183.0995 103.3959 0.178 1712 +1714 2 243.2087 232.2354 37.4839 0.4068 1 +1715 2 243.767 231.2379 37.52 0.4068 1714 +1716 2 244.4007 230.2861 37.52 0.4068 1715 +1717 2 245.2942 229.5848 37.5194 0.4068 1716 +1718 2 246.2563 228.967 37.5175 0.394 1717 +1719 2 247.3053 228.514 37.5049 0.3432 1718 +1720 2 248.3269 228.0003 37.4402 0.2796 1719 +1721 2 249.4343 227.8551 36.955 0.2542 1720 +1722 2 250.4296 227.6754 35.6776 0.2669 1721 +1723 2 251.4798 227.3197 35.0406 0.2924 1722 +1724 2 252.4053 226.7545 34.167 0.3051 1723 +1725 2 253.4029 226.3312 33.3416 0.2796 1724 +1726 2 254.2757 225.7684 32.2375 0.2542 1725 +1727 2 255.1337 225.0282 31.9421 0.2288 1726 +1728 2 256.0558 224.351 31.92 0.2542 1727 +1729 2 257.0076 223.7172 31.92 0.2796 1728 +1730 2 257.9686 223.0972 31.92 0.2924 1729 +1731 2 258.9158 222.4554 31.92 0.2542 1730 +1732 2 259.7669 221.7152 32.1191 0.2034 1731 +1733 2 260.6226 220.9968 32.2 0.1652 1732 +1734 2 261.6808 220.5769 32.1538 0.1525 1733 +1735 2 262.5766 219.8985 31.7307 0.1525 1734 +1736 2 263.4643 219.1893 31.57 0.1398 1735 +1737 2 264.2983 218.4376 31.36 0.1398 1736 +1738 2 265.2238 217.8119 30.8918 0.1398 1737 +1739 2 266.1813 217.2021 30.7936 0.1525 1738 +1740 2 267.1995 216.7079 30.52 0.1398 1739 +1741 2 268.1204 216.033 30.5155 0.1271 1740 +1742 2 268.9281 215.2367 30.24 0.1144 1741 +1743 2 269.6191 214.3261 30.24 0.1144 1742 +1744 2 270.4416 213.5436 30.24 0.1271 1743 +1745 2 271.2252 212.7428 29.9785 0.1652 1744 +1746 2 272.177 212.2921 29.136 0.2161 1745 +1747 2 273.265 212.021 29.12 0.2415 1746 +1748 2 274.3026 211.5588 29.12 0.2415 1747 +1749 2 275.4409 211.4387 29.12 0.2288 1748 +1750 2 276.5826 211.4238 29.12 0.2288 1749 +1751 2 277.7152 211.5805 29.12 0.2161 1750 +1752 2 278.85 211.6892 29.12 0.2034 1751 +1753 2 279.6588 212.3001 28.2528 0.1907 1752 +1754 2 280.4493 212.8252 27.0959 0.1907 1753 +1755 2 281.5338 213.1215 26.8976 0.1907 1754 +1756 2 282.6058 213.4693 27.16 0.1907 1755 +1757 2 283.6651 213.8868 27.16 0.1907 1756 +1758 2 284.7794 214.0424 27.16 0.1907 1757 +1759 2 285.7735 214.1568 25.9151 0.2034 1758 +1760 2 286.8855 214.2106 25.48 0.2034 1759 +1761 2 287.7686 214.8226 24.9452 0.1907 1760 +1762 2 288.8451 214.8432 24.2466 0.178 1761 +1763 2 289.7226 214.5046 23.2562 0.1907 1762 +1764 2 290.7522 214.2815 22.8841 0.2161 1763 +1765 2 291.8573 214.508 22.68 0.2034 1764 +1766 2 292.9544 214.8169 22.68 0.1652 1765 +1767 2 294.0961 214.8432 22.68 0.1398 1766 +1768 2 295.2321 214.754 22.68 0.1398 1767 +1769 2 296.3601 214.8009 22.68 0.1652 1768 +1770 2 297.4743 214.9576 22.68 0.178 1769 +1771 2 298.5909 214.7757 22.4 0.1907 1770 +1772 2 299.7108 214.8432 22.1388 0.1907 1771 +1773 2 300.8548 214.8432 22.12 0.178 1772 +1774 2 301.9988 214.8432 22.12 0.1652 1773 +1775 2 303.1291 214.8432 21.8492 0.1525 1774 +1776 2 303.9139 214.0561 21.84 0.1525 1775 +1777 2 304.6564 213.2553 21.84 0.1525 1776 +1778 2 305.7912 213.1272 21.84 0.1652 1777 +1779 3 240.9744 238.9724 35.8481 0.1907 1 +1780 3 241.8393 239.3534 34.4294 0.2288 1779 +1781 3 242.6127 239.6783 32.5332 0.3305 1780 +1782 3 243.4649 240.3967 31.9152 0.3813 1781 +1783 3 244.3939 241.0648 31.8844 0.3813 1782 +1784 3 245.2622 241.7936 31.7251 0.3051 1783 +1785 3 245.9314 242.7065 31.5266 0.2796 1784 +1786 3 246.5137 243.6457 32.0214 0.2924 1785 +1787 3 247.2344 244.4511 32.8115 0.3178 1786 +1788 3 248.105 245.1821 32.8485 0.3178 1787 +1789 3 248.9596 245.8227 32.0754 0.2924 1788 +1790 3 249.7638 246.3535 30.6043 0.3051 1789 +1791 3 250.6801 246.8683 29.7587 0.3305 1790 +1792 3 251.5267 247.6177 29.6792 0.3813 1791 +1793 3 252.1502 248.5763 29.675 0.394 1792 +1794 3 252.6856 249.583 29.652 0.394 1793 +1795 3 253.1294 250.6332 29.5142 0.394 1794 +1796 3 253.6648 251.6251 29.0752 0.4195 1795 +1797 3 254.2609 252.5712 28.5202 0.4322 1796 +1798 3 254.9175 253.4829 28.0885 0.4195 1797 +1799 3 255.652 254.3123 27.4582 0.3813 1798 +1800 3 256.4162 255.1589 27.2401 0.3305 1799 +1801 3 256.9573 256.129 26.747 0.2796 1800 +1802 3 257.5567 257.0808 26.8142 0.2415 1801 +1803 3 258.4319 257.5945 26.4874 0.2796 1802 +1804 3 259.4752 257.6917 25.3949 0.3432 1803 +1805 3 260.8526 258.0429 26.038 0.1144 1804 +1806 3 261.992 258.0933 26.2035 0.1144 1805 +1807 3 263.1314 258.1299 26.297 0.1271 1806 +1808 3 264.256 258.3198 26.341 0.1398 1807 +1809 3 265.3119 258.7476 26.4592 0.178 1808 +1810 3 266.409 258.9009 26.8358 0.2161 1809 +1811 3 267.4958 258.6298 26.4174 0.2669 1810 +1812 3 268.6341 258.6584 26.4706 0.2669 1811 +1813 3 269.7438 258.8666 26.6 0.2415 1812 +1814 3 270.8637 259.0943 26.6 0.2034 1813 +1815 3 271.9997 259.1549 26.542 0.1907 1814 +1816 3 273.0785 259.5095 26.32 0.178 1815 +1817 3 274.1859 259.7955 26.32 0.1652 1816 +1818 3 275.1755 260.3458 26.32 0.1652 1817 +1819 3 276.2302 260.7233 26.255 0.178 1818 +1820 3 277.1615 261.3651 25.8807 0.2034 1819 +1821 3 278.2631 261.65 25.76 0.2161 1820 +1822 3 279.4003 261.7701 25.7351 0.2415 1821 +1823 3 280.4665 262.1144 25.48 0.2288 1822 +1824 3 281.5292 262.5057 25.48 0.2034 1823 +1825 3 282.5508 262.9987 25.366 0.1525 1824 +1826 3 283.6697 263.12 24.9897 0.1271 1825 +1827 3 284.7942 263.12 24.64 0.1144 1826 +1828 3 285.9359 263.1589 24.64 0.1144 1827 +1829 3 287.0662 263.2344 24.3919 0.1398 1828 +1830 3 288.1953 263.2882 24.08 0.178 1829 +1831 3 289.289 263.6062 24.071 0.2288 1830 +1832 3 290.2294 264.1485 23.4178 0.2415 1831 +1833 3 291.1457 264.7067 22.5285 0.2288 1832 +1834 3 292.0746 265.2284 21.5891 0.1907 1833 +1835 3 293.1832 265.4995 21.56 0.1525 1834 +1836 3 294.2013 265.8553 20.7606 0.1271 1835 +1837 3 295.2241 266.2809 20.5058 0.1144 1836 +1838 3 296.3143 266.5817 20.44 0.1144 1837 +1839 3 297.2741 267.1423 20.2667 0.1144 1838 +1840 3 298.3575 267.4672 20.16 0.1144 1839 +1841 3 298.8128 267.8127 18.4341 0.1144 1840 +1842 3 299.3413 268.1765 17.0419 0.1144 1841 +1843 3 300.4144 268.538 16.8 0.1144 1842 +1844 3 301.4932 268.6936 17.1382 0.1144 1843 +1845 3 302.1167 268.7496 19.276 0.1144 1844 +1846 3 303.2115 269.0608 19.3351 0.1144 1845 +1847 3 304.2262 269.4063 20.0796 0.1144 1846 +1848 3 305.3496 269.5424 20.2199 0.1144 1847 +1849 3 306.4787 269.6408 20.4386 0.1144 1848 +1850 3 307.482 269.7415 19.6 0.1398 1849 +1851 3 308.5276 270.1567 19.7602 0.1652 1850 +1852 3 309.6488 270.3604 19.88 0.1907 1851 +1853 3 310.7779 270.548 19.88 0.178 1852 +1854 3 311.891 270.3318 20.1359 0.1907 1853 +1855 3 312.9732 269.9634 20.16 0.2415 1854 +1856 3 314.0989 269.8582 20.16 0.2924 1855 +1857 3 315.2349 269.7552 20.16 0.2924 1856 +1858 3 316.3492 269.9611 20.16 0.2542 1857 +1859 3 317.4589 270.1956 20.16 0.2542 1858 +1860 3 318.5239 270.5606 20.16 0.2796 1859 +1861 3 319.51 271.1188 19.934 0.2669 1860 +1862 3 320.5465 271.573 19.88 0.2288 1861 +1863 3 321.5258 272.1462 19.88 0.2034 1862 +1864 3 322.5428 272.6518 19.88 0.2161 1863 +1865 3 323.625 272.9618 19.88 0.2288 1864 +1866 3 324.7564 273.0888 19.88 0.2161 1865 +1867 3 325.8798 273.3039 19.88 0.2034 1866 +1868 3 326.9769 273.6276 19.88 0.1652 1867 +1869 3 328.0706 273.9617 19.88 0.1398 1868 +1870 3 329.1974 274.1024 19.88 0.1144 1869 +1871 3 330.3243 274.1745 20.1183 0.1144 1870 +1872 3 331.4019 274.3026 20.72 0.1144 1871 +1873 3 332.5276 274.1848 20.4565 0.1398 1872 +1874 3 333.5938 273.9891 19.88 0.1907 1873 +1875 3 334.7264 273.8736 19.7537 0.2669 1874 +1876 3 335.8452 273.9811 19.2934 0.2924 1875 +1877 3 336.9217 274.258 18.8513 0.2924 1876 +1878 3 338.0326 274.528 18.76 0.2542 1877 +1879 3 339.0576 274.981 18.5517 0.2415 1878 +1880 3 340.0574 275.5061 18.3386 0.2034 1879 +1881 3 341.0813 275.9923 18.2 0.178 1880 +1882 3 342.2127 276.0106 18.2 0.1652 1881 +1883 3 343.3384 275.8241 18.114 0.178 1882 +1884 3 344.4607 275.966 17.92 0.1907 1883 +1885 3 345.5486 276.3183 17.9068 0.1907 1884 +1886 3 346.5862 276.7565 17.64 0.1907 1885 +1887 3 347.5278 277.3994 17.5619 0.178 1886 +1888 3 348.5882 277.7632 17.36 0.1652 1887 +1889 3 349.7322 277.7632 17.36 0.1525 1888 +1890 3 350.8202 277.8902 16.8622 0.1525 1889 +1891 3 351.8967 278.2448 16.8 0.1525 1890 +1892 3 353.0373 278.3295 16.8 0.1525 1891 +1893 3 354.1721 278.3352 16.52 0.1525 1892 +1894 3 355.3058 278.2219 16.5508 0.1398 1893 +1895 3 356.4429 278.2208 16.8 0.1271 1894 +1896 3 357.5618 278.0675 17.057 0.1144 1895 +1897 3 358.7001 277.992 17.08 0.1144 1896 +1898 3 359.8383 277.9451 17.08 0.1271 1897 +1899 3 360.8233 277.5596 16.8179 0.1525 1898 +1900 3 361.5452 277.3056 18.5954 0.178 1899 +1901 3 362.6183 277.42 19.0509 0.178 1900 +1902 3 363.5998 277.3502 19.8408 0.1652 1901 +1903 3 364.7415 277.3056 19.88 0.1525 1902 +1904 3 365.8626 277.3056 20.2392 0.1525 1903 +1905 3 366.9826 277.3056 20.72 0.1398 1904 +1906 3 368.1266 277.3056 20.72 0.1271 1905 +1907 3 369.2706 277.309 20.72 0.1271 1906 +1908 3 370.402 277.436 20.72 0.1652 1907 +1909 3 371.5117 277.6911 20.72 0.2034 1908 +1910 3 372.4967 278.1728 20.72 0.2161 1909 +1911 3 373.4805 278.6304 20.72 0.178 1910 +1912 3 374.5262 278.9552 20.72 0.1398 1911 +1913 3 375.494 279.4563 20.72 0.1398 1912 +1914 3 376.622 279.5398 20.72 0.1652 1913 +1915 3 377.6905 279.9151 20.72 0.1907 1914 +1916 3 378.4524 280.6232 20.72 0.1652 1915 +1917 3 379.4385 281.1128 20.5556 0.1398 1916 +1918 3 380.5527 281.1952 20.6713 0.1144 1917 +1919 3 381.6956 281.2021 20.7138 0.1144 1918 +1920 3 382.62 281.5098 19.4432 0.1271 1919 +1921 3 383.661 281.8072 19.32 0.1398 1920 +1922 3 384.6689 282.2603 19.32 0.1652 1921 +1923 3 385.663 282.7568 19.32 0.178 1922 +1924 3 386.7978 282.8094 19.1024 0.1907 1923 +1925 3 387.5403 283.5198 18.7415 0.178 1924 +1926 3 388.428 283.823 17.6638 0.1652 1925 +1927 3 389.4988 283.5759 17.9186 0.1525 1926 +1928 3 390.5765 283.3688 18.3478 0.1652 1927 +1929 3 391.7022 283.3688 18.76 0.2034 1928 +1930 3 392.4103 283.3802 17.1839 0.2669 1929 +1931 3 393.5268 283.4832 17.0579 0.3051 1930 +1932 3 394.6262 283.6926 16.8 0.2796 1931 +1933 3 395.7691 283.712 16.8 0.2161 1932 +1934 3 396.9039 283.617 16.7838 0.1652 1933 +1935 3 398.0376 283.712 16.6628 0.1525 1934 +1936 3 399.1588 283.5976 17.0492 0.1398 1935 +1937 3 400.265 283.4363 17.08 0.1271 1936 +1938 3 401.3793 283.2361 17.08 0.1271 1937 +1939 3 402.5187 283.1377 17.08 0.1398 1938 +1940 3 403.6432 283.0256 17.3687 0.1652 1939 +1941 3 404.7472 283.14 17.92 0.1652 1940 +1942 3 259.243 257.5876 23.8 0.2288 1804 +1943 3 259.3448 258.7236 23.8 0.2796 1942 +1944 3 259.3654 259.8619 23.5942 0.2669 1943 +1945 3 259.4569 260.999 23.52 0.2415 1944 +1946 3 259.7509 261.8959 22.96 0.2542 1945 +1947 3 260.5552 262.5572 22.12 0.2924 1946 +1948 3 261.2496 263.4655 22.12 0.3432 1947 +1949 3 261.936 264.3807 22.12 0.3432 1948 +1950 3 262.5549 265.3005 21.5533 0.3178 1949 +1951 3 263.0056 266.1894 20.4375 0.2669 1950 +1952 3 263.2207 267.1457 19.1559 0.2542 1951 +1953 3 264.0009 267.9591 19.04 0.2415 1952 +1954 3 264.7136 268.8354 18.7194 0.2288 1953 +1955 3 265.3405 269.5264 18.2 0.2161 1954 +1956 3 266.0498 270.2174 17.8942 0.2288 1955 +1957 3 266.7007 271.0113 17.36 0.2542 1956 +1958 3 267.4924 271.8258 17.36 0.2415 1957 +1959 3 268.1273 272.749 17.36 0.2034 1958 +1960 3 268.1536 273.8461 16.7597 0.1525 1959 +1961 3 268.1536 274.9741 16.2963 0.1271 1960 +1962 3 268.1925 276.0037 15.2967 0.1144 1961 +1963 3 269.2976 276.0472 15.12 0.1144 1962 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc new file mode 100644 index 0000000..cd1d585 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc @@ -0,0 +1,2194 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/neuron tracing and reconstruction/vaa3d/vaa3d_bin_msvc_64bit_v2921_a/vaa3d_bin_msvc_64bit_v2921_a/new 168053.04.01.01.swc +# id,type,x,y,z,r,pid +1 1 415.6095 417.7339 47.8951 6.2366 -1 +2 4 413.4633 416.9525 48.2236 0.1144 1 +3 4 412.3903 416.5624 48.3879 0.1652 2 +4 4 411.3172 416.1712 48.552 0.2542 3 +5 4 410.2441 415.7811 48.7166 0.3813 4 +6 4 409.1001 415.7559 48.72 0.4576 5 +7 4 409.1871 414.7286 47.5728 0.2587 6 +8 4 408.9468 413.7368 46.8028 0.2501 7 +9 4 408.4984 412.7644 46.6435 0.2908 8 +10 4 408.6242 411.7382 45.6862 0.3458 9 +11 4 409.0727 410.9088 44.2305 0.3686 10 +12 4 409.8048 410.1068 43.4174 0.3514 11 +13 4 410.4535 409.2797 43.8572 0.3085 12 +14 4 411.0884 408.408 44.1526 0.2746 13 +15 4 411.6181 407.415 43.7422 0.2852 14 +16 4 412.0162 406.3522 43.4109 0.3197 15 +17 4 412.4715 405.3181 43.0052 0.3672 16 +18 4 413.0721 404.4749 41.925 0.4006 17 +19 4 413.5045 403.538 40.7725 0.3955 18 +20 4 413.9804 402.5095 40.8229 0.3338 19 +21 4 414.533 401.5509 40.1475 0.2932 20 +22 4 415.3326 400.9068 38.9242 0.3176 21 +23 4 416.3394 400.972 37.6132 0.572 22 +24 4 416.9869 400.3554 39.8726 0.3938 23 +25 4 417.7831 400.1895 41.337 0.3185 24 +26 4 418.8962 400.0431 41.5464 0.2855 25 +27 4 419.9006 399.5306 41.4324 0.2954 26 +28 4 420.7186 398.787 40.8402 0.3374 27 +29 4 420.6717 397.6967 40.549 0.3432 28 +30 4 420.6763 396.5539 40.5409 0.3432 29 +31 4 420.4795 395.4293 40.5177 0.3432 30 +32 4 420.2175 394.3322 40.0576 0.3926 31 +33 4 420.1672 393.2317 39.3039 0.4188 32 +34 4 420.0779 392.1106 38.7923 0.4195 33 +35 4 420.1958 390.9849 39.1642 0.3822 34 +36 4 420.1546 389.8455 39.3565 0.3316 35 +37 4 420.0539 388.7209 39.8135 0.2806 36 +38 4 419.8549 387.6101 40.2632 0.2297 37 +39 4 419.848 386.4718 40.5278 0.2545 38 +40 4 420.2507 385.4136 40.178 0.3079 39 +41 4 420.4795 384.4206 38.9511 0.3813 40 +42 4 420.9943 383.4002 38.9544 0.3824 41 +43 4 421.4084 382.366 39.0348 0.394 42 +44 4 421.8683 381.5972 37.5304 0.3957 43 +45 4 422.6108 380.7655 38.134 0.3996 44 +46 4 423.2708 379.856 38.1679 0.3475 45 +47 4 423.6724 378.8081 37.8428 0.3077 46 +48 4 424.2261 377.8289 38.281 0.283 47 +49 4 424.6448 376.8485 38.7008 0.2885 48 +50 4 424.6322 375.7262 38.1615 0.2701 49 +51 4 424.7672 374.6154 37.7213 0.259 50 +52 4 425.3072 373.6853 37.2333 0.2619 51 +53 4 426.116 372.9177 36.7326 0.2598 52 +54 4 426.8939 372.0929 36.4652 0.2607 53 +55 4 427.6169 371.2269 36.2782 0.2477 54 +56 4 428.1729 370.2499 36.568 0.2482 55 +57 4 428.301 369.1997 37.119 0.268 56 +58 4 428.3296 368.0866 37.1496 0.2796 57 +59 4 428.476 366.9975 37.5558 0.2646 58 +60 4 428.4921 365.9404 38.614 0.2382 59 +61 4 428.6797 364.9795 38.04 0.2378 60 +62 4 428.9897 363.9556 38.1763 0.2415 61 +63 4 429.5823 362.9992 38.2914 0.2415 62 +64 4 430.096 362.2213 36.759 0.2418 63 +65 4 430.3202 361.1105 36.3874 0.2551 64 +66 4 430.7183 360.0397 36.2569 0.2796 65 +67 4 430.8579 358.9197 36.0772 0.2811 66 +68 4 430.525 357.8295 35.9792 0.2924 67 +69 4 430.2115 356.7541 35.4085 0.2942 68 +70 4 429.9884 355.6582 35.2243 0.3032 69 +71 4 429.9575 354.592 35.8677 0.2844 70 +72 4 429.6738 353.5406 35.5443 0.2442 71 +73 4 429.8992 352.4286 35.8708 0.2127 72 +74 4 430.1532 351.327 36.101 0.2107 73 +75 4 430.3842 350.2345 35.5944 0.2401 74 +76 4 430.6085 349.1705 34.858 0.271 75 +77 4 430.5833 348.0357 34.8202 0.2796 76 +78 4 430.4552 346.91 34.9826 0.2749 77 +79 4 430.1429 345.8644 35.2422 0.2669 78 +80 4 429.6887 344.8828 35.9436 0.2669 79 +81 4 429.4027 343.7823 35.9912 0.2617 80 +82 4 429.3283 342.644 35.9752 0.2488 81 +83 4 429.2654 341.5092 35.7739 0.2415 82 +84 4 428.9542 340.4315 35.8243 0.2476 83 +85 4 428.5435 339.3756 35.9411 0.2542 84 +86 4 428.2964 338.2659 35.7216 0.241 85 +87 4 428.253 337.1345 35.7787 0.2155 86 +88 4 428.1935 336.002 35.887 0.2034 87 +89 4 428.047 334.8694 35.7493 0.2102 88 +90 4 428.1168 333.7654 35.2537 0.223 89 +91 4 428.6431 332.8171 34.7704 0.2288 90 +92 4 429.3054 331.8961 34.8337 0.2288 91 +93 4 429.9449 330.9512 34.9664 0.2207 92 +94 4 430.3202 329.8987 34.8869 0.1989 93 +95 4 430.4174 328.7684 34.5817 0.1731 94 +96 4 430.6279 327.6588 34.2415 0.1564 95 +97 4 430.7926 326.5354 33.9646 0.1525 96 +98 4 430.9494 325.4142 33.5664 0.1436 97 +99 4 431.0912 324.2851 33.5502 0.1398 98 +100 4 431.0478 323.1537 33.8419 0.1398 99 +101 4 431.0958 322.02 33.7761 0.1683 100 +102 4 431.3578 320.9114 33.7848 0.2067 101 +103 4 431.8943 319.9127 33.9287 0.2647 102 +104 4 432.4148 318.9209 33.4818 0.3095 103 +105 4 432.9239 317.9176 33.7086 0.3281 104 +106 4 433.3358 316.8571 33.9564 0.3305 105 +107 4 433.4238 315.7566 34.571 0.32 106 +108 4 433.3461 314.6229 34.6052 0.3283 107 +109 4 433.2431 313.488 34.3664 0.3305 108 +110 4 433.0887 312.3589 34.5268 0.3517 109 +111 4 432.8175 311.2549 34.7973 0.3453 110 +112 4 432.5212 310.1636 35.2173 0.3218 111 +113 4 432.3656 309.0573 35.8081 0.2853 112 +114 4 432.0648 308.1101 34.6562 0.3042 113 +115 4 431.8589 307.0118 35.1266 0.3426 114 +116 4 431.6495 305.8873 35.1862 0.3808 115 +117 4 431.0535 304.9126 35.303 0.3813 116 +118 4 430.7801 303.8086 35.5578 0.3683 117 +119 4 430.2939 302.7882 35.1344 0.3556 118 +120 4 430.0639 301.6831 34.7032 0.3443 119 +121 4 430.0937 300.5505 34.3185 0.3686 120 +122 4 430.1097 299.4168 34.0116 0.3661 121 +123 4 430.2573 298.3014 34.214 0.3355 122 +124 4 430.7995 297.3164 33.9262 0.2754 123 +125 4 430.8773 296.1953 33.906 0.2567 124 +126 4 430.5833 295.1051 34.3484 0.2754 125 +127 4 430.3225 294.0137 34.8872 0.3123 126 +128 4 430.0273 292.9304 35.1792 0.3354 127 +129 4 429.8694 291.8069 35.0829 0.3377 128 +130 4 429.8408 290.6652 35.1207 0.3305 129 +131 4 429.7127 289.5327 35.0314 0.3249 130 +132 4 429.5125 288.4241 35.3021 0.3178 131 +133 4 429.3077 287.3534 36.1228 0.312 132 +134 4 429.3672 286.3329 36.2785 0.3111 133 +135 4 429.8305 285.3182 35.6964 0.3178 134 +136 4 430.2378 284.2783 35.8817 0.324 135 +137 4 430.5764 283.2144 36.4549 0.3305 136 +138 4 430.9356 282.29 35.7034 0.3378 137 +139 4 431.4768 281.4068 34.9874 0.3272 138 +140 4 432.1952 280.534 35.2635 0.2932 139 +141 4 432.9113 279.6497 35.4343 0.2627 140 +142 4 433.6607 278.7928 35.6118 0.2629 141 +143 4 434.4203 278.0069 36.3698 0.2845 142 +144 4 435.3046 277.3308 36.4988 0.2924 143 +145 4 436.1237 276.7164 35.4046 0.2924 144 +146 4 436.9531 276.1078 34.1916 0.2924 145 +147 4 437.683 275.4283 35.1582 0.2924 146 +148 4 437.8969 274.3449 35.6446 0.2439 147 +149 4 438.4952 273.416 35.0 0.1144 148 +150 4 415.304 399.582 36.0962 0.321 23 +151 4 414.6165 398.7 35.6356 0.286 150 +152 4 414.1074 397.7013 35.1806 0.2956 151 +153 4 413.6109 396.7049 34.594 0.3312 152 +154 4 413.1922 396.0082 32.8079 0.3432 153 +155 4 412.9577 395.0278 32.405 0.3337 154 +156 4 413.1442 393.9204 32.4181 0.3113 155 +157 4 413.6361 392.9057 32.7368 0.3051 156 +158 4 414.4129 392.3119 34.0194 0.3051 157 +159 4 415.3143 391.8303 33.3642 0.3199 158 +160 4 415.7754 390.9952 32.1745 0.3332 159 +161 4 415.4756 389.9232 31.5952 0.3367 160 +162 4 414.9837 388.9348 31.0271 0.3075 161 +163 4 414.3968 388.0551 30.0538 0.2597 162 +164 4 414.0822 387.061 29.3129 0.2108 163 +165 4 414.4048 386.1812 27.8964 0.2034 164 +166 4 414.4449 385.3106 26.6983 0.2496 165 +167 4 413.7802 384.6139 25.3638 0.3076 166 +168 4 413.6818 383.6255 25.338 0.3634 167 +169 4 414.3305 382.7652 26.1512 0.3324 168 +170 4 414.3568 381.6384 26.04 0.2288 169 +171 4 408.0202 415.4951 48.7203 0.483 6 +172 4 406.8808 415.3944 48.722 0.5084 171 +173 4 405.8214 414.9608 48.7309 0.5212 172 +174 4 404.8971 414.287 48.771 0.5466 173 +175 4 404.0402 413.532 48.9317 0.5212 174 +176 4 403.0941 412.952 49.6079 0.4576 175 +177 4 402.1812 412.4841 49.8131 0.4069 176 +178 4 401.1688 411.951 49.812 0.4195 177 +179 4 400.2009 411.3435 49.6801 0.394 178 +180 4 399.3876 410.5873 49.0104 0.3686 179 +181 4 398.5925 409.7682 48.8412 0.3559 180 +182 4 397.8649 408.8988 49.2358 0.3432 181 +183 4 397.111 408.0671 49.7594 0.3051 182 +184 4 396.0185 407.7273 49.6936 0.3178 183 +185 4 394.9077 407.7296 49.0249 0.3686 184 +186 4 393.7648 407.7754 48.9742 0.4449 185 +187 4 392.67 407.9813 49.4808 0.4299 186 +188 4 391.5832 407.9538 49.0952 0.3868 187 +189 4 390.6016 407.518 48.193 0.3358 188 +190 4 389.7093 406.8533 47.6756 0.3001 189 +191 4 388.8616 406.0868 47.6003 0.3025 190 +192 4 387.9613 405.3878 47.5933 0.343 191 +193 4 386.9763 404.8055 47.5619 0.4065 192 +194 4 385.9593 404.2965 47.3673 0.455 193 +195 4 384.9697 403.7679 46.8983 0.4703 194 +196 4 384.0911 403.0632 46.5136 0.4602 195 +197 4 383.2732 402.2636 46.4439 0.4399 196 +198 4 382.4655 401.4559 46.3336 0.4272 197 +199 4 381.6578 400.6494 46.2862 0.4303 198 +200 4 380.8502 399.844 46.48 0.4576 199 +201 4 380.4235 399.3956 45.3678 0.3814 200 +202 4 379.6467 398.557 45.3474 0.2288 201 +203 4 379.236 398.287 46.4797 0.3432 202 +204 4 379.2497 398.8911 48.2451 0.2529 203 +205 4 378.5096 398.4632 50.0976 0.2446 204 +206 4 377.7866 397.8855 51.7076 0.2687 205 +207 4 376.8061 397.4702 52.6896 0.2796 206 +208 4 375.7102 397.2128 53.1577 0.2775 207 +209 4 374.6154 396.8982 53.312 0.269 208 +210 4 373.5995 396.3868 53.606 0.282 209 +211 4 372.5733 395.9018 53.8331 0.295 210 +212 4 371.482 395.5998 54.1478 0.3051 211 +213 4 370.4398 395.228 54.8498 0.2992 212 +214 4 369.3827 394.8676 55.4196 0.2796 213 +215 4 368.2753 394.7292 55.923 0.2764 214 +216 4 367.1897 394.9546 56.4553 0.2706 215 +217 4 366.1647 395.4236 56.9215 0.2648 216 +218 4 365.1099 395.7737 57.5506 0.1946 217 +219 4 364.0437 396.0436 58.2845 0.1608 218 +220 4 363.0118 396.4841 58.7518 0.275 219 +221 4 362.0474 397.0835 59.0744 0.2843 220 +222 4 361.1105 397.6887 59.6562 0.2503 221 +223 4 360.1312 397.9393 60.5413 0.2065 222 +224 4 359.2755 397.3627 61.3416 0.1965 223 +225 4 358.7241 396.404 62.0234 0.2094 224 +226 4 358.1853 395.4282 62.5694 0.2282 225 +227 4 357.3948 394.6754 63.0974 0.2542 226 +228 4 356.4326 394.1595 63.922 0.2801 227 +229 4 355.6673 393.4136 64.3871 0.2924 228 +230 4 355.1685 392.3954 64.1855 0.2718 229 +231 4 354.8127 391.3796 64.6596 0.2182 230 +232 4 354.3185 390.4632 65.721 0.1674 231 +233 4 353.5864 390.0582 67.3389 0.1441 232 +234 4 352.7455 390.4621 68.5376 0.1753 233 +235 4 351.8395 391.1027 69.2101 0.2267 234 +236 4 350.9838 391.8257 69.7435 0.2783 235 +237 4 350.1475 392.5945 69.6993 0.2718 236 +238 4 349.8341 393.655 69.8524 0.2115 237 +239 4 348.8834 394.1778 69.7253 0.1414 238 +240 4 347.8744 394.7063 69.4823 0.1273 239 +241 4 346.8848 395.2806 69.5565 0.1522 240 +242 4 345.7717 395.3756 70.1296 0.1906 241 +243 4 344.6597 395.5838 70.5502 0.216 242 +244 4 343.5352 395.5014 71.0214 0.2161 243 +245 4 342.4358 395.3481 71.6937 0.2034 244 +246 4 341.3467 395.0301 72.065 0.1907 245 +247 4 340.34 394.68 73.08 0.2288 246 +248 4 378.3826 397.5995 46.4792 0.3676 203 +249 4 377.4983 396.8742 46.4766 0.3807 248 +250 4 376.678 396.0768 46.4666 0.3692 249 +251 4 375.9321 395.2097 46.4117 0.3686 250 +252 4 375.1107 394.4249 46.0888 0.3686 251 +253 4 374.0949 393.9444 45.5946 0.3933 252 +254 4 373.0355 393.5349 45.2698 0.394 253 +255 4 372.0299 393.0212 44.8274 0.394 254 +256 4 371.0793 392.3989 44.4973 0.3816 255 +257 4 370.0588 391.8909 44.7177 0.3688 256 +258 4 368.9377 391.6793 44.5665 0.3812 257 +259 4 367.8246 391.4413 44.2938 0.3939 258 +260 4 366.8328 390.8716 44.2406 0.457 259 +261 4 365.8924 390.2195 44.2322 0.4828 260 +262 4 364.9394 389.5881 44.2014 0.5082 261 +263 4 363.9865 388.9577 44.0605 0.4832 262 +264 4 362.9832 388.4544 43.5207 0.4704 263 +265 4 361.9891 387.9018 43.2281 0.4577 264 +266 4 360.9938 387.3424 43.4375 0.4576 265 +267 4 359.9871 386.839 43.937 0.445 266 +268 4 358.9494 386.3597 44.0152 0.4196 267 +269 4 357.9336 385.9009 43.3874 0.3941 268 +270 4 356.8044 385.7499 43.1214 0.3813 269 +271 4 355.6616 385.6973 43.1144 0.394 270 +272 4 354.5588 385.3953 43.0825 0.394 271 +273 4 353.488 384.9983 42.901 0.394 272 +274 4 352.5522 384.408 42.1901 0.3686 273 +275 4 351.8544 383.5054 42.0039 0.3686 274 +276 4 351.0364 382.7046 41.9941 0.3686 275 +277 4 350.0514 382.1235 41.9692 0.3813 276 +278 4 348.9372 381.8729 41.7981 0.3686 277 +279 4 347.8915 381.5148 41.0754 0.3432 278 +280 4 346.8608 381.0264 40.8797 0.3051 279 +281 4 345.9639 380.3239 40.8766 0.2648 280 +282 4 345.0224 379.6764 40.8626 0.25 281 +283 4 344.0122 379.1399 40.7929 0.2245 282 +284 4 343.0581 378.5313 40.5518 0.2034 283 +285 4 342.2688 377.7213 40.1178 0.2104 284 +286 4 341.4279 376.9674 39.8028 0.2513 285 +287 4 340.4212 376.4286 39.76 0.2949 286 +288 4 339.3562 376.0111 39.76 0.3001 287 +289 4 338.2854 375.6107 39.76 0.2722 288 +290 4 337.2489 375.137 39.76 0.2466 289 +291 4 336.3589 374.4289 39.76 0.2749 290 +292 4 335.637 373.5412 39.76 0.3105 291 +293 4 334.9495 372.6283 39.76 0.3278 292 +294 4 334.183 371.7806 39.7594 0.3178 293 +295 4 333.3158 371.0381 39.7572 0.3288 294 +296 4 332.3549 370.4192 39.7446 0.3769 295 +297 4 331.331 369.9113 39.6673 0.4124 296 +298 4 330.3048 369.4239 39.3896 0.4237 297 +299 4 329.329 368.8553 38.9385 0.3883 298 +300 4 328.3875 368.2181 38.6702 0.36 299 +301 4 327.4757 367.5283 38.64 0.3247 300 +302 4 326.6154 366.7756 38.6406 0.2964 301 +303 4 325.7117 366.08 38.6445 0.2639 302 +304 4 324.6924 365.5663 38.6669 0.2572 303 +305 4 323.6216 365.1682 38.7755 0.276 304 +306 4 322.5565 364.7713 39.088 0.3112 305 +307 4 321.5006 364.3663 39.5066 0.3397 306 +308 4 320.4561 363.9178 39.7051 0.3811 307 +309 4 319.51 363.2875 39.6326 0.4356 308 +310 4 318.7321 362.4615 39.3523 0.4863 309 +311 4 318.0572 361.5498 38.985 0.4924 310 +312 4 317.3879 360.6266 38.8388 0.4764 311 +313 4 316.6947 359.7171 38.9099 0.4609 312 +314 4 315.9762 358.8305 39.0729 0.4736 313 +315 4 315.212 357.9919 39.4201 0.4864 314 +316 4 314.417 357.1785 39.6676 0.4957 315 +317 4 313.6425 356.34 39.5324 0.4921 316 +318 4 312.9046 355.4786 39.1768 0.4725 317 +319 4 312.1381 354.6469 38.8032 0.4343 318 +320 4 311.2538 353.9307 38.6481 0.3995 319 +321 4 310.2517 353.3919 38.6378 0.3887 320 +322 4 309.1534 353.0899 38.6254 0.4144 321 +323 4 308.0186 352.9492 38.5529 0.436 322 +324 4 306.91 352.7192 38.3054 0.441 323 +325 4 305.8781 352.2662 37.8907 0.4282 324 +326 4 304.9424 351.6267 37.5911 0.4276 325 +327 4 304.1255 350.8328 37.5203 0.449 326 +328 4 303.4185 349.9336 37.5214 0.4617 327 +329 4 302.7722 348.9909 37.527 0.4662 328 +330 4 302.2025 348.0002 37.5575 0.4617 329 +331 4 301.6842 346.9821 37.6844 0.4745 330 +332 4 301.1019 346.0085 38.0041 0.483 331 +333 4 300.4453 345.0876 38.4062 0.4745 332 +334 4 299.76 344.1758 38.6131 0.4404 333 +335 4 299.0702 343.2641 38.631 0.3896 334 +336 4 298.3644 342.3637 38.598 0.3473 335 +337 4 297.6002 341.5183 38.463 0.3435 336 +338 4 296.7124 340.8228 38.1265 0.3953 337 +339 4 295.7171 340.2851 37.7236 0.4673 338 +340 4 294.6933 339.784 37.5374 0.513 339 +341 4 293.6694 339.2738 37.52 0.5166 340 +342 4 292.681 338.7006 37.52 0.5084 341 +343 4 291.752 338.0348 37.52 0.513 342 +344 4 290.8826 337.2924 37.52 0.5212 343 +345 4 290.0601 336.4973 37.52 0.5074 344 +346 4 289.265 335.6748 37.52 0.4646 345 +347 4 288.5134 334.8133 37.5194 0.4138 346 +348 4 287.8498 333.8833 37.5166 0.372 347 +349 4 287.2206 332.9292 37.5049 0.3559 348 +350 4 286.5079 332.0368 37.4452 0.3606 349 +351 4 285.7312 331.204 37.2263 0.3733 350 +352 4 284.9201 330.4204 36.7702 0.3766 351 +353 4 284.046 329.726 36.1777 0.3734 352 +354 4 283.1034 329.1368 35.5334 0.3909 353 +355 4 282.1161 328.63 34.86 0.4308 354 +356 4 281.1277 328.0981 34.3644 0.4703 355 +357 4 280.169 327.4803 34.1827 0.4703 356 +358 4 279.2367 326.8191 34.16 0.4606 357 +359 4 278.3226 326.1304 34.16 0.4693 358 +360 4 277.4177 325.4302 34.16 0.5182 359 +361 4 276.4808 324.7759 34.16 0.5436 360 +362 4 275.5072 324.1753 34.16 0.5347 361 +363 4 274.5737 323.5221 34.16 0.4859 362 +364 4 273.7786 322.7075 34.16 0.4552 363 +365 4 273.1003 321.7855 34.16 0.4322 364 +366 4 272.4528 320.8428 34.1592 0.4272 365 +367 4 271.7881 319.9127 34.1555 0.4245 366 +368 4 271.0456 319.0456 34.1379 0.4372 367 +369 4 270.1819 318.302 34.0435 0.4398 368 +370 4 269.2244 317.6911 33.7641 0.4219 369 +371 4 268.1856 317.269 33.3589 0.391 370 +372 4 267.0645 317.1317 33.0954 0.3794 371 +373 4 265.9331 317.0367 33.0324 0.3829 372 +374 4 264.9195 316.5745 32.9958 0.3802 373 +375 4 264.0466 315.8412 32.8037 0.388 374 +376 4 263.112 315.2223 32.4044 0.3994 375 +377 4 262.0618 314.7991 32.058 0.4073 376 +378 4 261.0208 314.3415 31.9348 0.3695 377 +379 4 260.1204 313.6562 31.92 0.3432 378 +380 4 259.4283 312.7547 31.92 0.3683 379 +381 4 258.925 311.732 31.92 0.4319 380 +382 4 258.576 310.644 31.92 0.4703 381 +383 4 258.2397 309.5527 31.92 0.4449 382 +384 4 257.7192 308.5437 31.92 0.4003 383 +385 4 256.9813 307.6777 31.9203 0.3749 384 +386 4 256.0901 306.9684 31.9208 0.375 385 +387 4 255.0994 306.3998 31.9236 0.3878 386 +388 4 254.0698 305.9022 31.9413 0.407 387 +389 4 253.062 305.3668 32.048 0.4324 388 +390 4 252.1319 304.7216 32.373 0.4384 389 +391 4 251.2499 304.0134 32.7981 0.4192 390 +392 4 250.3518 303.3144 33.0142 0.3871 391 +393 4 249.432 302.6349 33.0403 0.3686 392 +394 4 248.4917 301.984 33.0408 0.3621 393 +395 4 247.5948 301.2793 33.045 0.3691 394 +396 4 246.913 300.3812 33.073 0.3813 395 +397 4 246.5412 299.3162 33.2626 0.3813 396 +398 4 246.3959 298.1962 33.6736 0.3745 397 +399 4 246.2277 297.0785 34.0158 0.3821 398 +400 4 245.8296 296.018 34.0626 0.4279 399 +401 4 245.2439 295.0468 33.7896 0.478 400 +402 4 244.5723 294.1384 33.353 0.5024 401 +403 4 243.8116 293.2964 33.0775 0.4948 402 +404 4 242.9513 292.5471 32.9596 0.4694 403 +405 4 242.0189 291.8996 32.6813 0.4303 404 +406 4 241.0934 291.2532 32.2445 0.3931 405 +407 4 240.2594 290.4868 31.9768 0.3744 406 +408 4 239.5227 289.6139 31.922 0.3823 407 +409 4 238.8249 288.7078 31.92 0.4077 408 +410 4 238.0904 287.8315 31.92 0.4401 409 +411 4 237.2805 287.0262 31.9197 0.4782 410 +412 4 236.4305 286.2608 31.9192 0.4957 411 +413 4 235.5988 285.4749 31.9164 0.4888 412 +414 4 234.7854 284.6707 31.906 0.4693 413 +415 4 233.9663 283.8722 31.8637 0.4645 414 +416 4 233.114 283.1171 31.6534 0.484 415 +417 4 232.2091 282.4399 31.2385 0.4957 416 +418 4 231.2299 281.8747 30.903 0.4888 417 +419 4 230.1797 281.4274 30.8031 0.4555 418 +420 4 229.134 280.9675 30.7997 0.4253 419 +421 4 228.1502 280.3887 30.7994 0.4057 420 +422 4 227.2796 279.6542 30.7975 0.3871 421 +423 4 226.5726 278.7631 30.7852 0.3607 422 +424 4 225.9 277.8387 30.7269 0.3432 423 +425 4 225.0648 277.0894 30.4416 0.3708 424 +426 4 224.0375 276.6547 30.0476 0.4285 425 +427 4 222.9462 276.3401 30.0675 0.4576 426 +428 4 221.9028 275.9088 30.4612 0.4299 427 +429 4 220.9075 275.3619 30.7292 0.386 428 +430 4 219.9935 274.6836 30.7406 0.3756 429 +431 4 219.3174 273.7912 30.5004 0.3954 430 +432 4 218.9639 272.7319 30.0583 0.3926 431 +433 4 218.6756 271.6359 29.7497 0.3742 432 +434 4 218.1597 270.6292 29.68 0.3615 433 +435 4 217.3692 269.8204 29.68 0.3993 434 +436 4 216.375 269.2782 29.6797 0.4395 435 +437 4 215.358 268.7622 29.6786 0.4595 436 +438 4 214.4645 268.0586 29.6713 0.4555 437 +439 4 213.7633 267.1652 29.6344 0.4671 438 +440 4 213.102 266.2363 29.4742 0.4904 439 +441 4 212.363 265.3851 29.05 0.4957 440 +442 4 211.5565 264.5912 28.6854 0.4658 441 +443 4 210.7317 263.8007 28.5928 0.4149 442 +444 4 209.9251 262.9907 28.6689 0.3566 443 +445 4 209.1186 262.1876 28.9489 0.3154 444 +446 4 208.208 261.5184 29.2177 0.3051 445 +447 4 207.2264 260.9624 28.954 0.3281 446 +448 4 206.2678 260.3938 28.3296 0.3662 447 +449 4 205.316 259.8035 27.764 0.389 448 +450 4 204.387 259.1515 27.4935 0.4018 449 +451 4 203.5393 258.3873 27.4383 0.399 450 +452 4 202.7751 257.5373 27.4187 0.394 451 +453 4 202.0567 256.6484 27.3255 0.3784 452 +454 4 201.3028 255.8007 27.0217 0.3686 453 +455 4 200.4666 255.0342 26.6798 0.3686 454 +456 4 199.5388 254.3856 26.7848 0.3686 455 +457 4 198.6018 253.7381 27.0346 0.3445 456 +458 4 197.7427 253.007 26.7708 0.3062 457 +459 4 196.8904 252.2692 26.2962 0.276 458 +460 4 195.9317 251.6834 25.8591 0.2834 459 +461 4 194.9387 251.148 25.4038 0.3091 460 +462 4 194.099 250.3987 25.2151 0.3433 461 +463 4 193.4184 249.4824 25.1972 0.3559 462 +464 4 192.7949 248.5237 25.1854 0.3644 463 +465 4 192.1577 247.5742 25.1272 0.3772 464 +466 4 191.4129 246.715 24.9248 0.3986 465 +467 4 190.5675 245.9634 24.5428 0.4068 466 +468 4 189.7267 245.2015 24.2012 0.3981 467 +469 4 189.0025 244.3241 24.0878 0.3766 468 +470 4 188.4191 243.3425 24.0755 0.3599 469 +471 4 187.8334 242.361 24.0565 0.3383 470 +472 4 187.06 241.5304 23.9554 0.3305 471 +473 4 186.1368 240.8784 23.6239 0.3394 472 +474 4 185.1907 240.2823 23.0392 0.3521 473 +475 4 184.2687 239.6577 22.4062 0.347 474 +476 4 183.3454 239.0182 21.8744 0.3163 475 +477 4 182.3982 238.4016 21.4458 0.2961 476 +478 4 181.459 237.7621 21.1324 0.3016 477 +479 4 180.625 236.9922 21.2453 0.3327 478 +480 4 179.8185 236.1971 21.6258 0.3525 479 +481 4 178.941 235.4741 21.9047 0.3652 480 +482 4 177.9709 234.8872 22.2057 0.3592 481 +483 4 176.8818 234.6493 22.636 0.3463 482 +484 4 175.7459 234.6138 22.9093 0.3139 483 +485 4 174.6408 234.3587 22.972 0.2851 484 +486 4 173.6649 233.7787 23.0171 0.2898 485 +487 4 172.7863 233.0522 23.2008 0.3227 486 +488 4 171.9089 232.3372 23.5858 0.3709 487 +489 4 171.0383 231.6097 23.9509 0.4117 488 +490 4 170.2055 230.8306 24.1494 0.4297 489 +491 4 169.3967 230.0298 24.4166 0.422 490 +492 4 168.5947 229.2336 24.8441 0.3991 491 +493 4 167.7779 228.4408 25.132 0.3838 492 +494 4 166.9119 227.696 25.1961 0.3813 493 +495 4 165.9486 227.0829 25.2 0.3504 494 +496 4 164.9179 226.5886 25.1997 0.3226 495 +497 4 163.9386 226.0006 25.1994 0.2865 496 +498 4 163.1699 225.1644 25.1975 0.2902 497 +499 4 162.5075 224.2332 25.1877 0.2924 498 +500 4 161.7662 223.3637 25.1462 0.3137 499 +501 4 160.9551 222.5629 24.92 0.3391 500 +502 4 160.1474 221.7724 24.4986 0.3645 501 +503 4 159.3226 220.9899 24.1842 0.3792 502 +504 4 158.4005 220.3184 24.089 0.3813 503 +505 4 157.4052 219.7544 24.08 0.3813 504 +506 4 156.4763 219.0897 24.08 0.3704 505 +507 4 155.6309 218.321 24.08 0.3577 506 +508 4 154.7397 217.6048 24.08 0.3342 507 +509 4 153.7753 216.9905 24.08 0.3087 508 +510 4 152.7686 216.4482 24.0803 0.2831 509 +511 4 151.8202 215.811 24.0811 0.2796 510 +512 4 151.0194 214.9976 24.0853 0.3129 511 +513 4 150.2587 214.1431 24.1032 0.362 512 +514 4 149.4544 213.3308 24.1749 0.4019 513 +515 4 148.5964 212.5838 24.4712 0.4179 514 +516 4 147.727 211.8619 24.8931 0.4084 515 +517 4 146.9365 211.0428 25.1381 0.3621 516 +518 4 146.2307 210.1448 25.0807 0.2887 517 +519 4 145.4665 209.3154 24.6375 0.2345 518 +520 4 144.525 208.7308 23.9929 0.2288 519 +521 4 143.4782 208.2812 23.8067 0.2863 520 +522 4 142.4955 207.7001 23.9106 0.3387 521 +523 4 141.6775 206.9118 23.6776 0.3899 522 +524 4 140.9751 206.0264 23.2506 0.394 523 +525 4 140.3082 205.102 23.0317 0.3823 524 +526 4 139.6904 204.1399 23.0759 0.3578 525 +527 4 139.028 203.2236 23.4875 0.3441 526 +528 4 138.2261 202.4285 23.9173 0.3195 527 +529 4 137.2686 201.8085 24.0394 0.3059 528 +530 4 136.279 201.2365 23.9515 0.2932 529 +531 4 135.3638 200.5729 23.5306 0.3282 530 +532 4 134.5401 199.7859 23.3173 0.3305 531 +533 4 133.8194 198.8981 23.2876 0.3305 532 +534 4 133.1467 197.9898 22.8595 0.2823 533 +535 4 132.5736 197.0346 22.2306 0.2556 534 +536 4 131.8849 196.1308 21.9187 0.2058 535 +537 4 130.9319 195.505 21.9433 0.2034 536 +538 4 130.0019 194.8747 22.4608 0.2034 537 +539 4 129.3052 193.9835 22.8472 0.2651 538 +540 4 128.6371 193.0546 22.8894 0.2793 539 +541 4 128.2092 192.0021 22.5851 0.3169 540 +542 4 127.9427 190.9691 23.571 0.3178 541 +543 4 127.0492 190.309 24.2091 0.4576 542 +544 4 126.3559 189.8857 23.1672 0.3814 543 +545 4 125.5185 189.1124 22.9373 0.3559 544 +546 4 124.7212 188.2932 22.8298 0.3559 545 +547 4 123.9936 187.4318 22.3429 0.3559 546 +548 4 123.2568 186.6573 21.3503 0.3559 547 +549 4 122.3794 185.9606 20.7827 0.3559 548 +550 4 121.5603 185.1633 20.7211 0.394 549 +551 4 120.7561 184.3499 20.72 0.4449 550 +552 4 119.9678 183.5193 20.72 0.4322 551 +553 4 119.2826 182.6041 20.72 0.394 552 +554 4 118.5481 181.7267 20.72 0.3432 553 +555 4 117.7073 180.9511 20.72 0.3686 554 +556 4 116.7715 180.2933 20.72 0.3686 555 +557 4 115.9558 179.4913 20.72 0.3559 556 +558 4 115.3026 178.5521 20.72 0.3178 557 +559 4 114.7718 177.5385 20.72 0.3178 558 +560 4 113.9426 176.7503 20.7206 0.3305 559 +561 4 113.1704 176.2057 20.7239 0.3827 560 +562 4 112.2468 175.5308 20.7393 0.3836 561 +563 4 111.3422 174.8318 20.8261 0.3501 562 +564 4 110.4583 174.1122 21.063 0.312 563 +565 4 109.5664 173.4007 21.2691 0.2632 564 +566 4 108.6763 172.6857 21.4334 0.2017 565 +567 4 107.8196 171.9283 21.4046 0.1586 566 +568 4 106.9002 171.3209 20.7239 0.1416 567 +569 4 105.8424 170.9228 20.4058 0.1622 568 +570 4 104.7627 170.5464 20.3899 0.1765 569 +571 4 103.6407 170.3313 20.4075 0.2009 570 +572 4 102.516 170.194 20.7738 0.2264 571 +573 4 101.4505 169.8257 21.2038 0.2752 572 +574 4 100.4498 169.2754 21.1982 0.303 573 +575 4 99.4651 168.7068 20.8967 0.2934 574 +576 4 98.4155 168.2595 20.7446 0.2453 575 +577 4 97.289 168.0753 20.7354 0.2059 576 +578 4 96.1939 167.7482 20.8124 0.2034 577 +579 4 95.1674 167.2585 21.0865 0.1914 578 +580 4 94.0562 166.9988 20.9818 0.1786 579 +581 4 92.9713 166.6465 20.7757 0.1535 580 +582 4 92.0816 165.9326 20.778 0.1773 581 +583 4 91.1472 165.2863 21.0918 0.2274 582 +584 4 90.2014 164.6433 21.1851 0.2908 583 +585 4 89.3954 163.846 21.5404 0.3172 584 +586 4 88.3424 163.4101 21.7148 0.3178 585 +587 4 87.227 163.2374 21.2702 0.3052 586 +588 4 86.1868 162.7981 20.8211 0.3303 587 +589 4 85.2756 162.1082 20.7228 0.3557 588 +590 4 84.4582 161.3086 20.7175 0.3559 589 +591 4 83.696 160.4552 20.7091 0.2929 590 +592 4 83.4217 159.3455 20.6192 0.2035 591 +593 4 83.7408 158.3296 19.6 0.1144 592 +594 4 112.9716 175.9987 21.6857 0.3463 560 +595 4 112.3254 175.0755 21.84 0.294 594 +596 4 112.0351 173.9818 21.8406 0.2397 595 +597 4 111.7511 172.8744 21.8431 0.2185 596 +598 4 111.0932 171.9581 21.8627 0.2582 597 +599 4 110.3967 171.0532 22.0038 0.3204 598 +600 4 109.939 170.0224 22.3846 0.3521 599 +601 4 109.4909 168.9837 22.787 0.3559 600 +602 4 108.7492 168.1268 22.9446 0.3559 601 +603 4 107.7769 167.5342 22.9639 0.3783 602 +604 4 106.7066 167.1361 22.9849 0.3925 603 +605 4 105.6133 166.8055 23.1213 0.4053 604 +606 4 104.5667 166.3731 23.5024 0.3954 605 +607 4 103.6127 165.7645 23.8829 0.3827 606 +608 4 102.7241 165.0472 23.9728 0.3358 607 +609 4 101.7701 164.418 23.9137 0.2962 608 +610 4 100.76 163.8826 23.9557 0.2694 609 +611 4 99.829 163.2213 24.0495 0.2555 610 +612 4 98.9531 162.4858 24.0951 0.2312 611 +613 4 97.9642 161.916 24.1878 0.2172 612 +614 4 96.8823 161.5969 24.6061 0.2044 613 +615 4 95.7951 161.2857 25.0331 0.2034 614 +616 4 94.9175 160.5684 25.1849 0.1914 615 +617 4 94.1179 159.7504 25.1994 0.2027 616 +618 4 93.2906 158.9599 25.2 0.2154 617 +619 4 92.5872 158.0585 25.2 0.2161 618 +620 4 92.0293 157.0609 25.2006 0.204 619 +621 4 91.4189 156.0931 25.2025 0.1793 620 +622 4 90.652 155.2454 25.2106 0.1658 621 +623 4 89.7715 154.5166 25.2552 0.1409 622 +624 4 88.9659 153.733 25.7701 0.1277 623 +625 4 87.8592 153.7536 26.32 0.1144 624 +626 4 127.3878 189.7118 21.6006 0.2342 543 +627 4 127.7791 188.9911 20.5702 0.1568 626 +628 4 127.977 187.9134 21.2559 0.1217 627 +629 4 128.1051 186.8083 21.7804 0.1144 628 +630 4 128.6794 185.9137 21.8638 0.121 629 +631 4 129.6392 185.8794 21.0445 0.1349 630 +632 4 130.5315 186.4777 20.2124 0.1478 631 +633 4 131.4742 187.0943 19.9343 0.144 632 +634 4 132.4946 187.1309 20.6651 0.1303 633 +635 4 133.2954 186.512 21.8061 0.1173 634 +636 4 133.9818 185.6346 21.8011 0.1144 635 +637 4 134.8513 185.0283 20.8659 0.1144 636 +638 4 135.9129 184.6473 20.5862 0.1144 637 +639 4 136.6863 183.8316 20.683 0.1144 638 +640 4 137.145 182.7883 20.7085 0.1144 639 +641 4 137.2182 181.6523 20.6573 0.1144 640 +642 4 136.3385 180.9911 20.3974 0.1144 641 +643 4 135.4496 181.6672 20.72 0.1144 642 +644 4 346.4764 380.3869 43.5758 0.1526 280 +645 4 346.1401 379.5426 45.2712 0.1271 644 +646 4 345.5555 378.561 45.418 0.1145 645 +647 4 344.6986 377.8209 45.7789 0.1273 646 +648 4 343.6267 377.6069 46.5976 0.1401 647 +649 4 342.5639 377.3553 47.4032 0.1652 648 +650 4 341.7563 376.6631 48.4263 0.1657 649 +651 4 340.8926 375.9401 48.9006 0.1775 650 +652 4 339.8858 375.4539 49.4724 0.1652 651 +653 4 338.8448 375.2549 50.521 0.1646 652 +654 4 337.7809 375.2446 51.5494 0.1538 653 +655 4 336.7067 375.3018 52.498 0.1798 654 +656 4 335.6164 375.5054 53.1698 0.2175 655 +657 4 334.5182 375.82 53.2846 0.2408 656 +658 4 333.3879 375.971 53.3708 0.2259 657 +659 4 332.2542 375.8841 53.5382 0.1885 658 +660 4 331.1445 376.1586 53.6413 0.164 659 +661 4 330.0486 376.4652 53.7569 0.1525 660 +662 4 328.94 376.511 54.3987 0.1525 661 +663 4 327.8418 376.3199 55.0214 0.1506 662 +664 4 326.7184 376.2273 55.4316 0.1374 663 +665 4 325.5847 376.2078 55.2255 0.1246 664 +666 4 324.4853 376.3691 54.565 0.1144 665 +667 4 323.3916 376.6151 54.0952 0.1144 666 +668 4 322.3426 377.059 54.04 0.1178 667 +669 4 321.3324 377.5703 54.0921 0.1376 668 +670 4 320.3829 378.0165 54.5496 0.1834 669 +671 4 319.6828 378.7521 55.2241 0.2432 670 +672 4 318.5948 379.0701 55.1312 0.2669 671 +673 4 317.5755 379.5655 55.1396 0.2571 672 +674 4 316.7004 380.0677 53.9636 0.2542 673 +675 4 315.8458 380.7266 54.3424 0.2757 674 +676 4 315.1228 381.5995 54.5124 0.268 675 +677 4 314.2248 382.1658 53.5601 0.2551 676 +678 4 313.4377 382.9483 52.9217 0.2063 677 +679 4 312.4813 383.5695 52.8906 0.1668 678 +680 4 311.8544 384.0408 54.88 0.1144 679 +681 4 379.3618 398.12 45.3169 0.2171 202 +682 4 379.0438 397.0847 45.0506 0.2155 681 +683 4 379.204 396.0288 44.1857 0.2288 682 +684 4 379.7725 395.1582 43.4168 0.242 683 +685 4 380.5825 394.6011 42.2982 0.2474 684 +686 4 381.3993 394.1721 40.6588 0.2415 685 +687 4 382.3545 393.7099 39.8367 0.2347 686 +688 4 383.431 393.3495 39.5895 0.2219 687 +689 4 384.4595 392.9491 39.004 0.2092 688 +690 4 385.3999 392.4458 37.9982 0.2034 689 +691 4 386.3791 391.9493 37.3512 0.2242 690 +692 4 387.4007 391.4436 37.1232 0.2623 691 +693 4 388.3937 390.9014 36.7441 0.2796 692 +694 4 389.294 390.2344 36.2533 0.2655 693 +695 4 389.9873 389.3638 35.758 0.24 694 +696 4 390.5776 388.4029 35.299 0.2288 695 +697 4 391.3613 387.6158 34.8804 0.2288 696 +698 4 392.3371 387.0564 34.433 0.2215 697 +699 4 393.345 386.5301 34.1835 0.2161 698 +700 4 394.3299 385.9501 34.088 0.2087 699 +701 4 395.3492 385.4616 33.7744 0.2186 700 +702 4 396.3216 384.964 33.0114 0.2441 701 +703 4 397.2483 384.3794 32.2218 0.2931 702 +704 4 398.1486 383.6987 31.9332 0.3256 703 +705 4 399.0215 382.9597 31.9052 0.3227 704 +706 4 399.8188 382.144 31.8102 0.2858 705 +707 4 400.2341 381.1465 31.2612 0.2669 706 +708 4 400.3554 380.1272 30.0684 0.2669 707 +709 4 400.8393 379.1811 29.3429 0.2572 708 +710 4 401.5474 378.2911 29.3877 0.2345 709 +711 4 402.4878 377.6767 29.2006 0.2184 710 +712 4 403.5574 377.8335 28.6961 0.2384 711 +713 4 404.5756 378.3048 28.1753 0.2415 712 +714 4 405.6704 378.2339 27.5688 0.2534 713 +715 4 406.6325 377.6756 26.9805 0.2662 714 +716 4 407.5752 377.0532 26.5255 0.2909 715 +717 4 408.3783 376.2444 26.3754 0.3044 716 +718 4 409.0132 375.2972 26.5356 0.2809 717 +719 4 409.6881 374.3877 26.9416 0.2555 718 +720 4 410.3642 373.4702 26.7484 0.2421 719 +721 4 411.0804 372.5882 26.4272 0.278 720 +722 4 411.8411 371.7348 26.3301 0.3283 721 +723 4 412.5241 370.8173 26.3203 0.3792 722 +724 4 413.151 369.8609 26.3197 0.3934 723 +725 4 413.9667 369.0601 26.3189 0.3818 724 +726 4 414.9768 368.5259 26.3144 0.3445 725 +727 4 416.0591 368.1586 26.2828 0.3186 726 +728 4 417.0738 367.6358 26.1223 0.3302 727 +729 4 417.9432 366.9574 25.3898 0.3305 728 +730 4 418.3802 365.9656 24.5244 0.3305 729 +731 4 418.4272 364.9268 23.3587 0.293 730 +732 4 418.2281 363.8114 22.9908 0.2924 731 +733 4 418.3208 362.672 22.9393 0.2924 732 +734 4 418.7623 361.6184 22.8326 0.267 733 +735 4 419.2154 360.5934 22.265 0.229 734 +736 4 420.0676 359.8315 22.2432 0.1781 735 +737 4 421.1956 359.6782 22.4848 0.1652 736 +738 4 422.136 359.6736 24.08 0.1144 737 +739 4 380.0368 399.0386 46.48 0.4576 200 +740 4 392.4503 408.7638 48.701 0.4322 186 +741 4 391.5546 409.4754 48.6262 0.4068 740 +742 4 390.7446 410.2704 48.274 0.394 741 +743 4 390.1292 410.815 46.3336 0.2555 742 +744 4 389.5457 411.5094 44.688 0.1694 743 +745 4 389.1991 412.4726 43.5781 0.1525 744 +746 4 388.92 413.5411 42.8999 0.1674 745 +747 4 388.6465 414.6211 42.2834 0.178 746 +748 4 388.7552 415.669 41.421 0.1615 747 +749 4 389.3947 416.5498 40.8906 0.144 748 +750 4 390.0983 417.4364 40.5482 0.1578 749 +751 4 390.295 418.4924 39.94 0.2126 750 +752 4 390.0617 419.562 39.2101 0.2958 751 +753 4 389.8558 420.6591 38.6232 0.3664 752 +754 4 389.9679 421.7596 38.0198 0.4112 753 +755 4 390.3271 422.7846 37.1792 0.3796 754 +756 4 390.835 423.7765 36.5828 0.3281 755 +757 4 391.3246 424.8061 36.5327 0.2767 756 +758 4 391.3761 425.9284 36.4353 0.2669 757 +759 4 391.089 426.879 35.1607 0.2556 758 +760 4 390.7996 427.7336 33.4407 0.2428 759 +761 4 390.4518 428.7083 32.2736 0.2299 760 +762 4 390.3591 429.834 31.983 0.2407 761 +763 4 390.5433 430.9608 32.0734 0.2534 762 +764 4 390.8053 432.0739 32.0765 0.2781 763 +765 4 391.1645 433.1562 31.8752 0.2796 764 +766 4 391.4116 434.2601 31.4672 0.2676 765 +767 4 391.4871 435.3835 30.9809 0.2549 766 +768 4 391.5843 436.5172 30.686 0.2662 767 +769 4 391.7548 437.6212 30.091 0.3033 768 +770 4 391.7399 438.7492 29.636 0.3051 769 +771 4 391.5168 439.8463 30.1574 0.2683 770 +772 4 391.3052 440.9617 30.4965 0.2178 771 +773 4 391.3796 442.0736 29.8945 0.2161 772 +774 4 391.3166 443.1547 28.9971 0.2409 773 +775 4 390.8613 444.2003 28.8926 0.2541 774 +776 4 390.5994 445.302 29.2936 0.2416 775 +777 4 390.5319 446.4071 28.6017 0.2415 776 +778 4 390.342 447.5305 28.3536 0.2668 777 +779 4 389.8374 448.5544 28.5309 0.2924 778 +780 4 389.6132 449.6767 28.5538 0.3051 779 +781 4 389.3478 450.7886 28.5211 0.3051 780 +782 4 389.2586 451.9269 28.3212 0.3051 781 +783 4 389.5331 452.9931 27.5587 0.3051 782 +784 4 389.953 454.041 27.1152 0.2924 783 +785 4 390.096 455.1747 26.9539 0.2669 784 +786 4 390.0708 456.3096 27.2908 0.2288 785 +787 4 389.8741 457.4147 26.7512 0.2034 786 +788 4 389.6098 458.5152 27.1622 0.1907 787 +789 4 389.2243 459.8663 26.3494 0.2465 788 +790 4 388.8685 460.9096 25.5976 0.2748 789 +791 4 388.8856 462.0227 25.1664 0.3004 790 +792 4 389.2254 463.0981 24.7836 0.2947 791 +793 4 389.6384 464.1162 24.0285 0.2715 792 +794 4 389.9141 465.1859 23.315 0.235 793 +795 4 389.7768 466.3036 23.1669 0.218 794 +796 4 389.8386 467.4327 23.4486 0.238 795 +797 4 389.969 468.5584 23.1613 0.2747 796 +798 4 389.81 469.6806 22.9076 0.2796 797 +799 4 389.7688 470.8166 22.6212 0.235 798 +800 4 390.0033 471.9183 22.1945 0.1951 799 +801 4 390.0697 473.0406 22.58 0.1786 800 +802 4 389.3741 473.8711 23.3666 0.1902 801 +803 4 388.658 474.7497 23.5922 0.191 802 +804 4 388.5836 475.8834 23.7726 0.2034 803 +805 4 388.1775 476.9119 24.4751 0.2034 804 +806 4 387.6696 477.9106 24.9782 0.2034 805 +807 4 387.3881 479.0145 25.1429 0.2099 806 +808 4 387.2623 480.1482 25.0096 0.2481 807 +809 4 387.2749 481.2831 24.8349 0.2796 808 +810 4 387.5826 482.3813 24.9421 0.2699 809 +811 4 388.0459 483.4224 25.1451 0.2166 810 +812 4 388.6225 484.4096 25.2109 0.1578 811 +813 4 389.1659 485.4038 25.279 0.1246 812 +814 4 389.4187 486.5169 25.4892 0.1144 813 +815 4 389.7448 487.5957 25.5598 0.1199 814 +816 4 390.3786 488.5441 25.3453 0.1486 815 +817 4 390.9254 489.5405 25.2392 0.1957 816 +818 4 391.2434 490.6364 25.3142 0.2662 817 +819 4 391.4104 491.7621 25.5388 0.3112 818 +820 4 391.4002 492.8935 25.8821 0.3184 819 +821 4 391.1816 494.0067 26.1274 0.2674 820 +822 4 390.8876 495.1026 26.0982 0.2194 821 +823 4 390.8705 496.2375 26.2539 0.197 822 +824 4 390.835 497.3426 26.7949 0.2225 823 +825 4 390.4472 498.4065 26.7924 0.2512 824 +826 4 389.8489 499.3709 26.4802 0.2796 825 +827 4 389.2208 500.3204 26.5854 0.2764 826 +828 4 388.6099 501.2642 27.0738 0.2604 827 +829 4 388.0928 502.2675 27.1432 0.235 828 +830 4 387.8446 503.3657 26.7176 0.2161 829 +831 4 387.7405 504.4948 26.6395 0.2194 830 +832 4 387.5998 505.6125 26.9097 0.2422 831 +833 4 387.6753 506.7371 26.5818 0.2898 832 +834 4 388.0002 507.8273 26.3141 0.3212 833 +835 4 388.3914 508.8992 26.1254 0.3271 834 +836 4 388.8033 509.9517 25.7118 0.3076 835 +837 4 389.2174 511.0008 25.289 0.2727 836 +838 4 389.5755 512.0864 25.2039 0.2439 837 +839 4 389.9953 513.1401 25.2 0.2195 838 +840 4 390.6291 514.0919 25.2 0.2322 839 +841 4 391.2114 515.0757 25.2003 0.2521 840 +842 4 391.86 515.9852 25.2011 0.2869 841 +843 4 392.7775 516.667 25.2056 0.3199 842 +844 4 393.6058 517.4518 25.2263 0.3744 843 +845 4 394.3837 518.2846 25.3154 0.4307 844 +846 4 395.2978 518.9481 25.5948 0.4576 845 +847 4 396.3285 519.408 25.8216 0.4459 846 +848 4 397.3924 519.7981 25.4624 0.4156 847 +849 4 398.4952 520.0372 25.2025 0.4068 848 +850 4 399.6392 520.0544 25.2126 0.4028 849 +851 4 400.781 520.0178 25.2834 0.3781 850 +852 4 401.9101 519.9171 25.5906 0.3271 851 +853 4 403.0175 519.9057 26.1069 0.2841 852 +854 4 404.1317 520.1345 26.3208 0.2669 853 +855 4 405.2231 520.417 26.3948 0.2617 854 +856 4 406.1841 520.9913 26.9097 0.2446 855 +857 4 407.1096 521.537 26.199 0.219 856 +858 4 407.8612 522.0827 24.5846 0.2043 857 +859 4 408.4103 523.0139 25.1924 0.1914 858 +860 4 408.9136 524.0378 25.2115 0.1907 859 +861 4 409.147 525.1555 25.2067 0.1781 860 +862 4 408.8656 526.24 25.76 0.1144 861 +863 4 390.6039 411.3389 48.1779 0.3566 742 +864 4 390.5547 412.46 47.6462 0.3559 863 +865 4 390.4952 413.5674 46.9557 0.331 864 +866 4 390.231 414.6691 46.571 0.293 865 +867 4 389.9942 415.7879 46.548 0.2672 866 +868 4 390.0457 416.9194 46.9353 0.2921 867 +869 4 390.0331 418.0462 47.4169 0.3176 868 +870 4 389.7322 419.1456 47.2021 0.3556 869 +871 4 389.2723 420.1649 46.6166 0.3685 870 +872 4 388.8056 421.2025 46.3445 0.3686 871 +873 4 388.3777 422.1829 45.3513 0.356 872 +874 4 388.0368 423.2731 45.2281 0.3432 873 +875 4 387.387 424.2146 45.192 0.3305 874 +876 4 386.7326 425.1253 44.6359 0.3178 875 +877 4 386.0245 426.0107 44.268 0.3178 876 +878 4 385.282 426.8813 44.2333 0.3432 877 +879 4 384.7741 427.9063 44.1997 0.3559 878 +880 4 384.567 429.0275 43.9858 0.3432 879 +881 4 384.265 430.0685 43.0884 0.3051 880 +882 4 383.685 430.9299 41.916 0.2669 881 +883 4 382.7515 431.4745 40.9998 0.2288 882 +884 4 381.8031 432.1128 40.873 0.2161 883 +885 4 381.047 432.9708 40.8422 0.2415 884 +886 4 380.4887 433.2786 40.5574 0.2247 885 +887 4 379.4671 433.7396 40.2447 0.1924 886 +888 4 378.402 434.1034 40.4729 0.1614 887 +889 4 377.5211 434.8024 40.7344 0.1486 888 +890 4 376.8496 435.7096 40.4844 0.1398 889 +891 4 376.2479 436.6213 39.6752 0.1438 890 +892 4 375.5924 437.4942 38.8623 0.1644 891 +893 4 375.065 438.4689 38.2553 0.1947 892 +894 4 374.6657 439.5111 37.7121 0.2034 893 +895 4 374.0686 440.472 37.5424 0.2034 894 +896 4 373.2918 441.3117 37.5435 0.2115 895 +897 4 372.5974 442.2052 37.7194 0.2369 896 +898 4 372.0585 443.2028 38.0089 0.2542 897 +899 4 371.4808 444.182 37.8302 0.2501 898 +900 4 370.8345 445.1132 37.4766 0.2374 899 +901 4 370.2762 446.0959 37.1406 0.2247 900 +902 4 369.8495 447.1324 36.6148 0.2161 901 +903 4 369.4273 448.1872 36.4098 0.2161 902 +904 4 368.9263 449.2133 36.37 0.2245 903 +905 4 368.471 450.2578 36.2093 0.2457 904 +906 4 367.9035 451.2405 35.999 0.2625 905 +907 4 367.1817 452.1168 36.1917 0.2796 906 +908 4 366.3363 452.8753 36.4896 0.2754 907 +909 4 365.516 453.6452 36.8309 0.2543 908 +910 4 364.8674 454.5581 37.3397 0.2246 909 +911 4 364.3045 455.5477 37.403 0.2119 910 +912 4 363.8412 456.591 37.2375 0.1992 911 +913 4 363.3882 457.6389 37.2792 0.1821 912 +914 4 362.974 458.6948 37.3859 0.1652 913 +915 4 362.4306 459.6134 37.0185 0.1794 914 +916 4 361.4697 460.2083 36.5907 0.2238 915 +917 4 360.5144 460.8261 36.4112 0.2768 916 +918 4 359.6862 461.58 36.0898 0.3051 917 +919 4 359.4162 462.5512 35.3545 0.2844 918 +920 4 359.4093 463.6552 35.3354 0.2298 919 +921 4 358.906 464.6047 35.8495 0.1869 920 +922 4 357.9954 465.2659 35.9901 0.1952 921 +923 4 357.1156 465.9798 35.791 0.2298 922 +924 4 356.4361 466.8836 35.9243 0.2505 923 +925 4 355.7062 467.7438 36.318 0.2359 924 +926 4 354.8608 468.4932 36.1474 0.2102 925 +927 4 353.8198 468.9164 36.0522 0.2131 926 +928 4 352.8805 469.5228 36.4081 0.2476 927 +929 4 351.9184 470.0822 35.9341 0.2866 928 +930 4 351.0536 470.8121 35.6325 0.3035 929 +931 4 350.1933 471.511 34.9625 0.2822 930 +932 4 349.3902 472.3187 34.9149 0.2453 931 +933 4 348.8262 473.3094 34.869 0.1949 932 +934 4 347.9053 473.9523 34.5229 0.1781 933 +935 4 347.1743 474.7257 33.5504 0.193 934 +936 4 346.465 475.6066 33.8506 0.2298 935 +937 4 345.496 476.1866 34.2919 0.2415 936 +938 4 344.5614 476.8341 34.4655 0.2369 937 +939 4 343.5009 477.2448 34.5794 0.2034 938 +940 4 342.4747 477.6623 34.8953 0.2034 939 +941 4 341.6087 478.3098 34.3902 0.2224 940 +942 4 340.8926 479.1964 34.4232 0.2482 941 +943 4 340.1581 480.0602 34.3064 0.2614 942 +944 4 339.2726 480.7511 34.1312 0.2669 943 +945 4 338.3163 481.3357 33.71 0.2595 944 +946 4 337.297 481.7956 33.3239 0.2384 945 +947 4 336.209 481.9844 33.8027 0.2114 946 +948 4 335.1874 482.4111 34.0138 0.1943 947 +949 4 334.2242 483.022 34.2079 0.2001 948 +950 4 333.2014 483.4475 33.7554 0.2134 949 +951 4 332.1387 483.8331 33.3715 0.2264 950 +952 4 331.0908 484.2072 33.8948 0.2392 951 +953 4 329.9891 484.3696 34.4868 0.2523 952 +954 4 328.8668 484.5652 34.51 0.2542 953 +955 4 327.9139 485.1326 33.9032 0.2186 954 +956 4 327.5272 486.0856 32.76 0.1144 955 +957 4 380.7495 433.8506 41.6178 0.2988 885 +958 4 380.7552 434.9763 41.2754 0.2784 957 +959 4 380.6797 436.0939 41.1158 0.2525 958 +960 4 380.3136 437.159 40.8867 0.2341 959 +961 4 380.0105 438.2161 40.213 0.2288 960 +962 4 379.816 439.3166 40.1349 0.2211 961 +963 4 379.5643 440.4263 40.311 0.208 962 +964 4 378.9569 441.3609 40.2483 0.1866 963 +965 4 378.2693 442.267 40.0428 0.178 964 +966 4 377.6744 443.2382 39.8028 0.1865 965 +967 4 377.1631 444.2552 39.5368 0.2079 966 +968 4 376.8256 445.3306 39.1524 0.2161 967 +969 4 376.4607 446.406 38.8755 0.2073 968 +970 4 375.9516 447.4138 39.1499 0.2034 969 +971 4 375.4528 448.4205 39.6634 0.2123 970 +972 4 374.9449 449.4021 40.3735 0.2344 971 +973 4 374.4003 450.3676 41.0598 0.2601 972 +974 4 373.85 451.3526 41.5148 0.2858 973 +975 4 373.492 452.4017 41.1093 0.2924 974 +976 4 373.4782 453.5182 41.3106 0.2714 975 +977 4 373.1808 454.6073 41.3417 0.2456 976 +978 4 372.9509 455.7067 40.8579 0.2309 977 +979 4 373.0653 456.8049 40.2142 0.2177 978 +980 4 373.079 457.9409 40.3046 0.2048 979 +981 4 372.7861 459.0392 40.1565 0.2034 980 +982 4 372.6546 460.1637 40.4922 0.2272 981 +983 4 372.9131 461.2196 39.7057 0.2534 982 +984 4 373.1064 462.3453 39.7205 0.2542 983 +985 4 372.7941 463.3966 40.4712 0.2542 984 +986 4 372.5413 464.5075 40.7011 0.2559 985 +987 4 372.3102 465.608 40.5672 0.2669 986 +988 4 371.8492 466.5655 39.6864 0.2693 987 +989 4 371.5357 467.6626 39.7804 0.2854 988 +990 4 371.3115 468.7792 39.674 0.3083 989 +991 4 371.2783 469.9072 39.9708 0.3143 990 +992 4 371.387 471.0168 40.5241 0.294 991 +993 4 371.2692 472.1311 40.9777 0.2591 992 +994 4 371.0793 473.2202 41.3644 0.2331 993 +995 4 370.9798 474.2772 42.3032 0.2115 994 +996 4 370.99 475.4018 42.3368 0.1987 995 +997 4 370.9683 476.5046 42.1912 0.1907 996 +998 4 370.648 477.5903 42.5166 0.1961 997 +999 4 370.5107 478.6004 41.8214 0.2096 998 +1000 4 370.9226 479.5248 41.256 0.2306 999 +1001 4 371.0953 480.5772 41.4971 0.2415 1000 +1002 4 371.0907 481.7121 41.3619 0.2415 1001 +1003 4 371.244 482.8286 40.922 0.2415 1002 +1004 4 371.4705 483.9417 40.7557 0.2495 1003 +1005 4 371.6147 485.0606 40.4323 0.2542 1004 +1006 4 371.9899 486.1119 40.2699 0.2372 1005 +1007 4 372.2793 487.1873 40.6913 0.201 1006 +1008 4 371.9464 488.2295 41.0458 0.1713 1007 +1009 4 371.3115 489.1149 40.4113 0.1549 1008 +1010 4 370.6034 489.9775 39.8076 0.1635 1009 +1011 4 370.0451 490.887 38.8237 0.177 1010 +1012 4 369.3004 491.7164 39.2557 0.1902 1011 +1013 4 369.4308 492.8123 39.6791 0.1907 1012 +1014 4 369.7911 493.8408 39.0852 0.1931 1013 +1015 4 369.615 494.9276 38.3692 0.2061 1014 +1016 4 369.4617 495.9366 37.2761 0.2233 1015 +1017 4 369.8884 496.8953 36.4006 0.2368 1016 +1018 4 370.4844 497.8539 36.489 0.2179 1017 +1019 4 370.7933 498.9236 36.5674 0.1803 1018 +1020 4 370.4615 499.8022 35.32 0.1652 1019 +1021 4 369.7957 500.6567 34.9129 0.1746 1020 +1022 4 369.2729 501.6246 34.328 0.178 1021 +1023 4 369.1985 502.7216 33.7725 0.158 1022 +1024 4 369.3907 503.8165 33.1489 0.1311 1023 +1025 4 369.4914 504.9456 33.266 0.1271 1024 +1026 4 368.9652 505.9294 33.0036 0.1507 1025 +1027 4 368.0694 506.5838 32.3845 0.2002 1026 +1028 4 367.6633 507.5802 31.6674 0.2426 1027 +1029 4 368.384 508.4508 31.274 0.2796 1028 +1030 4 368.8839 509.4747 31.211 0.2811 1029 +1031 4 369.1951 510.5478 30.6636 0.2924 1030 +1032 4 369.2843 511.686 30.5648 0.294 1031 +1033 4 369.2123 512.8197 30.3052 0.3032 1032 +1034 4 369.2088 513.9294 29.6915 0.2903 1033 +1035 4 369.1985 515.0608 29.673 0.2796 1034 +1036 4 369.0006 516.1328 29.4476 0.2866 1035 +1037 4 369.6184 517.0274 29.2524 0.3152 1036 +1038 4 370.3105 517.8533 29.4585 0.336 1037 +1039 4 370.7178 518.8612 29.0654 0.331 1038 +1040 4 371.093 519.8176 27.8762 0.3044 1039 +1041 4 371.3275 520.8666 26.9713 0.281 1040 +1042 4 371.6147 521.8036 28.31 0.3162 1041 +1043 4 371.7794 522.8595 27.4417 0.3559 1042 +1044 4 372.372 523.8376 27.44 0.3432 1043 +1045 4 402.998 411.7439 49.9117 0.2104 176 +1046 4 402.9065 410.6091 50.197 0.1334 1045 +1047 4 402.8161 409.4754 50.4823 0.1176 1046 +1048 4 402.7246 408.3405 50.7676 0.1335 1047 +1049 4 402.6308 407.2068 51.0546 0.1589 1048 +1050 4 402.4054 406.0903 51.214 0.1845 1049 +1051 4 402.0943 404.9897 51.2406 0.1713 1050 +1052 4 401.981 403.8583 51.24 0.1554 1051 +1053 4 402.2384 402.7658 51.5623 0.1424 1052 +1054 4 402.4626 401.6561 51.3694 0.1502 1053 +1055 4 402.7795 400.6231 52.1175 0.1632 1054 +1056 4 403.2817 399.6118 52.1296 0.1868 1055 +1057 4 403.8675 398.6337 51.919 0.2346 1056 +1058 4 404.1363 397.5549 51.3584 0.2746 1057 +1059 4 404.3868 396.4498 50.983 0.3128 1058 +1060 4 404.698 395.3595 50.6094 0.3066 1059 +1061 4 405.2826 394.3951 50.9068 0.2706 1060 +1062 4 405.9152 393.4971 50.2082 0.196 1061 +1063 4 406.6909 392.8359 48.9544 0.1549 1062 +1064 4 407.4379 391.9859 49.0941 0.1644 1063 +1065 4 408.0625 391.0295 49.1697 0.2277 1064 +1066 4 408.1277 389.9347 49.9411 0.2667 1065 +1067 4 408.1586 388.7918 50.0346 0.2542 1066 +1068 4 408.8107 387.9315 49.1851 0.2116 1067 +1069 4 409.6401 387.1925 48.8877 0.1985 1068 +1070 4 410.2453 386.251 49.469 0.2374 1069 +1071 4 410.9111 385.3518 49.9341 0.2757 1070 +1072 4 411.7439 384.6071 50.4924 0.302 1071 +1073 4 412.6259 383.9001 50.6702 0.2893 1072 +1074 4 413.6498 383.4082 50.9382 0.2764 1073 +1075 4 414.5936 382.8064 50.8567 0.2595 1074 +1076 4 415.3452 381.9793 51.1249 0.2269 1075 +1077 4 416.098 381.1945 51.3178 0.1977 1076 +1078 4 416.8095 380.3285 50.8486 0.2147 1077 +1079 4 417.6801 379.6078 50.8813 0.279 1078 +1080 4 418.6948 379.1811 51.4172 0.3439 1079 +1081 4 419.7942 379.125 52.0374 0.3753 1080 +1082 4 420.873 378.9168 52.334 0.374 1081 +1083 4 421.9438 378.5679 52.7072 0.3606 1082 +1084 4 422.97 378.1618 53.3828 0.3393 1083 +1085 4 424.0144 377.7499 53.8605 0.3137 1084 +1086 4 425.099 377.4067 53.7905 0.2882 1085 +1087 4 426.1652 377.0018 53.6452 0.2534 1086 +1088 4 427.1479 376.4389 53.3512 0.2234 1087 +1089 4 428.1306 375.8658 53.4097 0.1876 1088 +1090 4 428.8559 375.0124 53.5718 0.178 1089 +1091 4 429.5903 374.1383 53.7032 0.1886 1090 +1092 4 430.1692 373.1945 53.1191 0.2128 1091 +1093 4 431.0592 372.5024 53.1194 0.2161 1092 +1094 4 432.0122 371.8709 53.1762 0.2161 1093 +1095 4 432.7283 371.0472 52.4185 0.2279 1094 +1096 4 433.8094 370.7384 52.2696 0.2641 1095 +1097 4 434.911 370.5061 51.7843 0.2787 1096 +1098 4 436.0322 370.2899 51.6858 0.2676 1097 +1099 4 437.1132 369.9399 51.9935 0.2429 1098 +1100 4 438.0822 369.4868 51.0555 0.2291 1099 +1101 4 439.1461 369.0716 50.9247 0.2288 1100 +1102 4 440.146 368.7249 49.8683 0.2289 1101 +1103 4 441.2683 368.535 49.6283 0.2418 1102 +1104 4 442.2212 367.9973 50.4 0.2676 1103 +1105 4 443.2554 367.629 49.6602 0.2918 1104 +1106 4 444.2896 367.1943 50.1892 0.2772 1105 +1107 4 445.1956 366.5021 50.2799 0.2233 1106 +1108 4 445.9861 365.7093 50.1698 0.1602 1107 +1109 4 447.0992 365.4828 50.26 0.1271 1108 +1110 4 448.2352 365.5503 50.3171 0.1334 1109 +1111 4 449.3392 365.7025 49.7078 0.1683 1110 +1112 4 450.4408 365.8558 49.4334 0.1968 1111 +1113 4 451.5711 365.8855 49.7924 0.2034 1112 +1114 4 452.7014 365.7929 49.819 0.1971 1113 +1115 4 453.7973 365.5503 49.3906 0.1907 1114 +1116 4 454.835 365.1019 49.0605 0.1907 1115 +1117 4 455.8737 364.6283 49.075 0.1973 1116 +1118 4 456.8656 364.1821 48.5528 0.217 1117 +1119 4 457.7716 363.5815 47.8545 0.2357 1118 +1120 4 458.6525 362.8574 47.7058 0.2344 1119 +1121 4 459.6329 362.3002 47.5488 0.2143 1120 +1122 4 460.6751 361.838 47.3273 0.2106 1121 +1123 4 461.715 361.3736 47.0806 0.2307 1122 +1124 4 462.7926 361.0121 46.8252 0.249 1123 +1125 4 463.8954 360.8336 47.161 0.2309 1124 +1126 4 465.0108 360.7432 47.7226 0.1842 1125 +1127 4 466.1182 360.5144 48.0301 0.1489 1126 +1128 4 467.1718 360.1392 48.552 0.1398 1127 +1129 4 468.2037 359.6759 48.7998 0.1485 1128 +1130 4 469.1418 359.033 48.8186 0.1432 1129 +1131 4 470.0158 358.3019 49.0566 0.1398 1130 +1132 4 471.0145 357.7677 49.0748 0.1494 1131 +1133 4 472.0579 357.2998 49.0056 0.1718 1132 +1134 4 473.1367 356.9337 48.8079 0.178 1133 +1135 4 474.2635 356.928 48.8564 0.1582 1134 +1136 4 475.3492 356.6409 48.7452 0.1326 1135 +1137 4 476.4154 356.2736 49.1112 0.1169 1136 +1138 4 477.5205 356.1055 49.6658 0.1144 1137 +1139 4 478.6404 356.0242 49.3231 0.1144 1138 +1140 4 479.7307 356.1672 49.8988 0.1144 1139 +1141 4 480.8655 356.2439 50.08 0.1262 1140 +1142 4 481.8574 356.7919 49.8798 0.1519 1141 +1143 4 482.7417 357.516 49.7862 0.1774 1142 +1144 4 483.8251 357.8226 49.3335 0.178 1143 +1145 4 484.9416 358.072 49.28 0.1144 1144 +1146 3 413.7985 419.0724 49.0834 0.1403 1 +1147 3 412.8765 419.705 49.6672 0.2042 1146 +1148 3 411.9533 420.3376 50.2502 0.3064 1147 +1149 3 411.1925 421.1522 50.7282 0.3777 1148 +1150 3 410.5404 422.0845 50.9564 0.394 1149 +1151 3 409.7591 422.8979 51.282 0.3422 1150 +1152 3 408.7157 423.2217 51.5021 0.2744 1151 +1153 3 407.8349 423.8165 51.1176 0.1144 1152 +1154 3 407.4482 423.1198 51.0563 0.2532 1153 +1155 3 406.3316 422.8785 50.9877 0.2542 1154 +1156 3 405.1911 422.9345 51.1361 0.2795 1155 +1157 3 404.086 422.9208 51.8602 0.2669 1156 +1158 3 403.0907 422.3968 52.3648 0.2924 1157 +1159 3 402.1068 421.9873 53.3845 0.2924 1158 +1160 3 401.0235 421.8672 54.2279 0.3051 1159 +1161 3 399.9252 421.5754 54.5625 0.3305 1160 +1162 3 399.0432 420.9279 55.3748 0.3686 1161 +1163 3 397.969 420.5413 55.5677 0.4322 1162 +1164 3 396.42 420.4772 56.3914 0.3943 1163 +1165 3 395.3195 420.253 56.9254 0.3814 1164 +1166 3 394.2579 419.8777 57.4258 0.3939 1165 +1167 3 393.2386 419.3687 57.6514 0.4067 1166 +1168 3 392.2696 418.7612 57.6797 0.4194 1167 +1169 3 391.3475 418.084 57.6803 0.4195 1168 +1170 3 390.4335 417.3953 57.6808 0.4069 1169 +1171 3 389.54 416.6803 57.6859 0.4068 1170 +1172 3 388.5859 416.0499 57.7181 0.4068 1171 +1173 3 387.5437 415.5889 57.9684 0.4068 1172 +1174 3 386.545 415.1576 58.8311 0.3686 1173 +1175 3 385.1162 414.3316 58.6634 0.178 1174 +1176 3 384.106 413.8775 59.2701 0.178 1175 +1177 3 383.1164 413.3295 59.4549 0.1866 1176 +1178 3 382.1852 412.6888 59.6361 0.2122 1177 +1179 3 381.2163 412.1111 59.584 0.2377 1178 +1180 3 380.3754 411.3378 59.463 0.2542 1179 +1181 3 379.498 410.6045 59.4073 0.2497 1180 +1182 3 378.6434 409.8517 59.5076 0.2369 1181 +1183 3 377.9158 408.9743 59.64 0.2382 1182 +1184 3 377.2786 408.0248 59.64 0.2636 1183 +1185 3 376.7203 407.0341 59.7982 0.2939 1184 +1186 3 376.1666 406.0697 60.3562 0.3228 1185 +1187 3 375.3613 405.3444 60.555 0.3417 1186 +1188 3 374.4735 404.6706 60.2512 0.3559 1187 +1189 3 373.7608 403.7908 60.0065 0.349 1188 +1190 3 373.0458 402.9214 59.5426 0.3156 1189 +1191 3 372.197 402.1755 59.2262 0.2645 1190 +1192 3 371.2909 401.4799 59.1959 0.2202 1191 +1193 3 370.4398 400.734 59.5395 0.2034 1192 +1194 3 369.536 400.1186 60.2538 0.2262 1193 +1195 3 368.6426 399.4734 60.9207 0.2646 1194 +1196 3 367.8967 398.6291 60.9636 0.2796 1195 +1197 3 367.3258 397.651 61.0551 0.2474 1196 +1198 3 366.6337 396.8296 60.5262 0.2032 1197 +1199 3 366.0251 396.094 59.0492 0.2003 1198 +1200 3 365.0172 395.8881 58.7073 0.3143 1199 +1201 3 363.8927 395.6959 58.7916 0.2633 1200 +1202 3 362.8928 395.1593 58.592 0.2032 1201 +1203 3 362.3025 394.3402 59.8951 0.152 1202 +1204 3 361.8083 393.7168 61.871 0.1398 1203 +1205 3 360.837 393.2237 62.6128 0.1409 1204 +1206 3 360.0557 392.4492 62.0533 0.1539 1205 +1207 3 359.6667 391.5386 60.9599 0.1692 1206 +1208 3 358.7904 390.8465 61.4989 0.1948 1207 +1209 3 357.746 390.4335 61.9097 0.2138 1208 +1210 3 356.6248 390.2276 61.9982 0.1961 1209 +1211 3 355.5792 389.8054 62.3386 0.1598 1210 +1212 3 354.6606 389.1808 62.7626 0.1432 1211 +1213 3 353.7248 388.5607 62.3428 0.1697 1212 +1214 3 352.6963 388.0826 62.253 0.2212 1213 +1215 3 351.7182 387.5094 62.5044 0.2677 1214 +1216 3 350.8133 386.8139 62.4047 0.2878 1215 +1217 3 349.9713 386.0577 62.3095 0.2613 1216 +1218 3 349.1305 385.3038 62.5954 0.2058 1217 +1219 3 348.1375 384.7455 62.7312 0.1559 1218 +1220 3 347.1376 384.2044 62.8468 0.1398 1219 +1221 3 346.3906 383.4162 63.3203 0.1491 1220 +1222 3 345.8198 382.4964 64.0797 0.17 1221 +1223 3 344.9526 381.7986 64.2592 0.1829 1222 +1224 3 343.9104 381.389 64.0032 0.1907 1223 +1225 3 342.787 381.2986 64.2958 0.1972 1224 +1226 3 341.6705 381.3673 64.8726 0.228 1225 +1227 3 340.5562 381.2769 65.3859 0.2607 1226 +1228 3 339.5712 381.508 64.4731 0.2563 1227 +1229 3 338.4741 381.6739 64.6344 0.1999 1228 +1230 3 337.3324 381.7002 64.6775 0.1579 1229 +1231 3 336.2124 381.4885 64.6453 0.1415 1230 +1232 3 335.1165 381.1659 64.51 0.1508 1231 +1233 3 333.9942 380.952 64.4932 0.1413 1232 +1234 3 332.8994 380.6546 64.8133 0.1284 1233 +1235 3 331.9579 380.0391 65.2582 0.1271 1234 +1236 3 330.9867 379.562 64.4403 0.1398 1235 +1237 3 330.0783 378.8653 64.4129 0.1525 1236 +1238 3 329.2432 378.092 64.68 0.1144 1237 +1239 3 385.4948 415.3578 58.7045 0.1481 1174 +1240 3 384.4595 415.7227 58.4716 0.1492 1239 +1241 3 383.3338 415.6758 58.1134 0.1897 1240 +1242 3 382.2848 415.6678 57.0819 0.2636 1241 +1243 3 381.2369 415.86 56.4827 0.3314 1242 +1244 3 380.1295 416.1414 56.4925 0.3692 1243 +1245 3 379.0495 416.4469 56.0501 0.361 1244 +1246 3 377.9719 416.6871 55.3241 0.3154 1245 +1247 3 376.8599 416.8644 54.934 0.2501 1246 +1248 3 375.8829 417.3632 54.88 0.208 1247 +1249 3 375.2492 418.2933 55.008 0.2034 1248 +1250 3 374.8179 419.3481 55.1818 0.2388 1249 +1251 3 374.0926 420.1397 55.7715 0.2636 1250 +1252 3 373.3215 420.9222 55.4061 0.2861 1251 +1253 3 372.491 421.6784 54.9175 0.2728 1252 +1254 3 371.8641 422.6085 54.5443 0.2471 1253 +1255 3 371.1422 423.4813 54.2531 0.1909 1254 +1256 3 370.2922 424.2444 54.2357 0.1462 1255 +1257 3 369.2912 424.7741 53.9927 0.129 1256 +1258 3 368.2856 425.3175 53.9137 0.138 1257 +1259 3 367.3006 425.8986 53.9972 0.1508 1258 +1260 3 366.3282 426.4981 54.1321 0.1414 1259 +1261 3 365.4165 427.1742 54.453 0.1285 1260 +1262 3 364.3651 427.5814 54.8495 0.115 1261 +1263 3 363.2486 427.7999 55.137 0.1144 1262 +1264 3 362.1492 428.0974 55.389 0.1144 1263 +1265 3 361.1036 428.5195 55.8516 0.1144 1264 +1266 3 360.0809 429.0297 55.776 0.1144 1265 +1267 3 358.978 429.3032 56.096 0.1144 1266 +1268 3 357.8478 429.469 56.2078 0.1144 1267 +1269 3 356.8136 429.9152 55.72 0.1144 1268 +1270 3 356.5207 429.7505 56.84 0.1144 1269 +1271 3 356.3434 429.5846 56.84 0.1144 1270 +1272 3 356.0128 429.572 56.84 0.1144 1271 +1273 3 355.6696 429.572 56.84 0.1144 1272 +1274 3 355.4408 429.572 56.84 0.1144 1273 +1275 3 354.831 429.381 56.84 0.1144 1274 +1276 3 354.5759 429.2929 56.84 0.1144 1275 +1277 3 354.4753 429.0503 56.84 0.1144 1276 +1278 3 354.1824 429.0 56.84 0.1144 1277 +1279 3 353.8392 429.0 56.84 0.1144 1278 +1280 3 353.6104 429.0 56.84 0.1144 1279 +1281 3 352.8096 429.0 56.84 0.1144 1280 +1282 3 352.4664 429.0 56.84 0.1144 1281 +1283 3 352.1232 429.0 56.84 0.1144 1282 +1284 3 351.8178 428.9622 56.84 0.1144 1283 +1285 3 351.6782 428.7586 56.84 0.1144 1284 +1286 3 351.4368 428.428 56.84 0.1144 1285 +1287 3 351.1062 428.4154 56.84 0.1144 1286 +1288 3 351.017 428.3902 56.84 0.1144 1287 +1289 3 350.2928 428.3136 56.84 0.1144 1288 +1290 3 349.492 428.3136 56.84 0.1144 1289 +1291 3 348.6912 428.3136 56.84 0.1144 1290 +1292 3 347.8904 428.3136 56.84 0.1144 1291 +1293 3 347.5472 428.3136 56.84 0.1144 1292 +1294 3 347.2166 428.301 56.84 0.1144 1293 +1295 3 346.9752 428.1992 56.84 0.1144 1294 +1296 3 346.8482 427.983 56.84 0.1144 1295 +1297 3 346.4032 427.856 56.84 0.1144 1296 +1298 3 346.0978 427.8182 56.84 0.1144 1297 +1299 3 346.0222 427.7794 56.84 0.1144 1298 +1300 3 345.2592 427.7416 56.84 0.1144 1299 +1301 3 344.4584 427.7416 56.84 0.1144 1300 +1302 3 343.6576 427.7416 56.84 0.1144 1301 +1303 3 343.3144 427.7416 56.84 0.1144 1302 +1304 3 342.9838 427.729 56.84 0.1144 1303 +1305 3 342.7676 427.602 56.84 0.1144 1304 +1306 3 342.5639 427.4625 56.84 0.1144 1305 +1307 3 342.501 427.2966 56.84 0.1144 1306 +1308 3 342.2082 426.7886 56.84 0.1144 1307 +1309 3 341.7254 426.4706 56.84 0.1144 1308 +1310 3 341.5858 426.267 56.84 0.1144 1309 +1311 3 341.3696 426.14 56.84 0.1144 1310 +1312 3 341.0264 426.14 56.84 0.1144 1311 +1313 3 340.6832 426.14 56.84 0.1144 1312 +1314 3 340.4544 426.14 56.84 0.1144 1313 +1315 3 339.7806 426.013 56.84 0.1144 1314 +1316 3 339.196 425.7968 56.84 0.1144 1315 +1317 3 338.3952 425.7968 56.84 0.1144 1316 +1318 3 337.5944 425.7968 56.84 0.1144 1317 +1319 3 337.1368 425.568 56.84 0.1144 1318 +1320 3 397.3341 420.8925 57.2345 0.4499 1163 +1321 3 396.3422 421.4279 57.0119 0.3835 1320 +1322 3 395.5952 422.2275 56.8467 0.3027 1321 +1323 3 394.6846 422.6451 58.1101 0.2214 1322 +1324 3 393.6104 422.7583 58.9109 0.1907 1323 +1325 3 392.6505 422.8361 60.1087 0.1986 1324 +1326 3 391.7079 423.4459 60.5024 0.2207 1325 +1327 3 390.8453 424.0842 60.9826 0.2388 1326 +1328 3 390.0331 424.7169 61.6874 0.2766 1327 +1329 3 389.1053 425.3506 61.7044 0.3342 1328 +1330 3 388.2999 426.1549 61.9564 0.3804 1329 +1331 3 387.5678 427.0277 62.097 0.4001 1330 +1332 3 386.847 427.8869 62.5388 0.3945 1331 +1333 3 386.0542 428.6797 63.047 0.3626 1332 +1334 3 385.1722 429.3947 63.2475 0.2982 1333 +1335 3 384.1575 429.8969 63.4385 0.2145 1334 +1336 3 383.0467 430.0788 63.5606 0.1508 1335 +1337 3 381.9393 430.1234 64.0676 0.1271 1336 +1338 3 381.0229 430.2813 65.5752 0.1345 1337 +1339 3 380.0231 430.279 66.3659 0.1476 1338 +1340 3 378.9809 430.0754 67.1787 0.1446 1339 +1341 3 377.9147 429.9976 68.0638 0.1317 1340 +1342 3 376.8153 430.2218 68.3189 0.1187 1341 +1343 3 375.9024 430.7824 69.0183 0.1144 1342 +1344 3 375.3647 431.6163 70.3041 0.1144 1343 +1345 3 374.6325 432.4057 70.9971 0.1144 1344 +1346 3 373.5812 432.7798 71.1942 0.1144 1345 +1347 3 372.5161 433.1161 71.7517 0.1144 1346 +1348 3 371.4751 433.4891 72.4752 0.1144 1347 +1349 3 370.4924 434.0553 72.7913 0.1144 1348 +1350 3 369.5269 434.5999 73.4689 0.1144 1349 +1351 3 368.7604 435.2794 74.7141 0.1144 1350 +1352 3 368.4881 436.3479 75.4586 0.1144 1351 +1353 3 368.2536 437.4656 75.6 0.1144 1352 +1354 3 368.0248 437.58 74.48 0.1144 1353 +1355 3 367.7194 437.6178 74.48 0.1144 1354 +1356 3 367.4528 437.6944 74.48 0.1144 1355 +1357 3 367.1222 437.707 74.48 0.1144 1356 +1358 3 366.9574 437.771 74.48 0.1144 1357 +1359 3 366.4106 438.025 74.48 0.1144 1358 +1360 3 366.0674 438.4826 74.48 0.1144 1359 +1361 3 365.7242 438.9402 74.48 0.1144 1360 +1362 3 365.1648 439.1816 74.48 0.1144 1361 +1363 3 364.6694 439.487 74.48 0.1144 1362 +1364 3 364.4143 439.5751 74.48 0.1144 1363 +1365 3 364.3514 439.8554 74.48 0.1144 1364 +1366 3 364.1352 439.9824 74.48 0.1144 1365 +1367 3 363.792 439.9824 74.48 0.1144 1366 +1368 3 363.601 440.0202 74.48 0.1144 1367 +1369 3 362.8768 440.0968 74.48 0.1144 1368 +1370 3 362.2796 440.3004 74.48 0.1144 1369 +1371 3 361.695 440.5166 74.48 0.1144 1370 +1372 3 360.932 440.5544 74.48 0.1144 1371 +1373 3 360.1312 440.5544 74.48 0.1144 1372 +1374 3 359.4448 440.44 74.48 0.1144 1373 +1375 3 359.1016 440.44 74.48 0.1144 1374 +1376 3 358.7584 440.44 74.48 0.1144 1375 +1377 3 358.453 440.4022 74.48 0.1144 1376 +1378 3 358.3008 440.2112 74.48 0.1144 1377 +1379 3 358.2116 440.0716 74.48 0.1144 1378 +1380 3 357.9702 439.9698 74.48 0.1144 1379 +1381 3 357.7666 439.8302 74.48 0.1144 1380 +1382 3 357.6522 439.6014 74.48 0.1144 1381 +1383 3 357.5378 439.3726 74.48 0.1144 1382 +1384 3 357.5 439.1816 74.48 0.1144 1383 +1385 3 357.3856 438.9528 74.48 0.1144 1384 +1386 3 407.8188 424.019 51.3064 0.122 1153 +1387 3 407.8097 425.0978 52.0808 0.1615 1386 +1388 3 408.0568 426.1835 52.4297 0.1975 1387 +1389 3 408.4904 427.0804 53.6399 0.2161 1388 +1390 3 409.3518 427.6466 54.7467 0.2122 1389 +1391 3 410.4214 427.8743 55.3812 0.1993 1390 +1392 3 411.562 427.8526 55.3689 0.1907 1391 +1393 3 412.6602 427.8045 55.6587 0.1953 1392 +1394 3 413.6086 427.7576 57.1595 0.2034 1393 +1395 3 414.4632 427.4304 58.7538 0.2034 1394 +1396 3 415.3978 427.03 59.9561 0.1844 1395 +1397 3 415.9321 426.4489 61.4566 0.1503 1396 +1398 3 416.4492 425.6664 62.8432 0.1236 1397 +1399 3 417.258 425.0292 64.0455 0.1144 1398 +1400 3 417.8735 424.2089 65.1949 0.1239 1399 +1401 3 418.6331 423.4333 64.965 0.1381 1400 +1402 3 419.3263 422.5318 64.8533 0.1639 1401 +1403 3 419.5117 421.6727 66.5792 0.1652 1402 +1404 3 419.6192 420.5722 67.2932 0.1652 1403 +1405 3 419.5929 420.0745 68.7666 0.1343 1404 +1406 3 419.7187 419.1353 69.4949 0.1144 1405 +1407 3 419.8194 418.0199 69.6805 0.1144 1406 +1408 3 419.6741 417.163 71.239 0.1144 1407 +1409 3 419.1044 416.567 73.0705 0.1144 1408 +1410 3 418.601 415.6713 73.3211 0.1144 1409 +1411 3 418.45 414.5524 73.2245 0.1144 1410 +1412 3 418.736 413.5194 73.9502 0.1144 1411 +1413 3 418.9328 412.412 74.2 0.1144 1412 +1414 3 419.7439 420.4612 67.9395 0.1144 1404 +1415 3 420.5916 420.436 69.7956 0.1144 1414 +1416 3 421.2791 419.6787 70.8226 0.1144 1415 +1417 3 421.667 418.6251 70.6947 0.1144 1416 +1418 3 422.5776 417.9856 70.56 0.1144 1417 +1419 3 423.6289 417.5646 70.56 0.1144 1418 +1420 3 424.5659 416.9114 70.5124 0.1144 1419 +1421 3 425.457 416.1975 70.49 0.1144 1420 +1422 3 426.2853 415.4356 70.8652 0.1144 1421 +1423 3 427.0403 414.6382 71.6148 0.1144 1422 +1424 3 427.9544 414.033 72.0703 0.1144 1423 +1425 3 429.0275 413.6441 71.9662 0.1144 1424 +1426 3 430.1303 413.3501 71.8528 0.1144 1425 +1427 3 431.248 413.1224 71.685 0.1144 1426 +1428 3 432.3805 412.9932 71.68 0.1144 1427 +1429 3 433.5142 412.8868 71.6808 0.1144 1428 +1430 3 434.5324 412.4406 71.7391 0.1144 1429 +1431 3 435.4945 412.0139 72.2338 0.1144 1430 +1432 3 436.4383 412.3068 73.3625 0.1144 1431 +1433 3 437.3352 412.9142 74.0751 0.1144 1432 +1434 3 438.0868 413.7356 74.1944 0.1144 1433 +1435 3 438.5982 414.7114 74.797 0.1144 1434 +1436 3 439.3829 415.3898 74.4419 0.1144 1435 +1437 3 440.1963 416.1552 74.4554 0.1144 1436 +1438 3 441.0623 416.8942 74.6698 0.1144 1437 +1439 3 442.0222 417.5062 74.5402 0.1144 1438 +1440 3 443.0632 417.9673 74.6544 0.1144 1439 +1441 3 444.1694 418.0451 75.1596 0.1144 1440 +1442 3 445.1304 417.568 75.994 0.126 1441 +1443 3 445.914 416.8358 76.9563 0.1517 1442 +1444 3 445.9312 415.7296 77.56 0.2288 1443 +1445 3 415.9687 415.4985 47.9427 0.1671 1 +1446 3 416.1037 414.3625 47.9735 0.2466 1445 +1447 3 416.2627 413.23 47.9956 0.3358 1446 +1448 3 416.6173 412.1523 48.0917 0.4021 1447 +1449 3 417.5257 411.7576 48.4282 0.4744 1448 +1450 3 418.2544 412.5676 48.2748 0.5529 1449 +1451 3 418.8527 413.5388 48.4341 0.5944 1450 +1452 3 419.4453 414.517 48.4744 0.5504 1451 +1453 3 420.0116 415.5065 48.2524 0.4289 1452 +1454 3 420.7529 416.2009 49.4525 0.3193 1453 +1455 3 421.5617 415.6632 50.8864 0.2924 1454 +1456 3 422.557 415.0993 50.9564 0.3305 1455 +1457 3 423.3978 414.3236 50.9384 0.3432 1456 +1458 3 423.7513 412.8044 50.5532 0.3082 1457 +1459 3 423.9939 411.713 50.036 0.3252 1458 +1460 3 424.2078 410.5988 49.8425 0.3283 1459 +1461 3 424.5018 409.4948 49.84 0.3432 1460 +1462 3 424.7386 408.376 49.84 0.3485 1461 +1463 3 424.8805 407.2468 49.8394 0.3401 1462 +1464 3 424.8747 406.1028 49.8369 0.302 1463 +1465 3 425.2728 405.1968 50.0189 0.1144 1464 +1466 3 424.8336 404.6328 49.8145 0.3305 1465 +1467 3 424.7878 403.4911 49.6647 0.3813 1466 +1468 3 424.8827 402.3894 48.9418 0.3686 1467 +1469 3 424.8976 401.25 48.7206 0.3432 1468 +1470 3 424.9914 400.1094 48.7138 0.3178 1469 +1471 3 425.3907 399.0375 48.6842 0.3178 1470 +1472 3 425.8815 398.3339 48.4154 0.2373 1471 +1473 3 426.6033 397.4954 47.8341 0.1723 1472 +1474 3 427.4018 396.7586 46.9574 0.1538 1473 +1475 3 428.2209 396.1283 45.8382 0.1461 1474 +1476 3 428.7415 395.8732 43.713 0.1748 1475 +1477 3 428.5332 395.5998 41.2194 0.2314 1476 +1478 3 428.0287 394.9877 39.2526 0.2627 1477 +1479 3 427.5242 394.1572 37.8067 0.2496 1478 +1480 3 426.6388 393.7431 36.7808 0.22 1479 +1481 3 426.0691 394.4478 35.3665 0.2161 1480 +1482 3 426.2327 395.371 33.8271 0.2161 1481 +1483 3 426.839 396.2862 33.0991 0.1917 1482 +1484 3 427.173 397.3043 32.1255 0.1785 1483 +1485 3 426.2086 397.6613 31.0895 0.178 1484 +1486 3 425.147 397.8088 30.1087 0.178 1485 +1487 3 424.0751 398.207 30.1328 0.1525 1486 +1488 3 423.8772 398.4907 30.9498 0.1898 1487 +1489 3 423.7982 399.1622 32.9034 0.2577 1488 +1490 3 424.5281 399.7136 34.0721 0.2852 1489 +1491 3 425.3941 400.3668 34.1239 0.2867 1490 +1492 3 425.7385 401.4079 33.9018 0.2796 1491 +1493 3 425.6504 402.418 32.8714 0.2915 1492 +1494 3 425.4753 403.276 31.0761 0.3177 1493 +1495 3 425.8197 404.0276 29.5274 0.3238 1494 +1496 3 426.6148 404.7655 28.8075 0.3109 1495 +1497 3 427.5117 405.4576 28.8081 0.2981 1496 +1498 3 428.5538 405.8912 28.8044 0.2996 1497 +1499 3 429.6075 406.1406 28.054 0.2903 1498 +1500 3 430.6885 406.3259 27.4165 0.272 1499 +1501 3 431.8085 406.5318 27.4624 0.2749 1500 +1502 3 432.7249 407.0993 27.0698 0.3056 1501 +1503 3 433.1848 408.0488 26.1993 0.3267 1502 +1504 3 433.266 409.115 25.2784 0.2941 1503 +1505 3 432.9948 410.1881 24.7352 0.2516 1504 +1506 3 432.7489 411.2943 24.8735 0.2318 1505 +1507 3 433.195 412.2839 24.9749 0.2612 1506 +1508 3 434.1846 412.8113 24.8755 0.2892 1507 +1509 3 435.1948 413.3386 24.6268 0.2924 1508 +1510 3 436.1569 413.9255 24.1576 0.3037 1509 +1511 3 437.1785 414.3374 23.429 0.3051 1510 +1512 3 438.2435 414.5158 22.5224 0.3279 1511 +1513 3 439.3738 414.6279 22.3012 0.3189 1512 +1514 3 440.3187 415.2217 22.7391 0.3416 1513 +1515 3 441.2111 415.9298 22.9718 0.3313 1514 +1516 3 442.1869 416.5201 23.1594 0.3305 1515 +1517 3 443.0872 417.1493 23.9243 0.2946 1516 +1518 3 443.9807 417.3266 25.5822 0.268 1517 +1519 3 444.4417 416.424 24.5874 0.2161 1518 +1520 3 444.5584 415.5008 22.96 0.1144 1519 +1521 3 423.1473 398.2115 29.5196 0.1764 1487 +1522 3 422.1554 398.6291 28.6143 0.1909 1521 +1523 3 421.3043 398.2916 27.027 0.2297 1522 +1524 3 421.27 397.8958 24.5543 0.2458 1523 +1525 3 422.1966 398.0422 23.5777 0.2616 1524 +1526 3 423.2411 398.3831 23.3551 0.2433 1525 +1527 3 424.3199 398.5845 22.7268 0.2288 1526 +1528 3 425.3152 399.0272 22.9102 0.2407 1527 +1529 3 426.2716 399.5672 22.9631 0.2741 1528 +1530 3 427.2977 399.3967 22.4496 0.2996 1529 +1531 3 428.3182 398.9128 22.0772 0.2902 1530 +1532 3 429.3604 398.4518 22.1413 0.2555 1531 +1533 3 430.3396 397.8832 22.4949 0.2078 1532 +1534 3 431.3475 397.3661 22.4442 0.1993 1533 +1535 3 432.3622 396.9852 23.0745 0.2398 1534 +1536 3 433.2202 396.4978 24.4423 0.3104 1535 +1537 3 433.4685 395.514 24.9379 0.3305 1536 +1538 3 433.0829 394.5084 25.6004 0.3004 1537 +1539 3 432.9502 393.4056 25.9913 0.2458 1538 +1540 3 433.4433 392.3897 26.2363 0.2415 1539 +1541 3 433.4708 391.3052 27.0808 0.2541 1540 +1542 3 432.8896 390.3328 27.44 0.2288 1541 +1543 3 425.4307 398.1578 48.7099 0.2815 1471 +1544 3 425.6229 397.0366 48.4338 0.2796 1543 +1545 3 425.9558 395.9453 48.6228 0.2545 1544 +1546 3 426.426 394.9248 49.14 0.2542 1545 +1547 3 427.0083 393.941 49.2153 0.2416 1546 +1548 3 427.7164 393.0532 49.56 0.2288 1547 +1549 3 426.9488 392.1163 51.1277 0.1346 1548 +1550 3 426.307 391.3349 52.4367 0.1271 1549 +1551 3 425.6652 390.5524 53.7452 0.1449 1550 +1552 3 425.0154 389.7116 54.7599 0.1884 1551 +1553 3 424.2181 388.9245 55.1205 0.2397 1552 +1554 3 423.4505 388.0803 55.16 0.2908 1553 +1555 3 422.7011 387.2417 55.5904 0.3051 1554 +1556 3 422.2252 386.2304 55.732 0.2958 1555 +1557 3 421.5068 385.3861 55.979 0.2736 1556 +1558 3 420.7254 384.5567 56.1674 0.2952 1557 +1559 3 419.9613 383.7068 56.2148 0.3338 1558 +1560 3 419.3321 382.7687 56.5547 0.3724 1559 +1561 3 418.9031 381.7162 56.6857 0.3715 1560 +1562 3 418.4969 380.6694 57.1701 0.3582 1561 +1563 3 417.8403 379.7863 57.8648 0.3451 1562 +1564 3 417.0475 378.9717 57.8752 0.3212 1563 +1565 3 416.4824 377.9868 57.696 0.2829 1564 +1566 3 415.8749 377.043 58.1832 0.2441 1565 +1567 3 415.0043 376.3405 58.7278 0.2534 1566 +1568 3 414.1108 375.6381 59.0425 0.2781 1567 +1569 3 413.1956 374.962 59.3289 0.2916 1568 +1570 3 412.2404 374.3408 59.593 0.2684 1569 +1571 3 411.3435 373.6327 59.5781 0.231 1570 +1572 3 410.4718 373.0401 60.3968 0.2161 1571 +1573 3 409.6447 372.3377 61.04 0.2255 1572 +1574 3 408.9846 371.4145 61.2567 0.2094 1573 +1575 3 408.813 370.3139 61.364 0.1835 1574 +1576 3 408.7661 369.1825 61.7462 0.1579 1575 +1577 3 408.1964 368.2444 62.092 0.1627 1576 +1578 3 407.3063 367.5683 62.5792 0.1652 1577 +1579 3 406.3271 367.0879 63.3909 0.1652 1578 +1580 3 405.6647 366.1955 63.31 0.1431 1579 +1581 3 405.1956 365.1545 63.2565 0.1398 1580 +1582 3 404.666 364.1546 63.6177 0.1511 1581 +1583 3 403.983 363.2406 63.7305 0.1867 1582 +1584 3 403.1776 362.4409 64.0674 0.2021 1583 +1585 3 402.3311 361.6779 64.2919 0.192 1584 +1586 3 401.512 360.9034 64.7595 0.156 1585 +1587 3 400.7981 360.0294 65.2 0.1289 1586 +1588 3 400.2318 359.049 65.5956 0.1271 1587 +1589 3 399.5203 358.1567 65.6393 0.1511 1588 +1590 3 398.8762 357.4474 67.1286 0.1906 1589 +1591 3 398.3408 356.4704 67.76 0.2288 1590 +1592 3 428.0951 392.5636 48.6256 0.2608 1548 +1593 3 428.7334 391.7296 47.5773 0.2968 1592 +1594 3 429.3226 390.9002 46.3352 0.3146 1593 +1595 3 429.7642 390.5753 44.0191 0.2977 1594 +1596 3 430.0239 389.6544 43.1749 0.2805 1595 +1597 3 430.1966 389.0321 45.3636 0.267 1596 +1598 3 430.875 388.1134 45.5417 0.2799 1597 +1599 3 431.5099 387.1811 45.0993 0.3058 1598 +1600 3 431.8657 386.0943 45.1108 0.3308 1599 +1601 3 432.2387 385.0155 45.2413 0.3432 1600 +1602 3 432.4331 383.9195 45.8749 0.3441 1601 +1603 3 432.5864 382.8876 46.9652 0.357 1602 +1604 3 432.4892 381.7505 47.0392 0.3686 1603 +1605 3 432.2821 380.6557 46.8821 0.3644 1604 +1606 3 432.392 379.6307 45.7741 0.3331 1605 +1607 3 432.6196 378.5485 45.8368 0.3013 1606 +1608 3 433.0806 377.5543 46.4176 0.2924 1607 +1609 3 433.5417 376.519 46.1412 0.2966 1608 +1610 3 434.1331 375.5546 45.724 0.3051 1609 +1611 3 434.6765 374.6074 44.9694 0.3108 1610 +1612 3 435.2943 373.7288 44.5362 0.3236 1611 +1613 3 436.1191 372.9715 45.0556 0.3425 1612 +1614 3 436.9199 372.1878 45.4236 0.3495 1613 +1615 3 437.3569 371.1891 45.0943 0.3363 1614 +1616 3 437.3134 370.1069 44.3663 0.3025 1615 +1617 3 437.2322 368.9983 43.8348 0.2725 1616 +1618 3 437.6875 368.1472 42.9114 0.2587 1617 +1619 3 437.8546 367.1691 42.7252 0.263 1618 +1620 3 437.723 366.0365 42.7711 0.2669 1619 +1621 3 437.5194 364.912 42.8254 0.2573 1620 +1622 3 437.8214 363.8744 42.3604 0.2542 1621 +1623 3 438.2447 362.8368 41.8051 0.2542 1622 +1624 3 438.6737 361.8266 41.0164 0.2876 1623 +1625 3 439.2766 360.8897 41.4098 0.3151 1624 +1626 3 439.8337 359.8967 41.2846 0.3292 1625 +1627 3 439.9664 358.7698 41.2902 0.3062 1626 +1628 3 440.2993 357.8329 39.9602 0.2532 1627 +1629 3 441.052 357.0252 39.3431 0.202 1628 +1630 3 441.3541 356.0048 40.2144 0.1643 1629 +1631 3 441.3209 354.9294 39.3439 0.1525 1630 +1632 3 441.1607 353.8198 39.6567 0.1525 1631 +1633 3 441.4593 352.7215 39.7398 0.1525 1632 +1634 3 441.4936 351.5867 39.597 0.1567 1633 +1635 3 441.6046 350.4701 39.1633 0.1706 1634 +1636 3 441.7167 349.3387 39.0303 0.1891 1635 +1637 3 441.6961 348.197 38.9049 0.2089 1636 +1638 3 441.6469 347.0576 38.6932 0.2161 1637 +1639 3 441.5531 345.9273 38.3387 0.2105 1638 +1640 3 441.6103 344.8165 37.861 0.1978 1639 +1641 3 441.9741 343.7537 37.5169 0.1963 1640 +1642 3 442.3448 342.6829 37.4209 0.2091 1641 +1643 3 442.3859 341.5618 37.5418 0.2275 1642 +1644 3 442.2258 340.4372 37.7535 0.2472 1643 +1645 3 442.0691 339.3047 37.6796 0.26 1644 +1646 3 441.9432 338.1813 37.9327 0.2549 1645 +1647 3 441.8814 337.0556 38.337 0.2293 1646 +1648 3 441.9203 335.9162 38.386 0.197 1647 +1649 3 442.0759 334.7973 38.0394 0.1713 1648 +1650 3 442.3436 333.7002 37.7381 0.1652 1649 +1651 3 442.7051 332.6203 37.9025 0.1789 1650 +1652 3 443.1284 331.5667 38.2306 0.2045 1651 +1653 3 443.6524 330.5782 38.7545 0.2161 1652 +1654 3 444.2541 329.6253 38.988 0.2019 1653 +1655 3 444.8547 328.6529 38.9189 0.1765 1654 +1656 3 445.3535 327.629 38.7934 0.151 1655 +1657 3 445.9198 326.6486 38.8388 0.1398 1656 +1658 3 446.5318 325.6957 39.1969 0.1469 1657 +1659 3 447.121 324.7233 39.3092 0.1741 1658 +1660 3 447.6289 323.7085 39.4386 0.2051 1659 +1661 3 448.0762 322.6663 39.8 0.2161 1660 +1662 3 448.6276 321.6734 39.9552 0.2161 1661 +1663 3 449.3014 320.7536 40.0988 0.2238 1662 +1664 3 449.9993 319.8498 40.1106 0.2677 1663 +1665 3 450.6079 318.8866 40.1705 0.3319 1664 +1666 3 451.0334 317.8364 40.4202 0.3958 1665 +1667 3 451.2977 316.7278 40.6174 0.4195 1666 +1668 3 451.4807 315.601 40.7784 0.4035 1667 +1669 3 451.2451 314.5394 41.169 0.3686 1668 +1670 3 450.7989 313.4949 41.2482 0.3384 1669 +1671 3 450.2395 312.5053 41.3784 0.3032 1670 +1672 3 450.2223 311.4529 41.9695 0.231 1671 +1673 3 450.434 310.4908 43.3527 0.1578 1672 +1674 3 450.5678 309.3765 43.344 0.1278 1673 +1675 3 450.6754 308.3824 42.0333 0.1424 1674 +1676 3 450.2715 307.5289 40.5927 0.1836 1675 +1677 3 450.2326 306.4021 41.0698 0.2706 1676 +1678 3 450.1834 305.2672 41.2404 0.3562 1677 +1679 3 450.2578 304.1301 41.2196 0.397 1678 +1680 3 450.3653 303.0021 41.5167 0.3911 1679 +1681 3 450.2933 301.8741 41.797 0.3656 1680 +1682 3 449.9363 300.8526 41.2317 0.348 1681 +1683 3 449.6183 299.7966 41.032 0.3117 1682 +1684 3 449.5199 298.7064 41.6198 0.2748 1683 +1685 3 449.5462 297.6345 42.0174 0.2669 1684 +1686 3 449.417 296.5465 42.0927 0.2669 1685 +1687 3 449.2294 295.4735 42.9265 0.2612 1686 +1688 3 448.9228 294.5034 44.0342 0.2405 1687 +1689 3 448.4366 293.571 44.4884 0.2135 1688 +1690 3 447.916 292.5563 44.338 0.2034 1689 +1691 3 447.288 291.6411 43.8612 0.2272 1690 +1692 3 446.716 290.6858 43.3367 0.2801 1691 +1693 3 446.0456 289.8896 42.28 0.3432 1692 +1694 3 426.1617 404.5767 50.5719 0.1883 1465 +1695 3 427.117 403.9613 50.904 0.2277 1694 +1696 3 428.1042 403.3847 50.9527 0.2658 1695 +1697 3 429.0606 402.7566 50.9345 0.2916 1696 +1698 3 430.1177 402.3288 50.7637 0.2924 1697 +1699 3 431.2411 402.1126 50.7987 0.2675 1698 +1700 3 432.289 401.6733 51.1 0.2296 1699 +1701 3 433.2591 401.0795 51.3962 0.2039 1700 +1702 3 434.2681 400.5567 51.7244 0.2034 1701 +1703 3 435.3263 400.3394 52.6333 0.241 1702 +1704 3 436.4074 400.019 52.1956 0.2795 1703 +1705 3 437.5091 399.8829 51.515 0.3177 1704 +1706 3 438.5902 399.5077 51.5284 0.3305 1705 +1707 3 439.6335 399.0592 51.858 0.3559 1706 +1708 3 440.7191 398.8178 51.203 0.3432 1707 +1709 3 441.8574 398.7343 51.0051 0.3305 1708 +1710 3 442.9831 398.5467 51.2 0.2924 1709 +1711 3 444.0402 398.2825 52.0472 0.3051 1710 +1712 3 445.1087 398.0376 52.8514 0.3178 1711 +1713 3 446.192 397.699 53.1938 0.3559 1712 +1714 3 447.2662 397.3043 53.1815 0.3432 1713 +1715 3 448.289 396.7941 53.0788 0.3178 1714 +1716 3 449.0738 396.221 53.1731 0.2584 1715 +1717 3 450.1423 395.8629 53.1829 0.2511 1716 +1718 3 451.2428 395.5552 53.1174 0.2542 1717 +1719 3 452.2129 394.9694 53.0362 0.2247 1718 +1720 3 453.0354 394.2441 52.3359 0.1762 1719 +1721 3 454.0353 393.8128 51.6242 0.1432 1720 +1722 3 454.9985 393.4937 52.7271 0.1652 1721 +1723 3 455.8829 393.3324 54.4393 0.2303 1722 +1724 3 456.9902 393.56 54.8691 0.2938 1723 +1725 3 458.053 393.9742 54.9452 0.3312 1724 +1726 3 459.0323 394.4832 55.6693 0.3425 1725 +1727 3 460.0848 394.7246 56.4029 0.3292 1726 +1728 3 461.0881 394.1972 56.5079 0.3153 1727 +1729 3 461.9781 393.528 56.4245 0.308 1728 +1730 3 463.1004 393.433 56.3203 0.3216 1729 +1731 3 464.2146 393.6447 56.3604 0.3267 1730 +1732 3 465.2602 393.9181 57.1967 0.3098 1731 +1733 3 466.2189 394.3402 58.1756 0.2798 1732 +1734 3 467.2485 394.6903 58.133 0.2588 1733 +1735 3 468.3616 394.6617 58.0006 0.2718 1734 +1736 3 469.4644 394.6583 58.7345 0.2898 1735 +1737 3 470.5421 394.7864 59.383 0.2998 1736 +1738 3 471.6186 395.0667 59.9124 0.2762 1737 +1739 3 472.7294 395.125 60.4206 0.2431 1738 +1740 3 473.8654 395.0392 60.335 0.2231 1739 +1741 3 474.998 394.9752 60.2686 0.2221 1740 +1742 3 476.1385 394.9957 60.3142 0.2288 1741 +1743 3 477.2791 395.0415 60.3151 0.2288 1742 +1744 3 478.4185 395.0369 60.4898 0.2413 1743 +1745 3 479.5568 395.0529 60.5497 0.2542 1744 +1746 3 480.6813 395.2451 60.615 0.2478 1745 +1747 3 481.8013 395.3561 60.9255 0.2216 1746 +1748 3 482.9236 395.2165 61.2637 0.2102 1747 +1749 3 484.0539 395.0987 61.3718 0.2298 1748 +1750 3 485.1395 395.3012 61.7487 0.2415 1749 +1751 3 486.0719 395.0575 62.5257 0.2061 1750 +1752 3 486.6027 394.2167 63.7731 0.1526 1751 +1753 3 486.5775 393.1585 64.533 0.1206 1752 +1754 3 486.1908 392.1094 65.0336 0.1144 1753 +1755 3 485.9735 390.9998 65.219 0.1144 1754 +1756 3 485.5857 389.9335 65.329 0.1144 1755 +1757 3 485.2242 388.865 65.7591 0.1144 1756 +1758 3 484.9599 387.7782 66.3373 0.1144 1757 +1759 3 484.9347 386.6697 66.9606 0.1144 1758 +1760 3 484.873 385.5383 67.2946 0.1246 1759 +1761 3 484.5938 384.4538 67.804 0.1374 1760 +1762 3 484.1797 383.4173 68.4135 0.1501 1761 +1763 3 483.8193 382.3626 69.0365 0.1421 1762 +1764 3 483.9154 381.2574 69.4938 0.1398 1763 +1765 3 484.0996 380.142 69.923 0.1398 1764 +1766 3 483.888 379.1136 70.9411 0.1512 1765 +1767 3 484.1408 378.092 71.96 0.1144 1766 +1768 3 449.6904 396.6889 51.8938 0.2217 1715 +1769 3 450.7738 396.4006 51.6163 0.2476 1768 +1770 3 451.753 395.9167 50.9172 0.2638 1769 +1771 3 452.6636 395.2589 50.5061 0.2766 1770 +1772 3 453.5422 394.5313 50.3096 0.2895 1771 +1773 3 454.2561 393.647 50.3843 0.3127 1772 +1774 3 454.8315 392.6677 50.1469 0.328 1773 +1775 3 455.3692 391.6621 49.924 0.3408 1774 +1776 3 456.0602 390.7584 50.0422 0.312 1775 +1777 3 456.5693 389.7928 49.3618 0.2727 1776 +1778 3 457.0028 388.7472 49.0378 0.2233 1777 +1779 3 457.7956 387.9464 49.1862 0.2051 1778 +1780 3 458.6971 387.2497 49.005 0.1808 1779 +1781 3 459.6992 386.7029 49.0893 0.1663 1780 +1782 3 460.7208 386.2258 48.6517 0.1769 1781 +1783 3 461.8065 385.8804 48.7542 0.202 1782 +1784 3 462.8601 385.4411 48.573 0.2283 1783 +1785 3 463.9217 385.0704 48.0679 0.2163 1784 +1786 3 465.0063 384.7867 47.5121 0.2035 1785 +1787 3 466.0656 384.384 47.88 0.2288 1786 +1788 3 424.5304 414.5181 48.6119 0.4049 1457 +1789 3 425.6149 414.3488 48.4985 0.3843 1788 +1790 3 426.7326 414.3511 47.9606 0.3226 1789 +1791 3 427.8629 414.4518 48.193 0.293 1790 +1792 3 428.9222 414.4197 49.2402 0.3297 1791 +1793 3 430.0628 414.3614 49.1826 0.3939 1792 +1794 3 431.161 414.1658 48.5643 0.4576 1793 +1795 3 432.2512 413.365 49.2086 0.2714 1794 +1796 3 433.2728 412.8753 49.0532 0.2178 1795 +1797 3 434.3871 412.674 48.8684 0.1954 1796 +1798 3 435.5208 412.5367 48.7368 0.2072 1797 +1799 3 436.5996 412.1901 48.5598 0.2509 1798 +1800 3 437.6761 411.8228 48.7026 0.318 1799 +1801 3 438.6462 411.2348 48.648 0.3665 1800 +1802 3 439.7719 411.0918 48.4428 0.3813 1801 +1803 3 440.9102 411.0392 48.6889 0.3813 1802 +1804 3 441.4364 410.8836 48.9308 0.2766 1803 +1805 3 442.4832 410.5747 49.7518 0.2086 1804 +1806 3 443.4899 410.0565 49.77 0.2034 1805 +1807 3 444.4795 409.6218 50.6562 0.24 1806 +1808 3 445.4221 409.004 51.1188 0.2782 1807 +1809 3 446.255 408.2204 51.1778 0.2921 1808 +1810 3 447.264 407.7022 50.8547 0.2401 1809 +1811 3 448.2798 407.1988 50.5025 0.1775 1810 +1812 3 449.2545 406.6016 50.5646 0.1667 1811 +1813 3 450.2967 406.1703 50.9656 0.2067 1812 +1814 3 451.292 406.0022 52.2808 0.2805 1813 +1815 3 452.3296 405.7425 53.0818 0.2936 1814 +1816 3 453.2048 405.0698 52.4322 0.3051 1815 +1817 3 454.2504 404.6179 52.4031 0.3133 1816 +1818 3 455.2376 404.0986 52.9556 0.3625 1817 +1819 3 456.1048 403.3721 53.3652 0.3963 1818 +1820 3 456.9628 402.6388 53.6164 0.3994 1819 +1821 3 457.8139 401.9021 53.1835 0.3564 1820 +1822 3 458.6193 401.1001 53.3268 0.3014 1821 +1823 3 459.4636 400.3863 53.9221 0.2476 1822 +1824 3 460.4646 399.8623 54.2038 0.2254 1823 +1825 3 461.4816 399.399 54.014 0.2199 1824 +1826 3 462.6142 399.288 54.1321 0.2208 1825 +1827 3 463.7296 399.3178 54.595 0.1905 1826 +1828 3 464.798 399.6484 55.1062 0.1517 1827 +1829 3 465.7796 400.1723 55.7052 0.1225 1828 +1830 3 466.6811 400.6963 55.3316 0.1195 1829 +1831 3 467.5631 400.948 55.1653 0.1335 1830 +1832 3 468.5916 401.0075 55.5932 0.1613 1831 +1833 3 469.6109 401.2912 54.8041 0.2016 1832 +1834 3 470.5444 401.8025 55.1516 0.251 1833 +1835 3 471.6094 402.0108 55.8155 0.2759 1834 +1836 3 472.6859 401.7545 56.294 0.2701 1835 +1837 3 473.4066 400.9274 56.4973 0.2559 1836 +1838 3 473.8334 399.9664 57.5322 0.2542 1837 +1839 3 474.6033 399.2537 58.6062 0.2542 1838 +1840 3 475.578 398.6691 58.5956 0.2168 1839 +1841 3 476.4074 397.9095 58.0905 0.1781 1840 +1842 3 477.1212 397.0218 57.8435 0.1653 1841 +1843 3 478.0776 396.396 57.96 0.2288 1842 +1844 3 441.9592 411.1788 47.9024 0.2339 1803 +1845 3 443.0174 411.594 47.614 0.2042 1844 +1846 3 444.0047 412.1626 47.3729 0.2158 1845 +1847 3 444.8753 412.8913 47.6826 0.2659 1846 +1848 3 445.7138 413.6681 47.8036 0.2794 1847 +1849 3 446.684 414.2504 47.4074 0.2923 1848 +1850 3 447.5694 414.668 45.9637 0.2796 1849 +1851 3 448.6276 415.0009 45.2833 0.2794 1850 +1852 3 449.759 415.1599 45.2497 0.2675 1851 +1853 3 450.8973 415.0546 45.2012 0.2803 1852 +1854 3 452.039 415.0169 45.1576 0.2916 1853 +1855 3 453.143 414.8876 44.5024 0.278 1854 +1856 3 454.2366 414.668 43.9062 0.2525 1855 +1857 3 455.36 414.4655 44.0765 0.2297 1856 +1858 3 456.48 414.2424 44.0681 0.2424 1857 +1859 3 457.6034 414.2161 44.4212 0.2542 1858 +1860 3 458.6719 414.5753 43.967 0.2531 1859 +1861 3 459.7404 414.9666 44.1129 0.2402 1860 +1862 3 460.7849 415.2869 44.9056 0.2288 1861 +1863 3 461.8248 415.7571 45.0542 0.2307 1862 +1864 3 462.8384 416.265 44.9873 0.2415 1863 +1865 3 463.9263 416.5235 45.0318 0.247 1864 +1866 3 465.0349 416.6425 45.5333 0.2481 1865 +1867 3 466.1606 416.5258 45.7836 0.2536 1866 +1868 3 467.2645 416.2387 45.9052 0.2669 1867 +1869 3 468.3753 415.9813 45.8287 0.2731 1868 +1870 3 469.3889 416.2147 46.1552 0.2666 1869 +1871 3 470.2126 416.9605 46.7292 0.2542 1870 +1872 3 471.1427 417.5463 46.6371 0.2616 1871 +1873 3 472.1757 418.0084 46.2529 0.2746 1872 +1874 3 473.0749 418.6834 45.9264 0.264 1873 +1875 3 473.9443 419.4098 45.5661 0.2305 1874 +1876 3 474.9785 419.7599 45.1105 0.208 1875 +1877 3 476.0985 419.6947 45.1522 0.2202 1876 +1878 3 477.1944 419.7748 45.7542 0.2288 1877 +1879 3 478.16 420.3022 46.256 0.2113 1878 +1880 3 479.0626 420.9977 46.2997 0.1764 1879 +1881 3 479.9652 421.5983 45.5269 0.1557 1880 +1882 3 480.7717 422.1909 44.1888 0.1725 1881 +1883 3 481.8082 422.5467 43.7469 0.2106 1882 +1884 3 482.8664 422.1978 43.6276 0.2601 1883 +1885 3 483.9498 421.8546 43.3303 0.2782 1884 +1886 3 485.0686 421.8157 42.7994 0.2564 1885 +1887 3 486.2011 421.8958 42.4908 0.2075 1886 +1888 3 487.328 421.7299 42.3035 0.1555 1887 +1889 3 488.3313 421.1888 42.2232 0.1282 1888 +1890 3 489.3689 420.7071 42.3013 0.1149 1889 +1891 3 490.4911 420.4921 42.2878 0.1144 1890 +1892 3 491.626 420.3742 42.4637 0.1144 1891 +1893 3 492.7574 420.4738 42.1546 0.1144 1892 +1894 3 493.8316 420.7174 41.3963 0.1144 1893 +1895 3 494.9436 420.952 41.0617 0.1144 1894 +1896 3 496.0418 420.849 40.3217 0.1144 1895 +1897 3 497.1824 420.7632 40.32 0.1144 1896 +1898 3 431.9813 414.4735 48.5276 0.2727 1794 +1899 3 433.0852 414.7229 48.5624 0.1397 1898 +1900 3 434.1228 415.0558 48.2068 0.1335 1899 +1901 3 435.1467 415.4791 47.8579 0.1528 1900 +1902 3 436.142 415.9881 47.9632 0.1787 1901 +1903 3 437.0263 416.7089 47.8884 0.212 1902 +1904 3 437.8214 417.5074 48.0894 0.2361 1903 +1905 3 438.6451 418.283 48.309 0.2263 1904 +1906 3 439.5317 418.9957 48.0931 0.1929 1905 +1907 3 440.5647 419.3893 47.8862 0.1613 1906 +1908 3 441.6915 419.4842 47.5415 0.1525 1907 +1909 3 442.8241 419.5906 47.5138 0.17 1908 +1910 3 443.9338 419.4144 47.5745 0.2146 1909 +1911 3 445.0137 419.5506 47.1187 0.2662 1910 +1912 3 446.1142 419.7107 46.4971 0.2701 1911 +1913 3 447.2102 419.7954 45.7265 0.2183 1912 +1914 3 448.329 419.967 45.5661 0.1738 1913 +1915 3 449.4307 420.269 45.5927 0.1955 1914 +1916 3 450.466 420.746 45.7178 0.2747 1915 +1917 3 451.5231 421.1773 45.857 0.3439 1916 +1918 3 452.5138 421.7413 45.9774 0.3665 1917 +1919 3 453.4576 422.319 45.3432 0.3469 1918 +1920 3 454.327 423.0478 45.3242 0.2988 1919 +1921 3 455.3875 423.3898 44.8854 0.2584 1920 +1922 3 456.4068 423.8863 45.0526 0.2315 1921 +1923 3 457.4845 424.2364 44.7535 0.2402 1922 +1924 3 458.5884 424.1334 44.1521 0.2298 1923 +1925 3 459.721 424.1483 43.7928 0.2288 1924 +1926 3 460.7483 423.7342 44.4744 0.2298 1925 +1927 3 461.8465 423.455 44.5329 0.2818 1926 +1928 3 462.8704 423.6712 45.5062 0.3226 1927 +1929 3 463.8989 424.1346 45.194 0.3559 1928 +1930 3 464.8369 424.7375 45.6792 0.3536 1929 +1931 3 465.5394 425.6206 46.1068 0.3302 1930 +1932 3 466.2669 426.4878 46.2493 0.271 1931 +1933 3 467.1684 427.1364 46.8289 0.2345 1932 +1934 3 467.8868 427.8835 47.7462 0.2211 1933 +1935 3 468.3342 428.9234 48.1043 0.2229 1934 +1936 3 469.0297 429.715 48.5316 0.2161 1935 +1937 3 470.0604 430.1566 48.704 0.223 1936 +1938 3 470.9104 430.8361 48.7707 0.2426 1937 +1939 3 471.4561 431.82 49.1826 0.2612 1938 +1940 3 471.9652 432.8107 49.7748 0.2669 1939 +1941 3 472.798 433.5074 50.15 0.2747 1940 +1942 3 473.7636 434.0061 50.8878 0.2715 1941 +1943 3 474.6342 434.6651 51.5922 0.2669 1942 +1944 3 475.4739 435.427 51.9677 0.2406 1943 +1945 3 476.4543 435.9864 51.9652 0.2288 1944 +1946 3 477.4427 436.5447 52.19 0.2012 1945 +1947 3 478.1291 437.3912 52.8091 0.1811 1946 +1948 3 478.7102 438.3636 52.8021 0.1487 1947 +1949 3 479.4664 439.2113 52.8032 0.13 1948 +1950 3 480.2638 439.7845 54.0548 0.1168 1949 +1951 3 480.7671 440.7374 54.4897 0.1248 1950 +1952 3 481.2213 441.767 54.0837 0.1375 1951 +1953 3 481.7864 442.7543 53.8362 0.1504 1952 +1954 3 482.0622 443.8526 53.93 0.1417 1953 +1955 3 482.1422 444.9874 53.72 0.129 1954 +1956 3 482.323 446.1108 53.4498 0.1162 1955 +1957 3 482.5072 447.2388 53.3221 0.1144 1956 +1958 3 482.5449 448.3794 53.3607 0.1364 1957 +1959 3 482.1411 449.433 53.1852 0.1637 1958 +1960 3 481.2682 450.1617 53.1401 0.1893 1959 +1961 3 480.3427 450.8207 53.4517 0.1661 1960 +1962 3 479.4355 451.4693 54.084 0.1528 1961 +1963 3 478.5375 452.1317 54.6974 0.1525 1962 +1964 3 477.8488 453.024 55.16 0.2288 1963 +1965 2 416.948 419.5403 47.6647 0.1144 1 +1966 2 417.6046 420.4761 47.5507 0.1144 1965 +1967 2 418.2624 421.4107 47.4365 0.1144 1966 +1968 2 419.0827 422.1554 47.2511 0.1206 1967 +1969 2 419.8949 422.899 46.9409 0.1417 1968 +1970 2 420.3376 423.9332 46.9924 0.1684 1969 +1971 2 421.1339 424.5533 46.8101 0.1864 1970 +1972 2 422.2024 424.7397 47.327 0.1819 1971 +1973 2 423.0375 425.2854 48.4434 0.1678 1972 +1974 2 423.4688 426.3036 48.8449 0.1441 1973 +1975 2 423.9092 427.3504 49.1618 0.129 1974 +1976 2 424.4663 428.3456 49.1 0.1271 1975 +1977 2 425.044 429.326 48.8174 0.138 1976 +1978 2 425.6584 430.2641 49.264 0.1626 1977 +1979 2 426.5004 431.0043 49.7773 0.1652 1978 +1980 2 427.2176 431.86 49.2498 0.1652 1979 +1981 2 427.856 432.7752 49.84 0.1144 1980 +1982 3 416.8999 419.236 45.1746 0.1144 1 +1983 3 417.5245 420.0013 43.7637 0.1144 1982 +1984 3 418.1492 420.7666 42.3525 0.1256 1983 +1985 3 418.8058 421.5446 41.0732 0.161 1984 +1986 3 419.6936 422.2138 40.4936 0.2238 1985 +1987 3 420.7815 422.5284 40.2144 0.2883 1986 +1988 3 421.8306 422.136 39.8532 0.3432 1987 +1989 3 420.9016 421.6544 39.0558 0.2669 1988 +1990 3 420.6728 420.8055 37.8036 0.2669 1989 +1991 3 420.8696 419.7256 37.0546 0.2669 1990 +1992 3 420.8616 418.6216 36.7489 0.2838 1991 +1993 3 420.4063 418.0027 35.1926 0.3144 1992 +1994 3 419.3424 417.8208 34.6254 0.3178 1993 +1995 3 418.2556 417.4776 34.386 0.267 1994 +1996 3 417.2934 416.8988 33.8489 0.1144 1995 +1997 3 416.6826 416.4526 32.8378 0.1949 1996 +1998 3 415.7937 416.0373 31.4345 0.2569 1997 +1999 3 415.0318 415.725 32.6483 0.3018 1998 +2000 3 414.104 415.828 34.2311 0.3424 1999 +2001 3 412.9829 415.9492 34.6629 0.3807 2000 +2002 3 412.0562 416.0728 33.0711 0.4195 2001 +2003 3 411.3218 415.9836 33.0798 0.3811 2002 +2004 3 410.4649 416.0259 32.1793 0.3432 2003 +2005 3 409.989 416.7146 31.2967 0.3363 2004 +2006 3 409.3449 417.6046 32.006 0.3305 2005 +2007 3 408.5727 418.3928 32.0331 0.2806 2006 +2008 3 407.8738 419.2588 31.4084 0.244 2007 +2009 3 407.0947 420.0699 31.8041 0.2183 2008 +2010 3 406.311 420.8993 31.9318 0.2278 2009 +2011 3 405.6212 421.7699 31.2973 0.2288 2010 +2012 3 405.3478 422.6062 29.5565 0.2044 2011 +2013 3 404.7907 423.304 29.9611 0.1631 2012 +2014 3 404.9302 424.1872 30.3162 0.1398 2013 +2015 3 404.7712 424.8667 28.285 0.1398 2014 +2016 3 404.2461 425.6138 28.126 0.1658 2015 +2017 3 403.6993 426.402 29.6089 0.1991 2016 +2018 3 402.8768 427.1307 29.5758 0.2367 2017 +2019 3 402.267 427.5025 27.5783 0.2549 2018 +2020 3 401.1699 427.7748 27.2474 0.2669 2019 +2021 3 400.0488 427.8732 27.0144 0.2613 2020 +2022 3 398.9952 427.7954 26.4026 0.2345 2021 +2023 3 397.9335 427.5185 27.0337 0.2076 2022 +2024 3 396.8422 427.5437 26.9671 0.2073 2023 +2025 3 395.7943 427.379 26.068 0.2526 2024 +2026 3 394.7109 427.1284 25.6917 0.3043 2025 +2027 3 393.5886 426.9419 25.5492 0.3178 2026 +2028 3 392.4744 426.7749 25.6449 0.2911 2027 +2029 3 391.3658 426.744 26.3105 0.2574 2028 +2030 3 390.2584 426.831 26.364 0.2415 2029 +2031 3 389.151 426.9934 26.5317 0.2185 2030 +2032 3 388.1089 427.149 25.9809 0.1956 2031 +2033 3 387.0221 427.2783 25.5049 0.1907 2032 +2034 3 385.909 427.2119 25.9552 0.2287 2033 +2035 3 384.8565 427.4327 26.761 0.2852 2034 +2036 3 383.8051 427.4453 25.9179 0.3172 2035 +2037 3 383.0238 428.2347 25.3394 0.3042 2036 +2038 3 381.9896 428.563 25.1919 0.2841 2037 +2039 3 380.8696 428.5813 25.3266 0.2978 2038 +2040 3 379.76 428.7449 25.5338 0.3111 2039 +2041 3 378.791 429.1556 25.9759 0.2974 2040 +2042 3 378.4009 430.0102 25.0701 0.2707 2041 +2043 3 378.386 431.0169 25.5394 0.2563 2042 +2044 3 377.8826 431.9664 25.104 0.2881 2043 +2045 3 376.9228 432.4537 24.2948 0.3161 2044 +2046 3 376.1472 433.2328 24.92 0.3432 2045 +2047 3 411.3046 415.129 32.1364 0.3456 2002 +2048 3 410.4855 414.4174 31.99 0.3138 2047 +2049 3 409.4227 414.2413 32.5049 0.3226 2048 +2050 3 408.3096 414.2378 32.2269 0.3486 2049 +2051 3 407.248 413.9507 31.5722 0.3753 2050 +2052 3 406.215 414.1028 30.6886 0.3707 2051 +2053 3 405.2071 413.7654 29.8875 0.3457 2052 +2054 3 404.0848 413.6018 29.9158 0.3192 2053 +2055 3 402.9706 413.3466 29.8385 0.3052 2054 +2056 3 401.8872 412.984 29.68 0.3432 2055 +2057 3 417.5211 416.6917 30.9996 0.2585 1996 +2058 3 418.5049 416.2192 30.2204 0.3615 2057 +2059 3 419.6066 416.1208 29.965 0.4149 2058 +2060 3 420.3937 416.7192 28.9204 0.3664 2059 +2061 3 420.6831 417.3095 26.759 0.2968 2060 +2062 3 421.0195 418.2567 25.6124 0.2542 2061 +2063 3 421.6704 419.181 25.3901 0.2486 2062 +2064 3 422.5719 419.6444 25.4464 0.2545 2063 +2065 3 423.6827 419.578 25.9115 0.2744 2064 +2066 3 424.7775 419.3984 25.9818 0.2952 2065 +2067 3 425.8357 419.459 25.1835 0.3051 2066 +2068 3 426.3047 420.1786 23.7658 0.3155 2067 +2069 3 425.8849 421.1579 23.9176 0.3302 2068 +2070 3 425.4879 422.2287 24.0481 0.343 2069 +2071 3 424.4492 422.6954 23.9868 0.3432 2070 +2072 3 423.5317 423.1782 23.6723 0.3241 2071 +2073 3 422.6508 423.8188 22.8981 0.2773 2072 +2074 3 422.1371 424.6837 22.227 0.2488 2073 +2075 3 421.7939 425.6492 21.5152 0.2415 2074 +2076 3 421.2311 426.5965 21.0017 0.2415 2075 +2077 3 420.8536 427.6455 21.0126 0.2336 2076 +2078 3 420.0791 428.2141 21.9215 0.2466 2077 +2079 3 419.0518 428.3708 23.0787 0.2635 2078 +2080 3 418.3963 428.6717 25.0925 0.2669 2079 +2081 3 418.1103 429.6772 25.9507 0.2305 2080 +2082 3 417.3312 430.3728 24.92 0.2288 2081 +2083 3 425.8231 423.153 22.3068 0.225 2071 +2084 3 426.6731 423.7868 21.3234 0.193 2083 +2085 3 427.0072 424.8576 21.2206 0.1907 2084 +2086 3 426.9568 425.9581 21.9419 0.2278 2085 +2087 3 426.7417 427.0598 21.4424 0.254 2086 +2088 3 426.8264 428.1992 21.56 0.2288 2087 +2089 3 422.7709 421.3661 39.0477 0.256 1988 +2090 3 423.7387 420.7975 38.6831 0.2288 2089 +2091 3 424.8244 420.7964 38.0369 0.3008 2090 +2092 3 425.9409 420.5722 38.0584 0.3926 2091 +2093 3 426.9911 420.9794 37.6132 0.4957 2092 +2094 3 428.0928 420.8135 36.906 0.3934 2093 +2095 3 429.2185 420.754 36.7021 0.3232 2094 +2096 3 430.0113 420.9874 35.294 0.2963 2095 +2097 3 430.9928 421.167 34.3991 0.3017 2096 +2098 3 432.1128 421.024 34.188 0.3051 2097 +2099 3 433.147 421.0355 33.1618 0.3051 2098 +2100 3 434.1514 421.3283 32.0667 0.3051 2099 +2101 3 435.2623 421.3958 31.5487 0.3051 2100 +2102 3 436.3628 421.6681 31.2911 0.2933 2101 +2103 3 437.302 422.2996 31.586 0.2924 2102 +2104 3 438.3465 422.7526 31.3732 0.2924 2103 +2105 3 439.4276 422.43 31.2452 0.3296 2104 +2106 3 440.4652 421.9827 30.8042 0.3305 2105 +2107 3 441.5291 421.739 29.9782 0.318 2106 +2108 3 442.6719 421.7745 29.9541 0.3053 2107 +2109 3 443.7908 421.5468 29.8609 0.33 2108 +2110 3 444.913 421.3375 29.664 0.3806 2109 +2111 3 445.9724 421.6406 29.5322 0.3792 2110 +2112 3 446.3499 422.716 29.3829 0.3488 2111 +2113 3 446.5924 423.8211 29.6139 0.2828 2112 +2114 3 447.1942 424.7626 29.8824 0.2202 2113 +2115 3 448.0579 425.3552 29.1102 0.1725 2114 +2116 3 448.8324 425.3701 27.58 0.1525 2115 +2117 3 449.6435 424.5922 27.442 0.1699 2116 +2118 3 450.1102 424.0568 25.632 0.2161 2117 +2119 3 451.0197 423.7525 25.5559 0.2907 2118 +2120 3 452.1477 423.7731 25.5676 0.3373 2119 +2121 3 453.2574 423.6838 24.9785 0.3432 2120 +2122 3 454.2309 423.6461 23.5528 0.3104 2121 +2123 3 455.3143 423.7124 22.7273 0.2941 2122 +2124 3 456.2684 423.1793 23.1028 0.3036 2123 +2125 3 457.211 422.5536 23.506 0.3394 2124 +2126 3 458.3184 422.3076 23.6379 0.3549 2125 +2127 3 459.4315 422.3648 23.0686 0.3559 2126 +2128 3 460.2655 423.0398 22.1992 0.3311 2127 +2129 3 461.1453 423.7342 21.6303 0.3052 2128 +2130 3 461.8591 424.6265 21.5228 0.2288 2129 +2131 3 428.142 422.1623 36.9488 0.3607 2093 +2132 3 428.9966 422.7778 35.9517 0.2996 2131 +2133 3 429.9747 423.0112 34.9129 0.2597 2132 +2134 3 431.0935 423.0146 34.3395 0.2209 2133 +2135 3 432.114 423.2937 33.504 0.1746 2134 +2136 3 433.1333 423.7079 32.9602 0.1448 2135 +2137 3 434.2407 423.9081 33.2004 0.1398 2136 +2138 3 435.3721 424.0328 33.3992 0.1686 2137 +2139 3 436.3857 424.4549 32.7984 0.1993 2138 +2140 3 437.0629 425.3415 32.5702 0.2481 2139 +2141 3 437.2551 426.4557 32.7029 0.277 2140 +2142 3 437.9815 427.2829 33.231 0.3157 2141 +2143 3 439.0077 427.7553 32.933 0.33 2142 +2144 3 439.7078 428.6271 32.4288 0.3431 2143 +2145 3 440.1746 429.5926 33.3942 0.3299 2144 +2146 3 440.7397 430.5822 33.29 0.3034 2145 +2147 3 441.1195 431.598 32.408 0.2663 2146 +2148 3 441.7018 432.5636 32.0118 0.2535 2147 +2149 3 442.3756 433.4536 32.6225 0.2415 2148 +2150 3 443.0186 434.3162 33.5608 0.2406 2149 +2151 3 443.4876 435.3217 34.1928 0.2317 2150 +2152 3 443.8674 436.3948 33.9511 0.2688 2151 +2153 3 444.4028 437.3901 33.5524 0.2924 2152 +2154 3 445.1167 438.2572 33.2749 0.2855 2153 +2155 3 445.6395 439.1965 33.9478 0.2247 2154 +2156 3 446.2538 440.0819 33.4356 0.2071 2155 +2157 3 446.891 440.9411 33.9592 0.2369 2156 +2158 3 447.8337 441.5703 34.071 0.2931 2157 +2159 3 448.694 442.2979 33.7565 0.3296 2158 +2160 3 449.632 442.9225 33.3264 0.3358 2159 +2161 3 450.5438 443.6089 33.1962 0.3305 2160 +2162 3 451.2199 444.5069 33.1201 0.3305 2161 +2163 3 451.554 445.5846 33.2228 0.3305 2162 +2164 3 452.0791 446.5673 33.3119 0.314 2163 +2165 3 452.8856 447.3578 33.0484 0.2799 2164 +2166 3 453.7893 448.0282 32.5578 0.2582 2165 +2167 3 454.6828 448.6528 33.061 0.2542 2166 +2168 3 455.5854 449.2488 33.9704 0.282 2167 +2169 3 456.4835 449.8277 33.4496 0.312 2168 +2170 3 457.1699 450.6982 33.0798 0.3381 2169 +2171 3 457.9855 451.4888 32.951 0.333 2170 +2172 3 458.744 452.3307 32.625 0.3203 2171 +2173 3 459.5723 453.0652 33.1416 0.3075 2172 +2174 3 460.6591 453.1533 33.3698 0.3155 2173 +2175 3 461.7802 453.0446 33.8352 0.3286 2174 +2176 3 462.9127 453.1281 34.0298 0.3421 2175 +2177 3 464.0087 453.4393 34.2294 0.3305 2176 +2178 3 465.1115 453.3798 33.5093 0.303 2177 +2179 3 466.2132 453.2597 33.0711 0.277 2178 +2180 3 467.0472 453.3397 31.9206 0.2518 2179 +2181 3 467.9086 453.2551 33.5829 0.2336 2180 +2182 3 469.048 453.2757 33.8136 0.2161 2181 +2183 3 470.1257 453.0904 33.2979 0.2254 2182 +2184 3 471.0157 453.6006 32.881 0.258 2183 +2185 3 471.9263 454.2778 32.5486 0.2984 2184 +2186 3 472.9879 454.6725 32.6374 0.3161 2185 +2187 3 474.0622 455.0523 32.8947 0.3178 2186 +2188 3 475.1158 455.4378 32.408 0.2942 2187 +2189 3 476.2323 455.6552 32.1608 0.2675 2188 +2190 3 477.3477 455.7868 31.6327 0.2163 2189 +2191 3 478.4208 456.1128 31.08 0.1144 2190 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Rorb_325404214_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Rorb_325404214_m.swc new file mode 100644 index 0000000..cd1d585 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Rorb_325404214_m.swc @@ -0,0 +1,2194 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/neuron tracing and reconstruction/vaa3d/vaa3d_bin_msvc_64bit_v2921_a/vaa3d_bin_msvc_64bit_v2921_a/new 168053.04.01.01.swc +# id,type,x,y,z,r,pid +1 1 415.6095 417.7339 47.8951 6.2366 -1 +2 4 413.4633 416.9525 48.2236 0.1144 1 +3 4 412.3903 416.5624 48.3879 0.1652 2 +4 4 411.3172 416.1712 48.552 0.2542 3 +5 4 410.2441 415.7811 48.7166 0.3813 4 +6 4 409.1001 415.7559 48.72 0.4576 5 +7 4 409.1871 414.7286 47.5728 0.2587 6 +8 4 408.9468 413.7368 46.8028 0.2501 7 +9 4 408.4984 412.7644 46.6435 0.2908 8 +10 4 408.6242 411.7382 45.6862 0.3458 9 +11 4 409.0727 410.9088 44.2305 0.3686 10 +12 4 409.8048 410.1068 43.4174 0.3514 11 +13 4 410.4535 409.2797 43.8572 0.3085 12 +14 4 411.0884 408.408 44.1526 0.2746 13 +15 4 411.6181 407.415 43.7422 0.2852 14 +16 4 412.0162 406.3522 43.4109 0.3197 15 +17 4 412.4715 405.3181 43.0052 0.3672 16 +18 4 413.0721 404.4749 41.925 0.4006 17 +19 4 413.5045 403.538 40.7725 0.3955 18 +20 4 413.9804 402.5095 40.8229 0.3338 19 +21 4 414.533 401.5509 40.1475 0.2932 20 +22 4 415.3326 400.9068 38.9242 0.3176 21 +23 4 416.3394 400.972 37.6132 0.572 22 +24 4 416.9869 400.3554 39.8726 0.3938 23 +25 4 417.7831 400.1895 41.337 0.3185 24 +26 4 418.8962 400.0431 41.5464 0.2855 25 +27 4 419.9006 399.5306 41.4324 0.2954 26 +28 4 420.7186 398.787 40.8402 0.3374 27 +29 4 420.6717 397.6967 40.549 0.3432 28 +30 4 420.6763 396.5539 40.5409 0.3432 29 +31 4 420.4795 395.4293 40.5177 0.3432 30 +32 4 420.2175 394.3322 40.0576 0.3926 31 +33 4 420.1672 393.2317 39.3039 0.4188 32 +34 4 420.0779 392.1106 38.7923 0.4195 33 +35 4 420.1958 390.9849 39.1642 0.3822 34 +36 4 420.1546 389.8455 39.3565 0.3316 35 +37 4 420.0539 388.7209 39.8135 0.2806 36 +38 4 419.8549 387.6101 40.2632 0.2297 37 +39 4 419.848 386.4718 40.5278 0.2545 38 +40 4 420.2507 385.4136 40.178 0.3079 39 +41 4 420.4795 384.4206 38.9511 0.3813 40 +42 4 420.9943 383.4002 38.9544 0.3824 41 +43 4 421.4084 382.366 39.0348 0.394 42 +44 4 421.8683 381.5972 37.5304 0.3957 43 +45 4 422.6108 380.7655 38.134 0.3996 44 +46 4 423.2708 379.856 38.1679 0.3475 45 +47 4 423.6724 378.8081 37.8428 0.3077 46 +48 4 424.2261 377.8289 38.281 0.283 47 +49 4 424.6448 376.8485 38.7008 0.2885 48 +50 4 424.6322 375.7262 38.1615 0.2701 49 +51 4 424.7672 374.6154 37.7213 0.259 50 +52 4 425.3072 373.6853 37.2333 0.2619 51 +53 4 426.116 372.9177 36.7326 0.2598 52 +54 4 426.8939 372.0929 36.4652 0.2607 53 +55 4 427.6169 371.2269 36.2782 0.2477 54 +56 4 428.1729 370.2499 36.568 0.2482 55 +57 4 428.301 369.1997 37.119 0.268 56 +58 4 428.3296 368.0866 37.1496 0.2796 57 +59 4 428.476 366.9975 37.5558 0.2646 58 +60 4 428.4921 365.9404 38.614 0.2382 59 +61 4 428.6797 364.9795 38.04 0.2378 60 +62 4 428.9897 363.9556 38.1763 0.2415 61 +63 4 429.5823 362.9992 38.2914 0.2415 62 +64 4 430.096 362.2213 36.759 0.2418 63 +65 4 430.3202 361.1105 36.3874 0.2551 64 +66 4 430.7183 360.0397 36.2569 0.2796 65 +67 4 430.8579 358.9197 36.0772 0.2811 66 +68 4 430.525 357.8295 35.9792 0.2924 67 +69 4 430.2115 356.7541 35.4085 0.2942 68 +70 4 429.9884 355.6582 35.2243 0.3032 69 +71 4 429.9575 354.592 35.8677 0.2844 70 +72 4 429.6738 353.5406 35.5443 0.2442 71 +73 4 429.8992 352.4286 35.8708 0.2127 72 +74 4 430.1532 351.327 36.101 0.2107 73 +75 4 430.3842 350.2345 35.5944 0.2401 74 +76 4 430.6085 349.1705 34.858 0.271 75 +77 4 430.5833 348.0357 34.8202 0.2796 76 +78 4 430.4552 346.91 34.9826 0.2749 77 +79 4 430.1429 345.8644 35.2422 0.2669 78 +80 4 429.6887 344.8828 35.9436 0.2669 79 +81 4 429.4027 343.7823 35.9912 0.2617 80 +82 4 429.3283 342.644 35.9752 0.2488 81 +83 4 429.2654 341.5092 35.7739 0.2415 82 +84 4 428.9542 340.4315 35.8243 0.2476 83 +85 4 428.5435 339.3756 35.9411 0.2542 84 +86 4 428.2964 338.2659 35.7216 0.241 85 +87 4 428.253 337.1345 35.7787 0.2155 86 +88 4 428.1935 336.002 35.887 0.2034 87 +89 4 428.047 334.8694 35.7493 0.2102 88 +90 4 428.1168 333.7654 35.2537 0.223 89 +91 4 428.6431 332.8171 34.7704 0.2288 90 +92 4 429.3054 331.8961 34.8337 0.2288 91 +93 4 429.9449 330.9512 34.9664 0.2207 92 +94 4 430.3202 329.8987 34.8869 0.1989 93 +95 4 430.4174 328.7684 34.5817 0.1731 94 +96 4 430.6279 327.6588 34.2415 0.1564 95 +97 4 430.7926 326.5354 33.9646 0.1525 96 +98 4 430.9494 325.4142 33.5664 0.1436 97 +99 4 431.0912 324.2851 33.5502 0.1398 98 +100 4 431.0478 323.1537 33.8419 0.1398 99 +101 4 431.0958 322.02 33.7761 0.1683 100 +102 4 431.3578 320.9114 33.7848 0.2067 101 +103 4 431.8943 319.9127 33.9287 0.2647 102 +104 4 432.4148 318.9209 33.4818 0.3095 103 +105 4 432.9239 317.9176 33.7086 0.3281 104 +106 4 433.3358 316.8571 33.9564 0.3305 105 +107 4 433.4238 315.7566 34.571 0.32 106 +108 4 433.3461 314.6229 34.6052 0.3283 107 +109 4 433.2431 313.488 34.3664 0.3305 108 +110 4 433.0887 312.3589 34.5268 0.3517 109 +111 4 432.8175 311.2549 34.7973 0.3453 110 +112 4 432.5212 310.1636 35.2173 0.3218 111 +113 4 432.3656 309.0573 35.8081 0.2853 112 +114 4 432.0648 308.1101 34.6562 0.3042 113 +115 4 431.8589 307.0118 35.1266 0.3426 114 +116 4 431.6495 305.8873 35.1862 0.3808 115 +117 4 431.0535 304.9126 35.303 0.3813 116 +118 4 430.7801 303.8086 35.5578 0.3683 117 +119 4 430.2939 302.7882 35.1344 0.3556 118 +120 4 430.0639 301.6831 34.7032 0.3443 119 +121 4 430.0937 300.5505 34.3185 0.3686 120 +122 4 430.1097 299.4168 34.0116 0.3661 121 +123 4 430.2573 298.3014 34.214 0.3355 122 +124 4 430.7995 297.3164 33.9262 0.2754 123 +125 4 430.8773 296.1953 33.906 0.2567 124 +126 4 430.5833 295.1051 34.3484 0.2754 125 +127 4 430.3225 294.0137 34.8872 0.3123 126 +128 4 430.0273 292.9304 35.1792 0.3354 127 +129 4 429.8694 291.8069 35.0829 0.3377 128 +130 4 429.8408 290.6652 35.1207 0.3305 129 +131 4 429.7127 289.5327 35.0314 0.3249 130 +132 4 429.5125 288.4241 35.3021 0.3178 131 +133 4 429.3077 287.3534 36.1228 0.312 132 +134 4 429.3672 286.3329 36.2785 0.3111 133 +135 4 429.8305 285.3182 35.6964 0.3178 134 +136 4 430.2378 284.2783 35.8817 0.324 135 +137 4 430.5764 283.2144 36.4549 0.3305 136 +138 4 430.9356 282.29 35.7034 0.3378 137 +139 4 431.4768 281.4068 34.9874 0.3272 138 +140 4 432.1952 280.534 35.2635 0.2932 139 +141 4 432.9113 279.6497 35.4343 0.2627 140 +142 4 433.6607 278.7928 35.6118 0.2629 141 +143 4 434.4203 278.0069 36.3698 0.2845 142 +144 4 435.3046 277.3308 36.4988 0.2924 143 +145 4 436.1237 276.7164 35.4046 0.2924 144 +146 4 436.9531 276.1078 34.1916 0.2924 145 +147 4 437.683 275.4283 35.1582 0.2924 146 +148 4 437.8969 274.3449 35.6446 0.2439 147 +149 4 438.4952 273.416 35.0 0.1144 148 +150 4 415.304 399.582 36.0962 0.321 23 +151 4 414.6165 398.7 35.6356 0.286 150 +152 4 414.1074 397.7013 35.1806 0.2956 151 +153 4 413.6109 396.7049 34.594 0.3312 152 +154 4 413.1922 396.0082 32.8079 0.3432 153 +155 4 412.9577 395.0278 32.405 0.3337 154 +156 4 413.1442 393.9204 32.4181 0.3113 155 +157 4 413.6361 392.9057 32.7368 0.3051 156 +158 4 414.4129 392.3119 34.0194 0.3051 157 +159 4 415.3143 391.8303 33.3642 0.3199 158 +160 4 415.7754 390.9952 32.1745 0.3332 159 +161 4 415.4756 389.9232 31.5952 0.3367 160 +162 4 414.9837 388.9348 31.0271 0.3075 161 +163 4 414.3968 388.0551 30.0538 0.2597 162 +164 4 414.0822 387.061 29.3129 0.2108 163 +165 4 414.4048 386.1812 27.8964 0.2034 164 +166 4 414.4449 385.3106 26.6983 0.2496 165 +167 4 413.7802 384.6139 25.3638 0.3076 166 +168 4 413.6818 383.6255 25.338 0.3634 167 +169 4 414.3305 382.7652 26.1512 0.3324 168 +170 4 414.3568 381.6384 26.04 0.2288 169 +171 4 408.0202 415.4951 48.7203 0.483 6 +172 4 406.8808 415.3944 48.722 0.5084 171 +173 4 405.8214 414.9608 48.7309 0.5212 172 +174 4 404.8971 414.287 48.771 0.5466 173 +175 4 404.0402 413.532 48.9317 0.5212 174 +176 4 403.0941 412.952 49.6079 0.4576 175 +177 4 402.1812 412.4841 49.8131 0.4069 176 +178 4 401.1688 411.951 49.812 0.4195 177 +179 4 400.2009 411.3435 49.6801 0.394 178 +180 4 399.3876 410.5873 49.0104 0.3686 179 +181 4 398.5925 409.7682 48.8412 0.3559 180 +182 4 397.8649 408.8988 49.2358 0.3432 181 +183 4 397.111 408.0671 49.7594 0.3051 182 +184 4 396.0185 407.7273 49.6936 0.3178 183 +185 4 394.9077 407.7296 49.0249 0.3686 184 +186 4 393.7648 407.7754 48.9742 0.4449 185 +187 4 392.67 407.9813 49.4808 0.4299 186 +188 4 391.5832 407.9538 49.0952 0.3868 187 +189 4 390.6016 407.518 48.193 0.3358 188 +190 4 389.7093 406.8533 47.6756 0.3001 189 +191 4 388.8616 406.0868 47.6003 0.3025 190 +192 4 387.9613 405.3878 47.5933 0.343 191 +193 4 386.9763 404.8055 47.5619 0.4065 192 +194 4 385.9593 404.2965 47.3673 0.455 193 +195 4 384.9697 403.7679 46.8983 0.4703 194 +196 4 384.0911 403.0632 46.5136 0.4602 195 +197 4 383.2732 402.2636 46.4439 0.4399 196 +198 4 382.4655 401.4559 46.3336 0.4272 197 +199 4 381.6578 400.6494 46.2862 0.4303 198 +200 4 380.8502 399.844 46.48 0.4576 199 +201 4 380.4235 399.3956 45.3678 0.3814 200 +202 4 379.6467 398.557 45.3474 0.2288 201 +203 4 379.236 398.287 46.4797 0.3432 202 +204 4 379.2497 398.8911 48.2451 0.2529 203 +205 4 378.5096 398.4632 50.0976 0.2446 204 +206 4 377.7866 397.8855 51.7076 0.2687 205 +207 4 376.8061 397.4702 52.6896 0.2796 206 +208 4 375.7102 397.2128 53.1577 0.2775 207 +209 4 374.6154 396.8982 53.312 0.269 208 +210 4 373.5995 396.3868 53.606 0.282 209 +211 4 372.5733 395.9018 53.8331 0.295 210 +212 4 371.482 395.5998 54.1478 0.3051 211 +213 4 370.4398 395.228 54.8498 0.2992 212 +214 4 369.3827 394.8676 55.4196 0.2796 213 +215 4 368.2753 394.7292 55.923 0.2764 214 +216 4 367.1897 394.9546 56.4553 0.2706 215 +217 4 366.1647 395.4236 56.9215 0.2648 216 +218 4 365.1099 395.7737 57.5506 0.1946 217 +219 4 364.0437 396.0436 58.2845 0.1608 218 +220 4 363.0118 396.4841 58.7518 0.275 219 +221 4 362.0474 397.0835 59.0744 0.2843 220 +222 4 361.1105 397.6887 59.6562 0.2503 221 +223 4 360.1312 397.9393 60.5413 0.2065 222 +224 4 359.2755 397.3627 61.3416 0.1965 223 +225 4 358.7241 396.404 62.0234 0.2094 224 +226 4 358.1853 395.4282 62.5694 0.2282 225 +227 4 357.3948 394.6754 63.0974 0.2542 226 +228 4 356.4326 394.1595 63.922 0.2801 227 +229 4 355.6673 393.4136 64.3871 0.2924 228 +230 4 355.1685 392.3954 64.1855 0.2718 229 +231 4 354.8127 391.3796 64.6596 0.2182 230 +232 4 354.3185 390.4632 65.721 0.1674 231 +233 4 353.5864 390.0582 67.3389 0.1441 232 +234 4 352.7455 390.4621 68.5376 0.1753 233 +235 4 351.8395 391.1027 69.2101 0.2267 234 +236 4 350.9838 391.8257 69.7435 0.2783 235 +237 4 350.1475 392.5945 69.6993 0.2718 236 +238 4 349.8341 393.655 69.8524 0.2115 237 +239 4 348.8834 394.1778 69.7253 0.1414 238 +240 4 347.8744 394.7063 69.4823 0.1273 239 +241 4 346.8848 395.2806 69.5565 0.1522 240 +242 4 345.7717 395.3756 70.1296 0.1906 241 +243 4 344.6597 395.5838 70.5502 0.216 242 +244 4 343.5352 395.5014 71.0214 0.2161 243 +245 4 342.4358 395.3481 71.6937 0.2034 244 +246 4 341.3467 395.0301 72.065 0.1907 245 +247 4 340.34 394.68 73.08 0.2288 246 +248 4 378.3826 397.5995 46.4792 0.3676 203 +249 4 377.4983 396.8742 46.4766 0.3807 248 +250 4 376.678 396.0768 46.4666 0.3692 249 +251 4 375.9321 395.2097 46.4117 0.3686 250 +252 4 375.1107 394.4249 46.0888 0.3686 251 +253 4 374.0949 393.9444 45.5946 0.3933 252 +254 4 373.0355 393.5349 45.2698 0.394 253 +255 4 372.0299 393.0212 44.8274 0.394 254 +256 4 371.0793 392.3989 44.4973 0.3816 255 +257 4 370.0588 391.8909 44.7177 0.3688 256 +258 4 368.9377 391.6793 44.5665 0.3812 257 +259 4 367.8246 391.4413 44.2938 0.3939 258 +260 4 366.8328 390.8716 44.2406 0.457 259 +261 4 365.8924 390.2195 44.2322 0.4828 260 +262 4 364.9394 389.5881 44.2014 0.5082 261 +263 4 363.9865 388.9577 44.0605 0.4832 262 +264 4 362.9832 388.4544 43.5207 0.4704 263 +265 4 361.9891 387.9018 43.2281 0.4577 264 +266 4 360.9938 387.3424 43.4375 0.4576 265 +267 4 359.9871 386.839 43.937 0.445 266 +268 4 358.9494 386.3597 44.0152 0.4196 267 +269 4 357.9336 385.9009 43.3874 0.3941 268 +270 4 356.8044 385.7499 43.1214 0.3813 269 +271 4 355.6616 385.6973 43.1144 0.394 270 +272 4 354.5588 385.3953 43.0825 0.394 271 +273 4 353.488 384.9983 42.901 0.394 272 +274 4 352.5522 384.408 42.1901 0.3686 273 +275 4 351.8544 383.5054 42.0039 0.3686 274 +276 4 351.0364 382.7046 41.9941 0.3686 275 +277 4 350.0514 382.1235 41.9692 0.3813 276 +278 4 348.9372 381.8729 41.7981 0.3686 277 +279 4 347.8915 381.5148 41.0754 0.3432 278 +280 4 346.8608 381.0264 40.8797 0.3051 279 +281 4 345.9639 380.3239 40.8766 0.2648 280 +282 4 345.0224 379.6764 40.8626 0.25 281 +283 4 344.0122 379.1399 40.7929 0.2245 282 +284 4 343.0581 378.5313 40.5518 0.2034 283 +285 4 342.2688 377.7213 40.1178 0.2104 284 +286 4 341.4279 376.9674 39.8028 0.2513 285 +287 4 340.4212 376.4286 39.76 0.2949 286 +288 4 339.3562 376.0111 39.76 0.3001 287 +289 4 338.2854 375.6107 39.76 0.2722 288 +290 4 337.2489 375.137 39.76 0.2466 289 +291 4 336.3589 374.4289 39.76 0.2749 290 +292 4 335.637 373.5412 39.76 0.3105 291 +293 4 334.9495 372.6283 39.76 0.3278 292 +294 4 334.183 371.7806 39.7594 0.3178 293 +295 4 333.3158 371.0381 39.7572 0.3288 294 +296 4 332.3549 370.4192 39.7446 0.3769 295 +297 4 331.331 369.9113 39.6673 0.4124 296 +298 4 330.3048 369.4239 39.3896 0.4237 297 +299 4 329.329 368.8553 38.9385 0.3883 298 +300 4 328.3875 368.2181 38.6702 0.36 299 +301 4 327.4757 367.5283 38.64 0.3247 300 +302 4 326.6154 366.7756 38.6406 0.2964 301 +303 4 325.7117 366.08 38.6445 0.2639 302 +304 4 324.6924 365.5663 38.6669 0.2572 303 +305 4 323.6216 365.1682 38.7755 0.276 304 +306 4 322.5565 364.7713 39.088 0.3112 305 +307 4 321.5006 364.3663 39.5066 0.3397 306 +308 4 320.4561 363.9178 39.7051 0.3811 307 +309 4 319.51 363.2875 39.6326 0.4356 308 +310 4 318.7321 362.4615 39.3523 0.4863 309 +311 4 318.0572 361.5498 38.985 0.4924 310 +312 4 317.3879 360.6266 38.8388 0.4764 311 +313 4 316.6947 359.7171 38.9099 0.4609 312 +314 4 315.9762 358.8305 39.0729 0.4736 313 +315 4 315.212 357.9919 39.4201 0.4864 314 +316 4 314.417 357.1785 39.6676 0.4957 315 +317 4 313.6425 356.34 39.5324 0.4921 316 +318 4 312.9046 355.4786 39.1768 0.4725 317 +319 4 312.1381 354.6469 38.8032 0.4343 318 +320 4 311.2538 353.9307 38.6481 0.3995 319 +321 4 310.2517 353.3919 38.6378 0.3887 320 +322 4 309.1534 353.0899 38.6254 0.4144 321 +323 4 308.0186 352.9492 38.5529 0.436 322 +324 4 306.91 352.7192 38.3054 0.441 323 +325 4 305.8781 352.2662 37.8907 0.4282 324 +326 4 304.9424 351.6267 37.5911 0.4276 325 +327 4 304.1255 350.8328 37.5203 0.449 326 +328 4 303.4185 349.9336 37.5214 0.4617 327 +329 4 302.7722 348.9909 37.527 0.4662 328 +330 4 302.2025 348.0002 37.5575 0.4617 329 +331 4 301.6842 346.9821 37.6844 0.4745 330 +332 4 301.1019 346.0085 38.0041 0.483 331 +333 4 300.4453 345.0876 38.4062 0.4745 332 +334 4 299.76 344.1758 38.6131 0.4404 333 +335 4 299.0702 343.2641 38.631 0.3896 334 +336 4 298.3644 342.3637 38.598 0.3473 335 +337 4 297.6002 341.5183 38.463 0.3435 336 +338 4 296.7124 340.8228 38.1265 0.3953 337 +339 4 295.7171 340.2851 37.7236 0.4673 338 +340 4 294.6933 339.784 37.5374 0.513 339 +341 4 293.6694 339.2738 37.52 0.5166 340 +342 4 292.681 338.7006 37.52 0.5084 341 +343 4 291.752 338.0348 37.52 0.513 342 +344 4 290.8826 337.2924 37.52 0.5212 343 +345 4 290.0601 336.4973 37.52 0.5074 344 +346 4 289.265 335.6748 37.52 0.4646 345 +347 4 288.5134 334.8133 37.5194 0.4138 346 +348 4 287.8498 333.8833 37.5166 0.372 347 +349 4 287.2206 332.9292 37.5049 0.3559 348 +350 4 286.5079 332.0368 37.4452 0.3606 349 +351 4 285.7312 331.204 37.2263 0.3733 350 +352 4 284.9201 330.4204 36.7702 0.3766 351 +353 4 284.046 329.726 36.1777 0.3734 352 +354 4 283.1034 329.1368 35.5334 0.3909 353 +355 4 282.1161 328.63 34.86 0.4308 354 +356 4 281.1277 328.0981 34.3644 0.4703 355 +357 4 280.169 327.4803 34.1827 0.4703 356 +358 4 279.2367 326.8191 34.16 0.4606 357 +359 4 278.3226 326.1304 34.16 0.4693 358 +360 4 277.4177 325.4302 34.16 0.5182 359 +361 4 276.4808 324.7759 34.16 0.5436 360 +362 4 275.5072 324.1753 34.16 0.5347 361 +363 4 274.5737 323.5221 34.16 0.4859 362 +364 4 273.7786 322.7075 34.16 0.4552 363 +365 4 273.1003 321.7855 34.16 0.4322 364 +366 4 272.4528 320.8428 34.1592 0.4272 365 +367 4 271.7881 319.9127 34.1555 0.4245 366 +368 4 271.0456 319.0456 34.1379 0.4372 367 +369 4 270.1819 318.302 34.0435 0.4398 368 +370 4 269.2244 317.6911 33.7641 0.4219 369 +371 4 268.1856 317.269 33.3589 0.391 370 +372 4 267.0645 317.1317 33.0954 0.3794 371 +373 4 265.9331 317.0367 33.0324 0.3829 372 +374 4 264.9195 316.5745 32.9958 0.3802 373 +375 4 264.0466 315.8412 32.8037 0.388 374 +376 4 263.112 315.2223 32.4044 0.3994 375 +377 4 262.0618 314.7991 32.058 0.4073 376 +378 4 261.0208 314.3415 31.9348 0.3695 377 +379 4 260.1204 313.6562 31.92 0.3432 378 +380 4 259.4283 312.7547 31.92 0.3683 379 +381 4 258.925 311.732 31.92 0.4319 380 +382 4 258.576 310.644 31.92 0.4703 381 +383 4 258.2397 309.5527 31.92 0.4449 382 +384 4 257.7192 308.5437 31.92 0.4003 383 +385 4 256.9813 307.6777 31.9203 0.3749 384 +386 4 256.0901 306.9684 31.9208 0.375 385 +387 4 255.0994 306.3998 31.9236 0.3878 386 +388 4 254.0698 305.9022 31.9413 0.407 387 +389 4 253.062 305.3668 32.048 0.4324 388 +390 4 252.1319 304.7216 32.373 0.4384 389 +391 4 251.2499 304.0134 32.7981 0.4192 390 +392 4 250.3518 303.3144 33.0142 0.3871 391 +393 4 249.432 302.6349 33.0403 0.3686 392 +394 4 248.4917 301.984 33.0408 0.3621 393 +395 4 247.5948 301.2793 33.045 0.3691 394 +396 4 246.913 300.3812 33.073 0.3813 395 +397 4 246.5412 299.3162 33.2626 0.3813 396 +398 4 246.3959 298.1962 33.6736 0.3745 397 +399 4 246.2277 297.0785 34.0158 0.3821 398 +400 4 245.8296 296.018 34.0626 0.4279 399 +401 4 245.2439 295.0468 33.7896 0.478 400 +402 4 244.5723 294.1384 33.353 0.5024 401 +403 4 243.8116 293.2964 33.0775 0.4948 402 +404 4 242.9513 292.5471 32.9596 0.4694 403 +405 4 242.0189 291.8996 32.6813 0.4303 404 +406 4 241.0934 291.2532 32.2445 0.3931 405 +407 4 240.2594 290.4868 31.9768 0.3744 406 +408 4 239.5227 289.6139 31.922 0.3823 407 +409 4 238.8249 288.7078 31.92 0.4077 408 +410 4 238.0904 287.8315 31.92 0.4401 409 +411 4 237.2805 287.0262 31.9197 0.4782 410 +412 4 236.4305 286.2608 31.9192 0.4957 411 +413 4 235.5988 285.4749 31.9164 0.4888 412 +414 4 234.7854 284.6707 31.906 0.4693 413 +415 4 233.9663 283.8722 31.8637 0.4645 414 +416 4 233.114 283.1171 31.6534 0.484 415 +417 4 232.2091 282.4399 31.2385 0.4957 416 +418 4 231.2299 281.8747 30.903 0.4888 417 +419 4 230.1797 281.4274 30.8031 0.4555 418 +420 4 229.134 280.9675 30.7997 0.4253 419 +421 4 228.1502 280.3887 30.7994 0.4057 420 +422 4 227.2796 279.6542 30.7975 0.3871 421 +423 4 226.5726 278.7631 30.7852 0.3607 422 +424 4 225.9 277.8387 30.7269 0.3432 423 +425 4 225.0648 277.0894 30.4416 0.3708 424 +426 4 224.0375 276.6547 30.0476 0.4285 425 +427 4 222.9462 276.3401 30.0675 0.4576 426 +428 4 221.9028 275.9088 30.4612 0.4299 427 +429 4 220.9075 275.3619 30.7292 0.386 428 +430 4 219.9935 274.6836 30.7406 0.3756 429 +431 4 219.3174 273.7912 30.5004 0.3954 430 +432 4 218.9639 272.7319 30.0583 0.3926 431 +433 4 218.6756 271.6359 29.7497 0.3742 432 +434 4 218.1597 270.6292 29.68 0.3615 433 +435 4 217.3692 269.8204 29.68 0.3993 434 +436 4 216.375 269.2782 29.6797 0.4395 435 +437 4 215.358 268.7622 29.6786 0.4595 436 +438 4 214.4645 268.0586 29.6713 0.4555 437 +439 4 213.7633 267.1652 29.6344 0.4671 438 +440 4 213.102 266.2363 29.4742 0.4904 439 +441 4 212.363 265.3851 29.05 0.4957 440 +442 4 211.5565 264.5912 28.6854 0.4658 441 +443 4 210.7317 263.8007 28.5928 0.4149 442 +444 4 209.9251 262.9907 28.6689 0.3566 443 +445 4 209.1186 262.1876 28.9489 0.3154 444 +446 4 208.208 261.5184 29.2177 0.3051 445 +447 4 207.2264 260.9624 28.954 0.3281 446 +448 4 206.2678 260.3938 28.3296 0.3662 447 +449 4 205.316 259.8035 27.764 0.389 448 +450 4 204.387 259.1515 27.4935 0.4018 449 +451 4 203.5393 258.3873 27.4383 0.399 450 +452 4 202.7751 257.5373 27.4187 0.394 451 +453 4 202.0567 256.6484 27.3255 0.3784 452 +454 4 201.3028 255.8007 27.0217 0.3686 453 +455 4 200.4666 255.0342 26.6798 0.3686 454 +456 4 199.5388 254.3856 26.7848 0.3686 455 +457 4 198.6018 253.7381 27.0346 0.3445 456 +458 4 197.7427 253.007 26.7708 0.3062 457 +459 4 196.8904 252.2692 26.2962 0.276 458 +460 4 195.9317 251.6834 25.8591 0.2834 459 +461 4 194.9387 251.148 25.4038 0.3091 460 +462 4 194.099 250.3987 25.2151 0.3433 461 +463 4 193.4184 249.4824 25.1972 0.3559 462 +464 4 192.7949 248.5237 25.1854 0.3644 463 +465 4 192.1577 247.5742 25.1272 0.3772 464 +466 4 191.4129 246.715 24.9248 0.3986 465 +467 4 190.5675 245.9634 24.5428 0.4068 466 +468 4 189.7267 245.2015 24.2012 0.3981 467 +469 4 189.0025 244.3241 24.0878 0.3766 468 +470 4 188.4191 243.3425 24.0755 0.3599 469 +471 4 187.8334 242.361 24.0565 0.3383 470 +472 4 187.06 241.5304 23.9554 0.3305 471 +473 4 186.1368 240.8784 23.6239 0.3394 472 +474 4 185.1907 240.2823 23.0392 0.3521 473 +475 4 184.2687 239.6577 22.4062 0.347 474 +476 4 183.3454 239.0182 21.8744 0.3163 475 +477 4 182.3982 238.4016 21.4458 0.2961 476 +478 4 181.459 237.7621 21.1324 0.3016 477 +479 4 180.625 236.9922 21.2453 0.3327 478 +480 4 179.8185 236.1971 21.6258 0.3525 479 +481 4 178.941 235.4741 21.9047 0.3652 480 +482 4 177.9709 234.8872 22.2057 0.3592 481 +483 4 176.8818 234.6493 22.636 0.3463 482 +484 4 175.7459 234.6138 22.9093 0.3139 483 +485 4 174.6408 234.3587 22.972 0.2851 484 +486 4 173.6649 233.7787 23.0171 0.2898 485 +487 4 172.7863 233.0522 23.2008 0.3227 486 +488 4 171.9089 232.3372 23.5858 0.3709 487 +489 4 171.0383 231.6097 23.9509 0.4117 488 +490 4 170.2055 230.8306 24.1494 0.4297 489 +491 4 169.3967 230.0298 24.4166 0.422 490 +492 4 168.5947 229.2336 24.8441 0.3991 491 +493 4 167.7779 228.4408 25.132 0.3838 492 +494 4 166.9119 227.696 25.1961 0.3813 493 +495 4 165.9486 227.0829 25.2 0.3504 494 +496 4 164.9179 226.5886 25.1997 0.3226 495 +497 4 163.9386 226.0006 25.1994 0.2865 496 +498 4 163.1699 225.1644 25.1975 0.2902 497 +499 4 162.5075 224.2332 25.1877 0.2924 498 +500 4 161.7662 223.3637 25.1462 0.3137 499 +501 4 160.9551 222.5629 24.92 0.3391 500 +502 4 160.1474 221.7724 24.4986 0.3645 501 +503 4 159.3226 220.9899 24.1842 0.3792 502 +504 4 158.4005 220.3184 24.089 0.3813 503 +505 4 157.4052 219.7544 24.08 0.3813 504 +506 4 156.4763 219.0897 24.08 0.3704 505 +507 4 155.6309 218.321 24.08 0.3577 506 +508 4 154.7397 217.6048 24.08 0.3342 507 +509 4 153.7753 216.9905 24.08 0.3087 508 +510 4 152.7686 216.4482 24.0803 0.2831 509 +511 4 151.8202 215.811 24.0811 0.2796 510 +512 4 151.0194 214.9976 24.0853 0.3129 511 +513 4 150.2587 214.1431 24.1032 0.362 512 +514 4 149.4544 213.3308 24.1749 0.4019 513 +515 4 148.5964 212.5838 24.4712 0.4179 514 +516 4 147.727 211.8619 24.8931 0.4084 515 +517 4 146.9365 211.0428 25.1381 0.3621 516 +518 4 146.2307 210.1448 25.0807 0.2887 517 +519 4 145.4665 209.3154 24.6375 0.2345 518 +520 4 144.525 208.7308 23.9929 0.2288 519 +521 4 143.4782 208.2812 23.8067 0.2863 520 +522 4 142.4955 207.7001 23.9106 0.3387 521 +523 4 141.6775 206.9118 23.6776 0.3899 522 +524 4 140.9751 206.0264 23.2506 0.394 523 +525 4 140.3082 205.102 23.0317 0.3823 524 +526 4 139.6904 204.1399 23.0759 0.3578 525 +527 4 139.028 203.2236 23.4875 0.3441 526 +528 4 138.2261 202.4285 23.9173 0.3195 527 +529 4 137.2686 201.8085 24.0394 0.3059 528 +530 4 136.279 201.2365 23.9515 0.2932 529 +531 4 135.3638 200.5729 23.5306 0.3282 530 +532 4 134.5401 199.7859 23.3173 0.3305 531 +533 4 133.8194 198.8981 23.2876 0.3305 532 +534 4 133.1467 197.9898 22.8595 0.2823 533 +535 4 132.5736 197.0346 22.2306 0.2556 534 +536 4 131.8849 196.1308 21.9187 0.2058 535 +537 4 130.9319 195.505 21.9433 0.2034 536 +538 4 130.0019 194.8747 22.4608 0.2034 537 +539 4 129.3052 193.9835 22.8472 0.2651 538 +540 4 128.6371 193.0546 22.8894 0.2793 539 +541 4 128.2092 192.0021 22.5851 0.3169 540 +542 4 127.9427 190.9691 23.571 0.3178 541 +543 4 127.0492 190.309 24.2091 0.4576 542 +544 4 126.3559 189.8857 23.1672 0.3814 543 +545 4 125.5185 189.1124 22.9373 0.3559 544 +546 4 124.7212 188.2932 22.8298 0.3559 545 +547 4 123.9936 187.4318 22.3429 0.3559 546 +548 4 123.2568 186.6573 21.3503 0.3559 547 +549 4 122.3794 185.9606 20.7827 0.3559 548 +550 4 121.5603 185.1633 20.7211 0.394 549 +551 4 120.7561 184.3499 20.72 0.4449 550 +552 4 119.9678 183.5193 20.72 0.4322 551 +553 4 119.2826 182.6041 20.72 0.394 552 +554 4 118.5481 181.7267 20.72 0.3432 553 +555 4 117.7073 180.9511 20.72 0.3686 554 +556 4 116.7715 180.2933 20.72 0.3686 555 +557 4 115.9558 179.4913 20.72 0.3559 556 +558 4 115.3026 178.5521 20.72 0.3178 557 +559 4 114.7718 177.5385 20.72 0.3178 558 +560 4 113.9426 176.7503 20.7206 0.3305 559 +561 4 113.1704 176.2057 20.7239 0.3827 560 +562 4 112.2468 175.5308 20.7393 0.3836 561 +563 4 111.3422 174.8318 20.8261 0.3501 562 +564 4 110.4583 174.1122 21.063 0.312 563 +565 4 109.5664 173.4007 21.2691 0.2632 564 +566 4 108.6763 172.6857 21.4334 0.2017 565 +567 4 107.8196 171.9283 21.4046 0.1586 566 +568 4 106.9002 171.3209 20.7239 0.1416 567 +569 4 105.8424 170.9228 20.4058 0.1622 568 +570 4 104.7627 170.5464 20.3899 0.1765 569 +571 4 103.6407 170.3313 20.4075 0.2009 570 +572 4 102.516 170.194 20.7738 0.2264 571 +573 4 101.4505 169.8257 21.2038 0.2752 572 +574 4 100.4498 169.2754 21.1982 0.303 573 +575 4 99.4651 168.7068 20.8967 0.2934 574 +576 4 98.4155 168.2595 20.7446 0.2453 575 +577 4 97.289 168.0753 20.7354 0.2059 576 +578 4 96.1939 167.7482 20.8124 0.2034 577 +579 4 95.1674 167.2585 21.0865 0.1914 578 +580 4 94.0562 166.9988 20.9818 0.1786 579 +581 4 92.9713 166.6465 20.7757 0.1535 580 +582 4 92.0816 165.9326 20.778 0.1773 581 +583 4 91.1472 165.2863 21.0918 0.2274 582 +584 4 90.2014 164.6433 21.1851 0.2908 583 +585 4 89.3954 163.846 21.5404 0.3172 584 +586 4 88.3424 163.4101 21.7148 0.3178 585 +587 4 87.227 163.2374 21.2702 0.3052 586 +588 4 86.1868 162.7981 20.8211 0.3303 587 +589 4 85.2756 162.1082 20.7228 0.3557 588 +590 4 84.4582 161.3086 20.7175 0.3559 589 +591 4 83.696 160.4552 20.7091 0.2929 590 +592 4 83.4217 159.3455 20.6192 0.2035 591 +593 4 83.7408 158.3296 19.6 0.1144 592 +594 4 112.9716 175.9987 21.6857 0.3463 560 +595 4 112.3254 175.0755 21.84 0.294 594 +596 4 112.0351 173.9818 21.8406 0.2397 595 +597 4 111.7511 172.8744 21.8431 0.2185 596 +598 4 111.0932 171.9581 21.8627 0.2582 597 +599 4 110.3967 171.0532 22.0038 0.3204 598 +600 4 109.939 170.0224 22.3846 0.3521 599 +601 4 109.4909 168.9837 22.787 0.3559 600 +602 4 108.7492 168.1268 22.9446 0.3559 601 +603 4 107.7769 167.5342 22.9639 0.3783 602 +604 4 106.7066 167.1361 22.9849 0.3925 603 +605 4 105.6133 166.8055 23.1213 0.4053 604 +606 4 104.5667 166.3731 23.5024 0.3954 605 +607 4 103.6127 165.7645 23.8829 0.3827 606 +608 4 102.7241 165.0472 23.9728 0.3358 607 +609 4 101.7701 164.418 23.9137 0.2962 608 +610 4 100.76 163.8826 23.9557 0.2694 609 +611 4 99.829 163.2213 24.0495 0.2555 610 +612 4 98.9531 162.4858 24.0951 0.2312 611 +613 4 97.9642 161.916 24.1878 0.2172 612 +614 4 96.8823 161.5969 24.6061 0.2044 613 +615 4 95.7951 161.2857 25.0331 0.2034 614 +616 4 94.9175 160.5684 25.1849 0.1914 615 +617 4 94.1179 159.7504 25.1994 0.2027 616 +618 4 93.2906 158.9599 25.2 0.2154 617 +619 4 92.5872 158.0585 25.2 0.2161 618 +620 4 92.0293 157.0609 25.2006 0.204 619 +621 4 91.4189 156.0931 25.2025 0.1793 620 +622 4 90.652 155.2454 25.2106 0.1658 621 +623 4 89.7715 154.5166 25.2552 0.1409 622 +624 4 88.9659 153.733 25.7701 0.1277 623 +625 4 87.8592 153.7536 26.32 0.1144 624 +626 4 127.3878 189.7118 21.6006 0.2342 543 +627 4 127.7791 188.9911 20.5702 0.1568 626 +628 4 127.977 187.9134 21.2559 0.1217 627 +629 4 128.1051 186.8083 21.7804 0.1144 628 +630 4 128.6794 185.9137 21.8638 0.121 629 +631 4 129.6392 185.8794 21.0445 0.1349 630 +632 4 130.5315 186.4777 20.2124 0.1478 631 +633 4 131.4742 187.0943 19.9343 0.144 632 +634 4 132.4946 187.1309 20.6651 0.1303 633 +635 4 133.2954 186.512 21.8061 0.1173 634 +636 4 133.9818 185.6346 21.8011 0.1144 635 +637 4 134.8513 185.0283 20.8659 0.1144 636 +638 4 135.9129 184.6473 20.5862 0.1144 637 +639 4 136.6863 183.8316 20.683 0.1144 638 +640 4 137.145 182.7883 20.7085 0.1144 639 +641 4 137.2182 181.6523 20.6573 0.1144 640 +642 4 136.3385 180.9911 20.3974 0.1144 641 +643 4 135.4496 181.6672 20.72 0.1144 642 +644 4 346.4764 380.3869 43.5758 0.1526 280 +645 4 346.1401 379.5426 45.2712 0.1271 644 +646 4 345.5555 378.561 45.418 0.1145 645 +647 4 344.6986 377.8209 45.7789 0.1273 646 +648 4 343.6267 377.6069 46.5976 0.1401 647 +649 4 342.5639 377.3553 47.4032 0.1652 648 +650 4 341.7563 376.6631 48.4263 0.1657 649 +651 4 340.8926 375.9401 48.9006 0.1775 650 +652 4 339.8858 375.4539 49.4724 0.1652 651 +653 4 338.8448 375.2549 50.521 0.1646 652 +654 4 337.7809 375.2446 51.5494 0.1538 653 +655 4 336.7067 375.3018 52.498 0.1798 654 +656 4 335.6164 375.5054 53.1698 0.2175 655 +657 4 334.5182 375.82 53.2846 0.2408 656 +658 4 333.3879 375.971 53.3708 0.2259 657 +659 4 332.2542 375.8841 53.5382 0.1885 658 +660 4 331.1445 376.1586 53.6413 0.164 659 +661 4 330.0486 376.4652 53.7569 0.1525 660 +662 4 328.94 376.511 54.3987 0.1525 661 +663 4 327.8418 376.3199 55.0214 0.1506 662 +664 4 326.7184 376.2273 55.4316 0.1374 663 +665 4 325.5847 376.2078 55.2255 0.1246 664 +666 4 324.4853 376.3691 54.565 0.1144 665 +667 4 323.3916 376.6151 54.0952 0.1144 666 +668 4 322.3426 377.059 54.04 0.1178 667 +669 4 321.3324 377.5703 54.0921 0.1376 668 +670 4 320.3829 378.0165 54.5496 0.1834 669 +671 4 319.6828 378.7521 55.2241 0.2432 670 +672 4 318.5948 379.0701 55.1312 0.2669 671 +673 4 317.5755 379.5655 55.1396 0.2571 672 +674 4 316.7004 380.0677 53.9636 0.2542 673 +675 4 315.8458 380.7266 54.3424 0.2757 674 +676 4 315.1228 381.5995 54.5124 0.268 675 +677 4 314.2248 382.1658 53.5601 0.2551 676 +678 4 313.4377 382.9483 52.9217 0.2063 677 +679 4 312.4813 383.5695 52.8906 0.1668 678 +680 4 311.8544 384.0408 54.88 0.1144 679 +681 4 379.3618 398.12 45.3169 0.2171 202 +682 4 379.0438 397.0847 45.0506 0.2155 681 +683 4 379.204 396.0288 44.1857 0.2288 682 +684 4 379.7725 395.1582 43.4168 0.242 683 +685 4 380.5825 394.6011 42.2982 0.2474 684 +686 4 381.3993 394.1721 40.6588 0.2415 685 +687 4 382.3545 393.7099 39.8367 0.2347 686 +688 4 383.431 393.3495 39.5895 0.2219 687 +689 4 384.4595 392.9491 39.004 0.2092 688 +690 4 385.3999 392.4458 37.9982 0.2034 689 +691 4 386.3791 391.9493 37.3512 0.2242 690 +692 4 387.4007 391.4436 37.1232 0.2623 691 +693 4 388.3937 390.9014 36.7441 0.2796 692 +694 4 389.294 390.2344 36.2533 0.2655 693 +695 4 389.9873 389.3638 35.758 0.24 694 +696 4 390.5776 388.4029 35.299 0.2288 695 +697 4 391.3613 387.6158 34.8804 0.2288 696 +698 4 392.3371 387.0564 34.433 0.2215 697 +699 4 393.345 386.5301 34.1835 0.2161 698 +700 4 394.3299 385.9501 34.088 0.2087 699 +701 4 395.3492 385.4616 33.7744 0.2186 700 +702 4 396.3216 384.964 33.0114 0.2441 701 +703 4 397.2483 384.3794 32.2218 0.2931 702 +704 4 398.1486 383.6987 31.9332 0.3256 703 +705 4 399.0215 382.9597 31.9052 0.3227 704 +706 4 399.8188 382.144 31.8102 0.2858 705 +707 4 400.2341 381.1465 31.2612 0.2669 706 +708 4 400.3554 380.1272 30.0684 0.2669 707 +709 4 400.8393 379.1811 29.3429 0.2572 708 +710 4 401.5474 378.2911 29.3877 0.2345 709 +711 4 402.4878 377.6767 29.2006 0.2184 710 +712 4 403.5574 377.8335 28.6961 0.2384 711 +713 4 404.5756 378.3048 28.1753 0.2415 712 +714 4 405.6704 378.2339 27.5688 0.2534 713 +715 4 406.6325 377.6756 26.9805 0.2662 714 +716 4 407.5752 377.0532 26.5255 0.2909 715 +717 4 408.3783 376.2444 26.3754 0.3044 716 +718 4 409.0132 375.2972 26.5356 0.2809 717 +719 4 409.6881 374.3877 26.9416 0.2555 718 +720 4 410.3642 373.4702 26.7484 0.2421 719 +721 4 411.0804 372.5882 26.4272 0.278 720 +722 4 411.8411 371.7348 26.3301 0.3283 721 +723 4 412.5241 370.8173 26.3203 0.3792 722 +724 4 413.151 369.8609 26.3197 0.3934 723 +725 4 413.9667 369.0601 26.3189 0.3818 724 +726 4 414.9768 368.5259 26.3144 0.3445 725 +727 4 416.0591 368.1586 26.2828 0.3186 726 +728 4 417.0738 367.6358 26.1223 0.3302 727 +729 4 417.9432 366.9574 25.3898 0.3305 728 +730 4 418.3802 365.9656 24.5244 0.3305 729 +731 4 418.4272 364.9268 23.3587 0.293 730 +732 4 418.2281 363.8114 22.9908 0.2924 731 +733 4 418.3208 362.672 22.9393 0.2924 732 +734 4 418.7623 361.6184 22.8326 0.267 733 +735 4 419.2154 360.5934 22.265 0.229 734 +736 4 420.0676 359.8315 22.2432 0.1781 735 +737 4 421.1956 359.6782 22.4848 0.1652 736 +738 4 422.136 359.6736 24.08 0.1144 737 +739 4 380.0368 399.0386 46.48 0.4576 200 +740 4 392.4503 408.7638 48.701 0.4322 186 +741 4 391.5546 409.4754 48.6262 0.4068 740 +742 4 390.7446 410.2704 48.274 0.394 741 +743 4 390.1292 410.815 46.3336 0.2555 742 +744 4 389.5457 411.5094 44.688 0.1694 743 +745 4 389.1991 412.4726 43.5781 0.1525 744 +746 4 388.92 413.5411 42.8999 0.1674 745 +747 4 388.6465 414.6211 42.2834 0.178 746 +748 4 388.7552 415.669 41.421 0.1615 747 +749 4 389.3947 416.5498 40.8906 0.144 748 +750 4 390.0983 417.4364 40.5482 0.1578 749 +751 4 390.295 418.4924 39.94 0.2126 750 +752 4 390.0617 419.562 39.2101 0.2958 751 +753 4 389.8558 420.6591 38.6232 0.3664 752 +754 4 389.9679 421.7596 38.0198 0.4112 753 +755 4 390.3271 422.7846 37.1792 0.3796 754 +756 4 390.835 423.7765 36.5828 0.3281 755 +757 4 391.3246 424.8061 36.5327 0.2767 756 +758 4 391.3761 425.9284 36.4353 0.2669 757 +759 4 391.089 426.879 35.1607 0.2556 758 +760 4 390.7996 427.7336 33.4407 0.2428 759 +761 4 390.4518 428.7083 32.2736 0.2299 760 +762 4 390.3591 429.834 31.983 0.2407 761 +763 4 390.5433 430.9608 32.0734 0.2534 762 +764 4 390.8053 432.0739 32.0765 0.2781 763 +765 4 391.1645 433.1562 31.8752 0.2796 764 +766 4 391.4116 434.2601 31.4672 0.2676 765 +767 4 391.4871 435.3835 30.9809 0.2549 766 +768 4 391.5843 436.5172 30.686 0.2662 767 +769 4 391.7548 437.6212 30.091 0.3033 768 +770 4 391.7399 438.7492 29.636 0.3051 769 +771 4 391.5168 439.8463 30.1574 0.2683 770 +772 4 391.3052 440.9617 30.4965 0.2178 771 +773 4 391.3796 442.0736 29.8945 0.2161 772 +774 4 391.3166 443.1547 28.9971 0.2409 773 +775 4 390.8613 444.2003 28.8926 0.2541 774 +776 4 390.5994 445.302 29.2936 0.2416 775 +777 4 390.5319 446.4071 28.6017 0.2415 776 +778 4 390.342 447.5305 28.3536 0.2668 777 +779 4 389.8374 448.5544 28.5309 0.2924 778 +780 4 389.6132 449.6767 28.5538 0.3051 779 +781 4 389.3478 450.7886 28.5211 0.3051 780 +782 4 389.2586 451.9269 28.3212 0.3051 781 +783 4 389.5331 452.9931 27.5587 0.3051 782 +784 4 389.953 454.041 27.1152 0.2924 783 +785 4 390.096 455.1747 26.9539 0.2669 784 +786 4 390.0708 456.3096 27.2908 0.2288 785 +787 4 389.8741 457.4147 26.7512 0.2034 786 +788 4 389.6098 458.5152 27.1622 0.1907 787 +789 4 389.2243 459.8663 26.3494 0.2465 788 +790 4 388.8685 460.9096 25.5976 0.2748 789 +791 4 388.8856 462.0227 25.1664 0.3004 790 +792 4 389.2254 463.0981 24.7836 0.2947 791 +793 4 389.6384 464.1162 24.0285 0.2715 792 +794 4 389.9141 465.1859 23.315 0.235 793 +795 4 389.7768 466.3036 23.1669 0.218 794 +796 4 389.8386 467.4327 23.4486 0.238 795 +797 4 389.969 468.5584 23.1613 0.2747 796 +798 4 389.81 469.6806 22.9076 0.2796 797 +799 4 389.7688 470.8166 22.6212 0.235 798 +800 4 390.0033 471.9183 22.1945 0.1951 799 +801 4 390.0697 473.0406 22.58 0.1786 800 +802 4 389.3741 473.8711 23.3666 0.1902 801 +803 4 388.658 474.7497 23.5922 0.191 802 +804 4 388.5836 475.8834 23.7726 0.2034 803 +805 4 388.1775 476.9119 24.4751 0.2034 804 +806 4 387.6696 477.9106 24.9782 0.2034 805 +807 4 387.3881 479.0145 25.1429 0.2099 806 +808 4 387.2623 480.1482 25.0096 0.2481 807 +809 4 387.2749 481.2831 24.8349 0.2796 808 +810 4 387.5826 482.3813 24.9421 0.2699 809 +811 4 388.0459 483.4224 25.1451 0.2166 810 +812 4 388.6225 484.4096 25.2109 0.1578 811 +813 4 389.1659 485.4038 25.279 0.1246 812 +814 4 389.4187 486.5169 25.4892 0.1144 813 +815 4 389.7448 487.5957 25.5598 0.1199 814 +816 4 390.3786 488.5441 25.3453 0.1486 815 +817 4 390.9254 489.5405 25.2392 0.1957 816 +818 4 391.2434 490.6364 25.3142 0.2662 817 +819 4 391.4104 491.7621 25.5388 0.3112 818 +820 4 391.4002 492.8935 25.8821 0.3184 819 +821 4 391.1816 494.0067 26.1274 0.2674 820 +822 4 390.8876 495.1026 26.0982 0.2194 821 +823 4 390.8705 496.2375 26.2539 0.197 822 +824 4 390.835 497.3426 26.7949 0.2225 823 +825 4 390.4472 498.4065 26.7924 0.2512 824 +826 4 389.8489 499.3709 26.4802 0.2796 825 +827 4 389.2208 500.3204 26.5854 0.2764 826 +828 4 388.6099 501.2642 27.0738 0.2604 827 +829 4 388.0928 502.2675 27.1432 0.235 828 +830 4 387.8446 503.3657 26.7176 0.2161 829 +831 4 387.7405 504.4948 26.6395 0.2194 830 +832 4 387.5998 505.6125 26.9097 0.2422 831 +833 4 387.6753 506.7371 26.5818 0.2898 832 +834 4 388.0002 507.8273 26.3141 0.3212 833 +835 4 388.3914 508.8992 26.1254 0.3271 834 +836 4 388.8033 509.9517 25.7118 0.3076 835 +837 4 389.2174 511.0008 25.289 0.2727 836 +838 4 389.5755 512.0864 25.2039 0.2439 837 +839 4 389.9953 513.1401 25.2 0.2195 838 +840 4 390.6291 514.0919 25.2 0.2322 839 +841 4 391.2114 515.0757 25.2003 0.2521 840 +842 4 391.86 515.9852 25.2011 0.2869 841 +843 4 392.7775 516.667 25.2056 0.3199 842 +844 4 393.6058 517.4518 25.2263 0.3744 843 +845 4 394.3837 518.2846 25.3154 0.4307 844 +846 4 395.2978 518.9481 25.5948 0.4576 845 +847 4 396.3285 519.408 25.8216 0.4459 846 +848 4 397.3924 519.7981 25.4624 0.4156 847 +849 4 398.4952 520.0372 25.2025 0.4068 848 +850 4 399.6392 520.0544 25.2126 0.4028 849 +851 4 400.781 520.0178 25.2834 0.3781 850 +852 4 401.9101 519.9171 25.5906 0.3271 851 +853 4 403.0175 519.9057 26.1069 0.2841 852 +854 4 404.1317 520.1345 26.3208 0.2669 853 +855 4 405.2231 520.417 26.3948 0.2617 854 +856 4 406.1841 520.9913 26.9097 0.2446 855 +857 4 407.1096 521.537 26.199 0.219 856 +858 4 407.8612 522.0827 24.5846 0.2043 857 +859 4 408.4103 523.0139 25.1924 0.1914 858 +860 4 408.9136 524.0378 25.2115 0.1907 859 +861 4 409.147 525.1555 25.2067 0.1781 860 +862 4 408.8656 526.24 25.76 0.1144 861 +863 4 390.6039 411.3389 48.1779 0.3566 742 +864 4 390.5547 412.46 47.6462 0.3559 863 +865 4 390.4952 413.5674 46.9557 0.331 864 +866 4 390.231 414.6691 46.571 0.293 865 +867 4 389.9942 415.7879 46.548 0.2672 866 +868 4 390.0457 416.9194 46.9353 0.2921 867 +869 4 390.0331 418.0462 47.4169 0.3176 868 +870 4 389.7322 419.1456 47.2021 0.3556 869 +871 4 389.2723 420.1649 46.6166 0.3685 870 +872 4 388.8056 421.2025 46.3445 0.3686 871 +873 4 388.3777 422.1829 45.3513 0.356 872 +874 4 388.0368 423.2731 45.2281 0.3432 873 +875 4 387.387 424.2146 45.192 0.3305 874 +876 4 386.7326 425.1253 44.6359 0.3178 875 +877 4 386.0245 426.0107 44.268 0.3178 876 +878 4 385.282 426.8813 44.2333 0.3432 877 +879 4 384.7741 427.9063 44.1997 0.3559 878 +880 4 384.567 429.0275 43.9858 0.3432 879 +881 4 384.265 430.0685 43.0884 0.3051 880 +882 4 383.685 430.9299 41.916 0.2669 881 +883 4 382.7515 431.4745 40.9998 0.2288 882 +884 4 381.8031 432.1128 40.873 0.2161 883 +885 4 381.047 432.9708 40.8422 0.2415 884 +886 4 380.4887 433.2786 40.5574 0.2247 885 +887 4 379.4671 433.7396 40.2447 0.1924 886 +888 4 378.402 434.1034 40.4729 0.1614 887 +889 4 377.5211 434.8024 40.7344 0.1486 888 +890 4 376.8496 435.7096 40.4844 0.1398 889 +891 4 376.2479 436.6213 39.6752 0.1438 890 +892 4 375.5924 437.4942 38.8623 0.1644 891 +893 4 375.065 438.4689 38.2553 0.1947 892 +894 4 374.6657 439.5111 37.7121 0.2034 893 +895 4 374.0686 440.472 37.5424 0.2034 894 +896 4 373.2918 441.3117 37.5435 0.2115 895 +897 4 372.5974 442.2052 37.7194 0.2369 896 +898 4 372.0585 443.2028 38.0089 0.2542 897 +899 4 371.4808 444.182 37.8302 0.2501 898 +900 4 370.8345 445.1132 37.4766 0.2374 899 +901 4 370.2762 446.0959 37.1406 0.2247 900 +902 4 369.8495 447.1324 36.6148 0.2161 901 +903 4 369.4273 448.1872 36.4098 0.2161 902 +904 4 368.9263 449.2133 36.37 0.2245 903 +905 4 368.471 450.2578 36.2093 0.2457 904 +906 4 367.9035 451.2405 35.999 0.2625 905 +907 4 367.1817 452.1168 36.1917 0.2796 906 +908 4 366.3363 452.8753 36.4896 0.2754 907 +909 4 365.516 453.6452 36.8309 0.2543 908 +910 4 364.8674 454.5581 37.3397 0.2246 909 +911 4 364.3045 455.5477 37.403 0.2119 910 +912 4 363.8412 456.591 37.2375 0.1992 911 +913 4 363.3882 457.6389 37.2792 0.1821 912 +914 4 362.974 458.6948 37.3859 0.1652 913 +915 4 362.4306 459.6134 37.0185 0.1794 914 +916 4 361.4697 460.2083 36.5907 0.2238 915 +917 4 360.5144 460.8261 36.4112 0.2768 916 +918 4 359.6862 461.58 36.0898 0.3051 917 +919 4 359.4162 462.5512 35.3545 0.2844 918 +920 4 359.4093 463.6552 35.3354 0.2298 919 +921 4 358.906 464.6047 35.8495 0.1869 920 +922 4 357.9954 465.2659 35.9901 0.1952 921 +923 4 357.1156 465.9798 35.791 0.2298 922 +924 4 356.4361 466.8836 35.9243 0.2505 923 +925 4 355.7062 467.7438 36.318 0.2359 924 +926 4 354.8608 468.4932 36.1474 0.2102 925 +927 4 353.8198 468.9164 36.0522 0.2131 926 +928 4 352.8805 469.5228 36.4081 0.2476 927 +929 4 351.9184 470.0822 35.9341 0.2866 928 +930 4 351.0536 470.8121 35.6325 0.3035 929 +931 4 350.1933 471.511 34.9625 0.2822 930 +932 4 349.3902 472.3187 34.9149 0.2453 931 +933 4 348.8262 473.3094 34.869 0.1949 932 +934 4 347.9053 473.9523 34.5229 0.1781 933 +935 4 347.1743 474.7257 33.5504 0.193 934 +936 4 346.465 475.6066 33.8506 0.2298 935 +937 4 345.496 476.1866 34.2919 0.2415 936 +938 4 344.5614 476.8341 34.4655 0.2369 937 +939 4 343.5009 477.2448 34.5794 0.2034 938 +940 4 342.4747 477.6623 34.8953 0.2034 939 +941 4 341.6087 478.3098 34.3902 0.2224 940 +942 4 340.8926 479.1964 34.4232 0.2482 941 +943 4 340.1581 480.0602 34.3064 0.2614 942 +944 4 339.2726 480.7511 34.1312 0.2669 943 +945 4 338.3163 481.3357 33.71 0.2595 944 +946 4 337.297 481.7956 33.3239 0.2384 945 +947 4 336.209 481.9844 33.8027 0.2114 946 +948 4 335.1874 482.4111 34.0138 0.1943 947 +949 4 334.2242 483.022 34.2079 0.2001 948 +950 4 333.2014 483.4475 33.7554 0.2134 949 +951 4 332.1387 483.8331 33.3715 0.2264 950 +952 4 331.0908 484.2072 33.8948 0.2392 951 +953 4 329.9891 484.3696 34.4868 0.2523 952 +954 4 328.8668 484.5652 34.51 0.2542 953 +955 4 327.9139 485.1326 33.9032 0.2186 954 +956 4 327.5272 486.0856 32.76 0.1144 955 +957 4 380.7495 433.8506 41.6178 0.2988 885 +958 4 380.7552 434.9763 41.2754 0.2784 957 +959 4 380.6797 436.0939 41.1158 0.2525 958 +960 4 380.3136 437.159 40.8867 0.2341 959 +961 4 380.0105 438.2161 40.213 0.2288 960 +962 4 379.816 439.3166 40.1349 0.2211 961 +963 4 379.5643 440.4263 40.311 0.208 962 +964 4 378.9569 441.3609 40.2483 0.1866 963 +965 4 378.2693 442.267 40.0428 0.178 964 +966 4 377.6744 443.2382 39.8028 0.1865 965 +967 4 377.1631 444.2552 39.5368 0.2079 966 +968 4 376.8256 445.3306 39.1524 0.2161 967 +969 4 376.4607 446.406 38.8755 0.2073 968 +970 4 375.9516 447.4138 39.1499 0.2034 969 +971 4 375.4528 448.4205 39.6634 0.2123 970 +972 4 374.9449 449.4021 40.3735 0.2344 971 +973 4 374.4003 450.3676 41.0598 0.2601 972 +974 4 373.85 451.3526 41.5148 0.2858 973 +975 4 373.492 452.4017 41.1093 0.2924 974 +976 4 373.4782 453.5182 41.3106 0.2714 975 +977 4 373.1808 454.6073 41.3417 0.2456 976 +978 4 372.9509 455.7067 40.8579 0.2309 977 +979 4 373.0653 456.8049 40.2142 0.2177 978 +980 4 373.079 457.9409 40.3046 0.2048 979 +981 4 372.7861 459.0392 40.1565 0.2034 980 +982 4 372.6546 460.1637 40.4922 0.2272 981 +983 4 372.9131 461.2196 39.7057 0.2534 982 +984 4 373.1064 462.3453 39.7205 0.2542 983 +985 4 372.7941 463.3966 40.4712 0.2542 984 +986 4 372.5413 464.5075 40.7011 0.2559 985 +987 4 372.3102 465.608 40.5672 0.2669 986 +988 4 371.8492 466.5655 39.6864 0.2693 987 +989 4 371.5357 467.6626 39.7804 0.2854 988 +990 4 371.3115 468.7792 39.674 0.3083 989 +991 4 371.2783 469.9072 39.9708 0.3143 990 +992 4 371.387 471.0168 40.5241 0.294 991 +993 4 371.2692 472.1311 40.9777 0.2591 992 +994 4 371.0793 473.2202 41.3644 0.2331 993 +995 4 370.9798 474.2772 42.3032 0.2115 994 +996 4 370.99 475.4018 42.3368 0.1987 995 +997 4 370.9683 476.5046 42.1912 0.1907 996 +998 4 370.648 477.5903 42.5166 0.1961 997 +999 4 370.5107 478.6004 41.8214 0.2096 998 +1000 4 370.9226 479.5248 41.256 0.2306 999 +1001 4 371.0953 480.5772 41.4971 0.2415 1000 +1002 4 371.0907 481.7121 41.3619 0.2415 1001 +1003 4 371.244 482.8286 40.922 0.2415 1002 +1004 4 371.4705 483.9417 40.7557 0.2495 1003 +1005 4 371.6147 485.0606 40.4323 0.2542 1004 +1006 4 371.9899 486.1119 40.2699 0.2372 1005 +1007 4 372.2793 487.1873 40.6913 0.201 1006 +1008 4 371.9464 488.2295 41.0458 0.1713 1007 +1009 4 371.3115 489.1149 40.4113 0.1549 1008 +1010 4 370.6034 489.9775 39.8076 0.1635 1009 +1011 4 370.0451 490.887 38.8237 0.177 1010 +1012 4 369.3004 491.7164 39.2557 0.1902 1011 +1013 4 369.4308 492.8123 39.6791 0.1907 1012 +1014 4 369.7911 493.8408 39.0852 0.1931 1013 +1015 4 369.615 494.9276 38.3692 0.2061 1014 +1016 4 369.4617 495.9366 37.2761 0.2233 1015 +1017 4 369.8884 496.8953 36.4006 0.2368 1016 +1018 4 370.4844 497.8539 36.489 0.2179 1017 +1019 4 370.7933 498.9236 36.5674 0.1803 1018 +1020 4 370.4615 499.8022 35.32 0.1652 1019 +1021 4 369.7957 500.6567 34.9129 0.1746 1020 +1022 4 369.2729 501.6246 34.328 0.178 1021 +1023 4 369.1985 502.7216 33.7725 0.158 1022 +1024 4 369.3907 503.8165 33.1489 0.1311 1023 +1025 4 369.4914 504.9456 33.266 0.1271 1024 +1026 4 368.9652 505.9294 33.0036 0.1507 1025 +1027 4 368.0694 506.5838 32.3845 0.2002 1026 +1028 4 367.6633 507.5802 31.6674 0.2426 1027 +1029 4 368.384 508.4508 31.274 0.2796 1028 +1030 4 368.8839 509.4747 31.211 0.2811 1029 +1031 4 369.1951 510.5478 30.6636 0.2924 1030 +1032 4 369.2843 511.686 30.5648 0.294 1031 +1033 4 369.2123 512.8197 30.3052 0.3032 1032 +1034 4 369.2088 513.9294 29.6915 0.2903 1033 +1035 4 369.1985 515.0608 29.673 0.2796 1034 +1036 4 369.0006 516.1328 29.4476 0.2866 1035 +1037 4 369.6184 517.0274 29.2524 0.3152 1036 +1038 4 370.3105 517.8533 29.4585 0.336 1037 +1039 4 370.7178 518.8612 29.0654 0.331 1038 +1040 4 371.093 519.8176 27.8762 0.3044 1039 +1041 4 371.3275 520.8666 26.9713 0.281 1040 +1042 4 371.6147 521.8036 28.31 0.3162 1041 +1043 4 371.7794 522.8595 27.4417 0.3559 1042 +1044 4 372.372 523.8376 27.44 0.3432 1043 +1045 4 402.998 411.7439 49.9117 0.2104 176 +1046 4 402.9065 410.6091 50.197 0.1334 1045 +1047 4 402.8161 409.4754 50.4823 0.1176 1046 +1048 4 402.7246 408.3405 50.7676 0.1335 1047 +1049 4 402.6308 407.2068 51.0546 0.1589 1048 +1050 4 402.4054 406.0903 51.214 0.1845 1049 +1051 4 402.0943 404.9897 51.2406 0.1713 1050 +1052 4 401.981 403.8583 51.24 0.1554 1051 +1053 4 402.2384 402.7658 51.5623 0.1424 1052 +1054 4 402.4626 401.6561 51.3694 0.1502 1053 +1055 4 402.7795 400.6231 52.1175 0.1632 1054 +1056 4 403.2817 399.6118 52.1296 0.1868 1055 +1057 4 403.8675 398.6337 51.919 0.2346 1056 +1058 4 404.1363 397.5549 51.3584 0.2746 1057 +1059 4 404.3868 396.4498 50.983 0.3128 1058 +1060 4 404.698 395.3595 50.6094 0.3066 1059 +1061 4 405.2826 394.3951 50.9068 0.2706 1060 +1062 4 405.9152 393.4971 50.2082 0.196 1061 +1063 4 406.6909 392.8359 48.9544 0.1549 1062 +1064 4 407.4379 391.9859 49.0941 0.1644 1063 +1065 4 408.0625 391.0295 49.1697 0.2277 1064 +1066 4 408.1277 389.9347 49.9411 0.2667 1065 +1067 4 408.1586 388.7918 50.0346 0.2542 1066 +1068 4 408.8107 387.9315 49.1851 0.2116 1067 +1069 4 409.6401 387.1925 48.8877 0.1985 1068 +1070 4 410.2453 386.251 49.469 0.2374 1069 +1071 4 410.9111 385.3518 49.9341 0.2757 1070 +1072 4 411.7439 384.6071 50.4924 0.302 1071 +1073 4 412.6259 383.9001 50.6702 0.2893 1072 +1074 4 413.6498 383.4082 50.9382 0.2764 1073 +1075 4 414.5936 382.8064 50.8567 0.2595 1074 +1076 4 415.3452 381.9793 51.1249 0.2269 1075 +1077 4 416.098 381.1945 51.3178 0.1977 1076 +1078 4 416.8095 380.3285 50.8486 0.2147 1077 +1079 4 417.6801 379.6078 50.8813 0.279 1078 +1080 4 418.6948 379.1811 51.4172 0.3439 1079 +1081 4 419.7942 379.125 52.0374 0.3753 1080 +1082 4 420.873 378.9168 52.334 0.374 1081 +1083 4 421.9438 378.5679 52.7072 0.3606 1082 +1084 4 422.97 378.1618 53.3828 0.3393 1083 +1085 4 424.0144 377.7499 53.8605 0.3137 1084 +1086 4 425.099 377.4067 53.7905 0.2882 1085 +1087 4 426.1652 377.0018 53.6452 0.2534 1086 +1088 4 427.1479 376.4389 53.3512 0.2234 1087 +1089 4 428.1306 375.8658 53.4097 0.1876 1088 +1090 4 428.8559 375.0124 53.5718 0.178 1089 +1091 4 429.5903 374.1383 53.7032 0.1886 1090 +1092 4 430.1692 373.1945 53.1191 0.2128 1091 +1093 4 431.0592 372.5024 53.1194 0.2161 1092 +1094 4 432.0122 371.8709 53.1762 0.2161 1093 +1095 4 432.7283 371.0472 52.4185 0.2279 1094 +1096 4 433.8094 370.7384 52.2696 0.2641 1095 +1097 4 434.911 370.5061 51.7843 0.2787 1096 +1098 4 436.0322 370.2899 51.6858 0.2676 1097 +1099 4 437.1132 369.9399 51.9935 0.2429 1098 +1100 4 438.0822 369.4868 51.0555 0.2291 1099 +1101 4 439.1461 369.0716 50.9247 0.2288 1100 +1102 4 440.146 368.7249 49.8683 0.2289 1101 +1103 4 441.2683 368.535 49.6283 0.2418 1102 +1104 4 442.2212 367.9973 50.4 0.2676 1103 +1105 4 443.2554 367.629 49.6602 0.2918 1104 +1106 4 444.2896 367.1943 50.1892 0.2772 1105 +1107 4 445.1956 366.5021 50.2799 0.2233 1106 +1108 4 445.9861 365.7093 50.1698 0.1602 1107 +1109 4 447.0992 365.4828 50.26 0.1271 1108 +1110 4 448.2352 365.5503 50.3171 0.1334 1109 +1111 4 449.3392 365.7025 49.7078 0.1683 1110 +1112 4 450.4408 365.8558 49.4334 0.1968 1111 +1113 4 451.5711 365.8855 49.7924 0.2034 1112 +1114 4 452.7014 365.7929 49.819 0.1971 1113 +1115 4 453.7973 365.5503 49.3906 0.1907 1114 +1116 4 454.835 365.1019 49.0605 0.1907 1115 +1117 4 455.8737 364.6283 49.075 0.1973 1116 +1118 4 456.8656 364.1821 48.5528 0.217 1117 +1119 4 457.7716 363.5815 47.8545 0.2357 1118 +1120 4 458.6525 362.8574 47.7058 0.2344 1119 +1121 4 459.6329 362.3002 47.5488 0.2143 1120 +1122 4 460.6751 361.838 47.3273 0.2106 1121 +1123 4 461.715 361.3736 47.0806 0.2307 1122 +1124 4 462.7926 361.0121 46.8252 0.249 1123 +1125 4 463.8954 360.8336 47.161 0.2309 1124 +1126 4 465.0108 360.7432 47.7226 0.1842 1125 +1127 4 466.1182 360.5144 48.0301 0.1489 1126 +1128 4 467.1718 360.1392 48.552 0.1398 1127 +1129 4 468.2037 359.6759 48.7998 0.1485 1128 +1130 4 469.1418 359.033 48.8186 0.1432 1129 +1131 4 470.0158 358.3019 49.0566 0.1398 1130 +1132 4 471.0145 357.7677 49.0748 0.1494 1131 +1133 4 472.0579 357.2998 49.0056 0.1718 1132 +1134 4 473.1367 356.9337 48.8079 0.178 1133 +1135 4 474.2635 356.928 48.8564 0.1582 1134 +1136 4 475.3492 356.6409 48.7452 0.1326 1135 +1137 4 476.4154 356.2736 49.1112 0.1169 1136 +1138 4 477.5205 356.1055 49.6658 0.1144 1137 +1139 4 478.6404 356.0242 49.3231 0.1144 1138 +1140 4 479.7307 356.1672 49.8988 0.1144 1139 +1141 4 480.8655 356.2439 50.08 0.1262 1140 +1142 4 481.8574 356.7919 49.8798 0.1519 1141 +1143 4 482.7417 357.516 49.7862 0.1774 1142 +1144 4 483.8251 357.8226 49.3335 0.178 1143 +1145 4 484.9416 358.072 49.28 0.1144 1144 +1146 3 413.7985 419.0724 49.0834 0.1403 1 +1147 3 412.8765 419.705 49.6672 0.2042 1146 +1148 3 411.9533 420.3376 50.2502 0.3064 1147 +1149 3 411.1925 421.1522 50.7282 0.3777 1148 +1150 3 410.5404 422.0845 50.9564 0.394 1149 +1151 3 409.7591 422.8979 51.282 0.3422 1150 +1152 3 408.7157 423.2217 51.5021 0.2744 1151 +1153 3 407.8349 423.8165 51.1176 0.1144 1152 +1154 3 407.4482 423.1198 51.0563 0.2532 1153 +1155 3 406.3316 422.8785 50.9877 0.2542 1154 +1156 3 405.1911 422.9345 51.1361 0.2795 1155 +1157 3 404.086 422.9208 51.8602 0.2669 1156 +1158 3 403.0907 422.3968 52.3648 0.2924 1157 +1159 3 402.1068 421.9873 53.3845 0.2924 1158 +1160 3 401.0235 421.8672 54.2279 0.3051 1159 +1161 3 399.9252 421.5754 54.5625 0.3305 1160 +1162 3 399.0432 420.9279 55.3748 0.3686 1161 +1163 3 397.969 420.5413 55.5677 0.4322 1162 +1164 3 396.42 420.4772 56.3914 0.3943 1163 +1165 3 395.3195 420.253 56.9254 0.3814 1164 +1166 3 394.2579 419.8777 57.4258 0.3939 1165 +1167 3 393.2386 419.3687 57.6514 0.4067 1166 +1168 3 392.2696 418.7612 57.6797 0.4194 1167 +1169 3 391.3475 418.084 57.6803 0.4195 1168 +1170 3 390.4335 417.3953 57.6808 0.4069 1169 +1171 3 389.54 416.6803 57.6859 0.4068 1170 +1172 3 388.5859 416.0499 57.7181 0.4068 1171 +1173 3 387.5437 415.5889 57.9684 0.4068 1172 +1174 3 386.545 415.1576 58.8311 0.3686 1173 +1175 3 385.1162 414.3316 58.6634 0.178 1174 +1176 3 384.106 413.8775 59.2701 0.178 1175 +1177 3 383.1164 413.3295 59.4549 0.1866 1176 +1178 3 382.1852 412.6888 59.6361 0.2122 1177 +1179 3 381.2163 412.1111 59.584 0.2377 1178 +1180 3 380.3754 411.3378 59.463 0.2542 1179 +1181 3 379.498 410.6045 59.4073 0.2497 1180 +1182 3 378.6434 409.8517 59.5076 0.2369 1181 +1183 3 377.9158 408.9743 59.64 0.2382 1182 +1184 3 377.2786 408.0248 59.64 0.2636 1183 +1185 3 376.7203 407.0341 59.7982 0.2939 1184 +1186 3 376.1666 406.0697 60.3562 0.3228 1185 +1187 3 375.3613 405.3444 60.555 0.3417 1186 +1188 3 374.4735 404.6706 60.2512 0.3559 1187 +1189 3 373.7608 403.7908 60.0065 0.349 1188 +1190 3 373.0458 402.9214 59.5426 0.3156 1189 +1191 3 372.197 402.1755 59.2262 0.2645 1190 +1192 3 371.2909 401.4799 59.1959 0.2202 1191 +1193 3 370.4398 400.734 59.5395 0.2034 1192 +1194 3 369.536 400.1186 60.2538 0.2262 1193 +1195 3 368.6426 399.4734 60.9207 0.2646 1194 +1196 3 367.8967 398.6291 60.9636 0.2796 1195 +1197 3 367.3258 397.651 61.0551 0.2474 1196 +1198 3 366.6337 396.8296 60.5262 0.2032 1197 +1199 3 366.0251 396.094 59.0492 0.2003 1198 +1200 3 365.0172 395.8881 58.7073 0.3143 1199 +1201 3 363.8927 395.6959 58.7916 0.2633 1200 +1202 3 362.8928 395.1593 58.592 0.2032 1201 +1203 3 362.3025 394.3402 59.8951 0.152 1202 +1204 3 361.8083 393.7168 61.871 0.1398 1203 +1205 3 360.837 393.2237 62.6128 0.1409 1204 +1206 3 360.0557 392.4492 62.0533 0.1539 1205 +1207 3 359.6667 391.5386 60.9599 0.1692 1206 +1208 3 358.7904 390.8465 61.4989 0.1948 1207 +1209 3 357.746 390.4335 61.9097 0.2138 1208 +1210 3 356.6248 390.2276 61.9982 0.1961 1209 +1211 3 355.5792 389.8054 62.3386 0.1598 1210 +1212 3 354.6606 389.1808 62.7626 0.1432 1211 +1213 3 353.7248 388.5607 62.3428 0.1697 1212 +1214 3 352.6963 388.0826 62.253 0.2212 1213 +1215 3 351.7182 387.5094 62.5044 0.2677 1214 +1216 3 350.8133 386.8139 62.4047 0.2878 1215 +1217 3 349.9713 386.0577 62.3095 0.2613 1216 +1218 3 349.1305 385.3038 62.5954 0.2058 1217 +1219 3 348.1375 384.7455 62.7312 0.1559 1218 +1220 3 347.1376 384.2044 62.8468 0.1398 1219 +1221 3 346.3906 383.4162 63.3203 0.1491 1220 +1222 3 345.8198 382.4964 64.0797 0.17 1221 +1223 3 344.9526 381.7986 64.2592 0.1829 1222 +1224 3 343.9104 381.389 64.0032 0.1907 1223 +1225 3 342.787 381.2986 64.2958 0.1972 1224 +1226 3 341.6705 381.3673 64.8726 0.228 1225 +1227 3 340.5562 381.2769 65.3859 0.2607 1226 +1228 3 339.5712 381.508 64.4731 0.2563 1227 +1229 3 338.4741 381.6739 64.6344 0.1999 1228 +1230 3 337.3324 381.7002 64.6775 0.1579 1229 +1231 3 336.2124 381.4885 64.6453 0.1415 1230 +1232 3 335.1165 381.1659 64.51 0.1508 1231 +1233 3 333.9942 380.952 64.4932 0.1413 1232 +1234 3 332.8994 380.6546 64.8133 0.1284 1233 +1235 3 331.9579 380.0391 65.2582 0.1271 1234 +1236 3 330.9867 379.562 64.4403 0.1398 1235 +1237 3 330.0783 378.8653 64.4129 0.1525 1236 +1238 3 329.2432 378.092 64.68 0.1144 1237 +1239 3 385.4948 415.3578 58.7045 0.1481 1174 +1240 3 384.4595 415.7227 58.4716 0.1492 1239 +1241 3 383.3338 415.6758 58.1134 0.1897 1240 +1242 3 382.2848 415.6678 57.0819 0.2636 1241 +1243 3 381.2369 415.86 56.4827 0.3314 1242 +1244 3 380.1295 416.1414 56.4925 0.3692 1243 +1245 3 379.0495 416.4469 56.0501 0.361 1244 +1246 3 377.9719 416.6871 55.3241 0.3154 1245 +1247 3 376.8599 416.8644 54.934 0.2501 1246 +1248 3 375.8829 417.3632 54.88 0.208 1247 +1249 3 375.2492 418.2933 55.008 0.2034 1248 +1250 3 374.8179 419.3481 55.1818 0.2388 1249 +1251 3 374.0926 420.1397 55.7715 0.2636 1250 +1252 3 373.3215 420.9222 55.4061 0.2861 1251 +1253 3 372.491 421.6784 54.9175 0.2728 1252 +1254 3 371.8641 422.6085 54.5443 0.2471 1253 +1255 3 371.1422 423.4813 54.2531 0.1909 1254 +1256 3 370.2922 424.2444 54.2357 0.1462 1255 +1257 3 369.2912 424.7741 53.9927 0.129 1256 +1258 3 368.2856 425.3175 53.9137 0.138 1257 +1259 3 367.3006 425.8986 53.9972 0.1508 1258 +1260 3 366.3282 426.4981 54.1321 0.1414 1259 +1261 3 365.4165 427.1742 54.453 0.1285 1260 +1262 3 364.3651 427.5814 54.8495 0.115 1261 +1263 3 363.2486 427.7999 55.137 0.1144 1262 +1264 3 362.1492 428.0974 55.389 0.1144 1263 +1265 3 361.1036 428.5195 55.8516 0.1144 1264 +1266 3 360.0809 429.0297 55.776 0.1144 1265 +1267 3 358.978 429.3032 56.096 0.1144 1266 +1268 3 357.8478 429.469 56.2078 0.1144 1267 +1269 3 356.8136 429.9152 55.72 0.1144 1268 +1270 3 356.5207 429.7505 56.84 0.1144 1269 +1271 3 356.3434 429.5846 56.84 0.1144 1270 +1272 3 356.0128 429.572 56.84 0.1144 1271 +1273 3 355.6696 429.572 56.84 0.1144 1272 +1274 3 355.4408 429.572 56.84 0.1144 1273 +1275 3 354.831 429.381 56.84 0.1144 1274 +1276 3 354.5759 429.2929 56.84 0.1144 1275 +1277 3 354.4753 429.0503 56.84 0.1144 1276 +1278 3 354.1824 429.0 56.84 0.1144 1277 +1279 3 353.8392 429.0 56.84 0.1144 1278 +1280 3 353.6104 429.0 56.84 0.1144 1279 +1281 3 352.8096 429.0 56.84 0.1144 1280 +1282 3 352.4664 429.0 56.84 0.1144 1281 +1283 3 352.1232 429.0 56.84 0.1144 1282 +1284 3 351.8178 428.9622 56.84 0.1144 1283 +1285 3 351.6782 428.7586 56.84 0.1144 1284 +1286 3 351.4368 428.428 56.84 0.1144 1285 +1287 3 351.1062 428.4154 56.84 0.1144 1286 +1288 3 351.017 428.3902 56.84 0.1144 1287 +1289 3 350.2928 428.3136 56.84 0.1144 1288 +1290 3 349.492 428.3136 56.84 0.1144 1289 +1291 3 348.6912 428.3136 56.84 0.1144 1290 +1292 3 347.8904 428.3136 56.84 0.1144 1291 +1293 3 347.5472 428.3136 56.84 0.1144 1292 +1294 3 347.2166 428.301 56.84 0.1144 1293 +1295 3 346.9752 428.1992 56.84 0.1144 1294 +1296 3 346.8482 427.983 56.84 0.1144 1295 +1297 3 346.4032 427.856 56.84 0.1144 1296 +1298 3 346.0978 427.8182 56.84 0.1144 1297 +1299 3 346.0222 427.7794 56.84 0.1144 1298 +1300 3 345.2592 427.7416 56.84 0.1144 1299 +1301 3 344.4584 427.7416 56.84 0.1144 1300 +1302 3 343.6576 427.7416 56.84 0.1144 1301 +1303 3 343.3144 427.7416 56.84 0.1144 1302 +1304 3 342.9838 427.729 56.84 0.1144 1303 +1305 3 342.7676 427.602 56.84 0.1144 1304 +1306 3 342.5639 427.4625 56.84 0.1144 1305 +1307 3 342.501 427.2966 56.84 0.1144 1306 +1308 3 342.2082 426.7886 56.84 0.1144 1307 +1309 3 341.7254 426.4706 56.84 0.1144 1308 +1310 3 341.5858 426.267 56.84 0.1144 1309 +1311 3 341.3696 426.14 56.84 0.1144 1310 +1312 3 341.0264 426.14 56.84 0.1144 1311 +1313 3 340.6832 426.14 56.84 0.1144 1312 +1314 3 340.4544 426.14 56.84 0.1144 1313 +1315 3 339.7806 426.013 56.84 0.1144 1314 +1316 3 339.196 425.7968 56.84 0.1144 1315 +1317 3 338.3952 425.7968 56.84 0.1144 1316 +1318 3 337.5944 425.7968 56.84 0.1144 1317 +1319 3 337.1368 425.568 56.84 0.1144 1318 +1320 3 397.3341 420.8925 57.2345 0.4499 1163 +1321 3 396.3422 421.4279 57.0119 0.3835 1320 +1322 3 395.5952 422.2275 56.8467 0.3027 1321 +1323 3 394.6846 422.6451 58.1101 0.2214 1322 +1324 3 393.6104 422.7583 58.9109 0.1907 1323 +1325 3 392.6505 422.8361 60.1087 0.1986 1324 +1326 3 391.7079 423.4459 60.5024 0.2207 1325 +1327 3 390.8453 424.0842 60.9826 0.2388 1326 +1328 3 390.0331 424.7169 61.6874 0.2766 1327 +1329 3 389.1053 425.3506 61.7044 0.3342 1328 +1330 3 388.2999 426.1549 61.9564 0.3804 1329 +1331 3 387.5678 427.0277 62.097 0.4001 1330 +1332 3 386.847 427.8869 62.5388 0.3945 1331 +1333 3 386.0542 428.6797 63.047 0.3626 1332 +1334 3 385.1722 429.3947 63.2475 0.2982 1333 +1335 3 384.1575 429.8969 63.4385 0.2145 1334 +1336 3 383.0467 430.0788 63.5606 0.1508 1335 +1337 3 381.9393 430.1234 64.0676 0.1271 1336 +1338 3 381.0229 430.2813 65.5752 0.1345 1337 +1339 3 380.0231 430.279 66.3659 0.1476 1338 +1340 3 378.9809 430.0754 67.1787 0.1446 1339 +1341 3 377.9147 429.9976 68.0638 0.1317 1340 +1342 3 376.8153 430.2218 68.3189 0.1187 1341 +1343 3 375.9024 430.7824 69.0183 0.1144 1342 +1344 3 375.3647 431.6163 70.3041 0.1144 1343 +1345 3 374.6325 432.4057 70.9971 0.1144 1344 +1346 3 373.5812 432.7798 71.1942 0.1144 1345 +1347 3 372.5161 433.1161 71.7517 0.1144 1346 +1348 3 371.4751 433.4891 72.4752 0.1144 1347 +1349 3 370.4924 434.0553 72.7913 0.1144 1348 +1350 3 369.5269 434.5999 73.4689 0.1144 1349 +1351 3 368.7604 435.2794 74.7141 0.1144 1350 +1352 3 368.4881 436.3479 75.4586 0.1144 1351 +1353 3 368.2536 437.4656 75.6 0.1144 1352 +1354 3 368.0248 437.58 74.48 0.1144 1353 +1355 3 367.7194 437.6178 74.48 0.1144 1354 +1356 3 367.4528 437.6944 74.48 0.1144 1355 +1357 3 367.1222 437.707 74.48 0.1144 1356 +1358 3 366.9574 437.771 74.48 0.1144 1357 +1359 3 366.4106 438.025 74.48 0.1144 1358 +1360 3 366.0674 438.4826 74.48 0.1144 1359 +1361 3 365.7242 438.9402 74.48 0.1144 1360 +1362 3 365.1648 439.1816 74.48 0.1144 1361 +1363 3 364.6694 439.487 74.48 0.1144 1362 +1364 3 364.4143 439.5751 74.48 0.1144 1363 +1365 3 364.3514 439.8554 74.48 0.1144 1364 +1366 3 364.1352 439.9824 74.48 0.1144 1365 +1367 3 363.792 439.9824 74.48 0.1144 1366 +1368 3 363.601 440.0202 74.48 0.1144 1367 +1369 3 362.8768 440.0968 74.48 0.1144 1368 +1370 3 362.2796 440.3004 74.48 0.1144 1369 +1371 3 361.695 440.5166 74.48 0.1144 1370 +1372 3 360.932 440.5544 74.48 0.1144 1371 +1373 3 360.1312 440.5544 74.48 0.1144 1372 +1374 3 359.4448 440.44 74.48 0.1144 1373 +1375 3 359.1016 440.44 74.48 0.1144 1374 +1376 3 358.7584 440.44 74.48 0.1144 1375 +1377 3 358.453 440.4022 74.48 0.1144 1376 +1378 3 358.3008 440.2112 74.48 0.1144 1377 +1379 3 358.2116 440.0716 74.48 0.1144 1378 +1380 3 357.9702 439.9698 74.48 0.1144 1379 +1381 3 357.7666 439.8302 74.48 0.1144 1380 +1382 3 357.6522 439.6014 74.48 0.1144 1381 +1383 3 357.5378 439.3726 74.48 0.1144 1382 +1384 3 357.5 439.1816 74.48 0.1144 1383 +1385 3 357.3856 438.9528 74.48 0.1144 1384 +1386 3 407.8188 424.019 51.3064 0.122 1153 +1387 3 407.8097 425.0978 52.0808 0.1615 1386 +1388 3 408.0568 426.1835 52.4297 0.1975 1387 +1389 3 408.4904 427.0804 53.6399 0.2161 1388 +1390 3 409.3518 427.6466 54.7467 0.2122 1389 +1391 3 410.4214 427.8743 55.3812 0.1993 1390 +1392 3 411.562 427.8526 55.3689 0.1907 1391 +1393 3 412.6602 427.8045 55.6587 0.1953 1392 +1394 3 413.6086 427.7576 57.1595 0.2034 1393 +1395 3 414.4632 427.4304 58.7538 0.2034 1394 +1396 3 415.3978 427.03 59.9561 0.1844 1395 +1397 3 415.9321 426.4489 61.4566 0.1503 1396 +1398 3 416.4492 425.6664 62.8432 0.1236 1397 +1399 3 417.258 425.0292 64.0455 0.1144 1398 +1400 3 417.8735 424.2089 65.1949 0.1239 1399 +1401 3 418.6331 423.4333 64.965 0.1381 1400 +1402 3 419.3263 422.5318 64.8533 0.1639 1401 +1403 3 419.5117 421.6727 66.5792 0.1652 1402 +1404 3 419.6192 420.5722 67.2932 0.1652 1403 +1405 3 419.5929 420.0745 68.7666 0.1343 1404 +1406 3 419.7187 419.1353 69.4949 0.1144 1405 +1407 3 419.8194 418.0199 69.6805 0.1144 1406 +1408 3 419.6741 417.163 71.239 0.1144 1407 +1409 3 419.1044 416.567 73.0705 0.1144 1408 +1410 3 418.601 415.6713 73.3211 0.1144 1409 +1411 3 418.45 414.5524 73.2245 0.1144 1410 +1412 3 418.736 413.5194 73.9502 0.1144 1411 +1413 3 418.9328 412.412 74.2 0.1144 1412 +1414 3 419.7439 420.4612 67.9395 0.1144 1404 +1415 3 420.5916 420.436 69.7956 0.1144 1414 +1416 3 421.2791 419.6787 70.8226 0.1144 1415 +1417 3 421.667 418.6251 70.6947 0.1144 1416 +1418 3 422.5776 417.9856 70.56 0.1144 1417 +1419 3 423.6289 417.5646 70.56 0.1144 1418 +1420 3 424.5659 416.9114 70.5124 0.1144 1419 +1421 3 425.457 416.1975 70.49 0.1144 1420 +1422 3 426.2853 415.4356 70.8652 0.1144 1421 +1423 3 427.0403 414.6382 71.6148 0.1144 1422 +1424 3 427.9544 414.033 72.0703 0.1144 1423 +1425 3 429.0275 413.6441 71.9662 0.1144 1424 +1426 3 430.1303 413.3501 71.8528 0.1144 1425 +1427 3 431.248 413.1224 71.685 0.1144 1426 +1428 3 432.3805 412.9932 71.68 0.1144 1427 +1429 3 433.5142 412.8868 71.6808 0.1144 1428 +1430 3 434.5324 412.4406 71.7391 0.1144 1429 +1431 3 435.4945 412.0139 72.2338 0.1144 1430 +1432 3 436.4383 412.3068 73.3625 0.1144 1431 +1433 3 437.3352 412.9142 74.0751 0.1144 1432 +1434 3 438.0868 413.7356 74.1944 0.1144 1433 +1435 3 438.5982 414.7114 74.797 0.1144 1434 +1436 3 439.3829 415.3898 74.4419 0.1144 1435 +1437 3 440.1963 416.1552 74.4554 0.1144 1436 +1438 3 441.0623 416.8942 74.6698 0.1144 1437 +1439 3 442.0222 417.5062 74.5402 0.1144 1438 +1440 3 443.0632 417.9673 74.6544 0.1144 1439 +1441 3 444.1694 418.0451 75.1596 0.1144 1440 +1442 3 445.1304 417.568 75.994 0.126 1441 +1443 3 445.914 416.8358 76.9563 0.1517 1442 +1444 3 445.9312 415.7296 77.56 0.2288 1443 +1445 3 415.9687 415.4985 47.9427 0.1671 1 +1446 3 416.1037 414.3625 47.9735 0.2466 1445 +1447 3 416.2627 413.23 47.9956 0.3358 1446 +1448 3 416.6173 412.1523 48.0917 0.4021 1447 +1449 3 417.5257 411.7576 48.4282 0.4744 1448 +1450 3 418.2544 412.5676 48.2748 0.5529 1449 +1451 3 418.8527 413.5388 48.4341 0.5944 1450 +1452 3 419.4453 414.517 48.4744 0.5504 1451 +1453 3 420.0116 415.5065 48.2524 0.4289 1452 +1454 3 420.7529 416.2009 49.4525 0.3193 1453 +1455 3 421.5617 415.6632 50.8864 0.2924 1454 +1456 3 422.557 415.0993 50.9564 0.3305 1455 +1457 3 423.3978 414.3236 50.9384 0.3432 1456 +1458 3 423.7513 412.8044 50.5532 0.3082 1457 +1459 3 423.9939 411.713 50.036 0.3252 1458 +1460 3 424.2078 410.5988 49.8425 0.3283 1459 +1461 3 424.5018 409.4948 49.84 0.3432 1460 +1462 3 424.7386 408.376 49.84 0.3485 1461 +1463 3 424.8805 407.2468 49.8394 0.3401 1462 +1464 3 424.8747 406.1028 49.8369 0.302 1463 +1465 3 425.2728 405.1968 50.0189 0.1144 1464 +1466 3 424.8336 404.6328 49.8145 0.3305 1465 +1467 3 424.7878 403.4911 49.6647 0.3813 1466 +1468 3 424.8827 402.3894 48.9418 0.3686 1467 +1469 3 424.8976 401.25 48.7206 0.3432 1468 +1470 3 424.9914 400.1094 48.7138 0.3178 1469 +1471 3 425.3907 399.0375 48.6842 0.3178 1470 +1472 3 425.8815 398.3339 48.4154 0.2373 1471 +1473 3 426.6033 397.4954 47.8341 0.1723 1472 +1474 3 427.4018 396.7586 46.9574 0.1538 1473 +1475 3 428.2209 396.1283 45.8382 0.1461 1474 +1476 3 428.7415 395.8732 43.713 0.1748 1475 +1477 3 428.5332 395.5998 41.2194 0.2314 1476 +1478 3 428.0287 394.9877 39.2526 0.2627 1477 +1479 3 427.5242 394.1572 37.8067 0.2496 1478 +1480 3 426.6388 393.7431 36.7808 0.22 1479 +1481 3 426.0691 394.4478 35.3665 0.2161 1480 +1482 3 426.2327 395.371 33.8271 0.2161 1481 +1483 3 426.839 396.2862 33.0991 0.1917 1482 +1484 3 427.173 397.3043 32.1255 0.1785 1483 +1485 3 426.2086 397.6613 31.0895 0.178 1484 +1486 3 425.147 397.8088 30.1087 0.178 1485 +1487 3 424.0751 398.207 30.1328 0.1525 1486 +1488 3 423.8772 398.4907 30.9498 0.1898 1487 +1489 3 423.7982 399.1622 32.9034 0.2577 1488 +1490 3 424.5281 399.7136 34.0721 0.2852 1489 +1491 3 425.3941 400.3668 34.1239 0.2867 1490 +1492 3 425.7385 401.4079 33.9018 0.2796 1491 +1493 3 425.6504 402.418 32.8714 0.2915 1492 +1494 3 425.4753 403.276 31.0761 0.3177 1493 +1495 3 425.8197 404.0276 29.5274 0.3238 1494 +1496 3 426.6148 404.7655 28.8075 0.3109 1495 +1497 3 427.5117 405.4576 28.8081 0.2981 1496 +1498 3 428.5538 405.8912 28.8044 0.2996 1497 +1499 3 429.6075 406.1406 28.054 0.2903 1498 +1500 3 430.6885 406.3259 27.4165 0.272 1499 +1501 3 431.8085 406.5318 27.4624 0.2749 1500 +1502 3 432.7249 407.0993 27.0698 0.3056 1501 +1503 3 433.1848 408.0488 26.1993 0.3267 1502 +1504 3 433.266 409.115 25.2784 0.2941 1503 +1505 3 432.9948 410.1881 24.7352 0.2516 1504 +1506 3 432.7489 411.2943 24.8735 0.2318 1505 +1507 3 433.195 412.2839 24.9749 0.2612 1506 +1508 3 434.1846 412.8113 24.8755 0.2892 1507 +1509 3 435.1948 413.3386 24.6268 0.2924 1508 +1510 3 436.1569 413.9255 24.1576 0.3037 1509 +1511 3 437.1785 414.3374 23.429 0.3051 1510 +1512 3 438.2435 414.5158 22.5224 0.3279 1511 +1513 3 439.3738 414.6279 22.3012 0.3189 1512 +1514 3 440.3187 415.2217 22.7391 0.3416 1513 +1515 3 441.2111 415.9298 22.9718 0.3313 1514 +1516 3 442.1869 416.5201 23.1594 0.3305 1515 +1517 3 443.0872 417.1493 23.9243 0.2946 1516 +1518 3 443.9807 417.3266 25.5822 0.268 1517 +1519 3 444.4417 416.424 24.5874 0.2161 1518 +1520 3 444.5584 415.5008 22.96 0.1144 1519 +1521 3 423.1473 398.2115 29.5196 0.1764 1487 +1522 3 422.1554 398.6291 28.6143 0.1909 1521 +1523 3 421.3043 398.2916 27.027 0.2297 1522 +1524 3 421.27 397.8958 24.5543 0.2458 1523 +1525 3 422.1966 398.0422 23.5777 0.2616 1524 +1526 3 423.2411 398.3831 23.3551 0.2433 1525 +1527 3 424.3199 398.5845 22.7268 0.2288 1526 +1528 3 425.3152 399.0272 22.9102 0.2407 1527 +1529 3 426.2716 399.5672 22.9631 0.2741 1528 +1530 3 427.2977 399.3967 22.4496 0.2996 1529 +1531 3 428.3182 398.9128 22.0772 0.2902 1530 +1532 3 429.3604 398.4518 22.1413 0.2555 1531 +1533 3 430.3396 397.8832 22.4949 0.2078 1532 +1534 3 431.3475 397.3661 22.4442 0.1993 1533 +1535 3 432.3622 396.9852 23.0745 0.2398 1534 +1536 3 433.2202 396.4978 24.4423 0.3104 1535 +1537 3 433.4685 395.514 24.9379 0.3305 1536 +1538 3 433.0829 394.5084 25.6004 0.3004 1537 +1539 3 432.9502 393.4056 25.9913 0.2458 1538 +1540 3 433.4433 392.3897 26.2363 0.2415 1539 +1541 3 433.4708 391.3052 27.0808 0.2541 1540 +1542 3 432.8896 390.3328 27.44 0.2288 1541 +1543 3 425.4307 398.1578 48.7099 0.2815 1471 +1544 3 425.6229 397.0366 48.4338 0.2796 1543 +1545 3 425.9558 395.9453 48.6228 0.2545 1544 +1546 3 426.426 394.9248 49.14 0.2542 1545 +1547 3 427.0083 393.941 49.2153 0.2416 1546 +1548 3 427.7164 393.0532 49.56 0.2288 1547 +1549 3 426.9488 392.1163 51.1277 0.1346 1548 +1550 3 426.307 391.3349 52.4367 0.1271 1549 +1551 3 425.6652 390.5524 53.7452 0.1449 1550 +1552 3 425.0154 389.7116 54.7599 0.1884 1551 +1553 3 424.2181 388.9245 55.1205 0.2397 1552 +1554 3 423.4505 388.0803 55.16 0.2908 1553 +1555 3 422.7011 387.2417 55.5904 0.3051 1554 +1556 3 422.2252 386.2304 55.732 0.2958 1555 +1557 3 421.5068 385.3861 55.979 0.2736 1556 +1558 3 420.7254 384.5567 56.1674 0.2952 1557 +1559 3 419.9613 383.7068 56.2148 0.3338 1558 +1560 3 419.3321 382.7687 56.5547 0.3724 1559 +1561 3 418.9031 381.7162 56.6857 0.3715 1560 +1562 3 418.4969 380.6694 57.1701 0.3582 1561 +1563 3 417.8403 379.7863 57.8648 0.3451 1562 +1564 3 417.0475 378.9717 57.8752 0.3212 1563 +1565 3 416.4824 377.9868 57.696 0.2829 1564 +1566 3 415.8749 377.043 58.1832 0.2441 1565 +1567 3 415.0043 376.3405 58.7278 0.2534 1566 +1568 3 414.1108 375.6381 59.0425 0.2781 1567 +1569 3 413.1956 374.962 59.3289 0.2916 1568 +1570 3 412.2404 374.3408 59.593 0.2684 1569 +1571 3 411.3435 373.6327 59.5781 0.231 1570 +1572 3 410.4718 373.0401 60.3968 0.2161 1571 +1573 3 409.6447 372.3377 61.04 0.2255 1572 +1574 3 408.9846 371.4145 61.2567 0.2094 1573 +1575 3 408.813 370.3139 61.364 0.1835 1574 +1576 3 408.7661 369.1825 61.7462 0.1579 1575 +1577 3 408.1964 368.2444 62.092 0.1627 1576 +1578 3 407.3063 367.5683 62.5792 0.1652 1577 +1579 3 406.3271 367.0879 63.3909 0.1652 1578 +1580 3 405.6647 366.1955 63.31 0.1431 1579 +1581 3 405.1956 365.1545 63.2565 0.1398 1580 +1582 3 404.666 364.1546 63.6177 0.1511 1581 +1583 3 403.983 363.2406 63.7305 0.1867 1582 +1584 3 403.1776 362.4409 64.0674 0.2021 1583 +1585 3 402.3311 361.6779 64.2919 0.192 1584 +1586 3 401.512 360.9034 64.7595 0.156 1585 +1587 3 400.7981 360.0294 65.2 0.1289 1586 +1588 3 400.2318 359.049 65.5956 0.1271 1587 +1589 3 399.5203 358.1567 65.6393 0.1511 1588 +1590 3 398.8762 357.4474 67.1286 0.1906 1589 +1591 3 398.3408 356.4704 67.76 0.2288 1590 +1592 3 428.0951 392.5636 48.6256 0.2608 1548 +1593 3 428.7334 391.7296 47.5773 0.2968 1592 +1594 3 429.3226 390.9002 46.3352 0.3146 1593 +1595 3 429.7642 390.5753 44.0191 0.2977 1594 +1596 3 430.0239 389.6544 43.1749 0.2805 1595 +1597 3 430.1966 389.0321 45.3636 0.267 1596 +1598 3 430.875 388.1134 45.5417 0.2799 1597 +1599 3 431.5099 387.1811 45.0993 0.3058 1598 +1600 3 431.8657 386.0943 45.1108 0.3308 1599 +1601 3 432.2387 385.0155 45.2413 0.3432 1600 +1602 3 432.4331 383.9195 45.8749 0.3441 1601 +1603 3 432.5864 382.8876 46.9652 0.357 1602 +1604 3 432.4892 381.7505 47.0392 0.3686 1603 +1605 3 432.2821 380.6557 46.8821 0.3644 1604 +1606 3 432.392 379.6307 45.7741 0.3331 1605 +1607 3 432.6196 378.5485 45.8368 0.3013 1606 +1608 3 433.0806 377.5543 46.4176 0.2924 1607 +1609 3 433.5417 376.519 46.1412 0.2966 1608 +1610 3 434.1331 375.5546 45.724 0.3051 1609 +1611 3 434.6765 374.6074 44.9694 0.3108 1610 +1612 3 435.2943 373.7288 44.5362 0.3236 1611 +1613 3 436.1191 372.9715 45.0556 0.3425 1612 +1614 3 436.9199 372.1878 45.4236 0.3495 1613 +1615 3 437.3569 371.1891 45.0943 0.3363 1614 +1616 3 437.3134 370.1069 44.3663 0.3025 1615 +1617 3 437.2322 368.9983 43.8348 0.2725 1616 +1618 3 437.6875 368.1472 42.9114 0.2587 1617 +1619 3 437.8546 367.1691 42.7252 0.263 1618 +1620 3 437.723 366.0365 42.7711 0.2669 1619 +1621 3 437.5194 364.912 42.8254 0.2573 1620 +1622 3 437.8214 363.8744 42.3604 0.2542 1621 +1623 3 438.2447 362.8368 41.8051 0.2542 1622 +1624 3 438.6737 361.8266 41.0164 0.2876 1623 +1625 3 439.2766 360.8897 41.4098 0.3151 1624 +1626 3 439.8337 359.8967 41.2846 0.3292 1625 +1627 3 439.9664 358.7698 41.2902 0.3062 1626 +1628 3 440.2993 357.8329 39.9602 0.2532 1627 +1629 3 441.052 357.0252 39.3431 0.202 1628 +1630 3 441.3541 356.0048 40.2144 0.1643 1629 +1631 3 441.3209 354.9294 39.3439 0.1525 1630 +1632 3 441.1607 353.8198 39.6567 0.1525 1631 +1633 3 441.4593 352.7215 39.7398 0.1525 1632 +1634 3 441.4936 351.5867 39.597 0.1567 1633 +1635 3 441.6046 350.4701 39.1633 0.1706 1634 +1636 3 441.7167 349.3387 39.0303 0.1891 1635 +1637 3 441.6961 348.197 38.9049 0.2089 1636 +1638 3 441.6469 347.0576 38.6932 0.2161 1637 +1639 3 441.5531 345.9273 38.3387 0.2105 1638 +1640 3 441.6103 344.8165 37.861 0.1978 1639 +1641 3 441.9741 343.7537 37.5169 0.1963 1640 +1642 3 442.3448 342.6829 37.4209 0.2091 1641 +1643 3 442.3859 341.5618 37.5418 0.2275 1642 +1644 3 442.2258 340.4372 37.7535 0.2472 1643 +1645 3 442.0691 339.3047 37.6796 0.26 1644 +1646 3 441.9432 338.1813 37.9327 0.2549 1645 +1647 3 441.8814 337.0556 38.337 0.2293 1646 +1648 3 441.9203 335.9162 38.386 0.197 1647 +1649 3 442.0759 334.7973 38.0394 0.1713 1648 +1650 3 442.3436 333.7002 37.7381 0.1652 1649 +1651 3 442.7051 332.6203 37.9025 0.1789 1650 +1652 3 443.1284 331.5667 38.2306 0.2045 1651 +1653 3 443.6524 330.5782 38.7545 0.2161 1652 +1654 3 444.2541 329.6253 38.988 0.2019 1653 +1655 3 444.8547 328.6529 38.9189 0.1765 1654 +1656 3 445.3535 327.629 38.7934 0.151 1655 +1657 3 445.9198 326.6486 38.8388 0.1398 1656 +1658 3 446.5318 325.6957 39.1969 0.1469 1657 +1659 3 447.121 324.7233 39.3092 0.1741 1658 +1660 3 447.6289 323.7085 39.4386 0.2051 1659 +1661 3 448.0762 322.6663 39.8 0.2161 1660 +1662 3 448.6276 321.6734 39.9552 0.2161 1661 +1663 3 449.3014 320.7536 40.0988 0.2238 1662 +1664 3 449.9993 319.8498 40.1106 0.2677 1663 +1665 3 450.6079 318.8866 40.1705 0.3319 1664 +1666 3 451.0334 317.8364 40.4202 0.3958 1665 +1667 3 451.2977 316.7278 40.6174 0.4195 1666 +1668 3 451.4807 315.601 40.7784 0.4035 1667 +1669 3 451.2451 314.5394 41.169 0.3686 1668 +1670 3 450.7989 313.4949 41.2482 0.3384 1669 +1671 3 450.2395 312.5053 41.3784 0.3032 1670 +1672 3 450.2223 311.4529 41.9695 0.231 1671 +1673 3 450.434 310.4908 43.3527 0.1578 1672 +1674 3 450.5678 309.3765 43.344 0.1278 1673 +1675 3 450.6754 308.3824 42.0333 0.1424 1674 +1676 3 450.2715 307.5289 40.5927 0.1836 1675 +1677 3 450.2326 306.4021 41.0698 0.2706 1676 +1678 3 450.1834 305.2672 41.2404 0.3562 1677 +1679 3 450.2578 304.1301 41.2196 0.397 1678 +1680 3 450.3653 303.0021 41.5167 0.3911 1679 +1681 3 450.2933 301.8741 41.797 0.3656 1680 +1682 3 449.9363 300.8526 41.2317 0.348 1681 +1683 3 449.6183 299.7966 41.032 0.3117 1682 +1684 3 449.5199 298.7064 41.6198 0.2748 1683 +1685 3 449.5462 297.6345 42.0174 0.2669 1684 +1686 3 449.417 296.5465 42.0927 0.2669 1685 +1687 3 449.2294 295.4735 42.9265 0.2612 1686 +1688 3 448.9228 294.5034 44.0342 0.2405 1687 +1689 3 448.4366 293.571 44.4884 0.2135 1688 +1690 3 447.916 292.5563 44.338 0.2034 1689 +1691 3 447.288 291.6411 43.8612 0.2272 1690 +1692 3 446.716 290.6858 43.3367 0.2801 1691 +1693 3 446.0456 289.8896 42.28 0.3432 1692 +1694 3 426.1617 404.5767 50.5719 0.1883 1465 +1695 3 427.117 403.9613 50.904 0.2277 1694 +1696 3 428.1042 403.3847 50.9527 0.2658 1695 +1697 3 429.0606 402.7566 50.9345 0.2916 1696 +1698 3 430.1177 402.3288 50.7637 0.2924 1697 +1699 3 431.2411 402.1126 50.7987 0.2675 1698 +1700 3 432.289 401.6733 51.1 0.2296 1699 +1701 3 433.2591 401.0795 51.3962 0.2039 1700 +1702 3 434.2681 400.5567 51.7244 0.2034 1701 +1703 3 435.3263 400.3394 52.6333 0.241 1702 +1704 3 436.4074 400.019 52.1956 0.2795 1703 +1705 3 437.5091 399.8829 51.515 0.3177 1704 +1706 3 438.5902 399.5077 51.5284 0.3305 1705 +1707 3 439.6335 399.0592 51.858 0.3559 1706 +1708 3 440.7191 398.8178 51.203 0.3432 1707 +1709 3 441.8574 398.7343 51.0051 0.3305 1708 +1710 3 442.9831 398.5467 51.2 0.2924 1709 +1711 3 444.0402 398.2825 52.0472 0.3051 1710 +1712 3 445.1087 398.0376 52.8514 0.3178 1711 +1713 3 446.192 397.699 53.1938 0.3559 1712 +1714 3 447.2662 397.3043 53.1815 0.3432 1713 +1715 3 448.289 396.7941 53.0788 0.3178 1714 +1716 3 449.0738 396.221 53.1731 0.2584 1715 +1717 3 450.1423 395.8629 53.1829 0.2511 1716 +1718 3 451.2428 395.5552 53.1174 0.2542 1717 +1719 3 452.2129 394.9694 53.0362 0.2247 1718 +1720 3 453.0354 394.2441 52.3359 0.1762 1719 +1721 3 454.0353 393.8128 51.6242 0.1432 1720 +1722 3 454.9985 393.4937 52.7271 0.1652 1721 +1723 3 455.8829 393.3324 54.4393 0.2303 1722 +1724 3 456.9902 393.56 54.8691 0.2938 1723 +1725 3 458.053 393.9742 54.9452 0.3312 1724 +1726 3 459.0323 394.4832 55.6693 0.3425 1725 +1727 3 460.0848 394.7246 56.4029 0.3292 1726 +1728 3 461.0881 394.1972 56.5079 0.3153 1727 +1729 3 461.9781 393.528 56.4245 0.308 1728 +1730 3 463.1004 393.433 56.3203 0.3216 1729 +1731 3 464.2146 393.6447 56.3604 0.3267 1730 +1732 3 465.2602 393.9181 57.1967 0.3098 1731 +1733 3 466.2189 394.3402 58.1756 0.2798 1732 +1734 3 467.2485 394.6903 58.133 0.2588 1733 +1735 3 468.3616 394.6617 58.0006 0.2718 1734 +1736 3 469.4644 394.6583 58.7345 0.2898 1735 +1737 3 470.5421 394.7864 59.383 0.2998 1736 +1738 3 471.6186 395.0667 59.9124 0.2762 1737 +1739 3 472.7294 395.125 60.4206 0.2431 1738 +1740 3 473.8654 395.0392 60.335 0.2231 1739 +1741 3 474.998 394.9752 60.2686 0.2221 1740 +1742 3 476.1385 394.9957 60.3142 0.2288 1741 +1743 3 477.2791 395.0415 60.3151 0.2288 1742 +1744 3 478.4185 395.0369 60.4898 0.2413 1743 +1745 3 479.5568 395.0529 60.5497 0.2542 1744 +1746 3 480.6813 395.2451 60.615 0.2478 1745 +1747 3 481.8013 395.3561 60.9255 0.2216 1746 +1748 3 482.9236 395.2165 61.2637 0.2102 1747 +1749 3 484.0539 395.0987 61.3718 0.2298 1748 +1750 3 485.1395 395.3012 61.7487 0.2415 1749 +1751 3 486.0719 395.0575 62.5257 0.2061 1750 +1752 3 486.6027 394.2167 63.7731 0.1526 1751 +1753 3 486.5775 393.1585 64.533 0.1206 1752 +1754 3 486.1908 392.1094 65.0336 0.1144 1753 +1755 3 485.9735 390.9998 65.219 0.1144 1754 +1756 3 485.5857 389.9335 65.329 0.1144 1755 +1757 3 485.2242 388.865 65.7591 0.1144 1756 +1758 3 484.9599 387.7782 66.3373 0.1144 1757 +1759 3 484.9347 386.6697 66.9606 0.1144 1758 +1760 3 484.873 385.5383 67.2946 0.1246 1759 +1761 3 484.5938 384.4538 67.804 0.1374 1760 +1762 3 484.1797 383.4173 68.4135 0.1501 1761 +1763 3 483.8193 382.3626 69.0365 0.1421 1762 +1764 3 483.9154 381.2574 69.4938 0.1398 1763 +1765 3 484.0996 380.142 69.923 0.1398 1764 +1766 3 483.888 379.1136 70.9411 0.1512 1765 +1767 3 484.1408 378.092 71.96 0.1144 1766 +1768 3 449.6904 396.6889 51.8938 0.2217 1715 +1769 3 450.7738 396.4006 51.6163 0.2476 1768 +1770 3 451.753 395.9167 50.9172 0.2638 1769 +1771 3 452.6636 395.2589 50.5061 0.2766 1770 +1772 3 453.5422 394.5313 50.3096 0.2895 1771 +1773 3 454.2561 393.647 50.3843 0.3127 1772 +1774 3 454.8315 392.6677 50.1469 0.328 1773 +1775 3 455.3692 391.6621 49.924 0.3408 1774 +1776 3 456.0602 390.7584 50.0422 0.312 1775 +1777 3 456.5693 389.7928 49.3618 0.2727 1776 +1778 3 457.0028 388.7472 49.0378 0.2233 1777 +1779 3 457.7956 387.9464 49.1862 0.2051 1778 +1780 3 458.6971 387.2497 49.005 0.1808 1779 +1781 3 459.6992 386.7029 49.0893 0.1663 1780 +1782 3 460.7208 386.2258 48.6517 0.1769 1781 +1783 3 461.8065 385.8804 48.7542 0.202 1782 +1784 3 462.8601 385.4411 48.573 0.2283 1783 +1785 3 463.9217 385.0704 48.0679 0.2163 1784 +1786 3 465.0063 384.7867 47.5121 0.2035 1785 +1787 3 466.0656 384.384 47.88 0.2288 1786 +1788 3 424.5304 414.5181 48.6119 0.4049 1457 +1789 3 425.6149 414.3488 48.4985 0.3843 1788 +1790 3 426.7326 414.3511 47.9606 0.3226 1789 +1791 3 427.8629 414.4518 48.193 0.293 1790 +1792 3 428.9222 414.4197 49.2402 0.3297 1791 +1793 3 430.0628 414.3614 49.1826 0.3939 1792 +1794 3 431.161 414.1658 48.5643 0.4576 1793 +1795 3 432.2512 413.365 49.2086 0.2714 1794 +1796 3 433.2728 412.8753 49.0532 0.2178 1795 +1797 3 434.3871 412.674 48.8684 0.1954 1796 +1798 3 435.5208 412.5367 48.7368 0.2072 1797 +1799 3 436.5996 412.1901 48.5598 0.2509 1798 +1800 3 437.6761 411.8228 48.7026 0.318 1799 +1801 3 438.6462 411.2348 48.648 0.3665 1800 +1802 3 439.7719 411.0918 48.4428 0.3813 1801 +1803 3 440.9102 411.0392 48.6889 0.3813 1802 +1804 3 441.4364 410.8836 48.9308 0.2766 1803 +1805 3 442.4832 410.5747 49.7518 0.2086 1804 +1806 3 443.4899 410.0565 49.77 0.2034 1805 +1807 3 444.4795 409.6218 50.6562 0.24 1806 +1808 3 445.4221 409.004 51.1188 0.2782 1807 +1809 3 446.255 408.2204 51.1778 0.2921 1808 +1810 3 447.264 407.7022 50.8547 0.2401 1809 +1811 3 448.2798 407.1988 50.5025 0.1775 1810 +1812 3 449.2545 406.6016 50.5646 0.1667 1811 +1813 3 450.2967 406.1703 50.9656 0.2067 1812 +1814 3 451.292 406.0022 52.2808 0.2805 1813 +1815 3 452.3296 405.7425 53.0818 0.2936 1814 +1816 3 453.2048 405.0698 52.4322 0.3051 1815 +1817 3 454.2504 404.6179 52.4031 0.3133 1816 +1818 3 455.2376 404.0986 52.9556 0.3625 1817 +1819 3 456.1048 403.3721 53.3652 0.3963 1818 +1820 3 456.9628 402.6388 53.6164 0.3994 1819 +1821 3 457.8139 401.9021 53.1835 0.3564 1820 +1822 3 458.6193 401.1001 53.3268 0.3014 1821 +1823 3 459.4636 400.3863 53.9221 0.2476 1822 +1824 3 460.4646 399.8623 54.2038 0.2254 1823 +1825 3 461.4816 399.399 54.014 0.2199 1824 +1826 3 462.6142 399.288 54.1321 0.2208 1825 +1827 3 463.7296 399.3178 54.595 0.1905 1826 +1828 3 464.798 399.6484 55.1062 0.1517 1827 +1829 3 465.7796 400.1723 55.7052 0.1225 1828 +1830 3 466.6811 400.6963 55.3316 0.1195 1829 +1831 3 467.5631 400.948 55.1653 0.1335 1830 +1832 3 468.5916 401.0075 55.5932 0.1613 1831 +1833 3 469.6109 401.2912 54.8041 0.2016 1832 +1834 3 470.5444 401.8025 55.1516 0.251 1833 +1835 3 471.6094 402.0108 55.8155 0.2759 1834 +1836 3 472.6859 401.7545 56.294 0.2701 1835 +1837 3 473.4066 400.9274 56.4973 0.2559 1836 +1838 3 473.8334 399.9664 57.5322 0.2542 1837 +1839 3 474.6033 399.2537 58.6062 0.2542 1838 +1840 3 475.578 398.6691 58.5956 0.2168 1839 +1841 3 476.4074 397.9095 58.0905 0.1781 1840 +1842 3 477.1212 397.0218 57.8435 0.1653 1841 +1843 3 478.0776 396.396 57.96 0.2288 1842 +1844 3 441.9592 411.1788 47.9024 0.2339 1803 +1845 3 443.0174 411.594 47.614 0.2042 1844 +1846 3 444.0047 412.1626 47.3729 0.2158 1845 +1847 3 444.8753 412.8913 47.6826 0.2659 1846 +1848 3 445.7138 413.6681 47.8036 0.2794 1847 +1849 3 446.684 414.2504 47.4074 0.2923 1848 +1850 3 447.5694 414.668 45.9637 0.2796 1849 +1851 3 448.6276 415.0009 45.2833 0.2794 1850 +1852 3 449.759 415.1599 45.2497 0.2675 1851 +1853 3 450.8973 415.0546 45.2012 0.2803 1852 +1854 3 452.039 415.0169 45.1576 0.2916 1853 +1855 3 453.143 414.8876 44.5024 0.278 1854 +1856 3 454.2366 414.668 43.9062 0.2525 1855 +1857 3 455.36 414.4655 44.0765 0.2297 1856 +1858 3 456.48 414.2424 44.0681 0.2424 1857 +1859 3 457.6034 414.2161 44.4212 0.2542 1858 +1860 3 458.6719 414.5753 43.967 0.2531 1859 +1861 3 459.7404 414.9666 44.1129 0.2402 1860 +1862 3 460.7849 415.2869 44.9056 0.2288 1861 +1863 3 461.8248 415.7571 45.0542 0.2307 1862 +1864 3 462.8384 416.265 44.9873 0.2415 1863 +1865 3 463.9263 416.5235 45.0318 0.247 1864 +1866 3 465.0349 416.6425 45.5333 0.2481 1865 +1867 3 466.1606 416.5258 45.7836 0.2536 1866 +1868 3 467.2645 416.2387 45.9052 0.2669 1867 +1869 3 468.3753 415.9813 45.8287 0.2731 1868 +1870 3 469.3889 416.2147 46.1552 0.2666 1869 +1871 3 470.2126 416.9605 46.7292 0.2542 1870 +1872 3 471.1427 417.5463 46.6371 0.2616 1871 +1873 3 472.1757 418.0084 46.2529 0.2746 1872 +1874 3 473.0749 418.6834 45.9264 0.264 1873 +1875 3 473.9443 419.4098 45.5661 0.2305 1874 +1876 3 474.9785 419.7599 45.1105 0.208 1875 +1877 3 476.0985 419.6947 45.1522 0.2202 1876 +1878 3 477.1944 419.7748 45.7542 0.2288 1877 +1879 3 478.16 420.3022 46.256 0.2113 1878 +1880 3 479.0626 420.9977 46.2997 0.1764 1879 +1881 3 479.9652 421.5983 45.5269 0.1557 1880 +1882 3 480.7717 422.1909 44.1888 0.1725 1881 +1883 3 481.8082 422.5467 43.7469 0.2106 1882 +1884 3 482.8664 422.1978 43.6276 0.2601 1883 +1885 3 483.9498 421.8546 43.3303 0.2782 1884 +1886 3 485.0686 421.8157 42.7994 0.2564 1885 +1887 3 486.2011 421.8958 42.4908 0.2075 1886 +1888 3 487.328 421.7299 42.3035 0.1555 1887 +1889 3 488.3313 421.1888 42.2232 0.1282 1888 +1890 3 489.3689 420.7071 42.3013 0.1149 1889 +1891 3 490.4911 420.4921 42.2878 0.1144 1890 +1892 3 491.626 420.3742 42.4637 0.1144 1891 +1893 3 492.7574 420.4738 42.1546 0.1144 1892 +1894 3 493.8316 420.7174 41.3963 0.1144 1893 +1895 3 494.9436 420.952 41.0617 0.1144 1894 +1896 3 496.0418 420.849 40.3217 0.1144 1895 +1897 3 497.1824 420.7632 40.32 0.1144 1896 +1898 3 431.9813 414.4735 48.5276 0.2727 1794 +1899 3 433.0852 414.7229 48.5624 0.1397 1898 +1900 3 434.1228 415.0558 48.2068 0.1335 1899 +1901 3 435.1467 415.4791 47.8579 0.1528 1900 +1902 3 436.142 415.9881 47.9632 0.1787 1901 +1903 3 437.0263 416.7089 47.8884 0.212 1902 +1904 3 437.8214 417.5074 48.0894 0.2361 1903 +1905 3 438.6451 418.283 48.309 0.2263 1904 +1906 3 439.5317 418.9957 48.0931 0.1929 1905 +1907 3 440.5647 419.3893 47.8862 0.1613 1906 +1908 3 441.6915 419.4842 47.5415 0.1525 1907 +1909 3 442.8241 419.5906 47.5138 0.17 1908 +1910 3 443.9338 419.4144 47.5745 0.2146 1909 +1911 3 445.0137 419.5506 47.1187 0.2662 1910 +1912 3 446.1142 419.7107 46.4971 0.2701 1911 +1913 3 447.2102 419.7954 45.7265 0.2183 1912 +1914 3 448.329 419.967 45.5661 0.1738 1913 +1915 3 449.4307 420.269 45.5927 0.1955 1914 +1916 3 450.466 420.746 45.7178 0.2747 1915 +1917 3 451.5231 421.1773 45.857 0.3439 1916 +1918 3 452.5138 421.7413 45.9774 0.3665 1917 +1919 3 453.4576 422.319 45.3432 0.3469 1918 +1920 3 454.327 423.0478 45.3242 0.2988 1919 +1921 3 455.3875 423.3898 44.8854 0.2584 1920 +1922 3 456.4068 423.8863 45.0526 0.2315 1921 +1923 3 457.4845 424.2364 44.7535 0.2402 1922 +1924 3 458.5884 424.1334 44.1521 0.2298 1923 +1925 3 459.721 424.1483 43.7928 0.2288 1924 +1926 3 460.7483 423.7342 44.4744 0.2298 1925 +1927 3 461.8465 423.455 44.5329 0.2818 1926 +1928 3 462.8704 423.6712 45.5062 0.3226 1927 +1929 3 463.8989 424.1346 45.194 0.3559 1928 +1930 3 464.8369 424.7375 45.6792 0.3536 1929 +1931 3 465.5394 425.6206 46.1068 0.3302 1930 +1932 3 466.2669 426.4878 46.2493 0.271 1931 +1933 3 467.1684 427.1364 46.8289 0.2345 1932 +1934 3 467.8868 427.8835 47.7462 0.2211 1933 +1935 3 468.3342 428.9234 48.1043 0.2229 1934 +1936 3 469.0297 429.715 48.5316 0.2161 1935 +1937 3 470.0604 430.1566 48.704 0.223 1936 +1938 3 470.9104 430.8361 48.7707 0.2426 1937 +1939 3 471.4561 431.82 49.1826 0.2612 1938 +1940 3 471.9652 432.8107 49.7748 0.2669 1939 +1941 3 472.798 433.5074 50.15 0.2747 1940 +1942 3 473.7636 434.0061 50.8878 0.2715 1941 +1943 3 474.6342 434.6651 51.5922 0.2669 1942 +1944 3 475.4739 435.427 51.9677 0.2406 1943 +1945 3 476.4543 435.9864 51.9652 0.2288 1944 +1946 3 477.4427 436.5447 52.19 0.2012 1945 +1947 3 478.1291 437.3912 52.8091 0.1811 1946 +1948 3 478.7102 438.3636 52.8021 0.1487 1947 +1949 3 479.4664 439.2113 52.8032 0.13 1948 +1950 3 480.2638 439.7845 54.0548 0.1168 1949 +1951 3 480.7671 440.7374 54.4897 0.1248 1950 +1952 3 481.2213 441.767 54.0837 0.1375 1951 +1953 3 481.7864 442.7543 53.8362 0.1504 1952 +1954 3 482.0622 443.8526 53.93 0.1417 1953 +1955 3 482.1422 444.9874 53.72 0.129 1954 +1956 3 482.323 446.1108 53.4498 0.1162 1955 +1957 3 482.5072 447.2388 53.3221 0.1144 1956 +1958 3 482.5449 448.3794 53.3607 0.1364 1957 +1959 3 482.1411 449.433 53.1852 0.1637 1958 +1960 3 481.2682 450.1617 53.1401 0.1893 1959 +1961 3 480.3427 450.8207 53.4517 0.1661 1960 +1962 3 479.4355 451.4693 54.084 0.1528 1961 +1963 3 478.5375 452.1317 54.6974 0.1525 1962 +1964 3 477.8488 453.024 55.16 0.2288 1963 +1965 2 416.948 419.5403 47.6647 0.1144 1 +1966 2 417.6046 420.4761 47.5507 0.1144 1965 +1967 2 418.2624 421.4107 47.4365 0.1144 1966 +1968 2 419.0827 422.1554 47.2511 0.1206 1967 +1969 2 419.8949 422.899 46.9409 0.1417 1968 +1970 2 420.3376 423.9332 46.9924 0.1684 1969 +1971 2 421.1339 424.5533 46.8101 0.1864 1970 +1972 2 422.2024 424.7397 47.327 0.1819 1971 +1973 2 423.0375 425.2854 48.4434 0.1678 1972 +1974 2 423.4688 426.3036 48.8449 0.1441 1973 +1975 2 423.9092 427.3504 49.1618 0.129 1974 +1976 2 424.4663 428.3456 49.1 0.1271 1975 +1977 2 425.044 429.326 48.8174 0.138 1976 +1978 2 425.6584 430.2641 49.264 0.1626 1977 +1979 2 426.5004 431.0043 49.7773 0.1652 1978 +1980 2 427.2176 431.86 49.2498 0.1652 1979 +1981 2 427.856 432.7752 49.84 0.1144 1980 +1982 3 416.8999 419.236 45.1746 0.1144 1 +1983 3 417.5245 420.0013 43.7637 0.1144 1982 +1984 3 418.1492 420.7666 42.3525 0.1256 1983 +1985 3 418.8058 421.5446 41.0732 0.161 1984 +1986 3 419.6936 422.2138 40.4936 0.2238 1985 +1987 3 420.7815 422.5284 40.2144 0.2883 1986 +1988 3 421.8306 422.136 39.8532 0.3432 1987 +1989 3 420.9016 421.6544 39.0558 0.2669 1988 +1990 3 420.6728 420.8055 37.8036 0.2669 1989 +1991 3 420.8696 419.7256 37.0546 0.2669 1990 +1992 3 420.8616 418.6216 36.7489 0.2838 1991 +1993 3 420.4063 418.0027 35.1926 0.3144 1992 +1994 3 419.3424 417.8208 34.6254 0.3178 1993 +1995 3 418.2556 417.4776 34.386 0.267 1994 +1996 3 417.2934 416.8988 33.8489 0.1144 1995 +1997 3 416.6826 416.4526 32.8378 0.1949 1996 +1998 3 415.7937 416.0373 31.4345 0.2569 1997 +1999 3 415.0318 415.725 32.6483 0.3018 1998 +2000 3 414.104 415.828 34.2311 0.3424 1999 +2001 3 412.9829 415.9492 34.6629 0.3807 2000 +2002 3 412.0562 416.0728 33.0711 0.4195 2001 +2003 3 411.3218 415.9836 33.0798 0.3811 2002 +2004 3 410.4649 416.0259 32.1793 0.3432 2003 +2005 3 409.989 416.7146 31.2967 0.3363 2004 +2006 3 409.3449 417.6046 32.006 0.3305 2005 +2007 3 408.5727 418.3928 32.0331 0.2806 2006 +2008 3 407.8738 419.2588 31.4084 0.244 2007 +2009 3 407.0947 420.0699 31.8041 0.2183 2008 +2010 3 406.311 420.8993 31.9318 0.2278 2009 +2011 3 405.6212 421.7699 31.2973 0.2288 2010 +2012 3 405.3478 422.6062 29.5565 0.2044 2011 +2013 3 404.7907 423.304 29.9611 0.1631 2012 +2014 3 404.9302 424.1872 30.3162 0.1398 2013 +2015 3 404.7712 424.8667 28.285 0.1398 2014 +2016 3 404.2461 425.6138 28.126 0.1658 2015 +2017 3 403.6993 426.402 29.6089 0.1991 2016 +2018 3 402.8768 427.1307 29.5758 0.2367 2017 +2019 3 402.267 427.5025 27.5783 0.2549 2018 +2020 3 401.1699 427.7748 27.2474 0.2669 2019 +2021 3 400.0488 427.8732 27.0144 0.2613 2020 +2022 3 398.9952 427.7954 26.4026 0.2345 2021 +2023 3 397.9335 427.5185 27.0337 0.2076 2022 +2024 3 396.8422 427.5437 26.9671 0.2073 2023 +2025 3 395.7943 427.379 26.068 0.2526 2024 +2026 3 394.7109 427.1284 25.6917 0.3043 2025 +2027 3 393.5886 426.9419 25.5492 0.3178 2026 +2028 3 392.4744 426.7749 25.6449 0.2911 2027 +2029 3 391.3658 426.744 26.3105 0.2574 2028 +2030 3 390.2584 426.831 26.364 0.2415 2029 +2031 3 389.151 426.9934 26.5317 0.2185 2030 +2032 3 388.1089 427.149 25.9809 0.1956 2031 +2033 3 387.0221 427.2783 25.5049 0.1907 2032 +2034 3 385.909 427.2119 25.9552 0.2287 2033 +2035 3 384.8565 427.4327 26.761 0.2852 2034 +2036 3 383.8051 427.4453 25.9179 0.3172 2035 +2037 3 383.0238 428.2347 25.3394 0.3042 2036 +2038 3 381.9896 428.563 25.1919 0.2841 2037 +2039 3 380.8696 428.5813 25.3266 0.2978 2038 +2040 3 379.76 428.7449 25.5338 0.3111 2039 +2041 3 378.791 429.1556 25.9759 0.2974 2040 +2042 3 378.4009 430.0102 25.0701 0.2707 2041 +2043 3 378.386 431.0169 25.5394 0.2563 2042 +2044 3 377.8826 431.9664 25.104 0.2881 2043 +2045 3 376.9228 432.4537 24.2948 0.3161 2044 +2046 3 376.1472 433.2328 24.92 0.3432 2045 +2047 3 411.3046 415.129 32.1364 0.3456 2002 +2048 3 410.4855 414.4174 31.99 0.3138 2047 +2049 3 409.4227 414.2413 32.5049 0.3226 2048 +2050 3 408.3096 414.2378 32.2269 0.3486 2049 +2051 3 407.248 413.9507 31.5722 0.3753 2050 +2052 3 406.215 414.1028 30.6886 0.3707 2051 +2053 3 405.2071 413.7654 29.8875 0.3457 2052 +2054 3 404.0848 413.6018 29.9158 0.3192 2053 +2055 3 402.9706 413.3466 29.8385 0.3052 2054 +2056 3 401.8872 412.984 29.68 0.3432 2055 +2057 3 417.5211 416.6917 30.9996 0.2585 1996 +2058 3 418.5049 416.2192 30.2204 0.3615 2057 +2059 3 419.6066 416.1208 29.965 0.4149 2058 +2060 3 420.3937 416.7192 28.9204 0.3664 2059 +2061 3 420.6831 417.3095 26.759 0.2968 2060 +2062 3 421.0195 418.2567 25.6124 0.2542 2061 +2063 3 421.6704 419.181 25.3901 0.2486 2062 +2064 3 422.5719 419.6444 25.4464 0.2545 2063 +2065 3 423.6827 419.578 25.9115 0.2744 2064 +2066 3 424.7775 419.3984 25.9818 0.2952 2065 +2067 3 425.8357 419.459 25.1835 0.3051 2066 +2068 3 426.3047 420.1786 23.7658 0.3155 2067 +2069 3 425.8849 421.1579 23.9176 0.3302 2068 +2070 3 425.4879 422.2287 24.0481 0.343 2069 +2071 3 424.4492 422.6954 23.9868 0.3432 2070 +2072 3 423.5317 423.1782 23.6723 0.3241 2071 +2073 3 422.6508 423.8188 22.8981 0.2773 2072 +2074 3 422.1371 424.6837 22.227 0.2488 2073 +2075 3 421.7939 425.6492 21.5152 0.2415 2074 +2076 3 421.2311 426.5965 21.0017 0.2415 2075 +2077 3 420.8536 427.6455 21.0126 0.2336 2076 +2078 3 420.0791 428.2141 21.9215 0.2466 2077 +2079 3 419.0518 428.3708 23.0787 0.2635 2078 +2080 3 418.3963 428.6717 25.0925 0.2669 2079 +2081 3 418.1103 429.6772 25.9507 0.2305 2080 +2082 3 417.3312 430.3728 24.92 0.2288 2081 +2083 3 425.8231 423.153 22.3068 0.225 2071 +2084 3 426.6731 423.7868 21.3234 0.193 2083 +2085 3 427.0072 424.8576 21.2206 0.1907 2084 +2086 3 426.9568 425.9581 21.9419 0.2278 2085 +2087 3 426.7417 427.0598 21.4424 0.254 2086 +2088 3 426.8264 428.1992 21.56 0.2288 2087 +2089 3 422.7709 421.3661 39.0477 0.256 1988 +2090 3 423.7387 420.7975 38.6831 0.2288 2089 +2091 3 424.8244 420.7964 38.0369 0.3008 2090 +2092 3 425.9409 420.5722 38.0584 0.3926 2091 +2093 3 426.9911 420.9794 37.6132 0.4957 2092 +2094 3 428.0928 420.8135 36.906 0.3934 2093 +2095 3 429.2185 420.754 36.7021 0.3232 2094 +2096 3 430.0113 420.9874 35.294 0.2963 2095 +2097 3 430.9928 421.167 34.3991 0.3017 2096 +2098 3 432.1128 421.024 34.188 0.3051 2097 +2099 3 433.147 421.0355 33.1618 0.3051 2098 +2100 3 434.1514 421.3283 32.0667 0.3051 2099 +2101 3 435.2623 421.3958 31.5487 0.3051 2100 +2102 3 436.3628 421.6681 31.2911 0.2933 2101 +2103 3 437.302 422.2996 31.586 0.2924 2102 +2104 3 438.3465 422.7526 31.3732 0.2924 2103 +2105 3 439.4276 422.43 31.2452 0.3296 2104 +2106 3 440.4652 421.9827 30.8042 0.3305 2105 +2107 3 441.5291 421.739 29.9782 0.318 2106 +2108 3 442.6719 421.7745 29.9541 0.3053 2107 +2109 3 443.7908 421.5468 29.8609 0.33 2108 +2110 3 444.913 421.3375 29.664 0.3806 2109 +2111 3 445.9724 421.6406 29.5322 0.3792 2110 +2112 3 446.3499 422.716 29.3829 0.3488 2111 +2113 3 446.5924 423.8211 29.6139 0.2828 2112 +2114 3 447.1942 424.7626 29.8824 0.2202 2113 +2115 3 448.0579 425.3552 29.1102 0.1725 2114 +2116 3 448.8324 425.3701 27.58 0.1525 2115 +2117 3 449.6435 424.5922 27.442 0.1699 2116 +2118 3 450.1102 424.0568 25.632 0.2161 2117 +2119 3 451.0197 423.7525 25.5559 0.2907 2118 +2120 3 452.1477 423.7731 25.5676 0.3373 2119 +2121 3 453.2574 423.6838 24.9785 0.3432 2120 +2122 3 454.2309 423.6461 23.5528 0.3104 2121 +2123 3 455.3143 423.7124 22.7273 0.2941 2122 +2124 3 456.2684 423.1793 23.1028 0.3036 2123 +2125 3 457.211 422.5536 23.506 0.3394 2124 +2126 3 458.3184 422.3076 23.6379 0.3549 2125 +2127 3 459.4315 422.3648 23.0686 0.3559 2126 +2128 3 460.2655 423.0398 22.1992 0.3311 2127 +2129 3 461.1453 423.7342 21.6303 0.3052 2128 +2130 3 461.8591 424.6265 21.5228 0.2288 2129 +2131 3 428.142 422.1623 36.9488 0.3607 2093 +2132 3 428.9966 422.7778 35.9517 0.2996 2131 +2133 3 429.9747 423.0112 34.9129 0.2597 2132 +2134 3 431.0935 423.0146 34.3395 0.2209 2133 +2135 3 432.114 423.2937 33.504 0.1746 2134 +2136 3 433.1333 423.7079 32.9602 0.1448 2135 +2137 3 434.2407 423.9081 33.2004 0.1398 2136 +2138 3 435.3721 424.0328 33.3992 0.1686 2137 +2139 3 436.3857 424.4549 32.7984 0.1993 2138 +2140 3 437.0629 425.3415 32.5702 0.2481 2139 +2141 3 437.2551 426.4557 32.7029 0.277 2140 +2142 3 437.9815 427.2829 33.231 0.3157 2141 +2143 3 439.0077 427.7553 32.933 0.33 2142 +2144 3 439.7078 428.6271 32.4288 0.3431 2143 +2145 3 440.1746 429.5926 33.3942 0.3299 2144 +2146 3 440.7397 430.5822 33.29 0.3034 2145 +2147 3 441.1195 431.598 32.408 0.2663 2146 +2148 3 441.7018 432.5636 32.0118 0.2535 2147 +2149 3 442.3756 433.4536 32.6225 0.2415 2148 +2150 3 443.0186 434.3162 33.5608 0.2406 2149 +2151 3 443.4876 435.3217 34.1928 0.2317 2150 +2152 3 443.8674 436.3948 33.9511 0.2688 2151 +2153 3 444.4028 437.3901 33.5524 0.2924 2152 +2154 3 445.1167 438.2572 33.2749 0.2855 2153 +2155 3 445.6395 439.1965 33.9478 0.2247 2154 +2156 3 446.2538 440.0819 33.4356 0.2071 2155 +2157 3 446.891 440.9411 33.9592 0.2369 2156 +2158 3 447.8337 441.5703 34.071 0.2931 2157 +2159 3 448.694 442.2979 33.7565 0.3296 2158 +2160 3 449.632 442.9225 33.3264 0.3358 2159 +2161 3 450.5438 443.6089 33.1962 0.3305 2160 +2162 3 451.2199 444.5069 33.1201 0.3305 2161 +2163 3 451.554 445.5846 33.2228 0.3305 2162 +2164 3 452.0791 446.5673 33.3119 0.314 2163 +2165 3 452.8856 447.3578 33.0484 0.2799 2164 +2166 3 453.7893 448.0282 32.5578 0.2582 2165 +2167 3 454.6828 448.6528 33.061 0.2542 2166 +2168 3 455.5854 449.2488 33.9704 0.282 2167 +2169 3 456.4835 449.8277 33.4496 0.312 2168 +2170 3 457.1699 450.6982 33.0798 0.3381 2169 +2171 3 457.9855 451.4888 32.951 0.333 2170 +2172 3 458.744 452.3307 32.625 0.3203 2171 +2173 3 459.5723 453.0652 33.1416 0.3075 2172 +2174 3 460.6591 453.1533 33.3698 0.3155 2173 +2175 3 461.7802 453.0446 33.8352 0.3286 2174 +2176 3 462.9127 453.1281 34.0298 0.3421 2175 +2177 3 464.0087 453.4393 34.2294 0.3305 2176 +2178 3 465.1115 453.3798 33.5093 0.303 2177 +2179 3 466.2132 453.2597 33.0711 0.277 2178 +2180 3 467.0472 453.3397 31.9206 0.2518 2179 +2181 3 467.9086 453.2551 33.5829 0.2336 2180 +2182 3 469.048 453.2757 33.8136 0.2161 2181 +2183 3 470.1257 453.0904 33.2979 0.2254 2182 +2184 3 471.0157 453.6006 32.881 0.258 2183 +2185 3 471.9263 454.2778 32.5486 0.2984 2184 +2186 3 472.9879 454.6725 32.6374 0.3161 2185 +2187 3 474.0622 455.0523 32.8947 0.3178 2186 +2188 3 475.1158 455.4378 32.408 0.2942 2187 +2189 3 476.2323 455.6552 32.1608 0.2675 2188 +2190 3 477.3477 455.7868 31.6327 0.2163 2189 +2191 3 478.4208 456.1128 31.08 0.1144 2190 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc new file mode 100644 index 0000000..84e566f --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc @@ -0,0 +1,3786 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/177300.01.02.01/reconstruction/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01___DS.swc +# id,type,x,y,z,r,pid +1 1 303.16 379.4648 28.56 5.4428 -1 +2 3 302.6646 375.232 23.2562 0.2524 1 +3 3 302.469 374.2356 21.9996 0.2615 2 +4 3 302.0057 373.2918 21.0081 0.3026 3 +5 3 301.2358 372.4956 20.7318 0.36 4 +6 3 300.3366 371.832 20.7847 0.3728 5 +7 3 299.7177 370.8768 20.9602 0.3575 6 +8 3 299.5049 369.798 21.7249 0.3935 7 +9 3 299.5198 368.6563 21.8372 0.4067 8 +10 3 299.6319 367.518 21.8288 0.432 9 +11 3 299.9305 366.414 21.7669 0.3941 10 +12 3 299.9534 365.2803 21.3934 0.3432 11 +13 3 299.2818 364.1844 21.835 0.3426 12 +14 3 298.4113 363.4442 21.8336 0.3307 13 +15 3 297.5372 362.7052 21.8064 0.2929 14 +16 3 297.0465 361.6756 21.639 0.2796 15 +17 3 296.5568 360.9103 20.5181 0.1964 16 +18 3 296.4024 359.8749 19.7562 0.1915 17 +19 3 296.2342 358.7584 19.6034 0.2477 18 +20 3 295.8212 357.6968 19.6199 0.3025 19 +21 3 295.3156 356.6717 19.7109 0.3267 20 +22 3 294.8111 355.6582 20.0852 0.3125 21 +23 3 294.0824 354.8276 20.6212 0.2917 22 +24 3 293.1958 354.116 20.4296 0.2796 23 +25 3 292.2016 353.6642 19.6 0.2759 24 +26 3 291.2704 353.0922 18.898 0.2278 25 +27 3 290.7682 352.0832 18.6127 0.2161 26 +28 3 290.5108 351.0433 17.754 0.2229 27 +29 3 289.7706 350.1956 17.3659 0.2669 28 +30 3 288.9069 349.46 17.3953 0.2585 29 +31 3 288.2308 348.5425 17.535 0.2245 30 +32 3 287.7171 347.5724 18.1266 0.1808 31 +33 3 287.8121 346.4821 18.8541 0.178 32 +34 3 288.0684 345.5772 17.267 0.1907 33 +35 3 288.1038 344.6838 15.5235 0.1907 34 +36 3 288.3566 343.6084 14.8921 0.1932 35 +37 3 289.0007 342.6692 15.113 0.2306 36 +38 3 289.4698 341.6281 15.0758 0.2553 37 +39 3 289.7329 340.523 14.8417 0.2621 38 +40 3 289.9468 339.4706 13.8762 0.2132 39 +41 3 289.9823 338.4535 12.9086 0.1907 40 +42 3 289.2009 337.6253 12.7764 0.193 41 +43 3 288.28 336.9618 12.5132 0.2034 42 +44 3 287.3865 336.447 12.6182 0.1978 43 +45 3 286.7791 336.0088 14.0918 0.1738 44 +46 3 285.6522 336.058 14.2492 0.1515 45 +47 3 284.6936 335.8498 15.4532 0.129 46 +48 3 284.0746 334.9357 15.6929 0.1155 47 +49 3 283.2212 334.4781 14.3422 0.1503 48 +50 3 282.1104 334.62 14.0 0.2288 49 +51 3 297.5086 361.2443 21.7473 0.2584 16 +52 3 298.2465 360.3806 21.812 0.2203 51 +53 3 299.0313 359.5729 21.5678 0.189 52 +54 3 299.8252 358.9929 20.3588 0.1631 53 +55 3 300.6764 358.4941 19.0198 0.1603 54 +56 3 301.6076 357.905 18.9526 0.1896 55 +57 3 302.6681 357.5847 19.1615 0.2288 56 +58 3 303.6462 357.6579 18.0536 0.259 57 +59 3 304.3143 358.2859 16.6068 0.2577 58 +60 3 305.273 358.7092 15.9995 0.2542 59 +61 3 306.3003 358.3855 15.4902 0.2746 60 +62 3 307.2201 357.7723 15.972 0.3216 61 +63 3 308.3194 357.5938 16.03 0.3518 62 +64 3 309.3719 357.9027 15.4003 0.3559 63 +65 3 310.27 358.5879 15.2365 0.3559 64 +66 3 311.2241 359.1908 15.6405 0.4007 65 +67 3 312.3452 359.3235 15.6626 0.4529 66 +68 3 313.3633 359.3281 14.45 0.4576 67 +69 3 314.4902 359.3155 14.0638 0.3872 68 +70 3 315.6227 359.2183 14.3315 0.275 69 +71 3 316.6146 358.6772 14.0784 0.1907 70 +72 3 297.6768 360.9823 21.0529 0.2519 16 +73 3 298.1767 360.1484 21.8341 0.2161 72 +74 3 298.8471 359.2503 21.56 0.2814 73 +75 3 299.5621 358.6211 20.615 0.3759 74 +76 3 300.0815 357.8238 20.72 0.2132 75 +77 3 300.292 357.1762 22.12 0.2339 76 +78 3 299.9568 356.1272 21.84 0.2542 77 +79 3 299.4386 355.2051 21.56 0.1682 78 +80 3 298.7739 355.0896 20.44 0.134 79 +81 3 298.0166 354.9249 20.144 0.1525 80 +82 3 297.3714 353.9856 20.16 0.1773 81 +83 3 296.8543 353.0487 20.16 0.2539 82 +84 3 296.296 352.6552 21.1915 0.2161 83 +85 3 295.9803 351.7892 22.2888 0.1689 84 +86 3 294.9953 351.6496 21.9878 0.2941 85 +87 3 294.31 350.8808 21.5746 0.2539 86 +88 3 294.0755 349.905 21.553 0.306 87 +89 3 294.1178 348.8777 21.5995 0.19 88 +90 3 293.8044 347.8172 21.9859 0.1909 89 +91 3 293.3216 347.2166 20.7444 0.2288 90 +92 3 292.88 346.2968 21.0288 0.2919 91 +93 3 292.0643 345.7408 21.4584 0.287 92 +94 3 291.5095 344.9286 21.9114 0.3051 93 +95 3 291.1274 344.3028 23.312 0.3181 94 +96 3 290.7224 343.3213 24.0131 0.2851 95 +97 3 290.0349 342.9987 22.4826 0.2796 96 +98 3 289.6368 342.072 22.5103 0.1907 97 +99 3 288.7639 341.8547 23.6482 0.1478 98 +100 3 288.5134 341.1408 22.7452 0.1144 99 +101 3 287.9894 340.7335 21.0946 0.1782 100 +102 3 287.5444 339.8401 21.1212 0.3741 101 +103 3 286.763 339.4969 22.6559 0.2734 102 +104 3 286.1144 338.7647 22.4328 0.2962 103 +105 3 285.1912 338.4993 21.5729 0.2551 104 +106 3 284.4579 337.6836 22.12 0.2834 105 +107 3 283.7726 337.0407 22.7903 0.2726 106 +108 3 283.029 336.4676 24.0041 0.3535 107 +109 3 282.2408 335.7526 23.9999 0.3137 108 +110 3 281.6459 335.0204 23.2201 0.2542 109 +111 3 281.1758 334.6051 21.6723 0.3279 110 +112 3 280.7239 333.8936 21.908 0.2878 111 +113 3 280.7204 333.2483 22.5652 0.178 112 +114 3 280.6106 331.9625 21.9254 0.2238 113 +115 3 280.2777 330.8974 21.8338 0.1859 114 +116 3 279.6336 329.9525 21.7932 0.1725 115 +117 3 279.4929 328.9766 21.4362 0.1713 116 +118 3 279.8762 327.9219 20.9927 0.178 117 +119 3 279.557 326.9964 20.8474 0.2002 118 +120 3 278.9838 326.04 20.7374 0.2394 119 +121 3 278.6063 324.9612 20.6027 0.2699 120 +122 3 278.318 323.8927 20.0052 0.2716 121 +123 3 277.9256 322.894 19.0859 0.242 122 +124 3 277.4726 321.933 19.4888 0.2288 123 +125 3 277.1031 320.9 19.395 0.2381 124 +126 3 276.8137 319.8567 18.5102 0.2604 125 +127 3 276.6444 318.7459 18.1843 0.2669 126 +128 3 276.6066 317.6705 18.996 0.2669 127 +129 3 276.5494 316.5757 18.625 0.2793 128 +130 3 276.2028 315.4889 18.4803 0.3048 129 +131 3 275.728 314.449 18.4696 0.3303 130 +132 3 275.259 313.4057 18.4229 0.3305 131 +133 3 274.528 312.5294 18.2322 0.3052 132 +134 3 273.9045 311.621 17.484 0.2668 133 +135 3 273.2902 310.691 17.3606 0.2264 134 +136 3 273.098 309.5881 17.365 0.2087 135 +137 3 272.6953 308.5791 17.3846 0.2034 136 +138 3 271.9505 307.7131 17.4605 0.2263 137 +139 3 271.2458 306.8345 17.8511 0.2724 138 +140 3 270.5903 305.9182 18.3238 0.3157 139 +141 3 269.9634 304.9675 18.482 0.3223 140 +142 3 269.3033 304.034 18.4895 0.2879 141 +143 3 268.6341 303.1097 18.5256 0.2646 142 +144 3 267.8436 302.2906 18.7183 0.2519 143 +145 3 267.0313 301.5218 19.1531 0.2441 144 +146 3 266.2122 300.737 18.8048 0.2542 145 +147 3 265.4572 299.8882 18.48 0.2542 146 +148 3 264.6541 299.0725 18.4803 0.2796 147 +149 3 263.8693 298.2408 18.4806 0.2669 148 +150 3 262.9278 296.9069 18.4859 0.3559 149 +151 3 262.2906 295.9562 18.5091 0.3559 150 +152 3 261.6111 295.0376 18.62 0.3305 151 +153 3 261.3651 294.6338 18.8754 0.3025 152 +154 3 260.9304 293.619 19.4855 0.3546 153 +155 3 260.6215 292.5185 19.6 0.394 154 +156 3 260.5586 291.3768 19.6 0.3813 155 +157 3 260.014 289.9205 19.6003 0.3112 156 +158 3 259.3448 288.995 19.6011 0.339 157 +159 3 258.7293 288.0317 19.605 0.3326 158 +160 3 258.369 286.9518 19.6297 0.309 159 +161 3 258.3507 285.8192 19.8562 0.2725 160 +162 3 258.5589 284.6993 19.7708 0.2447 161 +163 3 258.7442 283.5713 19.696 0.2191 162 +164 3 258.7316 282.4479 20.1611 0.2048 163 +165 3 258.6893 281.3245 20.678 0.1917 164 +166 3 258.8563 280.1953 20.722 0.214 165 +167 3 259.1972 279.1051 20.7326 0.2629 166 +168 3 259.4718 277.9954 20.8085 0.314 167 +169 3 259.3139 276.8892 21.3156 0.3418 168 +170 3 259.2235 275.7669 21.8182 0.3189 169 +171 3 259.1629 274.6252 21.845 0.3057 170 +172 3 258.814 273.5384 21.8708 0.2682 171 +173 3 258.3335 272.5019 22.0217 0.2544 172 +174 3 258.1482 271.4209 22.8038 0.2166 173 +175 3 257.4046 270.5606 23.0583 0.2161 174 +176 3 257.376 269.4589 23.7723 0.2169 175 +177 3 257.3989 268.3172 23.6776 0.2288 176 +178 3 257.3874 267.2041 23.1045 0.2288 177 +179 3 257.3188 266.0727 23.4097 0.2301 178 +180 3 257.0968 264.9618 23.3033 0.2442 179 +181 3 257.1723 263.8533 23.949 0.2722 180 +182 3 257.1106 262.7333 24.2225 0.3092 181 +183 3 256.7182 261.7003 24.6588 0.3283 182 +184 3 256.7685 260.5906 25.1857 0.3077 183 +185 3 256.5054 259.4786 25.2347 0.2504 184 +186 3 256.0947 258.4227 25.4514 0.1821 185 +187 3 255.6668 257.4057 25.9174 0.1493 186 +188 3 255.6074 256.2777 25.9837 0.1433 187 +189 3 255.7744 255.1967 26.7282 0.1525 188 +190 3 256.1485 254.1602 27.2308 0.1567 189 +191 3 256.4379 253.0734 27.1474 0.174 190 +192 3 256.4665 251.9363 27.3862 0.1996 191 +193 3 256.4493 250.7923 27.4484 0.2161 192 +194 3 256.6015 249.6746 27.4938 0.2113 193 +195 3 256.868 248.5843 27.7956 0.1936 194 +196 3 256.836 247.4758 28.4071 0.1882 195 +197 3 256.5386 246.4107 29.0318 0.2138 196 +198 3 256.1176 245.372 29.5506 0.2607 197 +199 3 255.7149 244.3058 29.766 0.3051 198 +200 3 255.303 243.2567 30.1381 0.3051 199 +201 3 254.9782 242.1848 30.6589 0.2826 200 +202 3 254.6853 241.0843 30.8904 0.2599 201 +203 3 254.397 239.9952 31.2897 0.2786 202 +204 3 254.365 238.8992 31.7878 0.3105 203 +205 3 254.564 237.7758 31.9194 0.3367 204 +206 3 254.6452 236.6387 31.9155 0.3308 205 +207 3 254.5835 235.497 31.885 0.293 206 +208 3 254.2243 234.4582 31.5837 0.2349 207 +209 3 254.1087 233.4812 30.8118 0.178 208 +210 3 254.5537 232.7788 32.1006 0.1652 209 +211 3 254.6944 231.755 32.4584 0.1652 210 +212 3 254.9107 230.651 32.0104 0.1652 211 +213 3 255.0411 229.5196 31.9483 0.1438 212 +214 3 255.0559 228.3859 32.2728 0.1281 213 +215 3 256.0421 227.9226 32.51 0.1271 214 +216 3 256.9424 227.7704 34.16 0.178 215 +217 3 261.2107 291.1674 23.0731 0.132 156 +218 3 261.3319 291.7349 25.429 0.1507 217 +219 3 261.3399 292.5185 27.4683 0.1652 218 +220 3 261.0516 292.6535 29.4815 0.1652 219 +221 3 260.2325 292.1364 30.6804 0.1578 220 +222 3 259.1698 291.9866 31.3396 0.1525 221 +223 3 258.0532 292.1456 31.5524 0.1525 222 +224 3 256.9538 292.0003 31.2376 0.1438 223 +225 3 255.8831 291.7978 31.7621 0.1309 224 +226 3 254.9965 292.1799 32.9613 0.1179 225 +227 3 254.2071 292.9223 33.7809 0.1144 226 +228 3 253.8307 293.8776 33.0526 0.1245 227 +229 3 253.9074 294.7356 31.2824 0.1478 228 +230 3 253.2175 295.3328 29.9491 0.1743 229 +231 3 252.1136 295.4414 29.9594 0.2016 230 +232 3 251.4512 295.0376 31.92 0.2288 231 +233 3 261.5584 294.532 16.9543 0.1308 152 +234 3 260.9761 294.4908 15.1875 0.1611 233 +235 3 259.9019 294.8809 15.218 0.178 234 +236 3 258.8769 295.271 15.7959 0.1683 235 +237 3 258.012 295.7366 17.2021 0.1421 236 +238 3 257.2696 296.4184 18.1712 0.1215 237 +239 3 256.3887 296.908 17.7859 0.1144 238 +240 3 256.0638 296.3543 16.7219 0.1144 239 +241 3 256.0901 295.2961 15.757 0.1144 240 +242 3 255.8979 294.2139 16.0994 0.1144 241 +243 3 255.6131 293.1431 16.7947 0.1144 242 +244 3 255.382 292.1215 17.8914 0.1244 243 +245 3 254.6132 291.434 18.7561 0.1374 244 +246 3 253.5539 291.0588 19.1251 0.1503 245 +247 3 252.6421 291.1388 17.7044 0.1415 246 +248 3 251.8459 291.5301 15.9541 0.1284 247 +249 3 251.5736 291.0393 13.6618 0.1147 248 +250 3 251.9088 290.004 12.88 0.1144 249 +251 3 263.0365 298.3815 16.9333 0.1207 149 +252 3 262.135 299.0222 16.2985 0.1144 251 +253 3 261.3262 299.8298 16.282 0.1144 252 +254 3 260.5757 300.6912 16.4343 0.1269 253 +255 3 259.7498 301.4371 17.0794 0.1398 254 +256 3 258.7431 301.778 16.214 0.1652 255 +257 3 257.8336 301.2198 15.2989 0.1652 256 +258 3 257.2444 300.5654 13.564 0.1619 257 +259 3 256.3578 300.4087 12.8741 0.1365 258 +260 3 255.5135 300.5757 14.7162 0.1233 259 +261 3 254.6041 300.7793 16.1795 0.1144 260 +262 3 253.7415 301.3616 17.075 0.1144 261 +263 3 253.2095 302.1521 17.3463 0.1144 262 +264 3 252.9842 302.2036 15.5907 0.1144 263 +265 3 252.7634 301.7597 13.638 0.1205 264 +266 3 251.8688 301.7849 12.1612 0.1337 265 +267 3 251.1 301.2369 12.2864 0.1483 266 +268 3 251.4089 300.9029 14.238 0.142 267 +269 3 251.9157 301.2003 16.6026 0.1286 268 +270 3 251.8173 302.2414 17.01 0.115 269 +271 3 251.4512 303.2744 16.24 0.1144 270 +272 3 279.9357 332.9074 22.2953 0.1951 113 +273 3 279.0079 333.3696 21.2652 0.1359 272 +274 3 278.5423 334.1624 19.686 0.1144 273 +275 3 278.3695 334.811 17.4812 0.1144 274 +276 3 278.2219 335.8178 16.4077 0.1144 275 +277 3 278.2757 336.9412 16.6925 0.1173 276 +278 3 278.1281 337.9959 17.7047 0.1303 277 +279 3 277.9691 339.0152 18.8966 0.1433 278 +280 3 277.7884 340.0757 19.5807 0.1525 279 +281 3 277.0997 340.7496 19.434 0.1525 280 +282 3 276.1044 340.8571 18.5035 0.1525 281 +283 3 275.4924 341.2426 16.3864 0.1462 282 +284 3 274.7716 341.3582 14.527 0.1326 283 +285 3 273.9663 341.8375 13.839 0.1189 284 +286 3 273.7077 342.8522 13.092 0.1144 285 +287 3 274.1756 343.7766 12.2651 0.1363 286 +288 3 274.7888 344.6872 12.88 0.1652 287 +289 3 299.9259 364.1718 19.7714 0.3256 12 +290 3 299.8024 363.1857 18.3994 0.2615 289 +291 3 300.1867 362.3208 17.1349 0.223 290 +292 3 300.7084 361.5806 15.4552 0.2161 291 +293 3 300.5585 360.5739 14.7638 0.2275 292 +294 3 299.617 360.0042 14.3074 0.2288 293 +295 3 298.7053 360.4664 13.1547 0.2163 294 +296 3 297.6917 360.9846 12.9111 0.2035 295 +297 3 296.5614 361.1459 13.0838 0.1907 296 +298 3 295.5204 360.9926 12.2881 0.2142 297 +299 3 294.7459 360.2159 12.3057 0.2714 298 +300 3 295.2927 359.4734 12.292 0.2542 299 +301 3 296.4047 359.4482 12.1187 0.2542 300 +302 3 296.8497 358.4003 12.1646 0.2669 301 +303 2 305.1826 383.232 22.9978 0.3252 1 +304 2 305.4286 384.3028 22.8676 0.3594 303 +305 2 305.3542 385.3575 23.898 0.3686 304 +306 2 305.0865 386.362 24.9337 0.3648 305 +307 2 304.6735 387.419 25.1149 0.3559 306 +308 2 304.3704 388.4772 24.5893 0.3398 307 +309 2 304.1621 389.5011 23.7555 0.2837 308 +310 2 304.6094 390.5399 23.4931 0.2424 309 +311 2 305.2958 391.4505 23.2809 0.2542 310 +312 2 305.6551 392.5178 23.7577 0.2288 311 +313 2 305.8598 393.5657 22.776 0.2282 312 +314 2 305.8427 394.5965 21.9346 0.2222 313 +315 2 306.258 395.6478 21.849 0.2288 314 +316 2 306.7121 396.69 21.8974 0.2352 315 +317 2 307.0999 397.7528 22.2233 0.2615 316 +318 2 307.5667 398.6863 21.7031 0.2938 317 +319 2 308.0163 399.2663 21.0885 0.3298 318 +320 2 308.4384 400.2009 21.0042 0.1924 319 +321 2 308.7679 400.9251 22.3936 0.2136 320 +322 2 309.1717 401.5989 23.984 0.2232 321 +323 2 309.6728 402.3082 25.5769 0.2074 322 +324 2 309.6808 403.0312 24.9942 0.1177 323 +325 2 310.1144 403.5437 24.855 0.2288 324 +326 2 309.7963 404.5504 24.4471 0.2628 325 +327 2 309.8501 405.4039 23.1179 0.1962 326 +328 2 309.9302 406.1703 22.1449 0.3121 327 +329 2 310.4336 407.081 22.12 0.2756 328 +330 2 310.7401 408.1186 22.3076 0.2059 329 +331 2 311.2298 409.0143 22.5123 0.2855 330 +332 2 311.8533 409.4422 20.8029 0.2437 331 +333 2 311.8407 410.2384 20.524 0.2288 332 +334 2 312.7639 410.3803 20.547 0.1144 333 +335 2 312.7696 410.8756 22.7214 0.1416 334 +336 2 313.0373 411.8514 23.52 0.206 335 +337 2 313.2924 412.9314 23.52 0.2539 336 +338 2 313.79 413.2586 22.4 0.178 337 +339 2 314.2271 414.0044 23.3374 0.1955 338 +340 2 314.1607 414.8888 22.4 0.2111 339 +341 2 314.7453 415.7754 21.8711 0.2939 340 +342 2 315.3928 416.4961 21.9904 0.3108 341 +343 2 315.744 417.3472 22.09 0.1484 342 +344 2 316.3869 418.2064 22.3728 0.2844 343 +345 2 316.8743 418.9957 21.7048 0.1824 344 +346 2 316.6947 419.7496 20.4067 0.1816 345 +347 2 317.0596 420.5802 19.1148 0.1398 346 +348 2 317.9874 420.8868 19.88 0.2893 347 +349 2 318.5262 421.5972 19.068 0.2288 348 +350 2 318.8683 422.5444 20.1505 0.3794 349 +351 2 319.2687 423.2548 18.6455 0.2754 350 +352 2 319.7526 423.8806 16.8291 0.1406 351 +353 2 320.0031 424.9411 17.1741 0.2503 352 +354 2 320.6335 425.4628 18.6519 0.15 353 +355 2 320.9995 426.2521 19.6 0.1205 354 +356 2 321.4102 427.0266 20.8057 0.2266 355 +357 2 321.8072 427.7016 20.4691 0.376 356 +358 2 321.845 428.6694 19.7954 0.3971 357 +359 2 322.1767 429.4576 20.5691 0.1525 358 +360 2 322.9512 430.0307 21.2783 0.1781 359 +361 2 323.18 431.1027 20.7068 0.2507 360 +362 2 322.9523 431.7204 19.0282 0.1899 361 +363 2 323.1125 432.7283 18.6379 0.1828 362 +364 2 323.752 433.3346 18.7911 0.4068 363 +365 2 323.752 433.759 19.32 0.2355 364 +366 2 324.2096 434.72 19.32 0.2669 365 +367 2 324.1295 433.8048 17.1441 0.3559 364 +368 2 324.5334 434.7658 17.36 0.3465 367 +369 2 325.1111 435.6466 17.3594 0.1908 368 +370 2 325.2209 436.7346 16.7524 0.1622 369 +371 2 325.6053 437.7996 16.6782 0.2207 370 +372 2 325.992 438.5078 15.96 0.2009 371 +373 2 326.6189 439.2754 16.5161 0.2028 372 +374 2 327.5283 439.4527 16.1672 0.3288 373 +375 2 328.4756 439.7456 16.5374 0.1663 374 +376 2 329.1231 440.4949 17.0103 0.3163 375 +377 2 329.7191 440.9354 17.5314 0.3373 376 +378 2 330.5496 441.3266 17.5174 0.2636 377 +379 2 331.4797 441.0189 17.08 0.3369 378 +380 2 332.4178 441.0738 17.1259 0.2575 379 +381 2 332.9132 441.3861 16.7807 0.3335 380 +382 2 333.8512 441.7934 17.2357 0.2132 381 +383 2 334.6864 442.4042 17.4264 0.1817 382 +384 2 335.5913 442.7383 16.8221 0.2989 383 +385 2 336.1953 442.8802 15.059 0.2078 384 +386 2 336.9778 443.5299 14.3959 0.2288 385 +387 2 337.8026 443.6249 15.3437 0.3432 386 +388 2 338.4776 444.4509 15.9034 0.2161 387 +389 2 338.624 445.3478 15.9034 0.1144 388 +390 2 338.8528 446.0456 14.84 0.2161 389 +391 2 339.2498 447.0306 15.54 0.1461 390 +392 2 339.5312 447.5557 13.3473 0.211 391 +393 2 340.0002 448.2169 13.9244 0.1421 392 +394 2 339.9728 449.1927 14.051 0.1424 393 +395 2 339.6628 450.0656 12.934 0.3336 394 +396 2 340.3892 450.6822 13.7334 0.2288 395 +397 2 341.023 451.5231 13.4697 0.1271 396 +398 2 341.7117 451.9967 13.4613 0.174 397 +399 2 342.485 452.5481 13.5663 0.169 398 +400 2 342.6486 453.1201 12.1834 0.1732 399 +401 2 343.3247 453.7104 12.0081 0.1841 400 +402 2 343.8567 454.3922 13.0046 0.1865 401 +403 2 344.4229 454.6256 14.1635 0.1285 402 +404 2 344.94 455.0546 12.7854 0.247 403 +405 2 345.6024 455.4264 11.76 0.2924 404 +406 3 301.5847 384.1975 25.1188 0.266 1 +407 3 300.9715 385.1219 24.5062 0.2776 406 +408 3 300.0792 385.7717 24.9561 0.2796 407 +409 3 299.601 385.8712 24.8889 0.3178 408 +410 3 299.1022 386.0954 26.0089 0.2034 409 +411 3 298.4959 386.4432 28.1512 0.2161 410 +412 3 297.8358 387.1536 28.3161 0.2895 411 +413 3 297.1563 387.7554 26.7473 0.1968 412 +414 3 296.2708 388.054 26.32 0.3147 413 +415 3 295.4426 388.1192 27.5495 0.3085 414 +416 3 294.6624 388.2358 28.6437 0.1937 415 +417 3 293.6396 388.65 28.9167 0.1824 416 +418 3 292.5494 388.9325 28.5172 0.2393 417 +419 3 291.45 389.071 27.832 0.1925 418 +420 3 290.3094 389.079 27.9558 0.1907 419 +421 3 289.2867 389.1007 26.7179 0.2156 420 +422 3 288.1667 389.238 26.2828 0.279 421 +423 3 287.2012 389.8466 26.124 0.3178 422 +424 3 285.9725 390.6634 26.2811 0.252 423 +425 3 285.0001 391.1222 27.2227 0.3034 424 +426 3 283.8813 391.3269 27.4739 0.3299 425 +427 3 282.7579 391.1416 27.6842 0.3305 426 +428 3 281.6963 390.9128 28.5636 0.3178 427 +429 3 280.6163 390.9254 29.4868 0.2796 428 +430 3 279.597 391.0398 30.196 0.3037 429 +431 3 278.9129 391.6392 28.6348 0.2957 430 +432 3 278.0858 392.2936 27.7707 0.2836 431 +433 3 277.1981 392.9571 28.1789 0.2615 432 +434 3 276.3172 393.6641 28.5155 0.2633 433 +435 3 275.4191 394.3723 28.5597 0.2577 434 +436 3 274.4902 395.0381 28.5578 0.2542 435 +437 3 273.5396 395.6753 28.5491 0.2635 436 +438 3 272.5157 396.1786 28.4962 0.2669 437 +439 3 271.4151 396.3663 28.0876 0.2479 438 +440 3 270.6224 396.3525 26.2741 0.2122 439 +441 3 269.6477 396.0951 25.2118 0.2034 440 +442 3 268.5243 396.0036 24.8928 0.2034 441 +443 3 267.4134 396.2233 24.6056 0.225 442 +444 3 266.417 396.1512 23.3486 0.2515 443 +445 3 266.2786 395.2142 22.104 0.3019 444 +446 3 265.5167 394.5473 20.9006 0.3051 445 +447 3 264.7662 393.6939 20.7833 0.2663 446 +448 3 263.9723 392.8851 21.0798 0.2611 447 +449 3 263.0525 392.4366 20.6038 0.2818 448 +450 3 262.0183 392.543 20.5906 0.2924 449 +451 3 260.9647 392.4046 21.2766 0.267 450 +452 3 260.0506 391.8475 20.7978 0.2365 451 +453 3 259.4089 391.2011 19.1794 0.2195 452 +454 3 258.5863 390.5296 18.559 0.2256 453 +455 3 257.7066 389.8066 18.7202 0.219 454 +456 3 256.645 389.6384 18.3042 0.2059 455 +457 3 255.6668 390.0216 17.3244 0.1929 456 +458 3 255.0079 390.7035 15.8211 0.1907 457 +459 3 254.0561 391.0901 14.7022 0.1907 458 +460 3 252.9807 391.3727 14.478 0.1907 459 +461 3 251.9111 391.7022 14.1028 0.1821 460 +462 3 250.9181 392.1678 13.3364 0.1691 461 +463 3 249.9766 392.7787 12.8573 0.1563 462 +464 3 248.971 393.3072 12.6571 0.1525 463 +465 3 248.0707 393.9902 12.8103 0.1525 464 +466 3 247.5399 394.974 12.8797 0.1718 465 +467 3 247.652 396.0734 12.8789 0.2074 466 +468 3 247.7172 397.2094 12.8719 0.2458 467 +469 3 247.9586 398.3202 12.8086 0.2437 468 +470 3 248.9413 398.6977 12.6235 0.2086 469 +471 3 250.0704 398.7469 12.9685 0.1694 470 +472 3 251.1606 398.4941 13.4901 0.1538 471 +473 3 252.2577 398.263 13.0374 0.1525 472 +474 3 253.3868 398.3522 12.7434 0.1408 473 +475 3 254.4977 398.2241 12.185 0.1398 474 +476 3 255.112 397.3112 12.88 0.1525 475 +477 3 279.4495 390.8934 30.7238 0.2453 429 +478 3 278.5423 390.9094 30.9336 0.2048 477 +479 3 277.7758 391.1279 31.9984 0.1731 478 +480 3 276.7862 390.7996 31.8228 0.2484 479 +481 3 276.0014 390.4975 30.2618 0.1945 480 +482 3 275.4054 390.2493 28.856 0.2183 481 +483 3 274.7327 389.7528 27.2588 0.1832 482 +484 3 273.8416 389.4496 27.2994 0.2605 483 +485 3 273.9308 389.1671 29.3796 0.2519 484 +486 3 273.8862 389.1682 31.8548 0.3621 485 +487 3 272.9996 389.0744 32.9714 0.2619 486 +488 3 272.1942 389.532 32.3515 0.1144 487 +489 3 271.5925 390.056 31.2754 0.2542 488 +490 3 270.6658 390.0571 32.4526 0.2258 489 +491 3 269.7438 390.2356 33.3948 0.13 490 +492 3 268.7794 390.5765 34.44 0.264 491 +493 3 268.0106 390.2115 33.6622 0.2739 492 +494 3 267.2922 389.4576 34.1312 0.1271 493 +495 3 266.3518 389.0675 33.5334 0.2814 494 +496 3 265.368 388.6134 34.3104 0.2591 495 +497 3 264.5237 388.1603 33.99 0.2398 496 +498 3 263.6245 388.1661 35.3114 0.2223 497 +499 3 262.7654 387.9098 35.56 0.1689 498 +500 3 262.2048 387.816 36.0805 0.3432 499 +501 3 261.6031 388.3194 35.567 0.2444 500 +502 3 260.6593 388.8033 36.3129 0.2542 501 +503 3 259.6308 388.8559 36.7486 0.2696 502 +504 3 258.7453 388.7049 37.9579 0.2078 503 +505 3 257.8519 388.3297 37.3388 0.2045 504 +506 3 256.8028 388.1626 37.2663 0.1459 505 +507 3 255.8888 388.1214 38.355 0.125 506 +508 3 254.9164 387.5586 38.3541 0.2542 507 +509 3 253.8158 387.3309 38.5255 0.2542 508 +510 3 252.9373 386.9992 38.5213 0.2415 509 +511 3 252.3858 386.553 39.2498 0.1945 510 +512 3 251.839 385.7476 38.9091 0.2392 511 +513 3 250.989 385.3587 39.2 0.2725 512 +514 3 250.0029 385.5131 39.508 0.2288 513 +515 3 249.2639 385.2557 38.6526 0.2875 514 +516 3 248.1805 385.0784 39.1978 0.1816 515 +517 3 247.1132 384.8565 39.4895 0.1269 516 +518 3 246.1877 385.2168 39.7379 0.1789 517 +519 3 245.2336 384.9285 40.0249 0.235 518 +520 3 244.1765 384.7661 40.1657 0.1906 519 +521 3 243.0748 384.6208 39.7701 0.202 520 +522 3 242.004 384.6837 40.1551 0.2161 521 +523 3 240.9378 384.3474 40.46 0.1808 522 +524 3 239.9826 384.0545 40.2576 0.2161 523 +525 3 239.0079 383.5981 40.6 0.1604 524 +526 3 238.0595 382.9883 40.9763 0.1652 525 +527 3 237.1638 382.2951 41.2821 0.1568 526 +528 3 236.1628 381.7883 41.2378 0.1525 527 +529 3 235.4649 380.9348 41.4308 0.1645 528 +530 3 234.79 380.3674 41.44 0.2415 529 +531 3 234.0349 379.5941 41.8566 0.1415 530 +532 3 233.1529 378.9248 41.7665 0.2098 531 +533 3 232.137 378.4455 41.72 0.2134 532 +534 3 231.0972 378.0359 41.4546 0.2728 533 +535 3 230.087 377.5486 41.274 0.2541 534 +536 3 229.0997 377.0773 41.72 0.2034 535 +537 3 228.3195 376.3302 41.804 0.1144 536 +538 3 227.2865 375.8887 41.8964 0.1144 537 +539 3 226.1562 375.804 42.0006 0.1146 538 +540 3 225.0545 375.7319 42.408 0.1452 539 +541 3 223.9998 375.6896 42.0014 0.3295 540 +542 3 223.088 375.6747 42.2831 0.2534 541 +543 3 222.0412 375.28 42.8243 0.1151 542 +544 3 220.9922 374.8259 42.84 0.1144 543 +545 3 219.8562 374.7744 42.84 0.1144 544 +546 3 218.7122 374.7744 42.84 0.1144 545 +547 3 217.6014 374.676 42.84 0.1144 546 +548 3 217.1472 373.8157 43.2247 0.2288 547 +549 3 216.788 373.5103 44.518 0.2288 548 +550 3 216.0021 373.1945 43.96 0.2309 549 +551 3 215.2928 372.4235 43.1281 0.2147 550 +552 3 214.4531 371.6833 42.8305 0.2083 551 +553 3 213.396 371.4637 43.3462 0.3256 552 +554 3 212.3722 371.1228 44.032 0.3686 553 +555 3 211.4444 371.379 44.1913 0.4129 554 +556 3 210.3862 371.1662 43.4162 0.1591 555 +557 3 209.3612 370.7635 43.4 0.1144 556 +558 3 208.7674 370.0977 44.52 0.178 557 +559 3 208.4368 369.2249 43.7898 0.2497 558 +560 3 207.6829 368.7798 43.5193 0.3636 559 +561 3 206.6396 368.622 43.3784 0.3898 560 +562 3 205.5871 368.4641 42.9618 0.3296 561 +563 3 204.6639 368.2387 42.0204 0.3217 562 +564 3 203.7944 367.9298 41.72 0.3305 563 +565 3 202.734 367.9104 42.142 0.384 564 +566 3 201.6586 367.8269 41.4999 0.2598 565 +567 3 200.7846 368.193 40.88 0.2663 566 +568 3 199.9415 367.7949 41.6248 0.2775 567 +569 3 199.1704 367.224 41.16 0.2669 568 +570 3 287.2115 390.1829 25.6178 0.2688 423 +571 3 287.2481 391.1565 24.1534 0.1433 570 +572 3 287.3385 392.1186 22.6792 0.1828 571 +573 3 287.1875 393.0075 20.9756 0.2215 572 +574 3 287.3877 393.8197 19.1523 0.2448 573 +575 3 287.978 394.203 17.3737 0.188 574 +576 3 287.9013 393.5371 15.2382 0.1738 575 +577 3 287.4414 392.6288 14.187 0.1697 576 +578 3 286.7058 391.7571 13.9997 0.1735 577 +579 3 285.8135 391.1931 13.9983 0.1699 578 +580 3 284.6867 391.0547 13.9882 0.1727 579 +581 3 283.815 390.4472 13.9205 0.1652 580 +582 3 283.4146 389.4016 14.0134 0.1531 581 +583 3 282.9638 388.5413 14.996 0.1398 582 +584 3 282.3609 387.8046 16.483 0.1465 583 +585 3 281.6688 386.9992 17.1492 0.1663 584 +586 3 280.7376 386.6194 16.4133 0.178 585 +587 3 280.2411 385.9044 15.8567 0.1697 586 +588 3 279.5925 385.0681 15.4342 0.1652 587 +589 3 278.6738 384.6563 16.4245 0.1763 588 +590 3 278.8031 384.1209 18.6477 0.178 589 +591 3 278.9198 383.0901 19.6624 0.1544 590 +592 3 279.033 382.0022 20.477 0.1286 591 +593 3 279.5536 381.1865 21.9338 0.1149 592 +594 3 280.248 380.3972 23.0336 0.1144 593 +595 3 281.1952 379.9224 24.08 0.1271 594 +596 3 299.696 386.1835 25.3509 0.3103 409 +597 3 299.9831 387.1319 26.752 0.2875 596 +598 3 300.2714 388.0791 28.1529 0.2647 597 +599 3 300.5425 388.6054 27.4324 0.1144 598 +600 3 300.9624 389.524 27.6203 0.3407 599 +601 3 301.6087 390.1395 28.4374 0.1485 600 +602 3 301.3285 390.8613 27.0418 0.223 601 +603 3 301.0585 391.7571 27.5248 0.268 602 +604 3 300.848 392.8645 27.8715 0.1875 603 +605 3 300.594 393.925 28.289 0.1234 604 +606 3 300.3023 394.6823 29.4 0.1972 605 +607 3 300.3057 395.7085 28.5732 0.2433 606 +608 3 300.1856 396.8376 28.5625 0.2789 607 +609 3 299.9808 397.9335 28.1716 0.2464 608 +610 3 299.704 398.5971 26.88 0.1144 609 +611 3 299.9991 399.5134 27.5587 0.1808 610 +612 3 300.2417 400.4343 28.6289 0.1144 611 +613 3 299.6422 401.1836 29.6425 0.2635 612 +614 3 299.5118 402.0256 31.2648 0.3303 613 +615 3 299.855 402.99 30.5864 0.2415 614 +616 3 299.9728 403.9144 30.87 0.307 615 +617 3 299.9568 404.6522 32.48 0.1268 616 +618 3 299.9362 405.7768 32.3028 0.1144 617 +619 3 299.3688 406.263 30.5458 0.1144 618 +620 3 299.0016 406.9208 31.5487 0.24 619 +621 3 298.0989 406.9757 31.8665 0.236 620 +622 3 297.2993 407.1645 32.6116 0.2123 621 +623 3 296.868 407.6873 32.9731 0.3432 622 +624 3 296.2994 407.9115 32.0695 0.3178 623 +625 3 295.4849 408.5018 31.3928 0.3167 624 +626 3 295.0971 408.8656 33.0562 0.2288 625 +627 3 295.3042 408.7009 35.5289 0.3051 626 +628 3 295.1463 407.4013 34.72 0.2931 627 +629 3 295.0365 406.4392 34.2241 0.2539 628 +630 3 295.6004 406.2573 36.6134 0.2542 629 +631 3 296.1255 406.112 38.8612 0.2488 630 +632 3 295.1863 406.4117 38.332 0.2931 631 +633 3 294.564 407.0958 37.6662 0.3342 632 +634 3 293.6865 407.7205 37.828 0.4068 633 +635 3 293.6648 407.9024 40.3287 0.2653 634 +636 3 293.0493 408.4412 41.097 0.2386 635 +637 3 292.7874 409.4296 41.44 0.1907 636 +638 3 293.2324 410.1869 41.6993 0.305 637 +639 3 293.4646 410.8447 42.0742 0.3589 638 +640 3 293.5687 411.8457 42.7207 0.2804 639 +641 3 293.436 412.7987 42.9685 0.2103 640 +642 3 293.9016 413.3135 44.8232 0.36 641 +643 3 293.889 414.0228 45.7422 0.293 642 +644 3 293.8501 415.0604 45.6753 0.4261 643 +645 3 293.3937 416.0602 46.1387 0.4676 644 +646 3 293.0242 417.1299 46.2 0.3605 645 +647 3 292.9784 418.1228 45.9802 0.5101 646 +648 3 293.2072 418.9866 46.1664 0.2702 647 +649 3 293.0287 419.9624 46.2552 0.2288 648 +650 3 292.3721 420.094 48.16 0.4438 649 +651 3 291.6056 419.8652 49.0 0.3704 650 +652 3 291.3265 418.9683 49.628 0.4449 651 +653 3 290.6904 418.9763 51.2089 0.178 652 +654 3 290.8117 419.8549 50.4851 0.2786 653 +655 3 290.7476 420.571 51.7454 0.3892 654 +656 3 290.2408 421.4061 52.8763 0.2644 655 +657 3 290.3426 422.446 52.8864 0.3456 656 +658 3 290.576 423.5042 53.48 0.3228 657 +659 3 290.3278 424.3474 53.9879 0.2611 658 +660 3 290.528 425.2168 52.9836 0.2034 659 +661 3 290.9192 425.3907 54.985 0.237 660 +662 3 291.0919 425.8162 56.3242 0.3432 661 +663 3 291.8699 426.3208 56.3749 0.1574 662 +664 3 292.0449 427.2565 57.4 0.2137 663 +665 3 292.5116 427.1993 58.3377 0.1731 664 +666 3 292.737 427.967 59.7498 0.2415 665 +667 3 293.6431 428.476 60.6522 0.366 666 +668 3 293.6923 429.4736 60.5377 0.2927 667 +669 3 294.1201 430.2916 61.9864 0.2131 668 +670 3 294.4988 431.2686 62.72 0.2034 669 +671 3 294.8809 432.2913 63.212 0.1734 670 +672 3 294.9232 433.3781 63.84 0.1144 671 +673 3 295.4609 434.2292 63.5986 0.1255 672 +674 3 295.2206 435.1936 62.9821 0.2897 673 +675 3 294.8637 436.2106 63.56 0.3375 674 +676 3 294.2608 436.6648 64.0494 0.2347 675 +677 3 294.3581 437.0172 66.1256 0.2266 676 +678 3 293.6431 437.7219 66.6543 0.1398 677 +679 3 293.0939 437.8088 64.5411 0.2034 678 +680 3 292.5208 438.2538 65.8417 0.1875 679 +681 3 291.9488 438.5112 66.915 0.2115 680 +682 3 291.6033 438.9082 68.3133 0.1952 681 +683 3 290.8345 439.4802 68.3544 0.1257 682 +684 3 290.0109 440.1311 68.32 0.2802 683 +685 3 289.7752 441.1744 68.7425 0.275 684 +686 3 289.5235 442.1926 69.6147 0.1144 685 +687 3 289.1815 442.9785 67.9496 0.1144 686 +688 3 288.5912 443.8056 67.0709 0.1144 687 +689 3 288.0638 444.706 67.405 0.1144 688 +690 3 287.565 445.6463 67.8146 0.1731 689 +691 3 287.3476 446.6942 68.1652 0.2118 690 +692 3 286.4507 446.748 69.6704 0.1948 691 +693 3 286.2883 447.6358 69.991 0.2389 692 +694 3 286.0 448.3302 68.5292 0.1271 693 +695 3 285.9851 449.0463 66.6526 0.1473 694 +696 3 285.5424 448.9216 68.5896 0.3173 695 +697 3 285.3113 449.314 70.56 0.3201 696 +698 3 284.7416 450.2784 70.28 0.3305 697 +699 3 294.1464 409.4937 35.1772 0.2682 627 +700 3 293.2072 410.1354 34.8916 0.2382 699 +701 3 292.268 410.7784 34.6063 0.2082 700 +702 3 291.6571 410.7235 34.7637 0.2034 701 +703 3 290.8162 410.5816 35.9296 0.2966 702 +704 3 290.6298 410.2384 37.602 0.3097 703 +705 3 289.7821 410.8287 38.08 0.3302 704 +706 3 288.892 411.4968 37.9756 0.1663 705 +707 3 288.0867 411.1891 37.0972 0.139 706 +708 3 287.033 411.4373 37.5164 0.1403 707 +709 3 286.2997 411.165 38.871 0.3051 708 +710 3 285.4177 411.1536 38.4384 0.1144 709 +711 3 284.7851 411.7302 38.2794 0.1939 710 +712 3 284.0289 412.1924 38.9096 0.2076 711 +713 3 283.3905 412.9348 38.0534 0.2924 712 +714 3 282.8323 413.4256 37.52 0.2537 713 +715 3 282.5188 414.366 36.9275 0.2004 714 +716 3 282.576 415.3624 37.2686 0.1548 715 +717 3 281.9949 415.9584 38.9211 0.1144 716 +718 3 280.8966 416.0728 39.2 0.1144 717 +719 3 279.7526 416.0728 39.2 0.1322 718 +720 3 278.8214 416.0728 40.3066 0.2614 719 +721 3 277.8913 416.3405 39.485 0.299 720 +722 3 277.11 415.7296 39.6396 0.3594 721 +723 3 276.0197 415.5111 40.2094 0.3213 722 +724 3 274.9673 415.8348 40.171 0.2834 723 +725 3 274.2271 415.836 38.8486 0.3212 724 +726 3 273.4995 416.297 38.08 0.1902 725 +727 3 272.4116 416.6219 38.08 0.1576 726 +728 3 271.3465 416.8736 38.187 0.1144 727 +729 3 270.4874 416.8736 39.9459 0.1155 728 +730 3 269.8341 417.3312 41.16 0.1144 729 +731 3 268.7107 417.3312 41.5554 0.1515 730 +732 3 267.736 417.4078 42.8954 0.1773 731 +733 3 267.0279 416.8644 43.1659 0.2288 732 +734 3 266.2706 416.8725 41.7393 0.1938 733 +735 3 265.8359 417.4124 40.4373 0.4306 734 +736 3 264.8005 417.7625 40.6266 0.2631 735 +737 3 263.986 418.084 40.0389 0.2288 736 +738 3 263.0685 418.2807 38.9225 0.1271 737 +739 3 262.6944 418.942 40.5563 0.24 738 +740 3 262.5423 419.8789 41.3003 0.2861 739 +741 3 262.0973 420.706 41.44 0.2558 740 +742 3 262.2883 421.5388 42.0403 0.2691 741 +743 3 262.0435 422.2447 40.3976 0.1467 742 +744 3 261.9794 422.9196 38.64 0.1144 743 +745 3 261.7461 423.8303 37.7292 0.133 744 +746 3 261.1054 424.6162 36.7794 0.1772 745 +747 3 260.9052 425.6607 36.7069 0.3132 746 +748 3 260.5929 426.5965 36.1645 0.2106 747 +749 3 260.1456 427.6135 36.12 0.1445 748 +750 3 259.8516 428.5733 35.7227 0.1722 749 +751 3 259.3677 429.2139 35.7098 0.2847 750 +752 3 259.2327 430.3133 36.12 0.3411 751 +753 3 259.8459 431.0649 36.6016 0.2375 752 +754 3 260.0712 431.9138 38.2928 0.1518 753 +755 3 260.1387 431.6941 40.329 0.1144 754 +756 3 260.26 432.0739 42.3195 0.1907 755 +757 3 260.7256 433.0292 42.2408 0.1907 756 +758 3 261.38 433.9009 42.28 0.2241 757 +759 3 261.0688 434.6022 42.8389 0.3056 758 +760 3 260.8892 435.5219 43.7461 0.2771 759 +761 3 260.8457 436.4577 44.1017 0.1178 760 +762 3 261.6328 437.0469 44.1913 0.2542 761 +763 3 261.6408 438.0101 42.7336 0.2433 762 +764 3 262.2048 438.724 41.44 0.178 763 +765 3 304.9355 375.1977 30.2879 0.3278 1 +766 3 304.9984 374.1532 31.3407 0.3083 765 +767 3 305.0442 373.047 32.018 0.294 766 +768 3 305.3347 371.9785 32.6869 0.2924 767 +769 3 306.0303 371.0861 32.753 0.2693 768 +770 3 306.6778 370.2556 31.7075 0.2552 769 +771 3 307.116 369.2821 30.7244 0.3017 770 +772 3 307.9945 368.5922 30.2492 0.368 771 +773 3 309.1088 368.4847 30.8 0.394 772 +774 3 309.9565 368.4916 30.8 0.3645 773 +775 3 311.0982 368.5499 30.8006 0.3567 774 +776 3 312.1839 368.9022 30.8025 0.3197 775 +777 3 313.0785 369.6104 30.8106 0.3299 776 +778 3 314.0738 370.1721 30.856 0.3797 777 +779 3 315.18 369.9536 31.1878 0.4066 778 +780 3 316.2451 369.6275 31.8214 0.394 779 +781 3 317.1706 369.3896 31.6772 0.3726 780 +782 3 318.2482 369.1345 31.0097 0.3686 781 +783 3 319.3785 369.1299 30.8162 0.326 782 +784 3 320.3292 369.7145 30.8193 0.2639 783 +785 3 321.0693 370.5794 30.9002 0.2001 784 +786 3 321.9239 371.3081 31.362 0.1685 785 +787 3 322.9432 371.7176 30.7787 0.1882 786 +788 3 323.903 371.903 29.349 0.2542 787 +789 3 325.1671 371.7211 28.2125 0.2892 788 +790 3 326.2722 371.8469 27.8522 0.2696 789 +791 3 327.3705 371.9613 28.2954 0.2415 790 +792 3 328.4859 371.7474 28.4099 0.2529 791 +793 3 329.5933 371.6536 27.8642 0.2989 792 +794 3 330.6503 371.514 26.9097 0.3472 793 +795 3 331.7348 371.2646 26.6641 0.3518 794 +796 3 332.8434 371.0884 27.1762 0.3345 795 +797 3 333.9599 370.9626 27.3795 0.3178 796 +798 3 335.0822 371.0953 27.0542 0.3226 797 +799 3 336.1861 371.1216 26.4715 0.3355 798 +800 3 337.3038 370.9226 26.1551 0.3328 799 +801 3 338.4192 370.9054 26.2452 0.3123 800 +802 3 339.4683 371.2978 26.5978 0.2876 801 +803 3 340.4578 371.7348 26.1926 0.2607 802 +804 3 341.3559 372.2713 25.8188 0.2353 803 +805 3 342.1555 373.0538 25.6956 0.2096 804 +806 3 342.9163 373.8672 25.0858 0.21 805 +807 3 343.6198 374.652 24.1058 0.2366 806 +808 3 344.4893 375.2503 23.2224 0.286 807 +809 3 345.5441 375.6461 22.9561 0.3352 808 +810 3 346.6709 375.7548 22.932 0.3735 809 +811 3 347.7863 375.5546 22.7942 0.3999 810 +812 3 348.8411 375.216 22.2068 0.3948 811 +813 3 349.8764 374.9357 21.2456 0.3482 812 +814 3 350.9678 374.7103 20.7687 0.2889 813 +815 3 352.0797 374.7813 20.7197 0.2744 814 +816 3 353.0281 375.3636 20.7183 0.3106 815 +817 3 353.8552 376.1529 20.7136 0.3305 816 +818 3 354.68 376.9457 20.694 0.2994 817 +819 3 355.5609 377.6722 20.601 0.2406 818 +820 3 356.5791 378.0748 20.1124 0.2082 819 +821 3 357.6258 378.4672 20.0402 0.2288 820 +822 3 358.4747 379.188 20.4714 0.2768 821 +823 3 359.2778 379.9796 20.3031 0.3104 822 +824 3 360.1815 380.3674 19.1052 0.3087 823 +825 3 361.2523 380.3285 18.4184 0.2636 824 +826 3 362.3734 380.1718 18.1129 0.2508 825 +827 3 363.4671 380.0654 17.5246 0.238 826 +828 3 364.5825 380.1146 17.3424 0.2177 827 +829 3 365.6727 379.7771 17.2281 0.183 828 +830 3 366.6142 379.2314 16.7706 0.1611 829 +831 3 367.4105 378.4993 16.2392 0.1614 830 +832 3 368.4767 378.3174 16.235 0.1924 831 +833 3 369.5829 378.6114 16.2044 0.2259 832 +834 3 370.6171 379.0324 15.9354 0.2313 833 +835 3 371.6318 379.4007 15.6229 0.1997 834 +836 3 372.7289 379.2337 15.9883 0.1722 835 +837 3 373.683 378.7109 16.7238 0.1713 836 +838 3 374.652 378.1904 17.2309 0.1905 837 +839 3 375.7685 378.0337 17.3594 0.2102 838 +840 3 376.7764 378.4386 17.3552 0.2306 839 +841 3 377.7168 379.0873 17.3337 0.2488 840 +842 3 378.7727 379.4705 17.1931 0.2542 841 +843 3 379.8618 379.4133 16.6001 0.2624 842 +844 3 380.9749 379.3996 16.5245 0.2843 843 +845 3 382.08 379.2246 16.3531 0.328 844 +846 3 383.2091 379.1205 16.24 0.3522 845 +847 3 384.3497 379.1971 16.24 0.3653 846 +848 3 385.3861 379.0781 15.2995 0.2233 847 +849 3 386.3425 378.7784 15.12 0.1146 848 +850 3 387.4842 378.759 15.2163 0.1403 849 +851 3 388.4612 378.8276 15.68 0.1859 850 +852 3 389.5858 378.8928 16.0115 0.1328 851 +853 3 390.4758 378.7509 15.4241 0.1438 852 +854 3 391.3292 378.8505 15.4104 0.2302 853 +855 3 391.8314 378.4421 14.0403 0.2428 854 +856 3 392.7421 378.092 14.7252 0.1468 855 +857 3 393.4491 378.6125 13.72 0.1144 856 +858 3 394.5667 378.7406 13.72 0.1144 857 +859 3 395.5963 379.0072 13.8774 0.1144 858 +860 3 396.7049 378.918 13.44 0.1144 859 +861 3 397.8374 378.7921 13.44 0.1481 860 +862 3 398.8327 378.4798 13.9776 0.1455 861 +863 3 399.5695 377.6619 13.9605 0.1497 862 +864 3 400.3234 377.1894 13.4246 0.2267 863 +865 3 401.083 376.7741 13.7911 0.2342 864 +866 3 401.9753 376.2639 13.7155 0.2288 865 +867 3 402.863 376.0271 13.7511 0.1944 866 +868 3 403.6432 375.6095 14.0017 0.1144 867 +869 3 404.4063 375.3567 13.9342 0.1708 868 +870 3 405.2803 375.693 13.16 0.1564 869 +871 3 406.1486 376.2261 12.5938 0.1296 870 +872 3 407.0123 375.6473 12.3544 0.1773 871 +873 3 407.8406 375.0879 12.7042 0.1951 872 +874 3 408.6162 375.5088 13.0488 0.131 873 +875 3 409.5108 376.2055 12.8391 0.157 874 +876 3 410.5347 376.5442 12.8391 0.1849 875 +877 3 411.4716 375.9504 12.8391 0.1556 876 +878 3 412.118 375.0089 12.8391 0.1467 877 +879 3 412.746 374.0525 12.8391 0.1398 878 +880 3 323.609 371.6993 28.1929 0.2288 788 +881 3 324.4384 371.8618 28.9036 0.2288 880 +882 3 324.5608 372.7186 30.4763 0.1271 881 +883 3 324.896 373.7048 31.451 0.2412 882 +884 3 325.7151 374.1795 31.2404 0.2091 883 +885 3 326.4107 375.0261 30.8311 0.2653 884 +886 3 327.3281 375.5088 30.9173 0.3157 885 +887 3 328.0191 376.2913 30.5701 0.3187 886 +888 3 328.5557 377.0887 31.3734 0.1945 887 +889 3 328.5568 378.0783 32.4615 0.3077 888 +890 3 328.4813 379.1468 31.9816 0.2754 889 +891 3 329.1185 379.8915 32.804 0.1423 890 +892 3 329.329 380.714 33.9329 0.1597 891 +893 3 329.5143 381.699 34.0948 0.2161 892 +894 3 329.8415 382.5422 35.278 0.1144 893 +895 3 330.4993 383.2652 35.0767 0.2071 894 +896 3 330.7361 384.1506 34.8345 0.1726 895 +897 3 331.6868 384.5888 34.9706 0.1667 896 +898 3 332.2268 385.3839 35.1459 0.1993 897 +899 3 332.7896 386.1698 35.6972 0.2049 898 +900 3 332.888 387.0747 35.8142 0.148 899 +901 3 333.1385 387.8789 34.7026 0.3956 900 +902 3 333.5183 388.801 34.16 0.3534 901 +903 3 333.6716 389.7459 35.1375 0.308 902 +904 3 333.8192 390.644 35.8789 0.2182 903 +905 3 334.0102 391.5912 34.7861 0.2208 904 +906 3 334.1498 392.1815 33.6048 0.2671 905 +907 3 334.4747 392.6151 35.5673 0.3305 906 +908 3 334.7344 393.663 35.4668 0.2394 907 +909 3 334.866 394.6869 36.2284 0.212 908 +910 3 334.9209 395.7954 35.915 0.1603 909 +911 3 335.1325 396.6511 35.0773 0.1804 910 +912 3 335.1119 397.6281 33.9312 0.1144 911 +913 3 335.1783 398.1383 36.0595 0.1367 912 +914 3 335.192 399.1256 36.955 0.2542 913 +915 3 335.192 399.9046 35.9332 0.3051 914 +916 3 335.3808 400.9903 36.3689 0.3168 915 +917 3 335.8326 401.878 36.3334 0.2397 916 +918 3 335.7537 402.2064 37.52 0.1144 917 +919 3 336.2937 403.0255 37.24 0.2108 918 +920 3 337.0933 403.1273 35.588 0.1504 919 +921 3 337.075 404.1969 36.197 0.2231 920 +922 3 337.2581 405.2689 36.7077 0.2669 921 +923 3 337.663 405.9804 37.5264 0.3305 922 +924 3 337.48 406.7503 39.1902 0.1431 923 +925 3 337.3656 407.7982 39.9468 0.1398 924 +926 3 337.4811 408.6402 38.409 0.1937 925 +927 3 337.2718 409.4982 37.1927 0.1271 926 +928 3 337.3336 410.4066 36.47 0.1462 927 +929 3 337.242 411.2691 37.3898 0.219 928 +930 3 337.3622 412.0757 38.8119 0.3075 929 +931 3 337.4491 412.8433 37.7871 0.3358 930 +932 3 337.5944 413.739 38.8321 0.1144 931 +933 3 337.194 414.6211 38.08 0.1201 932 +934 3 336.7387 415.5008 38.5437 0.136 933 +935 3 336.1381 416.1655 37.413 0.2754 934 +936 3 335.7766 416.8095 38.7058 0.2453 935 +937 3 336.1518 417.4479 40.2559 0.2288 936 +938 3 336.5293 418.251 39.3781 0.1652 937 +939 3 336.5591 419.2771 39.4108 0.1382 938 +940 3 335.9928 420.0928 38.92 0.3147 939 +941 3 335.9928 421.0114 39.7541 0.2977 940 +942 3 336.0546 422.0719 39.0631 0.2762 941 +943 3 336.2365 422.9528 38.2088 0.2184 942 +944 3 336.7501 423.4779 36.2264 0.2245 943 +945 3 337.1002 424.0762 37.91 0.1907 944 +946 3 337.2249 424.6574 39.9143 0.1144 945 +947 3 337.2523 425.6126 41.3504 0.1147 946 +948 3 337.48 426.4935 42.6188 0.1384 947 +949 3 338.2042 426.966 43.6439 0.262 948 +950 3 339.0358 427.4041 42.84 0.2079 949 +951 3 339.4889 428.0082 43.3224 0.2733 950 +952 3 340.0334 428.6591 43.96 0.1313 951 +953 3 340.3606 429.3329 42.7087 0.1759 952 +954 3 341.1294 430.1177 43.0422 0.2394 953 +955 3 341.9393 430.8865 42.56 0.267 954 +956 3 342.5136 431.7845 42.233 0.3305 955 +957 3 343.1794 432.5247 41.4946 0.21 956 +958 3 343.6576 433.4433 41.16 0.1144 957 +959 3 344.3509 433.5897 42.3948 0.2219 958 +960 3 345.1517 434.2487 42.9887 0.2206 959 +961 3 345.742 435.0575 43.2373 0.2828 960 +962 3 346.4329 435.8846 42.56 0.3178 961 +963 3 346.8768 436.7895 41.8286 0.1218 962 +964 3 347.204 437.5056 40.166 0.1368 963 +965 3 347.5495 438.1703 39.8614 0.1803 964 +966 3 348.2336 438.4632 41.5862 0.2351 965 +967 3 348.8479 439.3555 41.5716 0.2235 966 +968 3 349.0653 440.2101 41.2084 0.3065 967 +969 3 349.2152 440.8633 42.8428 0.1676 968 +970 3 349.1488 441.862 42.9296 0.3061 969 +971 3 349.1236 442.9236 43.265 0.3051 970 +972 3 349.5023 443.0632 45.7447 0.1983 971 +973 3 349.8352 443.5528 45.7615 0.1862 972 +974 3 350.2047 444.0093 44.4489 0.1878 973 +975 3 350.5067 444.6671 43.1172 0.1514 974 +976 3 350.2928 445.5136 42.0227 0.1941 975 +977 3 350.8648 445.9312 42.56 0.1144 976 +978 3 317.1191 369.2214 30.52 0.2756 780 +979 3 318.0652 368.5865 30.5348 0.1519 978 +980 3 318.8168 368.3829 32.2255 0.3121 979 +981 3 319.5169 367.6404 32.965 0.2059 980 +982 3 320.3486 366.9906 32.6228 0.2736 981 +983 3 321.0133 366.4186 31.8998 0.2895 982 +984 3 321.5212 365.9198 31.0766 0.3079 983 +985 3 322.1893 365.2792 31.9074 0.1996 984 +986 3 322.8951 364.8124 31.6546 0.3265 985 +987 3 323.7245 364.6008 32.9871 0.3567 986 +988 3 324.2794 364.5779 32.3036 0.2655 987 +989 3 325.2827 364.8777 32.851 0.2449 988 +990 3 326.1452 365.2598 32.6794 0.2666 989 +991 3 327.2126 365.2552 32.7712 0.2288 990 +992 3 327.9082 365.5675 34.3888 0.2456 991 +993 3 328.8542 365.8844 33.6389 0.233 992 +994 3 329.9079 366.1029 33.9643 0.1639 993 +995 3 330.7727 366.5902 33.5709 0.1525 994 +996 3 331.6422 366.8774 34.4884 0.1144 995 +997 3 332.7187 366.9998 34.9499 0.1202 996 +998 3 333.6854 367.3384 35.8439 0.1943 997 +999 3 334.5353 367.1096 35.138 0.175 998 +1000 3 335.4814 366.835 34.1099 0.2092 999 +1001 3 336.3623 367.1611 33.5208 0.2518 1000 +1002 3 337.1276 367.6816 32.3882 0.2734 1001 +1003 3 337.8712 367.7628 32.2591 0.1427 1002 +1004 3 338.6778 367.6622 33.4734 0.2347 1003 +1005 3 339.4145 367.3247 32.1992 0.3308 1004 +1006 3 339.6307 366.4232 32.4215 0.2011 1005 +1007 3 340.2931 366.5376 32.6239 0.1506 1006 +1008 3 341.3421 366.5422 31.8206 0.2058 1007 +1009 3 342.1075 366.7161 31.92 0.3307 1008 +1010 3 342.9334 367.224 32.7771 0.3351 1009 +1011 3 343.8281 367.748 32.6852 0.1729 1010 +1012 3 344.7364 367.645 34.0544 0.1652 1011 +1013 3 345.7351 367.3384 34.7774 0.4209 1012 +1014 3 346.4455 366.9014 33.9522 0.3178 1013 +1015 3 347.101 366.5639 35.4668 0.3222 1014 +1016 3 347.8835 365.8695 34.7645 0.3305 1015 +1017 3 348.9074 365.6224 34.4946 0.2994 1016 +1018 3 349.6201 365.3192 34.3185 0.2294 1017 +1019 3 350.4175 365.0824 33.0529 0.2258 1018 +1020 3 350.8637 364.3732 32.97 0.178 1019 +1021 3 351.3224 363.4888 32.6749 0.2429 1020 +1022 3 352.2296 363.4694 31.8889 0.2924 1021 +1023 3 353.1391 363.4019 31.1097 0.4057 1022 +1024 3 354.0097 363.1914 31.5011 0.1938 1023 +1025 3 354.9386 363.1056 30.3108 0.1745 1024 +1026 3 355.8355 363.1056 30.6432 0.178 1025 +1027 3 356.5024 363.2932 31.3572 0.2818 1026 +1028 3 357.5057 363.5518 31.0402 0.1804 1027 +1029 3 358.2825 363.5472 31.64 0.2034 1028 +1030 3 359.0044 362.8173 31.5025 0.2579 1029 +1031 3 359.6484 361.9708 31.36 0.1411 1030 +1032 3 360.4366 361.3004 31.8268 0.2161 1031 +1033 3 361.0716 360.9343 32.1446 0.2061 1032 +1034 3 361.8358 360.3394 32.1476 0.1907 1033 +1035 3 362.696 359.9733 31.3158 0.1786 1034 +1036 3 363.5563 359.4826 30.8 0.2948 1035 +1037 3 364.2153 358.8728 30.9005 0.2549 1036 +1038 3 364.761 358.3534 30.0868 0.1652 1037 +1039 3 365.4737 357.7231 30.2728 0.2321 1038 +1040 3 365.9793 356.8422 30.6594 0.1891 1039 +1041 3 366.8716 356.3091 30.6664 0.1875 1040 +1042 3 367.9367 356.3034 29.96 0.2484 1041 +1043 3 368.9995 356.2519 29.4608 0.1271 1042 +1044 3 369.9296 355.7623 29.6708 0.2231 1043 +1045 3 370.9706 355.4271 28.8912 0.2203 1044 +1046 3 371.7897 355.2097 29.1948 0.1144 1045 +1047 3 372.1146 354.5176 29.0657 0.2002 1046 +1048 3 372.9246 353.8346 29.4 0.1144 1047 +1049 3 373.7276 353.2214 29.2788 0.1144 1048 +1050 3 374.2173 352.2662 29.6145 0.178 1049 +1051 3 374.4758 351.3476 29.7707 0.2257 1050 +1052 3 374.8041 350.4667 29.6677 0.1757 1051 +1053 3 375.5535 349.6728 29.3412 0.1374 1052 +1054 3 376.2204 349.0824 28.7042 0.1973 1053 +1055 3 377.1779 348.6283 28.9979 0.1144 1054 +1056 3 377.9948 347.9545 28.56 0.1475 1055 +1057 3 379.0793 347.824 28.3665 0.1995 1056 +1058 3 380.1043 347.9064 28.2044 0.1707 1057 +1059 3 380.8319 347.3802 27.4327 0.1144 1058 +1060 3 381.4885 346.5119 27.9989 0.1144 1059 +1061 3 382.2756 345.7237 28.1588 0.148 1060 +1062 3 383.2537 345.2855 28.1644 0.1144 1061 +1063 3 384.1586 344.8371 28.3847 0.1649 1062 +1064 3 384.8633 344.3486 28.1022 0.1652 1063 +1065 3 385.8609 344.2319 28.5589 0.2288 1064 +1066 3 386.847 344.1152 29.3882 0.1669 1065 +1067 3 387.8595 343.8578 28.84 0.1144 1066 +1068 3 388.7301 343.756 29.8402 0.2288 1067 +1069 3 389.723 343.6622 29.0175 0.1144 1068 +1070 3 390.6783 343.772 29.6909 0.1271 1069 +1071 3 391.693 343.6599 29.2886 0.1893 1070 +1072 3 392.5464 343.0055 28.3965 0.1271 1071 +1073 3 393.3919 342.3855 27.8029 0.2227 1072 +1074 3 394.2327 341.8409 27.4509 0.136 1073 +1075 3 395.3641 341.7082 27.3224 0.1144 1074 +1076 3 396.4807 341.7471 27.5232 0.1144 1075 +1077 3 397.5411 341.9896 27.7264 0.1306 1076 +1078 3 398.5399 342.2711 27.4305 0.2408 1077 +1079 3 399.5786 342.2631 27.0824 0.1652 1078 +1080 3 400.6357 342.3683 26.8537 0.1579 1079 +1081 3 401.4994 342.0457 26.0968 0.1866 1080 +1082 3 402.5233 341.6579 26.1246 0.1144 1081 +1083 3 403.4671 341.2541 26.4256 0.178 1082 +1084 3 404.42 340.809 26.1114 0.1907 1083 +1085 3 405.3089 340.4395 26.7702 0.1837 1084 +1086 3 406.0685 339.7794 26.7064 0.1661 1085 +1087 3 407.073 339.4111 26.88 0.1882 1086 +1088 3 408.0614 339.0519 27.4232 0.1144 1087 +1089 3 409.02 338.9294 26.8265 0.2616 1088 +1090 3 410.0016 339.0233 26.0212 0.157 1089 +1091 3 411.1044 339.1731 25.6119 0.1554 1090 +1092 3 412.2015 338.9672 25.2 0.2803 1091 +1093 3 413.1453 338.6583 24.9427 0.178 1092 +1094 3 414.0628 338.4272 25.4892 0.2029 1093 +1095 3 415.1313 338.4215 25.8672 0.2249 1094 +1096 3 416.0991 338.1664 25.9473 0.215 1095 +1097 3 416.702 338.8848 26.0316 0.2151 1096 +1098 3 417.5165 339.4088 25.5066 0.3141 1097 +1099 3 418.5221 339.5438 26.1649 0.2796 1098 +1100 3 419.5803 339.6124 26.04 0.3072 1099 +1101 3 420.6705 339.4545 25.583 0.339 1100 +1102 3 421.6452 339.9099 25.8838 0.3156 1101 +1103 3 422.6336 339.9533 24.8178 0.3971 1102 +1104 3 423.5088 340.4544 25.2 0.2161 1103 +1105 3 360.9457 361.504 31.36 0.2034 1032 +1106 3 361.8369 361.6905 32.3196 0.1504 1105 +1107 3 362.5748 362.3323 31.374 0.1309 1106 +1108 3 363.5849 362.7521 31.7204 0.1169 1107 +1109 3 364.7061 362.9088 31.92 0.1499 1108 +1110 3 365.7585 363.3458 31.92 0.178 1109 +1111 3 366.8671 363.5987 31.92 0.1467 1110 +1112 3 367.8921 364.0402 31.948 0.1475 1111 +1113 3 368.8553 364.6088 31.8046 0.1877 1112 +1114 3 369.8575 365.1145 31.8534 0.1579 1113 +1115 3 370.7761 365.0847 31.4709 0.1289 1114 +1116 3 371.5197 365.1408 31.843 0.2288 1115 +1117 3 372.4098 365.3879 31.4978 0.2321 1116 +1118 3 373.1877 365.556 32.48 0.2159 1117 +1119 3 374.2207 365.8226 32.9132 0.1421 1118 +1120 3 375.1256 366.1681 31.92 0.1687 1119 +1121 3 376.1792 366.207 32.3148 0.2288 1120 +1122 3 377.0956 366.1944 33.4337 0.1382 1121 +1123 3 377.8792 366.6531 32.76 0.2536 1122 +1124 3 378.7326 367.1199 32.8205 0.2007 1123 +1125 3 379.7325 367.2343 33.551 0.2264 1124 +1126 3 380.6019 367.1611 33.4841 0.1197 1125 +1127 3 381.7162 366.9952 33.4622 0.1428 1126 +1128 3 382.8385 367.0078 33.6888 0.1399 1127 +1129 3 383.8715 367.2148 34.3179 0.1818 1128 +1130 3 384.9194 367.383 34.2345 0.1759 1129 +1131 3 385.8529 367.6816 35.0 0.1144 1130 +1132 3 386.9923 367.7399 35.0 0.1144 1131 +1133 3 387.9922 368.1392 35.2248 0.1144 1132 +1134 3 389.119 368.1392 34.9247 0.1144 1133 +1135 3 390.1852 368.2456 34.9238 0.1595 1134 +1136 3 391.2606 368.5579 35.453 0.2262 1135 +1137 3 392.3028 368.9732 35.3298 0.2005 1136 +1138 3 393.2889 369.2603 35.9719 0.2288 1137 +1139 3 394.0428 369.8895 36.7556 0.154 1138 +1140 3 394.9237 370.4764 36.1953 0.2071 1139 +1141 3 394.9305 371.1502 37.6628 0.1954 1140 +1142 3 395.0232 371.4934 36.36 0.1502 1141 +1143 3 394.7441 371.5334 34.4089 0.178 1142 +1144 3 395.3286 372.0963 33.88 0.2224 1143 +1145 3 396.1672 372.5505 33.1643 0.2288 1144 +1146 3 396.2816 373.1728 34.72 0.2161 1145 +1147 3 396.5916 372.9486 33.2268 0.1915 1145 +1148 3 397.3272 373.7151 33.1453 0.2709 1147 +1149 3 397.6944 374.5925 32.8703 0.1193 1148 +1150 3 398.3831 375.3567 32.76 0.1144 1149 +1151 3 399.3166 375.9985 32.7578 0.1144 1150 +1152 3 400.1094 376.6448 32.76 0.1144 1151 +1153 3 400.9606 377.3839 32.76 0.1144 1152 +1154 3 401.6641 378.2544 32.76 0.1334 1153 +1155 3 402.3345 379.1422 32.76 0.1469 1154 +1156 3 403.284 379.5609 33.2833 0.1244 1155 +1157 3 404.2942 380.0402 32.9918 0.2815 1156 +1158 3 405.3078 380.3445 33.0333 0.1448 1157 +1159 3 406.422 380.4063 32.6018 0.1144 1158 +1160 3 407.4802 380.7495 32.1376 0.1144 1159 +1161 3 408.4343 381.3158 31.64 0.156 1160 +1162 3 409.3163 382.0171 31.2348 0.216 1161 +1163 3 410.2075 382.7229 31.08 0.1336 1162 +1164 3 410.7818 383.6736 31.08 0.1144 1163 +1165 3 411.7382 384.201 31.1044 0.1169 1164 +1166 3 412.2496 384.7569 32.608 0.274 1165 +1167 3 413.2677 384.3977 32.226 0.1806 1166 +1168 3 414.0868 384.6128 32.1314 0.1924 1167 +1169 3 414.9929 385.0361 31.92 0.2288 1168 +1170 3 415.9607 385.5383 31.7419 0.2027 1169 +1171 3 416.6139 386.1103 31.309 0.1987 1170 +1172 3 417.4456 386.4832 32.4512 0.1793 1171 +1173 3 418.0359 386.958 31.4381 0.2283 1172 +1174 3 418.1469 387.9727 32.0832 0.3284 1173 +1175 3 419.0392 388.1592 32.8843 0.143 1174 +1176 3 419.6856 388.6168 33.6 0.1673 1175 +1177 3 420.7152 388.8044 34.4226 0.1342 1176 +1178 3 421.826 388.6248 34.72 0.1144 1177 +1179 3 422.6886 388.6168 33.3572 0.286 1178 +1180 3 423.614 388.968 33.88 0.2457 1179 +1181 3 424.4766 389.4485 33.8828 0.1628 1180 +1182 3 425.5268 389.6144 34.5685 0.2336 1181 +1183 3 426.6354 389.659 34.7354 0.3305 1182 +1184 3 427.1765 390.3351 34.694 0.4237 1183 +1185 3 427.8125 390.9689 34.9034 0.2349 1184 +1186 3 427.9933 391.9436 34.1468 0.1232 1185 +1187 3 428.5081 392.8759 34.7071 0.2105 1186 +1188 3 429.1865 393.6801 34.16 0.2678 1187 +1189 3 429.9404 394.426 34.16 0.1907 1188 +1190 3 430.5764 395.2394 33.833 0.1885 1189 +1191 3 431.1667 395.9762 33.4718 0.1941 1190 +1192 3 431.9733 396.5047 34.2622 0.2078 1191 +1193 3 432.6597 397.1808 34.72 0.115 1192 +1194 3 433.3712 397.7208 33.922 0.1566 1193 +1195 3 434.2018 398.2458 33.6748 0.2355 1194 +1196 3 434.6868 398.5673 33.6417 0.2075 1195 +1197 3 435.5837 398.4552 33.796 0.249 1196 +1198 3 436.6785 398.557 33.88 0.2418 1197 +1199 3 437.4713 398.716 33.2741 0.3112 1198 +1200 3 438.2115 398.7401 33.4642 0.1845 1199 +1201 3 439.026 398.6142 33.6924 0.2507 1200 +1202 3 439.9824 398.9128 32.76 0.1907 1201 +1203 3 394.132 370.9992 33.8898 0.2025 1143 +1204 3 393.2946 370.3071 33.4527 0.1679 1203 +1205 3 392.1941 370.0954 33.8008 0.1914 1204 +1206 3 391.0878 369.9696 33.9741 0.2203 1205 +1207 3 390.1406 370.362 34.3882 0.2174 1206 +1208 3 389.1945 370.9054 34.72 0.1649 1207 +1209 3 388.3663 371.6753 34.72 0.1873 1208 +1210 3 387.355 371.8904 35.4945 0.2288 1209 +1211 3 386.251 371.9144 35.2262 0.2288 1210 +1212 3 385.2042 372.0654 35.1434 0.2064 1211 +1213 3 384.0797 372.2507 35.0 0.2281 1212 +1214 3 382.9734 372.4864 35.373 0.1907 1213 +1215 3 381.9004 372.547 34.7393 0.2691 1214 +1216 3 380.9806 372.769 35.5846 0.2596 1215 +1217 3 380.1512 373.0206 36.0769 0.1588 1216 +1218 3 379.363 373.3341 36.8822 0.178 1217 +1219 3 378.4386 372.944 36.4 0.2543 1218 +1220 3 377.6344 373.381 35.4897 0.1287 1219 +1221 3 377.0407 374.0091 36.3947 0.2714 1220 +1222 3 376.3325 374.7252 37.2814 0.2796 1221 +1223 3 375.2995 374.954 37.5794 0.1749 1222 +1224 3 374.3969 375.4608 38.08 0.1144 1223 +1225 3 373.8329 375.9092 38.2687 0.1719 1224 +1226 3 373.6784 376.8233 37.6214 0.193 1225 +1227 3 372.8845 377.6264 37.8 0.2144 1226 +1228 3 372.07 377.9776 38.3062 0.3046 1227 +1229 3 371.2131 377.8632 39.3232 0.1144 1228 +1230 3 370.3151 377.3781 38.92 0.1846 1229 +1231 3 369.4491 377.0109 39.6841 0.1733 1230 +1232 3 368.3348 377.0624 39.76 0.2743 1231 +1233 3 367.3029 377.1768 39.3705 0.1907 1232 +1234 3 366.4209 376.8553 39.7869 0.1788 1233 +1235 3 365.5995 377.0841 41.1348 0.1374 1234 +1236 3 364.7038 377.6127 40.5958 0.1343 1235 +1237 3 364.0586 378.3185 40.0674 0.3033 1236 +1238 3 363.3344 378.537 39.44 0.3527 1237 +1239 3 362.7521 379.3069 40.2749 0.1455 1238 +1240 3 361.6195 379.3161 40.32 0.1499 1239 +1241 3 360.5247 379.2715 40.8702 0.2168 1240 +1242 3 360.1781 379.6135 39.503 0.2542 1241 +1243 3 359.7811 379.2921 37.5351 0.1652 1242 +1244 3 359.3178 379.3504 40.0089 0.2288 1243 +1245 3 359.1828 380.0013 40.04 0.2585 1244 +1246 3 358.5239 380.8422 39.949 0.2069 1245 +1247 3 358.0217 381.0389 37.8619 0.2143 1246 +1248 3 357.5927 381.484 39.968 0.2759 1247 +1249 3 356.8616 381.5537 41.3596 0.3305 1248 +1250 3 355.9293 382.048 41.1018 0.2415 1249 +1251 3 355.6639 382.3648 40.2892 0.2106 1250 +1252 3 354.9798 382.533 40.5706 0.3017 1251 +1253 3 354.0554 382.7298 40.6 0.274 1252 +1254 3 353.5658 383.4974 41.1533 0.2288 1253 +1255 3 353.0887 384.3966 40.9732 0.3051 1254 +1256 3 352.2468 385.1265 41.44 0.2288 1255 +1257 3 351.6988 385.9307 40.5871 0.3141 1256 +1258 3 351.4814 386.9065 39.76 0.3065 1257 +1259 3 350.6509 387.4511 40.0075 0.2613 1258 +1260 3 349.7666 387.784 39.7818 0.2746 1259 +1261 3 349.0744 388.4589 39.6984 0.4533 1260 +1262 3 348.2084 388.96 40.0128 0.2987 1261 +1263 3 347.6204 389.6372 39.76 0.2577 1262 +1264 3 346.5233 389.7059 40.0711 0.2288 1263 +1265 3 345.6253 389.993 40.6137 0.2288 1264 +1266 3 344.9503 390.5616 39.76 0.2415 1265 +1267 3 344.4916 390.3328 38.08 0.37 1266 +1268 3 343.5512 390.5319 37.9854 0.1907 1267 +1269 3 343.0273 391.1222 38.722 0.2019 1268 +1270 3 342.0583 391.5912 38.36 0.2664 1269 +1271 3 341.2666 391.4768 38.7943 0.2454 1270 +1272 3 340.5093 391.8966 39.6838 0.4021 1271 +1273 3 339.9213 392.2776 39.3649 0.2433 1272 +1274 3 338.9054 392.5293 40.0218 0.2702 1273 +1275 3 338.195 393.2637 40.4678 0.2825 1274 +1276 3 337.5155 393.9925 39.7645 0.2204 1275 +1277 3 337.2924 394.4844 37.5225 0.2278 1276 +1278 3 336.5351 395.1296 37.7451 0.259 1277 +1279 3 335.8326 395.8023 37.2537 0.3665 1278 +1280 3 334.8751 396.0917 37.7474 0.2337 1279 +1281 3 334.2745 396.7975 38.36 0.4065 1280 +1282 3 333.476 397.3112 37.6709 0.2161 1281 +1283 3 332.5379 397.0183 37.0154 0.2988 1282 +1284 3 331.7314 396.7392 35.84 0.232 1283 +1285 3 330.8608 397.1922 35.434 0.3559 1284 +1286 3 330.0898 397.0492 35.5359 0.3281 1285 +1287 3 329.2958 396.8639 36.2076 0.3536 1286 +1288 3 328.5259 397.1842 37.6566 0.3402 1287 +1289 3 327.6187 396.833 36.9667 0.2134 1288 +1290 3 327.1337 396.6328 35.5225 0.2619 1289 +1291 3 326.2173 396.523 34.2513 0.1913 1290 +1292 3 325.5355 396.968 34.9423 0.3365 1291 +1293 3 324.4636 397.1968 35.2884 0.3051 1292 +1294 3 323.6365 396.968 35.5902 0.2592 1293 +1295 3 322.656 396.7392 35.0154 0.1717 1294 +1296 3 321.7271 397.1968 35.2876 0.2858 1295 +1297 3 320.7879 396.8593 36.12 0.3522 1296 +1298 3 319.748 396.5104 35.84 0.2415 1297 +1299 3 318.8362 396.5504 36.9866 0.2505 1298 +1300 3 318.7207 395.9384 36.1304 0.2288 1299 +1301 3 317.9782 395.2566 35.8204 0.1753 1300 +1302 3 317.174 394.6811 35.7185 0.1697 1301 +1303 3 316.2416 394.2316 36.6596 0.1907 1302 +1304 3 315.2864 393.8792 35.84 0.2415 1303 +1305 3 319.9871 397.2597 36.0366 0.3413 1298 +1306 3 320.471 397.9987 35.2884 0.2277 1305 +1307 3 321.4262 397.9084 36.2471 0.212 1306 +1308 3 321.4423 398.5204 38.3443 0.1724 1307 +1309 3 321.6356 399.4596 38.5795 0.1209 1308 +1310 3 322.0623 400.0248 37.24 0.1983 1309 +1311 3 322.5256 400.9331 36.9874 0.2146 1310 +1312 3 322.7727 401.997 36.9496 0.1566 1311 +1313 3 323.1789 402.6788 35.3444 0.1285 1312 +1314 3 323.6033 403.26 33.8366 0.1271 1313 +1315 3 323.8675 404.1763 33.8803 0.1272 1314 +1316 3 324.6649 404.5733 34.5604 0.1206 1315 +1317 3 325.2392 404.9028 35.331 0.2477 1316 +1318 3 325.2552 406.0296 35.6014 0.2155 1317 +1319 3 325.2564 407.153 35.84 0.1928 1318 +1320 3 325.4348 408.1437 36.6506 0.1907 1319 +1321 3 325.4714 409.147 35.6468 0.1907 1320 +1322 3 325.7357 409.8769 37.1683 0.1359 1321 +1323 3 325.6968 410.8882 36.8656 0.2764 1322 +1324 3 325.8101 411.8983 35.8918 0.1894 1323 +1325 3 325.6831 413.0103 36.0612 0.3272 1324 +1326 3 325.6888 414.0902 36.251 0.4226 1325 +1327 3 325.357 415.0432 36.3311 0.3079 1326 +1328 3 325.6087 415.9595 37.6037 0.3432 1327 +1329 3 325.8043 416.8633 37.3937 0.2569 1328 +1330 3 326.0434 417.7122 37.8328 0.1174 1329 +1331 3 326.2997 418.7772 37.2907 0.1711 1330 +1332 3 326.5765 419.8526 36.6489 0.2691 1331 +1333 3 326.9563 420.666 37.4965 0.2921 1332 +1334 3 327.1211 421.5045 38.5434 0.2702 1333 +1335 3 326.7264 422.3373 37.5738 0.2895 1334 +1336 3 326.7264 423.4104 38.1671 0.3133 1335 +1337 3 326.4404 424.44 38.4423 0.3006 1336 +1338 3 326.3706 425.4158 38.7649 0.2542 1337 +1339 3 326.2791 426.4203 39.2269 0.2779 1338 +1340 3 326.4072 426.887 41.2261 0.2455 1339 +1341 3 326.6017 427.681 40.0582 0.3077 1340 +1342 3 326.6109 428.531 39.8115 0.2185 1341 +1343 3 326.6909 429.0103 40.4762 0.1832 1342 +1344 3 327.1806 429.8191 40.2114 0.1897 1343 +1345 3 327.629 430.7389 40.88 0.3048 1344 +1346 3 327.645 431.8806 40.9004 0.276 1345 +1347 3 327.756 432.758 42.0 0.1368 1346 +1348 3 327.4242 433.6904 41.7236 0.3432 1347 +1349 3 327.0296 434.3207 41.8681 0.2595 1348 +1350 3 327.0696 435.149 40.6 0.3082 1349 +1351 3 327.1771 436.0848 41.8146 0.1703 1350 +1352 3 326.8454 436.6614 42.8425 0.19 1351 +1353 3 326.5731 437.6029 43.4308 0.3303 1352 +1354 3 326.8957 438.5089 44.7199 0.1598 1353 +1355 3 327.192 439.4573 43.692 0.2063 1354 +1356 3 327.5295 440.5407 43.8869 0.3079 1355 +1357 3 328.2616 441.282 44.4058 0.2218 1356 +1358 3 328.749 442.2475 44.3265 0.1771 1357 +1359 3 328.8783 442.9568 43.5341 0.1216 1358 +1360 3 328.9458 444.0001 43.3107 0.1616 1359 +1361 3 329.7511 444.595 42.574 0.1144 1360 +1362 3 330.0772 445.6772 42.56 0.1144 1361 +1363 3 330.3758 446.7526 42.7403 0.217 1362 +1364 3 330.4055 447.1793 44.6519 0.1592 1363 +1365 3 330.7327 447.741 46.5478 0.178 1364 +1366 3 330.9569 448.6059 45.9763 0.2391 1365 +1367 3 331.1571 449.6103 45.92 0.1271 1366 +1368 3 331.3722 450.6136 46.879 0.2415 1367 +1369 3 331.4671 451.7393 47.2268 0.1965 1368 +1370 3 331.6822 452.841 47.4578 0.1586 1369 +1371 3 331.76 453.5262 47.6854 0.2073 1370 +1372 3 332.1032 454.0914 48.4089 0.3432 1371 +1373 3 332.4613 454.8636 47.88 0.3202 1372 +1374 3 332.904 455.5408 46.76 0.1907 1373 +1375 3 359.4448 378.6503 40.8708 0.1767 1244 +1376 3 359.4917 377.5406 40.3816 0.1612 1375 +1377 3 360.1918 376.7535 40.3472 0.2128 1376 +1378 3 361.2546 376.9411 40.2298 0.2358 1377 +1379 3 361.9044 376.2627 41.1191 0.2614 1378 +1380 3 362.4467 375.9642 41.515 0.2464 1379 +1381 3 363.1056 375.3796 42.1775 0.1612 1380 +1382 3 363.5632 374.485 42.2528 0.2796 1381 +1383 3 364.1832 373.7906 42.0 0.1608 1382 +1384 3 365.2426 373.4153 41.7004 0.1679 1383 +1385 3 366.1566 373.0435 42.5138 0.2146 1384 +1386 3 367.1862 372.8754 43.1015 0.249 1385 +1387 3 368.0488 372.4155 42.5309 0.2232 1386 +1388 3 368.5648 371.8675 41.9955 0.1875 1387 +1389 3 368.9114 370.9557 41.9356 0.2334 1388 +1390 3 369.695 370.966 42.2554 0.3255 1389 +1391 3 370.3025 370.1046 42.84 0.2819 1390 +1392 3 371.2715 369.6539 43.2916 0.2079 1391 +1393 3 372.3537 369.4045 43.4361 0.1677 1392 +1394 3 373.4851 369.4319 43.2706 0.2232 1393 +1395 3 374.2321 369.3976 43.7108 0.3407 1394 +1396 3 375.1336 369.1688 44.3694 0.3432 1395 +1397 3 376.0179 368.6826 44.8 0.2607 1396 +1398 3 376.376 367.8726 43.7732 0.1525 1397 +1399 3 375.9184 367.6816 43.68 0.1525 1398 +1400 3 377.1173 367.1565 44.8291 0.2423 1398 +1401 3 378.0096 366.8064 45.0825 0.1522 1400 +1402 3 378.6846 366.0949 45.1637 0.1618 1401 +1403 3 379.1685 365.3375 45.9732 0.2034 1402 +1404 3 380.0196 364.793 46.6575 0.2447 1403 +1405 3 380.6088 364.2416 47.6966 0.2091 1404 +1406 3 380.936 363.3161 47.1383 0.214 1405 +1407 3 381.4668 362.402 47.3833 0.1173 1406 +1408 3 382.2161 361.5543 47.32 0.1144 1407 +1409 3 382.9368 360.8176 47.32 0.1144 1408 +1410 3 383.9493 360.4927 47.3088 0.119 1409 +1411 3 384.7306 359.7869 47.0977 0.1446 1410 +1412 3 385.4914 359.0524 47.6 0.153 1411 +1413 3 385.8106 357.9954 47.8464 0.2034 1412 +1414 3 386.3917 357.031 47.5714 0.1292 1413 +1415 3 387.435 356.92 47.2458 0.1407 1414 +1416 3 388.5196 356.7564 47.8979 0.1375 1415 +1417 3 389.4027 356.0963 47.978 0.1217 1416 +1418 3 390.0605 355.1605 47.978 0.1144 1417 +1419 3 390.7057 354.2202 48.1034 0.1144 1418 +1420 3 391.375 353.3107 48.5416 0.1144 1419 +1421 3 392.0442 352.4 48.9796 0.1144 1420 +1422 3 392.7135 351.4894 49.4178 0.1144 1421 +1423 3 393.3827 350.5799 49.856 0.1144 1422 +1424 3 393.8918 349.5686 50.0055 0.1144 1423 +1425 3 394.3162 348.507 50.0055 0.1144 1424 +1426 3 308.8262 367.7846 31.4258 0.344 773 +1427 3 308.6134 367.0066 33.3189 0.2659 1426 +1428 3 308.2771 365.9793 33.3928 0.1979 1427 +1429 3 307.5587 365.1351 33.9052 0.1555 1428 +1430 3 307.5015 364.1112 35.028 0.1647 1429 +1431 3 307.7063 362.9958 35.3438 0.1652 1430 +1432 3 307.5209 361.901 36.0018 0.1907 1431 +1433 3 306.7819 362.076 36.2443 0.3024 1432 +1434 3 305.6722 362.3242 36.54 0.3998 1433 +1435 3 304.5923 362.2876 37.0306 0.3947 1434 +1436 3 303.5604 361.8735 37.613 0.344 1435 +1437 3 302.5445 361.536 38.4048 0.2859 1436 +1438 3 301.6888 361.0247 39.4593 0.2601 1437 +1439 3 300.9956 360.1747 40.2433 0.2542 1438 +1440 3 300.0952 359.6919 41.1124 0.2542 1439 +1441 3 299.2052 359.1279 41.8561 0.2463 1440 +1442 3 298.5771 358.215 42.4536 0.2497 1441 +1443 3 297.8004 357.4256 42.905 0.2373 1442 +1444 3 296.9698 356.6614 42.7372 0.2462 1443 +1445 3 296.1747 355.8664 42.2282 0.263 1444 +1446 3 295.5066 354.9569 42.2663 0.3212 1445 +1447 3 295.0193 353.9593 42.875 0.3524 1446 +1448 3 294.3832 353.0338 43.2312 0.3466 1447 +1449 3 293.4852 352.5762 44.2467 0.2927 1448 +1450 3 292.4567 352.5167 45.4297 0.2567 1449 +1451 3 291.7131 351.7663 46.3053 0.29 1450 +1452 3 290.9032 351.1988 47.696 0.3305 1451 +1453 3 289.861 351.2721 48.3708 0.306 1452 +1454 3 288.8497 351.7606 48.8673 0.3297 1453 +1455 3 287.8819 352.3383 49.3408 0.2924 1454 +1456 3 286.7733 352.4675 48.7295 0.2791 1455 +1457 3 285.6316 352.4801 48.5968 0.2289 1456 +1458 3 284.6569 352.654 49.8602 0.2428 1457 +1459 3 284.0792 353.2535 51.3724 0.2641 1458 +1460 3 283.1343 352.7993 51.1025 0.3226 1459 +1461 3 282.6858 352.3932 51.2627 0.3432 1460 +1462 3 282.3953 351.5112 51.8311 0.2684 1461 +1463 3 282.0818 350.7207 53.4391 0.1967 1462 +1464 3 281.0991 350.3569 52.9659 0.2988 1463 +1465 3 279.9677 350.4049 52.9491 0.2685 1464 +1466 3 279.0056 350.4335 52.08 0.2757 1465 +1467 3 278.0721 350.2493 52.7481 0.1453 1466 +1468 3 277.1397 350.4484 52.1564 0.1769 1467 +1469 3 276.1696 350.6829 51.5343 0.1329 1468 +1470 3 275.5965 351.1073 52.92 0.1549 1469 +1471 3 274.7922 351.5867 53.6547 0.1144 1470 +1472 3 273.7958 351.2881 53.333 0.3505 1471 +1473 3 272.7319 350.9414 53.1544 0.3499 1472 +1474 3 271.9929 350.2928 53.636 0.2415 1473 +1475 3 270.9141 350.1601 54.1618 0.2102 1474 +1476 3 270.1213 349.468 54.0184 0.1917 1475 +1477 3 269.3674 348.92 53.1742 0.3327 1476 +1478 3 268.7164 348.8697 51.9848 0.3432 1477 +1479 3 267.7692 348.5676 52.9592 0.2129 1478 +1480 3 266.7808 348.3663 53.8432 0.1763 1479 +1481 3 266.5051 347.4362 54.8932 0.1217 1480 +1482 3 266.2191 346.8322 54.2982 0.1535 1481 +1483 3 265.686 345.8987 53.6281 0.277 1482 +1484 3 265.3016 344.8954 53.8294 0.2388 1483 +1485 3 264.685 344.447 55.1692 0.1209 1484 +1486 3 264.566 343.6118 56.28 0.1301 1485 +1487 3 263.5193 343.653 56.2257 0.1751 1486 +1488 3 262.8935 343.3933 54.654 0.1918 1487 +1489 3 261.9051 342.9266 54.5208 0.2142 1488 +1490 3 261.1191 342.9712 54.4513 0.3135 1489 +1491 3 260.2417 342.5628 54.0876 0.2982 1490 +1492 3 259.164 342.2242 53.8779 0.2081 1491 +1493 3 258.1287 341.8055 53.6679 0.1238 1492 +1494 3 257.0065 341.7128 53.76 0.1144 1493 +1495 3 256.0409 341.5698 54.4544 0.148 1494 +1496 3 255.533 340.817 55.2919 0.1854 1495 +1497 3 255.0354 339.9716 54.5689 0.2415 1496 +1498 3 254.7928 339.6959 55.4229 0.1144 1497 +1499 3 253.7918 339.3356 56.0 0.1144 1498 +1500 3 252.7817 338.9718 56.0 0.1144 1499 +1501 3 251.9477 338.5096 55.347 0.1525 1500 +1502 3 251.0851 337.9376 55.0889 0.1144 1501 +1503 3 250.1608 337.3885 54.6378 0.1195 1502 +1504 3 249.1609 337.0224 55.4408 0.1268 1503 +1505 3 248.82 336.1701 55.72 0.1144 1504 +1506 3 248.5935 335.1359 55.72 0.1144 1505 +1507 3 247.6474 334.5765 55.72 0.1144 1506 +1508 3 246.5412 334.3912 55.72 0.1144 1507 +1509 3 245.4052 334.3363 55.72 0.1144 1508 +1510 3 244.4648 333.7448 55.72 0.1144 1509 +1511 3 243.5782 333.0424 55.6349 0.1341 1510 +1512 3 242.7202 332.3389 55.592 0.2161 1511 +1513 3 242.1493 331.5632 54.6 0.1775 1512 +1514 3 241.1975 331.1834 55.3101 0.1144 1513 +1515 3 240.2526 330.7178 55.44 0.1144 1514 +1516 3 239.7035 329.9239 55.44 0.1144 1515 +1517 3 238.6098 329.7305 55.44 0.1144 1516 +1518 3 237.6557 329.1894 55.44 0.1144 1517 +1519 3 236.7668 328.479 55.44 0.1144 1518 +1520 3 235.7658 327.9974 55.16 0.1525 1519 +1521 3 235.4352 328.5568 55.16 0.1144 1520 +1522 3 234.8609 327.6027 55.4764 0.1612 1520 +1523 3 233.821 327.1497 55.8398 0.1713 1522 +1524 3 232.7743 326.7047 56.0871 0.1722 1523 +1525 3 231.7126 326.2802 56.0871 0.1538 1524 +1526 3 230.6315 325.9794 56.0871 0.1328 1525 +1527 3 229.5367 325.8478 56.0871 0.1144 1526 +1528 3 228.514 325.3364 56.0871 0.1144 1527 +1529 3 227.5141 324.7805 56.0871 0.1144 1528 +1530 3 226.5314 324.1959 56.0871 0.1144 1529 +1531 3 225.5739 323.5701 56.0871 0.1144 1530 +1532 3 224.6152 322.9455 56.0871 0.1144 1531 +1533 3 290.3278 351.1165 47.679 0.2708 1452 +1534 3 289.4446 351.3213 48.44 0.4465 1533 +1535 3 288.8692 350.8808 48.9726 0.3231 1534 +1536 3 288.9378 349.8627 49.6104 0.1838 1535 +1537 3 288.5168 348.8182 49.84 0.1158 1536 +1538 3 288.0615 348.2233 50.6125 0.2119 1537 +1539 3 287.5124 347.8069 52.6414 0.3371 1538 +1540 3 287.4666 346.8814 54.061 0.2598 1539 +1541 3 287.0342 346.2533 55.2619 0.2531 1540 +1542 3 286.7402 345.2592 55.1911 0.3012 1541 +1543 3 286.3981 344.5934 56.4668 0.3432 1542 +1544 3 286.8008 344.3703 58.2319 0.3305 1543 +1545 3 287.1383 343.772 56.8837 0.2669 1544 +1546 3 287.9448 343.7068 58.1101 0.1539 1545 +1547 3 288.3841 343.963 59.8041 0.1144 1546 +1548 3 288.852 342.938 59.92 0.2255 1547 +1549 3 289.4228 342.239 61.0697 0.178 1548 +1550 3 290.0132 341.5412 61.0467 0.218 1549 +1551 3 290.2191 340.4636 60.7583 0.2682 1550 +1552 3 289.6608 339.7794 61.2724 0.1457 1551 +1553 3 289.1117 338.8459 61.2363 0.1701 1552 +1554 3 288.4676 338.0875 61.0095 0.15 1553 +1555 3 288.0272 337.2821 62.0203 0.3305 1554 +1556 3 288.3658 336.9663 63.5295 0.1396 1555 +1557 3 288.6667 336.0328 63.8448 0.19 1556 +1558 3 288.9744 335.2858 62.4943 0.2224 1557 +1559 3 289.4423 334.5525 63.56 0.1329 1558 +1560 3 289.5487 333.6098 63.4805 0.2288 1559 +1561 3 289.6528 332.5837 64.0836 0.2262 1560 +1562 3 290.3804 332.1032 65.2215 0.1144 1561 +1563 3 291.4477 331.863 65.5102 0.1412 1562 +1564 3 292.1479 331.0919 65.52 0.1457 1563 +1565 3 293.2896 331.045 65.52 0.1144 1564 +1566 3 294.2894 330.5691 65.52 0.1195 1565 +1567 3 295.1028 329.8632 65.4682 0.2259 1566 +1568 3 295.4975 329.1288 65.5682 0.1247 1567 +1569 3 295.621 328.7078 67.7009 0.1144 1568 +1570 3 296.4264 328.3543 66.901 0.1905 1569 +1571 3 297.0739 327.5981 66.64 0.2635 1570 +1572 3 297.4446 326.5994 67.2532 0.1256 1571 +1573 3 298.1527 325.8638 67.76 0.1144 1572 +1574 3 298.9135 325.1191 67.0289 0.1957 1573 +1575 3 299.156 324.205 67.4909 0.3051 1574 +1576 3 299.4786 323.2441 68.3516 0.3178 1575 +1577 3 299.728 322.2671 68.5404 0.1988 1576 +1578 3 300.0346 321.2238 68.3284 0.178 1577 +1579 3 299.9568 320.2342 69.3118 0.326 1578 +1580 3 299.8516 319.4025 67.8031 0.2669 1579 +1581 3 300.332 319.3625 66.0887 0.2341 1580 +1582 3 300.0712 319.9768 64.1455 0.1147 1581 +1583 3 300.0712 319.9768 61.3455 0.1144 1582 +1584 3 300.5265 319.8372 59.1923 0.1854 1583 +1585 3 300.7496 318.7344 59.08 0.2262 1584 +1586 3 300.2165 318.3489 57.801 0.2102 1585 +1587 3 300.5059 317.6213 56.56 0.2163 1586 +1588 3 300.5288 316.7519 56.3066 0.1144 1587 +1589 3 300.7954 316.2908 58.0303 0.3378 1588 +1590 3 300.5265 315.5186 59.4642 0.2684 1589 +1591 3 300.5803 314.4273 59.619 0.2201 1590 +1592 3 300.3 313.4823 58.8 0.3589 1591 +1593 3 300.872 312.6552 59.36 0.2415 1592 +1594 3 307.5392 361.6859 36.8749 0.278 1432 +1595 3 307.6594 360.7101 37.3873 0.2759 1594 +1596 3 307.6216 359.7079 36.5616 0.2277 1595 +1597 3 307.5072 358.7939 36.2776 0.2034 1596 +1598 3 307.9511 358.0342 35.0669 0.1342 1597 +1599 3 308.4224 357.1316 35.2184 0.1144 1598 +1600 3 308.2645 356.5882 37.3752 0.2288 1599 +1601 3 308.6089 355.7005 37.8725 0.3276 1600 +1602 3 308.427 354.7544 38.5445 0.2064 1601 +1603 3 308.1982 354.3014 40.2822 0.1681 1602 +1604 3 308.4144 353.2031 40.32 0.1144 1603 +1605 3 308.1833 352.352 39.5142 0.3432 1604 +1606 3 307.998 351.4665 39.6662 0.22 1605 +1607 3 307.4111 351.1279 41.1289 0.1463 1606 +1608 3 307.617 350.5308 39.4271 0.1731 1607 +1609 3 306.9043 350.1635 38.3037 0.1423 1608 +1610 3 306.4776 349.2312 38.1595 0.1488 1609 +1611 3 306.9112 348.9944 40.159 0.2481 1610 +1612 3 306.4696 348.4773 40.3231 0.2918 1611 +1613 3 305.8644 348.1352 40.7154 0.1411 1612 +1614 3 306.0394 347.5872 42.56 0.1205 1613 +1615 3 305.7912 346.8619 41.2264 0.2934 1614 +1616 3 305.8656 345.9113 40.3262 0.1279 1615 +1617 3 305.5532 345.1036 41.2087 0.126 1616 +1618 3 305.4125 344.1141 42.5216 0.1194 1617 +1619 3 305.2261 343.1165 42.9176 0.2288 1618 +1620 3 305.1197 342.1933 42.0095 0.1907 1619 +1621 3 305.2958 341.2644 43.1805 0.2871 1620 +1622 3 305.5418 340.221 42.9741 0.3178 1621 +1623 3 305.2524 339.2646 43.2849 0.1691 1622 +1624 3 305.0579 338.1607 43.12 0.2235 1623 +1625 3 305.0407 337.3278 42.7781 0.2287 1624 +1626 3 304.5236 336.4241 42.1725 0.1144 1625 +1627 3 303.9768 335.8212 43.12 0.3 1626 +1628 3 303.629 335.2618 43.68 0.1816 1627 +1629 3 303.4586 334.5228 43.0181 0.2392 1628 +1630 3 303.3144 333.8055 43.0004 0.2295 1629 +1631 3 303.732 333.1328 42.5919 0.2527 1630 +1632 3 303.7549 332.2496 42.3956 0.2529 1631 +1633 3 303.9128 331.2921 42.2422 0.2899 1632 +1634 3 304.1518 330.616 42.9332 0.2796 1633 +1635 3 303.6176 330.8448 43.4 0.1271 1634 +1636 3 304.0752 329.3656 42.9649 0.1971 1634 +1637 3 303.9379 328.4813 43.7172 0.2211 1636 +1638 3 304.0237 327.4826 43.7984 0.2288 1637 +1639 3 303.7366 326.5834 44.0798 0.2152 1638 +1640 3 303.263 326.2871 45.64 0.1391 1639 +1641 3 303.2103 325.5183 44.0255 0.2034 1640 +1642 3 303.168 324.5494 44.4763 0.2535 1641 +1643 3 303.7446 323.9934 45.6145 0.171 1642 +1644 3 304.2891 323.0736 45.472 0.1144 1643 +1645 3 304.4756 322.2202 45.36 0.1922 1644 +1646 3 303.9516 321.4102 44.5449 0.1594 1645 +1647 3 303.7583 321.035 46.7432 0.1144 1646 +1648 3 302.7836 320.6884 46.9501 0.1271 1647 +1649 3 301.7483 320.2502 46.9535 0.1866 1648 +1650 3 301.0242 319.9699 47.9032 0.2034 1649 +1651 3 300.3721 319.2355 48.314 0.414 1650 +1652 3 300.0769 318.2345 48.0668 0.3417 1651 +1653 3 300.1284 317.1614 48.44 0.3773 1652 +1654 3 300.1387 316.1215 47.8092 0.2415 1653 +1655 3 300.7576 315.5278 48.7463 0.3264 1654 +1656 3 301.3113 314.9123 50.029 0.3082 1655 +1657 3 301.9016 314.8288 50.68 0.2161 1656 +1658 4 299.8081 376.1609 30.4601 0.3051 1 +1659 4 299.3013 375.1451 30.7992 0.3564 1658 +1660 4 298.8506 374.0937 30.7941 0.4198 1659 +1661 4 298.0509 373.2769 30.7602 0.4587 1660 +1662 4 297.2352 372.4795 30.5836 0.4971 1661 +1663 4 296.5694 371.6067 29.8116 0.5346 1662 +1664 4 295.8361 370.7304 29.6834 0.5439 1663 +1665 4 295.0902 369.8655 29.6951 0.4923 1664 +1666 4 294.5285 368.8702 29.7615 0.43 1665 +1667 4 294.0446 367.8429 30.109 0.3964 1666 +1668 4 293.6465 366.8076 30.7479 0.434 1667 +1669 4 293.5138 365.6727 30.8496 0.4585 1668 +1670 4 293.3433 364.5493 31.1094 0.4703 1669 +1671 4 293.1065 363.4968 32.027 0.4692 1670 +1672 4 293.0836 362.4203 32.928 0.453 1671 +1673 4 293.0436 361.2775 33.0453 0.4068 1672 +1674 4 292.7954 360.2307 33.073 0.3705 1673 +1675 4 292.6398 359.1005 33.2525 0.3928 1674 +1676 4 292.6226 357.9999 34.0102 0.4062 1675 +1677 4 292.5528 356.8628 34.1984 0.4312 1676 +1678 4 292.2382 355.7668 34.4064 0.4322 1677 +1679 4 292.0746 354.6789 35.1644 0.4198 1678 +1680 4 291.609 353.6379 35.2895 0.3568 1679 +1681 4 291.1148 352.606 35.3405 0.3054 1680 +1682 4 290.4753 351.6633 35.5897 0.2669 1681 +1683 4 289.8759 350.9495 36.5243 0.2694 1682 +1684 4 289.3016 350.0526 37.5057 0.2357 1683 +1685 4 288.6369 349.2335 37.863 0.2288 1684 +1686 4 287.7503 348.5574 37.2428 0.254 1685 +1687 4 286.9621 347.7703 36.9382 0.2927 1686 +1688 4 286.3077 346.8471 37.2775 0.312 1687 +1689 4 285.6614 345.9147 37.5234 0.3108 1688 +1690 4 284.9979 344.9835 37.5365 0.3121 1689 +1691 4 284.2691 344.106 37.5906 0.3389 1690 +1692 4 283.4946 343.2744 37.8624 0.3701 1691 +1693 4 282.8895 342.4335 38.8769 0.3885 1692 +1694 4 282.3609 341.5046 39.6357 0.3792 1693 +1695 4 281.9056 340.4624 39.6536 0.3612 1694 +1696 4 281.5373 339.4008 39.2008 0.3559 1695 +1697 4 281.0682 338.378 38.8234 0.3636 1696 +1698 4 280.4699 337.4171 39.0328 0.3764 1697 +1699 4 279.8247 336.4939 39.5248 0.3734 1698 +1700 4 279.1943 335.5489 39.7446 0.3607 1699 +1701 4 278.7859 334.4942 39.7603 0.3479 1700 +1702 4 278.2929 333.4771 39.7625 0.3512 1701 +1703 4 277.7197 332.4876 39.7743 0.364 1702 +1704 4 277.1443 331.4992 39.8362 0.3848 1703 +1705 4 276.6535 330.4844 40.2108 0.394 1704 +1706 4 276.2188 329.4468 40.7154 0.4025 1705 +1707 4 275.7921 328.3909 40.88 0.3814 1706 +1708 4 275.4134 327.3133 40.8806 0.3346 1707 +1709 4 275.132 326.2047 40.8836 0.2579 1708 +1710 4 275.0668 325.0699 40.9055 0.2029 1709 +1711 4 274.6664 324.0426 41.0228 0.1995 1710 +1712 4 273.9697 323.2418 41.8933 0.2402 1711 +1713 4 273.4377 322.314 42.7798 0.2954 1712 +1714 4 273.0614 321.2993 42.1565 0.3375 1713 +1715 4 272.6152 320.7524 41.9695 0.2288 1714 +1716 4 272.2548 319.6954 41.6987 0.3461 1715 +1717 4 271.6851 318.8751 41.6464 0.3855 1716 +1718 4 270.9999 318.175 42.4326 0.4599 1717 +1719 4 270.4393 317.2552 43.2054 0.3625 1718 +1720 4 270.0961 316.2336 43.7791 0.3183 1719 +1721 4 269.3662 315.5095 44.4444 0.2868 1720 +1722 4 269.2621 314.6458 43.127 0.3296 1721 +1723 4 268.4659 314.0692 42.4511 0.309 1722 +1724 4 267.863 313.1952 42.014 0.4068 1723 +1725 4 267.0188 312.5099 41.5904 0.3432 1724 +1726 4 266.4113 311.7343 42.0263 0.3988 1725 +1727 4 265.9251 310.9815 41.9614 0.3432 1726 +1728 4 265.7512 310.286 43.4372 0.3489 1727 +1729 4 265.3439 309.2873 43.12 0.3051 1728 +1730 4 265.2478 308.7073 42.3116 0.2998 1729 +1731 4 264.836 308.3892 41.0894 0.3316 1730 +1732 4 265.3748 307.5633 40.9175 0.2034 1731 +1733 4 265.1792 306.6675 40.1321 0.1144 1732 +1734 4 264.8474 306.258 40.0011 0.1652 1733 +1735 4 265.2501 305.4755 41.498 0.1813 1734 +1736 4 265.702 304.6049 42.56 0.317 1735 +1737 4 265.6505 303.7446 41.993 0.1675 1736 +1738 4 266.4708 303.343 41.6858 0.2187 1737 +1739 4 267.0519 302.6258 40.7162 0.2177 1738 +1740 4 267.8413 301.9966 41.0822 0.2161 1739 +1741 4 268.5288 301.3776 41.6612 0.2288 1740 +1742 4 268.5849 300.4373 41.6147 0.2875 1741 +1743 4 269.0631 299.5736 41.7836 0.4758 1742 +1744 4 269.3914 298.9936 40.8884 0.3212 1743 +1745 4 269.8318 298.3255 41.2056 0.4036 1744 +1746 4 270.2368 297.3084 40.6137 0.2486 1745 +1747 4 270.6246 296.3692 41.0295 0.3533 1746 +1748 4 270.858 295.3854 41.8037 0.2288 1747 +1749 4 271.4449 294.6418 42.6056 0.2717 1748 +1750 4 272.3452 294.1018 42.814 0.1144 1749 +1751 4 272.4539 293.6087 40.8814 0.1646 1750 +1752 4 272.7204 292.8034 41.979 0.2878 1751 +1753 4 272.8143 291.9248 40.7901 0.3051 1752 +1754 4 273.2318 291.2544 41.5232 0.2044 1753 +1755 4 273.416 290.282 42.1518 0.1271 1754 +1756 4 272.7925 289.8461 40.8962 0.198 1755 +1757 4 272.6209 288.9836 40.3808 0.2981 1756 +1758 4 272.5752 288.4493 39.2081 0.2321 1757 +1759 4 272.6678 287.5341 40.2833 0.1348 1758 +1760 4 272.7662 286.7596 38.92 0.2034 1759 +1761 4 273.0488 286.1064 40.0319 0.1923 1760 +1762 4 272.8818 285.1271 40.3096 0.2076 1761 +1763 4 272.9584 284.2691 39.5111 0.1652 1762 +1764 4 273.5498 283.6811 40.6347 0.1144 1763 +1765 4 274.1333 282.9146 39.6525 0.135 1764 +1766 4 274.2477 281.8381 39.0757 0.2477 1765 +1767 4 274.2385 280.9481 38.3975 0.2257 1766 +1768 4 273.8381 279.9242 38.4 0.1608 1767 +1769 4 273.3542 278.9278 38.1562 0.1745 1768 +1770 4 272.8348 278.0824 38.2018 0.1922 1769 +1771 4 272.3864 277.1775 38.519 0.2669 1770 +1772 4 272.1553 276.2691 37.8008 0.1528 1771 +1773 4 271.9288 275.1984 38.4185 0.1891 1772 +1774 4 272.3086 274.4124 38.0405 0.2547 1773 +1775 4 272.5752 273.4354 38.3214 0.2034 1774 +1776 4 272.3281 272.7582 38.0467 0.2834 1775 +1777 4 271.5982 272.2411 36.9163 0.2465 1776 +1778 4 271.1303 271.5684 38.2782 0.1144 1777 +1779 4 271.6863 270.8077 37.8616 0.2034 1778 +1780 4 271.875 269.9565 36.8329 0.2258 1779 +1781 4 271.6314 269.0722 37.3332 0.1783 1780 +1782 4 271.2413 268.3206 36.2782 0.2715 1781 +1783 4 271.2104 267.5198 36.0186 0.1965 1782 +1784 4 271.128 266.7373 36.9883 0.2924 1783 +1785 4 270.9244 265.726 36.4 0.2034 1784 +1786 4 270.8992 265.8656 37.24 0.2288 1785 +1787 4 271.1166 265.1277 36.12 0.1314 1785 +1788 4 271.2378 264.2434 36.2631 0.1144 1787 +1789 4 271.1177 263.1715 36.0511 0.1252 1788 +1790 4 270.9793 262.2403 37.1862 0.1181 1789 +1791 4 271.3225 261.2484 37.2089 0.1631 1790 +1792 4 271.2424 260.5483 36.1147 0.17 1791 +1793 4 271.128 259.8768 35.3027 0.2322 1792 +1794 4 271.1841 258.9398 36.1043 0.1841 1793 +1795 4 271.4712 257.9926 35.8907 0.1635 1794 +1796 4 271.5856 257.0682 35.5264 0.1904 1795 +1797 4 271.3831 256.065 34.7922 0.1447 1796 +1798 4 271.1406 254.9987 34.7516 0.2287 1797 +1799 4 271.128 254.0572 35.4824 0.2669 1798 +1800 4 271.0216 253.4772 34.2278 0.1983 1799 +1801 4 271.0948 252.5517 34.9602 0.1636 1800 +1802 4 271.3568 251.6811 35.3447 0.178 1801 +1803 4 271.8007 250.7545 35.2814 0.216 1802 +1804 4 271.9528 249.9285 34.2157 0.1446 1803 +1805 4 272.0306 249.0728 33.32 0.2889 1804 +1806 4 272.5408 248.5855 35.0 0.2669 1805 +1807 4 272.7296 247.5856 34.1986 0.1677 1806 +1808 4 272.518 246.564 34.7589 0.2193 1807 +1809 4 272.1233 245.4978 35.0 0.269 1808 +1810 4 271.8144 244.4476 35.0297 0.2444 1809 +1811 4 271.7023 243.338 35.3186 0.1659 1810 +1812 4 271.8888 242.5291 35.0 0.247 1811 +1813 4 272.5008 241.8313 35.5236 0.2798 1812 +1814 4 273.2558 241.1815 35.6112 0.2288 1813 +1815 4 273.8278 240.2755 36.2239 0.202 1814 +1816 4 274.1264 239.2516 36.0335 0.1725 1815 +1817 4 274.3266 238.1819 36.2085 0.1144 1816 +1818 4 274.6469 237.2564 35.1226 0.1695 1817 +1819 4 275.1514 236.4614 35.7316 0.1652 1818 +1820 4 275.704 235.7212 35.5776 0.1955 1819 +1821 4 275.7646 234.6676 35.6908 0.1967 1820 +1822 4 276.1353 233.7489 36.0923 0.2556 1821 +1823 4 276.276 232.7903 35.2531 0.2288 1822 +1824 4 276.7004 231.9666 34.5369 0.3238 1823 +1825 4 276.7462 230.9644 33.6 0.2204 1824 +1826 4 276.9933 230.2346 33.8254 0.2288 1825 +1827 4 277.857 229.7072 34.16 0.1144 1826 +1828 4 277.9989 228.6215 33.8125 0.2052 1827 +1829 4 278.6956 227.8299 33.6129 0.1306 1828 +1830 4 279.3431 227.1023 33.0711 0.1512 1829 +1831 4 279.2001 226.2066 33.8484 0.2924 1830 +1832 4 279.4792 225.8256 35.0 0.2415 1831 +1833 4 264.6175 308.5723 44.3792 0.3432 1729 +1834 4 264.0352 308.1101 43.7251 0.3051 1833 +1835 4 263.4106 307.3013 43.7478 0.4046 1834 +1836 4 263.0548 306.4787 43.4862 0.2063 1835 +1837 4 262.397 305.8793 43.9267 0.1913 1836 +1838 4 261.8593 305.4263 44.24 0.3159 1837 +1839 4 261.2919 304.5145 43.7203 0.405 1838 +1840 4 261.0288 303.5158 43.5868 0.3016 1839 +1841 4 261.0768 302.5445 43.787 0.2613 1840 +1842 4 260.7874 301.8112 42.4673 0.3777 1841 +1843 4 260.705 300.8548 41.2639 0.243 1842 +1844 4 260.2474 300.0071 41.8135 0.3305 1843 +1845 4 259.8985 299.3619 43.3874 0.3813 1844 +1846 4 259.1286 298.624 42.8565 0.2601 1845 +1847 4 258.655 298.0578 43.2172 0.2669 1846 +1848 4 258.1413 297.1712 43.1343 0.3247 1847 +1849 4 257.6288 296.6392 43.96 0.3686 1848 +1850 4 257.0648 295.7469 44.8678 0.276 1849 +1851 4 256.7239 294.8706 46.3028 0.1907 1850 +1852 4 256.2205 294.4965 45.6817 0.3671 1851 +1853 4 255.8956 293.5252 45.9388 0.3934 1852 +1854 4 255.7881 292.4098 45.4096 0.3386 1853 +1855 4 255.1692 291.7989 45.0251 0.486 1854 +1856 4 254.6544 291.2521 46.5273 0.3553 1855 +1857 4 254.3512 290.576 46.132 0.2844 1856 +1858 4 253.7392 289.9376 46.058 0.1661 1857 +1859 4 253.4326 289.2673 47.7621 0.275 1858 +1860 4 253.078 288.383 47.1654 0.2204 1859 +1861 4 252.7737 287.311 46.8532 0.2094 1860 +1862 4 252.3492 286.4862 47.0719 0.3208 1861 +1863 4 252.0426 285.7254 48.1449 0.2672 1862 +1864 4 251.9752 284.9143 49.3147 0.2288 1863 +1865 4 251.2064 284.2794 50.3468 0.2288 1864 +1866 4 250.5543 283.4043 50.0458 0.3202 1865 +1867 4 249.9937 282.997 48.16 0.2812 1866 +1868 4 249.4229 282.4628 49.287 0.3432 1867 +1869 4 249.1254 281.551 49.9022 0.2796 1868 +1870 4 248.5626 281.6242 48.8846 0.1683 1869 +1871 4 247.4918 281.4274 49.5628 0.2463 1870 +1872 4 246.7505 280.7982 49.3511 0.2515 1871 +1873 4 245.8525 280.3807 50.1315 0.281 1872 +1874 4 245.2816 279.8853 50.1273 0.2169 1873 +1875 4 244.5666 279.454 49.28 0.3051 1874 +1876 4 243.6812 278.7917 49.6138 0.2918 1875 +1877 4 243.0119 278.1613 50.6066 0.3382 1876 +1878 4 242.3106 277.4028 51.2865 0.2942 1877 +1879 4 241.9754 276.657 50.4053 0.2393 1878 +1880 4 241.4755 275.7978 50.8094 0.2587 1879 +1881 4 240.7239 275.1034 51.8507 0.178 1880 +1882 4 240.2343 274.2065 52.0618 0.2288 1881 +1883 4 239.7103 273.3828 52.1007 0.2203 1882 +1884 4 239.5833 272.4505 53.1185 0.3305 1883 +1885 4 238.9473 271.9196 52.7853 0.2432 1884 +1886 4 238.5938 271.1852 53.6505 0.1971 1885 +1887 4 237.8342 270.421 53.9773 0.1652 1886 +1888 4 237.0288 270.3855 54.3074 0.2339 1887 +1889 4 236.3229 269.7529 53.5836 0.2843 1888 +1890 4 235.672 269.0185 54.2688 0.2011 1889 +1891 4 235.0623 268.2451 53.7323 0.2161 1890 +1892 4 234.568 267.3791 53.5648 0.2474 1891 +1893 4 234.1368 266.6767 54.0492 0.211 1892 +1894 4 234.0464 266.4273 56.2489 0.229 1893 +1895 4 233.7192 265.3314 56.2489 0.2516 1894 +1896 4 232.8463 264.6518 56.0311 0.2193 1895 +1897 4 232.2423 264.0752 54.9332 0.217 1896 +1898 4 231.7206 263.2699 54.9489 0.2288 1897 +1899 4 231.0102 262.9015 55.5892 0.2543 1898 +1900 4 230.794 262.2483 55.9908 0.2587 1899 +1901 4 230.6007 261.3857 56.5454 0.3432 1900 +1902 4 230.0641 260.4819 55.5845 0.2424 1901 +1903 4 229.8296 259.6251 54.5714 0.4277 1902 +1904 4 229.5962 258.7854 54.6501 0.2934 1903 +1905 4 228.8092 258.3598 55.8144 0.3215 1904 +1906 4 228.5026 257.4057 56.4029 0.2382 1905 +1907 4 228.5884 256.5981 56.84 0.1876 1906 +1908 4 228.2589 255.5055 56.8851 0.1709 1907 +1909 4 227.5942 254.7322 57.3448 0.1963 1908 +1910 4 226.8598 254.1671 56.6222 0.2669 1909 +1911 4 226.1665 253.3377 56.9898 0.1986 1910 +1912 4 225.9045 252.379 57.12 0.1984 1911 +1913 4 225.3989 251.3608 57.3017 0.2666 1912 +1914 4 225.1449 250.7328 58.3472 0.2994 1913 +1915 4 224.6438 250.1505 59.6285 0.2255 1914 +1916 4 224.621 249.2078 59.0848 0.3197 1915 +1917 4 223.9094 248.5718 59.64 0.2767 1916 +1918 4 223.8808 247.9574 59.8441 0.3122 1917 +1919 4 223.0125 247.5994 59.3158 0.2549 1918 +1920 4 222.9656 246.6464 60.48 0.3051 1919 +1921 4 222.2849 246.1327 61.6753 0.1889 1920 +1922 4 221.4841 245.5882 61.88 0.1873 1921 +1923 4 221.0059 245.0402 60.1888 0.2364 1922 +1924 4 220.4705 244.8057 60.76 0.1271 1923 +1925 4 219.6491 244.1296 60.48 0.2288 1924 +1926 4 219.2224 243.7635 62.5162 0.2321 1925 +1927 4 218.6321 243.1309 63.4094 0.2669 1926 +1928 4 218.3736 242.3232 64.4028 0.3264 1927 +1929 4 217.5625 241.7592 64.3283 0.309 1928 +1930 4 216.8155 240.9344 64.12 0.3726 1929 +1931 4 216.0696 240.0947 64.3737 0.5053 1930 +1932 4 215.4655 239.3626 65.2288 0.5131 1931 +1933 4 215.0182 238.5366 66.0988 0.4272 1932 +1934 4 214.1248 237.9451 66.5414 0.3382 1933 +1935 4 213.3743 237.1054 66.6534 0.3432 1934 +1936 4 213.4693 236.236 66.9186 0.2671 1935 +1937 4 212.6204 235.6663 65.8 0.3358 1936 +1938 4 212.4374 234.7751 66.642 0.1922 1937 +1939 4 211.7498 234.3141 67.0466 0.3437 1938 +1940 4 211.2522 233.6048 67.7359 0.482 1939 +1941 4 210.5726 232.78 67.7757 0.3434 1940 +1942 4 209.9023 232.041 67.1216 0.3281 1941 +1943 4 209.4515 231.1921 66.9393 0.3765 1942 +1944 4 208.9951 230.3776 67.6855 0.353 1943 +1945 4 208.4814 229.69 68.88 0.4491 1944 +1946 4 207.9792 228.7222 68.698 0.2569 1945 +1947 4 207.5113 228.228 69.953 0.3875 1946 +1948 4 207.0137 227.4913 70.5186 0.2924 1947 +1949 4 206.3925 226.6939 70.74 0.4721 1948 +1950 4 205.5768 225.7146 68.9307 0.2469 1949 +1951 4 205.0071 225.0488 69.7799 0.3204 1950 +1952 4 204.355 224.2858 69.19 0.2288 1951 +1953 4 203.8883 223.7607 70.6776 0.3775 1952 +1954 4 203.6961 223.0514 70.6726 0.3268 1953 +1955 4 202.9788 222.6521 71.4692 0.472 1954 +1956 4 202.6138 221.6969 71.6864 0.3536 1955 +1957 4 201.9743 221.0116 72.142 0.3725 1956 +1958 4 201.36 220.1559 71.2379 0.2436 1957 +1959 4 201.1838 219.9088 72.266 0.1144 1958 +1960 4 200.812 219.171 73.67 0.1657 1959 +1961 4 200.2892 218.226 74.403 0.1977 1960 +1962 4 199.8465 217.2227 73.7769 0.2776 1961 +1963 4 199.5228 216.3704 72.6037 0.2765 1962 +1964 4 198.8009 215.5696 72.4802 0.394 1963 +1965 4 198.2403 214.6624 72.0619 0.2288 1964 +1966 4 198.0161 214.0893 74.1482 0.2818 1965 +1967 4 197.5082 213.3343 75.0126 0.4173 1966 +1968 4 196.9167 212.538 74.6911 0.2423 1967 +1969 4 196.5472 211.7372 75.3514 0.3432 1968 +1970 4 195.9706 211.0211 75.7884 0.4558 1969 +1971 4 195.6549 210.1459 75.7711 0.3156 1970 +1972 4 194.9628 209.7684 74.2092 0.4919 1971 +1973 4 194.5944 208.8052 75.0795 0.395 1972 +1974 4 194.2237 207.9346 75.8545 0.4263 1973 +1975 4 192.9001 206.7242 77.1 0.4235 1974 +1976 4 192.4151 206.031 77.5869 0.3298 1975 +1977 4 191.8946 205.3903 77.3111 0.2567 1976 +1978 4 191.5708 204.6536 77.28 0.2584 1977 +1979 4 190.8604 203.9763 77.9212 0.5339 1978 +1980 4 190.7689 203.4467 79.8238 0.3861 1979 +1981 4 190.2472 202.7317 80.0873 0.4454 1980 +1982 4 190.0276 201.7055 80.2984 0.3557 1981 +1983 4 189.2473 201.1518 80.0103 0.3756 1982 +1984 4 189.0071 200.3945 78.5932 0.3821 1983 +1985 4 188.7646 199.9083 80.1206 0.2245 1984 +1986 4 188.2612 199.2287 79.6816 0.3159 1985 +1987 4 187.3437 198.7471 79.002 0.4299 1986 +1988 4 186.6425 197.9566 79.469 0.3586 1987 +1989 4 185.9526 197.4601 80.3799 0.4454 1988 +1990 4 185.5728 197.1981 82.04 0.4195 1989 +1991 4 185.1312 196.1903 82.2343 0.3686 1990 +1992 4 184.3464 195.4181 82.7114 0.3313 1991 +1993 4 183.6074 194.623 83.4165 0.3811 1992 +1994 4 183.3294 193.5476 83.72 0.4602 1993 +1995 4 182.7197 192.732 83.5853 0.3615 1994 +1996 4 182.1214 191.8294 83.8956 0.353 1995 +1997 4 181.4773 191.1384 82.88 0.3813 1996 +1998 4 180.9716 190.2094 82.9116 0.3038 1997 +1999 4 180.315 189.4178 82.88 0.3704 1998 +2000 4 179.608 189.0014 83.54 0.2319 1999 +2001 4 179.3998 188.1811 84.5513 0.3051 2000 +2002 4 178.9124 187.33 84.6866 0.3691 2001 +2003 4 178.0201 186.758 84.9971 0.3392 2002 +2004 4 177.5728 185.8245 84.84 0.2953 2003 +2005 4 177.0923 184.8773 84.0062 0.4058 2004 +2006 4 176.6096 184.0833 84.0118 0.321 2005 +2007 4 175.8397 183.4953 84.5995 0.4174 2006 +2008 4 175.4873 182.9439 85.8561 0.3348 2007 +2009 4 174.9336 182.158 86.6746 0.2415 2008 +2010 4 174.6774 181.324 85.9636 0.4307 2009 +2011 4 174.3399 180.5953 87.08 0.3747 2010 +2012 4 173.6386 179.934 86.8935 0.4109 2011 +2013 4 173.3812 178.9754 86.8045 0.3424 2012 +2014 4 173.0769 178.3324 87.3152 0.2388 2013 +2015 4 172.8287 177.423 86.133 0.3051 2014 +2016 4 172.0576 176.6977 86.5354 0.4068 2015 +2017 4 171.6938 176.128 88.2837 0.3386 2016 +2018 4 171.1985 175.2608 89.0798 0.2352 2017 +2019 4 170.6619 174.6831 89.7005 0.3368 2018 +2020 4 170.1563 173.745 88.7788 0.2916 2019 +2021 4 169.5076 173.054 89.32 0.3295 2020 +2022 4 169.0729 172.3802 88.2059 0.3099 2021 +2023 4 168.3373 171.695 88.4366 0.1781 2022 +2024 4 167.5834 171.2614 89.6221 0.3887 2023 +2025 4 167.0675 170.5761 90.72 0.3487 2024 +2026 4 166.6922 169.5774 90.9504 0.2736 2025 +2027 4 166.0104 168.6805 90.8214 0.3615 2026 +2028 4 165.5334 167.8648 89.4449 0.4909 2027 +2029 4 164.776 167.2093 89.5843 0.4261 2028 +2030 4 164.2018 166.2575 89.6132 0.3665 2029 +2031 4 163.8826 165.6604 91.0482 0.337 2030 +2032 4 163.7007 164.641 90.5915 0.3375 2031 +2033 4 163.3964 163.616 91.0115 0.2341 2032 +2034 4 163.3312 162.7351 91.56 0.2229 2033 +2035 4 162.8347 161.9069 91.9881 0.3491 2034 +2036 4 162.0785 161.137 92.694 0.2981 2035 +2037 4 161.1759 160.5066 93.1837 0.2377 2036 +2038 4 160.7595 159.5045 93.2467 0.2034 2037 +2039 4 160.2561 158.5721 93.7045 0.2094 2038 +2040 4 159.7493 157.9235 93.0404 0.2898 2039 +2041 4 159.461 156.9625 93.5558 0.2677 2040 +2042 4 159.135 156.029 94.5098 0.2206 2041 +2043 4 158.6042 155.1664 95.1686 0.1738 2042 +2044 4 158.2884 154.0888 94.92 0.1192 2043 +2045 4 157.753 153.2171 95.2812 0.3227 2044 +2046 4 157.4236 152.1291 95.2 0.3284 2045 +2047 4 157.0575 151.0549 95.4198 0.2915 2046 +2048 4 156.6616 150.198 96.8103 0.2605 2047 +2049 4 156.2304 149.3995 97.7693 0.2601 2048 +2050 4 155.7579 148.5976 97.071 0.3911 2049 +2051 4 155.3323 147.7636 96.9422 0.3122 2050 +2052 4 154.8976 146.9548 98.4326 0.1401 2051 +2053 4 154.3245 146.0613 98.84 0.1144 2052 +2054 4 153.6049 145.3143 98.8308 0.1182 2053 +2055 4 152.8155 144.5398 98.4931 0.1898 2054 +2056 4 152.2458 143.5926 98.7792 0.1846 2055 +2057 4 151.5537 142.8616 99.12 0.3122 2056 +2058 4 150.7563 142.2644 98.7109 0.2288 2057 +2059 4 149.9933 141.8331 99.6128 0.2669 2058 +2060 4 149.7004 140.9419 100.6138 0.3392 2059 +2061 4 149.3698 139.9329 101.39 0.2084 2060 +2062 4 149.1593 138.8553 102.0124 0.124 2061 +2063 4 148.5187 137.9264 102.2 0.1144 2062 +2064 4 147.6549 137.3143 102.4666 0.1144 2063 +2065 4 146.9937 136.4243 102.48 0.1336 2064 +2066 4 146.4755 135.4599 102.7869 0.1725 2065 +2067 4 146.2146 134.4349 103.1414 0.1635 2066 +2068 4 145.7559 133.5448 103.9004 0.1144 2067 +2069 4 145.3418 132.5198 104.16 0.1144 2068 +2070 4 144.4769 131.8952 104.2272 0.1225 2069 +2071 4 143.7081 131.1173 104.4291 0.2116 2070 +2072 4 143.5617 130.5693 106.3866 0.167 2071 +2073 4 143.1201 129.7182 106.6985 0.1939 2072 +2074 4 142.7815 128.7927 106.2384 0.2288 2073 +2075 4 142.4257 127.8614 106.7878 0.1907 2074 +2076 4 142.0779 127.0458 107.8 0.1714 2075 +2077 4 141.7038 125.9922 107.7997 0.1907 2076 +2078 4 141.0678 125.109 107.8246 0.1325 2077 +2079 4 140.2292 124.5278 108.5468 0.1144 2078 +2080 4 139.4547 123.7064 108.64 0.1144 2079 +2081 4 138.8587 122.9651 109.482 0.1144 2080 +2082 4 138.5338 122.0202 109.9134 0.1312 2081 +2083 4 137.9515 121.089 110.2469 0.1191 2082 +2084 4 137.1919 120.3133 111.0547 0.1514 2083 +2085 4 136.7034 119.3112 111.517 0.2034 2084 +2086 4 136.16 118.3376 112.0 0.162 2085 +2087 4 136.033 117.3241 112.572 0.116 2086 +2088 4 136.2298 116.2876 113.3457 0.1341 2087 +2089 4 136.0857 115.1791 113.68 0.1487 2088 +2090 4 135.7676 114.0822 113.68 0.2288 2089 +2091 4 135.3981 113.5568 113.96 0.3382 2090 +2092 4 134.8776 112.7799 114.7471 0.3216 2091 +2093 4 134.8421 111.7206 115.0932 0.265 2092 +2094 4 135.4416 110.8978 115.4829 0.2255 2093 +2095 4 135.6933 110.0838 114.0 0.2614 2094 +2096 4 135.6784 109.1147 114.408 0.2728 2095 +2097 4 135.9644 108.3403 116.1345 0.2731 2096 +2098 4 135.7734 107.3832 116.247 0.2754 2097 +2099 4 135.8157 106.3778 116.713 0.1801 2098 +2100 4 135.7562 105.2764 117.2979 0.2305 2099 +2101 4 135.4313 104.1866 117.4362 0.2765 2100 +2102 4 135.1762 103.141 118.1471 0.2258 2101 +2103 4 134.6808 102.7232 116.5688 0.1973 2102 +2104 4 134.6305 101.8254 115.64 0.2256 2103 +2105 4 134.6488 100.7918 116.0944 0.1144 2104 +2106 4 134.6911 100.0884 117.6512 0.148 2105 +2107 4 134.7815 99.3526 118.72 0.3813 2106 +2108 4 135.2116 98.4157 118.2686 0.3241 2107 +2109 4 135.2437 97.7976 116.3408 0.2519 2108 +2110 4 135.54 96.8788 117.32 0.1947 2109 +2111 4 135.6384 96.0939 116.9518 0.2655 2110 +2112 4 135.5686 95.3231 116.0323 0.2111 2111 +2113 4 135.961 94.9299 114.4307 0.2341 2112 +2114 4 136.247 93.8935 113.96 0.2448 2113 +2115 4 136.3568 92.8218 114.1753 0.2625 2114 +2116 4 136.4529 91.8987 115.36 0.1849 2115 +2117 4 137.0512 91.0443 115.5636 0.2385 2116 +2118 4 136.9402 90.948 118.258 0.1332 2117 +2119 4 136.9368 90.9226 121.0527 0.1144 2118 +2120 4 137.0512 90.5832 123.489 0.1144 2119 +2121 4 137.0638 89.7208 125.1228 0.1144 2120 +2122 4 137.0215 89.0255 127.1393 0.1349 2121 +2123 4 137.0592 88.0054 127.9911 0.2262 2122 +2124 4 137.1805 86.96 128.7784 0.1232 2123 +2125 4 137.8566 86.1886 129.0635 0.1719 2124 +2126 4 138.0808 85.5975 129.8321 0.2235 2125 +2127 4 138.6082 84.7646 130.188 0.1144 2126 +2128 4 139.2008 83.8653 130.76 0.2266 2127 +2129 4 139.465 83.1791 129.3804 0.1773 2128 +2130 4 140.2121 82.5405 129.2609 0.1562 2129 +2131 4 140.8264 81.6683 129.08 0.1182 2130 +2132 4 141.6215 80.9534 129.0187 0.1144 2131 +2133 4 142.5664 80.3992 128.5889 0.1144 2132 +2134 4 143.1178 79.4848 128.3582 0.1144 2133 +2135 4 143.2288 78.4465 128.4875 0.1144 2134 +2136 4 143.0149 77.6787 129.3454 0.1675 2135 +2137 4 143.1522 77.233 131.0431 0.2472 2136 +2138 4 143.4702 76.4309 132.16 0.2478 2137 +2139 4 143.8706 75.5771 132.6601 0.2069 2138 +2140 4 143.7962 74.8564 134.1166 0.1254 2139 +2141 4 143.3032 74.0542 135.2425 0.1144 2140 +2142 4 143.0801 73.2361 136.2155 0.1468 2141 +2143 4 143.2174 72.1136 136.08 0.2382 2142 +2144 4 143.4576 71.3856 136.64 0.1398 2143 +2145 4 135.3993 113.6063 114.2098 0.3051 2090 +2146 4 134.6705 113.0582 113.1259 0.2772 2145 +2147 4 134.2839 112.9949 114.6107 0.3276 2146 +2148 4 133.7771 112.7324 116.48 0.2415 2147 +2149 4 133.0724 112.0937 117.7081 0.2775 2148 +2150 4 132.9751 111.1348 118.6234 0.2504 2149 +2151 4 132.3414 110.3951 118.454 0.1563 2150 +2152 4 131.56 110.0009 119.576 0.273 2151 +2153 4 131.2111 109.3296 121.2224 0.1453 2152 +2154 4 130.6368 108.7944 122.2931 0.2055 2153 +2155 4 129.9607 108.2954 121.2926 0.265 2154 +2156 4 129.5225 107.9852 122.703 0.1314 2155 +2157 4 129.725 107.3733 124.2497 0.1478 2156 +2158 4 129.2892 106.8544 123.7054 0.2288 2157 +2159 4 128.5948 106.3221 124.88 0.2314 2158 +2160 4 128.3431 105.2986 125.5346 0.1652 2159 +2161 4 127.4553 104.8079 126.28 0.1144 2160 +2162 4 126.8971 104.0031 127.073 0.2605 2161 +2163 4 125.9418 103.4019 127.12 0.2765 2162 +2164 4 125.1742 102.8517 127.9116 0.1907 2163 +2165 4 124.4523 102.6348 129.64 0.1271 2164 +2166 4 123.5692 101.9666 129.92 0.1333 2165 +2167 4 122.8233 101.3039 130.7348 0.1265 2166 +2168 4 121.8028 100.8097 130.76 0.131 2167 +2169 4 120.9437 100.4054 131.224 0.2008 2168 +2170 4 120.0754 99.7797 130.6836 0.1849 2169 +2171 4 119.4061 99.3095 129.1987 0.1302 2170 +2172 4 118.515 99.143 128.6659 0.1144 2171 +2173 4 117.6696 98.5148 128.24 0.1144 2172 +2174 4 116.5496 98.384 128.4363 0.1144 2173 +2175 4 115.409 98.384 128.52 0.1194 2174 +2176 4 114.5167 98.384 129.7778 0.1619 2175 +2177 4 113.8957 98.4984 132.0063 0.2288 2176 +2178 4 113.0108 98.9001 132.0852 0.2868 2177 +2179 4 112.0936 99.2735 131.3301 0.2418 2178 +2180 4 111.1802 99.3057 131.068 0.2135 2179 +2181 4 110.123 99.362 131.0397 0.2287 2180 +2182 4 109.268 99.4342 132.02 0.2431 2181 +2183 4 108.3749 99.0196 131.6311 0.3178 2182 +2184 4 107.9407 98.8416 132.7418 0.3199 2183 +2185 4 107.5813 98.384 132.7782 0.1477 2184 +2186 4 107.269 98.023 131.2394 0.2898 2185 +2187 4 106.4616 97.3663 131.6078 0.1263 2186 +2188 4 105.8261 97.391 133.2612 0.1144 2187 +2189 4 105.6227 96.6324 133.56 0.1271 2188 +2190 4 105.4783 95.6784 132.9051 0.1907 2189 +2191 4 104.7904 95.5017 131.4712 0.1504 2190 +2192 4 104.719 94.465 130.975 0.2004 2191 +2193 4 104.7546 93.4246 131.0512 0.1788 2192 +2194 4 104.9176 92.3282 131.0501 0.1566 2193 +2195 4 105.1714 91.5068 129.8564 0.1522 2194 +2196 4 104.9646 90.7354 129.5868 0.2288 2195 +2197 4 105.1305 90.376 131.8929 0.1715 2196 +2198 4 105.0192 89.9533 133.387 0.313 2197 +2199 4 104.676 89.1177 132.6399 0.1953 2198 +2200 4 104.4472 88.307 133.5298 0.2743 2199 +2201 4 104.3328 87.3038 132.4621 0.2692 2200 +2202 4 104.0619 86.414 130.9991 0.1921 2201 +2203 4 103.2351 85.8715 130.3224 0.2015 2202 +2204 4 103.0362 85.1773 128.8319 0.1907 2203 +2205 4 103.293 84.8392 127.1651 0.155 2204 +2206 4 103.6284 83.8574 126.84 0.1981 2205 +2207 4 102.9944 83.0582 127.132 0.1682 2206 +2208 4 102.325 82.3305 126.9036 0.3387 2207 +2209 4 102.1894 81.4099 126.5561 0.1382 2208 +2210 4 101.5258 80.9671 124.6666 0.2407 2209 +2211 4 101.2654 80.3004 123.9762 0.1228 2210 +2212 4 101.538 79.6142 124.1198 0.2542 2211 +2213 4 101.5872 78.8216 124.04 0.2542 2212 +2214 4 107.6236 98.956 132.314 0.249 2183 +2215 4 107.0173 99.6743 131.8738 0.2094 2214 +2216 4 106.4612 100.224 130.5581 0.1718 2215 +2217 4 105.7241 100.6961 131.5591 0.1652 2216 +2218 4 105.3258 101.2052 133.0 0.2547 2217 +2219 4 104.5105 101.914 132.7306 0.2672 2218 +2220 4 103.7482 102.3552 133.7563 0.1605 2219 +2221 4 103.0297 102.8874 134.3734 0.1922 2220 +2222 4 102.4516 103.6337 134.0268 0.2288 2221 +2223 4 101.816 103.9133 134.2132 0.2288 2222 +2224 4 101.6215 104.0517 134.9334 0.1416 2222 +2225 4 100.8323 104.4483 134.7819 0.2519 2224 +2226 4 100.2006 104.9818 135.4564 0.1777 2225 +2227 4 99.5304 105.5897 134.6374 0.1144 2226 +2228 4 99.1649 106.396 135.5973 0.142 2227 +2229 4 98.4944 106.9781 136.8906 0.1144 2228 +2230 4 97.8302 107.3853 138.1134 0.2188 2229 +2231 4 97.2462 107.7832 139.806 0.1657 2230 +2232 4 97.0504 108.4184 139.7536 0.2012 2231 +2233 4 96.6121 109.1376 140.4455 0.2718 2232 +2234 4 96.2954 109.7806 141.9558 0.2051 2233 +2235 4 95.3715 109.824 143.2668 0.2034 2234 +2236 4 94.4802 110.2816 143.5031 0.2134 2235 +2237 4 93.6863 110.4196 144.8868 0.1568 2236 +2238 4 93.1176 111.073 144.9384 0.1398 2237 +2239 4 92.3406 110.968 143.7419 0.2631 2238 +2240 4 91.5187 110.8489 145.4379 0.1954 2239 +2241 4 90.5336 110.5398 146.5738 0.1652 2240 +2242 4 89.9027 110.7393 148.6492 0.178 2241 +2243 4 88.9348 111.0824 147.9848 0.2539 2242 +2244 4 87.9145 110.9666 146.886 0.1586 2243 +2245 4 86.8543 111.2734 146.7357 0.1652 2244 +2246 4 85.9644 111.8899 147.499 0.1652 2245 +2247 4 85.1134 112.2264 148.4115 0.1905 2246 +2248 4 84.7254 112.2592 150.6086 0.1499 2247 +2249 4 83.9685 112.6759 151.5816 0.2261 2248 +2250 4 83.2832 112.4552 149.8 0.1525 2249 +2251 4 223.8064 247.0079 61.161 0.2799 1920 +2252 4 224.224 247.9048 59.92 0.2796 2251 +2253 4 248.3876 280.598 49.28 0.3178 1869 +2254 4 248.5306 279.4792 50.3552 0.2932 2253 +2255 4 249.3497 278.9861 51.3752 0.2613 2254 +2256 4 249.1907 278.0355 50.5926 0.1907 2255 +2257 4 249.5064 277.1512 51.711 0.242 2256 +2258 4 249.527 276.2806 52.5893 0.2756 2257 +2259 4 250.3232 275.6662 51.8263 0.138 2258 +2260 4 250.5463 274.6538 52.3508 0.2656 2259 +2261 4 250.9032 273.8999 52.4465 0.1332 2260 +2262 4 250.8792 272.812 52.92 0.1707 2261 +2263 4 251.227 271.8853 53.2734 0.2374 2262 +2264 4 251.6583 271.239 53.7068 0.2372 2263 +2265 4 251.7944 270.4576 54.2497 0.2288 2264 +2266 4 251.7944 269.5447 55.0642 0.2288 2265 +2267 4 251.68 268.8469 54.962 0.3373 2266 +2268 4 252.1902 268.165 55.5307 0.115 2267 +2269 4 252.7222 267.3551 54.7929 0.2075 2268 +2270 4 253.1478 266.5394 56.1554 0.2224 2269 +2271 4 253.7323 265.6059 56.203 0.2669 2270 +2272 4 253.396 264.725 56.5452 0.2542 2271 +2273 4 253.1066 263.7778 56.3046 0.2288 2272 +2274 4 253.6751 262.8489 56.3634 0.2504 2273 +2275 4 254.3112 262.2197 56.6989 0.3893 2274 +2276 4 254.6544 261.404 58.002 0.2911 2275 +2277 4 254.5812 260.3504 57.6265 0.1184 2276 +2278 4 253.9188 259.9088 56.7602 0.1326 2277 +2279 4 253.7312 259.3448 57.5523 0.3715 2278 +2280 4 253.865 258.5577 57.1096 0.178 2279 +2281 4 254.8043 258.417 57.148 0.323 2280 +2282 4 255.6325 258.0944 58.0398 0.2039 2281 +2283 4 256.3315 257.4389 58.3862 0.1652 2282 +2284 4 257.3451 257.154 58.7997 0.2627 2283 +2285 4 258.147 256.8612 60.1888 0.1785 2284 +2286 4 259.1412 256.4848 60.2 0.243 2285 +2287 4 259.8859 256.8989 61.3021 0.3069 2286 +2288 4 260.641 257.5144 62.6268 0.1907 2287 +2289 4 261.4395 258.1802 63.7185 0.2503 2288 +2290 4 261.9463 257.8656 65.1568 0.1144 2289 +2291 4 262.4691 258.3827 66.36 0.1144 2290 +2292 4 263.1543 258.7579 64.6996 0.1968 2291 +2293 4 264.0146 259.0165 63.9954 0.2161 2292 +2294 4 265.0065 259.4295 63.84 0.2722 2293 +2295 4 265.6746 259.5976 65.3114 0.269 2294 +2296 4 266.5074 259.4558 65.9789 0.2196 2295 +2297 4 267.0714 258.6778 66.6439 0.2637 2296 +2298 4 268.0232 258.6275 67.4579 0.1433 2297 +2299 4 268.6318 257.9663 67.7295 0.2168 2298 +2300 4 269.5687 257.376 68.2223 0.2438 2299 +2301 4 270.3261 256.8337 68.8433 0.1525 2300 +2302 4 270.1476 256.6084 66.3426 0.1834 2301 +2303 4 270.7871 256.5981 65.24 0.1525 2302 +2304 4 271.128 256.4699 66.9774 0.2399 2303 +2305 4 271.5822 256.3326 69.3199 0.3499 2304 +2306 4 272.4619 255.9757 69.1911 0.233 2305 +2307 4 272.9447 255.3934 70.7585 0.1144 2306 +2308 4 273.416 254.8409 70.0694 0.2082 2307 +2309 4 274.0704 254.2048 70.6558 0.2043 2308 +2310 4 275.0691 253.8067 70.5488 0.2692 2309 +2311 4 275.7189 252.951 70.8397 0.2028 2310 +2312 4 276.7176 252.7004 70.4701 0.1144 2311 +2313 4 277.2701 252.4808 72.3192 0.1144 2312 +2314 4 278.2803 252.1765 73.1259 0.1223 2313 +2315 4 279.311 251.7361 73.36 0.1673 2314 +2316 4 280.0798 250.9456 73.8038 0.1907 2315 +2317 4 280.5786 250.0315 74.1401 0.2049 2316 +2318 4 281.4801 249.6208 73.64 0.1314 2317 +2319 4 282.1104 248.9722 74.7093 0.2135 2318 +2320 4 282.1928 247.9677 74.8362 0.2397 2319 +2321 4 282.7385 247.255 75.9433 0.2288 2320 +2322 4 283.4706 246.8672 76.979 0.1185 2321 +2323 4 283.7028 245.7884 76.72 0.1144 2322 +2324 4 283.9294 244.6913 76.72 0.1144 2323 +2325 4 284.8308 244.0381 76.7138 0.1144 2324 +2326 4 285.3056 243.1229 76.44 0.1144 2325 +2327 4 285.4886 242.4159 77.8445 0.1507 2326 +2328 4 285.476 241.6082 78.1063 0.2577 2327 +2329 4 286.1659 240.7708 78.4 0.2346 2328 +2330 4 286.4793 239.8339 79.2714 0.1907 2329 +2331 4 287.4254 239.2973 79.3766 0.2703 2330 +2332 4 288.4093 238.9187 80.0892 0.1144 2331 +2333 4 288.6552 238.2758 82.0187 0.1994 2332 +2334 4 289.3336 238.1808 80.421 0.1743 2333 +2335 4 289.7626 237.6145 78.797 0.3321 2334 +2336 4 290.2408 237.7918 79.8389 0.1907 2335 +2337 4 290.8208 237.0265 81.3596 0.1907 2336 +2338 4 291.402 236.2612 82.88 0.1907 2337 +2339 4 291.768 235.8928 83.5344 0.1144 2338 +2340 4 292.2703 235.7292 85.9606 0.1144 2339 +2341 4 292.5723 234.9776 87.0643 0.1144 2340 +2342 4 292.6352 233.853 86.8 0.1144 2341 +2343 4 292.6352 232.709 86.8 0.1144 2342 +2344 4 292.6283 231.5868 87.0794 0.1405 2343 +2345 4 292.7496 230.7448 87.92 0.178 2344 +2346 4 291.1549 236.3698 82.885 0.1265 2338 +2347 4 290.7076 237.1066 84.3951 0.2151 2346 +2348 4 290.2328 237.7232 85.68 0.1525 2347 +2349 4 260.3744 257.5144 63.0 0.1652 2288 +2350 4 247.8796 280.4196 48.72 0.2415 2253 +2351 4 256.0112 296.6975 44.9501 0.3236 1849 +2352 4 254.9015 296.7364 45.6288 0.2929 2351 +2353 4 253.9497 296.8577 44.9366 0.3467 2352 +2354 4 253.0974 296.7479 45.8354 0.1963 2353 +2355 4 252.562 297.4995 45.8088 0.2974 2354 +2356 4 252.061 298.2625 46.1437 0.1754 2355 +2357 4 251.7178 298.9272 45.7472 0.281 2356 +2358 4 251.0188 299.7028 46.1378 0.2444 2357 +2359 4 250.8792 300.5288 45.9091 0.1265 2358 +2360 4 250.3484 300.9715 45.1931 0.1144 2359 +2361 4 249.4892 301.0676 46.3456 0.1811 2360 +2362 4 248.4951 300.9864 46.9482 0.1591 2361 +2363 4 247.5307 301.1443 46.9288 0.2089 2362 +2364 4 246.5 301.2198 46.762 0.178 2363 +2365 4 245.4887 301.6248 47.0109 0.1915 2364 +2366 4 244.6021 302.0492 46.2 0.1165 2365 +2367 4 244.3801 302.9049 46.5077 0.2556 2366 +2368 4 243.863 303.8075 47.2077 0.1602 2367 +2369 4 243.4729 304.5568 46.9384 0.1739 2368 +2370 4 243.4672 305.6127 46.7082 0.2855 2369 +2371 4 243.5542 306.4707 47.4116 0.3405 2370 +2372 4 243.577 307.3951 48.5206 0.3191 2371 +2373 4 243.9992 308.1318 48.7589 0.2129 2372 +2374 4 243.5576 308.8972 48.5593 0.1179 2373 +2375 4 243.5576 309.6362 46.7286 0.2052 2374 +2376 4 243.2144 310.4267 45.4168 0.1329 2375 +2377 4 243.434 311.3648 45.8693 0.2063 2376 +2378 4 243.4066 312.0512 47.6 0.2262 2377 +2379 4 243.0108 313.0728 47.1414 0.1305 2378 +2380 4 242.5349 313.9571 46.5548 0.2086 2379 +2381 4 242.1676 315.0187 46.4145 0.2542 2380 +2382 4 241.8256 315.99 45.876 0.1723 2381 +2383 4 241.1884 316.8388 45.64 0.2481 2382 +2384 4 240.1233 317.1145 45.6218 0.1734 2383 +2385 4 239.3202 317.3811 45.1825 0.1563 2384 +2386 4 238.349 317.6934 45.1732 0.1953 2385 +2387 4 237.7953 318.612 45.5972 0.1612 2386 +2388 4 237.2816 319.5112 44.8636 0.1991 2387 +2389 4 236.4648 320.185 44.8146 0.1443 2388 +2390 4 235.7201 320.6666 44.24 0.1144 2389 +2391 4 235.1606 321.6642 44.24 0.1144 2390 +2392 4 234.544 322.5565 43.701 0.1144 2391 +2393 4 234.099 323.5735 43.96 0.1144 2392 +2394 4 233.9354 324.6786 43.7427 0.1144 2393 +2395 4 233.1426 325.2792 43.68 0.1144 2394 +2396 4 232.7811 326.3386 43.615 0.1144 2395 +2397 4 232.0032 326.9792 43.4 0.1144 2396 +2398 4 231.6714 328.002 43.4 0.1144 2397 +2399 4 231.3637 329.0762 43.4 0.1144 2398 +2400 4 231.1429 330.1264 43.209 0.1144 2399 +2401 4 230.7723 330.7579 42.6717 0.2008 2400 +2402 4 230.6304 331.7543 43.4437 0.1678 2401 +2403 4 230.5961 332.8846 43.12 0.1398 2402 +2404 4 230.341 333.9828 43.4 0.1489 2403 +2405 4 229.9543 335.0318 43.12 0.1244 2404 +2406 4 229.7484 336.1381 43.12 0.1144 2405 +2407 4 229.5711 337.2649 43.12 0.1144 2406 +2408 4 229.4864 338.346 42.5877 0.1144 2407 +2409 4 229.0723 339.3539 43.12 0.1144 2408 +2410 4 229.0288 340.4544 43.12 0.1144 2409 +2411 4 290.1184 350.8454 35.0 0.3686 1682 +2412 4 290.4113 349.9439 34.1653 0.2466 2411 +2413 4 289.8027 349.4085 33.7159 0.1479 2412 +2414 4 290.2328 348.7106 35.1868 0.3321 2413 +2415 4 290.4948 347.7119 35.56 0.2963 2414 +2416 4 290.0166 346.8482 34.7208 0.3306 2415 +2417 4 289.8267 345.9353 35.4668 0.2613 2416 +2418 4 289.7752 345.0373 33.8705 0.1435 2417 +2419 4 289.6608 343.9882 33.1139 0.2542 2418 +2420 4 289.7798 343.0753 33.6806 0.208 2419 +2421 4 289.7752 342.175 34.5044 0.2156 2420 +2422 4 290.1378 341.1282 34.44 0.1179 2421 +2423 4 290.1184 340.6603 32.5077 0.3472 2422 +2424 4 290.1184 339.768 33.32 0.2415 2423 +2425 4 290.29 339.4065 32.8076 0.2082 2424 +2426 4 290.6492 339.196 30.3363 0.2288 2425 +2427 4 291.299 339.5323 31.306 0.2288 2426 +2428 4 291.8321 339.871 30.9137 0.3713 2427 +2429 4 292.7748 339.9911 31.1419 0.2288 2428 +2430 4 293.3308 340.0151 32.2 0.2321 2429 +2431 4 293.7872 340.7679 30.8314 0.2122 2430 +2432 4 294.5869 340.8296 30.081 0.3149 2431 +2433 4 295.3888 341.2632 30.7476 0.2161 2432 +2434 4 296.3132 341.1397 29.7128 0.2791 2433 +2435 4 297.4194 340.9131 29.96 0.1788 2434 +2436 4 298.1447 340.9989 28.5631 0.2661 2435 +2437 4 298.9192 341.6213 29.1942 0.2849 2436 +2438 4 299.9053 342.0423 29.986 0.2629 2437 +2439 4 300.6821 341.3993 29.7195 0.3051 2438 +2440 4 301.6614 341.2186 29.3048 0.1683 2439 +2441 4 302.6864 340.912 29.68 0.3548 2440 +2442 4 303.303 340.2199 28.4917 0.341 2441 +2443 4 304.2662 339.8172 27.7732 0.2851 2442 +2444 4 305.067 339.3642 28.3984 0.171 2443 +2445 4 305.6002 338.5794 28.94 0.1444 2444 +2446 4 306.1344 337.9147 29.6363 0.2804 2445 +2447 4 306.3655 337.8003 27.72 0.2755 2446 +2448 4 307.2006 337.4262 27.7794 0.3077 2447 +2449 4 307.8435 336.8886 28.7468 0.2211 2448 +2450 4 308.6501 336.241 28.2559 0.3305 2449 +2451 4 309.4074 335.9928 27.9028 0.2812 2450 +2452 4 310.1933 335.4505 27.5775 0.3529 2451 +2453 4 310.834 334.668 27.1043 0.37 2452 +2454 4 311.7549 334.1075 26.6213 0.2924 2453 +2455 4 312.8096 333.8615 27.1384 0.309 2454 +2456 4 313.5578 333.1957 27.6273 0.3557 2455 +2457 4 314.0566 332.5448 26.9713 0.3299 2456 +2458 4 314.8929 332.0815 26.5826 0.2924 2457 +2459 4 315.6536 331.3688 26.8442 0.2492 2458 +2460 4 316.4762 330.7453 26.6924 0.1984 2459 +2461 4 317.1694 330.2854 27.4565 0.3131 2460 +2462 4 317.9165 330.6046 27.3935 0.316 2461 +2463 4 318.4656 329.8575 27.4991 0.2241 2462 +2464 4 318.604 328.8657 27.5164 0.3144 2463 +2465 4 318.572 327.8006 28.3119 0.2524 2464 +2466 4 318.9483 326.9609 29.3812 0.2161 2465 +2467 4 319.7629 326.4473 28.5135 0.3273 2466 +2468 4 320.5202 325.9096 28.6572 0.3073 2467 +2469 4 321.297 325.206 28.6513 0.1497 2468 +2470 4 321.996 324.634 27.8844 0.2924 2469 +2471 4 322.7602 323.8618 28.1249 0.2669 2470 +2472 4 323.2864 323.2658 28.84 0.1757 2471 +2473 4 323.887 322.6057 28.1473 0.1496 2472 +2474 4 324.3984 321.9102 27.9451 0.1803 2473 +2475 4 324.9738 321.337 27.5022 0.1526 2474 +2476 4 326.0148 320.9034 27.48 0.2161 2475 +2477 4 326.7527 320.0763 27.3938 0.2034 2476 +2478 4 326.8111 318.9666 26.9954 0.256 2477 +2479 4 326.7264 317.8512 26.5798 0.2669 2478 +2480 4 327.2412 317.3708 25.2857 0.2952 2479 +2481 4 328.3406 317.2198 25.3772 0.3064 2480 +2482 4 328.9995 316.7267 25.9823 0.22 2481 +2483 4 329.7088 315.9579 25.947 0.3516 2482 +2484 4 330.2511 315.1022 26.04 0.2509 2483 +2485 4 330.6103 314.0795 25.6869 0.3305 2484 +2486 4 330.5771 313.3096 24.4042 0.2615 2485 +2487 4 331.2807 312.5614 23.4982 0.2221 2486 +2488 4 332.2885 312.185 22.6657 0.2995 2487 +2489 4 333.2312 311.6062 22.5624 0.2161 2488 +2490 4 334.1624 311.2355 22.414 0.2334 2489 +2491 4 335.152 311.3224 21.9624 0.3368 2490 +2492 4 336.1552 311.7743 21.3206 0.2343 2491 +2493 4 336.8519 311.6348 22.0352 0.2195 2492 +2494 4 337.5967 310.9827 21.1904 0.2548 2493 +2495 4 338.4181 310.7218 21.2789 0.2592 2494 +2496 4 339.4648 310.596 21.4693 0.3053 2495 +2497 4 340.2256 310.1407 21.5516 0.3298 2496 +2498 4 340.9555 309.5687 22.526 0.2209 2497 +2499 4 341.6053 309.3342 21.0 0.1652 2498 +2500 4 342.628 308.9178 20.6268 0.2288 2499 +2501 4 343.4196 309.7483 21.2587 0.1592 2500 +2502 4 344.0706 310.6463 21.7641 0.1398 2501 +2503 4 344.7581 311.4712 22.0494 0.1639 2502 +2504 4 345.8461 311.1543 22.1822 0.1652 2503 +2505 4 346.9741 311.1394 21.947 0.152 2504 +2506 4 347.9247 310.8591 21.7479 0.1373 2505 +2507 4 348.5448 309.8982 21.7862 0.1301 2506 +2508 4 348.7884 308.832 21.6224 0.1271 2507 +2509 4 348.8273 307.7017 21.5869 0.1334 2508 +2510 4 348.7621 306.5794 21.5572 0.1464 2509 +2511 4 348.2588 305.6951 21.3786 0.1525 2510 +2512 4 348.0597 303.6634 19.4102 0.3116 2511 +2513 4 348.8971 302.9335 19.32 0.3178 2512 +2514 4 349.7963 302.27 19.465 0.287 2513 +2515 4 350.6921 301.7231 19.7728 0.2712 2514 +2516 4 351.3052 301.6842 19.8923 0.2148 2515 +2517 4 352.0157 300.9338 19.5054 0.2796 2516 +2518 4 352.4344 300.0163 20.16 0.1814 2517 +2519 4 352.6792 299.1194 19.88 0.1584 2518 +2520 4 353.2786 298.7041 19.0756 0.1398 2519 +2521 4 353.6035 297.6985 19.3934 0.2977 2520 +2522 4 353.5692 296.6289 18.7415 0.3153 2521 +2523 4 353.4285 295.7526 18.6782 0.1255 2522 +2524 4 353.48 294.8912 19.4062 0.3417 2523 +2525 4 353.1528 293.8947 19.206 0.2313 2524 +2526 4 353.2306 292.9178 18.76 0.3296 2525 +2527 4 353.178 291.8561 19.32 0.1861 2526 +2528 4 353.7442 290.8929 19.6078 0.1939 2527 +2529 4 353.9399 289.8061 20.0869 0.2208 2528 +2530 4 354.0783 288.7307 20.72 0.2025 2529 +2531 4 354.64 288.288 19.32 0.1525 2530 +2532 4 343.1371 308.4258 20.5128 0.2366 2500 +2533 4 290.0921 338.4604 34.3658 0.1388 2424 +2534 4 290.0681 337.6962 32.3868 0.2924 2533 +2535 4 290.1047 337.4777 31.3883 0.1519 2534 +2536 4 289.4103 336.7959 30.8266 0.2706 2535 +2537 4 289.3588 335.8052 31.08 0.2542 2536 +2538 4 289.3176 334.8888 29.9827 0.2542 2537 +2539 4 289.5372 334.2219 28.9201 0.3969 2538 +2540 4 289.3142 333.4131 29.8189 0.2867 2539 +2541 4 289.0122 332.5722 30.6541 0.2061 2540 +2542 4 288.2491 331.9064 30.4088 0.131 2541 +2543 4 288.0958 331.1594 29.0746 0.1525 2542 +2544 4 287.9448 330.5405 29.972 0.2796 2543 +2545 4 287.819 329.7534 28.651 0.2039 2544 +2546 4 287.6222 328.9275 28.2212 0.2415 2545 +2547 4 287.2344 327.9974 28.0 0.2619 2546 +2548 4 286.4061 327.43 28.5463 0.1818 2547 +2549 4 285.3788 327.1485 27.9919 0.2734 2548 +2550 4 284.8766 326.3946 26.9802 0.3022 2549 +2551 4 284.0049 325.8123 26.8688 0.2417 2550 +2552 4 283.4809 325.0962 26.9111 0.2415 2551 +2553 4 283.1148 324.2988 27.1603 0.1528 2552 +2554 4 282.2671 324.0929 26.476 0.117 2553 +2555 4 281.2982 323.752 26.6874 0.1669 2554 +2556 4 280.4196 323.8161 26.63 0.1611 2555 +2557 4 279.5787 323.3745 26.857 0.2408 2556 +2558 4 278.4976 323.0702 26.6916 0.2163 2557 +2559 4 277.6259 322.9489 25.76 0.2853 2558 +2560 4 276.9498 322.2396 26.3388 0.2186 2559 +2561 4 275.9774 322.0703 25.7673 0.2288 2560 +2562 4 274.981 321.9559 24.6616 0.3012 2561 +2563 4 274.2431 321.8312 25.9028 0.2474 2562 +2564 4 273.1449 321.9216 25.716 0.3025 2563 +2565 4 272.4242 322.5028 24.638 0.2892 2564 +2566 4 271.748 322.5508 22.7035 0.2638 2565 +2567 4 270.8477 322.6892 23.0023 0.2004 2566 +2568 4 269.857 322.862 22.4932 0.1907 2567 +2569 4 269.412 322.8162 22.7172 0.2383 2568 +2570 4 268.9544 322.4936 23.8 0.1398 2569 +2571 4 269.2713 322.9512 22.4319 0.24 2568 +2572 4 268.284 323.2006 22.0886 0.2415 2571 +2573 4 267.3356 323.1892 21.7022 0.2669 2572 +2574 4 266.3507 322.989 21.1994 0.2325 2573 +2575 4 265.8301 323.4969 22.8928 0.1907 2574 +2576 4 265.2982 323.9888 21.6639 0.2246 2575 +2577 4 265.1872 324.7564 21.0683 0.1221 2576 +2578 4 264.6083 325.3536 21.2783 0.2289 2577 +2579 4 263.8007 325.6396 21.0157 0.1779 2578 +2580 4 262.6956 325.5515 21.0356 0.3021 2579 +2581 4 261.7072 325.5927 21.4749 0.1282 2580 +2582 4 260.9281 325.7517 21.7305 0.2034 2581 +2583 4 260.0575 325.7746 21.0339 0.1907 2582 +2584 4 259.3448 325.905 21.3052 0.1456 2583 +2585 4 258.7797 326.2139 19.3486 0.1671 2584 +2586 4 257.7661 326.1498 19.1464 0.2288 2585 +2587 4 257.4 326.3821 20.4674 0.1144 2586 +2588 4 256.8108 325.7929 20.6774 0.2033 2587 +2589 4 256.1473 325.2403 19.0994 0.2658 2588 +2590 4 255.0914 325.1648 19.0725 0.2533 2589 +2591 4 254.7345 324.6089 18.1877 0.2615 2590 +2592 4 253.7872 324.1959 17.8245 0.2412 2591 +2593 4 252.9567 323.5198 17.92 0.1234 2592 +2594 4 252.0461 323.0873 17.5305 0.1429 2593 +2595 4 251.1046 323.6079 17.3564 0.2542 2594 +2596 4 250.3266 323.172 16.3918 0.2288 2595 +2597 4 249.3028 322.8757 17.2875 0.1718 2596 +2598 4 248.3166 322.9523 16.9501 0.2277 2597 +2599 4 247.7904 322.9512 15.68 0.2669 2598 +2600 4 289.4446 338.2614 32.2 0.2674 2534 +2601 4 289.7752 339.3104 31.92 0.2669 2600 +2602 4 293.2598 361.4102 35.4603 0.3043 1673 +2603 4 293.5035 361.5601 38.1721 0.1891 2602 +2604 4 294.1533 361.7282 39.6091 0.1271 2603 +2605 4 294.9987 362.4787 39.6463 0.138 2604 +2606 4 295.1612 363.4911 39.6082 0.1811 2605 +2607 4 294.4782 364.3514 39.48 0.2161 2606 +2608 4 293.9394 364.8811 39.8709 0.1565 2607 +2609 4 293.4234 364.4143 42.0932 0.2669 2608 +2610 4 293.436 364.7861 41.6783 0.1652 2609 +2611 4 293.7609 365.6224 41.16 0.1485 2610 +2612 4 294.572 366.2596 41.461 0.1923 2611 +2613 4 295.1589 367.2274 41.7816 0.3514 2612 +2614 4 295.4952 368.2708 42.1366 0.3822 2613 +2615 4 295.6096 369.385 42.5919 0.2795 2614 +2616 4 296.2331 370.0588 43.7928 0.185 2615 +2617 4 296.5317 371.0942 43.7464 0.1497 2616 +2618 4 297.3256 371.8 43.4 0.2288 2617 +2619 4 292.4053 364.936 41.7189 0.3181 2609 +2620 4 291.8802 365.0504 43.143 0.3432 2619 +2621 4 290.7728 365.0321 43.5554 0.286 2620 +2622 4 289.8976 364.7072 42.7706 0.2392 2621 +2623 4 289.1368 364.7358 42.8515 0.2048 2622 +2624 4 288.24 364.1386 43.5266 0.3156 2623 +2625 4 287.3602 363.4614 43.68 0.4449 2624 +2626 4 286.3112 363.5632 44.5917 0.3148 2625 +2627 4 285.3834 363.832 45.808 0.1718 2626 +2628 4 284.3172 363.6776 45.6646 0.2382 2627 +2629 4 283.4443 363.0793 45.7114 0.272 2628 +2630 4 282.5383 362.9866 46.6374 0.194 2629 +2631 4 281.6173 362.6926 46.7496 0.1398 2630 +2632 4 280.8188 363.403 46.6312 0.3362 2631 +2633 4 279.7824 363.5174 47.031 0.3419 2632 +2634 4 279.1463 362.9912 48.0472 0.3432 2633 +2635 4 278.3947 362.4501 48.5447 0.2644 2634 +2636 4 277.5367 362.4192 50.2354 0.1211 2635 +2637 4 276.411 362.4718 50.4969 0.1662 2636 +2638 4 275.3379 362.6789 49.9425 0.2415 2637 +2639 4 274.4902 363.1399 49.84 0.2924 2638 +2640 4 273.877 363.1319 51.6174 0.3344 2639 +2641 4 273.0522 362.5588 51.9669 0.2843 2640 +2642 4 272.2491 362.5588 50.4311 0.2571 2641 +2643 4 271.3774 362.6308 51.52 0.1708 2642 +2644 4 270.2677 362.4215 51.52 0.1165 2643 +2645 4 269.2999 362.1618 50.7111 0.2004 2644 +2646 4 268.7084 362.1801 52.0719 0.2321 2645 +2647 4 267.7589 361.7454 51.333 0.2797 2646 +2648 4 266.7808 361.5418 51.7672 0.2789 2647 +2649 4 266.3209 361.6882 53.6942 0.3985 2648 +2650 4 265.4057 362.0474 53.4526 0.2439 2649 +2651 4 264.574 362.489 53.4411 0.2783 2650 +2652 4 263.954 362.7624 55.3714 0.1711 2651 +2653 4 263.1749 362.3746 55.6721 0.2334 2652 +2654 4 262.5286 362.8642 54.3262 0.2913 2653 +2655 4 261.6545 362.9866 55.9026 0.1447 2654 +2656 4 260.84 363.6559 56.5356 0.1864 2655 +2657 4 260.0243 364.1466 55.44 0.2384 2656 +2658 4 259.3494 364.7072 56.467 0.1685 2657 +2659 4 258.9787 365.532 57.4 0.1652 2658 +2660 4 258.989 366.4575 57.4445 0.323 2659 +2661 4 258.6332 367.1954 58.905 0.2582 2660 +2662 4 258.7213 367.6599 60.2 0.2539 2661 +2663 4 258.2591 368.4241 60.944 0.3108 2662 +2664 4 257.567 367.9161 59.5952 0.1271 2663 +2665 4 257.019 368.1117 58.0854 0.1233 2664 +2666 4 256.3876 368.9011 58.2106 0.1144 2665 +2667 4 256.256 370.0314 58.24 0.1144 2666 +2668 4 255.6863 370.4364 59.7954 0.1144 2667 +2669 4 254.9312 370.5988 61.8593 0.1144 2668 +2670 4 254.1751 370.7624 63.9234 0.1144 2669 +2671 4 253.976 371.7714 64.1962 0.1144 2670 +2672 4 253.7495 372.8788 64.1962 0.1144 2671 +2673 4 253.2553 373.897 64.1962 0.1144 2672 +2674 4 252.1387 373.6487 64.1962 0.1144 2673 +2675 4 251.203 373.3684 65.2669 0.1144 2674 +2676 4 250.401 373.063 67.118 0.1144 2675 +2677 4 249.5041 373.055 68.2506 0.1144 2676 +2678 4 248.4562 373.516 68.2506 0.1144 2677 +2679 4 247.4701 373.6533 68.2506 0.1144 2678 +2680 4 246.6922 372.9715 68.9321 0.1144 2679 +2681 4 245.9669 372.5036 70.7717 0.1144 2680 +2682 4 245.1981 372.0196 72.305 0.1144 2681 +2683 4 244.2074 371.4476 72.305 0.1144 2682 +2684 4 243.2167 370.8745 72.305 0.1144 2683 +2685 4 242.226 370.3025 72.305 0.1144 2684 +2686 4 241.2273 369.8209 72.305 0.1144 2685 +2687 4 240.1439 370.1915 72.305 0.1144 2686 +2688 4 239.0617 370.5622 72.305 0.1144 2687 +2689 4 237.9692 370.8379 72.305 0.1144 2688 +2690 4 237.0174 370.4558 72.8028 0.1144 2689 +2691 4 236.3367 369.6825 74.0242 0.1144 2690 +2692 4 235.6571 368.9091 75.2455 0.1144 2691 +2693 4 234.9925 368.114 76.3596 0.1144 2692 +2694 4 234.4811 367.0913 76.3596 0.1144 2693 +2695 4 233.9709 366.0674 76.3596 0.1144 2694 +2696 4 233.5018 365.0252 76.3596 0.1144 2695 +2697 4 233.0854 363.9602 76.3596 0.1144 2696 +2698 4 232.6679 362.894 76.3596 0.1144 2697 +2699 4 232.2503 361.8289 76.3596 0.1144 2698 +2700 4 231.8694 360.7547 76.3596 0.1144 2699 +2701 4 231.4953 359.8132 76.3596 0.117 2700 +2702 4 230.3661 359.6256 76.3596 0.1303 2701 +2703 4 229.3628 359.2309 76.3596 0.1511 2702 +2704 4 228.665 358.3237 76.3596 0.1907 2703 +2705 4 295.0822 364.602 38.6672 0.3194 2607 +2706 4 295.9951 364.7495 37.52 0.2414 2705 +2707 4 296.1976 363.7828 36.4311 0.2886 2706 +2708 4 296.5717 363.3996 38.5311 0.1894 2707 +2709 4 297.3828 363.1056 39.76 0.1186 2708 +2710 4 298.3975 362.7624 39.5097 0.2107 2709 +2711 4 299.0691 363.3275 38.36 0.1144 2710 +2712 4 300.165 363.4488 38.36 0.157 2711 +2713 4 301.2747 363.2978 38.5571 0.2108 2712 +2714 4 302.3146 363.1159 39.48 0.2691 2713 +2715 4 303.1978 362.608 39.0286 0.2902 2714 +2716 4 303.9963 362.2682 38.0766 0.4112 2715 +2717 4 304.5751 361.7923 37.8834 0.2246 2716 +2718 4 304.8188 362.076 35.9254 0.3115 2717 +2719 4 305.7146 361.9616 35.9327 0.127 2718 +2720 4 306.4856 361.6996 35.9904 0.2119 2719 +2721 4 307.172 361.4891 37.3514 0.1144 2720 +2722 4 307.8264 360.8576 37.52 0.2955 2721 +2723 4 308.0769 359.8395 37.0423 0.3545 2722 +2724 4 308.7427 359.5375 38.6562 0.1591 2723 +2725 4 309.3445 359.0455 40.241 0.2827 2724 +2726 4 309.9233 358.7515 41.9989 0.1276 2725 +2727 4 310.8511 358.6932 41.1401 0.1282 2726 +2728 4 311.716 359.0913 40.4001 0.3788 2727 +2729 4 312.8074 359.1016 41.0239 0.3432 2728 +2730 4 313.8267 359.0536 41.44 0.2796 2729 +2731 4 314.8162 358.9872 41.8132 0.2796 2730 +2732 4 315.8939 358.9174 42.6574 0.2288 2731 +2733 4 317.0104 358.9849 42.84 0.2804 2732 +2734 4 318.1109 358.8522 42.707 0.3885 2733 +2735 4 319.1028 359.1794 41.7267 0.3426 2734 +2736 4 319.8269 359.47 43.0469 0.2311 2735 +2737 4 320.7684 359.7708 43.5072 0.2161 2736 +2738 4 321.5509 359.4642 44.3794 0.1729 2737 +2739 4 322.5142 359.1725 44.3442 0.2288 2738 +2740 4 323.1869 358.4186 43.4 0.1993 2739 +2741 4 323.9019 357.7288 42.9044 0.3753 2740 +2742 4 324.8422 357.8672 43.6657 0.3258 2741 +2743 4 325.5321 357.9931 42.383 0.3363 2742 +2744 4 326.358 358.3466 43.6738 0.2719 2743 +2745 4 326.8648 358.6749 42.84 0.2354 2744 +2746 4 327.9356 358.811 42.56 0.2541 2745 +2747 4 328.7467 359.2938 41.8317 0.2001 2746 +2748 4 329.8358 359.3304 42.0885 0.3305 2747 +2749 4 330.6274 359.3579 43.6836 0.237 2748 +2750 4 331.2578 360.0225 44.8 0.2979 2749 +2751 4 332.2325 360.4744 44.8 0.3162 2750 +2752 4 333.2895 360.8084 44.564 0.2288 2751 +2753 4 334.1121 361.3221 44.5886 0.2891 2752 +2754 4 334.7241 362.0302 44.24 0.2583 2753 +2755 4 335.0776 362.5336 45.6095 0.3418 2754 +2756 4 335.9356 362.9317 45.92 0.2924 2755 +2757 4 336.9389 363.4156 45.9584 0.3442 2756 +2758 4 337.7546 364.1386 46.1555 0.4909 2757 +2759 4 338.6114 364.6889 46.0813 0.2382 2758 +2760 4 339.156 365.1534 46.8138 0.3051 2759 +2761 4 340.0975 365.4634 47.2567 0.2929 2760 +2762 4 340.8823 365.6075 45.7307 0.3305 2761 +2763 4 341.5 366.0823 47.2892 0.3561 2762 +2764 4 342.4553 366.6566 47.1313 0.3167 2763 +2765 4 343.4551 367.1256 47.3796 0.2679 2764 +2766 4 344.447 367.5089 47.971 0.3038 2765 +2767 4 345.3828 367.8212 47.9027 0.2796 2766 +2768 4 346.4501 368.1129 47.6 0.2129 2767 +2769 4 347.5575 368.2467 47.2335 0.1539 2768 +2770 4 348.4521 368.638 47.5264 0.2593 2769 +2771 4 349.3341 369.1688 47.9419 0.2287 2770 +2772 4 350.4106 369.1688 48.16 0.2039 2771 +2773 4 351.0616 369.3232 46.76 0.3025 2772 +2774 4 352.098 369.7271 47.0159 0.1907 2773 +2775 4 353.1471 370.1481 46.9907 0.1837 2774 +2776 4 354.0611 370.5405 45.92 0.128 2775 +2777 4 354.8596 370.5416 47.1531 0.1481 2776 +2778 4 355.3264 371.0964 47.3718 0.144 2777 +2779 4 355.8366 371.7908 46.3669 0.1679 2778 +2780 4 356.3411 372.5676 47.7907 0.1644 2779 +2781 4 356.9246 373.4702 48.5654 0.1993 2780 +2782 4 357.5812 374.088 48.6797 0.2343 2781 +2783 4 357.8569 374.9792 49.4337 0.2916 2782 +2784 4 358.3054 375.7891 48.1631 0.2389 2783 +2785 4 358.8282 376.3302 49.5362 0.2258 2784 +2786 4 359.3647 377.0532 50.267 0.1917 2785 +2787 4 360.0534 377.8197 50.7931 0.1591 2786 +2788 4 360.6643 378.5462 51.2117 0.2669 2787 +2789 4 361.3564 379.3996 50.96 0.2916 2788 +2790 4 361.8575 380.3217 51.1081 0.2303 2789 +2791 4 362.195 381.0584 50.2555 0.1271 2790 +2792 4 362.8825 381.5869 49.28 0.1832 2791 +2793 4 363.6696 382.1029 50.2001 0.1144 2792 +2794 4 364.348 382.2607 52.3382 0.1552 2793 +2795 4 364.9852 383.1164 52.7881 0.2288 2794 +2796 4 365.9839 383.5386 53.0956 0.2622 2795 +2797 4 366.906 384.1403 53.503 0.2134 2796 +2798 4 367.7788 384.6265 53.2258 0.1316 2797 +2799 4 368.479 385.2763 54.4043 0.2344 2798 +2800 4 369.1002 386.0943 55.295 0.1384 2799 +2801 4 370.0108 386.6137 54.6507 0.2095 2800 +2802 4 371.0678 386.7624 54.7016 0.1652 2801 +2803 4 372.0277 387.1262 55.3468 0.2288 2802 +2804 4 372.833 387.061 56.0515 0.1559 2803 +2805 4 373.6945 387.1662 56.84 0.1255 2804 +2806 4 374.4701 387.9933 56.84 0.1144 2805 +2807 4 375.542 388.2358 57.12 0.1287 2806 +2808 4 376.2124 389.119 56.6913 0.1245 2807 +2809 4 376.8599 390.0136 57.1463 0.1144 2808 +2810 4 377.5566 390.8545 57.4 0.1682 2809 +2811 4 378.3906 391.5855 57.4781 0.1454 2810 +2812 4 379.4717 391.7502 57.96 0.1144 2811 +2813 4 380.5848 391.947 57.96 0.1144 2812 +2814 4 381.3501 392.6757 58.655 0.2223 2813 +2815 4 382.1635 393.2889 59.1808 0.1556 2814 +2816 4 382.4346 393.9936 60.5164 0.1144 2815 +2817 4 383.5615 393.9936 60.76 0.1144 2816 +2818 4 384.4984 394.251 61.0137 0.1144 2817 +2819 4 384.4984 395.3939 61.04 0.1144 2818 +2820 4 384.5545 396.5093 61.3186 0.1144 2819 +2821 4 385.5612 396.7392 61.768 0.1144 2820 +2822 4 386.2796 397.381 62.344 0.1721 2821 +2823 4 387.339 397.7253 62.16 0.1398 2822 +2824 4 387.8412 398.1944 62.72 0.1144 2823 +2825 4 388.2313 399.1336 63.4063 0.1313 2824 +2826 4 389.0607 399.256 64.6979 0.1144 2825 +2827 4 389.9496 399.3944 65.9674 0.1652 2826 +2828 4 390.4232 400.1712 66.0232 0.1144 2827 +2829 4 391.0146 400.2524 67.2 0.1353 2828 +2830 4 391.8989 400.559 68.278 0.1144 2829 +2831 4 392.9091 400.7421 69.5159 0.1144 2830 +2832 4 393.782 401.2145 70.2778 0.1144 2831 +2833 4 394.4386 402.1515 70.2778 0.1144 2832 +2834 4 395.0941 403.0884 70.2778 0.1144 2833 +2835 4 395.8297 403.959 70.2778 0.1144 2834 +2836 4 396.6385 404.7678 70.2778 0.1144 2835 +2837 4 397.4977 405.4828 70.835 0.1144 2836 +2838 4 398.3637 406.1818 71.4823 0.1144 2837 +2839 4 399.2297 406.8808 72.1297 0.1144 2838 +2840 4 400.0545 407.6598 72.305 0.1144 2839 +2841 4 400.8633 408.4686 72.305 0.1144 2840 +2842 4 401.6733 409.2443 71.9141 0.1144 2841 +2843 4 402.4844 409.9879 71.1505 0.1144 2842 +2844 4 403.2943 410.7326 70.3867 0.1144 2843 +2845 4 404.1054 411.4762 69.6231 0.1144 2844 +2846 4 404.8616 412.1798 69.099 0.1144 2845 +2847 4 405.23 412.3399 71.3798 0.125 2846 +2848 4 405.6384 412.7632 73.3477 0.2874 2847 +2849 4 406.4438 413.2139 74.3761 0.3003 2848 +2850 4 407.5317 413.4233 74.76 0.1546 2849 +2851 4 408.6448 413.4439 75.04 0.1528 2850 +2852 4 409.7293 413.548 75.5255 0.2313 2851 +2853 4 410.7761 413.3901 76.2818 0.2598 2852 +2854 4 411.4076 413.874 77.84 0.2288 2853 +2855 4 412.0173 414.5913 78.8379 0.2595 2854 +2856 4 412.9199 414.9517 77.7151 0.352 2855 +2857 4 413.3409 415.6255 76.2947 0.3201 2856 +2858 4 413.8317 416.1872 77.2131 0.3327 2857 +2859 4 414.3568 416.0728 77.0 0.1525 2858 +2860 3 302.6715 383.7216 32.6642 0.3043 1 +2861 3 302.453 384.821 33.2063 0.2806 2860 +2862 3 302.3157 385.8575 34.3378 0.2415 2861 +2863 3 302.7402 386.5896 35.1868 0.1983 2862 +2864 3 303.7206 387.0827 35.6171 0.2476 2863 +2865 3 304.8131 386.8367 35.7064 0.3018 2864 +2866 3 305.8759 386.5141 35.0546 0.317 2865 +2867 3 306.9901 386.4066 34.4957 0.3299 2866 +2868 3 308.0026 386.775 35.352 0.3179 2867 +2869 3 308.6615 387.6307 36.2673 0.3178 2868 +2870 3 309.3959 388.3148 36.3852 0.2726 2869 +2871 3 310.0446 389.254 36.4014 0.2669 2870 +2872 3 310.7642 390.1418 36.4059 0.2782 2871 +2873 3 311.6862 390.811 36.4297 0.2568 2872 +2874 3 312.5694 391.5363 36.5445 0.2542 2873 +2875 3 313.4583 392.1415 37.4556 0.2542 2874 +2876 3 314.1893 392.9457 38.3135 0.242 2875 +2877 3 315.132 393.4513 37.4072 0.1916 2876 +2878 3 315.9728 394.108 36.4 0.1652 2877 +2879 3 308.9109 388.2667 36.2933 0.3758 2869 +2880 3 308.2519 388.841 37.5782 0.2585 2879 +2881 3 307.3516 389.3867 37.8 0.1144 2880 +2882 3 306.6446 390.1017 37.8 0.2186 2881 +2883 3 306.1813 391.0581 37.5416 0.2239 2882 +2884 3 305.5601 391.8223 37.6449 0.3075 2883 +2885 3 304.6358 392.3771 37.8 0.2925 2884 +2886 3 303.8636 393.1768 37.5522 0.2709 2885 +2887 3 303.0056 393.6916 38.5846 0.3178 2886 +2888 3 302.477 394.0085 40.32 0.2429 2887 +2889 3 301.5984 394.5347 40.5866 0.1743 2888 +2890 3 300.8731 394.9649 41.5528 0.2241 2889 +2891 3 301.3193 394.8665 43.8623 0.2755 2890 +2892 3 300.9109 393.9433 44.52 0.2965 2891 +2893 3 300.2062 393.4216 43.2432 0.3432 2892 +2894 3 300.1856 392.7169 41.7766 0.3432 2893 +2895 3 299.7246 391.7639 42.0 0.2415 2894 +2896 3 299.7257 390.6943 41.72 0.388 2895 +2897 3 299.0851 390.2184 43.1973 0.2161 2896 +2898 3 298.9249 389.8535 45.395 0.1907 2897 +2899 3 298.9855 388.7701 45.64 0.2601 2898 +2900 3 299.0874 387.9716 44.5883 0.2619 2899 +2901 3 299.156 387.1593 45.3986 0.3046 2900 +2902 3 298.4925 386.4535 46.422 0.2034 2901 +2903 3 297.7397 385.8689 47.04 0.2873 2902 +2904 3 297.0545 385.3255 46.494 0.3146 2903 +2905 3 296.6609 384.8427 47.248 0.1926 2904 +2906 3 296.5374 384.2627 48.6836 0.1447 2905 +2907 3 296.2971 383.804 46.7191 0.1365 2906 +2908 3 295.6222 383.1256 46.5027 0.2288 2907 +2909 3 294.9507 382.5147 46.6771 0.4243 2908 +2910 3 294.2093 381.7013 47.2125 0.4117 2909 +2911 3 293.817 380.9142 48.72 0.2415 2910 +2912 3 293.0104 379.9007 48.72 0.2432 2911 +2913 3 292.3812 378.9855 48.974 0.2648 2912 +2914 3 292.0907 377.9684 48.841 0.2299 2913 +2915 3 291.9488 377.3358 50.96 0.312 2914 +2916 3 291.9614 376.2467 51.2392 0.3431 2915 +2917 3 291.3779 375.4047 50.68 0.2985 2916 +2918 3 290.6023 374.7206 50.9846 0.278 2917 +2919 3 290.7144 374.1681 52.9108 0.2835 2918 +2920 3 290.8048 373.2792 54.1652 0.1481 2919 +2921 3 290.385 372.6008 53.3868 0.2161 2920 +2922 3 290.3472 372.0299 52.64 0.2583 2921 +2923 3 290.1184 371.085 53.436 0.3193 2922 +2924 3 289.9422 370.124 54.4421 0.2892 2923 +2925 3 289.7535 369.2477 55.1698 0.3225 2924 +2926 3 289.98 368.5728 57.2592 0.2831 2925 +2927 3 290.4238 367.987 58.52 0.2161 2926 +2928 3 290.6446 367.7274 58.688 0.3051 2927 +2929 3 291.6262 367.3212 59.36 0.3384 2928 +2930 3 292.4968 366.6154 59.4339 0.2977 2929 +2931 3 292.872 365.6533 59.9701 0.1612 2930 +2932 3 293.6648 365.1648 61.04 0.1652 2931 +2933 3 290.5611 367.8749 59.4359 0.1503 2927 +2934 3 290.393 367.0638 60.5357 0.1144 2933 +2935 3 289.7272 366.5376 61.3404 0.2034 2934 +2936 3 289.3679 365.8306 61.8419 0.2182 2935 +2937 3 289.9411 365.254 62.519 0.2288 2936 +2938 3 290.536 364.9017 64.3983 0.2041 2937 +2939 3 290.1745 363.9339 63.84 0.1714 2938 +2940 3 289.6574 363.0793 64.2852 0.1447 2939 +2941 3 289.3176 362.2076 64.68 0.1253 2940 +2942 3 289.3325 361.639 63.1912 0.1261 2941 +2943 3 289.1494 361.4674 60.4593 0.1241 2942 +2944 3 288.9675 361.2958 57.7273 0.1222 2943 +2945 3 288.7845 361.123 54.9956 0.1202 2944 +2946 3 288.6015 360.9514 52.2637 0.1183 2945 +2947 3 288.4184 360.7798 49.5317 0.1163 2946 +2948 3 288.2365 360.6082 46.8 0.1144 2947 +2949 3 287.5444 359.7159 46.7289 0.1144 2948 +2950 3 286.8019 358.8591 46.7149 0.1144 2949 +2951 3 285.8307 358.2539 46.7561 0.1144 2950 +2952 3 284.9487 357.5858 46.8082 0.1144 2951 +2953 3 284.332 356.7312 46.858 0.1144 2952 +2954 3 283.2922 356.2919 46.6906 0.1391 2953 +2955 3 282.7934 355.2703 46.809 0.1907 2954 +2956 3 289.9296 372.4864 52.08 0.1144 2921 +2957 3 288.8714 372.5619 51.6617 0.2465 2956 +2958 3 287.8865 372.944 51.52 0.2099 2957 +2959 3 287.144 373.0584 52.561 0.2852 2958 +2960 3 286.4599 372.944 54.04 0.3556 2959 +2961 3 285.3445 372.9818 53.7656 0.2773 2960 +2962 3 284.7416 372.9314 55.4616 0.2169 2961 +2963 3 284.1078 372.6008 56.56 0.1401 2962 +2964 3 283.6399 373.0584 57.862 0.3485 2963 +2965 3 282.5966 373.2163 57.9992 0.5607 2964 +2966 3 282.1001 374.0686 58.8 0.3448 2965 +2967 3 281.2547 373.9816 60.0006 0.1652 2966 +2968 3 281.1449 374.2024 61.9125 0.2333 2967 +2969 3 281.0591 374.6577 63.9733 0.2866 2968 +2970 3 280.9344 375.7651 64.3952 0.1858 2969 +2971 3 280.4367 376.5899 65.0448 0.125 2970 +2972 3 280.3944 377.6733 65.52 0.1158 2971 +2973 3 280.7788 378.6297 65.728 0.13 2972 +2974 3 280.6209 379.6959 65.7233 0.2258 2973 +2975 3 279.8933 380.3114 66.6324 0.2405 2974 +2976 3 279.7641 381.2083 65.8182 0.3782 2975 +2977 3 279.9276 381.9633 67.1437 0.3173 2976 +2978 3 279.8773 382.6302 68.7977 0.2118 2977 +2979 3 279.5032 383.5775 69.1964 0.1144 2978 +2980 3 279.2527 384.5945 68.7786 0.1861 2979 +2981 3 279.4106 384.9766 71.2944 0.1321 2980 +2982 3 278.7642 385.7099 71.12 0.2981 2981 +2983 3 277.6488 385.8712 70.84 0.3305 2982 +2984 3 293.0894 380.5894 46.76 0.1271 2911 +2985 3 291.9614 380.7232 46.76 0.1538 2984 +2986 3 290.8586 380.8193 46.1504 0.2162 2985 +2987 3 289.7718 380.5916 46.0222 0.2161 2986 +2988 3 288.6781 380.6454 46.569 0.2034 2987 +2989 3 287.843 381.0698 47.3659 0.2164 2988 +2990 3 287.4689 381.2952 49.56 0.1144 2989 +2991 3 286.4198 381.2895 49.474 0.3917 2990 +2992 3 285.7987 381.1362 47.6291 0.2502 2991 +2993 3 285.1889 381.2609 49.3774 0.3268 2992 +2994 3 284.2382 381.2849 50.0567 0.1769 2993 +2995 3 283.5496 381.4531 50.9362 0.1191 2994 +2996 3 282.5783 381.7116 51.0138 0.2955 2995 +2997 3 281.5544 381.7048 50.3496 0.2034 2996 +2998 3 281.3508 382.525 50.9832 0.2532 2997 +2999 3 280.6404 383.2022 51.52 0.1144 2998 +3000 3 279.7583 383.4688 52.2348 0.1399 2999 +3001 3 278.7493 383.3075 51.8476 0.1907 3000 +3002 3 278.111 383.0226 49.8753 0.1152 3001 +3003 3 277.6488 383.4665 51.2845 0.1317 3002 +3004 3 277.269 383.2354 52.92 0.119 3003 +3005 3 276.6078 383.4059 54.0921 0.1398 3004 +3006 3 275.6674 383.4791 53.4988 0.2567 3005 +3007 3 274.9432 383.0512 52.4569 0.241 3006 +3008 3 274.1871 383.0192 52.7344 0.3432 3007 +3009 3 273.9171 383.5775 54.32 0.2651 3008 +3010 3 272.8348 383.5695 54.6 0.1894 3009 +3011 3 272.2182 382.9254 53.3431 0.2984 3010 +3012 3 271.2584 382.7824 53.4733 0.3298 3011 +3013 3 270.858 382.668 55.1729 0.3138 3012 +3014 3 270.3764 382.3179 53.3095 0.329 3013 +3015 3 269.4852 381.9164 53.8037 0.2201 3014 +3016 3 268.8514 381.1797 54.6538 0.1144 3015 +3017 3 268.3366 380.6866 56.0804 0.2325 3016 +3018 3 267.4592 380.0471 55.8768 0.2652 3017 +3019 3 266.7042 379.999 54.04 0.1525 3018 +3020 3 266.0303 379.4648 53.48 0.3377 3019 +3021 3 265.17 379.1811 53.004 0.2123 3020 +3022 3 264.407 378.7555 54.061 0.2164 3021 +3023 3 263.5181 378.3059 54.628 0.3394 3022 +3024 3 262.9816 377.3209 55.0556 0.3694 3023 +3025 3 262.4405 376.4321 54.5476 0.3101 3024 +3026 3 261.9737 375.55 54.36 0.3044 3025 +3027 3 261.1878 375.0798 55.421 0.1761 3026 +3028 3 260.8126 374.1749 54.5619 0.1209 3027 +3029 3 260.1662 373.3764 54.5667 0.2115 3028 +3030 3 259.3368 372.8193 53.76 0.2829 3029 +3031 3 258.6927 371.9464 54.1013 0.3026 3030 +3032 3 257.9125 371.228 53.5413 0.1691 3031 +3033 3 257.0351 370.7372 52.9477 0.3278 3032 +3034 3 256.3155 370.259 53.7499 0.2712 3033 +3035 3 255.5444 369.5978 53.1342 0.2398 3034 +3036 3 254.8832 368.9434 53.3448 0.3489 3035 +3037 3 254.3673 368.2639 52.169 0.2641 3036 +3038 3 253.7838 367.6164 53.48 0.1221 3037 +3039 3 252.9087 366.9288 53.48 0.2652 3038 +3040 3 252.0873 366.1498 53.1748 0.2877 3039 +3041 3 251.2556 365.3719 53.2 0.3013 3040 +3042 3 250.4868 364.5802 53.7205 0.2342 3041 +3043 3 249.5899 363.9316 53.739 0.1439 3042 +3044 3 248.6724 363.5632 53.872 0.2132 3043 +3045 3 247.9162 363.0621 53.8311 0.3348 3044 +3046 3 247.2264 362.3254 53.9406 0.2788 3045 +3047 3 246.4405 361.6115 54.3077 0.1448 3046 +3048 3 245.6786 360.813 54.04 0.1398 3047 +3049 3 245.2095 359.7937 54.243 0.1503 3048 +3050 3 244.53 358.9243 54.6 0.1445 3049 +3051 3 243.9477 358.0251 54.642 0.2542 3050 +3052 3 243.5576 357.3318 53.5553 0.1221 3051 +3053 3 243.275 356.6042 53.3238 0.1588 3052 +3054 3 242.8289 356.0322 54.6244 0.2288 3053 +3055 3 242.2992 355.1502 54.899 0.2669 3054 +3056 3 242.1207 354.2751 56.28 0.3432 3055 +3057 3 241.6357 353.3679 56.0123 0.2643 3056 +3058 3 240.8269 352.6094 56.089 0.1144 3057 +3059 3 240.645 351.7148 57.12 0.1144 3058 +3060 3 239.8922 351.2366 57.68 0.1144 3059 +3061 3 239.0422 350.5399 57.9356 0.1144 3060 +3062 3 238.8214 349.4417 57.68 0.1144 3061 +3063 3 238.7517 348.3057 57.68 0.1144 3062 +3064 3 238.0492 347.5529 57.68 0.1144 3063 +3065 3 237.1283 346.9249 57.68 0.1144 3064 +3066 3 236.2383 346.4226 57.68 0.1246 3065 +3067 3 236.4648 345.488 58.24 0.1652 3066 +3068 3 301.8021 385.9673 32.2 0.2793 2862 +3069 3 300.9864 386.2281 32.3224 0.2621 3068 +3070 3 301.0562 386.5576 34.214 0.285 3069 +3071 3 300.3 386.4604 35.5289 0.2288 3070 +3072 3 299.9568 386.4512 33.717 0.1441 3071 +3073 3 299.5209 387.3081 32.7891 0.1158 3072 +3074 3 299.2372 388.3583 33.0509 0.1652 3073 +3075 3 298.5074 388.6809 34.4084 0.2413 3074 +3076 3 297.5086 388.6202 34.2768 0.2446 3075 +3077 3 296.7708 389.1202 34.5391 0.2262 3076 +3078 3 296.2903 389.8203 35.3847 0.2984 3077 +3079 3 295.8018 390.6794 35.3133 0.2512 3078 +3080 3 295.0307 391.0524 35.399 0.1151 3079 +3081 3 294.5022 391.6598 36.2202 0.1943 3080 +3082 3 293.8536 392.4606 35.6334 0.2314 3081 +3083 3 293.0345 392.9308 35.6964 0.1635 3082 +3084 3 292.705 393.4067 37.413 0.1756 3083 +3085 3 291.8115 393.536 36.2429 0.2452 3084 +3086 3 291.0908 394.0451 36.7394 0.2924 3085 +3087 3 290.3232 394.8676 36.6402 0.3487 3086 +3088 3 289.7969 395.8206 37.4128 0.3686 3087 +3089 3 289.337 396.7335 38.3197 0.3618 3088 +3090 3 288.8749 397.7528 37.8179 0.3355 3089 +3091 3 288.1816 398.6394 37.6398 0.3178 3090 +3092 3 287.2538 399.1999 38.1455 0.329 3091 +3093 3 286.1991 399.5843 38.6672 0.3305 3092 +3094 3 285.3765 400.3703 38.8872 0.3178 3093 +3095 3 285.1351 401.0841 39.4862 0.309 3094 +3096 3 284.8903 402.1469 40.3077 0.2871 3095 +3097 3 284.7382 403.2623 40.7478 0.2887 3096 +3098 3 284.2932 404.2907 40.6952 0.3016 3097 +3099 3 283.7429 405.2654 40.1495 0.3235 3098 +3100 3 283.259 406.287 40.1386 0.3119 3099 +3101 3 282.9501 407.3212 40.9646 0.3051 3100 +3102 3 282.3644 408.019 42.4886 0.2759 3101 +3103 3 281.4675 408.6105 43.2656 0.2569 3102 +3104 3 280.4505 409.0326 43.9835 0.2241 3103 +3105 3 279.3854 409.4147 44.3092 0.2161 3104 +3106 3 278.373 409.1344 45.0106 0.2385 3105 +3107 3 277.6271 408.3325 45.7288 0.2879 3106 +3108 3 276.9624 407.6324 46.8222 0.3305 3107 +3109 3 277.0768 407.1382 48.0374 0.2994 3108 +3110 3 276.6089 406.4815 48.4624 0.2034 3109 +3111 3 276.4545 405.9964 46.727 0.3432 3110 +3112 3 276.5071 405.3627 48.1037 0.2949 3111 +3113 3 276.7267 405.0218 50.1592 0.166 3112 +3114 3 276.562 404.6271 52.624 0.2542 3113 +3115 3 276.5208 403.6043 52.08 0.2632 3114 +3116 3 277.0173 402.9168 51.5032 0.1965 3115 +3117 3 277.42 402.0508 50.9886 0.1631 3116 +3118 3 277.5344 401.7122 53.496 0.2886 3117 +3119 3 277.4978 400.7695 54.4981 0.3625 3118 +3120 3 277.42 399.9573 56.3069 0.191 3119 +3121 3 277.4852 399.2457 55.7511 0.2288 3120 +3122 3 276.8572 398.4483 55.5302 0.2458 3121 +3123 3 277.2415 398.112 56.7157 0.1652 3122 +3124 3 277.0082 397.6201 57.134 0.2924 3123 +3125 3 276.1616 397.4256 56.0 0.1398 3124 +3126 3 277.3559 397.9896 57.1217 0.1461 3123 +3127 3 277.0711 397.4256 58.8 0.3184 3126 +3128 3 275.9694 397.3112 58.4248 0.3432 3127 +3129 3 275.4638 398.0354 59.08 0.1289 3128 +3130 3 274.8105 398.1566 60.4094 0.1674 3129 +3131 3 274.258 398.4769 61.0156 0.4399 3130 +3132 3 273.2593 398.9368 60.727 0.314 3131 +3133 3 272.7307 399.6736 59.5501 0.2247 3132 +3134 3 272.2377 399.9321 60.3288 0.1488 3133 +3135 3 272.272 399.828 62.9796 0.2043 3134 +3136 3 271.4003 399.566 63.1621 0.4282 3135 +3137 3 270.3455 399.4711 63.7241 0.1451 3136 +3138 3 269.3342 399.256 64.12 0.1144 3137 +3139 3 268.1902 399.256 64.12 0.121 3138 +3140 3 267.0474 399.2182 64.12 0.1525 3139 +3141 3 266.0852 398.6337 64.12 0.2262 3140 +3142 3 265.1517 398.7206 63.56 0.1864 3141 +3143 3 264.4699 399.0581 64.496 0.1398 3142 +3144 3 263.4094 399.129 65.2028 0.1169 3143 +3145 3 262.4061 398.7984 65.0188 0.2034 3144 +3146 3 261.3903 398.9437 65.6172 0.2879 3145 +3147 3 260.4888 399.5065 65.8 0.2272 3146 +3148 3 260.2108 400.2673 66.743 0.2918 3147 +3149 3 259.4592 399.8532 67.3868 0.178 3148 +3150 3 276.9075 407.3876 49.266 0.3917 3108 +3151 3 277.1637 408.122 50.85 0.2542 3150 +3152 3 277.4795 409.1161 51.45 0.2924 3151 +3153 3 278.1819 409.8506 51.254 0.3254 3152 +3154 3 278.8443 409.6069 51.2011 0.2288 3153 +3155 3 279.819 409.6046 51.8115 0.3988 3154 +3156 3 280.4825 409.7259 53.2549 0.3432 3155 +3157 3 280.6324 410.4203 54.3906 0.1144 3156 +3158 3 279.9036 411.1708 55.16 0.2471 3157 +3159 3 279.708 412.1638 55.4663 0.394 3158 +3160 3 279.4838 413.1682 56.0899 0.3137 3159 +3161 3 279.8121 413.9804 56.9985 0.475 3160 +3162 3 279.7103 414.5719 58.175 0.2853 3161 +3163 3 280.2239 415.518 58.5108 0.1996 3162 +3164 3 280.6724 416.5327 58.0042 0.1301 3163 +3165 3 281.5716 417.1562 57.96 0.1144 3164 +3166 3 281.7466 418.2567 58.1955 0.2175 3165 +3167 3 281.6825 419.3309 59.005 0.3222 3166 +3168 3 281.686 420.3639 59.36 0.3051 3167 +3169 3 281.7832 421.2116 59.0996 0.286 3168 +3170 3 282.1424 422.1749 59.36 0.4296 3169 +3171 3 282.8403 422.9746 59.64 0.3432 3170 +3172 3 282.7247 423.9229 58.3181 0.287 3171 +3173 3 282.3518 424.8027 57.3266 0.1763 3172 +3174 3 282.1207 425.7625 56.2884 0.2231 3173 +3175 3 282.1196 426.4935 57.9961 0.1258 3174 +3176 3 282.6103 426.8573 60.1488 0.3085 3175 +3177 3 282.9272 427.4522 61.8425 0.3381 3176 +3178 3 282.568 428.3594 63.1408 0.3267 3177 +3179 3 282.7888 429.2791 63.936 0.1522 3178 +3180 3 282.6881 430.3293 64.412 0.1867 3179 +3181 3 282.3598 431.185 64.4232 0.2946 3180 +3182 3 282.1104 431.852 62.7718 0.2859 3181 +3183 3 281.6963 432.432 63.6236 0.1947 3182 +3184 3 281.4068 433.0601 65.4696 0.3099 3183 +3185 3 281.1952 433.9158 64.9006 0.2322 3184 +3186 3 280.7845 434.2887 65.6645 0.1525 3185 +3187 3 280.8543 435.0907 66.6658 0.1271 3186 +3188 3 280.8383 436.0711 66.1097 0.1867 3187 +3189 3 280.9767 436.9233 66.64 0.1802 3188 +3190 3 281.122 437.7951 68.0103 0.1265 3189 +3191 3 281.3199 438.8395 67.345 0.1144 3190 +3192 3 281.6528 439.3624 65.5085 0.1144 3191 +3193 3 281.0808 439.9138 64.328 0.2288 3192 +3194 3 281.7786 440.5864 64.6702 0.2454 3193 +3195 3 281.9834 441.6767 64.43 0.3173 3194 +3196 3 282.4616 442.6914 64.4221 0.3432 3195 +3197 3 283.1858 443.5208 64.96 0.3432 3196 +3198 3 283.7417 444.4703 64.757 0.2963 3197 +3199 3 284.316 445.4084 64.2502 0.208 3198 +3200 3 284.5185 446.4357 63.28 0.2288 3199 +3201 3 285.3079 446.8796 64.045 0.2924 3200 +3202 3 285.825 447.836 63.9262 0.2924 3201 +3203 3 286.3661 448.7523 63.635 0.2796 3202 +3204 3 286.8008 449.7064 64.12 0.1652 3203 +3205 3 284.7508 401.0761 36.9678 0.2938 3094 +3206 3 283.8539 401.417 37.3548 0.1907 3205 +3207 3 282.9249 402.005 37.24 0.2796 3206 +3208 3 282.1081 402.5358 36.5078 0.2034 3207 +3209 3 281.2879 403.117 36.12 0.1657 3208 +3210 3 280.328 403.1456 37.1675 0.1398 3209 +3211 3 279.6714 403.1124 35.2377 0.196 3210 +3212 3 278.7356 402.9168 34.7536 0.1956 3211 +3213 3 278.0069 403.26 35.84 0.3232 3212 +3214 3 276.9635 403.4888 36.5394 0.178 3213 +3215 3 275.887 403.7531 36.68 0.1144 3214 +3216 3 275.3539 404.404 36.1544 0.1248 3215 +3217 3 274.9066 404.9199 37.7216 0.1525 3216 +3218 3 274.4673 405.4004 35.84 0.2354 3217 +3219 3 273.7363 406.1074 36.1598 0.2691 3218 +3220 3 272.9321 406.1234 35.84 0.2034 3219 +3221 3 272.089 406.644 35.0672 0.2637 3220 +3222 3 271.1715 407.2182 35.6367 0.1726 3221 +3223 3 270.4164 407.8349 35.6793 0.236 3222 +3224 3 269.6637 407.979 33.9052 0.3051 3223 +3225 3 268.9029 408.2593 32.48 0.179 3224 +3226 3 268.0472 408.8576 32.7146 0.1629 3225 +3227 3 266.9375 408.7512 33.04 0.3062 3226 +3228 3 265.9365 408.6139 32.0146 0.2568 3227 +3229 3 264.9527 408.6974 31.5182 0.2667 3228 +3230 3 263.9059 408.7318 31.4266 0.2288 3229 +3231 3 262.8088 408.8656 31.7685 0.2007 3230 +3232 3 261.6831 408.8141 31.92 0.1652 3231 +3233 3 260.5597 408.932 31.619 0.1693 3232 +3234 3 259.4352 409.075 31.2483 0.14 3233 +3235 3 258.6001 409.679 31.0845 0.1171 3234 +3236 3 257.5968 410.1572 31.0845 0.1144 3235 +3237 3 256.5248 410.5576 31.0845 0.1144 3236 +3238 3 255.4552 410.9614 31.0845 0.1144 3237 +3239 3 254.3135 411.0255 31.0845 0.1144 3238 +3240 3 253.1866 411.2074 31.0845 0.1144 3239 +3241 3 252.0953 411.522 31.0845 0.1173 3240 +3242 3 251.0794 412.0505 31.0845 0.1292 3241 +3243 3 250.075 412.5893 31.019 0.1411 3242 +3244 3 249.1632 413.2254 30.3652 0.1534 3243 +3245 3 248.2503 413.8626 29.7111 0.1657 3244 +3246 3 247.3385 414.4987 29.0573 0.178 3245 +3247 3 304.8096 381.4679 38.6523 0.2153 1 +3248 3 305.1963 381.9381 41.022 0.2092 3247 +3249 3 305.5841 382.4083 43.3919 0.2031 3248 +3250 3 305.9708 382.8785 45.7618 0.1969 3249 +3251 3 306.3586 383.3487 48.1317 0.1908 3250 +3252 3 306.878 384.2765 47.9699 0.3432 3251 +3253 3 307.2967 385.1882 48.9698 0.3432 3252 +3254 3 307.6376 386.0714 49.2293 0.2466 3253 +3255 3 307.6445 387.0918 50.104 0.2488 3254 +3256 3 307.9511 388.0597 49.7342 0.1685 3255 +3257 3 308.2005 389.1419 49.3119 0.146 3256 +3258 3 308.4304 389.9198 50.4 0.1144 3257 +3259 3 308.4807 390.9414 49.8677 0.1616 3258 +3260 3 308.6878 391.8246 49.1817 0.3371 3259 +3261 3 308.7656 392.8633 49.5001 0.2322 3260 +3262 3 308.5368 393.5738 50.2107 0.3432 3261 +3263 3 308.7656 394.2567 49.6667 0.3432 3262 +3264 3 308.4773 394.9214 51.142 0.2143 3263 +3265 3 308.6512 395.8938 50.0354 0.2518 3264 +3266 3 308.6157 396.7998 49.7227 0.3896 3265 +3267 3 308.5368 397.9381 49.7487 0.2531 3266 +3268 3 308.5585 399.0775 49.733 0.2107 3267 +3269 3 308.6787 400.2021 49.8408 0.2771 3268 +3270 3 308.9132 401.2557 49.8532 0.3632 3269 +3271 3 309.1088 402.3185 49.5729 0.2924 3270 +3272 3 309.2232 403.4041 49.8308 0.2644 3271 +3273 3 309.452 404.1512 48.095 0.178 3272 +3274 3 309.4428 404.9737 46.2944 0.1302 3273 +3275 3 309.1088 405.675 44.8711 0.2415 3274 +3276 3 309.325 406.5398 46.0443 0.2161 3275 +3277 3 309.4017 406.6931 46.3918 0.2221 3276 +3278 3 309.5664 407.5592 47.8649 0.1144 3277 +3279 3 309.5664 408.7032 47.88 0.1144 3278 +3280 3 309.7483 409.552 49.1047 0.2597 3279 +3281 3 310.0446 410.0565 51.1157 0.4068 3280 +3282 3 309.9096 411.0564 51.5217 0.3044 3281 +3283 3 309.5721 411.8194 52.8315 0.1191 3282 +3284 3 309.1546 412.6545 51.7496 0.2576 3283 +3285 3 308.3984 413.0755 50.2944 0.3067 3284 +3286 3 307.919 413.9118 49.0896 0.3686 3285 +3287 3 307.5221 414.9505 49.28 0.3257 3286 +3288 3 307.0507 415.6072 49.5709 0.1159 3287 +3289 3 307.2361 416.6459 49.0 0.1242 3288 +3290 3 306.592 417.4696 48.7676 0.2855 3289 +3291 3 306.0841 417.9066 50.0948 0.1811 3290 +3292 3 305.575 418.6903 48.9404 0.2918 3291 +3293 3 305.448 419.5048 49.2313 0.1337 3292 +3294 3 304.8577 419.8869 49.84 0.1407 3293 +3295 3 304.542 420.9691 50.0088 0.1985 3294 +3296 3 304.304 421.588 51.7129 0.3954 3295 +3297 3 303.8922 422.3648 51.938 0.1304 3296 +3298 3 303.0433 422.7137 52.0425 0.31 3297 +3299 3 302.5102 423.6163 51.3766 0.2288 3298 +3300 3 302.421 424.5144 50.7396 0.1495 3299 +3301 3 301.8661 425.3014 50.7237 0.1144 3300 +3302 3 301.2976 425.8071 49.2954 0.2227 3301 +3303 3 300.8526 426.6045 48.4319 0.1968 3302 +3304 3 300.3194 427.284 48.972 0.2669 3303 +3305 3 300.2016 427.6272 50.9886 0.2304 3304 +3306 3 299.5255 428.2095 50.2354 0.3051 3305 +3307 3 298.7979 428.873 49.0008 0.3052 3306 +3308 3 298.3907 429.5102 49.9215 0.1997 3307 +3309 3 298.6275 430.3739 50.9821 0.1925 3308 +3310 3 298.8128 431.3727 50.65 0.1525 3309 +3311 3 298.2957 432.0053 49.2226 0.1199 3310 +3312 3 297.4526 432.4881 48.2731 0.1584 3311 +3313 3 296.7147 432.9617 48.8113 0.2259 3312 +3314 3 296.137 433.8929 49.2744 0.3432 3313 +3315 3 295.621 434.6216 49.8859 0.2779 3314 +3316 3 295.0754 434.9488 48.627 0.1653 3315 +3317 3 294.58 435.4373 49.6874 0.2065 3316 +3318 3 294.1327 435.7679 51.52 0.3305 3317 +3319 3 293.5721 436.7414 51.7588 0.3424 3318 +3320 3 293.0059 437.3512 53.1894 0.3406 3319 +3321 3 292.1078 437.4656 54.5742 0.1614 3320 +3322 3 291.1308 437.9449 54.6 0.2161 3321 +3323 3 290.7876 438.2687 56.558 0.1144 3322 +3324 3 290.4055 439.0203 57.9569 0.1144 3323 +3325 3 290.1218 439.6907 56.2906 0.2096 3324 +3326 3 289.6597 440.329 54.6 0.254 3325 +3327 3 289.2295 441.2316 54.2987 0.2845 3326 +3328 3 289.0179 441.9135 55.8494 0.2187 3327 +3329 3 288.5191 442.7841 55.44 0.3979 3328 +3330 3 288.3955 443.8217 55.9689 0.3409 3329 +3331 3 287.6737 444.4463 56.1383 0.2359 3330 +3332 3 287.3728 445.016 56.1686 0.2592 3331 +3333 3 286.961 444.5904 57.904 0.1165 3332 +3334 3 286.3432 445.2723 57.0769 0.1703 3333 +3335 3 285.476 445.5617 56.8282 0.3426 3334 +3336 3 284.586 445.9953 58.0994 0.3135 3335 +3337 3 283.5839 446.0456 59.0573 0.3711 3336 +3338 3 282.5508 446.0467 58.9596 0.2833 3337 +3339 3 281.948 446.6462 59.3718 0.2876 3338 +3340 3 281.1254 446.7366 58.1423 0.3386 3339 +3341 3 280.2239 446.6702 57.3493 0.2585 3340 +3342 3 279.3728 446.3888 56.7204 0.1144 3341 +3343 3 278.7928 446.16 54.88 0.2288 3342 +3344 3 309.9748 406.8121 46.0188 0.2369 3276 +3345 3 311.0296 407.2548 45.9777 0.2707 3344 +3346 3 312.0843 407.6976 45.9365 0.3044 3345 +3347 3 312.7696 408.2341 44.8417 0.1737 3346 +3348 3 313.178 408.9514 44.1854 0.2288 3347 +3349 3 313.2203 408.7512 46.6082 0.1522 3348 +3350 3 313.7786 408.9571 47.6132 0.1687 3349 +3351 3 314.028 409.671 48.5948 0.2263 3350 +3352 3 314.4044 410.0119 50.4431 0.1761 3351 +3353 3 314.6 410.7978 49.5886 0.3051 3352 +3354 3 315.148 411.1673 50.0436 0.2299 3353 +3355 3 316.0071 411.7256 50.3829 0.2605 3354 +3356 3 316.5414 411.4041 52.6288 0.2288 3355 +3357 3 317.2598 411.3355 53.503 0.2257 3356 +3358 3 317.4806 412.2187 54.0238 0.247 3357 +3359 3 318.5216 412.412 53.5049 0.3432 3358 +3360 3 319.2446 412.0814 55.0458 0.2796 3359 +3361 3 320.3154 412.3491 55.1342 0.2669 3360 +3362 3 321.0236 412.722 56.0829 0.2682 3361 +3363 3 321.6493 413.4153 56.84 0.2924 3362 +3364 3 322.1412 414.3454 57.0713 0.3033 3363 +3365 3 322.608 414.9871 58.52 0.2162 3364 +3366 3 323.0656 415.6381 57.636 0.433 3365 +3367 3 323.935 416.0362 57.12 0.4287 3366 +3368 3 324.2096 417.1127 57.391 0.4539 3367 +3369 3 324.0529 417.949 58.7891 0.3985 3368 +3370 3 324.3126 418.7223 60.2 0.3432 3369 +3371 3 324.8823 419.5231 60.3691 0.2942 3370 +3372 3 325.0459 420.5218 60.6472 0.1473 3371 +3373 3 325.4165 421.4416 60.48 0.3432 3372 +3374 3 325.2667 422.4312 60.6889 0.3119 3373 +3375 3 325.7082 423.2972 60.226 0.38 3374 +3376 3 325.8661 424.0865 61.2926 0.2585 3375 +3377 3 325.9199 425.0177 60.2588 0.2841 3376 +3378 3 325.7071 425.862 61.6358 0.2314 3377 +3379 3 326.0972 426.1366 63.3153 0.2695 3378 +3380 3 326.4507 426.6262 65.0787 0.2192 3379 +3381 3 326.7264 427.419 66.561 0.2398 3380 +3382 3 326.8763 428.3742 66.6456 0.3059 3381 +3383 3 326.8442 429.3947 67.4338 0.3148 3382 +3384 3 327.1096 430.3419 67.7748 0.2868 3383 +3385 3 327.5078 431.161 67.8936 0.1971 3384 +3386 3 328.1713 431.5626 66.7019 0.144 3385 +3387 3 329.0213 431.5454 67.2294 0.1544 3386 +3388 3 329.798 432.1872 66.64 0.2924 3387 +3389 3 329.9948 432.9662 67.7648 0.2911 3388 +3390 3 330.1801 433.004 70.4287 0.3371 3389 +3391 3 330.5645 433.6298 72.228 0.1314 3390 +3392 3 331.2875 434.1526 73.4877 0.1144 3391 +3393 3 331.8538 434.7303 72.4069 0.1975 3392 +3394 3 332.8823 435.0609 72.5502 0.2422 3393 +3395 3 333.5252 435.2909 74.4629 0.3375 3394 +3396 3 334.4678 435.6306 75.5014 0.2812 3395 +3397 3 335.2378 435.7496 74.8157 0.333 3396 +3398 3 335.0776 436.436 73.64 0.3305 3397 +3399 3 305.1414 375.2514 27.8631 0.2871 1 +3400 3 305.353 374.191 28.0683 0.4743 3399 +3401 3 305.4926 373.3318 29.0111 0.2337 3400 +3402 3 306.2442 372.8079 28.9262 0.2288 3401 +3403 3 306.7636 371.8332 28.6373 0.2288 3402 +3404 3 307.4077 371.4568 27.7245 0.2288 3403 +3405 3 308.1215 371.228 29.3124 0.2796 3404 +3406 3 308.8056 370.4718 29.5221 0.2708 3405 +3407 3 309.3708 370.2293 27.7206 0.2075 3406 +3408 3 309.2507 369.3244 27.6763 0.3161 3407 +3409 3 309.4165 368.3817 27.9832 0.2611 3408 +3410 3 310.0515 367.7708 27.1438 0.3432 3409 +3411 3 310.4942 367.113 27.6755 0.2672 3410 +3412 3 310.6818 366.1898 28.5524 0.3049 3411 +3413 3 311.0078 365.2986 28.0162 0.3257 3412 +3414 3 311.9413 364.936 27.2852 0.2056 3413 +3415 3 312.8703 365.2792 28.1708 0.3685 3414 +3416 3 313.8942 365.2598 28.4698 0.394 3415 +3417 3 314.8231 364.8777 27.1281 0.394 3416 +3418 3 315.6307 364.5756 26.8223 0.44 3417 +3419 3 315.9877 363.5438 26.3511 0.425 3418 +3420 3 316.6009 362.8356 27.16 0.1892 3419 +3421 3 316.888 361.8529 27.6231 0.178 3420 +3422 3 317.3445 361.4697 29.5854 0.1598 3421 +3423 3 318.2711 360.94 30.24 0.1525 3422 +3424 3 318.4999 360.1438 28.8812 0.2013 3423 +3425 3 319.5284 359.9882 28.5519 0.1409 3424 +3426 3 320.3394 359.6072 27.2507 0.2127 3425 +3427 3 320.9092 358.914 27.0637 0.4514 3426 +3428 3 321.6127 358.1933 27.6587 0.3943 3427 +3429 3 322.2774 357.3044 27.711 0.3632 3428 +3430 3 322.894 356.451 27.44 0.339 3429 +3431 3 323.784 355.8435 26.861 0.4089 3430 +3432 3 324.3629 354.9649 26.6406 0.1952 3431 +3433 3 325.1225 354.3437 26.88 0.1253 3432 +3434 3 325.7048 353.8392 27.3073 0.1195 3433 +3435 3 326.6944 353.7248 28.238 0.165 3434 +3436 3 327.6416 353.3953 28.1812 0.2288 3435 +3437 3 328.0031 352.8016 26.7358 0.2907 3436 +3438 3 328.7845 352.4664 25.4806 0.2282 3437 +3439 3 329.3999 352.5545 27.3697 0.1705 3438 +3440 3 330.028 352.3955 28.5852 0.1246 3439 +3441 3 330.3872 351.5237 28.9528 0.2258 3440 +3442 3 331.0942 351.3224 29.223 0.2415 3441 +3443 3 331.8161 350.7996 29.2172 0.2773 3442 +3444 3 332.6832 350.1601 28.5925 0.2279 3443 +3445 3 333.5103 349.4268 28.091 0.1652 3444 +3446 3 334.2116 348.5688 27.72 0.2152 3445 +3447 3 334.9003 347.7588 27.6786 0.283 3446 +3448 3 335.5432 346.902 27.7186 0.2272 3447 +3449 3 336.2628 346.3872 28.4866 0.3051 3448 +3450 3 337.011 345.8712 28.056 0.3432 3449 +3451 3 337.5624 345.2741 27.2275 0.1636 3450 +3452 3 338.3426 344.8016 26.5073 0.1194 3451 +3453 3 339.1983 344.8931 28.2192 0.2161 3452 +3454 3 339.9396 344.4401 27.7794 0.2288 3453 +3455 3 340.9086 344.3657 27.9644 0.2288 3454 +3456 3 341.7414 344.3486 28.1212 0.1825 3455 +3457 3 342.5994 344.1358 28.6051 0.3243 3456 +3458 3 343.4437 343.5329 28.6345 0.2217 3457 +3459 3 344.0488 343.2 28.4976 0.2465 3458 +3460 3 344.8565 342.7355 28.4343 0.2288 3459 +3461 3 345.7202 342.3271 28.3228 0.2407 3460 +3462 3 346.6766 341.9096 28.0468 0.2351 3461 +3463 3 346.6503 341.015 27.2863 0.217 3462 +3464 3 347.0416 340.0037 27.141 0.1415 3463 +3465 3 347.6902 339.2898 27.72 0.2476 3464 +3466 3 348.1684 338.6183 27.7253 0.2346 3465 +3467 3 348.7335 337.7294 27.6156 0.3036 3466 +3468 3 349.3902 337.1894 26.9461 0.1828 3467 +3469 3 350.0411 336.7719 28.0 0.2034 3468 +3470 3 351.0959 336.3852 27.7343 0.2493 3469 +3471 3 351.4368 335.8384 26.129 0.1145 3470 +3472 3 351.9928 335.2652 26.6 0.2288 3471 +3473 3 352.4367 334.4427 27.2292 0.2288 3472 +3474 3 352.5957 333.587 27.5131 0.1948 3473 +3475 3 353.1551 332.7965 27.9443 0.1271 3474 +3476 3 354.0165 332.1444 28.5541 0.1765 3475 +3477 3 354.5519 331.156 28.3772 0.1907 3476 +3478 3 355.3424 330.3792 28.6532 0.1843 3477 +3479 3 356.3102 330.1927 28.7787 0.1737 3478 +3480 3 357.4119 330.0978 29.342 0.1626 3479 +3481 3 358.4827 329.8095 29.1673 0.1526 3480 +3482 3 359.2354 329.1585 28.448 0.1755 3481 +3483 3 360.0523 328.4996 28.8271 0.1907 3482 +3484 3 360.9663 328.2525 28.6294 0.2162 3483 +3485 3 361.6287 327.6977 29.7223 0.2288 3484 +3486 3 362.2556 326.9952 29.2754 0.1483 3485 +3487 3 363.347 326.8122 29.3927 0.1144 3486 +3488 3 364.4715 326.6337 29.4 0.1144 3487 +3489 3 365.5949 326.4976 29.4 0.1144 3488 +3490 3 366.7275 326.4461 29.4622 0.1653 3489 +3491 3 367.8486 326.3306 29.0433 0.2346 3490 +3492 3 368.9446 326.2688 28.317 0.2288 3491 +3493 3 369.6802 325.9325 28.1002 0.1144 3492 +3494 3 370.5199 325.9062 29.0976 0.1631 3493 +3495 3 371.2555 326.4953 28.6373 0.2288 3494 +3496 3 372.1695 326.6257 29.0492 0.2115 3495 +3497 3 373.1797 326.8065 28.7468 0.1163 3496 +3498 3 374.279 326.9792 29.12 0.135 3497 +3499 3 375.1862 327.4082 28.2562 0.2131 3498 +3500 3 376.1724 327.7503 28.3825 0.1658 3499 +3501 3 376.9903 327.7182 28.0104 0.1822 3500 +3502 3 377.8335 327.4059 28.7106 0.2647 3501 +3503 3 378.664 326.9563 28.7249 0.2273 3502 +3504 3 379.6913 326.5514 28.2971 0.1318 3503 +3505 3 380.7083 326.2963 28.901 0.1481 3504 +3506 3 381.6601 325.865 29.1032 0.1676 3505 +3507 3 382.676 325.5778 28.28 0.2716 3506 +3508 3 383.6782 325.15 28.4581 0.1782 3507 +3509 3 384.7867 324.9578 28.0563 0.1144 3508 +3510 3 385.8906 324.6752 28.0 0.1144 3509 +3511 3 387.0072 324.451 28.0 0.1144 3510 +3512 3 388.1054 324.1398 28.0 0.1144 3511 +3513 3 389.1591 323.7005 27.9555 0.1265 3512 +3514 3 390.1292 323.5163 28.2047 0.1829 3513 +3515 3 391.1096 323.1159 28.6532 0.201 3514 +3516 3 392.0923 322.608 28.84 0.1493 3515 +3517 3 393.1722 322.6194 29.3171 0.1493 3516 +3518 3 394.2167 322.608 30.2089 0.1441 3517 +3519 3 395.2509 322.7224 29.9594 0.1272 3518 +3520 3 396.158 322.5039 30.3419 0.1591 3519 +3521 3 397.2586 322.608 29.96 0.1144 3520 +3522 3 398.1578 323.1789 29.6918 0.1144 3521 +3523 3 399.1233 323.5232 29.12 0.1144 3522 +3524 3 400.2673 323.5232 29.12 0.1144 3523 +3525 3 401.1951 323.9808 28.8417 0.1144 3524 +3526 3 401.8906 324.6741 28.6916 0.1144 3525 +3527 3 402.9832 324.7816 29.1292 0.1336 3526 +3528 3 404.0482 324.7816 29.9499 0.1652 3527 +3529 3 405.1087 324.8708 30.52 0.1151 3528 +3530 3 406.1646 324.4327 30.52 0.1622 3529 +3531 3 407.0295 323.7211 30.6186 0.2789 3530 +3532 3 407.4608 322.8608 31.08 0.1361 3531 +3533 3 407.9836 322.0246 31.08 0.1144 3532 +3534 3 408.9937 321.5864 30.7045 0.1144 3533 +3535 3 410.1309 321.5784 30.52 0.1144 3534 +3536 3 411.2405 321.6711 30.464 0.2066 3535 +3537 3 411.84 322.0806 30.3604 0.178 3536 +3538 3 412.6751 322.4936 30.4774 0.2913 3537 +3539 3 413.7745 322.5394 30.4746 0.304 3538 +3540 3 414.795 322.8425 30.0507 0.2482 3539 +3541 3 415.876 322.5588 29.68 0.2719 3540 +3542 3 416.5544 323.0393 28.5222 0.1959 3541 +3543 3 417.5474 322.9592 27.7612 0.3079 3542 +3544 3 418.267 322.6183 28.0319 0.1144 3543 +3545 3 419.1353 322.6286 27.2532 0.1941 3544 +3546 3 419.8057 323.22 27.6651 0.1652 3545 +3547 3 420.5367 323.6353 26.8402 0.3432 3546 +3548 3 421.4427 324.0918 27.0337 0.4014 3547 +3549 3 422.4449 323.9282 27.5979 0.3683 3548 +3550 3 423.455 323.8378 28.6516 0.3178 3549 +3551 3 424.424 323.4877 28.5051 0.3051 3550 +3552 3 425.1127 322.8608 27.9359 0.3116 3551 +3553 3 425.7979 322.4284 27.4254 0.3222 3552 +3554 3 426.7166 322.0337 27.6298 0.3972 3553 +3555 3 427.5231 322.2213 28.6698 0.3926 3554 +3556 3 428.2312 322.3849 29.5736 0.1254 3555 +3557 3 429.0092 321.6917 29.5806 0.2151 3556 +3558 3 429.4576 320.892 29.12 0.3051 3557 +3559 3 315.7131 364.7266 26.4046 0.3717 3417 +3560 3 315.9762 365.2712 24.6618 0.3089 3559 +3561 3 316.7393 365.8032 24.2222 0.2924 3560 +3562 3 317.7254 366.1544 24.4348 0.2619 3561 +3563 3 318.6303 365.6716 24.719 0.3421 3562 +3564 3 319.5913 365.8512 24.5347 0.2795 3563 +3565 3 319.9768 365.0058 23.9781 0.1185 3564 +3566 3 320.7147 364.3972 24.059 0.2767 3565 +3567 3 321.7111 364.6214 24.1024 0.1928 3566 +3568 3 322.5314 364.1592 23.52 0.3241 3567 +3569 3 323.6021 364.1146 23.5771 0.1878 3568 +3570 3 324.0506 363.5129 22.7035 0.2669 3569 +3571 3 324.0288 363.236 20.267 0.3432 3570 +3572 3 324.4453 362.2716 20.1659 0.355 3571 +3573 3 325.3387 361.8106 20.8544 0.1997 3572 +3574 3 326.0995 361.0395 21.0 0.2049 3573 +3575 3 326.1189 359.9665 20.4154 0.3065 3574 +3576 3 325.492 359.1863 20.0883 0.1682 3575 +3577 3 325.7014 358.628 19.2147 0.1636 3576 +3578 3 325.9256 357.8215 20.4336 0.2971 3577 +3579 3 325.9496 356.9314 19.4387 0.2669 3578 +3580 3 325.6339 356.5425 16.921 0.2669 3579 +3581 3 325.2575 355.8995 16.4909 0.3288 3580 +3582 3 324.7816 355.5197 15.745 0.3432 3581 +3583 3 324.8514 354.9832 14.5737 0.2288 3582 +3584 3 325.9062 355.0598 14.1168 0.3205 3583 +3585 3 326.6886 354.7029 15.057 0.1568 3584 +3586 3 327.1783 354.537 13.1452 0.198 3585 +3587 3 327.51 353.734 12.0532 0.178 3586 +3588 3 327.9608 352.8405 12.6 0.2601 3587 +3589 3 328.8908 353.2569 12.731 0.188 3588 +3590 3 329.5418 353.6356 13.7203 0.2987 3589 +3591 3 330.457 353.8014 14.5656 0.2418 3590 +3592 3 331.3356 353.5681 13.5542 0.2161 3591 +3593 3 331.6239 354.1366 12.2844 0.2034 3592 +3594 3 332.3995 354.5164 12.087 0.2011 3593 +3595 3 333.5218 354.6503 12.04 0.1314 3594 +3596 3 334.1693 355.4957 11.7888 0.1144 3595 +3597 3 334.7344 355.5632 12.9968 0.3216 3596 +3598 3 335.5352 355.212 13.44 0.2542 3597 +3599 3 301.5344 375.9367 23.3178 0.2033 1 +3600 3 301.1157 375.0272 21.966 0.1935 3599 +3601 3 300.5563 374.2321 22.4974 0.2398 3600 +3602 3 299.8756 373.6796 23.6998 0.1444 3601 +3603 3 298.87 373.6682 23.7132 0.167 3602 +3604 3 297.7626 373.5286 23.3369 0.2288 3603 +3605 3 296.7914 373.3055 22.68 0.1289 3604 +3606 3 296.0008 373.3776 24.0027 0.1762 3605 +3607 3 295.1772 373.0126 24.92 0.2138 3606 +3608 3 294.7665 372.8468 22.7923 0.1303 3607 +3609 3 293.8936 372.9028 22.9284 0.1813 3608 +3610 3 293.4177 372.515 24.3314 0.3422 3609 +3611 3 292.3744 372.1432 24.1287 0.2909 3610 +3612 3 291.3288 371.967 23.9428 0.1969 3611 +3613 3 290.4776 371.6581 22.6307 0.2609 3612 +3614 3 290.0864 371.7371 24.2155 0.2004 3613 +3615 3 289.3073 371.5941 25.2608 0.1628 3614 +3616 3 288.5168 371.4065 25.1384 0.1481 3615 +3617 3 287.8853 370.9866 23.9887 0.3051 3616 +3618 3 286.9999 370.5302 24.2298 0.2929 3617 +3619 3 285.9199 370.3872 24.362 0.2661 3618 +3620 3 285.293 369.5726 24.92 0.1543 3619 +3621 3 284.435 369.2832 24.2001 0.178 3620 +3622 3 283.6582 368.7146 22.902 0.1144 3621 +3623 3 283.3494 368.2536 21.7669 0.1144 3622 +3624 3 283.0256 367.8303 21.9876 0.2088 3623 +3625 3 282.2843 367.6953 23.4424 0.1961 3624 +3626 3 281.6425 367.264 21.9478 0.2569 3625 +3627 3 280.9618 367.1782 20.4596 0.1766 3626 +3628 3 280.2217 366.5376 21.0484 0.178 3627 +3629 3 279.3099 366.1647 21.9526 0.3272 3628 +3630 3 278.516 365.5995 21.5424 0.2307 3629 +3631 3 277.666 365.2826 22.0234 0.4256 3630 +3632 3 276.7645 364.8296 21.5838 0.1968 3631 +3633 3 275.9591 364.0288 21.2383 0.2074 3632 +3634 3 275.1549 363.228 20.893 0.2182 3633 +3635 3 274.3495 362.4272 20.5475 0.2288 3634 +3636 3 274.0086 362.2007 20.417 0.1834 3635 +3637 3 273.1517 361.5669 19.4051 0.178 3636 +3638 3 272.7342 360.5991 18.3408 0.1654 3637 +3639 3 272.1324 359.7468 17.1959 0.178 3638 +3640 3 271.9803 359.1645 16.1445 0.1508 3639 +3641 3 272.3715 358.199 15.171 0.1822 3640 +3642 3 272.1542 357.2151 14.5897 0.2049 3641 +3643 3 271.4209 356.3869 14.5961 0.2288 3642 +3644 3 270.9816 355.5369 13.6086 0.2401 3643 +3645 3 271.0216 354.457 12.964 0.2413 3644 +3646 3 270.4885 353.631 13.2376 0.2288 3645 +3647 3 269.4875 353.3221 14.1644 0.2142 3646 +3648 3 268.451 353.0178 14.4956 0.2111 3647 +3649 3 267.5164 352.4756 13.7063 0.2081 3648 +3650 3 267.0748 351.5409 13.4476 0.2202 3649 +3651 3 267.0119 350.4152 13.8457 0.2375 3650 +3652 3 267.0279 349.2769 13.9997 0.2502 3651 +3653 3 267.1389 348.1398 13.9989 0.2455 3652 +3654 3 267.4718 347.053 13.9941 0.2328 3653 +3655 3 267.5484 345.9353 13.9616 0.238 3654 +3656 3 266.9959 344.9881 13.7052 0.2511 3655 +3657 3 266.0601 344.36 13.6181 0.2746 3656 +3658 3 265.1414 343.6828 13.704 0.2796 3657 +3659 3 264.3864 342.9575 12.7128 0.2583 3658 +3660 3 263.6783 342.1121 12.0123 0.1991 3659 +3661 3 262.7047 341.6579 12.7042 0.1435 3660 +3662 3 261.8227 342.2528 13.4966 0.1274 3661 +3663 3 261.5184 343.3144 12.88 0.1525 3662 +3664 3 270.9919 360.2204 17.9925 0.1387 3639 +3665 3 269.8719 360.249 17.6128 0.1518 3664 +3666 3 268.8034 360.265 16.6219 0.1403 3665 +3667 3 267.8047 360.5842 15.6657 0.1252 3666 +3668 3 267.0828 361.2409 14.6471 0.1144 3667 +3669 3 266.1184 361.5806 15.5982 0.1144 3668 +3670 3 265.2227 361.3873 16.9036 0.1144 3669 +3671 3 264.701 360.6552 16.0037 0.1144 3670 +3672 3 264.4665 359.8097 14.2313 0.1144 3671 +3673 3 264.0878 358.8945 14.0526 0.1217 3672 +3674 3 263.6817 358.2722 15.9303 0.1351 3673 +3675 3 263.3225 358.6898 17.901 0.1484 3674 +3676 3 262.7116 359.3887 19.4491 0.1433 3675 +3677 3 262.0195 360.2342 19.9346 0.1297 3676 +3678 3 261.3628 361.17 20.0416 0.1163 3677 +3679 3 261.0608 360.7032 21.84 0.1271 3678 +3680 3 274.2042 361.7683 21.7151 0.2669 3635 +3681 3 273.7958 360.7021 21.8392 0.2477 3680 +3682 3 273.2158 359.7365 21.835 0.2064 3681 +3683 3 272.3338 359.0341 21.8131 0.1907 3682 +3684 3 271.3351 358.4838 21.6882 0.2009 3683 +3685 3 270.3844 357.8878 21.212 0.2265 3684 +3686 3 269.4475 357.2838 20.7281 0.2415 3685 +3687 3 268.5483 356.5814 20.6886 0.2469 3686 +3688 3 267.8047 355.7337 20.4834 0.2542 3687 +3689 3 267.1949 354.7761 20.1608 0.26 3688 +3690 3 266.4765 353.8998 20.1967 0.2669 3689 +3691 3 265.6414 353.218 19.7008 0.2669 3690 +3692 3 265.1323 352.3417 19.2217 0.2669 3691 +3693 3 264.6838 351.3132 19.4253 0.2592 3692 +3694 3 263.8693 350.5525 19.3225 0.2306 3693 +3695 3 263.0525 349.937 18.2426 0.1836 3694 +3696 3 262.4061 349.2392 16.7065 0.1403 3695 +3697 3 261.5115 348.8525 15.5254 0.1271 3696 +3698 3 260.7073 348.793 16.9098 0.1469 3697 +3699 3 260.0987 348.729 19.2685 0.1931 3698 +3700 3 259.2064 348.3594 20.5587 0.2461 3699 +3701 3 258.1608 347.9247 20.6758 0.2758 3700 +3702 3 257.1346 347.4362 20.396 0.2577 3701 +3703 3 256.2102 346.815 19.7862 0.1985 3702 +3704 3 255.1429 346.4936 20.1709 0.1443 3703 +3705 3 254.2151 346.0783 19.0078 0.1153 3704 +3706 3 253.6122 346.2739 19.6 0.1899 3705 +3707 3 252.8103 346.1824 20.5422 0.1144 3706 +3708 3 251.7692 346.2591 19.88 0.1345 3707 +3709 3 250.7934 345.9959 19.9576 0.1239 3708 +3710 3 250.242 345.4045 21.0 0.2288 3709 +3711 3 249.5258 344.7055 20.2765 0.1935 3710 +3712 3 248.6907 344.2788 21.0423 0.159 3711 +3713 3 247.9037 344.0477 20.0236 0.2161 3712 +3714 3 247.2378 343.4688 19.6 0.178 3713 +3715 3 246.3959 342.8568 20.1303 0.2159 3714 +3716 3 245.2725 342.9197 20.4089 0.1182 3715 +3717 3 244.2188 342.9586 20.3468 0.1652 3716 +3718 3 244.1296 342.4964 20.519 0.1144 3717 +3719 3 244.5872 341.7128 19.32 0.1398 3718 +3720 3 244.1651 343.1943 20.1984 0.1719 3717 +3721 3 243.4123 343.8795 19.88 0.1215 3720 +3722 3 242.2683 343.8864 19.88 0.1144 3721 +3723 3 241.1243 343.8864 19.88 0.1144 3722 +3724 3 240.0375 343.8864 20.5313 0.1191 3723 +3725 3 239.0994 343.4002 20.9782 0.224 3724 +3726 3 238.4885 343.0856 20.9353 0.1674 3725 +3727 3 237.4303 342.9735 20.72 0.1163 3726 +3728 3 236.3596 343.0993 21.28 0.1541 3727 +3729 3 235.6022 342.5685 21.84 0.2862 3728 +3730 3 234.6333 342.342 21.4194 0.1462 3729 +3731 3 233.686 342.4621 21.6006 0.1891 3730 +3732 3 232.8909 342.8339 22.6789 0.1666 3731 +3733 3 232.2709 343.0192 21.1238 0.1185 3732 +3734 3 231.2196 343.0398 21.8156 0.1271 3733 +3735 3 230.2529 342.5571 22.4 0.2012 3734 +3736 3 229.2073 342.3878 21.7767 0.2171 3735 +3737 3 228.7085 341.5252 20.8393 0.167 3736 +3738 3 227.8745 340.7953 20.7152 0.1144 3737 +3739 3 226.7934 340.475 20.44 0.1144 3738 +3740 3 225.7467 340.0151 20.44 0.1372 3739 +3741 3 224.8543 339.3276 20.0712 0.1652 3740 +3742 3 224.1908 338.5554 20.6422 0.1306 3741 +3743 3 223.2996 337.917 20.44 0.1144 3742 +3744 3 222.5663 337.1368 20.16 0.1317 3743 +3745 3 221.7026 336.4161 20.3157 0.1652 3744 +3746 3 220.6787 336.1312 20.7642 0.1497 3745 +3747 3 219.656 335.9814 21.8025 0.1257 3746 +3748 3 218.9044 335.8441 20.5265 0.1925 3747 +3749 3 217.8382 335.6496 20.9936 0.2805 3748 +3750 3 217.0877 335.5421 19.462 0.3127 3749 +3751 3 216.6713 334.9117 20.1984 0.2539 3750 +3752 3 216.4654 334.0549 19.6381 0.2232 3751 +3753 3 216.0776 334.3489 18.5623 0.2557 3752 +3754 3 215.1578 334.0469 18.0796 0.3205 3753 +3755 3 214.5366 333.182 17.6159 0.1936 3754 +3756 3 213.7701 332.7541 16.3534 0.2366 3755 +3757 3 212.9442 332.1696 17.0458 0.2865 3756 +3758 3 211.8951 332.2416 17.36 0.3432 3757 +3759 3 211.8596 333.2186 17.0727 0.3432 3758 +3760 3 211.3723 333.9325 16.1269 0.2819 3759 +3761 3 211.0508 333.333 15.5893 0.3432 3760 +3762 3 210.0784 332.9749 15.1718 0.3009 3761 +3763 3 209.0077 332.8434 14.6695 0.2384 3762 +3764 3 207.9712 332.5928 15.12 0.4115 3763 +3765 3 206.9084 332.2256 14.7008 0.302 3764 +3766 3 205.9177 331.7657 14.6818 0.2727 3765 +3767 3 204.9453 332.157 14.6793 0.2608 3766 +3768 3 204.3607 332.6935 13.1911 0.3037 3767 +3769 3 203.4043 332.7175 12.3166 0.3312 3768 +3770 3 202.5727 332.904 12.0851 0.1533 3769 +3771 3 201.5362 332.8411 12.7812 0.2616 3770 +3772 3 200.6748 332.5608 13.1897 0.1541 3771 +3773 3 199.7824 332.801 14.1159 0.142 3772 +3774 3 198.7483 333.0424 13.8667 0.3057 3773 +3775 3 198.5481 333.484 12.868 0.3686 3774 +3776 3 198.1717 333.7345 11.3226 0.3026 3775 +3777 3 197.7427 334.5102 12.3385 0.2186 3776 +3778 3 196.7028 334.8694 12.9396 0.2089 3777 +3779 3 195.7636 334.8191 12.9847 0.1992 3778 +3780 3 195.5027 334.8431 11.3277 0.1794 3779 +3781 3 194.8655 334.2619 10.9175 0.1261 3780 +3782 3 194.1711 333.5263 11.3341 0.2603 3781 +3783 3 194.1368 332.904 12.04 0.1144 3782 diff --git a/bmtk-vb/docs/examples/biophys_components/morphologies/Scnn1a_473845048_m.swc b/bmtk-vb/docs/examples/biophys_components/morphologies/Scnn1a_473845048_m.swc new file mode 100644 index 0000000..84e566f --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/morphologies/Scnn1a_473845048_m.swc @@ -0,0 +1,3786 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/177300.01.02.01/reconstruction/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01___DS.swc +# id,type,x,y,z,r,pid +1 1 303.16 379.4648 28.56 5.4428 -1 +2 3 302.6646 375.232 23.2562 0.2524 1 +3 3 302.469 374.2356 21.9996 0.2615 2 +4 3 302.0057 373.2918 21.0081 0.3026 3 +5 3 301.2358 372.4956 20.7318 0.36 4 +6 3 300.3366 371.832 20.7847 0.3728 5 +7 3 299.7177 370.8768 20.9602 0.3575 6 +8 3 299.5049 369.798 21.7249 0.3935 7 +9 3 299.5198 368.6563 21.8372 0.4067 8 +10 3 299.6319 367.518 21.8288 0.432 9 +11 3 299.9305 366.414 21.7669 0.3941 10 +12 3 299.9534 365.2803 21.3934 0.3432 11 +13 3 299.2818 364.1844 21.835 0.3426 12 +14 3 298.4113 363.4442 21.8336 0.3307 13 +15 3 297.5372 362.7052 21.8064 0.2929 14 +16 3 297.0465 361.6756 21.639 0.2796 15 +17 3 296.5568 360.9103 20.5181 0.1964 16 +18 3 296.4024 359.8749 19.7562 0.1915 17 +19 3 296.2342 358.7584 19.6034 0.2477 18 +20 3 295.8212 357.6968 19.6199 0.3025 19 +21 3 295.3156 356.6717 19.7109 0.3267 20 +22 3 294.8111 355.6582 20.0852 0.3125 21 +23 3 294.0824 354.8276 20.6212 0.2917 22 +24 3 293.1958 354.116 20.4296 0.2796 23 +25 3 292.2016 353.6642 19.6 0.2759 24 +26 3 291.2704 353.0922 18.898 0.2278 25 +27 3 290.7682 352.0832 18.6127 0.2161 26 +28 3 290.5108 351.0433 17.754 0.2229 27 +29 3 289.7706 350.1956 17.3659 0.2669 28 +30 3 288.9069 349.46 17.3953 0.2585 29 +31 3 288.2308 348.5425 17.535 0.2245 30 +32 3 287.7171 347.5724 18.1266 0.1808 31 +33 3 287.8121 346.4821 18.8541 0.178 32 +34 3 288.0684 345.5772 17.267 0.1907 33 +35 3 288.1038 344.6838 15.5235 0.1907 34 +36 3 288.3566 343.6084 14.8921 0.1932 35 +37 3 289.0007 342.6692 15.113 0.2306 36 +38 3 289.4698 341.6281 15.0758 0.2553 37 +39 3 289.7329 340.523 14.8417 0.2621 38 +40 3 289.9468 339.4706 13.8762 0.2132 39 +41 3 289.9823 338.4535 12.9086 0.1907 40 +42 3 289.2009 337.6253 12.7764 0.193 41 +43 3 288.28 336.9618 12.5132 0.2034 42 +44 3 287.3865 336.447 12.6182 0.1978 43 +45 3 286.7791 336.0088 14.0918 0.1738 44 +46 3 285.6522 336.058 14.2492 0.1515 45 +47 3 284.6936 335.8498 15.4532 0.129 46 +48 3 284.0746 334.9357 15.6929 0.1155 47 +49 3 283.2212 334.4781 14.3422 0.1503 48 +50 3 282.1104 334.62 14.0 0.2288 49 +51 3 297.5086 361.2443 21.7473 0.2584 16 +52 3 298.2465 360.3806 21.812 0.2203 51 +53 3 299.0313 359.5729 21.5678 0.189 52 +54 3 299.8252 358.9929 20.3588 0.1631 53 +55 3 300.6764 358.4941 19.0198 0.1603 54 +56 3 301.6076 357.905 18.9526 0.1896 55 +57 3 302.6681 357.5847 19.1615 0.2288 56 +58 3 303.6462 357.6579 18.0536 0.259 57 +59 3 304.3143 358.2859 16.6068 0.2577 58 +60 3 305.273 358.7092 15.9995 0.2542 59 +61 3 306.3003 358.3855 15.4902 0.2746 60 +62 3 307.2201 357.7723 15.972 0.3216 61 +63 3 308.3194 357.5938 16.03 0.3518 62 +64 3 309.3719 357.9027 15.4003 0.3559 63 +65 3 310.27 358.5879 15.2365 0.3559 64 +66 3 311.2241 359.1908 15.6405 0.4007 65 +67 3 312.3452 359.3235 15.6626 0.4529 66 +68 3 313.3633 359.3281 14.45 0.4576 67 +69 3 314.4902 359.3155 14.0638 0.3872 68 +70 3 315.6227 359.2183 14.3315 0.275 69 +71 3 316.6146 358.6772 14.0784 0.1907 70 +72 3 297.6768 360.9823 21.0529 0.2519 16 +73 3 298.1767 360.1484 21.8341 0.2161 72 +74 3 298.8471 359.2503 21.56 0.2814 73 +75 3 299.5621 358.6211 20.615 0.3759 74 +76 3 300.0815 357.8238 20.72 0.2132 75 +77 3 300.292 357.1762 22.12 0.2339 76 +78 3 299.9568 356.1272 21.84 0.2542 77 +79 3 299.4386 355.2051 21.56 0.1682 78 +80 3 298.7739 355.0896 20.44 0.134 79 +81 3 298.0166 354.9249 20.144 0.1525 80 +82 3 297.3714 353.9856 20.16 0.1773 81 +83 3 296.8543 353.0487 20.16 0.2539 82 +84 3 296.296 352.6552 21.1915 0.2161 83 +85 3 295.9803 351.7892 22.2888 0.1689 84 +86 3 294.9953 351.6496 21.9878 0.2941 85 +87 3 294.31 350.8808 21.5746 0.2539 86 +88 3 294.0755 349.905 21.553 0.306 87 +89 3 294.1178 348.8777 21.5995 0.19 88 +90 3 293.8044 347.8172 21.9859 0.1909 89 +91 3 293.3216 347.2166 20.7444 0.2288 90 +92 3 292.88 346.2968 21.0288 0.2919 91 +93 3 292.0643 345.7408 21.4584 0.287 92 +94 3 291.5095 344.9286 21.9114 0.3051 93 +95 3 291.1274 344.3028 23.312 0.3181 94 +96 3 290.7224 343.3213 24.0131 0.2851 95 +97 3 290.0349 342.9987 22.4826 0.2796 96 +98 3 289.6368 342.072 22.5103 0.1907 97 +99 3 288.7639 341.8547 23.6482 0.1478 98 +100 3 288.5134 341.1408 22.7452 0.1144 99 +101 3 287.9894 340.7335 21.0946 0.1782 100 +102 3 287.5444 339.8401 21.1212 0.3741 101 +103 3 286.763 339.4969 22.6559 0.2734 102 +104 3 286.1144 338.7647 22.4328 0.2962 103 +105 3 285.1912 338.4993 21.5729 0.2551 104 +106 3 284.4579 337.6836 22.12 0.2834 105 +107 3 283.7726 337.0407 22.7903 0.2726 106 +108 3 283.029 336.4676 24.0041 0.3535 107 +109 3 282.2408 335.7526 23.9999 0.3137 108 +110 3 281.6459 335.0204 23.2201 0.2542 109 +111 3 281.1758 334.6051 21.6723 0.3279 110 +112 3 280.7239 333.8936 21.908 0.2878 111 +113 3 280.7204 333.2483 22.5652 0.178 112 +114 3 280.6106 331.9625 21.9254 0.2238 113 +115 3 280.2777 330.8974 21.8338 0.1859 114 +116 3 279.6336 329.9525 21.7932 0.1725 115 +117 3 279.4929 328.9766 21.4362 0.1713 116 +118 3 279.8762 327.9219 20.9927 0.178 117 +119 3 279.557 326.9964 20.8474 0.2002 118 +120 3 278.9838 326.04 20.7374 0.2394 119 +121 3 278.6063 324.9612 20.6027 0.2699 120 +122 3 278.318 323.8927 20.0052 0.2716 121 +123 3 277.9256 322.894 19.0859 0.242 122 +124 3 277.4726 321.933 19.4888 0.2288 123 +125 3 277.1031 320.9 19.395 0.2381 124 +126 3 276.8137 319.8567 18.5102 0.2604 125 +127 3 276.6444 318.7459 18.1843 0.2669 126 +128 3 276.6066 317.6705 18.996 0.2669 127 +129 3 276.5494 316.5757 18.625 0.2793 128 +130 3 276.2028 315.4889 18.4803 0.3048 129 +131 3 275.728 314.449 18.4696 0.3303 130 +132 3 275.259 313.4057 18.4229 0.3305 131 +133 3 274.528 312.5294 18.2322 0.3052 132 +134 3 273.9045 311.621 17.484 0.2668 133 +135 3 273.2902 310.691 17.3606 0.2264 134 +136 3 273.098 309.5881 17.365 0.2087 135 +137 3 272.6953 308.5791 17.3846 0.2034 136 +138 3 271.9505 307.7131 17.4605 0.2263 137 +139 3 271.2458 306.8345 17.8511 0.2724 138 +140 3 270.5903 305.9182 18.3238 0.3157 139 +141 3 269.9634 304.9675 18.482 0.3223 140 +142 3 269.3033 304.034 18.4895 0.2879 141 +143 3 268.6341 303.1097 18.5256 0.2646 142 +144 3 267.8436 302.2906 18.7183 0.2519 143 +145 3 267.0313 301.5218 19.1531 0.2441 144 +146 3 266.2122 300.737 18.8048 0.2542 145 +147 3 265.4572 299.8882 18.48 0.2542 146 +148 3 264.6541 299.0725 18.4803 0.2796 147 +149 3 263.8693 298.2408 18.4806 0.2669 148 +150 3 262.9278 296.9069 18.4859 0.3559 149 +151 3 262.2906 295.9562 18.5091 0.3559 150 +152 3 261.6111 295.0376 18.62 0.3305 151 +153 3 261.3651 294.6338 18.8754 0.3025 152 +154 3 260.9304 293.619 19.4855 0.3546 153 +155 3 260.6215 292.5185 19.6 0.394 154 +156 3 260.5586 291.3768 19.6 0.3813 155 +157 3 260.014 289.9205 19.6003 0.3112 156 +158 3 259.3448 288.995 19.6011 0.339 157 +159 3 258.7293 288.0317 19.605 0.3326 158 +160 3 258.369 286.9518 19.6297 0.309 159 +161 3 258.3507 285.8192 19.8562 0.2725 160 +162 3 258.5589 284.6993 19.7708 0.2447 161 +163 3 258.7442 283.5713 19.696 0.2191 162 +164 3 258.7316 282.4479 20.1611 0.2048 163 +165 3 258.6893 281.3245 20.678 0.1917 164 +166 3 258.8563 280.1953 20.722 0.214 165 +167 3 259.1972 279.1051 20.7326 0.2629 166 +168 3 259.4718 277.9954 20.8085 0.314 167 +169 3 259.3139 276.8892 21.3156 0.3418 168 +170 3 259.2235 275.7669 21.8182 0.3189 169 +171 3 259.1629 274.6252 21.845 0.3057 170 +172 3 258.814 273.5384 21.8708 0.2682 171 +173 3 258.3335 272.5019 22.0217 0.2544 172 +174 3 258.1482 271.4209 22.8038 0.2166 173 +175 3 257.4046 270.5606 23.0583 0.2161 174 +176 3 257.376 269.4589 23.7723 0.2169 175 +177 3 257.3989 268.3172 23.6776 0.2288 176 +178 3 257.3874 267.2041 23.1045 0.2288 177 +179 3 257.3188 266.0727 23.4097 0.2301 178 +180 3 257.0968 264.9618 23.3033 0.2442 179 +181 3 257.1723 263.8533 23.949 0.2722 180 +182 3 257.1106 262.7333 24.2225 0.3092 181 +183 3 256.7182 261.7003 24.6588 0.3283 182 +184 3 256.7685 260.5906 25.1857 0.3077 183 +185 3 256.5054 259.4786 25.2347 0.2504 184 +186 3 256.0947 258.4227 25.4514 0.1821 185 +187 3 255.6668 257.4057 25.9174 0.1493 186 +188 3 255.6074 256.2777 25.9837 0.1433 187 +189 3 255.7744 255.1967 26.7282 0.1525 188 +190 3 256.1485 254.1602 27.2308 0.1567 189 +191 3 256.4379 253.0734 27.1474 0.174 190 +192 3 256.4665 251.9363 27.3862 0.1996 191 +193 3 256.4493 250.7923 27.4484 0.2161 192 +194 3 256.6015 249.6746 27.4938 0.2113 193 +195 3 256.868 248.5843 27.7956 0.1936 194 +196 3 256.836 247.4758 28.4071 0.1882 195 +197 3 256.5386 246.4107 29.0318 0.2138 196 +198 3 256.1176 245.372 29.5506 0.2607 197 +199 3 255.7149 244.3058 29.766 0.3051 198 +200 3 255.303 243.2567 30.1381 0.3051 199 +201 3 254.9782 242.1848 30.6589 0.2826 200 +202 3 254.6853 241.0843 30.8904 0.2599 201 +203 3 254.397 239.9952 31.2897 0.2786 202 +204 3 254.365 238.8992 31.7878 0.3105 203 +205 3 254.564 237.7758 31.9194 0.3367 204 +206 3 254.6452 236.6387 31.9155 0.3308 205 +207 3 254.5835 235.497 31.885 0.293 206 +208 3 254.2243 234.4582 31.5837 0.2349 207 +209 3 254.1087 233.4812 30.8118 0.178 208 +210 3 254.5537 232.7788 32.1006 0.1652 209 +211 3 254.6944 231.755 32.4584 0.1652 210 +212 3 254.9107 230.651 32.0104 0.1652 211 +213 3 255.0411 229.5196 31.9483 0.1438 212 +214 3 255.0559 228.3859 32.2728 0.1281 213 +215 3 256.0421 227.9226 32.51 0.1271 214 +216 3 256.9424 227.7704 34.16 0.178 215 +217 3 261.2107 291.1674 23.0731 0.132 156 +218 3 261.3319 291.7349 25.429 0.1507 217 +219 3 261.3399 292.5185 27.4683 0.1652 218 +220 3 261.0516 292.6535 29.4815 0.1652 219 +221 3 260.2325 292.1364 30.6804 0.1578 220 +222 3 259.1698 291.9866 31.3396 0.1525 221 +223 3 258.0532 292.1456 31.5524 0.1525 222 +224 3 256.9538 292.0003 31.2376 0.1438 223 +225 3 255.8831 291.7978 31.7621 0.1309 224 +226 3 254.9965 292.1799 32.9613 0.1179 225 +227 3 254.2071 292.9223 33.7809 0.1144 226 +228 3 253.8307 293.8776 33.0526 0.1245 227 +229 3 253.9074 294.7356 31.2824 0.1478 228 +230 3 253.2175 295.3328 29.9491 0.1743 229 +231 3 252.1136 295.4414 29.9594 0.2016 230 +232 3 251.4512 295.0376 31.92 0.2288 231 +233 3 261.5584 294.532 16.9543 0.1308 152 +234 3 260.9761 294.4908 15.1875 0.1611 233 +235 3 259.9019 294.8809 15.218 0.178 234 +236 3 258.8769 295.271 15.7959 0.1683 235 +237 3 258.012 295.7366 17.2021 0.1421 236 +238 3 257.2696 296.4184 18.1712 0.1215 237 +239 3 256.3887 296.908 17.7859 0.1144 238 +240 3 256.0638 296.3543 16.7219 0.1144 239 +241 3 256.0901 295.2961 15.757 0.1144 240 +242 3 255.8979 294.2139 16.0994 0.1144 241 +243 3 255.6131 293.1431 16.7947 0.1144 242 +244 3 255.382 292.1215 17.8914 0.1244 243 +245 3 254.6132 291.434 18.7561 0.1374 244 +246 3 253.5539 291.0588 19.1251 0.1503 245 +247 3 252.6421 291.1388 17.7044 0.1415 246 +248 3 251.8459 291.5301 15.9541 0.1284 247 +249 3 251.5736 291.0393 13.6618 0.1147 248 +250 3 251.9088 290.004 12.88 0.1144 249 +251 3 263.0365 298.3815 16.9333 0.1207 149 +252 3 262.135 299.0222 16.2985 0.1144 251 +253 3 261.3262 299.8298 16.282 0.1144 252 +254 3 260.5757 300.6912 16.4343 0.1269 253 +255 3 259.7498 301.4371 17.0794 0.1398 254 +256 3 258.7431 301.778 16.214 0.1652 255 +257 3 257.8336 301.2198 15.2989 0.1652 256 +258 3 257.2444 300.5654 13.564 0.1619 257 +259 3 256.3578 300.4087 12.8741 0.1365 258 +260 3 255.5135 300.5757 14.7162 0.1233 259 +261 3 254.6041 300.7793 16.1795 0.1144 260 +262 3 253.7415 301.3616 17.075 0.1144 261 +263 3 253.2095 302.1521 17.3463 0.1144 262 +264 3 252.9842 302.2036 15.5907 0.1144 263 +265 3 252.7634 301.7597 13.638 0.1205 264 +266 3 251.8688 301.7849 12.1612 0.1337 265 +267 3 251.1 301.2369 12.2864 0.1483 266 +268 3 251.4089 300.9029 14.238 0.142 267 +269 3 251.9157 301.2003 16.6026 0.1286 268 +270 3 251.8173 302.2414 17.01 0.115 269 +271 3 251.4512 303.2744 16.24 0.1144 270 +272 3 279.9357 332.9074 22.2953 0.1951 113 +273 3 279.0079 333.3696 21.2652 0.1359 272 +274 3 278.5423 334.1624 19.686 0.1144 273 +275 3 278.3695 334.811 17.4812 0.1144 274 +276 3 278.2219 335.8178 16.4077 0.1144 275 +277 3 278.2757 336.9412 16.6925 0.1173 276 +278 3 278.1281 337.9959 17.7047 0.1303 277 +279 3 277.9691 339.0152 18.8966 0.1433 278 +280 3 277.7884 340.0757 19.5807 0.1525 279 +281 3 277.0997 340.7496 19.434 0.1525 280 +282 3 276.1044 340.8571 18.5035 0.1525 281 +283 3 275.4924 341.2426 16.3864 0.1462 282 +284 3 274.7716 341.3582 14.527 0.1326 283 +285 3 273.9663 341.8375 13.839 0.1189 284 +286 3 273.7077 342.8522 13.092 0.1144 285 +287 3 274.1756 343.7766 12.2651 0.1363 286 +288 3 274.7888 344.6872 12.88 0.1652 287 +289 3 299.9259 364.1718 19.7714 0.3256 12 +290 3 299.8024 363.1857 18.3994 0.2615 289 +291 3 300.1867 362.3208 17.1349 0.223 290 +292 3 300.7084 361.5806 15.4552 0.2161 291 +293 3 300.5585 360.5739 14.7638 0.2275 292 +294 3 299.617 360.0042 14.3074 0.2288 293 +295 3 298.7053 360.4664 13.1547 0.2163 294 +296 3 297.6917 360.9846 12.9111 0.2035 295 +297 3 296.5614 361.1459 13.0838 0.1907 296 +298 3 295.5204 360.9926 12.2881 0.2142 297 +299 3 294.7459 360.2159 12.3057 0.2714 298 +300 3 295.2927 359.4734 12.292 0.2542 299 +301 3 296.4047 359.4482 12.1187 0.2542 300 +302 3 296.8497 358.4003 12.1646 0.2669 301 +303 2 305.1826 383.232 22.9978 0.3252 1 +304 2 305.4286 384.3028 22.8676 0.3594 303 +305 2 305.3542 385.3575 23.898 0.3686 304 +306 2 305.0865 386.362 24.9337 0.3648 305 +307 2 304.6735 387.419 25.1149 0.3559 306 +308 2 304.3704 388.4772 24.5893 0.3398 307 +309 2 304.1621 389.5011 23.7555 0.2837 308 +310 2 304.6094 390.5399 23.4931 0.2424 309 +311 2 305.2958 391.4505 23.2809 0.2542 310 +312 2 305.6551 392.5178 23.7577 0.2288 311 +313 2 305.8598 393.5657 22.776 0.2282 312 +314 2 305.8427 394.5965 21.9346 0.2222 313 +315 2 306.258 395.6478 21.849 0.2288 314 +316 2 306.7121 396.69 21.8974 0.2352 315 +317 2 307.0999 397.7528 22.2233 0.2615 316 +318 2 307.5667 398.6863 21.7031 0.2938 317 +319 2 308.0163 399.2663 21.0885 0.3298 318 +320 2 308.4384 400.2009 21.0042 0.1924 319 +321 2 308.7679 400.9251 22.3936 0.2136 320 +322 2 309.1717 401.5989 23.984 0.2232 321 +323 2 309.6728 402.3082 25.5769 0.2074 322 +324 2 309.6808 403.0312 24.9942 0.1177 323 +325 2 310.1144 403.5437 24.855 0.2288 324 +326 2 309.7963 404.5504 24.4471 0.2628 325 +327 2 309.8501 405.4039 23.1179 0.1962 326 +328 2 309.9302 406.1703 22.1449 0.3121 327 +329 2 310.4336 407.081 22.12 0.2756 328 +330 2 310.7401 408.1186 22.3076 0.2059 329 +331 2 311.2298 409.0143 22.5123 0.2855 330 +332 2 311.8533 409.4422 20.8029 0.2437 331 +333 2 311.8407 410.2384 20.524 0.2288 332 +334 2 312.7639 410.3803 20.547 0.1144 333 +335 2 312.7696 410.8756 22.7214 0.1416 334 +336 2 313.0373 411.8514 23.52 0.206 335 +337 2 313.2924 412.9314 23.52 0.2539 336 +338 2 313.79 413.2586 22.4 0.178 337 +339 2 314.2271 414.0044 23.3374 0.1955 338 +340 2 314.1607 414.8888 22.4 0.2111 339 +341 2 314.7453 415.7754 21.8711 0.2939 340 +342 2 315.3928 416.4961 21.9904 0.3108 341 +343 2 315.744 417.3472 22.09 0.1484 342 +344 2 316.3869 418.2064 22.3728 0.2844 343 +345 2 316.8743 418.9957 21.7048 0.1824 344 +346 2 316.6947 419.7496 20.4067 0.1816 345 +347 2 317.0596 420.5802 19.1148 0.1398 346 +348 2 317.9874 420.8868 19.88 0.2893 347 +349 2 318.5262 421.5972 19.068 0.2288 348 +350 2 318.8683 422.5444 20.1505 0.3794 349 +351 2 319.2687 423.2548 18.6455 0.2754 350 +352 2 319.7526 423.8806 16.8291 0.1406 351 +353 2 320.0031 424.9411 17.1741 0.2503 352 +354 2 320.6335 425.4628 18.6519 0.15 353 +355 2 320.9995 426.2521 19.6 0.1205 354 +356 2 321.4102 427.0266 20.8057 0.2266 355 +357 2 321.8072 427.7016 20.4691 0.376 356 +358 2 321.845 428.6694 19.7954 0.3971 357 +359 2 322.1767 429.4576 20.5691 0.1525 358 +360 2 322.9512 430.0307 21.2783 0.1781 359 +361 2 323.18 431.1027 20.7068 0.2507 360 +362 2 322.9523 431.7204 19.0282 0.1899 361 +363 2 323.1125 432.7283 18.6379 0.1828 362 +364 2 323.752 433.3346 18.7911 0.4068 363 +365 2 323.752 433.759 19.32 0.2355 364 +366 2 324.2096 434.72 19.32 0.2669 365 +367 2 324.1295 433.8048 17.1441 0.3559 364 +368 2 324.5334 434.7658 17.36 0.3465 367 +369 2 325.1111 435.6466 17.3594 0.1908 368 +370 2 325.2209 436.7346 16.7524 0.1622 369 +371 2 325.6053 437.7996 16.6782 0.2207 370 +372 2 325.992 438.5078 15.96 0.2009 371 +373 2 326.6189 439.2754 16.5161 0.2028 372 +374 2 327.5283 439.4527 16.1672 0.3288 373 +375 2 328.4756 439.7456 16.5374 0.1663 374 +376 2 329.1231 440.4949 17.0103 0.3163 375 +377 2 329.7191 440.9354 17.5314 0.3373 376 +378 2 330.5496 441.3266 17.5174 0.2636 377 +379 2 331.4797 441.0189 17.08 0.3369 378 +380 2 332.4178 441.0738 17.1259 0.2575 379 +381 2 332.9132 441.3861 16.7807 0.3335 380 +382 2 333.8512 441.7934 17.2357 0.2132 381 +383 2 334.6864 442.4042 17.4264 0.1817 382 +384 2 335.5913 442.7383 16.8221 0.2989 383 +385 2 336.1953 442.8802 15.059 0.2078 384 +386 2 336.9778 443.5299 14.3959 0.2288 385 +387 2 337.8026 443.6249 15.3437 0.3432 386 +388 2 338.4776 444.4509 15.9034 0.2161 387 +389 2 338.624 445.3478 15.9034 0.1144 388 +390 2 338.8528 446.0456 14.84 0.2161 389 +391 2 339.2498 447.0306 15.54 0.1461 390 +392 2 339.5312 447.5557 13.3473 0.211 391 +393 2 340.0002 448.2169 13.9244 0.1421 392 +394 2 339.9728 449.1927 14.051 0.1424 393 +395 2 339.6628 450.0656 12.934 0.3336 394 +396 2 340.3892 450.6822 13.7334 0.2288 395 +397 2 341.023 451.5231 13.4697 0.1271 396 +398 2 341.7117 451.9967 13.4613 0.174 397 +399 2 342.485 452.5481 13.5663 0.169 398 +400 2 342.6486 453.1201 12.1834 0.1732 399 +401 2 343.3247 453.7104 12.0081 0.1841 400 +402 2 343.8567 454.3922 13.0046 0.1865 401 +403 2 344.4229 454.6256 14.1635 0.1285 402 +404 2 344.94 455.0546 12.7854 0.247 403 +405 2 345.6024 455.4264 11.76 0.2924 404 +406 3 301.5847 384.1975 25.1188 0.266 1 +407 3 300.9715 385.1219 24.5062 0.2776 406 +408 3 300.0792 385.7717 24.9561 0.2796 407 +409 3 299.601 385.8712 24.8889 0.3178 408 +410 3 299.1022 386.0954 26.0089 0.2034 409 +411 3 298.4959 386.4432 28.1512 0.2161 410 +412 3 297.8358 387.1536 28.3161 0.2895 411 +413 3 297.1563 387.7554 26.7473 0.1968 412 +414 3 296.2708 388.054 26.32 0.3147 413 +415 3 295.4426 388.1192 27.5495 0.3085 414 +416 3 294.6624 388.2358 28.6437 0.1937 415 +417 3 293.6396 388.65 28.9167 0.1824 416 +418 3 292.5494 388.9325 28.5172 0.2393 417 +419 3 291.45 389.071 27.832 0.1925 418 +420 3 290.3094 389.079 27.9558 0.1907 419 +421 3 289.2867 389.1007 26.7179 0.2156 420 +422 3 288.1667 389.238 26.2828 0.279 421 +423 3 287.2012 389.8466 26.124 0.3178 422 +424 3 285.9725 390.6634 26.2811 0.252 423 +425 3 285.0001 391.1222 27.2227 0.3034 424 +426 3 283.8813 391.3269 27.4739 0.3299 425 +427 3 282.7579 391.1416 27.6842 0.3305 426 +428 3 281.6963 390.9128 28.5636 0.3178 427 +429 3 280.6163 390.9254 29.4868 0.2796 428 +430 3 279.597 391.0398 30.196 0.3037 429 +431 3 278.9129 391.6392 28.6348 0.2957 430 +432 3 278.0858 392.2936 27.7707 0.2836 431 +433 3 277.1981 392.9571 28.1789 0.2615 432 +434 3 276.3172 393.6641 28.5155 0.2633 433 +435 3 275.4191 394.3723 28.5597 0.2577 434 +436 3 274.4902 395.0381 28.5578 0.2542 435 +437 3 273.5396 395.6753 28.5491 0.2635 436 +438 3 272.5157 396.1786 28.4962 0.2669 437 +439 3 271.4151 396.3663 28.0876 0.2479 438 +440 3 270.6224 396.3525 26.2741 0.2122 439 +441 3 269.6477 396.0951 25.2118 0.2034 440 +442 3 268.5243 396.0036 24.8928 0.2034 441 +443 3 267.4134 396.2233 24.6056 0.225 442 +444 3 266.417 396.1512 23.3486 0.2515 443 +445 3 266.2786 395.2142 22.104 0.3019 444 +446 3 265.5167 394.5473 20.9006 0.3051 445 +447 3 264.7662 393.6939 20.7833 0.2663 446 +448 3 263.9723 392.8851 21.0798 0.2611 447 +449 3 263.0525 392.4366 20.6038 0.2818 448 +450 3 262.0183 392.543 20.5906 0.2924 449 +451 3 260.9647 392.4046 21.2766 0.267 450 +452 3 260.0506 391.8475 20.7978 0.2365 451 +453 3 259.4089 391.2011 19.1794 0.2195 452 +454 3 258.5863 390.5296 18.559 0.2256 453 +455 3 257.7066 389.8066 18.7202 0.219 454 +456 3 256.645 389.6384 18.3042 0.2059 455 +457 3 255.6668 390.0216 17.3244 0.1929 456 +458 3 255.0079 390.7035 15.8211 0.1907 457 +459 3 254.0561 391.0901 14.7022 0.1907 458 +460 3 252.9807 391.3727 14.478 0.1907 459 +461 3 251.9111 391.7022 14.1028 0.1821 460 +462 3 250.9181 392.1678 13.3364 0.1691 461 +463 3 249.9766 392.7787 12.8573 0.1563 462 +464 3 248.971 393.3072 12.6571 0.1525 463 +465 3 248.0707 393.9902 12.8103 0.1525 464 +466 3 247.5399 394.974 12.8797 0.1718 465 +467 3 247.652 396.0734 12.8789 0.2074 466 +468 3 247.7172 397.2094 12.8719 0.2458 467 +469 3 247.9586 398.3202 12.8086 0.2437 468 +470 3 248.9413 398.6977 12.6235 0.2086 469 +471 3 250.0704 398.7469 12.9685 0.1694 470 +472 3 251.1606 398.4941 13.4901 0.1538 471 +473 3 252.2577 398.263 13.0374 0.1525 472 +474 3 253.3868 398.3522 12.7434 0.1408 473 +475 3 254.4977 398.2241 12.185 0.1398 474 +476 3 255.112 397.3112 12.88 0.1525 475 +477 3 279.4495 390.8934 30.7238 0.2453 429 +478 3 278.5423 390.9094 30.9336 0.2048 477 +479 3 277.7758 391.1279 31.9984 0.1731 478 +480 3 276.7862 390.7996 31.8228 0.2484 479 +481 3 276.0014 390.4975 30.2618 0.1945 480 +482 3 275.4054 390.2493 28.856 0.2183 481 +483 3 274.7327 389.7528 27.2588 0.1832 482 +484 3 273.8416 389.4496 27.2994 0.2605 483 +485 3 273.9308 389.1671 29.3796 0.2519 484 +486 3 273.8862 389.1682 31.8548 0.3621 485 +487 3 272.9996 389.0744 32.9714 0.2619 486 +488 3 272.1942 389.532 32.3515 0.1144 487 +489 3 271.5925 390.056 31.2754 0.2542 488 +490 3 270.6658 390.0571 32.4526 0.2258 489 +491 3 269.7438 390.2356 33.3948 0.13 490 +492 3 268.7794 390.5765 34.44 0.264 491 +493 3 268.0106 390.2115 33.6622 0.2739 492 +494 3 267.2922 389.4576 34.1312 0.1271 493 +495 3 266.3518 389.0675 33.5334 0.2814 494 +496 3 265.368 388.6134 34.3104 0.2591 495 +497 3 264.5237 388.1603 33.99 0.2398 496 +498 3 263.6245 388.1661 35.3114 0.2223 497 +499 3 262.7654 387.9098 35.56 0.1689 498 +500 3 262.2048 387.816 36.0805 0.3432 499 +501 3 261.6031 388.3194 35.567 0.2444 500 +502 3 260.6593 388.8033 36.3129 0.2542 501 +503 3 259.6308 388.8559 36.7486 0.2696 502 +504 3 258.7453 388.7049 37.9579 0.2078 503 +505 3 257.8519 388.3297 37.3388 0.2045 504 +506 3 256.8028 388.1626 37.2663 0.1459 505 +507 3 255.8888 388.1214 38.355 0.125 506 +508 3 254.9164 387.5586 38.3541 0.2542 507 +509 3 253.8158 387.3309 38.5255 0.2542 508 +510 3 252.9373 386.9992 38.5213 0.2415 509 +511 3 252.3858 386.553 39.2498 0.1945 510 +512 3 251.839 385.7476 38.9091 0.2392 511 +513 3 250.989 385.3587 39.2 0.2725 512 +514 3 250.0029 385.5131 39.508 0.2288 513 +515 3 249.2639 385.2557 38.6526 0.2875 514 +516 3 248.1805 385.0784 39.1978 0.1816 515 +517 3 247.1132 384.8565 39.4895 0.1269 516 +518 3 246.1877 385.2168 39.7379 0.1789 517 +519 3 245.2336 384.9285 40.0249 0.235 518 +520 3 244.1765 384.7661 40.1657 0.1906 519 +521 3 243.0748 384.6208 39.7701 0.202 520 +522 3 242.004 384.6837 40.1551 0.2161 521 +523 3 240.9378 384.3474 40.46 0.1808 522 +524 3 239.9826 384.0545 40.2576 0.2161 523 +525 3 239.0079 383.5981 40.6 0.1604 524 +526 3 238.0595 382.9883 40.9763 0.1652 525 +527 3 237.1638 382.2951 41.2821 0.1568 526 +528 3 236.1628 381.7883 41.2378 0.1525 527 +529 3 235.4649 380.9348 41.4308 0.1645 528 +530 3 234.79 380.3674 41.44 0.2415 529 +531 3 234.0349 379.5941 41.8566 0.1415 530 +532 3 233.1529 378.9248 41.7665 0.2098 531 +533 3 232.137 378.4455 41.72 0.2134 532 +534 3 231.0972 378.0359 41.4546 0.2728 533 +535 3 230.087 377.5486 41.274 0.2541 534 +536 3 229.0997 377.0773 41.72 0.2034 535 +537 3 228.3195 376.3302 41.804 0.1144 536 +538 3 227.2865 375.8887 41.8964 0.1144 537 +539 3 226.1562 375.804 42.0006 0.1146 538 +540 3 225.0545 375.7319 42.408 0.1452 539 +541 3 223.9998 375.6896 42.0014 0.3295 540 +542 3 223.088 375.6747 42.2831 0.2534 541 +543 3 222.0412 375.28 42.8243 0.1151 542 +544 3 220.9922 374.8259 42.84 0.1144 543 +545 3 219.8562 374.7744 42.84 0.1144 544 +546 3 218.7122 374.7744 42.84 0.1144 545 +547 3 217.6014 374.676 42.84 0.1144 546 +548 3 217.1472 373.8157 43.2247 0.2288 547 +549 3 216.788 373.5103 44.518 0.2288 548 +550 3 216.0021 373.1945 43.96 0.2309 549 +551 3 215.2928 372.4235 43.1281 0.2147 550 +552 3 214.4531 371.6833 42.8305 0.2083 551 +553 3 213.396 371.4637 43.3462 0.3256 552 +554 3 212.3722 371.1228 44.032 0.3686 553 +555 3 211.4444 371.379 44.1913 0.4129 554 +556 3 210.3862 371.1662 43.4162 0.1591 555 +557 3 209.3612 370.7635 43.4 0.1144 556 +558 3 208.7674 370.0977 44.52 0.178 557 +559 3 208.4368 369.2249 43.7898 0.2497 558 +560 3 207.6829 368.7798 43.5193 0.3636 559 +561 3 206.6396 368.622 43.3784 0.3898 560 +562 3 205.5871 368.4641 42.9618 0.3296 561 +563 3 204.6639 368.2387 42.0204 0.3217 562 +564 3 203.7944 367.9298 41.72 0.3305 563 +565 3 202.734 367.9104 42.142 0.384 564 +566 3 201.6586 367.8269 41.4999 0.2598 565 +567 3 200.7846 368.193 40.88 0.2663 566 +568 3 199.9415 367.7949 41.6248 0.2775 567 +569 3 199.1704 367.224 41.16 0.2669 568 +570 3 287.2115 390.1829 25.6178 0.2688 423 +571 3 287.2481 391.1565 24.1534 0.1433 570 +572 3 287.3385 392.1186 22.6792 0.1828 571 +573 3 287.1875 393.0075 20.9756 0.2215 572 +574 3 287.3877 393.8197 19.1523 0.2448 573 +575 3 287.978 394.203 17.3737 0.188 574 +576 3 287.9013 393.5371 15.2382 0.1738 575 +577 3 287.4414 392.6288 14.187 0.1697 576 +578 3 286.7058 391.7571 13.9997 0.1735 577 +579 3 285.8135 391.1931 13.9983 0.1699 578 +580 3 284.6867 391.0547 13.9882 0.1727 579 +581 3 283.815 390.4472 13.9205 0.1652 580 +582 3 283.4146 389.4016 14.0134 0.1531 581 +583 3 282.9638 388.5413 14.996 0.1398 582 +584 3 282.3609 387.8046 16.483 0.1465 583 +585 3 281.6688 386.9992 17.1492 0.1663 584 +586 3 280.7376 386.6194 16.4133 0.178 585 +587 3 280.2411 385.9044 15.8567 0.1697 586 +588 3 279.5925 385.0681 15.4342 0.1652 587 +589 3 278.6738 384.6563 16.4245 0.1763 588 +590 3 278.8031 384.1209 18.6477 0.178 589 +591 3 278.9198 383.0901 19.6624 0.1544 590 +592 3 279.033 382.0022 20.477 0.1286 591 +593 3 279.5536 381.1865 21.9338 0.1149 592 +594 3 280.248 380.3972 23.0336 0.1144 593 +595 3 281.1952 379.9224 24.08 0.1271 594 +596 3 299.696 386.1835 25.3509 0.3103 409 +597 3 299.9831 387.1319 26.752 0.2875 596 +598 3 300.2714 388.0791 28.1529 0.2647 597 +599 3 300.5425 388.6054 27.4324 0.1144 598 +600 3 300.9624 389.524 27.6203 0.3407 599 +601 3 301.6087 390.1395 28.4374 0.1485 600 +602 3 301.3285 390.8613 27.0418 0.223 601 +603 3 301.0585 391.7571 27.5248 0.268 602 +604 3 300.848 392.8645 27.8715 0.1875 603 +605 3 300.594 393.925 28.289 0.1234 604 +606 3 300.3023 394.6823 29.4 0.1972 605 +607 3 300.3057 395.7085 28.5732 0.2433 606 +608 3 300.1856 396.8376 28.5625 0.2789 607 +609 3 299.9808 397.9335 28.1716 0.2464 608 +610 3 299.704 398.5971 26.88 0.1144 609 +611 3 299.9991 399.5134 27.5587 0.1808 610 +612 3 300.2417 400.4343 28.6289 0.1144 611 +613 3 299.6422 401.1836 29.6425 0.2635 612 +614 3 299.5118 402.0256 31.2648 0.3303 613 +615 3 299.855 402.99 30.5864 0.2415 614 +616 3 299.9728 403.9144 30.87 0.307 615 +617 3 299.9568 404.6522 32.48 0.1268 616 +618 3 299.9362 405.7768 32.3028 0.1144 617 +619 3 299.3688 406.263 30.5458 0.1144 618 +620 3 299.0016 406.9208 31.5487 0.24 619 +621 3 298.0989 406.9757 31.8665 0.236 620 +622 3 297.2993 407.1645 32.6116 0.2123 621 +623 3 296.868 407.6873 32.9731 0.3432 622 +624 3 296.2994 407.9115 32.0695 0.3178 623 +625 3 295.4849 408.5018 31.3928 0.3167 624 +626 3 295.0971 408.8656 33.0562 0.2288 625 +627 3 295.3042 408.7009 35.5289 0.3051 626 +628 3 295.1463 407.4013 34.72 0.2931 627 +629 3 295.0365 406.4392 34.2241 0.2539 628 +630 3 295.6004 406.2573 36.6134 0.2542 629 +631 3 296.1255 406.112 38.8612 0.2488 630 +632 3 295.1863 406.4117 38.332 0.2931 631 +633 3 294.564 407.0958 37.6662 0.3342 632 +634 3 293.6865 407.7205 37.828 0.4068 633 +635 3 293.6648 407.9024 40.3287 0.2653 634 +636 3 293.0493 408.4412 41.097 0.2386 635 +637 3 292.7874 409.4296 41.44 0.1907 636 +638 3 293.2324 410.1869 41.6993 0.305 637 +639 3 293.4646 410.8447 42.0742 0.3589 638 +640 3 293.5687 411.8457 42.7207 0.2804 639 +641 3 293.436 412.7987 42.9685 0.2103 640 +642 3 293.9016 413.3135 44.8232 0.36 641 +643 3 293.889 414.0228 45.7422 0.293 642 +644 3 293.8501 415.0604 45.6753 0.4261 643 +645 3 293.3937 416.0602 46.1387 0.4676 644 +646 3 293.0242 417.1299 46.2 0.3605 645 +647 3 292.9784 418.1228 45.9802 0.5101 646 +648 3 293.2072 418.9866 46.1664 0.2702 647 +649 3 293.0287 419.9624 46.2552 0.2288 648 +650 3 292.3721 420.094 48.16 0.4438 649 +651 3 291.6056 419.8652 49.0 0.3704 650 +652 3 291.3265 418.9683 49.628 0.4449 651 +653 3 290.6904 418.9763 51.2089 0.178 652 +654 3 290.8117 419.8549 50.4851 0.2786 653 +655 3 290.7476 420.571 51.7454 0.3892 654 +656 3 290.2408 421.4061 52.8763 0.2644 655 +657 3 290.3426 422.446 52.8864 0.3456 656 +658 3 290.576 423.5042 53.48 0.3228 657 +659 3 290.3278 424.3474 53.9879 0.2611 658 +660 3 290.528 425.2168 52.9836 0.2034 659 +661 3 290.9192 425.3907 54.985 0.237 660 +662 3 291.0919 425.8162 56.3242 0.3432 661 +663 3 291.8699 426.3208 56.3749 0.1574 662 +664 3 292.0449 427.2565 57.4 0.2137 663 +665 3 292.5116 427.1993 58.3377 0.1731 664 +666 3 292.737 427.967 59.7498 0.2415 665 +667 3 293.6431 428.476 60.6522 0.366 666 +668 3 293.6923 429.4736 60.5377 0.2927 667 +669 3 294.1201 430.2916 61.9864 0.2131 668 +670 3 294.4988 431.2686 62.72 0.2034 669 +671 3 294.8809 432.2913 63.212 0.1734 670 +672 3 294.9232 433.3781 63.84 0.1144 671 +673 3 295.4609 434.2292 63.5986 0.1255 672 +674 3 295.2206 435.1936 62.9821 0.2897 673 +675 3 294.8637 436.2106 63.56 0.3375 674 +676 3 294.2608 436.6648 64.0494 0.2347 675 +677 3 294.3581 437.0172 66.1256 0.2266 676 +678 3 293.6431 437.7219 66.6543 0.1398 677 +679 3 293.0939 437.8088 64.5411 0.2034 678 +680 3 292.5208 438.2538 65.8417 0.1875 679 +681 3 291.9488 438.5112 66.915 0.2115 680 +682 3 291.6033 438.9082 68.3133 0.1952 681 +683 3 290.8345 439.4802 68.3544 0.1257 682 +684 3 290.0109 440.1311 68.32 0.2802 683 +685 3 289.7752 441.1744 68.7425 0.275 684 +686 3 289.5235 442.1926 69.6147 0.1144 685 +687 3 289.1815 442.9785 67.9496 0.1144 686 +688 3 288.5912 443.8056 67.0709 0.1144 687 +689 3 288.0638 444.706 67.405 0.1144 688 +690 3 287.565 445.6463 67.8146 0.1731 689 +691 3 287.3476 446.6942 68.1652 0.2118 690 +692 3 286.4507 446.748 69.6704 0.1948 691 +693 3 286.2883 447.6358 69.991 0.2389 692 +694 3 286.0 448.3302 68.5292 0.1271 693 +695 3 285.9851 449.0463 66.6526 0.1473 694 +696 3 285.5424 448.9216 68.5896 0.3173 695 +697 3 285.3113 449.314 70.56 0.3201 696 +698 3 284.7416 450.2784 70.28 0.3305 697 +699 3 294.1464 409.4937 35.1772 0.2682 627 +700 3 293.2072 410.1354 34.8916 0.2382 699 +701 3 292.268 410.7784 34.6063 0.2082 700 +702 3 291.6571 410.7235 34.7637 0.2034 701 +703 3 290.8162 410.5816 35.9296 0.2966 702 +704 3 290.6298 410.2384 37.602 0.3097 703 +705 3 289.7821 410.8287 38.08 0.3302 704 +706 3 288.892 411.4968 37.9756 0.1663 705 +707 3 288.0867 411.1891 37.0972 0.139 706 +708 3 287.033 411.4373 37.5164 0.1403 707 +709 3 286.2997 411.165 38.871 0.3051 708 +710 3 285.4177 411.1536 38.4384 0.1144 709 +711 3 284.7851 411.7302 38.2794 0.1939 710 +712 3 284.0289 412.1924 38.9096 0.2076 711 +713 3 283.3905 412.9348 38.0534 0.2924 712 +714 3 282.8323 413.4256 37.52 0.2537 713 +715 3 282.5188 414.366 36.9275 0.2004 714 +716 3 282.576 415.3624 37.2686 0.1548 715 +717 3 281.9949 415.9584 38.9211 0.1144 716 +718 3 280.8966 416.0728 39.2 0.1144 717 +719 3 279.7526 416.0728 39.2 0.1322 718 +720 3 278.8214 416.0728 40.3066 0.2614 719 +721 3 277.8913 416.3405 39.485 0.299 720 +722 3 277.11 415.7296 39.6396 0.3594 721 +723 3 276.0197 415.5111 40.2094 0.3213 722 +724 3 274.9673 415.8348 40.171 0.2834 723 +725 3 274.2271 415.836 38.8486 0.3212 724 +726 3 273.4995 416.297 38.08 0.1902 725 +727 3 272.4116 416.6219 38.08 0.1576 726 +728 3 271.3465 416.8736 38.187 0.1144 727 +729 3 270.4874 416.8736 39.9459 0.1155 728 +730 3 269.8341 417.3312 41.16 0.1144 729 +731 3 268.7107 417.3312 41.5554 0.1515 730 +732 3 267.736 417.4078 42.8954 0.1773 731 +733 3 267.0279 416.8644 43.1659 0.2288 732 +734 3 266.2706 416.8725 41.7393 0.1938 733 +735 3 265.8359 417.4124 40.4373 0.4306 734 +736 3 264.8005 417.7625 40.6266 0.2631 735 +737 3 263.986 418.084 40.0389 0.2288 736 +738 3 263.0685 418.2807 38.9225 0.1271 737 +739 3 262.6944 418.942 40.5563 0.24 738 +740 3 262.5423 419.8789 41.3003 0.2861 739 +741 3 262.0973 420.706 41.44 0.2558 740 +742 3 262.2883 421.5388 42.0403 0.2691 741 +743 3 262.0435 422.2447 40.3976 0.1467 742 +744 3 261.9794 422.9196 38.64 0.1144 743 +745 3 261.7461 423.8303 37.7292 0.133 744 +746 3 261.1054 424.6162 36.7794 0.1772 745 +747 3 260.9052 425.6607 36.7069 0.3132 746 +748 3 260.5929 426.5965 36.1645 0.2106 747 +749 3 260.1456 427.6135 36.12 0.1445 748 +750 3 259.8516 428.5733 35.7227 0.1722 749 +751 3 259.3677 429.2139 35.7098 0.2847 750 +752 3 259.2327 430.3133 36.12 0.3411 751 +753 3 259.8459 431.0649 36.6016 0.2375 752 +754 3 260.0712 431.9138 38.2928 0.1518 753 +755 3 260.1387 431.6941 40.329 0.1144 754 +756 3 260.26 432.0739 42.3195 0.1907 755 +757 3 260.7256 433.0292 42.2408 0.1907 756 +758 3 261.38 433.9009 42.28 0.2241 757 +759 3 261.0688 434.6022 42.8389 0.3056 758 +760 3 260.8892 435.5219 43.7461 0.2771 759 +761 3 260.8457 436.4577 44.1017 0.1178 760 +762 3 261.6328 437.0469 44.1913 0.2542 761 +763 3 261.6408 438.0101 42.7336 0.2433 762 +764 3 262.2048 438.724 41.44 0.178 763 +765 3 304.9355 375.1977 30.2879 0.3278 1 +766 3 304.9984 374.1532 31.3407 0.3083 765 +767 3 305.0442 373.047 32.018 0.294 766 +768 3 305.3347 371.9785 32.6869 0.2924 767 +769 3 306.0303 371.0861 32.753 0.2693 768 +770 3 306.6778 370.2556 31.7075 0.2552 769 +771 3 307.116 369.2821 30.7244 0.3017 770 +772 3 307.9945 368.5922 30.2492 0.368 771 +773 3 309.1088 368.4847 30.8 0.394 772 +774 3 309.9565 368.4916 30.8 0.3645 773 +775 3 311.0982 368.5499 30.8006 0.3567 774 +776 3 312.1839 368.9022 30.8025 0.3197 775 +777 3 313.0785 369.6104 30.8106 0.3299 776 +778 3 314.0738 370.1721 30.856 0.3797 777 +779 3 315.18 369.9536 31.1878 0.4066 778 +780 3 316.2451 369.6275 31.8214 0.394 779 +781 3 317.1706 369.3896 31.6772 0.3726 780 +782 3 318.2482 369.1345 31.0097 0.3686 781 +783 3 319.3785 369.1299 30.8162 0.326 782 +784 3 320.3292 369.7145 30.8193 0.2639 783 +785 3 321.0693 370.5794 30.9002 0.2001 784 +786 3 321.9239 371.3081 31.362 0.1685 785 +787 3 322.9432 371.7176 30.7787 0.1882 786 +788 3 323.903 371.903 29.349 0.2542 787 +789 3 325.1671 371.7211 28.2125 0.2892 788 +790 3 326.2722 371.8469 27.8522 0.2696 789 +791 3 327.3705 371.9613 28.2954 0.2415 790 +792 3 328.4859 371.7474 28.4099 0.2529 791 +793 3 329.5933 371.6536 27.8642 0.2989 792 +794 3 330.6503 371.514 26.9097 0.3472 793 +795 3 331.7348 371.2646 26.6641 0.3518 794 +796 3 332.8434 371.0884 27.1762 0.3345 795 +797 3 333.9599 370.9626 27.3795 0.3178 796 +798 3 335.0822 371.0953 27.0542 0.3226 797 +799 3 336.1861 371.1216 26.4715 0.3355 798 +800 3 337.3038 370.9226 26.1551 0.3328 799 +801 3 338.4192 370.9054 26.2452 0.3123 800 +802 3 339.4683 371.2978 26.5978 0.2876 801 +803 3 340.4578 371.7348 26.1926 0.2607 802 +804 3 341.3559 372.2713 25.8188 0.2353 803 +805 3 342.1555 373.0538 25.6956 0.2096 804 +806 3 342.9163 373.8672 25.0858 0.21 805 +807 3 343.6198 374.652 24.1058 0.2366 806 +808 3 344.4893 375.2503 23.2224 0.286 807 +809 3 345.5441 375.6461 22.9561 0.3352 808 +810 3 346.6709 375.7548 22.932 0.3735 809 +811 3 347.7863 375.5546 22.7942 0.3999 810 +812 3 348.8411 375.216 22.2068 0.3948 811 +813 3 349.8764 374.9357 21.2456 0.3482 812 +814 3 350.9678 374.7103 20.7687 0.2889 813 +815 3 352.0797 374.7813 20.7197 0.2744 814 +816 3 353.0281 375.3636 20.7183 0.3106 815 +817 3 353.8552 376.1529 20.7136 0.3305 816 +818 3 354.68 376.9457 20.694 0.2994 817 +819 3 355.5609 377.6722 20.601 0.2406 818 +820 3 356.5791 378.0748 20.1124 0.2082 819 +821 3 357.6258 378.4672 20.0402 0.2288 820 +822 3 358.4747 379.188 20.4714 0.2768 821 +823 3 359.2778 379.9796 20.3031 0.3104 822 +824 3 360.1815 380.3674 19.1052 0.3087 823 +825 3 361.2523 380.3285 18.4184 0.2636 824 +826 3 362.3734 380.1718 18.1129 0.2508 825 +827 3 363.4671 380.0654 17.5246 0.238 826 +828 3 364.5825 380.1146 17.3424 0.2177 827 +829 3 365.6727 379.7771 17.2281 0.183 828 +830 3 366.6142 379.2314 16.7706 0.1611 829 +831 3 367.4105 378.4993 16.2392 0.1614 830 +832 3 368.4767 378.3174 16.235 0.1924 831 +833 3 369.5829 378.6114 16.2044 0.2259 832 +834 3 370.6171 379.0324 15.9354 0.2313 833 +835 3 371.6318 379.4007 15.6229 0.1997 834 +836 3 372.7289 379.2337 15.9883 0.1722 835 +837 3 373.683 378.7109 16.7238 0.1713 836 +838 3 374.652 378.1904 17.2309 0.1905 837 +839 3 375.7685 378.0337 17.3594 0.2102 838 +840 3 376.7764 378.4386 17.3552 0.2306 839 +841 3 377.7168 379.0873 17.3337 0.2488 840 +842 3 378.7727 379.4705 17.1931 0.2542 841 +843 3 379.8618 379.4133 16.6001 0.2624 842 +844 3 380.9749 379.3996 16.5245 0.2843 843 +845 3 382.08 379.2246 16.3531 0.328 844 +846 3 383.2091 379.1205 16.24 0.3522 845 +847 3 384.3497 379.1971 16.24 0.3653 846 +848 3 385.3861 379.0781 15.2995 0.2233 847 +849 3 386.3425 378.7784 15.12 0.1146 848 +850 3 387.4842 378.759 15.2163 0.1403 849 +851 3 388.4612 378.8276 15.68 0.1859 850 +852 3 389.5858 378.8928 16.0115 0.1328 851 +853 3 390.4758 378.7509 15.4241 0.1438 852 +854 3 391.3292 378.8505 15.4104 0.2302 853 +855 3 391.8314 378.4421 14.0403 0.2428 854 +856 3 392.7421 378.092 14.7252 0.1468 855 +857 3 393.4491 378.6125 13.72 0.1144 856 +858 3 394.5667 378.7406 13.72 0.1144 857 +859 3 395.5963 379.0072 13.8774 0.1144 858 +860 3 396.7049 378.918 13.44 0.1144 859 +861 3 397.8374 378.7921 13.44 0.1481 860 +862 3 398.8327 378.4798 13.9776 0.1455 861 +863 3 399.5695 377.6619 13.9605 0.1497 862 +864 3 400.3234 377.1894 13.4246 0.2267 863 +865 3 401.083 376.7741 13.7911 0.2342 864 +866 3 401.9753 376.2639 13.7155 0.2288 865 +867 3 402.863 376.0271 13.7511 0.1944 866 +868 3 403.6432 375.6095 14.0017 0.1144 867 +869 3 404.4063 375.3567 13.9342 0.1708 868 +870 3 405.2803 375.693 13.16 0.1564 869 +871 3 406.1486 376.2261 12.5938 0.1296 870 +872 3 407.0123 375.6473 12.3544 0.1773 871 +873 3 407.8406 375.0879 12.7042 0.1951 872 +874 3 408.6162 375.5088 13.0488 0.131 873 +875 3 409.5108 376.2055 12.8391 0.157 874 +876 3 410.5347 376.5442 12.8391 0.1849 875 +877 3 411.4716 375.9504 12.8391 0.1556 876 +878 3 412.118 375.0089 12.8391 0.1467 877 +879 3 412.746 374.0525 12.8391 0.1398 878 +880 3 323.609 371.6993 28.1929 0.2288 788 +881 3 324.4384 371.8618 28.9036 0.2288 880 +882 3 324.5608 372.7186 30.4763 0.1271 881 +883 3 324.896 373.7048 31.451 0.2412 882 +884 3 325.7151 374.1795 31.2404 0.2091 883 +885 3 326.4107 375.0261 30.8311 0.2653 884 +886 3 327.3281 375.5088 30.9173 0.3157 885 +887 3 328.0191 376.2913 30.5701 0.3187 886 +888 3 328.5557 377.0887 31.3734 0.1945 887 +889 3 328.5568 378.0783 32.4615 0.3077 888 +890 3 328.4813 379.1468 31.9816 0.2754 889 +891 3 329.1185 379.8915 32.804 0.1423 890 +892 3 329.329 380.714 33.9329 0.1597 891 +893 3 329.5143 381.699 34.0948 0.2161 892 +894 3 329.8415 382.5422 35.278 0.1144 893 +895 3 330.4993 383.2652 35.0767 0.2071 894 +896 3 330.7361 384.1506 34.8345 0.1726 895 +897 3 331.6868 384.5888 34.9706 0.1667 896 +898 3 332.2268 385.3839 35.1459 0.1993 897 +899 3 332.7896 386.1698 35.6972 0.2049 898 +900 3 332.888 387.0747 35.8142 0.148 899 +901 3 333.1385 387.8789 34.7026 0.3956 900 +902 3 333.5183 388.801 34.16 0.3534 901 +903 3 333.6716 389.7459 35.1375 0.308 902 +904 3 333.8192 390.644 35.8789 0.2182 903 +905 3 334.0102 391.5912 34.7861 0.2208 904 +906 3 334.1498 392.1815 33.6048 0.2671 905 +907 3 334.4747 392.6151 35.5673 0.3305 906 +908 3 334.7344 393.663 35.4668 0.2394 907 +909 3 334.866 394.6869 36.2284 0.212 908 +910 3 334.9209 395.7954 35.915 0.1603 909 +911 3 335.1325 396.6511 35.0773 0.1804 910 +912 3 335.1119 397.6281 33.9312 0.1144 911 +913 3 335.1783 398.1383 36.0595 0.1367 912 +914 3 335.192 399.1256 36.955 0.2542 913 +915 3 335.192 399.9046 35.9332 0.3051 914 +916 3 335.3808 400.9903 36.3689 0.3168 915 +917 3 335.8326 401.878 36.3334 0.2397 916 +918 3 335.7537 402.2064 37.52 0.1144 917 +919 3 336.2937 403.0255 37.24 0.2108 918 +920 3 337.0933 403.1273 35.588 0.1504 919 +921 3 337.075 404.1969 36.197 0.2231 920 +922 3 337.2581 405.2689 36.7077 0.2669 921 +923 3 337.663 405.9804 37.5264 0.3305 922 +924 3 337.48 406.7503 39.1902 0.1431 923 +925 3 337.3656 407.7982 39.9468 0.1398 924 +926 3 337.4811 408.6402 38.409 0.1937 925 +927 3 337.2718 409.4982 37.1927 0.1271 926 +928 3 337.3336 410.4066 36.47 0.1462 927 +929 3 337.242 411.2691 37.3898 0.219 928 +930 3 337.3622 412.0757 38.8119 0.3075 929 +931 3 337.4491 412.8433 37.7871 0.3358 930 +932 3 337.5944 413.739 38.8321 0.1144 931 +933 3 337.194 414.6211 38.08 0.1201 932 +934 3 336.7387 415.5008 38.5437 0.136 933 +935 3 336.1381 416.1655 37.413 0.2754 934 +936 3 335.7766 416.8095 38.7058 0.2453 935 +937 3 336.1518 417.4479 40.2559 0.2288 936 +938 3 336.5293 418.251 39.3781 0.1652 937 +939 3 336.5591 419.2771 39.4108 0.1382 938 +940 3 335.9928 420.0928 38.92 0.3147 939 +941 3 335.9928 421.0114 39.7541 0.2977 940 +942 3 336.0546 422.0719 39.0631 0.2762 941 +943 3 336.2365 422.9528 38.2088 0.2184 942 +944 3 336.7501 423.4779 36.2264 0.2245 943 +945 3 337.1002 424.0762 37.91 0.1907 944 +946 3 337.2249 424.6574 39.9143 0.1144 945 +947 3 337.2523 425.6126 41.3504 0.1147 946 +948 3 337.48 426.4935 42.6188 0.1384 947 +949 3 338.2042 426.966 43.6439 0.262 948 +950 3 339.0358 427.4041 42.84 0.2079 949 +951 3 339.4889 428.0082 43.3224 0.2733 950 +952 3 340.0334 428.6591 43.96 0.1313 951 +953 3 340.3606 429.3329 42.7087 0.1759 952 +954 3 341.1294 430.1177 43.0422 0.2394 953 +955 3 341.9393 430.8865 42.56 0.267 954 +956 3 342.5136 431.7845 42.233 0.3305 955 +957 3 343.1794 432.5247 41.4946 0.21 956 +958 3 343.6576 433.4433 41.16 0.1144 957 +959 3 344.3509 433.5897 42.3948 0.2219 958 +960 3 345.1517 434.2487 42.9887 0.2206 959 +961 3 345.742 435.0575 43.2373 0.2828 960 +962 3 346.4329 435.8846 42.56 0.3178 961 +963 3 346.8768 436.7895 41.8286 0.1218 962 +964 3 347.204 437.5056 40.166 0.1368 963 +965 3 347.5495 438.1703 39.8614 0.1803 964 +966 3 348.2336 438.4632 41.5862 0.2351 965 +967 3 348.8479 439.3555 41.5716 0.2235 966 +968 3 349.0653 440.2101 41.2084 0.3065 967 +969 3 349.2152 440.8633 42.8428 0.1676 968 +970 3 349.1488 441.862 42.9296 0.3061 969 +971 3 349.1236 442.9236 43.265 0.3051 970 +972 3 349.5023 443.0632 45.7447 0.1983 971 +973 3 349.8352 443.5528 45.7615 0.1862 972 +974 3 350.2047 444.0093 44.4489 0.1878 973 +975 3 350.5067 444.6671 43.1172 0.1514 974 +976 3 350.2928 445.5136 42.0227 0.1941 975 +977 3 350.8648 445.9312 42.56 0.1144 976 +978 3 317.1191 369.2214 30.52 0.2756 780 +979 3 318.0652 368.5865 30.5348 0.1519 978 +980 3 318.8168 368.3829 32.2255 0.3121 979 +981 3 319.5169 367.6404 32.965 0.2059 980 +982 3 320.3486 366.9906 32.6228 0.2736 981 +983 3 321.0133 366.4186 31.8998 0.2895 982 +984 3 321.5212 365.9198 31.0766 0.3079 983 +985 3 322.1893 365.2792 31.9074 0.1996 984 +986 3 322.8951 364.8124 31.6546 0.3265 985 +987 3 323.7245 364.6008 32.9871 0.3567 986 +988 3 324.2794 364.5779 32.3036 0.2655 987 +989 3 325.2827 364.8777 32.851 0.2449 988 +990 3 326.1452 365.2598 32.6794 0.2666 989 +991 3 327.2126 365.2552 32.7712 0.2288 990 +992 3 327.9082 365.5675 34.3888 0.2456 991 +993 3 328.8542 365.8844 33.6389 0.233 992 +994 3 329.9079 366.1029 33.9643 0.1639 993 +995 3 330.7727 366.5902 33.5709 0.1525 994 +996 3 331.6422 366.8774 34.4884 0.1144 995 +997 3 332.7187 366.9998 34.9499 0.1202 996 +998 3 333.6854 367.3384 35.8439 0.1943 997 +999 3 334.5353 367.1096 35.138 0.175 998 +1000 3 335.4814 366.835 34.1099 0.2092 999 +1001 3 336.3623 367.1611 33.5208 0.2518 1000 +1002 3 337.1276 367.6816 32.3882 0.2734 1001 +1003 3 337.8712 367.7628 32.2591 0.1427 1002 +1004 3 338.6778 367.6622 33.4734 0.2347 1003 +1005 3 339.4145 367.3247 32.1992 0.3308 1004 +1006 3 339.6307 366.4232 32.4215 0.2011 1005 +1007 3 340.2931 366.5376 32.6239 0.1506 1006 +1008 3 341.3421 366.5422 31.8206 0.2058 1007 +1009 3 342.1075 366.7161 31.92 0.3307 1008 +1010 3 342.9334 367.224 32.7771 0.3351 1009 +1011 3 343.8281 367.748 32.6852 0.1729 1010 +1012 3 344.7364 367.645 34.0544 0.1652 1011 +1013 3 345.7351 367.3384 34.7774 0.4209 1012 +1014 3 346.4455 366.9014 33.9522 0.3178 1013 +1015 3 347.101 366.5639 35.4668 0.3222 1014 +1016 3 347.8835 365.8695 34.7645 0.3305 1015 +1017 3 348.9074 365.6224 34.4946 0.2994 1016 +1018 3 349.6201 365.3192 34.3185 0.2294 1017 +1019 3 350.4175 365.0824 33.0529 0.2258 1018 +1020 3 350.8637 364.3732 32.97 0.178 1019 +1021 3 351.3224 363.4888 32.6749 0.2429 1020 +1022 3 352.2296 363.4694 31.8889 0.2924 1021 +1023 3 353.1391 363.4019 31.1097 0.4057 1022 +1024 3 354.0097 363.1914 31.5011 0.1938 1023 +1025 3 354.9386 363.1056 30.3108 0.1745 1024 +1026 3 355.8355 363.1056 30.6432 0.178 1025 +1027 3 356.5024 363.2932 31.3572 0.2818 1026 +1028 3 357.5057 363.5518 31.0402 0.1804 1027 +1029 3 358.2825 363.5472 31.64 0.2034 1028 +1030 3 359.0044 362.8173 31.5025 0.2579 1029 +1031 3 359.6484 361.9708 31.36 0.1411 1030 +1032 3 360.4366 361.3004 31.8268 0.2161 1031 +1033 3 361.0716 360.9343 32.1446 0.2061 1032 +1034 3 361.8358 360.3394 32.1476 0.1907 1033 +1035 3 362.696 359.9733 31.3158 0.1786 1034 +1036 3 363.5563 359.4826 30.8 0.2948 1035 +1037 3 364.2153 358.8728 30.9005 0.2549 1036 +1038 3 364.761 358.3534 30.0868 0.1652 1037 +1039 3 365.4737 357.7231 30.2728 0.2321 1038 +1040 3 365.9793 356.8422 30.6594 0.1891 1039 +1041 3 366.8716 356.3091 30.6664 0.1875 1040 +1042 3 367.9367 356.3034 29.96 0.2484 1041 +1043 3 368.9995 356.2519 29.4608 0.1271 1042 +1044 3 369.9296 355.7623 29.6708 0.2231 1043 +1045 3 370.9706 355.4271 28.8912 0.2203 1044 +1046 3 371.7897 355.2097 29.1948 0.1144 1045 +1047 3 372.1146 354.5176 29.0657 0.2002 1046 +1048 3 372.9246 353.8346 29.4 0.1144 1047 +1049 3 373.7276 353.2214 29.2788 0.1144 1048 +1050 3 374.2173 352.2662 29.6145 0.178 1049 +1051 3 374.4758 351.3476 29.7707 0.2257 1050 +1052 3 374.8041 350.4667 29.6677 0.1757 1051 +1053 3 375.5535 349.6728 29.3412 0.1374 1052 +1054 3 376.2204 349.0824 28.7042 0.1973 1053 +1055 3 377.1779 348.6283 28.9979 0.1144 1054 +1056 3 377.9948 347.9545 28.56 0.1475 1055 +1057 3 379.0793 347.824 28.3665 0.1995 1056 +1058 3 380.1043 347.9064 28.2044 0.1707 1057 +1059 3 380.8319 347.3802 27.4327 0.1144 1058 +1060 3 381.4885 346.5119 27.9989 0.1144 1059 +1061 3 382.2756 345.7237 28.1588 0.148 1060 +1062 3 383.2537 345.2855 28.1644 0.1144 1061 +1063 3 384.1586 344.8371 28.3847 0.1649 1062 +1064 3 384.8633 344.3486 28.1022 0.1652 1063 +1065 3 385.8609 344.2319 28.5589 0.2288 1064 +1066 3 386.847 344.1152 29.3882 0.1669 1065 +1067 3 387.8595 343.8578 28.84 0.1144 1066 +1068 3 388.7301 343.756 29.8402 0.2288 1067 +1069 3 389.723 343.6622 29.0175 0.1144 1068 +1070 3 390.6783 343.772 29.6909 0.1271 1069 +1071 3 391.693 343.6599 29.2886 0.1893 1070 +1072 3 392.5464 343.0055 28.3965 0.1271 1071 +1073 3 393.3919 342.3855 27.8029 0.2227 1072 +1074 3 394.2327 341.8409 27.4509 0.136 1073 +1075 3 395.3641 341.7082 27.3224 0.1144 1074 +1076 3 396.4807 341.7471 27.5232 0.1144 1075 +1077 3 397.5411 341.9896 27.7264 0.1306 1076 +1078 3 398.5399 342.2711 27.4305 0.2408 1077 +1079 3 399.5786 342.2631 27.0824 0.1652 1078 +1080 3 400.6357 342.3683 26.8537 0.1579 1079 +1081 3 401.4994 342.0457 26.0968 0.1866 1080 +1082 3 402.5233 341.6579 26.1246 0.1144 1081 +1083 3 403.4671 341.2541 26.4256 0.178 1082 +1084 3 404.42 340.809 26.1114 0.1907 1083 +1085 3 405.3089 340.4395 26.7702 0.1837 1084 +1086 3 406.0685 339.7794 26.7064 0.1661 1085 +1087 3 407.073 339.4111 26.88 0.1882 1086 +1088 3 408.0614 339.0519 27.4232 0.1144 1087 +1089 3 409.02 338.9294 26.8265 0.2616 1088 +1090 3 410.0016 339.0233 26.0212 0.157 1089 +1091 3 411.1044 339.1731 25.6119 0.1554 1090 +1092 3 412.2015 338.9672 25.2 0.2803 1091 +1093 3 413.1453 338.6583 24.9427 0.178 1092 +1094 3 414.0628 338.4272 25.4892 0.2029 1093 +1095 3 415.1313 338.4215 25.8672 0.2249 1094 +1096 3 416.0991 338.1664 25.9473 0.215 1095 +1097 3 416.702 338.8848 26.0316 0.2151 1096 +1098 3 417.5165 339.4088 25.5066 0.3141 1097 +1099 3 418.5221 339.5438 26.1649 0.2796 1098 +1100 3 419.5803 339.6124 26.04 0.3072 1099 +1101 3 420.6705 339.4545 25.583 0.339 1100 +1102 3 421.6452 339.9099 25.8838 0.3156 1101 +1103 3 422.6336 339.9533 24.8178 0.3971 1102 +1104 3 423.5088 340.4544 25.2 0.2161 1103 +1105 3 360.9457 361.504 31.36 0.2034 1032 +1106 3 361.8369 361.6905 32.3196 0.1504 1105 +1107 3 362.5748 362.3323 31.374 0.1309 1106 +1108 3 363.5849 362.7521 31.7204 0.1169 1107 +1109 3 364.7061 362.9088 31.92 0.1499 1108 +1110 3 365.7585 363.3458 31.92 0.178 1109 +1111 3 366.8671 363.5987 31.92 0.1467 1110 +1112 3 367.8921 364.0402 31.948 0.1475 1111 +1113 3 368.8553 364.6088 31.8046 0.1877 1112 +1114 3 369.8575 365.1145 31.8534 0.1579 1113 +1115 3 370.7761 365.0847 31.4709 0.1289 1114 +1116 3 371.5197 365.1408 31.843 0.2288 1115 +1117 3 372.4098 365.3879 31.4978 0.2321 1116 +1118 3 373.1877 365.556 32.48 0.2159 1117 +1119 3 374.2207 365.8226 32.9132 0.1421 1118 +1120 3 375.1256 366.1681 31.92 0.1687 1119 +1121 3 376.1792 366.207 32.3148 0.2288 1120 +1122 3 377.0956 366.1944 33.4337 0.1382 1121 +1123 3 377.8792 366.6531 32.76 0.2536 1122 +1124 3 378.7326 367.1199 32.8205 0.2007 1123 +1125 3 379.7325 367.2343 33.551 0.2264 1124 +1126 3 380.6019 367.1611 33.4841 0.1197 1125 +1127 3 381.7162 366.9952 33.4622 0.1428 1126 +1128 3 382.8385 367.0078 33.6888 0.1399 1127 +1129 3 383.8715 367.2148 34.3179 0.1818 1128 +1130 3 384.9194 367.383 34.2345 0.1759 1129 +1131 3 385.8529 367.6816 35.0 0.1144 1130 +1132 3 386.9923 367.7399 35.0 0.1144 1131 +1133 3 387.9922 368.1392 35.2248 0.1144 1132 +1134 3 389.119 368.1392 34.9247 0.1144 1133 +1135 3 390.1852 368.2456 34.9238 0.1595 1134 +1136 3 391.2606 368.5579 35.453 0.2262 1135 +1137 3 392.3028 368.9732 35.3298 0.2005 1136 +1138 3 393.2889 369.2603 35.9719 0.2288 1137 +1139 3 394.0428 369.8895 36.7556 0.154 1138 +1140 3 394.9237 370.4764 36.1953 0.2071 1139 +1141 3 394.9305 371.1502 37.6628 0.1954 1140 +1142 3 395.0232 371.4934 36.36 0.1502 1141 +1143 3 394.7441 371.5334 34.4089 0.178 1142 +1144 3 395.3286 372.0963 33.88 0.2224 1143 +1145 3 396.1672 372.5505 33.1643 0.2288 1144 +1146 3 396.2816 373.1728 34.72 0.2161 1145 +1147 3 396.5916 372.9486 33.2268 0.1915 1145 +1148 3 397.3272 373.7151 33.1453 0.2709 1147 +1149 3 397.6944 374.5925 32.8703 0.1193 1148 +1150 3 398.3831 375.3567 32.76 0.1144 1149 +1151 3 399.3166 375.9985 32.7578 0.1144 1150 +1152 3 400.1094 376.6448 32.76 0.1144 1151 +1153 3 400.9606 377.3839 32.76 0.1144 1152 +1154 3 401.6641 378.2544 32.76 0.1334 1153 +1155 3 402.3345 379.1422 32.76 0.1469 1154 +1156 3 403.284 379.5609 33.2833 0.1244 1155 +1157 3 404.2942 380.0402 32.9918 0.2815 1156 +1158 3 405.3078 380.3445 33.0333 0.1448 1157 +1159 3 406.422 380.4063 32.6018 0.1144 1158 +1160 3 407.4802 380.7495 32.1376 0.1144 1159 +1161 3 408.4343 381.3158 31.64 0.156 1160 +1162 3 409.3163 382.0171 31.2348 0.216 1161 +1163 3 410.2075 382.7229 31.08 0.1336 1162 +1164 3 410.7818 383.6736 31.08 0.1144 1163 +1165 3 411.7382 384.201 31.1044 0.1169 1164 +1166 3 412.2496 384.7569 32.608 0.274 1165 +1167 3 413.2677 384.3977 32.226 0.1806 1166 +1168 3 414.0868 384.6128 32.1314 0.1924 1167 +1169 3 414.9929 385.0361 31.92 0.2288 1168 +1170 3 415.9607 385.5383 31.7419 0.2027 1169 +1171 3 416.6139 386.1103 31.309 0.1987 1170 +1172 3 417.4456 386.4832 32.4512 0.1793 1171 +1173 3 418.0359 386.958 31.4381 0.2283 1172 +1174 3 418.1469 387.9727 32.0832 0.3284 1173 +1175 3 419.0392 388.1592 32.8843 0.143 1174 +1176 3 419.6856 388.6168 33.6 0.1673 1175 +1177 3 420.7152 388.8044 34.4226 0.1342 1176 +1178 3 421.826 388.6248 34.72 0.1144 1177 +1179 3 422.6886 388.6168 33.3572 0.286 1178 +1180 3 423.614 388.968 33.88 0.2457 1179 +1181 3 424.4766 389.4485 33.8828 0.1628 1180 +1182 3 425.5268 389.6144 34.5685 0.2336 1181 +1183 3 426.6354 389.659 34.7354 0.3305 1182 +1184 3 427.1765 390.3351 34.694 0.4237 1183 +1185 3 427.8125 390.9689 34.9034 0.2349 1184 +1186 3 427.9933 391.9436 34.1468 0.1232 1185 +1187 3 428.5081 392.8759 34.7071 0.2105 1186 +1188 3 429.1865 393.6801 34.16 0.2678 1187 +1189 3 429.9404 394.426 34.16 0.1907 1188 +1190 3 430.5764 395.2394 33.833 0.1885 1189 +1191 3 431.1667 395.9762 33.4718 0.1941 1190 +1192 3 431.9733 396.5047 34.2622 0.2078 1191 +1193 3 432.6597 397.1808 34.72 0.115 1192 +1194 3 433.3712 397.7208 33.922 0.1566 1193 +1195 3 434.2018 398.2458 33.6748 0.2355 1194 +1196 3 434.6868 398.5673 33.6417 0.2075 1195 +1197 3 435.5837 398.4552 33.796 0.249 1196 +1198 3 436.6785 398.557 33.88 0.2418 1197 +1199 3 437.4713 398.716 33.2741 0.3112 1198 +1200 3 438.2115 398.7401 33.4642 0.1845 1199 +1201 3 439.026 398.6142 33.6924 0.2507 1200 +1202 3 439.9824 398.9128 32.76 0.1907 1201 +1203 3 394.132 370.9992 33.8898 0.2025 1143 +1204 3 393.2946 370.3071 33.4527 0.1679 1203 +1205 3 392.1941 370.0954 33.8008 0.1914 1204 +1206 3 391.0878 369.9696 33.9741 0.2203 1205 +1207 3 390.1406 370.362 34.3882 0.2174 1206 +1208 3 389.1945 370.9054 34.72 0.1649 1207 +1209 3 388.3663 371.6753 34.72 0.1873 1208 +1210 3 387.355 371.8904 35.4945 0.2288 1209 +1211 3 386.251 371.9144 35.2262 0.2288 1210 +1212 3 385.2042 372.0654 35.1434 0.2064 1211 +1213 3 384.0797 372.2507 35.0 0.2281 1212 +1214 3 382.9734 372.4864 35.373 0.1907 1213 +1215 3 381.9004 372.547 34.7393 0.2691 1214 +1216 3 380.9806 372.769 35.5846 0.2596 1215 +1217 3 380.1512 373.0206 36.0769 0.1588 1216 +1218 3 379.363 373.3341 36.8822 0.178 1217 +1219 3 378.4386 372.944 36.4 0.2543 1218 +1220 3 377.6344 373.381 35.4897 0.1287 1219 +1221 3 377.0407 374.0091 36.3947 0.2714 1220 +1222 3 376.3325 374.7252 37.2814 0.2796 1221 +1223 3 375.2995 374.954 37.5794 0.1749 1222 +1224 3 374.3969 375.4608 38.08 0.1144 1223 +1225 3 373.8329 375.9092 38.2687 0.1719 1224 +1226 3 373.6784 376.8233 37.6214 0.193 1225 +1227 3 372.8845 377.6264 37.8 0.2144 1226 +1228 3 372.07 377.9776 38.3062 0.3046 1227 +1229 3 371.2131 377.8632 39.3232 0.1144 1228 +1230 3 370.3151 377.3781 38.92 0.1846 1229 +1231 3 369.4491 377.0109 39.6841 0.1733 1230 +1232 3 368.3348 377.0624 39.76 0.2743 1231 +1233 3 367.3029 377.1768 39.3705 0.1907 1232 +1234 3 366.4209 376.8553 39.7869 0.1788 1233 +1235 3 365.5995 377.0841 41.1348 0.1374 1234 +1236 3 364.7038 377.6127 40.5958 0.1343 1235 +1237 3 364.0586 378.3185 40.0674 0.3033 1236 +1238 3 363.3344 378.537 39.44 0.3527 1237 +1239 3 362.7521 379.3069 40.2749 0.1455 1238 +1240 3 361.6195 379.3161 40.32 0.1499 1239 +1241 3 360.5247 379.2715 40.8702 0.2168 1240 +1242 3 360.1781 379.6135 39.503 0.2542 1241 +1243 3 359.7811 379.2921 37.5351 0.1652 1242 +1244 3 359.3178 379.3504 40.0089 0.2288 1243 +1245 3 359.1828 380.0013 40.04 0.2585 1244 +1246 3 358.5239 380.8422 39.949 0.2069 1245 +1247 3 358.0217 381.0389 37.8619 0.2143 1246 +1248 3 357.5927 381.484 39.968 0.2759 1247 +1249 3 356.8616 381.5537 41.3596 0.3305 1248 +1250 3 355.9293 382.048 41.1018 0.2415 1249 +1251 3 355.6639 382.3648 40.2892 0.2106 1250 +1252 3 354.9798 382.533 40.5706 0.3017 1251 +1253 3 354.0554 382.7298 40.6 0.274 1252 +1254 3 353.5658 383.4974 41.1533 0.2288 1253 +1255 3 353.0887 384.3966 40.9732 0.3051 1254 +1256 3 352.2468 385.1265 41.44 0.2288 1255 +1257 3 351.6988 385.9307 40.5871 0.3141 1256 +1258 3 351.4814 386.9065 39.76 0.3065 1257 +1259 3 350.6509 387.4511 40.0075 0.2613 1258 +1260 3 349.7666 387.784 39.7818 0.2746 1259 +1261 3 349.0744 388.4589 39.6984 0.4533 1260 +1262 3 348.2084 388.96 40.0128 0.2987 1261 +1263 3 347.6204 389.6372 39.76 0.2577 1262 +1264 3 346.5233 389.7059 40.0711 0.2288 1263 +1265 3 345.6253 389.993 40.6137 0.2288 1264 +1266 3 344.9503 390.5616 39.76 0.2415 1265 +1267 3 344.4916 390.3328 38.08 0.37 1266 +1268 3 343.5512 390.5319 37.9854 0.1907 1267 +1269 3 343.0273 391.1222 38.722 0.2019 1268 +1270 3 342.0583 391.5912 38.36 0.2664 1269 +1271 3 341.2666 391.4768 38.7943 0.2454 1270 +1272 3 340.5093 391.8966 39.6838 0.4021 1271 +1273 3 339.9213 392.2776 39.3649 0.2433 1272 +1274 3 338.9054 392.5293 40.0218 0.2702 1273 +1275 3 338.195 393.2637 40.4678 0.2825 1274 +1276 3 337.5155 393.9925 39.7645 0.2204 1275 +1277 3 337.2924 394.4844 37.5225 0.2278 1276 +1278 3 336.5351 395.1296 37.7451 0.259 1277 +1279 3 335.8326 395.8023 37.2537 0.3665 1278 +1280 3 334.8751 396.0917 37.7474 0.2337 1279 +1281 3 334.2745 396.7975 38.36 0.4065 1280 +1282 3 333.476 397.3112 37.6709 0.2161 1281 +1283 3 332.5379 397.0183 37.0154 0.2988 1282 +1284 3 331.7314 396.7392 35.84 0.232 1283 +1285 3 330.8608 397.1922 35.434 0.3559 1284 +1286 3 330.0898 397.0492 35.5359 0.3281 1285 +1287 3 329.2958 396.8639 36.2076 0.3536 1286 +1288 3 328.5259 397.1842 37.6566 0.3402 1287 +1289 3 327.6187 396.833 36.9667 0.2134 1288 +1290 3 327.1337 396.6328 35.5225 0.2619 1289 +1291 3 326.2173 396.523 34.2513 0.1913 1290 +1292 3 325.5355 396.968 34.9423 0.3365 1291 +1293 3 324.4636 397.1968 35.2884 0.3051 1292 +1294 3 323.6365 396.968 35.5902 0.2592 1293 +1295 3 322.656 396.7392 35.0154 0.1717 1294 +1296 3 321.7271 397.1968 35.2876 0.2858 1295 +1297 3 320.7879 396.8593 36.12 0.3522 1296 +1298 3 319.748 396.5104 35.84 0.2415 1297 +1299 3 318.8362 396.5504 36.9866 0.2505 1298 +1300 3 318.7207 395.9384 36.1304 0.2288 1299 +1301 3 317.9782 395.2566 35.8204 0.1753 1300 +1302 3 317.174 394.6811 35.7185 0.1697 1301 +1303 3 316.2416 394.2316 36.6596 0.1907 1302 +1304 3 315.2864 393.8792 35.84 0.2415 1303 +1305 3 319.9871 397.2597 36.0366 0.3413 1298 +1306 3 320.471 397.9987 35.2884 0.2277 1305 +1307 3 321.4262 397.9084 36.2471 0.212 1306 +1308 3 321.4423 398.5204 38.3443 0.1724 1307 +1309 3 321.6356 399.4596 38.5795 0.1209 1308 +1310 3 322.0623 400.0248 37.24 0.1983 1309 +1311 3 322.5256 400.9331 36.9874 0.2146 1310 +1312 3 322.7727 401.997 36.9496 0.1566 1311 +1313 3 323.1789 402.6788 35.3444 0.1285 1312 +1314 3 323.6033 403.26 33.8366 0.1271 1313 +1315 3 323.8675 404.1763 33.8803 0.1272 1314 +1316 3 324.6649 404.5733 34.5604 0.1206 1315 +1317 3 325.2392 404.9028 35.331 0.2477 1316 +1318 3 325.2552 406.0296 35.6014 0.2155 1317 +1319 3 325.2564 407.153 35.84 0.1928 1318 +1320 3 325.4348 408.1437 36.6506 0.1907 1319 +1321 3 325.4714 409.147 35.6468 0.1907 1320 +1322 3 325.7357 409.8769 37.1683 0.1359 1321 +1323 3 325.6968 410.8882 36.8656 0.2764 1322 +1324 3 325.8101 411.8983 35.8918 0.1894 1323 +1325 3 325.6831 413.0103 36.0612 0.3272 1324 +1326 3 325.6888 414.0902 36.251 0.4226 1325 +1327 3 325.357 415.0432 36.3311 0.3079 1326 +1328 3 325.6087 415.9595 37.6037 0.3432 1327 +1329 3 325.8043 416.8633 37.3937 0.2569 1328 +1330 3 326.0434 417.7122 37.8328 0.1174 1329 +1331 3 326.2997 418.7772 37.2907 0.1711 1330 +1332 3 326.5765 419.8526 36.6489 0.2691 1331 +1333 3 326.9563 420.666 37.4965 0.2921 1332 +1334 3 327.1211 421.5045 38.5434 0.2702 1333 +1335 3 326.7264 422.3373 37.5738 0.2895 1334 +1336 3 326.7264 423.4104 38.1671 0.3133 1335 +1337 3 326.4404 424.44 38.4423 0.3006 1336 +1338 3 326.3706 425.4158 38.7649 0.2542 1337 +1339 3 326.2791 426.4203 39.2269 0.2779 1338 +1340 3 326.4072 426.887 41.2261 0.2455 1339 +1341 3 326.6017 427.681 40.0582 0.3077 1340 +1342 3 326.6109 428.531 39.8115 0.2185 1341 +1343 3 326.6909 429.0103 40.4762 0.1832 1342 +1344 3 327.1806 429.8191 40.2114 0.1897 1343 +1345 3 327.629 430.7389 40.88 0.3048 1344 +1346 3 327.645 431.8806 40.9004 0.276 1345 +1347 3 327.756 432.758 42.0 0.1368 1346 +1348 3 327.4242 433.6904 41.7236 0.3432 1347 +1349 3 327.0296 434.3207 41.8681 0.2595 1348 +1350 3 327.0696 435.149 40.6 0.3082 1349 +1351 3 327.1771 436.0848 41.8146 0.1703 1350 +1352 3 326.8454 436.6614 42.8425 0.19 1351 +1353 3 326.5731 437.6029 43.4308 0.3303 1352 +1354 3 326.8957 438.5089 44.7199 0.1598 1353 +1355 3 327.192 439.4573 43.692 0.2063 1354 +1356 3 327.5295 440.5407 43.8869 0.3079 1355 +1357 3 328.2616 441.282 44.4058 0.2218 1356 +1358 3 328.749 442.2475 44.3265 0.1771 1357 +1359 3 328.8783 442.9568 43.5341 0.1216 1358 +1360 3 328.9458 444.0001 43.3107 0.1616 1359 +1361 3 329.7511 444.595 42.574 0.1144 1360 +1362 3 330.0772 445.6772 42.56 0.1144 1361 +1363 3 330.3758 446.7526 42.7403 0.217 1362 +1364 3 330.4055 447.1793 44.6519 0.1592 1363 +1365 3 330.7327 447.741 46.5478 0.178 1364 +1366 3 330.9569 448.6059 45.9763 0.2391 1365 +1367 3 331.1571 449.6103 45.92 0.1271 1366 +1368 3 331.3722 450.6136 46.879 0.2415 1367 +1369 3 331.4671 451.7393 47.2268 0.1965 1368 +1370 3 331.6822 452.841 47.4578 0.1586 1369 +1371 3 331.76 453.5262 47.6854 0.2073 1370 +1372 3 332.1032 454.0914 48.4089 0.3432 1371 +1373 3 332.4613 454.8636 47.88 0.3202 1372 +1374 3 332.904 455.5408 46.76 0.1907 1373 +1375 3 359.4448 378.6503 40.8708 0.1767 1244 +1376 3 359.4917 377.5406 40.3816 0.1612 1375 +1377 3 360.1918 376.7535 40.3472 0.2128 1376 +1378 3 361.2546 376.9411 40.2298 0.2358 1377 +1379 3 361.9044 376.2627 41.1191 0.2614 1378 +1380 3 362.4467 375.9642 41.515 0.2464 1379 +1381 3 363.1056 375.3796 42.1775 0.1612 1380 +1382 3 363.5632 374.485 42.2528 0.2796 1381 +1383 3 364.1832 373.7906 42.0 0.1608 1382 +1384 3 365.2426 373.4153 41.7004 0.1679 1383 +1385 3 366.1566 373.0435 42.5138 0.2146 1384 +1386 3 367.1862 372.8754 43.1015 0.249 1385 +1387 3 368.0488 372.4155 42.5309 0.2232 1386 +1388 3 368.5648 371.8675 41.9955 0.1875 1387 +1389 3 368.9114 370.9557 41.9356 0.2334 1388 +1390 3 369.695 370.966 42.2554 0.3255 1389 +1391 3 370.3025 370.1046 42.84 0.2819 1390 +1392 3 371.2715 369.6539 43.2916 0.2079 1391 +1393 3 372.3537 369.4045 43.4361 0.1677 1392 +1394 3 373.4851 369.4319 43.2706 0.2232 1393 +1395 3 374.2321 369.3976 43.7108 0.3407 1394 +1396 3 375.1336 369.1688 44.3694 0.3432 1395 +1397 3 376.0179 368.6826 44.8 0.2607 1396 +1398 3 376.376 367.8726 43.7732 0.1525 1397 +1399 3 375.9184 367.6816 43.68 0.1525 1398 +1400 3 377.1173 367.1565 44.8291 0.2423 1398 +1401 3 378.0096 366.8064 45.0825 0.1522 1400 +1402 3 378.6846 366.0949 45.1637 0.1618 1401 +1403 3 379.1685 365.3375 45.9732 0.2034 1402 +1404 3 380.0196 364.793 46.6575 0.2447 1403 +1405 3 380.6088 364.2416 47.6966 0.2091 1404 +1406 3 380.936 363.3161 47.1383 0.214 1405 +1407 3 381.4668 362.402 47.3833 0.1173 1406 +1408 3 382.2161 361.5543 47.32 0.1144 1407 +1409 3 382.9368 360.8176 47.32 0.1144 1408 +1410 3 383.9493 360.4927 47.3088 0.119 1409 +1411 3 384.7306 359.7869 47.0977 0.1446 1410 +1412 3 385.4914 359.0524 47.6 0.153 1411 +1413 3 385.8106 357.9954 47.8464 0.2034 1412 +1414 3 386.3917 357.031 47.5714 0.1292 1413 +1415 3 387.435 356.92 47.2458 0.1407 1414 +1416 3 388.5196 356.7564 47.8979 0.1375 1415 +1417 3 389.4027 356.0963 47.978 0.1217 1416 +1418 3 390.0605 355.1605 47.978 0.1144 1417 +1419 3 390.7057 354.2202 48.1034 0.1144 1418 +1420 3 391.375 353.3107 48.5416 0.1144 1419 +1421 3 392.0442 352.4 48.9796 0.1144 1420 +1422 3 392.7135 351.4894 49.4178 0.1144 1421 +1423 3 393.3827 350.5799 49.856 0.1144 1422 +1424 3 393.8918 349.5686 50.0055 0.1144 1423 +1425 3 394.3162 348.507 50.0055 0.1144 1424 +1426 3 308.8262 367.7846 31.4258 0.344 773 +1427 3 308.6134 367.0066 33.3189 0.2659 1426 +1428 3 308.2771 365.9793 33.3928 0.1979 1427 +1429 3 307.5587 365.1351 33.9052 0.1555 1428 +1430 3 307.5015 364.1112 35.028 0.1647 1429 +1431 3 307.7063 362.9958 35.3438 0.1652 1430 +1432 3 307.5209 361.901 36.0018 0.1907 1431 +1433 3 306.7819 362.076 36.2443 0.3024 1432 +1434 3 305.6722 362.3242 36.54 0.3998 1433 +1435 3 304.5923 362.2876 37.0306 0.3947 1434 +1436 3 303.5604 361.8735 37.613 0.344 1435 +1437 3 302.5445 361.536 38.4048 0.2859 1436 +1438 3 301.6888 361.0247 39.4593 0.2601 1437 +1439 3 300.9956 360.1747 40.2433 0.2542 1438 +1440 3 300.0952 359.6919 41.1124 0.2542 1439 +1441 3 299.2052 359.1279 41.8561 0.2463 1440 +1442 3 298.5771 358.215 42.4536 0.2497 1441 +1443 3 297.8004 357.4256 42.905 0.2373 1442 +1444 3 296.9698 356.6614 42.7372 0.2462 1443 +1445 3 296.1747 355.8664 42.2282 0.263 1444 +1446 3 295.5066 354.9569 42.2663 0.3212 1445 +1447 3 295.0193 353.9593 42.875 0.3524 1446 +1448 3 294.3832 353.0338 43.2312 0.3466 1447 +1449 3 293.4852 352.5762 44.2467 0.2927 1448 +1450 3 292.4567 352.5167 45.4297 0.2567 1449 +1451 3 291.7131 351.7663 46.3053 0.29 1450 +1452 3 290.9032 351.1988 47.696 0.3305 1451 +1453 3 289.861 351.2721 48.3708 0.306 1452 +1454 3 288.8497 351.7606 48.8673 0.3297 1453 +1455 3 287.8819 352.3383 49.3408 0.2924 1454 +1456 3 286.7733 352.4675 48.7295 0.2791 1455 +1457 3 285.6316 352.4801 48.5968 0.2289 1456 +1458 3 284.6569 352.654 49.8602 0.2428 1457 +1459 3 284.0792 353.2535 51.3724 0.2641 1458 +1460 3 283.1343 352.7993 51.1025 0.3226 1459 +1461 3 282.6858 352.3932 51.2627 0.3432 1460 +1462 3 282.3953 351.5112 51.8311 0.2684 1461 +1463 3 282.0818 350.7207 53.4391 0.1967 1462 +1464 3 281.0991 350.3569 52.9659 0.2988 1463 +1465 3 279.9677 350.4049 52.9491 0.2685 1464 +1466 3 279.0056 350.4335 52.08 0.2757 1465 +1467 3 278.0721 350.2493 52.7481 0.1453 1466 +1468 3 277.1397 350.4484 52.1564 0.1769 1467 +1469 3 276.1696 350.6829 51.5343 0.1329 1468 +1470 3 275.5965 351.1073 52.92 0.1549 1469 +1471 3 274.7922 351.5867 53.6547 0.1144 1470 +1472 3 273.7958 351.2881 53.333 0.3505 1471 +1473 3 272.7319 350.9414 53.1544 0.3499 1472 +1474 3 271.9929 350.2928 53.636 0.2415 1473 +1475 3 270.9141 350.1601 54.1618 0.2102 1474 +1476 3 270.1213 349.468 54.0184 0.1917 1475 +1477 3 269.3674 348.92 53.1742 0.3327 1476 +1478 3 268.7164 348.8697 51.9848 0.3432 1477 +1479 3 267.7692 348.5676 52.9592 0.2129 1478 +1480 3 266.7808 348.3663 53.8432 0.1763 1479 +1481 3 266.5051 347.4362 54.8932 0.1217 1480 +1482 3 266.2191 346.8322 54.2982 0.1535 1481 +1483 3 265.686 345.8987 53.6281 0.277 1482 +1484 3 265.3016 344.8954 53.8294 0.2388 1483 +1485 3 264.685 344.447 55.1692 0.1209 1484 +1486 3 264.566 343.6118 56.28 0.1301 1485 +1487 3 263.5193 343.653 56.2257 0.1751 1486 +1488 3 262.8935 343.3933 54.654 0.1918 1487 +1489 3 261.9051 342.9266 54.5208 0.2142 1488 +1490 3 261.1191 342.9712 54.4513 0.3135 1489 +1491 3 260.2417 342.5628 54.0876 0.2982 1490 +1492 3 259.164 342.2242 53.8779 0.2081 1491 +1493 3 258.1287 341.8055 53.6679 0.1238 1492 +1494 3 257.0065 341.7128 53.76 0.1144 1493 +1495 3 256.0409 341.5698 54.4544 0.148 1494 +1496 3 255.533 340.817 55.2919 0.1854 1495 +1497 3 255.0354 339.9716 54.5689 0.2415 1496 +1498 3 254.7928 339.6959 55.4229 0.1144 1497 +1499 3 253.7918 339.3356 56.0 0.1144 1498 +1500 3 252.7817 338.9718 56.0 0.1144 1499 +1501 3 251.9477 338.5096 55.347 0.1525 1500 +1502 3 251.0851 337.9376 55.0889 0.1144 1501 +1503 3 250.1608 337.3885 54.6378 0.1195 1502 +1504 3 249.1609 337.0224 55.4408 0.1268 1503 +1505 3 248.82 336.1701 55.72 0.1144 1504 +1506 3 248.5935 335.1359 55.72 0.1144 1505 +1507 3 247.6474 334.5765 55.72 0.1144 1506 +1508 3 246.5412 334.3912 55.72 0.1144 1507 +1509 3 245.4052 334.3363 55.72 0.1144 1508 +1510 3 244.4648 333.7448 55.72 0.1144 1509 +1511 3 243.5782 333.0424 55.6349 0.1341 1510 +1512 3 242.7202 332.3389 55.592 0.2161 1511 +1513 3 242.1493 331.5632 54.6 0.1775 1512 +1514 3 241.1975 331.1834 55.3101 0.1144 1513 +1515 3 240.2526 330.7178 55.44 0.1144 1514 +1516 3 239.7035 329.9239 55.44 0.1144 1515 +1517 3 238.6098 329.7305 55.44 0.1144 1516 +1518 3 237.6557 329.1894 55.44 0.1144 1517 +1519 3 236.7668 328.479 55.44 0.1144 1518 +1520 3 235.7658 327.9974 55.16 0.1525 1519 +1521 3 235.4352 328.5568 55.16 0.1144 1520 +1522 3 234.8609 327.6027 55.4764 0.1612 1520 +1523 3 233.821 327.1497 55.8398 0.1713 1522 +1524 3 232.7743 326.7047 56.0871 0.1722 1523 +1525 3 231.7126 326.2802 56.0871 0.1538 1524 +1526 3 230.6315 325.9794 56.0871 0.1328 1525 +1527 3 229.5367 325.8478 56.0871 0.1144 1526 +1528 3 228.514 325.3364 56.0871 0.1144 1527 +1529 3 227.5141 324.7805 56.0871 0.1144 1528 +1530 3 226.5314 324.1959 56.0871 0.1144 1529 +1531 3 225.5739 323.5701 56.0871 0.1144 1530 +1532 3 224.6152 322.9455 56.0871 0.1144 1531 +1533 3 290.3278 351.1165 47.679 0.2708 1452 +1534 3 289.4446 351.3213 48.44 0.4465 1533 +1535 3 288.8692 350.8808 48.9726 0.3231 1534 +1536 3 288.9378 349.8627 49.6104 0.1838 1535 +1537 3 288.5168 348.8182 49.84 0.1158 1536 +1538 3 288.0615 348.2233 50.6125 0.2119 1537 +1539 3 287.5124 347.8069 52.6414 0.3371 1538 +1540 3 287.4666 346.8814 54.061 0.2598 1539 +1541 3 287.0342 346.2533 55.2619 0.2531 1540 +1542 3 286.7402 345.2592 55.1911 0.3012 1541 +1543 3 286.3981 344.5934 56.4668 0.3432 1542 +1544 3 286.8008 344.3703 58.2319 0.3305 1543 +1545 3 287.1383 343.772 56.8837 0.2669 1544 +1546 3 287.9448 343.7068 58.1101 0.1539 1545 +1547 3 288.3841 343.963 59.8041 0.1144 1546 +1548 3 288.852 342.938 59.92 0.2255 1547 +1549 3 289.4228 342.239 61.0697 0.178 1548 +1550 3 290.0132 341.5412 61.0467 0.218 1549 +1551 3 290.2191 340.4636 60.7583 0.2682 1550 +1552 3 289.6608 339.7794 61.2724 0.1457 1551 +1553 3 289.1117 338.8459 61.2363 0.1701 1552 +1554 3 288.4676 338.0875 61.0095 0.15 1553 +1555 3 288.0272 337.2821 62.0203 0.3305 1554 +1556 3 288.3658 336.9663 63.5295 0.1396 1555 +1557 3 288.6667 336.0328 63.8448 0.19 1556 +1558 3 288.9744 335.2858 62.4943 0.2224 1557 +1559 3 289.4423 334.5525 63.56 0.1329 1558 +1560 3 289.5487 333.6098 63.4805 0.2288 1559 +1561 3 289.6528 332.5837 64.0836 0.2262 1560 +1562 3 290.3804 332.1032 65.2215 0.1144 1561 +1563 3 291.4477 331.863 65.5102 0.1412 1562 +1564 3 292.1479 331.0919 65.52 0.1457 1563 +1565 3 293.2896 331.045 65.52 0.1144 1564 +1566 3 294.2894 330.5691 65.52 0.1195 1565 +1567 3 295.1028 329.8632 65.4682 0.2259 1566 +1568 3 295.4975 329.1288 65.5682 0.1247 1567 +1569 3 295.621 328.7078 67.7009 0.1144 1568 +1570 3 296.4264 328.3543 66.901 0.1905 1569 +1571 3 297.0739 327.5981 66.64 0.2635 1570 +1572 3 297.4446 326.5994 67.2532 0.1256 1571 +1573 3 298.1527 325.8638 67.76 0.1144 1572 +1574 3 298.9135 325.1191 67.0289 0.1957 1573 +1575 3 299.156 324.205 67.4909 0.3051 1574 +1576 3 299.4786 323.2441 68.3516 0.3178 1575 +1577 3 299.728 322.2671 68.5404 0.1988 1576 +1578 3 300.0346 321.2238 68.3284 0.178 1577 +1579 3 299.9568 320.2342 69.3118 0.326 1578 +1580 3 299.8516 319.4025 67.8031 0.2669 1579 +1581 3 300.332 319.3625 66.0887 0.2341 1580 +1582 3 300.0712 319.9768 64.1455 0.1147 1581 +1583 3 300.0712 319.9768 61.3455 0.1144 1582 +1584 3 300.5265 319.8372 59.1923 0.1854 1583 +1585 3 300.7496 318.7344 59.08 0.2262 1584 +1586 3 300.2165 318.3489 57.801 0.2102 1585 +1587 3 300.5059 317.6213 56.56 0.2163 1586 +1588 3 300.5288 316.7519 56.3066 0.1144 1587 +1589 3 300.7954 316.2908 58.0303 0.3378 1588 +1590 3 300.5265 315.5186 59.4642 0.2684 1589 +1591 3 300.5803 314.4273 59.619 0.2201 1590 +1592 3 300.3 313.4823 58.8 0.3589 1591 +1593 3 300.872 312.6552 59.36 0.2415 1592 +1594 3 307.5392 361.6859 36.8749 0.278 1432 +1595 3 307.6594 360.7101 37.3873 0.2759 1594 +1596 3 307.6216 359.7079 36.5616 0.2277 1595 +1597 3 307.5072 358.7939 36.2776 0.2034 1596 +1598 3 307.9511 358.0342 35.0669 0.1342 1597 +1599 3 308.4224 357.1316 35.2184 0.1144 1598 +1600 3 308.2645 356.5882 37.3752 0.2288 1599 +1601 3 308.6089 355.7005 37.8725 0.3276 1600 +1602 3 308.427 354.7544 38.5445 0.2064 1601 +1603 3 308.1982 354.3014 40.2822 0.1681 1602 +1604 3 308.4144 353.2031 40.32 0.1144 1603 +1605 3 308.1833 352.352 39.5142 0.3432 1604 +1606 3 307.998 351.4665 39.6662 0.22 1605 +1607 3 307.4111 351.1279 41.1289 0.1463 1606 +1608 3 307.617 350.5308 39.4271 0.1731 1607 +1609 3 306.9043 350.1635 38.3037 0.1423 1608 +1610 3 306.4776 349.2312 38.1595 0.1488 1609 +1611 3 306.9112 348.9944 40.159 0.2481 1610 +1612 3 306.4696 348.4773 40.3231 0.2918 1611 +1613 3 305.8644 348.1352 40.7154 0.1411 1612 +1614 3 306.0394 347.5872 42.56 0.1205 1613 +1615 3 305.7912 346.8619 41.2264 0.2934 1614 +1616 3 305.8656 345.9113 40.3262 0.1279 1615 +1617 3 305.5532 345.1036 41.2087 0.126 1616 +1618 3 305.4125 344.1141 42.5216 0.1194 1617 +1619 3 305.2261 343.1165 42.9176 0.2288 1618 +1620 3 305.1197 342.1933 42.0095 0.1907 1619 +1621 3 305.2958 341.2644 43.1805 0.2871 1620 +1622 3 305.5418 340.221 42.9741 0.3178 1621 +1623 3 305.2524 339.2646 43.2849 0.1691 1622 +1624 3 305.0579 338.1607 43.12 0.2235 1623 +1625 3 305.0407 337.3278 42.7781 0.2287 1624 +1626 3 304.5236 336.4241 42.1725 0.1144 1625 +1627 3 303.9768 335.8212 43.12 0.3 1626 +1628 3 303.629 335.2618 43.68 0.1816 1627 +1629 3 303.4586 334.5228 43.0181 0.2392 1628 +1630 3 303.3144 333.8055 43.0004 0.2295 1629 +1631 3 303.732 333.1328 42.5919 0.2527 1630 +1632 3 303.7549 332.2496 42.3956 0.2529 1631 +1633 3 303.9128 331.2921 42.2422 0.2899 1632 +1634 3 304.1518 330.616 42.9332 0.2796 1633 +1635 3 303.6176 330.8448 43.4 0.1271 1634 +1636 3 304.0752 329.3656 42.9649 0.1971 1634 +1637 3 303.9379 328.4813 43.7172 0.2211 1636 +1638 3 304.0237 327.4826 43.7984 0.2288 1637 +1639 3 303.7366 326.5834 44.0798 0.2152 1638 +1640 3 303.263 326.2871 45.64 0.1391 1639 +1641 3 303.2103 325.5183 44.0255 0.2034 1640 +1642 3 303.168 324.5494 44.4763 0.2535 1641 +1643 3 303.7446 323.9934 45.6145 0.171 1642 +1644 3 304.2891 323.0736 45.472 0.1144 1643 +1645 3 304.4756 322.2202 45.36 0.1922 1644 +1646 3 303.9516 321.4102 44.5449 0.1594 1645 +1647 3 303.7583 321.035 46.7432 0.1144 1646 +1648 3 302.7836 320.6884 46.9501 0.1271 1647 +1649 3 301.7483 320.2502 46.9535 0.1866 1648 +1650 3 301.0242 319.9699 47.9032 0.2034 1649 +1651 3 300.3721 319.2355 48.314 0.414 1650 +1652 3 300.0769 318.2345 48.0668 0.3417 1651 +1653 3 300.1284 317.1614 48.44 0.3773 1652 +1654 3 300.1387 316.1215 47.8092 0.2415 1653 +1655 3 300.7576 315.5278 48.7463 0.3264 1654 +1656 3 301.3113 314.9123 50.029 0.3082 1655 +1657 3 301.9016 314.8288 50.68 0.2161 1656 +1658 4 299.8081 376.1609 30.4601 0.3051 1 +1659 4 299.3013 375.1451 30.7992 0.3564 1658 +1660 4 298.8506 374.0937 30.7941 0.4198 1659 +1661 4 298.0509 373.2769 30.7602 0.4587 1660 +1662 4 297.2352 372.4795 30.5836 0.4971 1661 +1663 4 296.5694 371.6067 29.8116 0.5346 1662 +1664 4 295.8361 370.7304 29.6834 0.5439 1663 +1665 4 295.0902 369.8655 29.6951 0.4923 1664 +1666 4 294.5285 368.8702 29.7615 0.43 1665 +1667 4 294.0446 367.8429 30.109 0.3964 1666 +1668 4 293.6465 366.8076 30.7479 0.434 1667 +1669 4 293.5138 365.6727 30.8496 0.4585 1668 +1670 4 293.3433 364.5493 31.1094 0.4703 1669 +1671 4 293.1065 363.4968 32.027 0.4692 1670 +1672 4 293.0836 362.4203 32.928 0.453 1671 +1673 4 293.0436 361.2775 33.0453 0.4068 1672 +1674 4 292.7954 360.2307 33.073 0.3705 1673 +1675 4 292.6398 359.1005 33.2525 0.3928 1674 +1676 4 292.6226 357.9999 34.0102 0.4062 1675 +1677 4 292.5528 356.8628 34.1984 0.4312 1676 +1678 4 292.2382 355.7668 34.4064 0.4322 1677 +1679 4 292.0746 354.6789 35.1644 0.4198 1678 +1680 4 291.609 353.6379 35.2895 0.3568 1679 +1681 4 291.1148 352.606 35.3405 0.3054 1680 +1682 4 290.4753 351.6633 35.5897 0.2669 1681 +1683 4 289.8759 350.9495 36.5243 0.2694 1682 +1684 4 289.3016 350.0526 37.5057 0.2357 1683 +1685 4 288.6369 349.2335 37.863 0.2288 1684 +1686 4 287.7503 348.5574 37.2428 0.254 1685 +1687 4 286.9621 347.7703 36.9382 0.2927 1686 +1688 4 286.3077 346.8471 37.2775 0.312 1687 +1689 4 285.6614 345.9147 37.5234 0.3108 1688 +1690 4 284.9979 344.9835 37.5365 0.3121 1689 +1691 4 284.2691 344.106 37.5906 0.3389 1690 +1692 4 283.4946 343.2744 37.8624 0.3701 1691 +1693 4 282.8895 342.4335 38.8769 0.3885 1692 +1694 4 282.3609 341.5046 39.6357 0.3792 1693 +1695 4 281.9056 340.4624 39.6536 0.3612 1694 +1696 4 281.5373 339.4008 39.2008 0.3559 1695 +1697 4 281.0682 338.378 38.8234 0.3636 1696 +1698 4 280.4699 337.4171 39.0328 0.3764 1697 +1699 4 279.8247 336.4939 39.5248 0.3734 1698 +1700 4 279.1943 335.5489 39.7446 0.3607 1699 +1701 4 278.7859 334.4942 39.7603 0.3479 1700 +1702 4 278.2929 333.4771 39.7625 0.3512 1701 +1703 4 277.7197 332.4876 39.7743 0.364 1702 +1704 4 277.1443 331.4992 39.8362 0.3848 1703 +1705 4 276.6535 330.4844 40.2108 0.394 1704 +1706 4 276.2188 329.4468 40.7154 0.4025 1705 +1707 4 275.7921 328.3909 40.88 0.3814 1706 +1708 4 275.4134 327.3133 40.8806 0.3346 1707 +1709 4 275.132 326.2047 40.8836 0.2579 1708 +1710 4 275.0668 325.0699 40.9055 0.2029 1709 +1711 4 274.6664 324.0426 41.0228 0.1995 1710 +1712 4 273.9697 323.2418 41.8933 0.2402 1711 +1713 4 273.4377 322.314 42.7798 0.2954 1712 +1714 4 273.0614 321.2993 42.1565 0.3375 1713 +1715 4 272.6152 320.7524 41.9695 0.2288 1714 +1716 4 272.2548 319.6954 41.6987 0.3461 1715 +1717 4 271.6851 318.8751 41.6464 0.3855 1716 +1718 4 270.9999 318.175 42.4326 0.4599 1717 +1719 4 270.4393 317.2552 43.2054 0.3625 1718 +1720 4 270.0961 316.2336 43.7791 0.3183 1719 +1721 4 269.3662 315.5095 44.4444 0.2868 1720 +1722 4 269.2621 314.6458 43.127 0.3296 1721 +1723 4 268.4659 314.0692 42.4511 0.309 1722 +1724 4 267.863 313.1952 42.014 0.4068 1723 +1725 4 267.0188 312.5099 41.5904 0.3432 1724 +1726 4 266.4113 311.7343 42.0263 0.3988 1725 +1727 4 265.9251 310.9815 41.9614 0.3432 1726 +1728 4 265.7512 310.286 43.4372 0.3489 1727 +1729 4 265.3439 309.2873 43.12 0.3051 1728 +1730 4 265.2478 308.7073 42.3116 0.2998 1729 +1731 4 264.836 308.3892 41.0894 0.3316 1730 +1732 4 265.3748 307.5633 40.9175 0.2034 1731 +1733 4 265.1792 306.6675 40.1321 0.1144 1732 +1734 4 264.8474 306.258 40.0011 0.1652 1733 +1735 4 265.2501 305.4755 41.498 0.1813 1734 +1736 4 265.702 304.6049 42.56 0.317 1735 +1737 4 265.6505 303.7446 41.993 0.1675 1736 +1738 4 266.4708 303.343 41.6858 0.2187 1737 +1739 4 267.0519 302.6258 40.7162 0.2177 1738 +1740 4 267.8413 301.9966 41.0822 0.2161 1739 +1741 4 268.5288 301.3776 41.6612 0.2288 1740 +1742 4 268.5849 300.4373 41.6147 0.2875 1741 +1743 4 269.0631 299.5736 41.7836 0.4758 1742 +1744 4 269.3914 298.9936 40.8884 0.3212 1743 +1745 4 269.8318 298.3255 41.2056 0.4036 1744 +1746 4 270.2368 297.3084 40.6137 0.2486 1745 +1747 4 270.6246 296.3692 41.0295 0.3533 1746 +1748 4 270.858 295.3854 41.8037 0.2288 1747 +1749 4 271.4449 294.6418 42.6056 0.2717 1748 +1750 4 272.3452 294.1018 42.814 0.1144 1749 +1751 4 272.4539 293.6087 40.8814 0.1646 1750 +1752 4 272.7204 292.8034 41.979 0.2878 1751 +1753 4 272.8143 291.9248 40.7901 0.3051 1752 +1754 4 273.2318 291.2544 41.5232 0.2044 1753 +1755 4 273.416 290.282 42.1518 0.1271 1754 +1756 4 272.7925 289.8461 40.8962 0.198 1755 +1757 4 272.6209 288.9836 40.3808 0.2981 1756 +1758 4 272.5752 288.4493 39.2081 0.2321 1757 +1759 4 272.6678 287.5341 40.2833 0.1348 1758 +1760 4 272.7662 286.7596 38.92 0.2034 1759 +1761 4 273.0488 286.1064 40.0319 0.1923 1760 +1762 4 272.8818 285.1271 40.3096 0.2076 1761 +1763 4 272.9584 284.2691 39.5111 0.1652 1762 +1764 4 273.5498 283.6811 40.6347 0.1144 1763 +1765 4 274.1333 282.9146 39.6525 0.135 1764 +1766 4 274.2477 281.8381 39.0757 0.2477 1765 +1767 4 274.2385 280.9481 38.3975 0.2257 1766 +1768 4 273.8381 279.9242 38.4 0.1608 1767 +1769 4 273.3542 278.9278 38.1562 0.1745 1768 +1770 4 272.8348 278.0824 38.2018 0.1922 1769 +1771 4 272.3864 277.1775 38.519 0.2669 1770 +1772 4 272.1553 276.2691 37.8008 0.1528 1771 +1773 4 271.9288 275.1984 38.4185 0.1891 1772 +1774 4 272.3086 274.4124 38.0405 0.2547 1773 +1775 4 272.5752 273.4354 38.3214 0.2034 1774 +1776 4 272.3281 272.7582 38.0467 0.2834 1775 +1777 4 271.5982 272.2411 36.9163 0.2465 1776 +1778 4 271.1303 271.5684 38.2782 0.1144 1777 +1779 4 271.6863 270.8077 37.8616 0.2034 1778 +1780 4 271.875 269.9565 36.8329 0.2258 1779 +1781 4 271.6314 269.0722 37.3332 0.1783 1780 +1782 4 271.2413 268.3206 36.2782 0.2715 1781 +1783 4 271.2104 267.5198 36.0186 0.1965 1782 +1784 4 271.128 266.7373 36.9883 0.2924 1783 +1785 4 270.9244 265.726 36.4 0.2034 1784 +1786 4 270.8992 265.8656 37.24 0.2288 1785 +1787 4 271.1166 265.1277 36.12 0.1314 1785 +1788 4 271.2378 264.2434 36.2631 0.1144 1787 +1789 4 271.1177 263.1715 36.0511 0.1252 1788 +1790 4 270.9793 262.2403 37.1862 0.1181 1789 +1791 4 271.3225 261.2484 37.2089 0.1631 1790 +1792 4 271.2424 260.5483 36.1147 0.17 1791 +1793 4 271.128 259.8768 35.3027 0.2322 1792 +1794 4 271.1841 258.9398 36.1043 0.1841 1793 +1795 4 271.4712 257.9926 35.8907 0.1635 1794 +1796 4 271.5856 257.0682 35.5264 0.1904 1795 +1797 4 271.3831 256.065 34.7922 0.1447 1796 +1798 4 271.1406 254.9987 34.7516 0.2287 1797 +1799 4 271.128 254.0572 35.4824 0.2669 1798 +1800 4 271.0216 253.4772 34.2278 0.1983 1799 +1801 4 271.0948 252.5517 34.9602 0.1636 1800 +1802 4 271.3568 251.6811 35.3447 0.178 1801 +1803 4 271.8007 250.7545 35.2814 0.216 1802 +1804 4 271.9528 249.9285 34.2157 0.1446 1803 +1805 4 272.0306 249.0728 33.32 0.2889 1804 +1806 4 272.5408 248.5855 35.0 0.2669 1805 +1807 4 272.7296 247.5856 34.1986 0.1677 1806 +1808 4 272.518 246.564 34.7589 0.2193 1807 +1809 4 272.1233 245.4978 35.0 0.269 1808 +1810 4 271.8144 244.4476 35.0297 0.2444 1809 +1811 4 271.7023 243.338 35.3186 0.1659 1810 +1812 4 271.8888 242.5291 35.0 0.247 1811 +1813 4 272.5008 241.8313 35.5236 0.2798 1812 +1814 4 273.2558 241.1815 35.6112 0.2288 1813 +1815 4 273.8278 240.2755 36.2239 0.202 1814 +1816 4 274.1264 239.2516 36.0335 0.1725 1815 +1817 4 274.3266 238.1819 36.2085 0.1144 1816 +1818 4 274.6469 237.2564 35.1226 0.1695 1817 +1819 4 275.1514 236.4614 35.7316 0.1652 1818 +1820 4 275.704 235.7212 35.5776 0.1955 1819 +1821 4 275.7646 234.6676 35.6908 0.1967 1820 +1822 4 276.1353 233.7489 36.0923 0.2556 1821 +1823 4 276.276 232.7903 35.2531 0.2288 1822 +1824 4 276.7004 231.9666 34.5369 0.3238 1823 +1825 4 276.7462 230.9644 33.6 0.2204 1824 +1826 4 276.9933 230.2346 33.8254 0.2288 1825 +1827 4 277.857 229.7072 34.16 0.1144 1826 +1828 4 277.9989 228.6215 33.8125 0.2052 1827 +1829 4 278.6956 227.8299 33.6129 0.1306 1828 +1830 4 279.3431 227.1023 33.0711 0.1512 1829 +1831 4 279.2001 226.2066 33.8484 0.2924 1830 +1832 4 279.4792 225.8256 35.0 0.2415 1831 +1833 4 264.6175 308.5723 44.3792 0.3432 1729 +1834 4 264.0352 308.1101 43.7251 0.3051 1833 +1835 4 263.4106 307.3013 43.7478 0.4046 1834 +1836 4 263.0548 306.4787 43.4862 0.2063 1835 +1837 4 262.397 305.8793 43.9267 0.1913 1836 +1838 4 261.8593 305.4263 44.24 0.3159 1837 +1839 4 261.2919 304.5145 43.7203 0.405 1838 +1840 4 261.0288 303.5158 43.5868 0.3016 1839 +1841 4 261.0768 302.5445 43.787 0.2613 1840 +1842 4 260.7874 301.8112 42.4673 0.3777 1841 +1843 4 260.705 300.8548 41.2639 0.243 1842 +1844 4 260.2474 300.0071 41.8135 0.3305 1843 +1845 4 259.8985 299.3619 43.3874 0.3813 1844 +1846 4 259.1286 298.624 42.8565 0.2601 1845 +1847 4 258.655 298.0578 43.2172 0.2669 1846 +1848 4 258.1413 297.1712 43.1343 0.3247 1847 +1849 4 257.6288 296.6392 43.96 0.3686 1848 +1850 4 257.0648 295.7469 44.8678 0.276 1849 +1851 4 256.7239 294.8706 46.3028 0.1907 1850 +1852 4 256.2205 294.4965 45.6817 0.3671 1851 +1853 4 255.8956 293.5252 45.9388 0.3934 1852 +1854 4 255.7881 292.4098 45.4096 0.3386 1853 +1855 4 255.1692 291.7989 45.0251 0.486 1854 +1856 4 254.6544 291.2521 46.5273 0.3553 1855 +1857 4 254.3512 290.576 46.132 0.2844 1856 +1858 4 253.7392 289.9376 46.058 0.1661 1857 +1859 4 253.4326 289.2673 47.7621 0.275 1858 +1860 4 253.078 288.383 47.1654 0.2204 1859 +1861 4 252.7737 287.311 46.8532 0.2094 1860 +1862 4 252.3492 286.4862 47.0719 0.3208 1861 +1863 4 252.0426 285.7254 48.1449 0.2672 1862 +1864 4 251.9752 284.9143 49.3147 0.2288 1863 +1865 4 251.2064 284.2794 50.3468 0.2288 1864 +1866 4 250.5543 283.4043 50.0458 0.3202 1865 +1867 4 249.9937 282.997 48.16 0.2812 1866 +1868 4 249.4229 282.4628 49.287 0.3432 1867 +1869 4 249.1254 281.551 49.9022 0.2796 1868 +1870 4 248.5626 281.6242 48.8846 0.1683 1869 +1871 4 247.4918 281.4274 49.5628 0.2463 1870 +1872 4 246.7505 280.7982 49.3511 0.2515 1871 +1873 4 245.8525 280.3807 50.1315 0.281 1872 +1874 4 245.2816 279.8853 50.1273 0.2169 1873 +1875 4 244.5666 279.454 49.28 0.3051 1874 +1876 4 243.6812 278.7917 49.6138 0.2918 1875 +1877 4 243.0119 278.1613 50.6066 0.3382 1876 +1878 4 242.3106 277.4028 51.2865 0.2942 1877 +1879 4 241.9754 276.657 50.4053 0.2393 1878 +1880 4 241.4755 275.7978 50.8094 0.2587 1879 +1881 4 240.7239 275.1034 51.8507 0.178 1880 +1882 4 240.2343 274.2065 52.0618 0.2288 1881 +1883 4 239.7103 273.3828 52.1007 0.2203 1882 +1884 4 239.5833 272.4505 53.1185 0.3305 1883 +1885 4 238.9473 271.9196 52.7853 0.2432 1884 +1886 4 238.5938 271.1852 53.6505 0.1971 1885 +1887 4 237.8342 270.421 53.9773 0.1652 1886 +1888 4 237.0288 270.3855 54.3074 0.2339 1887 +1889 4 236.3229 269.7529 53.5836 0.2843 1888 +1890 4 235.672 269.0185 54.2688 0.2011 1889 +1891 4 235.0623 268.2451 53.7323 0.2161 1890 +1892 4 234.568 267.3791 53.5648 0.2474 1891 +1893 4 234.1368 266.6767 54.0492 0.211 1892 +1894 4 234.0464 266.4273 56.2489 0.229 1893 +1895 4 233.7192 265.3314 56.2489 0.2516 1894 +1896 4 232.8463 264.6518 56.0311 0.2193 1895 +1897 4 232.2423 264.0752 54.9332 0.217 1896 +1898 4 231.7206 263.2699 54.9489 0.2288 1897 +1899 4 231.0102 262.9015 55.5892 0.2543 1898 +1900 4 230.794 262.2483 55.9908 0.2587 1899 +1901 4 230.6007 261.3857 56.5454 0.3432 1900 +1902 4 230.0641 260.4819 55.5845 0.2424 1901 +1903 4 229.8296 259.6251 54.5714 0.4277 1902 +1904 4 229.5962 258.7854 54.6501 0.2934 1903 +1905 4 228.8092 258.3598 55.8144 0.3215 1904 +1906 4 228.5026 257.4057 56.4029 0.2382 1905 +1907 4 228.5884 256.5981 56.84 0.1876 1906 +1908 4 228.2589 255.5055 56.8851 0.1709 1907 +1909 4 227.5942 254.7322 57.3448 0.1963 1908 +1910 4 226.8598 254.1671 56.6222 0.2669 1909 +1911 4 226.1665 253.3377 56.9898 0.1986 1910 +1912 4 225.9045 252.379 57.12 0.1984 1911 +1913 4 225.3989 251.3608 57.3017 0.2666 1912 +1914 4 225.1449 250.7328 58.3472 0.2994 1913 +1915 4 224.6438 250.1505 59.6285 0.2255 1914 +1916 4 224.621 249.2078 59.0848 0.3197 1915 +1917 4 223.9094 248.5718 59.64 0.2767 1916 +1918 4 223.8808 247.9574 59.8441 0.3122 1917 +1919 4 223.0125 247.5994 59.3158 0.2549 1918 +1920 4 222.9656 246.6464 60.48 0.3051 1919 +1921 4 222.2849 246.1327 61.6753 0.1889 1920 +1922 4 221.4841 245.5882 61.88 0.1873 1921 +1923 4 221.0059 245.0402 60.1888 0.2364 1922 +1924 4 220.4705 244.8057 60.76 0.1271 1923 +1925 4 219.6491 244.1296 60.48 0.2288 1924 +1926 4 219.2224 243.7635 62.5162 0.2321 1925 +1927 4 218.6321 243.1309 63.4094 0.2669 1926 +1928 4 218.3736 242.3232 64.4028 0.3264 1927 +1929 4 217.5625 241.7592 64.3283 0.309 1928 +1930 4 216.8155 240.9344 64.12 0.3726 1929 +1931 4 216.0696 240.0947 64.3737 0.5053 1930 +1932 4 215.4655 239.3626 65.2288 0.5131 1931 +1933 4 215.0182 238.5366 66.0988 0.4272 1932 +1934 4 214.1248 237.9451 66.5414 0.3382 1933 +1935 4 213.3743 237.1054 66.6534 0.3432 1934 +1936 4 213.4693 236.236 66.9186 0.2671 1935 +1937 4 212.6204 235.6663 65.8 0.3358 1936 +1938 4 212.4374 234.7751 66.642 0.1922 1937 +1939 4 211.7498 234.3141 67.0466 0.3437 1938 +1940 4 211.2522 233.6048 67.7359 0.482 1939 +1941 4 210.5726 232.78 67.7757 0.3434 1940 +1942 4 209.9023 232.041 67.1216 0.3281 1941 +1943 4 209.4515 231.1921 66.9393 0.3765 1942 +1944 4 208.9951 230.3776 67.6855 0.353 1943 +1945 4 208.4814 229.69 68.88 0.4491 1944 +1946 4 207.9792 228.7222 68.698 0.2569 1945 +1947 4 207.5113 228.228 69.953 0.3875 1946 +1948 4 207.0137 227.4913 70.5186 0.2924 1947 +1949 4 206.3925 226.6939 70.74 0.4721 1948 +1950 4 205.5768 225.7146 68.9307 0.2469 1949 +1951 4 205.0071 225.0488 69.7799 0.3204 1950 +1952 4 204.355 224.2858 69.19 0.2288 1951 +1953 4 203.8883 223.7607 70.6776 0.3775 1952 +1954 4 203.6961 223.0514 70.6726 0.3268 1953 +1955 4 202.9788 222.6521 71.4692 0.472 1954 +1956 4 202.6138 221.6969 71.6864 0.3536 1955 +1957 4 201.9743 221.0116 72.142 0.3725 1956 +1958 4 201.36 220.1559 71.2379 0.2436 1957 +1959 4 201.1838 219.9088 72.266 0.1144 1958 +1960 4 200.812 219.171 73.67 0.1657 1959 +1961 4 200.2892 218.226 74.403 0.1977 1960 +1962 4 199.8465 217.2227 73.7769 0.2776 1961 +1963 4 199.5228 216.3704 72.6037 0.2765 1962 +1964 4 198.8009 215.5696 72.4802 0.394 1963 +1965 4 198.2403 214.6624 72.0619 0.2288 1964 +1966 4 198.0161 214.0893 74.1482 0.2818 1965 +1967 4 197.5082 213.3343 75.0126 0.4173 1966 +1968 4 196.9167 212.538 74.6911 0.2423 1967 +1969 4 196.5472 211.7372 75.3514 0.3432 1968 +1970 4 195.9706 211.0211 75.7884 0.4558 1969 +1971 4 195.6549 210.1459 75.7711 0.3156 1970 +1972 4 194.9628 209.7684 74.2092 0.4919 1971 +1973 4 194.5944 208.8052 75.0795 0.395 1972 +1974 4 194.2237 207.9346 75.8545 0.4263 1973 +1975 4 192.9001 206.7242 77.1 0.4235 1974 +1976 4 192.4151 206.031 77.5869 0.3298 1975 +1977 4 191.8946 205.3903 77.3111 0.2567 1976 +1978 4 191.5708 204.6536 77.28 0.2584 1977 +1979 4 190.8604 203.9763 77.9212 0.5339 1978 +1980 4 190.7689 203.4467 79.8238 0.3861 1979 +1981 4 190.2472 202.7317 80.0873 0.4454 1980 +1982 4 190.0276 201.7055 80.2984 0.3557 1981 +1983 4 189.2473 201.1518 80.0103 0.3756 1982 +1984 4 189.0071 200.3945 78.5932 0.3821 1983 +1985 4 188.7646 199.9083 80.1206 0.2245 1984 +1986 4 188.2612 199.2287 79.6816 0.3159 1985 +1987 4 187.3437 198.7471 79.002 0.4299 1986 +1988 4 186.6425 197.9566 79.469 0.3586 1987 +1989 4 185.9526 197.4601 80.3799 0.4454 1988 +1990 4 185.5728 197.1981 82.04 0.4195 1989 +1991 4 185.1312 196.1903 82.2343 0.3686 1990 +1992 4 184.3464 195.4181 82.7114 0.3313 1991 +1993 4 183.6074 194.623 83.4165 0.3811 1992 +1994 4 183.3294 193.5476 83.72 0.4602 1993 +1995 4 182.7197 192.732 83.5853 0.3615 1994 +1996 4 182.1214 191.8294 83.8956 0.353 1995 +1997 4 181.4773 191.1384 82.88 0.3813 1996 +1998 4 180.9716 190.2094 82.9116 0.3038 1997 +1999 4 180.315 189.4178 82.88 0.3704 1998 +2000 4 179.608 189.0014 83.54 0.2319 1999 +2001 4 179.3998 188.1811 84.5513 0.3051 2000 +2002 4 178.9124 187.33 84.6866 0.3691 2001 +2003 4 178.0201 186.758 84.9971 0.3392 2002 +2004 4 177.5728 185.8245 84.84 0.2953 2003 +2005 4 177.0923 184.8773 84.0062 0.4058 2004 +2006 4 176.6096 184.0833 84.0118 0.321 2005 +2007 4 175.8397 183.4953 84.5995 0.4174 2006 +2008 4 175.4873 182.9439 85.8561 0.3348 2007 +2009 4 174.9336 182.158 86.6746 0.2415 2008 +2010 4 174.6774 181.324 85.9636 0.4307 2009 +2011 4 174.3399 180.5953 87.08 0.3747 2010 +2012 4 173.6386 179.934 86.8935 0.4109 2011 +2013 4 173.3812 178.9754 86.8045 0.3424 2012 +2014 4 173.0769 178.3324 87.3152 0.2388 2013 +2015 4 172.8287 177.423 86.133 0.3051 2014 +2016 4 172.0576 176.6977 86.5354 0.4068 2015 +2017 4 171.6938 176.128 88.2837 0.3386 2016 +2018 4 171.1985 175.2608 89.0798 0.2352 2017 +2019 4 170.6619 174.6831 89.7005 0.3368 2018 +2020 4 170.1563 173.745 88.7788 0.2916 2019 +2021 4 169.5076 173.054 89.32 0.3295 2020 +2022 4 169.0729 172.3802 88.2059 0.3099 2021 +2023 4 168.3373 171.695 88.4366 0.1781 2022 +2024 4 167.5834 171.2614 89.6221 0.3887 2023 +2025 4 167.0675 170.5761 90.72 0.3487 2024 +2026 4 166.6922 169.5774 90.9504 0.2736 2025 +2027 4 166.0104 168.6805 90.8214 0.3615 2026 +2028 4 165.5334 167.8648 89.4449 0.4909 2027 +2029 4 164.776 167.2093 89.5843 0.4261 2028 +2030 4 164.2018 166.2575 89.6132 0.3665 2029 +2031 4 163.8826 165.6604 91.0482 0.337 2030 +2032 4 163.7007 164.641 90.5915 0.3375 2031 +2033 4 163.3964 163.616 91.0115 0.2341 2032 +2034 4 163.3312 162.7351 91.56 0.2229 2033 +2035 4 162.8347 161.9069 91.9881 0.3491 2034 +2036 4 162.0785 161.137 92.694 0.2981 2035 +2037 4 161.1759 160.5066 93.1837 0.2377 2036 +2038 4 160.7595 159.5045 93.2467 0.2034 2037 +2039 4 160.2561 158.5721 93.7045 0.2094 2038 +2040 4 159.7493 157.9235 93.0404 0.2898 2039 +2041 4 159.461 156.9625 93.5558 0.2677 2040 +2042 4 159.135 156.029 94.5098 0.2206 2041 +2043 4 158.6042 155.1664 95.1686 0.1738 2042 +2044 4 158.2884 154.0888 94.92 0.1192 2043 +2045 4 157.753 153.2171 95.2812 0.3227 2044 +2046 4 157.4236 152.1291 95.2 0.3284 2045 +2047 4 157.0575 151.0549 95.4198 0.2915 2046 +2048 4 156.6616 150.198 96.8103 0.2605 2047 +2049 4 156.2304 149.3995 97.7693 0.2601 2048 +2050 4 155.7579 148.5976 97.071 0.3911 2049 +2051 4 155.3323 147.7636 96.9422 0.3122 2050 +2052 4 154.8976 146.9548 98.4326 0.1401 2051 +2053 4 154.3245 146.0613 98.84 0.1144 2052 +2054 4 153.6049 145.3143 98.8308 0.1182 2053 +2055 4 152.8155 144.5398 98.4931 0.1898 2054 +2056 4 152.2458 143.5926 98.7792 0.1846 2055 +2057 4 151.5537 142.8616 99.12 0.3122 2056 +2058 4 150.7563 142.2644 98.7109 0.2288 2057 +2059 4 149.9933 141.8331 99.6128 0.2669 2058 +2060 4 149.7004 140.9419 100.6138 0.3392 2059 +2061 4 149.3698 139.9329 101.39 0.2084 2060 +2062 4 149.1593 138.8553 102.0124 0.124 2061 +2063 4 148.5187 137.9264 102.2 0.1144 2062 +2064 4 147.6549 137.3143 102.4666 0.1144 2063 +2065 4 146.9937 136.4243 102.48 0.1336 2064 +2066 4 146.4755 135.4599 102.7869 0.1725 2065 +2067 4 146.2146 134.4349 103.1414 0.1635 2066 +2068 4 145.7559 133.5448 103.9004 0.1144 2067 +2069 4 145.3418 132.5198 104.16 0.1144 2068 +2070 4 144.4769 131.8952 104.2272 0.1225 2069 +2071 4 143.7081 131.1173 104.4291 0.2116 2070 +2072 4 143.5617 130.5693 106.3866 0.167 2071 +2073 4 143.1201 129.7182 106.6985 0.1939 2072 +2074 4 142.7815 128.7927 106.2384 0.2288 2073 +2075 4 142.4257 127.8614 106.7878 0.1907 2074 +2076 4 142.0779 127.0458 107.8 0.1714 2075 +2077 4 141.7038 125.9922 107.7997 0.1907 2076 +2078 4 141.0678 125.109 107.8246 0.1325 2077 +2079 4 140.2292 124.5278 108.5468 0.1144 2078 +2080 4 139.4547 123.7064 108.64 0.1144 2079 +2081 4 138.8587 122.9651 109.482 0.1144 2080 +2082 4 138.5338 122.0202 109.9134 0.1312 2081 +2083 4 137.9515 121.089 110.2469 0.1191 2082 +2084 4 137.1919 120.3133 111.0547 0.1514 2083 +2085 4 136.7034 119.3112 111.517 0.2034 2084 +2086 4 136.16 118.3376 112.0 0.162 2085 +2087 4 136.033 117.3241 112.572 0.116 2086 +2088 4 136.2298 116.2876 113.3457 0.1341 2087 +2089 4 136.0857 115.1791 113.68 0.1487 2088 +2090 4 135.7676 114.0822 113.68 0.2288 2089 +2091 4 135.3981 113.5568 113.96 0.3382 2090 +2092 4 134.8776 112.7799 114.7471 0.3216 2091 +2093 4 134.8421 111.7206 115.0932 0.265 2092 +2094 4 135.4416 110.8978 115.4829 0.2255 2093 +2095 4 135.6933 110.0838 114.0 0.2614 2094 +2096 4 135.6784 109.1147 114.408 0.2728 2095 +2097 4 135.9644 108.3403 116.1345 0.2731 2096 +2098 4 135.7734 107.3832 116.247 0.2754 2097 +2099 4 135.8157 106.3778 116.713 0.1801 2098 +2100 4 135.7562 105.2764 117.2979 0.2305 2099 +2101 4 135.4313 104.1866 117.4362 0.2765 2100 +2102 4 135.1762 103.141 118.1471 0.2258 2101 +2103 4 134.6808 102.7232 116.5688 0.1973 2102 +2104 4 134.6305 101.8254 115.64 0.2256 2103 +2105 4 134.6488 100.7918 116.0944 0.1144 2104 +2106 4 134.6911 100.0884 117.6512 0.148 2105 +2107 4 134.7815 99.3526 118.72 0.3813 2106 +2108 4 135.2116 98.4157 118.2686 0.3241 2107 +2109 4 135.2437 97.7976 116.3408 0.2519 2108 +2110 4 135.54 96.8788 117.32 0.1947 2109 +2111 4 135.6384 96.0939 116.9518 0.2655 2110 +2112 4 135.5686 95.3231 116.0323 0.2111 2111 +2113 4 135.961 94.9299 114.4307 0.2341 2112 +2114 4 136.247 93.8935 113.96 0.2448 2113 +2115 4 136.3568 92.8218 114.1753 0.2625 2114 +2116 4 136.4529 91.8987 115.36 0.1849 2115 +2117 4 137.0512 91.0443 115.5636 0.2385 2116 +2118 4 136.9402 90.948 118.258 0.1332 2117 +2119 4 136.9368 90.9226 121.0527 0.1144 2118 +2120 4 137.0512 90.5832 123.489 0.1144 2119 +2121 4 137.0638 89.7208 125.1228 0.1144 2120 +2122 4 137.0215 89.0255 127.1393 0.1349 2121 +2123 4 137.0592 88.0054 127.9911 0.2262 2122 +2124 4 137.1805 86.96 128.7784 0.1232 2123 +2125 4 137.8566 86.1886 129.0635 0.1719 2124 +2126 4 138.0808 85.5975 129.8321 0.2235 2125 +2127 4 138.6082 84.7646 130.188 0.1144 2126 +2128 4 139.2008 83.8653 130.76 0.2266 2127 +2129 4 139.465 83.1791 129.3804 0.1773 2128 +2130 4 140.2121 82.5405 129.2609 0.1562 2129 +2131 4 140.8264 81.6683 129.08 0.1182 2130 +2132 4 141.6215 80.9534 129.0187 0.1144 2131 +2133 4 142.5664 80.3992 128.5889 0.1144 2132 +2134 4 143.1178 79.4848 128.3582 0.1144 2133 +2135 4 143.2288 78.4465 128.4875 0.1144 2134 +2136 4 143.0149 77.6787 129.3454 0.1675 2135 +2137 4 143.1522 77.233 131.0431 0.2472 2136 +2138 4 143.4702 76.4309 132.16 0.2478 2137 +2139 4 143.8706 75.5771 132.6601 0.2069 2138 +2140 4 143.7962 74.8564 134.1166 0.1254 2139 +2141 4 143.3032 74.0542 135.2425 0.1144 2140 +2142 4 143.0801 73.2361 136.2155 0.1468 2141 +2143 4 143.2174 72.1136 136.08 0.2382 2142 +2144 4 143.4576 71.3856 136.64 0.1398 2143 +2145 4 135.3993 113.6063 114.2098 0.3051 2090 +2146 4 134.6705 113.0582 113.1259 0.2772 2145 +2147 4 134.2839 112.9949 114.6107 0.3276 2146 +2148 4 133.7771 112.7324 116.48 0.2415 2147 +2149 4 133.0724 112.0937 117.7081 0.2775 2148 +2150 4 132.9751 111.1348 118.6234 0.2504 2149 +2151 4 132.3414 110.3951 118.454 0.1563 2150 +2152 4 131.56 110.0009 119.576 0.273 2151 +2153 4 131.2111 109.3296 121.2224 0.1453 2152 +2154 4 130.6368 108.7944 122.2931 0.2055 2153 +2155 4 129.9607 108.2954 121.2926 0.265 2154 +2156 4 129.5225 107.9852 122.703 0.1314 2155 +2157 4 129.725 107.3733 124.2497 0.1478 2156 +2158 4 129.2892 106.8544 123.7054 0.2288 2157 +2159 4 128.5948 106.3221 124.88 0.2314 2158 +2160 4 128.3431 105.2986 125.5346 0.1652 2159 +2161 4 127.4553 104.8079 126.28 0.1144 2160 +2162 4 126.8971 104.0031 127.073 0.2605 2161 +2163 4 125.9418 103.4019 127.12 0.2765 2162 +2164 4 125.1742 102.8517 127.9116 0.1907 2163 +2165 4 124.4523 102.6348 129.64 0.1271 2164 +2166 4 123.5692 101.9666 129.92 0.1333 2165 +2167 4 122.8233 101.3039 130.7348 0.1265 2166 +2168 4 121.8028 100.8097 130.76 0.131 2167 +2169 4 120.9437 100.4054 131.224 0.2008 2168 +2170 4 120.0754 99.7797 130.6836 0.1849 2169 +2171 4 119.4061 99.3095 129.1987 0.1302 2170 +2172 4 118.515 99.143 128.6659 0.1144 2171 +2173 4 117.6696 98.5148 128.24 0.1144 2172 +2174 4 116.5496 98.384 128.4363 0.1144 2173 +2175 4 115.409 98.384 128.52 0.1194 2174 +2176 4 114.5167 98.384 129.7778 0.1619 2175 +2177 4 113.8957 98.4984 132.0063 0.2288 2176 +2178 4 113.0108 98.9001 132.0852 0.2868 2177 +2179 4 112.0936 99.2735 131.3301 0.2418 2178 +2180 4 111.1802 99.3057 131.068 0.2135 2179 +2181 4 110.123 99.362 131.0397 0.2287 2180 +2182 4 109.268 99.4342 132.02 0.2431 2181 +2183 4 108.3749 99.0196 131.6311 0.3178 2182 +2184 4 107.9407 98.8416 132.7418 0.3199 2183 +2185 4 107.5813 98.384 132.7782 0.1477 2184 +2186 4 107.269 98.023 131.2394 0.2898 2185 +2187 4 106.4616 97.3663 131.6078 0.1263 2186 +2188 4 105.8261 97.391 133.2612 0.1144 2187 +2189 4 105.6227 96.6324 133.56 0.1271 2188 +2190 4 105.4783 95.6784 132.9051 0.1907 2189 +2191 4 104.7904 95.5017 131.4712 0.1504 2190 +2192 4 104.719 94.465 130.975 0.2004 2191 +2193 4 104.7546 93.4246 131.0512 0.1788 2192 +2194 4 104.9176 92.3282 131.0501 0.1566 2193 +2195 4 105.1714 91.5068 129.8564 0.1522 2194 +2196 4 104.9646 90.7354 129.5868 0.2288 2195 +2197 4 105.1305 90.376 131.8929 0.1715 2196 +2198 4 105.0192 89.9533 133.387 0.313 2197 +2199 4 104.676 89.1177 132.6399 0.1953 2198 +2200 4 104.4472 88.307 133.5298 0.2743 2199 +2201 4 104.3328 87.3038 132.4621 0.2692 2200 +2202 4 104.0619 86.414 130.9991 0.1921 2201 +2203 4 103.2351 85.8715 130.3224 0.2015 2202 +2204 4 103.0362 85.1773 128.8319 0.1907 2203 +2205 4 103.293 84.8392 127.1651 0.155 2204 +2206 4 103.6284 83.8574 126.84 0.1981 2205 +2207 4 102.9944 83.0582 127.132 0.1682 2206 +2208 4 102.325 82.3305 126.9036 0.3387 2207 +2209 4 102.1894 81.4099 126.5561 0.1382 2208 +2210 4 101.5258 80.9671 124.6666 0.2407 2209 +2211 4 101.2654 80.3004 123.9762 0.1228 2210 +2212 4 101.538 79.6142 124.1198 0.2542 2211 +2213 4 101.5872 78.8216 124.04 0.2542 2212 +2214 4 107.6236 98.956 132.314 0.249 2183 +2215 4 107.0173 99.6743 131.8738 0.2094 2214 +2216 4 106.4612 100.224 130.5581 0.1718 2215 +2217 4 105.7241 100.6961 131.5591 0.1652 2216 +2218 4 105.3258 101.2052 133.0 0.2547 2217 +2219 4 104.5105 101.914 132.7306 0.2672 2218 +2220 4 103.7482 102.3552 133.7563 0.1605 2219 +2221 4 103.0297 102.8874 134.3734 0.1922 2220 +2222 4 102.4516 103.6337 134.0268 0.2288 2221 +2223 4 101.816 103.9133 134.2132 0.2288 2222 +2224 4 101.6215 104.0517 134.9334 0.1416 2222 +2225 4 100.8323 104.4483 134.7819 0.2519 2224 +2226 4 100.2006 104.9818 135.4564 0.1777 2225 +2227 4 99.5304 105.5897 134.6374 0.1144 2226 +2228 4 99.1649 106.396 135.5973 0.142 2227 +2229 4 98.4944 106.9781 136.8906 0.1144 2228 +2230 4 97.8302 107.3853 138.1134 0.2188 2229 +2231 4 97.2462 107.7832 139.806 0.1657 2230 +2232 4 97.0504 108.4184 139.7536 0.2012 2231 +2233 4 96.6121 109.1376 140.4455 0.2718 2232 +2234 4 96.2954 109.7806 141.9558 0.2051 2233 +2235 4 95.3715 109.824 143.2668 0.2034 2234 +2236 4 94.4802 110.2816 143.5031 0.2134 2235 +2237 4 93.6863 110.4196 144.8868 0.1568 2236 +2238 4 93.1176 111.073 144.9384 0.1398 2237 +2239 4 92.3406 110.968 143.7419 0.2631 2238 +2240 4 91.5187 110.8489 145.4379 0.1954 2239 +2241 4 90.5336 110.5398 146.5738 0.1652 2240 +2242 4 89.9027 110.7393 148.6492 0.178 2241 +2243 4 88.9348 111.0824 147.9848 0.2539 2242 +2244 4 87.9145 110.9666 146.886 0.1586 2243 +2245 4 86.8543 111.2734 146.7357 0.1652 2244 +2246 4 85.9644 111.8899 147.499 0.1652 2245 +2247 4 85.1134 112.2264 148.4115 0.1905 2246 +2248 4 84.7254 112.2592 150.6086 0.1499 2247 +2249 4 83.9685 112.6759 151.5816 0.2261 2248 +2250 4 83.2832 112.4552 149.8 0.1525 2249 +2251 4 223.8064 247.0079 61.161 0.2799 1920 +2252 4 224.224 247.9048 59.92 0.2796 2251 +2253 4 248.3876 280.598 49.28 0.3178 1869 +2254 4 248.5306 279.4792 50.3552 0.2932 2253 +2255 4 249.3497 278.9861 51.3752 0.2613 2254 +2256 4 249.1907 278.0355 50.5926 0.1907 2255 +2257 4 249.5064 277.1512 51.711 0.242 2256 +2258 4 249.527 276.2806 52.5893 0.2756 2257 +2259 4 250.3232 275.6662 51.8263 0.138 2258 +2260 4 250.5463 274.6538 52.3508 0.2656 2259 +2261 4 250.9032 273.8999 52.4465 0.1332 2260 +2262 4 250.8792 272.812 52.92 0.1707 2261 +2263 4 251.227 271.8853 53.2734 0.2374 2262 +2264 4 251.6583 271.239 53.7068 0.2372 2263 +2265 4 251.7944 270.4576 54.2497 0.2288 2264 +2266 4 251.7944 269.5447 55.0642 0.2288 2265 +2267 4 251.68 268.8469 54.962 0.3373 2266 +2268 4 252.1902 268.165 55.5307 0.115 2267 +2269 4 252.7222 267.3551 54.7929 0.2075 2268 +2270 4 253.1478 266.5394 56.1554 0.2224 2269 +2271 4 253.7323 265.6059 56.203 0.2669 2270 +2272 4 253.396 264.725 56.5452 0.2542 2271 +2273 4 253.1066 263.7778 56.3046 0.2288 2272 +2274 4 253.6751 262.8489 56.3634 0.2504 2273 +2275 4 254.3112 262.2197 56.6989 0.3893 2274 +2276 4 254.6544 261.404 58.002 0.2911 2275 +2277 4 254.5812 260.3504 57.6265 0.1184 2276 +2278 4 253.9188 259.9088 56.7602 0.1326 2277 +2279 4 253.7312 259.3448 57.5523 0.3715 2278 +2280 4 253.865 258.5577 57.1096 0.178 2279 +2281 4 254.8043 258.417 57.148 0.323 2280 +2282 4 255.6325 258.0944 58.0398 0.2039 2281 +2283 4 256.3315 257.4389 58.3862 0.1652 2282 +2284 4 257.3451 257.154 58.7997 0.2627 2283 +2285 4 258.147 256.8612 60.1888 0.1785 2284 +2286 4 259.1412 256.4848 60.2 0.243 2285 +2287 4 259.8859 256.8989 61.3021 0.3069 2286 +2288 4 260.641 257.5144 62.6268 0.1907 2287 +2289 4 261.4395 258.1802 63.7185 0.2503 2288 +2290 4 261.9463 257.8656 65.1568 0.1144 2289 +2291 4 262.4691 258.3827 66.36 0.1144 2290 +2292 4 263.1543 258.7579 64.6996 0.1968 2291 +2293 4 264.0146 259.0165 63.9954 0.2161 2292 +2294 4 265.0065 259.4295 63.84 0.2722 2293 +2295 4 265.6746 259.5976 65.3114 0.269 2294 +2296 4 266.5074 259.4558 65.9789 0.2196 2295 +2297 4 267.0714 258.6778 66.6439 0.2637 2296 +2298 4 268.0232 258.6275 67.4579 0.1433 2297 +2299 4 268.6318 257.9663 67.7295 0.2168 2298 +2300 4 269.5687 257.376 68.2223 0.2438 2299 +2301 4 270.3261 256.8337 68.8433 0.1525 2300 +2302 4 270.1476 256.6084 66.3426 0.1834 2301 +2303 4 270.7871 256.5981 65.24 0.1525 2302 +2304 4 271.128 256.4699 66.9774 0.2399 2303 +2305 4 271.5822 256.3326 69.3199 0.3499 2304 +2306 4 272.4619 255.9757 69.1911 0.233 2305 +2307 4 272.9447 255.3934 70.7585 0.1144 2306 +2308 4 273.416 254.8409 70.0694 0.2082 2307 +2309 4 274.0704 254.2048 70.6558 0.2043 2308 +2310 4 275.0691 253.8067 70.5488 0.2692 2309 +2311 4 275.7189 252.951 70.8397 0.2028 2310 +2312 4 276.7176 252.7004 70.4701 0.1144 2311 +2313 4 277.2701 252.4808 72.3192 0.1144 2312 +2314 4 278.2803 252.1765 73.1259 0.1223 2313 +2315 4 279.311 251.7361 73.36 0.1673 2314 +2316 4 280.0798 250.9456 73.8038 0.1907 2315 +2317 4 280.5786 250.0315 74.1401 0.2049 2316 +2318 4 281.4801 249.6208 73.64 0.1314 2317 +2319 4 282.1104 248.9722 74.7093 0.2135 2318 +2320 4 282.1928 247.9677 74.8362 0.2397 2319 +2321 4 282.7385 247.255 75.9433 0.2288 2320 +2322 4 283.4706 246.8672 76.979 0.1185 2321 +2323 4 283.7028 245.7884 76.72 0.1144 2322 +2324 4 283.9294 244.6913 76.72 0.1144 2323 +2325 4 284.8308 244.0381 76.7138 0.1144 2324 +2326 4 285.3056 243.1229 76.44 0.1144 2325 +2327 4 285.4886 242.4159 77.8445 0.1507 2326 +2328 4 285.476 241.6082 78.1063 0.2577 2327 +2329 4 286.1659 240.7708 78.4 0.2346 2328 +2330 4 286.4793 239.8339 79.2714 0.1907 2329 +2331 4 287.4254 239.2973 79.3766 0.2703 2330 +2332 4 288.4093 238.9187 80.0892 0.1144 2331 +2333 4 288.6552 238.2758 82.0187 0.1994 2332 +2334 4 289.3336 238.1808 80.421 0.1743 2333 +2335 4 289.7626 237.6145 78.797 0.3321 2334 +2336 4 290.2408 237.7918 79.8389 0.1907 2335 +2337 4 290.8208 237.0265 81.3596 0.1907 2336 +2338 4 291.402 236.2612 82.88 0.1907 2337 +2339 4 291.768 235.8928 83.5344 0.1144 2338 +2340 4 292.2703 235.7292 85.9606 0.1144 2339 +2341 4 292.5723 234.9776 87.0643 0.1144 2340 +2342 4 292.6352 233.853 86.8 0.1144 2341 +2343 4 292.6352 232.709 86.8 0.1144 2342 +2344 4 292.6283 231.5868 87.0794 0.1405 2343 +2345 4 292.7496 230.7448 87.92 0.178 2344 +2346 4 291.1549 236.3698 82.885 0.1265 2338 +2347 4 290.7076 237.1066 84.3951 0.2151 2346 +2348 4 290.2328 237.7232 85.68 0.1525 2347 +2349 4 260.3744 257.5144 63.0 0.1652 2288 +2350 4 247.8796 280.4196 48.72 0.2415 2253 +2351 4 256.0112 296.6975 44.9501 0.3236 1849 +2352 4 254.9015 296.7364 45.6288 0.2929 2351 +2353 4 253.9497 296.8577 44.9366 0.3467 2352 +2354 4 253.0974 296.7479 45.8354 0.1963 2353 +2355 4 252.562 297.4995 45.8088 0.2974 2354 +2356 4 252.061 298.2625 46.1437 0.1754 2355 +2357 4 251.7178 298.9272 45.7472 0.281 2356 +2358 4 251.0188 299.7028 46.1378 0.2444 2357 +2359 4 250.8792 300.5288 45.9091 0.1265 2358 +2360 4 250.3484 300.9715 45.1931 0.1144 2359 +2361 4 249.4892 301.0676 46.3456 0.1811 2360 +2362 4 248.4951 300.9864 46.9482 0.1591 2361 +2363 4 247.5307 301.1443 46.9288 0.2089 2362 +2364 4 246.5 301.2198 46.762 0.178 2363 +2365 4 245.4887 301.6248 47.0109 0.1915 2364 +2366 4 244.6021 302.0492 46.2 0.1165 2365 +2367 4 244.3801 302.9049 46.5077 0.2556 2366 +2368 4 243.863 303.8075 47.2077 0.1602 2367 +2369 4 243.4729 304.5568 46.9384 0.1739 2368 +2370 4 243.4672 305.6127 46.7082 0.2855 2369 +2371 4 243.5542 306.4707 47.4116 0.3405 2370 +2372 4 243.577 307.3951 48.5206 0.3191 2371 +2373 4 243.9992 308.1318 48.7589 0.2129 2372 +2374 4 243.5576 308.8972 48.5593 0.1179 2373 +2375 4 243.5576 309.6362 46.7286 0.2052 2374 +2376 4 243.2144 310.4267 45.4168 0.1329 2375 +2377 4 243.434 311.3648 45.8693 0.2063 2376 +2378 4 243.4066 312.0512 47.6 0.2262 2377 +2379 4 243.0108 313.0728 47.1414 0.1305 2378 +2380 4 242.5349 313.9571 46.5548 0.2086 2379 +2381 4 242.1676 315.0187 46.4145 0.2542 2380 +2382 4 241.8256 315.99 45.876 0.1723 2381 +2383 4 241.1884 316.8388 45.64 0.2481 2382 +2384 4 240.1233 317.1145 45.6218 0.1734 2383 +2385 4 239.3202 317.3811 45.1825 0.1563 2384 +2386 4 238.349 317.6934 45.1732 0.1953 2385 +2387 4 237.7953 318.612 45.5972 0.1612 2386 +2388 4 237.2816 319.5112 44.8636 0.1991 2387 +2389 4 236.4648 320.185 44.8146 0.1443 2388 +2390 4 235.7201 320.6666 44.24 0.1144 2389 +2391 4 235.1606 321.6642 44.24 0.1144 2390 +2392 4 234.544 322.5565 43.701 0.1144 2391 +2393 4 234.099 323.5735 43.96 0.1144 2392 +2394 4 233.9354 324.6786 43.7427 0.1144 2393 +2395 4 233.1426 325.2792 43.68 0.1144 2394 +2396 4 232.7811 326.3386 43.615 0.1144 2395 +2397 4 232.0032 326.9792 43.4 0.1144 2396 +2398 4 231.6714 328.002 43.4 0.1144 2397 +2399 4 231.3637 329.0762 43.4 0.1144 2398 +2400 4 231.1429 330.1264 43.209 0.1144 2399 +2401 4 230.7723 330.7579 42.6717 0.2008 2400 +2402 4 230.6304 331.7543 43.4437 0.1678 2401 +2403 4 230.5961 332.8846 43.12 0.1398 2402 +2404 4 230.341 333.9828 43.4 0.1489 2403 +2405 4 229.9543 335.0318 43.12 0.1244 2404 +2406 4 229.7484 336.1381 43.12 0.1144 2405 +2407 4 229.5711 337.2649 43.12 0.1144 2406 +2408 4 229.4864 338.346 42.5877 0.1144 2407 +2409 4 229.0723 339.3539 43.12 0.1144 2408 +2410 4 229.0288 340.4544 43.12 0.1144 2409 +2411 4 290.1184 350.8454 35.0 0.3686 1682 +2412 4 290.4113 349.9439 34.1653 0.2466 2411 +2413 4 289.8027 349.4085 33.7159 0.1479 2412 +2414 4 290.2328 348.7106 35.1868 0.3321 2413 +2415 4 290.4948 347.7119 35.56 0.2963 2414 +2416 4 290.0166 346.8482 34.7208 0.3306 2415 +2417 4 289.8267 345.9353 35.4668 0.2613 2416 +2418 4 289.7752 345.0373 33.8705 0.1435 2417 +2419 4 289.6608 343.9882 33.1139 0.2542 2418 +2420 4 289.7798 343.0753 33.6806 0.208 2419 +2421 4 289.7752 342.175 34.5044 0.2156 2420 +2422 4 290.1378 341.1282 34.44 0.1179 2421 +2423 4 290.1184 340.6603 32.5077 0.3472 2422 +2424 4 290.1184 339.768 33.32 0.2415 2423 +2425 4 290.29 339.4065 32.8076 0.2082 2424 +2426 4 290.6492 339.196 30.3363 0.2288 2425 +2427 4 291.299 339.5323 31.306 0.2288 2426 +2428 4 291.8321 339.871 30.9137 0.3713 2427 +2429 4 292.7748 339.9911 31.1419 0.2288 2428 +2430 4 293.3308 340.0151 32.2 0.2321 2429 +2431 4 293.7872 340.7679 30.8314 0.2122 2430 +2432 4 294.5869 340.8296 30.081 0.3149 2431 +2433 4 295.3888 341.2632 30.7476 0.2161 2432 +2434 4 296.3132 341.1397 29.7128 0.2791 2433 +2435 4 297.4194 340.9131 29.96 0.1788 2434 +2436 4 298.1447 340.9989 28.5631 0.2661 2435 +2437 4 298.9192 341.6213 29.1942 0.2849 2436 +2438 4 299.9053 342.0423 29.986 0.2629 2437 +2439 4 300.6821 341.3993 29.7195 0.3051 2438 +2440 4 301.6614 341.2186 29.3048 0.1683 2439 +2441 4 302.6864 340.912 29.68 0.3548 2440 +2442 4 303.303 340.2199 28.4917 0.341 2441 +2443 4 304.2662 339.8172 27.7732 0.2851 2442 +2444 4 305.067 339.3642 28.3984 0.171 2443 +2445 4 305.6002 338.5794 28.94 0.1444 2444 +2446 4 306.1344 337.9147 29.6363 0.2804 2445 +2447 4 306.3655 337.8003 27.72 0.2755 2446 +2448 4 307.2006 337.4262 27.7794 0.3077 2447 +2449 4 307.8435 336.8886 28.7468 0.2211 2448 +2450 4 308.6501 336.241 28.2559 0.3305 2449 +2451 4 309.4074 335.9928 27.9028 0.2812 2450 +2452 4 310.1933 335.4505 27.5775 0.3529 2451 +2453 4 310.834 334.668 27.1043 0.37 2452 +2454 4 311.7549 334.1075 26.6213 0.2924 2453 +2455 4 312.8096 333.8615 27.1384 0.309 2454 +2456 4 313.5578 333.1957 27.6273 0.3557 2455 +2457 4 314.0566 332.5448 26.9713 0.3299 2456 +2458 4 314.8929 332.0815 26.5826 0.2924 2457 +2459 4 315.6536 331.3688 26.8442 0.2492 2458 +2460 4 316.4762 330.7453 26.6924 0.1984 2459 +2461 4 317.1694 330.2854 27.4565 0.3131 2460 +2462 4 317.9165 330.6046 27.3935 0.316 2461 +2463 4 318.4656 329.8575 27.4991 0.2241 2462 +2464 4 318.604 328.8657 27.5164 0.3144 2463 +2465 4 318.572 327.8006 28.3119 0.2524 2464 +2466 4 318.9483 326.9609 29.3812 0.2161 2465 +2467 4 319.7629 326.4473 28.5135 0.3273 2466 +2468 4 320.5202 325.9096 28.6572 0.3073 2467 +2469 4 321.297 325.206 28.6513 0.1497 2468 +2470 4 321.996 324.634 27.8844 0.2924 2469 +2471 4 322.7602 323.8618 28.1249 0.2669 2470 +2472 4 323.2864 323.2658 28.84 0.1757 2471 +2473 4 323.887 322.6057 28.1473 0.1496 2472 +2474 4 324.3984 321.9102 27.9451 0.1803 2473 +2475 4 324.9738 321.337 27.5022 0.1526 2474 +2476 4 326.0148 320.9034 27.48 0.2161 2475 +2477 4 326.7527 320.0763 27.3938 0.2034 2476 +2478 4 326.8111 318.9666 26.9954 0.256 2477 +2479 4 326.7264 317.8512 26.5798 0.2669 2478 +2480 4 327.2412 317.3708 25.2857 0.2952 2479 +2481 4 328.3406 317.2198 25.3772 0.3064 2480 +2482 4 328.9995 316.7267 25.9823 0.22 2481 +2483 4 329.7088 315.9579 25.947 0.3516 2482 +2484 4 330.2511 315.1022 26.04 0.2509 2483 +2485 4 330.6103 314.0795 25.6869 0.3305 2484 +2486 4 330.5771 313.3096 24.4042 0.2615 2485 +2487 4 331.2807 312.5614 23.4982 0.2221 2486 +2488 4 332.2885 312.185 22.6657 0.2995 2487 +2489 4 333.2312 311.6062 22.5624 0.2161 2488 +2490 4 334.1624 311.2355 22.414 0.2334 2489 +2491 4 335.152 311.3224 21.9624 0.3368 2490 +2492 4 336.1552 311.7743 21.3206 0.2343 2491 +2493 4 336.8519 311.6348 22.0352 0.2195 2492 +2494 4 337.5967 310.9827 21.1904 0.2548 2493 +2495 4 338.4181 310.7218 21.2789 0.2592 2494 +2496 4 339.4648 310.596 21.4693 0.3053 2495 +2497 4 340.2256 310.1407 21.5516 0.3298 2496 +2498 4 340.9555 309.5687 22.526 0.2209 2497 +2499 4 341.6053 309.3342 21.0 0.1652 2498 +2500 4 342.628 308.9178 20.6268 0.2288 2499 +2501 4 343.4196 309.7483 21.2587 0.1592 2500 +2502 4 344.0706 310.6463 21.7641 0.1398 2501 +2503 4 344.7581 311.4712 22.0494 0.1639 2502 +2504 4 345.8461 311.1543 22.1822 0.1652 2503 +2505 4 346.9741 311.1394 21.947 0.152 2504 +2506 4 347.9247 310.8591 21.7479 0.1373 2505 +2507 4 348.5448 309.8982 21.7862 0.1301 2506 +2508 4 348.7884 308.832 21.6224 0.1271 2507 +2509 4 348.8273 307.7017 21.5869 0.1334 2508 +2510 4 348.7621 306.5794 21.5572 0.1464 2509 +2511 4 348.2588 305.6951 21.3786 0.1525 2510 +2512 4 348.0597 303.6634 19.4102 0.3116 2511 +2513 4 348.8971 302.9335 19.32 0.3178 2512 +2514 4 349.7963 302.27 19.465 0.287 2513 +2515 4 350.6921 301.7231 19.7728 0.2712 2514 +2516 4 351.3052 301.6842 19.8923 0.2148 2515 +2517 4 352.0157 300.9338 19.5054 0.2796 2516 +2518 4 352.4344 300.0163 20.16 0.1814 2517 +2519 4 352.6792 299.1194 19.88 0.1584 2518 +2520 4 353.2786 298.7041 19.0756 0.1398 2519 +2521 4 353.6035 297.6985 19.3934 0.2977 2520 +2522 4 353.5692 296.6289 18.7415 0.3153 2521 +2523 4 353.4285 295.7526 18.6782 0.1255 2522 +2524 4 353.48 294.8912 19.4062 0.3417 2523 +2525 4 353.1528 293.8947 19.206 0.2313 2524 +2526 4 353.2306 292.9178 18.76 0.3296 2525 +2527 4 353.178 291.8561 19.32 0.1861 2526 +2528 4 353.7442 290.8929 19.6078 0.1939 2527 +2529 4 353.9399 289.8061 20.0869 0.2208 2528 +2530 4 354.0783 288.7307 20.72 0.2025 2529 +2531 4 354.64 288.288 19.32 0.1525 2530 +2532 4 343.1371 308.4258 20.5128 0.2366 2500 +2533 4 290.0921 338.4604 34.3658 0.1388 2424 +2534 4 290.0681 337.6962 32.3868 0.2924 2533 +2535 4 290.1047 337.4777 31.3883 0.1519 2534 +2536 4 289.4103 336.7959 30.8266 0.2706 2535 +2537 4 289.3588 335.8052 31.08 0.2542 2536 +2538 4 289.3176 334.8888 29.9827 0.2542 2537 +2539 4 289.5372 334.2219 28.9201 0.3969 2538 +2540 4 289.3142 333.4131 29.8189 0.2867 2539 +2541 4 289.0122 332.5722 30.6541 0.2061 2540 +2542 4 288.2491 331.9064 30.4088 0.131 2541 +2543 4 288.0958 331.1594 29.0746 0.1525 2542 +2544 4 287.9448 330.5405 29.972 0.2796 2543 +2545 4 287.819 329.7534 28.651 0.2039 2544 +2546 4 287.6222 328.9275 28.2212 0.2415 2545 +2547 4 287.2344 327.9974 28.0 0.2619 2546 +2548 4 286.4061 327.43 28.5463 0.1818 2547 +2549 4 285.3788 327.1485 27.9919 0.2734 2548 +2550 4 284.8766 326.3946 26.9802 0.3022 2549 +2551 4 284.0049 325.8123 26.8688 0.2417 2550 +2552 4 283.4809 325.0962 26.9111 0.2415 2551 +2553 4 283.1148 324.2988 27.1603 0.1528 2552 +2554 4 282.2671 324.0929 26.476 0.117 2553 +2555 4 281.2982 323.752 26.6874 0.1669 2554 +2556 4 280.4196 323.8161 26.63 0.1611 2555 +2557 4 279.5787 323.3745 26.857 0.2408 2556 +2558 4 278.4976 323.0702 26.6916 0.2163 2557 +2559 4 277.6259 322.9489 25.76 0.2853 2558 +2560 4 276.9498 322.2396 26.3388 0.2186 2559 +2561 4 275.9774 322.0703 25.7673 0.2288 2560 +2562 4 274.981 321.9559 24.6616 0.3012 2561 +2563 4 274.2431 321.8312 25.9028 0.2474 2562 +2564 4 273.1449 321.9216 25.716 0.3025 2563 +2565 4 272.4242 322.5028 24.638 0.2892 2564 +2566 4 271.748 322.5508 22.7035 0.2638 2565 +2567 4 270.8477 322.6892 23.0023 0.2004 2566 +2568 4 269.857 322.862 22.4932 0.1907 2567 +2569 4 269.412 322.8162 22.7172 0.2383 2568 +2570 4 268.9544 322.4936 23.8 0.1398 2569 +2571 4 269.2713 322.9512 22.4319 0.24 2568 +2572 4 268.284 323.2006 22.0886 0.2415 2571 +2573 4 267.3356 323.1892 21.7022 0.2669 2572 +2574 4 266.3507 322.989 21.1994 0.2325 2573 +2575 4 265.8301 323.4969 22.8928 0.1907 2574 +2576 4 265.2982 323.9888 21.6639 0.2246 2575 +2577 4 265.1872 324.7564 21.0683 0.1221 2576 +2578 4 264.6083 325.3536 21.2783 0.2289 2577 +2579 4 263.8007 325.6396 21.0157 0.1779 2578 +2580 4 262.6956 325.5515 21.0356 0.3021 2579 +2581 4 261.7072 325.5927 21.4749 0.1282 2580 +2582 4 260.9281 325.7517 21.7305 0.2034 2581 +2583 4 260.0575 325.7746 21.0339 0.1907 2582 +2584 4 259.3448 325.905 21.3052 0.1456 2583 +2585 4 258.7797 326.2139 19.3486 0.1671 2584 +2586 4 257.7661 326.1498 19.1464 0.2288 2585 +2587 4 257.4 326.3821 20.4674 0.1144 2586 +2588 4 256.8108 325.7929 20.6774 0.2033 2587 +2589 4 256.1473 325.2403 19.0994 0.2658 2588 +2590 4 255.0914 325.1648 19.0725 0.2533 2589 +2591 4 254.7345 324.6089 18.1877 0.2615 2590 +2592 4 253.7872 324.1959 17.8245 0.2412 2591 +2593 4 252.9567 323.5198 17.92 0.1234 2592 +2594 4 252.0461 323.0873 17.5305 0.1429 2593 +2595 4 251.1046 323.6079 17.3564 0.2542 2594 +2596 4 250.3266 323.172 16.3918 0.2288 2595 +2597 4 249.3028 322.8757 17.2875 0.1718 2596 +2598 4 248.3166 322.9523 16.9501 0.2277 2597 +2599 4 247.7904 322.9512 15.68 0.2669 2598 +2600 4 289.4446 338.2614 32.2 0.2674 2534 +2601 4 289.7752 339.3104 31.92 0.2669 2600 +2602 4 293.2598 361.4102 35.4603 0.3043 1673 +2603 4 293.5035 361.5601 38.1721 0.1891 2602 +2604 4 294.1533 361.7282 39.6091 0.1271 2603 +2605 4 294.9987 362.4787 39.6463 0.138 2604 +2606 4 295.1612 363.4911 39.6082 0.1811 2605 +2607 4 294.4782 364.3514 39.48 0.2161 2606 +2608 4 293.9394 364.8811 39.8709 0.1565 2607 +2609 4 293.4234 364.4143 42.0932 0.2669 2608 +2610 4 293.436 364.7861 41.6783 0.1652 2609 +2611 4 293.7609 365.6224 41.16 0.1485 2610 +2612 4 294.572 366.2596 41.461 0.1923 2611 +2613 4 295.1589 367.2274 41.7816 0.3514 2612 +2614 4 295.4952 368.2708 42.1366 0.3822 2613 +2615 4 295.6096 369.385 42.5919 0.2795 2614 +2616 4 296.2331 370.0588 43.7928 0.185 2615 +2617 4 296.5317 371.0942 43.7464 0.1497 2616 +2618 4 297.3256 371.8 43.4 0.2288 2617 +2619 4 292.4053 364.936 41.7189 0.3181 2609 +2620 4 291.8802 365.0504 43.143 0.3432 2619 +2621 4 290.7728 365.0321 43.5554 0.286 2620 +2622 4 289.8976 364.7072 42.7706 0.2392 2621 +2623 4 289.1368 364.7358 42.8515 0.2048 2622 +2624 4 288.24 364.1386 43.5266 0.3156 2623 +2625 4 287.3602 363.4614 43.68 0.4449 2624 +2626 4 286.3112 363.5632 44.5917 0.3148 2625 +2627 4 285.3834 363.832 45.808 0.1718 2626 +2628 4 284.3172 363.6776 45.6646 0.2382 2627 +2629 4 283.4443 363.0793 45.7114 0.272 2628 +2630 4 282.5383 362.9866 46.6374 0.194 2629 +2631 4 281.6173 362.6926 46.7496 0.1398 2630 +2632 4 280.8188 363.403 46.6312 0.3362 2631 +2633 4 279.7824 363.5174 47.031 0.3419 2632 +2634 4 279.1463 362.9912 48.0472 0.3432 2633 +2635 4 278.3947 362.4501 48.5447 0.2644 2634 +2636 4 277.5367 362.4192 50.2354 0.1211 2635 +2637 4 276.411 362.4718 50.4969 0.1662 2636 +2638 4 275.3379 362.6789 49.9425 0.2415 2637 +2639 4 274.4902 363.1399 49.84 0.2924 2638 +2640 4 273.877 363.1319 51.6174 0.3344 2639 +2641 4 273.0522 362.5588 51.9669 0.2843 2640 +2642 4 272.2491 362.5588 50.4311 0.2571 2641 +2643 4 271.3774 362.6308 51.52 0.1708 2642 +2644 4 270.2677 362.4215 51.52 0.1165 2643 +2645 4 269.2999 362.1618 50.7111 0.2004 2644 +2646 4 268.7084 362.1801 52.0719 0.2321 2645 +2647 4 267.7589 361.7454 51.333 0.2797 2646 +2648 4 266.7808 361.5418 51.7672 0.2789 2647 +2649 4 266.3209 361.6882 53.6942 0.3985 2648 +2650 4 265.4057 362.0474 53.4526 0.2439 2649 +2651 4 264.574 362.489 53.4411 0.2783 2650 +2652 4 263.954 362.7624 55.3714 0.1711 2651 +2653 4 263.1749 362.3746 55.6721 0.2334 2652 +2654 4 262.5286 362.8642 54.3262 0.2913 2653 +2655 4 261.6545 362.9866 55.9026 0.1447 2654 +2656 4 260.84 363.6559 56.5356 0.1864 2655 +2657 4 260.0243 364.1466 55.44 0.2384 2656 +2658 4 259.3494 364.7072 56.467 0.1685 2657 +2659 4 258.9787 365.532 57.4 0.1652 2658 +2660 4 258.989 366.4575 57.4445 0.323 2659 +2661 4 258.6332 367.1954 58.905 0.2582 2660 +2662 4 258.7213 367.6599 60.2 0.2539 2661 +2663 4 258.2591 368.4241 60.944 0.3108 2662 +2664 4 257.567 367.9161 59.5952 0.1271 2663 +2665 4 257.019 368.1117 58.0854 0.1233 2664 +2666 4 256.3876 368.9011 58.2106 0.1144 2665 +2667 4 256.256 370.0314 58.24 0.1144 2666 +2668 4 255.6863 370.4364 59.7954 0.1144 2667 +2669 4 254.9312 370.5988 61.8593 0.1144 2668 +2670 4 254.1751 370.7624 63.9234 0.1144 2669 +2671 4 253.976 371.7714 64.1962 0.1144 2670 +2672 4 253.7495 372.8788 64.1962 0.1144 2671 +2673 4 253.2553 373.897 64.1962 0.1144 2672 +2674 4 252.1387 373.6487 64.1962 0.1144 2673 +2675 4 251.203 373.3684 65.2669 0.1144 2674 +2676 4 250.401 373.063 67.118 0.1144 2675 +2677 4 249.5041 373.055 68.2506 0.1144 2676 +2678 4 248.4562 373.516 68.2506 0.1144 2677 +2679 4 247.4701 373.6533 68.2506 0.1144 2678 +2680 4 246.6922 372.9715 68.9321 0.1144 2679 +2681 4 245.9669 372.5036 70.7717 0.1144 2680 +2682 4 245.1981 372.0196 72.305 0.1144 2681 +2683 4 244.2074 371.4476 72.305 0.1144 2682 +2684 4 243.2167 370.8745 72.305 0.1144 2683 +2685 4 242.226 370.3025 72.305 0.1144 2684 +2686 4 241.2273 369.8209 72.305 0.1144 2685 +2687 4 240.1439 370.1915 72.305 0.1144 2686 +2688 4 239.0617 370.5622 72.305 0.1144 2687 +2689 4 237.9692 370.8379 72.305 0.1144 2688 +2690 4 237.0174 370.4558 72.8028 0.1144 2689 +2691 4 236.3367 369.6825 74.0242 0.1144 2690 +2692 4 235.6571 368.9091 75.2455 0.1144 2691 +2693 4 234.9925 368.114 76.3596 0.1144 2692 +2694 4 234.4811 367.0913 76.3596 0.1144 2693 +2695 4 233.9709 366.0674 76.3596 0.1144 2694 +2696 4 233.5018 365.0252 76.3596 0.1144 2695 +2697 4 233.0854 363.9602 76.3596 0.1144 2696 +2698 4 232.6679 362.894 76.3596 0.1144 2697 +2699 4 232.2503 361.8289 76.3596 0.1144 2698 +2700 4 231.8694 360.7547 76.3596 0.1144 2699 +2701 4 231.4953 359.8132 76.3596 0.117 2700 +2702 4 230.3661 359.6256 76.3596 0.1303 2701 +2703 4 229.3628 359.2309 76.3596 0.1511 2702 +2704 4 228.665 358.3237 76.3596 0.1907 2703 +2705 4 295.0822 364.602 38.6672 0.3194 2607 +2706 4 295.9951 364.7495 37.52 0.2414 2705 +2707 4 296.1976 363.7828 36.4311 0.2886 2706 +2708 4 296.5717 363.3996 38.5311 0.1894 2707 +2709 4 297.3828 363.1056 39.76 0.1186 2708 +2710 4 298.3975 362.7624 39.5097 0.2107 2709 +2711 4 299.0691 363.3275 38.36 0.1144 2710 +2712 4 300.165 363.4488 38.36 0.157 2711 +2713 4 301.2747 363.2978 38.5571 0.2108 2712 +2714 4 302.3146 363.1159 39.48 0.2691 2713 +2715 4 303.1978 362.608 39.0286 0.2902 2714 +2716 4 303.9963 362.2682 38.0766 0.4112 2715 +2717 4 304.5751 361.7923 37.8834 0.2246 2716 +2718 4 304.8188 362.076 35.9254 0.3115 2717 +2719 4 305.7146 361.9616 35.9327 0.127 2718 +2720 4 306.4856 361.6996 35.9904 0.2119 2719 +2721 4 307.172 361.4891 37.3514 0.1144 2720 +2722 4 307.8264 360.8576 37.52 0.2955 2721 +2723 4 308.0769 359.8395 37.0423 0.3545 2722 +2724 4 308.7427 359.5375 38.6562 0.1591 2723 +2725 4 309.3445 359.0455 40.241 0.2827 2724 +2726 4 309.9233 358.7515 41.9989 0.1276 2725 +2727 4 310.8511 358.6932 41.1401 0.1282 2726 +2728 4 311.716 359.0913 40.4001 0.3788 2727 +2729 4 312.8074 359.1016 41.0239 0.3432 2728 +2730 4 313.8267 359.0536 41.44 0.2796 2729 +2731 4 314.8162 358.9872 41.8132 0.2796 2730 +2732 4 315.8939 358.9174 42.6574 0.2288 2731 +2733 4 317.0104 358.9849 42.84 0.2804 2732 +2734 4 318.1109 358.8522 42.707 0.3885 2733 +2735 4 319.1028 359.1794 41.7267 0.3426 2734 +2736 4 319.8269 359.47 43.0469 0.2311 2735 +2737 4 320.7684 359.7708 43.5072 0.2161 2736 +2738 4 321.5509 359.4642 44.3794 0.1729 2737 +2739 4 322.5142 359.1725 44.3442 0.2288 2738 +2740 4 323.1869 358.4186 43.4 0.1993 2739 +2741 4 323.9019 357.7288 42.9044 0.3753 2740 +2742 4 324.8422 357.8672 43.6657 0.3258 2741 +2743 4 325.5321 357.9931 42.383 0.3363 2742 +2744 4 326.358 358.3466 43.6738 0.2719 2743 +2745 4 326.8648 358.6749 42.84 0.2354 2744 +2746 4 327.9356 358.811 42.56 0.2541 2745 +2747 4 328.7467 359.2938 41.8317 0.2001 2746 +2748 4 329.8358 359.3304 42.0885 0.3305 2747 +2749 4 330.6274 359.3579 43.6836 0.237 2748 +2750 4 331.2578 360.0225 44.8 0.2979 2749 +2751 4 332.2325 360.4744 44.8 0.3162 2750 +2752 4 333.2895 360.8084 44.564 0.2288 2751 +2753 4 334.1121 361.3221 44.5886 0.2891 2752 +2754 4 334.7241 362.0302 44.24 0.2583 2753 +2755 4 335.0776 362.5336 45.6095 0.3418 2754 +2756 4 335.9356 362.9317 45.92 0.2924 2755 +2757 4 336.9389 363.4156 45.9584 0.3442 2756 +2758 4 337.7546 364.1386 46.1555 0.4909 2757 +2759 4 338.6114 364.6889 46.0813 0.2382 2758 +2760 4 339.156 365.1534 46.8138 0.3051 2759 +2761 4 340.0975 365.4634 47.2567 0.2929 2760 +2762 4 340.8823 365.6075 45.7307 0.3305 2761 +2763 4 341.5 366.0823 47.2892 0.3561 2762 +2764 4 342.4553 366.6566 47.1313 0.3167 2763 +2765 4 343.4551 367.1256 47.3796 0.2679 2764 +2766 4 344.447 367.5089 47.971 0.3038 2765 +2767 4 345.3828 367.8212 47.9027 0.2796 2766 +2768 4 346.4501 368.1129 47.6 0.2129 2767 +2769 4 347.5575 368.2467 47.2335 0.1539 2768 +2770 4 348.4521 368.638 47.5264 0.2593 2769 +2771 4 349.3341 369.1688 47.9419 0.2287 2770 +2772 4 350.4106 369.1688 48.16 0.2039 2771 +2773 4 351.0616 369.3232 46.76 0.3025 2772 +2774 4 352.098 369.7271 47.0159 0.1907 2773 +2775 4 353.1471 370.1481 46.9907 0.1837 2774 +2776 4 354.0611 370.5405 45.92 0.128 2775 +2777 4 354.8596 370.5416 47.1531 0.1481 2776 +2778 4 355.3264 371.0964 47.3718 0.144 2777 +2779 4 355.8366 371.7908 46.3669 0.1679 2778 +2780 4 356.3411 372.5676 47.7907 0.1644 2779 +2781 4 356.9246 373.4702 48.5654 0.1993 2780 +2782 4 357.5812 374.088 48.6797 0.2343 2781 +2783 4 357.8569 374.9792 49.4337 0.2916 2782 +2784 4 358.3054 375.7891 48.1631 0.2389 2783 +2785 4 358.8282 376.3302 49.5362 0.2258 2784 +2786 4 359.3647 377.0532 50.267 0.1917 2785 +2787 4 360.0534 377.8197 50.7931 0.1591 2786 +2788 4 360.6643 378.5462 51.2117 0.2669 2787 +2789 4 361.3564 379.3996 50.96 0.2916 2788 +2790 4 361.8575 380.3217 51.1081 0.2303 2789 +2791 4 362.195 381.0584 50.2555 0.1271 2790 +2792 4 362.8825 381.5869 49.28 0.1832 2791 +2793 4 363.6696 382.1029 50.2001 0.1144 2792 +2794 4 364.348 382.2607 52.3382 0.1552 2793 +2795 4 364.9852 383.1164 52.7881 0.2288 2794 +2796 4 365.9839 383.5386 53.0956 0.2622 2795 +2797 4 366.906 384.1403 53.503 0.2134 2796 +2798 4 367.7788 384.6265 53.2258 0.1316 2797 +2799 4 368.479 385.2763 54.4043 0.2344 2798 +2800 4 369.1002 386.0943 55.295 0.1384 2799 +2801 4 370.0108 386.6137 54.6507 0.2095 2800 +2802 4 371.0678 386.7624 54.7016 0.1652 2801 +2803 4 372.0277 387.1262 55.3468 0.2288 2802 +2804 4 372.833 387.061 56.0515 0.1559 2803 +2805 4 373.6945 387.1662 56.84 0.1255 2804 +2806 4 374.4701 387.9933 56.84 0.1144 2805 +2807 4 375.542 388.2358 57.12 0.1287 2806 +2808 4 376.2124 389.119 56.6913 0.1245 2807 +2809 4 376.8599 390.0136 57.1463 0.1144 2808 +2810 4 377.5566 390.8545 57.4 0.1682 2809 +2811 4 378.3906 391.5855 57.4781 0.1454 2810 +2812 4 379.4717 391.7502 57.96 0.1144 2811 +2813 4 380.5848 391.947 57.96 0.1144 2812 +2814 4 381.3501 392.6757 58.655 0.2223 2813 +2815 4 382.1635 393.2889 59.1808 0.1556 2814 +2816 4 382.4346 393.9936 60.5164 0.1144 2815 +2817 4 383.5615 393.9936 60.76 0.1144 2816 +2818 4 384.4984 394.251 61.0137 0.1144 2817 +2819 4 384.4984 395.3939 61.04 0.1144 2818 +2820 4 384.5545 396.5093 61.3186 0.1144 2819 +2821 4 385.5612 396.7392 61.768 0.1144 2820 +2822 4 386.2796 397.381 62.344 0.1721 2821 +2823 4 387.339 397.7253 62.16 0.1398 2822 +2824 4 387.8412 398.1944 62.72 0.1144 2823 +2825 4 388.2313 399.1336 63.4063 0.1313 2824 +2826 4 389.0607 399.256 64.6979 0.1144 2825 +2827 4 389.9496 399.3944 65.9674 0.1652 2826 +2828 4 390.4232 400.1712 66.0232 0.1144 2827 +2829 4 391.0146 400.2524 67.2 0.1353 2828 +2830 4 391.8989 400.559 68.278 0.1144 2829 +2831 4 392.9091 400.7421 69.5159 0.1144 2830 +2832 4 393.782 401.2145 70.2778 0.1144 2831 +2833 4 394.4386 402.1515 70.2778 0.1144 2832 +2834 4 395.0941 403.0884 70.2778 0.1144 2833 +2835 4 395.8297 403.959 70.2778 0.1144 2834 +2836 4 396.6385 404.7678 70.2778 0.1144 2835 +2837 4 397.4977 405.4828 70.835 0.1144 2836 +2838 4 398.3637 406.1818 71.4823 0.1144 2837 +2839 4 399.2297 406.8808 72.1297 0.1144 2838 +2840 4 400.0545 407.6598 72.305 0.1144 2839 +2841 4 400.8633 408.4686 72.305 0.1144 2840 +2842 4 401.6733 409.2443 71.9141 0.1144 2841 +2843 4 402.4844 409.9879 71.1505 0.1144 2842 +2844 4 403.2943 410.7326 70.3867 0.1144 2843 +2845 4 404.1054 411.4762 69.6231 0.1144 2844 +2846 4 404.8616 412.1798 69.099 0.1144 2845 +2847 4 405.23 412.3399 71.3798 0.125 2846 +2848 4 405.6384 412.7632 73.3477 0.2874 2847 +2849 4 406.4438 413.2139 74.3761 0.3003 2848 +2850 4 407.5317 413.4233 74.76 0.1546 2849 +2851 4 408.6448 413.4439 75.04 0.1528 2850 +2852 4 409.7293 413.548 75.5255 0.2313 2851 +2853 4 410.7761 413.3901 76.2818 0.2598 2852 +2854 4 411.4076 413.874 77.84 0.2288 2853 +2855 4 412.0173 414.5913 78.8379 0.2595 2854 +2856 4 412.9199 414.9517 77.7151 0.352 2855 +2857 4 413.3409 415.6255 76.2947 0.3201 2856 +2858 4 413.8317 416.1872 77.2131 0.3327 2857 +2859 4 414.3568 416.0728 77.0 0.1525 2858 +2860 3 302.6715 383.7216 32.6642 0.3043 1 +2861 3 302.453 384.821 33.2063 0.2806 2860 +2862 3 302.3157 385.8575 34.3378 0.2415 2861 +2863 3 302.7402 386.5896 35.1868 0.1983 2862 +2864 3 303.7206 387.0827 35.6171 0.2476 2863 +2865 3 304.8131 386.8367 35.7064 0.3018 2864 +2866 3 305.8759 386.5141 35.0546 0.317 2865 +2867 3 306.9901 386.4066 34.4957 0.3299 2866 +2868 3 308.0026 386.775 35.352 0.3179 2867 +2869 3 308.6615 387.6307 36.2673 0.3178 2868 +2870 3 309.3959 388.3148 36.3852 0.2726 2869 +2871 3 310.0446 389.254 36.4014 0.2669 2870 +2872 3 310.7642 390.1418 36.4059 0.2782 2871 +2873 3 311.6862 390.811 36.4297 0.2568 2872 +2874 3 312.5694 391.5363 36.5445 0.2542 2873 +2875 3 313.4583 392.1415 37.4556 0.2542 2874 +2876 3 314.1893 392.9457 38.3135 0.242 2875 +2877 3 315.132 393.4513 37.4072 0.1916 2876 +2878 3 315.9728 394.108 36.4 0.1652 2877 +2879 3 308.9109 388.2667 36.2933 0.3758 2869 +2880 3 308.2519 388.841 37.5782 0.2585 2879 +2881 3 307.3516 389.3867 37.8 0.1144 2880 +2882 3 306.6446 390.1017 37.8 0.2186 2881 +2883 3 306.1813 391.0581 37.5416 0.2239 2882 +2884 3 305.5601 391.8223 37.6449 0.3075 2883 +2885 3 304.6358 392.3771 37.8 0.2925 2884 +2886 3 303.8636 393.1768 37.5522 0.2709 2885 +2887 3 303.0056 393.6916 38.5846 0.3178 2886 +2888 3 302.477 394.0085 40.32 0.2429 2887 +2889 3 301.5984 394.5347 40.5866 0.1743 2888 +2890 3 300.8731 394.9649 41.5528 0.2241 2889 +2891 3 301.3193 394.8665 43.8623 0.2755 2890 +2892 3 300.9109 393.9433 44.52 0.2965 2891 +2893 3 300.2062 393.4216 43.2432 0.3432 2892 +2894 3 300.1856 392.7169 41.7766 0.3432 2893 +2895 3 299.7246 391.7639 42.0 0.2415 2894 +2896 3 299.7257 390.6943 41.72 0.388 2895 +2897 3 299.0851 390.2184 43.1973 0.2161 2896 +2898 3 298.9249 389.8535 45.395 0.1907 2897 +2899 3 298.9855 388.7701 45.64 0.2601 2898 +2900 3 299.0874 387.9716 44.5883 0.2619 2899 +2901 3 299.156 387.1593 45.3986 0.3046 2900 +2902 3 298.4925 386.4535 46.422 0.2034 2901 +2903 3 297.7397 385.8689 47.04 0.2873 2902 +2904 3 297.0545 385.3255 46.494 0.3146 2903 +2905 3 296.6609 384.8427 47.248 0.1926 2904 +2906 3 296.5374 384.2627 48.6836 0.1447 2905 +2907 3 296.2971 383.804 46.7191 0.1365 2906 +2908 3 295.6222 383.1256 46.5027 0.2288 2907 +2909 3 294.9507 382.5147 46.6771 0.4243 2908 +2910 3 294.2093 381.7013 47.2125 0.4117 2909 +2911 3 293.817 380.9142 48.72 0.2415 2910 +2912 3 293.0104 379.9007 48.72 0.2432 2911 +2913 3 292.3812 378.9855 48.974 0.2648 2912 +2914 3 292.0907 377.9684 48.841 0.2299 2913 +2915 3 291.9488 377.3358 50.96 0.312 2914 +2916 3 291.9614 376.2467 51.2392 0.3431 2915 +2917 3 291.3779 375.4047 50.68 0.2985 2916 +2918 3 290.6023 374.7206 50.9846 0.278 2917 +2919 3 290.7144 374.1681 52.9108 0.2835 2918 +2920 3 290.8048 373.2792 54.1652 0.1481 2919 +2921 3 290.385 372.6008 53.3868 0.2161 2920 +2922 3 290.3472 372.0299 52.64 0.2583 2921 +2923 3 290.1184 371.085 53.436 0.3193 2922 +2924 3 289.9422 370.124 54.4421 0.2892 2923 +2925 3 289.7535 369.2477 55.1698 0.3225 2924 +2926 3 289.98 368.5728 57.2592 0.2831 2925 +2927 3 290.4238 367.987 58.52 0.2161 2926 +2928 3 290.6446 367.7274 58.688 0.3051 2927 +2929 3 291.6262 367.3212 59.36 0.3384 2928 +2930 3 292.4968 366.6154 59.4339 0.2977 2929 +2931 3 292.872 365.6533 59.9701 0.1612 2930 +2932 3 293.6648 365.1648 61.04 0.1652 2931 +2933 3 290.5611 367.8749 59.4359 0.1503 2927 +2934 3 290.393 367.0638 60.5357 0.1144 2933 +2935 3 289.7272 366.5376 61.3404 0.2034 2934 +2936 3 289.3679 365.8306 61.8419 0.2182 2935 +2937 3 289.9411 365.254 62.519 0.2288 2936 +2938 3 290.536 364.9017 64.3983 0.2041 2937 +2939 3 290.1745 363.9339 63.84 0.1714 2938 +2940 3 289.6574 363.0793 64.2852 0.1447 2939 +2941 3 289.3176 362.2076 64.68 0.1253 2940 +2942 3 289.3325 361.639 63.1912 0.1261 2941 +2943 3 289.1494 361.4674 60.4593 0.1241 2942 +2944 3 288.9675 361.2958 57.7273 0.1222 2943 +2945 3 288.7845 361.123 54.9956 0.1202 2944 +2946 3 288.6015 360.9514 52.2637 0.1183 2945 +2947 3 288.4184 360.7798 49.5317 0.1163 2946 +2948 3 288.2365 360.6082 46.8 0.1144 2947 +2949 3 287.5444 359.7159 46.7289 0.1144 2948 +2950 3 286.8019 358.8591 46.7149 0.1144 2949 +2951 3 285.8307 358.2539 46.7561 0.1144 2950 +2952 3 284.9487 357.5858 46.8082 0.1144 2951 +2953 3 284.332 356.7312 46.858 0.1144 2952 +2954 3 283.2922 356.2919 46.6906 0.1391 2953 +2955 3 282.7934 355.2703 46.809 0.1907 2954 +2956 3 289.9296 372.4864 52.08 0.1144 2921 +2957 3 288.8714 372.5619 51.6617 0.2465 2956 +2958 3 287.8865 372.944 51.52 0.2099 2957 +2959 3 287.144 373.0584 52.561 0.2852 2958 +2960 3 286.4599 372.944 54.04 0.3556 2959 +2961 3 285.3445 372.9818 53.7656 0.2773 2960 +2962 3 284.7416 372.9314 55.4616 0.2169 2961 +2963 3 284.1078 372.6008 56.56 0.1401 2962 +2964 3 283.6399 373.0584 57.862 0.3485 2963 +2965 3 282.5966 373.2163 57.9992 0.5607 2964 +2966 3 282.1001 374.0686 58.8 0.3448 2965 +2967 3 281.2547 373.9816 60.0006 0.1652 2966 +2968 3 281.1449 374.2024 61.9125 0.2333 2967 +2969 3 281.0591 374.6577 63.9733 0.2866 2968 +2970 3 280.9344 375.7651 64.3952 0.1858 2969 +2971 3 280.4367 376.5899 65.0448 0.125 2970 +2972 3 280.3944 377.6733 65.52 0.1158 2971 +2973 3 280.7788 378.6297 65.728 0.13 2972 +2974 3 280.6209 379.6959 65.7233 0.2258 2973 +2975 3 279.8933 380.3114 66.6324 0.2405 2974 +2976 3 279.7641 381.2083 65.8182 0.3782 2975 +2977 3 279.9276 381.9633 67.1437 0.3173 2976 +2978 3 279.8773 382.6302 68.7977 0.2118 2977 +2979 3 279.5032 383.5775 69.1964 0.1144 2978 +2980 3 279.2527 384.5945 68.7786 0.1861 2979 +2981 3 279.4106 384.9766 71.2944 0.1321 2980 +2982 3 278.7642 385.7099 71.12 0.2981 2981 +2983 3 277.6488 385.8712 70.84 0.3305 2982 +2984 3 293.0894 380.5894 46.76 0.1271 2911 +2985 3 291.9614 380.7232 46.76 0.1538 2984 +2986 3 290.8586 380.8193 46.1504 0.2162 2985 +2987 3 289.7718 380.5916 46.0222 0.2161 2986 +2988 3 288.6781 380.6454 46.569 0.2034 2987 +2989 3 287.843 381.0698 47.3659 0.2164 2988 +2990 3 287.4689 381.2952 49.56 0.1144 2989 +2991 3 286.4198 381.2895 49.474 0.3917 2990 +2992 3 285.7987 381.1362 47.6291 0.2502 2991 +2993 3 285.1889 381.2609 49.3774 0.3268 2992 +2994 3 284.2382 381.2849 50.0567 0.1769 2993 +2995 3 283.5496 381.4531 50.9362 0.1191 2994 +2996 3 282.5783 381.7116 51.0138 0.2955 2995 +2997 3 281.5544 381.7048 50.3496 0.2034 2996 +2998 3 281.3508 382.525 50.9832 0.2532 2997 +2999 3 280.6404 383.2022 51.52 0.1144 2998 +3000 3 279.7583 383.4688 52.2348 0.1399 2999 +3001 3 278.7493 383.3075 51.8476 0.1907 3000 +3002 3 278.111 383.0226 49.8753 0.1152 3001 +3003 3 277.6488 383.4665 51.2845 0.1317 3002 +3004 3 277.269 383.2354 52.92 0.119 3003 +3005 3 276.6078 383.4059 54.0921 0.1398 3004 +3006 3 275.6674 383.4791 53.4988 0.2567 3005 +3007 3 274.9432 383.0512 52.4569 0.241 3006 +3008 3 274.1871 383.0192 52.7344 0.3432 3007 +3009 3 273.9171 383.5775 54.32 0.2651 3008 +3010 3 272.8348 383.5695 54.6 0.1894 3009 +3011 3 272.2182 382.9254 53.3431 0.2984 3010 +3012 3 271.2584 382.7824 53.4733 0.3298 3011 +3013 3 270.858 382.668 55.1729 0.3138 3012 +3014 3 270.3764 382.3179 53.3095 0.329 3013 +3015 3 269.4852 381.9164 53.8037 0.2201 3014 +3016 3 268.8514 381.1797 54.6538 0.1144 3015 +3017 3 268.3366 380.6866 56.0804 0.2325 3016 +3018 3 267.4592 380.0471 55.8768 0.2652 3017 +3019 3 266.7042 379.999 54.04 0.1525 3018 +3020 3 266.0303 379.4648 53.48 0.3377 3019 +3021 3 265.17 379.1811 53.004 0.2123 3020 +3022 3 264.407 378.7555 54.061 0.2164 3021 +3023 3 263.5181 378.3059 54.628 0.3394 3022 +3024 3 262.9816 377.3209 55.0556 0.3694 3023 +3025 3 262.4405 376.4321 54.5476 0.3101 3024 +3026 3 261.9737 375.55 54.36 0.3044 3025 +3027 3 261.1878 375.0798 55.421 0.1761 3026 +3028 3 260.8126 374.1749 54.5619 0.1209 3027 +3029 3 260.1662 373.3764 54.5667 0.2115 3028 +3030 3 259.3368 372.8193 53.76 0.2829 3029 +3031 3 258.6927 371.9464 54.1013 0.3026 3030 +3032 3 257.9125 371.228 53.5413 0.1691 3031 +3033 3 257.0351 370.7372 52.9477 0.3278 3032 +3034 3 256.3155 370.259 53.7499 0.2712 3033 +3035 3 255.5444 369.5978 53.1342 0.2398 3034 +3036 3 254.8832 368.9434 53.3448 0.3489 3035 +3037 3 254.3673 368.2639 52.169 0.2641 3036 +3038 3 253.7838 367.6164 53.48 0.1221 3037 +3039 3 252.9087 366.9288 53.48 0.2652 3038 +3040 3 252.0873 366.1498 53.1748 0.2877 3039 +3041 3 251.2556 365.3719 53.2 0.3013 3040 +3042 3 250.4868 364.5802 53.7205 0.2342 3041 +3043 3 249.5899 363.9316 53.739 0.1439 3042 +3044 3 248.6724 363.5632 53.872 0.2132 3043 +3045 3 247.9162 363.0621 53.8311 0.3348 3044 +3046 3 247.2264 362.3254 53.9406 0.2788 3045 +3047 3 246.4405 361.6115 54.3077 0.1448 3046 +3048 3 245.6786 360.813 54.04 0.1398 3047 +3049 3 245.2095 359.7937 54.243 0.1503 3048 +3050 3 244.53 358.9243 54.6 0.1445 3049 +3051 3 243.9477 358.0251 54.642 0.2542 3050 +3052 3 243.5576 357.3318 53.5553 0.1221 3051 +3053 3 243.275 356.6042 53.3238 0.1588 3052 +3054 3 242.8289 356.0322 54.6244 0.2288 3053 +3055 3 242.2992 355.1502 54.899 0.2669 3054 +3056 3 242.1207 354.2751 56.28 0.3432 3055 +3057 3 241.6357 353.3679 56.0123 0.2643 3056 +3058 3 240.8269 352.6094 56.089 0.1144 3057 +3059 3 240.645 351.7148 57.12 0.1144 3058 +3060 3 239.8922 351.2366 57.68 0.1144 3059 +3061 3 239.0422 350.5399 57.9356 0.1144 3060 +3062 3 238.8214 349.4417 57.68 0.1144 3061 +3063 3 238.7517 348.3057 57.68 0.1144 3062 +3064 3 238.0492 347.5529 57.68 0.1144 3063 +3065 3 237.1283 346.9249 57.68 0.1144 3064 +3066 3 236.2383 346.4226 57.68 0.1246 3065 +3067 3 236.4648 345.488 58.24 0.1652 3066 +3068 3 301.8021 385.9673 32.2 0.2793 2862 +3069 3 300.9864 386.2281 32.3224 0.2621 3068 +3070 3 301.0562 386.5576 34.214 0.285 3069 +3071 3 300.3 386.4604 35.5289 0.2288 3070 +3072 3 299.9568 386.4512 33.717 0.1441 3071 +3073 3 299.5209 387.3081 32.7891 0.1158 3072 +3074 3 299.2372 388.3583 33.0509 0.1652 3073 +3075 3 298.5074 388.6809 34.4084 0.2413 3074 +3076 3 297.5086 388.6202 34.2768 0.2446 3075 +3077 3 296.7708 389.1202 34.5391 0.2262 3076 +3078 3 296.2903 389.8203 35.3847 0.2984 3077 +3079 3 295.8018 390.6794 35.3133 0.2512 3078 +3080 3 295.0307 391.0524 35.399 0.1151 3079 +3081 3 294.5022 391.6598 36.2202 0.1943 3080 +3082 3 293.8536 392.4606 35.6334 0.2314 3081 +3083 3 293.0345 392.9308 35.6964 0.1635 3082 +3084 3 292.705 393.4067 37.413 0.1756 3083 +3085 3 291.8115 393.536 36.2429 0.2452 3084 +3086 3 291.0908 394.0451 36.7394 0.2924 3085 +3087 3 290.3232 394.8676 36.6402 0.3487 3086 +3088 3 289.7969 395.8206 37.4128 0.3686 3087 +3089 3 289.337 396.7335 38.3197 0.3618 3088 +3090 3 288.8749 397.7528 37.8179 0.3355 3089 +3091 3 288.1816 398.6394 37.6398 0.3178 3090 +3092 3 287.2538 399.1999 38.1455 0.329 3091 +3093 3 286.1991 399.5843 38.6672 0.3305 3092 +3094 3 285.3765 400.3703 38.8872 0.3178 3093 +3095 3 285.1351 401.0841 39.4862 0.309 3094 +3096 3 284.8903 402.1469 40.3077 0.2871 3095 +3097 3 284.7382 403.2623 40.7478 0.2887 3096 +3098 3 284.2932 404.2907 40.6952 0.3016 3097 +3099 3 283.7429 405.2654 40.1495 0.3235 3098 +3100 3 283.259 406.287 40.1386 0.3119 3099 +3101 3 282.9501 407.3212 40.9646 0.3051 3100 +3102 3 282.3644 408.019 42.4886 0.2759 3101 +3103 3 281.4675 408.6105 43.2656 0.2569 3102 +3104 3 280.4505 409.0326 43.9835 0.2241 3103 +3105 3 279.3854 409.4147 44.3092 0.2161 3104 +3106 3 278.373 409.1344 45.0106 0.2385 3105 +3107 3 277.6271 408.3325 45.7288 0.2879 3106 +3108 3 276.9624 407.6324 46.8222 0.3305 3107 +3109 3 277.0768 407.1382 48.0374 0.2994 3108 +3110 3 276.6089 406.4815 48.4624 0.2034 3109 +3111 3 276.4545 405.9964 46.727 0.3432 3110 +3112 3 276.5071 405.3627 48.1037 0.2949 3111 +3113 3 276.7267 405.0218 50.1592 0.166 3112 +3114 3 276.562 404.6271 52.624 0.2542 3113 +3115 3 276.5208 403.6043 52.08 0.2632 3114 +3116 3 277.0173 402.9168 51.5032 0.1965 3115 +3117 3 277.42 402.0508 50.9886 0.1631 3116 +3118 3 277.5344 401.7122 53.496 0.2886 3117 +3119 3 277.4978 400.7695 54.4981 0.3625 3118 +3120 3 277.42 399.9573 56.3069 0.191 3119 +3121 3 277.4852 399.2457 55.7511 0.2288 3120 +3122 3 276.8572 398.4483 55.5302 0.2458 3121 +3123 3 277.2415 398.112 56.7157 0.1652 3122 +3124 3 277.0082 397.6201 57.134 0.2924 3123 +3125 3 276.1616 397.4256 56.0 0.1398 3124 +3126 3 277.3559 397.9896 57.1217 0.1461 3123 +3127 3 277.0711 397.4256 58.8 0.3184 3126 +3128 3 275.9694 397.3112 58.4248 0.3432 3127 +3129 3 275.4638 398.0354 59.08 0.1289 3128 +3130 3 274.8105 398.1566 60.4094 0.1674 3129 +3131 3 274.258 398.4769 61.0156 0.4399 3130 +3132 3 273.2593 398.9368 60.727 0.314 3131 +3133 3 272.7307 399.6736 59.5501 0.2247 3132 +3134 3 272.2377 399.9321 60.3288 0.1488 3133 +3135 3 272.272 399.828 62.9796 0.2043 3134 +3136 3 271.4003 399.566 63.1621 0.4282 3135 +3137 3 270.3455 399.4711 63.7241 0.1451 3136 +3138 3 269.3342 399.256 64.12 0.1144 3137 +3139 3 268.1902 399.256 64.12 0.121 3138 +3140 3 267.0474 399.2182 64.12 0.1525 3139 +3141 3 266.0852 398.6337 64.12 0.2262 3140 +3142 3 265.1517 398.7206 63.56 0.1864 3141 +3143 3 264.4699 399.0581 64.496 0.1398 3142 +3144 3 263.4094 399.129 65.2028 0.1169 3143 +3145 3 262.4061 398.7984 65.0188 0.2034 3144 +3146 3 261.3903 398.9437 65.6172 0.2879 3145 +3147 3 260.4888 399.5065 65.8 0.2272 3146 +3148 3 260.2108 400.2673 66.743 0.2918 3147 +3149 3 259.4592 399.8532 67.3868 0.178 3148 +3150 3 276.9075 407.3876 49.266 0.3917 3108 +3151 3 277.1637 408.122 50.85 0.2542 3150 +3152 3 277.4795 409.1161 51.45 0.2924 3151 +3153 3 278.1819 409.8506 51.254 0.3254 3152 +3154 3 278.8443 409.6069 51.2011 0.2288 3153 +3155 3 279.819 409.6046 51.8115 0.3988 3154 +3156 3 280.4825 409.7259 53.2549 0.3432 3155 +3157 3 280.6324 410.4203 54.3906 0.1144 3156 +3158 3 279.9036 411.1708 55.16 0.2471 3157 +3159 3 279.708 412.1638 55.4663 0.394 3158 +3160 3 279.4838 413.1682 56.0899 0.3137 3159 +3161 3 279.8121 413.9804 56.9985 0.475 3160 +3162 3 279.7103 414.5719 58.175 0.2853 3161 +3163 3 280.2239 415.518 58.5108 0.1996 3162 +3164 3 280.6724 416.5327 58.0042 0.1301 3163 +3165 3 281.5716 417.1562 57.96 0.1144 3164 +3166 3 281.7466 418.2567 58.1955 0.2175 3165 +3167 3 281.6825 419.3309 59.005 0.3222 3166 +3168 3 281.686 420.3639 59.36 0.3051 3167 +3169 3 281.7832 421.2116 59.0996 0.286 3168 +3170 3 282.1424 422.1749 59.36 0.4296 3169 +3171 3 282.8403 422.9746 59.64 0.3432 3170 +3172 3 282.7247 423.9229 58.3181 0.287 3171 +3173 3 282.3518 424.8027 57.3266 0.1763 3172 +3174 3 282.1207 425.7625 56.2884 0.2231 3173 +3175 3 282.1196 426.4935 57.9961 0.1258 3174 +3176 3 282.6103 426.8573 60.1488 0.3085 3175 +3177 3 282.9272 427.4522 61.8425 0.3381 3176 +3178 3 282.568 428.3594 63.1408 0.3267 3177 +3179 3 282.7888 429.2791 63.936 0.1522 3178 +3180 3 282.6881 430.3293 64.412 0.1867 3179 +3181 3 282.3598 431.185 64.4232 0.2946 3180 +3182 3 282.1104 431.852 62.7718 0.2859 3181 +3183 3 281.6963 432.432 63.6236 0.1947 3182 +3184 3 281.4068 433.0601 65.4696 0.3099 3183 +3185 3 281.1952 433.9158 64.9006 0.2322 3184 +3186 3 280.7845 434.2887 65.6645 0.1525 3185 +3187 3 280.8543 435.0907 66.6658 0.1271 3186 +3188 3 280.8383 436.0711 66.1097 0.1867 3187 +3189 3 280.9767 436.9233 66.64 0.1802 3188 +3190 3 281.122 437.7951 68.0103 0.1265 3189 +3191 3 281.3199 438.8395 67.345 0.1144 3190 +3192 3 281.6528 439.3624 65.5085 0.1144 3191 +3193 3 281.0808 439.9138 64.328 0.2288 3192 +3194 3 281.7786 440.5864 64.6702 0.2454 3193 +3195 3 281.9834 441.6767 64.43 0.3173 3194 +3196 3 282.4616 442.6914 64.4221 0.3432 3195 +3197 3 283.1858 443.5208 64.96 0.3432 3196 +3198 3 283.7417 444.4703 64.757 0.2963 3197 +3199 3 284.316 445.4084 64.2502 0.208 3198 +3200 3 284.5185 446.4357 63.28 0.2288 3199 +3201 3 285.3079 446.8796 64.045 0.2924 3200 +3202 3 285.825 447.836 63.9262 0.2924 3201 +3203 3 286.3661 448.7523 63.635 0.2796 3202 +3204 3 286.8008 449.7064 64.12 0.1652 3203 +3205 3 284.7508 401.0761 36.9678 0.2938 3094 +3206 3 283.8539 401.417 37.3548 0.1907 3205 +3207 3 282.9249 402.005 37.24 0.2796 3206 +3208 3 282.1081 402.5358 36.5078 0.2034 3207 +3209 3 281.2879 403.117 36.12 0.1657 3208 +3210 3 280.328 403.1456 37.1675 0.1398 3209 +3211 3 279.6714 403.1124 35.2377 0.196 3210 +3212 3 278.7356 402.9168 34.7536 0.1956 3211 +3213 3 278.0069 403.26 35.84 0.3232 3212 +3214 3 276.9635 403.4888 36.5394 0.178 3213 +3215 3 275.887 403.7531 36.68 0.1144 3214 +3216 3 275.3539 404.404 36.1544 0.1248 3215 +3217 3 274.9066 404.9199 37.7216 0.1525 3216 +3218 3 274.4673 405.4004 35.84 0.2354 3217 +3219 3 273.7363 406.1074 36.1598 0.2691 3218 +3220 3 272.9321 406.1234 35.84 0.2034 3219 +3221 3 272.089 406.644 35.0672 0.2637 3220 +3222 3 271.1715 407.2182 35.6367 0.1726 3221 +3223 3 270.4164 407.8349 35.6793 0.236 3222 +3224 3 269.6637 407.979 33.9052 0.3051 3223 +3225 3 268.9029 408.2593 32.48 0.179 3224 +3226 3 268.0472 408.8576 32.7146 0.1629 3225 +3227 3 266.9375 408.7512 33.04 0.3062 3226 +3228 3 265.9365 408.6139 32.0146 0.2568 3227 +3229 3 264.9527 408.6974 31.5182 0.2667 3228 +3230 3 263.9059 408.7318 31.4266 0.2288 3229 +3231 3 262.8088 408.8656 31.7685 0.2007 3230 +3232 3 261.6831 408.8141 31.92 0.1652 3231 +3233 3 260.5597 408.932 31.619 0.1693 3232 +3234 3 259.4352 409.075 31.2483 0.14 3233 +3235 3 258.6001 409.679 31.0845 0.1171 3234 +3236 3 257.5968 410.1572 31.0845 0.1144 3235 +3237 3 256.5248 410.5576 31.0845 0.1144 3236 +3238 3 255.4552 410.9614 31.0845 0.1144 3237 +3239 3 254.3135 411.0255 31.0845 0.1144 3238 +3240 3 253.1866 411.2074 31.0845 0.1144 3239 +3241 3 252.0953 411.522 31.0845 0.1173 3240 +3242 3 251.0794 412.0505 31.0845 0.1292 3241 +3243 3 250.075 412.5893 31.019 0.1411 3242 +3244 3 249.1632 413.2254 30.3652 0.1534 3243 +3245 3 248.2503 413.8626 29.7111 0.1657 3244 +3246 3 247.3385 414.4987 29.0573 0.178 3245 +3247 3 304.8096 381.4679 38.6523 0.2153 1 +3248 3 305.1963 381.9381 41.022 0.2092 3247 +3249 3 305.5841 382.4083 43.3919 0.2031 3248 +3250 3 305.9708 382.8785 45.7618 0.1969 3249 +3251 3 306.3586 383.3487 48.1317 0.1908 3250 +3252 3 306.878 384.2765 47.9699 0.3432 3251 +3253 3 307.2967 385.1882 48.9698 0.3432 3252 +3254 3 307.6376 386.0714 49.2293 0.2466 3253 +3255 3 307.6445 387.0918 50.104 0.2488 3254 +3256 3 307.9511 388.0597 49.7342 0.1685 3255 +3257 3 308.2005 389.1419 49.3119 0.146 3256 +3258 3 308.4304 389.9198 50.4 0.1144 3257 +3259 3 308.4807 390.9414 49.8677 0.1616 3258 +3260 3 308.6878 391.8246 49.1817 0.3371 3259 +3261 3 308.7656 392.8633 49.5001 0.2322 3260 +3262 3 308.5368 393.5738 50.2107 0.3432 3261 +3263 3 308.7656 394.2567 49.6667 0.3432 3262 +3264 3 308.4773 394.9214 51.142 0.2143 3263 +3265 3 308.6512 395.8938 50.0354 0.2518 3264 +3266 3 308.6157 396.7998 49.7227 0.3896 3265 +3267 3 308.5368 397.9381 49.7487 0.2531 3266 +3268 3 308.5585 399.0775 49.733 0.2107 3267 +3269 3 308.6787 400.2021 49.8408 0.2771 3268 +3270 3 308.9132 401.2557 49.8532 0.3632 3269 +3271 3 309.1088 402.3185 49.5729 0.2924 3270 +3272 3 309.2232 403.4041 49.8308 0.2644 3271 +3273 3 309.452 404.1512 48.095 0.178 3272 +3274 3 309.4428 404.9737 46.2944 0.1302 3273 +3275 3 309.1088 405.675 44.8711 0.2415 3274 +3276 3 309.325 406.5398 46.0443 0.2161 3275 +3277 3 309.4017 406.6931 46.3918 0.2221 3276 +3278 3 309.5664 407.5592 47.8649 0.1144 3277 +3279 3 309.5664 408.7032 47.88 0.1144 3278 +3280 3 309.7483 409.552 49.1047 0.2597 3279 +3281 3 310.0446 410.0565 51.1157 0.4068 3280 +3282 3 309.9096 411.0564 51.5217 0.3044 3281 +3283 3 309.5721 411.8194 52.8315 0.1191 3282 +3284 3 309.1546 412.6545 51.7496 0.2576 3283 +3285 3 308.3984 413.0755 50.2944 0.3067 3284 +3286 3 307.919 413.9118 49.0896 0.3686 3285 +3287 3 307.5221 414.9505 49.28 0.3257 3286 +3288 3 307.0507 415.6072 49.5709 0.1159 3287 +3289 3 307.2361 416.6459 49.0 0.1242 3288 +3290 3 306.592 417.4696 48.7676 0.2855 3289 +3291 3 306.0841 417.9066 50.0948 0.1811 3290 +3292 3 305.575 418.6903 48.9404 0.2918 3291 +3293 3 305.448 419.5048 49.2313 0.1337 3292 +3294 3 304.8577 419.8869 49.84 0.1407 3293 +3295 3 304.542 420.9691 50.0088 0.1985 3294 +3296 3 304.304 421.588 51.7129 0.3954 3295 +3297 3 303.8922 422.3648 51.938 0.1304 3296 +3298 3 303.0433 422.7137 52.0425 0.31 3297 +3299 3 302.5102 423.6163 51.3766 0.2288 3298 +3300 3 302.421 424.5144 50.7396 0.1495 3299 +3301 3 301.8661 425.3014 50.7237 0.1144 3300 +3302 3 301.2976 425.8071 49.2954 0.2227 3301 +3303 3 300.8526 426.6045 48.4319 0.1968 3302 +3304 3 300.3194 427.284 48.972 0.2669 3303 +3305 3 300.2016 427.6272 50.9886 0.2304 3304 +3306 3 299.5255 428.2095 50.2354 0.3051 3305 +3307 3 298.7979 428.873 49.0008 0.3052 3306 +3308 3 298.3907 429.5102 49.9215 0.1997 3307 +3309 3 298.6275 430.3739 50.9821 0.1925 3308 +3310 3 298.8128 431.3727 50.65 0.1525 3309 +3311 3 298.2957 432.0053 49.2226 0.1199 3310 +3312 3 297.4526 432.4881 48.2731 0.1584 3311 +3313 3 296.7147 432.9617 48.8113 0.2259 3312 +3314 3 296.137 433.8929 49.2744 0.3432 3313 +3315 3 295.621 434.6216 49.8859 0.2779 3314 +3316 3 295.0754 434.9488 48.627 0.1653 3315 +3317 3 294.58 435.4373 49.6874 0.2065 3316 +3318 3 294.1327 435.7679 51.52 0.3305 3317 +3319 3 293.5721 436.7414 51.7588 0.3424 3318 +3320 3 293.0059 437.3512 53.1894 0.3406 3319 +3321 3 292.1078 437.4656 54.5742 0.1614 3320 +3322 3 291.1308 437.9449 54.6 0.2161 3321 +3323 3 290.7876 438.2687 56.558 0.1144 3322 +3324 3 290.4055 439.0203 57.9569 0.1144 3323 +3325 3 290.1218 439.6907 56.2906 0.2096 3324 +3326 3 289.6597 440.329 54.6 0.254 3325 +3327 3 289.2295 441.2316 54.2987 0.2845 3326 +3328 3 289.0179 441.9135 55.8494 0.2187 3327 +3329 3 288.5191 442.7841 55.44 0.3979 3328 +3330 3 288.3955 443.8217 55.9689 0.3409 3329 +3331 3 287.6737 444.4463 56.1383 0.2359 3330 +3332 3 287.3728 445.016 56.1686 0.2592 3331 +3333 3 286.961 444.5904 57.904 0.1165 3332 +3334 3 286.3432 445.2723 57.0769 0.1703 3333 +3335 3 285.476 445.5617 56.8282 0.3426 3334 +3336 3 284.586 445.9953 58.0994 0.3135 3335 +3337 3 283.5839 446.0456 59.0573 0.3711 3336 +3338 3 282.5508 446.0467 58.9596 0.2833 3337 +3339 3 281.948 446.6462 59.3718 0.2876 3338 +3340 3 281.1254 446.7366 58.1423 0.3386 3339 +3341 3 280.2239 446.6702 57.3493 0.2585 3340 +3342 3 279.3728 446.3888 56.7204 0.1144 3341 +3343 3 278.7928 446.16 54.88 0.2288 3342 +3344 3 309.9748 406.8121 46.0188 0.2369 3276 +3345 3 311.0296 407.2548 45.9777 0.2707 3344 +3346 3 312.0843 407.6976 45.9365 0.3044 3345 +3347 3 312.7696 408.2341 44.8417 0.1737 3346 +3348 3 313.178 408.9514 44.1854 0.2288 3347 +3349 3 313.2203 408.7512 46.6082 0.1522 3348 +3350 3 313.7786 408.9571 47.6132 0.1687 3349 +3351 3 314.028 409.671 48.5948 0.2263 3350 +3352 3 314.4044 410.0119 50.4431 0.1761 3351 +3353 3 314.6 410.7978 49.5886 0.3051 3352 +3354 3 315.148 411.1673 50.0436 0.2299 3353 +3355 3 316.0071 411.7256 50.3829 0.2605 3354 +3356 3 316.5414 411.4041 52.6288 0.2288 3355 +3357 3 317.2598 411.3355 53.503 0.2257 3356 +3358 3 317.4806 412.2187 54.0238 0.247 3357 +3359 3 318.5216 412.412 53.5049 0.3432 3358 +3360 3 319.2446 412.0814 55.0458 0.2796 3359 +3361 3 320.3154 412.3491 55.1342 0.2669 3360 +3362 3 321.0236 412.722 56.0829 0.2682 3361 +3363 3 321.6493 413.4153 56.84 0.2924 3362 +3364 3 322.1412 414.3454 57.0713 0.3033 3363 +3365 3 322.608 414.9871 58.52 0.2162 3364 +3366 3 323.0656 415.6381 57.636 0.433 3365 +3367 3 323.935 416.0362 57.12 0.4287 3366 +3368 3 324.2096 417.1127 57.391 0.4539 3367 +3369 3 324.0529 417.949 58.7891 0.3985 3368 +3370 3 324.3126 418.7223 60.2 0.3432 3369 +3371 3 324.8823 419.5231 60.3691 0.2942 3370 +3372 3 325.0459 420.5218 60.6472 0.1473 3371 +3373 3 325.4165 421.4416 60.48 0.3432 3372 +3374 3 325.2667 422.4312 60.6889 0.3119 3373 +3375 3 325.7082 423.2972 60.226 0.38 3374 +3376 3 325.8661 424.0865 61.2926 0.2585 3375 +3377 3 325.9199 425.0177 60.2588 0.2841 3376 +3378 3 325.7071 425.862 61.6358 0.2314 3377 +3379 3 326.0972 426.1366 63.3153 0.2695 3378 +3380 3 326.4507 426.6262 65.0787 0.2192 3379 +3381 3 326.7264 427.419 66.561 0.2398 3380 +3382 3 326.8763 428.3742 66.6456 0.3059 3381 +3383 3 326.8442 429.3947 67.4338 0.3148 3382 +3384 3 327.1096 430.3419 67.7748 0.2868 3383 +3385 3 327.5078 431.161 67.8936 0.1971 3384 +3386 3 328.1713 431.5626 66.7019 0.144 3385 +3387 3 329.0213 431.5454 67.2294 0.1544 3386 +3388 3 329.798 432.1872 66.64 0.2924 3387 +3389 3 329.9948 432.9662 67.7648 0.2911 3388 +3390 3 330.1801 433.004 70.4287 0.3371 3389 +3391 3 330.5645 433.6298 72.228 0.1314 3390 +3392 3 331.2875 434.1526 73.4877 0.1144 3391 +3393 3 331.8538 434.7303 72.4069 0.1975 3392 +3394 3 332.8823 435.0609 72.5502 0.2422 3393 +3395 3 333.5252 435.2909 74.4629 0.3375 3394 +3396 3 334.4678 435.6306 75.5014 0.2812 3395 +3397 3 335.2378 435.7496 74.8157 0.333 3396 +3398 3 335.0776 436.436 73.64 0.3305 3397 +3399 3 305.1414 375.2514 27.8631 0.2871 1 +3400 3 305.353 374.191 28.0683 0.4743 3399 +3401 3 305.4926 373.3318 29.0111 0.2337 3400 +3402 3 306.2442 372.8079 28.9262 0.2288 3401 +3403 3 306.7636 371.8332 28.6373 0.2288 3402 +3404 3 307.4077 371.4568 27.7245 0.2288 3403 +3405 3 308.1215 371.228 29.3124 0.2796 3404 +3406 3 308.8056 370.4718 29.5221 0.2708 3405 +3407 3 309.3708 370.2293 27.7206 0.2075 3406 +3408 3 309.2507 369.3244 27.6763 0.3161 3407 +3409 3 309.4165 368.3817 27.9832 0.2611 3408 +3410 3 310.0515 367.7708 27.1438 0.3432 3409 +3411 3 310.4942 367.113 27.6755 0.2672 3410 +3412 3 310.6818 366.1898 28.5524 0.3049 3411 +3413 3 311.0078 365.2986 28.0162 0.3257 3412 +3414 3 311.9413 364.936 27.2852 0.2056 3413 +3415 3 312.8703 365.2792 28.1708 0.3685 3414 +3416 3 313.8942 365.2598 28.4698 0.394 3415 +3417 3 314.8231 364.8777 27.1281 0.394 3416 +3418 3 315.6307 364.5756 26.8223 0.44 3417 +3419 3 315.9877 363.5438 26.3511 0.425 3418 +3420 3 316.6009 362.8356 27.16 0.1892 3419 +3421 3 316.888 361.8529 27.6231 0.178 3420 +3422 3 317.3445 361.4697 29.5854 0.1598 3421 +3423 3 318.2711 360.94 30.24 0.1525 3422 +3424 3 318.4999 360.1438 28.8812 0.2013 3423 +3425 3 319.5284 359.9882 28.5519 0.1409 3424 +3426 3 320.3394 359.6072 27.2507 0.2127 3425 +3427 3 320.9092 358.914 27.0637 0.4514 3426 +3428 3 321.6127 358.1933 27.6587 0.3943 3427 +3429 3 322.2774 357.3044 27.711 0.3632 3428 +3430 3 322.894 356.451 27.44 0.339 3429 +3431 3 323.784 355.8435 26.861 0.4089 3430 +3432 3 324.3629 354.9649 26.6406 0.1952 3431 +3433 3 325.1225 354.3437 26.88 0.1253 3432 +3434 3 325.7048 353.8392 27.3073 0.1195 3433 +3435 3 326.6944 353.7248 28.238 0.165 3434 +3436 3 327.6416 353.3953 28.1812 0.2288 3435 +3437 3 328.0031 352.8016 26.7358 0.2907 3436 +3438 3 328.7845 352.4664 25.4806 0.2282 3437 +3439 3 329.3999 352.5545 27.3697 0.1705 3438 +3440 3 330.028 352.3955 28.5852 0.1246 3439 +3441 3 330.3872 351.5237 28.9528 0.2258 3440 +3442 3 331.0942 351.3224 29.223 0.2415 3441 +3443 3 331.8161 350.7996 29.2172 0.2773 3442 +3444 3 332.6832 350.1601 28.5925 0.2279 3443 +3445 3 333.5103 349.4268 28.091 0.1652 3444 +3446 3 334.2116 348.5688 27.72 0.2152 3445 +3447 3 334.9003 347.7588 27.6786 0.283 3446 +3448 3 335.5432 346.902 27.7186 0.2272 3447 +3449 3 336.2628 346.3872 28.4866 0.3051 3448 +3450 3 337.011 345.8712 28.056 0.3432 3449 +3451 3 337.5624 345.2741 27.2275 0.1636 3450 +3452 3 338.3426 344.8016 26.5073 0.1194 3451 +3453 3 339.1983 344.8931 28.2192 0.2161 3452 +3454 3 339.9396 344.4401 27.7794 0.2288 3453 +3455 3 340.9086 344.3657 27.9644 0.2288 3454 +3456 3 341.7414 344.3486 28.1212 0.1825 3455 +3457 3 342.5994 344.1358 28.6051 0.3243 3456 +3458 3 343.4437 343.5329 28.6345 0.2217 3457 +3459 3 344.0488 343.2 28.4976 0.2465 3458 +3460 3 344.8565 342.7355 28.4343 0.2288 3459 +3461 3 345.7202 342.3271 28.3228 0.2407 3460 +3462 3 346.6766 341.9096 28.0468 0.2351 3461 +3463 3 346.6503 341.015 27.2863 0.217 3462 +3464 3 347.0416 340.0037 27.141 0.1415 3463 +3465 3 347.6902 339.2898 27.72 0.2476 3464 +3466 3 348.1684 338.6183 27.7253 0.2346 3465 +3467 3 348.7335 337.7294 27.6156 0.3036 3466 +3468 3 349.3902 337.1894 26.9461 0.1828 3467 +3469 3 350.0411 336.7719 28.0 0.2034 3468 +3470 3 351.0959 336.3852 27.7343 0.2493 3469 +3471 3 351.4368 335.8384 26.129 0.1145 3470 +3472 3 351.9928 335.2652 26.6 0.2288 3471 +3473 3 352.4367 334.4427 27.2292 0.2288 3472 +3474 3 352.5957 333.587 27.5131 0.1948 3473 +3475 3 353.1551 332.7965 27.9443 0.1271 3474 +3476 3 354.0165 332.1444 28.5541 0.1765 3475 +3477 3 354.5519 331.156 28.3772 0.1907 3476 +3478 3 355.3424 330.3792 28.6532 0.1843 3477 +3479 3 356.3102 330.1927 28.7787 0.1737 3478 +3480 3 357.4119 330.0978 29.342 0.1626 3479 +3481 3 358.4827 329.8095 29.1673 0.1526 3480 +3482 3 359.2354 329.1585 28.448 0.1755 3481 +3483 3 360.0523 328.4996 28.8271 0.1907 3482 +3484 3 360.9663 328.2525 28.6294 0.2162 3483 +3485 3 361.6287 327.6977 29.7223 0.2288 3484 +3486 3 362.2556 326.9952 29.2754 0.1483 3485 +3487 3 363.347 326.8122 29.3927 0.1144 3486 +3488 3 364.4715 326.6337 29.4 0.1144 3487 +3489 3 365.5949 326.4976 29.4 0.1144 3488 +3490 3 366.7275 326.4461 29.4622 0.1653 3489 +3491 3 367.8486 326.3306 29.0433 0.2346 3490 +3492 3 368.9446 326.2688 28.317 0.2288 3491 +3493 3 369.6802 325.9325 28.1002 0.1144 3492 +3494 3 370.5199 325.9062 29.0976 0.1631 3493 +3495 3 371.2555 326.4953 28.6373 0.2288 3494 +3496 3 372.1695 326.6257 29.0492 0.2115 3495 +3497 3 373.1797 326.8065 28.7468 0.1163 3496 +3498 3 374.279 326.9792 29.12 0.135 3497 +3499 3 375.1862 327.4082 28.2562 0.2131 3498 +3500 3 376.1724 327.7503 28.3825 0.1658 3499 +3501 3 376.9903 327.7182 28.0104 0.1822 3500 +3502 3 377.8335 327.4059 28.7106 0.2647 3501 +3503 3 378.664 326.9563 28.7249 0.2273 3502 +3504 3 379.6913 326.5514 28.2971 0.1318 3503 +3505 3 380.7083 326.2963 28.901 0.1481 3504 +3506 3 381.6601 325.865 29.1032 0.1676 3505 +3507 3 382.676 325.5778 28.28 0.2716 3506 +3508 3 383.6782 325.15 28.4581 0.1782 3507 +3509 3 384.7867 324.9578 28.0563 0.1144 3508 +3510 3 385.8906 324.6752 28.0 0.1144 3509 +3511 3 387.0072 324.451 28.0 0.1144 3510 +3512 3 388.1054 324.1398 28.0 0.1144 3511 +3513 3 389.1591 323.7005 27.9555 0.1265 3512 +3514 3 390.1292 323.5163 28.2047 0.1829 3513 +3515 3 391.1096 323.1159 28.6532 0.201 3514 +3516 3 392.0923 322.608 28.84 0.1493 3515 +3517 3 393.1722 322.6194 29.3171 0.1493 3516 +3518 3 394.2167 322.608 30.2089 0.1441 3517 +3519 3 395.2509 322.7224 29.9594 0.1272 3518 +3520 3 396.158 322.5039 30.3419 0.1591 3519 +3521 3 397.2586 322.608 29.96 0.1144 3520 +3522 3 398.1578 323.1789 29.6918 0.1144 3521 +3523 3 399.1233 323.5232 29.12 0.1144 3522 +3524 3 400.2673 323.5232 29.12 0.1144 3523 +3525 3 401.1951 323.9808 28.8417 0.1144 3524 +3526 3 401.8906 324.6741 28.6916 0.1144 3525 +3527 3 402.9832 324.7816 29.1292 0.1336 3526 +3528 3 404.0482 324.7816 29.9499 0.1652 3527 +3529 3 405.1087 324.8708 30.52 0.1151 3528 +3530 3 406.1646 324.4327 30.52 0.1622 3529 +3531 3 407.0295 323.7211 30.6186 0.2789 3530 +3532 3 407.4608 322.8608 31.08 0.1361 3531 +3533 3 407.9836 322.0246 31.08 0.1144 3532 +3534 3 408.9937 321.5864 30.7045 0.1144 3533 +3535 3 410.1309 321.5784 30.52 0.1144 3534 +3536 3 411.2405 321.6711 30.464 0.2066 3535 +3537 3 411.84 322.0806 30.3604 0.178 3536 +3538 3 412.6751 322.4936 30.4774 0.2913 3537 +3539 3 413.7745 322.5394 30.4746 0.304 3538 +3540 3 414.795 322.8425 30.0507 0.2482 3539 +3541 3 415.876 322.5588 29.68 0.2719 3540 +3542 3 416.5544 323.0393 28.5222 0.1959 3541 +3543 3 417.5474 322.9592 27.7612 0.3079 3542 +3544 3 418.267 322.6183 28.0319 0.1144 3543 +3545 3 419.1353 322.6286 27.2532 0.1941 3544 +3546 3 419.8057 323.22 27.6651 0.1652 3545 +3547 3 420.5367 323.6353 26.8402 0.3432 3546 +3548 3 421.4427 324.0918 27.0337 0.4014 3547 +3549 3 422.4449 323.9282 27.5979 0.3683 3548 +3550 3 423.455 323.8378 28.6516 0.3178 3549 +3551 3 424.424 323.4877 28.5051 0.3051 3550 +3552 3 425.1127 322.8608 27.9359 0.3116 3551 +3553 3 425.7979 322.4284 27.4254 0.3222 3552 +3554 3 426.7166 322.0337 27.6298 0.3972 3553 +3555 3 427.5231 322.2213 28.6698 0.3926 3554 +3556 3 428.2312 322.3849 29.5736 0.1254 3555 +3557 3 429.0092 321.6917 29.5806 0.2151 3556 +3558 3 429.4576 320.892 29.12 0.3051 3557 +3559 3 315.7131 364.7266 26.4046 0.3717 3417 +3560 3 315.9762 365.2712 24.6618 0.3089 3559 +3561 3 316.7393 365.8032 24.2222 0.2924 3560 +3562 3 317.7254 366.1544 24.4348 0.2619 3561 +3563 3 318.6303 365.6716 24.719 0.3421 3562 +3564 3 319.5913 365.8512 24.5347 0.2795 3563 +3565 3 319.9768 365.0058 23.9781 0.1185 3564 +3566 3 320.7147 364.3972 24.059 0.2767 3565 +3567 3 321.7111 364.6214 24.1024 0.1928 3566 +3568 3 322.5314 364.1592 23.52 0.3241 3567 +3569 3 323.6021 364.1146 23.5771 0.1878 3568 +3570 3 324.0506 363.5129 22.7035 0.2669 3569 +3571 3 324.0288 363.236 20.267 0.3432 3570 +3572 3 324.4453 362.2716 20.1659 0.355 3571 +3573 3 325.3387 361.8106 20.8544 0.1997 3572 +3574 3 326.0995 361.0395 21.0 0.2049 3573 +3575 3 326.1189 359.9665 20.4154 0.3065 3574 +3576 3 325.492 359.1863 20.0883 0.1682 3575 +3577 3 325.7014 358.628 19.2147 0.1636 3576 +3578 3 325.9256 357.8215 20.4336 0.2971 3577 +3579 3 325.9496 356.9314 19.4387 0.2669 3578 +3580 3 325.6339 356.5425 16.921 0.2669 3579 +3581 3 325.2575 355.8995 16.4909 0.3288 3580 +3582 3 324.7816 355.5197 15.745 0.3432 3581 +3583 3 324.8514 354.9832 14.5737 0.2288 3582 +3584 3 325.9062 355.0598 14.1168 0.3205 3583 +3585 3 326.6886 354.7029 15.057 0.1568 3584 +3586 3 327.1783 354.537 13.1452 0.198 3585 +3587 3 327.51 353.734 12.0532 0.178 3586 +3588 3 327.9608 352.8405 12.6 0.2601 3587 +3589 3 328.8908 353.2569 12.731 0.188 3588 +3590 3 329.5418 353.6356 13.7203 0.2987 3589 +3591 3 330.457 353.8014 14.5656 0.2418 3590 +3592 3 331.3356 353.5681 13.5542 0.2161 3591 +3593 3 331.6239 354.1366 12.2844 0.2034 3592 +3594 3 332.3995 354.5164 12.087 0.2011 3593 +3595 3 333.5218 354.6503 12.04 0.1314 3594 +3596 3 334.1693 355.4957 11.7888 0.1144 3595 +3597 3 334.7344 355.5632 12.9968 0.3216 3596 +3598 3 335.5352 355.212 13.44 0.2542 3597 +3599 3 301.5344 375.9367 23.3178 0.2033 1 +3600 3 301.1157 375.0272 21.966 0.1935 3599 +3601 3 300.5563 374.2321 22.4974 0.2398 3600 +3602 3 299.8756 373.6796 23.6998 0.1444 3601 +3603 3 298.87 373.6682 23.7132 0.167 3602 +3604 3 297.7626 373.5286 23.3369 0.2288 3603 +3605 3 296.7914 373.3055 22.68 0.1289 3604 +3606 3 296.0008 373.3776 24.0027 0.1762 3605 +3607 3 295.1772 373.0126 24.92 0.2138 3606 +3608 3 294.7665 372.8468 22.7923 0.1303 3607 +3609 3 293.8936 372.9028 22.9284 0.1813 3608 +3610 3 293.4177 372.515 24.3314 0.3422 3609 +3611 3 292.3744 372.1432 24.1287 0.2909 3610 +3612 3 291.3288 371.967 23.9428 0.1969 3611 +3613 3 290.4776 371.6581 22.6307 0.2609 3612 +3614 3 290.0864 371.7371 24.2155 0.2004 3613 +3615 3 289.3073 371.5941 25.2608 0.1628 3614 +3616 3 288.5168 371.4065 25.1384 0.1481 3615 +3617 3 287.8853 370.9866 23.9887 0.3051 3616 +3618 3 286.9999 370.5302 24.2298 0.2929 3617 +3619 3 285.9199 370.3872 24.362 0.2661 3618 +3620 3 285.293 369.5726 24.92 0.1543 3619 +3621 3 284.435 369.2832 24.2001 0.178 3620 +3622 3 283.6582 368.7146 22.902 0.1144 3621 +3623 3 283.3494 368.2536 21.7669 0.1144 3622 +3624 3 283.0256 367.8303 21.9876 0.2088 3623 +3625 3 282.2843 367.6953 23.4424 0.1961 3624 +3626 3 281.6425 367.264 21.9478 0.2569 3625 +3627 3 280.9618 367.1782 20.4596 0.1766 3626 +3628 3 280.2217 366.5376 21.0484 0.178 3627 +3629 3 279.3099 366.1647 21.9526 0.3272 3628 +3630 3 278.516 365.5995 21.5424 0.2307 3629 +3631 3 277.666 365.2826 22.0234 0.4256 3630 +3632 3 276.7645 364.8296 21.5838 0.1968 3631 +3633 3 275.9591 364.0288 21.2383 0.2074 3632 +3634 3 275.1549 363.228 20.893 0.2182 3633 +3635 3 274.3495 362.4272 20.5475 0.2288 3634 +3636 3 274.0086 362.2007 20.417 0.1834 3635 +3637 3 273.1517 361.5669 19.4051 0.178 3636 +3638 3 272.7342 360.5991 18.3408 0.1654 3637 +3639 3 272.1324 359.7468 17.1959 0.178 3638 +3640 3 271.9803 359.1645 16.1445 0.1508 3639 +3641 3 272.3715 358.199 15.171 0.1822 3640 +3642 3 272.1542 357.2151 14.5897 0.2049 3641 +3643 3 271.4209 356.3869 14.5961 0.2288 3642 +3644 3 270.9816 355.5369 13.6086 0.2401 3643 +3645 3 271.0216 354.457 12.964 0.2413 3644 +3646 3 270.4885 353.631 13.2376 0.2288 3645 +3647 3 269.4875 353.3221 14.1644 0.2142 3646 +3648 3 268.451 353.0178 14.4956 0.2111 3647 +3649 3 267.5164 352.4756 13.7063 0.2081 3648 +3650 3 267.0748 351.5409 13.4476 0.2202 3649 +3651 3 267.0119 350.4152 13.8457 0.2375 3650 +3652 3 267.0279 349.2769 13.9997 0.2502 3651 +3653 3 267.1389 348.1398 13.9989 0.2455 3652 +3654 3 267.4718 347.053 13.9941 0.2328 3653 +3655 3 267.5484 345.9353 13.9616 0.238 3654 +3656 3 266.9959 344.9881 13.7052 0.2511 3655 +3657 3 266.0601 344.36 13.6181 0.2746 3656 +3658 3 265.1414 343.6828 13.704 0.2796 3657 +3659 3 264.3864 342.9575 12.7128 0.2583 3658 +3660 3 263.6783 342.1121 12.0123 0.1991 3659 +3661 3 262.7047 341.6579 12.7042 0.1435 3660 +3662 3 261.8227 342.2528 13.4966 0.1274 3661 +3663 3 261.5184 343.3144 12.88 0.1525 3662 +3664 3 270.9919 360.2204 17.9925 0.1387 3639 +3665 3 269.8719 360.249 17.6128 0.1518 3664 +3666 3 268.8034 360.265 16.6219 0.1403 3665 +3667 3 267.8047 360.5842 15.6657 0.1252 3666 +3668 3 267.0828 361.2409 14.6471 0.1144 3667 +3669 3 266.1184 361.5806 15.5982 0.1144 3668 +3670 3 265.2227 361.3873 16.9036 0.1144 3669 +3671 3 264.701 360.6552 16.0037 0.1144 3670 +3672 3 264.4665 359.8097 14.2313 0.1144 3671 +3673 3 264.0878 358.8945 14.0526 0.1217 3672 +3674 3 263.6817 358.2722 15.9303 0.1351 3673 +3675 3 263.3225 358.6898 17.901 0.1484 3674 +3676 3 262.7116 359.3887 19.4491 0.1433 3675 +3677 3 262.0195 360.2342 19.9346 0.1297 3676 +3678 3 261.3628 361.17 20.0416 0.1163 3677 +3679 3 261.0608 360.7032 21.84 0.1271 3678 +3680 3 274.2042 361.7683 21.7151 0.2669 3635 +3681 3 273.7958 360.7021 21.8392 0.2477 3680 +3682 3 273.2158 359.7365 21.835 0.2064 3681 +3683 3 272.3338 359.0341 21.8131 0.1907 3682 +3684 3 271.3351 358.4838 21.6882 0.2009 3683 +3685 3 270.3844 357.8878 21.212 0.2265 3684 +3686 3 269.4475 357.2838 20.7281 0.2415 3685 +3687 3 268.5483 356.5814 20.6886 0.2469 3686 +3688 3 267.8047 355.7337 20.4834 0.2542 3687 +3689 3 267.1949 354.7761 20.1608 0.26 3688 +3690 3 266.4765 353.8998 20.1967 0.2669 3689 +3691 3 265.6414 353.218 19.7008 0.2669 3690 +3692 3 265.1323 352.3417 19.2217 0.2669 3691 +3693 3 264.6838 351.3132 19.4253 0.2592 3692 +3694 3 263.8693 350.5525 19.3225 0.2306 3693 +3695 3 263.0525 349.937 18.2426 0.1836 3694 +3696 3 262.4061 349.2392 16.7065 0.1403 3695 +3697 3 261.5115 348.8525 15.5254 0.1271 3696 +3698 3 260.7073 348.793 16.9098 0.1469 3697 +3699 3 260.0987 348.729 19.2685 0.1931 3698 +3700 3 259.2064 348.3594 20.5587 0.2461 3699 +3701 3 258.1608 347.9247 20.6758 0.2758 3700 +3702 3 257.1346 347.4362 20.396 0.2577 3701 +3703 3 256.2102 346.815 19.7862 0.1985 3702 +3704 3 255.1429 346.4936 20.1709 0.1443 3703 +3705 3 254.2151 346.0783 19.0078 0.1153 3704 +3706 3 253.6122 346.2739 19.6 0.1899 3705 +3707 3 252.8103 346.1824 20.5422 0.1144 3706 +3708 3 251.7692 346.2591 19.88 0.1345 3707 +3709 3 250.7934 345.9959 19.9576 0.1239 3708 +3710 3 250.242 345.4045 21.0 0.2288 3709 +3711 3 249.5258 344.7055 20.2765 0.1935 3710 +3712 3 248.6907 344.2788 21.0423 0.159 3711 +3713 3 247.9037 344.0477 20.0236 0.2161 3712 +3714 3 247.2378 343.4688 19.6 0.178 3713 +3715 3 246.3959 342.8568 20.1303 0.2159 3714 +3716 3 245.2725 342.9197 20.4089 0.1182 3715 +3717 3 244.2188 342.9586 20.3468 0.1652 3716 +3718 3 244.1296 342.4964 20.519 0.1144 3717 +3719 3 244.5872 341.7128 19.32 0.1398 3718 +3720 3 244.1651 343.1943 20.1984 0.1719 3717 +3721 3 243.4123 343.8795 19.88 0.1215 3720 +3722 3 242.2683 343.8864 19.88 0.1144 3721 +3723 3 241.1243 343.8864 19.88 0.1144 3722 +3724 3 240.0375 343.8864 20.5313 0.1191 3723 +3725 3 239.0994 343.4002 20.9782 0.224 3724 +3726 3 238.4885 343.0856 20.9353 0.1674 3725 +3727 3 237.4303 342.9735 20.72 0.1163 3726 +3728 3 236.3596 343.0993 21.28 0.1541 3727 +3729 3 235.6022 342.5685 21.84 0.2862 3728 +3730 3 234.6333 342.342 21.4194 0.1462 3729 +3731 3 233.686 342.4621 21.6006 0.1891 3730 +3732 3 232.8909 342.8339 22.6789 0.1666 3731 +3733 3 232.2709 343.0192 21.1238 0.1185 3732 +3734 3 231.2196 343.0398 21.8156 0.1271 3733 +3735 3 230.2529 342.5571 22.4 0.2012 3734 +3736 3 229.2073 342.3878 21.7767 0.2171 3735 +3737 3 228.7085 341.5252 20.8393 0.167 3736 +3738 3 227.8745 340.7953 20.7152 0.1144 3737 +3739 3 226.7934 340.475 20.44 0.1144 3738 +3740 3 225.7467 340.0151 20.44 0.1372 3739 +3741 3 224.8543 339.3276 20.0712 0.1652 3740 +3742 3 224.1908 338.5554 20.6422 0.1306 3741 +3743 3 223.2996 337.917 20.44 0.1144 3742 +3744 3 222.5663 337.1368 20.16 0.1317 3743 +3745 3 221.7026 336.4161 20.3157 0.1652 3744 +3746 3 220.6787 336.1312 20.7642 0.1497 3745 +3747 3 219.656 335.9814 21.8025 0.1257 3746 +3748 3 218.9044 335.8441 20.5265 0.1925 3747 +3749 3 217.8382 335.6496 20.9936 0.2805 3748 +3750 3 217.0877 335.5421 19.462 0.3127 3749 +3751 3 216.6713 334.9117 20.1984 0.2539 3750 +3752 3 216.4654 334.0549 19.6381 0.2232 3751 +3753 3 216.0776 334.3489 18.5623 0.2557 3752 +3754 3 215.1578 334.0469 18.0796 0.3205 3753 +3755 3 214.5366 333.182 17.6159 0.1936 3754 +3756 3 213.7701 332.7541 16.3534 0.2366 3755 +3757 3 212.9442 332.1696 17.0458 0.2865 3756 +3758 3 211.8951 332.2416 17.36 0.3432 3757 +3759 3 211.8596 333.2186 17.0727 0.3432 3758 +3760 3 211.3723 333.9325 16.1269 0.2819 3759 +3761 3 211.0508 333.333 15.5893 0.3432 3760 +3762 3 210.0784 332.9749 15.1718 0.3009 3761 +3763 3 209.0077 332.8434 14.6695 0.2384 3762 +3764 3 207.9712 332.5928 15.12 0.4115 3763 +3765 3 206.9084 332.2256 14.7008 0.302 3764 +3766 3 205.9177 331.7657 14.6818 0.2727 3765 +3767 3 204.9453 332.157 14.6793 0.2608 3766 +3768 3 204.3607 332.6935 13.1911 0.3037 3767 +3769 3 203.4043 332.7175 12.3166 0.3312 3768 +3770 3 202.5727 332.904 12.0851 0.1533 3769 +3771 3 201.5362 332.8411 12.7812 0.2616 3770 +3772 3 200.6748 332.5608 13.1897 0.1541 3771 +3773 3 199.7824 332.801 14.1159 0.142 3772 +3774 3 198.7483 333.0424 13.8667 0.3057 3773 +3775 3 198.5481 333.484 12.868 0.3686 3774 +3776 3 198.1717 333.7345 11.3226 0.3026 3775 +3777 3 197.7427 334.5102 12.3385 0.2186 3776 +3778 3 196.7028 334.8694 12.9396 0.2089 3777 +3779 3 195.7636 334.8191 12.9847 0.1992 3778 +3780 3 195.5027 334.8431 11.3277 0.1794 3779 +3781 3 194.8655 334.2619 10.9175 0.1261 3780 +3782 3 194.1711 333.5263 11.3341 0.2603 3781 +3783 3 194.1368 332.904 12.04 0.1144 3782 diff --git a/bmtk-vb/docs/examples/biophys_components/point_neuron_templates/IntFire1_exc_1.json b/bmtk-vb/docs/examples/biophys_components/point_neuron_templates/IntFire1_exc_1.json new file mode 100644 index 0000000..6a58d3b --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/point_neuron_templates/IntFire1_exc_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.024, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/examples/biophys_components/point_neuron_templates/IntFire1_inh_1.json b/bmtk-vb/docs/examples/biophys_components/point_neuron_templates/IntFire1_inh_1.json new file mode 100644 index 0000000..0da2f1f --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/point_neuron_templates/IntFire1_inh_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.007, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/examples/biophys_components/recXelectrodes/linear_electrode.csv b/bmtk-vb/docs/examples/biophys_components/recXelectrodes/linear_electrode.csv new file mode 100644 index 0000000..d99c28f --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/recXelectrodes/linear_electrode.csv @@ -0,0 +1,87 @@ +channel x_pos y_pos z_pos +0 10.0 0 5.0 +1 10.0 -10 5.0 +2 10.0 -20 5.0 +3 10.0 -30 5.0 +4 10.0 -40 5.0 +5 10.0 -50 5.0 +6 10.0 -60 5.0 +7 10.0 -70 5.0 +8 10.0 -80 5.0 +9 10.0 -90 5.0 +10 10.0 -100 5.0 +11 10.0 -110 5.0 +12 10.0 -120 5.0 +13 10.0 -130 5.0 +14 10.0 -140 5.0 +15 10.0 -150 5.0 +16 10.0 -160 5.0 +17 10.0 -170 5.0 +18 10.0 -180 5.0 +19 10.0 -190 5.0 +20 10.0 -200 5.0 +21 10.0 -210 5.0 +22 10.0 -220 5.0 +23 10.0 -230 5.0 +24 10.0 -240 5.0 +25 10.0 -250 5.0 +26 10.0 -260 5.0 +27 10.0 -270 5.0 +28 10.0 -280 5.0 +29 10.0 -290 5.0 +30 10.0 -300 5.0 +31 10.0 -310 5.0 +32 10.0 -320 5.0 +33 10.0 -330 5.0 +34 10.0 -340 5.0 +35 10.0 -350 5.0 +36 10.0 -360 5.0 +37 10.0 -370 5.0 +38 10.0 -380 5.0 +39 10.0 -390 5.0 +40 10.0 -400 5.0 +41 10.0 -410 5.0 +42 10.0 -420 5.0 +43 10.0 -430 5.0 +44 10.0 -440 5.0 +45 10.0 -450 5.0 +46 10.0 -460 5.0 +47 10.0 -470 5.0 +48 10.0 -480 5.0 +49 10.0 -490 5.0 +50 10.0 -500 5.0 +51 10.0 -510 5.0 +52 10.0 -520 5.0 +53 10.0 -530 5.0 +54 10.0 -540 5.0 +55 10.0 -550 5.0 +56 10.0 -560 5.0 +57 10.0 -570 5.0 +58 10.0 -580 5.0 +59 10.0 -590 5.0 +60 10.0 -600 5.0 +61 10.0 -610 5.0 +62 10.0 -620 5.0 +63 10.0 -630 5.0 +64 10.0 -640 5.0 +65 10.0 -650 5.0 +66 10.0 -660 5.0 +67 10.0 -670 5.0 +68 10.0 -680 5.0 +69 10.0 -690 5.0 +70 10.0 -700 5.0 +71 10.0 -710 5.0 +72 10.0 -720 5.0 +73 10.0 -730 5.0 +74 10.0 -740 5.0 +75 10.0 -750 5.0 +76 10.0 -760 5.0 +77 10.0 -770 5.0 +78 10.0 -780 5.0 +79 10.0 -790 5.0 +80 10.0 -800 5.0 +81 10.0 -810 5.0 +82 10.0 -820 5.0 +83 10.0 -830 5.0 +84 10.0 -840 5.0 +85 10.0 -850 5.0 diff --git a/bmtk-vb/docs/examples/biophys_components/stimulations/485058595_0000.csv b/bmtk-vb/docs/examples/biophys_components/stimulations/485058595_0000.csv new file mode 100644 index 0000000..ba51913 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/stimulations/485058595_0000.csv @@ -0,0 +1,2 @@ +ip electrode_mesh_file pos_x pos_y pos_z rotation_x rotation_y rotation_z waveform +0 stimxmesh.csv 6.1803398874989481 0.0 19.021130325903069 0. 0. 0. waveform0.csv diff --git a/bmtk-vb/docs/examples/biophys_components/stimulations/stimxmesh.csv b/bmtk-vb/docs/examples/biophys_components/stimulations/stimxmesh.csv new file mode 100644 index 0000000..0abf845 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/stimulations/stimxmesh.csv @@ -0,0 +1,2 @@ +x_pos y_pos z_pos +0.0 0.0 0.0 diff --git a/bmtk-vb/docs/examples/biophys_components/synaptic_models/AMPA_ExcToExc.json b/bmtk-vb/docs/examples/biophys_components/synaptic_models/AMPA_ExcToExc.json new file mode 100644 index 0000000..c758540 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/synaptic_models/AMPA_ExcToExc.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 1.0, + "tau2": 3.0, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/examples/biophys_components/synaptic_models/AMPA_ExcToInh.json b/bmtk-vb/docs/examples/biophys_components/synaptic_models/AMPA_ExcToInh.json new file mode 100644 index 0000000..4388799 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/synaptic_models/AMPA_ExcToInh.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.1, + "tau2": 0.5, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/examples/biophys_components/synaptic_models/GABA_InhToExc.json b/bmtk-vb/docs/examples/biophys_components/synaptic_models/GABA_InhToExc.json new file mode 100644 index 0000000..702ce9b --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/synaptic_models/GABA_InhToExc.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 2.7, + "tau2": 15.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/examples/biophys_components/synaptic_models/GABA_InhToInh.json b/bmtk-vb/docs/examples/biophys_components/synaptic_models/GABA_InhToInh.json new file mode 100644 index 0000000..ed4130a --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/synaptic_models/GABA_InhToInh.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.2, + "tau2": 8.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/examples/biophys_components/synaptic_models/instanteneousExc.json b/bmtk-vb/docs/examples/biophys_components/synaptic_models/instanteneousExc.json new file mode 100644 index 0000000..9a6d0a5 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/synaptic_models/instanteneousExc.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": 1 +} + diff --git a/bmtk-vb/docs/examples/biophys_components/synaptic_models/instanteneousInh.json b/bmtk-vb/docs/examples/biophys_components/synaptic_models/instanteneousInh.json new file mode 100644 index 0000000..3bac514 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/synaptic_models/instanteneousInh.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": -1 +} + diff --git a/bmtk-vb/docs/examples/biophys_components/synaptic_models/pvalb_pvalb.json b/bmtk-vb/docs/examples/biophys_components/synaptic_models/pvalb_pvalb.json new file mode 100644 index 0000000..384e9f4 --- /dev/null +++ b/bmtk-vb/docs/examples/biophys_components/synaptic_models/pvalb_pvalb.json @@ -0,0 +1,10 @@ +{ + "level_of_detail": "model_2", + "erev": -70, + "tau_1": 3.0, + "tau_r0": 2059.8, + "tau_FDR": 569.8, + "a_FDR": 0.53, + "p0": 0.27 + +} diff --git a/bmtk-vb/docs/examples/filter_graitings/build_cells.py b/bmtk-vb/docs/examples/filter_graitings/build_cells.py new file mode 100644 index 0000000..2cd0fa0 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/build_cells.py @@ -0,0 +1,251 @@ +import os +import pickle +import numpy as np + +from bmtk.builder import NetworkBuilder + + +X_grids = 2 #15 +Y_grids = 2 #10 +X_len = 240.0 # In linear degrees +Y_len = 120.0 # In linear degrees + + +def generate_positions_grids(N, X_grids, Y_grids, X_len, Y_len): + width_per_tile = X_len/X_grids + height_per_tile = Y_len/Y_grids + + X = np.zeros(N * X_grids * Y_grids) + Y = np.zeros(N * X_grids * Y_grids) + + counter = 0 + for i in range(X_grids): + for j in range(Y_grids): + X_tile = np.random.uniform(i*width_per_tile, (i+1) * width_per_tile, N) + Y_tile = np.random.uniform(j*height_per_tile, (j+1) * height_per_tile, N) + X[counter*N:(counter+1)*N] = X_tile + Y[counter*N:(counter+1)*N] = Y_tile + counter += 1 + return np.column_stack((X, Y)) + + +def get_filter_spatial_size(N, X_grids, Y_grids, size_range): + spatial_sizes = np.zeros(N * X_grids * Y_grids) + counter = 0 + for i in range(X_grids): + for j in range(Y_grids): + if len(size_range) == 1: + sizes = np.ones(N) * size_range[0] + else: + sizes = np.random.triangular(size_range[0], size_range[0] + 1, size_range[1], N) + spatial_sizes[counter * N:(counter + 1) * N] = sizes + counter += 1 + return spatial_sizes + + +def get_filter_temporal_params(N, X_grids, Y_grids, model): + + # Total number of cells + N_total = N * X_grids * Y_grids + + # Jitter parameters + jitter = 0.025 + lower_jitter = 1 - jitter + upper_jitter = 1 + jitter + + # Directory of pickle files with saved parameter values + basepath = 'optimized_params' + + # For two-subunit filter (sONsOFF and sONtOFF) + sOFF_fn = os.path.join(basepath, 'sOFF_TF4_3.5_-2.0_10.0_60.0_15.0_ic.pkl') # best chosen fit for sOFF 4 Hz + tOFF_fn = os.path.join(basepath, 'tOFF_TF8_4.222_-2.404_8.545_23.019_0.0_ic.pkl') # best chosen fit for tOFF 8 Hz + sON_fn = os.path.join(basepath, 'sON_TF4_3.5_-2.0_30.0_60.0_25.0_ic.pkl') # best chosen fit for sON 4 Hz + + sOFF_prs = pickle.load(open(sOFF_fn, 'rb')) + tOFF_prs = pickle.load(open(tOFF_fn, 'rb')) + sON_prs = pickle.load(open(sON_fn, 'rb')) + + # Choose cell type and temporal frequency + if model == 'sONsOFF_001': + kpeaks = sOFF_prs['opt_kpeaks'] + kpeaks_dom_0 = np.random.uniform(lower_jitter * kpeaks[0], upper_jitter * kpeaks[0], N_total) + kpeaks_dom_1 = np.random.uniform(lower_jitter * kpeaks[1], upper_jitter * kpeaks[1], N_total) + kpeaks = sON_prs['opt_kpeaks'] + kpeaks_non_dom_0 = np.random.uniform(lower_jitter * kpeaks[0], upper_jitter * kpeaks[0], N_total) + kpeaks_non_dom_1 = np.random.uniform(lower_jitter * kpeaks[1], upper_jitter * kpeaks[1], N_total) + + wts = sOFF_prs['opt_wts'] + wts_dom_0 = np.random.uniform(lower_jitter * wts[0], upper_jitter * wts[0], N_total) + wts_dom_1 = np.random.uniform(lower_jitter * wts[1], upper_jitter * wts[1], N_total) + wts = sON_prs['opt_wts'] + wts_non_dom_0 = np.random.uniform(lower_jitter * wts[0], upper_jitter * wts[0], N_total) + wts_non_dom_1 = np.random.uniform(lower_jitter * wts[1], upper_jitter * wts[1], N_total) + + delays = sOFF_prs['opt_delays'] + delays_dom_0 = np.random.uniform(lower_jitter * delays[0], upper_jitter * delays[0], N_total) + delays_dom_1 = np.random.uniform(lower_jitter * delays[1], upper_jitter * delays[1], N_total) + delays = sON_prs['opt_delays'] + delays_non_dom_0 = np.random.uniform(lower_jitter * delays[0], upper_jitter * delays[0], N_total) + delays_non_dom_1 = np.random.uniform(lower_jitter * delays[1], upper_jitter * delays[1], N_total) + + sf_sep = 6. + sf_sep = np.random.uniform(lower_jitter * sf_sep, upper_jitter * sf_sep, N_total) + tuning_angles = np.random.uniform(0, 360., N_total) + + elif model == 'sONtOFF_001': + + kpeaks = tOFF_prs['opt_kpeaks'] + kpeaks_dom_0 = np.random.uniform(lower_jitter * kpeaks[0], upper_jitter * kpeaks[0], N_total) + kpeaks_dom_1 = np.random.uniform(lower_jitter * kpeaks[1], upper_jitter * kpeaks[1], N_total) + kpeaks = sON_prs['opt_kpeaks'] + kpeaks_non_dom_0 = np.random.uniform(lower_jitter * kpeaks[0], upper_jitter * kpeaks[0], N_total) + kpeaks_non_dom_1 = np.random.uniform(lower_jitter * kpeaks[1], upper_jitter * kpeaks[1], N_total) + + wts = tOFF_prs['opt_wts'] + wts_dom_0 = np.random.uniform(lower_jitter * wts[0], upper_jitter * wts[0], N_total) + wts_dom_1 = np.random.uniform(lower_jitter * wts[1], upper_jitter * wts[1], N_total) + wts = sON_prs['opt_wts'] + wts_non_dom_0 = np.random.uniform(lower_jitter * wts[0], upper_jitter * wts[0], N_total) + wts_non_dom_1 = np.random.uniform(lower_jitter * wts[1], upper_jitter * wts[1], N_total) + + delays = tOFF_prs['opt_delays'] + delays_dom_0 = np.random.uniform(lower_jitter * delays[0], upper_jitter * delays[0], N_total) + delays_dom_1 = np.random.uniform(lower_jitter * delays[1], upper_jitter * delays[1], N_total) + delays = sON_prs['opt_delays'] + delays_non_dom_0 = np.random.uniform(lower_jitter * delays[0], upper_jitter * delays[0], N_total) + delays_non_dom_1 = np.random.uniform(lower_jitter * delays[1], upper_jitter * delays[1], N_total) + + sf_sep = 4. + sf_sep = np.random.uniform(lower_jitter * sf_sep, upper_jitter * sf_sep, N_total) + tuning_angles = np.random.uniform(0, 360., N_total) + + else: + cell_type = model[0: model.find('_')] #'sON' # 'tOFF' + tf_str = model[model.find('_') + 1:] + + # Load pickle file containing params for optimized temporal kernel, it it exists + file_found = 0 + for fname in os.listdir(basepath): + if os.path.isfile(os.path.join(basepath, fname)): + pkl_savename = os.path.join(basepath, fname) + if tf_str in pkl_savename.split('_') and pkl_savename.find(cell_type) >= 0 and pkl_savename.find('.pkl') >= 0: + file_found = 1 + filt_file = pkl_savename + + if file_found != 1: + print('File not found: Filter was not optimized for this sub-class') + + savedata_dict = pickle.load(open(filt_file, 'rb')) + + kpeaks = savedata_dict['opt_kpeaks'] + kpeaks_dom_0 = np.random.uniform(lower_jitter * kpeaks[0], upper_jitter * kpeaks[0], N_total) + kpeaks_dom_1 = np.random.uniform(lower_jitter * kpeaks[1], upper_jitter * kpeaks[1], N_total) + kpeaks_non_dom_0 = np.nan * np.zeros(N_total) + kpeaks_non_dom_1 = np.nan * np.zeros(N_total) + + wts = savedata_dict['opt_wts'] + wts_dom_0 = np.random.uniform(lower_jitter * wts[0], upper_jitter * wts[0], N_total) + wts_dom_1 = np.random.uniform(lower_jitter * wts[1], upper_jitter * wts[1], N_total) + wts_non_dom_0 = np.nan * np.zeros(N_total) + wts_non_dom_1 = np.nan * np.zeros(N_total) + + delays = savedata_dict['opt_delays'] + delays_dom_0 = np.random.uniform(lower_jitter * delays[0], upper_jitter * delays[0], N_total) + delays_dom_1 = np.random.uniform(lower_jitter * delays[1], upper_jitter * delays[1], N_total) + delays_non_dom_0 = np.nan * np.zeros(N_total) + delays_non_dom_1 = np.nan * np.zeros(N_total) + + sf_sep = np.nan * np.zeros(N_total) + tuning_angles = np.nan * np.zeros(N_total) + + return np.column_stack((kpeaks_dom_0, kpeaks_dom_1, wts_dom_0, wts_dom_1, delays_dom_0, delays_dom_1, + kpeaks_non_dom_0, kpeaks_non_dom_1, wts_non_dom_0, wts_non_dom_1, + delays_non_dom_0, delays_non_dom_1, tuning_angles, sf_sep)) + + + +lgn_models = [ + # { + # 'N': 7, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sON_TF1', 'size_range': [2, 10] + # }, + # { + # 'N': 5, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sON_TF2', 'size_range': [2, 10] + # }, + # { + # 'N': 7, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sON_TF4', 'size_range': [2, 10] + # }, + # { + # 'N': 15, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sON_TF8', 'size_range': [2, 10] + # }, + # { + # 'N': 8, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sOFF_TF1', 'size_range': [2, 10] + # }, + # { + # 'N': 8, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sOFF_TF2', 'size_range': [2, 10] + # }, + # { + # 'N': 15, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sOFF_TF4', 'size_range': [2, 10] + # }, + # { + # 'N': 8, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sOFF_TF8', 'size_range': [2, 10] + # }, + # { + # 'N': 7, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sOFF_TF15', 'size_range': [2, 10] + # }, + # { + # 'N': 10, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'tOFF_TF4', 'size_range': [2, 10] + # }, + # { + # 'N': 5, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'tOFF_TF8', 'size_range': [2, 10] + # }, + { + 'N': 8, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'tOFF_TF15', 'size_range': [2, 10] + }, + { + 'N': 8, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sONsOFF_001', 'size_range': [6] + }, + { + 'N': 5, 'ei': 'e', 'model_type': 'virtual', 'pop_name': 'sONtOFF_001', 'size_range': [9] + } +] + +LGN = NetworkBuilder('lgn') +xcoords = [] +ycoords = [] +for params in lgn_models: + # Get position of lgn cells and keep track of the averaged location + # For now, use randomly generated values + total_N = params['N'] * X_grids * Y_grids + + # Get positional coordinates of cells + positions = generate_positions_grids(params['N'], X_grids, Y_grids, X_len, Y_len) + xcoords += [p[0] for p in positions] + ycoords += [p[1] for p in positions] + + # Get spatial filter size of cells + filter_sizes = get_filter_spatial_size(params['N'], X_grids, Y_grids, params['size_range']) + + # Get filter temporal parameters + filter_params = get_filter_temporal_params(params['N'], X_grids, Y_grids, params['pop_name']) + + LGN.add_nodes(N=total_N, ei=params['ei'], model_type=params['model_type'], pop_name=params['pop_name'], + x=positions[:, 0], + y=positions[:, 1], + spatial_size=filter_sizes, + kpeaks_dom_0=filter_params[:, 0], + kpeaks_dom_1=filter_params[:, 1], + weight_dom_0=filter_params[:, 2], + weight_dom_1=filter_params[:, 3], + delay_dom_0=filter_params[:, 4], + delay_dom_1=filter_params[:, 5], + kpeaks_non_dom_0=filter_params[:, 6], + kpeaks_non_dom_1=filter_params[:, 7], + weight_non_dom_0=filter_params[:, 8], + weight_non_dom_1=filter_params[:, 9], + delay_non_dom_0=filter_params[:, 10], + delay_non_dom_1=filter_params[:, 11], + tuning_angle=filter_params[:, 12], + sf_sep=filter_params[:, 13]) + +LGN.build() +LGN.save(output_dir='network') diff --git a/bmtk-vb/docs/examples/filter_graitings/cell_loaders.py b/bmtk-vb/docs/examples/filter_graitings/cell_loaders.py new file mode 100644 index 0000000..36b577a --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/cell_loaders.py @@ -0,0 +1,167 @@ +from sympy.abc import x as symbolic_x +from sympy.abc import y as symbolic_y + +from bmtk.simulator.filternet.filters import TemporalFilterCosineBump, GaussianSpatialFilter, SpatioTemporalFilter +from bmtk.simulator.filternet.cell_models import TwoSubfieldLinearCell, OnUnit, OffUnit +from bmtk.simulator.filternet.transfer_functions import ScalarTransferFunction, MultiTransferFunction +from bmtk.simulator.filternet.utils import get_data_metrics_for_each_subclass, get_tcross_from_temporal_kernel + + +def create_two_sub_cell(dom_lf, non_dom_lf, dom_spont, non_dom_spont, onoff_axis_angle, subfield_separation, dom_location): + dsp = str(dom_spont) + ndsp = str(non_dom_spont) + two_sub_transfer_fn = MultiTransferFunction((symbolic_x, symbolic_y), + 'Heaviside(x+'+dsp+')*(x+'+dsp+')+Heaviside(y+'+ndsp+')*(y+'+ndsp+')') + + two_sub_cell = TwoSubfieldLinearCell(dom_lf, non_dom_lf, subfield_separation=subfield_separation, + onoff_axis_angle=onoff_axis_angle, dominant_subfield_location=dom_location, + transfer_function=two_sub_transfer_fn) + return two_sub_cell + + +def create_temporal_filter(inp_dict): + opt_wts = inp_dict['opt_wts'] + opt_kpeaks = inp_dict['opt_kpeaks'] + opt_delays = inp_dict['opt_delays'] + temporal_filter = TemporalFilterCosineBump(opt_wts, opt_kpeaks, opt_delays) + + return temporal_filter + + +def createOneUnitOfTwoSubunitFilter(prs, ttp_exp): + filt = create_temporal_filter(prs) + tcross_ind = get_tcross_from_temporal_kernel(filt.get_kernel(threshold=-1.0).kernel) + filt_sum = filt.get_kernel(threshold=-1.0).kernel[:tcross_ind].sum() + + # Calculate delay offset needed to match response latency with data and rebuild temporal filter + del_offset = ttp_exp - tcross_ind + if del_offset >= 0: + delays = prs['opt_delays'] + delays[0] = delays[0] + del_offset + delays[1] = delays[1] + del_offset + prs['opt_delays'] = delays + filt_new = create_temporal_filter(prs) + else: + print('del_offset < 0') + + return filt_new, filt_sum + + +def load_cell(node): + origin = (0.0, 0.0) + translate = (node['x'], node['y']) + sigma = node['spatial_size'] / 3.0 # convert from degree to SD + sigma = (sigma, sigma) + spatial_filter = GaussianSpatialFilter(translate=translate, sigma=sigma, origin=origin) + + if node['pop_name'] == 'sONsOFF_001': + + # sON temporal filter + sON_prs = {'opt_wts': [node['weight_non_dom_0'], node['weight_non_dom_1']], + 'opt_kpeaks': [node['kpeaks_non_dom_0'], node['kpeaks_non_dom_1']], + 'opt_delays': [node['delay_non_dom_0'], node['delay_non_dom_1']]} + sON_filt_new = createOneUnitOfTwoSubunitFilter(sON_prs, 121.0) + sON_sum = sON_filt_new[1] + sON_filt_new = sON_filt_new[0] + + # tOFF temporal filter + sOFF_prs = {'opt_wts': [node['weight_dom_0'], node['weight_dom_1']], + 'opt_kpeaks': [node['kpeaks_dom_0'], node['kpeaks_dom_1']], + 'opt_delays': [node['delay_dom_0'], node['delay_dom_1']]} + sOFF_filt_new = createOneUnitOfTwoSubunitFilter(sOFF_prs, 115.0) + sOFF_sum = sOFF_filt_new[1] + sOFF_filt_new = sOFF_filt_new[0] + + amp_on = 1.0 # set the non-dominant subunit amplitude to unity + spont = 4.0 + max_roff = 35.0 + max_ron = 21.0 + amp_off = -(max_roff / max_ron) * (sON_sum / sOFF_sum) * amp_on - (spont * (max_roff - max_ron)) / ( + max_ron * sOFF_sum) + + # Create sON subunit: + xfer_fn_son = ScalarTransferFunction('Heaviside(s+' + str(0.5 * spont) + ')*(s+' + str(0.5 * spont) + ')') + linear_filter_son = SpatioTemporalFilter(spatial_filter, sON_filt_new, amplitude=amp_on) + scell_on = OnUnit(linear_filter_son, xfer_fn_son) + + # Create sOFF subunit: + xfer_fn_soff = ScalarTransferFunction('Heaviside(s+' + str(0.5 * spont) + ')*(s+' + str(0.5 * spont) + ')') + linear_filter_soff = SpatioTemporalFilter(spatial_filter, sOFF_filt_new, amplitude=amp_off) + scell_off = OffUnit(linear_filter_soff, xfer_fn_soff) + + sep_ss_onoff_cell = create_two_sub_cell(linear_filter_soff, linear_filter_son, 0.5 * spont, 0.5 * spont, + node['tuning_angle'], node['sf_sep'], translate) + cell = sep_ss_onoff_cell + + elif node['pop_name'] == 'sONtOFF_001': + # spatial_filter.get_kernel(np.arange(120), np.arange(240)).imshow() + # sON temporal filter + sON_prs = {'opt_wts': [node['weight_non_dom_0'], node['weight_non_dom_1']], + 'opt_kpeaks': [node['kpeaks_non_dom_0'], node['kpeaks_non_dom_1']], + 'opt_delays': [node['delay_non_dom_0'], node['delay_non_dom_1']]} + sON_filt_new = createOneUnitOfTwoSubunitFilter(sON_prs, 93.5) + sON_sum = sON_filt_new[1] + sON_filt_new = sON_filt_new[0] + + # tOFF temporal filter + tOFF_prs = {'opt_wts': [node['weight_dom_0'], node['weight_dom_1']], + 'opt_kpeaks': [node['kpeaks_dom_0'], node['kpeaks_dom_1']], + 'opt_delays': [node['delay_dom_0'], node['delay_dom_1']]} + tOFF_filt_new = createOneUnitOfTwoSubunitFilter(tOFF_prs, 64.8) # 64.8 + tOFF_sum = tOFF_filt_new[1] + tOFF_filt_new = tOFF_filt_new[0] + + amp_on = 1.0 # set the non-dominant subunit amplitude to unity + spont = 5.5 + max_roff = 46.0 + max_ron = 31.0 + amp_off = -0.7 * (max_roff / max_ron) * (sON_sum / tOFF_sum) * amp_on - (spont * (max_roff - max_ron)) / ( + max_ron * tOFF_sum) + + # Create sON subunit: + xfer_fn_son = ScalarTransferFunction('Heaviside(s+' + str(0.5 * spont) + ')*(s+' + str(0.5 * spont) + ')') + linear_filter_son = SpatioTemporalFilter(spatial_filter, sON_filt_new, amplitude=amp_on) + scell_on = OnUnit(linear_filter_son, xfer_fn_son) + # linear_filter_son.spatial_filter.get_kernel(np.arange(120), np.arange(240)).imshow() + + # Create tOFF subunit: + xfer_fn_toff = ScalarTransferFunction('Heaviside(s+' + str(0.5 * spont) + ')*(s+' + str(0.5 * spont) + ')') + linear_filter_toff = SpatioTemporalFilter(spatial_filter, tOFF_filt_new, amplitude=amp_off) + tcell_off = OffUnit(linear_filter_toff, xfer_fn_toff) + # linear_filter_toff.spatial_filter.get_kernel(np.arange(120), np.arange(240)).kernel + + sep_ts_onoff_cell = create_two_sub_cell(linear_filter_toff, linear_filter_son, 0.5 * spont, 0.5 * spont, + node['tuning_angle'], node['sf_sep'], translate) + + cell = sep_ts_onoff_cell + else: + type_split = node['pop_name'].split('_') + cell_type, tf_str = type_split[0], type_split[1] + + # For temporal filter + wts = [node['weight_dom_0'], node['weight_dom_1']] + kpeaks = [node['kpeaks_dom_0'], node['kpeaks_dom_1']] + delays = [node['delay_dom_0'], node['delay_dom_1']] + + ################# End of extract cell parameters needed ################# + + # Get spont from experimental data + exp_prs_dict = get_data_metrics_for_each_subclass(cell_type) + subclass_prs_dict = exp_prs_dict[tf_str] + spont_exp = subclass_prs_dict['spont_exp'] + spont_str = str(spont_exp[0]) + + # Get filters + transfer_function = ScalarTransferFunction('Heaviside(s+' + spont_str + ')*(s+' + spont_str + ')') + temporal_filter = TemporalFilterCosineBump(wts, kpeaks, delays) + + if cell_type.find('ON') >= 0: + amplitude = 1.0 + linear_filter = SpatioTemporalFilter(spatial_filter, temporal_filter, amplitude=amplitude) + cell = OnUnit(linear_filter, transfer_function) + elif cell_type.find('OFF') >= 0: + amplitude = -1.0 + linear_filter = SpatioTemporalFilter(spatial_filter, temporal_filter, amplitude=amplitude) + cell = OffUnit(linear_filter, transfer_function) + + return cell diff --git a/bmtk-vb/docs/examples/filter_graitings/config.json b/bmtk-vb/docs/examples/filter_graitings/config.json new file mode 100755 index 0000000..96fcf2d --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/config.json @@ -0,0 +1,95 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/../NWB_files", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../biophys_components" + }, + + "run": { + "tstop": 2050.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15, + "nsteps_block": 5000, + "overwrite_output_dir": true + }, + + "target_simulator":"NEURON", + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "inputs": { + "LGN_spikes": { + "input_type": "movie", + "module": "graiting", + "row_size": 120, + "col_size": 240, + "gray_screen_dur": 0.5, + "cpd": 0.04, + "temporal_f": 4.0, + "contrast": 0.8 + } + }, + + "output":{ + "log_file": "log.txt", + "output_dir": "$OUTPUT_DIR", + "rates_csv": "rates.csv", + "spikes_csv": "spikes.csv", + "spikes_h5": "spikes.h5", + "overwrite_output_dir": true + }, + + "components": { + "morphologies_dir": "$COMPONENT_DIR/morphologies", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models", + "mechanisms_dir":"$COMPONENT_DIR/mechanisms", + "biophysical_neuron_models_dir": "$COMPONENT_DIR/biophysical_neuron_templates", + "point_neuron_models_dir": "$COMPONENT_DIR/point_neuron_templates" + }, + + + "reports": { + "calcium_concentration": { + "cells": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "variable_name": "cai", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + }, + + "membrane_potential": { + "cells": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "variable_name": "v", + "module": "membrane_report", + "file_name": "cell_vars.h5", + "sections": "soma", + "enabled": true + }, + + "ecp": { + "cells": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "variable_name": "v", + "module": "extracellular", + "electrode_positions": "$COMPONENT_DIR/recXelectrodes/linear_electrode.csv", + "ecp_file": "ecp.h5", + "electrode_channels": "all", + "contributions_dir": "ecp_contributions" + } + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/lgn_nodes.h5", + "node_types_file": "$NETWORK_DIR/lgn_node_types.csv" + } + ] + } +} diff --git a/bmtk-vb/docs/examples/filter_graitings/network/lgn_node_types.csv b/bmtk-vb/docs/examples/filter_graitings/network/lgn_node_types.csv new file mode 100644 index 0000000..b745d0b --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/network/lgn_node_types.csv @@ -0,0 +1,4 @@ +node_type_id model_type ei pop_name +100 virtual e tOFF_TF15 +101 virtual e sONsOFF_001 +102 virtual e sONtOFF_001 diff --git a/bmtk-vb/docs/examples/filter_graitings/network/lgn_nodes.h5 b/bmtk-vb/docs/examples/filter_graitings/network/lgn_nodes.h5 new file mode 100644 index 0000000..9cf4c76 Binary files /dev/null and b/bmtk-vb/docs/examples/filter_graitings/network/lgn_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF15_6.23741017_-2.1430682_4.59332686_20.0_5.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF15_6.23741017_-2.1430682_4.59332686_20.0_5.0_ic.pkl new file mode 100644 index 0000000..fa77646 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF15_6.23741017_-2.1430682_4.59332686_20.0_5.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'28' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I28 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'\x00\x00\x00\x00\x00\x00$@\xe5\xef\t_\xa6\x15\n\xc0X\x96\x12\xdc\xe8\xf1\x12@\x94V\xdf\xf3\xd9\x985@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F6.23741017 +aF-2.1430682 +aF4.59332686 +aF20.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'\x00\x00\x00\x00\x00\x00$@\xe5\xef\t_\xa6\x15\n\xc0' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'X\x96\x12\xdc\xe8\xf1\x12@\x94V\xdf\xf3\xd9\x985@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF1_3.5_-2.0_50.0_140.0_5.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF1_3.5_-2.0_50.0_140.0_5.0_ic.pkl new file mode 100644 index 0000000..120b663 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF1_3.5_-2.0_50.0_140.0_5.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'33' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I33 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'\xe4\xd9\xca\xd0\xf6\xe9\x00@@\x9b\x95e^\x8b\xf3\xbf\x83t\xc0\xb7\x87=K@\x9f\x04\x974\xf4\xfa_@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.5 +aF-2.0 +aF50.0 +aF140.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'\xe4\xd9\xca\xd0\xf6\xe9\x00@@\x9b\x95e^\x8b\xf3\xbf' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'\x83t\xc0\xb7\x87=K@\x9f\x04\x974\xf4\xfa_@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF2_3.5_-2.0_10.0_100.0_25.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF2_3.5_-2.0_10.0_100.0_25.0_ic.pkl new file mode 100644 index 0000000..e0df452 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF2_3.5_-2.0_10.0_100.0_25.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'23' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I23 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'\xc4\xd8\xdb,\xecu\t@\x90s\x9f@[@\xf2\xbf\xa7\xc3uSz\xd83@=22\xc6\x82\x01W@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.5 +aF-2.0 +aF10.0 +aF100.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'\xc4\xd8\xdb,\xecu\t@\x90s\x9f@[@\xf2\xbf' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'\xa7\xc3uSz\xd83@=22\xc6\x82\x01W@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF4_3.5_-2.0_10.0_60.0_15.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF4_3.5_-2.0_10.0_60.0_15.0_ic.pkl new file mode 100644 index 0000000..1169817 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF4_3.5_-2.0_10.0_60.0_15.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'36' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I36 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'\x0f\xc1\xd3.\xa9\xd6\t@\x9cs\xeaCo\x8a\xfa\xbf\xdf+S\xcf\x06?6@.n1\xaf\xd8\x0cL@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.5 +aF-2.0 +aF10.0 +aF60.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'\x0f\xc1\xd3.\xa9\xd6\t@\x9cs\xeaCo\x8a\xfa\xbf' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'\xdf+S\xcf\x06?6@.n1\xaf\xd8\x0cL@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF8_3.5_-2.0_10.0_60.0_15.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF8_3.5_-2.0_10.0_60.0_15.0_ic.pkl new file mode 100644 index 0000000..beeab7b --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sOFF_TF8_3.5_-2.0_10.0_60.0_15.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'27' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I27 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'x\xb5\x19\xb0S\x01\n@\xa2\xf8\xad\xa3\xe2\xf0\xfa\xbf\xb4(>\x99\xb4\x082@\x93\xe3#a\x91\x9bI@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.5 +aF-2.0 +aF10.0 +aF60.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'x\xb5\x19\xb0S\x01\n@\xa2\xf8\xad\xa3\xe2\xf0\xfa\xbf' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'\xb4(>\x99\xb4\x082@\x93\xe3#a\x91\x9bI@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF1_3.5_-2.0_50.0_140.0_15.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF1_3.5_-2.0_50.0_140.0_15.0_ic.pkl new file mode 100644 index 0000000..a30284c --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF1_3.5_-2.0_50.0_140.0_15.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'34' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I34 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'\xac\x99\xd5o \x00\xf0?p\x06\xcc\x14\xe5\x8d\xdc\xbfN\x94\x0c\x11FCL@a\x9a\xc6\x1f\x1c.a@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.5 +aF-2.0 +aF50.0 +aF140.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'\xac\x99\xd5o \x00\xf0?p\x06\xcc\x14\xe5\x8d\xdc\xbf' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'N\x94\x0c\x11FCL@a\x9a\xc6\x1f\x1c.a@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF2_3.5_-2.0_50.0_140.0_5.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF2_3.5_-2.0_50.0_140.0_5.0_ic.pkl new file mode 100644 index 0000000..ee5e0a7 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF2_3.5_-2.0_50.0_140.0_5.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'25' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I25 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'\xad\x99\r\x83\x1b!\x11@0^n\x8a9\xd7\xf6\xbfnj\xac8\\5?@4\xf1\x1f(\xff!a@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.5 +aF-2.0 +aF50.0 +aF140.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'\xad\x99\r\x83\x1b!\x11@0^n\x8a9\xd7\xf6\xbf' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'nj\xac8\\5?@4\xf1\x1f(\xff!a@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF4_3.5_-2.0_30.0_60.0_25.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF4_3.5_-2.0_30.0_60.0_25.0_ic.pkl new file mode 100644 index 0000000..7d090b6 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF4_3.5_-2.0_30.0_60.0_25.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'13' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I13 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'\x86`\x1e[\x98\xc0\x0c@F\xc6mO\x88\x08\xfd\xbf\x81\xeac5E\xc2>@\x8ez\xb0\x02\xe2-M@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.5 +aF-2.0 +aF30.0 +aF60.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'\x86`\x1e[\x98\xc0\x0c@F\xc6mO\x88\x08\xfd\xbf' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'\x81\xeac5E\xc2>@\x8ez\xb0\x02\xe2-M@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF8_3.5_-2.0_10.0_20.0_25.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF8_3.5_-2.0_10.0_20.0_25.0_ic.pkl new file mode 100644 index 0000000..0400266 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/sON_TF8_3.5_-2.0_10.0_20.0_25.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'20' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I20 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S"\xd6gZ/_\xa4\r@\x9c\xa6':\xba\x0f\xfc\xbf\xc4\xae\xfd\x1a\xcf\xe1)@P\xb1\x10\x070G<@" +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.5 +aF-2.0 +aF10.0 +aF20.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S"\xd6gZ/_\xa4\r@\x9c\xa6':\xba\x0f\xfc\xbf" +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'\xc4\xae\xfd\x1a\xcf\xe1)@P\xb1\x10\x070G<@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/tOFF_TF15_3.44215357_-2.11509939_8.27421573_20.0_0.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/tOFF_TF15_3.44215357_-2.11509939_8.27421573_20.0_0.0_ic.pkl new file mode 100644 index 0000000..2f28d88 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/tOFF_TF15_3.44215357_-2.11509939_8.27421573_20.0_0.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'8' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I8 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'\xd4\xd5\xb09\x85\x88\x0b@\x94\xbc\xd1k\xbf\xec\x00\xc0X\r\xae\x85\x1a\x8a @\xa4\xf9\xd7&\xd2\xfd3@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.44215357 +aF-2.11509939 +aF8.27421573 +aF20.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'\xd4\xd5\xb09\x85\x88\x0b@\x94\xbc\xd1k\xbf\xec\x00\xc0' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'X\r\xae\x85\x1a\x8a @\xa4\xf9\xd7&\xd2\xfd3@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/tOFF_TF4_3.5_-2.0_30.0_60.0_15.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/tOFF_TF4_3.5_-2.0_30.0_60.0_15.0_ic.pkl new file mode 100644 index 0000000..cf5eb79 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/tOFF_TF4_3.5_-2.0_30.0_60.0_15.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'14' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I14 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'\xb9(t\x90\x91\xc4\n@\x82\x14\x98\x0e\xb7t\x01\xc0\xfa\xdc\xe6\xd7p(=@g.\xfaNl\xaeM@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F3.5 +aF-2.0 +aF30.0 +aF60.0 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'\xb9(t\x90\x91\xc4\n@\x82\x14\x98\x0e\xb7t\x01\xc0' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'\xfa\xdc\xe6\xd7p(=@g.\xfaNl\xaeM@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/optimized_params/tOFF_TF8_4.222_-2.404_8.545_23.019_0.0_ic.pkl b/bmtk-vb/docs/examples/filter_graitings/optimized_params/tOFF_TF8_4.222_-2.404_8.545_23.019_0.0_ic.pkl new file mode 100644 index 0000000..5dc8198 --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/optimized_params/tOFF_TF8_4.222_-2.404_8.545_23.019_0.0_ic.pkl @@ -0,0 +1,139 @@ +(dp0 +S'sopt_msg' +p1 +(S'After ' +p2 +S'20' +p3 +S'function evaluations, TNC returned:' +p4 +S'Converged (|f_n-f_(n-1)| ~= 0)' +p5 +tp6 +sS'sopt_nf' +p7 +I20 +sS'sopt_res' +p8 +cnumpy.core.multiarray +_reconstruct +p9 +(cnumpy +ndarray +p10 +(I0 +tp11 +S'b' +p12 +tp13 +Rp14 +(I1 +(I4 +tp15 +cnumpy +dtype +p16 +(S'f8' +p17 +I0 +I1 +tp18 +Rp19 +(I3 +S'<' +p20 +NNNI-1 +I-1 +I0 +tp21 +bI00 +S'!\x83\xbb\xc9\xbb\xdf\x10@)\xfcJOk=\x03\xc0`\x08\xcaL\x9e\x0c!@x\x1fQa/?7@' +p22 +tp23 +bsS'init_prms' +p24 +(lp25 +F4.222 +aF-2.404 +aF8.545 +aF23.019 +asS'opt_wts' +p26 +g9 +(g10 +(I0 +tp27 +g12 +tp28 +Rp29 +(I1 +(I2 +tp30 +g19 +I00 +S'!\x83\xbb\xc9\xbb\xdf\x10@)\xfcJOk=\x03\xc0' +p31 +tp32 +bsS'prms_bds' +p33 +(lp34 +(F1.0 +F10.0 +tp35 +a(F-10.0 +F-0.05 +tp36 +a(I2 +I100 +tp37 +a(I2 +I200 +tp38 +asS'opt_delays' +p39 +g9 +(g10 +(I0 +tp40 +g12 +tp41 +Rp42 +(I1 +(I2 +tp43 +g16 +(S'i8' +p44 +I0 +I1 +tp45 +Rp46 +(I3 +S'<' +p47 +NNNI-1 +I-1 +I0 +tp48 +bI00 +S'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' +p49 +tp50 +bsS'opt_kpeaks' +p51 +g9 +(g10 +(I0 +tp52 +g12 +tp53 +Rp54 +(I1 +(I2 +tp55 +g19 +I00 +S'`\x08\xcaL\x9e\x0c!@x\x1fQa/?7@' +p56 +tp57 +bs. \ No newline at end of file diff --git a/bmtk-vb/docs/examples/filter_graitings/run_filternet.py b/bmtk-vb/docs/examples/filter_graitings/run_filternet.py new file mode 100644 index 0000000..21cfa1d --- /dev/null +++ b/bmtk-vb/docs/examples/filter_graitings/run_filternet.py @@ -0,0 +1,21 @@ +import sys +from bmtk.simulator import filternet +from cell_loaders import load_cell + + + +def run(config_file): + config = filternet.Config.from_json(config_file) + config.build_env() + + net = filternet.FilterNetwork.from_config(config) + net.set_default_processing(load_cell) + sim = filternet.FilterSimulator.from_config(config, net) + sim.run() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/examples/point_120cells/build_gids.py b/bmtk-vb/docs/examples/point_120cells/build_gids.py new file mode 100644 index 0000000..b27cd1d --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/build_gids.py @@ -0,0 +1,4 @@ +from bmtk.utils import sonata + +sf = sonata.File(data_files='network/v1_nodes.h5', data_type_files='network/v1_node_types.csv') +sf.nodes.generate_gids('network/gids.h5') \ No newline at end of file diff --git a/bmtk-vb/docs/examples/point_120cells/build_network.py b/bmtk-vb/docs/examples/point_120cells/build_network.py new file mode 100644 index 0000000..ece34c1 --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/build_network.py @@ -0,0 +1,90 @@ +import numpy as np + +from bmtk.builder import NetworkBuilder +from bmtk.builder.aux.node_params import positions_columinar + + +def random_connections(source, target, p=0.1): + sid = source['node_id'] # Get source id + tid = target['node_id'] # Get target id + + # Avoid self-connections. + if sid == tid: + return None + + return np.random.binomial(1, p) # nsyns + + +LIF_models = { + 'LIF_exc': { + 'N': 80, + 'ei': 'e', + 'pop_name': 'LIF_exc', + 'model_type': 'point_process', + 'model_template': 'nest:iaf_psc_delta', + 'dynamics_params': 'iaf_psc_delta_exc.json' + }, + 'LIF_inh': { + 'N': 40, + 'ei': 'i', + 'pop_name': 'LIF_inh', + 'model_type': 'point_process', + 'model_template': 'nest:iaf_psc_delta', + 'dynamics_params': 'iaf_psc_delta_inh.json' + } +} + + +net = NetworkBuilder('cortex') +for model in LIF_models: + params = LIF_models[model].copy() + positions = positions_columinar(N=LIF_models[model]['N'], center=[0, 10.0, 0], max_radius=50.0, height=200.0) + net.add_nodes(x=positions[:, 0], y=positions[:, 1], z=positions[:, 2], + **params) + + +net.add_edges(source={'ei': 'e'}, + connection_rule=random_connections, + connection_params={'p': 0.1}, + syn_weight=2.0, + delay=1.5, + dynamics_params='ExcToInh.json', + model_template='static_synapse') + +net.add_edges(source={'ei': 'i'}, + connection_rule=random_connections, + connection_params={'p': 0.1}, + syn_weight=-1.5, + delay=1.5, + dynamics_params='InhToExc.json', + model_template='static_synapse') + +net.build() +net.save_nodes(output_dir='network') +net.save_edges(output_dir='network') + + + +input_network_model = { + 'input_network': { + 'N': 100, + 'ei': 'e', + 'pop_name': 'input_network', + 'model_type': 'virtual' + } +} + + +inputNetwork = NetworkBuilder("thalamus") +inputNetwork.add_nodes(**input_network_model['input_network']) + +inputNetwork.add_edges(target=net.nodes(), + connection_rule=random_connections, + connection_params={'p': 0.1}, + syn_weight=4.2, + delay=1.5, + dynamics_params='ExcToExc.json', + model_template='static_synapse') +inputNetwork.build() +inputNetwork.save_nodes(output_dir='network') +inputNetwork.save_edges(output_dir='network') diff --git a/bmtk-vb/docs/examples/point_120cells/config.json b/bmtk-vb/docs/examples/point_120cells/config.json new file mode 100644 index 0000000..446a688 --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/config.json @@ -0,0 +1,75 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$NETWORK_DIR": "$BASE_DIR/network", + "$MODELS_DIR": "$BASE_DIR/../point_components", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/../NWB_files" + }, + + "run": { + "duration": 3000.0, + "dt": 0.001, + "block_run": false, + "block_size": 1000.0 + }, + + "inputs": { + "LGN_spikes": { + "input_type": "spikes", + "module": "csv", + "input_file": "thalamus_spikes.csv", + "node_set": "thalamus" + } + }, + + "reports": { + "membrane_potential": { + "cells": [0, 20, 60, 80, 100], + "variable_name": "V_m", + "module": "multimeter_report", + "sections": "soma", + "enabled": true + } + }, + + "output": { + "log_file": "log.txt", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "output_dir": "$OUTPUT_DIR", + "overwrite_output_dir": true + }, + + + "target_simulator":"NEST", + + "components": { + "point_neuron_models_dir": "$MODELS_DIR/cell_models", + "synaptic_models_dir": "$MODELS_DIR/synaptic_models", + "weight_functions": "$BASE_DIR/weight_funcs.py" + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/cortex_nodes.h5", + "node_types_file": "$NETWORK_DIR/cortex_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/thalamus_nodes.h5", + "node_types_file": "$NETWORK_DIR/thalamus_node_types.csv" + } + ], + "edges": [ + { + "edges_file": "$NETWORK_DIR/cortex_cortex_edges.h5", + "edge_types_file": "$NETWORK_DIR/cortex_cortex_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/thalamus_cortex_edges.h5", + "edge_types_file": "$NETWORK_DIR/thalamus_cortex_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/point_120cells/create_inputs.py b/bmtk-vb/docs/examples/point_120cells/create_inputs.py new file mode 100644 index 0000000..424e83e --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/create_inputs.py @@ -0,0 +1,5 @@ +from bmtk.utils.spike_trains import SpikesGenerator + +sg = SpikesGenerator(nodes='network/thalamus_nodes.h5', t_max=3.0) +sg.set_rate(10.0) +sg.save_csv('thalamus_spikes.csv', in_ms=True) \ No newline at end of file diff --git a/bmtk-vb/docs/examples/point_120cells/network/cortex_cortex_edge_types.csv b/bmtk-vb/docs/examples/point_120cells/network/cortex_cortex_edge_types.csv new file mode 100644 index 0000000..a1f1894 --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/network/cortex_cortex_edge_types.csv @@ -0,0 +1,3 @@ +edge_type_id target_query source_query delay syn_weight dynamics_params model_template +100 * ei=='e' 1.5 2.0 ExcToInh.json static_synapse +101 * ei=='i' 1.5 -1.5 InhToExc.json static_synapse diff --git a/bmtk-vb/docs/examples/point_120cells/network/cortex_cortex_edges.h5 b/bmtk-vb/docs/examples/point_120cells/network/cortex_cortex_edges.h5 new file mode 100644 index 0000000..0d5f178 Binary files /dev/null and b/bmtk-vb/docs/examples/point_120cells/network/cortex_cortex_edges.h5 differ diff --git a/bmtk-vb/docs/examples/point_120cells/network/cortex_node_types.csv b/bmtk-vb/docs/examples/point_120cells/network/cortex_node_types.csv new file mode 100644 index 0000000..c51a76a --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/network/cortex_node_types.csv @@ -0,0 +1,3 @@ +node_type_id ei pop_name model_template model_type dynamics_params +100 i LIF_inh nest:iaf_psc_delta point_process iaf_psc_delta_inh.json +101 e LIF_exc nest:iaf_psc_delta point_process iaf_psc_delta_exc.json diff --git a/bmtk-vb/docs/examples/point_120cells/network/cortex_nodes.h5 b/bmtk-vb/docs/examples/point_120cells/network/cortex_nodes.h5 new file mode 100644 index 0000000..6457fde Binary files /dev/null and b/bmtk-vb/docs/examples/point_120cells/network/cortex_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/point_120cells/network/gids.h5 b/bmtk-vb/docs/examples/point_120cells/network/gids.h5 new file mode 100644 index 0000000..782081a Binary files /dev/null and b/bmtk-vb/docs/examples/point_120cells/network/gids.h5 differ diff --git a/bmtk-vb/docs/examples/point_120cells/network/thalamus_cortex_edge_types.csv b/bmtk-vb/docs/examples/point_120cells/network/thalamus_cortex_edge_types.csv new file mode 100644 index 0000000..a52b948 --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/network/thalamus_cortex_edge_types.csv @@ -0,0 +1,2 @@ +edge_type_id target_query source_query delay syn_weight dynamics_params model_template +100 * * 1.5 4.2 ExcToExc.json static_synapse diff --git a/bmtk-vb/docs/examples/point_120cells/network/thalamus_cortex_edges.h5 b/bmtk-vb/docs/examples/point_120cells/network/thalamus_cortex_edges.h5 new file mode 100644 index 0000000..0c8e665 Binary files /dev/null and b/bmtk-vb/docs/examples/point_120cells/network/thalamus_cortex_edges.h5 differ diff --git a/bmtk-vb/docs/examples/point_120cells/network/thalamus_node_types.csv b/bmtk-vb/docs/examples/point_120cells/network/thalamus_node_types.csv new file mode 100644 index 0000000..2696543 --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/network/thalamus_node_types.csv @@ -0,0 +1,2 @@ +node_type_id model_type ei pop_name +100 virtual e input_network diff --git a/bmtk-vb/docs/examples/point_120cells/network/thalamus_nodes.h5 b/bmtk-vb/docs/examples/point_120cells/network/thalamus_nodes.h5 new file mode 100644 index 0000000..0173970 Binary files /dev/null and b/bmtk-vb/docs/examples/point_120cells/network/thalamus_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/point_120cells/plot_spikes.py b/bmtk-vb/docs/examples/point_120cells/plot_spikes.py new file mode 100644 index 0000000..54cee50 --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/plot_spikes.py @@ -0,0 +1,3 @@ +from bmtk.analyzer.visualization.spikes import plot_spikes + +plot_spikes('network/cortex_nodes.h5', 'network/cortex_node_types.csv', 'output/spikes.h5') diff --git a/bmtk-vb/docs/examples/point_120cells/run_pointnet.py b/bmtk-vb/docs/examples/point_120cells/run_pointnet.py new file mode 100644 index 0000000..272a598 --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/run_pointnet.py @@ -0,0 +1,16 @@ +import os, sys + +from bmtk.simulator import pointnet + + +def main(config_file): + configure = pointnet.Config.from_json(config_file) + configure.build_env() + + network = pointnet.PointNetwork.from_config(configure) + sim = pointnet.PointSimulator.from_config(configure, network) + sim.run() + + +if __name__ == '__main__': + main('config.json') diff --git a/bmtk-vb/docs/examples/point_120cells/thalamus_spikes.csv b/bmtk-vb/docs/examples/point_120cells/thalamus_spikes.csv new file mode 100644 index 0000000..dbb88b7 --- /dev/null +++ b/bmtk-vb/docs/examples/point_120cells/thalamus_spikes.csv @@ -0,0 +1,101 @@ +gid spike-times +0 43.1551580465,64.6936252553,204.361972241,215.263541486,299.919509136,401.176352442,454.53579683,477.147526245,561.795318503,671.634406285,707.731469845,847.466732207,868.361913846,946.13285932,1062.87184541,1144.14240527,1295.40247452,1369.03451297,1376.26666836,1425.29932853,1520.13641365,1553.08323964,1629.0870456,1759.86303039,1855.95347108,1904.12956432,1955.06970706,2087.24269103,2197.42488987,2219.63627347,2300.25299749,2331.77535107,2446.47740961,2586.21991351,2619.56551591,2700.01481839,2782.18320007,2950.46232486,2999.9229245 +1 56.0622460603,194.701257611,294.447271556,297.760936942,403.896338929,444.845209007,498.706201843,537.396107052,635.329982411,677.303784942,754.72852308,855.166817957,863.359358138,1019.6899961,1049.23330051,1116.69943585,1130.94059451,1146.69524467,1230.83947425,1292.1411585,1293.71929168,1351.11211792,1378.25787951,1410.61762385,1471.46588327,1509.4598565,1628.07132479,1719.36556528,1834.12437191,1907.16731101,1937.31932807,2039.22563645,2272.20960441,2380.22068267,2439.88837648,2526.48302379,2552.14184637,2622.84724615,2653.58930651,2698.95705703,2745.17178111,2815.74115623,2979.37530448,2999.36299258 +2 65.5775202783,91.674454988,174.62534922,254.825254624,315.077091821,454.533818941,505.831274431,642.677441768,720.191956717,804.554217681,931.37384201,992.946391276,1079.34163883,1134.20838235,1310.4901397,1339.37300933,1559.5388507,1680.76738226,1791.61710754,1813.62413985,1813.6288268,1925.75365082,2088.10237726,2137.04109601,2252.37144755,2360.76630183,2501.19314782,2551.23992775,2571.3784345,2572.06200657,2680.72558955,2708.83838574,2839.62610694,2899.52411114,2904.36900265 +3 114.05478478,158.302405787,248.553931734,284.381120061,293.836914721,386.273700048,476.810722011,482.916108344,494.770216622,593.177973146,649.181364607,678.441232704,700.324251629,775.742036869,783.899356762,914.723612685,942.079222882,970.28855766,1052.31891136,1061.55308037,1149.89939309,1208.47125568,1284.23406408,1325.16665191,1383.33282318,1494.28630293,1623.45200999,1659.89885204,1690.77623424,1761.21831821,1899.0861696,1952.76751243,2044.43671248,2092.88077021,2279.73353392,2404.35894348,2427.82298627,2485.24639356,2557.06795741,2647.02650826,2775.44572455,2862.65692696 +4 55.8390512698,102.122778619,176.829930774,249.645181102,333.082096924,345.575306151,446.796966486,446.99356031,547.702855815,665.134855497,689.392142398,719.389806575,761.882240116,942.500847725,989.310192876,1086.42309165,1121.29053682,1144.66157977,1145.90083321,1302.82136958,1314.60698575,1401.57724344,1462.98320811,1602.34289732,1670.78160081,1794.51733076,1795.39705272,1892.02691954,1980.41005093,2118.21522637,2208.0711883,2274.28370423,2356.01150739,2389.64759456,2429.13586474,2537.21048663,2663.77669206,2751.59794784,2812.13896781,2865.53338776,2874.62553522,2898.5609539 +5 200.298653474,220.273751647,322.981279071,457.445472626,512.226202626,669.017427775,788.012408668,872.28206113,975.414507728,1005.80574608,1108.0542654,1148.91672615,1204.14540552,1255.14794535,1276.40905019,1366.71771533,1411.44885303,1478.49712103,1550.78376337,1683.07555681,1773.85422433,1810.15746568,1879.48651799,1893.08762016,2001.22466097,2067.32174467,2142.67042884,2304.53351852,2373.8196105,2476.20757786,2632.20275183,2759.97459349,2845.55205725 +6 80.2563105627,102.408368462,109.526510933,228.585250311,263.805533504,285.311750676,359.130916935,418.821061566,486.991196124,526.709963211,622.050694581,798.359163423,823.214937441,863.911489263,887.635936785,930.32132988,1027.43504316,1058.15633433,1101.17654751,1210.5991363,1287.86436592,1358.39219642,1450.31685451,1548.47445859,1602.94108703,1626.10611575,1737.04740542,1914.14235137,2014.53009305,2083.7102025,2109.43186232,2146.22706358,2164.5417485,2273.93214287,2392.07880842,2397.37711786,2573.32118974,2696.85259918,2756.24099262,2825.38720378,2918.32432771 +7 102.086772278,229.247689292,338.817028872,366.755519934,384.486673844,459.031386122,575.476229271,693.241671435,724.427459679,826.784478947,930.2618606,1025.09549562,1092.79517303,1231.60801871,1242.19955572,1319.00094732,1512.35968799,1601.81579999,1721.6990921,1796.24445165,1862.38347444,1927.7312871,2011.69488897,2126.24391075,2239.11565375,2264.73597821,2367.47488892,2452.45566978,2598.27962385,2680.22861146,2718.81314026,2770.45620788,2924.91260574,2969.83054384 +8 152.728986238,180.403484256,321.280714163,396.614160953,409.402115077,468.604971054,571.451628351,596.120947705,685.705770681,750.198281386,779.82732382,798.673913924,846.176821612,902.050103298,980.656374798,1030.67795797,1096.83464295,1113.4481669,1169.46406064,1293.23122109,1304.26553893,1355.31759955,1419.55487834,1534.72200205,1568.48281166,1742.99481562,1860.28979828,1897.72749158,1991.76846076,2069.18798263,2192.86965393,2259.25304107,2367.81865348,2497.36235621,2632.15638054,2757.93961802,2852.14867545,2872.77612794,2914.9464887,2974.43638432 +9 33.7248236414,157.837971634,275.363663356,319.447858965,450.89212531,537.611092979,625.558697538,738.052823013,765.978996777,822.004544966,984.228228391,997.8380809,1042.68377807,1129.06012304,1229.99272097,1281.73650094,1342.29106121,1364.88460793,1453.33792954,1578.71257917,1678.04674785,1778.87634139,1934.77307468,1971.11403212,2026.57790707,2059.93779097,2139.29079157,2294.54033944,2323.20849573,2506.71563792,2568.20556854,2615.75369444,2623.87121889,2643.46570984,2657.25663458,2731.81313883,2781.29101533,2849.87295992,2905.23298579 +10 71.3452204722,201.184477424,305.219125096,318.522872375,387.474220502,417.105474996,566.744201959,581.313936971,669.762400604,730.273199881,772.753850347,800.727880581,822.351057638,937.749987378,950.819180529,1064.62176718,1115.29977337,1220.05671001,1312.33019127,1371.6358476,1507.59881519,1649.97724855,1756.32332084,1864.37970326,1926.69841002,2003.48542114,2099.63013152,2122.96934272,2195.77889381,2258.30756645,2314.07637769,2377.09394218,2422.57127214,2479.50553328,2545.43707961,2584.55081523,2585.78496145,2691.14134016,2722.79035934,2787.25012671,2850.08112676,2975.22294156,2992.04025885 +11 58.3069736434,231.898608719,336.994996856,399.587410421,533.175654993,729.338174228,748.850590235,809.003161982,888.190401717,1066.78031524,1098.20433463,1111.75693923,1189.02486406,1287.92059294,1326.54335027,1383.17259575,1444.10060723,1458.46882443,1564.69038237,1755.6839538,1776.77745001,1981.0926961,2109.30586069,2248.4319605,2327.55192494,2383.8021541,2403.59776826,2465.50523574,2537.54432105,2646.24889304,2682.21638722,2804.9172895,2926.90766606 +12 69.149662558,178.154033576,302.873125037,425.060498907,518.293554745,644.47167074,735.656050729,739.881193278,867.529043133,940.116590192,1009.61039137,1066.63875069,1244.49497153,1292.73667557,1356.72120327,1410.89922299,1447.65582573,1574.47262814,1644.24996862,1672.86762759,1697.90634187,1792.7049025,1859.63151172,1920.42847883,1975.04754649,2001.25005683,2110.87335861,2147.26543932,2233.07989009,2277.98546121,2293.62387576,2398.61340054,2439.14900848,2483.35939135,2642.75526596,2716.22251338,2739.56395232,2852.31914793,2944.40732177 +13 63.174448041,169.678054556,284.686814182,335.034481143,345.343596638,386.485825417,465.842763423,474.995150875,483.823075968,607.830876421,648.293663077,719.969236175,752.039648751,802.216368679,904.494721677,1005.22841077,1082.98993176,1106.46751331,1203.12346301,1296.93404263,1339.56689216,1468.53384538,1489.08120648,1548.72114099,1557.11551095,1582.60225409,1635.99790015,1636.07934736,1653.27145214,1720.92704215,1801.80964383,1876.99558564,1902.87257832,1968.7366058,2018.12108219,2097.23322938,2162.54037939,2215.80389559,2242.18367029,2437.85078752,2524.24550026,2525.28738027,2571.41032603,2636.06790252,2636.12518758,2657.76497173,2681.99154541,2753.04343983,2809.38412848,2889.58648121,2984.3595207 +14 44.4417555366,109.877930003,155.065458345,247.480833601,283.255144684,399.959458081,423.385621677,478.067605055,591.943021518,706.572405181,728.41166833,803.643462198,879.707938337,943.742519399,1026.52297207,1033.72081418,1154.59195021,1249.16566064,1305.51777338,1362.89653298,1421.1367822,1518.34491865,1609.38554279,1651.43600603,1718.89901531,1832.0594797,1879.60747174,1886.77431273,1916.18888146,2007.36735261,2076.47150059,2203.15860221,2295.8505636,2365.09079305,2503.85214644,2569.22922884,2665.83552544,2705.14089363,2737.07096991,2791.44504109,2891.55560174,2912.3133851,2978.4886553 +15 140.837220568,206.953741173,350.608603016,383.114091066,482.014906164,545.013631454,625.17483917,685.975117216,707.31300738,823.131442034,987.672959362,1036.49132604,1123.80289305,1180.16600486,1217.67722541,1234.19197849,1268.32686816,1379.53630735,1399.8567493,1478.96304873,1567.26036093,1663.00295666,1780.43976608,1882.13534501,1953.45994612,2001.9082227,2149.39425089,2245.52311702,2330.90955881,2398.06143211,2500.12359122,2590.29981951,2669.93391253,2736.62444488,2805.89870293,2924.36650468 +16 52.6067681024,107.399386788,236.532051672,343.642297288,458.479017577,568.028052334,675.411027031,739.586771761,790.28684491,943.895765709,1001.70704866,1156.9403871,1163.76209246,1164.22707369,1268.01912518,1304.17687675,1378.63174936,1415.49989932,1435.17167054,1487.41623888,1570.04644183,1721.73630009,1830.30496834,1979.3670819,2053.58140357,2217.12943327,2415.39595862,2500.34248158,2557.10067545,2631.78135148,2744.27474413,2861.8825322,2936.56507041 +17 123.555468335,215.989260074,236.421669534,318.342666586,390.344943493,507.796436402,581.5261499,665.450021158,764.297970705,846.730859123,935.57582108,1042.35055514,1190.68579341,1239.10970973,1306.55802653,1331.36336799,1398.02235897,1449.33671125,1532.33861983,1580.17688683,1691.59581821,1724.01604631,1757.28392198,1847.76165812,1945.30549072,2065.79864893,2154.14272402,2159.4649541,2161.72599569,2172.11909253,2288.51108334,2415.19849345,2500.10593475,2516.6183492,2582.74327603,2660.56241851,2672.36685584,2721.74477367,2865.52275324,2940.94150121 +18 51.1557875535,171.623096111,233.044100182,235.533576474,340.585250362,478.569835873,487.550365239,601.343896599,624.788081468,748.615869926,912.217709853,980.926912526,1073.93816209,1074.14467247,1150.46632458,1224.32557522,1283.54140642,1412.28298277,1519.44574215,1551.82639973,1568.08895965,1654.12682403,1799.07710703,1879.42105751,1986.04935567,2071.28849046,2179.13204832,2204.02174768,2219.87008196,2266.22284745,2411.12159993,2552.84608842,2600.95157917,2631.65527373,2663.54713223,2677.47986469,2808.89792216,2906.2102184,2945.6253547,2950.70673825 +19 174.092561544,262.817888611,411.062699675,476.407363421,493.189997347,507.463747009,563.977262475,605.302712531,730.332320941,781.088792489,832.093821279,881.051849562,938.150235763,1085.44726268,1168.04029446,1208.8648501,1241.46046465,1329.41306535,1393.5080572,1437.20843219,1458.17456664,1527.15659495,1551.51247347,1606.09810762,1649.1980658,1735.37140161,1813.12086989,1961.94703323,2004.10978377,2157.4480108,2164.91884752,2211.87009774,2230.19237972,2269.80484122,2376.77006533,2389.55351097,2485.88116523,2555.5271677,2715.11571533,2831.01183462,2958.12436462,2970.44733099 +20 55.8722182827,258.147294937,384.696200953,461.01681183,489.447083472,542.741638655,617.610013636,785.302515833,920.598843646,984.307505557,1056.78212295,1126.87461603,1127.50192211,1152.6047539,1238.72534389,1339.15846164,1377.91147797,1423.63915524,1444.03521243,1454.12833685,1533.94727975,1638.48687823,1797.47498055,1891.24124465,2048.84164586,2116.14461826,2245.25758801,2310.91339561,2414.01392463,2558.0216709,2673.251393,2696.24205717,2760.61067436,2777.29482528,2867.22246448,2950.51124045 +21 32.9856495062,136.650171329,220.363722073,300.379829376,344.13206563,465.387925821,533.156978402,664.876474953,744.079906742,771.838719599,788.944720133,813.551865285,850.737162582,875.47627633,984.770023687,991.059953502,1045.6285747,1053.13030124,1148.49137449,1284.75269984,1406.52908932,1476.79361238,1525.63319557,1537.77828026,1561.73300606,1652.25518627,1709.9783472,1786.06273959,1856.22212332,2003.19716431,2076.76375715,2088.26687154,2123.83395728,2159.41922047,2292.65402278,2294.29479763,2381.1439062,2384.4598486,2495.74465923,2561.23861363,2601.87683547,2656.55607013,2681.08574409,2700.40430192,2726.49994591,2747.78263455,2829.62708604,2848.33377551,2877.15490148 +22 79.1791322265,151.99262624,224.507175393,284.989313528,343.154390108,408.767937041,600.071141764,639.010909552,669.941978765,756.697109792,824.748227733,911.210961173,1023.30685809,1107.76410811,1236.81753958,1321.91355076,1406.07384028,1586.91677548,1719.18462345,1805.98753849,1865.71322797,1882.8835901,1965.15174383,2074.44641236,2103.10680034,2206.66361503,2315.77016564,2337.06438972,2475.06384582,2567.33449342,2678.65019241,2762.15096811,2885.01508435,2906.16812158,2990.92882638 +23 29.8516484899,74.1523972979,171.128041416,269.398250374,318.890340109,381.486140659,452.191591912,598.628730708,650.282552232,658.199254353,701.075909374,812.774698649,859.626229349,961.374417706,1034.33786606,1038.90874848,1184.93678542,1273.18477496,1320.09994451,1422.3899702,1443.27254381,1473.56275572,1589.9030424,1655.92909577,1687.51480395,1809.10298704,1851.19959903,1946.32559581,2013.27230463,2130.94466174,2152.0812738,2215.34725377,2215.64199489,2281.95794894,2315.56577499,2404.12418107,2414.19919782,2551.45800063,2640.22219779,2694.692587,2815.30912166,2896.48599711,2979.00848874 +24 119.221324834,146.107005312,190.9251428,292.77388625,389.853292831,485.196336259,492.323748833,540.555486615,546.562036598,691.190762019,771.772565664,842.403283916,855.240069511,859.069041246,888.721481729,953.127017875,1018.59234363,1044.04889831,1071.16909356,1133.26501482,1133.82219889,1200.54396243,1208.18202761,1213.79219668,1312.50993131,1365.15911567,1511.70817137,1612.64386883,1648.46799471,1755.76709206,1844.09022371,1952.39086058,1960.88379056,2004.01775427,2055.74657783,2217.5137365,2290.85937113,2325.60644882,2377.23876124,2391.69935408,2476.9980955,2535.72672403,2609.73230329,2766.28802869,2927.68577713,2974.09634054 +25 70.5004771979,163.680104131,172.693049619,240.437468201,299.97109676,364.53336092,485.989397981,598.128034396,657.265236162,695.560741961,745.280005093,783.052882565,829.551204206,853.207513844,961.35972207,1018.45423077,1054.73175032,1117.40530972,1157.36301875,1197.25799629,1300.26738174,1377.97648803,1504.65518807,1703.09338061,1805.50545285,1875.99941395,1930.92200078,1977.12816691,2054.00351037,2179.83154684,2239.32365782,2269.07036068,2374.58438786,2493.78444116,2536.02116979,2584.45725766,2597.31611198,2697.67102881,2784.71253842,2881.65782719,2907.89526987,2939.31553831,2948.87176635,2986.90568049 +26 81.9001129899,112.312111075,122.958498936,131.613628882,279.249851899,287.663133004,291.808865219,310.003295575,334.025611189,339.983514097,366.627550637,533.742901557,618.251057561,707.046537382,729.924298356,827.441161495,952.428918168,1064.45849728,1160.82031991,1223.18375678,1251.00867916,1292.24701612,1319.28203178,1319.94076725,1351.49184831,1381.544885,1454.70498375,1627.29596605,1679.66763587,1732.66217994,1786.37080485,1820.88062069,1864.92016121,1905.29090653,1958.6540474,2065.96451877,2101.18891067,2247.71249385,2255.86400693,2272.88229295,2390.93712134,2439.57774473,2445.36985274,2505.87838994,2556.93235211,2614.90574605,2717.80484437,2810.71753856,2932.57988549,2987.90512101 +27 99.0398253124,106.846475162,184.084676842,202.810402933,282.496579704,448.100929233,534.874069229,538.493365182,685.810415568,811.957568658,989.012631428,1069.61856607,1143.60767672,1281.03359705,1316.12249335,1339.81546589,1438.54804624,1563.62482602,1685.67798093,1720.40265087,1748.89852843,1776.07211598,1893.79427279,1911.91605334,1935.98410781,2017.9098153,2026.38986038,2085.34259275,2112.3590603,2135.6337109,2250.00268857,2272.01075872,2360.7216816,2494.42253392,2575.18649513,2631.51674119,2717.19284429,2881.20767833,2977.30167202,2989.87795505 +28 98.6051158346,173.314808687,276.263029939,335.535923121,412.85149723,560.289968513,649.52490889,718.452418451,843.316302214,895.156962793,1004.04848416,1046.59940366,1070.08069546,1123.98682864,1219.21006515,1228.95504476,1320.22853158,1369.88394048,1428.53444933,1531.45042845,1596.04483594,1732.8121629,1794.17809638,1816.32959381,1836.21805194,1851.04281278,1932.75810316,2002.38630128,2062.53492441,2116.33335276,2189.93336317,2230.9080276,2315.92066149,2348.65864042,2451.92923707,2518.28404111,2548.27398079,2727.36264439,2846.11091966,2927.53572067 +29 116.041201372,288.526116565,327.316765337,421.179465868,499.813262916,608.145161951,686.496857515,806.143654661,821.013127974,848.361308199,932.666890897,977.772083965,1053.55237527,1102.84203047,1170.57060268,1286.25962411,1427.37263731,1485.40647882,1594.84355588,1771.91638181,1917.29333785,2010.40662535,2129.83888242,2133.59788555,2228.6940987,2283.88245828,2347.41450757,2434.02872662,2540.29389802,2565.51052789,2646.32595411,2816.99390098,2852.79399518,2928.60784688,2940.66149807,2979.54281354 +30 67.7722401433,237.384616016,333.517234072,371.58110066,441.647126319,450.546724111,509.891833459,608.42517438,738.742605675,790.48733447,897.65188732,948.624899886,1023.66174256,1035.56734521,1128.57045508,1141.69606188,1268.96602893,1300.99554804,1400.68726473,1474.6395443,1509.9575789,1643.48327439,1763.26090018,1876.56068215,2022.73680977,2063.46877441,2135.79390031,2153.19225784,2221.98167977,2274.48293843,2286.90411158,2403.50718372,2426.71494928,2441.96152138,2508.693964,2666.61089309,2727.93322328,2841.84249385,2911.99715567,2942.21776582 +31 73.0848852342,113.704788406,115.873647886,259.212907482,377.268017916,416.941091668,554.269816455,664.991694023,729.210653668,769.565119622,834.257797618,897.158682107,1074.15021386,1113.13050211,1137.78962883,1205.61429311,1239.52653538,1297.60709327,1385.9504218,1441.82777753,1573.43471406,1631.87123155,1702.05933157,1840.81969541,1913.62627822,1943.34774068,2035.31496176,2104.06616271,2164.0248228,2301.48246798,2331.8978233,2466.39979081,2540.62037388,2572.8795507,2579.9966914,2647.19618634,2748.73679276,2754.24107988,2764.1663292,2838.00804422,2900.19913092,2905.54974591,2975.12901921,2984.35196254 +32 88.1152676488,105.367036537,225.491826952,322.539750049,362.532649858,529.578483283,547.742542675,614.915709614,616.607270786,625.609434865,635.555161815,698.426917964,780.47889245,796.846697477,925.791605691,983.421820264,1019.86565739,1132.09795188,1241.35171583,1243.0852695,1297.42211724,1411.51835845,1445.59980425,1500.73826942,1572.71576254,1650.19745255,1768.04074677,1882.51591615,1924.33808628,2151.0553833,2241.90602716,2353.25701518,2388.72540008,2532.42788238,2604.68940877,2717.13093139,2740.74638335,2870.79642452,2872.1878902,2919.25444963 +33 43.9707430114,64.2137946967,162.91054206,198.304541136,290.312142456,359.715071525,395.464098279,471.469063961,489.157463173,558.060716553,565.687036829,637.777569751,673.732352826,747.170501168,816.463630114,872.751713192,915.552884292,916.581487953,952.314135251,969.847675455,1067.10485837,1088.50198815,1255.87968061,1321.79531969,1335.9825865,1392.02477363,1437.00940888,1481.7798402,1575.55718975,1608.53355337,1690.33322356,1721.14632827,1798.45547639,1850.53965792,1902.91661628,2010.00955264,2026.72692646,2177.95345099,2315.69816743,2424.58919024,2442.30369456,2567.71129784,2675.08331027,2748.91116622,2802.32045025,2826.94705028,2947.43356846 +34 16.1678414701,58.95407622,139.155341545,209.720861916,316.385570507,359.276872447,462.10124036,540.45208225,690.275254149,713.01530554,718.583522297,776.235323722,809.73779925,956.961372496,976.32982171,1158.74710148,1336.07730263,1432.40425913,1473.01516535,1537.91034056,1716.1468513,1775.11642349,1795.19718685,1845.53548054,1878.19007806,2043.27697072,2086.75318564,2100.47355123,2165.56338505,2214.96512848,2399.88551281,2555.09584929,2631.20619932,2729.2979707,2803.84228284,2938.14977482 +35 30.359515527,99.841696419,203.542239399,224.290847408,292.106701366,316.131323196,404.554547713,602.070032207,662.093167556,677.666624018,762.342043455,772.905305299,858.402264185,961.207468549,1004.90253156,1019.45392701,1068.58189693,1080.28801625,1108.36191778,1126.63743194,1181.61986502,1225.97061776,1363.62864474,1436.09350539,1444.07619728,1534.59850988,1621.82814299,1688.64917665,1710.07521178,1823.16518177,1877.60178852,1932.93016022,2051.04724492,2148.42639865,2276.02246674,2413.34649098,2571.79985042,2630.82764625,2664.97444319,2789.28667465,2908.64604961,2984.23414969 +36 23.6203600503,103.135633361,247.233512958,327.511935933,401.259993212,535.522057,589.752456551,735.283017848,837.783181333,901.011417619,978.06779891,1151.35337263,1209.29481063,1349.32363337,1388.8106394,1497.55067472,1608.76980804,1702.32154929,1775.95953555,1914.31463707,1983.04332203,2140.57486858,2170.68610756,2270.07127799,2287.3072214,2376.50085825,2480.72102275,2550.71662636,2635.43547022,2644.78022379,2779.77250055,2788.58345623,2919.81552624 +37 58.6557236036,105.429694843,244.134781113,307.466607165,322.524644696,406.745979277,415.226162568,544.927770211,563.264692742,580.104083282,660.287968348,743.758116776,829.878202046,874.145282672,1015.0855123,1100.80337672,1212.86670112,1291.00606473,1329.67473095,1407.8061089,1548.57623021,1578.11115628,1634.97884304,1706.08988234,1747.96327328,1813.56989476,1885.84809919,2061.51692343,2119.41684569,2153.77781753,2159.69377588,2194.01372088,2248.89913145,2334.1307642,2432.53542053,2478.76034909,2545.99916095,2608.97194658,2648.67840053,2693.64185174,2750.40223888,2826.18522635,2887.19125646 +38 82.3964132938,224.551596888,236.311320583,344.653046847,373.924839571,453.221449194,534.717120328,569.459439864,715.312349055,754.033637987,767.12799291,835.548902687,847.72767982,932.658344161,1032.31579687,1100.29295756,1134.01663756,1278.44981137,1340.1124544,1402.36273773,1500.50905404,1649.19938019,1791.11532539,1858.04494683,1874.75255987,1960.93076003,2078.22930719,2154.79186592,2247.77328556,2361.30557118,2420.70193459,2446.72250953,2501.87374271,2563.6309567,2682.67899622,2795.10005218,2896.09043572,2955.46080283,2964.19338716 +39 135.313266975,148.128192038,229.074755217,333.823256059,425.930202752,450.656963534,532.309002877,603.676187457,626.204322807,709.44472059,911.191877533,1000.54464208,1029.68082798,1059.26997317,1100.94127146,1129.90390286,1211.56711313,1237.81828999,1315.04414311,1317.2098175,1354.87322937,1459.47914666,1547.96074988,1566.01160147,1591.43363106,1630.43514145,1658.04104759,1772.13481762,1884.36146827,1965.79488687,2092.52643971,2248.94217672,2324.10274434,2595.23621694,2648.59270118,2789.91426943,2858.67536225,2963.47089936 +40 61.0224401014,146.456061212,156.949179436,225.140976376,296.109845487,348.015645765,475.375393574,579.724592868,625.489299928,813.761726848,915.589272572,955.923676571,990.715864268,1103.13322176,1113.82649368,1194.64845761,1205.59950791,1340.3772606,1417.46568707,1503.16102366,1568.91810191,1599.26637413,1639.52112542,1671.67450877,1722.24058344,1850.49579779,1938.64837777,2070.71145774,2153.94508953,2154.80223307,2233.51811853,2246.56180809,2247.75378046,2338.09655392,2450.69269891,2467.30437686,2538.1503032,2555.4006641,2560.84927836,2658.61494828,2687.77986166,2694.9907299,2715.04157012,2728.84545214,2829.00594753,2876.62011017,2946.20228421 +41 147.684264517,158.126619046,198.283585045,289.071974553,327.989171547,391.273170656,464.969739127,496.223582616,616.522796125,759.041083782,817.161512743,864.377604575,927.702225413,975.266888093,1081.0063879,1182.57672089,1328.37969484,1411.35150228,1416.08000165,1512.0909569,1595.43802522,1704.15598803,1764.02535449,1833.49528179,1867.68089315,1891.18323943,1963.46890195,1992.833279,2076.62698095,2158.13749949,2222.88353258,2307.42334329,2371.96990211,2476.23407534,2507.09635258,2560.65073732,2586.79911238,2734.83416259,2738.30714253,2807.5926449,2909.85278687,2958.21142797 +42 58.7622801487,111.279702604,147.365073961,184.288568134,245.499234449,360.059112483,450.41097148,453.304954735,519.873157541,538.79892998,562.808727059,623.358506038,650.902718597,708.714902761,730.168077228,793.634945082,885.641459788,914.780750149,996.672339515,1027.08352071,1087.34018731,1104.68219274,1234.3832745,1323.68234264,1406.0541622,1512.35234072,1590.69878528,1706.74367894,1817.38417324,1917.94103235,1919.24423015,2014.90105934,2027.17868566,2104.4917423,2207.7415946,2242.69266724,2271.38368169,2333.35778077,2359.56019259,2436.60509576,2499.43753481,2520.14148012,2634.4099962,2763.39226793,2842.2801784 +43 60.2737641232,127.92531707,181.974341577,320.365258687,410.667856824,425.868495478,476.702581198,550.107630731,667.934690991,793.060909119,892.358193126,930.79356931,969.57637225,1126.03523828,1132.48058781,1234.24728923,1355.25431029,1420.90444578,1444.02013753,1456.82502314,1461.79680394,1518.43252292,1558.12825939,1602.08689498,1667.81535687,1766.10602677,1870.82074221,1882.84157497,1979.11212606,2105.10880524,2169.21530806,2292.14896058,2316.68355154,2484.45857556,2563.02680807,2649.8257696,2733.12033387,2855.39125577,2958.33913751 +44 103.349475957,165.081646907,263.145389047,301.545363897,304.676495583,405.352219555,444.371768711,449.885895418,526.663742694,622.87098036,720.970556404,753.985480451,836.045835358,858.180150235,926.124343409,989.005464935,1108.36869505,1286.11900826,1319.76852774,1405.03790246,1410.01273373,1488.6129555,1582.94634375,1623.19967788,1662.27538731,1788.21944098,1872.560753,2017.09891244,2055.65288983,2061.64513111,2115.7602776,2131.0871137,2178.58536631,2181.36215431,2263.0840695,2345.63899468,2430.44301195,2534.31709717,2605.01378226,2647.21548394,2733.98872917,2760.00839773,2778.80126991,2838.21974005,2840.37981551,2961.77874245,2963.51436045 +45 42.7935127731,144.495829086,230.991806582,231.234176036,240.325223542,260.365714847,334.630290939,459.782393271,489.44195684,552.328475263,603.776098288,644.551932036,729.350991017,841.963108346,864.603165234,918.441941163,999.682803726,1128.48374608,1136.06884336,1219.41031431,1279.75002631,1281.64780712,1364.64817416,1415.22803899,1463.65600129,1575.09808079,1620.16400947,1731.09938997,1764.60156866,1826.88385182,1867.40763992,1911.46013213,1950.3192658,2003.88158368,2086.78093024,2170.28069082,2191.14854678,2310.10955617,2467.7558662,2577.30953958,2582.90322928,2672.02162215,2734.61623802,2799.56309008,2804.55549314,2846.611553,2909.92340364 +46 90.0473532198,144.096423227,176.690365129,350.141877071,398.713861969,482.295258406,566.129909001,653.850161056,692.067774321,751.728024358,844.03636842,906.58593294,957.564060651,973.687018478,1099.93873462,1238.93599982,1401.41787038,1445.1575429,1487.85677806,1521.8208737,1557.20406549,1616.46658625,1619.87796188,1632.17528279,1681.89147987,1828.44923289,1899.00344726,1922.0027295,1961.31903111,1997.49030062,2082.06734518,2163.49263327,2164.22637307,2310.20740052,2381.37169712,2468.20822995,2603.60959788,2621.83690647,2709.93022283,2777.56881882,2850.44081064,2882.16047147,2886.01060967,2890.48443682,2896.46991806 +47 19.730106492,107.295260375,237.478724686,307.392366705,348.962537355,484.96458749,618.107343797,707.845148112,805.167560712,922.040456082,1016.56411491,1159.87847945,1247.93797261,1288.3990163,1310.42508824,1367.13021703,1489.18037537,1600.98856019,1686.98296874,1733.43260533,1741.42098966,1772.79682414,1850.01842028,1924.52739493,2016.30512243,2094.39306619,2109.98419034,2144.122784,2303.11145083,2387.9061067,2391.02663262,2425.59802588,2577.54433997,2638.19533875,2732.39725226,2812.88849411,2902.3720074 +48 58.2352222928,214.260141117,278.574379699,316.47300224,413.189019055,449.271395267,550.136112276,651.631803036,704.732660698,767.0460345,825.004502475,834.114418473,850.500622269,957.109690059,1036.67997899,1058.94854536,1148.42633209,1184.17114466,1244.44899743,1267.38172378,1282.12756899,1328.96516656,1503.09826315,1513.39878922,1588.65588928,1745.14390547,1795.99359013,1887.96581862,1942.69532526,1952.63654832,2091.49224998,2232.69975855,2281.67038403,2345.02501794,2360.64579287,2385.73178002,2414.69405575,2507.35490417,2581.64420011,2669.07825907,2671.79348425,2748.31702798,2802.54154539,2826.24227192,2956.20503384 +49 108.486529196,129.60601783,252.480623495,308.872556702,363.080687418,401.615991839,408.489113726,489.50385831,553.769320586,592.297220062,675.258293601,691.393018908,726.694403418,732.197147091,750.341490328,866.062461424,1002.83951948,1056.88542962,1167.26669803,1219.8296377,1305.05385122,1400.8371917,1501.30871057,1606.40426653,1692.711312,1696.01749142,1758.79342653,1879.82895673,1930.42778787,2037.3009578,2112.99299631,2128.28603969,2227.77243471,2282.62326228,2301.05866271,2362.41090114,2383.33031105,2440.2570311,2599.17914128,2631.49769613,2639.49623919,2765.23286001,2793.9057686,2913.43902512,2962.15341892 +50 2.73134579127,37.7457817996,172.863664206,383.916949499,461.499607728,492.438248913,575.31522034,621.478533613,778.622966626,898.441797063,947.125758149,1013.78604705,1042.73731619,1066.96486253,1131.25706053,1160.89533992,1271.12187749,1398.39148042,1553.40726141,1593.62420882,1671.74690018,1692.12019158,1693.53083529,1749.96287442,1808.20857598,1922.24956506,2052.3612045,2081.96472261,2208.63442925,2237.73247914,2262.05339656,2346.66693607,2407.6340485,2501.1820986,2546.32566104,2607.33070898,2613.64205828,2666.82356274,2765.34480775,2974.79950251 +51 16.8273185624,115.961655319,285.102974369,333.509599857,382.593737803,441.829314997,479.512059625,590.516166319,712.121200799,731.583141682,889.678663818,990.535802397,1050.87377497,1194.52522249,1218.14947691,1287.21919927,1365.01348402,1450.15115594,1483.64109958,1537.82365306,1589.08041784,1638.78771246,1798.888588,1934.56024789,2039.57054176,2093.51472126,2095.83726308,2189.51213417,2254.24916859,2262.64588392,2288.04844189,2348.13537017,2493.00878483,2588.63301234,2624.97125491,2721.82351605,2854.99197848,2919.89344047,2972.35573514 +52 41.4887063886,89.167463494,109.607605486,116.069596261,231.820247639,237.332190713,317.905069628,400.045148636,410.451369407,482.887848866,604.463395184,635.840708106,738.939159978,822.000139557,874.222663042,1021.0780118,1077.13682509,1113.46572679,1116.96173273,1210.78501243,1271.48402882,1383.71892475,1462.02927711,1549.63114473,1646.96796251,1671.19313998,1727.35811227,1727.55859648,1869.12664108,1990.98563859,2024.11001793,2117.8397787,2200.0007637,2240.09902246,2383.29404996,2466.42139497,2538.61968892,2611.43131959,2615.18675391,2624.65364241,2710.62665741,2725.41244223,2735.72050033,2787.66639286,2889.36141473,2934.07575336,2971.00456793 +53 108.512344878,140.523857495,215.268620559,252.890083629,327.126170292,336.531054466,388.437873884,464.616009411,575.266733993,679.889214879,693.864633314,732.321960332,738.447326877,755.441539899,840.853743729,918.811795781,950.815849393,1029.79744197,1126.2164891,1202.69418234,1255.09943455,1360.77220164,1420.33789018,1485.39964296,1562.69203033,1656.37273208,1850.6102349,1922.01315865,1955.5270855,2011.70263093,2048.68022361,2089.26258947,2107.75510064,2200.01099874,2212.45126677,2247.38138076,2435.22580619,2468.82342523,2531.76842788,2595.20179774,2722.80861247,2859.90611082,2984.7710838 +54 13.7610833518,41.1704045316,42.881267096,181.316278276,293.158126444,370.700268637,408.412335884,470.102078139,534.977119776,669.506810856,743.555923905,846.684759264,877.185901341,1015.95299372,1065.00354176,1106.13203742,1263.56018061,1353.25635485,1425.64230969,1551.75085636,1638.18625215,1647.55429729,1716.38601963,1852.54382576,1992.79512284,2006.06489035,2117.00484309,2266.07201137,2370.88429002,2426.97359952,2589.02469386,2751.93472779,2925.41295499,2970.14690226,2977.45361086 +55 98.6876439688,177.760247247,237.216648533,346.711149216,476.546313958,479.849884133,579.389126359,615.037067647,758.422243873,798.974612728,926.642631744,1013.34623649,1056.6946636,1171.17133666,1234.68041005,1302.36934491,1327.90376955,1370.91204597,1453.48513442,1503.72570614,1587.89557866,1620.91543279,1741.95740501,1804.79646394,1841.06419817,1941.81493633,2049.00261943,2126.52639395,2223.27573633,2352.89201544,2462.76898824,2590.12366494,2757.93129949,2836.11976203,2927.10825784,2964.26919506 +56 81.5229713162,206.298066246,297.33031152,360.315301053,446.409596065,567.050543569,649.244395024,719.799561626,750.777023167,790.339494169,863.57464461,898.328144088,980.623140323,1062.30520068,1209.08354476,1282.34925754,1332.98802797,1340.53787042,1377.45766881,1476.68114284,1491.25384729,1512.88188062,1567.40135171,1603.10048128,1640.26111023,1754.35859712,1871.24314469,1995.15474284,2021.89213527,2036.69782347,2091.41100035,2208.6052277,2281.50970188,2305.33574418,2320.14809692,2349.23587561,2440.20336518,2473.32914861,2494.28108973,2716.03196758,2748.67167602,2770.26906974,2879.12185862,2976.76520315 +57 10.3627876688,47.631154009,201.488449974,232.602818528,257.023764518,294.299976439,375.376639335,422.470785821,581.833399986,726.916196503,757.836066629,879.799602868,969.928783259,1032.77199287,1082.00951458,1192.639482,1284.11346032,1375.88660878,1475.04051298,1513.81652728,1611.16537806,1674.96859544,1704.8593038,1741.20849411,1881.12684177,1905.33854198,2028.65054426,2105.68102585,2165.38178153,2172.78076223,2248.93513391,2272.79139283,2308.3151936,2394.38560255,2429.5028145,2459.50197202,2542.23938454,2631.72342904,2696.68439999,2736.00414195,2751.85589529,2805.14307098,2908.20383226,2973.11698668 +58 105.698252915,122.721975556,128.905089271,268.604260204,390.543480301,483.410482464,528.520600869,620.607298937,665.981768271,812.883644785,909.195433179,1034.42267739,1087.92424755,1093.56743897,1180.60900879,1185.60912942,1372.89261912,1444.74658775,1490.31218332,1574.60871591,1622.20231487,1630.51642722,1800.58767148,1972.95838015,2033.14279777,2153.92332947,2210.66843846,2229.24410541,2349.89386924,2478.516511,2588.59266983,2688.32372103,2832.5448009,2888.72733758,2915.924378 +59 69.2020688235,99.220781461,138.48170307,193.486525873,302.723338223,348.875727265,381.945813513,449.528323594,498.493972089,510.499372827,512.812059333,593.166689259,716.58094069,731.379648043,739.267489698,753.869525676,880.782808434,924.435064582,1050.2414258,1137.20849061,1258.0097786,1321.42958098,1442.40968701,1456.60288745,1505.01245808,1519.53099316,1682.83714625,1753.4547251,1841.26262499,1904.33429924,1917.17210497,1985.93809696,2041.20646111,2053.30216431,2075.176683,2117.09524355,2155.91515742,2161.58996221,2268.09827712,2349.71566424,2438.02237466,2523.71520641,2581.40174895,2594.16995155,2618.23518724,2796.10409886,2893.46719788,2943.65327738 +60 46.2557069875,240.548585426,331.738694548,388.855539968,514.135468926,592.137168698,656.319912826,716.55400385,794.629743688,800.051135004,931.953178807,1076.646059,1101.09622412,1108.83110101,1192.75459018,1224.62121314,1297.20663491,1368.16606666,1430.17040957,1520.48366993,1556.73586907,1599.86557134,1683.68458333,1781.38617337,1815.55057181,1907.42640645,2004.82672302,2007.28045731,2068.94908209,2112.68762414,2132.87833391,2251.18666938,2254.55926923,2263.42412589,2299.36879637,2315.73517777,2319.63281257,2419.74799451,2511.02247056,2616.9184045,2706.53176549,2743.18408093,2849.52602763,2953.56333283 +61 111.366083469,178.829563942,299.857078173,344.514835639,475.494333366,542.654377354,608.177095206,777.517375908,879.892337356,901.727703846,938.541265964,1043.91163764,1058.43047967,1157.5726512,1216.21777797,1312.87438385,1381.27117247,1409.87048714,1464.00265124,1540.66927711,1587.9927822,1615.11937506,1713.133099,1729.13967852,1785.38259891,1818.68107654,1866.12846246,1940.78609067,1970.53435106,2096.65371045,2175.24325347,2181.6130213,2221.18177258,2226.93187767,2339.89489765,2449.67429659,2477.65185185,2534.98748669,2603.76277645,2760.81382238,2874.92347479 +62 98.5135405792,173.424018235,255.051751416,255.679944579,281.618943298,366.24433282,465.646492158,524.273946443,643.640789495,688.414811348,701.658108323,742.253835153,821.345755635,906.602511098,1036.82922373,1159.57490904,1216.89129258,1230.85331578,1335.78998459,1347.02096062,1464.56828299,1483.20176917,1483.90063298,1492.59957958,1544.31338315,1633.56688831,1715.4466693,1786.50370127,1883.86821168,1952.2727152,2018.38378975,2133.70549961,2204.51887283,2232.25336782,2297.40158232,2306.97326499,2352.36534415,2395.03413625,2522.6967019,2682.30059033,2751.04831788,2899.35116887,2950.71812665,2985.02773253 +63 162.315509682,189.069595685,305.106873927,412.096579172,447.380422665,551.954470134,679.175158275,738.491740087,798.062109304,856.838982832,875.799587393,937.50151175,1003.02215506,1058.88309915,1083.99665604,1163.14083695,1209.75150711,1314.1348484,1377.06426805,1472.2578142,1496.13193758,1531.16059251,1557.18067598,1664.45394174,1788.6345884,1940.62993998,2052.45113052,2075.84719998,2112.29616524,2231.67169758,2372.95237978,2378.1244773,2426.37787553,2544.40943266,2558.02222445,2682.53078923,2697.49219976,2771.99260775,2856.49596529,2893.83468189,2915.58530748,2926.78367101,2940.54670204,2948.84702843 +64 59.966707023,114.167094958,156.975496494,228.121969209,294.780423566,326.121409347,387.466761898,496.773931093,554.011890225,639.941337896,712.497712579,839.533308953,945.281236671,974.87828556,1042.07342137,1068.12189035,1137.82541245,1255.88911803,1292.72620388,1303.56650357,1373.93809738,1390.12819215,1414.21331211,1472.57250994,1518.53814707,1656.74745605,1718.16403125,1782.57835058,1847.23297621,1901.21238044,1987.25216575,2095.41291699,2142.55880304,2176.04051514,2221.34238088,2332.4691358,2420.93715014,2454.69242736,2540.4949087,2570.68596736,2640.43705394,2724.56897128,2809.61133023,2886.42071508,2925.27486503,2949.07430773 +65 92.2135470542,233.114941063,248.026839459,271.159472638,392.30954726,483.022816954,561.501717877,570.169805009,667.489905694,690.004337105,749.764960597,774.997227624,780.001431591,803.465890634,1009.38229187,1091.6866232,1190.09902481,1271.76399056,1362.73130118,1443.03673994,1472.69364984,1641.55735653,1746.87343571,1800.75008584,1921.67605778,1929.09622649,2010.66437131,2200.38649176,2220.59952343,2242.85327403,2334.01524336,2456.64750271,2531.79419663,2629.62506555,2690.67680362,2879.59125484 +66 54.8341211689,165.553362455,192.802677459,253.231691544,323.018327239,504.54200408,575.97407255,638.647983539,669.979768339,767.465947721,857.483237275,932.921432734,933.464230899,1020.46282802,1065.33218945,1078.39499492,1125.22241652,1208.76393832,1227.40719068,1353.81181875,1402.03379918,1531.38442719,1687.22412146,1733.03098868,1843.66102834,1851.56147375,1951.7935648,2014.7046456,2062.93084568,2161.16876909,2272.2870366,2337.47292776,2407.29479437,2501.48971909,2547.99369332,2572.101155,2632.64633841,2786.26623834,2803.14287611,2901.95784258,2984.29537738,2988.28128623 +67 92.592112436,203.556226872,234.730307078,398.343349177,472.388687107,578.260098389,643.794862231,680.128384897,704.237266165,769.667901948,814.841969056,824.104844958,970.865792653,1002.98554018,1045.13600994,1114.29495092,1260.26596094,1374.50869548,1404.86744882,1446.63394417,1503.33613402,1549.69188359,1563.01681033,1619.45373225,1695.26452052,1721.75940493,1819.54903405,1858.23024343,1973.87446489,2051.09919913,2171.04189215,2285.51881671,2415.29485711,2468.3611582,2565.12277853,2624.35750149,2686.82403804,2754.07113622,2862.28641312,2934.68073053,2936.1688585,2976.36745291 +68 143.277078518,184.796397739,267.571205653,361.01169636,422.155865862,512.412049016,697.239770721,722.033229681,776.696891996,930.974154211,957.696459885,991.720901016,1073.63190445,1126.31587871,1205.36630585,1320.51407869,1398.68978759,1484.71317624,1520.17796075,1622.2084927,1760.0322019,1818.60608345,1961.62454431,2006.28828989,2030.65483756,2080.2794357,2140.18436321,2275.63668065,2318.57114477,2358.64121673,2383.01714577,2530.90278533,2586.6175761,2646.76369763,2682.8067245,2709.85723827,2768.53540045,2864.72756515,2871.0867755,2961.12478569 +69 78.3597775011,192.844925696,271.934347702,337.464777067,446.008177178,532.715881573,621.320273027,717.640123352,767.097394192,804.684171914,857.546543473,1018.0319936,1059.99230342,1105.69028688,1185.98388707,1290.67034047,1331.64858565,1367.24878915,1367.77892541,1410.70203606,1457.83221834,1514.70009257,1610.73438942,1763.35043542,1797.18344404,1870.01041725,1941.83480526,1997.95598575,2073.30082322,2151.12096711,2213.22218708,2240.50126362,2399.70416959,2430.34862572,2468.70860797,2470.66736271,2676.18395746,2705.6096193,2789.75751771,2806.75378105,2824.94391479,2908.58605159,2911.88447286,2924.52621528,2967.76726322 +70 87.4112702411,174.263380339,242.385763572,247.478402375,330.169740002,392.960607951,491.711145301,513.238629847,539.567445687,615.377037764,674.208719713,701.939360993,847.76121708,906.167219475,948.896501482,971.113920794,976.623099371,1010.9240599,1114.77220021,1206.30840544,1283.25343335,1355.32787366,1473.20425693,1649.20447319,1695.74489447,1711.42121565,1807.60151766,1827.06638508,1928.87218085,1930.97502377,1996.7114637,2025.27593179,2056.49304744,2114.35980151,2188.29968449,2242.31769373,2353.10746012,2421.30794585,2489.45734994,2493.74337742,2611.21927573,2723.89028618,2867.32102081,2893.31392825,2894.1252266,2962.34584565,2990.53395905 +71 72.6176043766,167.727275187,294.747585627,392.780280483,418.417406741,458.617648037,502.710536201,535.152902362,573.31974006,575.346804441,622.620513065,709.799268305,732.739550228,802.573112402,827.594698716,851.913488332,918.814350136,1033.07880291,1131.21945258,1139.91431282,1270.53661531,1354.52681228,1463.01833797,1545.69880589,1585.97325915,1804.44223776,1859.64743324,1940.46103477,2008.96304422,2012.40971021,2084.3267726,2088.41171635,2227.39857324,2260.52353204,2299.19863686,2422.31533008,2557.01378528,2633.33035415,2691.74309787,2842.33587863,2955.1087163 +72 6.34543178196,106.702985105,167.362748741,257.502138836,310.713504299,470.147357669,502.344087974,595.459489596,706.276934682,767.204412281,827.494779034,953.462758377,1089.24199716,1194.67961238,1239.55589094,1333.5619078,1476.34469814,1639.34938542,1700.06866414,1752.69564887,1851.77495623,1881.68118734,2006.84444287,2066.46106838,2128.73716514,2147.76859316,2249.20799628,2299.27294052,2425.35493383,2436.15873724,2468.20751148,2479.79451279,2510.93880176,2580.44704335,2666.15786286,2703.13452573,2763.79368017,2775.04165193,2873.25126971,2893.70026928,2975.8557326 +73 39.7809931966,112.673909305,125.765303862,261.253565968,340.819198951,430.644092707,511.04564423,612.438509087,699.918319151,728.329061755,857.736799029,945.892825272,995.36476819,1077.50952374,1128.38469219,1189.88700411,1212.11070288,1351.93140796,1398.31378135,1480.1100782,1530.04041202,1550.37061145,1638.57452362,1696.46394624,1727.05792973,1855.69108898,1898.66951686,2034.23955875,2086.52423947,2192.46223388,2253.63887802,2352.57284671,2458.42801664,2606.71411334,2630.71914562,2724.39526588,2759.84235002,2814.73442547,2857.21914534,2975.2010531 +74 12.8477444242,69.527344893,156.140672184,297.527062103,338.605025743,383.466749432,398.296662057,495.123657151,562.236759087,677.29305081,706.556959441,797.701410002,831.428001337,902.540328384,916.24367437,969.625923802,1010.76776661,1122.56157732,1168.77168949,1276.33651587,1346.83215099,1484.80872747,1517.32814234,1593.90971025,1636.07285253,1738.69624406,1778.64772204,1822.16838338,1839.93187501,1905.22133677,1947.11822853,1990.11304479,2108.70737947,2166.77320912,2218.75852361,2296.95002938,2388.73942984,2410.55815778,2555.93373526,2576.41956931,2666.30997679,2685.69487061,2749.96589126,2751.30192029,2773.59348551,2891.93564896,2938.10716085 +75 81.3661619941,169.542877593,243.718480802,334.061452735,443.885426026,480.571130827,579.120218081,650.632444946,706.303614714,727.017855271,820.696452383,932.396765432,948.749168343,1033.40040904,1117.733284,1164.74694837,1249.76089791,1400.88819848,1537.94284752,1584.18961475,1684.53641321,1716.54271163,1748.70810056,1764.85678925,1889.57088919,1949.79253655,2073.02160027,2090.88378632,2164.97165793,2233.18762158,2349.34505408,2485.92345879,2642.79248704,2699.93368151,2721.0867863,2820.92187216,2884.15695396,2886.55369859 +76 139.297678943,194.670231982,222.49638448,308.668560754,422.228741663,526.147643691,564.874423922,661.592551227,668.014551142,679.493668643,796.059305681,863.240863545,940.374203392,1011.1576583,1089.99005487,1227.81901719,1264.43784768,1416.24562459,1446.82337132,1491.85666129,1545.00156867,1570.98991555,1646.33107286,1730.69180493,1777.56364353,1843.76259964,1891.45016676,2018.12651727,2139.63389909,2215.34412887,2256.00826543,2293.56076361,2357.41578703,2439.80699719,2481.48127594,2577.12982486,2627.70087366,2716.78596482,2733.93376413,2829.40818829,2835.61795568,2993.03287234 +77 103.681226617,206.535427308,241.773652304,342.0867257,501.628049885,524.870650608,675.176823005,714.759791485,728.557022809,831.346595708,949.747931142,954.322895084,1033.25079455,1160.12448625,1172.65348394,1336.60553443,1419.55911639,1494.43119704,1615.89481053,1806.881819,1879.61928937,1973.37933568,2013.83215058,2108.0842603,2183.6805011,2221.39145808,2302.00770208,2363.2262126,2500.62962161,2612.65247886,2738.31020177,2797.82537849,2857.93379339,2892.41861554 +78 165.416861239,245.37907778,253.136391997,333.858339231,401.340704136,479.190617616,593.532533281,670.273995359,721.800394125,833.836043805,870.992365416,908.378025814,968.628767143,982.341580498,1027.2314199,1120.00284304,1244.58410498,1270.5253273,1357.86761127,1371.86943366,1563.15861522,1663.28929096,1685.83773812,1712.83935355,1861.01345128,1935.49399554,1983.86667627,2016.0639059,2090.93421285,2100.88207132,2195.60570836,2257.61451446,2335.6343813,2449.43326593,2494.20109846,2547.94412303,2618.90124526,2632.19494191,2684.53325351,2711.68366107,2714.78888897,2755.90338532,2874.79915946 +79 38.0381929857,50.8819208066,145.975347294,228.974456526,236.488000175,296.027315113,341.628705543,377.053764812,449.67636051,574.592615949,690.690703299,775.849887447,803.835461616,929.492319601,1086.73058031,1128.63338426,1222.18705278,1331.10622635,1403.09261116,1423.1966981,1474.09282617,1619.03476458,1684.96534656,1712.96713866,1818.06767407,1868.87546997,1988.69151204,2073.31535796,2087.28097462,2158.03993586,2285.6394609,2346.98087737,2389.14552627,2427.37687874,2587.60153735,2649.82110919,2650.8315052,2829.16918693,2902.75930349,2905.13921857,2926.25346315,2976.94622504 +80 35.6945153724,73.2336642654,168.028512424,204.439691318,215.590853697,278.974137395,343.017119946,408.684813915,512.624077196,647.526103227,755.393274976,890.813325771,1015.27475726,1035.22453369,1132.86203024,1148.1735454,1254.35025408,1402.7984408,1416.43601328,1493.46319054,1523.47177626,1554.53661302,1599.77520656,1705.81182397,1778.60133399,1799.35802957,1951.15716735,1996.38551416,2007.73128397,2141.0713558,2169.39718979,2178.48704129,2315.88357725,2366.02171171,2463.56106707,2598.10511398,2682.7445843,2810.4117976,2931.7444648 +81 61.4563122587,82.8779643297,195.536857621,267.526334124,312.033582066,363.710012238,400.757883176,466.934517981,483.95257373,585.834912561,703.322300024,759.982032671,871.306226517,1028.40427137,1079.31236201,1115.95773938,1170.10999757,1236.96396011,1354.20934596,1437.5113565,1558.24654027,1575.38647718,1608.01406385,1650.60436813,1671.49466345,1782.59910124,1858.06847639,1975.48380289,2032.64641385,2040.04972311,2098.43351078,2146.18330716,2336.32646407,2475.24532773,2521.73252126,2561.15360696,2674.08648334,2752.78663584,2835.08196786,2896.26877234 +82 35.1898296356,127.357398826,142.197073152,203.965102909,254.538386429,304.84796513,382.688844431,389.321742594,480.10390439,611.464206317,638.177444451,683.128173402,769.334842459,813.688835582,836.706326603,900.952933969,960.438774609,1149.71358724,1271.99672592,1381.21136462,1564.87331506,1607.51237955,1608.40925784,1641.0152705,1781.54330234,1883.26494168,1907.13053277,2040.90595691,2072.45027982,2139.74596311,2173.40157976,2254.73441981,2259.45100512,2340.78583851,2396.26323858,2586.88930709,2739.27334266,2812.50576868,2891.5304653,2947.51976733,2958.3573472 +83 59.058638668,119.250726831,225.767300465,432.133101622,549.072495204,656.736284695,678.062257725,712.71665243,739.535652469,772.318546216,857.364811926,925.923401082,1045.20044086,1211.26535289,1286.74568068,1400.24538808,1430.38492224,1433.61077726,1638.12993017,1673.62399851,1692.79363286,1698.39914128,1721.36060081,1729.10202375,1787.46877564,1788.88102279,1973.64793356,2034.86974214,2041.11659154,2043.25177812,2117.15497225,2119.96317276,2158.23138159,2272.13513784,2396.56690584,2468.32671381,2630.5293214,2631.98222881,2750.18454298,2775.5766833,2883.50898279,2953.04909451 +84 56.9014944805,98.8402262186,107.01167561,156.612825628,205.861863207,231.850887889,360.701181016,375.379658984,453.695127065,557.349895516,587.076520479,728.79492565,789.640452416,894.416288068,925.240203966,1030.42129985,1059.64261399,1161.62435951,1194.07845689,1260.94672055,1294.07033175,1447.28992028,1465.68862381,1556.63350935,1672.20014705,1776.80823441,1802.08408702,1804.35545755,1942.61942994,1947.01579445,2025.24877344,2066.60083218,2071.54407591,2201.40146504,2273.68929166,2346.6553085,2352.90070955,2378.61209638,2419.44962725,2445.26695496,2466.75163717,2548.25748709,2612.67897955,2667.77162124,2846.29514684,2924.59083904,2937.88659257,2955.96867009 +85 117.010020781,215.546814478,339.300274424,421.702226968,422.831689127,424.864084595,557.610183031,586.554035374,597.497397278,620.628458564,639.19218088,771.734790646,865.862408633,1018.06457341,1087.37289312,1174.9704742,1293.46796814,1383.62364234,1528.64200124,1534.889051,1536.9555148,1544.8812914,1580.56513099,1671.55343119,1733.88203194,1759.5380829,1861.23493705,1965.34967061,2113.71208839,2224.0550419,2242.73011396,2246.3861849,2308.71606277,2356.27700718,2454.8410085,2527.62082724,2570.08024172,2659.7125471,2712.74816266,2784.98562443,2849.52073483,2856.88074491,2953.22488953 +86 116.607328788,204.420565007,215.18919846,242.377490335,247.67501239,281.351286416,354.952979188,447.495328738,505.023443303,551.040021767,636.888106133,664.367188003,748.794499048,852.780787768,913.668332722,990.004195491,998.824400896,1028.58232897,1048.73135235,1164.00756511,1281.65721233,1367.489951,1438.34366217,1518.08545909,1542.36235159,1661.17754206,1780.06155462,1783.57001076,1907.13785997,2013.6868284,2040.82804876,2089.9312544,2182.44787414,2238.57439017,2257.01968706,2344.51469923,2451.35978102,2455.29227395,2528.40180317,2672.18186091,2777.22465685,2790.15296863,2847.76495913,2912.44721269,2941.39608224,2948.63116485,2989.48651747 +87 54.6738365442,211.294849524,246.178595052,274.703099546,370.269864155,432.620685976,466.084307863,533.417012599,627.486765076,742.509535651,798.354928341,877.642378416,951.416338552,1104.40247419,1120.59585006,1308.88713648,1362.62784096,1414.34306427,1532.02574194,1601.92925695,1687.38254976,1797.70349121,1858.23873693,1934.34841002,2069.49883068,2103.38767381,2156.60498319,2292.16750804,2400.70040299,2472.79297943,2500.97891104,2589.04989748,2664.93962866,2681.97739505,2785.70648147,2910.29634289,2940.0468287 +88 23.3492558607,98.9949006759,186.472578565,204.553506325,268.143303289,346.429106689,361.880804039,385.456561812,459.319113782,542.919343142,636.883178033,749.386803221,853.24083153,952.179332085,1067.77903663,1099.91166226,1115.48343372,1231.67549743,1277.35045276,1437.31230286,1497.40386784,1604.09635464,1630.3320813,1726.34134491,1772.79486565,1807.42172805,1841.47026374,1961.37023178,2017.91241497,2124.33557598,2199.95678692,2322.15598178,2332.43639921,2414.43091691,2463.90277495,2487.57302677,2554.991415,2625.18618427,2736.56739057,2778.19110468,2860.05870583,2922.01949243 +89 84.0768181297,202.426848452,303.01255032,379.955585792,518.516605387,607.764211826,630.253925524,719.586900801,779.795606252,809.989892957,881.059880103,908.99243449,982.277783049,1033.85745963,1123.97661648,1173.51768702,1335.92414711,1423.64347506,1488.67989199,1620.78790284,1645.74146619,1703.79133155,1704.37163104,1704.92474181,1744.48068067,1792.03661946,1862.37777107,1875.13268371,1971.26993713,2006.64434765,2127.13867554,2184.39332669,2208.72012255,2329.05623441,2459.30940028,2636.12912767,2672.21242239,2700.0611683,2738.40068821,2800.68835798,2838.44647992,2888.35278603,2959.72257514,2972.01928585 +90 159.512680913,208.210597193,314.751628518,413.325450691,539.19396133,584.104732463,628.182256763,643.170248059,707.575736314,717.032746004,808.028458058,843.437549242,918.113544227,943.984216049,949.756797305,1050.92143711,1124.58056936,1213.42214712,1309.79795017,1444.19518652,1449.05281661,1473.8198939,1504.36001092,1571.95778872,1621.23944439,1629.62555812,1696.76932348,1766.39031181,1859.81329739,1929.5115321,1950.90942376,1984.54497227,2113.09782264,2180.62523212,2205.88403025,2351.85290499,2450.91234722,2463.36274722,2503.60263374,2611.66148277,2612.7895106,2638.88201434,2689.11577356,2716.1144091,2747.77304026,2755.67921972,2826.90984118,2836.62017445,2883.59194572,2949.56620961 +91 23.4266567736,75.733900041,166.638791792,215.37325353,277.23708622,337.664654035,470.614719932,572.57553374,595.749931834,702.418308288,746.176978959,848.377530533,952.528578672,1162.03327114,1169.80330972,1327.04013757,1457.53616106,1528.39489654,1539.82255441,1606.44008475,1647.92925819,1753.106516,1771.79771211,1783.40702414,1820.59154,1844.32767974,1898.01769644,1927.91525347,2045.44568613,2062.58460987,2113.10661904,2172.92534702,2242.08722142,2324.93088279,2384.70265928,2452.61031556,2516.0464458,2590.1261851,2628.13578414,2636.85261854,2717.57305116,2792.23778363,2866.61250961,2968.60088352 +92 19.7456634587,81.7838093794,107.003083024,283.87347609,363.699236008,476.136618574,591.545938011,757.085281648,766.712980945,864.774952808,1002.30359424,1116.1407782,1228.08115835,1282.04436915,1305.14751553,1394.30283836,1413.49988534,1557.51781461,1642.11367174,1711.02050547,1764.11515036,1849.85078212,1914.92067556,1953.43612455,2040.4033836,2102.11798182,2140.65962129,2282.81872141,2364.53897075,2423.25360099,2455.48109239,2554.78206593,2598.00233869,2695.51893585,2764.51889421,2856.99083048,2878.92840407,2961.10941818 +93 108.091117443,153.014404134,211.297865078,236.181073621,377.025056415,528.965499674,573.808796833,598.57375666,688.799467623,747.330620195,795.649358904,892.305643575,945.316603032,975.947672478,1047.12340992,1128.13288495,1174.74759862,1228.04299746,1273.81288954,1382.52443769,1415.7899558,1557.32127388,1608.49634424,1701.50331241,1718.8252771,1775.64306406,1871.16881774,1882.89175226,1895.31978063,1978.99982221,1994.20839077,2034.46020737,2150.37177419,2188.32208924,2255.76937121,2316.0950042,2329.75792947,2453.35032767,2482.6724268,2506.81456057,2569.92568038,2578.54891528,2613.65140824,2666.07755275,2775.77355514,2832.44797442,2856.15793256,2864.2328178,2970.37696016,2988.85558511 +94 27.8472057707,111.781170864,142.569277234,228.910974013,331.877227193,339.802201573,414.241644351,540.931565366,620.750966084,732.783646957,827.28222456,887.551416518,935.97699685,1062.27855151,1147.47845265,1217.05727029,1332.47931353,1424.98096014,1477.34982873,1478.72766585,1565.69518899,1601.09729031,1656.08371921,1808.77459825,1852.04085839,1930.03972218,1995.30971605,2009.77284939,2084.02867554,2182.573336,2206.01466818,2266.72960926,2361.83468063,2426.52864323,2442.06999083,2499.31422222,2566.02781617,2569.77236221,2574.50385966,2660.91562689,2792.18683621,2827.40952561,2896.82769347 +95 56.1225142014,144.072181801,255.691473502,326.726621101,455.652504247,526.300087533,608.126168045,682.070777224,719.177926842,732.002643806,736.626774966,747.428852381,780.697368897,884.174639454,1035.54609858,1091.34791863,1121.73180142,1158.95419493,1190.65880455,1222.32476292,1427.74533574,1565.55207258,1697.99065645,1800.22864209,1839.04205968,1912.43086659,1972.64442846,2004.55969736,2047.2753226,2063.64896745,2142.75882269,2258.17463992,2304.36907368,2406.96079504,2530.30061365,2575.12911055,2580.93689405,2688.1249952,2792.04161023,2889.39071677,2972.0074201 +96 25.4506533377,55.5975626074,250.09988038,290.620324584,384.689002694,405.009521135,414.698613312,426.786076854,510.654607297,599.510209783,647.342239504,659.1246418,784.317412147,799.197461176,898.936152026,1029.84446577,1060.19988317,1117.15549251,1132.25429409,1166.69599513,1289.5507282,1367.40198076,1374.79503721,1384.77748989,1394.07541817,1492.89405033,1524.54337863,1560.24120733,1721.72236774,1822.39001846,1874.50087726,1939.07802347,2021.0347574,2154.99648771,2241.16321427,2253.97049175,2352.53186239,2442.97029505,2484.64024802,2561.63810251,2574.1953953,2735.05011577,2757.63917825,2835.37780721,2836.38189891,2839.91950656,2939.02954847 +97 13.1095849578,63.8714931559,131.593021504,230.246316526,277.318168769,279.020565305,312.695689667,418.957429504,491.648816457,603.547856152,665.726491146,681.584987764,719.803846703,736.233163195,743.565887089,766.860231689,779.469814693,902.769748177,989.299235845,1076.13082769,1191.82202534,1378.71896367,1497.12554362,1674.66952461,1807.49133877,1811.71570124,1857.59614127,1930.991083,1991.96817256,2056.37044046,2089.59809597,2187.56867795,2343.65093817,2377.28168404,2384.3085468,2463.56253965,2600.48683991,2609.84500404,2738.90928165,2783.83518774,2883.43001381,2920.32512042 +98 123.643676735,145.57154596,224.712331391,298.954871529,363.543095006,444.719175918,612.052677103,676.509778741,770.024966041,888.472136019,943.780145803,983.784744647,989.315046252,1074.42280612,1119.28449922,1130.15562935,1135.27071057,1170.68474613,1249.28457214,1347.4849869,1376.76819138,1424.34049899,1583.98652122,1677.56420334,1736.04746417,1848.76939604,1952.01579229,1984.54992964,2009.94005189,2030.35516097,2083.00712371,2226.86902912,2299.67980519,2404.06828938,2434.45618438,2436.11907414,2478.19942233,2607.26504122,2678.4695351,2752.01356638,2840.51588429,2993.53503158 +99 75.4816175537,128.099078038,183.299435013,229.660930978,339.073499984,375.150326917,384.867380726,409.185507032,437.782307911,503.345469455,529.382635744,584.037172813,679.230548698,785.060333599,835.44659826,837.782265266,855.088256756,868.407944354,903.757027299,977.481825641,1052.26621505,1085.58950241,1127.48953393,1200.51718853,1213.63563459,1231.93464998,1277.47750597,1389.74284317,1486.27959913,1593.79079777,1608.61549095,1722.70452992,1828.34002737,1857.01141089,1930.46238816,2054.15893392,2121.70220625,2220.42500482,2306.48885729,2374.99472737,2482.85875758,2508.17311781,2569.77001815,2618.48680476,2707.45523921,2801.76062118,2920.3090467 diff --git a/bmtk-vb/docs/examples/point_450cells/build_network.py b/bmtk-vb/docs/examples/point_450cells/build_network.py new file mode 100644 index 0000000..1cf8a7a --- /dev/null +++ b/bmtk-vb/docs/examples/point_450cells/build_network.py @@ -0,0 +1,178 @@ +import os +import numpy as np + +from bmtk.builder import NetworkBuilder +from bmtk.builder.aux.node_params import positions_columinar, xiter_random + +#build_recurrent_edges = True + +# List of non-virtual cell models +bio_models = [ + { + 'model_name': 'Scnn1a', 'ei': 'e', + 'model_template': 'nest:iaf_psc_alpha', + 'dynamics_params': '472363762_point.json' + }, + { + 'model_name': 'Rorb', 'ei': 'e', + 'model_template': 'nest:iaf_psc_alpha', + 'dynamics_params': '473863510_point.json' + }, + { + 'model_name': 'Nr5a1', 'ei': 'e', + 'model_template': 'nest:iaf_psc_alpha', + 'dynamics_params': '473863035_point.json' + }, + { + 'model_name': 'PV1', 'ei': 'i', + 'model_template': 'nest:iaf_psc_alpha', + 'dynamics_params': '472912177_point.json' + }, + { + 'model_name': 'PV2', 'ei': 'i', + 'model_template': 'nest:iaf_psc_alpha', + 'dynamics_params': '473862421_point.json' + } +] + +point_models = [ + { + 'model_name': 'LIF_exc', 'ei': 'e', + 'model_template': 'nest:iaf_psc_alpha', + 'dynamics_params': 'IntFire1_exc_point.json' + }, + { + 'model_name': 'LIF_inh', 'ei': 'i', + 'model_template': 'nest:iaf_psc_alpha', + 'dynamics_params': 'IntFire1_inh_point.json' + } +] + +# Build a network of 300 biophysical cells to simulate +internal = NetworkBuilder("internal") +for i, model_props in enumerate(bio_models): + n_cells = 80 if model_props['ei'] == 'e' else 30 # 80% excitatory, 20% inhib + + # Randomly get positions uniformly distributed in a column + positions = positions_columinar(N=n_cells, center=[0, 10.0, 0], max_radius=50.0, height=200.0) + + internal.add_nodes(N=n_cells, + x=positions[:, 0], y=positions[:, 1], z=positions[:, 2], + rotation_angle_yaxis=xiter_random(N=n_cells, min_x=0.0, max_x=2 * np.pi), # randomly rotate y axis + rotation_angle_zaxis=xiter_random(N=n_cells, min_x=0.0, max_x=2 * np.pi), # + model_type='point_process', + orig_model='biophysical', + **model_props) + +# Build intfire type cells +for model_props in point_models: + n_cells = 75 # Just assume 75 cells for both point inhibitory and point excitatory + positions = positions_columinar(N=n_cells, center=[0, 10.0, 0], max_radius=50.0, height=200.0) + internal.add_nodes(N=n_cells, + x=positions[:, 0], y=positions[:, 1], z=positions[:, 2], + model_type='point_process', + orig_model='intfire', + **model_props) + + +def n_connections(src, trg, prob=0.1, min_syns=1, max_syns=5): + """Referenced by add_edges() and called by build() for every source/target pair. For every given target/source + pair will connect the two with a probability prob (excludes self-connections)""" + if src.node_id == trg.node_id: + return 0 + + return 0 if np.random.uniform() > prob else np.random.randint(min_syns, max_syns) + + +# Connections onto biophysical components, use the connection map to save section and position of every synapse +# exc --> exc connections +internal.add_edges(source={'ei': 'e'}, target={'ei': 'e', 'orig_model': 'biophysical'}, + connection_rule=n_connections, + connection_params={'prob': 0.2}, + dynamics_params='ExcToExc.json', + model_template='static_synapse', + syn_weight=2.5, + delay=2.0) + +# exc --> inh connections +internal.add_edges(source={'ei': 'e'}, target={'ei': 'i', 'orig_model': 'biophysical'}, + connection_rule=n_connections, + dynamics_params='ExcToInh.json', + model_template='static_synapse', + syn_weight=5.0, + delay=2.0) + +# inh --> exc connections +internal.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'orig_model': 'biophysical'}, + connection_rule=n_connections, + dynamics_params='InhToExc.json', + model_template='static_synapse', + syn_weight=-6.5, + delay=2.0) + +# inh --> inh connections +internal.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'orig_model': 'biophysical'}, + connection_rule=n_connections, + connection_params={'prob': 0.2}, + dynamics_params='InhToInh.json', + model_template='static_synapse', + syn_weight=-3.0, + delay=2.0) + +# For connections on point neurons it doesn't make sense to save syanpatic location +internal.add_edges(source={'ei': 'e'}, target={'orig_model': 'intfire'}, + connection_rule=n_connections, + dynamics_params='instanteneousExc.json', + model_template='static_synapse', + syn_weight=3.0, + delay=2.0) + +internal.add_edges(source={'ei': 'i'}, target={'orig_model': 'intfire'}, + connection_rule=n_connections, + dynamics_params='instanteneousInh.json', + model_template='static_synapse', + syn_weight=-4.0, + delay=2.0) + +# Build and save internal network +internal.build() +print('Saving internal network') +internal.save(output_dir='network') + + +# Build a network of 100 virtual cells that will connect to and drive the simulation of the internal network +print('Building external connections') +external = NetworkBuilder("external") + +external.add_nodes(N=100, model_type='virtual', ei='e') + +# Targets all biophysical excitatory cells +external.add_edges(target=internal.nodes(ei='e', orig_model='biophysical'), source=external.nodes(), + connection_rule=lambda *_: np.random.randint(0, 5), + dynamics_params='ExcToExc.json', + model_template='static_synapse', + delay=2.0, + syn_weight=11.0) + +# Targets all biophysical inhibitory cells +external.add_edges(target=internal.nodes(ei='i', orig_model='biophysical'), source=external.nodes(), + connection_rule=lambda *_: np.random.randint(0, 5), + dynamics_params='ExcToInh.json', + model_template='static_synapse', + delay=2.0, + syn_weight=14.0) + +# Targets all intfire1 cells (exc and inh) +external.add_edges(target=internal.nodes(orig_model='intfire'), source=external.nodes(), + connection_rule=lambda *_: np.random.randint(0, 5), + dynamics_params='instanteneousExc.json', + model_template='static_synapse', + delay=2.0, + syn_weight=13.0) + + +external.build() +print('Saving external') +external.save(output_dir='network') + + diff --git a/bmtk-vb/docs/examples/point_450cells/config.json b/bmtk-vb/docs/examples/point_450cells/config.json new file mode 100644 index 0000000..9fb088b --- /dev/null +++ b/bmtk-vb/docs/examples/point_450cells/config.json @@ -0,0 +1,67 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$NETWORK_DIR": "$BASE_DIR/network", + "$MODELS_DIR": "$BASE_DIR/../point_components", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/../NWB_files" + }, + + "run": { + "duration": 3000.0, + "dt": 0.001, + "block_run": false, + "block_size": 1000.0 + }, + + "inputs": { + "LGN_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$INPUT_DIR/lgn_spikes.nwb", + "node_set": "external", + "trial": "trial_0" + } + }, + + "output": { + "log_file": "log.txt", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "output_dir": "$OUTPUT_DIR", + "overwrite_output_dir": true + }, + + + "target_simulator":"NEST", + + "components": { + "point_neuron_models_dir": "$MODELS_DIR/cell_models", + "synaptic_models_dir": "$MODELS_DIR/synaptic_models", + "weight_functions": "$BASE_DIR/weight_funcs.py" + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/internal_nodes.h5", + "node_types_file": "$NETWORK_DIR/internal_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/external_nodes.h5", + "node_types_file": "$NETWORK_DIR/external_node_types.csv" + } + ], + "edges": [ + { + "edges_file": "$NETWORK_DIR/internal_internal_edges.h5", + "edge_types_file": "$NETWORK_DIR/internal_internal_edge_types.csv", + "enabled": true + }, + { + "edges_file": "$NETWORK_DIR/external_internal_edges.h5", + "edge_types_file": "$NETWORK_DIR/external_internal_edge_types.csv" + } + ] + } +} diff --git a/bmtk-vb/docs/examples/point_450cells/network/external_internal_edge_types.csv b/bmtk-vb/docs/examples/point_450cells/network/external_internal_edge_types.csv new file mode 100644 index 0000000..f98149c --- /dev/null +++ b/bmtk-vb/docs/examples/point_450cells/network/external_internal_edge_types.csv @@ -0,0 +1,4 @@ +edge_type_id target_query source_query delay syn_weight dynamics_params model_template +100 ei=='e'&orig_model=='biophysical' * 2.0 11.0 ExcToExc.json static_synapse +101 ei=='i'&orig_model=='biophysical' * 2.0 14.0 ExcToInh.json static_synapse +102 orig_model=='intfire' * 2.0 13.0 instanteneousExc.json static_synapse diff --git a/bmtk-vb/docs/examples/point_450cells/network/external_internal_edges.h5 b/bmtk-vb/docs/examples/point_450cells/network/external_internal_edges.h5 new file mode 100644 index 0000000..aace605 Binary files /dev/null and b/bmtk-vb/docs/examples/point_450cells/network/external_internal_edges.h5 differ diff --git a/bmtk-vb/docs/examples/point_450cells/network/external_node_types.csv b/bmtk-vb/docs/examples/point_450cells/network/external_node_types.csv new file mode 100644 index 0000000..07b4593 --- /dev/null +++ b/bmtk-vb/docs/examples/point_450cells/network/external_node_types.csv @@ -0,0 +1,2 @@ +node_type_id model_type ei +100 virtual e diff --git a/bmtk-vb/docs/examples/point_450cells/network/external_nodes.h5 b/bmtk-vb/docs/examples/point_450cells/network/external_nodes.h5 new file mode 100644 index 0000000..069b488 Binary files /dev/null and b/bmtk-vb/docs/examples/point_450cells/network/external_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/point_450cells/network/internal_internal_edge_types.csv b/bmtk-vb/docs/examples/point_450cells/network/internal_internal_edge_types.csv new file mode 100644 index 0000000..52f5ea4 --- /dev/null +++ b/bmtk-vb/docs/examples/point_450cells/network/internal_internal_edge_types.csv @@ -0,0 +1,7 @@ +edge_type_id target_query source_query delay syn_weight dynamics_params model_template +100 ei=='e'&orig_model=='biophysical' ei=='e' 2.0 2.5 ExcToExc.json static_synapse +101 ei=='i'&orig_model=='biophysical' ei=='e' 2.0 5.0 ExcToInh.json static_synapse +102 ei=='e'&orig_model=='biophysical' ei=='i' 2.0 -6.5 InhToExc.json static_synapse +103 ei=='i'&orig_model=='biophysical' ei=='i' 2.0 -3.0 InhToInh.json static_synapse +104 orig_model=='intfire' ei=='e' 2.0 3.0 instanteneousExc.json static_synapse +105 orig_model=='intfire' ei=='i' 2.0 -4.0 instanteneousInh.json static_synapse diff --git a/bmtk-vb/docs/examples/point_450cells/network/internal_internal_edges.h5 b/bmtk-vb/docs/examples/point_450cells/network/internal_internal_edges.h5 new file mode 100644 index 0000000..d9010d8 Binary files /dev/null and b/bmtk-vb/docs/examples/point_450cells/network/internal_internal_edges.h5 differ diff --git a/bmtk-vb/docs/examples/point_450cells/network/internal_node_types.csv b/bmtk-vb/docs/examples/point_450cells/network/internal_node_types.csv new file mode 100644 index 0000000..fb344fe --- /dev/null +++ b/bmtk-vb/docs/examples/point_450cells/network/internal_node_types.csv @@ -0,0 +1,8 @@ +node_type_id ei model_template orig_model model_type dynamics_params model_name +100 e nest:iaf_psc_alpha biophysical point_process 472363762_point.json Scnn1a +101 e nest:iaf_psc_alpha biophysical point_process 473863510_point.json Rorb +102 e nest:iaf_psc_alpha biophysical point_process 473863035_point.json Nr5a1 +103 i nest:iaf_psc_alpha biophysical point_process 472912177_point.json PV1 +104 i nest:iaf_psc_alpha biophysical point_process 473862421_point.json PV2 +105 e nest:iaf_psc_alpha intfire point_process IntFire1_exc_point.json LIF_exc +106 i nest:iaf_psc_alpha intfire point_process IntFire1_inh_point.json LIF_inh diff --git a/bmtk-vb/docs/examples/point_450cells/network/internal_nodes.h5 b/bmtk-vb/docs/examples/point_450cells/network/internal_nodes.h5 new file mode 100644 index 0000000..8f42967 Binary files /dev/null and b/bmtk-vb/docs/examples/point_450cells/network/internal_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/point_450cells/plot_spikes.py b/bmtk-vb/docs/examples/point_450cells/plot_spikes.py new file mode 100644 index 0000000..e311f98 --- /dev/null +++ b/bmtk-vb/docs/examples/point_450cells/plot_spikes.py @@ -0,0 +1,3 @@ +from bmtk.analyzer.visualization.spikes import plot_spikes + +plot_spikes('network/internal_nodes.h5', 'network/internal_node_types.csv', 'output/spikes.h5') diff --git a/bmtk-vb/docs/examples/point_450cells/run_pointnet.py b/bmtk-vb/docs/examples/point_450cells/run_pointnet.py new file mode 100644 index 0000000..9af13c0 --- /dev/null +++ b/bmtk-vb/docs/examples/point_450cells/run_pointnet.py @@ -0,0 +1,18 @@ +import os, sys +from bmtk.simulator import pointnet +from bmtk.analyzer.visualization.spikes import plot_spikes + + +def main(config_file): + configure = pointnet.Config.from_json(config_file) + configure.build_env() + + graph = pointnet.PointNetwork.from_config(configure) + sim = pointnet.PointSimulator.from_config(configure, graph) + sim.run() + + # plot_spikes('network/internal_nodes.h5', 'network/internal_node_types.csv', 'output/spikes.h5') + + +if __name__ == '__main__': + main('config.json') diff --git a/bmtk-vb/docs/examples/point_components/cell_models/472363762_point.json b/bmtk-vb/docs/examples/point_components/cell_models/472363762_point.json new file mode 100644 index 0000000..e6154b1 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/472363762_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 44.9, + "C_m": 239.0, + "t_ref": 3.0, + "E_L": -78.0, + "V_th": -43.0, + "V_reset": -55.0 +} diff --git a/bmtk-vb/docs/examples/point_components/cell_models/472912177_point.json b/bmtk-vb/docs/examples/point_components/cell_models/472912177_point.json new file mode 100644 index 0000000..30b9822 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/472912177_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 22.2, + "C_m": 180.0, + "t_ref": 3.0, + "E_L": -82.0, + "V_th": -35.0, + "V_reset": -50.0 +} diff --git a/bmtk-vb/docs/examples/point_components/cell_models/473862421_point.json b/bmtk-vb/docs/examples/point_components/cell_models/473862421_point.json new file mode 100644 index 0000000..6d7e76a --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/473862421_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 12.5, + "C_m": 78.0, + "t_ref": 3.0, + "E_L": -73.0, + "V_th": -37.0, + "V_reset": -55.0 +} diff --git a/bmtk-vb/docs/examples/point_components/cell_models/473863035_point.json b/bmtk-vb/docs/examples/point_components/cell_models/473863035_point.json new file mode 100644 index 0000000..db8e5e4 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/473863035_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 22.1, + "C_m": 117.0, + "t_ref": 3.0, + "E_L": -78.0, + "V_th": -47.0, + "V_reset": -50.0 +} diff --git a/bmtk-vb/docs/examples/point_components/cell_models/473863510_point.json b/bmtk-vb/docs/examples/point_components/cell_models/473863510_point.json new file mode 100644 index 0000000..348c569 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/473863510_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 11.5, + "C_m": 53.0, + "t_ref": 3.0, + "E_L": -72.0, + "V_th": -25.0, + "V_reset": -50.0 +} diff --git a/bmtk-vb/docs/examples/point_components/cell_models/IntFire1_exc_point.json b/bmtk-vb/docs/examples/point_components/cell_models/IntFire1_exc_point.json new file mode 100644 index 0000000..d3e5c19 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/IntFire1_exc_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 24.0, + "C_m": 120.0, + "t_ref": 3.0, + "E_L": -75.0, + "V_th": -37.0, + "V_reset": -53.0 +} diff --git a/bmtk-vb/docs/examples/point_components/cell_models/IntFire1_inh_point.json b/bmtk-vb/docs/examples/point_components/cell_models/IntFire1_inh_point.json new file mode 100644 index 0000000..cf889c5 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/IntFire1_inh_point.json @@ -0,0 +1,9 @@ +{ + "I_e": 0.0, + "tau_m": 7.0, + "C_m": 50.0, + "t_ref": 3.0, + "E_L": -77.0, + "V_th": -36.0, + "V_reset": -52.0 +} diff --git a/bmtk-vb/docs/examples/point_components/cell_models/filter_point.json b/bmtk-vb/docs/examples/point_components/cell_models/filter_point.json new file mode 100644 index 0000000..0e0dcd2 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/filter_point.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/point_components/cell_models/iaf_psc_delta_exc.json b/bmtk-vb/docs/examples/point_components/cell_models/iaf_psc_delta_exc.json new file mode 100644 index 0000000..0e0dcd2 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/iaf_psc_delta_exc.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/point_components/cell_models/iaf_psc_delta_inh.json b/bmtk-vb/docs/examples/point_components/cell_models/iaf_psc_delta_inh.json new file mode 100644 index 0000000..0e0dcd2 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/cell_models/iaf_psc_delta_inh.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/point_components/synaptic_models/ExcToExc.json b/bmtk-vb/docs/examples/point_components/synaptic_models/ExcToExc.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/synaptic_models/ExcToExc.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/docs/examples/point_components/synaptic_models/ExcToInh.json b/bmtk-vb/docs/examples/point_components/synaptic_models/ExcToInh.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/synaptic_models/ExcToInh.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/docs/examples/point_components/synaptic_models/InhToExc.json b/bmtk-vb/docs/examples/point_components/synaptic_models/InhToExc.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/synaptic_models/InhToExc.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/examples/point_components/synaptic_models/InhToInh.json b/bmtk-vb/docs/examples/point_components/synaptic_models/InhToInh.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/synaptic_models/InhToInh.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/examples/point_components/synaptic_models/instanteneousExc.json b/bmtk-vb/docs/examples/point_components/synaptic_models/instanteneousExc.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/synaptic_models/instanteneousExc.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/examples/point_components/synaptic_models/instanteneousInh.json b/bmtk-vb/docs/examples/point_components/synaptic_models/instanteneousInh.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/point_components/synaptic_models/instanteneousInh.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/examples/point_iclamp/config.json b/bmtk-vb/docs/examples/point_iclamp/config.json new file mode 100644 index 0000000..7c7594b --- /dev/null +++ b/bmtk-vb/docs/examples/point_iclamp/config.json @@ -0,0 +1,85 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/network/source_input", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../point_components" + }, + + "run": { + "tstop": 1500.0, + "dt": 0.001, + "dL": 20.0, + "spike_threshold": -15, + "overwrite_output_dir": true + }, + + "target_simulator":"NEST", + + "conditions": { + "celsius": 34.0, + "v_init": -80 + }, + + "inputs": { + "current_clamp_1": { + "input_type": "current_clamp", + "module": "IClamp", + "node_set": "exc_nodes", + "amp": 190.0, + "delay": 500.0, + "duration": 500.0 + } + }, + + "output":{ + "log_file": "log.txt", + "output_dir": "$OUTPUT_DIR", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "spikes_sort_order": "time" + }, + + "components": { + "point_neuron_models_dir": "$COMPONENT_DIR/cell_models", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models" + }, + + "node_sets": { + "point_nodes": { + "model_type": "point_process" + }, + + "exc_nodes": { + "ei": "e" + } + }, + + "reports": { + "membrane_potential": { + "cells": "point_nodes", + "variable_name": "V_m", + "module": "multimeter_report", + "sections": "soma", + "enabled": true + } + }, + + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/recurrent_network/nodes.h5", + "node_types_file": "$NETWORK_DIR/recurrent_network/node_types.csv" + } + ], + + "edges": [ + { + "edges_file": "$NETWORK_DIR/recurrent_network/edges.h5", + "edge_types_file": "$NETWORK_DIR/recurrent_network/edge_types.csv" + } + ] + } +} diff --git a/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/edge_types.csv b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/edge_types.csv new file mode 100644 index 0000000..6e3b368 --- /dev/null +++ b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/edge_types.csv @@ -0,0 +1,9 @@ +edge_type_id target_query source_query syn_weight dynamics_params distance_range delay target_sections model_template +100 model_type=='biophysical'&ei=='i' ei=='i' 50.0 InhToInh.json "[0.0, 1e+20]" 2.0 "['somatic', 'basal']" static_synapse +101 model_type=='point_process'&ei=='i' ei=='i' 50.0 instanteneousInh.json NULL 2.0 NULL static_synapse +102 level_of_detail=='biophysical'&ei=='e' ei=='i' 50.0 InhToExc.json "[0.0, 50.0]" 2.0 "['somatic', 'basal', 'apical']" static_synapse +103 level_of_detail=='intfire'&ei=='e' ei=='i' 50.0 instanteneousInh.json NULL 2.0 NULL static_synapse +104 pop_name=='PV1' ei=='e' 30.0 ExcToInh.json "[0.0, 1e+20]" 2.0 "['somatic', 'basal']" static_synapse +105 pop_name=='LIF_inh' ei=='e' 50.0 instanteneousExc.json NULL 2.0 NULL static_synapse +106 pop_name=='Scnn1a' ei=='e' 50.0 ExcToExc.json "[30.0, 150.0]" 2.0 "['basal', 'apical']" static_synapse +107 pop_name=='LIF_exc' ei=='e' 50.0 instanteneousExc.json NULL 2.0 NULL static_synapse diff --git a/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/edges.h5 b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/edges.h5 new file mode 100644 index 0000000..e0e7b37 Binary files /dev/null and b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/edges.h5 differ diff --git a/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/node_types.csv b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/node_types.csv new file mode 100644 index 0000000..f38a72a --- /dev/null +++ b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/node_types.csv @@ -0,0 +1,5 @@ +node_type_id ei model_processing pop_name model_template model_type dynamics_params rotation_angle_zaxis +100 i NULL PV1 nest:iaf_psc_alpha point_process 472912177_point.json -2.53 +101 e NULL Scnn1a nest:iaf_psc_alpha point_process 472363762_point.json -3.646878266 +102 i NULL LIF_inh nest:iaf_psc_alpha point_process IntFire1_inh_point.json NULL +103 e NULL LIF_exc nest:iaf_psc_alpha point_process IntFire1_exc_point.json NULL diff --git a/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/nodes.csv b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/nodes.csv new file mode 100644 index 0000000..1cedcb2 --- /dev/null +++ b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/nodes.csv @@ -0,0 +1,9 @@ +node_id node_type_id x_soma y_soma z_soma rotation_angle_yaxis pop_name ei +0 10002 0.59970086791473476 0.7669456700222288 0.63342296667967057 2.8855805437712054 PV1 i +1 10002 0.64573574296980885 0.41286627582336111 0.89823631588142072 2.1657588793230116 PV1 i +2 10001 0.1675878347205868 0.30591729535179824 0.31342078710130283 5.1876700684739037 Scnn1a e +3 10001 0.71617645939637709 0.68016880563220883 0.70761584532823629 1.6431578525680703 Scnn1a e +4 90002 0.13093610138425726 0.48812555606917907 0.93341052317501738 2.258221401812377 LIF_inh i +5 90002 0.81237871087206437 0.64678320267548151 0.91214503640257605 1.5857854835635639 LIF_inh i +6 90001 0.9188885897309842 0.87509533743231505 0.74657421524993361 1.0660517798843969 LIF_exc e +7 90001 0.087999125302931192 0.6027056373291817 0.92473051991482436 6.2787411022712538 LIF_exc e diff --git a/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/nodes.h5 b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/nodes.h5 new file mode 100644 index 0000000..d153db3 Binary files /dev/null and b/bmtk-vb/docs/examples/point_iclamp/network/recurrent_network/nodes.h5 differ diff --git a/bmtk-vb/docs/examples/point_iclamp/run_pointnet.py b/bmtk-vb/docs/examples/point_iclamp/run_pointnet.py new file mode 100644 index 0000000..95c7261 --- /dev/null +++ b/bmtk-vb/docs/examples/point_iclamp/run_pointnet.py @@ -0,0 +1,14 @@ +from bmtk.simulator import pointnet + + +def main(config_file): + configure = pointnet.Config.from_json(config_file) + configure.build_env() + + network = pointnet.PointNetwork.from_config(configure) + sim = pointnet.PointSimulator.from_config(configure, network) + sim.run() + + +if __name__ == '__main__': + main('config.json') \ No newline at end of file diff --git a/bmtk-vb/docs/examples/pop_2pops/build_network.py b/bmtk-vb/docs/examples/pop_2pops/build_network.py new file mode 100644 index 0000000..247223f --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/build_network.py @@ -0,0 +1,48 @@ +from bmtk.builder import NetworkBuilder + +net = NetworkBuilder('brunel') +net.add_nodes(pop_name='excitatory', + ei='e', + model_type='population', + model_template='dipde:Internal', + dynamics_params='exc_model.json') + +net.add_nodes(pop_name='inhibitory', + ei='i', + model_type='population', + model_template='dipde:Internal', + dynamics_params='inh_model.json') + +net.add_edges(source={'ei': 'e'}, target={'ei': 'i'}, + syn_weight=0.005, + nsyns=20, + delay=0.002, + dynamics_params='ExcToInh.json') + +net.add_edges(source={'ei': 'i'}, target={'ei': 'e'}, + syn_weight=-0.002, + nsyns=10, + delay=0.002, + dynamics_params='InhToExc.json') + +net.build() +net.save_nodes(nodes_file_name='brunel_nodes.h5', node_types_file_name='brunel_node_types.csv', output_dir='network') +net.save_edges(edges_file_name='brunel_edges.h5', edge_types_file_name='brunel_edge_types.csv', output_dir='network') + + +input_net = NetworkBuilder('inputs') +input_net.add_nodes(pop_name='tON', + ei='e', + model_type='virtual') + +input_net.add_edges(target=net.nodes(ei='e'), + syn_weight=0.0025, + nsyns=10, + delay=0.002, + dynamics_params='input_ExcToExc.json') + +input_net.build() +input_net.save_nodes(nodes_file_name='input_nodes.h5', node_types_file_name='input_node_types.csv', + output_dir='network') +input_net.save_edges(edges_file_name='input_edges.h5', edge_types_file_name='input_edge_types.csv', + output_dir='network') \ No newline at end of file diff --git a/bmtk-vb/docs/examples/pop_2pops/components/pop_models/exc_model.json b/bmtk-vb/docs/examples/pop_2pops/components/pop_models/exc_model.json new file mode 100644 index 0000000..45370e1 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/components/pop_models/exc_model.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0429, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/docs/examples/pop_2pops/components/pop_models/inh_model.json b/bmtk-vb/docs/examples/pop_2pops/components/pop_models/inh_model.json new file mode 100644 index 0000000..e9505ea --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/components/pop_models/inh_model.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0299, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/ExcToExc.json b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/ExcToExc.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/ExcToExc.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/ExcToInh.json b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/ExcToInh.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/ExcToInh.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/InhToExc.json b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/InhToExc.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/InhToExc.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/InhToInh.json b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/InhToInh.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/InhToInh.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/input_ExcToExc.json b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/input_ExcToExc.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/input_ExcToExc.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/input_ExcToInh.json b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/input_ExcToInh.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/components/synaptic_models/input_ExcToInh.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/pop_2pops/config.json b/bmtk-vb/docs/examples/pop_2pops/config.json new file mode 100644 index 0000000..5c8990b --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/config.json @@ -0,0 +1,64 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/../NWB_files", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/components" + }, + + "run": { + "tstop": 1500.0, + "dt": 0.002, + "overwrite_output_dir": true, + "connect_internal": true, + "connect_external": {"LGN": true} + }, + + "inputs": { + "LGN_pop_rates": { + "input_type": "csv", + "module": "pop_rates", + "rates": "${BASE_DIR}/lgn_rates.csv", + "node_set": "inputs" + } + }, + + "output": { + "output_dir": "$OUTPUT_DIR", + "rates_file": "spike_rates.csv", + "log_file": "log.txt", + "overwrite_output_dir": true + }, + + "target_simulator":"DiPDE", + + "components": { + "population_models_dir": "$COMPONENT_DIR/pop_models", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models" + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/brunel_nodes.h5", + "node_types_file": "$NETWORK_DIR/brunel_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/input_nodes.h5", + "node_types_file": "$NETWORK_DIR/input_node_types.csv" + } + ], + + "edges": [ + { + "edges_file": "$NETWORK_DIR/brunel_edges.h5", + "edge_types_file": "$NETWORK_DIR/brunel_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/input_edges.h5", + "edge_types_file": "$NETWORK_DIR/input_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/pop_2pops/lgn_rates.csv b/bmtk-vb/docs/examples/pop_2pops/lgn_rates.csv new file mode 100644 index 0000000..e08d672 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/lgn_rates.csv @@ -0,0 +1,2 @@ +gid firing_rate +100 15.0 diff --git a/bmtk-vb/docs/examples/pop_2pops/network/brunel_edge_types.csv b/bmtk-vb/docs/examples/pop_2pops/network/brunel_edge_types.csv new file mode 100644 index 0000000..649d19e --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/network/brunel_edge_types.csv @@ -0,0 +1,3 @@ +edge_type_id target_query source_query delay syn_weight dynamics_params +100 ei=='i' ei=='e' 0.002 0.005 ExcToInh.json +101 ei=='e' ei=='i' 0.002 -0.002 InhToExc.json diff --git a/bmtk-vb/docs/examples/pop_2pops/network/brunel_edges.h5 b/bmtk-vb/docs/examples/pop_2pops/network/brunel_edges.h5 new file mode 100644 index 0000000..c731af0 Binary files /dev/null and b/bmtk-vb/docs/examples/pop_2pops/network/brunel_edges.h5 differ diff --git a/bmtk-vb/docs/examples/pop_2pops/network/brunel_node_types.csv b/bmtk-vb/docs/examples/pop_2pops/network/brunel_node_types.csv new file mode 100644 index 0000000..8a5f1ca --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/network/brunel_node_types.csv @@ -0,0 +1,3 @@ +node_type_id ei pop_name model_template model_type dynamics_params +100 e excitatory dipde:Internal population exc_model.json +101 i inhibitory dipde:Internal population inh_model.json diff --git a/bmtk-vb/docs/examples/pop_2pops/network/brunel_nodes.h5 b/bmtk-vb/docs/examples/pop_2pops/network/brunel_nodes.h5 new file mode 100644 index 0000000..394c171 Binary files /dev/null and b/bmtk-vb/docs/examples/pop_2pops/network/brunel_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/pop_2pops/network/input_edge_types.csv b/bmtk-vb/docs/examples/pop_2pops/network/input_edge_types.csv new file mode 100644 index 0000000..aee0b3a --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/network/input_edge_types.csv @@ -0,0 +1,2 @@ +edge_type_id target_query source_query delay syn_weight dynamics_params +100 ei=='e' * 0.002 0.0025 input_ExcToExc.json diff --git a/bmtk-vb/docs/examples/pop_2pops/network/input_edges.h5 b/bmtk-vb/docs/examples/pop_2pops/network/input_edges.h5 new file mode 100644 index 0000000..b8781cb Binary files /dev/null and b/bmtk-vb/docs/examples/pop_2pops/network/input_edges.h5 differ diff --git a/bmtk-vb/docs/examples/pop_2pops/network/input_node_types.csv b/bmtk-vb/docs/examples/pop_2pops/network/input_node_types.csv new file mode 100644 index 0000000..8928683 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/network/input_node_types.csv @@ -0,0 +1,2 @@ +node_type_id model_type ei pop_name +100 virtual e tON diff --git a/bmtk-vb/docs/examples/pop_2pops/network/input_nodes.h5 b/bmtk-vb/docs/examples/pop_2pops/network/input_nodes.h5 new file mode 100644 index 0000000..0415ac2 Binary files /dev/null and b/bmtk-vb/docs/examples/pop_2pops/network/input_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/pop_2pops/run_popnet.py b/bmtk-vb/docs/examples/pop_2pops/run_popnet.py new file mode 100644 index 0000000..ea46b3e --- /dev/null +++ b/bmtk-vb/docs/examples/pop_2pops/run_popnet.py @@ -0,0 +1,24 @@ +import sys +import os + +from bmtk.simulator import popnet + +from bmtk.analyzer.visualization.spikes import plot_rates_popnet + +def main(config_file): + configure = popnet.config.from_json(config_file) + configure.build_env() + network = popnet.PopNetwork.from_config(configure) + sim = popnet.PopSimulator.from_config(configure, network) + sim.run() + + cells_file = 'network/brunel_node_types.csv' + rates_file = 'output/spike_rates.csv' + plot_rates_popnet(cells_file, rates_file, model_keys='pop_name') + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + main(sys.argv[-1]) + else: + main('config.json') \ No newline at end of file diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/config.json b/bmtk-vb/docs/examples/pop_7pops_converted/config.json new file mode 100644 index 0000000..2c40b78 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_7pops_converted/config.json @@ -0,0 +1,81 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/../NWB_files", + "$NETWORK_DIR": "$BASE_DIR/network", + "$COMPONENT_DIR": "$BASE_DIR/../population_components" + }, + + "run": { + "tstop": 1.5, + "dt": 0.005, + "overwrite_output_dir": true, + "connect_internal": true, + "connect_external": {"LGN": true} + }, + + "inputs": { + "LGN_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$INPUT_DIR/lgn_spikes.nwb", + "node_set": "lgn", + "trial": "trial_0" + }, + "TW_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$INPUT_DIR/tw_spikes.nwb", + "node_set": "tw", + "trial": "trial_0" + } + }, + + "output": { + "rates_file": "spike_rates.csv", + "log_file": "logging.txt", + "output_dir": "$OUTPUT_DIR", + "overwrite_output_dir": true + }, + + "target_simulator":"DiPDE", + + "components": { + "population_models_dir": "$COMPONENT_DIR/pop_models", + "synaptic_models_dir": "$COMPONENT_DIR/synaptic_models" + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/v1_nodes.h5", + "node_types_file": "$NETWORK_DIR/v1_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/lgn_nodes.h5", + "node_types_file": "$NETWORK_DIR/lgn_node_types.csv" + }, + { + "nodes_file": "$NETWORK_DIR/tw_nodes.h5", + "node_types_file": "$NETWORK_DIR/tw_node_types.csv" + } + + ], + + "edges": [ + { + "edges_file": "$NETWORK_DIR/v1_v1_edges.h5", + "edge_types_file": "$NETWORK_DIR/v1_v1_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/lgn_v1_edges.h5", + "edge_types_file": "$NETWORK_DIR/lgn_v1_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/tw_v1_edges.h5", + "edge_types_file": "$NETWORK_DIR/tw_v1_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_node_types.csv b/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_node_types.csv new file mode 100644 index 0000000..63ff2cf --- /dev/null +++ b/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_node_types.csv @@ -0,0 +1,4 @@ +node_type_id model_type model_template model_processing ei pop_name location +0 virtual NONE NONE e tON_001 LGN +1 virtual NONE NONE e tOFF_001 LGN +2 virtual NONE NONE e tONOFF_001 LGN diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_nodes.h5 b/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_nodes.h5 new file mode 100644 index 0000000..79c2c29 Binary files /dev/null and b/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_v1_edge_types.csv b/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_v1_edge_types.csv new file mode 100644 index 0000000..988eb1e --- /dev/null +++ b/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_v1_edge_types.csv @@ -0,0 +1,8 @@ +edge_type_id target_query source_query syn_weight weight_function weight_sigma distance_range target_sections delay dynamics_params model_template +0 pop_name=='Rorb' * 5e-05 wmax NONE "[0.0, 150.0]" "['basal', 'apical']" 2.0 ExcToExc.json exp2syn +1 pop_name=='Nr5a1' * 5e-05 wmax NONE "[0.0, 150.0]" "['basal', 'apical']" 2.0 ExcToExc.json exp2syn +2 pop_name=='Scnn1a' * 4e-05 wmax NONE "[0.0, 150.0]" "['basal', 'apical']" 2.0 ExcToExc.json exp2syn +3 pop_name=='PV1' * 0.0001 wmax NONE "[0.0, 1e+20]" "['somatic', 'basal']" 2.0 ExcToInh.json exp2syn +4 pop_name=='PV2' * 9e-05 wmax NONE "[0.0, 1e+20]" "['somatic', 'basal']" 2.0 ExcToInh.json exp2syn +5 pop_name=='LIF_exc' * 0.0045 wmax NONE NONE NONE 2.0 instanteneousExc.json NONE +6 pop_name=='LIF_inh' * 0.002 wmax NONE NONE NONE 2.0 instanteneousExc.json NONE diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_v1_edges.h5 b/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_v1_edges.h5 new file mode 100644 index 0000000..2d95294 Binary files /dev/null and b/bmtk-vb/docs/examples/pop_7pops_converted/network/lgn_v1_edges.h5 differ diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_node_types.csv b/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_node_types.csv new file mode 100644 index 0000000..446c61d --- /dev/null +++ b/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_node_types.csv @@ -0,0 +1,2 @@ +node_type_id model_type model_template model_processing ei pop_name location +0 virtual NONE NONE e TW_001 TW diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_nodes.h5 b/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_nodes.h5 new file mode 100644 index 0000000..5c4e976 Binary files /dev/null and b/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_v1_edge_types.csv b/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_v1_edge_types.csv new file mode 100644 index 0000000..711416f --- /dev/null +++ b/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_v1_edge_types.csv @@ -0,0 +1,8 @@ +edge_type_id target_query source_query syn_weight weight_function weight_sigma distance_range target_sections delay dynamics_params model_template +0 pop_name=='Rorb' * 0.00015 wmax NONE "[30.0, 150.0]" "['basal', 'apical']" 2.0 ExcToExc.json exp2syn +1 pop_name=='Scnn1a' * 0.00019 wmax NONE "[30.0, 150.0]" "['basal', 'apical']" 2.0 ExcToExc.json exp2syn +2 pop_name=='Nr5a1' * 0.00019 wmax NONE "[30.0, 150.0]" "['basal', 'apical']" 2.0 ExcToExc.json exp2syn +3 pop_name=='PV1' * 0.0022 wmax NONE "[0.0, 1e+20]" "['somatic', 'basal']" 2.0 ExcToInh.json exp2syn +4 pop_name=='PV2' * 0.0013 wmax NONE "[0.0, 1e+20]" "['somatic', 'basal']" 2.0 ExcToInh.json exp2syn +5 pop_name=='LIF_exc' * 0.015 wmax NONE NONE NONE 2.0 instanteneousExc.json NONE +6 pop_name=='LIF_inh' * 0.05 wmax NONE NONE NONE 2.0 instanteneousExc.json NONE diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_v1_edges.h5 b/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_v1_edges.h5 new file mode 100644 index 0000000..88879c3 Binary files /dev/null and b/bmtk-vb/docs/examples/pop_7pops_converted/network/tw_v1_edges.h5 differ diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_node_types.csv b/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_node_types.csv new file mode 100644 index 0000000..85a9d32 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_node_types.csv @@ -0,0 +1,8 @@ +node_type_id model_type model_template model_processing dynamics_params morphology_file ei pop_name location rotation_angle_zaxis +395830185 population dipde:Internal aibs_perisomatic 472363762_pop.json Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc e Scnn1a VisL4 -3.646878266 +314804042 population dipde:Internal aibs_perisomatic 473863510_pop.json Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc e Rorb VisL4 -4.159763785 +318808427 population dipde:Internal aibs_perisomatic 473863035_pop.json Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc e Nr5a1 VisL4 -2.639275277 +330080937 population dipde:Internal aibs_perisomatic 472912177_pop.json Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc i PV1 VisL4 -2.539551891 +318331342 population dipde:Internal aibs_perisomatic 473862421_pop.json Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc i PV2 VisL4 -3.684439949 +100000101 population dipde:Internal NONE IntFire1_exc_pop.json NONE e LIF_exc VisL4 NONE +100000102 population dipde:Internal NONE IntFire1_inh_pop.json NONE i LIF_inh VisL4 NONE diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_nodes.h5 b/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_nodes.h5 new file mode 100644 index 0000000..10b25b1 Binary files /dev/null and b/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_nodes.h5 differ diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_v1_edge_types.csv b/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_v1_edge_types.csv new file mode 100644 index 0000000..c772592 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_v1_edge_types.csv @@ -0,0 +1,12 @@ +edge_type_id target_query source_query syn_weight weight_function weight_sigma distance_range target_sections delay dynamics_params model_template +0 level_of_detail=='biophysical'&ei=='i' ei=='i' 0.0002 wmax NONE "[0.0, 1e+20]" "['somatic', 'basal']" 2.0 InhToInh.json exp2syn +1 level_of_detail=='intfire'&ei=='i' ei=='i' 0.00225 wmax NONE NONE NONE 2.0 instanteneousInh.json NONE +2 level_of_detail=='biophysical'&ei=='e' ei=='i' 0.00018 wmax NONE "[0.0, 50.0]" "['somatic', 'basal', 'apical']" 2.0 InhToExc.json exp2syn +3 level_of_detail=='intfire'&ei=='e' ei=='i' 0.009 wmax NONE NONE NONE 2.0 instanteneousInh.json NONE +4 pop_name=='PV1' ei=='e' 0.00035 wmax NONE "[0.0, 1e+20]" "['somatic', 'basal']" 2.0 ExcToInh.json exp2syn +5 pop_name=='PV2' ei=='e' 0.00027 wmax NONE "[0.0, 1e+20]" "['somatic', 'basal']" 2.0 ExcToInh.json exp2syn +6 pop_name=='LIF_inh' ei=='e' 0.0043 wmax NONE NONE NONE 2.0 instanteneousExc.json NONE +7 pop_name=='Scnn1a' ei=='e' 6.4e-05 gaussianLL 50.0 "[30.0, 150.0]" "['basal', 'apical']" 2.0 ExcToExc.json exp2syn +8 pop_name=='Rorb' ei=='e' 5.5e-05 gaussianLL 50.0 "[30.0, 150.0]" "['basal', 'apical']" 2.0 ExcToExc.json exp2syn +9 pop_name=='Nr5a1' ei=='e' 7.2e-05 gaussianLL 50.0 "[30.0, 150.0]" "['basal', 'apical']" 2.0 ExcToExc.json exp2syn +10 pop_name=='LIF_exc' ei=='e' 0.0019 gaussianLL 50.0 NONE NONE 2.0 instanteneousExc.json NONE diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_v1_edges.h5 b/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_v1_edges.h5 new file mode 100644 index 0000000..4054a10 Binary files /dev/null and b/bmtk-vb/docs/examples/pop_7pops_converted/network/v1_v1_edges.h5 differ diff --git a/bmtk-vb/docs/examples/pop_7pops_converted/run_popnet.py b/bmtk-vb/docs/examples/pop_7pops_converted/run_popnet.py new file mode 100644 index 0000000..73b33a8 --- /dev/null +++ b/bmtk-vb/docs/examples/pop_7pops_converted/run_popnet.py @@ -0,0 +1,17 @@ +import sys +from bmtk.simulator import popnet + + +def main(config_file): + configure = popnet.config.from_json(config_file) + configure.build_env() + network = popnet.PopNetwork.from_config(configure, group_by='node_type_id') + sim = popnet.PopSimulator.from_config(configure, network) + sim.run() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + main(sys.argv[-1]) + else: + main('config.json') diff --git a/bmtk-vb/docs/examples/population_components/pop_models/472363762_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/472363762_pop.json new file mode 100644 index 0000000..daa9889 --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/472363762_pop.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0449, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/docs/examples/population_components/pop_models/472912177_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/472912177_pop.json new file mode 100644 index 0000000..12a9e7d --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/472912177_pop.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0222, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/docs/examples/population_components/pop_models/473862421_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/473862421_pop.json new file mode 100644 index 0000000..2e23c58 --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/473862421_pop.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.1125, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/docs/examples/population_components/pop_models/473863035_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/473863035_pop.json new file mode 100644 index 0000000..cf503a0 --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/473863035_pop.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0221, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/docs/examples/population_components/pop_models/473863510_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/473863510_pop.json new file mode 100644 index 0000000..576ebba --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/473863510_pop.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0215, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/docs/examples/population_components/pop_models/IntFire1_exc_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/IntFire1_exc_pop.json new file mode 100644 index 0000000..b6190a9 --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/IntFire1_exc_pop.json @@ -0,0 +1,4 @@ +{ + "tau_m": 24.0, + "record": false +} diff --git a/bmtk-vb/docs/examples/population_components/pop_models/IntFire1_inh_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/IntFire1_inh_pop.json new file mode 100644 index 0000000..1b74cc2 --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/IntFire1_inh_pop.json @@ -0,0 +1,4 @@ +{ + "tau_m": 7.0, + "record": false +} diff --git a/bmtk-vb/docs/examples/population_components/pop_models/excitatory_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/excitatory_pop.json new file mode 100644 index 0000000..45370e1 --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/excitatory_pop.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0429, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/docs/examples/population_components/pop_models/filter_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/filter_pop.json new file mode 100644 index 0000000..0e0dcd2 --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/filter_pop.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/bmtk-vb/docs/examples/population_components/pop_models/inhibitory_pop.json b/bmtk-vb/docs/examples/population_components/pop_models/inhibitory_pop.json new file mode 100644 index 0000000..e9505ea --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/pop_models/inhibitory_pop.json @@ -0,0 +1,9 @@ +{ + "tau_m": 0.0299, + "record": true, + "v_min": -0.05, + "v_max": 0.02, + "dv": 0.0001, + "update_method": "gmres", + "approx_order": null +} diff --git a/bmtk-vb/docs/examples/population_components/synaptic_models/ExcToExc.json b/bmtk-vb/docs/examples/population_components/synaptic_models/ExcToExc.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/synaptic_models/ExcToExc.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/docs/examples/population_components/synaptic_models/ExcToInh.json b/bmtk-vb/docs/examples/population_components/synaptic_models/ExcToInh.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/synaptic_models/ExcToInh.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bmtk-vb/docs/examples/population_components/synaptic_models/InhToExc.json b/bmtk-vb/docs/examples/population_components/synaptic_models/InhToExc.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/synaptic_models/InhToExc.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/examples/population_components/synaptic_models/InhToInh.json b/bmtk-vb/docs/examples/population_components/synaptic_models/InhToInh.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/synaptic_models/InhToInh.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/examples/population_components/synaptic_models/instanteneousExc.json b/bmtk-vb/docs/examples/population_components/synaptic_models/instanteneousExc.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/synaptic_models/instanteneousExc.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/examples/population_components/synaptic_models/instanteneousInh.json b/bmtk-vb/docs/examples/population_components/synaptic_models/instanteneousInh.json new file mode 100644 index 0000000..bfd870e --- /dev/null +++ b/bmtk-vb/docs/examples/population_components/synaptic_models/instanteneousInh.json @@ -0,0 +1,3 @@ +{ +} + diff --git a/bmtk-vb/docs/tutorial/00_introduction.ipynb b/bmtk-vb/docs/tutorial/00_introduction.ipynb new file mode 100644 index 0000000..8f85bf9 --- /dev/null +++ b/bmtk-vb/docs/tutorial/00_introduction.ipynb @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 0: Introduction to the Brain Modeling Toolkit\n", + "\n", + "The Brain Modeling ToolKit (bmtk) was developed at the Allen Institute for Brain Science to assist with modeling, simulation and analysis of large-scale networks. It was developed in python and is open-source. The bmtk also provides a unified interface across different level of representations of brain models: supporting everything from biophysically detailed models of indvidual neurons and synapses, to high level representation of connection dynamics between different regions of the brain.\n", + "\n", + "Included in the bmtk:\n", + "* **The Network Builder** - python API that allows modelers to build large-scale network models with a minimal amount of coding.\n", + "* A [standarized format](https://github.com/AllenInstitute/sonata) for representing networks across a range of different levels of resolution, that is both efficient in memory and read-time, but also allows users to quickly adjust parameters before and during simulations.\n", + "* A collection of simulator interfaces to run network simulations on a variety of different simulators.\n", + "* **Analysis Toolkit** - An set of tools for visualizing and analyzing networks and simulation results.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## About This Guide\n", + "\n", + "### General Guides\n", + "High level overviews of the bmtk.\n", + "\n", + "[Quick guide to building networks](NetworkBuilder_Intro.ipynb) \n", + "[Setting up and running simulations](Simulation_Intro.ipynb)\n", + "\n", + "### Workflow tutorials \n", + "A collection of tutorials for building and simulating different types of networks using the bmtk. These tutorials are only very loosely in order and can for the most part be skipped around.\n", + "\n", + "[Chapter 1: Single cell with current stimulation (with BioNet)](01_single_cell_clamped.ipynb) \n", + "[Chapter 2: Single cell with external synaptic stimulation (with BioNet)](02_single_cell_syn.ipynb) \n", + "[Chapter 3: Single population recurrent network (with BioNet)](03_single_pop.ipynb) \n", + "[Chapter 4: Multi-population recurrent network (with BioNet)](04_multi_pop.ipynb) \n", + "[Chapter 5: Point-neuron simulation (with PointNet)](05_pointnet_modeling.ipynb) \n", + "[Chapter 6: Population-level simulation (with PopNet)](06_population_modeling.ipynb) \n", + "[Chapter 7: Simulating the visual field (with FilterNet)](07_filter_models.ipynb)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Other Resources\n", + "BMTK tutorials and lectures previously used at various workshops and conferences. _**WARNING - these materials are not guareenteed to be up-to-date, use at your own risk!**_\n", + "\n", + "[bmtk tutorial at CNS (June 2018)](https://github.com/AllenInstitute/CNS_2018_Tutorial) \n", + "[bmtk tutorial at the Summer Workshop on the Dynamic Brain (August 2018)](https://github.com/AllenInstitute/SWDB_2018)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites:\n", + "\n", + "The bmtk requires at minimum python 2.7 and 3.6+, as well as additional libraries to use features like building networks or running analyses. To install the bmtk it is best recommending to pull the latest from github.\n", + "```bash\n", + " $ git clone https://github.com/AllenInstitute/bmtk.git\n", + " $ cd bmtk\n", + " $ python setup.py install\n", + "```\n", + "\n", + "However, to run a simulation on the network the bmtk uses existing open-source simulatiors, which (at the moment) needs to be installed separately. The different simulators, which run simulations on different levels-of-resolution, will require different software. So depending on the type of simulation to be run\n", + "* biophysically detailed network (BioNet) - Uses [NEURON](https://www.neuron.yale.edu/neuron/download).\n", + "* point-neuron network (PointNet) - Uses [NEST](http://www.nest-simulator.org/installation/).\n", + "* population-level network (PopNet) - Uses [DiPDE](https://github.com/nicain/dipde_dev).\n", + "* filter models of the visual field (FilterNet) - Uses LGNModels\n", + "* convolutional neural network (MintNet) - Uses [TensorFlow](https://www.tensorflow.org/install/). - note; MintNet currently being reimplemented with major enhancements scheduled for 2019." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/01_single_cell_clamped.ipynb b/bmtk-vb/docs/tutorial/01_single_cell_clamped.ipynb new file mode 100644 index 0000000..a5eef39 --- /dev/null +++ b/bmtk-vb/docs/tutorial/01_single_cell_clamped.ipynb @@ -0,0 +1,671 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 1: Single cell simulation with current injection (with BioNet)\n", + "\n", + "In this example we will build a network consisting of a single biophysically detailed cell. Then we will run a short simulation with a current injection at the soma of the cell, then look at the output of spikes, membrane potential and calcium flux.\n", + "\n", + "\n", + "**Note** - scripts and files for running this tutorial can be found in the directory [sources/chapter01/](sources/chapter01)\n", + "\n", + "**requirements:**\n", + "* Python 2.7, 3.6+\n", + "* bmtk\n", + "* NEURON 7.4+" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Building the network\n", + "\n", + "First step is to use the bmtk Network Builder to create and save the network. First we instantiate a network with a name or our choosing (since throughout this tutorial we will use cell models that from the mouse cortex, let's call our network 'mcortex'). \n", + "\n", + "Once we have a network, we can add a single node by calling the add_nodes method." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from bmtk.builder.networks import NetworkBuilder\n", + "\n", + "net = NetworkBuilder('mcortex')\n", + "net.add_nodes(cell_name='Scnn1a_473845048',\n", + " potental='exc',\n", + " model_type='biophysical',\n", + " model_template='ctdb:Biophys1.hoc',\n", + " model_processing='aibs_perisomatic',\n", + " dynamics_params='472363762_fit.json',\n", + " morphology='Scnn1a_473845048_m.swc')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some of the parameters used to create the node are optional and only for our benefit. Others are necessary for when we will eventually run a simulation:\n", + "* *cell_name* (optional) - Name/type of cell we will be modeling.\n", + "* *potential* (optional) - Use to indicate that it is an excitatory type cell.\n", + "* *model_type* - Used by the simulator to indicate that we are using a biophysical cell.\n", + "* *dynamics_params* - Model parameters. File will be downloaded from the Allen Cell Types Database. \n", + "* *morphology* - Model morphology. File will be downloaded from the Allen Cell Types Database.\n", + "* *model_processing* - A custom function used by the simulator to load the model into NEURON using Allen Cell-Types files for perisomatic models\n", + " \n", + "#### Building and saving\n", + "The final thing to do is to build and save the network. If successful, we should see a combination of hdf5 and csv files in the './network' directory, these files are used describe the network, and can be saved, stored and run at a later date." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "net.build()\n", + "net.save_nodes(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the NetworkBuilder nodes() method to show that a node of our parameters was created" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'node_type_id': 100, 'dynamics_params': '472363762_fit.json', 'potental': 'exc', 'morphology': 'Scnn1a_473845048_m.swc', 'node_id': 0, 'model_template': 'ctdb:Biophys1.hoc', 'model_type': 'biophysical', 'model_processing': 'aibs_perisomatic', 'cell_name': 'Scnn1a_473845048'}\n" + ] + } + ], + "source": [ + "from pprint import pprint\n", + "for node in net.nodes():\n", + " pprint(node)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Setting up the simulator enviornment\n", + "\n", + "Now that the network has been built, we can use the BioNet simulator to setup and run it using NEURON. We will need to set-up the paths to the configuration and parameters files. We can do this by either:\n", + "1. Copying the directory tree from LOCATION into the current directory. Then compiling the extra NEURON mechanisms used by the Allen Cell Models by running the command \n", + "```bash\n", + "$ cd components/mechanism\n", + "$ nrnivmodl modfiles\n", + "```\n", + "2. We can build the enviornment by scratch, which we can do from a command-line\n", + "```bash\n", + "$ python -m bmtk.utils.sim_setup -n network --membrane_report-vars v,cai --membrane_report-sections soma --tstop 2000.0 --dt 0.1 bionet\n", + "```\n", + "3. Call the function directly in python" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/local1/workspace/bmtk/docs/tutorial/biophys_components/mechanisms\n" + ] + } + ], + "source": [ + "from bmtk.utils.sim_setup import build_env_bionet\n", + "build_env_bionet(network_dir='network', tstop=2000.0, dt=0.1,\n", + " reports={'membrane_report': {\n", + " \"module\": \"membrane_report\",\n", + " 'cells': 'all',\n", + " 'variable_name': ['cai', 'v'],\n", + " \"file_name\": \"cell_vars.h5\",\n", + " \"sections\": \"soma\",\n", + " }})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This creates standard SONATA configuration files for BioNet, using the built network files in ./network and having a simulation run-time of 2 seconds. The membrane_report-vars and membrane_report-sections sets it so that we are recording membrane potential (v) and calcium concentration (cai) at the soma.:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Set the model files\n", + "The cell will be modeled from a V1, layer 4 Scnn1a mouse cell. Download the model file from http://celltypes.brain-map.org/neuronal_model/download/482934212, or by searching the Allen Cell-Types Database. We will need to unzip the downloaded package and move the parameters and morphology files into our simulator enviornment:\n", + "* Rename *fit_parameters.json* to *472363762_fit.json* and place in ./components/biophysical/electrophysiology/\n", + "* Rename *reconstruction.swc* to *Scnn1a_473845048_m.swc* and place in ./components/biophysical/morphologies/ " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "cp sources/bionet_files/components/biophysical/electrophysiology/472363762_fit.json biophys_components/biophysical_neuron_templates/\n", + "cp sources/bionet_files/components/biophysical/morphology/Scnn1a_473845048_m.swc biophys_components/morphologies/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Checking the config.json\n", + "\n", + "The file ./simulation_config.json is used to set network, run-time and output parameters during a simulation. In the prefered bmtk workflow the config file is used to update and adjust parameters on different simulations runs, eliminating the need for complicated programs and allows modelers and experimentalist to run their models with little-to-no programming required.\n", + "\n", + "More about the configuration file will be explained throughout the tutorials. However current what is missing is any input stimulus. Without it the simulation will run, but not do anything interesting. To add a current injection into the soma of our cell, we must open simulation_config.json with a text editor and modify the **input** section to:\n", + "```json\n", + "\"inputs\": {\n", + " \t\"current_clamp\": {\n", + " \"input_type\": \"current_clamp\",\n", + " \"module\": \"IClamp\",\n", + " \"node_set\": \"all\",\n", + " \"amp\": 0.120,\n", + " \"delay\": 500.0,\n", + " \"duration\": 1000.0\n", + " }\n", + "},\n", + "```\n", + "\n", + "This will inject a current (amp) of .12 mV with a delay of 500 ms and a duration of 1000 ms (i.e from times 500 - 1500 ms). \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Running the simulation\n", + "\n", + "Once our config file is setup we can run a simulation either through the command line:\n", + "```bash\n", + "$ python run_bionet.py config.json\n", + "```\n", + "\n", + "or through the script" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2018-09-20 14:00:27,900 [INFO] Created log file\n", + "2018-09-20 14:00:28,056 [INFO] Building cells.\n", + "2018-09-20 14:00:28,257 [INFO] Building recurrent connections\n", + "2018-09-20 14:00:28,266 [INFO] Running simulation for 2000.000 ms with the time step 0.100 ms\n", + "2018-09-20 14:00:28,268 [INFO] Starting timestep: 0 at t_sim: 0.000 ms\n", + "2018-09-20 14:00:28,270 [INFO] Block save every 5000 steps\n", + "2018-09-20 14:00:28,401 [INFO] step:5000 t_sim:500.00 ms\n", + "2018-09-20 14:00:28,518 [INFO] step:10000 t_sim:1000.00 ms\n", + "2018-09-20 14:00:28,628 [INFO] step:15000 t_sim:1500.00 ms\n", + "2018-09-20 14:00:28,746 [INFO] step:20000 t_sim:2000.00 ms\n", + "2018-09-20 14:00:28,751 [INFO] Simulation completed in 0.4845 seconds \n" + ] + } + ], + "source": [ + "from bmtk.simulator import bionet\n", + "\n", + "\n", + "conf = bionet.Config.from_json('simulation_config.json')\n", + "conf.build_env()\n", + "net = bionet.BioNetwork.from_config(conf)\n", + "sim = bionet.BioSimulator.from_config(conf, network=net)\n", + "sim.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A quick breakdown of the script:\n", + "```python\n", + "conf = config.from_json('config.json')\n", + "io.setup_output_dir(conf)\n", + "nrn.load_neuron_modules(conf)\n", + "```\n", + "This section loads the configuration file, it setups the output directory and files for writing during the simulation, and loads NEURON mechanisms needed by the cell model(s) during the simulation.\n", + "\n", + "```python\n", + "net = bionet.BioNetwork.from_config(conf)\n", + "```\n", + "Creates a NEURON representation of the network, including cell models that have been converted into their NEURON equivelents.\n", + "\n", + "```python\n", + "sim = Simulation.from_config(conf, network=net)\n", + "sim.run()\n", + "```\n", + "Sets up and runs the NEURON simulation. When finished the output - spike times, membrane potential and Calcium influx, will be saved into the output directory as specified in the config.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Analyzing the run\n", + "\n", + "The results of the simulation are placed into various files as specified in the \"output\" section of the config file. We can change this before run-time if required.\n", + "\n", + "All simulations will save the spike times of the network cells. These are saved in csv format (output/spikes.txt) or hdf5 format(output/spikes.h5). To get the table of spike times for our single-cell network we can run the following method from the analyzer (gid 0 corresponds to our single cell)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
gidstimestamps
00554.8
10594.4
20637.1
30683.9
40734.7
50788.7
60844.9
70902.6
80961.2
901020.4
1001079.9
1101139.7
1201199.5
1301259.5
1401319.5
1501379.5
1601439.6
1701499.7
\n", + "
" + ], + "text/plain": [ + " gids timestamps\n", + "0 0 554.8\n", + "1 0 594.4\n", + "2 0 637.1\n", + "3 0 683.9\n", + "4 0 734.7\n", + "5 0 788.7\n", + "6 0 844.9\n", + "7 0 902.6\n", + "8 0 961.2\n", + "9 0 1020.4\n", + "10 0 1079.9\n", + "11 0 1139.7\n", + "12 0 1199.5\n", + "13 0 1259.5\n", + "14 0 1319.5\n", + "15 0 1379.5\n", + "16 0 1439.6\n", + "17 0 1499.7" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from bmtk.analyzer.spike_trains import to_dataframe\n", + "to_dataframe(config_file='simulation_config.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When setting up the enviornment and config file we specified cell_vars=['v', 'cai']. This indicates to the simulator to also record membrane potential and calcium diffusion (and we can also specify other variables as long as they are supported in NEURON). The recordings are stored in hdf5 format in the file output/cellvars/0.h5 (0 for the gid of our first and only cell)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bmtk.analyzer.cell_vars import plot_report\n", + "\n", + "plot_report(config_file='simulation_config.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Additional Information\n", + "\n", + "### Changing run-time parameters.\n", + "By making changes to the config file, we can change the conditions and simulation parameters without having to rebuild the network, modify paramter files, and changing our run_bionet script. In fact we can iteratively run multiple simulations without any extra coding, only a text editor to change the json file.\n", + "\n", + "The run section of the config.json contains most of the parameters unique to the simulation:\n", + "```json\n", + "\"run\": {\n", + " \"dL\": 20,\n", + " \"nsteps_block\": 5000, \n", + " \"spike_threshold\": -15,\n", + " \"tstop\": 2000.0, \n", + " \"dt\": 0.1\n", + "}\n", + "```\n", + "* dstop - simulation runtime in milliseconds.\n", + "* dt - the time steps of the simulation. decreasing dt should increasing accuracy of firing dynamics, but also increase time it takes to complete.\n", + "* spike_thresdhold - used to determine when to count a action potential\n", + "* save_cell_vars - indicate cell variables that will be recorded (in this case calcium diffusion and membrane potential). \n", + "\n", + "Through the conditions section we can adjust simulation temperature (C) and the initial membrane potential of the cells:\n", + "```json\n", + "\"conditions\": {\n", + " \"celsius\": 34.0, \n", + " \"v_init\": -80\n", + "}\n", + "```\n", + "\n", + "And lastly, the input section lets us control stimulus onto the network. There are a number of different options which will be explained in the following tutorials. But even with a simple current injection we can adjust amplitude, delay and stimulation duration and measure the effect on the cell.\n", + "```json\n", + "\"inputs\": {\n", + " \t\"current_clamp\": {\n", + " \"input_type\": \"current_clamp\",\n", + " \"module\": \"IClamp\",\n", + " \"node_set\": \"all\",\n", + " \"amp\": 0.120,\n", + " \"delay\": 500.0,\n", + " \"duration\": 1000.0\n", + " }\n", + "}\n", + "```\n", + "We can even add multiple injections\n", + "```json\n", + "\"inputs\": {\n", + " \t\"cclamp1\": {\n", + " \"input_type\": \"current_clamp\",\n", + " \"module\": \"IClamp\",\n", + " \"node_set\": \"all\",\n", + " \"amp\": 0.150,\n", + " \"delay\": 0.0,\n", + " \"duration\": 400.0\n", + " }\n", + " \n", + " \"cclamp2\": {\n", + " \"input_type\": \"current_clamp\",\n", + " \"module\": \"IClamp\",\n", + " \"node_set\": \"all\",\n", + " \"amp\": 0.300,\n", + " \"delay\": 500.0,\n", + " \"duration\": 400.0\n", + " }\n", + " \n", + " \"cclamp3\": {\n", + " \"input_type\": \"current_clamp\",\n", + " \"module\": \"IClamp\",\n", + " \"node_set\": \"all\",\n", + " \"amp\": 0.450,\n", + " \"delay\": 1000.0,\n", + " \"duration\": 400.0\n", + " }\n", + "}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Changing cell models\n", + "When building the network we defined the cell model and morphology through the 'dynamics_params' and 'morphology_file' options. After building and saving the network, these values were saved in the node-types csv file." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_type_iddynamics_paramsmodel_processingmodel_typemodel_templatemorphologypotentalcell_name
0100472363762_fit.jsonaibs_perisomaticbiophysicalctdb:Biophys1.hocScnn1a_473845048_m.swcexcScnn1a_473845048
\n", + "
" + ], + "text/plain": [ + " node_type_id dynamics_params model_processing model_type \\\n", + "0 100 472363762_fit.json aibs_perisomatic biophysical \n", + "\n", + " model_template morphology potental cell_name \n", + "0 ctdb:Biophys1.hoc Scnn1a_473845048_m.swc exc Scnn1a_473845048 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "pd.read_csv('network/mcortex_node_types.csv', sep=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we want to run the simulation on a different cell model, all we have to do is \n", + "1. Download new parameters.json and morphology.swc into components/biophysical\n", + "2. Open mcortex_node_types.csv in a text editor and update 'morphology_file' and 'params_file' accordingly.\n", + "\n", + "In our simple one-cell example, it is likely faster to just rebuild the network. However the advantage of the use of the node types becomes clear once we start dealing with a larger network. For example we may have a network of hundreds of thousands of individual cells with tens of thousands of Scnn1a type cells. The process of adjusting/chaning the Scnn1a parameter in the csv then starting another simulation only takes seconds, whereas rebuilding the entire network may take hours." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/02_single_cell_syn.ipynb b/bmtk-vb/docs/tutorial/02_single_cell_syn.ipynb new file mode 100644 index 0000000..5e95a6a --- /dev/null +++ b/bmtk-vb/docs/tutorial/02_single_cell_syn.ipynb @@ -0,0 +1,736 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 2: Single cell simulation with external feedfoward input (with BioNet)\n", + "\n", + "In the previous tutorial we built a single cell and stimulated it with a current injection. In this example we will keep our single-cell network, but instead of stimulation by a step current, we'll set-up an external network that synapses onto our cell.\n", + "\n", + "**Note** - scripts and files for running this tutorial can be found in the directory [sources/chapter02/](sources/chapter02)\n", + "\n", + "**Requirements:**\n", + "* Python 2.7 or 3.6+\n", + "* bmtk\n", + "* NEURON 7.4+" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Building the network.\n", + "\n", + "Similar to the previous tutorial, we want to build and save a network consisting of a single biophysically detailed cell. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from bmtk.builder.networks import NetworkBuilder\n", + "\n", + "\n", + "cortex = NetworkBuilder('mcortex')\n", + "cortex.add_nodes(cell_name='Scnn1a_473845048',\n", + " potental='exc',\n", + " model_type='biophysical',\n", + " model_template='ctdb:Biophys1.hoc',\n", + " model_processing='aibs_perisomatic',\n", + " dynamics_params='472363762_fit.json',\n", + " morphology='Scnn1a_473845048_m.swc')\n", + "\n", + "cortex.build()\n", + "cortex.save_nodes(output_dir='network')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "But we will also want a collection of external spike-generating cells that will synapse onto our cell. To do this we create a second network which can represent thalamic input. We will call our network \"mthalamus\", and it will consist of 10 cells. These cells are not biophysical but instead \"virtual\" cells. Virtual cells don't have a morphology or the normal properties of a neuron, but rather act as spike generators." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "thalamus = NetworkBuilder('mthalamus')\n", + "thalamus.add_nodes(N=10,\n", + " pop_name='tON',\n", + " potential='exc',\n", + " model_type='virtual')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we built our nodes, we want to create a connection between our 10 thalamic cells onto our cortex cell. To do so we use the add_edges function like so:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "thalamus.add_edges(source={'pop_name': 'tON'}, target=cortex.nodes(),\n", + " connection_rule=5,\n", + " syn_weight=0.001,\n", + " delay=2.0,\n", + " weight_function=None,\n", + " target_sections=['basal', 'apical'],\n", + " distance_range=[0.0, 150.0],\n", + " dynamics_params='AMPA_ExcToExc.json',\n", + " model_template='exp2syn')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us break down how this method call works:\n", + "```python\n", + "thalamus.add_edges(source={'pop_name': 'tON'}, target=cortex.nodes(),\n", + "```\n", + "* Here we specify which set of nodes to use as sources and targets. Our source/pre-synaptic cells are all thamalus cells with the property \"pop_name=tON\", which in this case is every thalmus cell (We could also use source=thalamus.nodes(), or source={'level_of_detail': 'filter'}). The target/post-synaptic is all cell(s) of the \"cortex\" network.\n", + "\n", + "```python\n", + "connection_rule=5,\n", + "```\n", + "* The connection_rule parameter determines how many synapses exists between every source/target pair. In this very trivial case we are indicating that between every thamalic --> cortical cell connection, there are 5 synapatic connections. In future tutorials we will show how we can create more complex customized rules.\n", + "\n", + "```python\n", + "syn_weight=0.001,\n", + "delay=2.0,\n", + "weight_function=None,\n", + "```\n", + "* Here we are specifying the connection weight. For every connection in this edge-type, there is a connection strenght of 5e-05 (units) and a connection dealy of 2 ms. The weight function is used to adjusted the weights before runtime. Later we will show how to create customized weight functions.\n", + "\n", + "```python\n", + " target_sections=['basal', 'apical'],\n", + " distance_range=[0.0, 150.0],\n", + "```\n", + "* This is used by BioNet to determine where on the post-synaptic cell to place the synapse. By default placement is random within the given section and range.\n", + "```python\n", + "dynamics_params='AMPA_ExcToExc.json', \n", + "model_template='exp2syn')\n", + "```\n", + "* The params_file give the parameters of the synpase, including the time constant and potential. Here we are using an AMPA type synaptic model with an Excitatory connection. The set_params_function is used by BioNet to convert the model into a valid NEURON synaptic object.\n", + "\n", + "Finally we are ready to build the model and save the thalamic nodes and edges." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "thalamus.build()\n", + "thalamus.save_nodes(output_dir='network')\n", + "thalamus.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The network/ directory will contain multiple nodes and edges files. It should have nodes (and node-types) files for both the thalamus and cortex network. And edges (and edge-types) files for the thalamus --> cortex connections. Nodes and edges for different networks and their connections are spread out across different files which allows us in the future to rebuild, edit or replace part of setup in a piecemeal and efficent manner." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Setting up BioNet environment.\n", + "#### file structure.\n", + "\n", + "Before running a simulation, we will need to create the runtime environment, including parameter files, run-script and configuration files. If using the tutorial these files will already be in place. Otherwise we can use a command-line:\n", + "```bash\n", + "$ python -m bmtk.utils.sim_setup -n network --membrane_report-vars v,cai --membrane_report-sections soma --tstop 2000.0 --dt 0.1 bionet\n", + "```\n", + "\n", + "Also our cortex cell uses a Scnn1a model we can download from the Allen Cell-Types Database\n", + "```bash\n", + " $ wget http://celltypes.brain-map.org/neuronal_model/download/482934212\n", + " $ unzip 482934212\n", + " $ cp fit_parameters.json biophys_components/biophysical_neuron_templates/472363762_fit.json\n", + " $ cp reconstruction.swc biophys_components/morphologies/Scnn1a_473845048_m.swc\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Spike Trains\n", + "\n", + "We need to give our 10 thalamic cells spike trains. There are multiple ways to do this, but an easy way to use a csv file. The following function will create a file to provide the spikes for our 10 cells.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from bmtk.utils.spike_trains import SpikesGenerator\n", + "\n", + "sg = SpikesGenerator(nodes='network/mthalamus_nodes.h5', t_max=3.0)\n", + "sg.set_rate(10.0)\n", + "sg.save_csv('thalamus_spikes.csv', in_ms=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The spikes file consists of 10 rows with 2 columns; the gid and a list of spike times (in milliseconds). Thus you can create your own if you want." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
gidspike-times
0093.1650606428,223.986147783,259.778024671,342....
1195.8688010168,201.659003074,404.670082776,496....
22130.657751839,131.784430622,265.553356715,305....
3369.1281914227,224.055770984,374.561526606,511....
4466.2944104828,220.797101783,273.598966857,489....
55129.642401853,149.509142787,245.219852214,280....
6669.204438027,121.595641545,175.854451607,347.9...
77106.530638435,278.850185694,478.194080473,528....
8820.5105506698,75.7199163271,277.170399557,307....
99102.63071719,316.347302476,456.002763012,513.4...
\n", + "
" + ], + "text/plain": [ + " gid spike-times\n", + "0 0 93.1650606428,223.986147783,259.778024671,342....\n", + "1 1 95.8688010168,201.659003074,404.670082776,496....\n", + "2 2 130.657751839,131.784430622,265.553356715,305....\n", + "3 3 69.1281914227,224.055770984,374.561526606,511....\n", + "4 4 66.2944104828,220.797101783,273.598966857,489....\n", + "5 5 129.642401853,149.509142787,245.219852214,280....\n", + "6 6 69.204438027,121.595641545,175.854451607,347.9...\n", + "7 7 106.530638435,278.850185694,478.194080473,528....\n", + "8 8 20.5105506698,75.7199163271,277.170399557,307....\n", + "9 9 102.63071719,316.347302476,456.002763012,513.4..." + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "pd.read_csv('thalamus_spikes.csv', sep=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last thing that we need to do is to update the configuration file to read \"thalamus_spikes.csv\". To do so we open simulation_config.json in a text editor and add the following to the **input** section.\n", + "\n", + "```json\n", + "\"inputs\": {\n", + " \"lgn_spikes\": {\n", + " \"input_type\": \"spikes\",\n", + " \"module\": \"csv\",\n", + " \"input_file\": \"${BASE_DIR}/thalamus_spikes.csv\",\n", + " \"node_set\": \"mthalamus\"\n", + " }\n", + "}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Running the simulation\n", + "\n", + "Once our config file is setup we can run a simulation either through the command line:\n", + "```bash\n", + "$ python run_bionet.py config.json\n", + "```\n", + "\n", + "or through the script" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2018-09-20 15:39:04,870 [INFO] Created log file\n", + "2018-09-20 15:39:05,048 [INFO] Building cells.\n", + "2018-09-20 15:39:05,179 [INFO] Building recurrent connections\n", + "2018-09-20 15:39:05,182 [INFO] Build virtual cell stimulations for lgn_spikes\n", + "2018-09-20 15:39:05,216 [INFO] Running simulation for 2000.000 ms with the time step 0.100 ms\n", + "2018-09-20 15:39:05,217 [INFO] Starting timestep: 0 at t_sim: 0.000 ms\n", + "2018-09-20 15:39:05,218 [INFO] Block save every 5000 steps\n", + "2018-09-20 15:39:05,354 [INFO] step:5000 t_sim:500.00 ms\n", + "2018-09-20 15:39:05,491 [INFO] step:10000 t_sim:1000.00 ms\n", + "2018-09-20 15:39:05,627 [INFO] step:15000 t_sim:1500.00 ms\n", + "2018-09-20 15:39:05,767 [INFO] step:20000 t_sim:2000.00 ms\n", + "2018-09-20 15:39:05,775 [INFO] Simulation completed in 0.5596 seconds \n" + ] + } + ], + "source": [ + "from bmtk.simulator import bionet\n", + "\n", + "\n", + "conf = bionet.Config.from_json('simulation_config.json')\n", + "conf.build_env()\n", + "net = bionet.BioNetwork.from_config(conf)\n", + "sim = bionet.BioSimulator.from_config(conf, network=net)\n", + "sim.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Analyzing the run" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
gidstimestamps
0079.7
10112.3
20137.2
30234.5
40283.7
50676.5
60734.0
70830.8
801002.8
901162.9
1001362.8
1101758.6
\n", + "
" + ], + "text/plain": [ + " gids timestamps\n", + "0 0 79.7\n", + "1 0 112.3\n", + "2 0 137.2\n", + "3 0 234.5\n", + "4 0 283.7\n", + "5 0 676.5\n", + "6 0 734.0\n", + "7 0 830.8\n", + "8 0 1002.8\n", + "9 0 1162.9\n", + "10 0 1362.8\n", + "11 0 1758.6" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from bmtk.analyzer.spike_trains import to_dataframe\n", + "to_dataframe(config_file='simulation_config.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bmtk.analyzer.cell_vars import plot_report\n", + "\n", + "plot_report(config_file='simulation_config.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Additional things to do:\n", + "\n", + "### Changing edge properties\n", + "\n", + "When using the Network Builder add_edges method, we gave all the edges the same parameter values (delay, weight, target_section, etc.). All connection created by this method call constitute an single edge-type that share the same parameters, and are specified in the mthalamic_edge_type.csv file" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
edge_type_idtarget_querysource_querysyn_weightdynamics_paramsdistance_rangedelaytarget_sectionsmodel_template
0100*pop_name=='tON'0.001AMPA_ExcToExc.json[0.0, 150.0]2.0['basal', 'apical']exp2syn
\n", + "
" + ], + "text/plain": [ + " edge_type_id target_query source_query syn_weight dynamics_params \\\n", + "0 100 * pop_name=='tON' 0.001 AMPA_ExcToExc.json \n", + "\n", + " distance_range delay target_sections model_template \n", + "0 [0.0, 150.0] 2.0 ['basal', 'apical'] exp2syn " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "pd.read_csv('network/mthalamus_mcortex_edge_types.csv', sep=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(if in the build script we called add_edges multiple times, we'd have multiple edge-types). \n", + "\n", + "Using a simple text-editor we can modify this file directly, change parameters before a simulation run without having to rebuild the entire network (although for a network this small it may not be beneficial).\n", + "\n", + "#### weight_function\n", + "\n", + "By default BioNet uses the value in syn_weight to set a synaptic weight, which is a constant stored in the network files. Often we will want to adjust the synaptic weight between simulations, but don't want to have to regenerate the network. BioNet allows us to specify custom synaptic weight functions that will calculate synaptic weight before each simulation. \n", + "\n", + "To do so first we must set the value of 'weight_function' column. Either we can open up the file mthalamus_mcortex_edge_types.csv with a text-editor and change the column. \n", + "\n", + "\n", + "|edge_type_id | target_query | source_query | ... | weight_function |\n", + "|-------------|--------------|----------------|-----|-----------------|\n", + "|100 | * |pop_name=='tON' | ... |*adjusted_weight* |\n", + "\n", + "or we can rebuild the edges\n", + "```python\n", + "thalamus.add_edges(source={'pop_name': 'tON'}, target=cortex.nodes(),\n", + " connection_rule=5,\n", + " syn_weight=0.001,\n", + " weight_function=adjusted_weight,\n", + " delay=2.0,\n", + " target_sections=['basal', 'apical'],\n", + " distance_range=[0.0, 150.0],\n", + " dynamics_params='AMPA_ExcToExc.json',\n", + " model_template='exp2syn')\n", + "```\n", + "\n", + "Then we write a custom weight function. The weight functions will be called during the simulation when building each synapse, and requires three parameters - target_cell, source_cell, and edge_props. These three parameters are dictionaries which can be used to access properties of the source node, target node, and edge, respectively. The function must return a floating point number which will be used to set the synaptic weight\n", + "\n", + "```python\n", + "def adjusted_weights(target_cell, source_cell, edge_props):\n", + " if target_cell['cell_name'] == 'Scnn1a':\n", + " return edge_prop[\"weight_max\"]*0.5\n", + " elif target_cell['cell_name'] == 'Rorb'\n", + " return edge_prop[\"weight_max\"]*1.5\n", + " else:\n", + " ...\n", + "```\n", + "\n", + "Finally we must tell BioNet where to access the function which we can do by using the add_weight_function.\n", + "```python\n", + "from bmtk.simulator import bionet\n", + "\n", + "bionet.nrn.add_weight_function(adjusted_weights)\n", + "\n", + "conf = bionet.Config.from_json('config.json')\n", + "...\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using NWB for spike trains\n", + "\n", + "Instead of using csv files to set the spike trains of our external network, we can also use nwb files. The typical setup would look like the following in the config file:\n", + "\n", + "```json\n", + "\"inputs\": {\n", + " \"LGN_spikes\": {\n", + " \"input_type\": \"spikes\",\n", + " \"module\": \"nwb\",\n", + " \"input_file\": \"$INPUT_DIR/lgn_spikes.nwb\",\n", + " \"node_set\": \"lgn\",\n", + " \"trial\": \"trial_0\"\n", + " },\n", + "}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/03_single_pop.ipynb b/bmtk-vb/docs/tutorial/03_single_pop.ipynb new file mode 100644 index 0000000..e86d6b1 --- /dev/null +++ b/bmtk-vb/docs/tutorial/03_single_pop.ipynb @@ -0,0 +1,478 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 3: Multi-cell, single population network (with BioNet)\n", + "\n", + "In this tutorial, we will create a more complex network that contains multiple biophysical cells, but all of them having the same cell-type (we will cover hetergenous networks in the next tutorial). The network will contain recurrent connections, as well as external input that provide the next with stimululation.\n", + "\n", + "**Note** - scripts and files for running this tutorial can be found in the directory [sources/chapter03/](sources/chapter03)\n", + "\n", + "requirements:\n", + "* bmtk\n", + "* NEURON 7.4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Building the Network\n", + "\n", + "First we will build our internal network, which consists of 100 different cells. All the cells are of the same type (we'll show how to build a heterogeneous network in the next tutorial), however they all have a different location and y-axis rotation.\n", + "\n", + "#### nodes " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from bmtk.builder.networks import NetworkBuilder\n", + "from bmtk.builder.aux.node_params import positions_columinar, xiter_random\n", + "\n", + "cortex = NetworkBuilder('mcortex')\n", + "cortex.add_nodes(N=100,\n", + " pop_name='Scnn1a',\n", + " positions=positions_columinar(N=100, center=[0, 50.0, 0], max_radius=30.0, height=100.0),\n", + " rotation_angle_yaxis=xiter_random(N=100, min_x=0.0, max_x=2*np.pi),\n", + " rotation_angle_zaxis=3.646878266,\n", + " potental='exc',\n", + " model_type='biophysical',\n", + " model_template='ctdb:Biophys1.hoc',\n", + " model_processing='aibs_perisomatic',\n", + " dynamics_params='472363762_fit.json',\n", + " morphology='Scnn1a_473845048_m.swc')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The parameter N is used to indicate the number of cells in our population. The positions of each cell is defined by the columinar built-in method, which will random place our cells in a column (users can define their own positions as shown here). The rotation_angel_yaxis is similarl defined by a built-in function that will randomly assign each cell a given y angle.\n", + "\n", + "One thing to note is that while yaxis is defined by a function which returns a lists of values, the zaxis is defined by a single value. This means that all cells will share the zaxis. we could alteratively give all cells the same y-axis rotation:\n", + "```python\n", + " rotation_angle_yaxis=rotation_value\n", + "```\n", + "or give all cells a unique z-rotation angle\n", + "```python\n", + " rotation_angle_zaxis=xiter_random(N=100, min_x=0.0, max_x=2*np.pi)\n", + "```\n", + "and in general, it is at the discretion of the modeler to choose what parameters are unqiue to each cell, and what parameters are global to the cell-type." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### edges\n", + "\n", + "Next we want to add recurrent edges. To create the connections we will use the built-in distance_connector function, which will assign the number of connections between two cells randomly (between range nsyn_min and nsysn_max) but weighted by distance. The other parameters, including the synaptic model (AMPA_ExcToExc) will be shared by all connections.\n", + "\n", + "To use this, or even customized, connection functions, we must pass in the name of our connection function using the \"connection_rule\" parameter, and the function parameters through \"connection_params\" as a dictionary, which will looks something like:\n", + "```python\n", + " connection_rule=\n", + " connection_params={'param_arg1': val1, 'param_arg2': val2, ...}\n", + "```\n", + "The connection_rule method isn't explicitly called by the script. Rather when the build() method is called, the connection_rule will iterate through every source/target node pair, and use the rule and build a connection matrix.\n", + "\n", + "\n", + "After building the connections based on our connection function, we will save the nodes and edges files into the network/ directory." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from bmtk.builder.aux.edge_connectors import distance_connector\n", + "\n", + "cortex.add_edges(source={'pop_name': 'Scnn1a'}, target={'pop_name': 'Scnn1a'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 50.0, 'nsyn_min': 0, 'nsyn_max': 10},\n", + " syn_weight=2.0e-04,\n", + " distance_range=[30.0, 150.0],\n", + " target_sections=['basal', 'apical', 'soma'],\n", + " delay=2.0,\n", + " dynamics_params='AMPA_ExcToExc.json',\n", + " model_template='exp2syn')\n", + "\n", + "cortex.build()\n", + "cortex.save_nodes(output_dir='network')\n", + "cortex.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### External network\n", + "\n", + "After building our internal network, we will build the external thalamic network which will provide input (see previous tutorial for more detail). Our thalamic network will consist of 100 \"filter\" cells, which aren't actual cells by just place holders for spike-trains." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "thalamus = NetworkBuilder('mthalamus')\n", + "thalamus.add_nodes(N=100,\n", + " pop_name='tON',\n", + " potential='exc',\n", + " model_type='virtual')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The external network doesn't have recurrent connections. Rather all the cells are feedforward onto the internal network. To do this is in a separate script which must reload the saved mcortex cell files using the import function. Then we create an edge with the thalamus nodes as the sources and the cortext nodes as the targets. This time we use the built-in connect_random connection rule, which will randomly assign each thalamus --> cortex connection between 0 and 12 synaptic connections." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from bmtk.builder.aux.edge_connectors import connect_random\n", + "\n", + "thalamus.add_edges(source=thalamus.nodes(), target=cortex.nodes(),\n", + " connection_rule=connect_random,\n", + " connection_params={'nsyn_min': 0, 'nsyn_max': 12},\n", + " syn_weight=1.0e-04,\n", + " distance_range=[0.0, 150.0],\n", + " target_sections=['basal', 'apical'],\n", + " delay=2.0,\n", + " dynamics_params='AMPA_ExcToExc.json',\n", + " model_template='exp2syn')\n", + "\n", + "thalamus.build()\n", + "thalamus.save_nodes(output_dir='network')\n", + "thalamus.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Setting up BioNet\n", + "\n", + "#### file structure.\n", + "\n", + "Before running a simulation, we will need to create the runtime environment, including parameter files, run-script and configuration files. If using the tutorial these files will already be in place. Otherwise we can use a command-line:\n", + "```bash\n", + " $ python -m bmtk.utils.sim_setup -n network --membrane_report-vars v,cai --membrane_report-sections soma --tstop 3000.0 --dt 0.1 bionet\n", + "```\n", + "\n", + "Also our cortex cell uses a Scnn1a model we can download from the Allen Cell-Types Database\n", + "```bash\n", + " $ wget http://celltypes.brain-map.org/neuronal_model/download/482934212\n", + " $ unzip 482934212\n", + " $ cp fit_parameters.json biophys_components/biophysical_neuron_templates/472363762_fit.json\n", + " $ cp reconstruction.swc biophys_components/morphologies/Scnn1a_473845048_m.swc\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Spike Trains\n", + "\n", + "We next need to create a csv (or nwb) file containing spike trains for our thalamic filter cells. Then we must edit the \"input\" section of the config file to reflect where input spike are comming from." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from bmtk.utils.spike_trains import SpikesGenerator\n", + "\n", + "sg = SpikesGenerator(nodes='network/mthalamus_nodes.h5', t_max=3.0)\n", + "sg.set_rate(15.0)\n", + "sg.save_csv('thalamus_spikes.csv', in_ms=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```json\n", + "\"inputs\": {\n", + " \"tc_spikes\": {\n", + " \"input_type\": \"spikes\",\n", + " \"module\": \"csv\",\n", + " \"input_file\": \"${BASE_DIR}/thalamus_spikes.csv\",\n", + " \"node_set\": \"mthalamus\"\n", + " }\n", + "}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Running the simulation\n", + "\n", + "Once our config file is setup we can run a simulation either through the command line:\n", + "```bash\n", + "$ python run_bionet.py config.json\n", + "```\n", + "\n", + "or through the script" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2018-09-20 15:59:16,953 [INFO] Created log file\n", + "2018-09-20 15:59:17,128 [INFO] Building cells.\n", + "2018-09-20 15:59:22,347 [INFO] Building recurrent connections\n", + "2018-09-20 15:59:22,962 [INFO] Build virtual cell stimulations for tc_spikes\n", + "2018-09-20 15:59:30,596 [INFO] Running simulation for 3000.000 ms with the time step 0.100 ms\n", + "2018-09-20 15:59:30,598 [INFO] Starting timestep: 0 at t_sim: 0.000 ms\n", + "2018-09-20 15:59:30,599 [INFO] Block save every 5000 steps\n", + "2018-09-20 15:59:52,769 [INFO] step:5000 t_sim:500.00 ms\n", + "2018-09-20 16:00:14,740 [INFO] step:10000 t_sim:1000.00 ms\n", + "2018-09-20 16:00:36,662 [INFO] step:15000 t_sim:1500.00 ms\n", + "2018-09-20 16:00:58,599 [INFO] step:20000 t_sim:2000.00 ms\n", + "2018-09-20 16:01:20,658 [INFO] step:25000 t_sim:2500.00 ms\n", + "2018-09-20 16:01:43,358 [INFO] step:30000 t_sim:3000.00 ms\n", + "2018-09-20 16:01:44,182 [INFO] Simulation completed in 2.0 minutes, 13.59 seconds \n" + ] + } + ], + "source": [ + "from bmtk.simulator import bionet\n", + "\n", + "\n", + "conf = bionet.Config.from_json('simulation_config.json')\n", + "conf.build_env()\n", + "net = bionet.BioNetwork.from_config(conf)\n", + "sim = bionet.BioSimulator.from_config(conf, network=net)\n", + "sim.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Analyzing the run.\n", + "\n", + "If successful, we should have our results in the 'output' directory. We can use the analyzer to plot a raster of the spikes over time:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\nZAe8JQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bmtk.analyzer.spike_trains import raster_plot\n", + "\n", + "raster_plot(cells_file='network/mcortex_nodes.h5', cell_models_file='network/mcortex_node_types.csv', spikes_file='output/spikes.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In our config file we used the cell_vars and node_id_selections parameters to save the calcium influx and membrane potential of selected cells. We can also use the analyzer to display these traces:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bmtk.analyzer.cell_vars import plot_report\n", + "\n", + "plot_report(config_file='simulation_config.json', gids=[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Modifying the network" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Customized node params\n", + "\n", + "When building our cortex nodes, we used some built-in functions to set certain parameters like positions and y-axis rotations:\n", + "```python\n", + "cortex.add_nodes(N=100,\n", + " pop_name='Scnn1a',\n", + " positions=positions_columinar(N=100, center=[0, 50.0, 0], max_radius=30.0, height=100.0),\n", + " rotation_angle_yaxis=xiter_random(N=100, min_x=0.0, max_x=2*np.pi),\n", + " ...\n", + "```\n", + "\n", + "These functions will assign every cell a unique value in the positions and rotation_angel_yaxis parameters, unlike the pop_name parameter which will be the same for all 100 cells. We can verify by the following code:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cell 0: pop_name: Scnn1a, positions: [ -1.99484437 41.49527042 22.33923077], angle_yaxis: 5.29759513272\n", + "cell 1: pop_name: Scnn1a, positions: [-25.72073426 36.01835631 2.43526216], angle_yaxis: 2.94311607964\n" + ] + } + ], + "source": [ + "cortex_nodes = list(cortex.nodes())\n", + "n0 = cortex_nodes[0]\n", + "n1 = cortex_nodes[1]\n", + "print('cell 0: pop_name: {}, positions: {}, angle_yaxis: {}'.format(n0['pop_name'], n0['positions'], n0['rotation_angle_yaxis']))\n", + "print('cell 1: pop_name: {}, positions: {}, angle_yaxis: {}'.format(n1['pop_name'], n1['positions'], n1['rotation_angle_yaxis']))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Network Builder contains a growing number of built-in functions. However for advanced networks a modeler will probably want to assign parameters using their own functions. To do so, a modeler only needs to passes in, or alternatively create a function that returns, a list of size N. When saving the network, each individual position will be saved in the nodes.h5 file assigned to each cell by gid.\n", + "\n", + "```python\n", + "def cortex_positions(N):\n", + " # codex to create a list/numpy array of N (x, y, z) positions.\n", + " return [...]\n", + "\n", + "cortex.add_nodes(N=100,\n", + " positions=cortex_positions(100),\n", + " ...\n", + "```\n", + "\n", + "or if we wanted we could give all cells the same positions (The builder has no restrictions on this, however this may cause issues if your trying to create connections based on distance). When saving the network, the same position is assigned as a global cell-type property, and thus saved in the node_types.csv file.\n", + "```python\n", + "cortex.add_nodes(N=100,\n", + " positions=np.ndarray([100.23, -50.67, 89.01]),\n", + " ...\n", + "```\n", + "\n", + "We can use the same logic not just for positions and rotation_angle, but for any parameter we choose." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Customized connector functions\n", + "\n", + "When creating edges, we used the built-in distance_connector function to help create the connection matrix. There are a number of built-in connection functions, but we also allow modelers to create their own. To do so, the modeler must create a function that takes in a source, target, and a variable number of parameters, and pass back an natural number representing the number of connections.\n", + "\n", + "The Builder will iterate over that function passing in every source/target node pair (filtered by the source and target parameters in add_edges()). The source and target parameters are essentially dictionaries that can be used to fetch properties of the nodes. A typical example would look like:\n", + "\n", + "```python\n", + "def customized_connector(source, target, param1, param2, param3):\n", + " if source.node_id == target.node_id:\n", + " # necessary if we don't want autapses\n", + " return 0\n", + " source_pot = source['potential']\n", + " target_pot = target['potential']\n", + " # some code to determine number of connections\n", + " return n_synapses\n", + " \n", + "...\n", + "cortex.add_edges(source=, target=,\n", + " connection_rule=customized_connector,\n", + " connection_params={'param1': , 'param2': , 'param3': },\n", + " ...\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/04_multi_pop.ipynb b/bmtk-vb/docs/tutorial/04_multi_pop.ipynb new file mode 100644 index 0000000..bd4f057 --- /dev/null +++ b/bmtk-vb/docs/tutorial/04_multi_pop.ipynb @@ -0,0 +1,735 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 4: Muti-population recurrent network (with BioNet) \n", + "\n", + "Here we will create a heterogenous yet relatively small network consisting of hundreds of cells recurrently connected. All cells will be belong to one of four \"cell-types\". Two of these cells types will be biophysically detailed cells, i.e. containing a full morphology and somatic and dendritic channels and receptors. The other two will be point-neuron models, which lack a full morphology or channels but still active to provide inhibitory and excitory dynamics.\n", + "\n", + "As input to drive the simulation, we will also create an external network of \"virtual cells\" that synapse directly onto our internal cells and provides spike trains stimulus\n", + "\n", + "**Note** - scripts and files for running this tutorial can be found in the directory [sources/chapter04/](sources/chapter04)\n", + "\n", + "requirements:\n", + "* bmtk\n", + "* NEURON 7.4+" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Building the network\n", + "\n", + "#### cells\n", + "\n", + "This network will loosely resemble the mouse V1 cortical column. Along the center of the column will be a population of 50 biophysically detailed neuron: 40 excitory Scnn1a cells and 10 inhibitory PV cells, which we will get their morphologies and biophysical properties from the allen cell-types database. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "from bmtk.builder.networks import NetworkBuilder\n", + "from bmtk.builder.aux.node_params import positions_columinar, xiter_random\n", + "\n", + "net = NetworkBuilder(\"V1\")\n", + "net.add_nodes(N=80, pop_name='Scnn1a',\n", + " positions=positions_columinar(N=80, center=[0, 50.0, 0], max_radius=30.0, height=100.0),\n", + " rotation_angle_yaxis=xiter_random(N=80, min_x=0.0, max_x=2*np.pi),\n", + " rotation_angle_zaxis=xiter_random(N=80, min_x=0.0, max_x=2*np.pi),\n", + " tuning_angle=np.linspace(start=0.0, stop=360.0, num=80, endpoint=False),\n", + " location='VisL4',\n", + " ei='e',\n", + " model_type='biophysical',\n", + " model_template='ctdb:Biophys1.hoc',\n", + " model_processing='aibs_perisomatic',\n", + " dynamics_params='472363762_fit.json',\n", + " morphology='Scnn1a.swc')\n", + "\n", + "net.add_nodes(N=20, pop_name='PV',\n", + " positions=positions_columinar(N=20, center=[0, 50.0, 0], max_radius=30.0, height=100.0),\n", + " rotation_angle_yaxis=xiter_random(N=20, min_x=0.0, max_x=2*np.pi),\n", + " rotation_angle_zaxis=xiter_random(N=20, min_x=0.0, max_x=2*np.pi),\n", + " location='VisL4',\n", + " ei='i',\n", + " model_type='biophysical',\n", + " model_template='ctdb:Biophys1.hoc',\n", + " model_processing='aibs_perisomatic',\n", + " dynamics_params='472912177_fit.json',\n", + " morphology='Pvalb.swc')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To set the position and rotation of each cell, we use the built in function positions_columinar and xiter_random, which returns a list of values given the parameters. A user could set the values themselves using a list (or function that returns a list) of size N. The parameters like location, ei (potential), params_file, etc. are cell-type parameters, and will be used for all N cells of that type.\n", + "\n", + "The excitory cells are also given a tuning_angle parameter. An instrinsic \"tuning angle\" is a property found in some cells in the visual cortex. In this model, we will use this property to determine number of strenght of connections between subsets of cells by using custom functions. But in general most models will not have or use a tuning angle, but they may require some other parameter. In general, users can assign whatever custom parameters they want to cells and cell-types and use them as properties for creating connections and running simulations.\n", + "\n", + "Next we continue to create our point (integrate-and-fire) neurons. Notice they don't have properities like y/z rotation or morphology, as they wouldn't apply to point neurons." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "net.add_nodes(N=200, pop_name='LIF_exc',\n", + " positions=positions_columinar(N=200, center=[0, 50.0, 0], min_radius=30.0, max_radius=60.0, height=100.0),\n", + " tuning_angle=np.linspace(start=0.0, stop=360.0, num=200, endpoint=False),\n", + " location='VisL4',\n", + " ei='e',\n", + " model_type='point_process',\n", + " model_template='nrn:IntFire1',\n", + " dynamics_params='IntFire1_exc_1.json')\n", + "\n", + "net.add_nodes(N=100, pop_name='LIF_inh',\n", + " positions=positions_columinar(N=100, center=[0, 50.0, 0], min_radius=30.0, max_radius=60.0, height=100.0),\n", + " location='VisL4',\n", + " ei='i',\n", + " model_type='point_process',\n", + " model_template='nrn:IntFire1',\n", + " dynamics_params='IntFire1_inh_1.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### connections\n", + "\n", + "Now we want to create connections between the cells. Depending on the model type, and whether or not the presynpatic \"source\" cell is excitory or inhibitory, we will have different synpatic model and parameters. Using the source and target filter parameters, we can create different connection types.\n", + "\n", + "To determine excitory-to-excitory connection matrix we want to use distance and tuning_angle property. To do this we create a customized function \"dist_tuning_connector\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import random\n", + "import math\n", + "\n", + "def dist_tuning_connector(source, target, d_weight_min, d_weight_max, d_max, t_weight_min, t_weight_max, nsyn_min,\n", + " nsyn_max):\n", + " if source['node_id'] == target['node_id']:\n", + " # Avoid self-connections.n_nodes\n", + " return None\n", + "\n", + " r = np.linalg.norm(np.array(source['positions']) - np.array(target['positions']))\n", + " if r > d_max:\n", + " dw = 0.0\n", + " else:\n", + " t = r / d_max\n", + " dw = d_weight_max * (1.0 - t) + d_weight_min * t\n", + "\n", + " if dw <= 0:\n", + " # drop the connection if the weight is too low\n", + " return None\n", + "\n", + " # next create weights by orientation tuning [ aligned, misaligned ] --> [ 1, 0 ], Check that the orientation\n", + " # tuning property exists for both cells; otherwise, ignore the orientation tuning.\n", + " if 'tuning_angel' in source and 'tuning_angle' in target:\n", + "\n", + " # 0-180 is the same as 180-360, so just modulo by 180\n", + " delta_tuning = math.fmod(abs(source['tuning_angle'] - target['tuning_angle']), 180.0)\n", + "\n", + " # 90-180 needs to be flipped, then normalize to 0-1\n", + " delta_tuning = delta_tuning if delta_tuning < 90.0 else 180.0 - delta_tuning\n", + "\n", + " t = delta_tuning / 90.0\n", + " tw = t_weight_max * (1.0 - t) + t_weight_min * t\n", + " else:\n", + " tw = dw\n", + "\n", + " # drop the connection if the weight is too low\n", + " if tw <= 0:\n", + " return None\n", + "\n", + " # filter out nodes by treating the weight as a probability of connection\n", + " if random.random() > tw:\n", + " return None\n", + "\n", + " # Add the number of synapses for every connection.\n", + " # It is probably very useful to take this out into a separate function.\n", + " return random.randint(nsyn_min, nsyn_max)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This first two parameters of this function is \"source\" and \"target\" and are required for all custom connector functions. These are node objects which gives a representation of a single source and target cell, with properties that can be accessed like a python dictionary. When The Network Builder is creating the connection matrix, it will call this function for all possible source-target pairs. The user doesn't call this function directly.\n", + "\n", + "The remaining parameters are optional. Using these parameters, plus the distance and angles between source and target cells, this function determines the number of connections between each given source and target cell. If there are none you can return either None or 0.\n", + "\n", + "To create these connections we call add_edges method of the builder. We use the source and target parameter to filter out only excitory-to-excitory connections. We must also take into consideration the model type (biophysical or integrate-and-fire) of the target when setting parameters. We pass in the function throught the connection_rule parameter, and the function parameters (except source and target) through connection_params. (If our dist_tuning_connector function didn't have any parameters other than source and target, we could just not set connection_params)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "net.add_edges(source={'ei': 'e'}, target={'pop_name': 'Scnn1a'},\n", + " connection_rule=dist_tuning_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 300.0, 't_weight_min': 0.5,\n", + " 't_weight_max': 1.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=6.4e-05,\n", + " weight_function='gaussianLL',\n", + " weight_sigma=50.0,\n", + " distance_range=[30.0, 150.0],\n", + " target_sections=['basal', 'apical'],\n", + " delay=2.0,\n", + " dynamics_params='AMPA_ExcToExc.json',\n", + " model_template='exp2syn')\n", + "\n", + "net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_exc'},\n", + " connection_rule=dist_tuning_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 300.0, 't_weight_min': 0.5,\n", + " 't_weight_max': 1.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=0.0019,\n", + " weight_function='gaussianLL',\n", + " weight_sigma=50.0,\n", + " delay=2.0,\n", + " dynamics_params='instanteneousExc.json',\n", + " model_template='exp2syn')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly we create the other types of connections. But since either the source, target, or both cells will not have the tuning_angle parameter, we don't want to use dist_tuning_connector. Instead we can use the built-in distance_connector function which just creates connections determined by distance." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from bmtk.builder.aux.edge_connectors import distance_connector\n", + "\n", + "### Generating I-to-I connections\n", + "net.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'model_type': 'biophysical'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=0.0002,\n", + " weight_function='wmax',\n", + " distance_range=[0.0, 1e+20],\n", + " target_sections=['somatic', 'basal'],\n", + " delay=2.0,\n", + " dynamics_params='GABA_InhToInh.json',\n", + " model_template='exp2syn')\n", + "\n", + "net.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'model_type': 'point_process'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=0.00225,\n", + " weight_function='wmax',\n", + " delay=2.0,\n", + " dynamics_params='instanteneousInh.json',\n", + " model_template='exp2syn')\n", + "\n", + "### Generating I-to-E connections\n", + "net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'model_type': 'biophysical'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=0.00018,\n", + " weight_function='wmax',\n", + " distance_range=[0.0, 50.0],\n", + " target_sections=['somatic', 'basal', 'apical'],\n", + " delay=2.0,\n", + " dynamics_params='GABA_InhToExc.json',\n", + " model_template='exp2syn')\n", + "\n", + "net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'model_type': 'point_process'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=0.009,\n", + " weight_function='wmax',\n", + " delay=2.0,\n", + " dynamics_params='instanteneousInh.json',\n", + " model_template='exp2syn')\n", + "\n", + "### Generating E-to-I connections\n", + "net.add_edges(source={'ei': 'e'}, target={'pop_name': 'PV'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.26, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=0.00035,\n", + " weight_function='wmax',\n", + " distance_range=[0.0, 1e+20],\n", + " target_sections=['somatic', 'basal'],\n", + " delay=2.0,\n", + " dynamics_params='AMPA_ExcToInh.json',\n", + " model_template='exp2syn')\n", + "\n", + "\n", + "net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_inh'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.26, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=0.0043,\n", + " weight_function='wmax',\n", + " delay=2.0,\n", + " dynamics_params='instanteneousExc.json',\n", + " model_template='exp2syn')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally we build the network (this may take a bit of time since it's essentially iterating over all 400x400 possible connection combinations), and save the nodes and edges." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "net.build()\n", + "net.save_nodes(output_dir='network')\n", + "net.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Building external network\n", + "\n", + "Next we want to create an external network consisting of virtual cells that form a feedforward network onto our V1, which will provide input during the simulation. We will call this LGN, since the LGN is the primary input the layer 4 cells of the V1 (if we wanted to we could also create multiple external networks and run simulations on any number of them). \n", + "\n", + "First we build our LGN nodes. Then we must import the V1 network nodes, and create connections between LGN --> V1." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from bmtk.builder.networks import NetworkBuilder\n", + "\n", + "lgn = NetworkBuilder('LGN')\n", + "lgn.add_nodes(N=500,\n", + " pop_name='tON',\n", + " potential='exc',\n", + " model_type='virtual')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As before, we will use a customized function to determine the number of connections between each source and target pair, however this time our connection_rule is a bit different\n", + "\n", + "In the previous example, our connection_rule function's first two arguments were the presynaptic and postsynaptic cells, which allowed us to choose how many synaptic connections between the pairs existed based on individual properties:\n", + "```python\n", + "def connection_fnc(source, target, ...):\n", + " source['param'] # presynaptic cell params\n", + " target['param'] # postsynaptic cell params\n", + " ...\n", + " return nsyns # number of connections between pair\n", + "```\n", + "\n", + "But for our LGN --> V1 connection, we do things a bit differently. We want to make sure that for every source cell, there are a limited number of presynaptic targets. This is a not really possible with a function that iterates on a one-to-one basis. So instead we have a connector function who's first parameter is a list of all N source cell, and the second parameter is a single target cell. We return an array of integers, size N; which each index representing the number of synaptics between sources and the target. \n", + "\n", + "To tell the builder to use this schema, we must set iterator='all_to_one' in the add_edges method. (By default this is set to 'one_to_one'. You can also use 'one_to_all' iterator which will pass in a single source and all possible targets)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def select_source_cells(sources, target, nsources_min=10, nsources_max=30, nsyns_min=3, nsyns_max=12):\n", + " total_sources = len(sources)\n", + " nsources = np.random.randint(nsources_min, nsources_max)\n", + " selected_sources = np.random.choice(total_sources, nsources, replace=False)\n", + " syns = np.zeros(total_sources)\n", + " syns[selected_sources] = np.random.randint(nsyns_min, nsyns_max, size=nsources)\n", + " return syns\n", + "\n", + "lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='Scnn1a'),\n", + " iterator='all_to_one',\n", + " connection_rule=select_source_cells,\n", + " connection_params={'nsources_min': 10, 'nsources_max': 25},\n", + " syn_weight=4e-03,\n", + " weight_function='wmax',\n", + " distance_range=[0.0, 150.0],\n", + " target_sections=['basal', 'apical'],\n", + " delay=2.0,\n", + " dynamics_params='AMPA_ExcToExc.json',\n", + " model_template='exp2syn')\n", + "\n", + "lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='PV1'),\n", + " connection_rule=select_source_cells,\n", + " connection_params={'nsources_min': 15, 'nsources_max': 30},\n", + " iterator='all_to_one',\n", + " syn_weight=0.001,\n", + " weight_function='wmax',\n", + " distance_range=[0.0, 1.0e+20],\n", + " target_sections=['somatic', 'basal'],\n", + " delay=2.0,\n", + " dynamics_params='AMPA_ExcToInh.json',\n", + " model_template='exp2syn')\n", + "\n", + "lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_exc'),\n", + " connection_rule=select_source_cells,\n", + " connection_params={'nsources_min': 10, 'nsources_max': 25},\n", + " iterator='all_to_one',\n", + " syn_weight= 0.045,\n", + " weight_function='wmax',\n", + " delay=2.0,\n", + " dynamics_params='instanteneousExc.json',\n", + " model_template='exp2syn')\n", + "\n", + "lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_inh'),\n", + " connection_rule=select_source_cells,\n", + " connection_params={'nsources_min': 15, 'nsources_max': 30},\n", + " iterator='all_to_one',\n", + " syn_weight=0.02,\n", + " weight_function='wmax',\n", + " delay=2.0,\n", + " dynamics_params='instanteneousExc.json',\n", + " model_template='exp2syn')\n", + "\n", + "\n", + "lgn.build()\n", + "lgn.save_nodes(output_dir='network')\n", + "lgn.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Setting up BioNet\n", + "\n", + "#### file structure.\n", + "\n", + "Before running a simulation, we will need to create the runtime environment, including parameter files, run-script and configuration files. If using the tutorial these files will already be in place. Otherwise we can use a command-line:\n", + "```bash\n", + " $ python -m bmtk.utils.sim_setup -n network --membrane_report-vars v,cai --membrane_report-cells 10,80 --membrane_report-sections soma --tstop 3000.0 --dt 0.1 bionet\n", + "```\n", + "\n", + "#### cell models\n", + "\n", + "Also our cortex cell uses excitatory and inhbitory biophysical cell models we can download from the Allen Cell-Types Database\n", + "```bash\n", + " $ wget http://celltypes.brain-map.org/neuronal_model/download/482934212 http://celltypes.brain-map.org/neuronal_model/download/478809612\n", + " $ unzip 482934212 -d scnn1a\n", + " $ cp scnn1a/fit_parameters.json biophys_components/biophysical_neuron_templates/472363762_fit.json\n", + " $ cp scnn1a/reconstruction.swc biophys_components/morphologies/Scnn1a.swc\n", + " $ unzip 478809612 -d pvalb\n", + " $ cp pvalb/fit_parameters.json biophys_components/biophysical_neuron_templates/472912177_fit.json\n", + " $ cp pvalb/reconstruction.swc biophys_components/morphologies/Pvalb.swc\n", + "```\n", + "\n", + "The network also contained two intfire neuronal types which are described by parameters files IntFire1_inh_1.json and IntFire1_exc_1.json. The sim_setup script ran above will create these files and add them under components/intfire/. You can open up these files in a text editor and change their parameters if required. These are very simple models, and later on we will show how to create more complex ones.\n", + "\n", + "\n", + "Similarly the synaptic parameters files are stored as json files under biophys_components/synaptic_models/. The Allen cell-types models also required some addition NEURON mechanisms which were added and built under components/mechanisms.\n", + "\n", + "For most network models we have found it convient to use the directory structure as set up by the script. However the user can choose whatever structure that works best in their workflow. Just make sure that everything is described in the \"components\" sections of the config.json:\n", + "```json\n", + "\"components\": {\n", + " \"morphologies_dir\": \"biophys_components/morphologies\", \n", + " \"point_neuron_models_dir\": \"biophys_components/intfire\", \n", + " \"templates_dir\": \"biophys_components/hoc_templates\", \n", + " \"biophysical_neuron_models_dir\": \"biophys_components/biophysical_neuron_templates\", \n", + " \"mechanisms_dir\": \"biophys_components/mechanisms\", \n", + " \"synaptic_models_dir\": \"compbiophys_componentsnents/synaptic_models\"\n", + "}, \n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### lgn input\n", + "\n", + "We need to provide our LGN external network cells with spike-trains so they can activate our recurrent network. Previously we showed how to do this by generating csv files. We can also use NWB files, which are a common format for saving electrophysiological data in neuroscience.\n", + "\n", + "We can use any NWB file generated experimentally or computationally, but for this example we will use a preexsting one. First download the file:\n", + "```bash\n", + " $ wget https://github.com/AllenInstitute/bmtk/raw/develop/docs/examples/NWB_files/lgn_spikes.nwb\n", + "```\n", + "Then we must edit the simulation_config.json file to tell the simulator to find the nwb file and which network to associate it with.\n", + "\n", + "```json\n", + "\n", + "\"inputs\": {\n", + " \"LGN_spikes\": {\n", + " \"input_type\": \"spikes\",\n", + " \"module\": \"nwb\",\n", + " \"input_file\": \"$BASE_DIR/lgn_spikes.nwb\",\n", + " \"node_set\": \"LGN\",\n", + " \"trial\": \"trial_0\"\n", + " }\n", + "},\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Running the simulation\n", + "\n", + "\n", + "We are close to running our simulation, however unlike in previous chapters we need a little more programming to before we can being. \n", + "\n", + "For most of the connections we added the parameter weight_function='wmax'. This is a built-in function that tells the simulator when creating a connection between two cells, just use the 'weight_max' value assigned to that given edge-type. \n", + "\n", + "However, when creating excitatory-to-excitatory connections we used weight_function='gaussianLL'. This is because we want to use the tuning_angel parameter, when avaiable, to determine the synaptic strength between two connections. First we create the function which takes in target, source and connection properties (which are just the edge-type and properties set in the add_edges method). Then we must register the function with the BioNet simulator:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import math\n", + "from bmtk.simulator.bionet.pyfunction_cache import add_weight_function\n", + "\n", + "def gaussianLL(edge_props, source, target):\n", + " src_tuning = source['tuning_angle']\n", + " tar_tuning = target['tuning_angle']\n", + " w0 = edge_props[\"syn_weight\"]\n", + " sigma = edge_props[\"weight_sigma\"]\n", + "\n", + " delta_tuning = abs(abs(abs(180.0 - abs(float(tar_tuning) - float(src_tuning)) % 360.0) - 90.0) - 90.0)\n", + " return w0 * math.exp(-(delta_tuning / sigma) ** 2)\n", + "\n", + "add_weight_function(gaussianLL)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The weights will be adjusted before each simulation, and the function can be changed between different runs.. Simply opening the edge_types.csv file with a text editor and altering the weight_function column allows users to take an existing network and readjust weights on-the-fly.\n", + "\n", + "Finally we are ready to run the simulation. Note that because this is a 400 cell simulation, this may be computationally intensive for some older computers and may take anywhere between a few minutes to half-an-hour to complete." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2018-09-20 17:00:27,407 [INFO] Created log file\n", + "2018-09-20 17:00:27,604 [INFO] Building cells.\n", + "2018-09-20 17:00:32,418 [INFO] Building recurrent connections\n", + "2018-09-20 17:01:06,690 [INFO] Build virtual cell stimulations for LGN_spikes\n", + "2018-09-20 17:01:11,379 [INFO] Running simulation for 3000.000 ms with the time step 0.100 ms\n", + "2018-09-20 17:01:11,380 [INFO] Starting timestep: 0 at t_sim: 0.000 ms\n", + "2018-09-20 17:01:11,381 [INFO] Block save every 5000 steps\n", + "2018-09-20 17:01:41,576 [INFO] step:5000 t_sim:500.00 ms\n", + "2018-09-20 17:02:11,893 [INFO] step:10000 t_sim:1000.00 ms\n", + "2018-09-20 17:02:42,356 [INFO] step:15000 t_sim:1500.00 ms\n", + "2018-09-20 17:03:13,545 [INFO] step:20000 t_sim:2000.00 ms\n", + "2018-09-20 17:03:44,476 [INFO] step:25000 t_sim:2500.00 ms\n", + "2018-09-20 17:04:15,250 [INFO] step:30000 t_sim:3000.00 ms\n", + "2018-09-20 17:04:20,128 [INFO] Simulation completed in 3.0 minutes, 8.749 seconds \n" + ] + } + ], + "source": [ + "from bmtk.simulator import bionet\n", + "\n", + "\n", + "conf = bionet.Config.from_json('simulation_config.json')\n", + "conf.build_env()\n", + "net = bionet.BioNetwork.from_config(conf)\n", + "sim = bionet.BioSimulator.from_config(conf, network=net)\n", + "sim.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Analyzing results\n", + "\n", + "Results of the simulation, as specified in the config, are saved into the output directory. Using the analyzer functions, we can do things like plot the raster plot" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bmtk.analyzer.spike_trains import raster_plot, rates_plot\n", + "\n", + "raster_plot('network/V1_nodes.h5', 'network/V1_node_types.csv', 'output/spikes.h5', group_key='pop_name')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "or we can plot the rates of the different populations" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nIBARSbj/D63Fn/tKJd7MAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\nAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "rates_plot('network/V1_nodes.h5', 'network/V1_node_types.csv', 'output/spikes.h5', group_key='pop_name', smoothed=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In our config file we used the cell_vars and node_id_selections parameters to save the calcium influx and membrane potential of selected cells. We can also use the analyzer to display these traces:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n6bsOAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bmtk.analyzer.cell_vars import plot_report\n", + "\n", + "plot_report(config_file='simulation_config.json', gids=[10, 80])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/05_pointnet_modeling.ipynb b/bmtk-vb/docs/tutorial/05_pointnet_modeling.ipynb new file mode 100644 index 0000000..6d373ac --- /dev/null +++ b/bmtk-vb/docs/tutorial/05_pointnet_modeling.ipynb @@ -0,0 +1,997 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 5: Point-Neuron Network Models (with PointNet)\n", + "\n", + "In this chapter we will create a heterogeneous network of point-model neurons and use the PointNet simulator which will run the network using the NEST simulator. As with the previous BioNet examples will create both a internal recurrently-connected network of different node types, and an external network of \"virtual\" neurons that will drive the firing of the internal neurons. And we'll show how to drive network activity by using a current clamp.\n", + "\n", + "PointNet, like BioNet and the other simulators, use the SONATA data format for representing networks, setting up simulations and saving results. Thus the tools used to build and display biophysically detailed networks in the previous chapters will work just the same. \n", + "\n", + "Requirements:\n", + "* bmtk\n", + "* NEST 2.11+" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Building the network\n", + "\n", + "There are two ways of generating a network of point-neurons. Either we can take the existing biophysical network created in the previous chapters and make some minor adjustments to the neuron models being used. Or we can build a new network from scratch using the BMTK Builder.\n", + "\n", + "### Converting networks\n", + "We want to take the BioNet V1 network and change parameters so that the individual neurons are using point models. Luckily there parameters are stored in the node and edge \"types\" csv files, thus we can easily change them with a simple text editor (emacs, vi, sublime-text, etc). Here is an example of the old *V1_node_types.csv*: " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_type_ideimorphology_filemodel_processingpop_namelocationmodel_templatemodel_typedynamics_params
0100eScnn1a.swcaibs_perisomaticScnn1aL4ctdb:Biophys1.hocbiophysical472363762_fit.json
1101iPvalb.swcaibs_perisomaticPVL4ctdb:Biophys1.hocbiophysical472912177_fit.json
2102eNaNNaNLIF_excVisL4nrn:IntFire1point_processIntFire1_exc_1.json
3103iNaNNaNLIF_inhVisL4nrn:IntFire1point_processIntFire1_inh_1.json
\n", + "
" + ], + "text/plain": [ + " node_type_id ei morphology_file model_processing pop_name location \\\n", + "0 100 e Scnn1a.swc aibs_perisomatic Scnn1a L4 \n", + "1 101 i Pvalb.swc aibs_perisomatic PV L4 \n", + "2 102 e NaN NaN LIF_exc VisL4 \n", + "3 103 i NaN NaN LIF_inh VisL4 \n", + "\n", + " model_template model_type dynamics_params \n", + "0 ctdb:Biophys1.hoc biophysical 472363762_fit.json \n", + "1 ctdb:Biophys1.hoc biophysical 472912177_fit.json \n", + "2 nrn:IntFire1 point_process IntFire1_exc_1.json \n", + "3 nrn:IntFire1 point_process IntFire1_inh_1.json " + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "pd.read_csv('sources/chapter05/converted_network/V1_node_types_bionet.csv', sep=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and here is the *V1_node_types.csv* used for PointNet:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_type_ideimorphology_filemodel_processingpop_namelocationmodel_templatemodel_typedynamics_params
0100eNaNNaNScnn1aL4nest:iaf_psc_alphapoint_process472363762_point.json
1101iNaNNaNPVL4nest:iaf_psc_alphapoint_process472912177_point.json
2102eNaNNaNLIF_excVisL4nest:iaf_psc_alphapoint_processIntFire1_exc_point.json
3103iNaNNaNLIF_inhVisL4nest:iaf_psc_alphapoint_processIntFire1_inh_point.json
\n", + "
" + ], + "text/plain": [ + " node_type_id ei morphology_file model_processing pop_name location \\\n", + "0 100 e NaN NaN Scnn1a L4 \n", + "1 101 i NaN NaN PV L4 \n", + "2 102 e NaN NaN LIF_exc VisL4 \n", + "3 103 i NaN NaN LIF_inh VisL4 \n", + "\n", + " model_template model_type dynamics_params \n", + "0 nest:iaf_psc_alpha point_process 472363762_point.json \n", + "1 nest:iaf_psc_alpha point_process 472912177_point.json \n", + "2 nest:iaf_psc_alpha point_process IntFire1_exc_point.json \n", + "3 nest:iaf_psc_alpha point_process IntFire1_inh_point.json " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.read_csv('sources/chapter05/converted_network/V1_node_types.csv', sep=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Changes:\n", + "* **model_type** - PointNet will not support the \"biophysical\" model_type and only support \"point_process\" neuron models.\n", + "* **model_template** - nrn:IntFire1 and ctdb:Biophys1.hoc are special directives for running NEURON based models. Instead we replaced them with the \"nest:\\\" directive (note we can replace iaf_psc_alpha with any valid NEST model).\n", + "* **dynamics_params** - We have new json parameters files for the new NEST based models.\n", + "* **model_processing** - \"aibs_perisomatic\" is a special command for adjusting the morphology of biophysical models, and since our NEST-based models do not have a morphology we set it to none which tells the simulator to use the models as-is (note: you can implement custom model_processing functions for PointNet that will be explained later)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We must also adjust the *edges_types.csv* files:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
edge_type_idtarget_querysource_querysyn_weightdynamics_paramsdistance_rangedelaytarget_sectionsweight_functionmodel_templateweight_sigma
0100pop_name=='Scnn1a'ei=='e'50.00000ExcToExc.jsonNaN2.0NaNgaussianLLstatic_synapse50.0
1101pop_name=='LIF_exc'ei=='e'50.00000instanteneousExc.jsonNaN2.0NaNgaussianLLstatic_synapse50.0
2102model_type=='biophysical'&ei=='i'ei=='i'50.00000InhToInh.jsonNaN2.0NaNwmaxstatic_synapseNaN
3103model_type=='point_process'&ei=='i'ei=='i'50.00000instanteneousInh.jsonNaN2.0NaNwmaxstatic_synapseNaN
4104model_type=='biophysical'&ei=='e'ei=='i'50.00000InhToExc.jsonNaN2.0NaNwmaxstatic_synapseNaN
5105model_type=='point_process'&ei=='e'ei=='i'30.00000instanteneousInh.jsonNaN2.0NaNwmaxstatic_synapseNaN
6106pop_name=='PV'ei=='e'0.00035ExcToInh.jsonNaN2.0NaNwmaxstatic_synapseNaN
7107pop_name=='LIF_inh'ei=='e'50.00000instanteneousExc.jsonNaN2.0NaNwmaxstatic_synapseNaN
\n", + "
" + ], + "text/plain": [ + " edge_type_id target_query source_query syn_weight \\\n", + "0 100 pop_name=='Scnn1a' ei=='e' 50.00000 \n", + "1 101 pop_name=='LIF_exc' ei=='e' 50.00000 \n", + "2 102 model_type=='biophysical'&ei=='i' ei=='i' 50.00000 \n", + "3 103 model_type=='point_process'&ei=='i' ei=='i' 50.00000 \n", + "4 104 model_type=='biophysical'&ei=='e' ei=='i' 50.00000 \n", + "5 105 model_type=='point_process'&ei=='e' ei=='i' 30.00000 \n", + "6 106 pop_name=='PV' ei=='e' 0.00035 \n", + "7 107 pop_name=='LIF_inh' ei=='e' 50.00000 \n", + "\n", + " dynamics_params distance_range delay target_sections \\\n", + "0 ExcToExc.json NaN 2.0 NaN \n", + "1 instanteneousExc.json NaN 2.0 NaN \n", + "2 InhToInh.json NaN 2.0 NaN \n", + "3 instanteneousInh.json NaN 2.0 NaN \n", + "4 InhToExc.json NaN 2.0 NaN \n", + "5 instanteneousInh.json NaN 2.0 NaN \n", + "6 ExcToInh.json NaN 2.0 NaN \n", + "7 instanteneousExc.json NaN 2.0 NaN \n", + "\n", + " weight_function model_template weight_sigma \n", + "0 gaussianLL static_synapse 50.0 \n", + "1 gaussianLL static_synapse 50.0 \n", + "2 wmax static_synapse NaN \n", + "3 wmax static_synapse NaN \n", + "4 wmax static_synapse NaN \n", + "5 wmax static_synapse NaN \n", + "6 wmax static_synapse NaN \n", + "7 wmax static_synapse NaN " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.read_csv('sources/chapter05/converted_network/V1_V1_edge_types.csv', sep=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **model_template** has been changed to use a NEST based model type (static_synapse)\n", + "* Use different **dynamics_parameter** files \n", + "* It's important to readjust **syn_weight** as values appropiate for NEURON based models are oftern wrong for NEST based models. \n", + "\n", + "Notice we don't have to change any of the hdf5 files. The network topology remains the same making it a powerful tool for comparing networks of different levels of resolution." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Building a model from scratch.\n", + "\n", + "We can use the BMTK Network Builder to create new network files just for point-based modeling\n", + "\n", + "#### V1 Network\n", + "\n", + "First lets build a \"V1\" network of 300 cells, split into 4 different populations " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from bmtk.builder.networks import NetworkBuilder\n", + "from bmtk.builder.aux.node_params import positions_columinar\n", + "\n", + "net = NetworkBuilder(\"V1\")\n", + "net.add_nodes(N=80, # Create a population of 80 neurons\n", + " positions=positions_columinar(N=80, center=[0, 50.0, 0], max_radius=30.0, height=100.0),\n", + " pop_name='Scnn1a', location='VisL4', ei='e', # optional parameters\n", + " model_type='point_process', # Tells the simulator to use point-based neurons\n", + " model_template='nest:iaf_psc_alpha', # tells the simulator to use NEST iaf_psc_alpha models\n", + " dynamics_params='472363762_point.json' # File containing iaf_psc_alpha mdoel parameters\n", + " )\n", + "\n", + "net.add_nodes(N=20, pop_name='PV', location='VisL4', ei='i',\n", + " positions=positions_columinar(N=20, center=[0, 50.0, 0], max_radius=30.0, height=100.0),\n", + " model_type='point_process',\n", + " model_template='nest:iaf_psc_alpha',\n", + " dynamics_params='472912177_point.json')\n", + "\n", + "net.add_nodes(N=200, pop_name='LIF_exc', location='L4', ei='e',\n", + " positions=positions_columinar(N=200, center=[0, 50.0, 0], min_radius=30.0, max_radius=60.0, height=100.0),\n", + " model_type='point_process',\n", + " model_template='nest:iaf_psc_alpha',\n", + " dynamics_params='IntFire1_exc_point.json')\n", + "\n", + "net.add_nodes(N=100, pop_name='LIF_inh', location='L4', ei='i',\n", + " positions=positions_columinar(N=100, center=[0, 50.0, 0], min_radius=30.0, max_radius=60.0, height=100.0),\n", + " model_type='point_process',\n", + " model_template='nest:iaf_psc_alpha',\n", + " dynamics_params='IntFire1_inh_point.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now go ahead and created synaptic connections then build and save our network." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from bmtk.builder.aux.edge_connectors import distance_connector\n", + "\n", + "## E-to-E connections\n", + "net.add_edges(source={'ei': 'e'}, target={'pop_name': 'Scnn1a'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=5.0,\n", + " delay=2.0,\n", + " dynamics_params='ExcToExc.json',\n", + " model_template='static_synapse')\n", + "\n", + "net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_exc'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=-1.0,\n", + " delay=2.0,\n", + " dynamics_params='instanteneousExc.json',\n", + " model_template='static_synapse')\n", + "\n", + "\n", + "### Generating I-to-I connections\n", + "net.add_edges(source={'ei': 'i'}, target={'pop_name': 'PV'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=-1.0,\n", + " delay=2.0,\n", + " dynamics_params='InhToInh.json',\n", + " model_template='static_synapse')\n", + "\n", + "net.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'pop_name': 'LIF_inh'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=10.0,\n", + " delay=2.0,\n", + " dynamics_params='instanteneousInh.json',\n", + " model_template='static_synapse')\n", + "\n", + "### Generating I-to-E connections\n", + "net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'pop_name': 'Scnn1a'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=-15.0,\n", + " delay=2.0,\n", + " dynamics_params='InhToExc.json',\n", + " model_template='static_synapse')\n", + "\n", + "net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'pop_name': 'LIF_exc'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=-15.0,\n", + " delay=2.0,\n", + " dynamics_params='instanteneousInh.json',\n", + " model_template='static_synapse')\n", + "\n", + "### Generating E-to-I connections\n", + "net.add_edges(source={'ei': 'e'}, target={'pop_name': 'PV'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.26, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=15.0,\n", + " delay=2.0,\n", + " dynamics_params='ExcToInh.json',\n", + " model_template='static_synapse')\n", + "\n", + "\n", + "net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_inh'},\n", + " connection_rule=distance_connector,\n", + " connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.26, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7},\n", + " syn_weight=5.0,\n", + " delay=2.0,\n", + " dynamics_params='instanteneousExc.json',\n", + " model_template='static_synapse')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "net.build()\n", + "net.save_nodes(output_dir='network')\n", + "net.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### Building external network\n", + "\n", + "Next we want to create an external network of \"virtual cells\" with spike-trains that will synapse onto our V1 cells and drive activity. We will call this external network \"LGN\" and contains 500 excitatory cells." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lgn = NetworkBuilder('LGN')\n", + "lgn.add_nodes(N=500, pop_name='tON', potential='exc', model_type='virtual')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will use a special function for setting the number of synapses between the LGN --> V1 cells. The select_source_cells function will be called during the build process." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "\n", + "def select_source_cells(sources, target, nsources_min=10, nsources_max=30, nsyns_min=3, nsyns_max=12):\n", + " total_sources = len(sources)\n", + " nsources = np.random.randint(nsources_min, nsources_max)\n", + " selected_sources = np.random.choice(total_sources, nsources, replace=False)\n", + " syns = np.zeros(total_sources)\n", + " syns[selected_sources] = np.random.randint(nsyns_min, nsyns_max, size=nsources)\n", + " return syns\n", + "\n", + "lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='Scnn1a'),\n", + " iterator='all_to_one',\n", + " connection_rule=select_source_cells,\n", + " connection_params={'nsources_min': 10, 'nsources_max': 25},\n", + " syn_weight=20.0,\n", + " delay=2.0,\n", + " dynamics_params='ExcToExc.json',\n", + " model_template='static_synapse')\n", + "\n", + "lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='PV1'),\n", + " connection_rule=select_source_cells,\n", + " connection_params={'nsources_min': 15, 'nsources_max': 30},\n", + " iterator='all_to_one',\n", + " syn_weight=20.0,\n", + " delay=2.0,\n", + " dynamics_params='ExcToInh.json',\n", + " model_template='static_synapse')\n", + "\n", + "lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_exc'),\n", + " connection_rule=select_source_cells,\n", + " connection_params={'nsources_min': 10, 'nsources_max': 25},\n", + " iterator='all_to_one',\n", + " syn_weight= 10.0,\n", + " delay=2.0,\n", + " dynamics_params='instanteneousExc.json',\n", + " model_template='static_synapse')\n", + "\n", + "lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_inh'),\n", + " connection_rule=select_source_cells,\n", + " connection_params={'nsources_min': 15, 'nsources_max': 30},\n", + " iterator='all_to_one',\n", + " syn_weight=10.0,\n", + " delay=2.0,\n", + " dynamics_params='instanteneousExc.json',\n", + " model_template='static_synapse')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally we build and save our lgn network." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "lgn.build()\n", + "lgn.save_nodes(output_dir='network')\n", + "lgn.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Setting up PointNet Environment\n", + "\n", + "#### Directory Structure\n", + "\n", + "Before running a simulation, we will need to create the runtime environment, including parameter files, run-script and configuration files. If using the tutorial these files will already be in place. Otherwise we can use a command-line:\n", + "```bash\n", + "$ python -m bmtk.utils.sim_setup -n network --membrane_report-vars V_m --membrane_report-cells 0,80,100,300 --tstop 3000.0 pointnet\n", + "```\n", + "\n", + "The network files are written to *circuit_config.json* and the simulation parameters are set in *simulation_config*. The simulation time is set to run for 3000.0 ms (tstop). We also specify a membrane-report to record V_m property of 4 cells (gids 0, 80, 100, 300 - one from each cell-type). In general, all the parameters needed to setup and start a simulation are found in the config files, and adjusting network/simulation conditions can be done by editing these json files in a text editor." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### lgn input\n", + "\n", + "We need to provide our LGN external network cells with spike-trains so they can activate our recurrent network. Previously we showed how to do this by generating csv files. We can also use NWB files, which are a common format for saving electrophysiological data in neuroscience.\n", + "\n", + "We can use any NWB file generated experimentally or computationally, but for this example we will use a preexsting one. First download the file:\n", + "```bash\n", + " $ wget https://github.com/AllenInstitute/bmtk/raw/develop/docs/examples/NWB_files/lgn_spikes.nwb\n", + "```\n", + "Then we must edit the simulation_config.json file to tell the simulator to find the nwb file and which network to associate it with.\n", + "\n", + "```json\n", + "\n", + "\"inputs\": {\n", + " \"LGN_spikes\": {\n", + " \"input_type\": \"spikes\",\n", + " \"module\": \"nwb\",\n", + " \"input_file\": \"$BASE_DIR/lgn_spikes.nwb\",\n", + " \"node_set\": \"LGN\",\n", + " \"trial\": \"trial_0\"\n", + " }\n", + "},\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Running the simulation\n", + "\n", + "The call to sim_setup created a file run_pointnet.py which we can run directly in a command line:\n", + "```bash\n", + "$ python run_pointnet.py config.json\n", + "```\n", + "or if you have mpi setup:\n", + "\n", + "```bash\n", + "$ mpirun -np $NCORES python run_pointnet.py config.json\n", + "```\n", + "\n", + "Or we can run it directly" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2018-09-19 17:25:44,305 [INFO] Created log file\n", + "2018-09-19 17:25:44,338 [INFO] Batch processing nodes for V1.\n", + "2018-09-19 17:25:44,355 [INFO] Batch processing nodes for LGN.\n", + "2018-09-19 17:25:44,379 [INFO] Setting up output directory\n", + "2018-09-19 17:25:44,380 [INFO] Building cells.\n", + "2018-09-19 17:25:44,395 [INFO] Building recurrent connections\n", + "2018-09-19 17:25:45,524 [INFO] Build virtual cell stimulations for LGN_spikes\n", + "2018-09-19 17:25:45,682 [INFO] Network created.\n", + "2018-09-19 17:25:45,849 [INFO] Starting Simulation\n", + "2018-09-19 17:26:19,515 [INFO] Simulation finished, finalizing results.\n", + "2018-09-19 17:27:17,135 [INFO] Done.\n" + ] + } + ], + "source": [ + "from bmtk.simulator import pointnet\n", + "\n", + "configure = pointnet.Config.from_json('simulation_config.json')\n", + "configure.build_env()\n", + "network = pointnet.PointNetwork.from_config(configure)\n", + "sim = pointnet.PointSimulator.from_config(configure, network)\n", + "sim.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Analyzing results\n", + "\n", + "Results of the simulation, as specified in the config, are saved into the output directory. Using the analyzer functions, we can do things like plot the raster plot" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bmtk.analyzer.visualization.spikes import plot_spikes, plot_rates\n", + "\n", + "plot_spikes('network/V1_nodes.h5', 'network/V1_node_types.csv', 'output/spikes.h5', group_key='pop_name')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or we can plot the rates of the different populations" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nJWcQSFLJ/X+gTbzuE2g/XgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\nAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_rates('network/V1_nodes.h5', 'network/V1_node_types.csv', 'output/spikes.h5', group_key='pop_name', smoothed=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In our simulation_config.json in the reports section, we can see we also record the V_m (i.e membrane potential) of a select sample of cells. By default these files are written to an hdf5 file with the same name as the report (membrane_potential.h5), and we can use the analyzer to show the time course of some of these cells." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bmtk.analyzer import plot_potential\n", + "\n", + "plot_potential(cell_vars_h5='output/membrane_potential.h5', gids=[0, 80])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Current clamping the cells (Optional)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/06_population_modeling.ipynb b/bmtk-vb/docs/tutorial/06_population_modeling.ipynb new file mode 100644 index 0000000..bc03167 --- /dev/null +++ b/bmtk-vb/docs/tutorial/06_population_modeling.ipynb @@ -0,0 +1,558 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 6: Population Level Modeling (with PopNet)\n", + "\n", + "In this tutorial we will focus on modeling of populations and population firing rates. This is done with the PopNet simulator application of bmtk which uses [DiPDE](https://github.com/AllenInstitute/dipde) engine as a backend. We will first build our networks using the bmtk NetworkBuilder and save them into the SONATA data format. Then we will show how to simulate the firing rates over a given time-source.\n", + "\n", + "Requirements:\n", + "* BMTK\n", + "* DiPDE" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Building the network\n", + "\n", + "\n", + "#### Converting existing networks\n", + "Like BioNet for biophysically detailed modeling, and PointNet with point-based networks, PopNet stores networks in the SONATA data format. PopNet supports simulating networks of individual cells at the population level. First thing you have to do is modify the node-types and edge-types of an existing network to use Population level models (rather than models of individual cells. \n", + "\n", + "---\n", + "**WARNING** - Converting a network of individual nodes into population of nodes is good for a quick and naive simulation, but for faster and more reliable results it's best to build a network from scratch (next section).\n", + "\n", + "---\n", + "\n", + "Here is the node-types csv file of a network set to work with BioNet " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_type_ideimorphology_filemodel_processingpop_namelocationmodel_templatemodel_typedynamics_params
0100eScnn1a.swcaibs_perisomaticScnn1aL4ctdb:Biophys1.hocbiophysical472363762_fit.json
1101iPvalb.swcaibs_perisomaticPVL4ctdb:Biophys1.hocbiophysical472912177_fit.json
2102eNaNNaNLIF_excVisL4nrn:IntFire1point_processIntFire1_exc_1.json
3103iNaNNaNLIF_inhVisL4nrn:IntFire1point_processIntFire1_inh_1.json
\n", + "
" + ], + "text/plain": [ + " node_type_id ei morphology_file model_processing pop_name location \\\n", + "0 100 e Scnn1a.swc aibs_perisomatic Scnn1a L4 \n", + "1 101 i Pvalb.swc aibs_perisomatic PV L4 \n", + "2 102 e NaN NaN LIF_exc VisL4 \n", + "3 103 i NaN NaN LIF_inh VisL4 \n", + "\n", + " model_template model_type dynamics_params \n", + "0 ctdb:Biophys1.hoc biophysical 472363762_fit.json \n", + "1 ctdb:Biophys1.hoc biophysical 472912177_fit.json \n", + "2 nrn:IntFire1 point_process IntFire1_exc_1.json \n", + "3 nrn:IntFire1 point_process IntFire1_inh_1.json " + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "pd.read_csv('sources/chapter06/converted_network/V1_node_types_bionet.csv', sep=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "vs the equivelent form for PopNet" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_type_ideimorphology_filemodel_processingpop_namelocationmodel_templatemodel_typedynamics_params
0100eNaNNaNScnn1aL4dipde:Internalpopulation472363762_pop.json
1101iNaNNaNPVL4dipde:Internalpopulation472912177_pop.json
2102eNaNNaNLIF_excVisL4dipde:InternalpopulationIntFire1_exc_pop.json
3103iNaNNaNLIF_inhVisL4dipde:InternalpopulationIntFire1_inh_pop.json
\n", + "
" + ], + "text/plain": [ + " node_type_id ei morphology_file model_processing pop_name location \\\n", + "0 100 e NaN NaN Scnn1a L4 \n", + "1 101 i NaN NaN PV L4 \n", + "2 102 e NaN NaN LIF_exc VisL4 \n", + "3 103 i NaN NaN LIF_inh VisL4 \n", + "\n", + " model_template model_type dynamics_params \n", + "0 dipde:Internal population 472363762_pop.json \n", + "1 dipde:Internal population 472912177_pop.json \n", + "2 dipde:Internal population IntFire1_exc_pop.json \n", + "3 dipde:Internal population IntFire1_inh_pop.json " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.read_csv('sources/chapter06/converted_network/V1_node_types_popnet.csv', sep=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some things to note:\n", + "* **model_type** is now a population for all nodes, rather than individual biophysical/point types\n", + "* We have set **model_template** to dipde:Internal which will tell the simulator to use special DiPDE model types\n", + "* We are using new **dynamic_params** files with parameters that have been adjusted to appropiate range for DiPDE models.\n", + "* **morophology_file** and **model_processing**, which were used to set and processes individual cell morphologies, is no longer applicable.\n", + "\n", + "We must make similar adjustments to our edge_types.csv files. And finally when we run the simulation we must tell PopNet to cluster nodes together using the **group_by** property\n", + "\n", + "```python\n", + "network = popnet.PopNetwork.from_config(configure, group_by='node_type_id')\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Building a network\n", + "\n", + "We will create a network of two populations, one population of excitatory cells and another of inhibitory cells. Then we will save the network into SONATA formated data files.\n", + "\n", + "The first step is to use the NetworkBuilder to instantiate a new network with two populations:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from bmtk.builder import NetworkBuilder\n", + "\n", + "\n", + "net = NetworkBuilder('V1')\n", + "net.add_nodes(pop_name='excitatory', # name of specific population optional\n", + " ei='e', # Optional\n", + " location='VisL4', # Optional\n", + " model_type='population', # Required, indicates what types of cells are being model\n", + " model_template='dipde:Internal', # Required, instructs what DiPDE objects will be created\n", + " dynamics_params='exc_model.json' # Required, contains parameters used by DiPDE during initialization of object\n", + " )\n", + "\n", + "net.add_nodes(pop_name='inhibitory',\n", + " ei='i',\n", + " model_type='population',\n", + " model_template='dipde:Internal',\n", + " dynamics_params='inh_model.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we will create connections between the two populations:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "net.add_edges(source={'ei': 'e'}, target={'ei': 'i'},\n", + " syn_weight=0.005,\n", + " nsyns=20,\n", + " delay=0.002,\n", + " dynamics_params='ExcToInh.json')\n", + "\n", + "net.add_edges(source={'ei': 'i'}, target={'ei': 'e'},\n", + " syn_weight=-0.002,\n", + " nsyns=10,\n", + " delay=0.002,\n", + " dynamics_params='InhToExc.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and finally we must build and save the network" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "net.build()\n", + "net.save_nodes(output_dir='network')\n", + "net.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### External Nodes\n", + "\n", + "The *dipde:Internal* nodes we created don't carry intrinsic firing rates, and instead we will use External Populations to drive the network activity. To do this we will create a separate network of 'virtual' populations, or alternativly use model_type=dipde:External, that connect to our excitatory population. \n", + "\n", + "Note: we could add 'virtual' populations directly to our V1 network. However creating them as a separate network provides a great advantage if/when we want to replace our external connections with a different model (Or if we want to remove the reccurrent connections and simulation with only feed-foward activity)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "input_net = NetworkBuilder('LGN')\n", + "input_net.add_nodes(pop_name='tON',\n", + " ei='e',\n", + " model_type='virtual')\n", + "\n", + "input_net.add_edges(target=net.nodes(ei='e'),\n", + " syn_weight=0.0025,\n", + " nsyns=10,\n", + " delay=0.002,\n", + " dynamics_params='input_ExcToExc.json')\n", + "\n", + "input_net.build()\n", + "input_net.save_nodes(output_dir='network')\n", + "input_net.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Setting up the PopNet environment\n", + "\n", + "Before running the simulation we need to set up our simulation environment, inlcuding setting up run-scripts, configuration parameters, and placing our parameter files in their appropiate location. The easiest way to do this is through the command-line:\n", + "\n", + "```bash\n", + "$ python -m bmtk.utils.sim_setup -n network --run-time 1500.0 popnet\n", + "```\n", + "\n", + "Which creates initial files to run a 1500 ms simulation using the network files found in our ./network directory.\n", + "\n", + "#### Inputs\n", + "\n", + "We next need to set the firing rates of the External Population. There are multiple ways to set this value which will be discussed later. The best way is to set the firing rates using a input-rates file for each External Population, we can fetch an existing one using the command:\n", + "\n", + "```bash\n", + " $ wget https://github.com/AllenInstitute/bmtk/raw/develop/docs/examples/pop_2pops/lgn_rates.csv\n", + "\n", + "```\n", + "\n", + "Then we must open the simulation_config.json file with a text editor and add the lgn_rates.csv file as a part of our inputs:\n", + "\n", + "```json\n", + " \"inputs\": {\n", + " \"LGN_pop_rates\": {\n", + " \"input_type\": \"csv\",\n", + " \"module\": \"pop_rates\",\n", + " \"rates\": \"${BASE_DIR}/lgn_rates.csv\",\n", + " \"node_set\": \"LGN\"\n", + " }\n", + " }\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Running the simulation\n", + "\n", + "The call to sim_setup created a file run_pointnet.py which we can run directly in a command line:\n", + "```bash\n", + "$ python run_popnet.py config.json\n", + "```\n", + "\n", + "Or we can run it directly using the following python code:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2018-09-20 09:43:43,783 [INFO] Created log file\n", + "2018-09-20 09:43:43,841 [INFO] Building cells.\n", + "2018-09-20 09:43:43,845 [INFO] Building recurrent connections\n", + "2018-09-20 09:43:43,852 [INFO] Build virtual cell stimulations for LGN_pop_rates\n", + "2018-09-20 09:43:43,867 [INFO] Network created.\n", + "running simulation...\n", + "done simulation.\n" + ] + } + ], + "source": [ + "from bmtk.simulator import popnet\n", + "\n", + "configure = popnet.config.from_json('simulation_config.json')\n", + "configure.build_env()\n", + "network = popnet.PopNetwork.from_config(configure)\n", + "sim = popnet.PopSimulator.from_config(configure, network)\n", + "sim.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Analyzing results\n", + "\n", + "As specified in the \"output\" section of simulation_config.json, the results will be written to ouput/spike_rates.csv. The BMTK analyzer includes code for ploting and analyzing the firing rates of our network:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEKCAYAAAARnO4WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmUXGW57/Hv09VzupMmAxmAkEFQwhDAgAfkqIGrogJH\nlPFyuSiyAI8MDgRyOKCiHCeW4lFEb5ayuAoX4SiHJVyVqx7mQU00kSHKIGMCJCFjTzU+949d1V1d\nPaTSqV1Vvffvs1avqtq1q/ZTTerph2e/+33N3RERkehrqHUAIiJSHUr4IiIxoYQvIhITSvgiIjGh\nhC8iEhNK+CIiMaGELyISE0r4IiIxoYQvIhITjbUOoNj06dN93rx5tQ5DRGTCWLVq1SZ3n1HOvnWV\n8OfNm8fKlStrHYaIyIRhZi+Vu69aOiIiMaGELyISE3XV0hERGY833niDzZs31zqMqpk6dSozZ87c\n5dcp4YvIhLd582b2339/EolErUMJXTab5ZlnnhlXwldLR0QiIQ7JHnbvcyrhi4hUwPr167n++ut5\n8cUXueyyy0bcZ6znioW1MJVaOiISCdfc/RRPr98+rtcumjOZL5x44LDtL730Et/85jdxdxYuXMia\nNWv46le/yuc+9zluueUWLr/8cjKZDHPnzuXkk09m3bp1PPzwwzz66KPccMMNLF26lFtvvZU33niD\n8847j+eff37gueOPP54vfvGLtLa2cuKJJ7J48WLOOussTjzxRMyMpUuXcuSRR3Laaadx++23Y2a7\n+ytSwueVP0IuA/seVetIRKTO3HjjjbS1tdHW1sYTTzzBcccdxwknnMDdd9/N2rVraW5u5rrrrgOC\n6h3gmGOOYfXq1Vx00UU8++yz9Pf3M3PmTH7yk59w+eWXDzx32WWX8eUvf5n58+dz6qmnsnjxYhYt\nWsTy5cvZtm0by5cvp6+vj3e/+90VSfYQ94TvDj/6b8H9q9+ERLx/HSIT2UgV+u7K5XKcffbZHHLI\nIQB85StfYfr06fT09ODuNDQM74oXb/vOd77DsmXLcHe+8IUvDHnO3QcSeeF2ypQpA7cdHR1cf/31\n3HLLLRX7PPHOcFtfHry/6W8ws/L/YERk4rrooou48sormT17Np2dnSSTSe644w7OO+88br31Vvr6\n+li2bBn77LMPJ510EgCzZs3iueee41vf+hZLly7l61//+sCImuLnLrjgAq6++mra29s588wzhx37\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bmtk.analyzer.visualization.spikes import plot_rates_popnet\n", + "\n", + "plot_rates_popnet('network/V1_node_types.csv', 'output/firing_rates.csv', model_keys='pop_name')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/07_filter_models.ipynb b/bmtk-vb/docs/tutorial/07_filter_models.ipynb new file mode 100644 index 0000000..1469e84 --- /dev/null +++ b/bmtk-vb/docs/tutorial/07_filter_models.ipynb @@ -0,0 +1,44 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 7: Modeling the visual field (with FilterNet)\n", + "\n", + "FilterNet is a part of the BMTK that simulates the effects of visual input onto cells in the LGN. It uses LGNModel as a backend, which uses neural-filters to simulate firing rates and spike-trains one may expect given a stimulus on (especially mouse) visual field. FilterNet supports a number of visual stimuli including static-graitings, moving-graiting, full-field flashes, static images and even movies.\n", + "\n", + "FilterNet is often useful for producing inputs for external networks to feed into models of the V1 and higher cortical areas." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Building the cells\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/NetworkBuilder_Intro.ipynb b/bmtk-vb/docs/tutorial/NetworkBuilder_Intro.ipynb new file mode 100644 index 0000000..ff22dea --- /dev/null +++ b/bmtk-vb/docs/tutorial/NetworkBuilder_Intro.ipynb @@ -0,0 +1,837 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# BMTK Builder (A Quick Introduction)\n", + "\n", + "The Brain Modeling Toolkit (bmtk) was designed to handle large-scale network simulations with pre-set connectivity matrices. Whereas other simulation tools will build and simulate a network in a single script, the bmtk splits up these two processes by saving networks to a file. The advantages of doing it this way includes:\n", + "* Significantly faster when running multiple simulations on the same network.\n", + "* Easy to update and adjust parameters with little-to-no programming required.\n", + "* Improves reproducability of simulations.\n", + "\n", + "Before running a simulation, users should either obtain existing network model files, or as described in this tutorial use the BMTK Builder to create their own from scratch. By default, the bmtk uses the recently developed SONATA dataformat to represent networks and network parameters - for a further information please see the [SONATA documentation](https://github.com/AllenInstitute/sonata/blob/master/docs/SONATA_DEVELOPER_GUIDE.md)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Nodes\n", + "\n", + "Brain networks are represented with directed graph so every network needs nodes. (The simplest network consisting of one node and no edges, usually for single-cell simulations). The bmtk is designed to work across different levels of abstraction, so a node can represent a single biophysically detailed cell, a point-cell model, a population of cells, or even an entire brain region. \n", + "\n", + "To create our node(s) we use the NetworkBuilder class in bmtk.builder, then simply build and save the network." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from bmtk.builder import NetworkBuilder\n", + "\n", + "# Initialize our network\n", + "net = NetworkBuilder(\"mcortex\")\n", + "\n", + "# Add a population of 10 nodes (all of which share model_type, dynamics_params, etc.)\n", + "net.add_nodes(N=10, pop_name='Scnn1a',\n", + " mem_potential='e',\n", + " model_type='biophysical',\n", + " model_template='ctdb:Biophys1.hoc',\n", + " model_processing='aibs_perisomatic',\n", + " dynamics_params='472363762_fit.json',\n", + " morphology='Scnn1a_473845048_m.swc')\n", + "\n", + "# If needed we can add more populations\n", + "# net.add_nodes(N, ...)\n", + "\n", + "# Builds the network files\n", + "net.build()\n", + "\n", + "# Save the network into the specificed directory\n", + "net.save_nodes(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When the NetworkBuilder is instantiated we pass in a name, in this case calling it \"**mcortex**\" because we will be using mouse-cortex models - But you can use any name you want. Just be careful, as often a complete simulation will contain multiple networks (the bmtk/SONATA was designed largely to allow different parts of the network to be built indepenently), so having descriptive naming convention is important." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The add_nodes method is then used to add nodes to the network. The first parameter, **N=10**, indicates that we are adding 10 individual nodes each sharing the same pop_name, mem_potential, model_type etc.\n", + "\n", + "All of the other parameters are completely dependent on the type of network we are looking to build. In this case we want to build a network that runs in BioNet so the parameters are carefully choosen with:\n", + "* *__pop_name__*, *__mem_potential__* - optional parameters, not directly used by BioNet but will be helpfull in the descripion\n", + "* *__model_type__*, *__model_template__*, *__model_processing__* - [Attributes used by BioNet](https://github.com/AllenInstitute/sonata/blob/master/docs/SONATA_DEVELOPER_GUIDE.md#nodes---required-attributes) as instructions on how to build our NEURON-based cell models. All our cells are biophysically-detailed models, using customized templates and functions to build each cell.\n", + "* *__dynamics_params__*, *__morphology__* - Indicates to BioNet the electrophysiological and morphology files used to build each cell. These files can be downloaded from the [Allen Cell-Types Database](http://celltypes.brain-map.org/data).\n", + "\n", + "However the NetworkBuilder is simulator agnositc allowing modelers to choose whatever parameters they need depending on simulator and/or required to describe the models. For example the following could be used by another simulator to build a network describing 100 Izhikevich point neurons. Notice we no longer need parameters like morphology or model_processing, but have new parameter a, b, c, and d which would be required by any Izhikevich neuron model.\n", + "```python\n", + "net.add_nodes(N=100, \n", + " model_type='point_process',\n", + " model_template='nrn:Izhikevich.hoc',\n", + " param_a=0.05, param_b=0.25, param_c=-55.0, parm_d=10)\n", + "```\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally the network is built and saved into the _network/_ folder. When we look in the network folder there are two different files - mcortex_nodes.h5 and mcortex_node_types.csv. The individual cells are stored in the \\*nodes.h5 file. But properties that are shared by a group of nodes are stored in the \\*node_types.csv. **Node types** not only makes the format more compact and faster to read (probably not important for 10 cells, but very important when trying to run a simulation of 100K+ cells), and it also makes easier to change properties (like updating ephys params or using a different morphology) between simulations.\n", + "\n", + "Looking at the files" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mcortex_nodes.h5\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_idnode_type_id
00100
11100
22100
33100
44100
55100
66100
77100
88100
99100
\n", + "
" + ], + "text/plain": [ + " node_id node_type_id\n", + "0 0 100\n", + "1 1 100\n", + "2 2 100\n", + "3 3 100\n", + "4 4 100\n", + "5 5 100\n", + "6 6 100\n", + "7 7 100\n", + "8 8 100\n", + "9 9 100" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from bmtk.analyzer import nodes_table\n", + "print('mcortex_nodes.h5')\n", + "nodes_table(nodes_file='network/mcortex_nodes.h5', population='mcortex')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mcortex_node_types.h5\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_type_iddynamics_paramsmodel_typemodel_processingpop_namemodel_templatemorphologymem_potential
0100472363762_fit.jsonbiophysicalaibs_perisomaticScnn1actdb:Biophys1.hocScnn1a_473845048_m.swce
\n", + "
" + ], + "text/plain": [ + " node_type_id dynamics_params model_type model_processing pop_name \\\n", + "0 100 472363762_fit.json biophysical aibs_perisomatic Scnn1a \n", + "\n", + " model_template morphology mem_potential \n", + "0 ctdb:Biophys1.hoc Scnn1a_473845048_m.swc e " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from bmtk.analyzer import node_types_table\n", + "print('mcortex_node_types.h5')\n", + "node_types_table(node_types_file='network/mcortex_node_types.csv', population='mcortex')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The nodes and node-types are linked together by the node_type_id foreign key. In this case all information (expect each of the 10 unique cell ids, which were autogenerated during the build processes) is stored in the node_types file because all the properties are shared among every node." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Unique node properties\n", + "\n", + "Suppose we have some properties that are unqiue to each individual nodes within a node-type. Instead of calling add_nodes N times, we can just pass in a list of size N. \n", + "\n", + "In the following example we have two types of nodes, 10 biophysical pyramidal type cells and 5 point izhikevich type cells. For the pyramidal cells we have a new parameter 'tuning_angle' which is uniquly assigned a different value to each cell. Similarly for the Izhikevich cells the param_a and param_b parameters are now unqily assigned." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "net = NetworkBuilder(\"mcortex2\")\n", + "net.add_nodes(N=10, pop_name='pyr',\n", + " model_type='biophysical',\n", + " model_template='ctdb:Biophys1.hoc',\n", + " dynamics_params='pyr_ephys.json',\n", + " morphology='pyr_morph.swc',\n", + " tuning_angle=np.linspace(0.0, 360.0, num=10, endpoint=False))\n", + "\n", + "net.add_nodes(N=5, pop_name='izh',\n", + " model_type='point_process',\n", + " model_template='nrn:Izhikevich.hoc',\n", + " param_a=[0.01, 0.02, 0.03, 0.04, 0.05], \n", + " param_b=np.random.rand(5),\n", + " param_c=-55.0, \n", + " d=10)\n", + "\n", + "net.build()\n", + "net.save_nodes(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now when we look at the nodes.h5 file" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mcortex_nodes.h5\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_idnode_type_idtuning_angleparam_aparam_b
001000.0NaNNaN
1110036.0NaNNaN
2210072.0NaNNaN
33100108.0NaNNaN
44100144.0NaNNaN
55100180.0NaNNaN
66100216.0NaNNaN
77100252.0NaNNaN
88100288.0NaNNaN
99100324.0NaNNaN
1010101NaN0.010.166588
1111101NaN0.020.460439
1212101NaN0.030.075776
1313101NaN0.040.911263
1414101NaN0.050.496744
\n", + "
" + ], + "text/plain": [ + " node_id node_type_id tuning_angle param_a param_b\n", + "0 0 100 0.0 NaN NaN\n", + "1 1 100 36.0 NaN NaN\n", + "2 2 100 72.0 NaN NaN\n", + "3 3 100 108.0 NaN NaN\n", + "4 4 100 144.0 NaN NaN\n", + "5 5 100 180.0 NaN NaN\n", + "6 6 100 216.0 NaN NaN\n", + "7 7 100 252.0 NaN NaN\n", + "8 8 100 288.0 NaN NaN\n", + "9 9 100 324.0 NaN NaN\n", + "10 10 101 NaN 0.01 0.166588\n", + "11 11 101 NaN 0.02 0.460439\n", + "12 12 101 NaN 0.03 0.075776\n", + "13 13 101 NaN 0.04 0.911263\n", + "14 14 101 NaN 0.05 0.496744" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from bmtk.analyzer import nodes_table\n", + "print('mcortex_nodes.h5')\n", + "nodes_table(nodes_file='network/mcortex2_nodes.h5', population='mcortex2')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mcortex_node_types.h5\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_type_iddynamics_paramsdpop_namemodel_typemodel_templatemorphologyparam_c
0100pyr_ephys.jsonNaNpyrbiophysicalctdb:Biophys1.hocpyr_morph.swcNaN
1101NaN10.0izhpoint_processnrn:Izhikevich.hocNaN-55.0
\n", + "
" + ], + "text/plain": [ + " node_type_id dynamics_params d pop_name model_type \\\n", + "0 100 pyr_ephys.json NaN pyr biophysical \n", + "1 101 NaN 10.0 izh point_process \n", + "\n", + " model_template morphology param_c \n", + "0 ctdb:Biophys1.hoc pyr_morph.swc NaN \n", + "1 nrn:Izhikevich.hoc NaN -55.0 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from bmtk.analyzer import node_types_table\n", + "print('mcortex_node_types.h5')\n", + "node_types_table(node_types_file='network/mcortex2_node_types.csv', population='mcortex')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that tuning_angle, param's a and b are stored individually for each node where applicable." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Edges\n", + "\n", + "After building our nodes we want to create directed connections between them by using the add_edges method. For the simpliest types of edges, we just need to specify the number of connections between any subset of source and target nodes. For instance if we want to create synaptic connections from every pyr cell to every izh cell:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create connections between pyr --> izh cells\n", + "net.add_edges(source={'pop_name': 'pyr'}, target={'pop_name': 'izh'},\n", + " connection_rule=12,\n", + " syn_weight=5.0e-03,\n", + " dynamics_params='AMPA_ExcToExc.json',\n", + " model_template='Exp2Syn',\n", + " delay=2.0)\n", + "\n", + "# Build and save our network\n", + "net.build()\n", + "net.save_edges(output_dir='network')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Breaking this down, first we specify which nodes to use as sources and which to use as targets by filtering on the parameters of our choice\n", + "```python\n", + "source={'pop_name': 'pyr'}, target={'pop_name': 'izh'}\n", + "```\n", + "We could also filter by more than one parameter if we wanted\n", + "```python\n", + "source={'pop_name': 'pyr'}, target={'pop_name': 'izh', 'param_a': 0.01, ...}\n", + "```\n", + "If source and/or target are not specified it uses all possible nodes.\n", + "\n", + "Next we want to specify the number of connections using the connection_rule parameter.\n", + "```python\n", + "connection_rule=12,\n", + "```\n", + "In this example there are (10 pyr) x (5 izh) = 50 source-target pairs, each with 12 synaptic connection. You can pass in a list of 50 integers. And in the next sections we will show how to customized connection property.\n", + "\n", + "Finally we add edge properties\n", + "```python\n", + "syn_weight=5.0e-03,\n", + "dynamics_params='ExcToExc.json',\n", + "model_template='Exp2Syn',\n", + "delay=2.0)\n", + "```\n", + "These are properties used by BioNet/NEURON to build synapses. Like with nodes, these properties are the same for all 50 x 12 = 600 synapses. These parameters are optional, and depending on the requirements of the model/simulator, we can add or remove parameters are needed.\n", + "\n", + "After building and saving the edges, you'll see in the network folder two edge files were created; mocrtex2_mcortex2_edges.h5 and mocrtex2_mcortex2_edge_types.csv. Like nodes and node-types, we have edges and edge-types - although adding individual edge properties is a bit more complex." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Custom connection rules\n", + "\n", + "In the previous example the number of synapses/connections between any pair of source/target nodes was constant. In many cases we will need to adjust the number of connections based on the types of cells, distance between source and target, etc. Instead of passing an integer to connection_rule we can pass in a function:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def like2like(source, target, min_syns, max_syns):\n", + " \"\"\"A simple function for setting # of synaptic connections based on pop-name attribute. \"\"\"\n", + " if source['node_id'] == target['node_id']:\n", + " # No autapses\n", + " return 0\n", + " \n", + " # favor like-to-like connections\n", + " if source['pop_name'] == target['pop_name']:\n", + " return max_syns\n", + " else:\n", + " return min_syns\n", + " \n", + " \n", + "net.add_edges(source={'pop_name': 'pyr'}, target={'pop_name': 'izh'},\n", + " connection_rule=like2like, # Note that we are passing in the function name but not calling it\n", + " connection_params={'min_syns': 6, 'max_syns': 12}, # are used to set min_syns, max_syns params in like2like function\n", + " syn_weight=5.0e-03,\n", + " dynamics_params='AMPA_ExcToExc.json',\n", + " model_template='Exp2Syn',\n", + " delay=2.0)\n", + "\n", + "# Build and save connections\n", + "net.build()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The like2like() function will be called during the build process for every possible source-target pair (for very larget networks with complex rules the buidling of the edges can take a very long time). All custom functions take as the first two parameters source and target. These two parameters can be used like dictionary objects to get any node property. Using the source and target properties, the function should return an integer representing the number of synapses/connections. If there are no connections for a pair the function should return 0.\n", + "\n", + "Besides source and target, the function also has params min_syns and max_syns. These are optional params and set through connection_params in add_edges. This will allow modelers to reuse the same connection_rule for different edge-types." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Individual edge properties" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So far the edge properties like syn_weight and delay are being stored in the edge_types.cvs file. This means that all synapses created by the same add_edges call will share these values. Often this is desirable - the bmtk simulators have a way of altering synaptic weight during run-time. But other times we may want to have a unique syn_weight, or other property, for each individual connection.\n", + "\n", + "Unfortantely we can't just pass in a list since, if you're using a custom connection_rule, it's hard to predetermine the total number of connections. Instead we need to again create a custom rule for setting individual synaptic parameters inside the edges.h5 file" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def rand_syn_weight(source, target, min_weight, max_weight):\n", + " # Do some logic here \n", + " return np.random.uniform(min_weight, max_weight)\n", + "\n", + "conn = net.add_edges(connection_rule=12,\n", + " dynamics_params='AMPA_ExcToExc.json',\n", + " model_template='Exp2Syn',\n", + " delay=2.0)\n", + "\n", + "conn.add_properties('syn_weight', \n", + " rule=rand_syn_weight,\n", + " rule_params={'min_weight': 1.0e-06, 'max_weight': 1.0e-03},\n", + " dtypes=np.float)\n", + "net.build()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once again the rand_syn_weight function will be called during the build process. The function will pass in the source and target nodes for every connection, along with any option parameters set in rule_params. The function must return a numerical value according to the specified dtypes. You can also specifiy multiple params in the same call.\n", + "\n", + "```python\n", + "conn.add_properties(['syn_weight', 'sec_id'], rule=my_fnc, dtypes=[np.float, np.uint])\n", + "\n", + "def my_fnc(source, target):\n", + " syn_weight = ... # float\n", + " sec_id = ... # integer\n", + " return syn_weight, sec_id\n", + "```\n", + "\n", + "**Note**: Using add_properties will slow-down the network build-time and increase the size of the resulting network. If a source-target pair has N synpatic connection, the builder will call my_fnc N times, and it will store N different synaptic connections in the edges.h5. It is usually best not to use add_properties and instead let BioNet, PointNet, etc. adjust syn_weight at run-time" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/Simulation_Intro.ipynb b/bmtk-vb/docs/tutorial/Simulation_Intro.ipynb new file mode 100644 index 0000000..a831231 --- /dev/null +++ b/bmtk-vb/docs/tutorial/Simulation_Intro.ipynb @@ -0,0 +1,246 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using the Simulators\n", + "\n", + "The bmtk is capable of running a number of different neuronal simulators across various levels of resolutions. \n", + "\n", + "BioNet - Biophysical neuronal simulation using BioNet \n", + "PointNet - Point neuron simulation using NEST \n", + "FilterNet - Filtering based models using LGNModel \n", + "PopNet - Population rate models using DiPDE \n", + "MintNet - Convolutional neural nets with TensorFlow\n", + "\n", + "Different simulators will have different features and will require different parameters and options to run. But the bmtk uses the same framework for running the different types of simulators and producing output - utilizing the SONATA framework. The following will in general describe how to go about setting up and running one of the various simulators. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Building a network\n", + "\n", + "A main philosophy of the bmtk is to separate the processes of building a network model and running a simulation versus other simulators which use the same script to build a network and then immedietly run a simulation. The main advantages of doing so is so that:\n", + "* Different parts of a network can be built independently by different teams.\n", + "* Allows models to be shared.\n", + "* Models can be readily ported from one simulator to another.\n", + "* Faster to run a large pre-built network across multiple simulations without having to recalculate the connection matricies every time.\n", + "* Easier to adjust and update parameters between simulations.\n", + "\n", + "The bmtk uses the SONATA format to store networks. See the [previous tutorial for building networks](NetworkBuilder_Intro.ipynb) for more information." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up a configuration file\n", + "\n", + "To create the a configuration file and simulation enviornment you can either download and copy a simulator [environment template directory](../environments). Alternatively you can build it using the following:\n", + "\n", + "```bash\n", + "$ python -m bmtk.utils.sim_setup -n network_dir/ [bionet|pointnet|popnet|...]\n", + "```\n", + "\n", + "All the parameters to setup and run a simulation is stored in the file *config.json*. More detail about the configuration file can be found in the [sonata documentation](https://github.com/AllenInstitute/sonata/blob/master/docs/SONATA_DEVELOPER_GUIDE.md#tying-it-all-together---the-networkcircuit-config-file), but we will provide a brief overview of the various sections:\n", + "\n", + "### The mainfest\n", + "\n", + "```json\n", + "\"manifest\": {\n", + " \"$BASE_DIR\": \"${configdir}\",\n", + " \"$OUTPUT_DIR\": \"$BASE_DIR/output\",\n", + " \"$INPUT_DIR\": \"$BASE_DIR/../nwb_files\",\n", + " ...\n", + "},\n", + "```\n", + "\n", + "An optional section that allows users to create variables and references that can be used in other parts of the config.\n", + "\n", + "\n", + "### Run-time and conditions\n", + "```json\n", + "\"run\": {\n", + " \"tstop\": 3000.0,\n", + " \"dt\": 0.1,\n", + " \"spike_threshold\": -15,\n", + " \"nsteps_block\": 5000,\n", + " \"dL\": 20.0\n", + "},\n", + "\n", + "\"conditions\": {\n", + " \"celsius\": 34.0,\n", + " \"v_init\": -80\n", + "},\n", + "```\n", + "\n", + "Parameters for how long a simulation will run (in milliseconds) and other simulation parameters and conditions - depending on the type of simulator.\n", + "\n", + "### Components\n", + "```json\n", + "\"components\": {\n", + " \"morphologies_dir\": \"$COMPONENT_DIR/morphologies\",\n", + " \"synaptic_models_dir\": \"$COMPONENT_DIR/synaptic_models\",\n", + " \"mechanisms_dir\":\"$COMPONENT_DIR/mechanisms\",\n", + " \"biophysical_neuron_models_dir\": \"$COMPONENT_DIR/biophysical_neuron_templates\",\n", + " \"point_neuron_models_dir\": \"$COMPONENT_DIR/point_neuron_templates\"\n", + "},\n", + "```\n", + "\n", + "List of directories contains model files for individual cells and synapses.\n", + "\n", + "### Inputs\n", + "\n", + "```json\n", + "\"inputs\": {\n", + " \"spike_trains\": {\n", + " \"input_type\": \"spikes\",\n", + " \"module\": \"nwb\",\n", + " \"input_file\": \"$INPUT_DIR/lgn_spikes.nwb\",\n", + " \"node_set\": \"lgn\"\n", + " },\n", + " \t\"current_clamp\": {\n", + " \"input_type\": \"current_clamp\",\n", + " \"module\": \"IClamp\",\n", + " \"node_set\": [0, 1, 2, 3, 4],\n", + " \"amp\": 200.1178,\n", + " \"delay\": 100.0,\n", + " \"duration\": 2000.0\n", + " }\n", + "},\n", + "``` \n", + "\n", + "Specifying the types of inputs the network will receive during the simulation. Including spike trains/rates for virtual or external cells, current clamp stimulation, extracellular stimulation, etc.\n", + "\n", + "### Output and reports\n", + "\n", + "```json\n", + "\"output\":{ \n", + " \"log_file\": \"log.txt\",\n", + " \"output_dir\": \"$OUTPUT_DIR\",\n", + " \"spikes_file\": \"spikes.h5\",\n", + " \"overwrite_output_dir\": true\n", + "},\n", + "\"reports\": {\n", + " \"calcium_concentration\": {\n", + " \"cells\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n", + " \"variable_name\": \"cai\",\n", + " \"module\": \"membrane_report\",\n", + " \"file_name\": \"cell_vars.h5\",\n", + " \"sections\": \"soma\"\n", + " },\n", + " \"ecp\": {\n", + " \"cells\": [0],\n", + " \"variable_name\": \"v\",\n", + " \"module\": \"extracellular\",\n", + " \"electrode_positions\": \"$COMPONENT_DIR/recXelectrodes/linear_electrode.csv\",\n", + " \"ecp_file\": \"ecp.h5\",\n", + " \"electrode_channels\": \"all\",\n", + " \"contributions_dir\": \"ecp_contributions\"\n", + " }\n", + "},\n", + "```\n", + "\n", + "The output section is used to specify the main directory where output is written to, as well as log file location and default outputs. Unless absolute paths are specified any file created during the simulation will be written into the directory specified in \"output/output_dir\".\n", + "\n", + "The reports allows user to specify more advanced types of simulation reporting like, depending on the simulator, calcium concentration or local field potentials\n", + "\n", + "### Networks\n", + "```json\n", + "\"networks\": {\n", + " \"nodes\": [\n", + " {\n", + " \"nodes_file\": \"$NETWORK_DIR/v1_nodes.h5\",\n", + " \"node_types_file\": \"$NETWORK_DIR/v1_node_types.csv\"\n", + " },\n", + " {\n", + " \"nodes_file\": \"$NETWORK_DIR/lgn_nodes.h5\",\n", + " \"node_types_file\": \"$NETWORK_DIR/lgn_node_types.csv\"\n", + " }\n", + " ],\n", + "\n", + " \"edges\": [\n", + " {\n", + " \"edges_file\": \"$NETWORK_DIR/v1_v1_edges.h5\",\n", + " \"edge_types_file\": \"$NETWORK_DIR/v1_v1_edge_types.csv\"\n", + " },\n", + " {\n", + " \"edges_file\": \"$NETWORK_DIR/lgn_v1_edges.h5\",\n", + " \"edge_types_file\": \"$NETWORK_DIR/lgn_v1_edge_types.csv\"\n", + " }\n", + " ]\n", + "}\n", + "```\n", + "\n", + "Section to specify the different nodes and edges files used during the simulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the simulation file\n", + "\n", + "Once you have setup your configuration and put the network and model files in their correct places the running a simulation can be done without any extra programming. \n", + "\n", + "```bash\n", + "$ python run_simulator.py config.json\n", + "```\n", + "\n", + "The simulation will run and save the results in the files specified in the output and reports sections of the config. The bmtk also includes a small but growing list of tools for analyzing and graphing the output describe in future chapters.\n", + "\n", + "The bmtk also allows for users to develop custom python code that will executed during the simulation runtime. Including code to tell the simulator to load customized cell and synaptic models, or how to adjust connection weights before and during simulations. Theses options will vary from simulator to simulator and will be futher describe in each simulators documention.\n", + "\n", + "#### Running in Parallel mode\n", + "\n", + "Some of the simulation engines, BioNet and PointNet, allow you to run a network across multple machines/nodes using MPI, but typically require slightly different commands:\n", + "\n", + "#### BioNet (NEURON)\n", + "```bash\n", + "$ mpirun -n $NNODES nrniv nrniv -mpi -python run_bionet.py config.json\n", + "```\n", + "\n", + "#### PointNet (NEST)\n", + "```bash\n", + "$ mpirun -n $NNODES python run_pointnet.py config.json\n", + "```\n", + "\n", + "If you're running the simulations on a HPC cluster make sure to follow the instructions as required by the workload scheduler being used." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmtk-vb/docs/tutorial/images/levels_of_resolution.png b/bmtk-vb/docs/tutorial/images/levels_of_resolution.png new file mode 100644 index 0000000..83ad07d Binary files /dev/null and b/bmtk-vb/docs/tutorial/images/levels_of_resolution.png differ diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/472363762_fit.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/472363762_fit.json new file mode 100644 index 0000000..99f0eb3 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/472363762_fit.json @@ -0,0 +1,173 @@ +{ + "passive": [ + { + "ra": 138.28, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "apic", + "cm": 2.12 + }, + { + "section": "dend", + "cm": 2.12 + } + ], + "e_pas": -92.49911499023438 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 38 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -92.49911499023438 + } + ], + "genome": [ + { + "value": 0.0012021154978800002, + "section": "soma", + "name": "gbar_Im", + "mechanism": "Im" + }, + { + "value": 4.12225901169e-05, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.98228995892999993, + "section": "soma", + "name": "gbar_NaTs", + "mechanism": "NaTs" + }, + { + "value": 0.000209348990528, + "section": "soma", + "name": "gbar_Nap", + "mechanism": "Nap" + }, + { + "value": 0.051758360920800002, + "section": "soma", + "name": "gbar_K_P", + "mechanism": "K_P" + }, + { + "value": 0.00073160714529799998, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00019222004878899999, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.057264803402699994, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.00053599731839199991, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0070061294358100008, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.0012510775510599999, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 717.91660042899991, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 5.71880766722e-06, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00045738760076499994, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 3.2393273274400003e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 9.5861855476200007e-05, + "section": "apic", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/472912177_fit.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/472912177_fit.json new file mode 100644 index 0000000..f06b7f7 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/472912177_fit.json @@ -0,0 +1,163 @@ +{ + "passive": [ + { + "ra": 143.65, + "cm": [ + { + "section": "soma", + "cm": 2.16 + }, + { + "section": "axon", + "cm": 2.16 + }, + { + "section": "dend", + "cm": 2.16 + } + ], + "e_pas": -95.53709411621094 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 55 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -95.53709411621094 + } + ], + "genome": [ + { + "value": 5.1162860430100002e-05, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.058520185129300004, + "section": "soma", + "name": "gbar_NaV", + "mechanism": "NaV" + }, + { + "value": 0.00031192529327399998, + "section": "soma", + "name": "gbar_Kd", + "mechanism": "Kd" + }, + { + "value": 0.051060238264300006, + "section": "soma", + "name": "gbar_Kv2like", + "mechanism": "Kv2like" + }, + { + "value": 0.65076055389700005, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.033385946416300001, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00775048605222, + "section": "soma", + "name": "gbar_Im_v2", + "mechanism": "Im_v2" + }, + { + "value": 0.0027340091995900003, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.00056478972054199987, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0032114779487500003, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.0077204433411699998, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 20.300246788599999, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00026705534351299998, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00066246357111199989, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 9.8019833221899986e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/473862421_fit.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/473862421_fit.json new file mode 100644 index 0000000..9a4e6d1 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/473862421_fit.json @@ -0,0 +1,163 @@ +{ + "passive": [ + { + "ra": 138.99, + "cm": [ + { + "section": "soma", + "cm": 1.94 + }, + { + "section": "axon", + "cm": 1.94 + }, + { + "section": "dend", + "cm": 1.94 + } + ], + "e_pas": -88.23363494873047 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 58 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -88.23363494873047 + } + ], + "genome": [ + { + "value": 0.00030357031297000004, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.052161472289300001, + "section": "soma", + "name": "gbar_NaV", + "mechanism": "NaV" + }, + { + "value": 0.0033126476739899998, + "section": "soma", + "name": "gbar_Kd", + "mechanism": "Kd" + }, + { + "value": 0.019206276717599998, + "section": "soma", + "name": "gbar_Kv2like", + "mechanism": "Kv2like" + }, + { + "value": 1.2128893375100001, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 1.4016010650299999e-05, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.0011153668151199999, + "section": "soma", + "name": "gbar_Im_v2", + "mechanism": "Im_v2" + }, + { + "value": 0.048152669735999999, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.0, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.046090335451600004, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 574.74935741900003, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00058689407428699997, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.0009617982321389999, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 4.1690838408899998e-07, + "section": "dend", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/473863035_fit.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/473863035_fit.json new file mode 100644 index 0000000..35967ea --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/473863035_fit.json @@ -0,0 +1,173 @@ +{ + "passive": [ + { + "ra": 122.88, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "apic", + "cm": 2.28 + }, + { + "section": "dend", + "cm": 2.28 + } + ], + "e_pas": -89.4614028930664 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 41 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -89.4614028930664 + } + ], + "genome": [ + { + "value": 0.00204889965055, + "section": "soma", + "name": "gbar_Im", + "mechanism": "Im" + }, + { + "value": 3.7269252291999993e-05, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.60927080502300002, + "section": "soma", + "name": "gbar_NaTs", + "mechanism": "NaTs" + }, + { + "value": 6.2161868365100004e-05, + "section": "soma", + "name": "gbar_Nap", + "mechanism": "Nap" + }, + { + "value": 0.018147424450599997, + "section": "soma", + "name": "gbar_K_P", + "mechanism": "K_P" + }, + { + "value": 0.000555828337834, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00041743171143300003, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.12468487969900001, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.00097272189665800009, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0066296509568100001, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.00071152004894800005, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 798.67999240300003, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00054589151280800012, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00021542161812900001, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 6.2827249623699998e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 5.9318998497700001e-06, + "section": "apic", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/473863510_fit.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/473863510_fit.json new file mode 100644 index 0000000..e5f322e --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/electrophysiology/473863510_fit.json @@ -0,0 +1,173 @@ +{ + "passive": [ + { + "ra": 35.64, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "apic", + "cm": 2.19 + }, + { + "section": "dend", + "cm": 2.19 + } + ], + "e_pas": -85.07815551757812 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 38 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -85.07815551757812 + } + ], + "genome": [ + { + "value": 0.00043788364247700001, + "section": "soma", + "name": "gbar_Im", + "mechanism": "Im" + }, + { + "value": 0.0019922075246600001, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.71282189194800005, + "section": "soma", + "name": "gbar_NaTs", + "mechanism": "NaTs" + }, + { + "value": 0.0012493753876800001, + "section": "soma", + "name": "gbar_Nap", + "mechanism": "Nap" + }, + { + "value": 0.034836377263399998, + "section": "soma", + "name": "gbar_K_P", + "mechanism": "K_P" + }, + { + "value": 0.0166428509042, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00024972209054299998, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.28059766435600003, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.00015339031713199999, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0033469316039000004, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.0040218816981199999, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 991.140696832, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00092865666454699993, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00091423093354899986, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 3.8264043188599994e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 2.11145615996e-06, + "section": "apic", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc new file mode 100644 index 0000000..7376d58 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc @@ -0,0 +1,1534 @@ +#name E:/Vaa3D-2.938/169250.03.02.01/169250.03.02.01_470218928_Nivi7.swc +#comment +##n,type,x,y,z,radius,parent +1 1 414.8144 408.5224 15.12 6.4406 -1 +2 3 415.7685 414.0582 14.8882 0.3686 1 +3 3 415.6495 414.9757 16.5147 0.5339 2 +4 3 415.3658 416.0739 16.8563 0.661 3 +5 3 415.6415 417.1756 16.515 0.6991 4 +6 3 416.1872 418.1366 17.2357 0.7118 5 +7 3 416.8393 419.0758 17.3597 0.7245 6 +8 3 417.5886 419.9407 17.36 0.7627 7 +9 3 418.4752 420.6625 17.36 0.8008 8 +10 3 419.4945 422.4128 17.3135 0.5466 9 +11 3 420.1923 423.3166 17.1464 0.5212 10 +12 3 420.6133 424.3393 16.4335 0.4957 11 +13 3 421.135 425.3369 15.9295 0.4957 12 +14 3 421.3546 426.458 16.0826 0.4449 13 +15 3 421.6567 427.5608 16.0269 0.3559 14 +16 3 421.5423 428.5184 17.4675 0.2669 15 +17 3 421.4713 429.6498 17.4583 0.2924 16 +18 3 421.4118 430.7492 17.8839 0.3432 17 +19 3 420.9199 431.7662 17.7391 0.3686 18 +20 3 420.174 432.6116 17.9446 0.3686 19 +21 3 419.371 433.3804 17.7316 0.3432 20 +22 3 419.0014 434.3562 16.9249 0.3559 21 +23 3 418.7212 435.324 15.9732 0.3686 22 +24 3 418.4203 436.4211 16.0723 0.3813 23 +25 3 418.1846 437.4965 16.7093 0.394 24 +26 3 417.7648 438.4963 17.4961 0.394 25 +27 3 417.1802 439.1278 16.5441 0.3813 26 +28 3 416.543 439.733 16.4973 0.3432 27 +29 3 415.8188 440.2512 18.1639 0.3178 28 +30 3 414.8453 440.6013 18.958 0.3051 29 +31 3 413.7242 440.6082 18.9213 0.2796 30 +32 3 412.6202 440.8038 19.0162 0.2796 31 +33 3 412.118 441.6995 19.4015 0.3051 32 +34 3 412.285 442.7749 20.083 0.394 33 +35 3 412.817 443.729 20.869 0.4449 34 +36 3 413.5102 444.6316 21.0196 0.4957 35 +37 3 413.556 445.7585 21.2654 0.5212 36 +38 3 413.143 447.0741 19.6034 0.4322 37 +39 3 412.6168 448.0808 19.8881 0.394 38 +40 3 412.0562 449.0143 20.657 0.3432 39 +41 3 411.5151 449.926 21.4312 0.3051 40 +42 3 410.8848 450.8744 21.2789 0.2924 41 +43 3 410.2292 451.8056 21.1624 0.2542 42 +44 3 409.6698 452.7929 20.9762 0.2034 43 +45 3 409.2568 453.8294 20.4523 0.178 44 +46 3 409.0704 454.9436 20.1698 0.178 45 +47 3 409.1802 456.0339 20.5537 0.1907 46 +48 3 409.1585 457.0211 21.546 0.2034 47 +49 3 408.7409 458.0141 22.437 0.2161 48 +50 3 408.4881 459.1055 22.78 0.2161 49 +51 3 408.4904 460.2426 22.8189 0.2034 50 +52 3 408.6723 461.3706 22.8502 0.1907 51 +53 3 408.9983 462.462 22.8077 0.2034 52 +54 3 409.3038 463.5351 23.119 0.2161 53 +55 3 409.2202 464.6299 23.3598 0.2288 54 +56 3 408.6654 465.5977 23.214 0.2161 55 +57 3 408.1895 466.6021 23.0574 0.178 56 +58 3 407.7937 467.658 22.6853 0.1398 57 +59 3 407.1096 468.5458 22.4742 0.1271 58 +60 3 406.1921 469.0686 23.1949 0.1525 59 +61 3 405.2128 469.4415 24.3166 0.178 60 +62 3 404.4051 470.0868 25.3742 0.178 61 +63 3 403.5494 470.7869 25.4982 0.178 62 +64 3 402.6651 471.4756 25.8037 0.1907 63 +65 3 401.6881 472.0396 26.0574 0.2415 64 +66 3 400.9526 472.8244 26.6879 0.2542 65 +67 3 400.4972 473.8471 26.6627 0.2415 66 +68 3 400.1929 474.9465 26.6081 0.2034 67 +69 3 399.693 475.809 27.7763 0.2161 68 +70 3 398.9185 476.6007 27.4254 0.2669 69 +71 3 397.9564 477.1212 26.6462 0.3051 70 +72 3 396.9051 477.5262 26.1811 0.3051 71 +73 3 395.9258 478.0753 25.664 0.2669 72 +74 3 395.0358 478.7617 26.1218 0.2415 73 +75 3 394.2796 479.5877 26.6865 0.2415 74 +76 3 394.2979 480.4628 28.3556 0.2542 75 +77 3 393.9936 481.4684 28.3256 0.2669 76 +78 3 393.1653 482.2029 28.7921 0.2542 77 +79 3 392.3051 482.9499 28.8492 0.2288 78 +80 3 391.4688 483.6088 29.6657 0.2161 79 +81 3 390.4838 483.9257 30.6312 0.2415 80 +82 3 389.5057 484.3719 30.3834 0.2924 81 +83 3 388.6191 485.0594 29.8824 0.3305 82 +84 3 387.6398 485.6314 29.7548 0.3305 83 +85 3 386.7441 486.3178 29.9541 0.3051 84 +86 3 385.8312 486.9253 29.412 0.2542 85 +87 3 385.0429 487.7295 29.0755 0.2288 86 +88 3 385.0704 488.8312 29.4 0.2288 87 +89 3 413.8923 446.5295 21.2332 0.3305 37 +90 3 414.0719 447.6209 21.6059 0.3051 89 +91 3 413.9209 448.7306 21.5765 0.2796 90 +92 3 413.8763 449.846 21.0935 0.2542 91 +93 3 413.8466 450.9797 20.9381 0.1907 92 +94 3 413.2814 451.9166 21.294 0.1652 93 +95 3 412.3491 452.5172 21.782 0.178 94 +96 3 411.2897 452.8616 22.3804 0.2288 95 +97 3 410.3208 453.2002 23.5788 0.2542 96 +98 3 409.218 453.2986 24.0853 0.2796 97 +99 3 408.5087 454.065 24.8021 0.2796 98 +100 3 408.4114 455.1507 25.4965 0.2796 99 +101 3 408.6185 456.1403 26.7708 0.2669 100 +102 3 409.0178 457.1332 27.7544 0.2796 101 +103 3 409.3953 458.1548 28.5242 0.2669 102 +104 3 408.9789 458.8973 30.2677 0.2542 103 +105 3 407.9515 459.356 30.3562 0.2161 104 +106 3 407.2068 460.1763 29.6979 0.2161 105 +107 3 406.6874 461.1681 29.3798 0.2161 106 +108 3 406.4792 462.2847 29.687 0.2288 107 +109 3 406.4232 463.3829 30.3103 0.2288 108 +110 3 406.5341 464.4182 31.3561 0.2161 109 +111 3 406.2985 465.481 32.097 0.2161 110 +112 3 406.0285 466.4706 33.1758 0.2288 111 +113 3 406.0239 467.5745 33.2567 0.2669 112 +114 3 406.2035 468.611 32.58 0.3051 113 +115 3 406.7515 469.6063 32.415 0.3051 114 +116 3 407.2846 470.6004 32.1434 0.2669 115 +117 3 407.645 471.5591 32.5606 0.2161 116 +118 3 407.2034 472.337 33.9486 0.1907 117 +119 3 406.4735 473.1492 34.613 0.2034 118 +120 3 405.9187 473.9901 35.7904 0.2034 119 +121 3 405.0687 474.5941 35.7104 0.2161 120 +122 3 404.0654 474.7108 36.834 0.2161 121 +123 3 403.9075 475.8354 36.5403 0.2415 122 +124 3 403.4785 476.8672 37.0034 0.2542 123 +125 3 402.8218 477.4598 38.7218 0.2542 124 +126 3 401.8952 477.6989 39.7194 0.2288 125 +127 3 401.8106 478.7697 39.459 0.2161 126 +128 3 402.3219 479.7604 39.1384 0.2288 127 +129 3 402.5622 480.8266 39.7446 0.2415 128 +130 3 402.6571 481.8173 41.1012 0.2415 129 +131 3 402.4009 482.8252 41.4795 0.2161 130 +132 3 402.0702 483.7393 42.0918 0.2034 131 +133 3 401.9547 484.7162 43.3311 0.178 132 +134 3 402.219 485.747 43.3927 0.178 133 +135 3 402.6194 486.7777 43.4686 0.178 134 +136 3 402.4889 487.773 44.448 0.1907 135 +137 3 401.8826 488.5932 45.6378 0.2034 136 +138 3 401.1402 489.3986 46.3901 0.2415 137 +139 3 400.3096 490.1685 46.5377 0.2796 138 +140 3 399.526 490.9934 46.478 0.3051 139 +141 3 398.8945 491.9131 46.9462 0.2924 140 +142 3 398.3488 492.8844 47.5555 0.2669 141 +143 3 397.9038 493.9197 48.0208 0.2415 142 +144 3 397.4176 494.9424 48.3753 0.2415 143 +145 3 396.7392 495.8245 48.909 0.2542 144 +146 3 396.1649 496.79 49.1725 0.2415 145 +147 3 395.9716 497.8963 49.2988 0.2161 146 +148 3 395.9476 498.8549 50.664 0.1907 147 +149 3 396.3045 499.8765 51.3192 0.1907 148 +150 3 396.5962 500.9336 52.0904 0.178 149 +151 3 396.2679 502.0101 52.1452 0.2034 150 +152 3 396.1672 503.1312 52.64 0.2796 151 +153 3 421.7573 429.151 15.1718 0.483 15 +154 3 421.9244 430.2653 14.6978 0.4195 153 +155 3 422.0662 431.3841 14.2232 0.3305 154 +156 3 422.12 432.5018 14.6902 0.2796 155 +157 3 422.1966 433.6206 15.2452 0.3432 156 +158 3 422.1406 434.7543 14.9027 0.3813 157 +159 3 421.882 435.8388 14.28 0.394 158 +160 3 420.8296 436.9577 13.186 0.3686 159 +161 3 420.0779 437.6166 11.8448 0.3305 160 +162 3 419.8777 438.5249 12.0445 0.2542 161 +163 3 419.5426 439.3578 13.6772 0.2161 162 +164 3 419.181 440.3679 13.2686 0.2415 163 +165 3 418.8436 441.4559 13.2356 0.2924 164 +166 3 418.4638 442.5335 13.3319 0.3178 165 +167 3 417.8883 443.5128 13.5985 0.3305 166 +168 3 417.4856 444.5767 13.8382 0.3559 167 +169 3 417.425 445.7161 14.0258 0.4195 168 +170 3 417.1299 446.8155 14.273 0.4449 169 +171 3 416.5865 447.8039 13.8558 0.4195 170 +172 3 416.2936 448.7008 12.376 0.3559 171 +173 3 415.7605 449.6686 13.0239 0.3178 172 +174 3 414.9368 450.4317 12.8534 0.2924 173 +175 3 413.9015 450.8493 13.2983 0.2796 174 +176 3 412.9165 451.3961 12.8517 0.2542 175 +177 3 411.8961 451.872 12.549 0.2288 176 +178 3 411.0358 452.611 12.2189 0.1907 177 +179 3 410.1926 453.3478 11.7572 0.178 178 +180 3 409.5314 454.2675 11.6967 0.1907 179 +181 3 408.9949 455.2662 11.655 0.2288 180 +182 3 408.3291 456.1162 12.3222 0.2669 181 +183 3 407.6003 456.7546 13.6881 0.3051 182 +184 3 406.7217 457.3151 13.9454 0.3305 183 +185 3 405.9839 458.0702 12.8789 0.3432 184 +186 3 405.3981 458.9682 12.0534 0.3305 185 +187 3 404.9257 460.0001 11.8423 0.3178 186 +188 3 404.4543 461.0309 11.6248 0.2796 187 +189 3 404.007 462.073 11.3347 0.2542 188 +190 3 403.5037 463.0832 11.6222 0.2161 189 +191 3 402.95 464.0304 12.3953 0.2034 190 +192 3 402.4466 464.9994 13.2031 0.1907 191 +193 3 402.2075 466.0519 13.0155 0.1907 192 +194 3 402.0451 467.1581 12.6353 0.1907 193 +195 3 401.8174 468.2792 12.644 0.1907 194 +196 3 401.4708 469.3626 12.7716 0.178 195 +197 3 400.8519 470.2995 13.1191 0.1652 196 +198 3 400.1106 471.145 13.6234 0.1398 197 +199 3 399.7113 472.1791 13.8687 0.1271 198 +200 3 399.3109 473.2328 13.4935 0.1271 199 +201 3 398.6508 474.148 13.701 0.1525 200 +202 3 398.2596 475.1776 14.3612 0.2034 201 +203 3 398.2722 476.2609 15.1833 0.2542 202 +204 3 397.8409 477.2917 15.3742 0.2924 203 +205 3 397.349 478.2858 14.7389 0.2924 204 +206 3 397.2231 479.3955 15.0836 0.2669 205 +207 3 397.2792 480.5315 14.9005 0.2542 206 +208 3 397.1751 481.6686 14.9134 0.2542 207 +209 3 397.0458 482.7508 15.7142 0.2542 208 +210 3 396.7403 483.8239 15.141 0.2288 209 +211 3 396.3079 484.865 15.4974 0.2034 210 +212 3 396.2908 485.9987 15.5518 0.2161 211 +213 3 396.5653 487.0992 15.3952 0.2415 212 +214 3 396.9634 488.154 15.8682 0.2542 213 +215 3 397.2746 489.2122 16.3523 0.2288 214 +216 3 397.0938 490.3138 16.4032 0.2034 215 +217 3 396.7529 491.3457 15.7492 0.1907 216 +218 3 396.2805 492.3787 16.0202 0.1907 217 +219 3 395.7016 493.3626 16.1857 0.2034 218 +220 3 395.133 494.3418 16.1364 0.2161 219 +221 3 394.5118 495.2742 15.7651 0.2288 220 +222 3 393.8357 496.1757 16.1616 0.2034 221 +223 3 393.1825 497.084 16.5472 0.178 222 +224 3 392.6608 498.0953 16.4119 0.1398 223 +225 3 392.3851 499.1878 16.1297 0.1398 224 +226 3 392.3954 500.3158 15.8334 0.1652 225 +227 3 392.5579 501.4381 16.0118 0.2034 226 +228 3 392.6654 502.5626 16.3489 0.2288 227 +229 3 392.5304 503.6563 15.9905 0.2161 228 +230 3 392.8485 504.6058 15.703 0.2161 229 +231 3 393.679 505.3712 15.9558 0.2161 230 +232 3 394.5942 506.0484 15.9706 0.2415 231 +233 3 395.5815 506.6032 15.6699 0.2415 232 +234 3 396.6225 507.0711 15.5168 0.2288 233 +235 3 397.7082 507.3892 15.7598 0.178 234 +236 3 398.8064 507.3571 16.3929 0.1398 235 +237 3 399.7822 507.8559 16.4368 0.1398 236 +238 3 400.7066 508.5206 16.1647 0.178 237 +239 3 401.5143 509.3237 15.9827 0.2542 238 +240 3 401.7728 510.224 14.56 0.3432 239 +241 3 421.5491 436.4589 14.488 0.4703 159 +242 3 421.8203 437.5217 13.7939 0.4068 241 +243 3 422.0651 438.5936 13.0189 0.3686 242 +244 3 422.2927 439.7056 13.3171 0.3559 243 +245 3 422.2698 440.8347 13.734 0.3686 244 +246 3 422.1818 441.9741 13.6581 0.394 245 +247 3 422.2733 443.0895 13.221 0.3813 246 +248 3 422.8235 443.9956 12.1755 0.3686 247 +249 3 423.4642 444.8307 11.0984 0.3178 248 +250 3 424.2181 445.4484 9.6359 0.2924 249 +251 3 424.9697 446.1234 8.7802 0.2542 250 +252 3 425.5749 446.7126 10.1234 0.2415 251 +253 3 426.3116 447.4619 9.7479 0.2415 252 +254 3 427.0907 448.1551 10.7674 0.2669 253 +255 3 427.7439 449.0646 10.9533 0.2796 254 +256 3 428.5241 449.838 10.7607 0.2796 255 +257 3 429.4873 450.3917 11.4128 0.2415 256 +258 3 430.0822 451.2325 12.0772 0.2288 257 +259 3 430.549 452.2255 11.9157 0.1907 258 +260 3 431.3635 452.9805 11.7505 0.1907 259 +261 3 432.3531 453.5491 11.7524 0.178 260 +262 3 432.9765 454.4563 11.5486 0.2034 261 +263 3 433.3655 455.5316 11.5206 0.2034 262 +264 3 433.9215 456.3004 10.0691 0.2034 263 +265 3 434.704 456.9857 9.4102 0.1907 264 +266 3 434.998 457.8448 11.1104 0.1907 265 +267 3 435.4053 458.7234 12.5023 0.1907 266 +268 3 436.0333 459.6272 12.6302 0.1907 267 +269 3 436.5424 460.508 11.4363 0.1907 268 +270 3 437.2688 461.2986 11.0706 0.2034 269 +271 3 437.7985 462.2629 11.3011 0.2034 270 +272 3 438.3053 463.2548 10.8296 0.2161 271 +273 3 438.9173 464.2066 10.6515 0.2161 272 +274 3 439.4241 465.227 10.5636 0.2415 273 +275 3 439.7845 466.2898 10.7484 0.2415 274 +276 3 440.2101 467.3286 11.062 0.2288 275 +277 3 440.7695 468.2895 10.5963 0.2034 276 +278 3 441.584 469.0068 10.0509 0.2034 277 +279 3 442.5221 469.6532 9.9355 0.2161 278 +280 3 443.3355 470.4048 9.3864 0.2288 279 +281 3 444.1877 471.1427 9.3254 0.2288 280 +282 3 445.1121 471.8142 9.3856 0.2288 281 +283 3 446.0284 472.4869 9.1188 0.2161 282 +284 3 446.7331 473.3586 9.3332 0.2034 283 +285 3 447.4413 474.2452 9.205 0.178 284 +286 3 448.2112 475.0895 9.2305 0.1652 285 +287 3 448.7786 476.0767 9.1448 0.178 286 +288 3 449.3632 477.048 9.52 0.2415 287 +289 3 420.3742 420.9268 17.3779 0.4703 9 +290 3 421.5137 420.857 17.5042 0.483 289 +291 3 422.6565 420.8238 17.5941 0.483 290 +292 3 423.7811 420.6694 17.2483 0.4703 291 +293 3 424.8816 420.3605 17.3186 0.4957 292 +294 3 426.0245 420.3571 17.4199 0.483 293 +295 3 427.2634 421.0252 16.7042 0.4576 294 +296 3 428.1111 421.6658 15.6918 0.4449 295 +297 3 429.0984 422.2161 15.4381 0.4068 296 +298 3 429.8386 422.9951 16.2999 0.3813 297 +299 3 430.422 423.9161 17.1332 0.3559 298 +300 3 430.9597 424.8965 17.7167 0.3178 299 +301 3 431.6941 425.7533 17.3169 0.2924 300 +302 3 432.0613 426.8333 17.3177 0.2415 301 +303 3 432.1918 427.9658 17.0853 0.2669 302 +304 3 432.6986 428.9874 16.8622 0.3178 303 +305 3 432.829 429.699 16.4027 0.2542 304 +306 3 433.1047 430.6405 15.0086 0.3305 305 +307 3 433.4376 431.6804 15.3588 0.3813 306 +308 3 433.4616 432.6608 16.8 0.4195 307 +309 3 433.2431 433.2214 17.6039 0.2161 308 +310 3 433.2236 434.2773 18.4173 0.2415 309 +311 3 433.4399 435.3892 18.4122 0.2542 310 +312 3 433.8734 436.4108 17.8545 0.2796 311 +313 3 434.4626 437.3295 17.0316 0.2669 312 +314 3 434.9968 438.3167 16.613 0.2415 313 +315 3 435.8034 439.0683 16.8876 0.2161 314 +316 3 436.8616 439.471 16.7415 0.2415 315 +317 3 437.8763 439.9881 16.5043 0.2924 316 +318 3 438.8075 440.5704 17.2301 0.3432 317 +319 3 439.1233 441.6012 18.0578 0.3559 318 +320 3 439.2148 442.7188 17.5605 0.3432 319 +321 3 439.2411 443.8617 17.6568 0.3051 320 +322 3 439.296 444.9634 17.185 0.2796 321 +323 3 439.2411 446.0033 16.83 0.2669 322 +324 3 438.8853 446.9288 18.1132 0.2542 323 +325 3 438.7229 447.8817 19.2805 0.2542 324 +326 3 439.002 448.9285 19.0991 0.2415 325 +327 3 439.4161 449.9592 18.7183 0.2542 326 +328 3 439.8737 450.9991 18.935 0.2415 327 +329 3 440.345 451.9612 19.7576 0.2415 328 +330 3 440.9617 452.8364 20.4445 0.2288 329 +331 3 441.4707 453.8042 20.921 0.2415 330 +332 3 442.0828 454.6862 20.7435 0.2669 331 +333 3 442.8321 455.5191 20.7046 0.2796 332 +334 3 443.4224 456.4743 21.1523 0.2924 333 +335 3 443.92 457.4181 20.5523 0.3051 334 +336 3 444.5584 458.323 20.1698 0.3305 335 +337 3 444.9222 459.3755 20.3045 0.3305 336 +338 3 445.3718 460.4085 20.1572 0.3178 337 +339 3 445.7768 461.4232 20.7444 0.3051 338 +340 3 446.1406 462.4666 21.4645 0.2924 339 +341 3 446.6691 463.4676 21.6219 0.2796 340 +342 3 447.2765 464.4114 22.0833 0.2542 341 +343 3 447.8302 465.4009 22.3874 0.2542 342 +344 3 448.1517 466.4912 22.4692 0.2542 343 +345 3 448.6619 467.4842 22.9284 0.2796 344 +346 3 449.2076 468.4749 23.3388 0.2796 345 +347 3 449.8746 469.3935 23.1501 0.2796 346 +348 3 450.6731 470.1554 22.4619 0.2669 347 +349 3 451.5345 470.8818 22.6814 0.2796 348 +350 3 452.1923 471.7833 23.238 0.3051 349 +351 3 452.8044 472.7431 23.1594 0.3559 350 +352 3 453.2482 473.7922 22.9827 0.394 351 +353 3 453.3512 474.9213 23.1829 0.394 352 +354 3 453.4061 476.0619 23.3503 0.3432 353 +355 3 453.4496 477.1956 23.6936 0.2796 354 +356 3 453.3741 478.3236 24.1259 0.2542 355 +357 3 453.8134 479.3612 24.3421 0.2669 356 +358 3 454.6702 480.0933 23.9915 0.2796 357 +359 3 455.4298 480.8221 23.4203 0.2669 358 +360 3 456.4674 481.2156 24.0178 0.2415 359 +361 3 457.5622 481.5279 24.2298 0.2288 360 +362 3 458.6067 481.942 24.6854 0.2161 361 +363 3 459.5997 482.482 24.7352 0.1907 362 +364 3 460.5607 483.022 24.0943 0.1907 363 +365 3 461.4015 483.7507 23.4559 0.2288 364 +366 3 462.3956 484.2106 23.0728 0.2669 365 +367 3 463.4058 484.6362 23.4788 0.2542 366 +368 3 464.0464 485.4861 23.5088 0.2161 367 +369 3 464.3565 486.4654 22.3975 0.2034 368 +370 3 464.901 487.3486 22.2583 0.2288 369 +371 3 465.5302 488.2729 22.1032 0.2288 370 +372 3 465.9443 489.3243 22.1194 0.2161 371 +373 3 466.2978 490.4111 22.1878 0.1907 372 +374 3 466.6204 491.5013 22.451 0.2034 373 +375 3 467.1902 492.444 22.0301 0.2288 374 +376 3 467.5059 493.5262 21.9974 0.2669 375 +377 3 467.9486 494.5203 22.5758 0.3051 376 +378 3 468.1809 495.598 22.0374 0.3051 377 +379 3 468.7952 496.5463 21.8355 0.2669 378 +380 3 469.477 497.4112 22.2468 0.1907 379 +381 3 470.47 497.9512 21.9666 0.1398 380 +382 3 471.4996 498.2429 21.3632 0.1271 381 +383 3 472.6093 498.2143 21.3332 0.1398 382 +384 3 473.6297 498.689 21.2612 0.1525 383 +385 3 474.5404 499.2553 21.2744 0.1398 384 +386 3 475.4624 499.777 21.9915 0.1525 385 +387 3 476.0562 500.6453 21.2089 0.178 386 +388 3 476.4188 501.6097 21.8036 0.2288 387 +389 3 477.1887 502.375 22.2925 0.2415 388 +390 3 478.1359 503.0054 22.1418 0.2288 389 +391 3 479.0694 503.6597 22.2667 0.2034 390 +392 3 479.8016 504.5234 22.4787 0.178 391 +393 3 480.448 505.4043 21.7697 0.178 392 +394 3 481.06 506.3573 21.7974 0.1652 393 +395 3 481.8231 507.205 21.9271 0.1652 394 +396 3 482.3951 508.1225 21.0613 0.1525 395 +397 3 483.2256 508.7368 19.88 0.1907 396 +398 3 433.9467 433.0315 16.2554 0.1525 308 +399 3 434.5953 433.6481 14.5919 0.1652 398 +400 3 435.6958 433.7259 13.9961 0.1907 399 +401 3 436.7083 434.1949 13.8625 0.2161 400 +402 3 437.8305 434.1068 14.2601 0.2288 401 +403 3 438.9356 434.2052 14.8229 0.2288 402 +404 3 440.0133 433.9295 14.9223 0.2288 403 +405 3 441.0223 433.6309 14.1876 0.2415 404 +406 3 442.1446 433.7339 14.5827 0.2669 405 +407 3 443.2382 434.0325 14.7224 0.3051 406 +408 3 444.325 434.3676 14.5113 0.3178 407 +409 3 445.3878 434.7726 14.4337 0.3051 408 +410 3 446.446 435.0895 13.8989 0.2669 409 +411 3 447.4722 435.4361 13.7329 0.2542 410 +412 3 448.4594 435.9967 13.7931 0.2796 411 +413 3 449.5108 436.3674 13.314 0.3305 412 +414 3 450.6022 436.5355 12.6112 0.3813 413 +415 3 451.7244 436.5893 12.444 0.3813 414 +416 3 452.8101 436.8501 12.7361 0.3559 415 +417 3 453.6017 437.3626 11.7267 0.3051 416 +418 3 454.5204 437.6498 11.5307 0.2924 417 +419 3 455.5019 437.8957 12.7725 0.2924 418 +420 3 456.5018 438.3099 13.4848 0.2924 419 +421 3 457.5428 438.7068 13.0687 0.2796 420 +422 3 458.5701 439.1267 12.3973 0.2796 421 +423 3 459.5734 439.5717 11.611 0.2796 422 +424 3 460.6636 439.8257 11.6886 0.2796 423 +425 3 461.7916 439.7673 12.0036 0.2542 424 +426 3 462.8018 439.7113 10.8951 0.2669 425 +427 3 463.9149 439.7994 10.5633 0.2542 426 +428 3 464.9662 439.9916 11.4733 0.2542 427 +429 3 466.0725 439.9138 11.1432 0.2161 428 +430 3 467.1261 439.5031 10.7456 0.2034 429 +431 3 468.2495 439.6918 10.6529 0.1907 430 +432 3 469.2688 440.2112 10.64 0.2034 431 +433 3 432.7226 429.1121 17.598 0.1652 304 +434 3 433.4284 429.4896 18.6074 0.2161 433 +435 3 434.4443 429.7905 17.736 0.2669 434 +436 3 435.4853 430.1703 17.8595 0.3051 435 +437 3 436.3422 430.39 19.5054 0.3305 436 +438 3 437.3569 430.724 20.4061 0.3178 437 +439 3 438.4048 431.177 20.5887 0.2669 438 +440 3 439.2743 431.8829 21.1495 0.2034 439 +441 3 440.1094 432.6608 20.9689 0.1652 440 +442 3 440.2318 433.3781 22.388 0.178 441 +443 3 440.4423 434.418 23.273 0.2161 442 +444 3 440.7855 435.3892 24.3858 0.2542 443 +445 3 441.1573 436.3262 23.8218 0.2542 444 +446 3 441.0395 437.2791 24.7338 0.2288 445 +447 3 441.1973 438.3579 25.4083 0.2034 446 +448 3 441.7842 439.288 26.0859 0.2034 447 +449 3 441.8185 440.3702 26.9472 0.2288 448 +450 3 441.6755 441.465 27.5293 0.2542 449 +451 3 441.9741 442.5381 27.7606 0.2669 450 +452 3 442.3562 443.5402 27.0626 0.2796 451 +453 3 442.7486 444.5698 27.2101 0.3051 452 +454 3 443.2291 445.548 26.7375 0.3178 453 +455 3 443.5139 446.6359 26.4919 0.3178 454 +456 3 443.8834 447.4733 27.8149 0.2924 455 +457 3 444.023 448.4068 29.1508 0.2796 456 +458 3 443.8148 449.4879 28.9282 0.2415 457 +459 3 443.8937 450.5255 27.8975 0.2415 458 +460 3 444.2735 451.5746 27.5937 0.2415 459 +461 3 444.5939 452.3788 29.1805 0.2796 460 +462 3 445.3626 452.9107 30.6872 0.2669 461 +463 3 445.9964 453.8145 31.3488 0.2415 462 +464 3 446.1028 454.9379 31.717 0.2034 463 +465 3 445.6315 455.9606 32.1457 0.2034 464 +466 3 444.913 456.7008 33.3357 0.2161 465 +467 3 444.3399 457.6057 34.2574 0.2288 466 +468 3 443.4579 458.3276 34.2227 0.2288 467 +469 3 442.601 458.99 33.3934 0.2542 468 +470 3 441.6526 459.6134 33.5616 0.2669 469 +471 3 440.5773 459.8571 33.6389 0.2669 470 +472 3 439.5831 459.7347 34.6735 0.2288 471 +473 3 438.7606 460.412 35.0826 0.2161 472 +474 3 438.3739 461.4782 35.4404 0.2161 473 +475 3 438.0204 462.5512 35.87 0.2161 474 +476 3 437.5972 463.5797 36.3653 0.1907 475 +477 3 436.8204 464.2386 37.3173 0.1652 476 +478 3 435.7588 464.4983 37.8434 0.1652 477 +479 3 434.6331 464.655 38.0481 0.2034 478 +480 3 433.5989 465.052 38.3827 0.2415 479 +481 3 432.8839 465.6366 39.6301 0.2796 480 +482 3 432.6802 466.2921 41.8065 0.2669 481 +483 3 432.44 467.2233 43.2524 0.2415 482 +484 3 432.1391 468.3216 43.3936 0.178 483 +485 3 431.288 469.04 43.96 0.1525 484 +486 3 441.3232 433.1905 20.1667 0.2542 441 +487 3 442.2395 433.8597 20.3403 0.3051 486 +488 3 443.1822 434.4466 20.9404 0.3305 487 +489 3 444.1225 435.0689 20.8468 0.3432 488 +490 3 445.1224 435.5002 20.0567 0.3305 489 +491 3 446.0113 435.9864 18.7603 0.3051 490 +492 3 446.859 436.5355 18.7345 0.2796 491 +493 3 447.7158 437.2151 19.0733 0.2796 492 +494 3 448.6974 437.7665 19.1786 0.2924 493 +495 3 449.5222 438.5089 19.3158 0.2796 494 +496 3 450.442 438.557 20.4137 0.2415 495 +497 3 451.5082 438.311 21.1462 0.2034 496 +498 3 452.3605 438.8956 21.7308 0.2034 497 +499 3 453.0434 439.7936 21.3662 0.2034 498 +500 3 453.8408 440.5338 22.2113 0.2161 499 +501 3 454.5306 441.4399 22.3289 0.2161 500 +502 3 455.304 442.1537 21.4315 0.2288 501 +503 3 456.3794 442.3871 21.957 0.2288 502 +504 3 457.3929 442.5358 23.1087 0.2288 503 +505 3 458.1869 443.1696 23.6748 0.2542 504 +506 3 458.8424 444.0539 23.5735 0.2796 505 +507 3 459.8045 444.6019 24.1324 0.3051 506 +508 3 460.8787 444.9176 24.5162 0.2924 507 +509 3 461.9632 445.1304 24.019 0.2542 508 +510 3 463.0283 445.3066 23.1059 0.2161 509 +511 3 464.1219 445.4484 23.0653 0.1907 510 +512 3 465.1744 445.7596 23.2148 0.1907 511 +513 3 465.9077 446.5204 23.5253 0.178 512 +514 3 466.6113 447.3795 23.8479 0.1525 513 +515 3 467.6111 447.8646 23.7622 0.1398 514 +516 3 468.7117 448.1734 23.683 0.1525 515 +517 3 469.66 448.7626 23.4368 0.1907 516 +518 3 470.6256 449.2854 22.7704 0.2034 517 +519 3 471.6483 449.7613 22.4644 0.2034 518 +520 3 472.6997 450.204 22.6173 0.2034 519 +521 3 473.7544 450.6227 22.9592 0.2288 520 +522 3 474.8229 451.006 22.8547 0.2415 521 +523 3 475.9303 451.2702 22.64 0.2288 522 +524 3 476.9862 451.4979 23.3814 0.1907 523 +525 3 478.0913 451.6821 23.4783 0.1652 524 +526 3 478.764 452.452 24.36 0.1525 525 +527 3 427.2886 420.0013 17.3099 0.394 294 +528 3 428.3491 419.5895 17.4538 0.4068 527 +529 3 429.4565 419.3767 17.2584 0.4068 528 +530 3 430.4037 418.9717 17.9315 0.4068 529 +531 3 431.3704 418.4191 17.5484 0.3559 530 +532 3 432.4171 418.1228 17.8377 0.3051 531 +533 3 433.0372 417.5932 18.9356 0.2542 532 +534 3 433.9352 417.1722 17.841 0.2796 533 +535 3 434.6056 416.3954 18.3996 0.3051 534 +536 3 434.8962 415.4436 19.4362 0.3432 535 +537 3 434.2967 414.6417 20.0684 0.3305 536 +538 3 435.0026 414.0388 19.9548 0.3305 537 +539 3 436.0905 414.0868 19.8374 0.3686 538 +540 3 437.0732 414.5341 20.1942 0.4322 539 +541 3 438.1245 414.7721 20.6618 0.4576 540 +542 3 439.0466 414.938 21.8781 0.4068 541 +543 3 440.0533 415.248 22.1024 0.3305 542 +544 3 440.6665 415.0432 24.1704 0.2924 543 +545 3 441.7007 414.5913 24.3342 0.2924 544 +546 3 442.8264 414.6417 24.7117 0.3051 545 +547 3 443.9269 414.8739 24.9343 0.3051 546 +548 3 445.0618 414.7629 25.0275 0.3178 547 +549 3 446.1508 414.5421 24.9743 0.3432 548 +550 3 447.2354 414.3328 24.6036 0.3686 549 +551 3 448.3405 414.5593 24.4367 0.394 550 +552 3 449.2877 415.1816 24.5176 0.394 551 +553 3 450.291 415.6964 24.5574 0.4068 552 +554 3 451.2588 416.1048 25.0919 0.394 553 +555 3 452.0001 416.797 23.9562 0.3686 554 +556 3 452.873 417.3838 23.0236 0.3178 555 +557 3 453.9712 417.6515 22.7388 0.2796 556 +558 3 455.0283 417.584 23.6062 0.3051 557 +559 3 455.9309 418.2807 23.4024 0.3559 558 +560 3 456.8758 418.8985 23.3906 0.4068 559 +561 3 457.7499 419.5334 23.1232 0.4068 560 +562 3 458.4855 420.3468 22.3608 0.394 561 +563 3 459.2577 421.0549 22.9684 0.394 562 +564 3 460.222 421.3535 24.11 0.394 563 +565 3 461.334 421.3695 24.5809 0.3813 564 +566 3 462.4025 421.4622 23.8568 0.3432 565 +567 3 463.4047 421.9152 23.952 0.3178 566 +568 3 464.3851 422.1955 25.1952 0.2796 567 +569 3 464.9605 423.1713 25.412 0.2542 568 +570 3 465.703 423.9435 25.158 0.2288 569 +571 3 466.7303 423.7502 25.1826 0.2288 570 +572 3 467.7702 424.1369 25.6264 0.2288 571 +573 3 468.8284 424.4995 25.1902 0.2288 572 +574 3 469.8831 424.6642 25.0802 0.2415 573 +575 3 470.8635 424.8908 24.1368 0.2288 574 +576 3 471.3738 425.7476 25.2694 0.2288 575 +577 3 472.1174 425.7774 25.8978 0.2161 576 +578 3 473.1367 425.2934 25.4814 0.2288 577 +579 3 474.2383 425.1333 25.8182 0.2034 578 +580 3 475.3457 425.1573 25.7858 0.1907 579 +581 3 476.3925 425.3735 25.8454 0.2034 580 +582 3 477.3443 425.9753 26.0151 0.2542 581 +583 3 478.0261 426.7097 27.1309 0.2796 582 +584 3 479.0054 427.1879 27.4504 0.2542 583 +585 3 479.9641 427.0403 26.4505 0.2161 584 +586 3 480.9067 427.0644 26.7333 0.1907 585 +587 3 481.9889 426.9534 26.8579 0.2034 586 +588 3 483.0105 426.7784 25.6889 0.2161 587 +589 3 484.1099 426.4832 25.482 0.2161 588 +590 3 485.1921 426.6148 26.1064 0.2161 589 +591 3 486.1005 427.1124 27.27 0.2034 590 +592 3 486.9768 427.713 28.2114 0.2161 591 +593 3 487.9549 428.2289 28.0375 0.2034 592 +594 3 488.909 428.0207 28.2551 0.2161 593 +595 3 490.0049 427.9544 28.5113 0.2161 594 +596 3 491.03 428.4246 28.3074 0.2415 595 +597 3 492.0378 428.6957 29.3762 0.2415 596 +598 3 493.0537 429.1499 29.5904 0.2415 597 +599 3 494.0593 429.4542 30.2117 0.2161 598 +600 3 495.1335 429.3329 29.6738 0.2034 599 +601 3 496.1745 429.1258 29.6136 0.2034 600 +602 3 497.2682 429.119 30.333 0.2161 601 +603 3 498.2292 428.9462 31.3855 0.2542 602 +604 3 498.4774 427.9887 32.7664 0.2669 603 +605 3 498.7989 426.9854 32.975 0.2669 604 +606 3 499.3617 426.2384 33.4216 0.2288 605 +607 3 500.3856 426.14 32.76 0.2034 606 +608 3 409.576 406.4106 15.2239 0.3813 1 +609 3 408.5945 405.85 15.6554 0.483 608 +610 3 407.5408 405.4244 15.9838 0.5084 609 +611 3 406.5284 404.9154 15.6111 0.4703 610 +612 3 405.5629 404.3399 16.1291 0.4449 611 +613 3 404.5928 403.7348 16.2364 0.4449 612 +614 3 403.5906 403.1834 16.24 0.4449 613 +615 3 402.4478 403.1422 16.2403 0.394 614 +616 3 401.4193 403.6444 16.2414 0.3305 615 +617 3 400.5842 404.4257 16.245 0.3051 616 +618 3 399.7422 405.2002 16.2607 0.3305 617 +619 3 399.367 405.556 16.3604 0.2161 618 +620 3 398.8476 406.4243 17.099 0.1652 619 +621 3 398.7446 407.3818 18.6099 0.1398 620 +622 3 398.0559 407.979 19.626 0.1144 621 +623 3 397.0321 407.8932 20.6665 0.1144 622 +624 3 396.0917 407.812 22.2194 0.1144 623 +625 3 395.1193 407.359 22.9026 0.1144 624 +626 3 394.235 406.6428 23.0966 0.1144 625 +627 3 393.1539 406.5936 23.6499 0.1398 626 +628 3 392.4343 407.4047 24.2712 0.178 627 +629 3 392.4023 408.4629 25.2109 0.2161 628 +630 3 393.0578 409.3587 25.7667 0.2288 629 +631 3 393.5257 410.3997 25.8499 0.2669 630 +632 3 393.393 411.5014 26.4844 0.3305 631 +633 3 393.0189 412.4761 27.6315 0.4195 632 +634 3 392.8462 413.4519 29.0256 0.4322 633 +635 3 392.7432 414.5684 29.5529 0.394 634 +636 3 392.384 415.6427 29.3213 0.3178 635 +637 3 391.4894 416.2741 29.0363 0.2669 636 +638 3 390.3637 416.1895 29.4423 0.2924 637 +639 3 389.2952 416.138 30.2716 0.2924 638 +640 3 388.3628 416.5945 31.4154 0.3432 639 +641 3 387.4865 417.1665 32.4727 0.2924 640 +642 3 386.4546 417.592 33.0504 0.2924 641 +643 3 385.6115 418.251 33.469 0.2161 642 +644 3 385.2042 419.2989 33.9811 0.2288 643 +645 3 384.4961 419.9841 34.3353 0.2288 644 +646 3 383.4425 419.7897 34.8989 0.2924 645 +647 3 382.4198 419.3652 35.6017 0.3178 646 +648 3 381.3307 419.1524 36.1362 0.3559 647 +649 3 380.2027 419.2325 36.3675 0.3686 648 +650 3 379.0804 419.4487 36.4428 0.3432 649 +651 3 377.957 419.6478 36.6411 0.3051 650 +652 3 376.8908 419.5345 37.3674 0.2669 651 +653 3 375.9928 419.0666 38.5983 0.2669 652 +654 3 375.0787 418.5244 39.5914 0.2669 653 +655 3 374.0274 418.1972 40.2475 0.2669 654 +656 3 372.9291 417.981 40.8201 0.2924 655 +657 3 371.8847 417.5955 41.3899 0.2924 656 +658 3 370.8093 417.266 41.8452 0.3051 657 +659 3 369.7671 417.5451 42.2145 0.2924 658 +660 3 369.226 418.4763 42.5466 0.3305 659 +661 3 368.5957 419.3835 43.1525 0.3178 660 +662 3 368.0511 420.0734 44.8381 0.3305 661 +663 3 367.8257 420.69 47.0974 0.3305 662 +664 3 367.6152 421.556 48.7878 0.3813 663 +665 3 367.184 422.5387 49.6588 0.3686 664 +666 3 366.6291 423.5225 50.0685 0.3432 665 +667 3 366.0377 424.4492 50.8158 0.3051 666 +668 3 365.6567 425.4891 51.4326 0.2924 667 +669 3 365.2735 426.4958 52.3561 0.2669 668 +670 3 364.6534 427.3721 53.2714 0.2288 669 +671 3 363.9853 428.134 54.5538 0.2161 670 +672 3 363.2886 428.6991 56.2691 0.2034 671 +673 3 362.5851 429.4954 57.195 0.2161 672 +674 3 361.7648 430.0857 58.45 0.2034 673 +675 3 360.9423 430.756 59.4804 0.2161 674 +676 3 360.4641 431.7605 59.9995 0.2034 675 +677 3 359.955 432.5761 61.4709 0.2034 676 +678 3 358.9872 432.8896 62.72 0.1652 677 +679 3 399.208 405.1693 15.1729 0.3686 618 +680 3 398.366 404.698 13.6867 0.3813 679 +681 3 397.4508 404.0539 13.1463 0.394 680 +682 3 396.4852 403.4716 13.587 0.4195 681 +683 3 395.3858 403.2051 13.9765 0.4576 682 +684 3 394.2624 403.4019 14.0958 0.4957 683 +685 3 393.1322 403.5025 14.4547 0.5084 684 +686 3 392.0225 403.6146 15.0685 0.483 685 +687 3 390.954 404.007 15.3448 0.4195 686 +688 3 390.0159 404.6259 15.869 0.3813 687 +689 3 389.103 405.2963 16.2551 0.3686 688 +690 3 388.1443 405.9129 16.4914 0.3813 689 +691 3 387.1216 406.3717 17.0419 0.3813 690 +692 3 386.0188 406.6497 17.3426 0.3813 691 +693 3 384.8748 406.6291 17.3457 0.3686 692 +694 3 383.7456 406.4472 17.2712 0.3432 693 +695 3 382.6291 406.239 16.9361 0.2924 694 +696 3 381.5126 406.1783 16.3453 0.2669 695 +697 3 380.3937 405.9381 16.3184 0.2542 696 +698 3 379.403 405.3753 16.5628 0.2924 697 +699 3 378.3734 404.9154 17.0313 0.2924 698 +700 3 377.25 404.7449 17.3519 0.2924 699 +701 3 376.1278 404.523 17.3239 0.2415 700 +702 3 374.9929 404.9199 17.5249 0.2669 701 +703 3 373.9118 405.1991 18.123 0.3305 702 +704 3 372.7827 405.2975 18.4041 0.3686 703 +705 3 371.6398 405.2883 18.3369 0.3813 704 +706 3 370.5302 405.1236 17.836 0.394 705 +707 3 369.4319 404.8467 17.4611 0.394 706 +708 3 368.3703 404.4246 17.367 0.3686 707 +709 3 367.4162 403.7988 17.3606 0.3051 708 +710 3 366.3557 403.3824 17.3653 0.2415 709 +711 3 365.325 403.7977 17.3992 0.2161 710 +712 3 364.3754 404.4292 17.591 0.2034 711 +713 3 363.2875 404.7369 17.9687 0.2161 712 +714 3 362.1629 404.5767 17.7646 0.2034 713 +715 3 361.1494 404.0619 17.4952 0.2161 714 +716 3 360.0957 403.6432 17.8475 0.2034 715 +717 3 359.0227 403.5471 18.7821 0.2288 716 +718 3 357.905 403.7313 19.1559 0.2542 717 +719 3 356.8994 404.1855 18.433 0.2924 718 +720 3 355.8172 404.38 17.6593 0.2796 719 +721 3 354.6789 404.3811 17.3958 0.2542 720 +722 3 353.5418 404.2599 17.4079 0.2415 721 +723 3 352.5328 403.7245 17.5888 0.2796 722 +724 3 351.5981 403.1216 18.2414 0.3178 723 +725 3 350.7058 402.4123 18.461 0.3305 724 +726 3 349.7231 401.8266 18.4772 0.3178 725 +727 3 348.682 401.3518 18.4643 0.3051 726 +728 3 347.593 401.0052 18.3775 0.3178 727 +729 3 346.4993 400.7569 17.8147 0.3178 728 +730 3 345.3702 400.7009 17.3886 0.3051 729 +731 3 344.2536 400.4549 17.3345 0.2669 730 +732 3 343.1806 400.0637 17.1786 0.2542 731 +733 3 342.3523 399.3441 16.3825 0.2415 732 +734 3 341.5801 398.5021 16.242 0.2542 733 +735 3 340.5505 398.0033 16.24 0.2415 734 +736 3 339.4912 397.5732 16.2403 0.2669 735 +737 3 338.5359 396.9428 16.2408 0.2924 736 +738 3 337.7248 396.1363 16.2431 0.3432 737 +739 3 336.8771 394.7978 16.329 0.2669 738 +740 3 336.4367 393.7511 16.6387 0.2924 739 +741 3 335.9242 392.7466 17.0901 0.3051 740 +742 3 335.3419 391.7685 17.3471 0.2669 741 +743 3 334.7436 390.795 17.4815 0.2415 742 +744 3 334.326 389.7436 17.8139 0.2288 743 +745 3 334.2871 388.6248 18.2487 0.2542 744 +746 3 334.3271 387.4854 18.438 0.2542 745 +747 3 334.0434 386.3849 18.4033 0.2288 746 +748 3 333.4554 385.4159 18.1544 0.2034 747 +749 3 332.7839 384.5064 17.733 0.1907 748 +750 3 332.0826 383.6072 17.5101 0.178 749 +751 3 331.4214 382.6806 17.7206 0.1907 750 +752 3 330.7945 381.7288 17.9698 0.2288 751 +753 3 330.0509 380.8696 17.7192 0.3051 752 +754 3 329.1425 380.189 17.4381 0.3432 753 +755 3 328.1427 379.6353 17.3648 0.3178 754 +756 3 327.2183 378.9626 17.36 0.2415 755 +757 3 326.5342 378.052 17.36 0.1652 756 +758 3 326.016 377.0327 17.3589 0.1271 757 +759 3 325.4588 376.0339 17.3541 0.1398 758 +760 3 324.6626 375.2171 17.3278 0.178 759 +761 3 323.6902 374.6234 17.1699 0.2288 760 +762 3 322.6858 374.1029 16.7479 0.2415 761 +763 3 321.7042 373.5366 16.3685 0.2288 762 +764 3 320.7799 372.8651 16.2784 0.2034 763 +765 3 319.9242 372.1077 16.3951 0.2034 764 +766 3 319.0364 371.395 16.6676 0.2161 765 +767 3 318.0789 370.7944 17.0937 0.2415 766 +768 3 317.134 370.2178 17.7873 0.2415 767 +769 3 316.3606 369.3873 18.086 0.2669 768 +770 3 315.6605 368.4881 17.8794 0.2796 769 +771 3 314.9032 367.6416 17.533 0.3305 770 +772 3 314.06 366.8728 17.3799 0.3305 771 +773 3 313.1872 366.1326 17.3597 0.3305 772 +774 3 312.3429 365.3604 17.3541 0.2669 773 +775 3 311.6359 364.4624 17.323 0.2542 774 +776 3 310.8385 363.6456 17.1573 0.2161 775 +777 3 309.8387 363.2292 16.2884 0.2288 776 +778 3 308.7942 362.8516 15.6125 0.1907 777 +779 3 307.8996 362.179 16.1476 0.1907 778 +780 3 307.0107 361.5326 16.9168 0.178 779 +781 3 306.1939 360.9091 18.1496 0.1907 780 +782 3 305.4549 360.0465 18.4584 0.1907 781 +783 3 304.5202 359.3865 18.4741 0.1907 782 +784 3 303.4174 359.0844 18.443 0.2034 783 +785 3 302.2917 358.9014 18.244 0.2288 784 +786 3 301.2472 358.5994 17.3774 0.2542 785 +787 3 300.6306 357.7071 16.4881 0.2542 786 +788 3 300.1856 356.8136 15.12 0.2288 787 +789 3 336.5236 395.4545 15.8169 0.2161 738 +790 3 335.4677 395.6249 15.9572 0.2034 789 +791 3 334.429 395.9727 16.354 0.2288 790 +792 3 333.5561 396.6614 16.0087 0.2288 791 +793 3 332.7198 397.4245 15.6758 0.2161 792 +794 3 331.8206 398.0662 15.0637 0.178 793 +795 3 331.0805 398.8716 14.4516 0.178 794 +796 3 330.1378 399.4859 14.7476 0.1652 795 +797 3 329.2798 400.1437 15.3667 0.1907 796 +798 3 328.28 400.6597 15.0948 0.2034 797 +799 3 327.1771 400.948 15.2197 0.2542 798 +800 3 326.1121 401.2626 14.9369 0.2669 799 +801 3 325.166 401.735 14.8296 0.2669 800 +802 3 324.2371 402.2624 15.2429 0.2161 801 +803 3 323.3047 402.9179 15.1519 0.178 802 +804 3 322.4547 403.6593 15.398 0.1652 803 +805 3 321.4674 404.1077 15.5344 0.2161 804 +806 3 320.4058 404.4349 15.0167 0.2669 805 +807 3 319.3682 404.7666 15.3252 0.3178 806 +808 3 318.3397 405.2059 15.8337 0.3051 807 +809 3 317.4543 405.8729 15.416 0.3051 808 +810 3 316.5585 406.5719 15.2048 0.2924 809 +811 3 315.5015 406.9277 15.5529 0.3051 810 +812 3 314.433 407.2228 16.2375 0.2924 811 +813 3 313.4491 407.7662 16.6023 0.2796 812 +814 3 312.5751 408.4972 16.525 0.2669 813 +815 3 311.5318 408.932 16.5108 0.2542 814 +816 3 310.6052 409.4959 15.7114 0.2415 815 +817 3 309.7952 409.8952 14.0 0.2288 816 +818 3 375.8806 404.1523 15.6237 0.2415 701 +819 3 375.7788 403.1948 14.4864 0.2161 818 +820 3 375.7342 402.0519 14.436 0.1907 819 +821 3 375.558 400.9342 14.3072 0.2161 820 +822 3 374.9895 400.0248 14.6616 0.2796 821 +823 3 374.1292 399.3395 14.8022 0.3178 822 +824 3 373.1648 398.7687 14.8904 0.2924 823 +825 3 372.1409 398.3854 14.4376 0.2669 824 +826 3 371.2646 397.7699 13.6167 0.2542 825 +827 3 370.6263 396.8467 13.512 0.2669 826 +828 3 370.0176 395.9098 13.0158 0.2542 827 +829 3 369.2569 395.0712 12.8288 0.2288 828 +830 3 368.4961 394.3929 13.9574 0.2288 829 +831 3 367.8109 393.7213 12.8106 0.2542 830 +832 3 367.1691 392.8016 12.4958 0.3051 831 +833 3 366.6348 391.7925 12.3592 0.3178 832 +834 3 365.9645 390.8773 12.6658 0.3178 833 +835 3 365.0504 390.3328 13.6578 0.2924 834 +836 3 364.7289 389.8592 12.4785 0.178 835 +837 3 363.7085 389.5492 12.574 0.1907 836 +838 3 362.6709 389.087 12.4261 0.1907 837 +839 3 361.814 388.3697 12.899 0.2161 838 +840 3 361.0338 387.6032 13.5598 0.2415 839 +841 3 360.2673 387.0861 11.9347 0.2669 840 +842 3 359.2595 386.7486 11.1958 0.2415 841 +843 3 358.1612 386.5233 11.6124 0.2161 842 +844 3 357.1476 386.2316 12.1327 0.178 843 +845 3 356.1444 386.0977 12.7039 0.178 844 +846 3 355.0484 385.9192 12.0369 0.178 845 +847 3 354.1641 385.2798 11.6301 0.2161 846 +848 3 353.8872 384.2273 12.1526 0.2288 847 +849 3 353.5143 383.2766 13.3756 0.2542 848 +850 3 352.6231 382.6131 13.2958 0.2542 849 +851 3 351.7869 382.2973 11.6094 0.2924 850 +852 3 350.7104 381.9816 12.0772 0.3051 851 +853 3 349.5755 381.8695 12.3161 0.3051 852 +854 3 348.5654 381.4188 12.8344 0.2669 853 +855 3 348.3034 380.3308 12.5871 0.2288 854 +856 3 347.5975 379.6341 11.2823 0.2034 855 +857 3 346.6331 379.1765 10.5073 0.1907 856 +858 3 345.8186 378.4032 10.8609 0.2161 857 +859 3 344.8828 377.8129 11.5433 0.2288 858 +860 3 343.8681 377.3656 12.0226 0.2415 859 +861 3 342.7664 377.3244 12.6683 0.2034 860 +862 3 341.746 377.1104 12.794 0.1907 861 +863 3 340.9017 376.4698 11.9188 0.1652 862 +864 3 340.0769 375.915 10.5459 0.178 863 +865 3 339.1194 375.3967 10.9444 0.1652 864 +866 3 338.1126 375.1256 10.0523 0.1652 865 +867 3 337.4342 374.4712 9.6838 0.1525 866 +868 3 337.1974 373.7311 9.2943 0.1652 867 +869 3 336.3017 373.1339 10.0537 0.1907 868 +870 3 335.3956 372.4372 10.1556 0.2161 869 +871 3 334.5422 371.6867 10.3236 0.2288 870 +872 3 333.746 370.966 9.9005 0.2161 871 +873 3 332.9006 370.4158 10.1909 0.1907 872 +874 3 332.0403 369.8987 9.548 0.1525 873 +875 3 331.4465 369.0944 8.2648 0.1398 874 +876 3 330.8574 368.1323 8.6489 0.1652 875 +877 3 330.044 367.3384 8.96 0.2161 876 +878 3 365.2723 389.5126 12.3609 0.2288 835 +879 3 365.3089 388.3972 12.7406 0.2161 878 +880 3 365.3135 387.3161 13.4971 0.2161 879 +881 3 365.1945 386.2041 13.685 0.2288 880 +882 3 364.896 385.194 13.5094 0.2415 881 +883 3 364.6443 384.2147 12.4432 0.2669 882 +884 3 363.9339 383.4585 11.8628 0.2924 883 +885 3 363.0198 383.0707 12.2265 0.2796 884 +886 3 362.1252 382.7172 13.7298 0.2415 885 +887 3 361.0739 382.4975 14.5516 0.2034 886 +888 3 359.9859 382.2676 14.2708 0.2161 887 +889 3 359.2091 382.2539 15.6988 0.2415 888 +890 3 358.1143 382.3442 16.3769 0.2796 889 +891 3 356.9806 382.2424 16.13 0.2669 890 +892 3 355.8801 382.0651 15.5753 0.2542 891 +893 3 354.7441 382.0399 15.8438 0.2288 892 +894 3 353.6573 381.7379 15.9004 0.2542 893 +895 3 352.7821 381.0172 15.9564 0.2669 894 +896 3 351.9047 380.4349 17.0274 0.2796 895 +897 3 351.0112 380.0242 18.3036 0.2415 896 +898 3 349.8958 379.983 18.2804 0.2288 897 +899 3 349.0115 380.2176 18.3271 0.1907 898 +900 3 348.2542 380.4258 20.2182 0.2034 899 +901 3 347.1319 380.4715 19.9973 0.1907 900 +902 3 346.2808 379.7268 20.4064 0.2034 901 +903 3 345.4994 378.9614 21.1781 0.1652 902 +904 3 344.6929 378.1652 20.8482 0.1652 903 +905 3 343.8281 377.5006 20.3529 0.2034 904 +906 3 343.359 376.6105 19.1307 0.2669 905 +907 3 342.676 375.7491 19.1097 0.3051 906 +908 3 341.8501 375.0776 20.0525 0.2669 907 +909 3 340.8948 374.6497 20.244 0.2288 908 +910 3 339.8321 374.4049 20.5884 0.1652 909 +911 3 338.7167 374.2779 20.8376 0.1398 910 +912 3 337.6276 374.4609 20.3302 0.1271 911 +913 3 336.6243 374.6257 19.1103 0.1398 912 +914 3 335.7583 375.0043 17.5806 0.1525 913 +915 3 335.2767 375.3258 15.2032 0.1398 914 +916 3 334.7927 375.9401 13.1737 0.1398 915 +917 3 333.9336 376.6048 12.32 0.1525 916 +918 4 417.8826 404.2438 16.2112 0.1907 1 +919 4 418.6617 403.4156 16.5152 0.2669 918 +920 4 419.5494 402.7212 16.996 0.3178 919 +921 4 420.4177 401.9913 17.3516 0.3432 920 +922 4 421.2528 401.2145 17.5703 0.3813 921 +923 4 422.0719 400.4423 18.0701 0.4322 922 +924 4 422.8865 399.6518 18.4279 0.4957 923 +925 4 423.8211 398.994 18.471 0.4957 924 +926 4 424.7889 398.3843 18.4444 0.483 925 +927 4 425.6378 397.6189 18.3282 0.4576 926 +928 4 426.3265 396.7255 17.8595 0.4576 927 +929 4 426.9545 395.7862 17.4224 0.4703 928 +930 4 427.5883 394.839 17.183 0.4703 929 +931 4 428.1534 393.8735 16.6026 0.4703 930 +932 4 428.5149 392.8404 15.7884 0.4576 931 +933 4 428.8261 391.7605 15.258 0.483 932 +934 4 429.2094 390.684 15.122 0.5212 933 +935 4 429.7367 389.6693 15.1203 0.5466 934 +936 4 430.4392 388.7667 15.122 0.5212 935 +937 4 431.2194 387.9304 15.1276 0.483 936 +938 4 431.8794 386.9958 15.1556 0.4576 937 +939 4 432.4926 386.0314 15.3023 0.483 938 +940 4 432.8679 384.9938 16.0384 0.483 939 +941 4 433.187 383.9378 16.7815 0.4703 940 +942 4 433.465 382.8293 16.9322 0.3813 941 +943 4 433.2465 381.7917 15.8844 0.3051 942 +944 4 433.2202 380.6935 15.3969 0.2796 943 +945 4 433.4833 380.2885 15.9138 0.2161 944 +946 4 434.4214 379.665 16.3817 0.2288 945 +947 4 435.2359 378.9191 17.113 0.2542 946 +948 4 435.9956 378.0828 17.5501 0.2669 947 +949 4 436.5973 377.1505 18.2277 0.2669 948 +950 4 437.1201 376.1392 18.5153 0.2796 949 +951 4 437.1704 375.0089 18.9188 0.2924 950 +952 4 436.9611 373.913 19.5294 0.2924 951 +953 4 437.31 372.8239 19.5992 0.2669 952 +954 4 438.0799 371.9773 19.6 0.2542 953 +955 4 438.8716 371.1514 19.6003 0.2669 954 +956 4 439.5912 370.2625 19.6011 0.2924 955 +957 4 440.3393 369.3965 19.6056 0.3178 956 +958 4 441.3552 368.8714 19.6291 0.3051 957 +959 4 441.8231 368.9606 19.7282 0.2415 958 +960 4 442.9431 369.0658 20.1312 0.2415 959 +961 4 444.0528 368.9125 20.5503 0.2034 960 +962 4 445.1704 368.6918 20.706 0.178 961 +963 4 446.3007 368.7261 20.7203 0.1907 962 +964 4 447.4207 368.9526 20.722 0.2288 963 +965 4 448.5532 369.0704 20.734 0.2669 964 +966 4 449.6858 368.9583 20.8177 0.2924 965 +967 4 450.8081 368.7821 21.1067 0.2924 966 +968 4 451.9383 368.6414 21.336 0.2669 967 +969 4 453.0332 368.4469 20.8888 0.2415 968 +970 4 454.1062 368.2994 20.011 0.2288 969 +971 4 455.2193 368.2811 19.8976 0.2415 970 +972 4 456.2821 368.3463 20.8253 0.2669 971 +973 4 457.3655 368.3977 21.6591 0.3178 972 +974 4 458.4877 368.3257 22.1435 0.3559 973 +975 4 459.6134 368.2582 22.6036 0.3813 974 +976 4 460.7506 368.2136 22.7035 0.3559 975 +977 4 461.8797 368.0889 22.4378 0.3051 976 +978 4 463.0077 367.9184 22.3107 0.2542 977 +979 4 464.1425 367.9253 22.4608 0.2161 978 +980 4 465.2705 368.0751 22.7388 0.2161 979 +981 4 466.4065 368.1655 22.8004 0.1907 980 +982 4 467.5368 368.1083 22.4792 0.1907 981 +983 4 468.5927 367.7422 22.0679 0.178 982 +984 4 469.509 367.0776 21.9904 0.1907 983 +985 4 470.3579 366.3614 22.5686 0.1907 984 +986 4 471.1896 365.7688 23.7899 0.1907 985 +987 4 472.1425 365.3135 24.8046 0.1907 986 +988 4 473.1424 364.8124 25.3397 0.178 987 +989 4 474.0633 364.1489 25.3364 0.1525 988 +990 4 474.8161 363.2955 25.2274 0.1398 989 +991 4 475.499 362.3792 25.1012 0.1652 990 +992 4 476.0424 361.3839 24.8108 0.2034 991 +993 4 476.5675 360.3863 25.1084 0.2415 992 +994 4 477.2631 359.502 25.5441 0.2415 993 +995 4 477.7813 358.525 26.1691 0.2669 994 +996 4 478.2824 357.5194 26.6826 0.2542 995 +997 4 478.9848 356.7701 27.816 0.2415 996 +998 4 479.9 356.1249 28.0294 0.178 997 +999 4 480.6184 355.2578 28.3545 0.1525 998 +1000 4 481.4284 354.457 28.5085 0.1398 999 +1001 4 482.4637 354.0211 28.1747 0.178 1000 +1002 4 483.5688 354.2293 27.7522 0.1907 1001 +1003 4 484.5355 354.8093 28.1806 0.2161 1002 +1004 4 485.3992 355.5552 28.0 0.2034 1003 +1005 4 441.8322 368.3417 19.6039 0.2542 958 +1006 4 442.6365 367.5283 19.544 0.2542 1005 +1007 4 443.0826 366.5056 19.3245 0.2924 1006 +1008 4 443.1581 365.3753 19.1517 0.3178 1007 +1009 4 443.0769 364.2473 19.4793 0.3432 1008 +1010 4 443.0483 363.1102 19.7378 0.3432 1009 +1011 4 443.3984 362.0508 20.1359 0.3305 1010 +1012 4 444.0207 361.115 20.5783 0.3178 1011 +1013 4 444.8295 360.3154 20.7105 0.3051 1012 +1014 4 445.6646 359.5329 20.7248 0.3051 1013 +1015 4 446.3911 358.652 20.7438 0.3051 1014 +1016 4 446.9963 357.6842 20.8429 0.3051 1015 +1017 4 447.3944 356.6283 21.219 0.3051 1016 +1018 4 447.6415 355.5335 21.7412 0.3051 1017 +1019 4 447.7833 354.4123 22.1581 0.3051 1018 +1020 4 447.9607 353.3004 22.6436 0.3178 1019 +1021 4 448.3279 352.2273 22.923 0.3051 1020 +1022 4 448.9205 351.256 22.9928 0.2796 1021 +1023 4 449.7258 350.4518 23.1165 0.2161 1022 +1024 4 450.3997 349.5515 23.5231 0.178 1023 +1025 4 451.0884 348.6523 23.903 0.1525 1024 +1026 4 452.0058 347.9899 23.8246 0.178 1025 +1027 4 452.7906 347.2017 23.2515 0.2034 1026 +1028 4 453.159 346.1572 22.685 0.2288 1027 +1029 4 453.2288 345.0224 22.6797 0.2288 1028 +1030 4 453.1521 343.8853 22.9085 0.2288 1029 +1031 4 452.9874 342.7584 23.1518 0.2161 1030 +1032 4 452.9439 341.6293 23.5712 0.178 1031 +1033 4 453.151 340.5173 23.9464 0.1398 1032 +1034 4 453.4622 339.4179 24.0705 0.1398 1033 +1035 4 453.7722 338.3174 24.08 0.1652 1034 +1036 4 454.1119 337.2249 24.08 0.2034 1035 +1037 4 454.5295 336.1598 24.08 0.2161 1036 +1038 4 454.931 335.089 24.08 0.2542 1037 +1039 4 455.2228 333.9839 24.0806 0.2796 1038 +1040 4 455.5522 332.888 24.0828 0.2924 1039 +1041 4 456.0087 331.8401 24.1035 0.2542 1040 +1042 4 456.5395 330.8288 24.2483 0.2288 1041 +1043 4 457.068 329.8266 24.6336 0.2288 1042 +1044 4 457.6549 328.8611 25.0659 0.2669 1043 +1045 4 458.3116 327.9379 25.4556 0.2924 1044 +1046 4 458.9877 327.0364 25.9392 0.3051 1045 +1047 4 459.6764 326.1372 26.3222 0.3051 1046 +1048 4 460.3696 325.2426 26.7294 0.2924 1047 +1049 4 461.0228 324.3229 27.1984 0.2669 1048 +1050 4 461.4667 323.2727 27.358 0.2415 1049 +1051 4 461.7195 322.1676 27.0301 0.2415 1050 +1052 4 461.9255 321.0579 26.5815 0.2796 1051 +1053 4 462.1863 319.9459 26.6837 0.3178 1052 +1054 4 462.5844 318.9117 27.3666 0.3432 1053 +1055 4 463.034 317.8924 28.0092 0.3305 1054 +1056 4 463.4401 316.8239 27.9706 0.3305 1055 +1057 4 463.6987 315.7143 28.194 0.3305 1056 +1058 4 463.781 314.6389 29.1231 0.3686 1057 +1059 4 463.8405 313.5178 29.6447 0.4068 1058 +1060 4 464.0933 312.4035 29.7604 0.4449 1059 +1061 4 464.5406 311.359 30.0947 0.4576 1060 +1062 4 465.068 310.3638 30.5673 0.4576 1061 +1063 4 465.7144 309.4245 30.7661 0.483 1062 +1064 4 466.4649 308.5608 30.7104 0.4957 1063 +1065 4 467.2016 307.6948 30.42 0.5084 1064 +1066 4 467.8926 306.8002 29.9897 0.4957 1065 +1067 4 468.6087 305.9113 29.8724 0.5084 1066 +1068 4 469.2368 304.9744 30.2957 0.5084 1067 +1069 4 469.6017 303.9093 30.7555 0.4957 1068 +1070 4 469.6532 302.7813 31.1441 0.4576 1069 +1071 4 469.4598 301.6739 31.663 0.4449 1070 +1072 4 469.3123 300.5482 31.9911 0.4322 1071 +1073 4 469.3603 299.418 32.3327 0.4195 1072 +1074 4 469.7184 298.3575 32.695 0.394 1073 +1075 4 470.4803 297.5132 32.48 0.394 1074 +1076 4 471.3555 296.7936 32.1591 0.4195 1075 +1077 4 472.1986 296.0226 32.2675 0.4195 1076 +1078 4 472.9685 295.1817 32.3302 0.394 1077 +1079 4 473.5737 294.2208 32.233 0.3432 1078 +1080 4 473.9603 293.174 32.7496 0.3305 1079 +1081 4 474.0839 292.0804 33.5017 0.3305 1080 +1082 4 474.1983 290.9661 33.9948 0.3432 1081 +1083 4 474.5598 289.8885 34.1505 0.3432 1082 +1084 4 475.1455 288.908 34.1827 0.3432 1083 +1085 4 475.8354 287.9951 34.263 0.3432 1084 +1086 4 476.5023 287.0788 34.5394 0.3432 1085 +1087 4 477.0114 286.0744 35.0193 0.3432 1086 +1088 4 477.5045 285.0482 35.2526 0.3432 1087 +1089 4 478.0524 284.0438 35.3237 0.3305 1088 +1090 4 478.6244 283.0599 35.5208 0.2924 1089 +1091 4 479.1175 282.0635 36.1455 0.2542 1090 +1092 4 479.471 281.0339 36.9673 0.2542 1091 +1093 4 479.6998 279.9288 37.3386 0.3178 1092 +1094 4 480.0327 278.842 37.1398 0.3559 1093 +1095 4 480.4491 277.7975 36.6484 0.3432 1094 +1096 4 480.9673 276.7828 36.5 0.2669 1095 +1097 4 481.5702 275.8173 36.717 0.2542 1096 +1098 4 482.1983 274.8883 37.2655 0.2924 1097 +1099 4 482.8561 273.9788 37.7818 0.3813 1098 +1100 4 483.3995 273.0099 38.4014 0.4195 1099 +1101 4 483.801 271.9643 38.9617 0.4322 1100 +1102 4 484.3021 270.9758 39.5587 0.4068 1101 +1103 4 485.024 270.095 39.825 0.4068 1102 +1104 4 485.7367 269.2164 40.1181 0.394 1103 +1105 4 486.2835 268.2405 40.6526 0.394 1104 +1106 4 486.7548 267.2041 40.8607 0.3813 1105 +1107 4 487.3634 266.2374 40.9116 0.3559 1106 +1108 4 488.0533 265.3291 41.0572 0.3432 1107 +1109 4 488.8198 264.4997 41.4809 0.3178 1108 +1110 4 489.5988 263.6828 41.9115 0.3432 1109 +1111 4 490.3356 262.8123 41.9958 0.3432 1110 +1112 4 490.9545 261.8513 42.0022 0.3686 1111 +1113 4 491.4796 260.8377 42.0137 0.3686 1112 +1114 4 491.8628 259.7612 42.082 0.3686 1113 +1115 4 492.1808 258.6744 42.3987 0.3178 1114 +1116 4 492.4039 257.5899 43.0895 0.2669 1115 +1117 4 492.6636 256.5157 43.6268 0.2415 1116 +1118 4 493.3237 255.6176 43.8295 0.2542 1117 +1119 4 494.1977 254.9084 43.573 0.2542 1118 +1120 4 494.9585 254.0778 43.9765 0.2415 1119 +1121 4 495.5682 253.1169 44.2299 0.2669 1120 +1122 4 496.1288 252.1204 44.24 0.3305 1121 +1123 4 496.6276 251.0931 44.24 0.394 1122 +1124 4 497.1801 250.0944 44.2408 0.4068 1123 +1125 4 497.6652 249.0591 44.2439 0.3813 1124 +1126 4 498.2566 248.081 44.2593 0.3686 1125 +1127 4 498.8378 247.1029 44.3408 0.3559 1126 +1128 4 499.2736 246.0572 44.6631 0.3432 1127 +1129 4 499.7495 245.0448 45.2012 0.2796 1128 +1130 4 500.1854 243.99 45.3611 0.2161 1129 +1131 4 500.6647 242.9513 45.3718 0.1525 1130 +1132 4 501.0628 241.8816 45.4443 0.1398 1131 +1133 4 501.4324 240.82 45.7716 0.1652 1132 +1134 4 502.0318 239.8808 46.3943 0.2161 1133 +1135 4 502.7194 238.9896 46.8552 0.2542 1134 +1136 4 503.5133 238.1888 47.2749 0.2415 1135 +1137 4 504.3713 237.4383 47.2114 0.2288 1136 +1138 4 505.211 236.6833 46.9571 0.2288 1137 +1139 4 505.8802 235.7773 47.2982 0.2542 1138 +1140 4 506.2589 234.7477 47.948 0.2415 1139 +1141 4 506.2932 233.6277 48.4722 0.1907 1140 +1142 4 506.3653 232.526 48.743 0.1652 1141 +1143 4 506.8881 231.5113 48.8684 0.178 1142 +1144 4 507.4795 230.5446 49.2282 0.2415 1143 +1145 4 508.0607 229.5756 49.6283 0.2542 1144 +1146 4 508.6224 228.5804 49.6605 0.2542 1145 +1147 4 509.1818 227.5851 49.5485 0.2161 1146 +1148 4 509.7286 226.5818 49.672 0.2034 1147 +1149 4 510.2286 225.5602 49.9223 0.1907 1148 +1150 4 510.5729 224.4814 50.2026 0.2034 1149 +1151 4 510.8864 223.4095 50.673 0.2288 1150 +1152 4 511.495 222.4565 50.9477 0.2669 1151 +1153 4 512.2638 221.6111 50.9793 0.2924 1152 +1154 4 513.0634 220.7931 51.0577 0.2924 1153 +1155 4 513.8631 219.9855 51.3369 0.2542 1154 +1156 4 514.6295 219.1584 51.7818 0.1907 1155 +1157 4 515.348 218.2752 52.015 0.178 1156 +1158 4 516.0595 217.3829 51.9126 0.2034 1157 +1159 4 516.6979 216.4482 51.5704 0.3051 1158 +1160 4 517.2093 215.4381 51.2333 0.3686 1159 +1161 4 517.7 214.4096 51.3204 0.4576 1160 +1162 4 518.2034 213.4029 51.8064 0.4703 1161 +1163 4 518.7308 212.4214 52.4367 0.4957 1162 +1164 4 519.3337 211.4913 53.1143 0.483 1163 +1165 4 520.0281 210.6207 53.7541 0.483 1164 +1166 4 520.7305 209.7387 54.1464 0.4449 1165 +1167 4 521.3185 208.7651 54.122 0.3559 1166 +1168 4 521.7773 207.7264 53.7816 0.3051 1167 +1169 4 522.2852 206.7185 53.5161 0.2796 1168 +1170 4 522.9659 205.809 53.7121 0.3432 1169 +1171 4 523.7243 204.967 54.0977 0.3686 1170 +1172 4 524.4782 204.1113 54.2895 0.4195 1171 +1173 4 525.2173 203.2385 54.322 0.4322 1172 +1174 4 525.9918 202.3988 54.3284 0.4576 1173 +1175 4 526.7914 201.5808 54.3528 0.4322 1174 +1176 4 527.5762 200.7503 54.467 0.3813 1175 +1177 4 528.3141 199.8877 54.7912 0.3178 1176 +1178 4 529.0234 199.0148 55.2992 0.2669 1177 +1179 4 529.7647 198.1648 55.7519 0.2415 1178 +1180 4 530.5071 197.3091 55.7522 0.2542 1179 +1181 4 531.1272 196.3745 55.2608 0.3051 1180 +1182 4 531.6271 195.3643 55.1004 0.3686 1181 +1183 4 532.1476 194.3748 55.6396 0.394 1182 +1184 4 532.7905 193.471 56.2724 0.3686 1183 +1185 4 533.5971 192.6851 56.6656 0.3305 1184 +1186 4 534.5157 192.025 57.0497 0.3051 1185 +1187 4 535.3966 191.3248 57.4538 0.3559 1186 +1188 4 536.1013 190.4394 57.6503 0.4195 1187 +1189 4 536.6241 189.4247 57.6764 0.483 1188 +1190 4 537.0542 188.3653 57.664 0.4322 1189 +1191 4 537.442 187.29 57.575 0.3432 1190 +1192 4 537.7361 186.1952 57.265 0.2415 1191 +1193 4 538.0827 185.1267 56.8378 0.2288 1192 +1194 4 538.6124 184.1211 56.6625 0.2415 1193 +1195 4 539.1935 183.1521 56.9904 0.2669 1194 +1196 4 539.6957 182.2243 57.9933 0.2415 1195 +1197 4 540.0721 181.2393 59.0075 0.2415 1196 +1198 4 540.5732 180.2452 59.5022 0.2288 1197 +1199 4 541.3877 179.4902 59.9348 0.2542 1198 +1200 4 542.2331 178.734 60.121 0.2415 1199 +1201 4 542.7422 177.7387 60.305 0.2669 1200 +1202 4 543.1655 176.6919 60.7309 0.3178 1201 +1203 4 543.7512 175.7218 61.0112 0.3813 1202 +1204 4 544.4376 174.8089 61.1341 0.4322 1203 +1205 4 545.1332 173.9086 61.4228 0.4068 1204 +1206 4 545.7612 172.9705 61.8517 0.3813 1205 +1207 4 546.4179 172.0404 62.0718 0.3305 1206 +1208 4 547.1878 171.1996 61.9791 0.3432 1207 +1209 4 548.0263 170.4423 61.5717 0.3559 1208 +1210 4 548.786 169.6037 61.1999 0.394 1209 +1211 4 549.3934 168.6416 61.2209 0.394 1210 +1212 4 549.9734 167.6749 61.6641 0.3813 1211 +1213 4 550.6164 166.746 62.0886 0.3178 1212 +1214 4 551.3302 165.8583 62.3258 0.2415 1213 +1215 4 552.1619 165.0964 62.7326 0.1907 1214 +1216 4 553.0474 164.3882 63.1151 0.178 1215 +1217 4 553.7097 163.4707 63.1481 0.2161 1216 +1218 4 554.2074 162.4503 62.8586 0.2161 1217 +1219 4 555.0688 161.7364 63.0011 0.2288 1218 +1220 4 556.1785 161.5191 63.2559 0.2288 1219 +1221 4 557.1555 160.9402 63.3847 0.2796 1220 +1222 4 557.9437 160.1268 63.7448 0.3051 1221 +1223 4 558.7079 159.3077 64.3082 0.2796 1222 +1224 4 559.5087 158.5184 64.832 0.2161 1223 +1225 4 560.3964 157.8285 65.3447 0.1907 1224 +1226 4 560.886 156.8046 65.2392 0.2288 1225 +1227 4 561.9191 156.323 65.4396 0.2669 1226 +1228 4 562.8388 155.6652 65.0538 0.2669 1227 +1229 4 563.8902 155.2202 65.2123 0.2161 1228 +1230 4 564.8145 154.6036 65.5908 0.2034 1229 +1231 4 565.3831 153.6712 66.3491 0.1907 1230 +1232 4 566.2297 152.9208 66.5487 0.2161 1231 +1233 4 567.2627 152.4437 66.6935 0.1907 1232 +1234 4 568.3484 152.1497 67.1779 0.1907 1233 +1235 4 569.4271 151.8946 67.664 0.1652 1234 +1236 4 570.2726 151.2093 68.3402 0.1652 1235 +1237 4 570.856 150.2804 69.1054 0.1398 1236 +1238 4 571.571 149.4258 69.7385 0.1271 1237 +1239 4 572.2334 148.5278 70.3492 0.1144 1238 +1240 4 572.9152 147.6412 70.7935 0.1144 1239 +1241 4 573.7412 146.853 70.8347 0.1144 1240 +1242 4 574.3509 145.9103 70.784 0.1144 1241 +1243 4 574.693 144.8201 70.6577 0.1144 1242 +1244 4 575.2204 143.8305 70.56 0.1144 1243 +1245 4 576.0509 143.0561 70.7482 0.1144 1244 +1246 4 576.9455 142.5424 71.6853 0.1144 1245 +1247 4 577.9351 142.1786 72.4679 0.1271 1246 +1248 4 578.8171 141.4991 72.6986 0.1525 1247 +1249 4 579.5069 140.5953 72.9848 0.178 1248 +1250 4 580.3501 139.9638 73.619 0.178 1249 +1251 4 581.3019 139.4193 74.2899 0.1525 1250 +1252 4 582.1633 138.6814 74.5898 0.1398 1251 +1253 4 583.0831 138.0328 74.9073 0.1398 1252 +1254 4 584.0681 137.4619 75.1097 0.1525 1253 +1255 4 585.1114 137.018 75.2102 0.1525 1254 +1256 4 586.181 136.6302 75.4656 0.1525 1255 +1257 4 587.1763 136.1509 76.1211 0.1525 1256 +1258 4 588.1842 135.7345 76.9266 0.1398 1257 +1259 4 589.2481 135.3489 77.2178 0.1271 1258 +1260 4 590.0912 134.6625 77.9108 0.1144 1259 +1261 4 590.7627 133.7485 78.1071 0.1144 1260 +1262 4 591.694 133.1044 78.12 0.1144 1261 +1263 4 592.203 132.1023 78.12 0.1144 1262 +1264 4 592.2545 130.9628 78.12 0.1144 1263 +1265 4 593.1285 130.2524 78.12 0.1398 1264 +1266 4 594.0792 129.6152 78.12 0.1907 1265 +1267 4 432.7855 379.5861 15.1883 0.3813 944 +1268 4 432.3794 378.5187 15.2043 0.3305 1267 +1269 4 431.9538 377.4639 15.4969 0.2924 1268 +1270 4 431.5832 376.4035 16.0068 0.2669 1269 +1271 4 431.2125 375.327 16.1736 0.2669 1270 +1272 4 430.859 374.2436 15.9807 0.2669 1271 +1273 4 430.4392 373.2003 15.5008 0.2415 1272 +1274 4 429.7344 372.3274 15.1698 0.2288 1273 +1275 4 428.7804 371.7188 15.0592 0.2161 1274 +1276 4 427.6821 371.4431 14.9531 0.2288 1275 +1277 4 426.5759 371.1639 15.073 0.2034 1276 +1278 4 425.743 370.5061 15.8942 0.1907 1277 +1279 4 424.9971 369.6619 16.2106 0.2034 1278 +1280 4 424.2787 368.7718 16.24 0.2796 1279 +1281 4 423.5534 367.8864 16.2397 0.3432 1280 +1282 4 422.7641 367.0593 16.238 0.3813 1281 +1283 4 421.9484 366.2573 16.2327 0.3686 1282 +1284 4 421.1053 365.484 16.2064 0.3432 1283 +1285 4 420.1649 364.8399 16.0611 0.3051 1284 +1286 4 419.1216 364.4349 15.573 0.2669 1285 +1287 4 418.2109 363.8469 14.747 0.2669 1286 +1288 4 417.6 362.9271 14.1554 0.2796 1287 +1289 4 416.9743 361.9742 14.0112 0.3051 1288 +1290 4 416.3325 361.027 14.0 0.2924 1289 +1291 4 415.542 360.2056 14.0 0.2924 1290 +1292 4 414.5925 359.5729 14.0 0.3178 1291 +1293 4 413.7116 358.8465 14.0 0.3559 1292 +1294 4 412.9474 357.9965 14.0008 0.3559 1293 +1295 4 412.2884 357.063 14.0042 0.2924 1294 +1296 4 411.7634 356.0483 14.0263 0.2161 1295 +1297 4 411.3275 354.9924 14.1529 0.1907 1296 +1298 4 410.7624 354.0097 14.4917 0.2161 1297 +1299 4 410.0782 353.0967 14.6748 0.2542 1298 +1300 4 409.4731 352.1404 14.3363 0.2542 1299 +1301 4 408.9571 351.1256 14.065 0.2415 1300 +1302 4 408.567 350.0526 14.0045 0.2161 1301 +1303 4 408.2192 348.9623 14.0022 0.1907 1302 +1304 4 408.0145 347.8378 14.0148 0.1525 1303 +1305 4 408.0991 346.7018 14.0997 0.1271 1304 +1306 4 408.3474 345.5864 14.2066 0.1144 1305 +1307 4 408.6528 344.4847 14.11 0.1144 1306 +1308 4 409.1836 343.4746 14.1131 0.1398 1307 +1309 4 409.3781 342.3637 14.2369 0.178 1308 +1310 4 408.8061 341.3788 13.9762 0.2288 1309 +1311 4 408.2055 340.4292 13.4532 0.2415 1310 +1312 4 407.6324 339.4408 13.2989 0.2542 1311 +1313 4 407.0444 338.4604 13.2255 0.2415 1312 +1314 4 406.4037 337.5223 12.9178 0.2542 1313 +1315 4 405.715 336.6083 12.8803 0.2542 1314 +1316 4 405.0366 335.6874 12.8822 0.2796 1315 +1317 4 404.3662 334.7607 12.8909 0.2796 1316 +1318 4 403.713 333.8226 12.9338 0.2669 1317 +1319 4 402.982 332.9463 13.1244 0.2288 1318 +1320 4 402.1915 332.141 13.5626 0.2034 1319 +1321 4 401.584 331.1869 13.7536 0.1907 1320 +1322 4 401.3381 330.0818 13.3683 0.2034 1321 +1323 4 401.155 328.9629 13.0029 0.2034 1322 +1324 4 400.9194 327.8441 12.9514 0.2034 1323 +1325 4 400.6322 326.7424 13.1916 0.1907 1324 +1326 4 400.2227 325.6934 13.6335 0.1907 1325 +1327 4 399.5843 324.7587 13.9412 0.178 1326 +1328 4 398.7275 324.0025 13.9969 0.1652 1327 +1329 4 397.794 323.3436 13.9838 0.178 1328 +1330 4 396.7987 322.7807 13.9121 0.2161 1329 +1331 4 395.7531 322.3403 13.627 0.2415 1330 +1332 4 394.7246 321.9399 13.1566 0.2288 1331 +1333 4 393.965 321.1231 13.4946 0.2415 1332 +1334 4 393.4388 320.1084 13.5055 0.2924 1333 +1335 4 392.8668 319.1371 13.1827 0.3559 1334 +1336 4 392.2513 318.2082 12.773 0.3432 1335 +1337 4 391.7125 317.2049 13.0141 0.2924 1336 +1338 4 391.2102 316.1959 13.1648 0.2288 1337 +1339 4 390.7675 315.1846 13.3658 0.2034 1338 +1340 4 390.2104 314.2396 14.1053 0.178 1339 +1341 4 389.7471 313.2066 14.2864 0.178 1340 +1342 4 389.4233 312.1656 13.65 0.1907 1341 +1343 4 389.2666 311.128 12.5566 0.2288 1342 +1344 4 389.0801 310.056 11.7642 0.2542 1343 +1345 4 388.8731 308.9566 11.2566 0.2415 1344 +1346 4 388.4784 307.9408 10.9614 0.2288 1345 +1347 4 387.7439 307.0656 10.8175 0.2288 1346 +1348 4 387.4122 306.0337 10.2435 0.2796 1347 +1349 4 386.6949 305.2329 10.4885 0.3305 1348 +1350 4 386.06 304.3074 10.2015 0.3559 1349 +1351 4 385.5497 303.3362 9.4259 0.3559 1350 +1352 4 385.1962 302.302 8.6097 0.3178 1351 +1353 4 384.8004 301.293 9.3607 0.2924 1352 +1354 4 384.1255 300.451 10.2819 0.2669 1353 +1355 4 383.24 299.728 10.36 0.2542 1354 +1356 4 433.4948 381.6235 18.1658 0.2924 943 +1357 4 434.1228 381.4668 20.2387 0.2034 1356 +1358 4 435.1067 381.4634 21.6325 0.1652 1357 +1359 4 436.1672 381.659 22.4507 0.178 1358 +1360 4 436.6911 382.4678 22.3471 0.2288 1359 +1361 4 436.7083 383.5981 22.1788 0.2542 1360 +1362 4 436.6362 384.7203 22.5845 0.2542 1361 +1363 4 436.6419 385.8449 23.0667 0.2415 1362 +1364 4 436.6934 386.9774 22.9566 0.2034 1363 +1365 4 437.0206 388.0288 22.3874 0.2034 1364 +1366 4 437.4542 389.0767 22.2429 0.2034 1365 +1367 4 438.0296 390.0422 21.9145 0.2542 1366 +1368 4 438.605 391.0181 22.008 0.2669 1367 +1369 4 439.2159 391.9813 22.1278 0.2924 1368 +1370 4 440.1883 392.495 22.0937 0.2669 1369 +1371 4 441.2946 392.7821 22.1236 0.2669 1370 +1372 4 442.2052 393.4319 22.2919 0.2542 1371 +1373 4 442.6628 394.4501 22.0623 0.2924 1372 +1374 4 442.8676 395.5712 21.9512 0.3178 1373 +1375 4 443.0678 396.6957 21.7955 0.3432 1374 +1376 4 443.578 397.6979 22.1746 0.3178 1375 +1377 4 444.1752 398.4712 20.8544 0.2924 1376 +1378 4 444.8215 399.4093 20.6668 0.2796 1377 +1379 4 445.5239 400.2353 21.56 0.3305 1378 +1380 4 446.2469 400.7832 21.866 0.2415 1379 +1381 4 447.2445 401.0967 22.9942 0.2542 1380 +1382 4 448.3073 401.4468 22.468 0.2415 1381 +1383 4 449.3438 401.8712 22.9359 0.2034 1382 +1384 4 450.45 401.8735 23.4702 0.1652 1383 +1385 4 451.4704 401.798 22.7223 0.1525 1384 +1386 4 452.3536 401.2237 22.8262 0.178 1385 +1387 4 453.3615 401.1001 23.6088 0.2034 1386 +1388 4 454.3076 401.5692 24.2589 0.2415 1387 +1389 4 455.1564 402.2487 25.0524 0.2669 1388 +1390 4 456.0762 402.8825 24.876 0.3051 1389 +1391 4 457.0074 403.4728 24.1343 0.3432 1390 +1392 4 457.8631 404.1638 23.4262 0.3432 1391 +1393 4 458.8138 404.6854 23.5626 0.3305 1392 +1394 4 459.6478 405.1979 24.885 0.2924 1393 +1395 4 460.4909 405.6372 26.4256 0.2669 1394 +1396 4 461.31 406.3351 27.1762 0.2161 1395 +1397 4 462.0994 407.0741 28.0036 0.1652 1396 +1398 4 462.7903 407.8131 27.83 0.1398 1397 +1399 4 462.7194 408.9388 27.9446 0.1398 1398 +1400 4 462.6725 410.0451 27.6965 0.1652 1399 +1401 4 462.7091 411.1399 28.5046 0.178 1400 +1402 4 462.8578 412.2129 29.0987 0.2034 1401 +1403 4 463.1896 413.1853 29.6456 0.2161 1402 +1404 4 463.2296 413.9427 31.7198 0.2161 1403 +1405 4 463.5328 414.7023 31.9715 0.2161 1404 +1406 4 463.8234 415.4711 33.2511 0.2288 1405 +1407 4 463.892 414.8647 35.1758 0.2669 1406 +1408 4 464.3496 414.684 37.4198 0.2796 1407 +1409 4 464.496 415.7216 38.4462 0.2796 1408 +1410 4 465.274 416.4412 39.0706 0.2542 1409 +1411 4 466.3505 416.8187 38.8654 0.2288 1410 +1412 4 467.276 417.3861 38.7335 0.178 1411 +1413 4 468.0504 417.8712 39.6371 0.1652 1412 +1414 4 469.1235 417.7362 40.3908 0.1652 1413 +1415 4 470.0845 417.9467 41.4809 0.2161 1414 +1416 4 471.0031 418.3608 42.7941 0.2542 1415 +1417 4 472.067 418.6846 43.1575 0.3178 1416 +1418 4 473.1492 419.0495 43.0648 0.3305 1417 +1419 4 474.2521 419.3046 43.3112 0.3051 1418 +1420 4 475.3331 419.0644 43.7108 0.2288 1419 +1421 4 476.3216 418.5232 44.1465 0.1907 1420 +1422 4 477.3409 418.8584 44.2198 0.1907 1421 +1423 4 478.4677 418.9431 44.093 0.2288 1422 +1424 4 479.5648 419.038 44.7714 0.2796 1423 +1425 4 480.6116 419.387 45.4728 0.3178 1424 +1426 4 481.6274 419.9063 45.5703 0.3686 1425 +1427 4 482.7497 420.102 45.7131 0.3813 1426 +1428 4 483.7976 420.5344 45.36 0.3686 1427 +1429 4 445.461 401.679 21.9845 0.2924 1379 +1430 4 445.1659 402.7727 21.7115 0.2924 1429 +1431 4 445.1945 403.8549 21.4799 0.3051 1430 +1432 4 445.771 404.8067 21.3013 0.3051 1431 +1433 4 446.2687 405.7619 21.8425 0.2924 1432 +1434 4 446.3808 406.851 21.9724 0.2924 1433 +1435 4 446.2904 407.979 21.6037 0.2669 1434 +1436 4 445.9415 409.0509 21.4144 0.2542 1435 +1437 4 445.5422 410.0588 22.0562 0.2542 1436 +1438 4 445.0618 411.0598 22.4006 0.3051 1437 +1439 4 444.833 412.1512 22.5826 0.3686 1438 +1440 4 444.9577 413.2792 22.7581 0.3686 1439 +1441 4 444.9039 414.4094 22.9611 0.3178 1440 +1442 4 444.8009 415.5466 22.9653 0.2415 1441 +1443 4 444.6534 416.6711 23.2529 0.2288 1442 +1444 4 444.7128 417.7991 23.1344 0.2669 1443 +1445 4 445.191 418.815 22.8724 0.3051 1444 +1446 4 445.6635 419.8263 23.3646 0.3051 1445 +1447 4 446.0021 420.8948 23.0208 0.2669 1446 +1448 4 446.3842 421.9129 22.1598 0.2542 1447 +1449 4 446.8464 422.9162 22.7094 0.2415 1448 +1450 4 447.2182 423.9858 22.678 0.2415 1449 +1451 4 447.2743 425.1173 22.5464 0.2288 1450 +1452 4 447.3784 426.2132 23.0896 0.2161 1451 +1453 4 447.0329 427.284 23.5656 0.2034 1452 +1454 4 446.6851 428.3308 24.3158 0.1907 1453 +1455 4 446.3842 429.3981 24.9298 0.2034 1454 +1456 4 446.2687 430.5009 24.7372 0.2034 1455 +1457 4 446.4254 431.5568 23.8924 0.1907 1456 +1458 4 446.764 432.6459 23.868 0.178 1457 +1459 4 446.9414 433.7453 24.3768 0.178 1458 +1460 4 446.8853 434.8561 24.2586 0.2161 1459 +1461 4 446.9528 435.9075 25.2084 0.2415 1460 +1462 4 446.8544 436.9714 26.1985 0.2796 1461 +1463 4 446.6153 438.0673 26.7252 0.2924 1462 +1464 4 446.6268 439.1736 26.0543 0.3178 1463 +1465 4 446.6965 440.3016 25.655 0.3305 1464 +1466 4 446.7228 441.3987 26.4359 0.3178 1465 +1467 4 446.6794 442.5404 26.4902 0.2669 1466 +1468 4 446.5535 443.6512 26.9503 0.2288 1467 +1469 4 446.5867 444.7025 27.4691 0.2161 1468 +1470 4 446.7526 445.7745 26.7058 0.2415 1469 +1471 4 446.8327 446.883 26.2136 0.2415 1470 +1472 4 446.9642 447.9526 25.7807 0.2669 1471 +1473 4 447.042 449.0566 26.4443 0.2669 1472 +1474 4 446.8727 450.1182 27.3179 0.2924 1473 +1475 4 446.7778 451.1844 28.2324 0.2669 1474 +1476 4 446.5879 452.2529 27.8597 0.2796 1475 +1477 4 446.6782 453.3615 27.8678 0.2796 1476 +1478 4 447.288 454.2664 27.3767 0.3051 1477 +1479 4 447.7994 455.2468 27.7934 0.2924 1478 +1480 4 447.9675 456.3485 27.4842 0.2796 1479 +1481 4 447.9732 457.3529 26.3096 0.2796 1480 +1482 4 448.3107 458.4225 26.8122 0.2924 1481 +1483 4 448.734 459.4773 26.8652 0.3051 1482 +1484 4 448.9731 460.5858 26.6375 0.3051 1483 +1485 4 449.2271 461.6406 25.8059 0.2796 1484 +1486 4 449.3964 462.6771 25.9274 0.2288 1485 +1487 4 449.7682 463.7032 26.2332 0.1652 1486 +1488 4 450.005 464.798 25.9854 0.1525 1487 +1489 4 450.0976 465.91 26.3864 0.1907 1488 +1490 4 450.1194 467.0002 25.9826 0.2415 1489 +1491 4 450.1869 468.1282 25.6676 0.2542 1490 +1492 4 450.291 468.6716 23.4268 0.2415 1491 +1493 2 414.4174 413.7882 15.3527 0.1907 1 +1494 2 414.3522 414.9185 15.0766 0.2669 1493 +1495 2 414.287 416.0213 14.3632 0.3305 1494 +1496 2 414.1326 417.1093 13.5979 0.3813 1495 +1497 2 413.9564 418.1938 12.8352 0.4068 1496 +1498 2 413.9335 419.2989 12.136 0.4068 1497 +1499 2 414.0605 420.412 11.6236 0.3559 1498 +1500 2 414.3236 421.4896 11.0018 0.3051 1499 +1501 2 414.2561 422.4826 10.0867 0.2796 1500 +1502 2 413.4931 423.2537 9.6502 0.2924 1501 +1503 2 412.5207 423.8463 9.8403 0.3051 1502 +1504 2 411.7462 424.6322 9.9644 0.2796 1503 +1505 2 411.3744 425.5829 9.0264 0.2669 1504 +1506 2 411.0152 426.5496 8.2065 0.2288 1505 +1507 2 410.6914 427.6249 8.4067 0.2288 1506 +1508 2 410.4683 428.7243 8.9289 0.2034 1507 +1509 2 410.2933 429.8111 9.6664 0.2161 1508 +1510 2 410.0622 430.899 9.6303 0.2034 1509 +1511 2 409.8243 432.011 9.4004 0.2288 1510 +1512 2 409.0624 432.6619 9.9117 0.2415 1511 +1513 2 409.0944 433.576 10.92 0.2796 1512 +1514 3 420.0002 408.7546 10.0285 0.3051 1 +1515 3 421.0904 408.6276 9.3506 0.3686 1514 +1516 3 422.1371 408.2124 9.3579 0.4195 1515 +1517 3 423.0867 407.5866 9.5656 0.394 1516 +1518 3 424.0556 406.9952 9.8697 0.3432 1517 +1519 3 425.1138 406.5833 9.9075 0.2796 1518 +1520 3 426.2075 406.2676 9.6527 0.2161 1519 +1521 3 427.332 406.2401 9.4366 0.178 1520 +1522 3 428.4509 406.4277 9.1146 0.1652 1521 +1523 3 429.3329 406.6771 10.3457 0.178 1522 +1524 3 430.0079 407.1073 12.3208 0.178 1523 +1525 3 430.9288 407.169 13.7455 0.178 1524 +1526 3 431.765 406.4987 13.9502 0.1907 1525 +1527 3 432.4629 405.6029 13.6391 0.2415 1526 +1528 3 433.3735 404.9245 13.7175 0.2669 1527 +1529 3 434.1926 404.1558 14.2106 0.2669 1528 +1530 3 435.0655 403.4911 14.9923 0.2161 1529 +1531 3 435.864 403.3744 13.16 0.1652 1530 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Nr5a1_471087815_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Nr5a1_471087815_m.swc new file mode 100644 index 0000000..7376d58 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Nr5a1_471087815_m.swc @@ -0,0 +1,1534 @@ +#name E:/Vaa3D-2.938/169250.03.02.01/169250.03.02.01_470218928_Nivi7.swc +#comment +##n,type,x,y,z,radius,parent +1 1 414.8144 408.5224 15.12 6.4406 -1 +2 3 415.7685 414.0582 14.8882 0.3686 1 +3 3 415.6495 414.9757 16.5147 0.5339 2 +4 3 415.3658 416.0739 16.8563 0.661 3 +5 3 415.6415 417.1756 16.515 0.6991 4 +6 3 416.1872 418.1366 17.2357 0.7118 5 +7 3 416.8393 419.0758 17.3597 0.7245 6 +8 3 417.5886 419.9407 17.36 0.7627 7 +9 3 418.4752 420.6625 17.36 0.8008 8 +10 3 419.4945 422.4128 17.3135 0.5466 9 +11 3 420.1923 423.3166 17.1464 0.5212 10 +12 3 420.6133 424.3393 16.4335 0.4957 11 +13 3 421.135 425.3369 15.9295 0.4957 12 +14 3 421.3546 426.458 16.0826 0.4449 13 +15 3 421.6567 427.5608 16.0269 0.3559 14 +16 3 421.5423 428.5184 17.4675 0.2669 15 +17 3 421.4713 429.6498 17.4583 0.2924 16 +18 3 421.4118 430.7492 17.8839 0.3432 17 +19 3 420.9199 431.7662 17.7391 0.3686 18 +20 3 420.174 432.6116 17.9446 0.3686 19 +21 3 419.371 433.3804 17.7316 0.3432 20 +22 3 419.0014 434.3562 16.9249 0.3559 21 +23 3 418.7212 435.324 15.9732 0.3686 22 +24 3 418.4203 436.4211 16.0723 0.3813 23 +25 3 418.1846 437.4965 16.7093 0.394 24 +26 3 417.7648 438.4963 17.4961 0.394 25 +27 3 417.1802 439.1278 16.5441 0.3813 26 +28 3 416.543 439.733 16.4973 0.3432 27 +29 3 415.8188 440.2512 18.1639 0.3178 28 +30 3 414.8453 440.6013 18.958 0.3051 29 +31 3 413.7242 440.6082 18.9213 0.2796 30 +32 3 412.6202 440.8038 19.0162 0.2796 31 +33 3 412.118 441.6995 19.4015 0.3051 32 +34 3 412.285 442.7749 20.083 0.394 33 +35 3 412.817 443.729 20.869 0.4449 34 +36 3 413.5102 444.6316 21.0196 0.4957 35 +37 3 413.556 445.7585 21.2654 0.5212 36 +38 3 413.143 447.0741 19.6034 0.4322 37 +39 3 412.6168 448.0808 19.8881 0.394 38 +40 3 412.0562 449.0143 20.657 0.3432 39 +41 3 411.5151 449.926 21.4312 0.3051 40 +42 3 410.8848 450.8744 21.2789 0.2924 41 +43 3 410.2292 451.8056 21.1624 0.2542 42 +44 3 409.6698 452.7929 20.9762 0.2034 43 +45 3 409.2568 453.8294 20.4523 0.178 44 +46 3 409.0704 454.9436 20.1698 0.178 45 +47 3 409.1802 456.0339 20.5537 0.1907 46 +48 3 409.1585 457.0211 21.546 0.2034 47 +49 3 408.7409 458.0141 22.437 0.2161 48 +50 3 408.4881 459.1055 22.78 0.2161 49 +51 3 408.4904 460.2426 22.8189 0.2034 50 +52 3 408.6723 461.3706 22.8502 0.1907 51 +53 3 408.9983 462.462 22.8077 0.2034 52 +54 3 409.3038 463.5351 23.119 0.2161 53 +55 3 409.2202 464.6299 23.3598 0.2288 54 +56 3 408.6654 465.5977 23.214 0.2161 55 +57 3 408.1895 466.6021 23.0574 0.178 56 +58 3 407.7937 467.658 22.6853 0.1398 57 +59 3 407.1096 468.5458 22.4742 0.1271 58 +60 3 406.1921 469.0686 23.1949 0.1525 59 +61 3 405.2128 469.4415 24.3166 0.178 60 +62 3 404.4051 470.0868 25.3742 0.178 61 +63 3 403.5494 470.7869 25.4982 0.178 62 +64 3 402.6651 471.4756 25.8037 0.1907 63 +65 3 401.6881 472.0396 26.0574 0.2415 64 +66 3 400.9526 472.8244 26.6879 0.2542 65 +67 3 400.4972 473.8471 26.6627 0.2415 66 +68 3 400.1929 474.9465 26.6081 0.2034 67 +69 3 399.693 475.809 27.7763 0.2161 68 +70 3 398.9185 476.6007 27.4254 0.2669 69 +71 3 397.9564 477.1212 26.6462 0.3051 70 +72 3 396.9051 477.5262 26.1811 0.3051 71 +73 3 395.9258 478.0753 25.664 0.2669 72 +74 3 395.0358 478.7617 26.1218 0.2415 73 +75 3 394.2796 479.5877 26.6865 0.2415 74 +76 3 394.2979 480.4628 28.3556 0.2542 75 +77 3 393.9936 481.4684 28.3256 0.2669 76 +78 3 393.1653 482.2029 28.7921 0.2542 77 +79 3 392.3051 482.9499 28.8492 0.2288 78 +80 3 391.4688 483.6088 29.6657 0.2161 79 +81 3 390.4838 483.9257 30.6312 0.2415 80 +82 3 389.5057 484.3719 30.3834 0.2924 81 +83 3 388.6191 485.0594 29.8824 0.3305 82 +84 3 387.6398 485.6314 29.7548 0.3305 83 +85 3 386.7441 486.3178 29.9541 0.3051 84 +86 3 385.8312 486.9253 29.412 0.2542 85 +87 3 385.0429 487.7295 29.0755 0.2288 86 +88 3 385.0704 488.8312 29.4 0.2288 87 +89 3 413.8923 446.5295 21.2332 0.3305 37 +90 3 414.0719 447.6209 21.6059 0.3051 89 +91 3 413.9209 448.7306 21.5765 0.2796 90 +92 3 413.8763 449.846 21.0935 0.2542 91 +93 3 413.8466 450.9797 20.9381 0.1907 92 +94 3 413.2814 451.9166 21.294 0.1652 93 +95 3 412.3491 452.5172 21.782 0.178 94 +96 3 411.2897 452.8616 22.3804 0.2288 95 +97 3 410.3208 453.2002 23.5788 0.2542 96 +98 3 409.218 453.2986 24.0853 0.2796 97 +99 3 408.5087 454.065 24.8021 0.2796 98 +100 3 408.4114 455.1507 25.4965 0.2796 99 +101 3 408.6185 456.1403 26.7708 0.2669 100 +102 3 409.0178 457.1332 27.7544 0.2796 101 +103 3 409.3953 458.1548 28.5242 0.2669 102 +104 3 408.9789 458.8973 30.2677 0.2542 103 +105 3 407.9515 459.356 30.3562 0.2161 104 +106 3 407.2068 460.1763 29.6979 0.2161 105 +107 3 406.6874 461.1681 29.3798 0.2161 106 +108 3 406.4792 462.2847 29.687 0.2288 107 +109 3 406.4232 463.3829 30.3103 0.2288 108 +110 3 406.5341 464.4182 31.3561 0.2161 109 +111 3 406.2985 465.481 32.097 0.2161 110 +112 3 406.0285 466.4706 33.1758 0.2288 111 +113 3 406.0239 467.5745 33.2567 0.2669 112 +114 3 406.2035 468.611 32.58 0.3051 113 +115 3 406.7515 469.6063 32.415 0.3051 114 +116 3 407.2846 470.6004 32.1434 0.2669 115 +117 3 407.645 471.5591 32.5606 0.2161 116 +118 3 407.2034 472.337 33.9486 0.1907 117 +119 3 406.4735 473.1492 34.613 0.2034 118 +120 3 405.9187 473.9901 35.7904 0.2034 119 +121 3 405.0687 474.5941 35.7104 0.2161 120 +122 3 404.0654 474.7108 36.834 0.2161 121 +123 3 403.9075 475.8354 36.5403 0.2415 122 +124 3 403.4785 476.8672 37.0034 0.2542 123 +125 3 402.8218 477.4598 38.7218 0.2542 124 +126 3 401.8952 477.6989 39.7194 0.2288 125 +127 3 401.8106 478.7697 39.459 0.2161 126 +128 3 402.3219 479.7604 39.1384 0.2288 127 +129 3 402.5622 480.8266 39.7446 0.2415 128 +130 3 402.6571 481.8173 41.1012 0.2415 129 +131 3 402.4009 482.8252 41.4795 0.2161 130 +132 3 402.0702 483.7393 42.0918 0.2034 131 +133 3 401.9547 484.7162 43.3311 0.178 132 +134 3 402.219 485.747 43.3927 0.178 133 +135 3 402.6194 486.7777 43.4686 0.178 134 +136 3 402.4889 487.773 44.448 0.1907 135 +137 3 401.8826 488.5932 45.6378 0.2034 136 +138 3 401.1402 489.3986 46.3901 0.2415 137 +139 3 400.3096 490.1685 46.5377 0.2796 138 +140 3 399.526 490.9934 46.478 0.3051 139 +141 3 398.8945 491.9131 46.9462 0.2924 140 +142 3 398.3488 492.8844 47.5555 0.2669 141 +143 3 397.9038 493.9197 48.0208 0.2415 142 +144 3 397.4176 494.9424 48.3753 0.2415 143 +145 3 396.7392 495.8245 48.909 0.2542 144 +146 3 396.1649 496.79 49.1725 0.2415 145 +147 3 395.9716 497.8963 49.2988 0.2161 146 +148 3 395.9476 498.8549 50.664 0.1907 147 +149 3 396.3045 499.8765 51.3192 0.1907 148 +150 3 396.5962 500.9336 52.0904 0.178 149 +151 3 396.2679 502.0101 52.1452 0.2034 150 +152 3 396.1672 503.1312 52.64 0.2796 151 +153 3 421.7573 429.151 15.1718 0.483 15 +154 3 421.9244 430.2653 14.6978 0.4195 153 +155 3 422.0662 431.3841 14.2232 0.3305 154 +156 3 422.12 432.5018 14.6902 0.2796 155 +157 3 422.1966 433.6206 15.2452 0.3432 156 +158 3 422.1406 434.7543 14.9027 0.3813 157 +159 3 421.882 435.8388 14.28 0.394 158 +160 3 420.8296 436.9577 13.186 0.3686 159 +161 3 420.0779 437.6166 11.8448 0.3305 160 +162 3 419.8777 438.5249 12.0445 0.2542 161 +163 3 419.5426 439.3578 13.6772 0.2161 162 +164 3 419.181 440.3679 13.2686 0.2415 163 +165 3 418.8436 441.4559 13.2356 0.2924 164 +166 3 418.4638 442.5335 13.3319 0.3178 165 +167 3 417.8883 443.5128 13.5985 0.3305 166 +168 3 417.4856 444.5767 13.8382 0.3559 167 +169 3 417.425 445.7161 14.0258 0.4195 168 +170 3 417.1299 446.8155 14.273 0.4449 169 +171 3 416.5865 447.8039 13.8558 0.4195 170 +172 3 416.2936 448.7008 12.376 0.3559 171 +173 3 415.7605 449.6686 13.0239 0.3178 172 +174 3 414.9368 450.4317 12.8534 0.2924 173 +175 3 413.9015 450.8493 13.2983 0.2796 174 +176 3 412.9165 451.3961 12.8517 0.2542 175 +177 3 411.8961 451.872 12.549 0.2288 176 +178 3 411.0358 452.611 12.2189 0.1907 177 +179 3 410.1926 453.3478 11.7572 0.178 178 +180 3 409.5314 454.2675 11.6967 0.1907 179 +181 3 408.9949 455.2662 11.655 0.2288 180 +182 3 408.3291 456.1162 12.3222 0.2669 181 +183 3 407.6003 456.7546 13.6881 0.3051 182 +184 3 406.7217 457.3151 13.9454 0.3305 183 +185 3 405.9839 458.0702 12.8789 0.3432 184 +186 3 405.3981 458.9682 12.0534 0.3305 185 +187 3 404.9257 460.0001 11.8423 0.3178 186 +188 3 404.4543 461.0309 11.6248 0.2796 187 +189 3 404.007 462.073 11.3347 0.2542 188 +190 3 403.5037 463.0832 11.6222 0.2161 189 +191 3 402.95 464.0304 12.3953 0.2034 190 +192 3 402.4466 464.9994 13.2031 0.1907 191 +193 3 402.2075 466.0519 13.0155 0.1907 192 +194 3 402.0451 467.1581 12.6353 0.1907 193 +195 3 401.8174 468.2792 12.644 0.1907 194 +196 3 401.4708 469.3626 12.7716 0.178 195 +197 3 400.8519 470.2995 13.1191 0.1652 196 +198 3 400.1106 471.145 13.6234 0.1398 197 +199 3 399.7113 472.1791 13.8687 0.1271 198 +200 3 399.3109 473.2328 13.4935 0.1271 199 +201 3 398.6508 474.148 13.701 0.1525 200 +202 3 398.2596 475.1776 14.3612 0.2034 201 +203 3 398.2722 476.2609 15.1833 0.2542 202 +204 3 397.8409 477.2917 15.3742 0.2924 203 +205 3 397.349 478.2858 14.7389 0.2924 204 +206 3 397.2231 479.3955 15.0836 0.2669 205 +207 3 397.2792 480.5315 14.9005 0.2542 206 +208 3 397.1751 481.6686 14.9134 0.2542 207 +209 3 397.0458 482.7508 15.7142 0.2542 208 +210 3 396.7403 483.8239 15.141 0.2288 209 +211 3 396.3079 484.865 15.4974 0.2034 210 +212 3 396.2908 485.9987 15.5518 0.2161 211 +213 3 396.5653 487.0992 15.3952 0.2415 212 +214 3 396.9634 488.154 15.8682 0.2542 213 +215 3 397.2746 489.2122 16.3523 0.2288 214 +216 3 397.0938 490.3138 16.4032 0.2034 215 +217 3 396.7529 491.3457 15.7492 0.1907 216 +218 3 396.2805 492.3787 16.0202 0.1907 217 +219 3 395.7016 493.3626 16.1857 0.2034 218 +220 3 395.133 494.3418 16.1364 0.2161 219 +221 3 394.5118 495.2742 15.7651 0.2288 220 +222 3 393.8357 496.1757 16.1616 0.2034 221 +223 3 393.1825 497.084 16.5472 0.178 222 +224 3 392.6608 498.0953 16.4119 0.1398 223 +225 3 392.3851 499.1878 16.1297 0.1398 224 +226 3 392.3954 500.3158 15.8334 0.1652 225 +227 3 392.5579 501.4381 16.0118 0.2034 226 +228 3 392.6654 502.5626 16.3489 0.2288 227 +229 3 392.5304 503.6563 15.9905 0.2161 228 +230 3 392.8485 504.6058 15.703 0.2161 229 +231 3 393.679 505.3712 15.9558 0.2161 230 +232 3 394.5942 506.0484 15.9706 0.2415 231 +233 3 395.5815 506.6032 15.6699 0.2415 232 +234 3 396.6225 507.0711 15.5168 0.2288 233 +235 3 397.7082 507.3892 15.7598 0.178 234 +236 3 398.8064 507.3571 16.3929 0.1398 235 +237 3 399.7822 507.8559 16.4368 0.1398 236 +238 3 400.7066 508.5206 16.1647 0.178 237 +239 3 401.5143 509.3237 15.9827 0.2542 238 +240 3 401.7728 510.224 14.56 0.3432 239 +241 3 421.5491 436.4589 14.488 0.4703 159 +242 3 421.8203 437.5217 13.7939 0.4068 241 +243 3 422.0651 438.5936 13.0189 0.3686 242 +244 3 422.2927 439.7056 13.3171 0.3559 243 +245 3 422.2698 440.8347 13.734 0.3686 244 +246 3 422.1818 441.9741 13.6581 0.394 245 +247 3 422.2733 443.0895 13.221 0.3813 246 +248 3 422.8235 443.9956 12.1755 0.3686 247 +249 3 423.4642 444.8307 11.0984 0.3178 248 +250 3 424.2181 445.4484 9.6359 0.2924 249 +251 3 424.9697 446.1234 8.7802 0.2542 250 +252 3 425.5749 446.7126 10.1234 0.2415 251 +253 3 426.3116 447.4619 9.7479 0.2415 252 +254 3 427.0907 448.1551 10.7674 0.2669 253 +255 3 427.7439 449.0646 10.9533 0.2796 254 +256 3 428.5241 449.838 10.7607 0.2796 255 +257 3 429.4873 450.3917 11.4128 0.2415 256 +258 3 430.0822 451.2325 12.0772 0.2288 257 +259 3 430.549 452.2255 11.9157 0.1907 258 +260 3 431.3635 452.9805 11.7505 0.1907 259 +261 3 432.3531 453.5491 11.7524 0.178 260 +262 3 432.9765 454.4563 11.5486 0.2034 261 +263 3 433.3655 455.5316 11.5206 0.2034 262 +264 3 433.9215 456.3004 10.0691 0.2034 263 +265 3 434.704 456.9857 9.4102 0.1907 264 +266 3 434.998 457.8448 11.1104 0.1907 265 +267 3 435.4053 458.7234 12.5023 0.1907 266 +268 3 436.0333 459.6272 12.6302 0.1907 267 +269 3 436.5424 460.508 11.4363 0.1907 268 +270 3 437.2688 461.2986 11.0706 0.2034 269 +271 3 437.7985 462.2629 11.3011 0.2034 270 +272 3 438.3053 463.2548 10.8296 0.2161 271 +273 3 438.9173 464.2066 10.6515 0.2161 272 +274 3 439.4241 465.227 10.5636 0.2415 273 +275 3 439.7845 466.2898 10.7484 0.2415 274 +276 3 440.2101 467.3286 11.062 0.2288 275 +277 3 440.7695 468.2895 10.5963 0.2034 276 +278 3 441.584 469.0068 10.0509 0.2034 277 +279 3 442.5221 469.6532 9.9355 0.2161 278 +280 3 443.3355 470.4048 9.3864 0.2288 279 +281 3 444.1877 471.1427 9.3254 0.2288 280 +282 3 445.1121 471.8142 9.3856 0.2288 281 +283 3 446.0284 472.4869 9.1188 0.2161 282 +284 3 446.7331 473.3586 9.3332 0.2034 283 +285 3 447.4413 474.2452 9.205 0.178 284 +286 3 448.2112 475.0895 9.2305 0.1652 285 +287 3 448.7786 476.0767 9.1448 0.178 286 +288 3 449.3632 477.048 9.52 0.2415 287 +289 3 420.3742 420.9268 17.3779 0.4703 9 +290 3 421.5137 420.857 17.5042 0.483 289 +291 3 422.6565 420.8238 17.5941 0.483 290 +292 3 423.7811 420.6694 17.2483 0.4703 291 +293 3 424.8816 420.3605 17.3186 0.4957 292 +294 3 426.0245 420.3571 17.4199 0.483 293 +295 3 427.2634 421.0252 16.7042 0.4576 294 +296 3 428.1111 421.6658 15.6918 0.4449 295 +297 3 429.0984 422.2161 15.4381 0.4068 296 +298 3 429.8386 422.9951 16.2999 0.3813 297 +299 3 430.422 423.9161 17.1332 0.3559 298 +300 3 430.9597 424.8965 17.7167 0.3178 299 +301 3 431.6941 425.7533 17.3169 0.2924 300 +302 3 432.0613 426.8333 17.3177 0.2415 301 +303 3 432.1918 427.9658 17.0853 0.2669 302 +304 3 432.6986 428.9874 16.8622 0.3178 303 +305 3 432.829 429.699 16.4027 0.2542 304 +306 3 433.1047 430.6405 15.0086 0.3305 305 +307 3 433.4376 431.6804 15.3588 0.3813 306 +308 3 433.4616 432.6608 16.8 0.4195 307 +309 3 433.2431 433.2214 17.6039 0.2161 308 +310 3 433.2236 434.2773 18.4173 0.2415 309 +311 3 433.4399 435.3892 18.4122 0.2542 310 +312 3 433.8734 436.4108 17.8545 0.2796 311 +313 3 434.4626 437.3295 17.0316 0.2669 312 +314 3 434.9968 438.3167 16.613 0.2415 313 +315 3 435.8034 439.0683 16.8876 0.2161 314 +316 3 436.8616 439.471 16.7415 0.2415 315 +317 3 437.8763 439.9881 16.5043 0.2924 316 +318 3 438.8075 440.5704 17.2301 0.3432 317 +319 3 439.1233 441.6012 18.0578 0.3559 318 +320 3 439.2148 442.7188 17.5605 0.3432 319 +321 3 439.2411 443.8617 17.6568 0.3051 320 +322 3 439.296 444.9634 17.185 0.2796 321 +323 3 439.2411 446.0033 16.83 0.2669 322 +324 3 438.8853 446.9288 18.1132 0.2542 323 +325 3 438.7229 447.8817 19.2805 0.2542 324 +326 3 439.002 448.9285 19.0991 0.2415 325 +327 3 439.4161 449.9592 18.7183 0.2542 326 +328 3 439.8737 450.9991 18.935 0.2415 327 +329 3 440.345 451.9612 19.7576 0.2415 328 +330 3 440.9617 452.8364 20.4445 0.2288 329 +331 3 441.4707 453.8042 20.921 0.2415 330 +332 3 442.0828 454.6862 20.7435 0.2669 331 +333 3 442.8321 455.5191 20.7046 0.2796 332 +334 3 443.4224 456.4743 21.1523 0.2924 333 +335 3 443.92 457.4181 20.5523 0.3051 334 +336 3 444.5584 458.323 20.1698 0.3305 335 +337 3 444.9222 459.3755 20.3045 0.3305 336 +338 3 445.3718 460.4085 20.1572 0.3178 337 +339 3 445.7768 461.4232 20.7444 0.3051 338 +340 3 446.1406 462.4666 21.4645 0.2924 339 +341 3 446.6691 463.4676 21.6219 0.2796 340 +342 3 447.2765 464.4114 22.0833 0.2542 341 +343 3 447.8302 465.4009 22.3874 0.2542 342 +344 3 448.1517 466.4912 22.4692 0.2542 343 +345 3 448.6619 467.4842 22.9284 0.2796 344 +346 3 449.2076 468.4749 23.3388 0.2796 345 +347 3 449.8746 469.3935 23.1501 0.2796 346 +348 3 450.6731 470.1554 22.4619 0.2669 347 +349 3 451.5345 470.8818 22.6814 0.2796 348 +350 3 452.1923 471.7833 23.238 0.3051 349 +351 3 452.8044 472.7431 23.1594 0.3559 350 +352 3 453.2482 473.7922 22.9827 0.394 351 +353 3 453.3512 474.9213 23.1829 0.394 352 +354 3 453.4061 476.0619 23.3503 0.3432 353 +355 3 453.4496 477.1956 23.6936 0.2796 354 +356 3 453.3741 478.3236 24.1259 0.2542 355 +357 3 453.8134 479.3612 24.3421 0.2669 356 +358 3 454.6702 480.0933 23.9915 0.2796 357 +359 3 455.4298 480.8221 23.4203 0.2669 358 +360 3 456.4674 481.2156 24.0178 0.2415 359 +361 3 457.5622 481.5279 24.2298 0.2288 360 +362 3 458.6067 481.942 24.6854 0.2161 361 +363 3 459.5997 482.482 24.7352 0.1907 362 +364 3 460.5607 483.022 24.0943 0.1907 363 +365 3 461.4015 483.7507 23.4559 0.2288 364 +366 3 462.3956 484.2106 23.0728 0.2669 365 +367 3 463.4058 484.6362 23.4788 0.2542 366 +368 3 464.0464 485.4861 23.5088 0.2161 367 +369 3 464.3565 486.4654 22.3975 0.2034 368 +370 3 464.901 487.3486 22.2583 0.2288 369 +371 3 465.5302 488.2729 22.1032 0.2288 370 +372 3 465.9443 489.3243 22.1194 0.2161 371 +373 3 466.2978 490.4111 22.1878 0.1907 372 +374 3 466.6204 491.5013 22.451 0.2034 373 +375 3 467.1902 492.444 22.0301 0.2288 374 +376 3 467.5059 493.5262 21.9974 0.2669 375 +377 3 467.9486 494.5203 22.5758 0.3051 376 +378 3 468.1809 495.598 22.0374 0.3051 377 +379 3 468.7952 496.5463 21.8355 0.2669 378 +380 3 469.477 497.4112 22.2468 0.1907 379 +381 3 470.47 497.9512 21.9666 0.1398 380 +382 3 471.4996 498.2429 21.3632 0.1271 381 +383 3 472.6093 498.2143 21.3332 0.1398 382 +384 3 473.6297 498.689 21.2612 0.1525 383 +385 3 474.5404 499.2553 21.2744 0.1398 384 +386 3 475.4624 499.777 21.9915 0.1525 385 +387 3 476.0562 500.6453 21.2089 0.178 386 +388 3 476.4188 501.6097 21.8036 0.2288 387 +389 3 477.1887 502.375 22.2925 0.2415 388 +390 3 478.1359 503.0054 22.1418 0.2288 389 +391 3 479.0694 503.6597 22.2667 0.2034 390 +392 3 479.8016 504.5234 22.4787 0.178 391 +393 3 480.448 505.4043 21.7697 0.178 392 +394 3 481.06 506.3573 21.7974 0.1652 393 +395 3 481.8231 507.205 21.9271 0.1652 394 +396 3 482.3951 508.1225 21.0613 0.1525 395 +397 3 483.2256 508.7368 19.88 0.1907 396 +398 3 433.9467 433.0315 16.2554 0.1525 308 +399 3 434.5953 433.6481 14.5919 0.1652 398 +400 3 435.6958 433.7259 13.9961 0.1907 399 +401 3 436.7083 434.1949 13.8625 0.2161 400 +402 3 437.8305 434.1068 14.2601 0.2288 401 +403 3 438.9356 434.2052 14.8229 0.2288 402 +404 3 440.0133 433.9295 14.9223 0.2288 403 +405 3 441.0223 433.6309 14.1876 0.2415 404 +406 3 442.1446 433.7339 14.5827 0.2669 405 +407 3 443.2382 434.0325 14.7224 0.3051 406 +408 3 444.325 434.3676 14.5113 0.3178 407 +409 3 445.3878 434.7726 14.4337 0.3051 408 +410 3 446.446 435.0895 13.8989 0.2669 409 +411 3 447.4722 435.4361 13.7329 0.2542 410 +412 3 448.4594 435.9967 13.7931 0.2796 411 +413 3 449.5108 436.3674 13.314 0.3305 412 +414 3 450.6022 436.5355 12.6112 0.3813 413 +415 3 451.7244 436.5893 12.444 0.3813 414 +416 3 452.8101 436.8501 12.7361 0.3559 415 +417 3 453.6017 437.3626 11.7267 0.3051 416 +418 3 454.5204 437.6498 11.5307 0.2924 417 +419 3 455.5019 437.8957 12.7725 0.2924 418 +420 3 456.5018 438.3099 13.4848 0.2924 419 +421 3 457.5428 438.7068 13.0687 0.2796 420 +422 3 458.5701 439.1267 12.3973 0.2796 421 +423 3 459.5734 439.5717 11.611 0.2796 422 +424 3 460.6636 439.8257 11.6886 0.2796 423 +425 3 461.7916 439.7673 12.0036 0.2542 424 +426 3 462.8018 439.7113 10.8951 0.2669 425 +427 3 463.9149 439.7994 10.5633 0.2542 426 +428 3 464.9662 439.9916 11.4733 0.2542 427 +429 3 466.0725 439.9138 11.1432 0.2161 428 +430 3 467.1261 439.5031 10.7456 0.2034 429 +431 3 468.2495 439.6918 10.6529 0.1907 430 +432 3 469.2688 440.2112 10.64 0.2034 431 +433 3 432.7226 429.1121 17.598 0.1652 304 +434 3 433.4284 429.4896 18.6074 0.2161 433 +435 3 434.4443 429.7905 17.736 0.2669 434 +436 3 435.4853 430.1703 17.8595 0.3051 435 +437 3 436.3422 430.39 19.5054 0.3305 436 +438 3 437.3569 430.724 20.4061 0.3178 437 +439 3 438.4048 431.177 20.5887 0.2669 438 +440 3 439.2743 431.8829 21.1495 0.2034 439 +441 3 440.1094 432.6608 20.9689 0.1652 440 +442 3 440.2318 433.3781 22.388 0.178 441 +443 3 440.4423 434.418 23.273 0.2161 442 +444 3 440.7855 435.3892 24.3858 0.2542 443 +445 3 441.1573 436.3262 23.8218 0.2542 444 +446 3 441.0395 437.2791 24.7338 0.2288 445 +447 3 441.1973 438.3579 25.4083 0.2034 446 +448 3 441.7842 439.288 26.0859 0.2034 447 +449 3 441.8185 440.3702 26.9472 0.2288 448 +450 3 441.6755 441.465 27.5293 0.2542 449 +451 3 441.9741 442.5381 27.7606 0.2669 450 +452 3 442.3562 443.5402 27.0626 0.2796 451 +453 3 442.7486 444.5698 27.2101 0.3051 452 +454 3 443.2291 445.548 26.7375 0.3178 453 +455 3 443.5139 446.6359 26.4919 0.3178 454 +456 3 443.8834 447.4733 27.8149 0.2924 455 +457 3 444.023 448.4068 29.1508 0.2796 456 +458 3 443.8148 449.4879 28.9282 0.2415 457 +459 3 443.8937 450.5255 27.8975 0.2415 458 +460 3 444.2735 451.5746 27.5937 0.2415 459 +461 3 444.5939 452.3788 29.1805 0.2796 460 +462 3 445.3626 452.9107 30.6872 0.2669 461 +463 3 445.9964 453.8145 31.3488 0.2415 462 +464 3 446.1028 454.9379 31.717 0.2034 463 +465 3 445.6315 455.9606 32.1457 0.2034 464 +466 3 444.913 456.7008 33.3357 0.2161 465 +467 3 444.3399 457.6057 34.2574 0.2288 466 +468 3 443.4579 458.3276 34.2227 0.2288 467 +469 3 442.601 458.99 33.3934 0.2542 468 +470 3 441.6526 459.6134 33.5616 0.2669 469 +471 3 440.5773 459.8571 33.6389 0.2669 470 +472 3 439.5831 459.7347 34.6735 0.2288 471 +473 3 438.7606 460.412 35.0826 0.2161 472 +474 3 438.3739 461.4782 35.4404 0.2161 473 +475 3 438.0204 462.5512 35.87 0.2161 474 +476 3 437.5972 463.5797 36.3653 0.1907 475 +477 3 436.8204 464.2386 37.3173 0.1652 476 +478 3 435.7588 464.4983 37.8434 0.1652 477 +479 3 434.6331 464.655 38.0481 0.2034 478 +480 3 433.5989 465.052 38.3827 0.2415 479 +481 3 432.8839 465.6366 39.6301 0.2796 480 +482 3 432.6802 466.2921 41.8065 0.2669 481 +483 3 432.44 467.2233 43.2524 0.2415 482 +484 3 432.1391 468.3216 43.3936 0.178 483 +485 3 431.288 469.04 43.96 0.1525 484 +486 3 441.3232 433.1905 20.1667 0.2542 441 +487 3 442.2395 433.8597 20.3403 0.3051 486 +488 3 443.1822 434.4466 20.9404 0.3305 487 +489 3 444.1225 435.0689 20.8468 0.3432 488 +490 3 445.1224 435.5002 20.0567 0.3305 489 +491 3 446.0113 435.9864 18.7603 0.3051 490 +492 3 446.859 436.5355 18.7345 0.2796 491 +493 3 447.7158 437.2151 19.0733 0.2796 492 +494 3 448.6974 437.7665 19.1786 0.2924 493 +495 3 449.5222 438.5089 19.3158 0.2796 494 +496 3 450.442 438.557 20.4137 0.2415 495 +497 3 451.5082 438.311 21.1462 0.2034 496 +498 3 452.3605 438.8956 21.7308 0.2034 497 +499 3 453.0434 439.7936 21.3662 0.2034 498 +500 3 453.8408 440.5338 22.2113 0.2161 499 +501 3 454.5306 441.4399 22.3289 0.2161 500 +502 3 455.304 442.1537 21.4315 0.2288 501 +503 3 456.3794 442.3871 21.957 0.2288 502 +504 3 457.3929 442.5358 23.1087 0.2288 503 +505 3 458.1869 443.1696 23.6748 0.2542 504 +506 3 458.8424 444.0539 23.5735 0.2796 505 +507 3 459.8045 444.6019 24.1324 0.3051 506 +508 3 460.8787 444.9176 24.5162 0.2924 507 +509 3 461.9632 445.1304 24.019 0.2542 508 +510 3 463.0283 445.3066 23.1059 0.2161 509 +511 3 464.1219 445.4484 23.0653 0.1907 510 +512 3 465.1744 445.7596 23.2148 0.1907 511 +513 3 465.9077 446.5204 23.5253 0.178 512 +514 3 466.6113 447.3795 23.8479 0.1525 513 +515 3 467.6111 447.8646 23.7622 0.1398 514 +516 3 468.7117 448.1734 23.683 0.1525 515 +517 3 469.66 448.7626 23.4368 0.1907 516 +518 3 470.6256 449.2854 22.7704 0.2034 517 +519 3 471.6483 449.7613 22.4644 0.2034 518 +520 3 472.6997 450.204 22.6173 0.2034 519 +521 3 473.7544 450.6227 22.9592 0.2288 520 +522 3 474.8229 451.006 22.8547 0.2415 521 +523 3 475.9303 451.2702 22.64 0.2288 522 +524 3 476.9862 451.4979 23.3814 0.1907 523 +525 3 478.0913 451.6821 23.4783 0.1652 524 +526 3 478.764 452.452 24.36 0.1525 525 +527 3 427.2886 420.0013 17.3099 0.394 294 +528 3 428.3491 419.5895 17.4538 0.4068 527 +529 3 429.4565 419.3767 17.2584 0.4068 528 +530 3 430.4037 418.9717 17.9315 0.4068 529 +531 3 431.3704 418.4191 17.5484 0.3559 530 +532 3 432.4171 418.1228 17.8377 0.3051 531 +533 3 433.0372 417.5932 18.9356 0.2542 532 +534 3 433.9352 417.1722 17.841 0.2796 533 +535 3 434.6056 416.3954 18.3996 0.3051 534 +536 3 434.8962 415.4436 19.4362 0.3432 535 +537 3 434.2967 414.6417 20.0684 0.3305 536 +538 3 435.0026 414.0388 19.9548 0.3305 537 +539 3 436.0905 414.0868 19.8374 0.3686 538 +540 3 437.0732 414.5341 20.1942 0.4322 539 +541 3 438.1245 414.7721 20.6618 0.4576 540 +542 3 439.0466 414.938 21.8781 0.4068 541 +543 3 440.0533 415.248 22.1024 0.3305 542 +544 3 440.6665 415.0432 24.1704 0.2924 543 +545 3 441.7007 414.5913 24.3342 0.2924 544 +546 3 442.8264 414.6417 24.7117 0.3051 545 +547 3 443.9269 414.8739 24.9343 0.3051 546 +548 3 445.0618 414.7629 25.0275 0.3178 547 +549 3 446.1508 414.5421 24.9743 0.3432 548 +550 3 447.2354 414.3328 24.6036 0.3686 549 +551 3 448.3405 414.5593 24.4367 0.394 550 +552 3 449.2877 415.1816 24.5176 0.394 551 +553 3 450.291 415.6964 24.5574 0.4068 552 +554 3 451.2588 416.1048 25.0919 0.394 553 +555 3 452.0001 416.797 23.9562 0.3686 554 +556 3 452.873 417.3838 23.0236 0.3178 555 +557 3 453.9712 417.6515 22.7388 0.2796 556 +558 3 455.0283 417.584 23.6062 0.3051 557 +559 3 455.9309 418.2807 23.4024 0.3559 558 +560 3 456.8758 418.8985 23.3906 0.4068 559 +561 3 457.7499 419.5334 23.1232 0.4068 560 +562 3 458.4855 420.3468 22.3608 0.394 561 +563 3 459.2577 421.0549 22.9684 0.394 562 +564 3 460.222 421.3535 24.11 0.394 563 +565 3 461.334 421.3695 24.5809 0.3813 564 +566 3 462.4025 421.4622 23.8568 0.3432 565 +567 3 463.4047 421.9152 23.952 0.3178 566 +568 3 464.3851 422.1955 25.1952 0.2796 567 +569 3 464.9605 423.1713 25.412 0.2542 568 +570 3 465.703 423.9435 25.158 0.2288 569 +571 3 466.7303 423.7502 25.1826 0.2288 570 +572 3 467.7702 424.1369 25.6264 0.2288 571 +573 3 468.8284 424.4995 25.1902 0.2288 572 +574 3 469.8831 424.6642 25.0802 0.2415 573 +575 3 470.8635 424.8908 24.1368 0.2288 574 +576 3 471.3738 425.7476 25.2694 0.2288 575 +577 3 472.1174 425.7774 25.8978 0.2161 576 +578 3 473.1367 425.2934 25.4814 0.2288 577 +579 3 474.2383 425.1333 25.8182 0.2034 578 +580 3 475.3457 425.1573 25.7858 0.1907 579 +581 3 476.3925 425.3735 25.8454 0.2034 580 +582 3 477.3443 425.9753 26.0151 0.2542 581 +583 3 478.0261 426.7097 27.1309 0.2796 582 +584 3 479.0054 427.1879 27.4504 0.2542 583 +585 3 479.9641 427.0403 26.4505 0.2161 584 +586 3 480.9067 427.0644 26.7333 0.1907 585 +587 3 481.9889 426.9534 26.8579 0.2034 586 +588 3 483.0105 426.7784 25.6889 0.2161 587 +589 3 484.1099 426.4832 25.482 0.2161 588 +590 3 485.1921 426.6148 26.1064 0.2161 589 +591 3 486.1005 427.1124 27.27 0.2034 590 +592 3 486.9768 427.713 28.2114 0.2161 591 +593 3 487.9549 428.2289 28.0375 0.2034 592 +594 3 488.909 428.0207 28.2551 0.2161 593 +595 3 490.0049 427.9544 28.5113 0.2161 594 +596 3 491.03 428.4246 28.3074 0.2415 595 +597 3 492.0378 428.6957 29.3762 0.2415 596 +598 3 493.0537 429.1499 29.5904 0.2415 597 +599 3 494.0593 429.4542 30.2117 0.2161 598 +600 3 495.1335 429.3329 29.6738 0.2034 599 +601 3 496.1745 429.1258 29.6136 0.2034 600 +602 3 497.2682 429.119 30.333 0.2161 601 +603 3 498.2292 428.9462 31.3855 0.2542 602 +604 3 498.4774 427.9887 32.7664 0.2669 603 +605 3 498.7989 426.9854 32.975 0.2669 604 +606 3 499.3617 426.2384 33.4216 0.2288 605 +607 3 500.3856 426.14 32.76 0.2034 606 +608 3 409.576 406.4106 15.2239 0.3813 1 +609 3 408.5945 405.85 15.6554 0.483 608 +610 3 407.5408 405.4244 15.9838 0.5084 609 +611 3 406.5284 404.9154 15.6111 0.4703 610 +612 3 405.5629 404.3399 16.1291 0.4449 611 +613 3 404.5928 403.7348 16.2364 0.4449 612 +614 3 403.5906 403.1834 16.24 0.4449 613 +615 3 402.4478 403.1422 16.2403 0.394 614 +616 3 401.4193 403.6444 16.2414 0.3305 615 +617 3 400.5842 404.4257 16.245 0.3051 616 +618 3 399.7422 405.2002 16.2607 0.3305 617 +619 3 399.367 405.556 16.3604 0.2161 618 +620 3 398.8476 406.4243 17.099 0.1652 619 +621 3 398.7446 407.3818 18.6099 0.1398 620 +622 3 398.0559 407.979 19.626 0.1144 621 +623 3 397.0321 407.8932 20.6665 0.1144 622 +624 3 396.0917 407.812 22.2194 0.1144 623 +625 3 395.1193 407.359 22.9026 0.1144 624 +626 3 394.235 406.6428 23.0966 0.1144 625 +627 3 393.1539 406.5936 23.6499 0.1398 626 +628 3 392.4343 407.4047 24.2712 0.178 627 +629 3 392.4023 408.4629 25.2109 0.2161 628 +630 3 393.0578 409.3587 25.7667 0.2288 629 +631 3 393.5257 410.3997 25.8499 0.2669 630 +632 3 393.393 411.5014 26.4844 0.3305 631 +633 3 393.0189 412.4761 27.6315 0.4195 632 +634 3 392.8462 413.4519 29.0256 0.4322 633 +635 3 392.7432 414.5684 29.5529 0.394 634 +636 3 392.384 415.6427 29.3213 0.3178 635 +637 3 391.4894 416.2741 29.0363 0.2669 636 +638 3 390.3637 416.1895 29.4423 0.2924 637 +639 3 389.2952 416.138 30.2716 0.2924 638 +640 3 388.3628 416.5945 31.4154 0.3432 639 +641 3 387.4865 417.1665 32.4727 0.2924 640 +642 3 386.4546 417.592 33.0504 0.2924 641 +643 3 385.6115 418.251 33.469 0.2161 642 +644 3 385.2042 419.2989 33.9811 0.2288 643 +645 3 384.4961 419.9841 34.3353 0.2288 644 +646 3 383.4425 419.7897 34.8989 0.2924 645 +647 3 382.4198 419.3652 35.6017 0.3178 646 +648 3 381.3307 419.1524 36.1362 0.3559 647 +649 3 380.2027 419.2325 36.3675 0.3686 648 +650 3 379.0804 419.4487 36.4428 0.3432 649 +651 3 377.957 419.6478 36.6411 0.3051 650 +652 3 376.8908 419.5345 37.3674 0.2669 651 +653 3 375.9928 419.0666 38.5983 0.2669 652 +654 3 375.0787 418.5244 39.5914 0.2669 653 +655 3 374.0274 418.1972 40.2475 0.2669 654 +656 3 372.9291 417.981 40.8201 0.2924 655 +657 3 371.8847 417.5955 41.3899 0.2924 656 +658 3 370.8093 417.266 41.8452 0.3051 657 +659 3 369.7671 417.5451 42.2145 0.2924 658 +660 3 369.226 418.4763 42.5466 0.3305 659 +661 3 368.5957 419.3835 43.1525 0.3178 660 +662 3 368.0511 420.0734 44.8381 0.3305 661 +663 3 367.8257 420.69 47.0974 0.3305 662 +664 3 367.6152 421.556 48.7878 0.3813 663 +665 3 367.184 422.5387 49.6588 0.3686 664 +666 3 366.6291 423.5225 50.0685 0.3432 665 +667 3 366.0377 424.4492 50.8158 0.3051 666 +668 3 365.6567 425.4891 51.4326 0.2924 667 +669 3 365.2735 426.4958 52.3561 0.2669 668 +670 3 364.6534 427.3721 53.2714 0.2288 669 +671 3 363.9853 428.134 54.5538 0.2161 670 +672 3 363.2886 428.6991 56.2691 0.2034 671 +673 3 362.5851 429.4954 57.195 0.2161 672 +674 3 361.7648 430.0857 58.45 0.2034 673 +675 3 360.9423 430.756 59.4804 0.2161 674 +676 3 360.4641 431.7605 59.9995 0.2034 675 +677 3 359.955 432.5761 61.4709 0.2034 676 +678 3 358.9872 432.8896 62.72 0.1652 677 +679 3 399.208 405.1693 15.1729 0.3686 618 +680 3 398.366 404.698 13.6867 0.3813 679 +681 3 397.4508 404.0539 13.1463 0.394 680 +682 3 396.4852 403.4716 13.587 0.4195 681 +683 3 395.3858 403.2051 13.9765 0.4576 682 +684 3 394.2624 403.4019 14.0958 0.4957 683 +685 3 393.1322 403.5025 14.4547 0.5084 684 +686 3 392.0225 403.6146 15.0685 0.483 685 +687 3 390.954 404.007 15.3448 0.4195 686 +688 3 390.0159 404.6259 15.869 0.3813 687 +689 3 389.103 405.2963 16.2551 0.3686 688 +690 3 388.1443 405.9129 16.4914 0.3813 689 +691 3 387.1216 406.3717 17.0419 0.3813 690 +692 3 386.0188 406.6497 17.3426 0.3813 691 +693 3 384.8748 406.6291 17.3457 0.3686 692 +694 3 383.7456 406.4472 17.2712 0.3432 693 +695 3 382.6291 406.239 16.9361 0.2924 694 +696 3 381.5126 406.1783 16.3453 0.2669 695 +697 3 380.3937 405.9381 16.3184 0.2542 696 +698 3 379.403 405.3753 16.5628 0.2924 697 +699 3 378.3734 404.9154 17.0313 0.2924 698 +700 3 377.25 404.7449 17.3519 0.2924 699 +701 3 376.1278 404.523 17.3239 0.2415 700 +702 3 374.9929 404.9199 17.5249 0.2669 701 +703 3 373.9118 405.1991 18.123 0.3305 702 +704 3 372.7827 405.2975 18.4041 0.3686 703 +705 3 371.6398 405.2883 18.3369 0.3813 704 +706 3 370.5302 405.1236 17.836 0.394 705 +707 3 369.4319 404.8467 17.4611 0.394 706 +708 3 368.3703 404.4246 17.367 0.3686 707 +709 3 367.4162 403.7988 17.3606 0.3051 708 +710 3 366.3557 403.3824 17.3653 0.2415 709 +711 3 365.325 403.7977 17.3992 0.2161 710 +712 3 364.3754 404.4292 17.591 0.2034 711 +713 3 363.2875 404.7369 17.9687 0.2161 712 +714 3 362.1629 404.5767 17.7646 0.2034 713 +715 3 361.1494 404.0619 17.4952 0.2161 714 +716 3 360.0957 403.6432 17.8475 0.2034 715 +717 3 359.0227 403.5471 18.7821 0.2288 716 +718 3 357.905 403.7313 19.1559 0.2542 717 +719 3 356.8994 404.1855 18.433 0.2924 718 +720 3 355.8172 404.38 17.6593 0.2796 719 +721 3 354.6789 404.3811 17.3958 0.2542 720 +722 3 353.5418 404.2599 17.4079 0.2415 721 +723 3 352.5328 403.7245 17.5888 0.2796 722 +724 3 351.5981 403.1216 18.2414 0.3178 723 +725 3 350.7058 402.4123 18.461 0.3305 724 +726 3 349.7231 401.8266 18.4772 0.3178 725 +727 3 348.682 401.3518 18.4643 0.3051 726 +728 3 347.593 401.0052 18.3775 0.3178 727 +729 3 346.4993 400.7569 17.8147 0.3178 728 +730 3 345.3702 400.7009 17.3886 0.3051 729 +731 3 344.2536 400.4549 17.3345 0.2669 730 +732 3 343.1806 400.0637 17.1786 0.2542 731 +733 3 342.3523 399.3441 16.3825 0.2415 732 +734 3 341.5801 398.5021 16.242 0.2542 733 +735 3 340.5505 398.0033 16.24 0.2415 734 +736 3 339.4912 397.5732 16.2403 0.2669 735 +737 3 338.5359 396.9428 16.2408 0.2924 736 +738 3 337.7248 396.1363 16.2431 0.3432 737 +739 3 336.8771 394.7978 16.329 0.2669 738 +740 3 336.4367 393.7511 16.6387 0.2924 739 +741 3 335.9242 392.7466 17.0901 0.3051 740 +742 3 335.3419 391.7685 17.3471 0.2669 741 +743 3 334.7436 390.795 17.4815 0.2415 742 +744 3 334.326 389.7436 17.8139 0.2288 743 +745 3 334.2871 388.6248 18.2487 0.2542 744 +746 3 334.3271 387.4854 18.438 0.2542 745 +747 3 334.0434 386.3849 18.4033 0.2288 746 +748 3 333.4554 385.4159 18.1544 0.2034 747 +749 3 332.7839 384.5064 17.733 0.1907 748 +750 3 332.0826 383.6072 17.5101 0.178 749 +751 3 331.4214 382.6806 17.7206 0.1907 750 +752 3 330.7945 381.7288 17.9698 0.2288 751 +753 3 330.0509 380.8696 17.7192 0.3051 752 +754 3 329.1425 380.189 17.4381 0.3432 753 +755 3 328.1427 379.6353 17.3648 0.3178 754 +756 3 327.2183 378.9626 17.36 0.2415 755 +757 3 326.5342 378.052 17.36 0.1652 756 +758 3 326.016 377.0327 17.3589 0.1271 757 +759 3 325.4588 376.0339 17.3541 0.1398 758 +760 3 324.6626 375.2171 17.3278 0.178 759 +761 3 323.6902 374.6234 17.1699 0.2288 760 +762 3 322.6858 374.1029 16.7479 0.2415 761 +763 3 321.7042 373.5366 16.3685 0.2288 762 +764 3 320.7799 372.8651 16.2784 0.2034 763 +765 3 319.9242 372.1077 16.3951 0.2034 764 +766 3 319.0364 371.395 16.6676 0.2161 765 +767 3 318.0789 370.7944 17.0937 0.2415 766 +768 3 317.134 370.2178 17.7873 0.2415 767 +769 3 316.3606 369.3873 18.086 0.2669 768 +770 3 315.6605 368.4881 17.8794 0.2796 769 +771 3 314.9032 367.6416 17.533 0.3305 770 +772 3 314.06 366.8728 17.3799 0.3305 771 +773 3 313.1872 366.1326 17.3597 0.3305 772 +774 3 312.3429 365.3604 17.3541 0.2669 773 +775 3 311.6359 364.4624 17.323 0.2542 774 +776 3 310.8385 363.6456 17.1573 0.2161 775 +777 3 309.8387 363.2292 16.2884 0.2288 776 +778 3 308.7942 362.8516 15.6125 0.1907 777 +779 3 307.8996 362.179 16.1476 0.1907 778 +780 3 307.0107 361.5326 16.9168 0.178 779 +781 3 306.1939 360.9091 18.1496 0.1907 780 +782 3 305.4549 360.0465 18.4584 0.1907 781 +783 3 304.5202 359.3865 18.4741 0.1907 782 +784 3 303.4174 359.0844 18.443 0.2034 783 +785 3 302.2917 358.9014 18.244 0.2288 784 +786 3 301.2472 358.5994 17.3774 0.2542 785 +787 3 300.6306 357.7071 16.4881 0.2542 786 +788 3 300.1856 356.8136 15.12 0.2288 787 +789 3 336.5236 395.4545 15.8169 0.2161 738 +790 3 335.4677 395.6249 15.9572 0.2034 789 +791 3 334.429 395.9727 16.354 0.2288 790 +792 3 333.5561 396.6614 16.0087 0.2288 791 +793 3 332.7198 397.4245 15.6758 0.2161 792 +794 3 331.8206 398.0662 15.0637 0.178 793 +795 3 331.0805 398.8716 14.4516 0.178 794 +796 3 330.1378 399.4859 14.7476 0.1652 795 +797 3 329.2798 400.1437 15.3667 0.1907 796 +798 3 328.28 400.6597 15.0948 0.2034 797 +799 3 327.1771 400.948 15.2197 0.2542 798 +800 3 326.1121 401.2626 14.9369 0.2669 799 +801 3 325.166 401.735 14.8296 0.2669 800 +802 3 324.2371 402.2624 15.2429 0.2161 801 +803 3 323.3047 402.9179 15.1519 0.178 802 +804 3 322.4547 403.6593 15.398 0.1652 803 +805 3 321.4674 404.1077 15.5344 0.2161 804 +806 3 320.4058 404.4349 15.0167 0.2669 805 +807 3 319.3682 404.7666 15.3252 0.3178 806 +808 3 318.3397 405.2059 15.8337 0.3051 807 +809 3 317.4543 405.8729 15.416 0.3051 808 +810 3 316.5585 406.5719 15.2048 0.2924 809 +811 3 315.5015 406.9277 15.5529 0.3051 810 +812 3 314.433 407.2228 16.2375 0.2924 811 +813 3 313.4491 407.7662 16.6023 0.2796 812 +814 3 312.5751 408.4972 16.525 0.2669 813 +815 3 311.5318 408.932 16.5108 0.2542 814 +816 3 310.6052 409.4959 15.7114 0.2415 815 +817 3 309.7952 409.8952 14.0 0.2288 816 +818 3 375.8806 404.1523 15.6237 0.2415 701 +819 3 375.7788 403.1948 14.4864 0.2161 818 +820 3 375.7342 402.0519 14.436 0.1907 819 +821 3 375.558 400.9342 14.3072 0.2161 820 +822 3 374.9895 400.0248 14.6616 0.2796 821 +823 3 374.1292 399.3395 14.8022 0.3178 822 +824 3 373.1648 398.7687 14.8904 0.2924 823 +825 3 372.1409 398.3854 14.4376 0.2669 824 +826 3 371.2646 397.7699 13.6167 0.2542 825 +827 3 370.6263 396.8467 13.512 0.2669 826 +828 3 370.0176 395.9098 13.0158 0.2542 827 +829 3 369.2569 395.0712 12.8288 0.2288 828 +830 3 368.4961 394.3929 13.9574 0.2288 829 +831 3 367.8109 393.7213 12.8106 0.2542 830 +832 3 367.1691 392.8016 12.4958 0.3051 831 +833 3 366.6348 391.7925 12.3592 0.3178 832 +834 3 365.9645 390.8773 12.6658 0.3178 833 +835 3 365.0504 390.3328 13.6578 0.2924 834 +836 3 364.7289 389.8592 12.4785 0.178 835 +837 3 363.7085 389.5492 12.574 0.1907 836 +838 3 362.6709 389.087 12.4261 0.1907 837 +839 3 361.814 388.3697 12.899 0.2161 838 +840 3 361.0338 387.6032 13.5598 0.2415 839 +841 3 360.2673 387.0861 11.9347 0.2669 840 +842 3 359.2595 386.7486 11.1958 0.2415 841 +843 3 358.1612 386.5233 11.6124 0.2161 842 +844 3 357.1476 386.2316 12.1327 0.178 843 +845 3 356.1444 386.0977 12.7039 0.178 844 +846 3 355.0484 385.9192 12.0369 0.178 845 +847 3 354.1641 385.2798 11.6301 0.2161 846 +848 3 353.8872 384.2273 12.1526 0.2288 847 +849 3 353.5143 383.2766 13.3756 0.2542 848 +850 3 352.6231 382.6131 13.2958 0.2542 849 +851 3 351.7869 382.2973 11.6094 0.2924 850 +852 3 350.7104 381.9816 12.0772 0.3051 851 +853 3 349.5755 381.8695 12.3161 0.3051 852 +854 3 348.5654 381.4188 12.8344 0.2669 853 +855 3 348.3034 380.3308 12.5871 0.2288 854 +856 3 347.5975 379.6341 11.2823 0.2034 855 +857 3 346.6331 379.1765 10.5073 0.1907 856 +858 3 345.8186 378.4032 10.8609 0.2161 857 +859 3 344.8828 377.8129 11.5433 0.2288 858 +860 3 343.8681 377.3656 12.0226 0.2415 859 +861 3 342.7664 377.3244 12.6683 0.2034 860 +862 3 341.746 377.1104 12.794 0.1907 861 +863 3 340.9017 376.4698 11.9188 0.1652 862 +864 3 340.0769 375.915 10.5459 0.178 863 +865 3 339.1194 375.3967 10.9444 0.1652 864 +866 3 338.1126 375.1256 10.0523 0.1652 865 +867 3 337.4342 374.4712 9.6838 0.1525 866 +868 3 337.1974 373.7311 9.2943 0.1652 867 +869 3 336.3017 373.1339 10.0537 0.1907 868 +870 3 335.3956 372.4372 10.1556 0.2161 869 +871 3 334.5422 371.6867 10.3236 0.2288 870 +872 3 333.746 370.966 9.9005 0.2161 871 +873 3 332.9006 370.4158 10.1909 0.1907 872 +874 3 332.0403 369.8987 9.548 0.1525 873 +875 3 331.4465 369.0944 8.2648 0.1398 874 +876 3 330.8574 368.1323 8.6489 0.1652 875 +877 3 330.044 367.3384 8.96 0.2161 876 +878 3 365.2723 389.5126 12.3609 0.2288 835 +879 3 365.3089 388.3972 12.7406 0.2161 878 +880 3 365.3135 387.3161 13.4971 0.2161 879 +881 3 365.1945 386.2041 13.685 0.2288 880 +882 3 364.896 385.194 13.5094 0.2415 881 +883 3 364.6443 384.2147 12.4432 0.2669 882 +884 3 363.9339 383.4585 11.8628 0.2924 883 +885 3 363.0198 383.0707 12.2265 0.2796 884 +886 3 362.1252 382.7172 13.7298 0.2415 885 +887 3 361.0739 382.4975 14.5516 0.2034 886 +888 3 359.9859 382.2676 14.2708 0.2161 887 +889 3 359.2091 382.2539 15.6988 0.2415 888 +890 3 358.1143 382.3442 16.3769 0.2796 889 +891 3 356.9806 382.2424 16.13 0.2669 890 +892 3 355.8801 382.0651 15.5753 0.2542 891 +893 3 354.7441 382.0399 15.8438 0.2288 892 +894 3 353.6573 381.7379 15.9004 0.2542 893 +895 3 352.7821 381.0172 15.9564 0.2669 894 +896 3 351.9047 380.4349 17.0274 0.2796 895 +897 3 351.0112 380.0242 18.3036 0.2415 896 +898 3 349.8958 379.983 18.2804 0.2288 897 +899 3 349.0115 380.2176 18.3271 0.1907 898 +900 3 348.2542 380.4258 20.2182 0.2034 899 +901 3 347.1319 380.4715 19.9973 0.1907 900 +902 3 346.2808 379.7268 20.4064 0.2034 901 +903 3 345.4994 378.9614 21.1781 0.1652 902 +904 3 344.6929 378.1652 20.8482 0.1652 903 +905 3 343.8281 377.5006 20.3529 0.2034 904 +906 3 343.359 376.6105 19.1307 0.2669 905 +907 3 342.676 375.7491 19.1097 0.3051 906 +908 3 341.8501 375.0776 20.0525 0.2669 907 +909 3 340.8948 374.6497 20.244 0.2288 908 +910 3 339.8321 374.4049 20.5884 0.1652 909 +911 3 338.7167 374.2779 20.8376 0.1398 910 +912 3 337.6276 374.4609 20.3302 0.1271 911 +913 3 336.6243 374.6257 19.1103 0.1398 912 +914 3 335.7583 375.0043 17.5806 0.1525 913 +915 3 335.2767 375.3258 15.2032 0.1398 914 +916 3 334.7927 375.9401 13.1737 0.1398 915 +917 3 333.9336 376.6048 12.32 0.1525 916 +918 4 417.8826 404.2438 16.2112 0.1907 1 +919 4 418.6617 403.4156 16.5152 0.2669 918 +920 4 419.5494 402.7212 16.996 0.3178 919 +921 4 420.4177 401.9913 17.3516 0.3432 920 +922 4 421.2528 401.2145 17.5703 0.3813 921 +923 4 422.0719 400.4423 18.0701 0.4322 922 +924 4 422.8865 399.6518 18.4279 0.4957 923 +925 4 423.8211 398.994 18.471 0.4957 924 +926 4 424.7889 398.3843 18.4444 0.483 925 +927 4 425.6378 397.6189 18.3282 0.4576 926 +928 4 426.3265 396.7255 17.8595 0.4576 927 +929 4 426.9545 395.7862 17.4224 0.4703 928 +930 4 427.5883 394.839 17.183 0.4703 929 +931 4 428.1534 393.8735 16.6026 0.4703 930 +932 4 428.5149 392.8404 15.7884 0.4576 931 +933 4 428.8261 391.7605 15.258 0.483 932 +934 4 429.2094 390.684 15.122 0.5212 933 +935 4 429.7367 389.6693 15.1203 0.5466 934 +936 4 430.4392 388.7667 15.122 0.5212 935 +937 4 431.2194 387.9304 15.1276 0.483 936 +938 4 431.8794 386.9958 15.1556 0.4576 937 +939 4 432.4926 386.0314 15.3023 0.483 938 +940 4 432.8679 384.9938 16.0384 0.483 939 +941 4 433.187 383.9378 16.7815 0.4703 940 +942 4 433.465 382.8293 16.9322 0.3813 941 +943 4 433.2465 381.7917 15.8844 0.3051 942 +944 4 433.2202 380.6935 15.3969 0.2796 943 +945 4 433.4833 380.2885 15.9138 0.2161 944 +946 4 434.4214 379.665 16.3817 0.2288 945 +947 4 435.2359 378.9191 17.113 0.2542 946 +948 4 435.9956 378.0828 17.5501 0.2669 947 +949 4 436.5973 377.1505 18.2277 0.2669 948 +950 4 437.1201 376.1392 18.5153 0.2796 949 +951 4 437.1704 375.0089 18.9188 0.2924 950 +952 4 436.9611 373.913 19.5294 0.2924 951 +953 4 437.31 372.8239 19.5992 0.2669 952 +954 4 438.0799 371.9773 19.6 0.2542 953 +955 4 438.8716 371.1514 19.6003 0.2669 954 +956 4 439.5912 370.2625 19.6011 0.2924 955 +957 4 440.3393 369.3965 19.6056 0.3178 956 +958 4 441.3552 368.8714 19.6291 0.3051 957 +959 4 441.8231 368.9606 19.7282 0.2415 958 +960 4 442.9431 369.0658 20.1312 0.2415 959 +961 4 444.0528 368.9125 20.5503 0.2034 960 +962 4 445.1704 368.6918 20.706 0.178 961 +963 4 446.3007 368.7261 20.7203 0.1907 962 +964 4 447.4207 368.9526 20.722 0.2288 963 +965 4 448.5532 369.0704 20.734 0.2669 964 +966 4 449.6858 368.9583 20.8177 0.2924 965 +967 4 450.8081 368.7821 21.1067 0.2924 966 +968 4 451.9383 368.6414 21.336 0.2669 967 +969 4 453.0332 368.4469 20.8888 0.2415 968 +970 4 454.1062 368.2994 20.011 0.2288 969 +971 4 455.2193 368.2811 19.8976 0.2415 970 +972 4 456.2821 368.3463 20.8253 0.2669 971 +973 4 457.3655 368.3977 21.6591 0.3178 972 +974 4 458.4877 368.3257 22.1435 0.3559 973 +975 4 459.6134 368.2582 22.6036 0.3813 974 +976 4 460.7506 368.2136 22.7035 0.3559 975 +977 4 461.8797 368.0889 22.4378 0.3051 976 +978 4 463.0077 367.9184 22.3107 0.2542 977 +979 4 464.1425 367.9253 22.4608 0.2161 978 +980 4 465.2705 368.0751 22.7388 0.2161 979 +981 4 466.4065 368.1655 22.8004 0.1907 980 +982 4 467.5368 368.1083 22.4792 0.1907 981 +983 4 468.5927 367.7422 22.0679 0.178 982 +984 4 469.509 367.0776 21.9904 0.1907 983 +985 4 470.3579 366.3614 22.5686 0.1907 984 +986 4 471.1896 365.7688 23.7899 0.1907 985 +987 4 472.1425 365.3135 24.8046 0.1907 986 +988 4 473.1424 364.8124 25.3397 0.178 987 +989 4 474.0633 364.1489 25.3364 0.1525 988 +990 4 474.8161 363.2955 25.2274 0.1398 989 +991 4 475.499 362.3792 25.1012 0.1652 990 +992 4 476.0424 361.3839 24.8108 0.2034 991 +993 4 476.5675 360.3863 25.1084 0.2415 992 +994 4 477.2631 359.502 25.5441 0.2415 993 +995 4 477.7813 358.525 26.1691 0.2669 994 +996 4 478.2824 357.5194 26.6826 0.2542 995 +997 4 478.9848 356.7701 27.816 0.2415 996 +998 4 479.9 356.1249 28.0294 0.178 997 +999 4 480.6184 355.2578 28.3545 0.1525 998 +1000 4 481.4284 354.457 28.5085 0.1398 999 +1001 4 482.4637 354.0211 28.1747 0.178 1000 +1002 4 483.5688 354.2293 27.7522 0.1907 1001 +1003 4 484.5355 354.8093 28.1806 0.2161 1002 +1004 4 485.3992 355.5552 28.0 0.2034 1003 +1005 4 441.8322 368.3417 19.6039 0.2542 958 +1006 4 442.6365 367.5283 19.544 0.2542 1005 +1007 4 443.0826 366.5056 19.3245 0.2924 1006 +1008 4 443.1581 365.3753 19.1517 0.3178 1007 +1009 4 443.0769 364.2473 19.4793 0.3432 1008 +1010 4 443.0483 363.1102 19.7378 0.3432 1009 +1011 4 443.3984 362.0508 20.1359 0.3305 1010 +1012 4 444.0207 361.115 20.5783 0.3178 1011 +1013 4 444.8295 360.3154 20.7105 0.3051 1012 +1014 4 445.6646 359.5329 20.7248 0.3051 1013 +1015 4 446.3911 358.652 20.7438 0.3051 1014 +1016 4 446.9963 357.6842 20.8429 0.3051 1015 +1017 4 447.3944 356.6283 21.219 0.3051 1016 +1018 4 447.6415 355.5335 21.7412 0.3051 1017 +1019 4 447.7833 354.4123 22.1581 0.3051 1018 +1020 4 447.9607 353.3004 22.6436 0.3178 1019 +1021 4 448.3279 352.2273 22.923 0.3051 1020 +1022 4 448.9205 351.256 22.9928 0.2796 1021 +1023 4 449.7258 350.4518 23.1165 0.2161 1022 +1024 4 450.3997 349.5515 23.5231 0.178 1023 +1025 4 451.0884 348.6523 23.903 0.1525 1024 +1026 4 452.0058 347.9899 23.8246 0.178 1025 +1027 4 452.7906 347.2017 23.2515 0.2034 1026 +1028 4 453.159 346.1572 22.685 0.2288 1027 +1029 4 453.2288 345.0224 22.6797 0.2288 1028 +1030 4 453.1521 343.8853 22.9085 0.2288 1029 +1031 4 452.9874 342.7584 23.1518 0.2161 1030 +1032 4 452.9439 341.6293 23.5712 0.178 1031 +1033 4 453.151 340.5173 23.9464 0.1398 1032 +1034 4 453.4622 339.4179 24.0705 0.1398 1033 +1035 4 453.7722 338.3174 24.08 0.1652 1034 +1036 4 454.1119 337.2249 24.08 0.2034 1035 +1037 4 454.5295 336.1598 24.08 0.2161 1036 +1038 4 454.931 335.089 24.08 0.2542 1037 +1039 4 455.2228 333.9839 24.0806 0.2796 1038 +1040 4 455.5522 332.888 24.0828 0.2924 1039 +1041 4 456.0087 331.8401 24.1035 0.2542 1040 +1042 4 456.5395 330.8288 24.2483 0.2288 1041 +1043 4 457.068 329.8266 24.6336 0.2288 1042 +1044 4 457.6549 328.8611 25.0659 0.2669 1043 +1045 4 458.3116 327.9379 25.4556 0.2924 1044 +1046 4 458.9877 327.0364 25.9392 0.3051 1045 +1047 4 459.6764 326.1372 26.3222 0.3051 1046 +1048 4 460.3696 325.2426 26.7294 0.2924 1047 +1049 4 461.0228 324.3229 27.1984 0.2669 1048 +1050 4 461.4667 323.2727 27.358 0.2415 1049 +1051 4 461.7195 322.1676 27.0301 0.2415 1050 +1052 4 461.9255 321.0579 26.5815 0.2796 1051 +1053 4 462.1863 319.9459 26.6837 0.3178 1052 +1054 4 462.5844 318.9117 27.3666 0.3432 1053 +1055 4 463.034 317.8924 28.0092 0.3305 1054 +1056 4 463.4401 316.8239 27.9706 0.3305 1055 +1057 4 463.6987 315.7143 28.194 0.3305 1056 +1058 4 463.781 314.6389 29.1231 0.3686 1057 +1059 4 463.8405 313.5178 29.6447 0.4068 1058 +1060 4 464.0933 312.4035 29.7604 0.4449 1059 +1061 4 464.5406 311.359 30.0947 0.4576 1060 +1062 4 465.068 310.3638 30.5673 0.4576 1061 +1063 4 465.7144 309.4245 30.7661 0.483 1062 +1064 4 466.4649 308.5608 30.7104 0.4957 1063 +1065 4 467.2016 307.6948 30.42 0.5084 1064 +1066 4 467.8926 306.8002 29.9897 0.4957 1065 +1067 4 468.6087 305.9113 29.8724 0.5084 1066 +1068 4 469.2368 304.9744 30.2957 0.5084 1067 +1069 4 469.6017 303.9093 30.7555 0.4957 1068 +1070 4 469.6532 302.7813 31.1441 0.4576 1069 +1071 4 469.4598 301.6739 31.663 0.4449 1070 +1072 4 469.3123 300.5482 31.9911 0.4322 1071 +1073 4 469.3603 299.418 32.3327 0.4195 1072 +1074 4 469.7184 298.3575 32.695 0.394 1073 +1075 4 470.4803 297.5132 32.48 0.394 1074 +1076 4 471.3555 296.7936 32.1591 0.4195 1075 +1077 4 472.1986 296.0226 32.2675 0.4195 1076 +1078 4 472.9685 295.1817 32.3302 0.394 1077 +1079 4 473.5737 294.2208 32.233 0.3432 1078 +1080 4 473.9603 293.174 32.7496 0.3305 1079 +1081 4 474.0839 292.0804 33.5017 0.3305 1080 +1082 4 474.1983 290.9661 33.9948 0.3432 1081 +1083 4 474.5598 289.8885 34.1505 0.3432 1082 +1084 4 475.1455 288.908 34.1827 0.3432 1083 +1085 4 475.8354 287.9951 34.263 0.3432 1084 +1086 4 476.5023 287.0788 34.5394 0.3432 1085 +1087 4 477.0114 286.0744 35.0193 0.3432 1086 +1088 4 477.5045 285.0482 35.2526 0.3432 1087 +1089 4 478.0524 284.0438 35.3237 0.3305 1088 +1090 4 478.6244 283.0599 35.5208 0.2924 1089 +1091 4 479.1175 282.0635 36.1455 0.2542 1090 +1092 4 479.471 281.0339 36.9673 0.2542 1091 +1093 4 479.6998 279.9288 37.3386 0.3178 1092 +1094 4 480.0327 278.842 37.1398 0.3559 1093 +1095 4 480.4491 277.7975 36.6484 0.3432 1094 +1096 4 480.9673 276.7828 36.5 0.2669 1095 +1097 4 481.5702 275.8173 36.717 0.2542 1096 +1098 4 482.1983 274.8883 37.2655 0.2924 1097 +1099 4 482.8561 273.9788 37.7818 0.3813 1098 +1100 4 483.3995 273.0099 38.4014 0.4195 1099 +1101 4 483.801 271.9643 38.9617 0.4322 1100 +1102 4 484.3021 270.9758 39.5587 0.4068 1101 +1103 4 485.024 270.095 39.825 0.4068 1102 +1104 4 485.7367 269.2164 40.1181 0.394 1103 +1105 4 486.2835 268.2405 40.6526 0.394 1104 +1106 4 486.7548 267.2041 40.8607 0.3813 1105 +1107 4 487.3634 266.2374 40.9116 0.3559 1106 +1108 4 488.0533 265.3291 41.0572 0.3432 1107 +1109 4 488.8198 264.4997 41.4809 0.3178 1108 +1110 4 489.5988 263.6828 41.9115 0.3432 1109 +1111 4 490.3356 262.8123 41.9958 0.3432 1110 +1112 4 490.9545 261.8513 42.0022 0.3686 1111 +1113 4 491.4796 260.8377 42.0137 0.3686 1112 +1114 4 491.8628 259.7612 42.082 0.3686 1113 +1115 4 492.1808 258.6744 42.3987 0.3178 1114 +1116 4 492.4039 257.5899 43.0895 0.2669 1115 +1117 4 492.6636 256.5157 43.6268 0.2415 1116 +1118 4 493.3237 255.6176 43.8295 0.2542 1117 +1119 4 494.1977 254.9084 43.573 0.2542 1118 +1120 4 494.9585 254.0778 43.9765 0.2415 1119 +1121 4 495.5682 253.1169 44.2299 0.2669 1120 +1122 4 496.1288 252.1204 44.24 0.3305 1121 +1123 4 496.6276 251.0931 44.24 0.394 1122 +1124 4 497.1801 250.0944 44.2408 0.4068 1123 +1125 4 497.6652 249.0591 44.2439 0.3813 1124 +1126 4 498.2566 248.081 44.2593 0.3686 1125 +1127 4 498.8378 247.1029 44.3408 0.3559 1126 +1128 4 499.2736 246.0572 44.6631 0.3432 1127 +1129 4 499.7495 245.0448 45.2012 0.2796 1128 +1130 4 500.1854 243.99 45.3611 0.2161 1129 +1131 4 500.6647 242.9513 45.3718 0.1525 1130 +1132 4 501.0628 241.8816 45.4443 0.1398 1131 +1133 4 501.4324 240.82 45.7716 0.1652 1132 +1134 4 502.0318 239.8808 46.3943 0.2161 1133 +1135 4 502.7194 238.9896 46.8552 0.2542 1134 +1136 4 503.5133 238.1888 47.2749 0.2415 1135 +1137 4 504.3713 237.4383 47.2114 0.2288 1136 +1138 4 505.211 236.6833 46.9571 0.2288 1137 +1139 4 505.8802 235.7773 47.2982 0.2542 1138 +1140 4 506.2589 234.7477 47.948 0.2415 1139 +1141 4 506.2932 233.6277 48.4722 0.1907 1140 +1142 4 506.3653 232.526 48.743 0.1652 1141 +1143 4 506.8881 231.5113 48.8684 0.178 1142 +1144 4 507.4795 230.5446 49.2282 0.2415 1143 +1145 4 508.0607 229.5756 49.6283 0.2542 1144 +1146 4 508.6224 228.5804 49.6605 0.2542 1145 +1147 4 509.1818 227.5851 49.5485 0.2161 1146 +1148 4 509.7286 226.5818 49.672 0.2034 1147 +1149 4 510.2286 225.5602 49.9223 0.1907 1148 +1150 4 510.5729 224.4814 50.2026 0.2034 1149 +1151 4 510.8864 223.4095 50.673 0.2288 1150 +1152 4 511.495 222.4565 50.9477 0.2669 1151 +1153 4 512.2638 221.6111 50.9793 0.2924 1152 +1154 4 513.0634 220.7931 51.0577 0.2924 1153 +1155 4 513.8631 219.9855 51.3369 0.2542 1154 +1156 4 514.6295 219.1584 51.7818 0.1907 1155 +1157 4 515.348 218.2752 52.015 0.178 1156 +1158 4 516.0595 217.3829 51.9126 0.2034 1157 +1159 4 516.6979 216.4482 51.5704 0.3051 1158 +1160 4 517.2093 215.4381 51.2333 0.3686 1159 +1161 4 517.7 214.4096 51.3204 0.4576 1160 +1162 4 518.2034 213.4029 51.8064 0.4703 1161 +1163 4 518.7308 212.4214 52.4367 0.4957 1162 +1164 4 519.3337 211.4913 53.1143 0.483 1163 +1165 4 520.0281 210.6207 53.7541 0.483 1164 +1166 4 520.7305 209.7387 54.1464 0.4449 1165 +1167 4 521.3185 208.7651 54.122 0.3559 1166 +1168 4 521.7773 207.7264 53.7816 0.3051 1167 +1169 4 522.2852 206.7185 53.5161 0.2796 1168 +1170 4 522.9659 205.809 53.7121 0.3432 1169 +1171 4 523.7243 204.967 54.0977 0.3686 1170 +1172 4 524.4782 204.1113 54.2895 0.4195 1171 +1173 4 525.2173 203.2385 54.322 0.4322 1172 +1174 4 525.9918 202.3988 54.3284 0.4576 1173 +1175 4 526.7914 201.5808 54.3528 0.4322 1174 +1176 4 527.5762 200.7503 54.467 0.3813 1175 +1177 4 528.3141 199.8877 54.7912 0.3178 1176 +1178 4 529.0234 199.0148 55.2992 0.2669 1177 +1179 4 529.7647 198.1648 55.7519 0.2415 1178 +1180 4 530.5071 197.3091 55.7522 0.2542 1179 +1181 4 531.1272 196.3745 55.2608 0.3051 1180 +1182 4 531.6271 195.3643 55.1004 0.3686 1181 +1183 4 532.1476 194.3748 55.6396 0.394 1182 +1184 4 532.7905 193.471 56.2724 0.3686 1183 +1185 4 533.5971 192.6851 56.6656 0.3305 1184 +1186 4 534.5157 192.025 57.0497 0.3051 1185 +1187 4 535.3966 191.3248 57.4538 0.3559 1186 +1188 4 536.1013 190.4394 57.6503 0.4195 1187 +1189 4 536.6241 189.4247 57.6764 0.483 1188 +1190 4 537.0542 188.3653 57.664 0.4322 1189 +1191 4 537.442 187.29 57.575 0.3432 1190 +1192 4 537.7361 186.1952 57.265 0.2415 1191 +1193 4 538.0827 185.1267 56.8378 0.2288 1192 +1194 4 538.6124 184.1211 56.6625 0.2415 1193 +1195 4 539.1935 183.1521 56.9904 0.2669 1194 +1196 4 539.6957 182.2243 57.9933 0.2415 1195 +1197 4 540.0721 181.2393 59.0075 0.2415 1196 +1198 4 540.5732 180.2452 59.5022 0.2288 1197 +1199 4 541.3877 179.4902 59.9348 0.2542 1198 +1200 4 542.2331 178.734 60.121 0.2415 1199 +1201 4 542.7422 177.7387 60.305 0.2669 1200 +1202 4 543.1655 176.6919 60.7309 0.3178 1201 +1203 4 543.7512 175.7218 61.0112 0.3813 1202 +1204 4 544.4376 174.8089 61.1341 0.4322 1203 +1205 4 545.1332 173.9086 61.4228 0.4068 1204 +1206 4 545.7612 172.9705 61.8517 0.3813 1205 +1207 4 546.4179 172.0404 62.0718 0.3305 1206 +1208 4 547.1878 171.1996 61.9791 0.3432 1207 +1209 4 548.0263 170.4423 61.5717 0.3559 1208 +1210 4 548.786 169.6037 61.1999 0.394 1209 +1211 4 549.3934 168.6416 61.2209 0.394 1210 +1212 4 549.9734 167.6749 61.6641 0.3813 1211 +1213 4 550.6164 166.746 62.0886 0.3178 1212 +1214 4 551.3302 165.8583 62.3258 0.2415 1213 +1215 4 552.1619 165.0964 62.7326 0.1907 1214 +1216 4 553.0474 164.3882 63.1151 0.178 1215 +1217 4 553.7097 163.4707 63.1481 0.2161 1216 +1218 4 554.2074 162.4503 62.8586 0.2161 1217 +1219 4 555.0688 161.7364 63.0011 0.2288 1218 +1220 4 556.1785 161.5191 63.2559 0.2288 1219 +1221 4 557.1555 160.9402 63.3847 0.2796 1220 +1222 4 557.9437 160.1268 63.7448 0.3051 1221 +1223 4 558.7079 159.3077 64.3082 0.2796 1222 +1224 4 559.5087 158.5184 64.832 0.2161 1223 +1225 4 560.3964 157.8285 65.3447 0.1907 1224 +1226 4 560.886 156.8046 65.2392 0.2288 1225 +1227 4 561.9191 156.323 65.4396 0.2669 1226 +1228 4 562.8388 155.6652 65.0538 0.2669 1227 +1229 4 563.8902 155.2202 65.2123 0.2161 1228 +1230 4 564.8145 154.6036 65.5908 0.2034 1229 +1231 4 565.3831 153.6712 66.3491 0.1907 1230 +1232 4 566.2297 152.9208 66.5487 0.2161 1231 +1233 4 567.2627 152.4437 66.6935 0.1907 1232 +1234 4 568.3484 152.1497 67.1779 0.1907 1233 +1235 4 569.4271 151.8946 67.664 0.1652 1234 +1236 4 570.2726 151.2093 68.3402 0.1652 1235 +1237 4 570.856 150.2804 69.1054 0.1398 1236 +1238 4 571.571 149.4258 69.7385 0.1271 1237 +1239 4 572.2334 148.5278 70.3492 0.1144 1238 +1240 4 572.9152 147.6412 70.7935 0.1144 1239 +1241 4 573.7412 146.853 70.8347 0.1144 1240 +1242 4 574.3509 145.9103 70.784 0.1144 1241 +1243 4 574.693 144.8201 70.6577 0.1144 1242 +1244 4 575.2204 143.8305 70.56 0.1144 1243 +1245 4 576.0509 143.0561 70.7482 0.1144 1244 +1246 4 576.9455 142.5424 71.6853 0.1144 1245 +1247 4 577.9351 142.1786 72.4679 0.1271 1246 +1248 4 578.8171 141.4991 72.6986 0.1525 1247 +1249 4 579.5069 140.5953 72.9848 0.178 1248 +1250 4 580.3501 139.9638 73.619 0.178 1249 +1251 4 581.3019 139.4193 74.2899 0.1525 1250 +1252 4 582.1633 138.6814 74.5898 0.1398 1251 +1253 4 583.0831 138.0328 74.9073 0.1398 1252 +1254 4 584.0681 137.4619 75.1097 0.1525 1253 +1255 4 585.1114 137.018 75.2102 0.1525 1254 +1256 4 586.181 136.6302 75.4656 0.1525 1255 +1257 4 587.1763 136.1509 76.1211 0.1525 1256 +1258 4 588.1842 135.7345 76.9266 0.1398 1257 +1259 4 589.2481 135.3489 77.2178 0.1271 1258 +1260 4 590.0912 134.6625 77.9108 0.1144 1259 +1261 4 590.7627 133.7485 78.1071 0.1144 1260 +1262 4 591.694 133.1044 78.12 0.1144 1261 +1263 4 592.203 132.1023 78.12 0.1144 1262 +1264 4 592.2545 130.9628 78.12 0.1144 1263 +1265 4 593.1285 130.2524 78.12 0.1398 1264 +1266 4 594.0792 129.6152 78.12 0.1907 1265 +1267 4 432.7855 379.5861 15.1883 0.3813 944 +1268 4 432.3794 378.5187 15.2043 0.3305 1267 +1269 4 431.9538 377.4639 15.4969 0.2924 1268 +1270 4 431.5832 376.4035 16.0068 0.2669 1269 +1271 4 431.2125 375.327 16.1736 0.2669 1270 +1272 4 430.859 374.2436 15.9807 0.2669 1271 +1273 4 430.4392 373.2003 15.5008 0.2415 1272 +1274 4 429.7344 372.3274 15.1698 0.2288 1273 +1275 4 428.7804 371.7188 15.0592 0.2161 1274 +1276 4 427.6821 371.4431 14.9531 0.2288 1275 +1277 4 426.5759 371.1639 15.073 0.2034 1276 +1278 4 425.743 370.5061 15.8942 0.1907 1277 +1279 4 424.9971 369.6619 16.2106 0.2034 1278 +1280 4 424.2787 368.7718 16.24 0.2796 1279 +1281 4 423.5534 367.8864 16.2397 0.3432 1280 +1282 4 422.7641 367.0593 16.238 0.3813 1281 +1283 4 421.9484 366.2573 16.2327 0.3686 1282 +1284 4 421.1053 365.484 16.2064 0.3432 1283 +1285 4 420.1649 364.8399 16.0611 0.3051 1284 +1286 4 419.1216 364.4349 15.573 0.2669 1285 +1287 4 418.2109 363.8469 14.747 0.2669 1286 +1288 4 417.6 362.9271 14.1554 0.2796 1287 +1289 4 416.9743 361.9742 14.0112 0.3051 1288 +1290 4 416.3325 361.027 14.0 0.2924 1289 +1291 4 415.542 360.2056 14.0 0.2924 1290 +1292 4 414.5925 359.5729 14.0 0.3178 1291 +1293 4 413.7116 358.8465 14.0 0.3559 1292 +1294 4 412.9474 357.9965 14.0008 0.3559 1293 +1295 4 412.2884 357.063 14.0042 0.2924 1294 +1296 4 411.7634 356.0483 14.0263 0.2161 1295 +1297 4 411.3275 354.9924 14.1529 0.1907 1296 +1298 4 410.7624 354.0097 14.4917 0.2161 1297 +1299 4 410.0782 353.0967 14.6748 0.2542 1298 +1300 4 409.4731 352.1404 14.3363 0.2542 1299 +1301 4 408.9571 351.1256 14.065 0.2415 1300 +1302 4 408.567 350.0526 14.0045 0.2161 1301 +1303 4 408.2192 348.9623 14.0022 0.1907 1302 +1304 4 408.0145 347.8378 14.0148 0.1525 1303 +1305 4 408.0991 346.7018 14.0997 0.1271 1304 +1306 4 408.3474 345.5864 14.2066 0.1144 1305 +1307 4 408.6528 344.4847 14.11 0.1144 1306 +1308 4 409.1836 343.4746 14.1131 0.1398 1307 +1309 4 409.3781 342.3637 14.2369 0.178 1308 +1310 4 408.8061 341.3788 13.9762 0.2288 1309 +1311 4 408.2055 340.4292 13.4532 0.2415 1310 +1312 4 407.6324 339.4408 13.2989 0.2542 1311 +1313 4 407.0444 338.4604 13.2255 0.2415 1312 +1314 4 406.4037 337.5223 12.9178 0.2542 1313 +1315 4 405.715 336.6083 12.8803 0.2542 1314 +1316 4 405.0366 335.6874 12.8822 0.2796 1315 +1317 4 404.3662 334.7607 12.8909 0.2796 1316 +1318 4 403.713 333.8226 12.9338 0.2669 1317 +1319 4 402.982 332.9463 13.1244 0.2288 1318 +1320 4 402.1915 332.141 13.5626 0.2034 1319 +1321 4 401.584 331.1869 13.7536 0.1907 1320 +1322 4 401.3381 330.0818 13.3683 0.2034 1321 +1323 4 401.155 328.9629 13.0029 0.2034 1322 +1324 4 400.9194 327.8441 12.9514 0.2034 1323 +1325 4 400.6322 326.7424 13.1916 0.1907 1324 +1326 4 400.2227 325.6934 13.6335 0.1907 1325 +1327 4 399.5843 324.7587 13.9412 0.178 1326 +1328 4 398.7275 324.0025 13.9969 0.1652 1327 +1329 4 397.794 323.3436 13.9838 0.178 1328 +1330 4 396.7987 322.7807 13.9121 0.2161 1329 +1331 4 395.7531 322.3403 13.627 0.2415 1330 +1332 4 394.7246 321.9399 13.1566 0.2288 1331 +1333 4 393.965 321.1231 13.4946 0.2415 1332 +1334 4 393.4388 320.1084 13.5055 0.2924 1333 +1335 4 392.8668 319.1371 13.1827 0.3559 1334 +1336 4 392.2513 318.2082 12.773 0.3432 1335 +1337 4 391.7125 317.2049 13.0141 0.2924 1336 +1338 4 391.2102 316.1959 13.1648 0.2288 1337 +1339 4 390.7675 315.1846 13.3658 0.2034 1338 +1340 4 390.2104 314.2396 14.1053 0.178 1339 +1341 4 389.7471 313.2066 14.2864 0.178 1340 +1342 4 389.4233 312.1656 13.65 0.1907 1341 +1343 4 389.2666 311.128 12.5566 0.2288 1342 +1344 4 389.0801 310.056 11.7642 0.2542 1343 +1345 4 388.8731 308.9566 11.2566 0.2415 1344 +1346 4 388.4784 307.9408 10.9614 0.2288 1345 +1347 4 387.7439 307.0656 10.8175 0.2288 1346 +1348 4 387.4122 306.0337 10.2435 0.2796 1347 +1349 4 386.6949 305.2329 10.4885 0.3305 1348 +1350 4 386.06 304.3074 10.2015 0.3559 1349 +1351 4 385.5497 303.3362 9.4259 0.3559 1350 +1352 4 385.1962 302.302 8.6097 0.3178 1351 +1353 4 384.8004 301.293 9.3607 0.2924 1352 +1354 4 384.1255 300.451 10.2819 0.2669 1353 +1355 4 383.24 299.728 10.36 0.2542 1354 +1356 4 433.4948 381.6235 18.1658 0.2924 943 +1357 4 434.1228 381.4668 20.2387 0.2034 1356 +1358 4 435.1067 381.4634 21.6325 0.1652 1357 +1359 4 436.1672 381.659 22.4507 0.178 1358 +1360 4 436.6911 382.4678 22.3471 0.2288 1359 +1361 4 436.7083 383.5981 22.1788 0.2542 1360 +1362 4 436.6362 384.7203 22.5845 0.2542 1361 +1363 4 436.6419 385.8449 23.0667 0.2415 1362 +1364 4 436.6934 386.9774 22.9566 0.2034 1363 +1365 4 437.0206 388.0288 22.3874 0.2034 1364 +1366 4 437.4542 389.0767 22.2429 0.2034 1365 +1367 4 438.0296 390.0422 21.9145 0.2542 1366 +1368 4 438.605 391.0181 22.008 0.2669 1367 +1369 4 439.2159 391.9813 22.1278 0.2924 1368 +1370 4 440.1883 392.495 22.0937 0.2669 1369 +1371 4 441.2946 392.7821 22.1236 0.2669 1370 +1372 4 442.2052 393.4319 22.2919 0.2542 1371 +1373 4 442.6628 394.4501 22.0623 0.2924 1372 +1374 4 442.8676 395.5712 21.9512 0.3178 1373 +1375 4 443.0678 396.6957 21.7955 0.3432 1374 +1376 4 443.578 397.6979 22.1746 0.3178 1375 +1377 4 444.1752 398.4712 20.8544 0.2924 1376 +1378 4 444.8215 399.4093 20.6668 0.2796 1377 +1379 4 445.5239 400.2353 21.56 0.3305 1378 +1380 4 446.2469 400.7832 21.866 0.2415 1379 +1381 4 447.2445 401.0967 22.9942 0.2542 1380 +1382 4 448.3073 401.4468 22.468 0.2415 1381 +1383 4 449.3438 401.8712 22.9359 0.2034 1382 +1384 4 450.45 401.8735 23.4702 0.1652 1383 +1385 4 451.4704 401.798 22.7223 0.1525 1384 +1386 4 452.3536 401.2237 22.8262 0.178 1385 +1387 4 453.3615 401.1001 23.6088 0.2034 1386 +1388 4 454.3076 401.5692 24.2589 0.2415 1387 +1389 4 455.1564 402.2487 25.0524 0.2669 1388 +1390 4 456.0762 402.8825 24.876 0.3051 1389 +1391 4 457.0074 403.4728 24.1343 0.3432 1390 +1392 4 457.8631 404.1638 23.4262 0.3432 1391 +1393 4 458.8138 404.6854 23.5626 0.3305 1392 +1394 4 459.6478 405.1979 24.885 0.2924 1393 +1395 4 460.4909 405.6372 26.4256 0.2669 1394 +1396 4 461.31 406.3351 27.1762 0.2161 1395 +1397 4 462.0994 407.0741 28.0036 0.1652 1396 +1398 4 462.7903 407.8131 27.83 0.1398 1397 +1399 4 462.7194 408.9388 27.9446 0.1398 1398 +1400 4 462.6725 410.0451 27.6965 0.1652 1399 +1401 4 462.7091 411.1399 28.5046 0.178 1400 +1402 4 462.8578 412.2129 29.0987 0.2034 1401 +1403 4 463.1896 413.1853 29.6456 0.2161 1402 +1404 4 463.2296 413.9427 31.7198 0.2161 1403 +1405 4 463.5328 414.7023 31.9715 0.2161 1404 +1406 4 463.8234 415.4711 33.2511 0.2288 1405 +1407 4 463.892 414.8647 35.1758 0.2669 1406 +1408 4 464.3496 414.684 37.4198 0.2796 1407 +1409 4 464.496 415.7216 38.4462 0.2796 1408 +1410 4 465.274 416.4412 39.0706 0.2542 1409 +1411 4 466.3505 416.8187 38.8654 0.2288 1410 +1412 4 467.276 417.3861 38.7335 0.178 1411 +1413 4 468.0504 417.8712 39.6371 0.1652 1412 +1414 4 469.1235 417.7362 40.3908 0.1652 1413 +1415 4 470.0845 417.9467 41.4809 0.2161 1414 +1416 4 471.0031 418.3608 42.7941 0.2542 1415 +1417 4 472.067 418.6846 43.1575 0.3178 1416 +1418 4 473.1492 419.0495 43.0648 0.3305 1417 +1419 4 474.2521 419.3046 43.3112 0.3051 1418 +1420 4 475.3331 419.0644 43.7108 0.2288 1419 +1421 4 476.3216 418.5232 44.1465 0.1907 1420 +1422 4 477.3409 418.8584 44.2198 0.1907 1421 +1423 4 478.4677 418.9431 44.093 0.2288 1422 +1424 4 479.5648 419.038 44.7714 0.2796 1423 +1425 4 480.6116 419.387 45.4728 0.3178 1424 +1426 4 481.6274 419.9063 45.5703 0.3686 1425 +1427 4 482.7497 420.102 45.7131 0.3813 1426 +1428 4 483.7976 420.5344 45.36 0.3686 1427 +1429 4 445.461 401.679 21.9845 0.2924 1379 +1430 4 445.1659 402.7727 21.7115 0.2924 1429 +1431 4 445.1945 403.8549 21.4799 0.3051 1430 +1432 4 445.771 404.8067 21.3013 0.3051 1431 +1433 4 446.2687 405.7619 21.8425 0.2924 1432 +1434 4 446.3808 406.851 21.9724 0.2924 1433 +1435 4 446.2904 407.979 21.6037 0.2669 1434 +1436 4 445.9415 409.0509 21.4144 0.2542 1435 +1437 4 445.5422 410.0588 22.0562 0.2542 1436 +1438 4 445.0618 411.0598 22.4006 0.3051 1437 +1439 4 444.833 412.1512 22.5826 0.3686 1438 +1440 4 444.9577 413.2792 22.7581 0.3686 1439 +1441 4 444.9039 414.4094 22.9611 0.3178 1440 +1442 4 444.8009 415.5466 22.9653 0.2415 1441 +1443 4 444.6534 416.6711 23.2529 0.2288 1442 +1444 4 444.7128 417.7991 23.1344 0.2669 1443 +1445 4 445.191 418.815 22.8724 0.3051 1444 +1446 4 445.6635 419.8263 23.3646 0.3051 1445 +1447 4 446.0021 420.8948 23.0208 0.2669 1446 +1448 4 446.3842 421.9129 22.1598 0.2542 1447 +1449 4 446.8464 422.9162 22.7094 0.2415 1448 +1450 4 447.2182 423.9858 22.678 0.2415 1449 +1451 4 447.2743 425.1173 22.5464 0.2288 1450 +1452 4 447.3784 426.2132 23.0896 0.2161 1451 +1453 4 447.0329 427.284 23.5656 0.2034 1452 +1454 4 446.6851 428.3308 24.3158 0.1907 1453 +1455 4 446.3842 429.3981 24.9298 0.2034 1454 +1456 4 446.2687 430.5009 24.7372 0.2034 1455 +1457 4 446.4254 431.5568 23.8924 0.1907 1456 +1458 4 446.764 432.6459 23.868 0.178 1457 +1459 4 446.9414 433.7453 24.3768 0.178 1458 +1460 4 446.8853 434.8561 24.2586 0.2161 1459 +1461 4 446.9528 435.9075 25.2084 0.2415 1460 +1462 4 446.8544 436.9714 26.1985 0.2796 1461 +1463 4 446.6153 438.0673 26.7252 0.2924 1462 +1464 4 446.6268 439.1736 26.0543 0.3178 1463 +1465 4 446.6965 440.3016 25.655 0.3305 1464 +1466 4 446.7228 441.3987 26.4359 0.3178 1465 +1467 4 446.6794 442.5404 26.4902 0.2669 1466 +1468 4 446.5535 443.6512 26.9503 0.2288 1467 +1469 4 446.5867 444.7025 27.4691 0.2161 1468 +1470 4 446.7526 445.7745 26.7058 0.2415 1469 +1471 4 446.8327 446.883 26.2136 0.2415 1470 +1472 4 446.9642 447.9526 25.7807 0.2669 1471 +1473 4 447.042 449.0566 26.4443 0.2669 1472 +1474 4 446.8727 450.1182 27.3179 0.2924 1473 +1475 4 446.7778 451.1844 28.2324 0.2669 1474 +1476 4 446.5879 452.2529 27.8597 0.2796 1475 +1477 4 446.6782 453.3615 27.8678 0.2796 1476 +1478 4 447.288 454.2664 27.3767 0.3051 1477 +1479 4 447.7994 455.2468 27.7934 0.2924 1478 +1480 4 447.9675 456.3485 27.4842 0.2796 1479 +1481 4 447.9732 457.3529 26.3096 0.2796 1480 +1482 4 448.3107 458.4225 26.8122 0.2924 1481 +1483 4 448.734 459.4773 26.8652 0.3051 1482 +1484 4 448.9731 460.5858 26.6375 0.3051 1483 +1485 4 449.2271 461.6406 25.8059 0.2796 1484 +1486 4 449.3964 462.6771 25.9274 0.2288 1485 +1487 4 449.7682 463.7032 26.2332 0.1652 1486 +1488 4 450.005 464.798 25.9854 0.1525 1487 +1489 4 450.0976 465.91 26.3864 0.1907 1488 +1490 4 450.1194 467.0002 25.9826 0.2415 1489 +1491 4 450.1869 468.1282 25.6676 0.2542 1490 +1492 4 450.291 468.6716 23.4268 0.2415 1491 +1493 2 414.4174 413.7882 15.3527 0.1907 1 +1494 2 414.3522 414.9185 15.0766 0.2669 1493 +1495 2 414.287 416.0213 14.3632 0.3305 1494 +1496 2 414.1326 417.1093 13.5979 0.3813 1495 +1497 2 413.9564 418.1938 12.8352 0.4068 1496 +1498 2 413.9335 419.2989 12.136 0.4068 1497 +1499 2 414.0605 420.412 11.6236 0.3559 1498 +1500 2 414.3236 421.4896 11.0018 0.3051 1499 +1501 2 414.2561 422.4826 10.0867 0.2796 1500 +1502 2 413.4931 423.2537 9.6502 0.2924 1501 +1503 2 412.5207 423.8463 9.8403 0.3051 1502 +1504 2 411.7462 424.6322 9.9644 0.2796 1503 +1505 2 411.3744 425.5829 9.0264 0.2669 1504 +1506 2 411.0152 426.5496 8.2065 0.2288 1505 +1507 2 410.6914 427.6249 8.4067 0.2288 1506 +1508 2 410.4683 428.7243 8.9289 0.2034 1507 +1509 2 410.2933 429.8111 9.6664 0.2161 1508 +1510 2 410.0622 430.899 9.6303 0.2034 1509 +1511 2 409.8243 432.011 9.4004 0.2288 1510 +1512 2 409.0624 432.6619 9.9117 0.2415 1511 +1513 2 409.0944 433.576 10.92 0.2796 1512 +1514 3 420.0002 408.7546 10.0285 0.3051 1 +1515 3 421.0904 408.6276 9.3506 0.3686 1514 +1516 3 422.1371 408.2124 9.3579 0.4195 1515 +1517 3 423.0867 407.5866 9.5656 0.394 1516 +1518 3 424.0556 406.9952 9.8697 0.3432 1517 +1519 3 425.1138 406.5833 9.9075 0.2796 1518 +1520 3 426.2075 406.2676 9.6527 0.2161 1519 +1521 3 427.332 406.2401 9.4366 0.178 1520 +1522 3 428.4509 406.4277 9.1146 0.1652 1521 +1523 3 429.3329 406.6771 10.3457 0.178 1522 +1524 3 430.0079 407.1073 12.3208 0.178 1523 +1525 3 430.9288 407.169 13.7455 0.178 1524 +1526 3 431.765 406.4987 13.9502 0.1907 1525 +1527 3 432.4629 405.6029 13.6391 0.2415 1526 +1528 3 433.3735 404.9245 13.7175 0.2669 1527 +1529 3 434.1926 404.1558 14.2106 0.2669 1528 +1530 3 435.0655 403.4911 14.9923 0.2161 1529 +1531 3 435.864 403.3744 13.16 0.1652 1530 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc new file mode 100644 index 0000000..4fe67b4 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc @@ -0,0 +1,1250 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/February 2015/169125.03.01.01/reconstructions/Pvalb-IRES-Cre; Ai14(IVSCC)-169125.03.01.01.DS.swc +# id,type,x,y,z,r,pid +1 1 312.0832 372.8296 27.44 5.1972 -1 +2 3 310.5926 376.7913 27.4061 0.2161 1 +3 3 310.5274 377.8643 27.3406 0.2796 2 +4 3 310.6829 378.9637 26.7414 0.2924 3 +5 3 310.6372 380.0368 25.7981 0.2542 4 +6 3 310.1784 380.9817 26.6462 0.2161 5 +7 3 309.7906 381.945 27.8124 0.1907 6 +8 3 309.6373 383.0558 27.412 0.1907 7 +9 3 308.9521 383.9264 26.7898 0.2288 8 +10 3 308.0803 384.6437 26.3326 0.2796 9 +11 3 307.3013 385.4811 26.2685 0.3686 10 +12 3 306.6515 386.418 26.0495 0.4576 11 +13 3 306.163 386.8493 25.4593 0.2542 12 +14 3 305.2078 387.4522 25.2165 0.2415 13 +15 3 304.1713 387.935 25.1997 0.2415 14 +16 3 303.1646 388.4772 25.1983 0.2034 15 +17 3 302.6612 389.4794 25.1899 0.2415 16 +18 3 302.0526 390.4449 25.1437 0.2669 17 +19 3 301.1488 391.113 24.7388 0.3051 18 +20 3 300.2908 391.8269 24.1321 0.2669 19 +21 3 299.3196 392.4252 24.0517 0.2542 20 +22 3 298.2831 392.9057 23.9078 0.2542 21 +23 3 297.186 392.9846 23.1896 0.3178 22 +24 3 296.0592 393.1093 22.8334 0.3178 23 +25 3 295.0021 393.4719 22.2421 0.3051 24 +26 3 293.9371 393.8781 22.4277 0.2415 25 +27 3 292.9361 394.3848 22.9662 0.2161 26 +28 3 292.4899 394.9992 22.9832 0.2161 27 +29 3 291.9008 395.9762 23.1025 0.2034 28 +30 3 291.2498 396.8708 23.7213 0.2288 29 +31 3 290.5634 397.7688 24.0411 0.2415 30 +32 3 289.8049 398.6234 24.0806 0.2669 31 +33 3 288.9069 399.3235 24.0828 0.2796 32 +34 3 288.05 400.0785 24.0904 0.2796 33 +35 3 287.2355 400.8816 24.1237 0.3051 34 +36 3 286.429 401.6904 24.2673 0.2924 35 +37 3 285.6545 402.4855 24.8928 0.2924 36 +38 3 284.9018 403.3321 25.1149 0.2415 37 +39 3 284.2554 404.2564 24.7358 0.2415 38 +40 3 283.5427 405.1282 24.2746 0.2669 39 +41 3 282.6424 405.7802 24.6834 0.3305 40 +42 3 281.8976 406.5742 25.4755 0.3432 41 +43 3 281.2192 407.4836 25.5206 0.3305 42 +44 3 280.3715 408.2387 25.2538 0.3051 43 +45 3 279.5433 409.0258 25.2843 0.3178 44 +46 3 278.7242 409.8083 25.6662 0.3178 45 +47 3 277.8204 410.4638 26.264 0.3051 46 +48 3 276.9144 411.1582 26.3071 0.2796 47 +49 3 275.99 411.832 26.2576 0.2669 48 +50 3 275.0862 412.523 25.9955 0.2796 49 +51 3 274.3198 413.3215 25.3011 0.3051 50 +52 3 273.7043 414.2813 25.2031 0.3432 51 +53 3 273.2352 415.3235 25.2 0.3813 52 +54 3 272.6312 416.2947 25.2 0.3813 53 +55 3 272.0638 417.2877 25.2 0.3686 54 +56 3 271.3637 418.1915 25.1997 0.3178 55 +57 3 270.7059 419.1284 25.1983 0.3051 56 +58 3 270.0423 420.0596 25.1919 0.3051 57 +59 3 269.3731 420.9874 25.1605 0.3559 58 +60 3 268.586 421.8157 25.0281 0.3813 59 +61 3 267.8001 422.5936 24.3247 0.3813 60 +62 3 266.9776 423.3807 24.0618 0.3432 61 +63 3 266.0761 424.0842 23.9635 0.3051 62 +64 3 265.1609 424.7066 23.259 0.2542 63 +65 3 264.2091 425.3117 22.7979 0.2161 64 +66 3 263.39 426.0634 22.9298 0.2034 65 +67 3 262.4485 426.3825 24.1791 0.2415 66 +68 3 261.4246 426.879 24.4507 0.2542 67 +69 3 260.395 427.3572 24.6235 0.2542 68 +70 3 259.3414 427.7485 24.5118 0.2288 69 +71 3 258.2923 428.0265 24.6938 0.2542 70 +72 3 257.392 428.5435 23.7191 0.2924 71 +73 3 256.6942 428.9554 24.3012 0.3305 72 +74 3 255.9357 429.7276 24.64 0.3305 73 +75 3 255.009 430.2584 24.6344 0.3178 74 +76 3 254.1831 430.6634 23.6824 0.3051 75 +77 3 253.4395 431.3852 23.7252 0.3051 76 +78 3 252.5277 431.884 24.5468 0.2796 77 +79 3 251.7738 432.3588 23.6477 0.2415 78 +80 3 250.6882 432.5556 23.6606 0.2161 79 +81 3 249.8427 432.9193 24.5949 0.2415 80 +82 3 249.2787 433.8025 24.9186 0.2924 81 +83 3 248.7285 434.3962 23.8501 0.3178 82 +84 3 248.1485 435.3538 23.8171 0.2924 83 +85 3 247.668 436.1122 22.9415 0.2415 84 +86 3 247.0262 436.9714 22.675 0.1907 85 +87 3 246.2517 437.4587 24.2332 0.178 86 +88 3 245.5562 438.0468 24.8853 0.178 87 +89 3 245.134 438.883 24.1363 0.2034 88 +90 3 244.4739 439.6072 24.2189 0.2034 89 +91 3 243.7864 440.4022 23.6132 0.2034 90 +92 3 243.7098 441.2465 22.68 0.2034 91 +93 3 243.1275 441.8002 24.0089 0.2161 92 +94 3 242.9478 442.8413 23.6141 0.2161 93 +95 3 242.6138 443.8125 23.9828 0.178 94 +96 3 242.1299 444.6373 23.2663 0.1398 95 +97 3 241.2925 445.3638 23.4889 0.1271 96 +98 3 240.4253 445.4736 22.202 0.1398 97 +99 3 239.7824 446.0433 21.0 0.1525 98 +100 3 239.4335 446.732 21.884 0.1525 99 +101 3 238.818 447.4481 22.6209 0.1525 100 +102 3 237.7221 447.6506 22.398 0.1525 101 +103 3 236.9979 448.4366 21.6418 0.1398 102 +104 3 236.3058 449.3312 21.5261 0.1398 103 +105 3 235.6834 450.0702 21.7196 0.1398 104 +106 3 234.8907 450.8378 21.84 0.1652 105 +107 3 234.2695 451.3938 21.8378 0.1652 106 +108 3 233.6059 452.2896 21.56 0.1652 107 +109 3 232.7434 452.8227 21.56 0.1525 108 +110 3 231.835 453.4747 21.8126 0.178 109 +111 3 230.9301 454.0753 22.1673 0.2161 110 +112 3 229.9703 454.6027 21.7403 0.2542 111 +113 3 228.9716 454.8544 21.7193 0.2415 112 +114 3 227.9523 454.5226 22.12 0.2034 113 +115 3 227.0405 454.7366 22.96 0.1525 114 +116 3 226.3587 455.4573 22.96 0.1271 115 +117 3 225.5636 456.1849 22.96 0.1144 116 +118 3 224.6953 456.925 22.96 0.1271 117 +119 3 223.9014 457.5966 23.2285 0.1398 118 +120 3 223.5399 458.6731 23.24 0.1525 119 +121 3 222.8787 459.4556 22.965 0.1525 120 +122 3 221.8399 459.7736 23.5074 0.1652 121 +123 3 220.9453 460.2884 23.6846 0.178 122 +124 3 220.3905 461.2459 24.0321 0.178 123 +125 3 219.7624 461.7253 25.1622 0.1525 124 +126 3 219.7624 462.8521 25.4906 0.1271 125 +127 3 219.6011 463.94 26.1092 0.1144 126 +128 3 218.9627 464.798 26.5496 0.1144 127 +129 3 218.401 465.6538 27.594 0.1144 128 +130 3 217.7101 466.3127 28.0 0.1144 129 +131 3 217.1381 467.2794 28.1078 0.1525 130 +132 3 217.1312 468.3536 28.0 0.1907 131 +133 3 292.6455 393.8414 22.9662 0.2924 27 +134 3 292.0746 392.8542 22.9704 0.2924 133 +135 3 291.2876 392.0408 23.0171 0.2924 134 +136 3 290.2534 391.6084 23.2767 0.2669 135 +137 3 289.1517 391.4962 23.949 0.2669 136 +138 3 288.0489 391.2583 24.3723 0.2288 137 +139 3 286.9461 391.1222 25.0146 0.2288 138 +140 3 285.8227 391.0581 25.4668 0.2034 139 +141 3 284.7485 390.7835 26.0232 0.1907 140 +142 3 283.7189 390.3259 26.1685 0.1907 141 +143 3 282.5897 390.1784 26.0893 0.2161 142 +144 3 281.4812 389.985 26.3085 0.2542 143 +145 3 280.4322 389.5297 26.2489 0.2542 144 +146 3 279.3785 389.238 25.7748 0.2415 145 +147 3 278.3855 388.992 25.1258 0.2415 146 +148 3 277.515 388.3937 25.8048 0.2288 147 +149 3 276.5689 388.0963 26.8097 0.2288 148 +150 3 275.6582 387.6215 26.88 0.2288 149 +151 3 274.7751 387.816 26.1974 0.2669 150 +152 3 273.7821 387.6661 25.9529 0.2796 151 +153 3 272.7708 387.4362 26.04 0.2796 152 +154 3 272.097 387.0964 27.4336 0.2542 153 +155 3 271.7 386.7498 25.6819 0.2542 154 +156 3 270.6979 386.4661 25.48 0.2542 155 +157 3 269.706 386.3185 26.3113 0.2669 156 +158 3 269.1146 385.9684 25.0883 0.2669 157 +159 3 268.395 385.2466 24.8786 0.2415 158 +160 3 267.688 384.6414 25.4072 0.2288 159 +161 3 266.9867 384.2776 23.8 0.2161 160 +162 3 266.1276 383.6164 23.9599 0.2542 161 +163 3 265.2947 382.9071 24.575 0.2924 162 +164 3 264.4482 382.5948 23.8286 0.3305 163 +165 3 263.6359 382.0331 23.5626 0.3305 164 +166 3 263.0308 381.1465 24.0075 0.3051 165 +167 3 262.2929 380.3731 23.2772 0.2542 166 +168 3 261.5184 379.562 23.56 0.2161 167 +169 3 260.7336 378.9935 24.5227 0.2034 168 +170 3 259.8928 378.4661 23.4346 0.2288 169 +171 3 259.1961 377.7923 22.68 0.2415 170 +172 3 258.4525 377.2248 22.9205 0.2415 171 +173 3 257.4252 377.0544 23.24 0.2161 172 +174 3 256.6392 376.4538 22.6789 0.2034 173 +175 3 255.819 375.7788 22.3219 0.178 174 +176 3 255.2115 375.343 22.094 0.1907 175 +177 3 254.1808 375.3041 21.887 0.2288 176 +178 3 253.0814 375.4002 21.9601 0.2796 177 +179 3 251.9706 375.5054 22.1746 0.2796 178 +180 3 250.9204 375.8543 22.6898 0.2288 179 +181 3 250.1322 375.9333 21.784 0.178 180 +182 3 249.2273 375.5752 21.1434 0.1907 181 +183 3 249.0053 375.5752 18.7698 0.2288 182 +184 3 248.3109 376.058 18.4478 0.2542 183 +185 3 247.4529 375.8463 19.32 0.2161 184 +186 3 246.4073 375.4356 19.32 0.2034 185 +187 3 245.3972 375.0215 19.5734 0.2288 186 +188 3 244.9087 375.3578 19.7109 0.2796 187 +189 3 243.9694 375.2743 18.8563 0.3051 188 +190 3 242.9124 374.9826 18.613 0.3051 189 +191 3 242.1734 374.8259 20.1127 0.3051 190 +192 3 241.3703 374.1646 19.4435 0.2924 191 +193 3 240.2606 374.088 19.2363 0.2796 192 +194 3 239.2436 373.8169 19.8934 0.2669 193 +195 3 238.6384 373.508 19.1668 0.2542 194 +196 3 237.904 372.9074 19.3164 0.2415 195 +197 3 237.2748 372.0917 19.1453 0.2161 196 +198 3 236.816 371.3447 18.1594 0.2034 197 +199 3 235.8585 370.8345 17.4675 0.1652 198 +200 3 234.83 370.4764 16.611 0.1398 199 +201 3 233.8016 370.1183 15.7545 0.1144 200 +202 3 232.9848 369.4537 15.4 0.1144 201 +203 3 232.6896 368.4755 15.4 0.1144 202 +204 3 232.6896 367.3315 15.4 0.1144 203 +205 3 232.6164 366.191 15.4 0.1144 204 +206 3 232.3681 365.1797 15.4 0.1271 205 +207 3 231.2665 364.8777 15.4 0.1398 206 +208 3 230.8592 363.9064 15.4 0.178 207 +209 3 230.8592 362.7624 15.4 0.1907 208 +210 3 306.4433 388.0608 26.5065 0.2542 12 +211 3 306.0303 389.111 26.4446 0.2542 210 +212 3 305.7065 390.1875 26.502 0.2288 211 +213 3 305.5144 391.28 27.1065 0.2415 212 +214 3 305.0545 392.273 27.7141 0.2288 213 +215 3 304.463 393.2077 28.4032 0.2669 214 +216 3 303.7217 393.9902 29.2457 0.2669 215 +217 3 302.7859 394.6034 29.6803 0.3051 216 +218 3 301.8112 395.1765 30.0818 0.3178 217 +219 3 300.864 395.7771 30.6298 0.3305 218 +220 3 300.0518 396.5596 30.8322 0.3178 219 +221 3 299.537 397.5617 30.9798 0.2924 220 +222 3 299.0576 398.5662 31.5577 0.2796 221 +223 3 298.4707 399.5317 31.9015 0.2415 222 +224 3 297.686 400.3497 32.0855 0.2288 223 +225 3 296.987 401.1951 32.7701 0.2288 224 +226 3 296.598 402.2407 33.1243 0.2796 225 +227 3 296.4939 403.3481 33.6806 0.2924 226 +228 3 296.2994 404.4566 34.1166 0.2669 227 +229 3 295.867 405.5068 34.3272 0.2034 228 +230 3 295.5867 406.4861 35.4684 0.2034 229 +231 3 295.2458 407.5168 36.2978 0.2415 230 +232 3 294.6704 408.4949 36.4008 0.3051 231 +233 3 294.2105 409.5406 36.4048 0.3178 232 +234 3 293.7895 410.6045 36.4274 0.3305 233 +235 3 293.3662 411.6661 36.5674 0.3305 234 +236 3 293.0402 412.7106 37.343 0.3432 235 +237 3 292.3801 413.4771 38.5918 0.3432 236 +238 3 291.5038 413.6624 40.2956 0.3432 237 +239 3 290.7751 414.2024 41.9924 0.3178 238 +240 3 290.1562 414.9528 43.4591 0.2924 239 +241 3 289.5887 415.82 44.24 0.2542 240 +242 3 288.7422 416.3062 44.24 0.2415 241 +243 3 287.8361 416.7935 44.1582 0.2161 242 +244 3 287.2172 417.4033 44.1952 0.1907 243 +245 3 286.7036 418.3802 44.2963 0.1907 244 +246 3 285.7895 418.9031 44.8767 0.2161 245 +247 3 285.1042 419.602 45.36 0.2542 246 +248 3 284.316 420.2187 44.8 0.2415 247 +249 3 283.5976 420.8032 45.6084 0.1907 248 +250 3 282.9181 421.5949 45.7148 0.1398 249 +251 3 282.3998 422.3785 45.0178 0.1144 250 +252 3 282.2282 423.4596 44.6365 0.1144 251 +253 3 282.1104 424.5087 43.7388 0.1271 252 +254 3 282.1573 425.5932 43.9438 0.1652 253 +255 3 282.1596 426.2487 45.1063 0.2161 254 +256 3 282.3014 427.3218 44.8 0.2669 255 +257 3 309.8341 368.9766 27.3356 0.3432 1 +258 3 309.7941 367.8692 26.7624 0.4195 257 +259 3 309.7906 366.7401 26.3228 0.4703 258 +260 3 309.7643 365.5972 26.1934 0.483 259 +261 3 309.5847 364.499 25.5623 0.483 260 +262 3 309.0813 363.4797 25.3084 0.4449 261 +263 3 308.499 362.5119 25.7272 0.3813 262 +264 3 308.1044 361.464 26.2956 0.3432 263 +265 3 307.6548 360.4126 26.3197 0.3432 264 +266 3 307.4878 359.2812 26.32 0.3813 265 +267 3 307.3768 358.1418 26.32 0.394 266 +268 3 307.0748 357.039 26.3197 0.3559 267 +269 3 307.0496 355.8973 26.3172 0.3051 268 +270 3 307.0507 354.7533 26.2984 0.2542 269 +271 3 307.0553 353.6104 26.1772 0.2034 270 +272 3 307.0828 352.6105 25.5343 0.3432 271 +273 3 307.283 351.4997 25.1034 0.3559 272 +274 3 307.4809 350.4026 24.4773 0.3559 273 +275 3 307.3997 349.2735 24.096 0.3305 274 +276 3 307.0027 348.2039 24.0856 0.3432 275 +277 3 306.5405 347.1571 24.1139 0.3559 276 +278 3 306.0269 346.1366 24.2662 0.3813 277 +279 3 305.424 345.2009 24.9024 0.3686 278 +280 3 304.7788 344.2639 25.1969 0.3559 279 +281 3 304.1507 343.3075 25.2 0.3432 280 +282 3 303.5684 342.3226 25.2 0.3432 281 +283 3 303.0387 341.309 25.1994 0.3432 282 +284 3 302.4747 340.3137 25.1966 0.3305 283 +285 3 302.6303 339.8584 26.0229 0.3051 284 +286 3 302.5056 338.7967 25.7527 0.2924 285 +287 3 302.2574 337.8552 25.8852 0.2669 286 +288 3 302.3592 336.7742 26.4726 0.2415 287 +289 3 302.1647 335.7125 26.32 0.2288 288 +290 3 302.0995 334.7538 25.76 0.2288 289 +291 3 301.6705 333.778 26.2718 0.2415 290 +292 3 301.6728 332.7324 25.7723 0.2542 291 +293 3 301.5584 331.8755 26.01 0.2796 292 +294 3 301.2175 330.9089 26.7624 0.2924 293 +295 3 301.317 329.8655 25.8532 0.3178 294 +296 3 300.9143 329.1608 26.6 0.1144 295 +297 3 300.9349 328.1186 25.6236 0.1271 296 +298 3 300.9864 327.0124 25.0527 0.1398 297 +299 3 300.9761 325.8707 24.92 0.178 298 +300 3 300.7519 324.9612 26.04 0.2034 299 +301 3 300.1227 324.221 25.48 0.2415 300 +302 3 300.0712 323.1663 25.8308 0.2415 301 +303 3 300.0243 322.06 25.9627 0.2669 302 +304 3 300.1902 320.9686 26.1288 0.2924 303 +305 3 300.4899 319.9905 25.2162 0.3178 304 +306 3 300.745 318.9255 24.6338 0.2924 305 +307 3 301.1809 317.8913 24.36 0.2415 306 +308 3 301.3868 316.8056 24.08 0.2288 307 +309 3 301.3719 315.8767 25.3949 0.2542 308 +310 3 301.1431 314.7796 25.7961 0.3051 309 +311 3 300.904 313.6905 26.2492 0.3305 310 +312 3 300.5322 312.7662 27.1765 0.3305 311 +313 3 299.9511 311.9585 26.7476 0.3178 312 +314 3 299.5267 311.2366 27.16 0.2924 313 +315 3 298.7281 310.5777 26.3374 0.2924 314 +316 3 297.9708 309.9611 26.717 0.2669 315 +317 3 297.4217 309.0688 26.2268 0.2669 316 +318 3 297.1986 308.2039 25.4047 0.2415 317 +319 3 296.5957 307.3631 25.2 0.2415 318 +320 3 296.4653 306.3815 25.5682 0.2161 319 +321 3 296.0066 305.5144 26.04 0.1907 320 +322 3 295.4929 304.6689 26.7464 0.1652 321 +323 3 294.8077 303.978 26.1408 0.1398 322 +324 3 294.1567 303.4826 26.7235 0.1271 323 +325 3 294.1293 302.6406 28.2878 0.1271 324 +326 3 294.2368 301.5744 28.1999 0.1652 325 +327 3 293.8375 301.1649 26.32 0.2161 326 +328 3 293.015 300.4899 26.6 0.2542 327 +329 3 293.0928 299.3962 27.0323 0.2669 328 +330 3 293.0207 298.3426 26.6 0.2796 329 +331 3 292.8995 297.2798 26.9385 0.3178 330 +332 3 292.7885 296.2102 27.4229 0.3305 331 +333 3 292.5128 295.2058 26.9578 0.3305 332 +334 3 291.9625 294.5697 27.72 0.2796 333 +335 3 291.4512 293.7083 27.44 0.2796 334 +336 3 291.2475 292.6489 27.9812 0.2542 335 +337 3 291.2349 291.7761 26.7338 0.2542 336 +338 3 291.9076 291.72 25.48 0.2161 337 +339 3 292.3069 291.2361 23.9173 0.2288 338 +340 3 291.9785 290.1939 24.0724 0.2542 339 +341 3 291.8252 289.4995 25.5035 0.2796 340 +342 3 292.2897 288.7525 25.48 0.2669 341 +343 3 292.3492 287.7686 26.1618 0.2415 342 +344 3 292.1696 286.8466 26.2441 0.2415 343 +345 3 292.4064 286.2196 26.5037 0.2415 344 +346 3 292.4064 285.5092 25.0272 0.2415 345 +347 3 292.5208 284.4133 24.64 0.2415 346 +348 3 292.8926 283.7463 25.8023 0.2924 347 +349 3 293.0013 283.1434 27.8916 0.3305 348 +350 3 293.1592 282.1047 27.8317 0.3559 349 +351 3 292.8411 281.5464 28.7456 0.3305 350 +352 3 292.6764 281.0568 30.2599 0.3178 351 +353 3 293.0436 280.1496 31.0741 0.2924 352 +354 3 293.5378 279.3351 30.5595 0.2796 353 +355 3 294.0252 278.604 31.1926 0.2796 354 +356 3 294.9266 278.0378 31.309 0.2924 355 +357 3 295.8224 277.4955 30.8216 0.2924 356 +358 3 296.8074 277.0024 30.8904 0.2669 357 +359 3 297.8427 276.7267 30.52 0.2288 358 +360 3 298.4822 276.371 31.08 0.2161 359 +361 3 299.3024 275.7646 31.08 0.2034 360 +362 3 299.8035 274.9547 31.0453 0.2161 361 +363 3 300.0357 275.1148 29.0368 0.1907 362 +364 3 300.5048 274.4765 27.8421 0.1907 363 +365 3 300.7576 274.242 29.6722 0.1652 364 +366 3 300.7931 273.4675 30.5452 0.1652 365 +367 3 300.6432 273.0019 28.6852 0.1398 366 +368 3 301.0676 272.844 26.9069 0.1271 367 +369 3 301.317 271.9666 26.1671 0.1144 368 +370 3 301.5584 271.4117 26.6 0.1271 369 +371 3 301.6442 270.2826 26.6596 0.1525 370 +372 3 301.6728 269.2175 27.4072 0.1907 371 +373 3 301.8341 268.8308 29.7044 0.2034 372 +374 3 302.6612 268.2932 30.42 0.1907 373 +375 3 303.581 267.72 30.5497 0.1525 374 +376 3 304.4985 267.3093 29.8306 0.1271 375 +377 3 305.5716 266.9581 29.6887 0.1144 376 +378 3 306.5634 266.4742 29.4 0.1271 377 +379 3 306.9478 265.7981 30.24 0.1398 378 +380 3 307.6399 264.9195 30.24 0.1652 379 +381 3 308.0792 264.0341 30.2403 0.1907 380 +382 3 308.7587 263.2195 30.7994 0.2288 381 +383 3 309.6328 262.7413 29.9695 0.2669 382 +384 3 310.596 262.3192 30.24 0.2924 383 +385 3 301.7803 329.2398 25.1208 0.2669 295 +386 3 302.6292 328.6048 25.1552 0.3051 385 +387 3 303.0731 327.8567 23.6205 0.3305 386 +388 3 303.3064 326.9083 23.9865 0.3559 387 +389 3 303.692 326.0823 23.6636 0.3178 388 +390 3 304.0706 325.3319 23.5407 0.2796 389 +391 3 304.5065 324.3457 23.8202 0.2161 390 +392 3 304.8554 323.3699 22.9236 0.1907 391 +393 3 304.3212 322.4764 22.5865 0.2161 392 +394 3 304.0683 321.6722 22.3101 0.3051 393 +395 3 304.5328 320.9698 21.7448 0.3813 394 +396 3 304.9149 320.01 22.6696 0.3813 395 +397 3 304.9664 318.9403 22.0805 0.3178 396 +398 3 305.3874 317.9233 21.56 0.2669 397 +399 3 305.7569 316.848 21.7216 0.2924 398 +400 3 305.9079 315.8332 21.6532 0.3559 399 +401 3 305.7615 314.8402 21.56 0.3813 400 +402 3 305.7043 314.0086 20.1015 0.3432 401 +403 3 305.7226 312.9504 19.8926 0.3178 402 +404 3 306.3243 312.1598 19.6 0.3432 403 +405 3 306.6938 311.136 20.102 0.394 404 +406 3 306.4776 310.048 19.6238 0.3813 405 +407 3 306.2728 309.1752 18.7606 0.3432 406 +408 3 305.9536 308.5906 17.3617 0.3051 407 +409 3 306.2271 307.728 18.4929 0.3178 408 +410 3 306.3003 307.1571 19.88 0.3178 409 +411 3 306.2202 306.2385 19.4522 0.3305 410 +412 3 305.8324 305.472 18.692 0.3051 411 +413 3 306.0543 304.6483 17.0626 0.2669 412 +414 3 305.9125 303.7331 16.1081 0.1907 413 +415 3 306.3277 303.2332 17.9668 0.1398 414 +416 3 306.5028 302.3924 17.1954 0.1398 415 +417 3 306.6847 301.6236 15.4 0.1907 416 +418 3 306.4776 300.5402 14.8081 0.2669 417 +419 3 306.4021 299.5415 13.7206 0.3178 418 +420 3 306.6481 298.4707 14.2313 0.3432 419 +421 3 307.1548 297.4983 13.6046 0.3432 420 +422 3 307.5083 296.4276 13.433 0.3305 421 +423 3 308.0392 295.7034 14.5746 0.2924 422 +424 3 308.1261 294.7299 15.6968 0.2415 423 +425 3 308.3172 294.3867 18.051 0.1907 424 +426 3 308.5379 293.8272 18.3327 0.1652 425 +427 3 308.6478 293.0402 19.8005 0.1398 426 +428 3 308.9944 292.1776 19.32 0.1271 427 +429 3 301.7563 339.7005 25.1784 0.2161 284 +430 3 300.7198 339.2406 25.0488 0.2415 429 +431 3 299.8596 338.5531 24.4076 0.2669 430 +432 3 299.2475 337.6127 24.6694 0.2924 431 +433 3 298.584 336.7032 24.2603 0.3051 432 +434 3 298.1012 335.669 24.1738 0.3178 433 +435 3 297.4766 334.7241 24.5151 0.3432 434 +436 3 296.8074 333.8272 25.0947 0.3686 435 +437 3 295.9677 333.055 25.1944 0.3432 436 +438 3 295.1497 332.2554 25.1891 0.2796 437 +439 3 294.58 331.2658 25.1412 0.2161 438 +440 3 293.8501 330.3941 24.841 0.2161 439 +441 3 292.9281 329.79 24.1032 0.2669 440 +442 3 291.9122 329.2649 24.0794 0.2924 441 +443 3 291.0954 328.4641 24.0778 0.2924 442 +444 3 290.3941 327.6359 24.0705 0.3305 443 +445 3 289.9731 326.5754 24.0218 0.3432 444 +446 3 289.5922 325.508 23.6622 0.3051 445 +447 3 289.106 324.4739 23.7756 0.2542 446 +448 3 288.5031 323.5049 23.9355 0.2415 447 +449 3 287.9848 322.5348 23.1792 0.2669 448 +450 3 287.4334 321.5361 22.9522 0.2796 449 +451 3 286.8923 320.5294 22.9141 0.2924 450 +452 3 286.2116 319.6176 22.7242 0.2796 451 +453 3 285.3342 318.9369 22.0601 0.2924 452 +454 3 284.5483 318.1338 21.6026 0.2796 453 +455 3 284.0644 317.1328 20.9616 0.3178 454 +456 3 283.6754 316.0609 20.7477 0.3432 455 +457 3 283.2533 315.0096 20.9504 0.3686 456 +458 3 282.751 314.131 21.5046 0.3178 457 +459 3 282.099 313.6791 20.1116 0.2669 458 +460 3 281.1414 313.1506 19.8066 0.2415 459 +461 3 280.5111 312.9858 18.4475 0.2796 460 +462 3 279.9883 312.4344 20.0788 0.3051 461 +463 3 279.1726 311.8727 19.88 0.3178 462 +464 3 278.2094 311.3465 19.4373 0.3051 463 +465 3 277.2335 310.874 19.6932 0.3051 464 +466 3 276.2577 310.342 19.3332 0.2924 465 +467 3 275.4512 309.7449 19.7425 0.2924 466 +468 3 274.9089 308.9761 18.7628 0.3051 467 +469 3 274.7613 307.982 18.7228 0.3305 468 +470 3 273.9949 307.4958 18.8647 0.3432 469 +471 3 273.5144 306.7899 19.5331 0.3305 470 +472 3 272.7399 306.1367 19.32 0.3178 471 +473 3 272.4093 305.3805 18.76 0.2924 472 +474 3 271.5158 304.8314 18.6668 0.2669 473 +475 3 270.834 304.3749 18.5816 0.2415 474 +476 3 270.7082 303.5444 17.3958 0.2161 475 +477 3 270.7139 302.4542 17.08 0.2161 476 +478 3 270.556 301.6739 18.9095 0.2161 477 +479 3 270.2174 300.8331 19.88 0.2415 478 +480 3 270.9656 300.2531 19.3606 0.2669 479 +481 3 271.0102 299.3917 18.7132 0.3305 480 +482 3 270.8317 298.4341 18.4951 0.3686 481 +483 3 270.7402 297.4068 18.2034 0.3686 482 +484 3 269.9657 296.7433 17.8536 0.3051 483 +485 3 269.5744 295.7663 17.6047 0.2542 484 +486 3 269.5275 294.842 17.9556 0.2415 485 +487 3 268.7084 294.572 17.1433 0.2542 486 +488 3 268.1616 294.0114 16.5211 0.2669 487 +489 3 267.2498 293.5698 16.3058 0.2924 488 +490 3 266.2866 293.3811 16.2333 0.2924 489 +491 3 265.7706 292.5139 16.1266 0.2924 490 +492 3 265.2719 291.593 16.7759 0.2415 491 +493 3 264.6072 290.8048 17.08 0.2288 492 +494 3 290.4033 328.0706 22.5728 0.178 443 +495 3 289.7752 328.0123 24.1357 0.1525 494 +496 3 288.8131 327.8704 24.6543 0.1398 495 +497 3 288.288 327.5123 23.602 0.1398 496 +498 3 287.4792 327.184 22.8407 0.1525 497 +499 3 286.7264 327.0936 21.0204 0.1525 498 +500 3 285.9428 326.6063 21.8238 0.1652 499 +501 3 285.2942 326.4747 21.2932 0.1907 500 +502 3 284.4819 326.0572 20.72 0.2034 501 +503 3 283.5198 325.6579 21.28 0.2034 502 +504 3 282.6824 324.9429 21.252 0.178 503 +505 3 281.7638 324.4842 20.3174 0.1652 504 +506 3 280.8772 323.8023 20.0189 0.1525 505 +507 3 279.9036 323.2441 20.0203 0.1525 506 +508 3 278.9404 322.8368 19.6031 0.1525 507 +509 3 278.0698 322.3792 18.7673 0.1398 508 +510 3 276.9521 322.274 18.48 0.1271 509 +511 3 275.8298 322.1504 18.48 0.1271 510 +512 3 274.9032 321.8518 18.48 0.1398 511 +513 3 274.3392 321.0201 18.0141 0.178 512 +514 3 273.3428 320.5099 17.64 0.2161 513 +515 3 272.3212 320.034 17.6308 0.2669 514 +516 3 271.4277 319.4197 17.4751 0.2796 515 +517 3 270.5537 318.7756 17.1772 0.2796 516 +518 3 269.5573 318.3683 18.0026 0.2669 517 +519 3 268.6352 318.1144 18.5111 0.2542 518 +520 3 267.7864 318.3741 18.2311 0.2288 519 +521 3 267.0725 317.8032 18.2185 0.1907 520 +522 3 266.1413 317.6648 19.2688 0.1652 521 +523 3 265.0511 317.5744 19.567 0.1398 522 +524 3 263.9288 317.4611 19.32 0.1398 523 +525 3 263.2344 317.1225 19.1408 0.1652 524 +526 3 262.7848 316.2165 19.908 0.2034 525 +527 3 262.4336 315.8492 18.5679 0.2161 526 +528 3 261.6511 315.6353 17.5641 0.2161 527 +529 3 260.864 315.6296 17.08 0.2288 528 +530 3 259.7715 315.6353 17.3732 0.2669 529 +531 3 258.8346 315.1823 17.8254 0.2796 530 +532 3 257.8015 314.9203 17.668 0.2796 531 +533 3 256.8326 314.497 17.9544 0.3051 532 +534 3 255.8911 314.473 16.6197 0.3178 533 +535 3 254.9804 314.012 17.0663 0.3305 534 +536 3 254.1922 313.5704 18.4369 0.2924 535 +537 3 253.5104 312.8966 19.0089 0.3051 536 +538 3 253.0528 312.7696 18.2 0.1652 537 +539 3 252.6181 312.5408 16.998 0.2796 537 +540 3 251.7566 312.4138 16.9548 0.2796 539 +541 3 251.3322 312.7101 18.2 0.2415 540 +542 3 250.3964 312.3463 17.1422 0.2034 541 +543 3 249.781 311.6336 16.4004 0.2034 542 +544 3 249.6322 310.9289 16.7597 0.2288 543 +545 3 249.0751 310.7104 16.2016 0.2415 544 +546 3 248.3006 310.4736 15.9664 0.2542 545 +547 3 247.6691 309.9096 16.7026 0.2415 546 +548 3 247.0125 309.5893 18.4528 0.2542 547 +549 3 246.1636 309.3914 19.6 0.2415 548 +550 3 246.278 308.8994 17.7568 0.2288 549 +551 3 246.6464 308.5116 16.4433 0.2034 550 +552 3 246.0469 308.0426 15.7161 0.178 551 +553 3 245.8456 307.7749 17.827 0.1652 552 +554 3 246.0744 307.0496 17.92 0.1525 553 +555 3 307.5175 353.1997 23.016 0.2924 271 +556 3 307.1079 353.4194 20.7553 0.2796 555 +557 3 306.1733 353.7763 19.4611 0.2415 556 +558 3 305.3004 353.9181 17.8702 0.1907 557 +559 3 304.256 353.7042 16.879 0.1652 558 +560 3 303.168 353.6642 16.0686 0.1525 559 +561 3 302.286 354.0817 15.9202 0.1525 560 +562 3 302.1373 355.0839 16.8627 0.1652 561 +563 3 302.5102 356.1112 16.9459 0.1907 562 +564 3 302.6143 357.1053 15.9138 0.2161 563 +565 3 301.968 357.8981 15.2757 0.2161 564 +566 3 300.9315 358.2653 15.6022 0.2034 565 +567 3 300.4544 358.9998 16.791 0.178 566 +568 3 301.0928 359.5867 15.6106 0.178 567 +569 3 302.016 359.5592 14.0 0.1907 568 +570 3 306.1218 356.5768 26.1514 0.3178 268 +571 3 305.2238 356.245 24.876 0.3178 570 +572 3 304.2125 356.0048 24.7976 0.2669 571 +573 3 303.295 355.6799 24.3214 0.2415 572 +574 3 302.3295 355.6582 24.92 0.1907 573 +575 3 301.2072 355.5998 25.121 0.178 574 +576 3 300.2485 355.3058 24.0128 0.2034 575 +577 3 299.3287 355.2886 22.96 0.2542 576 +578 3 298.3483 354.9958 23.0737 0.2796 577 +579 3 297.4926 354.8654 22.8934 0.2796 578 +580 3 296.5488 354.5256 22.6873 0.2796 579 +581 3 295.5993 354.1069 21.8565 0.3051 580 +582 3 294.7299 353.377 21.56 0.3305 581 +583 3 293.9634 352.598 22.0142 0.3305 582 +584 3 293.0184 352.1415 21.5642 0.3305 583 +585 3 292.2256 351.6416 21.7003 0.3305 584 +586 3 291.3596 351.0272 21.3592 0.3305 585 +587 3 290.4227 350.525 21.0731 0.3178 586 +588 3 289.4 350.1475 20.8603 0.3178 587 +589 3 289.0064 349.333 20.16 0.3305 588 +590 3 288.2239 348.5757 20.6489 0.3305 589 +591 3 287.549 347.7691 20.7827 0.2796 590 +592 3 286.6429 347.2852 19.8761 0.2415 591 +593 3 285.9348 346.6148 19.8573 0.2161 592 +594 3 285.0036 346.2064 20.1401 0.2288 593 +595 3 284.3469 345.8655 19.6622 0.2034 594 +596 3 283.7074 345.4114 19.4219 0.178 595 +597 3 283.14 344.9137 19.4622 0.1525 596 +598 3 282.6481 344.1816 20.6951 0.1652 597 +599 3 281.837 343.6679 19.6288 0.1907 598 +600 3 280.9881 343.2629 19.88 0.2161 599 +601 3 280.0512 342.914 19.88 0.2415 600 +602 3 279.3019 342.382 19.4384 0.2542 601 +603 3 278.3855 341.8924 19.8755 0.2796 602 +604 3 277.4875 341.341 19.3486 0.2796 603 +605 3 276.6135 340.8399 19.32 0.2796 604 +606 3 275.7555 340.0986 19.3869 0.2669 605 +607 3 275.1126 339.3035 19.1041 0.2542 606 +608 3 274.4033 338.4764 19.0551 0.2161 607 +609 3 273.8862 337.4617 19.164 0.1652 608 +610 3 273.1323 336.6517 19.32 0.1525 609 +611 3 272.4882 335.7766 19.32 0.1907 610 +612 3 272.264 335.2423 19.32 0.2034 611 +613 3 271.5856 334.5056 19.32 0.2415 612 +614 3 272.59 335.1714 19.5513 0.2034 611 +615 3 272.3841 334.0732 19.9839 0.2415 614 +616 3 271.9368 333.198 19.6078 0.2669 615 +617 3 271.239 332.4819 19.9755 0.2669 616 +618 3 270.3421 331.8138 20.3748 0.2161 617 +619 3 269.7083 330.8986 19.8016 0.178 618 +620 3 269.3182 329.9376 19.3113 0.1398 619 +621 3 268.8743 328.9149 19.32 0.1271 620 +622 3 268.117 328.0843 19.1159 0.1271 621 +623 3 267.2075 327.5478 19.3166 0.1398 622 +624 3 266.1836 327.0971 19.04 0.1525 623 +625 3 265.0934 326.8786 19.3945 0.1398 624 +626 3 264.2228 326.5068 20.72 0.1271 625 +627 3 263.3477 326.3889 19.3189 0.1144 626 +628 3 262.3993 325.9336 18.48 0.1144 627 +629 3 261.2667 325.8112 18.48 0.1271 628 +630 3 260.1273 325.7837 18.48 0.1398 629 +631 3 259.3677 325.1683 18.3674 0.1525 630 +632 3 258.7145 324.419 17.7086 0.1398 631 +633 3 257.8553 323.7051 17.92 0.1271 632 +634 3 257.0213 322.9947 17.92 0.1144 633 +635 3 256.3155 322.171 17.92 0.1144 634 +636 3 255.7137 321.2741 17.897 0.1398 635 +637 3 255.3111 320.8989 16.849 0.1907 636 +638 3 254.6452 320.0088 16.8566 0.2669 637 +639 3 253.7346 319.3339 16.8582 0.3178 638 +640 3 253.07 318.5823 16.9044 0.3432 639 +641 3 252.379 317.7082 16.8224 0.3432 640 +642 3 251.4546 317.428 16.4956 0.3559 641 +643 3 250.4948 317.0173 16.6286 0.394 642 +644 3 249.7386 316.2005 16.52 0.4195 643 +645 3 249.0133 315.3493 16.2977 0.4195 644 +646 3 248.129 314.6561 16.6116 0.3686 645 +647 3 247.4655 314.1058 16.4615 0.3432 646 +648 3 246.6178 313.5178 16.3047 0.3178 647 +649 3 245.5848 313.1094 16.87 0.3178 648 +650 3 244.7119 312.4584 17.4672 0.3051 649 +651 3 243.7784 311.8372 17.4846 0.3305 650 +652 3 242.9662 311.1165 17.1632 0.3432 651 +653 3 242.4765 310.4702 16.6365 0.3432 652 +654 3 241.6872 309.9073 16.3302 0.2924 653 +655 3 241.4115 309.452 18.1269 0.2415 654 +656 3 241.4206 309.4703 16.52 0.1907 655 +657 3 241.0774 308.4647 16.5217 0.1652 656 +658 3 241.4069 307.633 14.966 0.178 657 +659 3 241.1506 306.7842 14.9271 0.2161 658 +660 3 240.5752 306.6137 16.8932 0.2415 659 +661 3 240.1954 305.6962 16.6281 0.2288 660 +662 3 240.2617 305.0339 18.0849 0.1907 661 +663 3 240.637 304.4173 17.92 0.1907 662 +664 3 240.6301 303.9196 17.0405 0.2034 663 +665 3 240.3738 303.0834 15.96 0.2669 664 +666 3 239.9803 302.4015 15.3524 0.3051 665 +667 3 239.3591 301.579 15.1256 0.3305 666 +668 3 238.7471 300.9978 16.1073 0.3051 667 +669 3 238.0195 300.4075 15.8668 0.2669 668 +670 3 237.9165 300.014 14.0358 0.2542 669 +671 3 237.2736 299.3196 14.2419 0.2288 670 +672 3 236.6936 299.156 12.88 0.2034 671 +673 3 312.0306 368.2181 26.1411 0.1652 1 +674 3 311.78 367.1565 25.3375 0.2161 673 +675 3 311.2504 366.223 24.3908 0.2542 674 +676 3 310.9037 365.2781 23.0723 0.2415 675 +677 3 311.2183 364.1935 22.96 0.2161 676 +678 3 311.8498 363.6547 22.9597 0.394 677 +679 3 312.7696 362.9752 22.958 0.4195 678 +680 3 313.6047 362.1938 22.9513 0.4068 679 +681 3 314.4742 361.4502 22.9222 0.394 680 +682 3 315.4214 360.813 22.7665 0.3686 681 +683 3 316.2851 360.1198 22.0604 0.3432 682 +684 3 317.1465 359.3739 21.84 0.3051 683 +685 3 318.0148 358.6314 21.84 0.2669 684 +686 3 318.8362 357.8363 21.84 0.2542 685 +687 3 319.6416 357.023 21.84 0.2415 686 +688 3 320.4333 356.197 21.84 0.2542 687 +689 3 321.1666 355.3218 21.84 0.2669 688 +690 3 321.8404 354.3986 21.8394 0.3178 689 +691 3 322.5485 353.5017 21.8375 0.3559 690 +692 3 323.2601 352.6105 21.8285 0.3559 691 +693 3 324.1169 351.8612 21.7795 0.3305 692 +694 3 325.047 351.2286 21.429 0.2924 693 +695 3 325.8169 350.469 20.6265 0.2924 694 +696 3 326.5079 349.6098 19.9601 0.2796 695 +697 3 327.3293 348.8342 19.6504 0.2796 696 +698 3 328.1415 348.046 19.936 0.2669 697 +699 3 328.8657 347.1971 20.151 0.2924 698 +700 3 329.5349 346.2865 19.7893 0.3432 699 +701 3 330.3106 345.4571 19.5244 0.3686 700 +702 3 331.1239 344.6792 19.0999 0.3559 701 +703 3 331.9099 343.8727 18.6348 0.3051 702 +704 3 332.5951 342.9655 18.5945 0.2924 703 +705 3 333.2735 342.0823 19.14 0.2924 704 +706 3 334.0423 341.2644 19.6092 0.3051 705 +707 3 334.8465 340.4761 20.097 0.3051 706 +708 3 335.6896 339.7302 20.5808 0.2924 707 +709 3 336.6186 339.0736 20.7189 0.2796 708 +710 3 337.5704 338.4398 20.7152 0.2669 709 +711 3 338.4787 337.7466 20.6982 0.2669 710 +712 3 339.3905 337.0556 20.6136 0.2542 711 +713 3 340.4155 336.797 19.9066 0.2288 712 +714 3 340.888 336.7021 20.7054 0.2034 713 +715 3 341.7357 336.2182 20.4498 0.178 714 +716 3 342.6898 335.8143 19.9534 0.1907 715 +717 3 343.5409 335.6496 18.6522 0.2288 716 +718 3 344.1221 334.8843 18.1961 0.2924 717 +719 3 344.5465 334.0194 18.6458 0.3178 718 +720 3 345.0476 333.0459 19.0036 0.2796 719 +721 3 345.3461 332.1272 19.264 0.2161 720 +722 3 345.8907 331.3127 19.6795 0.1652 721 +723 3 346.5256 330.8276 19.49 0.1525 722 +724 3 346.7864 330.0337 19.9335 0.178 723 +725 3 347.0107 329.2009 20.7088 0.1907 724 +726 3 347.3138 328.5774 19.2556 0.2288 725 +727 3 346.5519 328.328 17.5574 0.2415 726 +728 3 346.5359 327.9951 15.68 0.2796 727 +729 3 346.6 327.2984 15.0192 0.2924 728 +730 3 346.2888 326.4496 14.6462 0.2796 729 +731 3 346.2888 326.1544 17.2052 0.2542 730 +732 3 346.7773 325.3822 17.92 0.2288 731 +733 3 347.204 324.721 18.5643 0.2288 732 +734 3 347.2635 323.7509 18.1902 0.2415 733 +735 3 347.3962 322.8585 17.0125 0.2415 734 +736 3 347.744 321.9651 18.2 0.2669 735 +737 3 347.911 320.9641 17.3768 0.2796 736 +738 3 348.5459 320.1141 17.8315 0.3305 737 +739 3 348.8056 319.3693 18.0029 0.3686 738 +740 3 349.2781 318.3969 17.5647 0.394 739 +741 3 349.8352 317.7185 17.08 0.394 740 +742 3 350.1326 316.8537 16.2173 0.3686 741 +743 3 350.31 315.8206 16.0096 0.3559 742 +744 3 350.5582 314.7338 16.387 0.3305 743 +745 3 350.8797 313.782 17.4628 0.3051 744 +746 3 351.526 313.0636 18.3985 0.2796 745 +747 3 352.0946 312.2262 17.7682 0.2415 746 +748 3 353.0052 311.5707 17.92 0.2288 747 +749 3 353.774 310.9575 16.8146 0.2034 748 +750 3 354.5439 310.4724 15.6842 0.2288 749 +751 3 355.1411 310.008 15.7872 0.2288 750 +752 3 355.8458 309.3994 15.0598 0.2542 751 +753 3 356.2656 308.6054 14.56 0.2669 752 +754 3 356.9337 307.8401 15.12 0.2924 753 +755 3 357.595 307.053 14.9226 0.3178 754 +756 3 358.3042 306.4273 16.2442 0.3178 755 +757 3 358.9231 305.8244 15.3765 0.3051 756 +758 3 359.1668 304.828 15.6624 0.2796 757 +759 3 359.4459 303.8464 15.2127 0.2415 758 +760 3 359.6622 302.8454 14.082 0.2288 759 +761 3 360.0889 302.1704 15.0889 0.2161 760 +762 3 360.5488 301.5893 14.4393 0.2542 761 +763 3 361.4491 301.2072 14.4878 0.2796 762 +764 3 362.1458 300.7187 15.4 0.2924 763 +765 3 362.759 300.2199 17.0999 0.2796 764 +766 3 363.1182 299.2921 16.681 0.2542 765 +767 3 363.5632 298.433 15.4311 0.2415 766 +768 3 363.6467 297.7626 17.2939 0.2034 767 +769 3 363.8389 297.0968 16.7356 0.1907 768 +770 3 364.3114 296.717 16.2686 0.1907 769 +771 3 364.1558 295.9128 17.3474 0.2161 770 +772 3 364.2496 294.9186 16.1381 0.2288 771 +773 3 364.2302 294.5823 13.8012 0.2161 772 +774 3 363.8721 293.8639 14.3632 0.2034 773 +775 3 364.4784 293.0928 15.4 0.178 774 +776 3 311.2515 363.5666 23.2739 0.3051 677 +777 3 311.6279 362.8608 25.2036 0.2415 776 +778 3 311.7995 362.4352 27.6895 0.2034 777 +779 3 312.0535 362.0497 29.6856 0.2034 778 +780 3 311.5078 361.1825 30.4539 0.2542 779 +781 3 310.7596 360.3772 30.875 0.3051 780 +782 3 310.1064 359.4757 31.3404 0.3305 781 +783 3 310.2482 358.7836 32.2291 0.3432 782 +784 3 311.0708 358.1349 33.3287 0.3305 783 +785 3 311.3007 357.1156 34.0796 0.2924 784 +786 3 310.8854 356.0746 34.2222 0.2669 785 +787 3 310.453 355.0518 34.853 0.2542 786 +788 3 310.9861 354.1298 35.4858 0.2796 787 +789 3 311.9345 353.5864 36.2782 0.3051 788 +790 3 312.4516 352.5831 36.6072 0.3559 789 +791 3 311.7903 351.3453 38.0428 0.2924 790 +792 3 311.2183 350.4884 39.1381 0.3178 791 +793 3 310.8305 349.4863 40.0814 0.394 792 +794 3 310.3603 348.5288 41.0603 0.4322 793 +795 3 309.7723 347.6341 41.9689 0.4195 794 +796 3 309.0219 346.8276 42.6549 0.3305 795 +797 3 308.2005 346.0703 43.1046 0.2669 796 +798 3 307.3882 345.2649 43.169 0.2288 797 +799 3 306.5634 344.479 43.379 0.2288 798 +800 3 305.6402 344.0008 44.0409 0.2415 799 +801 3 304.9469 343.2915 44.3948 0.2542 800 +802 3 304.5317 342.4106 44.1983 0.2669 801 +803 3 304.2834 341.5046 44.1126 0.2542 802 +804 3 303.6393 340.5951 43.68 0.2415 803 +805 3 302.8088 339.8389 43.68 0.2415 804 +806 3 301.9863 339.2589 43.0254 0.2415 805 +807 3 301.2461 338.4261 43.001 0.2161 806 +808 3 300.5551 337.6642 43.4 0.1907 807 +809 3 299.7463 336.9 43.3958 0.1907 808 +810 3 298.8277 336.2433 43.1981 0.2288 809 +811 3 297.9788 335.5398 43.68 0.2415 810 +812 3 297.3634 334.6154 43.96 0.2415 811 +813 3 296.3921 334.2642 44.4906 0.2415 812 +814 3 295.581 333.5732 44.3167 0.2796 813 +815 3 295.0216 333.0184 43.12 0.3305 814 +816 3 294.2654 332.3503 43.4904 0.3559 815 +817 3 293.6602 331.5873 43.5422 0.3432 816 +818 3 292.999 330.9363 43.68 0.3051 817 +819 3 292.2623 330.0955 43.96 0.2669 818 +820 3 291.6205 329.1997 43.4826 0.2161 819 +821 3 290.8254 328.4127 43.12 0.178 820 +822 3 290.1253 327.5238 43.12 0.178 821 +823 3 289.5441 326.7115 42.9195 0.2034 822 +824 3 288.9744 326.1292 43.0903 0.2415 823 +825 3 288.439 325.206 43.1589 0.2415 824 +826 3 288.4367 324.1616 42.8431 0.2669 825 +827 3 288.1393 323.1789 42.7966 0.2542 826 +828 3 287.5558 322.2545 42.56 0.2542 827 +829 3 286.977 321.2947 42.2531 0.2161 828 +830 3 286.4233 320.4584 41.5663 0.2161 829 +831 3 285.3388 320.1701 41.44 0.2034 830 +832 3 284.6798 319.3682 41.1695 0.1907 831 +833 3 283.9557 318.5926 40.8853 0.178 832 +834 3 283.2899 317.9885 39.7424 0.2034 833 +835 3 282.2248 317.6122 39.3862 0.2669 834 +836 3 281.7706 316.8617 39.8717 0.3051 835 +837 3 281.535 315.8595 39.4708 0.3305 836 +838 3 280.9172 315.7486 38.099 0.3305 837 +839 3 280.3063 314.9981 38.456 0.3305 838 +840 3 279.4643 314.5279 38.0993 0.2796 839 +841 3 278.8523 313.718 39.058 0.2161 840 +842 3 278.2505 312.8977 38.6389 0.178 841 +843 3 277.5664 312.2594 37.4657 0.2034 842 +844 3 276.9944 311.406 37.1272 0.2288 843 +845 3 276.3858 310.8957 38.5666 0.2669 844 +846 3 275.6823 310.7035 37.5376 0.2542 845 +847 3 274.6092 310.5068 36.96 0.2669 846 +848 3 273.551 310.2597 36.5106 0.2161 847 +849 3 272.9492 309.5824 35.8218 0.1907 848 +850 3 271.9677 309.1614 35.84 0.1525 849 +851 3 271.1429 308.5242 36.4 0.1652 850 +852 3 270.3375 307.8207 36.7111 0.1907 851 +853 3 269.4612 307.1308 36.7223 0.2288 852 +854 3 268.7794 306.2568 36.7875 0.2669 853 +855 3 268.0552 305.4217 36.5316 0.3178 854 +856 3 267.601 304.5808 36.0287 0.3432 855 +857 3 267.2407 303.8464 35.3214 0.3686 856 +858 3 266.9581 303.176 35.2694 0.3432 857 +859 3 266.7511 302.4221 35.5496 0.3432 858 +860 3 266.1344 301.6877 35.5541 0.3305 859 +861 3 265.6746 300.872 34.5332 0.3305 860 +862 3 265.6368 300.5288 35.56 0.2415 861 +863 3 265.4034 300.2096 34.7141 0.2669 861 +864 3 265.0145 299.3356 35.2612 0.2542 863 +865 3 264.542 298.33 35.0022 0.2796 864 +866 3 264.2114 297.678 33.3169 0.3051 865 +867 3 263.9711 296.9435 32.0051 0.3305 866 +868 3 263.6405 296.1393 33.0145 0.3305 867 +869 3 263.6771 295.0982 33.6196 0.3051 868 +870 3 264.0249 294.2746 34.2286 0.2415 869 +871 3 264.0352 293.293 33.3214 0.2034 870 +872 3 264.2732 292.3069 33.532 0.2034 871 +873 3 264.2365 291.4512 32.0158 0.2669 872 +874 3 264.0924 290.4273 32.3109 0.3178 873 +875 3 263.4632 289.7134 32.2 0.3178 874 +876 3 263.3442 288.6564 32.48 0.2924 875 +877 3 263.3156 287.8956 31.4336 0.2796 876 +878 3 262.8683 287.1257 29.8343 0.3051 877 +879 3 262.397 286.2528 30.2599 0.3305 878 +880 3 261.706 286.0812 31.92 0.3305 879 +881 3 261.2633 285.2244 31.2833 0.2924 880 +882 3 260.5609 284.5483 30.24 0.2542 881 +883 3 260.0621 283.9797 31.3284 0.2288 882 +884 3 259.4054 283.2716 31.3894 0.2542 883 +885 3 258.5371 282.6424 30.7597 0.2924 884 +886 3 257.9194 281.8839 30.2347 0.3305 885 +887 3 257.4 281.2135 29.4294 0.3305 886 +888 3 256.9859 280.4276 29.5809 0.2796 887 +889 3 256.2331 279.9368 28.4547 0.2288 888 +890 3 255.4804 279.454 29.4 0.2034 889 +891 3 255.2092 279.1349 29.9348 0.2924 890 +892 3 254.6544 279.5936 30.8 0.2669 891 +893 3 255.0617 278.945 29.9289 0.2924 890 +894 3 254.0424 278.5732 29.0458 0.2161 893 +895 3 253.2107 278.326 29.1578 0.1907 894 +896 3 252.4259 277.6522 28.5659 0.1652 895 +897 3 252.3653 276.8594 27.72 0.1525 896 +898 3 251.6789 276.1193 27.587 0.1525 897 +899 3 251.108 275.2384 27.6749 0.1652 898 +900 3 250.9833 274.1356 27.1768 0.1652 899 +901 3 250.1585 273.5304 26.8562 0.1652 900 +902 3 249.3851 273.1597 26.1033 0.1398 901 +903 3 248.7331 273.4126 27.44 0.1271 902 +904 3 247.6051 273.4046 27.1631 0.1398 903 +905 3 246.8775 272.9984 28.56 0.1652 904 +906 3 245.8216 272.8223 27.83 0.1907 905 +907 3 244.7782 272.844 26.88 0.1907 906 +908 3 243.6354 272.8749 26.9052 0.2034 907 +909 3 242.6046 273.1426 27.0446 0.2288 908 +910 3 241.5819 273.1506 27.4898 0.2288 909 +911 3 240.8669 272.5717 27.5058 0.2034 910 +912 3 240.4562 272.1565 26.2601 0.1525 911 +913 3 239.4438 272.0432 25.76 0.1398 912 +914 3 238.7974 271.9288 27.3535 0.1398 913 +915 3 238.1225 271.2676 27.6744 0.1525 914 +916 3 237.3537 271.3568 26.3194 0.1525 915 +917 3 236.8069 270.969 25.1166 0.1525 916 +918 3 236.7028 270.6704 27.0304 0.1525 917 +919 3 236.3504 269.9291 28.4668 0.1398 918 +920 3 236.3195 268.824 28.8728 0.1525 919 +921 3 235.6834 268.0495 28.2523 0.178 920 +922 3 235.5839 267.2064 27.1216 0.2415 921 +923 3 236.1216 266.4376 27.16 0.2796 922 +924 3 254.4988 278.0858 29.4 0.2161 893 +925 3 254.2037 277.0505 29.0338 0.2288 924 +926 3 253.9428 276.0632 29.1939 0.2161 925 +927 3 253.5825 275.0805 29.6388 0.178 926 +928 3 253.5104 274.0955 28.84 0.1398 927 +929 3 253.5104 272.9515 28.84 0.1271 928 +930 3 253.1409 271.8865 28.8534 0.1398 929 +931 3 252.5437 270.9347 28.5692 0.1652 930 +932 3 252.252 269.9291 28.28 0.178 931 +933 3 252.5758 268.951 28.273 0.1907 932 +934 3 252.5986 267.9626 28.7207 0.178 933 +935 3 252.7096 266.9856 28.3861 0.1652 934 +936 3 252.1856 266.155 28.28 0.1525 935 +937 3 251.4398 265.3817 28.28 0.1525 936 +938 3 250.3678 265.0648 28.2072 0.1525 937 +939 3 249.2593 265.2684 28.0101 0.1652 938 +940 3 248.3418 265.2833 27.2443 0.2034 939 +941 3 247.6989 264.4962 27.4792 0.2288 940 +942 3 247.0205 263.8693 26.9744 0.2288 941 +943 3 246.27 263.0342 27.2429 0.178 942 +944 3 245.3274 262.5503 28.0 0.1652 943 +945 3 244.5918 261.9863 27.1821 0.178 944 +946 3 243.7155 261.7278 27.0357 0.2288 945 +947 3 243.2991 260.9475 26.0495 0.2415 946 +948 3 243.2144 260.1753 26.4396 0.2415 947 +949 3 242.9295 259.3185 26.5426 0.2161 948 +950 3 242.4422 258.5062 25.9938 0.2034 949 +951 3 242.1825 257.4721 25.48 0.178 950 +952 3 241.9423 256.3807 25.9484 0.178 951 +953 3 241.5682 255.3648 26.2539 0.178 952 +954 3 240.8726 254.4817 26.6224 0.2034 953 +955 3 240.121 253.6992 26.7128 0.2161 954 +956 3 239.6222 252.8 26.7966 0.2288 955 +957 3 239.5033 251.7406 26.4695 0.2161 956 +958 3 239.5628 250.6069 26.6647 0.1907 957 +959 3 239.5467 249.4641 26.6 0.1525 958 +960 3 239.1029 248.4688 27.0866 0.1271 959 +961 3 238.389 247.6291 27.44 0.1144 960 +962 3 237.7507 246.7574 27.44 0.1271 961 +963 3 237.5722 245.6362 27.44 0.1525 962 +964 3 236.9636 244.8126 27.7875 0.1907 963 +965 3 236.7348 243.8916 28.338 0.2161 964 +966 3 236.236 243.1057 28.716 0.2288 965 +967 3 235.6915 242.3873 29.461 0.2161 966 +968 3 234.8049 241.956 28.6479 0.2034 967 +969 3 233.7661 241.7615 28.56 0.1907 968 +970 3 232.939 241.1232 28.8002 0.2034 969 +971 3 231.9746 240.5683 28.3027 0.2034 970 +972 3 231.0537 239.8968 28.222 0.1907 971 +973 3 230.0881 239.3728 28.2402 0.1525 972 +974 3 229.4864 238.5972 28.56 0.1398 973 +975 3 229.0631 237.5745 28.56 0.1525 974 +976 3 228.3561 236.6822 28.56 0.178 975 +977 3 227.8745 236.0129 27.5131 0.178 976 +978 3 227.4272 235.124 28.28 0.1525 977 +979 3 227.2201 234.0567 28.28 0.1271 978 +980 3 226.9696 233.0774 28.28 0.1271 979 +981 3 226.7946 232.0192 28.28 0.1525 980 +982 3 225.956 231.66 27.1432 0.178 981 +983 3 226.0567 230.8901 27.3364 0.178 982 +984 3 225.8256 229.8468 27.72 0.1525 983 +985 3 225.8256 228.7028 27.72 0.1271 984 +986 3 225.8256 227.5588 27.72 0.1271 985 +987 3 225.7112 226.4331 27.9947 0.1398 986 +988 3 225.4984 225.5476 28.4824 0.1525 987 +989 3 225.6986 224.5661 28.285 0.1652 988 +990 3 225.7112 223.4232 28.28 0.1907 989 +991 3 312.7742 352.0122 37.4774 0.394 790 +992 3 313.4629 352.018 39.2 0.3559 991 +993 3 314.5531 352.1232 39.0611 0.3051 992 +994 3 315.6937 352.1232 39.2 0.2415 993 +995 3 316.6272 352.2319 40.0697 0.2161 994 +996 3 317.2449 351.6645 39.4985 0.2161 995 +997 3 317.8615 351.5501 38.3634 0.2034 996 +998 3 318.8236 351.3087 39.2 0.1652 997 +999 3 319.9539 351.1966 39.256 0.1271 998 +1000 3 320.9915 350.827 39.5508 0.1271 999 +1001 3 322.0085 350.4781 40.32 0.1525 1000 +1002 3 323.1388 350.2997 40.32 0.178 1001 +1003 3 324.0357 349.9496 39.5024 0.178 1002 +1004 3 325.0436 349.9496 40.32 0.1525 1003 +1005 3 326.0537 349.7242 39.48 0.1525 1004 +1006 3 326.9049 349.1271 39.1737 0.1907 1005 +1007 3 327.8933 348.6546 38.4574 0.2669 1006 +1008 3 328.9126 348.3091 38.2824 0.2924 1007 +1009 3 329.9422 348.1512 39.0362 0.2924 1008 +1010 3 330.8162 347.6513 38.8066 0.2542 1009 +1011 3 331.6685 347.0953 38.7383 0.2415 1010 +1012 3 332.443 346.5176 39.0572 0.2161 1011 +1013 3 333.5298 346.2716 38.9567 0.2161 1012 +1014 3 334.6006 345.9422 39.2 0.2415 1013 +1015 3 335.7148 345.75 39.2 0.2796 1014 +1016 3 336.6552 345.2066 38.92 0.2796 1015 +1017 3 337.6367 344.7204 38.906 0.2415 1016 +1018 3 338.5222 344.1083 38.64 0.2034 1017 +1019 3 339.3493 343.7068 39.4472 0.1907 1018 +1020 3 340.1306 343.1268 38.703 0.178 1019 +1021 3 341.1374 342.8007 38.8433 0.1525 1020 +1022 3 341.6968 342.0343 38.2917 0.1271 1021 +1023 3 342.7699 341.8272 38.4994 0.1271 1022 +1024 3 343.8807 341.8272 38.92 0.1398 1023 +1025 3 344.9995 341.6831 38.64 0.1525 1024 +1026 3 345.9765 341.2277 39.3921 0.1398 1025 +1027 3 346.9214 340.809 39.48 0.1271 1026 +1028 3 347.9201 340.3514 39.2 0.1271 1027 +1029 3 348.7152 339.768 39.17 0.1398 1028 +1030 3 349.8158 339.5861 39.2465 0.1525 1029 +1031 3 350.4941 338.9157 40.054 0.1398 1030 +1032 3 351.184 338.0497 40.1649 0.1398 1031 +1033 3 351.9779 337.2375 40.04 0.1398 1032 +1034 3 352.7627 336.4161 39.7754 0.1525 1033 +1035 3 353.4537 335.7834 40.304 0.1398 1034 +1036 3 354.0062 334.8179 40.2942 0.1398 1035 +1037 3 354.6022 333.9977 39.5335 0.1398 1036 +1038 3 354.8688 333.2232 40.1047 0.1525 1037 +1039 3 354.8688 332.1146 39.76 0.1398 1038 +1040 3 354.926 330.9821 39.76 0.1398 1039 +1041 3 355.5575 330.1161 39.9524 0.1525 1040 +1042 3 355.6868 329.2466 41.44 0.178 1041 +1043 3 356.0872 328.233 41.0396 0.2034 1042 +1044 3 356.928 327.6416 40.6 0.2034 1043 +1045 2 313.9491 377.5497 28.194 0.2034 1 +1046 2 314.3346 378.4878 29.4406 0.3051 1045 +1047 2 315.2921 379.0438 29.8995 0.394 1046 +1048 2 316.1364 379.7222 30.7801 0.4449 1047 +1049 2 316.2531 380.8536 30.8048 0.4576 1048 +1050 2 316.5425 381.9599 30.8286 0.4449 1049 +1051 3 314.7499 376.7741 26.964 0.1398 1 +1052 3 315.3905 377.7213 26.8498 0.178 1051 +1053 3 315.8264 378.5427 27.6531 0.2288 1052 +1054 3 316.9498 378.5324 27.44 0.2288 1053 +1055 3 317.5115 378.2064 29.1007 0.2288 1054 +1056 3 318.6543 378.2064 29.12 0.2288 1055 +1057 3 319.7903 378.3094 29.12 0.2924 1056 +1058 3 320.6632 378.2762 28.1529 0.3432 1057 +1059 3 321.3084 377.6104 28.7398 0.3686 1058 +1060 3 322.314 377.091 28.9512 0.3432 1059 +1061 3 323.3836 376.7192 28.9022 0.3051 1060 +1062 3 324.5196 376.3852 28.6958 0.2669 1061 +1063 3 325.341 376.6426 28.6843 0.2288 1062 +1064 3 325.9519 376.4424 29.4493 0.178 1063 +1065 3 327.0158 376.1472 29.4 0.1652 1064 +1066 3 327.7938 375.7274 28.28 0.1907 1065 +1067 3 328.5396 375.621 28.4964 0.2415 1066 +1068 3 329.3553 375.3624 29.5546 0.2669 1067 +1069 3 330.2305 375.5535 30.5978 0.2796 1068 +1070 3 331.1937 375.2675 31.8942 0.2669 1069 +1071 3 332.0037 375.0032 30.6956 0.2924 1070 +1072 3 332.9761 374.6886 30.0754 0.2924 1071 +1073 3 333.9359 374.6108 29.9622 0.2796 1072 +1074 3 335.025 374.4312 30.3635 0.2669 1073 +1075 3 335.7148 373.842 31.2332 0.2924 1074 +1076 3 336.7101 373.4771 30.5354 0.3432 1075 +1077 3 337.5178 373.2231 30.7376 0.3178 1076 +1078 3 338.5462 372.8857 30.6348 0.2796 1077 +1079 3 339.6216 372.8548 30.3873 0.2161 1078 +1080 3 340.6043 372.6569 29.9838 0.2288 1079 +1081 3 341.1408 372.4784 28.2072 0.2288 1080 +1082 3 341.6625 372.8799 27.72 0.2288 1081 +1083 3 342.1189 373.3616 27.72 0.2924 1082 +1084 3 342.7962 374.0514 27.47 0.3178 1083 +1085 3 343.7068 374.231 28.3346 0.3178 1084 +1086 3 344.4401 374.0777 27.4652 0.3178 1085 +1087 3 345.2009 374.0571 26.1884 0.3559 1086 +1088 3 345.6035 374.088 24.6884 0.394 1087 +1089 3 345.8312 374.7378 25.1006 0.4068 1088 +1090 3 346.6251 375.0032 25.5178 0.3813 1089 +1091 3 347.4351 375.3922 25.951 0.3686 1090 +1092 3 348.3251 375.1187 24.9511 0.3559 1091 +1093 3 349.3765 375.232 24.64 0.3305 1092 +1094 3 349.7208 375.7079 23.2184 0.2669 1093 +1095 3 350.334 376.249 23.3806 0.2288 1094 +1096 3 351.1096 376.0248 22.3401 0.2288 1095 +1097 3 351.9287 375.6804 23.0812 0.2669 1096 +1098 3 352.789 375.4333 21.9601 0.2924 1097 +1099 3 353.83 375.4436 21.0022 0.2924 1098 +1100 3 354.6526 375.4608 21.4315 0.2796 1099 +1101 3 355.7531 375.6919 21.28 0.2669 1100 +1102 3 356.4029 376.336 20.44 0.2796 1101 +1103 3 357.3604 376.2616 20.1211 0.2924 1102 +1104 3 358.4026 376.5407 20.4168 0.2924 1103 +1105 3 358.9586 376.948 19.04 0.3051 1104 +1106 3 359.7891 377.4193 19.6935 0.3178 1105 +1107 3 360.6368 377.52 20.55 0.3432 1106 +1108 3 361.6813 377.6424 20.1704 0.3178 1107 +1109 3 362.767 377.7042 20.2118 0.2669 1108 +1110 3 363.6307 378.2339 19.6834 0.2288 1109 +1111 3 364.269 378.664 19.0453 0.2161 1110 +1112 3 365.1053 379.1674 20.1905 0.2542 1111 +1113 3 365.8992 379.538 19.4121 0.2796 1112 +1114 3 366.5845 380.2233 19.1332 0.3178 1113 +1115 3 367.1439 380.7976 20.44 0.3305 1114 +1116 3 367.8566 381.4039 19.3466 0.3432 1115 +1117 3 368.4389 381.8111 20.44 0.3432 1116 +1118 3 369.226 382.4266 20.7158 0.3305 1117 +1119 3 370.0279 383.1416 20.713 0.2924 1118 +1120 3 370.6549 383.987 20.9905 0.2288 1119 +1121 3 371.0964 384.956 20.0603 0.1907 1120 +1122 3 371.6238 385.9067 19.6862 0.1907 1121 +1123 3 372.356 386.7098 20.0836 0.2161 1122 +1124 3 373.135 387.5106 19.6006 0.2161 1123 +1125 3 373.7803 388.2484 20.2082 0.2034 1124 +1126 3 374.4426 389.151 19.7098 0.2161 1125 +1127 3 375.113 390.0571 19.3166 0.2288 1126 +1128 3 375.9092 390.7812 19.6 0.2288 1127 +1129 3 376.8302 391.2457 19.1556 0.178 1128 +1130 3 377.9238 391.4951 19.32 0.1652 1129 +1131 3 379.0518 391.6759 19.32 0.178 1130 +1132 3 380.1798 391.7822 19.516 0.2161 1131 +1133 3 381.2083 391.7159 19.0711 0.2034 1132 +1134 3 382.1726 391.7662 19.4855 0.178 1133 +1135 3 383.2457 391.9905 20.2056 0.1652 1134 +1136 3 384.3817 392.0488 20.454 0.1907 1135 +1137 3 385.48 391.9767 20.9412 0.2161 1136 +1138 3 386.434 392.0259 20.1698 0.2288 1137 +1139 3 387.3744 392.5602 20.72 0.2161 1138 +1140 3 388.2828 393.0464 20.3428 0.2161 1139 +1141 3 389.2334 393.6424 19.9416 0.2161 1140 +1142 3 390.1097 394.3254 20.3162 0.2542 1141 +1143 3 391.1325 394.7246 20.8312 0.2796 1142 +1144 3 392.0133 395.4064 20.9084 0.2924 1143 +1145 3 393.0761 395.7771 21.1176 0.2542 1144 +1146 3 394.0405 395.9224 21.1081 0.1907 1145 +1147 3 395.1193 396.1523 21.3027 0.1525 1146 +1148 3 396.237 396.2816 20.8933 0.1525 1147 +1149 3 397.3421 396.1672 21.28 0.1907 1148 +1150 3 398.3351 396.0082 20.3633 0.2034 1149 +1151 3 399.4047 395.7176 20.417 0.1907 1150 +1152 3 400.1929 395.1456 19.6 0.1652 1151 +1153 3 401.3369 395.1376 19.6 0.1525 1152 +1154 3 402.4134 394.807 19.6 0.1525 1153 +1155 3 403.3389 394.8756 20.6735 0.1525 1154 +1156 3 404.3228 394.3334 20.503 0.178 1155 +1157 3 405.3009 393.7614 20.4666 0.2034 1156 +1158 3 406.2447 393.3678 19.9531 0.2161 1157 +1159 3 407.0055 393.1928 20.4142 0.1907 1158 +1160 3 407.5958 393.1528 18.769 0.1652 1159 +1161 3 408.543 392.7352 18.4736 0.1525 1160 +1162 3 409.6412 392.9514 18.2 0.1652 1161 +1163 3 410.7852 392.964 18.177 0.2034 1162 +1164 3 411.9006 393.075 17.7422 0.2415 1163 +1165 3 412.9199 393.2271 18.2246 0.2415 1164 +1166 3 413.6704 393.3507 18.3546 0.1907 1165 +1167 3 414.5936 393.3072 17.64 0.1652 1166 +1168 3 415.7319 393.2786 17.5336 0.1652 1167 +1169 3 416.8393 393.1928 17.801 0.2161 1168 +1170 3 417.7945 393.4216 19.0028 0.2415 1169 +1171 3 418.6651 393.3667 17.7052 0.2924 1170 +1172 3 419.7473 393.0784 17.9161 0.2924 1171 +1173 3 420.8284 393.0933 17.6568 0.2796 1172 +1174 3 421.7276 393.2431 18.4052 0.2288 1173 +1175 3 422.7091 393.29 17.4513 0.2034 1174 +1176 3 423.5614 392.9823 17.9018 0.1907 1175 +1177 3 424.6379 392.8496 17.92 0.2034 1176 +1178 3 425.2694 392.6643 16.6939 0.2288 1177 +1179 3 426.0942 392.1643 15.8841 0.2669 1178 +1180 3 426.1434 391.407 14.6555 0.2924 1179 +1181 3 426.9763 390.8533 14.9456 0.2924 1180 +1182 3 427.9349 390.4541 14.5032 0.2669 1181 +1183 3 428.8547 390.0651 15.4031 0.2161 1182 +1184 3 429.8992 389.9896 16.3702 0.1907 1183 +1185 3 430.8304 390.2184 17.36 0.1907 1184 +1186 3 341.2243 372.5573 28.089 0.1652 1082 +1187 3 340.34 372.4098 28.9332 0.2288 1186 +1188 3 328.2433 375.4802 28.4889 0.2161 1066 +1189 3 328.7753 374.6692 29.5291 0.178 1188 +1190 3 328.6712 374.3557 31.3818 0.1907 1189 +1191 3 329.1345 373.476 31.92 0.2034 1190 +1192 3 329.2707 372.4509 32.2176 0.2669 1191 +1193 3 330.0108 371.7371 33.1324 0.2796 1192 +1194 3 330.9455 371.1182 33.32 0.2924 1193 +1195 3 331.4031 370.537 33.7296 0.2415 1194 +1196 3 331.4305 369.4994 33.847 0.2415 1195 +1197 3 331.4099 368.3897 33.7924 0.2415 1196 +1198 3 330.926 367.4837 34.44 0.2542 1197 +1199 3 330.6743 366.4026 34.839 0.2161 1198 +1200 3 330.7167 365.3375 35.5491 0.1652 1199 +1201 3 330.5016 364.3262 36.2132 0.1398 1200 +1202 3 330.0657 363.7188 35.0115 0.1398 1201 +1203 3 329.5269 362.8585 36.0828 0.1652 1202 +1204 3 329.1013 362.3483 38.2687 0.1907 1203 +1205 3 328.3646 361.8083 38.3583 0.2415 1204 +1206 3 327.6473 361.1402 38.6028 0.2669 1205 +1207 3 326.7847 360.5899 38.5532 0.2669 1206 +1208 3 325.9656 360.2605 39.3156 0.2161 1207 +1209 3 325.3536 359.963 39.48 0.1907 1208 +1210 3 324.5963 359.2263 39.48 0.1652 1209 +1211 3 323.5953 358.7893 39.4834 0.1652 1210 +1212 3 323.5827 358.485 41.4355 0.1398 1211 +1213 3 322.9512 357.762 41.16 0.1398 1212 +1214 3 322.6538 357.1568 42.336 0.1652 1213 +1215 3 322.0326 356.6695 43.68 0.2034 1214 +1216 3 321.9216 355.538 43.6122 0.2288 1215 +1217 3 322.3792 354.9889 44.133 0.2034 1216 +1218 3 322.2225 354.6389 46.4366 0.1907 1217 +1219 3 321.5086 354.1778 47.4281 0.1652 1218 +1220 3 321.1094 353.4605 49.0557 0.1652 1219 +1221 3 320.7707 353.2672 51.4408 0.1398 1220 +1222 3 319.748 353.0384 51.8 0.1398 1221 +1223 3 325.5172 376.5453 29.1396 0.2161 1063 +1224 3 326.5674 376.2158 29.4557 0.2542 1223 +1225 3 327.5398 375.8166 29.12 0.2415 1224 +1226 3 324.1158 376.376 28.849 0.4576 1061 +1227 3 324.761 376.0294 27.6923 0.2796 1226 +1228 3 324.435 375.6713 26.054 0.2288 1227 +1229 3 325.0104 375.4608 24.0803 0.1907 1228 +1230 3 325.492 375.232 25.6948 0.2034 1229 +1231 3 326.0812 375.0879 27.1382 0.2288 1230 +1232 3 326.5308 374.7744 25.347 0.2542 1231 +1233 3 326.7893 374.5834 22.8903 0.2542 1232 +1234 3 326.8145 375.1222 20.6702 0.2288 1233 +1235 3 327.5203 375.3464 18.7687 0.1907 1234 +1236 3 328.5751 375.232 18.951 0.1907 1235 +1237 3 329.3954 374.7824 19.9116 0.2161 1236 +1238 3 329.9605 373.8935 19.88 0.2415 1237 +1239 3 330.8414 373.7448 18.6074 0.2288 1238 +1240 3 331.6456 374.1074 18.6435 0.2034 1239 +1241 3 332.3755 374.4667 18.6777 0.2034 1240 +1242 3 332.5677 374.1509 19.3404 0.2415 1241 +1243 3 333.3708 374.0914 20.4873 0.2796 1242 +1244 3 333.9862 373.4096 19.6 0.2924 1243 +1245 3 334.342 372.8365 21.0227 0.2415 1244 +1246 3 334.9724 372.6008 22.6467 0.1907 1245 +1247 3 336.1072 372.6008 22.96 0.178 1246 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc new file mode 100644 index 0000000..c270082 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc @@ -0,0 +1,1966 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/MouseCellTypes/176847.04.02.01/176847.04.02.01_MDF.swc_sorted.swc +# id,type,x,y,z,r,pid +1 1 237.4944 233.8336 35.28 5.9212 -1 +2 3 232.5043 230.7745 35.28 0.2669 1 +3 3 231.4495 231.199 35.28 0.2796 2 +4 3 230.3513 231.5181 35.28 0.2796 3 +5 3 229.2084 231.5159 35.28 0.2542 4 +6 3 228.0793 231.3282 35.28 0.2542 5 +7 3 226.9616 231.0846 35.28 0.2669 6 +8 3 225.8176 231.0617 35.28 0.3305 7 +9 3 224.6816 230.9313 35.2803 0.4576 8 +10 3 223.2768 230.103 35.2825 0.4068 9 +11 3 222.4268 229.3377 35.2898 0.3813 10 +12 3 221.523 228.6364 35.3265 0.3051 11 +13 3 220.8629 227.775 35.6944 0.4322 12 +14 3 220.4488 226.75 35.6216 0.4322 13 +15 3 220.1548 225.6803 34.9891 0.4068 14 +16 3 219.823 224.6198 34.3207 0.3305 15 +17 3 219.6572 223.5159 33.8643 0.2542 16 +18 3 219.7075 222.4039 33.2562 0.2288 17 +19 3 219.9523 221.3102 33.0162 0.2669 18 +20 3 220.5003 220.3138 32.8628 0.3178 19 +21 3 220.9121 219.2648 32.3744 0.3432 20 +22 3 220.7828 218.1482 31.9312 0.3559 21 +23 3 220.2623 217.1312 31.9368 0.3686 22 +24 3 220.2383 215.9895 32.0306 0.4068 23 +25 3 220.7977 214.4005 32.426 0.2288 24 +26 3 220.7211 213.2908 31.92 0.2796 25 +27 3 220.53 212.1754 31.6366 0.3305 26 +28 3 220.3333 211.0783 31.2928 0.3178 27 +29 3 219.7956 210.0899 31.5381 0.2924 28 +30 3 219.2911 209.1106 31.6926 0.2796 29 +31 3 219.0497 208.0135 31.1898 0.3051 30 +32 3 218.7763 206.921 30.8129 0.3178 31 +33 3 218.464 205.8205 30.77 0.2924 32 +34 3 218.2889 204.7039 30.5665 0.2542 33 +35 3 218.2821 203.5714 30.5469 0.2669 34 +36 3 218.321 202.4342 30.8241 0.3051 35 +37 3 218.5555 201.3246 31.1539 0.3178 36 +38 3 218.6104 200.208 31.7103 0.2924 37 +39 3 218.2374 199.159 31.2561 0.2924 38 +40 3 217.7867 198.1259 30.7882 0.3178 39 +41 3 217.2685 197.1112 30.5396 0.3305 40 +42 3 216.8612 196.156 29.3952 0.3051 41 +43 3 216.5695 195.0589 29.6587 0.3305 42 +44 3 216.0856 194.0224 29.741 0.3686 43 +45 3 214.9896 193.582 29.5781 0.2034 44 +46 3 214.1545 192.8349 29.1992 0.2161 45 +47 3 213.5436 191.9152 28.5219 0.1907 46 +48 3 212.808 191.0903 27.9535 0.1652 47 +49 3 212.3847 190.2243 26.7529 0.1907 48 +50 3 212.3012 189.141 26.1708 0.2415 49 +51 3 211.8299 188.1388 25.5808 0.2924 50 +52 3 211.6045 187.1424 24.353 0.2924 51 +53 3 211.8516 186.0933 23.4917 0.2542 52 +54 3 211.7727 184.9791 24.0668 0.2415 53 +55 3 210.9628 184.2446 23.9061 0.2415 54 +56 3 210.218 183.5571 23.1552 0.2796 55 +57 3 209.8805 182.6064 21.8562 0.2924 56 +58 3 209.6472 181.5928 21.107 0.2924 57 +59 3 209.4355 180.4889 21.1991 0.2669 58 +60 3 209.0706 179.4593 20.4764 0.2161 59 +61 3 208.7606 178.3965 20.16 0.178 60 +62 3 208.232 177.5488 20.16 0.178 61 +63 3 207.3752 177.1427 19.32 0.2161 62 +64 3 206.9748 176.1005 18.9241 0.2669 63 +65 3 206.3364 175.1773 18.48 0.2796 64 +66 3 205.9452 174.1111 18.48 0.2924 65 +67 3 205.4041 173.1158 18.2104 0.2669 66 +68 3 204.9098 172.1583 17.3872 0.2542 67 +69 3 204.7657 171.0383 17.1268 0.2161 68 +70 3 204.2257 170.0808 16.8725 0.2288 69 +71 3 203.1778 169.6403 16.8 0.2542 70 +72 3 202.218 169.0477 16.5819 0.3051 71 +73 3 201.3737 168.3247 16.1622 0.3051 72 +74 3 201.344 167.2093 15.7676 0.2669 73 +75 3 200.6576 166.5664 14.84 0.2161 74 +76 3 215.9494 194.0602 30.8 0.178 44 +77 3 215.7618 193.6575 30.8 0.1907 76 +78 3 215.7584 192.5135 30.8 0.2161 77 +79 3 215.4381 191.4347 30.8 0.2288 78 +80 3 215.064 190.3547 30.8 0.2161 79 +81 3 214.8638 189.229 30.8 0.2034 80 +82 3 214.7288 188.0953 30.8 0.178 81 +83 3 214.7391 186.9513 30.8 0.1525 82 +84 3 215.0354 185.868 31.0607 0.1398 83 +85 3 215.2894 184.8304 32.0354 0.1398 84 +86 3 215.6955 183.8339 32.737 0.1652 85 +87 3 215.9929 182.7346 32.76 0.178 86 +88 3 216.2858 181.634 32.76 0.1907 87 +89 3 216.5066 180.5587 32.2216 0.1907 88 +90 3 216.8406 179.505 31.92 0.178 89 +91 3 216.9024 178.3633 31.92 0.178 90 +92 3 216.9024 177.2193 31.92 0.178 91 +93 3 216.8258 176.0833 31.9827 0.2161 92 +94 3 216.6072 174.9965 32.5234 0.2542 93 +95 3 216.5592 173.8891 32.9048 0.2924 94 +96 3 216.5592 172.7795 33.488 0.2796 95 +97 3 216.5592 171.6366 33.6 0.2542 96 +98 3 216.5592 170.4926 33.6 0.2161 97 +99 3 216.51 169.3566 33.7218 0.2034 98 +100 3 216.4448 168.2229 33.88 0.1907 99 +101 3 216.4448 167.0812 33.9674 0.2161 100 +102 3 216.4448 165.9555 34.4448 0.2415 101 +103 3 216.4448 164.8744 35.0708 0.2415 102 +104 3 216.4448 163.7991 35.84 0.1907 103 +105 3 216.4448 162.6551 35.84 0.1525 104 +106 3 216.4448 161.5111 35.84 0.1398 105 +107 3 216.454 160.3671 35.84 0.1652 106 +108 3 216.5992 159.2334 35.84 0.178 107 +109 3 216.6736 158.0962 35.8672 0.1907 108 +110 3 216.6736 156.9591 36.1334 0.178 109 +111 3 216.8086 155.838 36.4 0.1652 110 +112 3 216.9996 154.7123 36.4 0.1525 111 +113 3 217.2239 153.6037 36.7189 0.1525 112 +114 3 217.2456 152.6611 37.7877 0.1398 113 +115 3 217.3497 151.5262 37.8 0.1271 114 +116 3 217.9183 150.6305 37.8 0.1144 115 +117 3 217.9732 149.4968 37.9033 0.1144 116 +118 3 218.2924 148.4569 38.64 0.1144 117 +119 3 218.7889 147.441 38.64 0.1271 118 +120 3 218.8472 146.3016 38.7374 0.1398 119 +121 3 219.0428 145.2148 39.3775 0.1525 120 +122 3 219.4341 144.176 39.6724 0.1398 121 +123 3 220.0427 143.2139 39.76 0.1271 122 +124 3 220.8538 142.4635 39.76 0.1144 123 +125 3 221.5081 141.6592 40.04 0.1144 124 +126 3 221.8182 140.569 40.04 0.1144 125 +127 3 222.2254 139.552 40.2016 0.1144 126 +128 3 222.4325 138.4595 40.6 0.1144 127 +129 3 222.7368 137.4161 40.6 0.1144 128 +130 3 222.7665 136.2744 40.6428 0.1144 129 +131 3 222.8706 135.1945 41.4442 0.1144 130 +132 3 223.0731 134.1271 42.0 0.1144 131 +133 3 223.2367 133.038 42.1842 0.1144 132 +134 3 223.4678 131.941 42.28 0.1144 133 +135 3 223.8808 130.9319 42.3525 0.1144 134 +136 3 224.3487 130.0717 43.12 0.1144 135 +137 3 224.8887 129.0787 43.2149 0.1144 136 +138 3 225.5041 128.239 44.3254 0.1144 137 +139 3 226.3141 127.6304 44.8 0.1144 138 +140 3 226.4376 126.5104 44.8 0.1144 139 +141 3 226.9021 125.6455 44.0115 0.1144 140 +142 3 227.3597 124.7383 43.4 0.1144 141 +143 3 227.7658 123.6893 43.4 0.1144 142 +144 3 227.8848 122.5682 43.12 0.1144 143 +145 3 228.3504 121.7079 42.5508 0.1144 144 +146 3 228.4911 120.6268 42.28 0.1144 145 +147 3 228.7931 119.5263 42.28 0.1144 146 +148 3 229.4441 118.722 42.9234 0.1144 147 +149 3 229.5711 117.6238 43.1978 0.1144 148 +150 3 229.7152 116.5324 43.68 0.1144 149 +151 3 229.706 115.4056 43.2849 0.1144 150 +152 3 229.4898 114.2952 43.12 0.1144 151 +153 3 229.4864 113.1517 43.12 0.1144 152 +154 3 229.4864 112.071 42.4463 0.1271 153 +155 3 229.4864 110.9306 42.28 0.1398 154 +156 3 229.4864 109.7952 42.1574 0.1652 155 +157 3 229.3434 108.8181 40.8668 0.1652 156 +158 3 229.1993 107.8714 39.4064 0.1652 157 +159 3 229.1432 106.7387 39.2 0.1525 158 +160 3 229.1398 105.5947 39.2 0.1525 159 +161 3 229.0288 104.4855 38.787 0.178 160 +162 3 229.0288 103.3659 38.36 0.2161 161 +163 3 228.8206 102.2481 38.36 0.2542 162 +164 3 228.6993 101.1362 38.0685 0.2415 163 +165 3 228.9144 100.2135 36.533 0.1907 164 +166 3 228.959 99.2882 35.0347 0.1398 165 +167 3 229.6809 98.7205 33.88 0.1144 166 +168 3 230.2872 97.835 33.88 0.1144 167 +169 3 230.81 96.8919 33.88 0.1144 168 +170 3 231.7824 96.2999 33.88 0.1144 169 +171 3 232.6416 95.581 33.88 0.1144 170 +172 3 233.0946 94.7028 33.88 0.1144 171 +173 3 233.7489 93.8609 33.88 0.1144 172 +174 3 234.52 93.3316 33.88 0.1271 173 +175 3 234.7545 92.236 33.88 0.1398 174 +176 3 235.5439 91.411 33.88 0.1525 175 +177 3 236.4648 90.971 34.384 0.1398 176 +178 3 236.5872 89.8573 34.44 0.1271 177 +179 3 237.4017 89.2013 33.8918 0.1144 178 +180 3 238.4348 89.1176 32.9459 0.1144 179 +181 3 239.1406 88.8369 31.351 0.1144 180 +182 3 239.5536 87.9258 30.2865 0.1144 181 +183 3 240.3361 87.2805 30.0434 0.1144 182 +184 3 241.0671 86.6914 29.12 0.1144 183 +185 3 241.8816 86.0381 28.84 0.1144 184 +186 3 243.005 85.8469 28.84 0.1144 185 +187 3 244.0644 85.4372 28.84 0.1144 186 +188 3 244.3332 84.347 28.8691 0.1144 187 +189 3 244.7531 83.4076 29.3272 0.1271 188 +190 3 245.8456 83.1688 29.4 0.1652 189 +191 3 218.8655 216.0352 29.6892 0.2288 24 +192 3 217.9709 215.4472 29.1472 0.2924 191 +193 3 217.3886 214.532 28.2688 0.3305 192 +194 3 216.7743 213.6306 27.501 0.3305 193 +195 3 216.0398 212.7897 26.9248 0.3178 194 +196 3 215.3271 211.934 26.3796 0.2924 195 +197 3 214.5435 211.1252 26.2102 0.3051 196 +198 3 213.5974 210.5166 25.7942 0.3178 197 +199 3 212.6971 209.8954 25.0183 0.3305 198 +200 3 211.8745 209.1552 24.3177 0.2924 199 +201 3 211.0348 208.4048 23.8599 0.2542 200 +202 3 210.115 207.8911 23.098 0.2288 201 +203 3 209.0717 207.7767 22.1598 0.2161 202 +204 3 207.9472 207.787 21.7213 0.1907 203 +205 3 206.9393 207.5765 20.9392 0.1652 204 +206 3 206.7494 208.2595 18.9126 0.1652 205 +207 3 205.7415 208.4505 18.3109 0.1652 206 +208 3 219.9901 228.7828 36.1637 0.178 12 +209 3 218.9582 228.649 35.8758 0.2288 208 +210 3 217.9652 228.6398 34.5369 0.2669 209 +211 3 216.8967 228.7188 33.6361 0.2924 210 +212 3 215.819 228.4968 33.8341 0.3305 211 +213 3 214.7391 228.1616 34.1113 0.3305 212 +214 3 213.666 227.823 33.7378 0.3178 213 +215 3 212.6181 227.5141 33.0005 0.2796 214 +216 3 211.5485 227.6537 32.3075 0.2669 215 +217 3 210.4674 227.7372 32.9966 0.2924 216 +218 3 209.3612 227.4672 33.04 0.3051 217 +219 3 208.2183 227.4226 33.04 0.3178 218 +220 3 207.0743 227.4055 33.04 0.3051 219 +221 3 205.9475 227.2384 33.0397 0.2924 220 +222 3 204.8321 226.9822 33.0383 0.2796 221 +223 3 203.7018 226.8243 33.0285 0.2669 222 +224 3 202.6321 226.4182 32.982 0.2542 223 +225 3 201.5522 226.0441 32.9017 0.2288 224 +226 3 200.5135 225.8199 33.9307 0.2034 225 +227 3 199.4587 225.9629 32.9574 0.2161 226 +228 3 198.436 225.7409 31.9197 0.2796 227 +229 3 197.3 225.6117 31.9183 0.3559 228 +230 3 196.1605 225.5018 31.9099 0.4195 229 +231 3 195.0646 225.2021 31.8469 0.4195 230 +232 3 193.9915 224.8509 31.4586 0.394 231 +233 3 192.8887 224.6484 30.9543 0.3305 232 +234 3 191.787 224.3727 30.8157 0.2796 233 +235 3 190.6979 224.0249 30.896 0.2288 234 +236 3 189.6088 223.7229 31.2715 0.2161 235 +237 3 188.5095 223.4884 31.4448 0.2161 236 +238 3 187.3975 223.6303 31.2682 0.2161 237 +239 3 186.321 223.7664 32.1437 0.1907 238 +240 3 185.2445 223.7653 31.1996 0.1907 239 +241 3 184.1497 223.7584 30.3957 0.2161 240 +242 3 183.0091 223.7069 30.3064 0.2542 241 +243 3 181.8949 223.509 30.2042 0.2542 242 +244 3 180.8618 223.6898 29.3157 0.2415 243 +245 3 179.9295 224.2503 30.1753 0.2161 244 +246 3 178.845 224.2503 29.8222 0.2034 245 +247 3 177.7135 224.184 29.4879 0.1907 246 +248 3 176.6233 223.9849 28.8907 0.2161 247 +249 3 175.5102 223.8064 28.5891 0.2415 248 +250 3 174.3685 223.7607 28.5614 0.2669 249 +251 3 173.2245 223.7309 28.5698 0.2415 250 +252 3 172.1022 223.5353 28.6236 0.2034 251 +253 3 170.98 223.342 28.8436 0.1652 252 +254 3 169.8485 223.2539 28.6614 0.1652 253 +255 3 168.7514 222.9702 28.5998 0.178 254 +256 3 167.8706 222.6418 27.5915 0.1907 255 +257 3 166.9302 222.0996 27.44 0.178 256 +258 3 165.9555 221.5196 27.3546 0.1652 257 +259 3 164.9293 221.0997 26.88 0.1652 258 +260 3 163.9455 220.5987 26.6 0.1907 259 +261 3 162.925 220.1148 26.6 0.2161 260 +262 3 161.8554 219.751 26.4146 0.2034 261 +263 3 160.8761 219.1687 26.32 0.178 262 +264 3 159.7756 218.9078 26.2284 0.1525 263 +265 3 158.7414 218.6218 25.529 0.1652 264 +266 3 157.6409 218.3759 25.2 0.1652 265 +267 3 156.5129 218.2752 24.943 0.1652 266 +268 3 155.3769 218.2752 24.6954 0.1525 267 +269 3 154.2444 218.2706 24.36 0.1525 268 +270 3 153.1095 218.1528 24.36 0.1525 269 +271 3 152.0262 218.0132 23.5824 0.1525 270 +272 3 150.9199 217.8176 23.3666 0.1525 271 +273 3 149.7988 217.8176 22.8351 0.1525 272 +274 3 148.6582 217.8176 22.68 0.1398 273 +275 3 147.5302 217.9663 22.5543 0.1271 274 +276 3 146.4286 218.1608 22.12 0.1144 275 +277 3 145.2846 218.1608 22.12 0.1144 276 +278 3 144.1417 218.1802 22.12 0.1144 277 +279 3 143.0206 218.4045 22.12 0.1144 278 +280 3 141.9544 218.7969 22.12 0.1144 279 +281 3 140.8161 218.8472 22.12 0.1271 280 +282 3 139.6767 218.9147 22.12 0.1398 281 +283 3 138.5418 218.9616 22.0276 0.1525 282 +284 3 137.455 218.8472 21.2582 0.1398 283 +285 3 136.327 218.8472 20.7978 0.1271 284 +286 3 135.1945 218.7328 20.72 0.1144 285 +287 3 134.0699 218.6195 20.4736 0.1144 286 +288 3 132.9305 218.6687 20.44 0.1144 287 +289 3 131.8014 218.8472 20.44 0.1144 288 +290 3 130.6574 218.8472 20.44 0.1271 289 +291 3 129.5145 218.8346 20.44 0.1398 290 +292 3 128.4975 218.4296 19.88 0.1525 291 +293 3 127.365 218.3896 19.7089 0.1398 292 +294 3 126.285 218.0819 19.6 0.1271 293 +295 3 125.1948 217.8062 19.5782 0.1144 294 +296 3 124.1103 217.487 19.32 0.1144 295 +297 3 122.9869 217.2753 19.32 0.1144 296 +298 3 121.8909 217.0168 19.1425 0.1144 297 +299 3 120.7526 216.9367 19.04 0.1144 298 +300 3 119.6269 216.788 19.04 0.1271 299 +301 3 118.5184 216.9024 19.04 0.1652 300 +302 3 224.1199 231.1955 36.0307 0.2034 9 +303 3 223.271 231.8064 37.0908 0.2161 302 +304 3 222.4096 232.518 37.329 0.2288 303 +305 3 221.5814 233.265 36.7937 0.2288 304 +306 3 220.7645 234.0441 36.5649 0.2415 305 +307 3 219.8962 234.7534 37.0205 0.2796 306 +308 3 219.0726 235.497 37.6709 0.3305 307 +309 3 218.4182 236.3882 38.3275 0.3432 308 +310 3 217.8714 237.3789 38.61 0.3305 309 +311 3 217.3062 238.373 38.64 0.2924 310 +312 3 216.6564 239.3134 38.6403 0.2796 311 +313 3 216.0822 240.2983 38.6408 0.2669 312 +314 3 215.5445 241.3085 38.645 0.2796 313 +315 3 214.8981 242.2489 38.6641 0.3178 314 +316 3 214.2312 243.1778 38.7545 0.3559 315 +317 3 213.682 244.1525 39.2815 0.3686 316 +318 3 213.0792 245.0894 39.902 0.3305 317 +319 3 212.5895 246.0744 40.6006 0.2924 318 +320 3 211.9935 247.0376 40.6193 0.2796 319 +321 3 211.2842 247.8785 39.8541 0.3051 320 +322 3 210.5829 248.7056 39.0071 0.3305 321 +323 3 209.7902 249.4995 39.5382 0.3432 322 +324 3 209.018 250.2786 40.3292 0.3432 323 +325 3 208.2812 251.1263 40.8374 0.3432 324 +326 3 207.4724 251.9351 40.8736 0.3432 325 +327 3 206.6281 252.705 40.8514 0.3178 326 +328 3 205.7038 253.3743 40.7123 0.2796 327 +329 3 204.8629 254.0961 40.0336 0.2288 328 +330 3 204.0747 254.8066 39.1622 0.2288 329 +331 3 203.2327 255.5364 39.6494 0.2288 330 +332 3 202.6813 256.5374 39.7046 0.2288 331 +333 3 202.1928 257.5636 39.4624 0.2034 332 +334 3 201.5751 258.4628 39.2529 0.2288 333 +335 3 200.6427 259.1011 39.6486 0.2796 334 +336 3 199.7401 259.7898 39.7603 0.3051 335 +337 3 199.0251 260.6753 39.7614 0.2669 336 +338 3 198.4348 261.6545 39.767 0.2288 337 +339 3 197.7679 262.58 39.7911 0.2161 338 +340 3 197.0448 263.4575 39.9608 0.2161 339 +341 3 196.3424 264.3418 40.3609 0.2161 340 +342 3 195.505 265.0785 40.3273 0.2542 341 +343 3 194.6276 265.7684 39.8247 0.3178 342 +344 3 193.8565 266.6103 39.76 0.3559 343 +345 3 193.1381 267.5004 39.76 0.3305 344 +346 3 192.3133 268.2806 39.76 0.2796 345 +347 3 191.3329 268.8594 39.7603 0.2542 346 +348 3 190.4188 269.5264 39.7608 0.2415 347 +349 3 189.6443 270.365 39.7636 0.2542 348 +350 3 188.7554 271.0159 40.1682 0.2161 349 +351 3 187.7064 271.4506 40.32 0.1907 350 +352 3 186.6024 271.7252 40.32 0.1398 351 +353 3 185.5957 272.2617 40.3365 0.1398 352 +354 3 184.6931 272.9527 40.6 0.1398 353 +355 3 183.8557 273.7192 40.6 0.1652 354 +356 3 183.2242 274.5875 41.1188 0.1652 355 +357 3 182.9736 275.6708 41.44 0.1652 356 +358 3 182.3181 276.5803 41.44 0.1398 357 +359 3 181.2199 276.8137 41.5184 0.1271 358 +360 3 180.7406 277.7071 41.72 0.1271 359 +361 3 180.2269 278.6978 42.2223 0.1525 360 +362 3 179.5394 279.5902 42.5401 0.178 361 +363 3 178.5784 280.1656 42.84 0.1907 362 +364 3 177.4824 280.4184 43.1147 0.178 363 +365 3 176.6347 281.0774 43.12 0.1652 364 +366 3 175.866 281.9205 43.12 0.1652 365 +367 3 175.0114 282.6549 43.2135 0.178 366 +368 3 174.1694 283.3711 43.68 0.1907 367 +369 3 173.0506 283.5907 43.68 0.1652 368 +370 3 172.0748 284.1433 43.68 0.1398 369 +371 3 171.2419 284.9143 43.68 0.1144 370 +372 3 170.5933 285.6957 43.96 0.1144 371 +373 3 169.8565 286.5674 43.96 0.1144 372 +374 3 168.9368 287.2138 43.9863 0.1144 373 +375 3 167.9701 287.7572 44.52 0.1144 374 +376 3 167.2013 288.5957 44.52 0.1144 375 +377 3 166.4932 289.4686 44.52 0.1144 376 +378 3 165.4956 290.0143 44.52 0.1144 377 +379 3 164.72 290.822 44.8935 0.1144 378 +380 3 164.0622 291.5072 45.92 0.1144 379 +381 3 163.6835 292.5586 45.92 0.1144 380 +382 3 162.7798 293.245 45.92 0.1144 381 +383 3 161.9252 294.0 45.92 0.1144 382 +384 3 160.9528 294.5892 45.92 0.1144 383 +385 3 160.0605 295.2847 45.92 0.1144 384 +386 3 159.4873 296.2697 45.92 0.1144 385 +387 3 158.9817 297.2947 45.92 0.1144 386 +388 3 158.3834 298.2683 45.92 0.1144 387 +389 3 157.5906 299.0176 45.92 0.1144 388 +390 3 156.8127 299.8493 45.9413 0.1144 389 +391 3 156.148 300.7404 46.48 0.1271 390 +392 3 155.4479 301.6259 46.76 0.1525 391 +393 3 154.5956 302.3855 46.76 0.178 392 +394 3 153.6495 303.009 47.0246 0.178 393 +395 3 152.7263 303.684 47.04 0.1525 394 +396 3 151.7173 304.1965 46.8524 0.1271 395 +397 3 150.7586 304.8016 46.76 0.1144 396 +398 3 149.856 305.4892 46.6203 0.1144 397 +399 3 148.8939 306.0966 46.48 0.1144 398 +400 3 148.0668 306.8448 46.48 0.1144 399 +401 3 147.1195 307.474 46.48 0.1144 400 +402 3 146.3611 308.3149 46.48 0.1271 401 +403 3 145.6564 309.1832 46.6612 0.1398 402 +404 3 144.6577 309.452 47.6 0.1525 403 +405 3 143.6807 309.9702 47.6 0.1398 404 +406 3 142.8055 310.6589 47.836 0.1271 405 +407 3 142.1878 311.3774 48.72 0.1144 406 +408 3 141.2394 311.8109 48.72 0.1144 407 +409 3 140.1675 312.1633 48.72 0.1144 408 +410 3 139.1081 312.59 48.72 0.1144 409 +411 3 138.0385 312.9824 48.6329 0.1144 410 +412 3 137.0432 313.4766 48.44 0.1144 411 +413 3 135.9941 313.9182 48.44 0.1144 412 +414 3 135.0755 314.5863 48.6951 0.1144 413 +415 3 134.0596 315.1091 48.72 0.1144 414 +416 3 133.0609 315.6651 48.72 0.1144 415 +417 3 132.1148 316.2885 48.4448 0.1398 416 +418 3 131.266 317.0299 48.6114 0.1652 417 +419 3 130.2089 317.4486 48.72 0.1907 418 +420 3 129.1759 317.8112 49.275 0.1652 419 +421 3 128.2859 318.4988 49.28 0.1398 420 +422 3 127.6715 319.4517 49.0244 0.1144 421 +423 3 126.7872 320.1495 49.0 0.1144 422 +424 3 125.7828 320.5488 49.0 0.1144 423 +425 3 124.6731 320.757 49.0596 0.1144 424 +426 3 123.6927 321.3347 49.28 0.1144 425 +427 3 122.7764 321.988 49.6667 0.1144 426 +428 3 121.7765 322.5005 49.84 0.1144 427 +429 3 121.097 323.299 49.84 0.1144 428 +430 3 120.5696 324.3057 49.9288 0.1144 429 +431 3 119.834 325.1511 50.4 0.1144 430 +432 3 119.0607 325.9531 50.9158 0.1144 431 +433 3 118.3457 326.8271 51.24 0.1144 432 +434 3 117.5174 327.6096 51.24 0.1271 433 +435 3 116.7475 328.4207 51.7913 0.1398 434 +436 3 115.925 329.146 52.2684 0.1525 435 +437 3 115.1642 329.7855 53.5248 0.1398 436 +438 3 114.3723 330.5176 53.2927 0.1271 437 +439 3 113.7229 331.4568 53.2 0.1144 438 +440 3 112.7701 332.0609 53.2 0.1144 439 +441 3 111.718 332.4944 53.2 0.1144 440 +442 3 110.7486 333.063 53.2 0.1144 441 +443 3 109.967 333.8913 53.2 0.1144 442 +444 3 109.1294 334.6669 53.2 0.1398 443 +445 3 108.5156 335.5009 53.683 0.1907 444 +446 3 107.7837 336.3738 53.76 0.2415 445 +447 3 107.2058 337.3015 53.76 0.2415 446 +448 3 106.2723 337.9582 53.8331 0.1907 447 +449 3 105.5559 338.8356 54.04 0.1398 448 +450 3 104.908 339.7772 54.04 0.1144 449 +451 3 104.1519 340.634 54.04 0.1144 450 +452 3 103.1077 341.0859 54.04 0.1144 451 +453 3 102.0581 341.5343 54.0862 0.1144 452 +454 3 101.8118 342.5491 54.32 0.1144 453 +455 3 101.6026 343.3865 54.8733 0.1144 454 +456 3 101.1508 343.1931 57.4014 0.1144 455 +457 3 100.4262 343.2755 58.8 0.1144 456 +458 3 99.3275 343.4105 58.8 0.1144 457 +459 3 98.8076 344.2285 59.2567 0.1144 458 +460 3 97.6953 344.4092 59.36 0.1144 459 +461 3 96.6997 344.9698 59.36 0.1144 460 +462 3 95.6858 345.4846 59.6268 0.1144 461 +463 3 94.7804 345.9696 60.5268 0.1144 462 +464 3 94.1035 346.8173 61.0176 0.1144 463 +465 3 93.3807 347.6788 61.04 0.1144 464 +466 3 92.7652 348.6168 61.2567 0.1144 465 +467 3 92.1127 349.5309 61.6 0.1144 466 +468 3 91.2521 350.2402 61.6 0.1144 467 +469 3 90.4192 351.0044 61.6 0.1144 468 +470 3 89.5734 351.7651 61.6 0.1144 469 +471 3 88.7967 352.5819 61.6 0.1144 470 +472 3 87.992 353.3667 61.6123 0.1144 471 +473 3 87.0861 353.965 62.16 0.1144 472 +474 3 86.2486 354.5828 62.7312 0.1144 473 +475 3 85.446 355.0312 63.84 0.1144 474 +476 3 84.7198 355.8847 63.84 0.1144 475 +477 3 84.2332 356.9074 63.973 0.1144 476 +478 3 83.7408 357.8432 64.68 0.1398 477 +479 3 82.8438 358.2722 64.68 0.1144 478 +480 3 81.9626 358.9506 64.4 0.1144 479 +481 3 81.2031 359.7846 64.4 0.1144 480 +482 3 80.4524 360.6346 64.4 0.1144 481 +483 3 79.7633 361.52 64.4 0.1144 482 +484 3 79.0041 362.2133 64.4 0.1144 483 +485 3 78.1748 362.9718 64.5162 0.1144 484 +486 3 77.7279 363.9899 64.68 0.1144 485 +487 3 76.9223 364.7164 64.68 0.1144 486 +488 3 75.9201 365.2552 64.6638 0.1144 487 +489 3 75.0315 365.9061 64.12 0.1144 488 +490 3 74.6171 366.7836 63.2976 0.1144 489 +491 3 74.0669 367.7045 62.9244 0.1144 490 +492 3 73.9024 368.7364 62.16 0.1144 491 +493 3 73.9024 369.8804 62.16 0.1144 492 +494 3 73.9024 371.0244 62.16 0.1144 493 +495 3 73.9024 372.1684 62.16 0.1144 494 +496 3 73.9024 373.3124 62.16 0.1144 495 +497 3 73.9024 374.4564 62.16 0.1144 496 +498 3 73.9024 375.5992 62.2776 0.1144 497 +499 3 73.5174 376.5396 62.7542 0.1271 498 +500 3 73.1628 377.5841 63.0 0.1398 499 +501 3 72.6368 378.5553 63.0 0.1652 500 +502 3 71.9363 379.3618 63.0 0.1652 501 +503 3 71.2712 380.1718 62.72 0.1652 502 +504 3 70.8321 381.0252 62.72 0.1398 503 +505 3 69.8133 381.5148 62.72 0.1271 504 +506 3 68.8119 381.8489 62.72 0.1144 505 +507 3 68.3347 382.8213 62.3829 0.1398 506 +508 3 67.8392 383.812 61.88 0.1652 507 +509 3 83.5032 357.0699 66.7646 0.178 478 +510 3 83.0829 356.0769 67.6987 0.1398 509 +511 3 82.6625 355.0839 68.6328 0.1144 510 +512 3 82.2813 354.0623 69.4529 0.1144 511 +513 3 81.9674 352.9926 70.077 0.1144 512 +514 3 81.6533 351.9219 70.7011 0.1144 513 +515 3 81.3393 350.8522 71.3252 0.1271 514 +516 3 81.0253 349.7826 71.9494 0.1398 515 +517 3 80.5544 349.0001 73.211 0.1525 516 +518 3 79.8958 348.5642 75.236 0.1398 517 +519 3 79.1332 348.1878 77.0781 0.1398 518 +520 3 78.2696 347.8721 78.7427 0.1398 519 +521 3 77.406 347.5552 80.4076 0.1525 520 +522 3 76.5425 347.2383 82.0725 0.1398 521 +523 3 75.7549 346.9775 83.9941 0.1271 522 +524 3 74.9835 346.7304 85.9709 0.1144 523 +525 3 74.2122 346.4821 87.9474 0.1144 524 +526 3 73.4408 346.2339 89.9242 0.1144 525 +527 3 72.4419 345.9227 90.9412 0.1144 526 +528 3 71.3976 345.6001 91.7672 0.1144 527 +529 3 70.3534 345.2764 92.5932 0.1144 528 +530 3 69.3092 344.9538 93.4192 0.1144 529 +531 3 68.265 344.63 94.2455 0.1144 530 +532 3 67.2208 344.3074 95.0715 0.1144 531 +533 3 240.6827 238.4599 38.6478 0.2796 1 +534 3 241.4549 238.6247 40.6739 0.2415 533 +535 3 242.3736 238.4977 43.2348 0.2161 534 +536 3 242.7145 238.993 45.3995 0.2034 535 +537 3 242.528 239.8968 46.7916 0.2669 536 +538 3 242.2191 240.6187 48.3557 0.3051 537 +539 3 242.4628 241.718 48.8544 0.3178 538 +540 3 243.1698 241.964 49.3766 0.3305 539 +541 3 244.2715 242.0384 49.9397 0.3559 540 +542 3 245.3903 241.8519 49.8896 0.3305 541 +543 3 246.5045 241.5956 49.84 0.3178 542 +544 3 247.6039 241.2788 49.8408 0.2796 543 +545 3 248.6987 240.947 49.845 0.3051 544 +546 3 249.781 240.6987 50.4 0.3051 545 +547 3 250.8849 240.8623 50.6097 0.2924 546 +548 3 251.8436 241.3829 51.249 0.2796 547 +549 3 252.8823 241.7627 51.52 0.2796 548 +550 3 253.7586 242.4022 51.8885 0.3051 549 +551 3 254.3615 242.9353 52.92 0.2542 550 +552 3 255.0365 242.9856 52.92 0.2161 551 +553 3 256.1782 243.0439 52.92 0.2288 552 +554 3 257.3165 243.1 53.0754 0.2669 553 +555 3 258.4353 243.1 53.6396 0.2669 554 +556 3 259.5747 243.1 53.7608 0.2924 555 +557 3 260.5654 243.5954 54.04 0.3051 556 +558 3 260.6627 243.839 54.04 0.1525 557 +559 3 261.2255 244.7828 54.04 0.178 558 +560 3 262.0996 245.4795 54.04 0.2161 559 +561 3 262.8786 246.3009 54.04 0.2669 560 +562 3 263.8224 246.9061 54.04 0.2669 561 +563 3 264.844 247.4129 54.04 0.2415 562 +564 3 265.7775 248.0592 54.04 0.2034 563 +565 3 266.8151 248.4768 54.04 0.178 564 +566 3 267.9145 248.7514 54.1671 0.178 565 +567 3 269.0059 249.0808 54.32 0.178 566 +568 3 270.024 249.5808 54.32 0.1907 567 +569 3 271.0308 250.0452 54.7688 0.2034 568 +570 3 272.0318 250.4651 55.4022 0.2161 569 +571 3 272.9492 251.132 55.6083 0.2288 570 +572 3 273.9079 251.6445 56.2598 0.2034 571 +573 3 274.512 252.1399 58.0854 0.1652 572 +574 3 275.1412 252.6581 59.691 0.1271 573 +575 3 275.8825 253.491 59.92 0.1144 574 +576 3 276.4465 254.4325 60.0603 0.1144 575 +577 3 276.5917 255.4644 60.7684 0.1144 576 +578 3 276.6192 256.5706 61.2942 0.1144 577 +579 3 276.7336 257.4069 62.7645 0.1144 578 +580 3 276.6787 258.5326 63.0 0.1144 579 +581 3 276.6192 259.672 63.0 0.1144 580 +582 3 276.3561 260.5746 64.0808 0.1144 581 +583 3 276.1616 261.4566 65.6936 0.1144 582 +584 3 275.8035 262.389 66.4457 0.1144 583 +585 3 275.4649 263.4106 67.3935 0.1144 584 +586 3 275.1263 264.4322 68.3413 0.1144 585 +587 3 274.8082 265.4629 69.2227 0.1271 586 +588 3 274.7751 266.6058 69.2227 0.1398 587 +589 3 274.7682 267.6628 69.7432 0.1525 588 +590 3 274.8357 268.4785 71.6993 0.1398 589 +591 3 275.4901 269.1569 72.8255 0.1271 590 +592 3 276.4007 269.7758 73.593 0.1144 591 +593 3 277.3102 270.3936 74.3607 0.1144 592 +594 3 278.2197 271.0125 75.1282 0.1144 593 +595 3 279.1291 271.6314 75.896 0.1144 594 +596 3 280.0901 272.1965 76.4898 0.1144 595 +597 3 281.0888 272.7216 76.9479 0.1144 596 +598 3 282.0887 273.2455 77.406 0.1144 597 +599 3 283.0874 273.7695 77.8641 0.1144 598 +600 3 284.0872 274.2946 78.3224 0.1144 599 +601 3 285.0859 274.8185 78.7805 0.1144 600 +602 3 286.0858 275.3425 79.2386 0.1144 601 +603 3 287.0857 275.8676 79.6967 0.1144 602 +604 3 288.0844 276.3915 80.155 0.1144 603 +605 3 289.0842 276.9155 80.6131 0.1144 604 +606 3 289.988 277.5939 81.0566 0.1144 605 +607 3 290.8917 278.2711 81.5004 0.1144 606 +608 3 291.7955 278.9484 81.944 0.1144 607 +609 3 292.6993 279.6268 82.3878 0.1144 608 +610 3 293.611 280.2846 82.8509 0.1144 609 +611 3 294.6532 280.6392 83.6136 0.1144 610 +612 3 295.6954 280.9927 84.376 0.1144 611 +613 3 296.7376 281.3474 85.1388 0.1144 612 +614 3 297.7798 281.7008 85.9015 0.1144 613 +615 3 298.7613 282.2008 86.5225 0.1144 614 +616 3 299.6719 282.8666 86.9812 0.1144 615 +617 3 300.5826 283.5324 87.4401 0.1144 616 +618 3 301.4943 284.1982 87.8987 0.1144 617 +619 3 302.405 284.864 88.3574 0.1144 618 +620 3 303.3167 285.531 88.816 0.1144 619 +621 3 304.0477 286.3535 89.4768 0.1144 620 +622 3 304.7147 287.2332 90.2101 0.1144 621 +623 3 305.3816 288.113 90.9434 0.1144 622 +624 3 306.0486 288.9927 91.677 0.1144 623 +625 3 306.7156 289.8736 92.4106 0.1144 624 +626 3 307.41 290.7339 93.1157 0.1144 625 +627 3 308.1524 291.5621 93.7706 0.1144 626 +628 3 308.8949 292.3904 94.4255 0.1144 627 +629 3 309.6385 293.2175 95.0804 0.1144 628 +630 3 310.3809 294.0458 95.7354 0.1144 629 +631 3 311.1234 294.874 96.3903 0.1144 630 +632 3 311.867 295.7011 97.0452 0.1398 631 +633 3 312.6094 296.5294 97.7001 0.1652 632 +634 3 260.8698 243.1378 55.44 0.1525 557 +635 3 261.5012 242.2958 55.44 0.1525 634 +636 3 262.3123 241.5716 55.6696 0.1525 635 +637 3 263.2882 241.1792 56.3637 0.1525 636 +638 3 264.1885 240.5386 56.84 0.1398 637 +639 3 264.9641 239.7389 56.847 0.1271 638 +640 3 265.6562 238.858 57.2592 0.1144 639 +641 3 266.4696 238.1682 58.0983 0.1144 640 +642 3 267.4146 237.6019 58.52 0.1144 641 +643 3 268.5105 237.2782 58.52 0.1144 642 +644 3 269.261 236.4877 58.52 0.1271 643 +645 3 270.0195 235.7727 58.8512 0.1398 644 +646 3 270.9312 235.1778 59.5689 0.1652 645 +647 3 271.6336 234.3427 59.92 0.1652 646 +648 3 272.1965 233.4069 60.3764 0.1652 647 +649 3 272.4402 232.4654 61.754 0.1398 648 +650 3 273.0133 231.5891 62.44 0.1398 649 +651 3 273.7958 230.7848 62.44 0.1398 650 +652 3 274.4616 229.9932 62.6772 0.1525 651 +653 3 274.9032 229.2061 64.0926 0.1398 652 +654 3 275.0256 228.0873 64.3922 0.1271 653 +655 3 275.6399 227.219 65.24 0.1144 654 +656 3 276.3504 226.3976 65.814 0.1144 655 +657 3 276.8777 225.4229 66.3289 0.1144 656 +658 3 277.6637 224.6061 66.5552 0.1144 657 +659 3 278.429 223.7996 66.64 0.1144 658 +660 3 279.1063 222.8855 66.64 0.1144 659 +661 3 279.8762 222.0859 67.1698 0.1144 660 +662 3 280.7147 221.3823 67.7331 0.1144 661 +663 3 281.3096 220.5941 68.32 0.1144 662 +664 3 281.9811 219.8574 68.8576 0.1144 663 +665 3 282.7785 219.0611 69.16 0.1144 664 +666 3 283.3391 218.0979 69.44 0.1144 665 +667 3 284.1467 217.3852 69.44 0.1144 666 +668 3 284.7164 216.4059 69.44 0.1144 667 +669 3 285.1534 215.4358 69.6578 0.1144 668 +670 3 285.4852 214.3719 70.2937 0.1144 669 +671 3 285.817 213.308 70.9296 0.1144 670 +672 3 286.1487 212.244 71.5652 0.1144 671 +673 3 286.4793 211.1813 72.2011 0.1144 672 +674 3 286.8111 210.1173 72.837 0.1271 673 +675 3 287.1429 209.0534 73.4726 0.1525 674 +676 3 287.4746 207.9895 74.1084 0.178 675 +677 3 287.8487 206.9336 74.6382 0.178 676 +678 3 288.2846 205.8868 75.0184 0.1525 677 +679 3 288.7193 204.8401 75.399 0.1271 678 +680 3 289.154 203.7933 75.7795 0.1144 679 +681 3 289.5899 202.7477 76.16 0.1144 680 +682 3 290.0246 201.7009 76.5402 0.1144 681 +683 3 290.4605 200.6542 76.9208 0.1144 682 +684 3 290.8952 199.6074 77.3013 0.1144 683 +685 3 291.331 198.5618 77.6815 0.1144 684 +686 3 291.8413 197.5631 77.985 0.1144 685 +687 3 292.6512 196.7543 77.985 0.1144 686 +688 3 293.253 195.8391 78.2849 0.1144 687 +689 3 293.579 194.7797 78.9852 0.1144 688 +690 3 293.905 193.7215 79.6852 0.1144 689 +691 3 294.2311 192.6633 80.3855 0.1144 690 +692 3 294.6063 191.5983 80.7699 0.1144 691 +693 3 295.0056 190.5298 81.0015 0.1144 692 +694 3 295.4048 189.4624 81.233 0.1144 693 +695 3 295.8041 188.3939 81.4646 0.1144 694 +696 3 296.2033 187.3266 81.6962 0.1144 695 +697 3 296.6026 186.2581 81.928 0.1144 696 +698 3 296.9618 185.3314 82.7375 0.1144 697 +699 3 297.3839 184.3259 83.587 0.1144 698 +700 3 297.8049 183.3214 84.4365 0.1144 699 +701 3 298.2271 182.3158 85.286 0.1144 700 +702 3 298.6492 181.3114 86.1356 0.1144 701 +703 3 299.1011 180.3116 86.9193 0.1144 702 +704 3 299.6308 179.3289 87.5336 0.1144 703 +705 3 300.1593 178.3462 88.1476 0.1144 704 +706 3 300.689 177.3635 88.762 0.1271 705 +707 3 301.2175 176.3808 89.376 0.1398 706 +708 3 254.8054 243.9683 52.92 0.1652 551 +709 3 255.3294 244.9842 52.92 0.178 708 +710 3 255.8064 245.9817 53.2 0.2034 709 +711 3 256.5283 246.81 53.2 0.2161 710 +712 3 256.7742 247.9174 53.2165 0.2415 711 +713 3 257.1312 248.9538 53.48 0.2669 712 +714 3 257.8473 249.8153 53.48 0.2924 713 +715 3 258.0864 250.9204 53.48 0.2924 714 +716 3 258.0864 252.0644 53.4951 0.2542 715 +717 3 258.107 253.1649 54.1083 0.2161 716 +718 3 258.2088 254.2654 54.6 0.178 717 +719 3 258.7248 255.2436 54.8688 0.1652 718 +720 3 258.9696 256.3338 54.88 0.1398 719 +721 3 259.4684 257.2822 55.16 0.1525 720 +722 3 259.8802 258.3175 55.3938 0.178 721 +723 3 260.5574 259.2098 55.5794 0.2161 722 +724 3 260.9498 260.2669 55.9868 0.2288 723 +725 3 261.5081 261.2541 56.1061 0.2161 724 +726 3 261.873 262.2998 56.546 0.2034 725 +727 3 262.2528 263.374 56.56 0.1652 726 +728 3 262.5823 264.4653 56.56 0.1652 727 +729 3 262.9919 265.5327 56.56 0.178 728 +730 3 263.2344 266.5966 57.0668 0.2288 729 +731 3 263.263 267.736 57.1318 0.2288 730 +732 3 263.5753 268.7656 57.4 0.2034 731 +733 3 263.7744 269.881 57.4 0.1525 732 +734 3 263.954 271.009 57.4 0.1271 733 +735 3 264.1496 272.1336 57.4 0.1144 734 +736 3 264.5408 273.1483 57.4 0.1271 735 +737 3 265.2616 274.0097 57.7466 0.1525 736 +738 3 266.0143 274.6652 58.8056 0.178 737 +739 3 266.5886 275.4924 59.4961 0.178 738 +740 3 266.8952 276.5345 60.039 0.1525 739 +741 3 266.8952 277.6294 60.5783 0.1271 740 +742 3 266.655 278.707 60.7841 0.1144 741 +743 3 266.1184 279.5833 61.32 0.1144 742 +744 3 266.0075 280.121 63.488 0.1144 743 +745 3 265.9514 280.5568 66.0733 0.1144 744 +746 3 265.6551 281.035 68.2111 0.1144 745 +747 3 264.7685 281.6185 69.2541 0.1144 746 +748 3 263.8808 282.2031 70.2968 0.1144 747 +749 3 263.4792 283.1389 71.2821 0.1144 748 +750 3 263.2218 284.181 72.2501 0.1144 749 +751 3 262.9656 285.2232 73.218 0.1144 750 +752 3 262.7082 286.2654 74.1863 0.1144 751 +753 3 262.6555 287.2996 75.3242 0.1144 752 +754 3 262.6933 288.3303 76.5363 0.1144 753 +755 3 262.7299 289.3611 77.7484 0.1144 754 +756 3 262.7665 290.3918 78.9603 0.1144 755 +757 3 263.4083 291.2098 79.2994 0.1144 756 +758 3 264.2743 291.8024 79.4774 0.1144 757 +759 3 265.0534 291.275 81.0698 0.1144 758 +760 3 265.8336 290.7476 82.6619 0.1144 759 +761 3 266.6126 290.2202 84.2542 0.1144 760 +762 3 267.3917 289.6928 85.8466 0.1144 761 +763 3 268.1708 289.1654 87.439 0.1144 762 +764 3 268.951 288.6381 89.031 0.1144 763 +765 3 269.7941 288.1747 90.4616 0.1144 764 +766 3 270.8466 287.9185 91.359 0.1144 765 +767 3 271.9002 287.6634 92.2564 0.1144 766 +768 3 272.9527 287.4071 93.1538 0.1144 767 +769 3 274.0063 287.152 94.0512 0.1144 768 +770 3 275.0588 286.8958 94.9488 0.1144 769 +771 3 276.1124 286.6406 95.8462 0.1144 770 +772 3 277.1649 286.3844 96.7436 0.1144 771 +773 3 278.2185 286.1293 97.641 0.1144 772 +774 3 279.271 285.873 98.5387 0.1144 773 +775 3 280.2297 286.1052 99.9306 0.1144 774 +776 3 281.1838 286.3592 101.3446 0.1144 775 +777 3 282.139 286.612 102.7586 0.1144 776 +778 3 283.0931 286.866 104.1723 0.1271 777 +779 3 284.0472 287.1188 105.5863 0.1398 778 +780 3 241.6746 240.6633 49.56 0.3051 539 +781 3 240.7376 240.0089 49.56 0.2415 780 +782 3 239.7286 239.4701 49.56 0.2288 781 +783 3 238.7436 238.905 49.56 0.2542 782 +784 3 237.9211 238.111 49.56 0.2924 783 +785 3 237.0871 237.3297 49.56 0.2796 784 +786 3 236.0701 236.8355 49.84 0.2542 785 +787 3 235.1435 236.1742 49.8778 0.2161 786 +788 3 234.5555 235.5542 51.24 0.2415 787 +789 3 233.6574 234.9936 51.5852 0.2542 788 +790 3 233.1175 234.0144 51.8 0.2796 789 +791 3 232.2274 233.3028 51.8686 0.2542 790 +792 3 231.398 232.5946 52.3494 0.2415 791 +793 3 231.088 231.6589 53.2 0.2288 792 +794 3 230.5229 230.834 53.2 0.2415 793 +795 3 229.61 230.1579 53.3341 0.2669 794 +796 3 228.7382 229.5447 54.1635 0.2924 795 +797 3 227.775 228.9888 54.588 0.2796 796 +798 3 226.7465 228.498 54.6 0.2542 797 +799 3 225.6895 228.0598 54.637 0.2415 798 +800 3 224.7274 227.4684 54.9755 0.2542 799 +801 3 223.7241 226.9547 55.3235 0.2542 800 +802 3 222.7002 226.496 55.72 0.2415 801 +803 3 221.6008 226.2317 55.72 0.2288 802 +804 3 220.4717 226.0567 55.72 0.2288 803 +805 3 219.4192 225.7112 56.28 0.2161 804 +806 3 218.4777 225.0866 56.56 0.2161 805 +807 3 217.5133 224.4814 56.56 0.2415 806 +808 3 216.4608 224.081 56.7403 0.3051 807 +809 3 215.6429 223.318 57.1637 0.3432 808 +810 3 214.6464 222.7929 57.4 0.3305 809 +811 3 213.5368 222.5286 57.4 0.2669 810 +812 3 212.8892 222.1488 59.08 0.2034 811 +813 3 212.1422 221.3045 59.08 0.1525 812 +814 3 211.3643 220.4831 59.08 0.1652 813 +815 3 210.599 219.8207 59.08 0.2161 814 +816 3 209.6929 219.2419 59.1007 0.2796 815 +817 3 208.9974 218.7374 60.1138 0.2796 816 +818 3 208.1062 218.3919 61.299 0.2288 817 +819 3 207.1063 217.9778 61.6 0.2034 818 +820 3 206.0939 217.4469 61.6 0.2034 819 +821 3 205.03 217.0809 61.6 0.2288 820 +822 3 204.0633 216.4723 61.6 0.2034 821 +823 3 203.0325 215.9872 61.6 0.1652 822 +824 3 201.9606 215.7115 61.6 0.1271 823 +825 3 201.0443 215.0388 61.6 0.1144 824 +826 3 200.0639 214.4554 61.6 0.1144 825 +827 3 199.0606 213.9452 61.6 0.1271 826 +828 3 198.1991 213.2405 61.6 0.1525 827 +829 3 197.3022 212.5815 61.8377 0.1907 828 +830 3 196.5564 211.7761 61.88 0.2034 829 +831 3 196.1468 210.7442 61.88 0.2034 830 +832 3 195.624 209.8611 61.88 0.178 831 +833 3 195.5817 208.7182 61.88 0.1652 832 +834 3 195.3666 207.6028 61.88 0.1398 833 +835 3 195.2808 206.7162 62.9541 0.1271 834 +836 3 195.2808 205.6111 63.5513 0.1144 835 +837 3 195.2808 204.4717 63.7003 0.1144 836 +838 3 195.2911 203.3426 64.12 0.1144 837 +839 3 195.5474 202.2306 64.12 0.1144 838 +840 3 195.6926 201.1038 64.12 0.1144 839 +841 3 195.9729 199.9964 64.12 0.1271 840 +842 3 196.2578 198.9176 64.12 0.1398 841 +843 3 196.5838 197.8342 64.12 0.1525 842 +844 3 196.6822 196.7028 64.3765 0.1398 843 +845 3 196.768 195.5668 64.4 0.1271 844 +846 3 197.0975 194.599 65.4251 0.1271 845 +847 3 197.1112 193.5168 66.08 0.1398 846 +848 3 197.0952 192.3762 66.1046 0.1525 847 +849 3 196.7783 191.3374 66.8682 0.1525 848 +850 3 196.307 190.5275 67.76 0.1525 849 +851 3 196.0942 189.4086 67.76 0.1525 850 +852 3 195.5657 188.4408 68.32 0.1398 851 +853 3 194.7294 187.7167 68.4536 0.1271 852 +854 3 194.4445 186.6848 69.1807 0.1144 853 +855 3 193.8233 185.7501 69.6508 0.1271 854 +856 3 193.439 184.6851 69.72 0.1398 855 +857 3 193.2239 183.6086 70.2388 0.1525 856 +858 3 193.1221 182.5275 70.56 0.1398 857 +859 3 192.4574 181.8045 70.9923 0.1271 858 +860 3 192.1531 180.7634 71.8796 0.1144 859 +861 3 191.8488 179.7213 72.7672 0.1144 860 +862 3 191.5445 178.6802 73.6548 0.1144 861 +863 3 191.2402 177.6392 74.5424 0.1144 862 +864 3 190.9347 176.597 75.43 0.1144 863 +865 3 190.6304 175.556 76.3174 0.1144 864 +866 3 190.3261 174.5149 77.205 0.1144 865 +867 3 189.8022 173.5402 77.5468 0.1144 866 +868 3 189.1398 172.6067 77.5468 0.1144 867 +869 3 188.4774 171.6744 77.5468 0.1144 868 +870 3 187.8151 170.742 77.5468 0.1144 869 +871 3 186.9193 170.067 77.9691 0.1144 870 +872 3 185.9915 169.4264 78.4476 0.1144 871 +873 3 185.0637 168.7858 78.9261 0.1144 872 +874 3 184.1325 168.144 79.2994 0.1144 873 +875 3 183.1864 167.501 79.2994 0.1144 874 +876 3 182.2392 166.8581 79.2994 0.1144 875 +877 3 181.2931 166.2163 79.2994 0.1144 876 +878 3 180.347 165.5734 79.2994 0.1144 877 +879 3 179.4844 164.8344 79.4066 0.1144 878 +880 3 178.7054 164.0016 79.6208 0.1144 879 +881 3 177.9263 163.1687 79.835 0.1144 880 +882 3 177.1473 162.3359 80.0492 0.1144 881 +883 3 176.3682 161.5031 80.2634 0.1144 882 +884 3 175.588 160.6702 80.4776 0.1271 883 +885 3 174.8089 159.8362 80.6921 0.1398 884 +886 3 174.0299 159.0034 80.9063 0.1525 885 +887 3 173.2519 158.1752 81.1983 0.1398 886 +888 3 172.4763 157.3549 81.6564 0.1271 887 +889 3 171.7007 156.5358 82.1145 0.1144 888 +890 3 170.925 155.7156 82.5726 0.1144 889 +891 3 170.1483 154.8965 83.0304 0.1144 890 +892 3 169.3726 154.0762 83.4884 0.1144 891 +893 3 168.597 153.2571 83.9465 0.1144 892 +894 3 167.8214 152.4369 84.4046 0.1144 893 +895 3 167.0457 151.6178 84.8627 0.1144 894 +896 3 166.0848 151.0572 85.2944 0.1144 895 +897 3 165.0495 150.603 85.7158 0.1144 896 +898 3 164.0141 150.1477 86.137 0.1144 897 +899 3 162.9239 149.8468 86.3092 0.1144 898 +900 3 161.7971 149.6512 86.3092 0.1144 899 +901 3 160.6714 149.4808 86.3092 0.1144 900 +902 3 159.58 149.8251 86.3092 0.1144 901 +903 3 158.4715 149.5711 86.3092 0.1144 902 +904 3 157.6226 148.9133 86.5875 0.1144 903 +905 3 156.9374 148.0153 87.0402 0.1144 904 +906 3 156.2521 147.1184 87.4927 0.1144 905 +907 3 155.5668 146.2215 87.9455 0.1144 906 +908 3 154.8816 145.3235 88.398 0.1144 907 +909 3 154.1963 144.4266 88.8507 0.1144 908 +910 3 153.5111 143.5297 89.3035 0.1144 909 +911 3 152.827 142.6316 89.756 0.1144 910 +912 3 152.1417 141.7347 90.2087 0.1144 911 +913 3 151.4564 140.8378 90.6615 0.1144 912 +914 3 150.7712 139.9398 91.114 0.1271 913 +915 3 150.0859 139.0429 91.5667 0.1398 914 +916 3 241.9972 239.7961 42.4637 0.2288 534 +917 3 242.0429 240.9378 42.4147 0.2796 916 +918 3 241.9125 242.0693 42.4371 0.3178 917 +919 3 241.5556 243.1538 42.3444 0.3559 918 +920 3 241.2627 244.2451 41.9922 0.3432 919 +921 3 241.1552 245.3823 41.946 0.3432 920 +922 3 241.1552 246.5171 41.6836 0.3305 921 +923 3 241.1552 247.6291 41.0589 0.3686 922 +924 3 241.1495 248.7708 40.88 0.4068 923 +925 3 241.1174 249.9137 40.88 0.4322 924 +926 3 241.0008 251.0508 40.88 0.4195 925 +927 3 240.8349 252.1811 40.8814 0.394 926 +928 3 240.8532 253.3159 40.8915 0.3813 927 +929 3 241.1312 254.4256 40.9223 0.3559 928 +930 3 241.4057 254.8546 41.0052 0.3432 929 +931 3 241.9263 255.8373 41.4901 0.3432 930 +932 3 242.353 256.8051 42.5244 0.3178 931 +933 3 242.9181 257.7649 43.0377 0.2796 932 +934 3 243.4958 258.7442 42.8288 0.2796 933 +935 3 243.934 259.7669 42.3074 0.3051 934 +936 3 244.2085 260.8663 42.049 0.3305 935 +937 3 244.5998 261.9325 42.2979 0.3559 936 +938 3 245.0517 262.9598 42.8252 0.3686 937 +939 3 245.5241 263.9906 43.1113 0.3686 938 +940 3 245.9554 265.0499 43.066 0.3432 939 +941 3 246.421 266.0852 42.8109 0.3178 940 +942 3 246.9896 267.0531 42.2999 0.3178 941 +943 3 247.6314 267.9877 42.0118 0.3305 942 +944 3 248.2995 268.9144 42.0109 0.3432 943 +945 3 248.9973 269.8181 42.058 0.3305 944 +946 3 249.6448 270.7493 42.3279 0.3051 945 +947 3 250.1505 271.7172 42.4556 0.2669 946 +948 3 250.2042 272.8268 42.0574 0.2542 947 +949 3 250.0509 273.9594 42.0 0.2415 948 +950 3 250.131 275.0794 41.9994 0.2542 949 +951 3 250.4365 276.181 41.9969 0.2415 950 +952 3 250.6641 277.301 41.9787 0.2669 951 +953 3 250.7648 278.4359 41.8659 0.2542 952 +954 3 250.7659 279.5581 41.405 0.2415 953 +955 3 250.7717 280.677 40.9312 0.1907 954 +956 3 250.8117 281.8187 40.88 0.1907 955 +957 3 251.0245 282.9329 40.88 0.2161 956 +958 3 251.4535 283.9923 40.88 0.2542 957 +959 3 251.8974 285.0448 40.88 0.2415 958 +960 3 252.1708 286.1476 40.88 0.2034 959 +961 3 252.4087 287.2595 40.88 0.1652 960 +962 3 252.7588 288.3486 40.8811 0.1652 961 +963 3 252.9887 289.464 40.8873 0.2034 962 +964 3 253.0379 290.6046 40.9391 0.2415 963 +965 3 253.0459 291.7463 40.9116 0.2669 964 +966 3 253.0539 292.8903 40.9035 0.2542 965 +967 3 253.0608 294.032 41.0455 0.2542 966 +968 3 253.1066 295.1428 41.6777 0.2669 967 +969 3 253.4257 296.2194 41.4974 0.2796 968 +970 3 253.8822 297.2432 40.9441 0.2669 969 +971 3 254.381 298.2694 40.88 0.2288 970 +972 3 254.8798 299.299 40.88 0.2161 971 +973 3 255.3683 300.3332 40.88 0.2288 972 +974 3 255.7675 301.4051 40.88 0.2415 973 +975 3 256.0352 302.5159 40.88 0.2415 974 +976 3 256.24 303.6416 40.88 0.2034 975 +977 3 256.256 304.7845 40.88 0.1907 976 +978 3 256.2549 305.9285 40.88 0.1907 977 +979 3 256.2457 307.0725 40.8794 0.2415 978 +980 3 256.1839 308.2142 40.8766 0.3051 979 +981 3 255.8716 309.3124 40.8587 0.3559 980 +982 3 255.5307 310.4038 40.7509 0.394 981 +983 3 255.4415 311.5192 40.2097 0.4068 982 +984 3 255.4941 312.6312 39.9403 0.4068 983 +985 3 255.7515 313.7271 40.3894 0.394 984 +986 3 255.9975 314.8208 40.8551 0.3686 985 +987 3 256.1874 315.9373 40.9156 0.3686 986 +988 3 255.978 317.0379 41.2118 0.3305 987 +989 3 255.5742 318.0881 41.7043 0.2924 988 +990 3 255.0823 319.1062 42.0538 0.2161 989 +991 3 254.9015 320.2193 42.4514 0.2034 990 +992 3 254.8832 321.345 42.9346 0.2288 991 +993 3 254.8821 322.4581 42.3979 0.2924 992 +994 3 254.8775 323.5976 42.28 0.3178 993 +995 3 254.8317 324.6958 42.9554 0.3051 994 +996 3 254.6338 325.7963 43.4034 0.2796 995 +997 3 254.1842 326.8271 43.8948 0.2669 996 +998 3 253.7678 327.8727 43.8463 0.2415 997 +999 3 253.6843 328.9526 43.2625 0.2288 998 +1000 3 254.0881 330.0085 43.0408 0.2034 999 +1001 3 254.7036 330.9546 42.7059 0.2161 1000 +1002 3 255.2195 331.903 42.0913 0.2161 1001 +1003 3 255.3282 333.0378 41.9972 0.2542 1002 +1004 3 255.247 334.1761 41.9821 0.2924 1003 +1005 3 254.961 335.2767 41.8956 0.3305 1004 +1006 3 254.5789 336.3326 41.5209 0.3559 1005 +1007 3 254.4439 337.4308 40.9612 0.3559 1006 +1008 3 254.5503 338.5645 40.9083 0.3559 1007 +1009 3 254.786 339.6811 41.0337 0.3432 1008 +1010 3 254.8866 340.7804 41.6478 0.3559 1009 +1011 3 254.9107 341.8901 42.2962 0.3686 1010 +1012 3 255.1314 342.9563 43.1029 0.3686 1011 +1013 3 255.3133 344.0706 43.2737 0.3305 1012 +1014 3 255.3442 345.2123 43.1642 0.2796 1013 +1015 3 255.3602 346.3552 43.2387 0.2415 1014 +1016 3 255.4701 347.4603 43.8556 0.2415 1015 +1017 3 255.7286 348.5276 44.6281 0.2542 1016 +1018 3 255.8007 349.6293 45.3202 0.2669 1017 +1019 3 255.8396 350.7607 45.6966 0.2924 1018 +1020 3 256.0741 351.8681 45.4474 0.3305 1019 +1021 3 256.5466 352.9057 45.4188 0.3686 1020 +1022 3 257.0122 353.9433 45.7064 0.3686 1021 +1023 3 257.3462 355.0026 46.3456 0.3432 1022 +1024 3 257.591 356.1158 46.4738 0.3051 1023 +1025 3 257.5316 357.2506 46.48 0.2542 1024 +1026 3 257.3062 358.3706 46.4803 0.2288 1025 +1027 3 257.2879 359.502 46.4822 0.2034 1026 +1028 3 257.6174 360.5968 46.4932 0.2415 1027 +1029 3 257.9594 361.6756 46.5674 0.2415 1028 +1030 3 257.9297 362.791 46.916 0.2796 1029 +1031 3 257.5556 363.8355 47.5132 0.2669 1030 +1032 3 257.1998 364.9005 47.6694 0.3178 1031 +1033 3 257.1712 366.0251 48.0399 0.3432 1032 +1034 3 257.1678 367.0799 49.0921 0.3813 1033 +1035 3 257.1449 368.1083 50.2642 0.3559 1034 +1036 3 257.0065 369.2054 50.5201 0.3178 1035 +1037 3 256.6278 370.2579 50.2874 0.2542 1036 +1038 3 256.3201 371.3149 50.7184 0.2288 1037 +1039 3 256.4837 372.4223 50.9897 0.2161 1038 +1040 3 257.0259 373.4005 51.2366 0.2542 1039 +1041 3 257.7649 374.2459 51.774 0.2542 1040 +1042 3 258.0875 375.3338 52.0772 0.2669 1041 +1043 3 258.2019 376.4721 52.0836 0.2542 1042 +1044 3 258.7019 377.5006 52.1004 0.2924 1043 +1045 3 259.3128 378.4638 52.1906 0.3051 1044 +1046 3 259.3414 379.5803 52.7772 0.3178 1045 +1047 3 259.0336 380.666 53.1936 0.2924 1046 +1048 3 258.973 381.8089 53.1558 0.2669 1047 +1049 3 258.8071 382.9288 52.8713 0.2415 1048 +1050 3 258.5486 383.9001 51.6541 0.2288 1049 +1051 3 258.5749 385.0235 52.1587 0.2288 1050 +1052 3 258.695 386.1023 52.8917 0.2288 1051 +1053 3 258.981 387.1788 52.6616 0.2161 1052 +1054 3 259.1023 388.2404 53.4971 0.2288 1053 +1055 3 259.3745 389.3158 53.0928 0.2288 1054 +1056 3 259.2487 390.4335 53.076 0.2542 1055 +1057 3 258.4879 391.2606 53.2053 0.2288 1056 +1058 3 257.7695 392.1495 53.2804 0.2161 1057 +1059 3 257.5293 393.2443 53.7457 0.1907 1058 +1060 3 257.2101 394.3357 53.5021 0.1907 1059 +1061 3 257.1518 395.4648 53.0905 0.178 1060 +1062 3 256.9207 396.5356 52.3426 0.1652 1061 +1063 3 256.7525 397.3615 52.7078 0.178 1062 +1064 3 256.7033 398.4998 52.5518 0.2034 1063 +1065 3 256.645 399.6186 53.0986 0.2288 1064 +1066 3 256.4436 400.7386 53.1997 0.2288 1065 +1067 3 256.5614 401.8689 53.1983 0.2288 1066 +1068 3 256.2148 402.9568 53.1882 0.2288 1067 +1069 3 255.7057 403.9716 53.1331 0.2161 1068 +1070 3 255.6131 405.0904 52.7808 0.2161 1069 +1071 3 254.9084 405.9576 52.7556 0.1271 1070 +1072 3 254.0069 406.3477 53.9748 0.1525 1071 +1073 3 253.2004 407.1393 54.3497 0.1907 1072 +1074 3 252.4362 407.9859 54.4796 0.2034 1073 +1075 3 251.7418 408.8782 54.885 0.1907 1074 +1076 3 251.0748 409.7728 55.0449 0.1525 1075 +1077 3 250.4536 410.6788 54.2718 0.1271 1076 +1078 3 249.7844 411.4785 54.2175 0.1144 1077 +1079 3 249.0499 412.2118 55.2782 0.1144 1078 +1080 3 248.5329 413.1922 55.8146 0.1398 1079 +1081 3 248.0158 414.176 55.9532 0.178 1080 +1082 3 247.2962 415.0592 55.7525 0.2415 1081 +1083 3 246.5892 415.955 55.6077 0.2669 1082 +1084 3 245.8273 416.7821 55.9518 0.2796 1083 +1085 3 245.0425 417.5852 56.4718 0.2415 1084 +1086 3 244.2795 418.4249 56.7983 0.2161 1085 +1087 3 243.5896 419.3126 57.2698 0.1907 1086 +1088 3 242.8518 420.166 57.4882 0.1907 1087 +1089 3 241.9754 420.7643 58.1658 0.178 1088 +1090 3 241.1255 421.4027 58.8 0.1525 1089 +1091 3 240.3327 422.2207 58.8 0.1271 1090 +1092 3 239.6977 423.1496 58.8 0.1144 1091 +1093 3 239.3889 424.2158 58.8 0.1144 1092 +1094 3 238.834 425.2145 58.819 0.1144 1093 +1095 3 238.3021 426.2132 59.08 0.1144 1094 +1096 3 237.5333 427.0049 59.08 0.1144 1095 +1097 3 236.7531 427.8057 59.08 0.1144 1096 +1098 3 236.411 428.8376 59.619 0.1144 1097 +1099 3 235.5187 429.5182 59.64 0.1144 1098 +1100 3 234.774 430.3762 59.64 0.1144 1099 +1101 3 234.1654 431.328 59.64 0.1144 1100 +1102 3 233.9503 432.4423 59.7985 0.1144 1101 +1103 3 233.5831 433.4547 60.5346 0.1271 1102 +1104 3 232.4871 433.7053 60.76 0.1398 1103 +1105 3 232.0032 434.5713 61.035 0.1525 1104 +1106 3 232.0032 435.7153 61.04 0.1398 1105 +1107 3 231.7458 436.7918 61.339 0.1271 1106 +1108 3 231.2928 437.7996 61.8579 0.1144 1107 +1109 3 230.5675 438.676 61.88 0.1144 1108 +1110 3 229.8159 439.5134 61.88 0.1144 1109 +1111 3 228.8572 440.059 61.9853 0.1144 1110 +1112 3 228.0495 440.6768 62.44 0.1144 1111 +1113 3 227.3929 441.5657 62.9698 0.1144 1112 +1114 3 226.663 442.3368 63.5522 0.1144 1113 +1115 3 225.765 443.038 63.56 0.1144 1114 +1116 3 224.8498 443.7198 63.56 0.1144 1115 +1117 3 223.9826 444.4143 64.0192 0.1144 1116 +1118 3 223.1715 445.2059 64.12 0.1144 1117 +1119 3 222.3078 445.9552 64.12 0.1144 1118 +1120 3 221.483 446.7263 64.3986 0.1271 1119 +1121 3 220.6948 447.542 64.4 0.1525 1120 +1122 3 219.68 448.0156 64.5372 0.1907 1121 +1123 3 219.0531 448.6516 65.8 0.2034 1122 +1124 3 218.4205 449.6012 65.8 0.1907 1123 +1125 3 217.6838 450.474 65.8 0.1525 1124 +1126 3 217.0477 451.3721 66.2245 0.1271 1125 +1127 3 216.4334 452.2392 66.64 0.1144 1126 +1128 3 215.7092 453.1212 66.64 0.1144 1127 +1129 3 215.048 454.0502 66.7044 0.1144 1128 +1130 3 214.4611 454.9905 67.34 0.1144 1129 +1131 3 214.0424 455.884 68.32 0.1144 1130 +1132 3 213.6992 456.925 68.32 0.1144 1131 +1133 3 213.3137 457.8208 68.32 0.1144 1132 +1134 3 212.3836 458.1731 68.32 0.1144 1133 +1135 3 211.8894 459.1753 68.5017 0.1271 1134 +1136 3 211.0897 459.9383 68.8246 0.1398 1135 +1137 3 210.385 460.579 70.2822 0.1525 1136 +1138 3 209.7032 461.3146 70.56 0.1525 1137 +1139 3 208.8486 462.0044 70.56 0.1652 1138 +1140 3 208.041 462.8132 70.56 0.2161 1139 +1141 3 207.7504 463.7776 70.28 0.2796 1140 +1142 3 255.8991 405.8008 53.2 0.2034 1070 +1143 3 256.4585 406.7698 53.2 0.2161 1142 +1144 3 256.8131 407.8577 53.2 0.178 1143 +1145 3 257.0374 408.9789 53.2 0.1398 1144 +1146 3 257.2673 410.0908 53.2 0.1144 1145 +1147 3 257.2856 411.2348 53.2 0.1144 1146 +1148 3 257.4 412.3697 53.2 0.1271 1147 +1149 3 257.3222 413.5091 53.2081 0.1398 1148 +1150 3 257.3108 414.6462 53.4486 0.1525 1149 +1151 3 257.392 415.7857 53.48 0.1525 1150 +1152 3 257.2719 416.9216 53.48 0.178 1151 +1153 3 257.1266 418.0554 53.48 0.2161 1152 +1154 3 256.7902 419.1158 53.8745 0.2415 1153 +1155 3 256.7136 420.2473 54.04 0.2161 1154 +1156 3 256.8108 421.381 54.1915 0.1652 1155 +1157 3 256.828 422.5101 54.6176 0.1271 1156 +1158 3 256.828 423.6507 54.8279 0.1144 1157 +1159 3 256.7262 424.7855 54.88 0.1144 1158 +1160 3 256.8131 425.9238 54.88 0.1271 1159 +1161 3 256.828 427.0666 54.88 0.1398 1160 +1162 3 256.7891 428.2095 54.88 0.1525 1161 +1163 3 256.4345 429.2768 54.88 0.1398 1162 +1164 3 256.232 430.4025 54.88 0.1271 1163 +1165 3 255.9643 431.5122 54.88 0.1144 1164 +1166 3 255.3763 432.4915 54.88 0.1144 1165 +1167 3 254.9347 433.5257 54.88 0.1144 1166 +1168 3 254.1762 434.3493 54.88 0.1144 1167 +1169 3 253.968 435.4567 54.88 0.1144 1168 +1170 3 253.7381 436.5561 54.8772 0.1144 1169 +1171 3 253.4269 437.6452 54.6 0.1398 1170 +1172 3 253.2816 438.7629 54.332 0.1652 1171 +1173 3 253.2816 439.9069 54.32 0.1907 1172 +1174 3 253.2816 441.0463 54.474 0.1652 1173 +1175 3 253.2816 442.1857 54.6 0.1398 1174 +1176 3 253.2816 443.3297 54.6 0.1144 1175 +1177 3 253.3171 444.4726 54.6 0.1144 1176 +1178 3 253.4635 445.604 54.49 0.1144 1177 +1179 3 253.5127 446.7389 54.2696 0.1144 1178 +1180 3 253.6248 447.8119 53.48 0.1144 1179 +1181 3 253.6248 448.9559 53.48 0.1144 1180 +1182 3 253.6248 450.0999 53.48 0.1144 1181 +1183 3 253.6248 451.2348 53.76 0.1144 1182 +1184 3 253.6248 452.3788 53.76 0.1144 1183 +1185 3 253.6248 453.5228 53.76 0.1144 1184 +1186 3 253.6248 454.6668 53.76 0.1144 1185 +1187 3 253.6248 455.8108 53.76 0.1144 1186 +1188 3 253.6248 456.9548 53.76 0.1144 1187 +1189 3 253.6248 458.0931 53.655 0.1144 1188 +1190 3 253.7369 459.0723 52.6481 0.1144 1189 +1191 3 253.7392 460.2152 52.64 0.1144 1190 +1192 3 253.7392 461.3592 52.64 0.1144 1191 +1193 3 253.7392 462.5032 52.64 0.1144 1192 +1194 3 253.7392 463.6472 52.64 0.1144 1193 +1195 3 253.7392 464.7912 52.64 0.1144 1194 +1196 3 253.7392 465.9352 52.694 0.1144 1195 +1197 3 253.7392 467.0746 52.92 0.1144 1196 +1198 3 253.7278 468.2175 52.9298 0.1144 1197 +1199 3 253.3331 468.937 54.32 0.1144 1198 +1200 3 253.1672 470.0559 54.1615 0.1144 1199 +1201 3 253.1672 471.1976 54.04 0.1144 1200 +1202 3 253.4829 472.234 53.366 0.1144 1201 +1203 3 253.7266 473.3071 52.92 0.1144 1202 +1204 3 253.7392 474.45 52.92 0.1144 1203 +1205 3 253.7392 475.594 52.92 0.1144 1204 +1206 3 253.7392 476.7288 53.2 0.1144 1205 +1207 3 253.7632 477.8728 53.2 0.1144 1206 +1208 3 254.0538 478.9631 53.3014 0.1144 1207 +1209 3 254.206 480.0647 53.48 0.1144 1208 +1210 3 254.4004 481.1904 53.48 0.1144 1209 +1211 3 254.4256 482.2944 54.0212 0.1144 1210 +1212 3 254.4313 483.4086 54.5112 0.1144 1211 +1213 3 254.8363 484.4485 54.6 0.1144 1212 +1214 3 255.1944 485.5205 54.6 0.1144 1213 +1215 3 255.2264 486.6622 54.6 0.1144 1214 +1216 3 255.2264 487.805 54.5437 0.1398 1215 +1217 3 255.2264 488.9433 54.2685 0.1907 1216 +1218 3 255.2424 489.9683 53.1927 0.2542 1217 +1219 3 255.6989 490.9716 52.64 0.2669 1218 +1220 3 256.1244 492.0344 52.64 0.2288 1219 +1221 3 256.1244 493.1773 52.64 0.178 1220 +1222 3 256.0283 494.3167 52.64 0.1652 1221 +1223 3 255.7801 495.4309 52.64 0.178 1222 +1224 3 255.5696 496.5292 52.9197 0.178 1223 +1225 3 255.5696 497.6526 53.2 0.1525 1224 +1226 3 255.6954 498.7737 53.2 0.1271 1225 +1227 3 256.256 499.7038 53.7107 0.1144 1226 +1228 3 256.2938 500.5766 52.08 0.1144 1227 +1229 3 256.2434 500.7414 52.36 0.1144 1228 +1230 3 256.3841 500.969 52.36 0.1271 1229 +1231 3 256.5992 502.065 52.36 0.1398 1230 +1232 3 256.5992 503.2033 52.5294 0.1652 1231 +1233 3 256.5992 504.3438 52.64 0.1652 1232 +1234 3 256.6839 505.4753 52.7649 0.1652 1233 +1235 3 257.1254 506.5014 52.92 0.1525 1234 +1236 3 257.4538 507.5951 52.92 0.1525 1235 +1237 3 257.9857 508.5778 52.92 0.1525 1236 +1238 3 258.6996 509.3752 53.0505 0.1652 1237 +1239 3 259.2773 510.3556 53.2459 0.178 1238 +1240 3 259.8024 511.2502 53.9904 0.2034 1239 +1241 3 259.783 512.3278 54.6 0.2034 1240 +1242 3 259.4592 513.2705 55.16 0.2034 1241 +1243 3 259.5084 514.411 55.16 0.178 1242 +1244 3 259.7887 515.5047 55.16 0.1525 1243 +1245 3 259.6686 516.6418 55.16 0.1271 1244 +1246 3 259.5736 517.7813 55.16 0.1144 1245 +1247 3 259.4786 518.9173 55.16 0.1144 1246 +1248 3 259.4592 520.0601 55.16 0.1144 1247 +1249 3 259.4592 521.2041 55.16 0.1144 1248 +1250 3 259.4592 522.3481 55.16 0.1144 1249 +1251 3 259.4592 523.4921 55.16 0.1144 1250 +1252 3 259.4592 524.5194 56.1921 0.1144 1251 +1253 3 259.4592 525.6325 56.56 0.1144 1252 +1254 3 259.3036 526.764 56.56 0.1144 1253 +1255 3 259.116 527.8896 56.5799 0.1144 1254 +1256 3 259.116 529.0073 57.0494 0.1144 1255 +1257 3 259.076 530.1445 57.12 0.1144 1256 +1258 3 258.7625 531.237 57.12 0.1144 1257 +1259 3 258.5474 532.3421 57.12 0.1144 1258 +1260 3 258.544 533.3271 58.2722 0.1144 1259 +1261 3 258.504 534.4299 58.9375 0.1144 1260 +1262 3 258.4113 535.559 59.08 0.1144 1261 +1263 3 258.0006 536.5932 59.08 0.1144 1262 +1264 3 257.972 537.7349 59.08 0.1144 1263 +1265 3 257.9011 538.8274 59.6008 0.1144 1264 +1266 3 257.4583 539.7644 60.7578 0.1144 1265 +1267 3 257.1277 540.8283 61.04 0.1144 1266 +1268 3 256.7159 541.8945 61.0708 0.1144 1267 +1269 3 256.7136 542.9996 61.6 0.1144 1268 +1270 3 256.4848 543.8873 62.5806 0.1144 1269 +1271 3 256.4848 545.0233 62.72 0.1144 1270 +1272 3 256.4848 546.1673 62.72 0.1144 1271 +1273 3 256.4848 547.1946 63.6913 0.1144 1272 +1274 3 256.4848 548.3055 64.12 0.1144 1273 +1275 3 256.4848 549.4495 64.12 0.1144 1274 +1276 3 256.5123 550.5923 64.12 0.1271 1275 +1277 3 256.7136 551.7077 64.12 0.1525 1276 +1278 3 257.1357 552.6767 64.4815 0.178 1277 +1279 3 257.7993 553.4317 65.52 0.178 1278 +1280 3 258.1836 554.4934 65.52 0.1525 1279 +1281 3 258.5703 555.5664 65.52 0.1271 1280 +1282 3 258.7579 556.6944 65.52 0.1144 1281 +1283 3 259.3002 557.6645 65.52 0.1144 1282 +1284 3 259.4592 558.7593 65.52 0.1144 1283 +1285 3 259.4592 559.9033 65.52 0.1144 1284 +1286 3 259.7498 560.7865 65.8423 0.1144 1285 +1287 3 259.9683 561.8127 66.9578 0.1144 1286 +1288 3 260.1868 562.84 68.0733 0.1144 1287 +1289 3 260.4053 563.8662 69.1888 0.1144 1288 +1290 3 260.6226 564.8923 70.3044 0.1144 1289 +1291 3 260.8412 565.9185 71.4199 0.1144 1290 +1292 3 260.8023 567.0007 72.0658 0.1144 1291 +1293 3 260.6009 568.1173 72.4156 0.1144 1292 +1294 3 260.3996 569.235 72.7653 0.1144 1293 +1295 3 260.1971 570.3515 73.115 0.1144 1294 +1296 3 259.9957 571.468 73.4644 0.1144 1295 +1297 3 259.7944 572.5857 73.8142 0.1144 1296 +1298 3 259.593 573.7023 74.1639 0.1144 1297 +1299 3 259.3917 574.82 74.5136 0.1144 1298 +1300 3 259.1892 575.9365 74.8633 0.1144 1299 +1301 3 258.9879 577.053 75.213 0.1144 1300 +1302 3 258.6481 578.1318 75.511 0.1144 1301 +1303 3 258.2122 579.1843 75.7733 0.1144 1302 +1304 3 257.7764 580.2368 76.0357 0.1144 1303 +1305 3 257.3405 581.2893 76.298 0.1144 1304 +1306 3 256.9046 582.3418 76.5604 0.1144 1305 +1307 3 256.7445 583.4457 76.6083 0.1144 1306 +1308 3 256.7822 584.5886 76.5005 0.1144 1307 +1309 3 256.8211 585.7314 76.3924 0.1144 1308 +1310 3 256.86 586.8731 76.2846 0.1144 1309 +1311 3 256.8989 588.016 76.1768 0.1144 1310 +1312 3 256.9378 589.1589 76.0687 0.1144 1311 +1313 3 256.9756 590.3006 75.9609 0.1144 1312 +1314 3 257.0145 591.4434 75.8531 0.1144 1313 +1315 3 257.0534 592.5863 75.745 0.1144 1314 +1316 3 257.0923 593.728 75.6372 0.1144 1315 +1317 3 257.1312 594.8708 75.5292 0.1144 1316 +1318 3 257.1701 596.0137 75.4214 0.1144 1317 +1319 3 256.9733 597.0994 75.3561 0.1271 1318 +1320 3 256.6106 598.1187 75.3561 0.1525 1319 +1321 3 256.7548 599.2409 75.4191 0.178 1320 +1322 3 256.7742 600.3849 75.521 0.178 1321 +1323 3 256.7948 601.5278 75.6227 0.1525 1322 +1324 3 256.8143 602.6706 75.7243 0.1271 1323 +1325 3 256.8337 603.8135 75.826 0.1144 1324 +1326 3 256.8543 604.9564 75.9276 0.1144 1325 +1327 3 256.8738 606.1004 76.0292 0.1144 1326 +1328 3 256.8944 607.2432 76.1309 0.1271 1327 +1329 3 256.9138 608.3861 76.2325 0.1652 1328 +1330 3 256.5981 500.8398 52.08 0.2034 1228 +1331 3 256.828 501.93 52.0551 0.2034 1330 +1332 3 256.828 503.034 51.3906 0.2034 1331 +1333 3 256.828 504.1722 51.24 0.1652 1332 +1334 3 257.0374 505.1984 50.96 0.1398 1333 +1335 3 257.273 506.2909 50.68 0.1144 1334 +1336 3 257.6288 507.3057 50.68 0.1144 1335 +1337 3 258.0258 507.9268 49.2192 0.1271 1336 +1338 3 258.544 508.5492 47.6896 0.1525 1337 +1339 3 258.5509 509.6566 47.1794 0.178 1338 +1340 3 258.8758 510.6793 46.48 0.178 1339 +1341 3 258.8872 511.8233 46.48 0.1652 1340 +1342 3 258.8426 512.8094 45.3306 0.1525 1341 +1343 3 258.7728 513.8139 44.151 0.1525 1342 +1344 3 258.671 514.943 43.958 0.1398 1343 +1345 3 258.5612 516.047 43.5095 0.1271 1344 +1346 3 258.1974 517.0319 42.84 0.1271 1345 +1347 3 258.0406 518.1645 42.84 0.1652 1346 +1348 3 257.972 519.3028 42.7512 0.2034 1347 +1349 3 257.6094 520.3324 42.009 0.2161 1348 +1350 3 257.4847 521.4546 41.72 0.1907 1349 +1351 3 257.4046 522.5906 41.6326 0.2034 1350 +1352 3 257.7226 523.6523 41.3837 0.2542 1351 +1353 3 258.3678 524.5206 40.8456 0.3051 1352 +1354 3 258.6584 525.422 40.0632 0.2796 1353 +1355 3 258.6859 526.5649 40.04 0.2288 1354 +1356 3 259.1926 527.5327 39.7222 0.1907 1355 +1357 3 259.7978 528.4594 39.2613 0.1907 1356 +1358 3 260.3321 529.4283 38.92 0.1652 1357 +1359 3 260.3744 530.5678 38.8805 0.1398 1358 +1360 3 260.387 531.6809 38.36 0.1144 1359 +1361 3 260.7759 532.7368 38.36 0.1144 1360 +1362 3 261.2873 533.4964 37.4413 0.1144 1361 +1363 3 261.404 534.4619 36.4 0.1144 1362 +1364 3 261.8799 535.4881 36.4 0.1144 1363 +1365 3 261.976 536.6092 36.3927 0.1271 1364 +1366 3 261.976 537.68 35.7056 0.1525 1365 +1367 3 262.4714 538.6089 35.28 0.178 1366 +1368 3 263.2172 539.4463 34.9297 0.178 1367 +1369 3 264.1004 540.0847 34.72 0.1525 1368 +1370 3 265.0351 540.6796 34.72 0.1398 1369 +1371 3 265.5647 541.6646 34.4669 0.1398 1370 +1372 3 266.0269 542.6678 33.88 0.1525 1371 +1373 3 266.7305 543.3886 33.0394 0.1398 1372 +1374 3 267.2258 544.1585 31.645 0.1271 1373 +1375 3 268.077 544.7922 31.8298 0.1144 1374 +1376 3 268.848 545.5221 32.2 0.1144 1375 +1377 3 268.9544 546.6032 31.92 0.1144 1376 +1378 3 241.0259 254.9621 40.3556 0.4195 929 +1379 3 240.7491 255.9963 39.4316 0.3559 1378 +1380 3 240.1965 256.947 38.8573 0.2924 1379 +1381 3 239.342 257.6929 38.6224 0.2669 1380 +1382 3 238.492 258.4559 38.5112 0.2669 1381 +1383 3 237.6397 259.2064 38.2323 0.2415 1382 +1384 3 236.776 259.9202 38.523 0.2034 1383 +1385 3 235.7715 260.4099 38.729 0.178 1384 +1386 3 234.8518 261.0002 38.1262 0.1907 1385 +1387 3 234.0601 261.7918 37.6088 0.2415 1386 +1388 3 233.1621 262.4874 37.4693 0.2669 1387 +1389 3 232.2309 263.1394 37.1731 0.2796 1388 +1390 3 231.2585 263.6771 36.5442 0.2415 1389 +1391 3 230.2918 264.272 36.3698 0.2288 1390 +1392 3 229.3068 264.8497 36.2247 0.2161 1391 +1393 3 228.4122 265.4904 35.5292 0.2288 1392 +1394 3 227.5633 266.2385 35.2262 0.2161 1393 +1395 3 226.7923 267.0771 34.9933 0.2034 1394 +1396 3 226.2203 267.9969 34.1695 0.1907 1395 +1397 3 225.6826 268.943 33.3029 0.1907 1396 +1398 3 225.0946 269.9119 33.0593 0.1907 1397 +1399 3 224.5615 270.9232 33.0366 0.2034 1398 +1400 3 224.049 271.946 33.0215 0.2288 1399 +1401 3 223.5662 272.9824 32.9342 0.2542 1400 +1402 3 223.3237 274.0715 32.4075 0.2669 1401 +1403 3 223.2299 275.2052 32.4461 0.2669 1402 +1404 3 222.9805 276.3149 32.69 0.2542 1403 +1405 3 223.1132 277.4028 32.0418 0.2415 1404 +1406 3 222.921 278.5171 31.8049 0.2034 1405 +1407 3 222.3067 279.4517 31.2903 0.2034 1406 +1408 3 221.5676 280.3029 30.8081 0.2161 1407 +1409 3 220.6307 280.9515 30.6561 0.2542 1408 +1410 3 219.799 281.6825 29.967 0.2542 1409 +1411 3 218.8792 282.3529 29.6834 0.2415 1410 +1412 3 217.8645 282.8792 29.6657 0.2542 1411 +1413 3 216.8681 283.442 29.5963 0.2924 1412 +1414 3 216.0078 284.1742 29.1654 0.3305 1413 +1415 3 215.3019 285.0001 28.2937 0.3432 1414 +1416 3 214.8524 285.9725 27.3112 0.3559 1415 +1417 3 214.1339 286.691 26.0282 0.3813 1416 +1418 3 213.3205 287.2962 24.7307 0.3813 1417 +1419 3 212.5998 287.9254 23.2058 0.3305 1418 +1420 3 211.9386 288.7422 22.1634 0.2415 1419 +1421 3 211.2602 289.6562 22.3306 0.178 1420 +1422 3 210.5692 290.5451 21.8576 0.178 1421 +1423 3 209.8554 291.3459 20.9138 0.1907 1422 +1424 3 209.0317 291.8859 19.5966 0.2034 1423 +1425 3 208.073 292.0003 18.1381 0.178 1424 +1426 3 207.6223 292.856 17.92 0.1652 1425 +1427 3 207.1212 293.8055 17.92 0.1525 1426 +1428 3 206.1797 294.4347 17.712 0.1398 1427 +1429 3 205.3366 295.1108 16.8314 0.1398 1428 +1430 3 204.5975 295.9436 16.6172 0.1652 1429 +1431 3 203.9432 296.6804 17.64 0.2161 1430 +1432 3 203.2579 297.4423 18.1815 0.2415 1431 +1433 3 202.6779 298.3563 17.6616 0.2288 1432 +1434 3 202.385 299.3837 16.8328 0.1907 1433 +1435 3 201.9904 300.4338 16.52 0.178 1434 +1436 3 201.511 301.4612 16.2582 0.178 1435 +1437 3 201.2296 302.5651 16.2014 0.1907 1436 +1438 3 200.7159 303.398 15.4339 0.1907 1437 +1439 3 199.9758 304.2239 14.8506 0.1907 1438 +1440 3 199.3992 305.1048 14.28 0.1907 1439 +1441 3 241.813 228.7279 37.5626 0.3686 1 +1442 3 242.3976 227.7658 37.7896 0.4449 1441 +1443 3 242.8586 226.7397 38.2886 0.4322 1442 +1444 3 243.275 225.6952 38.6366 0.3686 1443 +1445 3 243.4272 224.5752 38.7629 0.3432 1444 +1446 3 243.3471 223.461 39.2529 0.3686 1445 +1447 3 242.9936 222.4325 39.8796 0.4068 1446 +1448 3 242.4811 221.467 40.6227 0.4068 1447 +1449 3 242.234 220.4419 41.6968 0.394 1448 +1450 3 242.6756 219.4158 42.2038 0.4068 1449 +1451 3 243.219 218.4502 42.8907 0.4322 1450 +1452 3 243.5954 217.3737 43.1203 0.4576 1451 +1453 3 244.5037 215.9918 43.1284 0.2542 1452 +1454 3 245.3972 215.2916 43.1791 0.2924 1453 +1455 3 246.429 214.8054 43.3756 0.3051 1454 +1456 3 247.1063 214.174 44.24 0.2415 1455 +1457 3 247.8934 213.4555 44.24 0.178 1456 +1458 3 248.693 212.6582 44.24 0.1271 1457 +1459 3 249.527 211.9798 44.24 0.1144 1458 +1460 3 250.6069 211.648 44.24 0.1144 1459 +1461 3 251.3974 210.8472 43.9852 0.1144 1460 +1462 3 252.3458 210.2386 43.68 0.1525 1461 +1463 3 253.2816 209.5808 43.68 0.2415 1462 +1464 3 253.4944 209.4344 43.68 0.1144 1463 +1465 3 254.2609 208.7251 43.12 0.1144 1464 +1466 3 255.2127 208.208 43.12 0.1271 1465 +1467 3 256.0535 207.7424 42.5779 0.1398 1466 +1468 3 256.6095 206.7677 42.4074 0.1525 1467 +1469 3 257.1426 205.7804 42.28 0.1398 1468 +1470 3 257.8336 204.8915 42.0 0.1271 1469 +1471 3 258.4605 203.9363 42.0 0.1398 1470 +1472 3 259.2178 203.084 42.0 0.1907 1471 +1473 3 260.0015 202.2592 42.0 0.2415 1472 +1474 3 260.943 201.7524 41.8981 0.2542 1473 +1475 3 261.4909 201.4012 39.9728 0.2161 1474 +1476 3 262.4794 200.8956 39.76 0.1907 1475 +1477 3 263.3259 200.1428 39.76 0.1652 1476 +1478 3 264.1954 199.5159 39.76 0.178 1477 +1479 3 264.6209 198.8238 38.9211 0.1907 1478 +1480 3 264.7605 197.8354 37.5533 0.2288 1479 +1481 3 265.2478 196.9796 36.8018 0.2415 1480 +1482 3 266.2008 196.6021 35.7311 0.2288 1481 +1483 3 266.8975 196.0221 34.3294 0.2034 1482 +1484 3 267.3139 195.1492 32.8378 0.1907 1483 +1485 3 268.0872 194.4834 31.5717 0.1907 1484 +1486 3 268.7599 193.8016 30.0639 0.178 1485 +1487 3 269.3708 193.1026 28.4362 0.178 1486 +1488 3 269.8719 192.1794 27.326 0.1652 1487 +1489 3 270.373 191.2562 26.2161 0.178 1488 +1490 3 270.874 190.3044 25.4108 0.1652 1489 +1491 3 271.3751 189.2759 25.4108 0.1652 1490 +1492 3 271.8075 188.3116 24.6176 0.1652 1491 +1493 3 272.1885 187.3964 23.2201 0.1907 1492 +1494 3 253.4772 209.6986 44.2061 0.2924 1463 +1495 3 254.5068 209.8096 44.8 0.2288 1494 +1496 3 255.6405 209.924 44.8 0.178 1495 +1497 3 256.7845 209.924 44.8 0.1525 1496 +1498 3 257.9285 209.924 44.8 0.1652 1497 +1499 3 259.021 209.9515 45.1455 0.178 1498 +1500 3 260.0175 210.3278 45.6238 0.2034 1499 +1501 3 261.134 210.52 45.92 0.2034 1500 +1502 3 262.2437 210.7248 46.216 0.2034 1501 +1503 3 263.3728 210.7248 46.6763 0.2034 1502 +1504 3 264.4528 210.7248 47.5518 0.2161 1503 +1505 3 265.4629 210.7248 48.6612 0.2288 1504 +1506 3 266.4101 210.3793 49.28 0.2161 1505 +1507 3 267.4008 210.0384 49.8187 0.2034 1506 +1508 3 268.3744 209.9755 51.0804 0.178 1507 +1509 3 269.1821 209.6952 52.7083 0.1652 1508 +1510 3 270.318 209.6952 52.92 0.1525 1509 +1511 3 271.4323 209.5808 53.3932 0.1525 1510 +1512 3 272.5397 209.5316 54.021 0.1398 1511 +1513 3 273.5979 209.2262 54.4026 0.1271 1512 +1514 3 274.4239 208.5432 55.0984 0.1144 1513 +1515 3 275.2521 207.8248 55.9 0.1144 1514 +1516 3 276.0804 207.1075 56.7017 0.1144 1515 +1517 3 276.9361 206.5698 57.9446 0.1271 1516 +1518 3 277.8044 206.1168 59.3914 0.1398 1517 +1519 3 278.6967 205.7164 60.8247 0.1525 1518 +1520 3 279.6554 205.4647 62.2205 0.1398 1519 +1521 3 280.6152 205.213 63.6163 0.1271 1520 +1522 3 281.5739 204.9602 65.0118 0.1144 1521 +1523 3 282.552 204.5758 66.0999 0.1144 1522 +1524 3 283.5335 204.1594 67.1149 0.1144 1523 +1525 3 284.5151 203.7441 68.1296 0.1144 1524 +1526 3 285.4966 203.3277 69.1446 0.1271 1525 +1527 3 286.3581 202.6756 70.0437 0.1398 1526 +1528 3 287.2104 202.0041 70.933 0.1652 1527 +1529 3 288.2319 201.5259 71.3658 0.1652 1528 +1530 3 289.2627 201.058 71.776 0.1652 1529 +1531 3 290.2923 200.5901 72.186 0.1525 1530 +1532 3 291.323 200.1222 72.5962 0.1525 1531 +1533 3 292.4007 199.8316 73.1254 0.1525 1532 +1534 3 293.5001 199.6246 73.71 0.1398 1533 +1535 3 294.5994 199.4175 74.2949 0.1271 1534 +1536 3 295.6988 199.2104 74.8796 0.1144 1535 +1537 3 296.7982 199.0034 75.4645 0.1144 1536 +1538 3 297.8701 198.7105 76.0754 0.1144 1537 +1539 3 298.9089 198.3078 76.7203 0.1144 1538 +1540 3 299.9465 197.9051 77.3648 0.1144 1539 +1541 3 300.9841 197.5024 78.0097 0.1144 1540 +1542 3 302.0217 197.0986 78.6545 0.1144 1541 +1543 3 303.0593 196.6959 79.2994 0.1144 1542 +1544 3 243.2899 216.2652 43.6612 0.178 1452 +1545 3 242.5555 215.4484 44.3646 0.2542 1544 +1546 3 241.6036 214.8729 45.0136 0.3051 1545 +1547 3 240.7674 214.1213 45.5104 0.3432 1546 +1548 3 240.2022 213.1764 46.2297 0.3432 1547 +1549 3 239.6794 212.2383 47.1904 0.3432 1548 +1550 3 238.9233 211.4432 47.976 0.3686 1549 +1551 3 238.19 210.5875 48.447 0.3813 1550 +1552 3 237.6969 209.5957 47.7705 0.4195 1551 +1553 3 237.7426 208.4871 47.9394 0.4195 1552 +1554 3 238.1819 207.4861 48.7449 0.4068 1553 +1555 3 238.6807 206.524 49.6034 0.3432 1554 +1556 3 238.9507 205.5139 50.1231 0.2924 1555 +1557 3 238.4279 204.5541 50.7265 0.2924 1556 +1558 3 237.5962 203.8734 51.52 0.3051 1557 +1559 3 236.7165 202.7992 51.52 0.2161 1558 +1560 3 236.2463 201.765 51.52 0.2034 1559 +1561 3 235.8104 200.74 51.7409 0.1652 1560 +1562 3 235.7784 199.6005 51.8 0.1271 1561 +1563 3 235.5118 198.5721 51.8392 0.1398 1562 +1564 3 235.346 197.4876 52.36 0.1652 1563 +1565 3 234.9707 196.4237 52.542 0.1907 1564 +1566 3 234.4514 195.465 53.2 0.1907 1565 +1567 3 233.9686 194.4411 53.2 0.1907 1566 +1568 3 233.5934 193.4161 53.2 0.1907 1567 +1569 3 233.1186 192.3888 53.2 0.1652 1568 +1570 3 232.6038 191.3718 53.2 0.1398 1569 +1571 3 232.4425 190.2483 53.2 0.1144 1570 +1572 3 231.8774 189.578 54.3158 0.1398 1571 +1573 3 231.3431 188.5667 54.32 0.178 1572 +1574 3 230.5377 187.7887 54.32 0.2161 1573 +1575 3 229.8593 186.9124 54.6 0.2161 1574 +1576 3 229.2908 185.9412 54.8836 0.1907 1575 +1577 3 229.0185 185.137 56.0 0.178 1576 +1578 3 228.6787 184.0456 56.0 0.1652 1577 +1579 3 228.4454 182.9496 56.1243 0.1652 1578 +1580 3 228.1925 181.9177 56.9265 0.1525 1579 +1581 3 227.8333 180.8447 57.12 0.1652 1580 +1582 3 227.2201 180.1114 58.212 0.2034 1581 +1583 3 226.7179 179.1412 58.5298 0.2415 1582 +1584 3 226.0555 178.4903 59.852 0.2542 1583 +1585 3 225.471 177.7032 61.2545 0.2288 1584 +1586 3 224.9493 176.7503 61.917 0.2034 1585 +1587 3 224.4963 175.7459 62.44 0.1907 1586 +1588 3 223.6406 175.0377 62.44 0.178 1587 +1589 3 223.2928 174.3948 63.2789 0.1525 1588 +1590 3 222.8066 173.9052 64.4 0.1271 1589 +1591 3 222.1671 172.9762 64.4 0.1144 1590 +1592 3 221.6225 171.9718 64.4 0.1144 1591 +1593 3 220.832 171.1664 64.4 0.1144 1592 +1594 3 220.5655 170.0842 64.4 0.1144 1593 +1595 3 220.1285 169.0775 64.4 0.1144 1594 +1596 3 219.7464 168.192 64.8844 0.1144 1595 +1597 3 219.076 167.6818 66.4132 0.1144 1596 +1598 3 218.7328 166.9885 68.04 0.1144 1597 +1599 3 218.5623 165.8651 68.04 0.1144 1598 +1600 3 218.2946 164.7577 68.04 0.1144 1599 +1601 3 218.1608 163.624 68.04 0.1144 1600 +1602 3 218.0533 162.4892 68.04 0.1144 1601 +1603 3 217.8542 161.3704 68.2312 0.1271 1602 +1604 3 217.8176 160.3545 69.3342 0.1398 1603 +1605 3 217.8176 159.3237 70.3875 0.1525 1604 +1606 3 217.8176 158.1866 70.56 0.1398 1605 +1607 3 217.8942 157.054 70.56 0.1271 1606 +1608 3 218.1391 155.9695 70.761 0.1144 1607 +1609 3 218.4193 154.9491 71.4 0.1144 1608 +1610 3 218.7328 153.8714 71.6783 0.1144 1609 +1611 3 219.0497 152.7892 71.96 0.1144 1610 +1612 3 219.3162 151.7138 72.5049 0.1144 1611 +1613 3 219.5954 150.6259 72.8 0.1144 1612 +1614 3 219.9306 149.5437 72.8 0.1144 1613 +1615 3 219.9912 148.4043 72.8 0.1144 1614 +1616 3 220.1056 147.2671 72.8 0.1144 1615 +1617 3 220.252 146.3107 73.6221 0.1144 1616 +1618 3 220.8572 145.5992 73.9007 0.1144 1617 +1619 3 220.9808 144.5295 74.8434 0.1144 1618 +1620 3 221.1055 143.4599 75.7859 0.1144 1619 +1621 3 221.229 142.3891 76.7284 0.1144 1620 +1622 3 221.3526 141.3195 77.6709 0.1144 1621 +1623 3 221.5608 140.2395 78.416 0.1144 1622 +1624 3 221.8102 139.155 79.0622 0.1144 1623 +1625 3 222.0607 138.0694 79.7084 0.1144 1624 +1626 3 222.3101 136.9848 80.3547 0.1144 1625 +1627 3 222.5606 135.9003 81.0009 0.1144 1626 +1628 3 222.81 134.8158 81.6472 0.1144 1627 +1629 3 222.9473 133.7096 82.2273 0.1144 1628 +1630 3 222.9976 132.5873 82.7568 0.1144 1629 +1631 3 223.048 131.465 83.2863 0.1144 1630 +1632 3 223.0994 130.3428 83.8158 0.1144 1631 +1633 3 223.1498 129.2205 84.3452 0.1144 1632 +1634 3 223.2001 128.0983 84.8747 0.1144 1633 +1635 3 223.0125 126.9897 85.26 0.1144 1634 +1636 3 222.754 125.8835 85.6027 0.1144 1635 +1637 3 222.4966 124.7784 85.9454 0.1144 1636 +1638 3 222.2392 123.6721 86.2884 0.1144 1637 +1639 3 221.9806 122.5659 86.6312 0.1144 1638 +1640 3 221.7232 121.4608 86.9739 0.1144 1639 +1641 3 221.4658 120.3545 87.3169 0.1144 1640 +1642 3 221.2073 119.2494 87.6596 0.1144 1641 +1643 3 220.9499 118.1432 88.0023 0.1144 1642 +1644 3 221.2233 117.0609 88.0617 0.1144 1643 +1645 3 221.6088 115.9844 88.0617 0.1144 1644 +1646 3 221.9932 114.9068 88.0617 0.1144 1645 +1647 3 222.3787 113.8295 88.0617 0.1144 1646 +1648 3 222.7631 112.7522 88.0617 0.1271 1647 +1649 3 223.1486 111.6749 88.0617 0.1398 1648 +1650 3 223.4186 110.5707 88.2725 0.1525 1649 +1651 3 223.6383 109.4548 88.5749 0.1398 1650 +1652 3 223.8579 108.339 88.8773 0.1271 1651 +1653 3 224.0776 107.2231 89.18 0.1144 1652 +1654 3 224.2972 106.1071 89.4824 0.1144 1653 +1655 3 224.5169 104.9913 89.7848 0.1144 1654 +1656 3 224.7365 103.8754 90.0875 0.1144 1655 +1657 3 224.9562 102.7596 90.3899 0.1144 1656 +1658 3 225.1758 101.6437 90.6903 0.1144 1657 +1659 3 225.4378 100.5298 90.6903 0.1144 1658 +1660 3 225.6986 99.416 90.6903 0.1144 1659 +1661 3 226.2615 98.491 91.4805 0.1144 1660 +1662 3 226.8666 97.5917 92.3782 0.1144 1661 +1663 3 227.4707 96.6925 93.2758 0.1144 1662 +1664 3 228.0758 95.7932 94.1738 0.1144 1663 +1665 3 228.6799 94.8939 95.0715 0.1398 1664 +1666 3 237.65 203.7464 53.2 0.178 1558 +1667 3 238.7722 203.6686 53.4531 0.1907 1666 +1668 3 239.763 203.6045 54.32 0.1652 1667 +1669 3 240.4242 202.8529 54.32 0.1398 1668 +1670 3 241.2616 202.1128 54.5784 0.1144 1669 +1671 3 242.0521 201.2914 54.6 0.1144 1670 +1672 3 242.5177 200.3281 54.6 0.1144 1671 +1673 3 243.2407 199.7573 55.3714 0.1144 1672 +1674 3 243.8287 198.9748 56.7398 0.1144 1673 +1675 3 244.4785 198.2849 58.0633 0.1144 1674 +1676 3 245.3411 197.5928 58.329 0.1144 1675 +1677 3 245.865 196.6639 58.5239 0.1398 1676 +1678 3 246.5938 196.2189 60.0678 0.1652 1677 +1679 3 247.5204 195.8528 60.7866 0.1907 1678 +1680 3 248.4356 195.8528 62.3742 0.1652 1679 +1681 3 249.4309 195.7384 63.1907 0.1398 1680 +1682 3 250.512 195.7384 63.84 0.1271 1681 +1683 3 251.5313 195.7384 64.7592 0.1525 1682 +1684 3 252.6684 195.7384 64.9883 0.178 1683 +1685 3 253.5298 195.2442 66.103 0.178 1684 +1686 3 254.492 194.7523 66.36 0.178 1685 +1687 3 255.0537 194.3656 67.6404 0.178 1686 +1688 3 255.6176 194.3015 70.0711 0.2034 1687 +1689 3 256.1816 194.2363 72.5021 0.1907 1688 +1690 3 256.8886 194.0338 74.5766 0.178 1689 +1691 3 257.7123 193.717 76.356 0.1398 1690 +1692 3 258.5371 193.3989 78.1351 0.1271 1691 +1693 3 259.3608 193.0809 79.9145 0.1144 1692 +1694 3 260.1834 192.7388 81.6693 0.1144 1693 +1695 3 261.0025 192.3522 83.3806 0.1144 1694 +1696 3 261.8216 191.9655 85.0917 0.1144 1695 +1697 3 262.6418 191.5697 86.767 0.1144 1696 +1698 3 263.5318 190.8936 87.3712 0.1144 1697 +1699 3 264.4207 190.2175 87.9754 0.1144 1698 +1700 3 265.3096 189.5414 88.5797 0.1144 1699 +1701 3 266.1996 188.8652 89.1839 0.1144 1700 +1702 3 267.0885 188.1891 89.7882 0.1144 1701 +1703 3 267.9774 187.513 90.3921 0.1144 1702 +1704 3 268.8503 186.8918 91.2559 0.1144 1703 +1705 3 269.7277 186.3198 92.3835 0.1144 1704 +1706 3 270.6052 185.7478 93.5113 0.1144 1705 +1707 3 271.4163 185.2205 94.9892 0.1144 1706 +1708 3 272.2091 184.7057 96.565 0.1144 1707 +1709 3 273.003 184.1897 98.1406 0.1144 1708 +1710 3 273.7958 183.6749 99.7164 0.1144 1709 +1711 3 274.6847 183.2059 100.767 0.1144 1710 +1712 3 275.6697 183.0423 101.6364 0.1398 1711 +1713 3 276.5574 183.0995 103.3959 0.178 1712 +1714 2 243.2087 232.2354 37.4839 0.4068 1 +1715 2 243.767 231.2379 37.52 0.4068 1714 +1716 2 244.4007 230.2861 37.52 0.4068 1715 +1717 2 245.2942 229.5848 37.5194 0.4068 1716 +1718 2 246.2563 228.967 37.5175 0.394 1717 +1719 2 247.3053 228.514 37.5049 0.3432 1718 +1720 2 248.3269 228.0003 37.4402 0.2796 1719 +1721 2 249.4343 227.8551 36.955 0.2542 1720 +1722 2 250.4296 227.6754 35.6776 0.2669 1721 +1723 2 251.4798 227.3197 35.0406 0.2924 1722 +1724 2 252.4053 226.7545 34.167 0.3051 1723 +1725 2 253.4029 226.3312 33.3416 0.2796 1724 +1726 2 254.2757 225.7684 32.2375 0.2542 1725 +1727 2 255.1337 225.0282 31.9421 0.2288 1726 +1728 2 256.0558 224.351 31.92 0.2542 1727 +1729 2 257.0076 223.7172 31.92 0.2796 1728 +1730 2 257.9686 223.0972 31.92 0.2924 1729 +1731 2 258.9158 222.4554 31.92 0.2542 1730 +1732 2 259.7669 221.7152 32.1191 0.2034 1731 +1733 2 260.6226 220.9968 32.2 0.1652 1732 +1734 2 261.6808 220.5769 32.1538 0.1525 1733 +1735 2 262.5766 219.8985 31.7307 0.1525 1734 +1736 2 263.4643 219.1893 31.57 0.1398 1735 +1737 2 264.2983 218.4376 31.36 0.1398 1736 +1738 2 265.2238 217.8119 30.8918 0.1398 1737 +1739 2 266.1813 217.2021 30.7936 0.1525 1738 +1740 2 267.1995 216.7079 30.52 0.1398 1739 +1741 2 268.1204 216.033 30.5155 0.1271 1740 +1742 2 268.9281 215.2367 30.24 0.1144 1741 +1743 2 269.6191 214.3261 30.24 0.1144 1742 +1744 2 270.4416 213.5436 30.24 0.1271 1743 +1745 2 271.2252 212.7428 29.9785 0.1652 1744 +1746 2 272.177 212.2921 29.136 0.2161 1745 +1747 2 273.265 212.021 29.12 0.2415 1746 +1748 2 274.3026 211.5588 29.12 0.2415 1747 +1749 2 275.4409 211.4387 29.12 0.2288 1748 +1750 2 276.5826 211.4238 29.12 0.2288 1749 +1751 2 277.7152 211.5805 29.12 0.2161 1750 +1752 2 278.85 211.6892 29.12 0.2034 1751 +1753 2 279.6588 212.3001 28.2528 0.1907 1752 +1754 2 280.4493 212.8252 27.0959 0.1907 1753 +1755 2 281.5338 213.1215 26.8976 0.1907 1754 +1756 2 282.6058 213.4693 27.16 0.1907 1755 +1757 2 283.6651 213.8868 27.16 0.1907 1756 +1758 2 284.7794 214.0424 27.16 0.1907 1757 +1759 2 285.7735 214.1568 25.9151 0.2034 1758 +1760 2 286.8855 214.2106 25.48 0.2034 1759 +1761 2 287.7686 214.8226 24.9452 0.1907 1760 +1762 2 288.8451 214.8432 24.2466 0.178 1761 +1763 2 289.7226 214.5046 23.2562 0.1907 1762 +1764 2 290.7522 214.2815 22.8841 0.2161 1763 +1765 2 291.8573 214.508 22.68 0.2034 1764 +1766 2 292.9544 214.8169 22.68 0.1652 1765 +1767 2 294.0961 214.8432 22.68 0.1398 1766 +1768 2 295.2321 214.754 22.68 0.1398 1767 +1769 2 296.3601 214.8009 22.68 0.1652 1768 +1770 2 297.4743 214.9576 22.68 0.178 1769 +1771 2 298.5909 214.7757 22.4 0.1907 1770 +1772 2 299.7108 214.8432 22.1388 0.1907 1771 +1773 2 300.8548 214.8432 22.12 0.178 1772 +1774 2 301.9988 214.8432 22.12 0.1652 1773 +1775 2 303.1291 214.8432 21.8492 0.1525 1774 +1776 2 303.9139 214.0561 21.84 0.1525 1775 +1777 2 304.6564 213.2553 21.84 0.1525 1776 +1778 2 305.7912 213.1272 21.84 0.1652 1777 +1779 3 240.9744 238.9724 35.8481 0.1907 1 +1780 3 241.8393 239.3534 34.4294 0.2288 1779 +1781 3 242.6127 239.6783 32.5332 0.3305 1780 +1782 3 243.4649 240.3967 31.9152 0.3813 1781 +1783 3 244.3939 241.0648 31.8844 0.3813 1782 +1784 3 245.2622 241.7936 31.7251 0.3051 1783 +1785 3 245.9314 242.7065 31.5266 0.2796 1784 +1786 3 246.5137 243.6457 32.0214 0.2924 1785 +1787 3 247.2344 244.4511 32.8115 0.3178 1786 +1788 3 248.105 245.1821 32.8485 0.3178 1787 +1789 3 248.9596 245.8227 32.0754 0.2924 1788 +1790 3 249.7638 246.3535 30.6043 0.3051 1789 +1791 3 250.6801 246.8683 29.7587 0.3305 1790 +1792 3 251.5267 247.6177 29.6792 0.3813 1791 +1793 3 252.1502 248.5763 29.675 0.394 1792 +1794 3 252.6856 249.583 29.652 0.394 1793 +1795 3 253.1294 250.6332 29.5142 0.394 1794 +1796 3 253.6648 251.6251 29.0752 0.4195 1795 +1797 3 254.2609 252.5712 28.5202 0.4322 1796 +1798 3 254.9175 253.4829 28.0885 0.4195 1797 +1799 3 255.652 254.3123 27.4582 0.3813 1798 +1800 3 256.4162 255.1589 27.2401 0.3305 1799 +1801 3 256.9573 256.129 26.747 0.2796 1800 +1802 3 257.5567 257.0808 26.8142 0.2415 1801 +1803 3 258.4319 257.5945 26.4874 0.2796 1802 +1804 3 259.4752 257.6917 25.3949 0.3432 1803 +1805 3 260.8526 258.0429 26.038 0.1144 1804 +1806 3 261.992 258.0933 26.2035 0.1144 1805 +1807 3 263.1314 258.1299 26.297 0.1271 1806 +1808 3 264.256 258.3198 26.341 0.1398 1807 +1809 3 265.3119 258.7476 26.4592 0.178 1808 +1810 3 266.409 258.9009 26.8358 0.2161 1809 +1811 3 267.4958 258.6298 26.4174 0.2669 1810 +1812 3 268.6341 258.6584 26.4706 0.2669 1811 +1813 3 269.7438 258.8666 26.6 0.2415 1812 +1814 3 270.8637 259.0943 26.6 0.2034 1813 +1815 3 271.9997 259.1549 26.542 0.1907 1814 +1816 3 273.0785 259.5095 26.32 0.178 1815 +1817 3 274.1859 259.7955 26.32 0.1652 1816 +1818 3 275.1755 260.3458 26.32 0.1652 1817 +1819 3 276.2302 260.7233 26.255 0.178 1818 +1820 3 277.1615 261.3651 25.8807 0.2034 1819 +1821 3 278.2631 261.65 25.76 0.2161 1820 +1822 3 279.4003 261.7701 25.7351 0.2415 1821 +1823 3 280.4665 262.1144 25.48 0.2288 1822 +1824 3 281.5292 262.5057 25.48 0.2034 1823 +1825 3 282.5508 262.9987 25.366 0.1525 1824 +1826 3 283.6697 263.12 24.9897 0.1271 1825 +1827 3 284.7942 263.12 24.64 0.1144 1826 +1828 3 285.9359 263.1589 24.64 0.1144 1827 +1829 3 287.0662 263.2344 24.3919 0.1398 1828 +1830 3 288.1953 263.2882 24.08 0.178 1829 +1831 3 289.289 263.6062 24.071 0.2288 1830 +1832 3 290.2294 264.1485 23.4178 0.2415 1831 +1833 3 291.1457 264.7067 22.5285 0.2288 1832 +1834 3 292.0746 265.2284 21.5891 0.1907 1833 +1835 3 293.1832 265.4995 21.56 0.1525 1834 +1836 3 294.2013 265.8553 20.7606 0.1271 1835 +1837 3 295.2241 266.2809 20.5058 0.1144 1836 +1838 3 296.3143 266.5817 20.44 0.1144 1837 +1839 3 297.2741 267.1423 20.2667 0.1144 1838 +1840 3 298.3575 267.4672 20.16 0.1144 1839 +1841 3 298.8128 267.8127 18.4341 0.1144 1840 +1842 3 299.3413 268.1765 17.0419 0.1144 1841 +1843 3 300.4144 268.538 16.8 0.1144 1842 +1844 3 301.4932 268.6936 17.1382 0.1144 1843 +1845 3 302.1167 268.7496 19.276 0.1144 1844 +1846 3 303.2115 269.0608 19.3351 0.1144 1845 +1847 3 304.2262 269.4063 20.0796 0.1144 1846 +1848 3 305.3496 269.5424 20.2199 0.1144 1847 +1849 3 306.4787 269.6408 20.4386 0.1144 1848 +1850 3 307.482 269.7415 19.6 0.1398 1849 +1851 3 308.5276 270.1567 19.7602 0.1652 1850 +1852 3 309.6488 270.3604 19.88 0.1907 1851 +1853 3 310.7779 270.548 19.88 0.178 1852 +1854 3 311.891 270.3318 20.1359 0.1907 1853 +1855 3 312.9732 269.9634 20.16 0.2415 1854 +1856 3 314.0989 269.8582 20.16 0.2924 1855 +1857 3 315.2349 269.7552 20.16 0.2924 1856 +1858 3 316.3492 269.9611 20.16 0.2542 1857 +1859 3 317.4589 270.1956 20.16 0.2542 1858 +1860 3 318.5239 270.5606 20.16 0.2796 1859 +1861 3 319.51 271.1188 19.934 0.2669 1860 +1862 3 320.5465 271.573 19.88 0.2288 1861 +1863 3 321.5258 272.1462 19.88 0.2034 1862 +1864 3 322.5428 272.6518 19.88 0.2161 1863 +1865 3 323.625 272.9618 19.88 0.2288 1864 +1866 3 324.7564 273.0888 19.88 0.2161 1865 +1867 3 325.8798 273.3039 19.88 0.2034 1866 +1868 3 326.9769 273.6276 19.88 0.1652 1867 +1869 3 328.0706 273.9617 19.88 0.1398 1868 +1870 3 329.1974 274.1024 19.88 0.1144 1869 +1871 3 330.3243 274.1745 20.1183 0.1144 1870 +1872 3 331.4019 274.3026 20.72 0.1144 1871 +1873 3 332.5276 274.1848 20.4565 0.1398 1872 +1874 3 333.5938 273.9891 19.88 0.1907 1873 +1875 3 334.7264 273.8736 19.7537 0.2669 1874 +1876 3 335.8452 273.9811 19.2934 0.2924 1875 +1877 3 336.9217 274.258 18.8513 0.2924 1876 +1878 3 338.0326 274.528 18.76 0.2542 1877 +1879 3 339.0576 274.981 18.5517 0.2415 1878 +1880 3 340.0574 275.5061 18.3386 0.2034 1879 +1881 3 341.0813 275.9923 18.2 0.178 1880 +1882 3 342.2127 276.0106 18.2 0.1652 1881 +1883 3 343.3384 275.8241 18.114 0.178 1882 +1884 3 344.4607 275.966 17.92 0.1907 1883 +1885 3 345.5486 276.3183 17.9068 0.1907 1884 +1886 3 346.5862 276.7565 17.64 0.1907 1885 +1887 3 347.5278 277.3994 17.5619 0.178 1886 +1888 3 348.5882 277.7632 17.36 0.1652 1887 +1889 3 349.7322 277.7632 17.36 0.1525 1888 +1890 3 350.8202 277.8902 16.8622 0.1525 1889 +1891 3 351.8967 278.2448 16.8 0.1525 1890 +1892 3 353.0373 278.3295 16.8 0.1525 1891 +1893 3 354.1721 278.3352 16.52 0.1525 1892 +1894 3 355.3058 278.2219 16.5508 0.1398 1893 +1895 3 356.4429 278.2208 16.8 0.1271 1894 +1896 3 357.5618 278.0675 17.057 0.1144 1895 +1897 3 358.7001 277.992 17.08 0.1144 1896 +1898 3 359.8383 277.9451 17.08 0.1271 1897 +1899 3 360.8233 277.5596 16.8179 0.1525 1898 +1900 3 361.5452 277.3056 18.5954 0.178 1899 +1901 3 362.6183 277.42 19.0509 0.178 1900 +1902 3 363.5998 277.3502 19.8408 0.1652 1901 +1903 3 364.7415 277.3056 19.88 0.1525 1902 +1904 3 365.8626 277.3056 20.2392 0.1525 1903 +1905 3 366.9826 277.3056 20.72 0.1398 1904 +1906 3 368.1266 277.3056 20.72 0.1271 1905 +1907 3 369.2706 277.309 20.72 0.1271 1906 +1908 3 370.402 277.436 20.72 0.1652 1907 +1909 3 371.5117 277.6911 20.72 0.2034 1908 +1910 3 372.4967 278.1728 20.72 0.2161 1909 +1911 3 373.4805 278.6304 20.72 0.178 1910 +1912 3 374.5262 278.9552 20.72 0.1398 1911 +1913 3 375.494 279.4563 20.72 0.1398 1912 +1914 3 376.622 279.5398 20.72 0.1652 1913 +1915 3 377.6905 279.9151 20.72 0.1907 1914 +1916 3 378.4524 280.6232 20.72 0.1652 1915 +1917 3 379.4385 281.1128 20.5556 0.1398 1916 +1918 3 380.5527 281.1952 20.6713 0.1144 1917 +1919 3 381.6956 281.2021 20.7138 0.1144 1918 +1920 3 382.62 281.5098 19.4432 0.1271 1919 +1921 3 383.661 281.8072 19.32 0.1398 1920 +1922 3 384.6689 282.2603 19.32 0.1652 1921 +1923 3 385.663 282.7568 19.32 0.178 1922 +1924 3 386.7978 282.8094 19.1024 0.1907 1923 +1925 3 387.5403 283.5198 18.7415 0.178 1924 +1926 3 388.428 283.823 17.6638 0.1652 1925 +1927 3 389.4988 283.5759 17.9186 0.1525 1926 +1928 3 390.5765 283.3688 18.3478 0.1652 1927 +1929 3 391.7022 283.3688 18.76 0.2034 1928 +1930 3 392.4103 283.3802 17.1839 0.2669 1929 +1931 3 393.5268 283.4832 17.0579 0.3051 1930 +1932 3 394.6262 283.6926 16.8 0.2796 1931 +1933 3 395.7691 283.712 16.8 0.2161 1932 +1934 3 396.9039 283.617 16.7838 0.1652 1933 +1935 3 398.0376 283.712 16.6628 0.1525 1934 +1936 3 399.1588 283.5976 17.0492 0.1398 1935 +1937 3 400.265 283.4363 17.08 0.1271 1936 +1938 3 401.3793 283.2361 17.08 0.1271 1937 +1939 3 402.5187 283.1377 17.08 0.1398 1938 +1940 3 403.6432 283.0256 17.3687 0.1652 1939 +1941 3 404.7472 283.14 17.92 0.1652 1940 +1942 3 259.243 257.5876 23.8 0.2288 1804 +1943 3 259.3448 258.7236 23.8 0.2796 1942 +1944 3 259.3654 259.8619 23.5942 0.2669 1943 +1945 3 259.4569 260.999 23.52 0.2415 1944 +1946 3 259.7509 261.8959 22.96 0.2542 1945 +1947 3 260.5552 262.5572 22.12 0.2924 1946 +1948 3 261.2496 263.4655 22.12 0.3432 1947 +1949 3 261.936 264.3807 22.12 0.3432 1948 +1950 3 262.5549 265.3005 21.5533 0.3178 1949 +1951 3 263.0056 266.1894 20.4375 0.2669 1950 +1952 3 263.2207 267.1457 19.1559 0.2542 1951 +1953 3 264.0009 267.9591 19.04 0.2415 1952 +1954 3 264.7136 268.8354 18.7194 0.2288 1953 +1955 3 265.3405 269.5264 18.2 0.2161 1954 +1956 3 266.0498 270.2174 17.8942 0.2288 1955 +1957 3 266.7007 271.0113 17.36 0.2542 1956 +1958 3 267.4924 271.8258 17.36 0.2415 1957 +1959 3 268.1273 272.749 17.36 0.2034 1958 +1960 3 268.1536 273.8461 16.7597 0.1525 1959 +1961 3 268.1536 274.9741 16.2963 0.1271 1960 +1962 3 268.1925 276.0037 15.2967 0.1144 1961 +1963 3 269.2976 276.0472 15.12 0.1144 1962 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb_469628681_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb_469628681_m.swc new file mode 100644 index 0000000..4fe67b4 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb_469628681_m.swc @@ -0,0 +1,1250 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/February 2015/169125.03.01.01/reconstructions/Pvalb-IRES-Cre; Ai14(IVSCC)-169125.03.01.01.DS.swc +# id,type,x,y,z,r,pid +1 1 312.0832 372.8296 27.44 5.1972 -1 +2 3 310.5926 376.7913 27.4061 0.2161 1 +3 3 310.5274 377.8643 27.3406 0.2796 2 +4 3 310.6829 378.9637 26.7414 0.2924 3 +5 3 310.6372 380.0368 25.7981 0.2542 4 +6 3 310.1784 380.9817 26.6462 0.2161 5 +7 3 309.7906 381.945 27.8124 0.1907 6 +8 3 309.6373 383.0558 27.412 0.1907 7 +9 3 308.9521 383.9264 26.7898 0.2288 8 +10 3 308.0803 384.6437 26.3326 0.2796 9 +11 3 307.3013 385.4811 26.2685 0.3686 10 +12 3 306.6515 386.418 26.0495 0.4576 11 +13 3 306.163 386.8493 25.4593 0.2542 12 +14 3 305.2078 387.4522 25.2165 0.2415 13 +15 3 304.1713 387.935 25.1997 0.2415 14 +16 3 303.1646 388.4772 25.1983 0.2034 15 +17 3 302.6612 389.4794 25.1899 0.2415 16 +18 3 302.0526 390.4449 25.1437 0.2669 17 +19 3 301.1488 391.113 24.7388 0.3051 18 +20 3 300.2908 391.8269 24.1321 0.2669 19 +21 3 299.3196 392.4252 24.0517 0.2542 20 +22 3 298.2831 392.9057 23.9078 0.2542 21 +23 3 297.186 392.9846 23.1896 0.3178 22 +24 3 296.0592 393.1093 22.8334 0.3178 23 +25 3 295.0021 393.4719 22.2421 0.3051 24 +26 3 293.9371 393.8781 22.4277 0.2415 25 +27 3 292.9361 394.3848 22.9662 0.2161 26 +28 3 292.4899 394.9992 22.9832 0.2161 27 +29 3 291.9008 395.9762 23.1025 0.2034 28 +30 3 291.2498 396.8708 23.7213 0.2288 29 +31 3 290.5634 397.7688 24.0411 0.2415 30 +32 3 289.8049 398.6234 24.0806 0.2669 31 +33 3 288.9069 399.3235 24.0828 0.2796 32 +34 3 288.05 400.0785 24.0904 0.2796 33 +35 3 287.2355 400.8816 24.1237 0.3051 34 +36 3 286.429 401.6904 24.2673 0.2924 35 +37 3 285.6545 402.4855 24.8928 0.2924 36 +38 3 284.9018 403.3321 25.1149 0.2415 37 +39 3 284.2554 404.2564 24.7358 0.2415 38 +40 3 283.5427 405.1282 24.2746 0.2669 39 +41 3 282.6424 405.7802 24.6834 0.3305 40 +42 3 281.8976 406.5742 25.4755 0.3432 41 +43 3 281.2192 407.4836 25.5206 0.3305 42 +44 3 280.3715 408.2387 25.2538 0.3051 43 +45 3 279.5433 409.0258 25.2843 0.3178 44 +46 3 278.7242 409.8083 25.6662 0.3178 45 +47 3 277.8204 410.4638 26.264 0.3051 46 +48 3 276.9144 411.1582 26.3071 0.2796 47 +49 3 275.99 411.832 26.2576 0.2669 48 +50 3 275.0862 412.523 25.9955 0.2796 49 +51 3 274.3198 413.3215 25.3011 0.3051 50 +52 3 273.7043 414.2813 25.2031 0.3432 51 +53 3 273.2352 415.3235 25.2 0.3813 52 +54 3 272.6312 416.2947 25.2 0.3813 53 +55 3 272.0638 417.2877 25.2 0.3686 54 +56 3 271.3637 418.1915 25.1997 0.3178 55 +57 3 270.7059 419.1284 25.1983 0.3051 56 +58 3 270.0423 420.0596 25.1919 0.3051 57 +59 3 269.3731 420.9874 25.1605 0.3559 58 +60 3 268.586 421.8157 25.0281 0.3813 59 +61 3 267.8001 422.5936 24.3247 0.3813 60 +62 3 266.9776 423.3807 24.0618 0.3432 61 +63 3 266.0761 424.0842 23.9635 0.3051 62 +64 3 265.1609 424.7066 23.259 0.2542 63 +65 3 264.2091 425.3117 22.7979 0.2161 64 +66 3 263.39 426.0634 22.9298 0.2034 65 +67 3 262.4485 426.3825 24.1791 0.2415 66 +68 3 261.4246 426.879 24.4507 0.2542 67 +69 3 260.395 427.3572 24.6235 0.2542 68 +70 3 259.3414 427.7485 24.5118 0.2288 69 +71 3 258.2923 428.0265 24.6938 0.2542 70 +72 3 257.392 428.5435 23.7191 0.2924 71 +73 3 256.6942 428.9554 24.3012 0.3305 72 +74 3 255.9357 429.7276 24.64 0.3305 73 +75 3 255.009 430.2584 24.6344 0.3178 74 +76 3 254.1831 430.6634 23.6824 0.3051 75 +77 3 253.4395 431.3852 23.7252 0.3051 76 +78 3 252.5277 431.884 24.5468 0.2796 77 +79 3 251.7738 432.3588 23.6477 0.2415 78 +80 3 250.6882 432.5556 23.6606 0.2161 79 +81 3 249.8427 432.9193 24.5949 0.2415 80 +82 3 249.2787 433.8025 24.9186 0.2924 81 +83 3 248.7285 434.3962 23.8501 0.3178 82 +84 3 248.1485 435.3538 23.8171 0.2924 83 +85 3 247.668 436.1122 22.9415 0.2415 84 +86 3 247.0262 436.9714 22.675 0.1907 85 +87 3 246.2517 437.4587 24.2332 0.178 86 +88 3 245.5562 438.0468 24.8853 0.178 87 +89 3 245.134 438.883 24.1363 0.2034 88 +90 3 244.4739 439.6072 24.2189 0.2034 89 +91 3 243.7864 440.4022 23.6132 0.2034 90 +92 3 243.7098 441.2465 22.68 0.2034 91 +93 3 243.1275 441.8002 24.0089 0.2161 92 +94 3 242.9478 442.8413 23.6141 0.2161 93 +95 3 242.6138 443.8125 23.9828 0.178 94 +96 3 242.1299 444.6373 23.2663 0.1398 95 +97 3 241.2925 445.3638 23.4889 0.1271 96 +98 3 240.4253 445.4736 22.202 0.1398 97 +99 3 239.7824 446.0433 21.0 0.1525 98 +100 3 239.4335 446.732 21.884 0.1525 99 +101 3 238.818 447.4481 22.6209 0.1525 100 +102 3 237.7221 447.6506 22.398 0.1525 101 +103 3 236.9979 448.4366 21.6418 0.1398 102 +104 3 236.3058 449.3312 21.5261 0.1398 103 +105 3 235.6834 450.0702 21.7196 0.1398 104 +106 3 234.8907 450.8378 21.84 0.1652 105 +107 3 234.2695 451.3938 21.8378 0.1652 106 +108 3 233.6059 452.2896 21.56 0.1652 107 +109 3 232.7434 452.8227 21.56 0.1525 108 +110 3 231.835 453.4747 21.8126 0.178 109 +111 3 230.9301 454.0753 22.1673 0.2161 110 +112 3 229.9703 454.6027 21.7403 0.2542 111 +113 3 228.9716 454.8544 21.7193 0.2415 112 +114 3 227.9523 454.5226 22.12 0.2034 113 +115 3 227.0405 454.7366 22.96 0.1525 114 +116 3 226.3587 455.4573 22.96 0.1271 115 +117 3 225.5636 456.1849 22.96 0.1144 116 +118 3 224.6953 456.925 22.96 0.1271 117 +119 3 223.9014 457.5966 23.2285 0.1398 118 +120 3 223.5399 458.6731 23.24 0.1525 119 +121 3 222.8787 459.4556 22.965 0.1525 120 +122 3 221.8399 459.7736 23.5074 0.1652 121 +123 3 220.9453 460.2884 23.6846 0.178 122 +124 3 220.3905 461.2459 24.0321 0.178 123 +125 3 219.7624 461.7253 25.1622 0.1525 124 +126 3 219.7624 462.8521 25.4906 0.1271 125 +127 3 219.6011 463.94 26.1092 0.1144 126 +128 3 218.9627 464.798 26.5496 0.1144 127 +129 3 218.401 465.6538 27.594 0.1144 128 +130 3 217.7101 466.3127 28.0 0.1144 129 +131 3 217.1381 467.2794 28.1078 0.1525 130 +132 3 217.1312 468.3536 28.0 0.1907 131 +133 3 292.6455 393.8414 22.9662 0.2924 27 +134 3 292.0746 392.8542 22.9704 0.2924 133 +135 3 291.2876 392.0408 23.0171 0.2924 134 +136 3 290.2534 391.6084 23.2767 0.2669 135 +137 3 289.1517 391.4962 23.949 0.2669 136 +138 3 288.0489 391.2583 24.3723 0.2288 137 +139 3 286.9461 391.1222 25.0146 0.2288 138 +140 3 285.8227 391.0581 25.4668 0.2034 139 +141 3 284.7485 390.7835 26.0232 0.1907 140 +142 3 283.7189 390.3259 26.1685 0.1907 141 +143 3 282.5897 390.1784 26.0893 0.2161 142 +144 3 281.4812 389.985 26.3085 0.2542 143 +145 3 280.4322 389.5297 26.2489 0.2542 144 +146 3 279.3785 389.238 25.7748 0.2415 145 +147 3 278.3855 388.992 25.1258 0.2415 146 +148 3 277.515 388.3937 25.8048 0.2288 147 +149 3 276.5689 388.0963 26.8097 0.2288 148 +150 3 275.6582 387.6215 26.88 0.2288 149 +151 3 274.7751 387.816 26.1974 0.2669 150 +152 3 273.7821 387.6661 25.9529 0.2796 151 +153 3 272.7708 387.4362 26.04 0.2796 152 +154 3 272.097 387.0964 27.4336 0.2542 153 +155 3 271.7 386.7498 25.6819 0.2542 154 +156 3 270.6979 386.4661 25.48 0.2542 155 +157 3 269.706 386.3185 26.3113 0.2669 156 +158 3 269.1146 385.9684 25.0883 0.2669 157 +159 3 268.395 385.2466 24.8786 0.2415 158 +160 3 267.688 384.6414 25.4072 0.2288 159 +161 3 266.9867 384.2776 23.8 0.2161 160 +162 3 266.1276 383.6164 23.9599 0.2542 161 +163 3 265.2947 382.9071 24.575 0.2924 162 +164 3 264.4482 382.5948 23.8286 0.3305 163 +165 3 263.6359 382.0331 23.5626 0.3305 164 +166 3 263.0308 381.1465 24.0075 0.3051 165 +167 3 262.2929 380.3731 23.2772 0.2542 166 +168 3 261.5184 379.562 23.56 0.2161 167 +169 3 260.7336 378.9935 24.5227 0.2034 168 +170 3 259.8928 378.4661 23.4346 0.2288 169 +171 3 259.1961 377.7923 22.68 0.2415 170 +172 3 258.4525 377.2248 22.9205 0.2415 171 +173 3 257.4252 377.0544 23.24 0.2161 172 +174 3 256.6392 376.4538 22.6789 0.2034 173 +175 3 255.819 375.7788 22.3219 0.178 174 +176 3 255.2115 375.343 22.094 0.1907 175 +177 3 254.1808 375.3041 21.887 0.2288 176 +178 3 253.0814 375.4002 21.9601 0.2796 177 +179 3 251.9706 375.5054 22.1746 0.2796 178 +180 3 250.9204 375.8543 22.6898 0.2288 179 +181 3 250.1322 375.9333 21.784 0.178 180 +182 3 249.2273 375.5752 21.1434 0.1907 181 +183 3 249.0053 375.5752 18.7698 0.2288 182 +184 3 248.3109 376.058 18.4478 0.2542 183 +185 3 247.4529 375.8463 19.32 0.2161 184 +186 3 246.4073 375.4356 19.32 0.2034 185 +187 3 245.3972 375.0215 19.5734 0.2288 186 +188 3 244.9087 375.3578 19.7109 0.2796 187 +189 3 243.9694 375.2743 18.8563 0.3051 188 +190 3 242.9124 374.9826 18.613 0.3051 189 +191 3 242.1734 374.8259 20.1127 0.3051 190 +192 3 241.3703 374.1646 19.4435 0.2924 191 +193 3 240.2606 374.088 19.2363 0.2796 192 +194 3 239.2436 373.8169 19.8934 0.2669 193 +195 3 238.6384 373.508 19.1668 0.2542 194 +196 3 237.904 372.9074 19.3164 0.2415 195 +197 3 237.2748 372.0917 19.1453 0.2161 196 +198 3 236.816 371.3447 18.1594 0.2034 197 +199 3 235.8585 370.8345 17.4675 0.1652 198 +200 3 234.83 370.4764 16.611 0.1398 199 +201 3 233.8016 370.1183 15.7545 0.1144 200 +202 3 232.9848 369.4537 15.4 0.1144 201 +203 3 232.6896 368.4755 15.4 0.1144 202 +204 3 232.6896 367.3315 15.4 0.1144 203 +205 3 232.6164 366.191 15.4 0.1144 204 +206 3 232.3681 365.1797 15.4 0.1271 205 +207 3 231.2665 364.8777 15.4 0.1398 206 +208 3 230.8592 363.9064 15.4 0.178 207 +209 3 230.8592 362.7624 15.4 0.1907 208 +210 3 306.4433 388.0608 26.5065 0.2542 12 +211 3 306.0303 389.111 26.4446 0.2542 210 +212 3 305.7065 390.1875 26.502 0.2288 211 +213 3 305.5144 391.28 27.1065 0.2415 212 +214 3 305.0545 392.273 27.7141 0.2288 213 +215 3 304.463 393.2077 28.4032 0.2669 214 +216 3 303.7217 393.9902 29.2457 0.2669 215 +217 3 302.7859 394.6034 29.6803 0.3051 216 +218 3 301.8112 395.1765 30.0818 0.3178 217 +219 3 300.864 395.7771 30.6298 0.3305 218 +220 3 300.0518 396.5596 30.8322 0.3178 219 +221 3 299.537 397.5617 30.9798 0.2924 220 +222 3 299.0576 398.5662 31.5577 0.2796 221 +223 3 298.4707 399.5317 31.9015 0.2415 222 +224 3 297.686 400.3497 32.0855 0.2288 223 +225 3 296.987 401.1951 32.7701 0.2288 224 +226 3 296.598 402.2407 33.1243 0.2796 225 +227 3 296.4939 403.3481 33.6806 0.2924 226 +228 3 296.2994 404.4566 34.1166 0.2669 227 +229 3 295.867 405.5068 34.3272 0.2034 228 +230 3 295.5867 406.4861 35.4684 0.2034 229 +231 3 295.2458 407.5168 36.2978 0.2415 230 +232 3 294.6704 408.4949 36.4008 0.3051 231 +233 3 294.2105 409.5406 36.4048 0.3178 232 +234 3 293.7895 410.6045 36.4274 0.3305 233 +235 3 293.3662 411.6661 36.5674 0.3305 234 +236 3 293.0402 412.7106 37.343 0.3432 235 +237 3 292.3801 413.4771 38.5918 0.3432 236 +238 3 291.5038 413.6624 40.2956 0.3432 237 +239 3 290.7751 414.2024 41.9924 0.3178 238 +240 3 290.1562 414.9528 43.4591 0.2924 239 +241 3 289.5887 415.82 44.24 0.2542 240 +242 3 288.7422 416.3062 44.24 0.2415 241 +243 3 287.8361 416.7935 44.1582 0.2161 242 +244 3 287.2172 417.4033 44.1952 0.1907 243 +245 3 286.7036 418.3802 44.2963 0.1907 244 +246 3 285.7895 418.9031 44.8767 0.2161 245 +247 3 285.1042 419.602 45.36 0.2542 246 +248 3 284.316 420.2187 44.8 0.2415 247 +249 3 283.5976 420.8032 45.6084 0.1907 248 +250 3 282.9181 421.5949 45.7148 0.1398 249 +251 3 282.3998 422.3785 45.0178 0.1144 250 +252 3 282.2282 423.4596 44.6365 0.1144 251 +253 3 282.1104 424.5087 43.7388 0.1271 252 +254 3 282.1573 425.5932 43.9438 0.1652 253 +255 3 282.1596 426.2487 45.1063 0.2161 254 +256 3 282.3014 427.3218 44.8 0.2669 255 +257 3 309.8341 368.9766 27.3356 0.3432 1 +258 3 309.7941 367.8692 26.7624 0.4195 257 +259 3 309.7906 366.7401 26.3228 0.4703 258 +260 3 309.7643 365.5972 26.1934 0.483 259 +261 3 309.5847 364.499 25.5623 0.483 260 +262 3 309.0813 363.4797 25.3084 0.4449 261 +263 3 308.499 362.5119 25.7272 0.3813 262 +264 3 308.1044 361.464 26.2956 0.3432 263 +265 3 307.6548 360.4126 26.3197 0.3432 264 +266 3 307.4878 359.2812 26.32 0.3813 265 +267 3 307.3768 358.1418 26.32 0.394 266 +268 3 307.0748 357.039 26.3197 0.3559 267 +269 3 307.0496 355.8973 26.3172 0.3051 268 +270 3 307.0507 354.7533 26.2984 0.2542 269 +271 3 307.0553 353.6104 26.1772 0.2034 270 +272 3 307.0828 352.6105 25.5343 0.3432 271 +273 3 307.283 351.4997 25.1034 0.3559 272 +274 3 307.4809 350.4026 24.4773 0.3559 273 +275 3 307.3997 349.2735 24.096 0.3305 274 +276 3 307.0027 348.2039 24.0856 0.3432 275 +277 3 306.5405 347.1571 24.1139 0.3559 276 +278 3 306.0269 346.1366 24.2662 0.3813 277 +279 3 305.424 345.2009 24.9024 0.3686 278 +280 3 304.7788 344.2639 25.1969 0.3559 279 +281 3 304.1507 343.3075 25.2 0.3432 280 +282 3 303.5684 342.3226 25.2 0.3432 281 +283 3 303.0387 341.309 25.1994 0.3432 282 +284 3 302.4747 340.3137 25.1966 0.3305 283 +285 3 302.6303 339.8584 26.0229 0.3051 284 +286 3 302.5056 338.7967 25.7527 0.2924 285 +287 3 302.2574 337.8552 25.8852 0.2669 286 +288 3 302.3592 336.7742 26.4726 0.2415 287 +289 3 302.1647 335.7125 26.32 0.2288 288 +290 3 302.0995 334.7538 25.76 0.2288 289 +291 3 301.6705 333.778 26.2718 0.2415 290 +292 3 301.6728 332.7324 25.7723 0.2542 291 +293 3 301.5584 331.8755 26.01 0.2796 292 +294 3 301.2175 330.9089 26.7624 0.2924 293 +295 3 301.317 329.8655 25.8532 0.3178 294 +296 3 300.9143 329.1608 26.6 0.1144 295 +297 3 300.9349 328.1186 25.6236 0.1271 296 +298 3 300.9864 327.0124 25.0527 0.1398 297 +299 3 300.9761 325.8707 24.92 0.178 298 +300 3 300.7519 324.9612 26.04 0.2034 299 +301 3 300.1227 324.221 25.48 0.2415 300 +302 3 300.0712 323.1663 25.8308 0.2415 301 +303 3 300.0243 322.06 25.9627 0.2669 302 +304 3 300.1902 320.9686 26.1288 0.2924 303 +305 3 300.4899 319.9905 25.2162 0.3178 304 +306 3 300.745 318.9255 24.6338 0.2924 305 +307 3 301.1809 317.8913 24.36 0.2415 306 +308 3 301.3868 316.8056 24.08 0.2288 307 +309 3 301.3719 315.8767 25.3949 0.2542 308 +310 3 301.1431 314.7796 25.7961 0.3051 309 +311 3 300.904 313.6905 26.2492 0.3305 310 +312 3 300.5322 312.7662 27.1765 0.3305 311 +313 3 299.9511 311.9585 26.7476 0.3178 312 +314 3 299.5267 311.2366 27.16 0.2924 313 +315 3 298.7281 310.5777 26.3374 0.2924 314 +316 3 297.9708 309.9611 26.717 0.2669 315 +317 3 297.4217 309.0688 26.2268 0.2669 316 +318 3 297.1986 308.2039 25.4047 0.2415 317 +319 3 296.5957 307.3631 25.2 0.2415 318 +320 3 296.4653 306.3815 25.5682 0.2161 319 +321 3 296.0066 305.5144 26.04 0.1907 320 +322 3 295.4929 304.6689 26.7464 0.1652 321 +323 3 294.8077 303.978 26.1408 0.1398 322 +324 3 294.1567 303.4826 26.7235 0.1271 323 +325 3 294.1293 302.6406 28.2878 0.1271 324 +326 3 294.2368 301.5744 28.1999 0.1652 325 +327 3 293.8375 301.1649 26.32 0.2161 326 +328 3 293.015 300.4899 26.6 0.2542 327 +329 3 293.0928 299.3962 27.0323 0.2669 328 +330 3 293.0207 298.3426 26.6 0.2796 329 +331 3 292.8995 297.2798 26.9385 0.3178 330 +332 3 292.7885 296.2102 27.4229 0.3305 331 +333 3 292.5128 295.2058 26.9578 0.3305 332 +334 3 291.9625 294.5697 27.72 0.2796 333 +335 3 291.4512 293.7083 27.44 0.2796 334 +336 3 291.2475 292.6489 27.9812 0.2542 335 +337 3 291.2349 291.7761 26.7338 0.2542 336 +338 3 291.9076 291.72 25.48 0.2161 337 +339 3 292.3069 291.2361 23.9173 0.2288 338 +340 3 291.9785 290.1939 24.0724 0.2542 339 +341 3 291.8252 289.4995 25.5035 0.2796 340 +342 3 292.2897 288.7525 25.48 0.2669 341 +343 3 292.3492 287.7686 26.1618 0.2415 342 +344 3 292.1696 286.8466 26.2441 0.2415 343 +345 3 292.4064 286.2196 26.5037 0.2415 344 +346 3 292.4064 285.5092 25.0272 0.2415 345 +347 3 292.5208 284.4133 24.64 0.2415 346 +348 3 292.8926 283.7463 25.8023 0.2924 347 +349 3 293.0013 283.1434 27.8916 0.3305 348 +350 3 293.1592 282.1047 27.8317 0.3559 349 +351 3 292.8411 281.5464 28.7456 0.3305 350 +352 3 292.6764 281.0568 30.2599 0.3178 351 +353 3 293.0436 280.1496 31.0741 0.2924 352 +354 3 293.5378 279.3351 30.5595 0.2796 353 +355 3 294.0252 278.604 31.1926 0.2796 354 +356 3 294.9266 278.0378 31.309 0.2924 355 +357 3 295.8224 277.4955 30.8216 0.2924 356 +358 3 296.8074 277.0024 30.8904 0.2669 357 +359 3 297.8427 276.7267 30.52 0.2288 358 +360 3 298.4822 276.371 31.08 0.2161 359 +361 3 299.3024 275.7646 31.08 0.2034 360 +362 3 299.8035 274.9547 31.0453 0.2161 361 +363 3 300.0357 275.1148 29.0368 0.1907 362 +364 3 300.5048 274.4765 27.8421 0.1907 363 +365 3 300.7576 274.242 29.6722 0.1652 364 +366 3 300.7931 273.4675 30.5452 0.1652 365 +367 3 300.6432 273.0019 28.6852 0.1398 366 +368 3 301.0676 272.844 26.9069 0.1271 367 +369 3 301.317 271.9666 26.1671 0.1144 368 +370 3 301.5584 271.4117 26.6 0.1271 369 +371 3 301.6442 270.2826 26.6596 0.1525 370 +372 3 301.6728 269.2175 27.4072 0.1907 371 +373 3 301.8341 268.8308 29.7044 0.2034 372 +374 3 302.6612 268.2932 30.42 0.1907 373 +375 3 303.581 267.72 30.5497 0.1525 374 +376 3 304.4985 267.3093 29.8306 0.1271 375 +377 3 305.5716 266.9581 29.6887 0.1144 376 +378 3 306.5634 266.4742 29.4 0.1271 377 +379 3 306.9478 265.7981 30.24 0.1398 378 +380 3 307.6399 264.9195 30.24 0.1652 379 +381 3 308.0792 264.0341 30.2403 0.1907 380 +382 3 308.7587 263.2195 30.7994 0.2288 381 +383 3 309.6328 262.7413 29.9695 0.2669 382 +384 3 310.596 262.3192 30.24 0.2924 383 +385 3 301.7803 329.2398 25.1208 0.2669 295 +386 3 302.6292 328.6048 25.1552 0.3051 385 +387 3 303.0731 327.8567 23.6205 0.3305 386 +388 3 303.3064 326.9083 23.9865 0.3559 387 +389 3 303.692 326.0823 23.6636 0.3178 388 +390 3 304.0706 325.3319 23.5407 0.2796 389 +391 3 304.5065 324.3457 23.8202 0.2161 390 +392 3 304.8554 323.3699 22.9236 0.1907 391 +393 3 304.3212 322.4764 22.5865 0.2161 392 +394 3 304.0683 321.6722 22.3101 0.3051 393 +395 3 304.5328 320.9698 21.7448 0.3813 394 +396 3 304.9149 320.01 22.6696 0.3813 395 +397 3 304.9664 318.9403 22.0805 0.3178 396 +398 3 305.3874 317.9233 21.56 0.2669 397 +399 3 305.7569 316.848 21.7216 0.2924 398 +400 3 305.9079 315.8332 21.6532 0.3559 399 +401 3 305.7615 314.8402 21.56 0.3813 400 +402 3 305.7043 314.0086 20.1015 0.3432 401 +403 3 305.7226 312.9504 19.8926 0.3178 402 +404 3 306.3243 312.1598 19.6 0.3432 403 +405 3 306.6938 311.136 20.102 0.394 404 +406 3 306.4776 310.048 19.6238 0.3813 405 +407 3 306.2728 309.1752 18.7606 0.3432 406 +408 3 305.9536 308.5906 17.3617 0.3051 407 +409 3 306.2271 307.728 18.4929 0.3178 408 +410 3 306.3003 307.1571 19.88 0.3178 409 +411 3 306.2202 306.2385 19.4522 0.3305 410 +412 3 305.8324 305.472 18.692 0.3051 411 +413 3 306.0543 304.6483 17.0626 0.2669 412 +414 3 305.9125 303.7331 16.1081 0.1907 413 +415 3 306.3277 303.2332 17.9668 0.1398 414 +416 3 306.5028 302.3924 17.1954 0.1398 415 +417 3 306.6847 301.6236 15.4 0.1907 416 +418 3 306.4776 300.5402 14.8081 0.2669 417 +419 3 306.4021 299.5415 13.7206 0.3178 418 +420 3 306.6481 298.4707 14.2313 0.3432 419 +421 3 307.1548 297.4983 13.6046 0.3432 420 +422 3 307.5083 296.4276 13.433 0.3305 421 +423 3 308.0392 295.7034 14.5746 0.2924 422 +424 3 308.1261 294.7299 15.6968 0.2415 423 +425 3 308.3172 294.3867 18.051 0.1907 424 +426 3 308.5379 293.8272 18.3327 0.1652 425 +427 3 308.6478 293.0402 19.8005 0.1398 426 +428 3 308.9944 292.1776 19.32 0.1271 427 +429 3 301.7563 339.7005 25.1784 0.2161 284 +430 3 300.7198 339.2406 25.0488 0.2415 429 +431 3 299.8596 338.5531 24.4076 0.2669 430 +432 3 299.2475 337.6127 24.6694 0.2924 431 +433 3 298.584 336.7032 24.2603 0.3051 432 +434 3 298.1012 335.669 24.1738 0.3178 433 +435 3 297.4766 334.7241 24.5151 0.3432 434 +436 3 296.8074 333.8272 25.0947 0.3686 435 +437 3 295.9677 333.055 25.1944 0.3432 436 +438 3 295.1497 332.2554 25.1891 0.2796 437 +439 3 294.58 331.2658 25.1412 0.2161 438 +440 3 293.8501 330.3941 24.841 0.2161 439 +441 3 292.9281 329.79 24.1032 0.2669 440 +442 3 291.9122 329.2649 24.0794 0.2924 441 +443 3 291.0954 328.4641 24.0778 0.2924 442 +444 3 290.3941 327.6359 24.0705 0.3305 443 +445 3 289.9731 326.5754 24.0218 0.3432 444 +446 3 289.5922 325.508 23.6622 0.3051 445 +447 3 289.106 324.4739 23.7756 0.2542 446 +448 3 288.5031 323.5049 23.9355 0.2415 447 +449 3 287.9848 322.5348 23.1792 0.2669 448 +450 3 287.4334 321.5361 22.9522 0.2796 449 +451 3 286.8923 320.5294 22.9141 0.2924 450 +452 3 286.2116 319.6176 22.7242 0.2796 451 +453 3 285.3342 318.9369 22.0601 0.2924 452 +454 3 284.5483 318.1338 21.6026 0.2796 453 +455 3 284.0644 317.1328 20.9616 0.3178 454 +456 3 283.6754 316.0609 20.7477 0.3432 455 +457 3 283.2533 315.0096 20.9504 0.3686 456 +458 3 282.751 314.131 21.5046 0.3178 457 +459 3 282.099 313.6791 20.1116 0.2669 458 +460 3 281.1414 313.1506 19.8066 0.2415 459 +461 3 280.5111 312.9858 18.4475 0.2796 460 +462 3 279.9883 312.4344 20.0788 0.3051 461 +463 3 279.1726 311.8727 19.88 0.3178 462 +464 3 278.2094 311.3465 19.4373 0.3051 463 +465 3 277.2335 310.874 19.6932 0.3051 464 +466 3 276.2577 310.342 19.3332 0.2924 465 +467 3 275.4512 309.7449 19.7425 0.2924 466 +468 3 274.9089 308.9761 18.7628 0.3051 467 +469 3 274.7613 307.982 18.7228 0.3305 468 +470 3 273.9949 307.4958 18.8647 0.3432 469 +471 3 273.5144 306.7899 19.5331 0.3305 470 +472 3 272.7399 306.1367 19.32 0.3178 471 +473 3 272.4093 305.3805 18.76 0.2924 472 +474 3 271.5158 304.8314 18.6668 0.2669 473 +475 3 270.834 304.3749 18.5816 0.2415 474 +476 3 270.7082 303.5444 17.3958 0.2161 475 +477 3 270.7139 302.4542 17.08 0.2161 476 +478 3 270.556 301.6739 18.9095 0.2161 477 +479 3 270.2174 300.8331 19.88 0.2415 478 +480 3 270.9656 300.2531 19.3606 0.2669 479 +481 3 271.0102 299.3917 18.7132 0.3305 480 +482 3 270.8317 298.4341 18.4951 0.3686 481 +483 3 270.7402 297.4068 18.2034 0.3686 482 +484 3 269.9657 296.7433 17.8536 0.3051 483 +485 3 269.5744 295.7663 17.6047 0.2542 484 +486 3 269.5275 294.842 17.9556 0.2415 485 +487 3 268.7084 294.572 17.1433 0.2542 486 +488 3 268.1616 294.0114 16.5211 0.2669 487 +489 3 267.2498 293.5698 16.3058 0.2924 488 +490 3 266.2866 293.3811 16.2333 0.2924 489 +491 3 265.7706 292.5139 16.1266 0.2924 490 +492 3 265.2719 291.593 16.7759 0.2415 491 +493 3 264.6072 290.8048 17.08 0.2288 492 +494 3 290.4033 328.0706 22.5728 0.178 443 +495 3 289.7752 328.0123 24.1357 0.1525 494 +496 3 288.8131 327.8704 24.6543 0.1398 495 +497 3 288.288 327.5123 23.602 0.1398 496 +498 3 287.4792 327.184 22.8407 0.1525 497 +499 3 286.7264 327.0936 21.0204 0.1525 498 +500 3 285.9428 326.6063 21.8238 0.1652 499 +501 3 285.2942 326.4747 21.2932 0.1907 500 +502 3 284.4819 326.0572 20.72 0.2034 501 +503 3 283.5198 325.6579 21.28 0.2034 502 +504 3 282.6824 324.9429 21.252 0.178 503 +505 3 281.7638 324.4842 20.3174 0.1652 504 +506 3 280.8772 323.8023 20.0189 0.1525 505 +507 3 279.9036 323.2441 20.0203 0.1525 506 +508 3 278.9404 322.8368 19.6031 0.1525 507 +509 3 278.0698 322.3792 18.7673 0.1398 508 +510 3 276.9521 322.274 18.48 0.1271 509 +511 3 275.8298 322.1504 18.48 0.1271 510 +512 3 274.9032 321.8518 18.48 0.1398 511 +513 3 274.3392 321.0201 18.0141 0.178 512 +514 3 273.3428 320.5099 17.64 0.2161 513 +515 3 272.3212 320.034 17.6308 0.2669 514 +516 3 271.4277 319.4197 17.4751 0.2796 515 +517 3 270.5537 318.7756 17.1772 0.2796 516 +518 3 269.5573 318.3683 18.0026 0.2669 517 +519 3 268.6352 318.1144 18.5111 0.2542 518 +520 3 267.7864 318.3741 18.2311 0.2288 519 +521 3 267.0725 317.8032 18.2185 0.1907 520 +522 3 266.1413 317.6648 19.2688 0.1652 521 +523 3 265.0511 317.5744 19.567 0.1398 522 +524 3 263.9288 317.4611 19.32 0.1398 523 +525 3 263.2344 317.1225 19.1408 0.1652 524 +526 3 262.7848 316.2165 19.908 0.2034 525 +527 3 262.4336 315.8492 18.5679 0.2161 526 +528 3 261.6511 315.6353 17.5641 0.2161 527 +529 3 260.864 315.6296 17.08 0.2288 528 +530 3 259.7715 315.6353 17.3732 0.2669 529 +531 3 258.8346 315.1823 17.8254 0.2796 530 +532 3 257.8015 314.9203 17.668 0.2796 531 +533 3 256.8326 314.497 17.9544 0.3051 532 +534 3 255.8911 314.473 16.6197 0.3178 533 +535 3 254.9804 314.012 17.0663 0.3305 534 +536 3 254.1922 313.5704 18.4369 0.2924 535 +537 3 253.5104 312.8966 19.0089 0.3051 536 +538 3 253.0528 312.7696 18.2 0.1652 537 +539 3 252.6181 312.5408 16.998 0.2796 537 +540 3 251.7566 312.4138 16.9548 0.2796 539 +541 3 251.3322 312.7101 18.2 0.2415 540 +542 3 250.3964 312.3463 17.1422 0.2034 541 +543 3 249.781 311.6336 16.4004 0.2034 542 +544 3 249.6322 310.9289 16.7597 0.2288 543 +545 3 249.0751 310.7104 16.2016 0.2415 544 +546 3 248.3006 310.4736 15.9664 0.2542 545 +547 3 247.6691 309.9096 16.7026 0.2415 546 +548 3 247.0125 309.5893 18.4528 0.2542 547 +549 3 246.1636 309.3914 19.6 0.2415 548 +550 3 246.278 308.8994 17.7568 0.2288 549 +551 3 246.6464 308.5116 16.4433 0.2034 550 +552 3 246.0469 308.0426 15.7161 0.178 551 +553 3 245.8456 307.7749 17.827 0.1652 552 +554 3 246.0744 307.0496 17.92 0.1525 553 +555 3 307.5175 353.1997 23.016 0.2924 271 +556 3 307.1079 353.4194 20.7553 0.2796 555 +557 3 306.1733 353.7763 19.4611 0.2415 556 +558 3 305.3004 353.9181 17.8702 0.1907 557 +559 3 304.256 353.7042 16.879 0.1652 558 +560 3 303.168 353.6642 16.0686 0.1525 559 +561 3 302.286 354.0817 15.9202 0.1525 560 +562 3 302.1373 355.0839 16.8627 0.1652 561 +563 3 302.5102 356.1112 16.9459 0.1907 562 +564 3 302.6143 357.1053 15.9138 0.2161 563 +565 3 301.968 357.8981 15.2757 0.2161 564 +566 3 300.9315 358.2653 15.6022 0.2034 565 +567 3 300.4544 358.9998 16.791 0.178 566 +568 3 301.0928 359.5867 15.6106 0.178 567 +569 3 302.016 359.5592 14.0 0.1907 568 +570 3 306.1218 356.5768 26.1514 0.3178 268 +571 3 305.2238 356.245 24.876 0.3178 570 +572 3 304.2125 356.0048 24.7976 0.2669 571 +573 3 303.295 355.6799 24.3214 0.2415 572 +574 3 302.3295 355.6582 24.92 0.1907 573 +575 3 301.2072 355.5998 25.121 0.178 574 +576 3 300.2485 355.3058 24.0128 0.2034 575 +577 3 299.3287 355.2886 22.96 0.2542 576 +578 3 298.3483 354.9958 23.0737 0.2796 577 +579 3 297.4926 354.8654 22.8934 0.2796 578 +580 3 296.5488 354.5256 22.6873 0.2796 579 +581 3 295.5993 354.1069 21.8565 0.3051 580 +582 3 294.7299 353.377 21.56 0.3305 581 +583 3 293.9634 352.598 22.0142 0.3305 582 +584 3 293.0184 352.1415 21.5642 0.3305 583 +585 3 292.2256 351.6416 21.7003 0.3305 584 +586 3 291.3596 351.0272 21.3592 0.3305 585 +587 3 290.4227 350.525 21.0731 0.3178 586 +588 3 289.4 350.1475 20.8603 0.3178 587 +589 3 289.0064 349.333 20.16 0.3305 588 +590 3 288.2239 348.5757 20.6489 0.3305 589 +591 3 287.549 347.7691 20.7827 0.2796 590 +592 3 286.6429 347.2852 19.8761 0.2415 591 +593 3 285.9348 346.6148 19.8573 0.2161 592 +594 3 285.0036 346.2064 20.1401 0.2288 593 +595 3 284.3469 345.8655 19.6622 0.2034 594 +596 3 283.7074 345.4114 19.4219 0.178 595 +597 3 283.14 344.9137 19.4622 0.1525 596 +598 3 282.6481 344.1816 20.6951 0.1652 597 +599 3 281.837 343.6679 19.6288 0.1907 598 +600 3 280.9881 343.2629 19.88 0.2161 599 +601 3 280.0512 342.914 19.88 0.2415 600 +602 3 279.3019 342.382 19.4384 0.2542 601 +603 3 278.3855 341.8924 19.8755 0.2796 602 +604 3 277.4875 341.341 19.3486 0.2796 603 +605 3 276.6135 340.8399 19.32 0.2796 604 +606 3 275.7555 340.0986 19.3869 0.2669 605 +607 3 275.1126 339.3035 19.1041 0.2542 606 +608 3 274.4033 338.4764 19.0551 0.2161 607 +609 3 273.8862 337.4617 19.164 0.1652 608 +610 3 273.1323 336.6517 19.32 0.1525 609 +611 3 272.4882 335.7766 19.32 0.1907 610 +612 3 272.264 335.2423 19.32 0.2034 611 +613 3 271.5856 334.5056 19.32 0.2415 612 +614 3 272.59 335.1714 19.5513 0.2034 611 +615 3 272.3841 334.0732 19.9839 0.2415 614 +616 3 271.9368 333.198 19.6078 0.2669 615 +617 3 271.239 332.4819 19.9755 0.2669 616 +618 3 270.3421 331.8138 20.3748 0.2161 617 +619 3 269.7083 330.8986 19.8016 0.178 618 +620 3 269.3182 329.9376 19.3113 0.1398 619 +621 3 268.8743 328.9149 19.32 0.1271 620 +622 3 268.117 328.0843 19.1159 0.1271 621 +623 3 267.2075 327.5478 19.3166 0.1398 622 +624 3 266.1836 327.0971 19.04 0.1525 623 +625 3 265.0934 326.8786 19.3945 0.1398 624 +626 3 264.2228 326.5068 20.72 0.1271 625 +627 3 263.3477 326.3889 19.3189 0.1144 626 +628 3 262.3993 325.9336 18.48 0.1144 627 +629 3 261.2667 325.8112 18.48 0.1271 628 +630 3 260.1273 325.7837 18.48 0.1398 629 +631 3 259.3677 325.1683 18.3674 0.1525 630 +632 3 258.7145 324.419 17.7086 0.1398 631 +633 3 257.8553 323.7051 17.92 0.1271 632 +634 3 257.0213 322.9947 17.92 0.1144 633 +635 3 256.3155 322.171 17.92 0.1144 634 +636 3 255.7137 321.2741 17.897 0.1398 635 +637 3 255.3111 320.8989 16.849 0.1907 636 +638 3 254.6452 320.0088 16.8566 0.2669 637 +639 3 253.7346 319.3339 16.8582 0.3178 638 +640 3 253.07 318.5823 16.9044 0.3432 639 +641 3 252.379 317.7082 16.8224 0.3432 640 +642 3 251.4546 317.428 16.4956 0.3559 641 +643 3 250.4948 317.0173 16.6286 0.394 642 +644 3 249.7386 316.2005 16.52 0.4195 643 +645 3 249.0133 315.3493 16.2977 0.4195 644 +646 3 248.129 314.6561 16.6116 0.3686 645 +647 3 247.4655 314.1058 16.4615 0.3432 646 +648 3 246.6178 313.5178 16.3047 0.3178 647 +649 3 245.5848 313.1094 16.87 0.3178 648 +650 3 244.7119 312.4584 17.4672 0.3051 649 +651 3 243.7784 311.8372 17.4846 0.3305 650 +652 3 242.9662 311.1165 17.1632 0.3432 651 +653 3 242.4765 310.4702 16.6365 0.3432 652 +654 3 241.6872 309.9073 16.3302 0.2924 653 +655 3 241.4115 309.452 18.1269 0.2415 654 +656 3 241.4206 309.4703 16.52 0.1907 655 +657 3 241.0774 308.4647 16.5217 0.1652 656 +658 3 241.4069 307.633 14.966 0.178 657 +659 3 241.1506 306.7842 14.9271 0.2161 658 +660 3 240.5752 306.6137 16.8932 0.2415 659 +661 3 240.1954 305.6962 16.6281 0.2288 660 +662 3 240.2617 305.0339 18.0849 0.1907 661 +663 3 240.637 304.4173 17.92 0.1907 662 +664 3 240.6301 303.9196 17.0405 0.2034 663 +665 3 240.3738 303.0834 15.96 0.2669 664 +666 3 239.9803 302.4015 15.3524 0.3051 665 +667 3 239.3591 301.579 15.1256 0.3305 666 +668 3 238.7471 300.9978 16.1073 0.3051 667 +669 3 238.0195 300.4075 15.8668 0.2669 668 +670 3 237.9165 300.014 14.0358 0.2542 669 +671 3 237.2736 299.3196 14.2419 0.2288 670 +672 3 236.6936 299.156 12.88 0.2034 671 +673 3 312.0306 368.2181 26.1411 0.1652 1 +674 3 311.78 367.1565 25.3375 0.2161 673 +675 3 311.2504 366.223 24.3908 0.2542 674 +676 3 310.9037 365.2781 23.0723 0.2415 675 +677 3 311.2183 364.1935 22.96 0.2161 676 +678 3 311.8498 363.6547 22.9597 0.394 677 +679 3 312.7696 362.9752 22.958 0.4195 678 +680 3 313.6047 362.1938 22.9513 0.4068 679 +681 3 314.4742 361.4502 22.9222 0.394 680 +682 3 315.4214 360.813 22.7665 0.3686 681 +683 3 316.2851 360.1198 22.0604 0.3432 682 +684 3 317.1465 359.3739 21.84 0.3051 683 +685 3 318.0148 358.6314 21.84 0.2669 684 +686 3 318.8362 357.8363 21.84 0.2542 685 +687 3 319.6416 357.023 21.84 0.2415 686 +688 3 320.4333 356.197 21.84 0.2542 687 +689 3 321.1666 355.3218 21.84 0.2669 688 +690 3 321.8404 354.3986 21.8394 0.3178 689 +691 3 322.5485 353.5017 21.8375 0.3559 690 +692 3 323.2601 352.6105 21.8285 0.3559 691 +693 3 324.1169 351.8612 21.7795 0.3305 692 +694 3 325.047 351.2286 21.429 0.2924 693 +695 3 325.8169 350.469 20.6265 0.2924 694 +696 3 326.5079 349.6098 19.9601 0.2796 695 +697 3 327.3293 348.8342 19.6504 0.2796 696 +698 3 328.1415 348.046 19.936 0.2669 697 +699 3 328.8657 347.1971 20.151 0.2924 698 +700 3 329.5349 346.2865 19.7893 0.3432 699 +701 3 330.3106 345.4571 19.5244 0.3686 700 +702 3 331.1239 344.6792 19.0999 0.3559 701 +703 3 331.9099 343.8727 18.6348 0.3051 702 +704 3 332.5951 342.9655 18.5945 0.2924 703 +705 3 333.2735 342.0823 19.14 0.2924 704 +706 3 334.0423 341.2644 19.6092 0.3051 705 +707 3 334.8465 340.4761 20.097 0.3051 706 +708 3 335.6896 339.7302 20.5808 0.2924 707 +709 3 336.6186 339.0736 20.7189 0.2796 708 +710 3 337.5704 338.4398 20.7152 0.2669 709 +711 3 338.4787 337.7466 20.6982 0.2669 710 +712 3 339.3905 337.0556 20.6136 0.2542 711 +713 3 340.4155 336.797 19.9066 0.2288 712 +714 3 340.888 336.7021 20.7054 0.2034 713 +715 3 341.7357 336.2182 20.4498 0.178 714 +716 3 342.6898 335.8143 19.9534 0.1907 715 +717 3 343.5409 335.6496 18.6522 0.2288 716 +718 3 344.1221 334.8843 18.1961 0.2924 717 +719 3 344.5465 334.0194 18.6458 0.3178 718 +720 3 345.0476 333.0459 19.0036 0.2796 719 +721 3 345.3461 332.1272 19.264 0.2161 720 +722 3 345.8907 331.3127 19.6795 0.1652 721 +723 3 346.5256 330.8276 19.49 0.1525 722 +724 3 346.7864 330.0337 19.9335 0.178 723 +725 3 347.0107 329.2009 20.7088 0.1907 724 +726 3 347.3138 328.5774 19.2556 0.2288 725 +727 3 346.5519 328.328 17.5574 0.2415 726 +728 3 346.5359 327.9951 15.68 0.2796 727 +729 3 346.6 327.2984 15.0192 0.2924 728 +730 3 346.2888 326.4496 14.6462 0.2796 729 +731 3 346.2888 326.1544 17.2052 0.2542 730 +732 3 346.7773 325.3822 17.92 0.2288 731 +733 3 347.204 324.721 18.5643 0.2288 732 +734 3 347.2635 323.7509 18.1902 0.2415 733 +735 3 347.3962 322.8585 17.0125 0.2415 734 +736 3 347.744 321.9651 18.2 0.2669 735 +737 3 347.911 320.9641 17.3768 0.2796 736 +738 3 348.5459 320.1141 17.8315 0.3305 737 +739 3 348.8056 319.3693 18.0029 0.3686 738 +740 3 349.2781 318.3969 17.5647 0.394 739 +741 3 349.8352 317.7185 17.08 0.394 740 +742 3 350.1326 316.8537 16.2173 0.3686 741 +743 3 350.31 315.8206 16.0096 0.3559 742 +744 3 350.5582 314.7338 16.387 0.3305 743 +745 3 350.8797 313.782 17.4628 0.3051 744 +746 3 351.526 313.0636 18.3985 0.2796 745 +747 3 352.0946 312.2262 17.7682 0.2415 746 +748 3 353.0052 311.5707 17.92 0.2288 747 +749 3 353.774 310.9575 16.8146 0.2034 748 +750 3 354.5439 310.4724 15.6842 0.2288 749 +751 3 355.1411 310.008 15.7872 0.2288 750 +752 3 355.8458 309.3994 15.0598 0.2542 751 +753 3 356.2656 308.6054 14.56 0.2669 752 +754 3 356.9337 307.8401 15.12 0.2924 753 +755 3 357.595 307.053 14.9226 0.3178 754 +756 3 358.3042 306.4273 16.2442 0.3178 755 +757 3 358.9231 305.8244 15.3765 0.3051 756 +758 3 359.1668 304.828 15.6624 0.2796 757 +759 3 359.4459 303.8464 15.2127 0.2415 758 +760 3 359.6622 302.8454 14.082 0.2288 759 +761 3 360.0889 302.1704 15.0889 0.2161 760 +762 3 360.5488 301.5893 14.4393 0.2542 761 +763 3 361.4491 301.2072 14.4878 0.2796 762 +764 3 362.1458 300.7187 15.4 0.2924 763 +765 3 362.759 300.2199 17.0999 0.2796 764 +766 3 363.1182 299.2921 16.681 0.2542 765 +767 3 363.5632 298.433 15.4311 0.2415 766 +768 3 363.6467 297.7626 17.2939 0.2034 767 +769 3 363.8389 297.0968 16.7356 0.1907 768 +770 3 364.3114 296.717 16.2686 0.1907 769 +771 3 364.1558 295.9128 17.3474 0.2161 770 +772 3 364.2496 294.9186 16.1381 0.2288 771 +773 3 364.2302 294.5823 13.8012 0.2161 772 +774 3 363.8721 293.8639 14.3632 0.2034 773 +775 3 364.4784 293.0928 15.4 0.178 774 +776 3 311.2515 363.5666 23.2739 0.3051 677 +777 3 311.6279 362.8608 25.2036 0.2415 776 +778 3 311.7995 362.4352 27.6895 0.2034 777 +779 3 312.0535 362.0497 29.6856 0.2034 778 +780 3 311.5078 361.1825 30.4539 0.2542 779 +781 3 310.7596 360.3772 30.875 0.3051 780 +782 3 310.1064 359.4757 31.3404 0.3305 781 +783 3 310.2482 358.7836 32.2291 0.3432 782 +784 3 311.0708 358.1349 33.3287 0.3305 783 +785 3 311.3007 357.1156 34.0796 0.2924 784 +786 3 310.8854 356.0746 34.2222 0.2669 785 +787 3 310.453 355.0518 34.853 0.2542 786 +788 3 310.9861 354.1298 35.4858 0.2796 787 +789 3 311.9345 353.5864 36.2782 0.3051 788 +790 3 312.4516 352.5831 36.6072 0.3559 789 +791 3 311.7903 351.3453 38.0428 0.2924 790 +792 3 311.2183 350.4884 39.1381 0.3178 791 +793 3 310.8305 349.4863 40.0814 0.394 792 +794 3 310.3603 348.5288 41.0603 0.4322 793 +795 3 309.7723 347.6341 41.9689 0.4195 794 +796 3 309.0219 346.8276 42.6549 0.3305 795 +797 3 308.2005 346.0703 43.1046 0.2669 796 +798 3 307.3882 345.2649 43.169 0.2288 797 +799 3 306.5634 344.479 43.379 0.2288 798 +800 3 305.6402 344.0008 44.0409 0.2415 799 +801 3 304.9469 343.2915 44.3948 0.2542 800 +802 3 304.5317 342.4106 44.1983 0.2669 801 +803 3 304.2834 341.5046 44.1126 0.2542 802 +804 3 303.6393 340.5951 43.68 0.2415 803 +805 3 302.8088 339.8389 43.68 0.2415 804 +806 3 301.9863 339.2589 43.0254 0.2415 805 +807 3 301.2461 338.4261 43.001 0.2161 806 +808 3 300.5551 337.6642 43.4 0.1907 807 +809 3 299.7463 336.9 43.3958 0.1907 808 +810 3 298.8277 336.2433 43.1981 0.2288 809 +811 3 297.9788 335.5398 43.68 0.2415 810 +812 3 297.3634 334.6154 43.96 0.2415 811 +813 3 296.3921 334.2642 44.4906 0.2415 812 +814 3 295.581 333.5732 44.3167 0.2796 813 +815 3 295.0216 333.0184 43.12 0.3305 814 +816 3 294.2654 332.3503 43.4904 0.3559 815 +817 3 293.6602 331.5873 43.5422 0.3432 816 +818 3 292.999 330.9363 43.68 0.3051 817 +819 3 292.2623 330.0955 43.96 0.2669 818 +820 3 291.6205 329.1997 43.4826 0.2161 819 +821 3 290.8254 328.4127 43.12 0.178 820 +822 3 290.1253 327.5238 43.12 0.178 821 +823 3 289.5441 326.7115 42.9195 0.2034 822 +824 3 288.9744 326.1292 43.0903 0.2415 823 +825 3 288.439 325.206 43.1589 0.2415 824 +826 3 288.4367 324.1616 42.8431 0.2669 825 +827 3 288.1393 323.1789 42.7966 0.2542 826 +828 3 287.5558 322.2545 42.56 0.2542 827 +829 3 286.977 321.2947 42.2531 0.2161 828 +830 3 286.4233 320.4584 41.5663 0.2161 829 +831 3 285.3388 320.1701 41.44 0.2034 830 +832 3 284.6798 319.3682 41.1695 0.1907 831 +833 3 283.9557 318.5926 40.8853 0.178 832 +834 3 283.2899 317.9885 39.7424 0.2034 833 +835 3 282.2248 317.6122 39.3862 0.2669 834 +836 3 281.7706 316.8617 39.8717 0.3051 835 +837 3 281.535 315.8595 39.4708 0.3305 836 +838 3 280.9172 315.7486 38.099 0.3305 837 +839 3 280.3063 314.9981 38.456 0.3305 838 +840 3 279.4643 314.5279 38.0993 0.2796 839 +841 3 278.8523 313.718 39.058 0.2161 840 +842 3 278.2505 312.8977 38.6389 0.178 841 +843 3 277.5664 312.2594 37.4657 0.2034 842 +844 3 276.9944 311.406 37.1272 0.2288 843 +845 3 276.3858 310.8957 38.5666 0.2669 844 +846 3 275.6823 310.7035 37.5376 0.2542 845 +847 3 274.6092 310.5068 36.96 0.2669 846 +848 3 273.551 310.2597 36.5106 0.2161 847 +849 3 272.9492 309.5824 35.8218 0.1907 848 +850 3 271.9677 309.1614 35.84 0.1525 849 +851 3 271.1429 308.5242 36.4 0.1652 850 +852 3 270.3375 307.8207 36.7111 0.1907 851 +853 3 269.4612 307.1308 36.7223 0.2288 852 +854 3 268.7794 306.2568 36.7875 0.2669 853 +855 3 268.0552 305.4217 36.5316 0.3178 854 +856 3 267.601 304.5808 36.0287 0.3432 855 +857 3 267.2407 303.8464 35.3214 0.3686 856 +858 3 266.9581 303.176 35.2694 0.3432 857 +859 3 266.7511 302.4221 35.5496 0.3432 858 +860 3 266.1344 301.6877 35.5541 0.3305 859 +861 3 265.6746 300.872 34.5332 0.3305 860 +862 3 265.6368 300.5288 35.56 0.2415 861 +863 3 265.4034 300.2096 34.7141 0.2669 861 +864 3 265.0145 299.3356 35.2612 0.2542 863 +865 3 264.542 298.33 35.0022 0.2796 864 +866 3 264.2114 297.678 33.3169 0.3051 865 +867 3 263.9711 296.9435 32.0051 0.3305 866 +868 3 263.6405 296.1393 33.0145 0.3305 867 +869 3 263.6771 295.0982 33.6196 0.3051 868 +870 3 264.0249 294.2746 34.2286 0.2415 869 +871 3 264.0352 293.293 33.3214 0.2034 870 +872 3 264.2732 292.3069 33.532 0.2034 871 +873 3 264.2365 291.4512 32.0158 0.2669 872 +874 3 264.0924 290.4273 32.3109 0.3178 873 +875 3 263.4632 289.7134 32.2 0.3178 874 +876 3 263.3442 288.6564 32.48 0.2924 875 +877 3 263.3156 287.8956 31.4336 0.2796 876 +878 3 262.8683 287.1257 29.8343 0.3051 877 +879 3 262.397 286.2528 30.2599 0.3305 878 +880 3 261.706 286.0812 31.92 0.3305 879 +881 3 261.2633 285.2244 31.2833 0.2924 880 +882 3 260.5609 284.5483 30.24 0.2542 881 +883 3 260.0621 283.9797 31.3284 0.2288 882 +884 3 259.4054 283.2716 31.3894 0.2542 883 +885 3 258.5371 282.6424 30.7597 0.2924 884 +886 3 257.9194 281.8839 30.2347 0.3305 885 +887 3 257.4 281.2135 29.4294 0.3305 886 +888 3 256.9859 280.4276 29.5809 0.2796 887 +889 3 256.2331 279.9368 28.4547 0.2288 888 +890 3 255.4804 279.454 29.4 0.2034 889 +891 3 255.2092 279.1349 29.9348 0.2924 890 +892 3 254.6544 279.5936 30.8 0.2669 891 +893 3 255.0617 278.945 29.9289 0.2924 890 +894 3 254.0424 278.5732 29.0458 0.2161 893 +895 3 253.2107 278.326 29.1578 0.1907 894 +896 3 252.4259 277.6522 28.5659 0.1652 895 +897 3 252.3653 276.8594 27.72 0.1525 896 +898 3 251.6789 276.1193 27.587 0.1525 897 +899 3 251.108 275.2384 27.6749 0.1652 898 +900 3 250.9833 274.1356 27.1768 0.1652 899 +901 3 250.1585 273.5304 26.8562 0.1652 900 +902 3 249.3851 273.1597 26.1033 0.1398 901 +903 3 248.7331 273.4126 27.44 0.1271 902 +904 3 247.6051 273.4046 27.1631 0.1398 903 +905 3 246.8775 272.9984 28.56 0.1652 904 +906 3 245.8216 272.8223 27.83 0.1907 905 +907 3 244.7782 272.844 26.88 0.1907 906 +908 3 243.6354 272.8749 26.9052 0.2034 907 +909 3 242.6046 273.1426 27.0446 0.2288 908 +910 3 241.5819 273.1506 27.4898 0.2288 909 +911 3 240.8669 272.5717 27.5058 0.2034 910 +912 3 240.4562 272.1565 26.2601 0.1525 911 +913 3 239.4438 272.0432 25.76 0.1398 912 +914 3 238.7974 271.9288 27.3535 0.1398 913 +915 3 238.1225 271.2676 27.6744 0.1525 914 +916 3 237.3537 271.3568 26.3194 0.1525 915 +917 3 236.8069 270.969 25.1166 0.1525 916 +918 3 236.7028 270.6704 27.0304 0.1525 917 +919 3 236.3504 269.9291 28.4668 0.1398 918 +920 3 236.3195 268.824 28.8728 0.1525 919 +921 3 235.6834 268.0495 28.2523 0.178 920 +922 3 235.5839 267.2064 27.1216 0.2415 921 +923 3 236.1216 266.4376 27.16 0.2796 922 +924 3 254.4988 278.0858 29.4 0.2161 893 +925 3 254.2037 277.0505 29.0338 0.2288 924 +926 3 253.9428 276.0632 29.1939 0.2161 925 +927 3 253.5825 275.0805 29.6388 0.178 926 +928 3 253.5104 274.0955 28.84 0.1398 927 +929 3 253.5104 272.9515 28.84 0.1271 928 +930 3 253.1409 271.8865 28.8534 0.1398 929 +931 3 252.5437 270.9347 28.5692 0.1652 930 +932 3 252.252 269.9291 28.28 0.178 931 +933 3 252.5758 268.951 28.273 0.1907 932 +934 3 252.5986 267.9626 28.7207 0.178 933 +935 3 252.7096 266.9856 28.3861 0.1652 934 +936 3 252.1856 266.155 28.28 0.1525 935 +937 3 251.4398 265.3817 28.28 0.1525 936 +938 3 250.3678 265.0648 28.2072 0.1525 937 +939 3 249.2593 265.2684 28.0101 0.1652 938 +940 3 248.3418 265.2833 27.2443 0.2034 939 +941 3 247.6989 264.4962 27.4792 0.2288 940 +942 3 247.0205 263.8693 26.9744 0.2288 941 +943 3 246.27 263.0342 27.2429 0.178 942 +944 3 245.3274 262.5503 28.0 0.1652 943 +945 3 244.5918 261.9863 27.1821 0.178 944 +946 3 243.7155 261.7278 27.0357 0.2288 945 +947 3 243.2991 260.9475 26.0495 0.2415 946 +948 3 243.2144 260.1753 26.4396 0.2415 947 +949 3 242.9295 259.3185 26.5426 0.2161 948 +950 3 242.4422 258.5062 25.9938 0.2034 949 +951 3 242.1825 257.4721 25.48 0.178 950 +952 3 241.9423 256.3807 25.9484 0.178 951 +953 3 241.5682 255.3648 26.2539 0.178 952 +954 3 240.8726 254.4817 26.6224 0.2034 953 +955 3 240.121 253.6992 26.7128 0.2161 954 +956 3 239.6222 252.8 26.7966 0.2288 955 +957 3 239.5033 251.7406 26.4695 0.2161 956 +958 3 239.5628 250.6069 26.6647 0.1907 957 +959 3 239.5467 249.4641 26.6 0.1525 958 +960 3 239.1029 248.4688 27.0866 0.1271 959 +961 3 238.389 247.6291 27.44 0.1144 960 +962 3 237.7507 246.7574 27.44 0.1271 961 +963 3 237.5722 245.6362 27.44 0.1525 962 +964 3 236.9636 244.8126 27.7875 0.1907 963 +965 3 236.7348 243.8916 28.338 0.2161 964 +966 3 236.236 243.1057 28.716 0.2288 965 +967 3 235.6915 242.3873 29.461 0.2161 966 +968 3 234.8049 241.956 28.6479 0.2034 967 +969 3 233.7661 241.7615 28.56 0.1907 968 +970 3 232.939 241.1232 28.8002 0.2034 969 +971 3 231.9746 240.5683 28.3027 0.2034 970 +972 3 231.0537 239.8968 28.222 0.1907 971 +973 3 230.0881 239.3728 28.2402 0.1525 972 +974 3 229.4864 238.5972 28.56 0.1398 973 +975 3 229.0631 237.5745 28.56 0.1525 974 +976 3 228.3561 236.6822 28.56 0.178 975 +977 3 227.8745 236.0129 27.5131 0.178 976 +978 3 227.4272 235.124 28.28 0.1525 977 +979 3 227.2201 234.0567 28.28 0.1271 978 +980 3 226.9696 233.0774 28.28 0.1271 979 +981 3 226.7946 232.0192 28.28 0.1525 980 +982 3 225.956 231.66 27.1432 0.178 981 +983 3 226.0567 230.8901 27.3364 0.178 982 +984 3 225.8256 229.8468 27.72 0.1525 983 +985 3 225.8256 228.7028 27.72 0.1271 984 +986 3 225.8256 227.5588 27.72 0.1271 985 +987 3 225.7112 226.4331 27.9947 0.1398 986 +988 3 225.4984 225.5476 28.4824 0.1525 987 +989 3 225.6986 224.5661 28.285 0.1652 988 +990 3 225.7112 223.4232 28.28 0.1907 989 +991 3 312.7742 352.0122 37.4774 0.394 790 +992 3 313.4629 352.018 39.2 0.3559 991 +993 3 314.5531 352.1232 39.0611 0.3051 992 +994 3 315.6937 352.1232 39.2 0.2415 993 +995 3 316.6272 352.2319 40.0697 0.2161 994 +996 3 317.2449 351.6645 39.4985 0.2161 995 +997 3 317.8615 351.5501 38.3634 0.2034 996 +998 3 318.8236 351.3087 39.2 0.1652 997 +999 3 319.9539 351.1966 39.256 0.1271 998 +1000 3 320.9915 350.827 39.5508 0.1271 999 +1001 3 322.0085 350.4781 40.32 0.1525 1000 +1002 3 323.1388 350.2997 40.32 0.178 1001 +1003 3 324.0357 349.9496 39.5024 0.178 1002 +1004 3 325.0436 349.9496 40.32 0.1525 1003 +1005 3 326.0537 349.7242 39.48 0.1525 1004 +1006 3 326.9049 349.1271 39.1737 0.1907 1005 +1007 3 327.8933 348.6546 38.4574 0.2669 1006 +1008 3 328.9126 348.3091 38.2824 0.2924 1007 +1009 3 329.9422 348.1512 39.0362 0.2924 1008 +1010 3 330.8162 347.6513 38.8066 0.2542 1009 +1011 3 331.6685 347.0953 38.7383 0.2415 1010 +1012 3 332.443 346.5176 39.0572 0.2161 1011 +1013 3 333.5298 346.2716 38.9567 0.2161 1012 +1014 3 334.6006 345.9422 39.2 0.2415 1013 +1015 3 335.7148 345.75 39.2 0.2796 1014 +1016 3 336.6552 345.2066 38.92 0.2796 1015 +1017 3 337.6367 344.7204 38.906 0.2415 1016 +1018 3 338.5222 344.1083 38.64 0.2034 1017 +1019 3 339.3493 343.7068 39.4472 0.1907 1018 +1020 3 340.1306 343.1268 38.703 0.178 1019 +1021 3 341.1374 342.8007 38.8433 0.1525 1020 +1022 3 341.6968 342.0343 38.2917 0.1271 1021 +1023 3 342.7699 341.8272 38.4994 0.1271 1022 +1024 3 343.8807 341.8272 38.92 0.1398 1023 +1025 3 344.9995 341.6831 38.64 0.1525 1024 +1026 3 345.9765 341.2277 39.3921 0.1398 1025 +1027 3 346.9214 340.809 39.48 0.1271 1026 +1028 3 347.9201 340.3514 39.2 0.1271 1027 +1029 3 348.7152 339.768 39.17 0.1398 1028 +1030 3 349.8158 339.5861 39.2465 0.1525 1029 +1031 3 350.4941 338.9157 40.054 0.1398 1030 +1032 3 351.184 338.0497 40.1649 0.1398 1031 +1033 3 351.9779 337.2375 40.04 0.1398 1032 +1034 3 352.7627 336.4161 39.7754 0.1525 1033 +1035 3 353.4537 335.7834 40.304 0.1398 1034 +1036 3 354.0062 334.8179 40.2942 0.1398 1035 +1037 3 354.6022 333.9977 39.5335 0.1398 1036 +1038 3 354.8688 333.2232 40.1047 0.1525 1037 +1039 3 354.8688 332.1146 39.76 0.1398 1038 +1040 3 354.926 330.9821 39.76 0.1398 1039 +1041 3 355.5575 330.1161 39.9524 0.1525 1040 +1042 3 355.6868 329.2466 41.44 0.178 1041 +1043 3 356.0872 328.233 41.0396 0.2034 1042 +1044 3 356.928 327.6416 40.6 0.2034 1043 +1045 2 313.9491 377.5497 28.194 0.2034 1 +1046 2 314.3346 378.4878 29.4406 0.3051 1045 +1047 2 315.2921 379.0438 29.8995 0.394 1046 +1048 2 316.1364 379.7222 30.7801 0.4449 1047 +1049 2 316.2531 380.8536 30.8048 0.4576 1048 +1050 2 316.5425 381.9599 30.8286 0.4449 1049 +1051 3 314.7499 376.7741 26.964 0.1398 1 +1052 3 315.3905 377.7213 26.8498 0.178 1051 +1053 3 315.8264 378.5427 27.6531 0.2288 1052 +1054 3 316.9498 378.5324 27.44 0.2288 1053 +1055 3 317.5115 378.2064 29.1007 0.2288 1054 +1056 3 318.6543 378.2064 29.12 0.2288 1055 +1057 3 319.7903 378.3094 29.12 0.2924 1056 +1058 3 320.6632 378.2762 28.1529 0.3432 1057 +1059 3 321.3084 377.6104 28.7398 0.3686 1058 +1060 3 322.314 377.091 28.9512 0.3432 1059 +1061 3 323.3836 376.7192 28.9022 0.3051 1060 +1062 3 324.5196 376.3852 28.6958 0.2669 1061 +1063 3 325.341 376.6426 28.6843 0.2288 1062 +1064 3 325.9519 376.4424 29.4493 0.178 1063 +1065 3 327.0158 376.1472 29.4 0.1652 1064 +1066 3 327.7938 375.7274 28.28 0.1907 1065 +1067 3 328.5396 375.621 28.4964 0.2415 1066 +1068 3 329.3553 375.3624 29.5546 0.2669 1067 +1069 3 330.2305 375.5535 30.5978 0.2796 1068 +1070 3 331.1937 375.2675 31.8942 0.2669 1069 +1071 3 332.0037 375.0032 30.6956 0.2924 1070 +1072 3 332.9761 374.6886 30.0754 0.2924 1071 +1073 3 333.9359 374.6108 29.9622 0.2796 1072 +1074 3 335.025 374.4312 30.3635 0.2669 1073 +1075 3 335.7148 373.842 31.2332 0.2924 1074 +1076 3 336.7101 373.4771 30.5354 0.3432 1075 +1077 3 337.5178 373.2231 30.7376 0.3178 1076 +1078 3 338.5462 372.8857 30.6348 0.2796 1077 +1079 3 339.6216 372.8548 30.3873 0.2161 1078 +1080 3 340.6043 372.6569 29.9838 0.2288 1079 +1081 3 341.1408 372.4784 28.2072 0.2288 1080 +1082 3 341.6625 372.8799 27.72 0.2288 1081 +1083 3 342.1189 373.3616 27.72 0.2924 1082 +1084 3 342.7962 374.0514 27.47 0.3178 1083 +1085 3 343.7068 374.231 28.3346 0.3178 1084 +1086 3 344.4401 374.0777 27.4652 0.3178 1085 +1087 3 345.2009 374.0571 26.1884 0.3559 1086 +1088 3 345.6035 374.088 24.6884 0.394 1087 +1089 3 345.8312 374.7378 25.1006 0.4068 1088 +1090 3 346.6251 375.0032 25.5178 0.3813 1089 +1091 3 347.4351 375.3922 25.951 0.3686 1090 +1092 3 348.3251 375.1187 24.9511 0.3559 1091 +1093 3 349.3765 375.232 24.64 0.3305 1092 +1094 3 349.7208 375.7079 23.2184 0.2669 1093 +1095 3 350.334 376.249 23.3806 0.2288 1094 +1096 3 351.1096 376.0248 22.3401 0.2288 1095 +1097 3 351.9287 375.6804 23.0812 0.2669 1096 +1098 3 352.789 375.4333 21.9601 0.2924 1097 +1099 3 353.83 375.4436 21.0022 0.2924 1098 +1100 3 354.6526 375.4608 21.4315 0.2796 1099 +1101 3 355.7531 375.6919 21.28 0.2669 1100 +1102 3 356.4029 376.336 20.44 0.2796 1101 +1103 3 357.3604 376.2616 20.1211 0.2924 1102 +1104 3 358.4026 376.5407 20.4168 0.2924 1103 +1105 3 358.9586 376.948 19.04 0.3051 1104 +1106 3 359.7891 377.4193 19.6935 0.3178 1105 +1107 3 360.6368 377.52 20.55 0.3432 1106 +1108 3 361.6813 377.6424 20.1704 0.3178 1107 +1109 3 362.767 377.7042 20.2118 0.2669 1108 +1110 3 363.6307 378.2339 19.6834 0.2288 1109 +1111 3 364.269 378.664 19.0453 0.2161 1110 +1112 3 365.1053 379.1674 20.1905 0.2542 1111 +1113 3 365.8992 379.538 19.4121 0.2796 1112 +1114 3 366.5845 380.2233 19.1332 0.3178 1113 +1115 3 367.1439 380.7976 20.44 0.3305 1114 +1116 3 367.8566 381.4039 19.3466 0.3432 1115 +1117 3 368.4389 381.8111 20.44 0.3432 1116 +1118 3 369.226 382.4266 20.7158 0.3305 1117 +1119 3 370.0279 383.1416 20.713 0.2924 1118 +1120 3 370.6549 383.987 20.9905 0.2288 1119 +1121 3 371.0964 384.956 20.0603 0.1907 1120 +1122 3 371.6238 385.9067 19.6862 0.1907 1121 +1123 3 372.356 386.7098 20.0836 0.2161 1122 +1124 3 373.135 387.5106 19.6006 0.2161 1123 +1125 3 373.7803 388.2484 20.2082 0.2034 1124 +1126 3 374.4426 389.151 19.7098 0.2161 1125 +1127 3 375.113 390.0571 19.3166 0.2288 1126 +1128 3 375.9092 390.7812 19.6 0.2288 1127 +1129 3 376.8302 391.2457 19.1556 0.178 1128 +1130 3 377.9238 391.4951 19.32 0.1652 1129 +1131 3 379.0518 391.6759 19.32 0.178 1130 +1132 3 380.1798 391.7822 19.516 0.2161 1131 +1133 3 381.2083 391.7159 19.0711 0.2034 1132 +1134 3 382.1726 391.7662 19.4855 0.178 1133 +1135 3 383.2457 391.9905 20.2056 0.1652 1134 +1136 3 384.3817 392.0488 20.454 0.1907 1135 +1137 3 385.48 391.9767 20.9412 0.2161 1136 +1138 3 386.434 392.0259 20.1698 0.2288 1137 +1139 3 387.3744 392.5602 20.72 0.2161 1138 +1140 3 388.2828 393.0464 20.3428 0.2161 1139 +1141 3 389.2334 393.6424 19.9416 0.2161 1140 +1142 3 390.1097 394.3254 20.3162 0.2542 1141 +1143 3 391.1325 394.7246 20.8312 0.2796 1142 +1144 3 392.0133 395.4064 20.9084 0.2924 1143 +1145 3 393.0761 395.7771 21.1176 0.2542 1144 +1146 3 394.0405 395.9224 21.1081 0.1907 1145 +1147 3 395.1193 396.1523 21.3027 0.1525 1146 +1148 3 396.237 396.2816 20.8933 0.1525 1147 +1149 3 397.3421 396.1672 21.28 0.1907 1148 +1150 3 398.3351 396.0082 20.3633 0.2034 1149 +1151 3 399.4047 395.7176 20.417 0.1907 1150 +1152 3 400.1929 395.1456 19.6 0.1652 1151 +1153 3 401.3369 395.1376 19.6 0.1525 1152 +1154 3 402.4134 394.807 19.6 0.1525 1153 +1155 3 403.3389 394.8756 20.6735 0.1525 1154 +1156 3 404.3228 394.3334 20.503 0.178 1155 +1157 3 405.3009 393.7614 20.4666 0.2034 1156 +1158 3 406.2447 393.3678 19.9531 0.2161 1157 +1159 3 407.0055 393.1928 20.4142 0.1907 1158 +1160 3 407.5958 393.1528 18.769 0.1652 1159 +1161 3 408.543 392.7352 18.4736 0.1525 1160 +1162 3 409.6412 392.9514 18.2 0.1652 1161 +1163 3 410.7852 392.964 18.177 0.2034 1162 +1164 3 411.9006 393.075 17.7422 0.2415 1163 +1165 3 412.9199 393.2271 18.2246 0.2415 1164 +1166 3 413.6704 393.3507 18.3546 0.1907 1165 +1167 3 414.5936 393.3072 17.64 0.1652 1166 +1168 3 415.7319 393.2786 17.5336 0.1652 1167 +1169 3 416.8393 393.1928 17.801 0.2161 1168 +1170 3 417.7945 393.4216 19.0028 0.2415 1169 +1171 3 418.6651 393.3667 17.7052 0.2924 1170 +1172 3 419.7473 393.0784 17.9161 0.2924 1171 +1173 3 420.8284 393.0933 17.6568 0.2796 1172 +1174 3 421.7276 393.2431 18.4052 0.2288 1173 +1175 3 422.7091 393.29 17.4513 0.2034 1174 +1176 3 423.5614 392.9823 17.9018 0.1907 1175 +1177 3 424.6379 392.8496 17.92 0.2034 1176 +1178 3 425.2694 392.6643 16.6939 0.2288 1177 +1179 3 426.0942 392.1643 15.8841 0.2669 1178 +1180 3 426.1434 391.407 14.6555 0.2924 1179 +1181 3 426.9763 390.8533 14.9456 0.2924 1180 +1182 3 427.9349 390.4541 14.5032 0.2669 1181 +1183 3 428.8547 390.0651 15.4031 0.2161 1182 +1184 3 429.8992 389.9896 16.3702 0.1907 1183 +1185 3 430.8304 390.2184 17.36 0.1907 1184 +1186 3 341.2243 372.5573 28.089 0.1652 1082 +1187 3 340.34 372.4098 28.9332 0.2288 1186 +1188 3 328.2433 375.4802 28.4889 0.2161 1066 +1189 3 328.7753 374.6692 29.5291 0.178 1188 +1190 3 328.6712 374.3557 31.3818 0.1907 1189 +1191 3 329.1345 373.476 31.92 0.2034 1190 +1192 3 329.2707 372.4509 32.2176 0.2669 1191 +1193 3 330.0108 371.7371 33.1324 0.2796 1192 +1194 3 330.9455 371.1182 33.32 0.2924 1193 +1195 3 331.4031 370.537 33.7296 0.2415 1194 +1196 3 331.4305 369.4994 33.847 0.2415 1195 +1197 3 331.4099 368.3897 33.7924 0.2415 1196 +1198 3 330.926 367.4837 34.44 0.2542 1197 +1199 3 330.6743 366.4026 34.839 0.2161 1198 +1200 3 330.7167 365.3375 35.5491 0.1652 1199 +1201 3 330.5016 364.3262 36.2132 0.1398 1200 +1202 3 330.0657 363.7188 35.0115 0.1398 1201 +1203 3 329.5269 362.8585 36.0828 0.1652 1202 +1204 3 329.1013 362.3483 38.2687 0.1907 1203 +1205 3 328.3646 361.8083 38.3583 0.2415 1204 +1206 3 327.6473 361.1402 38.6028 0.2669 1205 +1207 3 326.7847 360.5899 38.5532 0.2669 1206 +1208 3 325.9656 360.2605 39.3156 0.2161 1207 +1209 3 325.3536 359.963 39.48 0.1907 1208 +1210 3 324.5963 359.2263 39.48 0.1652 1209 +1211 3 323.5953 358.7893 39.4834 0.1652 1210 +1212 3 323.5827 358.485 41.4355 0.1398 1211 +1213 3 322.9512 357.762 41.16 0.1398 1212 +1214 3 322.6538 357.1568 42.336 0.1652 1213 +1215 3 322.0326 356.6695 43.68 0.2034 1214 +1216 3 321.9216 355.538 43.6122 0.2288 1215 +1217 3 322.3792 354.9889 44.133 0.2034 1216 +1218 3 322.2225 354.6389 46.4366 0.1907 1217 +1219 3 321.5086 354.1778 47.4281 0.1652 1218 +1220 3 321.1094 353.4605 49.0557 0.1652 1219 +1221 3 320.7707 353.2672 51.4408 0.1398 1220 +1222 3 319.748 353.0384 51.8 0.1398 1221 +1223 3 325.5172 376.5453 29.1396 0.2161 1063 +1224 3 326.5674 376.2158 29.4557 0.2542 1223 +1225 3 327.5398 375.8166 29.12 0.2415 1224 +1226 3 324.1158 376.376 28.849 0.4576 1061 +1227 3 324.761 376.0294 27.6923 0.2796 1226 +1228 3 324.435 375.6713 26.054 0.2288 1227 +1229 3 325.0104 375.4608 24.0803 0.1907 1228 +1230 3 325.492 375.232 25.6948 0.2034 1229 +1231 3 326.0812 375.0879 27.1382 0.2288 1230 +1232 3 326.5308 374.7744 25.347 0.2542 1231 +1233 3 326.7893 374.5834 22.8903 0.2542 1232 +1234 3 326.8145 375.1222 20.6702 0.2288 1233 +1235 3 327.5203 375.3464 18.7687 0.1907 1234 +1236 3 328.5751 375.232 18.951 0.1907 1235 +1237 3 329.3954 374.7824 19.9116 0.2161 1236 +1238 3 329.9605 373.8935 19.88 0.2415 1237 +1239 3 330.8414 373.7448 18.6074 0.2288 1238 +1240 3 331.6456 374.1074 18.6435 0.2034 1239 +1241 3 332.3755 374.4667 18.6777 0.2034 1240 +1242 3 332.5677 374.1509 19.3404 0.2415 1241 +1243 3 333.3708 374.0914 20.4873 0.2796 1242 +1244 3 333.9862 373.4096 19.6 0.2924 1243 +1245 3 334.342 372.8365 21.0227 0.2415 1244 +1246 3 334.9724 372.6008 22.6467 0.1907 1245 +1247 3 336.1072 372.6008 22.96 0.178 1246 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb_470522102_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb_470522102_m.swc new file mode 100644 index 0000000..c270082 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Pvalb_470522102_m.swc @@ -0,0 +1,1966 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/MouseCellTypes/176847.04.02.01/176847.04.02.01_MDF.swc_sorted.swc +# id,type,x,y,z,r,pid +1 1 237.4944 233.8336 35.28 5.9212 -1 +2 3 232.5043 230.7745 35.28 0.2669 1 +3 3 231.4495 231.199 35.28 0.2796 2 +4 3 230.3513 231.5181 35.28 0.2796 3 +5 3 229.2084 231.5159 35.28 0.2542 4 +6 3 228.0793 231.3282 35.28 0.2542 5 +7 3 226.9616 231.0846 35.28 0.2669 6 +8 3 225.8176 231.0617 35.28 0.3305 7 +9 3 224.6816 230.9313 35.2803 0.4576 8 +10 3 223.2768 230.103 35.2825 0.4068 9 +11 3 222.4268 229.3377 35.2898 0.3813 10 +12 3 221.523 228.6364 35.3265 0.3051 11 +13 3 220.8629 227.775 35.6944 0.4322 12 +14 3 220.4488 226.75 35.6216 0.4322 13 +15 3 220.1548 225.6803 34.9891 0.4068 14 +16 3 219.823 224.6198 34.3207 0.3305 15 +17 3 219.6572 223.5159 33.8643 0.2542 16 +18 3 219.7075 222.4039 33.2562 0.2288 17 +19 3 219.9523 221.3102 33.0162 0.2669 18 +20 3 220.5003 220.3138 32.8628 0.3178 19 +21 3 220.9121 219.2648 32.3744 0.3432 20 +22 3 220.7828 218.1482 31.9312 0.3559 21 +23 3 220.2623 217.1312 31.9368 0.3686 22 +24 3 220.2383 215.9895 32.0306 0.4068 23 +25 3 220.7977 214.4005 32.426 0.2288 24 +26 3 220.7211 213.2908 31.92 0.2796 25 +27 3 220.53 212.1754 31.6366 0.3305 26 +28 3 220.3333 211.0783 31.2928 0.3178 27 +29 3 219.7956 210.0899 31.5381 0.2924 28 +30 3 219.2911 209.1106 31.6926 0.2796 29 +31 3 219.0497 208.0135 31.1898 0.3051 30 +32 3 218.7763 206.921 30.8129 0.3178 31 +33 3 218.464 205.8205 30.77 0.2924 32 +34 3 218.2889 204.7039 30.5665 0.2542 33 +35 3 218.2821 203.5714 30.5469 0.2669 34 +36 3 218.321 202.4342 30.8241 0.3051 35 +37 3 218.5555 201.3246 31.1539 0.3178 36 +38 3 218.6104 200.208 31.7103 0.2924 37 +39 3 218.2374 199.159 31.2561 0.2924 38 +40 3 217.7867 198.1259 30.7882 0.3178 39 +41 3 217.2685 197.1112 30.5396 0.3305 40 +42 3 216.8612 196.156 29.3952 0.3051 41 +43 3 216.5695 195.0589 29.6587 0.3305 42 +44 3 216.0856 194.0224 29.741 0.3686 43 +45 3 214.9896 193.582 29.5781 0.2034 44 +46 3 214.1545 192.8349 29.1992 0.2161 45 +47 3 213.5436 191.9152 28.5219 0.1907 46 +48 3 212.808 191.0903 27.9535 0.1652 47 +49 3 212.3847 190.2243 26.7529 0.1907 48 +50 3 212.3012 189.141 26.1708 0.2415 49 +51 3 211.8299 188.1388 25.5808 0.2924 50 +52 3 211.6045 187.1424 24.353 0.2924 51 +53 3 211.8516 186.0933 23.4917 0.2542 52 +54 3 211.7727 184.9791 24.0668 0.2415 53 +55 3 210.9628 184.2446 23.9061 0.2415 54 +56 3 210.218 183.5571 23.1552 0.2796 55 +57 3 209.8805 182.6064 21.8562 0.2924 56 +58 3 209.6472 181.5928 21.107 0.2924 57 +59 3 209.4355 180.4889 21.1991 0.2669 58 +60 3 209.0706 179.4593 20.4764 0.2161 59 +61 3 208.7606 178.3965 20.16 0.178 60 +62 3 208.232 177.5488 20.16 0.178 61 +63 3 207.3752 177.1427 19.32 0.2161 62 +64 3 206.9748 176.1005 18.9241 0.2669 63 +65 3 206.3364 175.1773 18.48 0.2796 64 +66 3 205.9452 174.1111 18.48 0.2924 65 +67 3 205.4041 173.1158 18.2104 0.2669 66 +68 3 204.9098 172.1583 17.3872 0.2542 67 +69 3 204.7657 171.0383 17.1268 0.2161 68 +70 3 204.2257 170.0808 16.8725 0.2288 69 +71 3 203.1778 169.6403 16.8 0.2542 70 +72 3 202.218 169.0477 16.5819 0.3051 71 +73 3 201.3737 168.3247 16.1622 0.3051 72 +74 3 201.344 167.2093 15.7676 0.2669 73 +75 3 200.6576 166.5664 14.84 0.2161 74 +76 3 215.9494 194.0602 30.8 0.178 44 +77 3 215.7618 193.6575 30.8 0.1907 76 +78 3 215.7584 192.5135 30.8 0.2161 77 +79 3 215.4381 191.4347 30.8 0.2288 78 +80 3 215.064 190.3547 30.8 0.2161 79 +81 3 214.8638 189.229 30.8 0.2034 80 +82 3 214.7288 188.0953 30.8 0.178 81 +83 3 214.7391 186.9513 30.8 0.1525 82 +84 3 215.0354 185.868 31.0607 0.1398 83 +85 3 215.2894 184.8304 32.0354 0.1398 84 +86 3 215.6955 183.8339 32.737 0.1652 85 +87 3 215.9929 182.7346 32.76 0.178 86 +88 3 216.2858 181.634 32.76 0.1907 87 +89 3 216.5066 180.5587 32.2216 0.1907 88 +90 3 216.8406 179.505 31.92 0.178 89 +91 3 216.9024 178.3633 31.92 0.178 90 +92 3 216.9024 177.2193 31.92 0.178 91 +93 3 216.8258 176.0833 31.9827 0.2161 92 +94 3 216.6072 174.9965 32.5234 0.2542 93 +95 3 216.5592 173.8891 32.9048 0.2924 94 +96 3 216.5592 172.7795 33.488 0.2796 95 +97 3 216.5592 171.6366 33.6 0.2542 96 +98 3 216.5592 170.4926 33.6 0.2161 97 +99 3 216.51 169.3566 33.7218 0.2034 98 +100 3 216.4448 168.2229 33.88 0.1907 99 +101 3 216.4448 167.0812 33.9674 0.2161 100 +102 3 216.4448 165.9555 34.4448 0.2415 101 +103 3 216.4448 164.8744 35.0708 0.2415 102 +104 3 216.4448 163.7991 35.84 0.1907 103 +105 3 216.4448 162.6551 35.84 0.1525 104 +106 3 216.4448 161.5111 35.84 0.1398 105 +107 3 216.454 160.3671 35.84 0.1652 106 +108 3 216.5992 159.2334 35.84 0.178 107 +109 3 216.6736 158.0962 35.8672 0.1907 108 +110 3 216.6736 156.9591 36.1334 0.178 109 +111 3 216.8086 155.838 36.4 0.1652 110 +112 3 216.9996 154.7123 36.4 0.1525 111 +113 3 217.2239 153.6037 36.7189 0.1525 112 +114 3 217.2456 152.6611 37.7877 0.1398 113 +115 3 217.3497 151.5262 37.8 0.1271 114 +116 3 217.9183 150.6305 37.8 0.1144 115 +117 3 217.9732 149.4968 37.9033 0.1144 116 +118 3 218.2924 148.4569 38.64 0.1144 117 +119 3 218.7889 147.441 38.64 0.1271 118 +120 3 218.8472 146.3016 38.7374 0.1398 119 +121 3 219.0428 145.2148 39.3775 0.1525 120 +122 3 219.4341 144.176 39.6724 0.1398 121 +123 3 220.0427 143.2139 39.76 0.1271 122 +124 3 220.8538 142.4635 39.76 0.1144 123 +125 3 221.5081 141.6592 40.04 0.1144 124 +126 3 221.8182 140.569 40.04 0.1144 125 +127 3 222.2254 139.552 40.2016 0.1144 126 +128 3 222.4325 138.4595 40.6 0.1144 127 +129 3 222.7368 137.4161 40.6 0.1144 128 +130 3 222.7665 136.2744 40.6428 0.1144 129 +131 3 222.8706 135.1945 41.4442 0.1144 130 +132 3 223.0731 134.1271 42.0 0.1144 131 +133 3 223.2367 133.038 42.1842 0.1144 132 +134 3 223.4678 131.941 42.28 0.1144 133 +135 3 223.8808 130.9319 42.3525 0.1144 134 +136 3 224.3487 130.0717 43.12 0.1144 135 +137 3 224.8887 129.0787 43.2149 0.1144 136 +138 3 225.5041 128.239 44.3254 0.1144 137 +139 3 226.3141 127.6304 44.8 0.1144 138 +140 3 226.4376 126.5104 44.8 0.1144 139 +141 3 226.9021 125.6455 44.0115 0.1144 140 +142 3 227.3597 124.7383 43.4 0.1144 141 +143 3 227.7658 123.6893 43.4 0.1144 142 +144 3 227.8848 122.5682 43.12 0.1144 143 +145 3 228.3504 121.7079 42.5508 0.1144 144 +146 3 228.4911 120.6268 42.28 0.1144 145 +147 3 228.7931 119.5263 42.28 0.1144 146 +148 3 229.4441 118.722 42.9234 0.1144 147 +149 3 229.5711 117.6238 43.1978 0.1144 148 +150 3 229.7152 116.5324 43.68 0.1144 149 +151 3 229.706 115.4056 43.2849 0.1144 150 +152 3 229.4898 114.2952 43.12 0.1144 151 +153 3 229.4864 113.1517 43.12 0.1144 152 +154 3 229.4864 112.071 42.4463 0.1271 153 +155 3 229.4864 110.9306 42.28 0.1398 154 +156 3 229.4864 109.7952 42.1574 0.1652 155 +157 3 229.3434 108.8181 40.8668 0.1652 156 +158 3 229.1993 107.8714 39.4064 0.1652 157 +159 3 229.1432 106.7387 39.2 0.1525 158 +160 3 229.1398 105.5947 39.2 0.1525 159 +161 3 229.0288 104.4855 38.787 0.178 160 +162 3 229.0288 103.3659 38.36 0.2161 161 +163 3 228.8206 102.2481 38.36 0.2542 162 +164 3 228.6993 101.1362 38.0685 0.2415 163 +165 3 228.9144 100.2135 36.533 0.1907 164 +166 3 228.959 99.2882 35.0347 0.1398 165 +167 3 229.6809 98.7205 33.88 0.1144 166 +168 3 230.2872 97.835 33.88 0.1144 167 +169 3 230.81 96.8919 33.88 0.1144 168 +170 3 231.7824 96.2999 33.88 0.1144 169 +171 3 232.6416 95.581 33.88 0.1144 170 +172 3 233.0946 94.7028 33.88 0.1144 171 +173 3 233.7489 93.8609 33.88 0.1144 172 +174 3 234.52 93.3316 33.88 0.1271 173 +175 3 234.7545 92.236 33.88 0.1398 174 +176 3 235.5439 91.411 33.88 0.1525 175 +177 3 236.4648 90.971 34.384 0.1398 176 +178 3 236.5872 89.8573 34.44 0.1271 177 +179 3 237.4017 89.2013 33.8918 0.1144 178 +180 3 238.4348 89.1176 32.9459 0.1144 179 +181 3 239.1406 88.8369 31.351 0.1144 180 +182 3 239.5536 87.9258 30.2865 0.1144 181 +183 3 240.3361 87.2805 30.0434 0.1144 182 +184 3 241.0671 86.6914 29.12 0.1144 183 +185 3 241.8816 86.0381 28.84 0.1144 184 +186 3 243.005 85.8469 28.84 0.1144 185 +187 3 244.0644 85.4372 28.84 0.1144 186 +188 3 244.3332 84.347 28.8691 0.1144 187 +189 3 244.7531 83.4076 29.3272 0.1271 188 +190 3 245.8456 83.1688 29.4 0.1652 189 +191 3 218.8655 216.0352 29.6892 0.2288 24 +192 3 217.9709 215.4472 29.1472 0.2924 191 +193 3 217.3886 214.532 28.2688 0.3305 192 +194 3 216.7743 213.6306 27.501 0.3305 193 +195 3 216.0398 212.7897 26.9248 0.3178 194 +196 3 215.3271 211.934 26.3796 0.2924 195 +197 3 214.5435 211.1252 26.2102 0.3051 196 +198 3 213.5974 210.5166 25.7942 0.3178 197 +199 3 212.6971 209.8954 25.0183 0.3305 198 +200 3 211.8745 209.1552 24.3177 0.2924 199 +201 3 211.0348 208.4048 23.8599 0.2542 200 +202 3 210.115 207.8911 23.098 0.2288 201 +203 3 209.0717 207.7767 22.1598 0.2161 202 +204 3 207.9472 207.787 21.7213 0.1907 203 +205 3 206.9393 207.5765 20.9392 0.1652 204 +206 3 206.7494 208.2595 18.9126 0.1652 205 +207 3 205.7415 208.4505 18.3109 0.1652 206 +208 3 219.9901 228.7828 36.1637 0.178 12 +209 3 218.9582 228.649 35.8758 0.2288 208 +210 3 217.9652 228.6398 34.5369 0.2669 209 +211 3 216.8967 228.7188 33.6361 0.2924 210 +212 3 215.819 228.4968 33.8341 0.3305 211 +213 3 214.7391 228.1616 34.1113 0.3305 212 +214 3 213.666 227.823 33.7378 0.3178 213 +215 3 212.6181 227.5141 33.0005 0.2796 214 +216 3 211.5485 227.6537 32.3075 0.2669 215 +217 3 210.4674 227.7372 32.9966 0.2924 216 +218 3 209.3612 227.4672 33.04 0.3051 217 +219 3 208.2183 227.4226 33.04 0.3178 218 +220 3 207.0743 227.4055 33.04 0.3051 219 +221 3 205.9475 227.2384 33.0397 0.2924 220 +222 3 204.8321 226.9822 33.0383 0.2796 221 +223 3 203.7018 226.8243 33.0285 0.2669 222 +224 3 202.6321 226.4182 32.982 0.2542 223 +225 3 201.5522 226.0441 32.9017 0.2288 224 +226 3 200.5135 225.8199 33.9307 0.2034 225 +227 3 199.4587 225.9629 32.9574 0.2161 226 +228 3 198.436 225.7409 31.9197 0.2796 227 +229 3 197.3 225.6117 31.9183 0.3559 228 +230 3 196.1605 225.5018 31.9099 0.4195 229 +231 3 195.0646 225.2021 31.8469 0.4195 230 +232 3 193.9915 224.8509 31.4586 0.394 231 +233 3 192.8887 224.6484 30.9543 0.3305 232 +234 3 191.787 224.3727 30.8157 0.2796 233 +235 3 190.6979 224.0249 30.896 0.2288 234 +236 3 189.6088 223.7229 31.2715 0.2161 235 +237 3 188.5095 223.4884 31.4448 0.2161 236 +238 3 187.3975 223.6303 31.2682 0.2161 237 +239 3 186.321 223.7664 32.1437 0.1907 238 +240 3 185.2445 223.7653 31.1996 0.1907 239 +241 3 184.1497 223.7584 30.3957 0.2161 240 +242 3 183.0091 223.7069 30.3064 0.2542 241 +243 3 181.8949 223.509 30.2042 0.2542 242 +244 3 180.8618 223.6898 29.3157 0.2415 243 +245 3 179.9295 224.2503 30.1753 0.2161 244 +246 3 178.845 224.2503 29.8222 0.2034 245 +247 3 177.7135 224.184 29.4879 0.1907 246 +248 3 176.6233 223.9849 28.8907 0.2161 247 +249 3 175.5102 223.8064 28.5891 0.2415 248 +250 3 174.3685 223.7607 28.5614 0.2669 249 +251 3 173.2245 223.7309 28.5698 0.2415 250 +252 3 172.1022 223.5353 28.6236 0.2034 251 +253 3 170.98 223.342 28.8436 0.1652 252 +254 3 169.8485 223.2539 28.6614 0.1652 253 +255 3 168.7514 222.9702 28.5998 0.178 254 +256 3 167.8706 222.6418 27.5915 0.1907 255 +257 3 166.9302 222.0996 27.44 0.178 256 +258 3 165.9555 221.5196 27.3546 0.1652 257 +259 3 164.9293 221.0997 26.88 0.1652 258 +260 3 163.9455 220.5987 26.6 0.1907 259 +261 3 162.925 220.1148 26.6 0.2161 260 +262 3 161.8554 219.751 26.4146 0.2034 261 +263 3 160.8761 219.1687 26.32 0.178 262 +264 3 159.7756 218.9078 26.2284 0.1525 263 +265 3 158.7414 218.6218 25.529 0.1652 264 +266 3 157.6409 218.3759 25.2 0.1652 265 +267 3 156.5129 218.2752 24.943 0.1652 266 +268 3 155.3769 218.2752 24.6954 0.1525 267 +269 3 154.2444 218.2706 24.36 0.1525 268 +270 3 153.1095 218.1528 24.36 0.1525 269 +271 3 152.0262 218.0132 23.5824 0.1525 270 +272 3 150.9199 217.8176 23.3666 0.1525 271 +273 3 149.7988 217.8176 22.8351 0.1525 272 +274 3 148.6582 217.8176 22.68 0.1398 273 +275 3 147.5302 217.9663 22.5543 0.1271 274 +276 3 146.4286 218.1608 22.12 0.1144 275 +277 3 145.2846 218.1608 22.12 0.1144 276 +278 3 144.1417 218.1802 22.12 0.1144 277 +279 3 143.0206 218.4045 22.12 0.1144 278 +280 3 141.9544 218.7969 22.12 0.1144 279 +281 3 140.8161 218.8472 22.12 0.1271 280 +282 3 139.6767 218.9147 22.12 0.1398 281 +283 3 138.5418 218.9616 22.0276 0.1525 282 +284 3 137.455 218.8472 21.2582 0.1398 283 +285 3 136.327 218.8472 20.7978 0.1271 284 +286 3 135.1945 218.7328 20.72 0.1144 285 +287 3 134.0699 218.6195 20.4736 0.1144 286 +288 3 132.9305 218.6687 20.44 0.1144 287 +289 3 131.8014 218.8472 20.44 0.1144 288 +290 3 130.6574 218.8472 20.44 0.1271 289 +291 3 129.5145 218.8346 20.44 0.1398 290 +292 3 128.4975 218.4296 19.88 0.1525 291 +293 3 127.365 218.3896 19.7089 0.1398 292 +294 3 126.285 218.0819 19.6 0.1271 293 +295 3 125.1948 217.8062 19.5782 0.1144 294 +296 3 124.1103 217.487 19.32 0.1144 295 +297 3 122.9869 217.2753 19.32 0.1144 296 +298 3 121.8909 217.0168 19.1425 0.1144 297 +299 3 120.7526 216.9367 19.04 0.1144 298 +300 3 119.6269 216.788 19.04 0.1271 299 +301 3 118.5184 216.9024 19.04 0.1652 300 +302 3 224.1199 231.1955 36.0307 0.2034 9 +303 3 223.271 231.8064 37.0908 0.2161 302 +304 3 222.4096 232.518 37.329 0.2288 303 +305 3 221.5814 233.265 36.7937 0.2288 304 +306 3 220.7645 234.0441 36.5649 0.2415 305 +307 3 219.8962 234.7534 37.0205 0.2796 306 +308 3 219.0726 235.497 37.6709 0.3305 307 +309 3 218.4182 236.3882 38.3275 0.3432 308 +310 3 217.8714 237.3789 38.61 0.3305 309 +311 3 217.3062 238.373 38.64 0.2924 310 +312 3 216.6564 239.3134 38.6403 0.2796 311 +313 3 216.0822 240.2983 38.6408 0.2669 312 +314 3 215.5445 241.3085 38.645 0.2796 313 +315 3 214.8981 242.2489 38.6641 0.3178 314 +316 3 214.2312 243.1778 38.7545 0.3559 315 +317 3 213.682 244.1525 39.2815 0.3686 316 +318 3 213.0792 245.0894 39.902 0.3305 317 +319 3 212.5895 246.0744 40.6006 0.2924 318 +320 3 211.9935 247.0376 40.6193 0.2796 319 +321 3 211.2842 247.8785 39.8541 0.3051 320 +322 3 210.5829 248.7056 39.0071 0.3305 321 +323 3 209.7902 249.4995 39.5382 0.3432 322 +324 3 209.018 250.2786 40.3292 0.3432 323 +325 3 208.2812 251.1263 40.8374 0.3432 324 +326 3 207.4724 251.9351 40.8736 0.3432 325 +327 3 206.6281 252.705 40.8514 0.3178 326 +328 3 205.7038 253.3743 40.7123 0.2796 327 +329 3 204.8629 254.0961 40.0336 0.2288 328 +330 3 204.0747 254.8066 39.1622 0.2288 329 +331 3 203.2327 255.5364 39.6494 0.2288 330 +332 3 202.6813 256.5374 39.7046 0.2288 331 +333 3 202.1928 257.5636 39.4624 0.2034 332 +334 3 201.5751 258.4628 39.2529 0.2288 333 +335 3 200.6427 259.1011 39.6486 0.2796 334 +336 3 199.7401 259.7898 39.7603 0.3051 335 +337 3 199.0251 260.6753 39.7614 0.2669 336 +338 3 198.4348 261.6545 39.767 0.2288 337 +339 3 197.7679 262.58 39.7911 0.2161 338 +340 3 197.0448 263.4575 39.9608 0.2161 339 +341 3 196.3424 264.3418 40.3609 0.2161 340 +342 3 195.505 265.0785 40.3273 0.2542 341 +343 3 194.6276 265.7684 39.8247 0.3178 342 +344 3 193.8565 266.6103 39.76 0.3559 343 +345 3 193.1381 267.5004 39.76 0.3305 344 +346 3 192.3133 268.2806 39.76 0.2796 345 +347 3 191.3329 268.8594 39.7603 0.2542 346 +348 3 190.4188 269.5264 39.7608 0.2415 347 +349 3 189.6443 270.365 39.7636 0.2542 348 +350 3 188.7554 271.0159 40.1682 0.2161 349 +351 3 187.7064 271.4506 40.32 0.1907 350 +352 3 186.6024 271.7252 40.32 0.1398 351 +353 3 185.5957 272.2617 40.3365 0.1398 352 +354 3 184.6931 272.9527 40.6 0.1398 353 +355 3 183.8557 273.7192 40.6 0.1652 354 +356 3 183.2242 274.5875 41.1188 0.1652 355 +357 3 182.9736 275.6708 41.44 0.1652 356 +358 3 182.3181 276.5803 41.44 0.1398 357 +359 3 181.2199 276.8137 41.5184 0.1271 358 +360 3 180.7406 277.7071 41.72 0.1271 359 +361 3 180.2269 278.6978 42.2223 0.1525 360 +362 3 179.5394 279.5902 42.5401 0.178 361 +363 3 178.5784 280.1656 42.84 0.1907 362 +364 3 177.4824 280.4184 43.1147 0.178 363 +365 3 176.6347 281.0774 43.12 0.1652 364 +366 3 175.866 281.9205 43.12 0.1652 365 +367 3 175.0114 282.6549 43.2135 0.178 366 +368 3 174.1694 283.3711 43.68 0.1907 367 +369 3 173.0506 283.5907 43.68 0.1652 368 +370 3 172.0748 284.1433 43.68 0.1398 369 +371 3 171.2419 284.9143 43.68 0.1144 370 +372 3 170.5933 285.6957 43.96 0.1144 371 +373 3 169.8565 286.5674 43.96 0.1144 372 +374 3 168.9368 287.2138 43.9863 0.1144 373 +375 3 167.9701 287.7572 44.52 0.1144 374 +376 3 167.2013 288.5957 44.52 0.1144 375 +377 3 166.4932 289.4686 44.52 0.1144 376 +378 3 165.4956 290.0143 44.52 0.1144 377 +379 3 164.72 290.822 44.8935 0.1144 378 +380 3 164.0622 291.5072 45.92 0.1144 379 +381 3 163.6835 292.5586 45.92 0.1144 380 +382 3 162.7798 293.245 45.92 0.1144 381 +383 3 161.9252 294.0 45.92 0.1144 382 +384 3 160.9528 294.5892 45.92 0.1144 383 +385 3 160.0605 295.2847 45.92 0.1144 384 +386 3 159.4873 296.2697 45.92 0.1144 385 +387 3 158.9817 297.2947 45.92 0.1144 386 +388 3 158.3834 298.2683 45.92 0.1144 387 +389 3 157.5906 299.0176 45.92 0.1144 388 +390 3 156.8127 299.8493 45.9413 0.1144 389 +391 3 156.148 300.7404 46.48 0.1271 390 +392 3 155.4479 301.6259 46.76 0.1525 391 +393 3 154.5956 302.3855 46.76 0.178 392 +394 3 153.6495 303.009 47.0246 0.178 393 +395 3 152.7263 303.684 47.04 0.1525 394 +396 3 151.7173 304.1965 46.8524 0.1271 395 +397 3 150.7586 304.8016 46.76 0.1144 396 +398 3 149.856 305.4892 46.6203 0.1144 397 +399 3 148.8939 306.0966 46.48 0.1144 398 +400 3 148.0668 306.8448 46.48 0.1144 399 +401 3 147.1195 307.474 46.48 0.1144 400 +402 3 146.3611 308.3149 46.48 0.1271 401 +403 3 145.6564 309.1832 46.6612 0.1398 402 +404 3 144.6577 309.452 47.6 0.1525 403 +405 3 143.6807 309.9702 47.6 0.1398 404 +406 3 142.8055 310.6589 47.836 0.1271 405 +407 3 142.1878 311.3774 48.72 0.1144 406 +408 3 141.2394 311.8109 48.72 0.1144 407 +409 3 140.1675 312.1633 48.72 0.1144 408 +410 3 139.1081 312.59 48.72 0.1144 409 +411 3 138.0385 312.9824 48.6329 0.1144 410 +412 3 137.0432 313.4766 48.44 0.1144 411 +413 3 135.9941 313.9182 48.44 0.1144 412 +414 3 135.0755 314.5863 48.6951 0.1144 413 +415 3 134.0596 315.1091 48.72 0.1144 414 +416 3 133.0609 315.6651 48.72 0.1144 415 +417 3 132.1148 316.2885 48.4448 0.1398 416 +418 3 131.266 317.0299 48.6114 0.1652 417 +419 3 130.2089 317.4486 48.72 0.1907 418 +420 3 129.1759 317.8112 49.275 0.1652 419 +421 3 128.2859 318.4988 49.28 0.1398 420 +422 3 127.6715 319.4517 49.0244 0.1144 421 +423 3 126.7872 320.1495 49.0 0.1144 422 +424 3 125.7828 320.5488 49.0 0.1144 423 +425 3 124.6731 320.757 49.0596 0.1144 424 +426 3 123.6927 321.3347 49.28 0.1144 425 +427 3 122.7764 321.988 49.6667 0.1144 426 +428 3 121.7765 322.5005 49.84 0.1144 427 +429 3 121.097 323.299 49.84 0.1144 428 +430 3 120.5696 324.3057 49.9288 0.1144 429 +431 3 119.834 325.1511 50.4 0.1144 430 +432 3 119.0607 325.9531 50.9158 0.1144 431 +433 3 118.3457 326.8271 51.24 0.1144 432 +434 3 117.5174 327.6096 51.24 0.1271 433 +435 3 116.7475 328.4207 51.7913 0.1398 434 +436 3 115.925 329.146 52.2684 0.1525 435 +437 3 115.1642 329.7855 53.5248 0.1398 436 +438 3 114.3723 330.5176 53.2927 0.1271 437 +439 3 113.7229 331.4568 53.2 0.1144 438 +440 3 112.7701 332.0609 53.2 0.1144 439 +441 3 111.718 332.4944 53.2 0.1144 440 +442 3 110.7486 333.063 53.2 0.1144 441 +443 3 109.967 333.8913 53.2 0.1144 442 +444 3 109.1294 334.6669 53.2 0.1398 443 +445 3 108.5156 335.5009 53.683 0.1907 444 +446 3 107.7837 336.3738 53.76 0.2415 445 +447 3 107.2058 337.3015 53.76 0.2415 446 +448 3 106.2723 337.9582 53.8331 0.1907 447 +449 3 105.5559 338.8356 54.04 0.1398 448 +450 3 104.908 339.7772 54.04 0.1144 449 +451 3 104.1519 340.634 54.04 0.1144 450 +452 3 103.1077 341.0859 54.04 0.1144 451 +453 3 102.0581 341.5343 54.0862 0.1144 452 +454 3 101.8118 342.5491 54.32 0.1144 453 +455 3 101.6026 343.3865 54.8733 0.1144 454 +456 3 101.1508 343.1931 57.4014 0.1144 455 +457 3 100.4262 343.2755 58.8 0.1144 456 +458 3 99.3275 343.4105 58.8 0.1144 457 +459 3 98.8076 344.2285 59.2567 0.1144 458 +460 3 97.6953 344.4092 59.36 0.1144 459 +461 3 96.6997 344.9698 59.36 0.1144 460 +462 3 95.6858 345.4846 59.6268 0.1144 461 +463 3 94.7804 345.9696 60.5268 0.1144 462 +464 3 94.1035 346.8173 61.0176 0.1144 463 +465 3 93.3807 347.6788 61.04 0.1144 464 +466 3 92.7652 348.6168 61.2567 0.1144 465 +467 3 92.1127 349.5309 61.6 0.1144 466 +468 3 91.2521 350.2402 61.6 0.1144 467 +469 3 90.4192 351.0044 61.6 0.1144 468 +470 3 89.5734 351.7651 61.6 0.1144 469 +471 3 88.7967 352.5819 61.6 0.1144 470 +472 3 87.992 353.3667 61.6123 0.1144 471 +473 3 87.0861 353.965 62.16 0.1144 472 +474 3 86.2486 354.5828 62.7312 0.1144 473 +475 3 85.446 355.0312 63.84 0.1144 474 +476 3 84.7198 355.8847 63.84 0.1144 475 +477 3 84.2332 356.9074 63.973 0.1144 476 +478 3 83.7408 357.8432 64.68 0.1398 477 +479 3 82.8438 358.2722 64.68 0.1144 478 +480 3 81.9626 358.9506 64.4 0.1144 479 +481 3 81.2031 359.7846 64.4 0.1144 480 +482 3 80.4524 360.6346 64.4 0.1144 481 +483 3 79.7633 361.52 64.4 0.1144 482 +484 3 79.0041 362.2133 64.4 0.1144 483 +485 3 78.1748 362.9718 64.5162 0.1144 484 +486 3 77.7279 363.9899 64.68 0.1144 485 +487 3 76.9223 364.7164 64.68 0.1144 486 +488 3 75.9201 365.2552 64.6638 0.1144 487 +489 3 75.0315 365.9061 64.12 0.1144 488 +490 3 74.6171 366.7836 63.2976 0.1144 489 +491 3 74.0669 367.7045 62.9244 0.1144 490 +492 3 73.9024 368.7364 62.16 0.1144 491 +493 3 73.9024 369.8804 62.16 0.1144 492 +494 3 73.9024 371.0244 62.16 0.1144 493 +495 3 73.9024 372.1684 62.16 0.1144 494 +496 3 73.9024 373.3124 62.16 0.1144 495 +497 3 73.9024 374.4564 62.16 0.1144 496 +498 3 73.9024 375.5992 62.2776 0.1144 497 +499 3 73.5174 376.5396 62.7542 0.1271 498 +500 3 73.1628 377.5841 63.0 0.1398 499 +501 3 72.6368 378.5553 63.0 0.1652 500 +502 3 71.9363 379.3618 63.0 0.1652 501 +503 3 71.2712 380.1718 62.72 0.1652 502 +504 3 70.8321 381.0252 62.72 0.1398 503 +505 3 69.8133 381.5148 62.72 0.1271 504 +506 3 68.8119 381.8489 62.72 0.1144 505 +507 3 68.3347 382.8213 62.3829 0.1398 506 +508 3 67.8392 383.812 61.88 0.1652 507 +509 3 83.5032 357.0699 66.7646 0.178 478 +510 3 83.0829 356.0769 67.6987 0.1398 509 +511 3 82.6625 355.0839 68.6328 0.1144 510 +512 3 82.2813 354.0623 69.4529 0.1144 511 +513 3 81.9674 352.9926 70.077 0.1144 512 +514 3 81.6533 351.9219 70.7011 0.1144 513 +515 3 81.3393 350.8522 71.3252 0.1271 514 +516 3 81.0253 349.7826 71.9494 0.1398 515 +517 3 80.5544 349.0001 73.211 0.1525 516 +518 3 79.8958 348.5642 75.236 0.1398 517 +519 3 79.1332 348.1878 77.0781 0.1398 518 +520 3 78.2696 347.8721 78.7427 0.1398 519 +521 3 77.406 347.5552 80.4076 0.1525 520 +522 3 76.5425 347.2383 82.0725 0.1398 521 +523 3 75.7549 346.9775 83.9941 0.1271 522 +524 3 74.9835 346.7304 85.9709 0.1144 523 +525 3 74.2122 346.4821 87.9474 0.1144 524 +526 3 73.4408 346.2339 89.9242 0.1144 525 +527 3 72.4419 345.9227 90.9412 0.1144 526 +528 3 71.3976 345.6001 91.7672 0.1144 527 +529 3 70.3534 345.2764 92.5932 0.1144 528 +530 3 69.3092 344.9538 93.4192 0.1144 529 +531 3 68.265 344.63 94.2455 0.1144 530 +532 3 67.2208 344.3074 95.0715 0.1144 531 +533 3 240.6827 238.4599 38.6478 0.2796 1 +534 3 241.4549 238.6247 40.6739 0.2415 533 +535 3 242.3736 238.4977 43.2348 0.2161 534 +536 3 242.7145 238.993 45.3995 0.2034 535 +537 3 242.528 239.8968 46.7916 0.2669 536 +538 3 242.2191 240.6187 48.3557 0.3051 537 +539 3 242.4628 241.718 48.8544 0.3178 538 +540 3 243.1698 241.964 49.3766 0.3305 539 +541 3 244.2715 242.0384 49.9397 0.3559 540 +542 3 245.3903 241.8519 49.8896 0.3305 541 +543 3 246.5045 241.5956 49.84 0.3178 542 +544 3 247.6039 241.2788 49.8408 0.2796 543 +545 3 248.6987 240.947 49.845 0.3051 544 +546 3 249.781 240.6987 50.4 0.3051 545 +547 3 250.8849 240.8623 50.6097 0.2924 546 +548 3 251.8436 241.3829 51.249 0.2796 547 +549 3 252.8823 241.7627 51.52 0.2796 548 +550 3 253.7586 242.4022 51.8885 0.3051 549 +551 3 254.3615 242.9353 52.92 0.2542 550 +552 3 255.0365 242.9856 52.92 0.2161 551 +553 3 256.1782 243.0439 52.92 0.2288 552 +554 3 257.3165 243.1 53.0754 0.2669 553 +555 3 258.4353 243.1 53.6396 0.2669 554 +556 3 259.5747 243.1 53.7608 0.2924 555 +557 3 260.5654 243.5954 54.04 0.3051 556 +558 3 260.6627 243.839 54.04 0.1525 557 +559 3 261.2255 244.7828 54.04 0.178 558 +560 3 262.0996 245.4795 54.04 0.2161 559 +561 3 262.8786 246.3009 54.04 0.2669 560 +562 3 263.8224 246.9061 54.04 0.2669 561 +563 3 264.844 247.4129 54.04 0.2415 562 +564 3 265.7775 248.0592 54.04 0.2034 563 +565 3 266.8151 248.4768 54.04 0.178 564 +566 3 267.9145 248.7514 54.1671 0.178 565 +567 3 269.0059 249.0808 54.32 0.178 566 +568 3 270.024 249.5808 54.32 0.1907 567 +569 3 271.0308 250.0452 54.7688 0.2034 568 +570 3 272.0318 250.4651 55.4022 0.2161 569 +571 3 272.9492 251.132 55.6083 0.2288 570 +572 3 273.9079 251.6445 56.2598 0.2034 571 +573 3 274.512 252.1399 58.0854 0.1652 572 +574 3 275.1412 252.6581 59.691 0.1271 573 +575 3 275.8825 253.491 59.92 0.1144 574 +576 3 276.4465 254.4325 60.0603 0.1144 575 +577 3 276.5917 255.4644 60.7684 0.1144 576 +578 3 276.6192 256.5706 61.2942 0.1144 577 +579 3 276.7336 257.4069 62.7645 0.1144 578 +580 3 276.6787 258.5326 63.0 0.1144 579 +581 3 276.6192 259.672 63.0 0.1144 580 +582 3 276.3561 260.5746 64.0808 0.1144 581 +583 3 276.1616 261.4566 65.6936 0.1144 582 +584 3 275.8035 262.389 66.4457 0.1144 583 +585 3 275.4649 263.4106 67.3935 0.1144 584 +586 3 275.1263 264.4322 68.3413 0.1144 585 +587 3 274.8082 265.4629 69.2227 0.1271 586 +588 3 274.7751 266.6058 69.2227 0.1398 587 +589 3 274.7682 267.6628 69.7432 0.1525 588 +590 3 274.8357 268.4785 71.6993 0.1398 589 +591 3 275.4901 269.1569 72.8255 0.1271 590 +592 3 276.4007 269.7758 73.593 0.1144 591 +593 3 277.3102 270.3936 74.3607 0.1144 592 +594 3 278.2197 271.0125 75.1282 0.1144 593 +595 3 279.1291 271.6314 75.896 0.1144 594 +596 3 280.0901 272.1965 76.4898 0.1144 595 +597 3 281.0888 272.7216 76.9479 0.1144 596 +598 3 282.0887 273.2455 77.406 0.1144 597 +599 3 283.0874 273.7695 77.8641 0.1144 598 +600 3 284.0872 274.2946 78.3224 0.1144 599 +601 3 285.0859 274.8185 78.7805 0.1144 600 +602 3 286.0858 275.3425 79.2386 0.1144 601 +603 3 287.0857 275.8676 79.6967 0.1144 602 +604 3 288.0844 276.3915 80.155 0.1144 603 +605 3 289.0842 276.9155 80.6131 0.1144 604 +606 3 289.988 277.5939 81.0566 0.1144 605 +607 3 290.8917 278.2711 81.5004 0.1144 606 +608 3 291.7955 278.9484 81.944 0.1144 607 +609 3 292.6993 279.6268 82.3878 0.1144 608 +610 3 293.611 280.2846 82.8509 0.1144 609 +611 3 294.6532 280.6392 83.6136 0.1144 610 +612 3 295.6954 280.9927 84.376 0.1144 611 +613 3 296.7376 281.3474 85.1388 0.1144 612 +614 3 297.7798 281.7008 85.9015 0.1144 613 +615 3 298.7613 282.2008 86.5225 0.1144 614 +616 3 299.6719 282.8666 86.9812 0.1144 615 +617 3 300.5826 283.5324 87.4401 0.1144 616 +618 3 301.4943 284.1982 87.8987 0.1144 617 +619 3 302.405 284.864 88.3574 0.1144 618 +620 3 303.3167 285.531 88.816 0.1144 619 +621 3 304.0477 286.3535 89.4768 0.1144 620 +622 3 304.7147 287.2332 90.2101 0.1144 621 +623 3 305.3816 288.113 90.9434 0.1144 622 +624 3 306.0486 288.9927 91.677 0.1144 623 +625 3 306.7156 289.8736 92.4106 0.1144 624 +626 3 307.41 290.7339 93.1157 0.1144 625 +627 3 308.1524 291.5621 93.7706 0.1144 626 +628 3 308.8949 292.3904 94.4255 0.1144 627 +629 3 309.6385 293.2175 95.0804 0.1144 628 +630 3 310.3809 294.0458 95.7354 0.1144 629 +631 3 311.1234 294.874 96.3903 0.1144 630 +632 3 311.867 295.7011 97.0452 0.1398 631 +633 3 312.6094 296.5294 97.7001 0.1652 632 +634 3 260.8698 243.1378 55.44 0.1525 557 +635 3 261.5012 242.2958 55.44 0.1525 634 +636 3 262.3123 241.5716 55.6696 0.1525 635 +637 3 263.2882 241.1792 56.3637 0.1525 636 +638 3 264.1885 240.5386 56.84 0.1398 637 +639 3 264.9641 239.7389 56.847 0.1271 638 +640 3 265.6562 238.858 57.2592 0.1144 639 +641 3 266.4696 238.1682 58.0983 0.1144 640 +642 3 267.4146 237.6019 58.52 0.1144 641 +643 3 268.5105 237.2782 58.52 0.1144 642 +644 3 269.261 236.4877 58.52 0.1271 643 +645 3 270.0195 235.7727 58.8512 0.1398 644 +646 3 270.9312 235.1778 59.5689 0.1652 645 +647 3 271.6336 234.3427 59.92 0.1652 646 +648 3 272.1965 233.4069 60.3764 0.1652 647 +649 3 272.4402 232.4654 61.754 0.1398 648 +650 3 273.0133 231.5891 62.44 0.1398 649 +651 3 273.7958 230.7848 62.44 0.1398 650 +652 3 274.4616 229.9932 62.6772 0.1525 651 +653 3 274.9032 229.2061 64.0926 0.1398 652 +654 3 275.0256 228.0873 64.3922 0.1271 653 +655 3 275.6399 227.219 65.24 0.1144 654 +656 3 276.3504 226.3976 65.814 0.1144 655 +657 3 276.8777 225.4229 66.3289 0.1144 656 +658 3 277.6637 224.6061 66.5552 0.1144 657 +659 3 278.429 223.7996 66.64 0.1144 658 +660 3 279.1063 222.8855 66.64 0.1144 659 +661 3 279.8762 222.0859 67.1698 0.1144 660 +662 3 280.7147 221.3823 67.7331 0.1144 661 +663 3 281.3096 220.5941 68.32 0.1144 662 +664 3 281.9811 219.8574 68.8576 0.1144 663 +665 3 282.7785 219.0611 69.16 0.1144 664 +666 3 283.3391 218.0979 69.44 0.1144 665 +667 3 284.1467 217.3852 69.44 0.1144 666 +668 3 284.7164 216.4059 69.44 0.1144 667 +669 3 285.1534 215.4358 69.6578 0.1144 668 +670 3 285.4852 214.3719 70.2937 0.1144 669 +671 3 285.817 213.308 70.9296 0.1144 670 +672 3 286.1487 212.244 71.5652 0.1144 671 +673 3 286.4793 211.1813 72.2011 0.1144 672 +674 3 286.8111 210.1173 72.837 0.1271 673 +675 3 287.1429 209.0534 73.4726 0.1525 674 +676 3 287.4746 207.9895 74.1084 0.178 675 +677 3 287.8487 206.9336 74.6382 0.178 676 +678 3 288.2846 205.8868 75.0184 0.1525 677 +679 3 288.7193 204.8401 75.399 0.1271 678 +680 3 289.154 203.7933 75.7795 0.1144 679 +681 3 289.5899 202.7477 76.16 0.1144 680 +682 3 290.0246 201.7009 76.5402 0.1144 681 +683 3 290.4605 200.6542 76.9208 0.1144 682 +684 3 290.8952 199.6074 77.3013 0.1144 683 +685 3 291.331 198.5618 77.6815 0.1144 684 +686 3 291.8413 197.5631 77.985 0.1144 685 +687 3 292.6512 196.7543 77.985 0.1144 686 +688 3 293.253 195.8391 78.2849 0.1144 687 +689 3 293.579 194.7797 78.9852 0.1144 688 +690 3 293.905 193.7215 79.6852 0.1144 689 +691 3 294.2311 192.6633 80.3855 0.1144 690 +692 3 294.6063 191.5983 80.7699 0.1144 691 +693 3 295.0056 190.5298 81.0015 0.1144 692 +694 3 295.4048 189.4624 81.233 0.1144 693 +695 3 295.8041 188.3939 81.4646 0.1144 694 +696 3 296.2033 187.3266 81.6962 0.1144 695 +697 3 296.6026 186.2581 81.928 0.1144 696 +698 3 296.9618 185.3314 82.7375 0.1144 697 +699 3 297.3839 184.3259 83.587 0.1144 698 +700 3 297.8049 183.3214 84.4365 0.1144 699 +701 3 298.2271 182.3158 85.286 0.1144 700 +702 3 298.6492 181.3114 86.1356 0.1144 701 +703 3 299.1011 180.3116 86.9193 0.1144 702 +704 3 299.6308 179.3289 87.5336 0.1144 703 +705 3 300.1593 178.3462 88.1476 0.1144 704 +706 3 300.689 177.3635 88.762 0.1271 705 +707 3 301.2175 176.3808 89.376 0.1398 706 +708 3 254.8054 243.9683 52.92 0.1652 551 +709 3 255.3294 244.9842 52.92 0.178 708 +710 3 255.8064 245.9817 53.2 0.2034 709 +711 3 256.5283 246.81 53.2 0.2161 710 +712 3 256.7742 247.9174 53.2165 0.2415 711 +713 3 257.1312 248.9538 53.48 0.2669 712 +714 3 257.8473 249.8153 53.48 0.2924 713 +715 3 258.0864 250.9204 53.48 0.2924 714 +716 3 258.0864 252.0644 53.4951 0.2542 715 +717 3 258.107 253.1649 54.1083 0.2161 716 +718 3 258.2088 254.2654 54.6 0.178 717 +719 3 258.7248 255.2436 54.8688 0.1652 718 +720 3 258.9696 256.3338 54.88 0.1398 719 +721 3 259.4684 257.2822 55.16 0.1525 720 +722 3 259.8802 258.3175 55.3938 0.178 721 +723 3 260.5574 259.2098 55.5794 0.2161 722 +724 3 260.9498 260.2669 55.9868 0.2288 723 +725 3 261.5081 261.2541 56.1061 0.2161 724 +726 3 261.873 262.2998 56.546 0.2034 725 +727 3 262.2528 263.374 56.56 0.1652 726 +728 3 262.5823 264.4653 56.56 0.1652 727 +729 3 262.9919 265.5327 56.56 0.178 728 +730 3 263.2344 266.5966 57.0668 0.2288 729 +731 3 263.263 267.736 57.1318 0.2288 730 +732 3 263.5753 268.7656 57.4 0.2034 731 +733 3 263.7744 269.881 57.4 0.1525 732 +734 3 263.954 271.009 57.4 0.1271 733 +735 3 264.1496 272.1336 57.4 0.1144 734 +736 3 264.5408 273.1483 57.4 0.1271 735 +737 3 265.2616 274.0097 57.7466 0.1525 736 +738 3 266.0143 274.6652 58.8056 0.178 737 +739 3 266.5886 275.4924 59.4961 0.178 738 +740 3 266.8952 276.5345 60.039 0.1525 739 +741 3 266.8952 277.6294 60.5783 0.1271 740 +742 3 266.655 278.707 60.7841 0.1144 741 +743 3 266.1184 279.5833 61.32 0.1144 742 +744 3 266.0075 280.121 63.488 0.1144 743 +745 3 265.9514 280.5568 66.0733 0.1144 744 +746 3 265.6551 281.035 68.2111 0.1144 745 +747 3 264.7685 281.6185 69.2541 0.1144 746 +748 3 263.8808 282.2031 70.2968 0.1144 747 +749 3 263.4792 283.1389 71.2821 0.1144 748 +750 3 263.2218 284.181 72.2501 0.1144 749 +751 3 262.9656 285.2232 73.218 0.1144 750 +752 3 262.7082 286.2654 74.1863 0.1144 751 +753 3 262.6555 287.2996 75.3242 0.1144 752 +754 3 262.6933 288.3303 76.5363 0.1144 753 +755 3 262.7299 289.3611 77.7484 0.1144 754 +756 3 262.7665 290.3918 78.9603 0.1144 755 +757 3 263.4083 291.2098 79.2994 0.1144 756 +758 3 264.2743 291.8024 79.4774 0.1144 757 +759 3 265.0534 291.275 81.0698 0.1144 758 +760 3 265.8336 290.7476 82.6619 0.1144 759 +761 3 266.6126 290.2202 84.2542 0.1144 760 +762 3 267.3917 289.6928 85.8466 0.1144 761 +763 3 268.1708 289.1654 87.439 0.1144 762 +764 3 268.951 288.6381 89.031 0.1144 763 +765 3 269.7941 288.1747 90.4616 0.1144 764 +766 3 270.8466 287.9185 91.359 0.1144 765 +767 3 271.9002 287.6634 92.2564 0.1144 766 +768 3 272.9527 287.4071 93.1538 0.1144 767 +769 3 274.0063 287.152 94.0512 0.1144 768 +770 3 275.0588 286.8958 94.9488 0.1144 769 +771 3 276.1124 286.6406 95.8462 0.1144 770 +772 3 277.1649 286.3844 96.7436 0.1144 771 +773 3 278.2185 286.1293 97.641 0.1144 772 +774 3 279.271 285.873 98.5387 0.1144 773 +775 3 280.2297 286.1052 99.9306 0.1144 774 +776 3 281.1838 286.3592 101.3446 0.1144 775 +777 3 282.139 286.612 102.7586 0.1144 776 +778 3 283.0931 286.866 104.1723 0.1271 777 +779 3 284.0472 287.1188 105.5863 0.1398 778 +780 3 241.6746 240.6633 49.56 0.3051 539 +781 3 240.7376 240.0089 49.56 0.2415 780 +782 3 239.7286 239.4701 49.56 0.2288 781 +783 3 238.7436 238.905 49.56 0.2542 782 +784 3 237.9211 238.111 49.56 0.2924 783 +785 3 237.0871 237.3297 49.56 0.2796 784 +786 3 236.0701 236.8355 49.84 0.2542 785 +787 3 235.1435 236.1742 49.8778 0.2161 786 +788 3 234.5555 235.5542 51.24 0.2415 787 +789 3 233.6574 234.9936 51.5852 0.2542 788 +790 3 233.1175 234.0144 51.8 0.2796 789 +791 3 232.2274 233.3028 51.8686 0.2542 790 +792 3 231.398 232.5946 52.3494 0.2415 791 +793 3 231.088 231.6589 53.2 0.2288 792 +794 3 230.5229 230.834 53.2 0.2415 793 +795 3 229.61 230.1579 53.3341 0.2669 794 +796 3 228.7382 229.5447 54.1635 0.2924 795 +797 3 227.775 228.9888 54.588 0.2796 796 +798 3 226.7465 228.498 54.6 0.2542 797 +799 3 225.6895 228.0598 54.637 0.2415 798 +800 3 224.7274 227.4684 54.9755 0.2542 799 +801 3 223.7241 226.9547 55.3235 0.2542 800 +802 3 222.7002 226.496 55.72 0.2415 801 +803 3 221.6008 226.2317 55.72 0.2288 802 +804 3 220.4717 226.0567 55.72 0.2288 803 +805 3 219.4192 225.7112 56.28 0.2161 804 +806 3 218.4777 225.0866 56.56 0.2161 805 +807 3 217.5133 224.4814 56.56 0.2415 806 +808 3 216.4608 224.081 56.7403 0.3051 807 +809 3 215.6429 223.318 57.1637 0.3432 808 +810 3 214.6464 222.7929 57.4 0.3305 809 +811 3 213.5368 222.5286 57.4 0.2669 810 +812 3 212.8892 222.1488 59.08 0.2034 811 +813 3 212.1422 221.3045 59.08 0.1525 812 +814 3 211.3643 220.4831 59.08 0.1652 813 +815 3 210.599 219.8207 59.08 0.2161 814 +816 3 209.6929 219.2419 59.1007 0.2796 815 +817 3 208.9974 218.7374 60.1138 0.2796 816 +818 3 208.1062 218.3919 61.299 0.2288 817 +819 3 207.1063 217.9778 61.6 0.2034 818 +820 3 206.0939 217.4469 61.6 0.2034 819 +821 3 205.03 217.0809 61.6 0.2288 820 +822 3 204.0633 216.4723 61.6 0.2034 821 +823 3 203.0325 215.9872 61.6 0.1652 822 +824 3 201.9606 215.7115 61.6 0.1271 823 +825 3 201.0443 215.0388 61.6 0.1144 824 +826 3 200.0639 214.4554 61.6 0.1144 825 +827 3 199.0606 213.9452 61.6 0.1271 826 +828 3 198.1991 213.2405 61.6 0.1525 827 +829 3 197.3022 212.5815 61.8377 0.1907 828 +830 3 196.5564 211.7761 61.88 0.2034 829 +831 3 196.1468 210.7442 61.88 0.2034 830 +832 3 195.624 209.8611 61.88 0.178 831 +833 3 195.5817 208.7182 61.88 0.1652 832 +834 3 195.3666 207.6028 61.88 0.1398 833 +835 3 195.2808 206.7162 62.9541 0.1271 834 +836 3 195.2808 205.6111 63.5513 0.1144 835 +837 3 195.2808 204.4717 63.7003 0.1144 836 +838 3 195.2911 203.3426 64.12 0.1144 837 +839 3 195.5474 202.2306 64.12 0.1144 838 +840 3 195.6926 201.1038 64.12 0.1144 839 +841 3 195.9729 199.9964 64.12 0.1271 840 +842 3 196.2578 198.9176 64.12 0.1398 841 +843 3 196.5838 197.8342 64.12 0.1525 842 +844 3 196.6822 196.7028 64.3765 0.1398 843 +845 3 196.768 195.5668 64.4 0.1271 844 +846 3 197.0975 194.599 65.4251 0.1271 845 +847 3 197.1112 193.5168 66.08 0.1398 846 +848 3 197.0952 192.3762 66.1046 0.1525 847 +849 3 196.7783 191.3374 66.8682 0.1525 848 +850 3 196.307 190.5275 67.76 0.1525 849 +851 3 196.0942 189.4086 67.76 0.1525 850 +852 3 195.5657 188.4408 68.32 0.1398 851 +853 3 194.7294 187.7167 68.4536 0.1271 852 +854 3 194.4445 186.6848 69.1807 0.1144 853 +855 3 193.8233 185.7501 69.6508 0.1271 854 +856 3 193.439 184.6851 69.72 0.1398 855 +857 3 193.2239 183.6086 70.2388 0.1525 856 +858 3 193.1221 182.5275 70.56 0.1398 857 +859 3 192.4574 181.8045 70.9923 0.1271 858 +860 3 192.1531 180.7634 71.8796 0.1144 859 +861 3 191.8488 179.7213 72.7672 0.1144 860 +862 3 191.5445 178.6802 73.6548 0.1144 861 +863 3 191.2402 177.6392 74.5424 0.1144 862 +864 3 190.9347 176.597 75.43 0.1144 863 +865 3 190.6304 175.556 76.3174 0.1144 864 +866 3 190.3261 174.5149 77.205 0.1144 865 +867 3 189.8022 173.5402 77.5468 0.1144 866 +868 3 189.1398 172.6067 77.5468 0.1144 867 +869 3 188.4774 171.6744 77.5468 0.1144 868 +870 3 187.8151 170.742 77.5468 0.1144 869 +871 3 186.9193 170.067 77.9691 0.1144 870 +872 3 185.9915 169.4264 78.4476 0.1144 871 +873 3 185.0637 168.7858 78.9261 0.1144 872 +874 3 184.1325 168.144 79.2994 0.1144 873 +875 3 183.1864 167.501 79.2994 0.1144 874 +876 3 182.2392 166.8581 79.2994 0.1144 875 +877 3 181.2931 166.2163 79.2994 0.1144 876 +878 3 180.347 165.5734 79.2994 0.1144 877 +879 3 179.4844 164.8344 79.4066 0.1144 878 +880 3 178.7054 164.0016 79.6208 0.1144 879 +881 3 177.9263 163.1687 79.835 0.1144 880 +882 3 177.1473 162.3359 80.0492 0.1144 881 +883 3 176.3682 161.5031 80.2634 0.1144 882 +884 3 175.588 160.6702 80.4776 0.1271 883 +885 3 174.8089 159.8362 80.6921 0.1398 884 +886 3 174.0299 159.0034 80.9063 0.1525 885 +887 3 173.2519 158.1752 81.1983 0.1398 886 +888 3 172.4763 157.3549 81.6564 0.1271 887 +889 3 171.7007 156.5358 82.1145 0.1144 888 +890 3 170.925 155.7156 82.5726 0.1144 889 +891 3 170.1483 154.8965 83.0304 0.1144 890 +892 3 169.3726 154.0762 83.4884 0.1144 891 +893 3 168.597 153.2571 83.9465 0.1144 892 +894 3 167.8214 152.4369 84.4046 0.1144 893 +895 3 167.0457 151.6178 84.8627 0.1144 894 +896 3 166.0848 151.0572 85.2944 0.1144 895 +897 3 165.0495 150.603 85.7158 0.1144 896 +898 3 164.0141 150.1477 86.137 0.1144 897 +899 3 162.9239 149.8468 86.3092 0.1144 898 +900 3 161.7971 149.6512 86.3092 0.1144 899 +901 3 160.6714 149.4808 86.3092 0.1144 900 +902 3 159.58 149.8251 86.3092 0.1144 901 +903 3 158.4715 149.5711 86.3092 0.1144 902 +904 3 157.6226 148.9133 86.5875 0.1144 903 +905 3 156.9374 148.0153 87.0402 0.1144 904 +906 3 156.2521 147.1184 87.4927 0.1144 905 +907 3 155.5668 146.2215 87.9455 0.1144 906 +908 3 154.8816 145.3235 88.398 0.1144 907 +909 3 154.1963 144.4266 88.8507 0.1144 908 +910 3 153.5111 143.5297 89.3035 0.1144 909 +911 3 152.827 142.6316 89.756 0.1144 910 +912 3 152.1417 141.7347 90.2087 0.1144 911 +913 3 151.4564 140.8378 90.6615 0.1144 912 +914 3 150.7712 139.9398 91.114 0.1271 913 +915 3 150.0859 139.0429 91.5667 0.1398 914 +916 3 241.9972 239.7961 42.4637 0.2288 534 +917 3 242.0429 240.9378 42.4147 0.2796 916 +918 3 241.9125 242.0693 42.4371 0.3178 917 +919 3 241.5556 243.1538 42.3444 0.3559 918 +920 3 241.2627 244.2451 41.9922 0.3432 919 +921 3 241.1552 245.3823 41.946 0.3432 920 +922 3 241.1552 246.5171 41.6836 0.3305 921 +923 3 241.1552 247.6291 41.0589 0.3686 922 +924 3 241.1495 248.7708 40.88 0.4068 923 +925 3 241.1174 249.9137 40.88 0.4322 924 +926 3 241.0008 251.0508 40.88 0.4195 925 +927 3 240.8349 252.1811 40.8814 0.394 926 +928 3 240.8532 253.3159 40.8915 0.3813 927 +929 3 241.1312 254.4256 40.9223 0.3559 928 +930 3 241.4057 254.8546 41.0052 0.3432 929 +931 3 241.9263 255.8373 41.4901 0.3432 930 +932 3 242.353 256.8051 42.5244 0.3178 931 +933 3 242.9181 257.7649 43.0377 0.2796 932 +934 3 243.4958 258.7442 42.8288 0.2796 933 +935 3 243.934 259.7669 42.3074 0.3051 934 +936 3 244.2085 260.8663 42.049 0.3305 935 +937 3 244.5998 261.9325 42.2979 0.3559 936 +938 3 245.0517 262.9598 42.8252 0.3686 937 +939 3 245.5241 263.9906 43.1113 0.3686 938 +940 3 245.9554 265.0499 43.066 0.3432 939 +941 3 246.421 266.0852 42.8109 0.3178 940 +942 3 246.9896 267.0531 42.2999 0.3178 941 +943 3 247.6314 267.9877 42.0118 0.3305 942 +944 3 248.2995 268.9144 42.0109 0.3432 943 +945 3 248.9973 269.8181 42.058 0.3305 944 +946 3 249.6448 270.7493 42.3279 0.3051 945 +947 3 250.1505 271.7172 42.4556 0.2669 946 +948 3 250.2042 272.8268 42.0574 0.2542 947 +949 3 250.0509 273.9594 42.0 0.2415 948 +950 3 250.131 275.0794 41.9994 0.2542 949 +951 3 250.4365 276.181 41.9969 0.2415 950 +952 3 250.6641 277.301 41.9787 0.2669 951 +953 3 250.7648 278.4359 41.8659 0.2542 952 +954 3 250.7659 279.5581 41.405 0.2415 953 +955 3 250.7717 280.677 40.9312 0.1907 954 +956 3 250.8117 281.8187 40.88 0.1907 955 +957 3 251.0245 282.9329 40.88 0.2161 956 +958 3 251.4535 283.9923 40.88 0.2542 957 +959 3 251.8974 285.0448 40.88 0.2415 958 +960 3 252.1708 286.1476 40.88 0.2034 959 +961 3 252.4087 287.2595 40.88 0.1652 960 +962 3 252.7588 288.3486 40.8811 0.1652 961 +963 3 252.9887 289.464 40.8873 0.2034 962 +964 3 253.0379 290.6046 40.9391 0.2415 963 +965 3 253.0459 291.7463 40.9116 0.2669 964 +966 3 253.0539 292.8903 40.9035 0.2542 965 +967 3 253.0608 294.032 41.0455 0.2542 966 +968 3 253.1066 295.1428 41.6777 0.2669 967 +969 3 253.4257 296.2194 41.4974 0.2796 968 +970 3 253.8822 297.2432 40.9441 0.2669 969 +971 3 254.381 298.2694 40.88 0.2288 970 +972 3 254.8798 299.299 40.88 0.2161 971 +973 3 255.3683 300.3332 40.88 0.2288 972 +974 3 255.7675 301.4051 40.88 0.2415 973 +975 3 256.0352 302.5159 40.88 0.2415 974 +976 3 256.24 303.6416 40.88 0.2034 975 +977 3 256.256 304.7845 40.88 0.1907 976 +978 3 256.2549 305.9285 40.88 0.1907 977 +979 3 256.2457 307.0725 40.8794 0.2415 978 +980 3 256.1839 308.2142 40.8766 0.3051 979 +981 3 255.8716 309.3124 40.8587 0.3559 980 +982 3 255.5307 310.4038 40.7509 0.394 981 +983 3 255.4415 311.5192 40.2097 0.4068 982 +984 3 255.4941 312.6312 39.9403 0.4068 983 +985 3 255.7515 313.7271 40.3894 0.394 984 +986 3 255.9975 314.8208 40.8551 0.3686 985 +987 3 256.1874 315.9373 40.9156 0.3686 986 +988 3 255.978 317.0379 41.2118 0.3305 987 +989 3 255.5742 318.0881 41.7043 0.2924 988 +990 3 255.0823 319.1062 42.0538 0.2161 989 +991 3 254.9015 320.2193 42.4514 0.2034 990 +992 3 254.8832 321.345 42.9346 0.2288 991 +993 3 254.8821 322.4581 42.3979 0.2924 992 +994 3 254.8775 323.5976 42.28 0.3178 993 +995 3 254.8317 324.6958 42.9554 0.3051 994 +996 3 254.6338 325.7963 43.4034 0.2796 995 +997 3 254.1842 326.8271 43.8948 0.2669 996 +998 3 253.7678 327.8727 43.8463 0.2415 997 +999 3 253.6843 328.9526 43.2625 0.2288 998 +1000 3 254.0881 330.0085 43.0408 0.2034 999 +1001 3 254.7036 330.9546 42.7059 0.2161 1000 +1002 3 255.2195 331.903 42.0913 0.2161 1001 +1003 3 255.3282 333.0378 41.9972 0.2542 1002 +1004 3 255.247 334.1761 41.9821 0.2924 1003 +1005 3 254.961 335.2767 41.8956 0.3305 1004 +1006 3 254.5789 336.3326 41.5209 0.3559 1005 +1007 3 254.4439 337.4308 40.9612 0.3559 1006 +1008 3 254.5503 338.5645 40.9083 0.3559 1007 +1009 3 254.786 339.6811 41.0337 0.3432 1008 +1010 3 254.8866 340.7804 41.6478 0.3559 1009 +1011 3 254.9107 341.8901 42.2962 0.3686 1010 +1012 3 255.1314 342.9563 43.1029 0.3686 1011 +1013 3 255.3133 344.0706 43.2737 0.3305 1012 +1014 3 255.3442 345.2123 43.1642 0.2796 1013 +1015 3 255.3602 346.3552 43.2387 0.2415 1014 +1016 3 255.4701 347.4603 43.8556 0.2415 1015 +1017 3 255.7286 348.5276 44.6281 0.2542 1016 +1018 3 255.8007 349.6293 45.3202 0.2669 1017 +1019 3 255.8396 350.7607 45.6966 0.2924 1018 +1020 3 256.0741 351.8681 45.4474 0.3305 1019 +1021 3 256.5466 352.9057 45.4188 0.3686 1020 +1022 3 257.0122 353.9433 45.7064 0.3686 1021 +1023 3 257.3462 355.0026 46.3456 0.3432 1022 +1024 3 257.591 356.1158 46.4738 0.3051 1023 +1025 3 257.5316 357.2506 46.48 0.2542 1024 +1026 3 257.3062 358.3706 46.4803 0.2288 1025 +1027 3 257.2879 359.502 46.4822 0.2034 1026 +1028 3 257.6174 360.5968 46.4932 0.2415 1027 +1029 3 257.9594 361.6756 46.5674 0.2415 1028 +1030 3 257.9297 362.791 46.916 0.2796 1029 +1031 3 257.5556 363.8355 47.5132 0.2669 1030 +1032 3 257.1998 364.9005 47.6694 0.3178 1031 +1033 3 257.1712 366.0251 48.0399 0.3432 1032 +1034 3 257.1678 367.0799 49.0921 0.3813 1033 +1035 3 257.1449 368.1083 50.2642 0.3559 1034 +1036 3 257.0065 369.2054 50.5201 0.3178 1035 +1037 3 256.6278 370.2579 50.2874 0.2542 1036 +1038 3 256.3201 371.3149 50.7184 0.2288 1037 +1039 3 256.4837 372.4223 50.9897 0.2161 1038 +1040 3 257.0259 373.4005 51.2366 0.2542 1039 +1041 3 257.7649 374.2459 51.774 0.2542 1040 +1042 3 258.0875 375.3338 52.0772 0.2669 1041 +1043 3 258.2019 376.4721 52.0836 0.2542 1042 +1044 3 258.7019 377.5006 52.1004 0.2924 1043 +1045 3 259.3128 378.4638 52.1906 0.3051 1044 +1046 3 259.3414 379.5803 52.7772 0.3178 1045 +1047 3 259.0336 380.666 53.1936 0.2924 1046 +1048 3 258.973 381.8089 53.1558 0.2669 1047 +1049 3 258.8071 382.9288 52.8713 0.2415 1048 +1050 3 258.5486 383.9001 51.6541 0.2288 1049 +1051 3 258.5749 385.0235 52.1587 0.2288 1050 +1052 3 258.695 386.1023 52.8917 0.2288 1051 +1053 3 258.981 387.1788 52.6616 0.2161 1052 +1054 3 259.1023 388.2404 53.4971 0.2288 1053 +1055 3 259.3745 389.3158 53.0928 0.2288 1054 +1056 3 259.2487 390.4335 53.076 0.2542 1055 +1057 3 258.4879 391.2606 53.2053 0.2288 1056 +1058 3 257.7695 392.1495 53.2804 0.2161 1057 +1059 3 257.5293 393.2443 53.7457 0.1907 1058 +1060 3 257.2101 394.3357 53.5021 0.1907 1059 +1061 3 257.1518 395.4648 53.0905 0.178 1060 +1062 3 256.9207 396.5356 52.3426 0.1652 1061 +1063 3 256.7525 397.3615 52.7078 0.178 1062 +1064 3 256.7033 398.4998 52.5518 0.2034 1063 +1065 3 256.645 399.6186 53.0986 0.2288 1064 +1066 3 256.4436 400.7386 53.1997 0.2288 1065 +1067 3 256.5614 401.8689 53.1983 0.2288 1066 +1068 3 256.2148 402.9568 53.1882 0.2288 1067 +1069 3 255.7057 403.9716 53.1331 0.2161 1068 +1070 3 255.6131 405.0904 52.7808 0.2161 1069 +1071 3 254.9084 405.9576 52.7556 0.1271 1070 +1072 3 254.0069 406.3477 53.9748 0.1525 1071 +1073 3 253.2004 407.1393 54.3497 0.1907 1072 +1074 3 252.4362 407.9859 54.4796 0.2034 1073 +1075 3 251.7418 408.8782 54.885 0.1907 1074 +1076 3 251.0748 409.7728 55.0449 0.1525 1075 +1077 3 250.4536 410.6788 54.2718 0.1271 1076 +1078 3 249.7844 411.4785 54.2175 0.1144 1077 +1079 3 249.0499 412.2118 55.2782 0.1144 1078 +1080 3 248.5329 413.1922 55.8146 0.1398 1079 +1081 3 248.0158 414.176 55.9532 0.178 1080 +1082 3 247.2962 415.0592 55.7525 0.2415 1081 +1083 3 246.5892 415.955 55.6077 0.2669 1082 +1084 3 245.8273 416.7821 55.9518 0.2796 1083 +1085 3 245.0425 417.5852 56.4718 0.2415 1084 +1086 3 244.2795 418.4249 56.7983 0.2161 1085 +1087 3 243.5896 419.3126 57.2698 0.1907 1086 +1088 3 242.8518 420.166 57.4882 0.1907 1087 +1089 3 241.9754 420.7643 58.1658 0.178 1088 +1090 3 241.1255 421.4027 58.8 0.1525 1089 +1091 3 240.3327 422.2207 58.8 0.1271 1090 +1092 3 239.6977 423.1496 58.8 0.1144 1091 +1093 3 239.3889 424.2158 58.8 0.1144 1092 +1094 3 238.834 425.2145 58.819 0.1144 1093 +1095 3 238.3021 426.2132 59.08 0.1144 1094 +1096 3 237.5333 427.0049 59.08 0.1144 1095 +1097 3 236.7531 427.8057 59.08 0.1144 1096 +1098 3 236.411 428.8376 59.619 0.1144 1097 +1099 3 235.5187 429.5182 59.64 0.1144 1098 +1100 3 234.774 430.3762 59.64 0.1144 1099 +1101 3 234.1654 431.328 59.64 0.1144 1100 +1102 3 233.9503 432.4423 59.7985 0.1144 1101 +1103 3 233.5831 433.4547 60.5346 0.1271 1102 +1104 3 232.4871 433.7053 60.76 0.1398 1103 +1105 3 232.0032 434.5713 61.035 0.1525 1104 +1106 3 232.0032 435.7153 61.04 0.1398 1105 +1107 3 231.7458 436.7918 61.339 0.1271 1106 +1108 3 231.2928 437.7996 61.8579 0.1144 1107 +1109 3 230.5675 438.676 61.88 0.1144 1108 +1110 3 229.8159 439.5134 61.88 0.1144 1109 +1111 3 228.8572 440.059 61.9853 0.1144 1110 +1112 3 228.0495 440.6768 62.44 0.1144 1111 +1113 3 227.3929 441.5657 62.9698 0.1144 1112 +1114 3 226.663 442.3368 63.5522 0.1144 1113 +1115 3 225.765 443.038 63.56 0.1144 1114 +1116 3 224.8498 443.7198 63.56 0.1144 1115 +1117 3 223.9826 444.4143 64.0192 0.1144 1116 +1118 3 223.1715 445.2059 64.12 0.1144 1117 +1119 3 222.3078 445.9552 64.12 0.1144 1118 +1120 3 221.483 446.7263 64.3986 0.1271 1119 +1121 3 220.6948 447.542 64.4 0.1525 1120 +1122 3 219.68 448.0156 64.5372 0.1907 1121 +1123 3 219.0531 448.6516 65.8 0.2034 1122 +1124 3 218.4205 449.6012 65.8 0.1907 1123 +1125 3 217.6838 450.474 65.8 0.1525 1124 +1126 3 217.0477 451.3721 66.2245 0.1271 1125 +1127 3 216.4334 452.2392 66.64 0.1144 1126 +1128 3 215.7092 453.1212 66.64 0.1144 1127 +1129 3 215.048 454.0502 66.7044 0.1144 1128 +1130 3 214.4611 454.9905 67.34 0.1144 1129 +1131 3 214.0424 455.884 68.32 0.1144 1130 +1132 3 213.6992 456.925 68.32 0.1144 1131 +1133 3 213.3137 457.8208 68.32 0.1144 1132 +1134 3 212.3836 458.1731 68.32 0.1144 1133 +1135 3 211.8894 459.1753 68.5017 0.1271 1134 +1136 3 211.0897 459.9383 68.8246 0.1398 1135 +1137 3 210.385 460.579 70.2822 0.1525 1136 +1138 3 209.7032 461.3146 70.56 0.1525 1137 +1139 3 208.8486 462.0044 70.56 0.1652 1138 +1140 3 208.041 462.8132 70.56 0.2161 1139 +1141 3 207.7504 463.7776 70.28 0.2796 1140 +1142 3 255.8991 405.8008 53.2 0.2034 1070 +1143 3 256.4585 406.7698 53.2 0.2161 1142 +1144 3 256.8131 407.8577 53.2 0.178 1143 +1145 3 257.0374 408.9789 53.2 0.1398 1144 +1146 3 257.2673 410.0908 53.2 0.1144 1145 +1147 3 257.2856 411.2348 53.2 0.1144 1146 +1148 3 257.4 412.3697 53.2 0.1271 1147 +1149 3 257.3222 413.5091 53.2081 0.1398 1148 +1150 3 257.3108 414.6462 53.4486 0.1525 1149 +1151 3 257.392 415.7857 53.48 0.1525 1150 +1152 3 257.2719 416.9216 53.48 0.178 1151 +1153 3 257.1266 418.0554 53.48 0.2161 1152 +1154 3 256.7902 419.1158 53.8745 0.2415 1153 +1155 3 256.7136 420.2473 54.04 0.2161 1154 +1156 3 256.8108 421.381 54.1915 0.1652 1155 +1157 3 256.828 422.5101 54.6176 0.1271 1156 +1158 3 256.828 423.6507 54.8279 0.1144 1157 +1159 3 256.7262 424.7855 54.88 0.1144 1158 +1160 3 256.8131 425.9238 54.88 0.1271 1159 +1161 3 256.828 427.0666 54.88 0.1398 1160 +1162 3 256.7891 428.2095 54.88 0.1525 1161 +1163 3 256.4345 429.2768 54.88 0.1398 1162 +1164 3 256.232 430.4025 54.88 0.1271 1163 +1165 3 255.9643 431.5122 54.88 0.1144 1164 +1166 3 255.3763 432.4915 54.88 0.1144 1165 +1167 3 254.9347 433.5257 54.88 0.1144 1166 +1168 3 254.1762 434.3493 54.88 0.1144 1167 +1169 3 253.968 435.4567 54.88 0.1144 1168 +1170 3 253.7381 436.5561 54.8772 0.1144 1169 +1171 3 253.4269 437.6452 54.6 0.1398 1170 +1172 3 253.2816 438.7629 54.332 0.1652 1171 +1173 3 253.2816 439.9069 54.32 0.1907 1172 +1174 3 253.2816 441.0463 54.474 0.1652 1173 +1175 3 253.2816 442.1857 54.6 0.1398 1174 +1176 3 253.2816 443.3297 54.6 0.1144 1175 +1177 3 253.3171 444.4726 54.6 0.1144 1176 +1178 3 253.4635 445.604 54.49 0.1144 1177 +1179 3 253.5127 446.7389 54.2696 0.1144 1178 +1180 3 253.6248 447.8119 53.48 0.1144 1179 +1181 3 253.6248 448.9559 53.48 0.1144 1180 +1182 3 253.6248 450.0999 53.48 0.1144 1181 +1183 3 253.6248 451.2348 53.76 0.1144 1182 +1184 3 253.6248 452.3788 53.76 0.1144 1183 +1185 3 253.6248 453.5228 53.76 0.1144 1184 +1186 3 253.6248 454.6668 53.76 0.1144 1185 +1187 3 253.6248 455.8108 53.76 0.1144 1186 +1188 3 253.6248 456.9548 53.76 0.1144 1187 +1189 3 253.6248 458.0931 53.655 0.1144 1188 +1190 3 253.7369 459.0723 52.6481 0.1144 1189 +1191 3 253.7392 460.2152 52.64 0.1144 1190 +1192 3 253.7392 461.3592 52.64 0.1144 1191 +1193 3 253.7392 462.5032 52.64 0.1144 1192 +1194 3 253.7392 463.6472 52.64 0.1144 1193 +1195 3 253.7392 464.7912 52.64 0.1144 1194 +1196 3 253.7392 465.9352 52.694 0.1144 1195 +1197 3 253.7392 467.0746 52.92 0.1144 1196 +1198 3 253.7278 468.2175 52.9298 0.1144 1197 +1199 3 253.3331 468.937 54.32 0.1144 1198 +1200 3 253.1672 470.0559 54.1615 0.1144 1199 +1201 3 253.1672 471.1976 54.04 0.1144 1200 +1202 3 253.4829 472.234 53.366 0.1144 1201 +1203 3 253.7266 473.3071 52.92 0.1144 1202 +1204 3 253.7392 474.45 52.92 0.1144 1203 +1205 3 253.7392 475.594 52.92 0.1144 1204 +1206 3 253.7392 476.7288 53.2 0.1144 1205 +1207 3 253.7632 477.8728 53.2 0.1144 1206 +1208 3 254.0538 478.9631 53.3014 0.1144 1207 +1209 3 254.206 480.0647 53.48 0.1144 1208 +1210 3 254.4004 481.1904 53.48 0.1144 1209 +1211 3 254.4256 482.2944 54.0212 0.1144 1210 +1212 3 254.4313 483.4086 54.5112 0.1144 1211 +1213 3 254.8363 484.4485 54.6 0.1144 1212 +1214 3 255.1944 485.5205 54.6 0.1144 1213 +1215 3 255.2264 486.6622 54.6 0.1144 1214 +1216 3 255.2264 487.805 54.5437 0.1398 1215 +1217 3 255.2264 488.9433 54.2685 0.1907 1216 +1218 3 255.2424 489.9683 53.1927 0.2542 1217 +1219 3 255.6989 490.9716 52.64 0.2669 1218 +1220 3 256.1244 492.0344 52.64 0.2288 1219 +1221 3 256.1244 493.1773 52.64 0.178 1220 +1222 3 256.0283 494.3167 52.64 0.1652 1221 +1223 3 255.7801 495.4309 52.64 0.178 1222 +1224 3 255.5696 496.5292 52.9197 0.178 1223 +1225 3 255.5696 497.6526 53.2 0.1525 1224 +1226 3 255.6954 498.7737 53.2 0.1271 1225 +1227 3 256.256 499.7038 53.7107 0.1144 1226 +1228 3 256.2938 500.5766 52.08 0.1144 1227 +1229 3 256.2434 500.7414 52.36 0.1144 1228 +1230 3 256.3841 500.969 52.36 0.1271 1229 +1231 3 256.5992 502.065 52.36 0.1398 1230 +1232 3 256.5992 503.2033 52.5294 0.1652 1231 +1233 3 256.5992 504.3438 52.64 0.1652 1232 +1234 3 256.6839 505.4753 52.7649 0.1652 1233 +1235 3 257.1254 506.5014 52.92 0.1525 1234 +1236 3 257.4538 507.5951 52.92 0.1525 1235 +1237 3 257.9857 508.5778 52.92 0.1525 1236 +1238 3 258.6996 509.3752 53.0505 0.1652 1237 +1239 3 259.2773 510.3556 53.2459 0.178 1238 +1240 3 259.8024 511.2502 53.9904 0.2034 1239 +1241 3 259.783 512.3278 54.6 0.2034 1240 +1242 3 259.4592 513.2705 55.16 0.2034 1241 +1243 3 259.5084 514.411 55.16 0.178 1242 +1244 3 259.7887 515.5047 55.16 0.1525 1243 +1245 3 259.6686 516.6418 55.16 0.1271 1244 +1246 3 259.5736 517.7813 55.16 0.1144 1245 +1247 3 259.4786 518.9173 55.16 0.1144 1246 +1248 3 259.4592 520.0601 55.16 0.1144 1247 +1249 3 259.4592 521.2041 55.16 0.1144 1248 +1250 3 259.4592 522.3481 55.16 0.1144 1249 +1251 3 259.4592 523.4921 55.16 0.1144 1250 +1252 3 259.4592 524.5194 56.1921 0.1144 1251 +1253 3 259.4592 525.6325 56.56 0.1144 1252 +1254 3 259.3036 526.764 56.56 0.1144 1253 +1255 3 259.116 527.8896 56.5799 0.1144 1254 +1256 3 259.116 529.0073 57.0494 0.1144 1255 +1257 3 259.076 530.1445 57.12 0.1144 1256 +1258 3 258.7625 531.237 57.12 0.1144 1257 +1259 3 258.5474 532.3421 57.12 0.1144 1258 +1260 3 258.544 533.3271 58.2722 0.1144 1259 +1261 3 258.504 534.4299 58.9375 0.1144 1260 +1262 3 258.4113 535.559 59.08 0.1144 1261 +1263 3 258.0006 536.5932 59.08 0.1144 1262 +1264 3 257.972 537.7349 59.08 0.1144 1263 +1265 3 257.9011 538.8274 59.6008 0.1144 1264 +1266 3 257.4583 539.7644 60.7578 0.1144 1265 +1267 3 257.1277 540.8283 61.04 0.1144 1266 +1268 3 256.7159 541.8945 61.0708 0.1144 1267 +1269 3 256.7136 542.9996 61.6 0.1144 1268 +1270 3 256.4848 543.8873 62.5806 0.1144 1269 +1271 3 256.4848 545.0233 62.72 0.1144 1270 +1272 3 256.4848 546.1673 62.72 0.1144 1271 +1273 3 256.4848 547.1946 63.6913 0.1144 1272 +1274 3 256.4848 548.3055 64.12 0.1144 1273 +1275 3 256.4848 549.4495 64.12 0.1144 1274 +1276 3 256.5123 550.5923 64.12 0.1271 1275 +1277 3 256.7136 551.7077 64.12 0.1525 1276 +1278 3 257.1357 552.6767 64.4815 0.178 1277 +1279 3 257.7993 553.4317 65.52 0.178 1278 +1280 3 258.1836 554.4934 65.52 0.1525 1279 +1281 3 258.5703 555.5664 65.52 0.1271 1280 +1282 3 258.7579 556.6944 65.52 0.1144 1281 +1283 3 259.3002 557.6645 65.52 0.1144 1282 +1284 3 259.4592 558.7593 65.52 0.1144 1283 +1285 3 259.4592 559.9033 65.52 0.1144 1284 +1286 3 259.7498 560.7865 65.8423 0.1144 1285 +1287 3 259.9683 561.8127 66.9578 0.1144 1286 +1288 3 260.1868 562.84 68.0733 0.1144 1287 +1289 3 260.4053 563.8662 69.1888 0.1144 1288 +1290 3 260.6226 564.8923 70.3044 0.1144 1289 +1291 3 260.8412 565.9185 71.4199 0.1144 1290 +1292 3 260.8023 567.0007 72.0658 0.1144 1291 +1293 3 260.6009 568.1173 72.4156 0.1144 1292 +1294 3 260.3996 569.235 72.7653 0.1144 1293 +1295 3 260.1971 570.3515 73.115 0.1144 1294 +1296 3 259.9957 571.468 73.4644 0.1144 1295 +1297 3 259.7944 572.5857 73.8142 0.1144 1296 +1298 3 259.593 573.7023 74.1639 0.1144 1297 +1299 3 259.3917 574.82 74.5136 0.1144 1298 +1300 3 259.1892 575.9365 74.8633 0.1144 1299 +1301 3 258.9879 577.053 75.213 0.1144 1300 +1302 3 258.6481 578.1318 75.511 0.1144 1301 +1303 3 258.2122 579.1843 75.7733 0.1144 1302 +1304 3 257.7764 580.2368 76.0357 0.1144 1303 +1305 3 257.3405 581.2893 76.298 0.1144 1304 +1306 3 256.9046 582.3418 76.5604 0.1144 1305 +1307 3 256.7445 583.4457 76.6083 0.1144 1306 +1308 3 256.7822 584.5886 76.5005 0.1144 1307 +1309 3 256.8211 585.7314 76.3924 0.1144 1308 +1310 3 256.86 586.8731 76.2846 0.1144 1309 +1311 3 256.8989 588.016 76.1768 0.1144 1310 +1312 3 256.9378 589.1589 76.0687 0.1144 1311 +1313 3 256.9756 590.3006 75.9609 0.1144 1312 +1314 3 257.0145 591.4434 75.8531 0.1144 1313 +1315 3 257.0534 592.5863 75.745 0.1144 1314 +1316 3 257.0923 593.728 75.6372 0.1144 1315 +1317 3 257.1312 594.8708 75.5292 0.1144 1316 +1318 3 257.1701 596.0137 75.4214 0.1144 1317 +1319 3 256.9733 597.0994 75.3561 0.1271 1318 +1320 3 256.6106 598.1187 75.3561 0.1525 1319 +1321 3 256.7548 599.2409 75.4191 0.178 1320 +1322 3 256.7742 600.3849 75.521 0.178 1321 +1323 3 256.7948 601.5278 75.6227 0.1525 1322 +1324 3 256.8143 602.6706 75.7243 0.1271 1323 +1325 3 256.8337 603.8135 75.826 0.1144 1324 +1326 3 256.8543 604.9564 75.9276 0.1144 1325 +1327 3 256.8738 606.1004 76.0292 0.1144 1326 +1328 3 256.8944 607.2432 76.1309 0.1271 1327 +1329 3 256.9138 608.3861 76.2325 0.1652 1328 +1330 3 256.5981 500.8398 52.08 0.2034 1228 +1331 3 256.828 501.93 52.0551 0.2034 1330 +1332 3 256.828 503.034 51.3906 0.2034 1331 +1333 3 256.828 504.1722 51.24 0.1652 1332 +1334 3 257.0374 505.1984 50.96 0.1398 1333 +1335 3 257.273 506.2909 50.68 0.1144 1334 +1336 3 257.6288 507.3057 50.68 0.1144 1335 +1337 3 258.0258 507.9268 49.2192 0.1271 1336 +1338 3 258.544 508.5492 47.6896 0.1525 1337 +1339 3 258.5509 509.6566 47.1794 0.178 1338 +1340 3 258.8758 510.6793 46.48 0.178 1339 +1341 3 258.8872 511.8233 46.48 0.1652 1340 +1342 3 258.8426 512.8094 45.3306 0.1525 1341 +1343 3 258.7728 513.8139 44.151 0.1525 1342 +1344 3 258.671 514.943 43.958 0.1398 1343 +1345 3 258.5612 516.047 43.5095 0.1271 1344 +1346 3 258.1974 517.0319 42.84 0.1271 1345 +1347 3 258.0406 518.1645 42.84 0.1652 1346 +1348 3 257.972 519.3028 42.7512 0.2034 1347 +1349 3 257.6094 520.3324 42.009 0.2161 1348 +1350 3 257.4847 521.4546 41.72 0.1907 1349 +1351 3 257.4046 522.5906 41.6326 0.2034 1350 +1352 3 257.7226 523.6523 41.3837 0.2542 1351 +1353 3 258.3678 524.5206 40.8456 0.3051 1352 +1354 3 258.6584 525.422 40.0632 0.2796 1353 +1355 3 258.6859 526.5649 40.04 0.2288 1354 +1356 3 259.1926 527.5327 39.7222 0.1907 1355 +1357 3 259.7978 528.4594 39.2613 0.1907 1356 +1358 3 260.3321 529.4283 38.92 0.1652 1357 +1359 3 260.3744 530.5678 38.8805 0.1398 1358 +1360 3 260.387 531.6809 38.36 0.1144 1359 +1361 3 260.7759 532.7368 38.36 0.1144 1360 +1362 3 261.2873 533.4964 37.4413 0.1144 1361 +1363 3 261.404 534.4619 36.4 0.1144 1362 +1364 3 261.8799 535.4881 36.4 0.1144 1363 +1365 3 261.976 536.6092 36.3927 0.1271 1364 +1366 3 261.976 537.68 35.7056 0.1525 1365 +1367 3 262.4714 538.6089 35.28 0.178 1366 +1368 3 263.2172 539.4463 34.9297 0.178 1367 +1369 3 264.1004 540.0847 34.72 0.1525 1368 +1370 3 265.0351 540.6796 34.72 0.1398 1369 +1371 3 265.5647 541.6646 34.4669 0.1398 1370 +1372 3 266.0269 542.6678 33.88 0.1525 1371 +1373 3 266.7305 543.3886 33.0394 0.1398 1372 +1374 3 267.2258 544.1585 31.645 0.1271 1373 +1375 3 268.077 544.7922 31.8298 0.1144 1374 +1376 3 268.848 545.5221 32.2 0.1144 1375 +1377 3 268.9544 546.6032 31.92 0.1144 1376 +1378 3 241.0259 254.9621 40.3556 0.4195 929 +1379 3 240.7491 255.9963 39.4316 0.3559 1378 +1380 3 240.1965 256.947 38.8573 0.2924 1379 +1381 3 239.342 257.6929 38.6224 0.2669 1380 +1382 3 238.492 258.4559 38.5112 0.2669 1381 +1383 3 237.6397 259.2064 38.2323 0.2415 1382 +1384 3 236.776 259.9202 38.523 0.2034 1383 +1385 3 235.7715 260.4099 38.729 0.178 1384 +1386 3 234.8518 261.0002 38.1262 0.1907 1385 +1387 3 234.0601 261.7918 37.6088 0.2415 1386 +1388 3 233.1621 262.4874 37.4693 0.2669 1387 +1389 3 232.2309 263.1394 37.1731 0.2796 1388 +1390 3 231.2585 263.6771 36.5442 0.2415 1389 +1391 3 230.2918 264.272 36.3698 0.2288 1390 +1392 3 229.3068 264.8497 36.2247 0.2161 1391 +1393 3 228.4122 265.4904 35.5292 0.2288 1392 +1394 3 227.5633 266.2385 35.2262 0.2161 1393 +1395 3 226.7923 267.0771 34.9933 0.2034 1394 +1396 3 226.2203 267.9969 34.1695 0.1907 1395 +1397 3 225.6826 268.943 33.3029 0.1907 1396 +1398 3 225.0946 269.9119 33.0593 0.1907 1397 +1399 3 224.5615 270.9232 33.0366 0.2034 1398 +1400 3 224.049 271.946 33.0215 0.2288 1399 +1401 3 223.5662 272.9824 32.9342 0.2542 1400 +1402 3 223.3237 274.0715 32.4075 0.2669 1401 +1403 3 223.2299 275.2052 32.4461 0.2669 1402 +1404 3 222.9805 276.3149 32.69 0.2542 1403 +1405 3 223.1132 277.4028 32.0418 0.2415 1404 +1406 3 222.921 278.5171 31.8049 0.2034 1405 +1407 3 222.3067 279.4517 31.2903 0.2034 1406 +1408 3 221.5676 280.3029 30.8081 0.2161 1407 +1409 3 220.6307 280.9515 30.6561 0.2542 1408 +1410 3 219.799 281.6825 29.967 0.2542 1409 +1411 3 218.8792 282.3529 29.6834 0.2415 1410 +1412 3 217.8645 282.8792 29.6657 0.2542 1411 +1413 3 216.8681 283.442 29.5963 0.2924 1412 +1414 3 216.0078 284.1742 29.1654 0.3305 1413 +1415 3 215.3019 285.0001 28.2937 0.3432 1414 +1416 3 214.8524 285.9725 27.3112 0.3559 1415 +1417 3 214.1339 286.691 26.0282 0.3813 1416 +1418 3 213.3205 287.2962 24.7307 0.3813 1417 +1419 3 212.5998 287.9254 23.2058 0.3305 1418 +1420 3 211.9386 288.7422 22.1634 0.2415 1419 +1421 3 211.2602 289.6562 22.3306 0.178 1420 +1422 3 210.5692 290.5451 21.8576 0.178 1421 +1423 3 209.8554 291.3459 20.9138 0.1907 1422 +1424 3 209.0317 291.8859 19.5966 0.2034 1423 +1425 3 208.073 292.0003 18.1381 0.178 1424 +1426 3 207.6223 292.856 17.92 0.1652 1425 +1427 3 207.1212 293.8055 17.92 0.1525 1426 +1428 3 206.1797 294.4347 17.712 0.1398 1427 +1429 3 205.3366 295.1108 16.8314 0.1398 1428 +1430 3 204.5975 295.9436 16.6172 0.1652 1429 +1431 3 203.9432 296.6804 17.64 0.2161 1430 +1432 3 203.2579 297.4423 18.1815 0.2415 1431 +1433 3 202.6779 298.3563 17.6616 0.2288 1432 +1434 3 202.385 299.3837 16.8328 0.1907 1433 +1435 3 201.9904 300.4338 16.52 0.178 1434 +1436 3 201.511 301.4612 16.2582 0.178 1435 +1437 3 201.2296 302.5651 16.2014 0.1907 1436 +1438 3 200.7159 303.398 15.4339 0.1907 1437 +1439 3 199.9758 304.2239 14.8506 0.1907 1438 +1440 3 199.3992 305.1048 14.28 0.1907 1439 +1441 3 241.813 228.7279 37.5626 0.3686 1 +1442 3 242.3976 227.7658 37.7896 0.4449 1441 +1443 3 242.8586 226.7397 38.2886 0.4322 1442 +1444 3 243.275 225.6952 38.6366 0.3686 1443 +1445 3 243.4272 224.5752 38.7629 0.3432 1444 +1446 3 243.3471 223.461 39.2529 0.3686 1445 +1447 3 242.9936 222.4325 39.8796 0.4068 1446 +1448 3 242.4811 221.467 40.6227 0.4068 1447 +1449 3 242.234 220.4419 41.6968 0.394 1448 +1450 3 242.6756 219.4158 42.2038 0.4068 1449 +1451 3 243.219 218.4502 42.8907 0.4322 1450 +1452 3 243.5954 217.3737 43.1203 0.4576 1451 +1453 3 244.5037 215.9918 43.1284 0.2542 1452 +1454 3 245.3972 215.2916 43.1791 0.2924 1453 +1455 3 246.429 214.8054 43.3756 0.3051 1454 +1456 3 247.1063 214.174 44.24 0.2415 1455 +1457 3 247.8934 213.4555 44.24 0.178 1456 +1458 3 248.693 212.6582 44.24 0.1271 1457 +1459 3 249.527 211.9798 44.24 0.1144 1458 +1460 3 250.6069 211.648 44.24 0.1144 1459 +1461 3 251.3974 210.8472 43.9852 0.1144 1460 +1462 3 252.3458 210.2386 43.68 0.1525 1461 +1463 3 253.2816 209.5808 43.68 0.2415 1462 +1464 3 253.4944 209.4344 43.68 0.1144 1463 +1465 3 254.2609 208.7251 43.12 0.1144 1464 +1466 3 255.2127 208.208 43.12 0.1271 1465 +1467 3 256.0535 207.7424 42.5779 0.1398 1466 +1468 3 256.6095 206.7677 42.4074 0.1525 1467 +1469 3 257.1426 205.7804 42.28 0.1398 1468 +1470 3 257.8336 204.8915 42.0 0.1271 1469 +1471 3 258.4605 203.9363 42.0 0.1398 1470 +1472 3 259.2178 203.084 42.0 0.1907 1471 +1473 3 260.0015 202.2592 42.0 0.2415 1472 +1474 3 260.943 201.7524 41.8981 0.2542 1473 +1475 3 261.4909 201.4012 39.9728 0.2161 1474 +1476 3 262.4794 200.8956 39.76 0.1907 1475 +1477 3 263.3259 200.1428 39.76 0.1652 1476 +1478 3 264.1954 199.5159 39.76 0.178 1477 +1479 3 264.6209 198.8238 38.9211 0.1907 1478 +1480 3 264.7605 197.8354 37.5533 0.2288 1479 +1481 3 265.2478 196.9796 36.8018 0.2415 1480 +1482 3 266.2008 196.6021 35.7311 0.2288 1481 +1483 3 266.8975 196.0221 34.3294 0.2034 1482 +1484 3 267.3139 195.1492 32.8378 0.1907 1483 +1485 3 268.0872 194.4834 31.5717 0.1907 1484 +1486 3 268.7599 193.8016 30.0639 0.178 1485 +1487 3 269.3708 193.1026 28.4362 0.178 1486 +1488 3 269.8719 192.1794 27.326 0.1652 1487 +1489 3 270.373 191.2562 26.2161 0.178 1488 +1490 3 270.874 190.3044 25.4108 0.1652 1489 +1491 3 271.3751 189.2759 25.4108 0.1652 1490 +1492 3 271.8075 188.3116 24.6176 0.1652 1491 +1493 3 272.1885 187.3964 23.2201 0.1907 1492 +1494 3 253.4772 209.6986 44.2061 0.2924 1463 +1495 3 254.5068 209.8096 44.8 0.2288 1494 +1496 3 255.6405 209.924 44.8 0.178 1495 +1497 3 256.7845 209.924 44.8 0.1525 1496 +1498 3 257.9285 209.924 44.8 0.1652 1497 +1499 3 259.021 209.9515 45.1455 0.178 1498 +1500 3 260.0175 210.3278 45.6238 0.2034 1499 +1501 3 261.134 210.52 45.92 0.2034 1500 +1502 3 262.2437 210.7248 46.216 0.2034 1501 +1503 3 263.3728 210.7248 46.6763 0.2034 1502 +1504 3 264.4528 210.7248 47.5518 0.2161 1503 +1505 3 265.4629 210.7248 48.6612 0.2288 1504 +1506 3 266.4101 210.3793 49.28 0.2161 1505 +1507 3 267.4008 210.0384 49.8187 0.2034 1506 +1508 3 268.3744 209.9755 51.0804 0.178 1507 +1509 3 269.1821 209.6952 52.7083 0.1652 1508 +1510 3 270.318 209.6952 52.92 0.1525 1509 +1511 3 271.4323 209.5808 53.3932 0.1525 1510 +1512 3 272.5397 209.5316 54.021 0.1398 1511 +1513 3 273.5979 209.2262 54.4026 0.1271 1512 +1514 3 274.4239 208.5432 55.0984 0.1144 1513 +1515 3 275.2521 207.8248 55.9 0.1144 1514 +1516 3 276.0804 207.1075 56.7017 0.1144 1515 +1517 3 276.9361 206.5698 57.9446 0.1271 1516 +1518 3 277.8044 206.1168 59.3914 0.1398 1517 +1519 3 278.6967 205.7164 60.8247 0.1525 1518 +1520 3 279.6554 205.4647 62.2205 0.1398 1519 +1521 3 280.6152 205.213 63.6163 0.1271 1520 +1522 3 281.5739 204.9602 65.0118 0.1144 1521 +1523 3 282.552 204.5758 66.0999 0.1144 1522 +1524 3 283.5335 204.1594 67.1149 0.1144 1523 +1525 3 284.5151 203.7441 68.1296 0.1144 1524 +1526 3 285.4966 203.3277 69.1446 0.1271 1525 +1527 3 286.3581 202.6756 70.0437 0.1398 1526 +1528 3 287.2104 202.0041 70.933 0.1652 1527 +1529 3 288.2319 201.5259 71.3658 0.1652 1528 +1530 3 289.2627 201.058 71.776 0.1652 1529 +1531 3 290.2923 200.5901 72.186 0.1525 1530 +1532 3 291.323 200.1222 72.5962 0.1525 1531 +1533 3 292.4007 199.8316 73.1254 0.1525 1532 +1534 3 293.5001 199.6246 73.71 0.1398 1533 +1535 3 294.5994 199.4175 74.2949 0.1271 1534 +1536 3 295.6988 199.2104 74.8796 0.1144 1535 +1537 3 296.7982 199.0034 75.4645 0.1144 1536 +1538 3 297.8701 198.7105 76.0754 0.1144 1537 +1539 3 298.9089 198.3078 76.7203 0.1144 1538 +1540 3 299.9465 197.9051 77.3648 0.1144 1539 +1541 3 300.9841 197.5024 78.0097 0.1144 1540 +1542 3 302.0217 197.0986 78.6545 0.1144 1541 +1543 3 303.0593 196.6959 79.2994 0.1144 1542 +1544 3 243.2899 216.2652 43.6612 0.178 1452 +1545 3 242.5555 215.4484 44.3646 0.2542 1544 +1546 3 241.6036 214.8729 45.0136 0.3051 1545 +1547 3 240.7674 214.1213 45.5104 0.3432 1546 +1548 3 240.2022 213.1764 46.2297 0.3432 1547 +1549 3 239.6794 212.2383 47.1904 0.3432 1548 +1550 3 238.9233 211.4432 47.976 0.3686 1549 +1551 3 238.19 210.5875 48.447 0.3813 1550 +1552 3 237.6969 209.5957 47.7705 0.4195 1551 +1553 3 237.7426 208.4871 47.9394 0.4195 1552 +1554 3 238.1819 207.4861 48.7449 0.4068 1553 +1555 3 238.6807 206.524 49.6034 0.3432 1554 +1556 3 238.9507 205.5139 50.1231 0.2924 1555 +1557 3 238.4279 204.5541 50.7265 0.2924 1556 +1558 3 237.5962 203.8734 51.52 0.3051 1557 +1559 3 236.7165 202.7992 51.52 0.2161 1558 +1560 3 236.2463 201.765 51.52 0.2034 1559 +1561 3 235.8104 200.74 51.7409 0.1652 1560 +1562 3 235.7784 199.6005 51.8 0.1271 1561 +1563 3 235.5118 198.5721 51.8392 0.1398 1562 +1564 3 235.346 197.4876 52.36 0.1652 1563 +1565 3 234.9707 196.4237 52.542 0.1907 1564 +1566 3 234.4514 195.465 53.2 0.1907 1565 +1567 3 233.9686 194.4411 53.2 0.1907 1566 +1568 3 233.5934 193.4161 53.2 0.1907 1567 +1569 3 233.1186 192.3888 53.2 0.1652 1568 +1570 3 232.6038 191.3718 53.2 0.1398 1569 +1571 3 232.4425 190.2483 53.2 0.1144 1570 +1572 3 231.8774 189.578 54.3158 0.1398 1571 +1573 3 231.3431 188.5667 54.32 0.178 1572 +1574 3 230.5377 187.7887 54.32 0.2161 1573 +1575 3 229.8593 186.9124 54.6 0.2161 1574 +1576 3 229.2908 185.9412 54.8836 0.1907 1575 +1577 3 229.0185 185.137 56.0 0.178 1576 +1578 3 228.6787 184.0456 56.0 0.1652 1577 +1579 3 228.4454 182.9496 56.1243 0.1652 1578 +1580 3 228.1925 181.9177 56.9265 0.1525 1579 +1581 3 227.8333 180.8447 57.12 0.1652 1580 +1582 3 227.2201 180.1114 58.212 0.2034 1581 +1583 3 226.7179 179.1412 58.5298 0.2415 1582 +1584 3 226.0555 178.4903 59.852 0.2542 1583 +1585 3 225.471 177.7032 61.2545 0.2288 1584 +1586 3 224.9493 176.7503 61.917 0.2034 1585 +1587 3 224.4963 175.7459 62.44 0.1907 1586 +1588 3 223.6406 175.0377 62.44 0.178 1587 +1589 3 223.2928 174.3948 63.2789 0.1525 1588 +1590 3 222.8066 173.9052 64.4 0.1271 1589 +1591 3 222.1671 172.9762 64.4 0.1144 1590 +1592 3 221.6225 171.9718 64.4 0.1144 1591 +1593 3 220.832 171.1664 64.4 0.1144 1592 +1594 3 220.5655 170.0842 64.4 0.1144 1593 +1595 3 220.1285 169.0775 64.4 0.1144 1594 +1596 3 219.7464 168.192 64.8844 0.1144 1595 +1597 3 219.076 167.6818 66.4132 0.1144 1596 +1598 3 218.7328 166.9885 68.04 0.1144 1597 +1599 3 218.5623 165.8651 68.04 0.1144 1598 +1600 3 218.2946 164.7577 68.04 0.1144 1599 +1601 3 218.1608 163.624 68.04 0.1144 1600 +1602 3 218.0533 162.4892 68.04 0.1144 1601 +1603 3 217.8542 161.3704 68.2312 0.1271 1602 +1604 3 217.8176 160.3545 69.3342 0.1398 1603 +1605 3 217.8176 159.3237 70.3875 0.1525 1604 +1606 3 217.8176 158.1866 70.56 0.1398 1605 +1607 3 217.8942 157.054 70.56 0.1271 1606 +1608 3 218.1391 155.9695 70.761 0.1144 1607 +1609 3 218.4193 154.9491 71.4 0.1144 1608 +1610 3 218.7328 153.8714 71.6783 0.1144 1609 +1611 3 219.0497 152.7892 71.96 0.1144 1610 +1612 3 219.3162 151.7138 72.5049 0.1144 1611 +1613 3 219.5954 150.6259 72.8 0.1144 1612 +1614 3 219.9306 149.5437 72.8 0.1144 1613 +1615 3 219.9912 148.4043 72.8 0.1144 1614 +1616 3 220.1056 147.2671 72.8 0.1144 1615 +1617 3 220.252 146.3107 73.6221 0.1144 1616 +1618 3 220.8572 145.5992 73.9007 0.1144 1617 +1619 3 220.9808 144.5295 74.8434 0.1144 1618 +1620 3 221.1055 143.4599 75.7859 0.1144 1619 +1621 3 221.229 142.3891 76.7284 0.1144 1620 +1622 3 221.3526 141.3195 77.6709 0.1144 1621 +1623 3 221.5608 140.2395 78.416 0.1144 1622 +1624 3 221.8102 139.155 79.0622 0.1144 1623 +1625 3 222.0607 138.0694 79.7084 0.1144 1624 +1626 3 222.3101 136.9848 80.3547 0.1144 1625 +1627 3 222.5606 135.9003 81.0009 0.1144 1626 +1628 3 222.81 134.8158 81.6472 0.1144 1627 +1629 3 222.9473 133.7096 82.2273 0.1144 1628 +1630 3 222.9976 132.5873 82.7568 0.1144 1629 +1631 3 223.048 131.465 83.2863 0.1144 1630 +1632 3 223.0994 130.3428 83.8158 0.1144 1631 +1633 3 223.1498 129.2205 84.3452 0.1144 1632 +1634 3 223.2001 128.0983 84.8747 0.1144 1633 +1635 3 223.0125 126.9897 85.26 0.1144 1634 +1636 3 222.754 125.8835 85.6027 0.1144 1635 +1637 3 222.4966 124.7784 85.9454 0.1144 1636 +1638 3 222.2392 123.6721 86.2884 0.1144 1637 +1639 3 221.9806 122.5659 86.6312 0.1144 1638 +1640 3 221.7232 121.4608 86.9739 0.1144 1639 +1641 3 221.4658 120.3545 87.3169 0.1144 1640 +1642 3 221.2073 119.2494 87.6596 0.1144 1641 +1643 3 220.9499 118.1432 88.0023 0.1144 1642 +1644 3 221.2233 117.0609 88.0617 0.1144 1643 +1645 3 221.6088 115.9844 88.0617 0.1144 1644 +1646 3 221.9932 114.9068 88.0617 0.1144 1645 +1647 3 222.3787 113.8295 88.0617 0.1144 1646 +1648 3 222.7631 112.7522 88.0617 0.1271 1647 +1649 3 223.1486 111.6749 88.0617 0.1398 1648 +1650 3 223.4186 110.5707 88.2725 0.1525 1649 +1651 3 223.6383 109.4548 88.5749 0.1398 1650 +1652 3 223.8579 108.339 88.8773 0.1271 1651 +1653 3 224.0776 107.2231 89.18 0.1144 1652 +1654 3 224.2972 106.1071 89.4824 0.1144 1653 +1655 3 224.5169 104.9913 89.7848 0.1144 1654 +1656 3 224.7365 103.8754 90.0875 0.1144 1655 +1657 3 224.9562 102.7596 90.3899 0.1144 1656 +1658 3 225.1758 101.6437 90.6903 0.1144 1657 +1659 3 225.4378 100.5298 90.6903 0.1144 1658 +1660 3 225.6986 99.416 90.6903 0.1144 1659 +1661 3 226.2615 98.491 91.4805 0.1144 1660 +1662 3 226.8666 97.5917 92.3782 0.1144 1661 +1663 3 227.4707 96.6925 93.2758 0.1144 1662 +1664 3 228.0758 95.7932 94.1738 0.1144 1663 +1665 3 228.6799 94.8939 95.0715 0.1398 1664 +1666 3 237.65 203.7464 53.2 0.178 1558 +1667 3 238.7722 203.6686 53.4531 0.1907 1666 +1668 3 239.763 203.6045 54.32 0.1652 1667 +1669 3 240.4242 202.8529 54.32 0.1398 1668 +1670 3 241.2616 202.1128 54.5784 0.1144 1669 +1671 3 242.0521 201.2914 54.6 0.1144 1670 +1672 3 242.5177 200.3281 54.6 0.1144 1671 +1673 3 243.2407 199.7573 55.3714 0.1144 1672 +1674 3 243.8287 198.9748 56.7398 0.1144 1673 +1675 3 244.4785 198.2849 58.0633 0.1144 1674 +1676 3 245.3411 197.5928 58.329 0.1144 1675 +1677 3 245.865 196.6639 58.5239 0.1398 1676 +1678 3 246.5938 196.2189 60.0678 0.1652 1677 +1679 3 247.5204 195.8528 60.7866 0.1907 1678 +1680 3 248.4356 195.8528 62.3742 0.1652 1679 +1681 3 249.4309 195.7384 63.1907 0.1398 1680 +1682 3 250.512 195.7384 63.84 0.1271 1681 +1683 3 251.5313 195.7384 64.7592 0.1525 1682 +1684 3 252.6684 195.7384 64.9883 0.178 1683 +1685 3 253.5298 195.2442 66.103 0.178 1684 +1686 3 254.492 194.7523 66.36 0.178 1685 +1687 3 255.0537 194.3656 67.6404 0.178 1686 +1688 3 255.6176 194.3015 70.0711 0.2034 1687 +1689 3 256.1816 194.2363 72.5021 0.1907 1688 +1690 3 256.8886 194.0338 74.5766 0.178 1689 +1691 3 257.7123 193.717 76.356 0.1398 1690 +1692 3 258.5371 193.3989 78.1351 0.1271 1691 +1693 3 259.3608 193.0809 79.9145 0.1144 1692 +1694 3 260.1834 192.7388 81.6693 0.1144 1693 +1695 3 261.0025 192.3522 83.3806 0.1144 1694 +1696 3 261.8216 191.9655 85.0917 0.1144 1695 +1697 3 262.6418 191.5697 86.767 0.1144 1696 +1698 3 263.5318 190.8936 87.3712 0.1144 1697 +1699 3 264.4207 190.2175 87.9754 0.1144 1698 +1700 3 265.3096 189.5414 88.5797 0.1144 1699 +1701 3 266.1996 188.8652 89.1839 0.1144 1700 +1702 3 267.0885 188.1891 89.7882 0.1144 1701 +1703 3 267.9774 187.513 90.3921 0.1144 1702 +1704 3 268.8503 186.8918 91.2559 0.1144 1703 +1705 3 269.7277 186.3198 92.3835 0.1144 1704 +1706 3 270.6052 185.7478 93.5113 0.1144 1705 +1707 3 271.4163 185.2205 94.9892 0.1144 1706 +1708 3 272.2091 184.7057 96.565 0.1144 1707 +1709 3 273.003 184.1897 98.1406 0.1144 1708 +1710 3 273.7958 183.6749 99.7164 0.1144 1709 +1711 3 274.6847 183.2059 100.767 0.1144 1710 +1712 3 275.6697 183.0423 101.6364 0.1398 1711 +1713 3 276.5574 183.0995 103.3959 0.178 1712 +1714 2 243.2087 232.2354 37.4839 0.4068 1 +1715 2 243.767 231.2379 37.52 0.4068 1714 +1716 2 244.4007 230.2861 37.52 0.4068 1715 +1717 2 245.2942 229.5848 37.5194 0.4068 1716 +1718 2 246.2563 228.967 37.5175 0.394 1717 +1719 2 247.3053 228.514 37.5049 0.3432 1718 +1720 2 248.3269 228.0003 37.4402 0.2796 1719 +1721 2 249.4343 227.8551 36.955 0.2542 1720 +1722 2 250.4296 227.6754 35.6776 0.2669 1721 +1723 2 251.4798 227.3197 35.0406 0.2924 1722 +1724 2 252.4053 226.7545 34.167 0.3051 1723 +1725 2 253.4029 226.3312 33.3416 0.2796 1724 +1726 2 254.2757 225.7684 32.2375 0.2542 1725 +1727 2 255.1337 225.0282 31.9421 0.2288 1726 +1728 2 256.0558 224.351 31.92 0.2542 1727 +1729 2 257.0076 223.7172 31.92 0.2796 1728 +1730 2 257.9686 223.0972 31.92 0.2924 1729 +1731 2 258.9158 222.4554 31.92 0.2542 1730 +1732 2 259.7669 221.7152 32.1191 0.2034 1731 +1733 2 260.6226 220.9968 32.2 0.1652 1732 +1734 2 261.6808 220.5769 32.1538 0.1525 1733 +1735 2 262.5766 219.8985 31.7307 0.1525 1734 +1736 2 263.4643 219.1893 31.57 0.1398 1735 +1737 2 264.2983 218.4376 31.36 0.1398 1736 +1738 2 265.2238 217.8119 30.8918 0.1398 1737 +1739 2 266.1813 217.2021 30.7936 0.1525 1738 +1740 2 267.1995 216.7079 30.52 0.1398 1739 +1741 2 268.1204 216.033 30.5155 0.1271 1740 +1742 2 268.9281 215.2367 30.24 0.1144 1741 +1743 2 269.6191 214.3261 30.24 0.1144 1742 +1744 2 270.4416 213.5436 30.24 0.1271 1743 +1745 2 271.2252 212.7428 29.9785 0.1652 1744 +1746 2 272.177 212.2921 29.136 0.2161 1745 +1747 2 273.265 212.021 29.12 0.2415 1746 +1748 2 274.3026 211.5588 29.12 0.2415 1747 +1749 2 275.4409 211.4387 29.12 0.2288 1748 +1750 2 276.5826 211.4238 29.12 0.2288 1749 +1751 2 277.7152 211.5805 29.12 0.2161 1750 +1752 2 278.85 211.6892 29.12 0.2034 1751 +1753 2 279.6588 212.3001 28.2528 0.1907 1752 +1754 2 280.4493 212.8252 27.0959 0.1907 1753 +1755 2 281.5338 213.1215 26.8976 0.1907 1754 +1756 2 282.6058 213.4693 27.16 0.1907 1755 +1757 2 283.6651 213.8868 27.16 0.1907 1756 +1758 2 284.7794 214.0424 27.16 0.1907 1757 +1759 2 285.7735 214.1568 25.9151 0.2034 1758 +1760 2 286.8855 214.2106 25.48 0.2034 1759 +1761 2 287.7686 214.8226 24.9452 0.1907 1760 +1762 2 288.8451 214.8432 24.2466 0.178 1761 +1763 2 289.7226 214.5046 23.2562 0.1907 1762 +1764 2 290.7522 214.2815 22.8841 0.2161 1763 +1765 2 291.8573 214.508 22.68 0.2034 1764 +1766 2 292.9544 214.8169 22.68 0.1652 1765 +1767 2 294.0961 214.8432 22.68 0.1398 1766 +1768 2 295.2321 214.754 22.68 0.1398 1767 +1769 2 296.3601 214.8009 22.68 0.1652 1768 +1770 2 297.4743 214.9576 22.68 0.178 1769 +1771 2 298.5909 214.7757 22.4 0.1907 1770 +1772 2 299.7108 214.8432 22.1388 0.1907 1771 +1773 2 300.8548 214.8432 22.12 0.178 1772 +1774 2 301.9988 214.8432 22.12 0.1652 1773 +1775 2 303.1291 214.8432 21.8492 0.1525 1774 +1776 2 303.9139 214.0561 21.84 0.1525 1775 +1777 2 304.6564 213.2553 21.84 0.1525 1776 +1778 2 305.7912 213.1272 21.84 0.1652 1777 +1779 3 240.9744 238.9724 35.8481 0.1907 1 +1780 3 241.8393 239.3534 34.4294 0.2288 1779 +1781 3 242.6127 239.6783 32.5332 0.3305 1780 +1782 3 243.4649 240.3967 31.9152 0.3813 1781 +1783 3 244.3939 241.0648 31.8844 0.3813 1782 +1784 3 245.2622 241.7936 31.7251 0.3051 1783 +1785 3 245.9314 242.7065 31.5266 0.2796 1784 +1786 3 246.5137 243.6457 32.0214 0.2924 1785 +1787 3 247.2344 244.4511 32.8115 0.3178 1786 +1788 3 248.105 245.1821 32.8485 0.3178 1787 +1789 3 248.9596 245.8227 32.0754 0.2924 1788 +1790 3 249.7638 246.3535 30.6043 0.3051 1789 +1791 3 250.6801 246.8683 29.7587 0.3305 1790 +1792 3 251.5267 247.6177 29.6792 0.3813 1791 +1793 3 252.1502 248.5763 29.675 0.394 1792 +1794 3 252.6856 249.583 29.652 0.394 1793 +1795 3 253.1294 250.6332 29.5142 0.394 1794 +1796 3 253.6648 251.6251 29.0752 0.4195 1795 +1797 3 254.2609 252.5712 28.5202 0.4322 1796 +1798 3 254.9175 253.4829 28.0885 0.4195 1797 +1799 3 255.652 254.3123 27.4582 0.3813 1798 +1800 3 256.4162 255.1589 27.2401 0.3305 1799 +1801 3 256.9573 256.129 26.747 0.2796 1800 +1802 3 257.5567 257.0808 26.8142 0.2415 1801 +1803 3 258.4319 257.5945 26.4874 0.2796 1802 +1804 3 259.4752 257.6917 25.3949 0.3432 1803 +1805 3 260.8526 258.0429 26.038 0.1144 1804 +1806 3 261.992 258.0933 26.2035 0.1144 1805 +1807 3 263.1314 258.1299 26.297 0.1271 1806 +1808 3 264.256 258.3198 26.341 0.1398 1807 +1809 3 265.3119 258.7476 26.4592 0.178 1808 +1810 3 266.409 258.9009 26.8358 0.2161 1809 +1811 3 267.4958 258.6298 26.4174 0.2669 1810 +1812 3 268.6341 258.6584 26.4706 0.2669 1811 +1813 3 269.7438 258.8666 26.6 0.2415 1812 +1814 3 270.8637 259.0943 26.6 0.2034 1813 +1815 3 271.9997 259.1549 26.542 0.1907 1814 +1816 3 273.0785 259.5095 26.32 0.178 1815 +1817 3 274.1859 259.7955 26.32 0.1652 1816 +1818 3 275.1755 260.3458 26.32 0.1652 1817 +1819 3 276.2302 260.7233 26.255 0.178 1818 +1820 3 277.1615 261.3651 25.8807 0.2034 1819 +1821 3 278.2631 261.65 25.76 0.2161 1820 +1822 3 279.4003 261.7701 25.7351 0.2415 1821 +1823 3 280.4665 262.1144 25.48 0.2288 1822 +1824 3 281.5292 262.5057 25.48 0.2034 1823 +1825 3 282.5508 262.9987 25.366 0.1525 1824 +1826 3 283.6697 263.12 24.9897 0.1271 1825 +1827 3 284.7942 263.12 24.64 0.1144 1826 +1828 3 285.9359 263.1589 24.64 0.1144 1827 +1829 3 287.0662 263.2344 24.3919 0.1398 1828 +1830 3 288.1953 263.2882 24.08 0.178 1829 +1831 3 289.289 263.6062 24.071 0.2288 1830 +1832 3 290.2294 264.1485 23.4178 0.2415 1831 +1833 3 291.1457 264.7067 22.5285 0.2288 1832 +1834 3 292.0746 265.2284 21.5891 0.1907 1833 +1835 3 293.1832 265.4995 21.56 0.1525 1834 +1836 3 294.2013 265.8553 20.7606 0.1271 1835 +1837 3 295.2241 266.2809 20.5058 0.1144 1836 +1838 3 296.3143 266.5817 20.44 0.1144 1837 +1839 3 297.2741 267.1423 20.2667 0.1144 1838 +1840 3 298.3575 267.4672 20.16 0.1144 1839 +1841 3 298.8128 267.8127 18.4341 0.1144 1840 +1842 3 299.3413 268.1765 17.0419 0.1144 1841 +1843 3 300.4144 268.538 16.8 0.1144 1842 +1844 3 301.4932 268.6936 17.1382 0.1144 1843 +1845 3 302.1167 268.7496 19.276 0.1144 1844 +1846 3 303.2115 269.0608 19.3351 0.1144 1845 +1847 3 304.2262 269.4063 20.0796 0.1144 1846 +1848 3 305.3496 269.5424 20.2199 0.1144 1847 +1849 3 306.4787 269.6408 20.4386 0.1144 1848 +1850 3 307.482 269.7415 19.6 0.1398 1849 +1851 3 308.5276 270.1567 19.7602 0.1652 1850 +1852 3 309.6488 270.3604 19.88 0.1907 1851 +1853 3 310.7779 270.548 19.88 0.178 1852 +1854 3 311.891 270.3318 20.1359 0.1907 1853 +1855 3 312.9732 269.9634 20.16 0.2415 1854 +1856 3 314.0989 269.8582 20.16 0.2924 1855 +1857 3 315.2349 269.7552 20.16 0.2924 1856 +1858 3 316.3492 269.9611 20.16 0.2542 1857 +1859 3 317.4589 270.1956 20.16 0.2542 1858 +1860 3 318.5239 270.5606 20.16 0.2796 1859 +1861 3 319.51 271.1188 19.934 0.2669 1860 +1862 3 320.5465 271.573 19.88 0.2288 1861 +1863 3 321.5258 272.1462 19.88 0.2034 1862 +1864 3 322.5428 272.6518 19.88 0.2161 1863 +1865 3 323.625 272.9618 19.88 0.2288 1864 +1866 3 324.7564 273.0888 19.88 0.2161 1865 +1867 3 325.8798 273.3039 19.88 0.2034 1866 +1868 3 326.9769 273.6276 19.88 0.1652 1867 +1869 3 328.0706 273.9617 19.88 0.1398 1868 +1870 3 329.1974 274.1024 19.88 0.1144 1869 +1871 3 330.3243 274.1745 20.1183 0.1144 1870 +1872 3 331.4019 274.3026 20.72 0.1144 1871 +1873 3 332.5276 274.1848 20.4565 0.1398 1872 +1874 3 333.5938 273.9891 19.88 0.1907 1873 +1875 3 334.7264 273.8736 19.7537 0.2669 1874 +1876 3 335.8452 273.9811 19.2934 0.2924 1875 +1877 3 336.9217 274.258 18.8513 0.2924 1876 +1878 3 338.0326 274.528 18.76 0.2542 1877 +1879 3 339.0576 274.981 18.5517 0.2415 1878 +1880 3 340.0574 275.5061 18.3386 0.2034 1879 +1881 3 341.0813 275.9923 18.2 0.178 1880 +1882 3 342.2127 276.0106 18.2 0.1652 1881 +1883 3 343.3384 275.8241 18.114 0.178 1882 +1884 3 344.4607 275.966 17.92 0.1907 1883 +1885 3 345.5486 276.3183 17.9068 0.1907 1884 +1886 3 346.5862 276.7565 17.64 0.1907 1885 +1887 3 347.5278 277.3994 17.5619 0.178 1886 +1888 3 348.5882 277.7632 17.36 0.1652 1887 +1889 3 349.7322 277.7632 17.36 0.1525 1888 +1890 3 350.8202 277.8902 16.8622 0.1525 1889 +1891 3 351.8967 278.2448 16.8 0.1525 1890 +1892 3 353.0373 278.3295 16.8 0.1525 1891 +1893 3 354.1721 278.3352 16.52 0.1525 1892 +1894 3 355.3058 278.2219 16.5508 0.1398 1893 +1895 3 356.4429 278.2208 16.8 0.1271 1894 +1896 3 357.5618 278.0675 17.057 0.1144 1895 +1897 3 358.7001 277.992 17.08 0.1144 1896 +1898 3 359.8383 277.9451 17.08 0.1271 1897 +1899 3 360.8233 277.5596 16.8179 0.1525 1898 +1900 3 361.5452 277.3056 18.5954 0.178 1899 +1901 3 362.6183 277.42 19.0509 0.178 1900 +1902 3 363.5998 277.3502 19.8408 0.1652 1901 +1903 3 364.7415 277.3056 19.88 0.1525 1902 +1904 3 365.8626 277.3056 20.2392 0.1525 1903 +1905 3 366.9826 277.3056 20.72 0.1398 1904 +1906 3 368.1266 277.3056 20.72 0.1271 1905 +1907 3 369.2706 277.309 20.72 0.1271 1906 +1908 3 370.402 277.436 20.72 0.1652 1907 +1909 3 371.5117 277.6911 20.72 0.2034 1908 +1910 3 372.4967 278.1728 20.72 0.2161 1909 +1911 3 373.4805 278.6304 20.72 0.178 1910 +1912 3 374.5262 278.9552 20.72 0.1398 1911 +1913 3 375.494 279.4563 20.72 0.1398 1912 +1914 3 376.622 279.5398 20.72 0.1652 1913 +1915 3 377.6905 279.9151 20.72 0.1907 1914 +1916 3 378.4524 280.6232 20.72 0.1652 1915 +1917 3 379.4385 281.1128 20.5556 0.1398 1916 +1918 3 380.5527 281.1952 20.6713 0.1144 1917 +1919 3 381.6956 281.2021 20.7138 0.1144 1918 +1920 3 382.62 281.5098 19.4432 0.1271 1919 +1921 3 383.661 281.8072 19.32 0.1398 1920 +1922 3 384.6689 282.2603 19.32 0.1652 1921 +1923 3 385.663 282.7568 19.32 0.178 1922 +1924 3 386.7978 282.8094 19.1024 0.1907 1923 +1925 3 387.5403 283.5198 18.7415 0.178 1924 +1926 3 388.428 283.823 17.6638 0.1652 1925 +1927 3 389.4988 283.5759 17.9186 0.1525 1926 +1928 3 390.5765 283.3688 18.3478 0.1652 1927 +1929 3 391.7022 283.3688 18.76 0.2034 1928 +1930 3 392.4103 283.3802 17.1839 0.2669 1929 +1931 3 393.5268 283.4832 17.0579 0.3051 1930 +1932 3 394.6262 283.6926 16.8 0.2796 1931 +1933 3 395.7691 283.712 16.8 0.2161 1932 +1934 3 396.9039 283.617 16.7838 0.1652 1933 +1935 3 398.0376 283.712 16.6628 0.1525 1934 +1936 3 399.1588 283.5976 17.0492 0.1398 1935 +1937 3 400.265 283.4363 17.08 0.1271 1936 +1938 3 401.3793 283.2361 17.08 0.1271 1937 +1939 3 402.5187 283.1377 17.08 0.1398 1938 +1940 3 403.6432 283.0256 17.3687 0.1652 1939 +1941 3 404.7472 283.14 17.92 0.1652 1940 +1942 3 259.243 257.5876 23.8 0.2288 1804 +1943 3 259.3448 258.7236 23.8 0.2796 1942 +1944 3 259.3654 259.8619 23.5942 0.2669 1943 +1945 3 259.4569 260.999 23.52 0.2415 1944 +1946 3 259.7509 261.8959 22.96 0.2542 1945 +1947 3 260.5552 262.5572 22.12 0.2924 1946 +1948 3 261.2496 263.4655 22.12 0.3432 1947 +1949 3 261.936 264.3807 22.12 0.3432 1948 +1950 3 262.5549 265.3005 21.5533 0.3178 1949 +1951 3 263.0056 266.1894 20.4375 0.2669 1950 +1952 3 263.2207 267.1457 19.1559 0.2542 1951 +1953 3 264.0009 267.9591 19.04 0.2415 1952 +1954 3 264.7136 268.8354 18.7194 0.2288 1953 +1955 3 265.3405 269.5264 18.2 0.2161 1954 +1956 3 266.0498 270.2174 17.8942 0.2288 1955 +1957 3 266.7007 271.0113 17.36 0.2542 1956 +1958 3 267.4924 271.8258 17.36 0.2415 1957 +1959 3 268.1273 272.749 17.36 0.2034 1958 +1960 3 268.1536 273.8461 16.7597 0.1525 1959 +1961 3 268.1536 274.9741 16.2963 0.1271 1960 +1962 3 268.1925 276.0037 15.2967 0.1144 1961 +1963 3 269.2976 276.0472 15.12 0.1144 1962 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc new file mode 100644 index 0000000..cd1d585 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc @@ -0,0 +1,2194 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/neuron tracing and reconstruction/vaa3d/vaa3d_bin_msvc_64bit_v2921_a/vaa3d_bin_msvc_64bit_v2921_a/new 168053.04.01.01.swc +# id,type,x,y,z,r,pid +1 1 415.6095 417.7339 47.8951 6.2366 -1 +2 4 413.4633 416.9525 48.2236 0.1144 1 +3 4 412.3903 416.5624 48.3879 0.1652 2 +4 4 411.3172 416.1712 48.552 0.2542 3 +5 4 410.2441 415.7811 48.7166 0.3813 4 +6 4 409.1001 415.7559 48.72 0.4576 5 +7 4 409.1871 414.7286 47.5728 0.2587 6 +8 4 408.9468 413.7368 46.8028 0.2501 7 +9 4 408.4984 412.7644 46.6435 0.2908 8 +10 4 408.6242 411.7382 45.6862 0.3458 9 +11 4 409.0727 410.9088 44.2305 0.3686 10 +12 4 409.8048 410.1068 43.4174 0.3514 11 +13 4 410.4535 409.2797 43.8572 0.3085 12 +14 4 411.0884 408.408 44.1526 0.2746 13 +15 4 411.6181 407.415 43.7422 0.2852 14 +16 4 412.0162 406.3522 43.4109 0.3197 15 +17 4 412.4715 405.3181 43.0052 0.3672 16 +18 4 413.0721 404.4749 41.925 0.4006 17 +19 4 413.5045 403.538 40.7725 0.3955 18 +20 4 413.9804 402.5095 40.8229 0.3338 19 +21 4 414.533 401.5509 40.1475 0.2932 20 +22 4 415.3326 400.9068 38.9242 0.3176 21 +23 4 416.3394 400.972 37.6132 0.572 22 +24 4 416.9869 400.3554 39.8726 0.3938 23 +25 4 417.7831 400.1895 41.337 0.3185 24 +26 4 418.8962 400.0431 41.5464 0.2855 25 +27 4 419.9006 399.5306 41.4324 0.2954 26 +28 4 420.7186 398.787 40.8402 0.3374 27 +29 4 420.6717 397.6967 40.549 0.3432 28 +30 4 420.6763 396.5539 40.5409 0.3432 29 +31 4 420.4795 395.4293 40.5177 0.3432 30 +32 4 420.2175 394.3322 40.0576 0.3926 31 +33 4 420.1672 393.2317 39.3039 0.4188 32 +34 4 420.0779 392.1106 38.7923 0.4195 33 +35 4 420.1958 390.9849 39.1642 0.3822 34 +36 4 420.1546 389.8455 39.3565 0.3316 35 +37 4 420.0539 388.7209 39.8135 0.2806 36 +38 4 419.8549 387.6101 40.2632 0.2297 37 +39 4 419.848 386.4718 40.5278 0.2545 38 +40 4 420.2507 385.4136 40.178 0.3079 39 +41 4 420.4795 384.4206 38.9511 0.3813 40 +42 4 420.9943 383.4002 38.9544 0.3824 41 +43 4 421.4084 382.366 39.0348 0.394 42 +44 4 421.8683 381.5972 37.5304 0.3957 43 +45 4 422.6108 380.7655 38.134 0.3996 44 +46 4 423.2708 379.856 38.1679 0.3475 45 +47 4 423.6724 378.8081 37.8428 0.3077 46 +48 4 424.2261 377.8289 38.281 0.283 47 +49 4 424.6448 376.8485 38.7008 0.2885 48 +50 4 424.6322 375.7262 38.1615 0.2701 49 +51 4 424.7672 374.6154 37.7213 0.259 50 +52 4 425.3072 373.6853 37.2333 0.2619 51 +53 4 426.116 372.9177 36.7326 0.2598 52 +54 4 426.8939 372.0929 36.4652 0.2607 53 +55 4 427.6169 371.2269 36.2782 0.2477 54 +56 4 428.1729 370.2499 36.568 0.2482 55 +57 4 428.301 369.1997 37.119 0.268 56 +58 4 428.3296 368.0866 37.1496 0.2796 57 +59 4 428.476 366.9975 37.5558 0.2646 58 +60 4 428.4921 365.9404 38.614 0.2382 59 +61 4 428.6797 364.9795 38.04 0.2378 60 +62 4 428.9897 363.9556 38.1763 0.2415 61 +63 4 429.5823 362.9992 38.2914 0.2415 62 +64 4 430.096 362.2213 36.759 0.2418 63 +65 4 430.3202 361.1105 36.3874 0.2551 64 +66 4 430.7183 360.0397 36.2569 0.2796 65 +67 4 430.8579 358.9197 36.0772 0.2811 66 +68 4 430.525 357.8295 35.9792 0.2924 67 +69 4 430.2115 356.7541 35.4085 0.2942 68 +70 4 429.9884 355.6582 35.2243 0.3032 69 +71 4 429.9575 354.592 35.8677 0.2844 70 +72 4 429.6738 353.5406 35.5443 0.2442 71 +73 4 429.8992 352.4286 35.8708 0.2127 72 +74 4 430.1532 351.327 36.101 0.2107 73 +75 4 430.3842 350.2345 35.5944 0.2401 74 +76 4 430.6085 349.1705 34.858 0.271 75 +77 4 430.5833 348.0357 34.8202 0.2796 76 +78 4 430.4552 346.91 34.9826 0.2749 77 +79 4 430.1429 345.8644 35.2422 0.2669 78 +80 4 429.6887 344.8828 35.9436 0.2669 79 +81 4 429.4027 343.7823 35.9912 0.2617 80 +82 4 429.3283 342.644 35.9752 0.2488 81 +83 4 429.2654 341.5092 35.7739 0.2415 82 +84 4 428.9542 340.4315 35.8243 0.2476 83 +85 4 428.5435 339.3756 35.9411 0.2542 84 +86 4 428.2964 338.2659 35.7216 0.241 85 +87 4 428.253 337.1345 35.7787 0.2155 86 +88 4 428.1935 336.002 35.887 0.2034 87 +89 4 428.047 334.8694 35.7493 0.2102 88 +90 4 428.1168 333.7654 35.2537 0.223 89 +91 4 428.6431 332.8171 34.7704 0.2288 90 +92 4 429.3054 331.8961 34.8337 0.2288 91 +93 4 429.9449 330.9512 34.9664 0.2207 92 +94 4 430.3202 329.8987 34.8869 0.1989 93 +95 4 430.4174 328.7684 34.5817 0.1731 94 +96 4 430.6279 327.6588 34.2415 0.1564 95 +97 4 430.7926 326.5354 33.9646 0.1525 96 +98 4 430.9494 325.4142 33.5664 0.1436 97 +99 4 431.0912 324.2851 33.5502 0.1398 98 +100 4 431.0478 323.1537 33.8419 0.1398 99 +101 4 431.0958 322.02 33.7761 0.1683 100 +102 4 431.3578 320.9114 33.7848 0.2067 101 +103 4 431.8943 319.9127 33.9287 0.2647 102 +104 4 432.4148 318.9209 33.4818 0.3095 103 +105 4 432.9239 317.9176 33.7086 0.3281 104 +106 4 433.3358 316.8571 33.9564 0.3305 105 +107 4 433.4238 315.7566 34.571 0.32 106 +108 4 433.3461 314.6229 34.6052 0.3283 107 +109 4 433.2431 313.488 34.3664 0.3305 108 +110 4 433.0887 312.3589 34.5268 0.3517 109 +111 4 432.8175 311.2549 34.7973 0.3453 110 +112 4 432.5212 310.1636 35.2173 0.3218 111 +113 4 432.3656 309.0573 35.8081 0.2853 112 +114 4 432.0648 308.1101 34.6562 0.3042 113 +115 4 431.8589 307.0118 35.1266 0.3426 114 +116 4 431.6495 305.8873 35.1862 0.3808 115 +117 4 431.0535 304.9126 35.303 0.3813 116 +118 4 430.7801 303.8086 35.5578 0.3683 117 +119 4 430.2939 302.7882 35.1344 0.3556 118 +120 4 430.0639 301.6831 34.7032 0.3443 119 +121 4 430.0937 300.5505 34.3185 0.3686 120 +122 4 430.1097 299.4168 34.0116 0.3661 121 +123 4 430.2573 298.3014 34.214 0.3355 122 +124 4 430.7995 297.3164 33.9262 0.2754 123 +125 4 430.8773 296.1953 33.906 0.2567 124 +126 4 430.5833 295.1051 34.3484 0.2754 125 +127 4 430.3225 294.0137 34.8872 0.3123 126 +128 4 430.0273 292.9304 35.1792 0.3354 127 +129 4 429.8694 291.8069 35.0829 0.3377 128 +130 4 429.8408 290.6652 35.1207 0.3305 129 +131 4 429.7127 289.5327 35.0314 0.3249 130 +132 4 429.5125 288.4241 35.3021 0.3178 131 +133 4 429.3077 287.3534 36.1228 0.312 132 +134 4 429.3672 286.3329 36.2785 0.3111 133 +135 4 429.8305 285.3182 35.6964 0.3178 134 +136 4 430.2378 284.2783 35.8817 0.324 135 +137 4 430.5764 283.2144 36.4549 0.3305 136 +138 4 430.9356 282.29 35.7034 0.3378 137 +139 4 431.4768 281.4068 34.9874 0.3272 138 +140 4 432.1952 280.534 35.2635 0.2932 139 +141 4 432.9113 279.6497 35.4343 0.2627 140 +142 4 433.6607 278.7928 35.6118 0.2629 141 +143 4 434.4203 278.0069 36.3698 0.2845 142 +144 4 435.3046 277.3308 36.4988 0.2924 143 +145 4 436.1237 276.7164 35.4046 0.2924 144 +146 4 436.9531 276.1078 34.1916 0.2924 145 +147 4 437.683 275.4283 35.1582 0.2924 146 +148 4 437.8969 274.3449 35.6446 0.2439 147 +149 4 438.4952 273.416 35.0 0.1144 148 +150 4 415.304 399.582 36.0962 0.321 23 +151 4 414.6165 398.7 35.6356 0.286 150 +152 4 414.1074 397.7013 35.1806 0.2956 151 +153 4 413.6109 396.7049 34.594 0.3312 152 +154 4 413.1922 396.0082 32.8079 0.3432 153 +155 4 412.9577 395.0278 32.405 0.3337 154 +156 4 413.1442 393.9204 32.4181 0.3113 155 +157 4 413.6361 392.9057 32.7368 0.3051 156 +158 4 414.4129 392.3119 34.0194 0.3051 157 +159 4 415.3143 391.8303 33.3642 0.3199 158 +160 4 415.7754 390.9952 32.1745 0.3332 159 +161 4 415.4756 389.9232 31.5952 0.3367 160 +162 4 414.9837 388.9348 31.0271 0.3075 161 +163 4 414.3968 388.0551 30.0538 0.2597 162 +164 4 414.0822 387.061 29.3129 0.2108 163 +165 4 414.4048 386.1812 27.8964 0.2034 164 +166 4 414.4449 385.3106 26.6983 0.2496 165 +167 4 413.7802 384.6139 25.3638 0.3076 166 +168 4 413.6818 383.6255 25.338 0.3634 167 +169 4 414.3305 382.7652 26.1512 0.3324 168 +170 4 414.3568 381.6384 26.04 0.2288 169 +171 4 408.0202 415.4951 48.7203 0.483 6 +172 4 406.8808 415.3944 48.722 0.5084 171 +173 4 405.8214 414.9608 48.7309 0.5212 172 +174 4 404.8971 414.287 48.771 0.5466 173 +175 4 404.0402 413.532 48.9317 0.5212 174 +176 4 403.0941 412.952 49.6079 0.4576 175 +177 4 402.1812 412.4841 49.8131 0.4069 176 +178 4 401.1688 411.951 49.812 0.4195 177 +179 4 400.2009 411.3435 49.6801 0.394 178 +180 4 399.3876 410.5873 49.0104 0.3686 179 +181 4 398.5925 409.7682 48.8412 0.3559 180 +182 4 397.8649 408.8988 49.2358 0.3432 181 +183 4 397.111 408.0671 49.7594 0.3051 182 +184 4 396.0185 407.7273 49.6936 0.3178 183 +185 4 394.9077 407.7296 49.0249 0.3686 184 +186 4 393.7648 407.7754 48.9742 0.4449 185 +187 4 392.67 407.9813 49.4808 0.4299 186 +188 4 391.5832 407.9538 49.0952 0.3868 187 +189 4 390.6016 407.518 48.193 0.3358 188 +190 4 389.7093 406.8533 47.6756 0.3001 189 +191 4 388.8616 406.0868 47.6003 0.3025 190 +192 4 387.9613 405.3878 47.5933 0.343 191 +193 4 386.9763 404.8055 47.5619 0.4065 192 +194 4 385.9593 404.2965 47.3673 0.455 193 +195 4 384.9697 403.7679 46.8983 0.4703 194 +196 4 384.0911 403.0632 46.5136 0.4602 195 +197 4 383.2732 402.2636 46.4439 0.4399 196 +198 4 382.4655 401.4559 46.3336 0.4272 197 +199 4 381.6578 400.6494 46.2862 0.4303 198 +200 4 380.8502 399.844 46.48 0.4576 199 +201 4 380.4235 399.3956 45.3678 0.3814 200 +202 4 379.6467 398.557 45.3474 0.2288 201 +203 4 379.236 398.287 46.4797 0.3432 202 +204 4 379.2497 398.8911 48.2451 0.2529 203 +205 4 378.5096 398.4632 50.0976 0.2446 204 +206 4 377.7866 397.8855 51.7076 0.2687 205 +207 4 376.8061 397.4702 52.6896 0.2796 206 +208 4 375.7102 397.2128 53.1577 0.2775 207 +209 4 374.6154 396.8982 53.312 0.269 208 +210 4 373.5995 396.3868 53.606 0.282 209 +211 4 372.5733 395.9018 53.8331 0.295 210 +212 4 371.482 395.5998 54.1478 0.3051 211 +213 4 370.4398 395.228 54.8498 0.2992 212 +214 4 369.3827 394.8676 55.4196 0.2796 213 +215 4 368.2753 394.7292 55.923 0.2764 214 +216 4 367.1897 394.9546 56.4553 0.2706 215 +217 4 366.1647 395.4236 56.9215 0.2648 216 +218 4 365.1099 395.7737 57.5506 0.1946 217 +219 4 364.0437 396.0436 58.2845 0.1608 218 +220 4 363.0118 396.4841 58.7518 0.275 219 +221 4 362.0474 397.0835 59.0744 0.2843 220 +222 4 361.1105 397.6887 59.6562 0.2503 221 +223 4 360.1312 397.9393 60.5413 0.2065 222 +224 4 359.2755 397.3627 61.3416 0.1965 223 +225 4 358.7241 396.404 62.0234 0.2094 224 +226 4 358.1853 395.4282 62.5694 0.2282 225 +227 4 357.3948 394.6754 63.0974 0.2542 226 +228 4 356.4326 394.1595 63.922 0.2801 227 +229 4 355.6673 393.4136 64.3871 0.2924 228 +230 4 355.1685 392.3954 64.1855 0.2718 229 +231 4 354.8127 391.3796 64.6596 0.2182 230 +232 4 354.3185 390.4632 65.721 0.1674 231 +233 4 353.5864 390.0582 67.3389 0.1441 232 +234 4 352.7455 390.4621 68.5376 0.1753 233 +235 4 351.8395 391.1027 69.2101 0.2267 234 +236 4 350.9838 391.8257 69.7435 0.2783 235 +237 4 350.1475 392.5945 69.6993 0.2718 236 +238 4 349.8341 393.655 69.8524 0.2115 237 +239 4 348.8834 394.1778 69.7253 0.1414 238 +240 4 347.8744 394.7063 69.4823 0.1273 239 +241 4 346.8848 395.2806 69.5565 0.1522 240 +242 4 345.7717 395.3756 70.1296 0.1906 241 +243 4 344.6597 395.5838 70.5502 0.216 242 +244 4 343.5352 395.5014 71.0214 0.2161 243 +245 4 342.4358 395.3481 71.6937 0.2034 244 +246 4 341.3467 395.0301 72.065 0.1907 245 +247 4 340.34 394.68 73.08 0.2288 246 +248 4 378.3826 397.5995 46.4792 0.3676 203 +249 4 377.4983 396.8742 46.4766 0.3807 248 +250 4 376.678 396.0768 46.4666 0.3692 249 +251 4 375.9321 395.2097 46.4117 0.3686 250 +252 4 375.1107 394.4249 46.0888 0.3686 251 +253 4 374.0949 393.9444 45.5946 0.3933 252 +254 4 373.0355 393.5349 45.2698 0.394 253 +255 4 372.0299 393.0212 44.8274 0.394 254 +256 4 371.0793 392.3989 44.4973 0.3816 255 +257 4 370.0588 391.8909 44.7177 0.3688 256 +258 4 368.9377 391.6793 44.5665 0.3812 257 +259 4 367.8246 391.4413 44.2938 0.3939 258 +260 4 366.8328 390.8716 44.2406 0.457 259 +261 4 365.8924 390.2195 44.2322 0.4828 260 +262 4 364.9394 389.5881 44.2014 0.5082 261 +263 4 363.9865 388.9577 44.0605 0.4832 262 +264 4 362.9832 388.4544 43.5207 0.4704 263 +265 4 361.9891 387.9018 43.2281 0.4577 264 +266 4 360.9938 387.3424 43.4375 0.4576 265 +267 4 359.9871 386.839 43.937 0.445 266 +268 4 358.9494 386.3597 44.0152 0.4196 267 +269 4 357.9336 385.9009 43.3874 0.3941 268 +270 4 356.8044 385.7499 43.1214 0.3813 269 +271 4 355.6616 385.6973 43.1144 0.394 270 +272 4 354.5588 385.3953 43.0825 0.394 271 +273 4 353.488 384.9983 42.901 0.394 272 +274 4 352.5522 384.408 42.1901 0.3686 273 +275 4 351.8544 383.5054 42.0039 0.3686 274 +276 4 351.0364 382.7046 41.9941 0.3686 275 +277 4 350.0514 382.1235 41.9692 0.3813 276 +278 4 348.9372 381.8729 41.7981 0.3686 277 +279 4 347.8915 381.5148 41.0754 0.3432 278 +280 4 346.8608 381.0264 40.8797 0.3051 279 +281 4 345.9639 380.3239 40.8766 0.2648 280 +282 4 345.0224 379.6764 40.8626 0.25 281 +283 4 344.0122 379.1399 40.7929 0.2245 282 +284 4 343.0581 378.5313 40.5518 0.2034 283 +285 4 342.2688 377.7213 40.1178 0.2104 284 +286 4 341.4279 376.9674 39.8028 0.2513 285 +287 4 340.4212 376.4286 39.76 0.2949 286 +288 4 339.3562 376.0111 39.76 0.3001 287 +289 4 338.2854 375.6107 39.76 0.2722 288 +290 4 337.2489 375.137 39.76 0.2466 289 +291 4 336.3589 374.4289 39.76 0.2749 290 +292 4 335.637 373.5412 39.76 0.3105 291 +293 4 334.9495 372.6283 39.76 0.3278 292 +294 4 334.183 371.7806 39.7594 0.3178 293 +295 4 333.3158 371.0381 39.7572 0.3288 294 +296 4 332.3549 370.4192 39.7446 0.3769 295 +297 4 331.331 369.9113 39.6673 0.4124 296 +298 4 330.3048 369.4239 39.3896 0.4237 297 +299 4 329.329 368.8553 38.9385 0.3883 298 +300 4 328.3875 368.2181 38.6702 0.36 299 +301 4 327.4757 367.5283 38.64 0.3247 300 +302 4 326.6154 366.7756 38.6406 0.2964 301 +303 4 325.7117 366.08 38.6445 0.2639 302 +304 4 324.6924 365.5663 38.6669 0.2572 303 +305 4 323.6216 365.1682 38.7755 0.276 304 +306 4 322.5565 364.7713 39.088 0.3112 305 +307 4 321.5006 364.3663 39.5066 0.3397 306 +308 4 320.4561 363.9178 39.7051 0.3811 307 +309 4 319.51 363.2875 39.6326 0.4356 308 +310 4 318.7321 362.4615 39.3523 0.4863 309 +311 4 318.0572 361.5498 38.985 0.4924 310 +312 4 317.3879 360.6266 38.8388 0.4764 311 +313 4 316.6947 359.7171 38.9099 0.4609 312 +314 4 315.9762 358.8305 39.0729 0.4736 313 +315 4 315.212 357.9919 39.4201 0.4864 314 +316 4 314.417 357.1785 39.6676 0.4957 315 +317 4 313.6425 356.34 39.5324 0.4921 316 +318 4 312.9046 355.4786 39.1768 0.4725 317 +319 4 312.1381 354.6469 38.8032 0.4343 318 +320 4 311.2538 353.9307 38.6481 0.3995 319 +321 4 310.2517 353.3919 38.6378 0.3887 320 +322 4 309.1534 353.0899 38.6254 0.4144 321 +323 4 308.0186 352.9492 38.5529 0.436 322 +324 4 306.91 352.7192 38.3054 0.441 323 +325 4 305.8781 352.2662 37.8907 0.4282 324 +326 4 304.9424 351.6267 37.5911 0.4276 325 +327 4 304.1255 350.8328 37.5203 0.449 326 +328 4 303.4185 349.9336 37.5214 0.4617 327 +329 4 302.7722 348.9909 37.527 0.4662 328 +330 4 302.2025 348.0002 37.5575 0.4617 329 +331 4 301.6842 346.9821 37.6844 0.4745 330 +332 4 301.1019 346.0085 38.0041 0.483 331 +333 4 300.4453 345.0876 38.4062 0.4745 332 +334 4 299.76 344.1758 38.6131 0.4404 333 +335 4 299.0702 343.2641 38.631 0.3896 334 +336 4 298.3644 342.3637 38.598 0.3473 335 +337 4 297.6002 341.5183 38.463 0.3435 336 +338 4 296.7124 340.8228 38.1265 0.3953 337 +339 4 295.7171 340.2851 37.7236 0.4673 338 +340 4 294.6933 339.784 37.5374 0.513 339 +341 4 293.6694 339.2738 37.52 0.5166 340 +342 4 292.681 338.7006 37.52 0.5084 341 +343 4 291.752 338.0348 37.52 0.513 342 +344 4 290.8826 337.2924 37.52 0.5212 343 +345 4 290.0601 336.4973 37.52 0.5074 344 +346 4 289.265 335.6748 37.52 0.4646 345 +347 4 288.5134 334.8133 37.5194 0.4138 346 +348 4 287.8498 333.8833 37.5166 0.372 347 +349 4 287.2206 332.9292 37.5049 0.3559 348 +350 4 286.5079 332.0368 37.4452 0.3606 349 +351 4 285.7312 331.204 37.2263 0.3733 350 +352 4 284.9201 330.4204 36.7702 0.3766 351 +353 4 284.046 329.726 36.1777 0.3734 352 +354 4 283.1034 329.1368 35.5334 0.3909 353 +355 4 282.1161 328.63 34.86 0.4308 354 +356 4 281.1277 328.0981 34.3644 0.4703 355 +357 4 280.169 327.4803 34.1827 0.4703 356 +358 4 279.2367 326.8191 34.16 0.4606 357 +359 4 278.3226 326.1304 34.16 0.4693 358 +360 4 277.4177 325.4302 34.16 0.5182 359 +361 4 276.4808 324.7759 34.16 0.5436 360 +362 4 275.5072 324.1753 34.16 0.5347 361 +363 4 274.5737 323.5221 34.16 0.4859 362 +364 4 273.7786 322.7075 34.16 0.4552 363 +365 4 273.1003 321.7855 34.16 0.4322 364 +366 4 272.4528 320.8428 34.1592 0.4272 365 +367 4 271.7881 319.9127 34.1555 0.4245 366 +368 4 271.0456 319.0456 34.1379 0.4372 367 +369 4 270.1819 318.302 34.0435 0.4398 368 +370 4 269.2244 317.6911 33.7641 0.4219 369 +371 4 268.1856 317.269 33.3589 0.391 370 +372 4 267.0645 317.1317 33.0954 0.3794 371 +373 4 265.9331 317.0367 33.0324 0.3829 372 +374 4 264.9195 316.5745 32.9958 0.3802 373 +375 4 264.0466 315.8412 32.8037 0.388 374 +376 4 263.112 315.2223 32.4044 0.3994 375 +377 4 262.0618 314.7991 32.058 0.4073 376 +378 4 261.0208 314.3415 31.9348 0.3695 377 +379 4 260.1204 313.6562 31.92 0.3432 378 +380 4 259.4283 312.7547 31.92 0.3683 379 +381 4 258.925 311.732 31.92 0.4319 380 +382 4 258.576 310.644 31.92 0.4703 381 +383 4 258.2397 309.5527 31.92 0.4449 382 +384 4 257.7192 308.5437 31.92 0.4003 383 +385 4 256.9813 307.6777 31.9203 0.3749 384 +386 4 256.0901 306.9684 31.9208 0.375 385 +387 4 255.0994 306.3998 31.9236 0.3878 386 +388 4 254.0698 305.9022 31.9413 0.407 387 +389 4 253.062 305.3668 32.048 0.4324 388 +390 4 252.1319 304.7216 32.373 0.4384 389 +391 4 251.2499 304.0134 32.7981 0.4192 390 +392 4 250.3518 303.3144 33.0142 0.3871 391 +393 4 249.432 302.6349 33.0403 0.3686 392 +394 4 248.4917 301.984 33.0408 0.3621 393 +395 4 247.5948 301.2793 33.045 0.3691 394 +396 4 246.913 300.3812 33.073 0.3813 395 +397 4 246.5412 299.3162 33.2626 0.3813 396 +398 4 246.3959 298.1962 33.6736 0.3745 397 +399 4 246.2277 297.0785 34.0158 0.3821 398 +400 4 245.8296 296.018 34.0626 0.4279 399 +401 4 245.2439 295.0468 33.7896 0.478 400 +402 4 244.5723 294.1384 33.353 0.5024 401 +403 4 243.8116 293.2964 33.0775 0.4948 402 +404 4 242.9513 292.5471 32.9596 0.4694 403 +405 4 242.0189 291.8996 32.6813 0.4303 404 +406 4 241.0934 291.2532 32.2445 0.3931 405 +407 4 240.2594 290.4868 31.9768 0.3744 406 +408 4 239.5227 289.6139 31.922 0.3823 407 +409 4 238.8249 288.7078 31.92 0.4077 408 +410 4 238.0904 287.8315 31.92 0.4401 409 +411 4 237.2805 287.0262 31.9197 0.4782 410 +412 4 236.4305 286.2608 31.9192 0.4957 411 +413 4 235.5988 285.4749 31.9164 0.4888 412 +414 4 234.7854 284.6707 31.906 0.4693 413 +415 4 233.9663 283.8722 31.8637 0.4645 414 +416 4 233.114 283.1171 31.6534 0.484 415 +417 4 232.2091 282.4399 31.2385 0.4957 416 +418 4 231.2299 281.8747 30.903 0.4888 417 +419 4 230.1797 281.4274 30.8031 0.4555 418 +420 4 229.134 280.9675 30.7997 0.4253 419 +421 4 228.1502 280.3887 30.7994 0.4057 420 +422 4 227.2796 279.6542 30.7975 0.3871 421 +423 4 226.5726 278.7631 30.7852 0.3607 422 +424 4 225.9 277.8387 30.7269 0.3432 423 +425 4 225.0648 277.0894 30.4416 0.3708 424 +426 4 224.0375 276.6547 30.0476 0.4285 425 +427 4 222.9462 276.3401 30.0675 0.4576 426 +428 4 221.9028 275.9088 30.4612 0.4299 427 +429 4 220.9075 275.3619 30.7292 0.386 428 +430 4 219.9935 274.6836 30.7406 0.3756 429 +431 4 219.3174 273.7912 30.5004 0.3954 430 +432 4 218.9639 272.7319 30.0583 0.3926 431 +433 4 218.6756 271.6359 29.7497 0.3742 432 +434 4 218.1597 270.6292 29.68 0.3615 433 +435 4 217.3692 269.8204 29.68 0.3993 434 +436 4 216.375 269.2782 29.6797 0.4395 435 +437 4 215.358 268.7622 29.6786 0.4595 436 +438 4 214.4645 268.0586 29.6713 0.4555 437 +439 4 213.7633 267.1652 29.6344 0.4671 438 +440 4 213.102 266.2363 29.4742 0.4904 439 +441 4 212.363 265.3851 29.05 0.4957 440 +442 4 211.5565 264.5912 28.6854 0.4658 441 +443 4 210.7317 263.8007 28.5928 0.4149 442 +444 4 209.9251 262.9907 28.6689 0.3566 443 +445 4 209.1186 262.1876 28.9489 0.3154 444 +446 4 208.208 261.5184 29.2177 0.3051 445 +447 4 207.2264 260.9624 28.954 0.3281 446 +448 4 206.2678 260.3938 28.3296 0.3662 447 +449 4 205.316 259.8035 27.764 0.389 448 +450 4 204.387 259.1515 27.4935 0.4018 449 +451 4 203.5393 258.3873 27.4383 0.399 450 +452 4 202.7751 257.5373 27.4187 0.394 451 +453 4 202.0567 256.6484 27.3255 0.3784 452 +454 4 201.3028 255.8007 27.0217 0.3686 453 +455 4 200.4666 255.0342 26.6798 0.3686 454 +456 4 199.5388 254.3856 26.7848 0.3686 455 +457 4 198.6018 253.7381 27.0346 0.3445 456 +458 4 197.7427 253.007 26.7708 0.3062 457 +459 4 196.8904 252.2692 26.2962 0.276 458 +460 4 195.9317 251.6834 25.8591 0.2834 459 +461 4 194.9387 251.148 25.4038 0.3091 460 +462 4 194.099 250.3987 25.2151 0.3433 461 +463 4 193.4184 249.4824 25.1972 0.3559 462 +464 4 192.7949 248.5237 25.1854 0.3644 463 +465 4 192.1577 247.5742 25.1272 0.3772 464 +466 4 191.4129 246.715 24.9248 0.3986 465 +467 4 190.5675 245.9634 24.5428 0.4068 466 +468 4 189.7267 245.2015 24.2012 0.3981 467 +469 4 189.0025 244.3241 24.0878 0.3766 468 +470 4 188.4191 243.3425 24.0755 0.3599 469 +471 4 187.8334 242.361 24.0565 0.3383 470 +472 4 187.06 241.5304 23.9554 0.3305 471 +473 4 186.1368 240.8784 23.6239 0.3394 472 +474 4 185.1907 240.2823 23.0392 0.3521 473 +475 4 184.2687 239.6577 22.4062 0.347 474 +476 4 183.3454 239.0182 21.8744 0.3163 475 +477 4 182.3982 238.4016 21.4458 0.2961 476 +478 4 181.459 237.7621 21.1324 0.3016 477 +479 4 180.625 236.9922 21.2453 0.3327 478 +480 4 179.8185 236.1971 21.6258 0.3525 479 +481 4 178.941 235.4741 21.9047 0.3652 480 +482 4 177.9709 234.8872 22.2057 0.3592 481 +483 4 176.8818 234.6493 22.636 0.3463 482 +484 4 175.7459 234.6138 22.9093 0.3139 483 +485 4 174.6408 234.3587 22.972 0.2851 484 +486 4 173.6649 233.7787 23.0171 0.2898 485 +487 4 172.7863 233.0522 23.2008 0.3227 486 +488 4 171.9089 232.3372 23.5858 0.3709 487 +489 4 171.0383 231.6097 23.9509 0.4117 488 +490 4 170.2055 230.8306 24.1494 0.4297 489 +491 4 169.3967 230.0298 24.4166 0.422 490 +492 4 168.5947 229.2336 24.8441 0.3991 491 +493 4 167.7779 228.4408 25.132 0.3838 492 +494 4 166.9119 227.696 25.1961 0.3813 493 +495 4 165.9486 227.0829 25.2 0.3504 494 +496 4 164.9179 226.5886 25.1997 0.3226 495 +497 4 163.9386 226.0006 25.1994 0.2865 496 +498 4 163.1699 225.1644 25.1975 0.2902 497 +499 4 162.5075 224.2332 25.1877 0.2924 498 +500 4 161.7662 223.3637 25.1462 0.3137 499 +501 4 160.9551 222.5629 24.92 0.3391 500 +502 4 160.1474 221.7724 24.4986 0.3645 501 +503 4 159.3226 220.9899 24.1842 0.3792 502 +504 4 158.4005 220.3184 24.089 0.3813 503 +505 4 157.4052 219.7544 24.08 0.3813 504 +506 4 156.4763 219.0897 24.08 0.3704 505 +507 4 155.6309 218.321 24.08 0.3577 506 +508 4 154.7397 217.6048 24.08 0.3342 507 +509 4 153.7753 216.9905 24.08 0.3087 508 +510 4 152.7686 216.4482 24.0803 0.2831 509 +511 4 151.8202 215.811 24.0811 0.2796 510 +512 4 151.0194 214.9976 24.0853 0.3129 511 +513 4 150.2587 214.1431 24.1032 0.362 512 +514 4 149.4544 213.3308 24.1749 0.4019 513 +515 4 148.5964 212.5838 24.4712 0.4179 514 +516 4 147.727 211.8619 24.8931 0.4084 515 +517 4 146.9365 211.0428 25.1381 0.3621 516 +518 4 146.2307 210.1448 25.0807 0.2887 517 +519 4 145.4665 209.3154 24.6375 0.2345 518 +520 4 144.525 208.7308 23.9929 0.2288 519 +521 4 143.4782 208.2812 23.8067 0.2863 520 +522 4 142.4955 207.7001 23.9106 0.3387 521 +523 4 141.6775 206.9118 23.6776 0.3899 522 +524 4 140.9751 206.0264 23.2506 0.394 523 +525 4 140.3082 205.102 23.0317 0.3823 524 +526 4 139.6904 204.1399 23.0759 0.3578 525 +527 4 139.028 203.2236 23.4875 0.3441 526 +528 4 138.2261 202.4285 23.9173 0.3195 527 +529 4 137.2686 201.8085 24.0394 0.3059 528 +530 4 136.279 201.2365 23.9515 0.2932 529 +531 4 135.3638 200.5729 23.5306 0.3282 530 +532 4 134.5401 199.7859 23.3173 0.3305 531 +533 4 133.8194 198.8981 23.2876 0.3305 532 +534 4 133.1467 197.9898 22.8595 0.2823 533 +535 4 132.5736 197.0346 22.2306 0.2556 534 +536 4 131.8849 196.1308 21.9187 0.2058 535 +537 4 130.9319 195.505 21.9433 0.2034 536 +538 4 130.0019 194.8747 22.4608 0.2034 537 +539 4 129.3052 193.9835 22.8472 0.2651 538 +540 4 128.6371 193.0546 22.8894 0.2793 539 +541 4 128.2092 192.0021 22.5851 0.3169 540 +542 4 127.9427 190.9691 23.571 0.3178 541 +543 4 127.0492 190.309 24.2091 0.4576 542 +544 4 126.3559 189.8857 23.1672 0.3814 543 +545 4 125.5185 189.1124 22.9373 0.3559 544 +546 4 124.7212 188.2932 22.8298 0.3559 545 +547 4 123.9936 187.4318 22.3429 0.3559 546 +548 4 123.2568 186.6573 21.3503 0.3559 547 +549 4 122.3794 185.9606 20.7827 0.3559 548 +550 4 121.5603 185.1633 20.7211 0.394 549 +551 4 120.7561 184.3499 20.72 0.4449 550 +552 4 119.9678 183.5193 20.72 0.4322 551 +553 4 119.2826 182.6041 20.72 0.394 552 +554 4 118.5481 181.7267 20.72 0.3432 553 +555 4 117.7073 180.9511 20.72 0.3686 554 +556 4 116.7715 180.2933 20.72 0.3686 555 +557 4 115.9558 179.4913 20.72 0.3559 556 +558 4 115.3026 178.5521 20.72 0.3178 557 +559 4 114.7718 177.5385 20.72 0.3178 558 +560 4 113.9426 176.7503 20.7206 0.3305 559 +561 4 113.1704 176.2057 20.7239 0.3827 560 +562 4 112.2468 175.5308 20.7393 0.3836 561 +563 4 111.3422 174.8318 20.8261 0.3501 562 +564 4 110.4583 174.1122 21.063 0.312 563 +565 4 109.5664 173.4007 21.2691 0.2632 564 +566 4 108.6763 172.6857 21.4334 0.2017 565 +567 4 107.8196 171.9283 21.4046 0.1586 566 +568 4 106.9002 171.3209 20.7239 0.1416 567 +569 4 105.8424 170.9228 20.4058 0.1622 568 +570 4 104.7627 170.5464 20.3899 0.1765 569 +571 4 103.6407 170.3313 20.4075 0.2009 570 +572 4 102.516 170.194 20.7738 0.2264 571 +573 4 101.4505 169.8257 21.2038 0.2752 572 +574 4 100.4498 169.2754 21.1982 0.303 573 +575 4 99.4651 168.7068 20.8967 0.2934 574 +576 4 98.4155 168.2595 20.7446 0.2453 575 +577 4 97.289 168.0753 20.7354 0.2059 576 +578 4 96.1939 167.7482 20.8124 0.2034 577 +579 4 95.1674 167.2585 21.0865 0.1914 578 +580 4 94.0562 166.9988 20.9818 0.1786 579 +581 4 92.9713 166.6465 20.7757 0.1535 580 +582 4 92.0816 165.9326 20.778 0.1773 581 +583 4 91.1472 165.2863 21.0918 0.2274 582 +584 4 90.2014 164.6433 21.1851 0.2908 583 +585 4 89.3954 163.846 21.5404 0.3172 584 +586 4 88.3424 163.4101 21.7148 0.3178 585 +587 4 87.227 163.2374 21.2702 0.3052 586 +588 4 86.1868 162.7981 20.8211 0.3303 587 +589 4 85.2756 162.1082 20.7228 0.3557 588 +590 4 84.4582 161.3086 20.7175 0.3559 589 +591 4 83.696 160.4552 20.7091 0.2929 590 +592 4 83.4217 159.3455 20.6192 0.2035 591 +593 4 83.7408 158.3296 19.6 0.1144 592 +594 4 112.9716 175.9987 21.6857 0.3463 560 +595 4 112.3254 175.0755 21.84 0.294 594 +596 4 112.0351 173.9818 21.8406 0.2397 595 +597 4 111.7511 172.8744 21.8431 0.2185 596 +598 4 111.0932 171.9581 21.8627 0.2582 597 +599 4 110.3967 171.0532 22.0038 0.3204 598 +600 4 109.939 170.0224 22.3846 0.3521 599 +601 4 109.4909 168.9837 22.787 0.3559 600 +602 4 108.7492 168.1268 22.9446 0.3559 601 +603 4 107.7769 167.5342 22.9639 0.3783 602 +604 4 106.7066 167.1361 22.9849 0.3925 603 +605 4 105.6133 166.8055 23.1213 0.4053 604 +606 4 104.5667 166.3731 23.5024 0.3954 605 +607 4 103.6127 165.7645 23.8829 0.3827 606 +608 4 102.7241 165.0472 23.9728 0.3358 607 +609 4 101.7701 164.418 23.9137 0.2962 608 +610 4 100.76 163.8826 23.9557 0.2694 609 +611 4 99.829 163.2213 24.0495 0.2555 610 +612 4 98.9531 162.4858 24.0951 0.2312 611 +613 4 97.9642 161.916 24.1878 0.2172 612 +614 4 96.8823 161.5969 24.6061 0.2044 613 +615 4 95.7951 161.2857 25.0331 0.2034 614 +616 4 94.9175 160.5684 25.1849 0.1914 615 +617 4 94.1179 159.7504 25.1994 0.2027 616 +618 4 93.2906 158.9599 25.2 0.2154 617 +619 4 92.5872 158.0585 25.2 0.2161 618 +620 4 92.0293 157.0609 25.2006 0.204 619 +621 4 91.4189 156.0931 25.2025 0.1793 620 +622 4 90.652 155.2454 25.2106 0.1658 621 +623 4 89.7715 154.5166 25.2552 0.1409 622 +624 4 88.9659 153.733 25.7701 0.1277 623 +625 4 87.8592 153.7536 26.32 0.1144 624 +626 4 127.3878 189.7118 21.6006 0.2342 543 +627 4 127.7791 188.9911 20.5702 0.1568 626 +628 4 127.977 187.9134 21.2559 0.1217 627 +629 4 128.1051 186.8083 21.7804 0.1144 628 +630 4 128.6794 185.9137 21.8638 0.121 629 +631 4 129.6392 185.8794 21.0445 0.1349 630 +632 4 130.5315 186.4777 20.2124 0.1478 631 +633 4 131.4742 187.0943 19.9343 0.144 632 +634 4 132.4946 187.1309 20.6651 0.1303 633 +635 4 133.2954 186.512 21.8061 0.1173 634 +636 4 133.9818 185.6346 21.8011 0.1144 635 +637 4 134.8513 185.0283 20.8659 0.1144 636 +638 4 135.9129 184.6473 20.5862 0.1144 637 +639 4 136.6863 183.8316 20.683 0.1144 638 +640 4 137.145 182.7883 20.7085 0.1144 639 +641 4 137.2182 181.6523 20.6573 0.1144 640 +642 4 136.3385 180.9911 20.3974 0.1144 641 +643 4 135.4496 181.6672 20.72 0.1144 642 +644 4 346.4764 380.3869 43.5758 0.1526 280 +645 4 346.1401 379.5426 45.2712 0.1271 644 +646 4 345.5555 378.561 45.418 0.1145 645 +647 4 344.6986 377.8209 45.7789 0.1273 646 +648 4 343.6267 377.6069 46.5976 0.1401 647 +649 4 342.5639 377.3553 47.4032 0.1652 648 +650 4 341.7563 376.6631 48.4263 0.1657 649 +651 4 340.8926 375.9401 48.9006 0.1775 650 +652 4 339.8858 375.4539 49.4724 0.1652 651 +653 4 338.8448 375.2549 50.521 0.1646 652 +654 4 337.7809 375.2446 51.5494 0.1538 653 +655 4 336.7067 375.3018 52.498 0.1798 654 +656 4 335.6164 375.5054 53.1698 0.2175 655 +657 4 334.5182 375.82 53.2846 0.2408 656 +658 4 333.3879 375.971 53.3708 0.2259 657 +659 4 332.2542 375.8841 53.5382 0.1885 658 +660 4 331.1445 376.1586 53.6413 0.164 659 +661 4 330.0486 376.4652 53.7569 0.1525 660 +662 4 328.94 376.511 54.3987 0.1525 661 +663 4 327.8418 376.3199 55.0214 0.1506 662 +664 4 326.7184 376.2273 55.4316 0.1374 663 +665 4 325.5847 376.2078 55.2255 0.1246 664 +666 4 324.4853 376.3691 54.565 0.1144 665 +667 4 323.3916 376.6151 54.0952 0.1144 666 +668 4 322.3426 377.059 54.04 0.1178 667 +669 4 321.3324 377.5703 54.0921 0.1376 668 +670 4 320.3829 378.0165 54.5496 0.1834 669 +671 4 319.6828 378.7521 55.2241 0.2432 670 +672 4 318.5948 379.0701 55.1312 0.2669 671 +673 4 317.5755 379.5655 55.1396 0.2571 672 +674 4 316.7004 380.0677 53.9636 0.2542 673 +675 4 315.8458 380.7266 54.3424 0.2757 674 +676 4 315.1228 381.5995 54.5124 0.268 675 +677 4 314.2248 382.1658 53.5601 0.2551 676 +678 4 313.4377 382.9483 52.9217 0.2063 677 +679 4 312.4813 383.5695 52.8906 0.1668 678 +680 4 311.8544 384.0408 54.88 0.1144 679 +681 4 379.3618 398.12 45.3169 0.2171 202 +682 4 379.0438 397.0847 45.0506 0.2155 681 +683 4 379.204 396.0288 44.1857 0.2288 682 +684 4 379.7725 395.1582 43.4168 0.242 683 +685 4 380.5825 394.6011 42.2982 0.2474 684 +686 4 381.3993 394.1721 40.6588 0.2415 685 +687 4 382.3545 393.7099 39.8367 0.2347 686 +688 4 383.431 393.3495 39.5895 0.2219 687 +689 4 384.4595 392.9491 39.004 0.2092 688 +690 4 385.3999 392.4458 37.9982 0.2034 689 +691 4 386.3791 391.9493 37.3512 0.2242 690 +692 4 387.4007 391.4436 37.1232 0.2623 691 +693 4 388.3937 390.9014 36.7441 0.2796 692 +694 4 389.294 390.2344 36.2533 0.2655 693 +695 4 389.9873 389.3638 35.758 0.24 694 +696 4 390.5776 388.4029 35.299 0.2288 695 +697 4 391.3613 387.6158 34.8804 0.2288 696 +698 4 392.3371 387.0564 34.433 0.2215 697 +699 4 393.345 386.5301 34.1835 0.2161 698 +700 4 394.3299 385.9501 34.088 0.2087 699 +701 4 395.3492 385.4616 33.7744 0.2186 700 +702 4 396.3216 384.964 33.0114 0.2441 701 +703 4 397.2483 384.3794 32.2218 0.2931 702 +704 4 398.1486 383.6987 31.9332 0.3256 703 +705 4 399.0215 382.9597 31.9052 0.3227 704 +706 4 399.8188 382.144 31.8102 0.2858 705 +707 4 400.2341 381.1465 31.2612 0.2669 706 +708 4 400.3554 380.1272 30.0684 0.2669 707 +709 4 400.8393 379.1811 29.3429 0.2572 708 +710 4 401.5474 378.2911 29.3877 0.2345 709 +711 4 402.4878 377.6767 29.2006 0.2184 710 +712 4 403.5574 377.8335 28.6961 0.2384 711 +713 4 404.5756 378.3048 28.1753 0.2415 712 +714 4 405.6704 378.2339 27.5688 0.2534 713 +715 4 406.6325 377.6756 26.9805 0.2662 714 +716 4 407.5752 377.0532 26.5255 0.2909 715 +717 4 408.3783 376.2444 26.3754 0.3044 716 +718 4 409.0132 375.2972 26.5356 0.2809 717 +719 4 409.6881 374.3877 26.9416 0.2555 718 +720 4 410.3642 373.4702 26.7484 0.2421 719 +721 4 411.0804 372.5882 26.4272 0.278 720 +722 4 411.8411 371.7348 26.3301 0.3283 721 +723 4 412.5241 370.8173 26.3203 0.3792 722 +724 4 413.151 369.8609 26.3197 0.3934 723 +725 4 413.9667 369.0601 26.3189 0.3818 724 +726 4 414.9768 368.5259 26.3144 0.3445 725 +727 4 416.0591 368.1586 26.2828 0.3186 726 +728 4 417.0738 367.6358 26.1223 0.3302 727 +729 4 417.9432 366.9574 25.3898 0.3305 728 +730 4 418.3802 365.9656 24.5244 0.3305 729 +731 4 418.4272 364.9268 23.3587 0.293 730 +732 4 418.2281 363.8114 22.9908 0.2924 731 +733 4 418.3208 362.672 22.9393 0.2924 732 +734 4 418.7623 361.6184 22.8326 0.267 733 +735 4 419.2154 360.5934 22.265 0.229 734 +736 4 420.0676 359.8315 22.2432 0.1781 735 +737 4 421.1956 359.6782 22.4848 0.1652 736 +738 4 422.136 359.6736 24.08 0.1144 737 +739 4 380.0368 399.0386 46.48 0.4576 200 +740 4 392.4503 408.7638 48.701 0.4322 186 +741 4 391.5546 409.4754 48.6262 0.4068 740 +742 4 390.7446 410.2704 48.274 0.394 741 +743 4 390.1292 410.815 46.3336 0.2555 742 +744 4 389.5457 411.5094 44.688 0.1694 743 +745 4 389.1991 412.4726 43.5781 0.1525 744 +746 4 388.92 413.5411 42.8999 0.1674 745 +747 4 388.6465 414.6211 42.2834 0.178 746 +748 4 388.7552 415.669 41.421 0.1615 747 +749 4 389.3947 416.5498 40.8906 0.144 748 +750 4 390.0983 417.4364 40.5482 0.1578 749 +751 4 390.295 418.4924 39.94 0.2126 750 +752 4 390.0617 419.562 39.2101 0.2958 751 +753 4 389.8558 420.6591 38.6232 0.3664 752 +754 4 389.9679 421.7596 38.0198 0.4112 753 +755 4 390.3271 422.7846 37.1792 0.3796 754 +756 4 390.835 423.7765 36.5828 0.3281 755 +757 4 391.3246 424.8061 36.5327 0.2767 756 +758 4 391.3761 425.9284 36.4353 0.2669 757 +759 4 391.089 426.879 35.1607 0.2556 758 +760 4 390.7996 427.7336 33.4407 0.2428 759 +761 4 390.4518 428.7083 32.2736 0.2299 760 +762 4 390.3591 429.834 31.983 0.2407 761 +763 4 390.5433 430.9608 32.0734 0.2534 762 +764 4 390.8053 432.0739 32.0765 0.2781 763 +765 4 391.1645 433.1562 31.8752 0.2796 764 +766 4 391.4116 434.2601 31.4672 0.2676 765 +767 4 391.4871 435.3835 30.9809 0.2549 766 +768 4 391.5843 436.5172 30.686 0.2662 767 +769 4 391.7548 437.6212 30.091 0.3033 768 +770 4 391.7399 438.7492 29.636 0.3051 769 +771 4 391.5168 439.8463 30.1574 0.2683 770 +772 4 391.3052 440.9617 30.4965 0.2178 771 +773 4 391.3796 442.0736 29.8945 0.2161 772 +774 4 391.3166 443.1547 28.9971 0.2409 773 +775 4 390.8613 444.2003 28.8926 0.2541 774 +776 4 390.5994 445.302 29.2936 0.2416 775 +777 4 390.5319 446.4071 28.6017 0.2415 776 +778 4 390.342 447.5305 28.3536 0.2668 777 +779 4 389.8374 448.5544 28.5309 0.2924 778 +780 4 389.6132 449.6767 28.5538 0.3051 779 +781 4 389.3478 450.7886 28.5211 0.3051 780 +782 4 389.2586 451.9269 28.3212 0.3051 781 +783 4 389.5331 452.9931 27.5587 0.3051 782 +784 4 389.953 454.041 27.1152 0.2924 783 +785 4 390.096 455.1747 26.9539 0.2669 784 +786 4 390.0708 456.3096 27.2908 0.2288 785 +787 4 389.8741 457.4147 26.7512 0.2034 786 +788 4 389.6098 458.5152 27.1622 0.1907 787 +789 4 389.2243 459.8663 26.3494 0.2465 788 +790 4 388.8685 460.9096 25.5976 0.2748 789 +791 4 388.8856 462.0227 25.1664 0.3004 790 +792 4 389.2254 463.0981 24.7836 0.2947 791 +793 4 389.6384 464.1162 24.0285 0.2715 792 +794 4 389.9141 465.1859 23.315 0.235 793 +795 4 389.7768 466.3036 23.1669 0.218 794 +796 4 389.8386 467.4327 23.4486 0.238 795 +797 4 389.969 468.5584 23.1613 0.2747 796 +798 4 389.81 469.6806 22.9076 0.2796 797 +799 4 389.7688 470.8166 22.6212 0.235 798 +800 4 390.0033 471.9183 22.1945 0.1951 799 +801 4 390.0697 473.0406 22.58 0.1786 800 +802 4 389.3741 473.8711 23.3666 0.1902 801 +803 4 388.658 474.7497 23.5922 0.191 802 +804 4 388.5836 475.8834 23.7726 0.2034 803 +805 4 388.1775 476.9119 24.4751 0.2034 804 +806 4 387.6696 477.9106 24.9782 0.2034 805 +807 4 387.3881 479.0145 25.1429 0.2099 806 +808 4 387.2623 480.1482 25.0096 0.2481 807 +809 4 387.2749 481.2831 24.8349 0.2796 808 +810 4 387.5826 482.3813 24.9421 0.2699 809 +811 4 388.0459 483.4224 25.1451 0.2166 810 +812 4 388.6225 484.4096 25.2109 0.1578 811 +813 4 389.1659 485.4038 25.279 0.1246 812 +814 4 389.4187 486.5169 25.4892 0.1144 813 +815 4 389.7448 487.5957 25.5598 0.1199 814 +816 4 390.3786 488.5441 25.3453 0.1486 815 +817 4 390.9254 489.5405 25.2392 0.1957 816 +818 4 391.2434 490.6364 25.3142 0.2662 817 +819 4 391.4104 491.7621 25.5388 0.3112 818 +820 4 391.4002 492.8935 25.8821 0.3184 819 +821 4 391.1816 494.0067 26.1274 0.2674 820 +822 4 390.8876 495.1026 26.0982 0.2194 821 +823 4 390.8705 496.2375 26.2539 0.197 822 +824 4 390.835 497.3426 26.7949 0.2225 823 +825 4 390.4472 498.4065 26.7924 0.2512 824 +826 4 389.8489 499.3709 26.4802 0.2796 825 +827 4 389.2208 500.3204 26.5854 0.2764 826 +828 4 388.6099 501.2642 27.0738 0.2604 827 +829 4 388.0928 502.2675 27.1432 0.235 828 +830 4 387.8446 503.3657 26.7176 0.2161 829 +831 4 387.7405 504.4948 26.6395 0.2194 830 +832 4 387.5998 505.6125 26.9097 0.2422 831 +833 4 387.6753 506.7371 26.5818 0.2898 832 +834 4 388.0002 507.8273 26.3141 0.3212 833 +835 4 388.3914 508.8992 26.1254 0.3271 834 +836 4 388.8033 509.9517 25.7118 0.3076 835 +837 4 389.2174 511.0008 25.289 0.2727 836 +838 4 389.5755 512.0864 25.2039 0.2439 837 +839 4 389.9953 513.1401 25.2 0.2195 838 +840 4 390.6291 514.0919 25.2 0.2322 839 +841 4 391.2114 515.0757 25.2003 0.2521 840 +842 4 391.86 515.9852 25.2011 0.2869 841 +843 4 392.7775 516.667 25.2056 0.3199 842 +844 4 393.6058 517.4518 25.2263 0.3744 843 +845 4 394.3837 518.2846 25.3154 0.4307 844 +846 4 395.2978 518.9481 25.5948 0.4576 845 +847 4 396.3285 519.408 25.8216 0.4459 846 +848 4 397.3924 519.7981 25.4624 0.4156 847 +849 4 398.4952 520.0372 25.2025 0.4068 848 +850 4 399.6392 520.0544 25.2126 0.4028 849 +851 4 400.781 520.0178 25.2834 0.3781 850 +852 4 401.9101 519.9171 25.5906 0.3271 851 +853 4 403.0175 519.9057 26.1069 0.2841 852 +854 4 404.1317 520.1345 26.3208 0.2669 853 +855 4 405.2231 520.417 26.3948 0.2617 854 +856 4 406.1841 520.9913 26.9097 0.2446 855 +857 4 407.1096 521.537 26.199 0.219 856 +858 4 407.8612 522.0827 24.5846 0.2043 857 +859 4 408.4103 523.0139 25.1924 0.1914 858 +860 4 408.9136 524.0378 25.2115 0.1907 859 +861 4 409.147 525.1555 25.2067 0.1781 860 +862 4 408.8656 526.24 25.76 0.1144 861 +863 4 390.6039 411.3389 48.1779 0.3566 742 +864 4 390.5547 412.46 47.6462 0.3559 863 +865 4 390.4952 413.5674 46.9557 0.331 864 +866 4 390.231 414.6691 46.571 0.293 865 +867 4 389.9942 415.7879 46.548 0.2672 866 +868 4 390.0457 416.9194 46.9353 0.2921 867 +869 4 390.0331 418.0462 47.4169 0.3176 868 +870 4 389.7322 419.1456 47.2021 0.3556 869 +871 4 389.2723 420.1649 46.6166 0.3685 870 +872 4 388.8056 421.2025 46.3445 0.3686 871 +873 4 388.3777 422.1829 45.3513 0.356 872 +874 4 388.0368 423.2731 45.2281 0.3432 873 +875 4 387.387 424.2146 45.192 0.3305 874 +876 4 386.7326 425.1253 44.6359 0.3178 875 +877 4 386.0245 426.0107 44.268 0.3178 876 +878 4 385.282 426.8813 44.2333 0.3432 877 +879 4 384.7741 427.9063 44.1997 0.3559 878 +880 4 384.567 429.0275 43.9858 0.3432 879 +881 4 384.265 430.0685 43.0884 0.3051 880 +882 4 383.685 430.9299 41.916 0.2669 881 +883 4 382.7515 431.4745 40.9998 0.2288 882 +884 4 381.8031 432.1128 40.873 0.2161 883 +885 4 381.047 432.9708 40.8422 0.2415 884 +886 4 380.4887 433.2786 40.5574 0.2247 885 +887 4 379.4671 433.7396 40.2447 0.1924 886 +888 4 378.402 434.1034 40.4729 0.1614 887 +889 4 377.5211 434.8024 40.7344 0.1486 888 +890 4 376.8496 435.7096 40.4844 0.1398 889 +891 4 376.2479 436.6213 39.6752 0.1438 890 +892 4 375.5924 437.4942 38.8623 0.1644 891 +893 4 375.065 438.4689 38.2553 0.1947 892 +894 4 374.6657 439.5111 37.7121 0.2034 893 +895 4 374.0686 440.472 37.5424 0.2034 894 +896 4 373.2918 441.3117 37.5435 0.2115 895 +897 4 372.5974 442.2052 37.7194 0.2369 896 +898 4 372.0585 443.2028 38.0089 0.2542 897 +899 4 371.4808 444.182 37.8302 0.2501 898 +900 4 370.8345 445.1132 37.4766 0.2374 899 +901 4 370.2762 446.0959 37.1406 0.2247 900 +902 4 369.8495 447.1324 36.6148 0.2161 901 +903 4 369.4273 448.1872 36.4098 0.2161 902 +904 4 368.9263 449.2133 36.37 0.2245 903 +905 4 368.471 450.2578 36.2093 0.2457 904 +906 4 367.9035 451.2405 35.999 0.2625 905 +907 4 367.1817 452.1168 36.1917 0.2796 906 +908 4 366.3363 452.8753 36.4896 0.2754 907 +909 4 365.516 453.6452 36.8309 0.2543 908 +910 4 364.8674 454.5581 37.3397 0.2246 909 +911 4 364.3045 455.5477 37.403 0.2119 910 +912 4 363.8412 456.591 37.2375 0.1992 911 +913 4 363.3882 457.6389 37.2792 0.1821 912 +914 4 362.974 458.6948 37.3859 0.1652 913 +915 4 362.4306 459.6134 37.0185 0.1794 914 +916 4 361.4697 460.2083 36.5907 0.2238 915 +917 4 360.5144 460.8261 36.4112 0.2768 916 +918 4 359.6862 461.58 36.0898 0.3051 917 +919 4 359.4162 462.5512 35.3545 0.2844 918 +920 4 359.4093 463.6552 35.3354 0.2298 919 +921 4 358.906 464.6047 35.8495 0.1869 920 +922 4 357.9954 465.2659 35.9901 0.1952 921 +923 4 357.1156 465.9798 35.791 0.2298 922 +924 4 356.4361 466.8836 35.9243 0.2505 923 +925 4 355.7062 467.7438 36.318 0.2359 924 +926 4 354.8608 468.4932 36.1474 0.2102 925 +927 4 353.8198 468.9164 36.0522 0.2131 926 +928 4 352.8805 469.5228 36.4081 0.2476 927 +929 4 351.9184 470.0822 35.9341 0.2866 928 +930 4 351.0536 470.8121 35.6325 0.3035 929 +931 4 350.1933 471.511 34.9625 0.2822 930 +932 4 349.3902 472.3187 34.9149 0.2453 931 +933 4 348.8262 473.3094 34.869 0.1949 932 +934 4 347.9053 473.9523 34.5229 0.1781 933 +935 4 347.1743 474.7257 33.5504 0.193 934 +936 4 346.465 475.6066 33.8506 0.2298 935 +937 4 345.496 476.1866 34.2919 0.2415 936 +938 4 344.5614 476.8341 34.4655 0.2369 937 +939 4 343.5009 477.2448 34.5794 0.2034 938 +940 4 342.4747 477.6623 34.8953 0.2034 939 +941 4 341.6087 478.3098 34.3902 0.2224 940 +942 4 340.8926 479.1964 34.4232 0.2482 941 +943 4 340.1581 480.0602 34.3064 0.2614 942 +944 4 339.2726 480.7511 34.1312 0.2669 943 +945 4 338.3163 481.3357 33.71 0.2595 944 +946 4 337.297 481.7956 33.3239 0.2384 945 +947 4 336.209 481.9844 33.8027 0.2114 946 +948 4 335.1874 482.4111 34.0138 0.1943 947 +949 4 334.2242 483.022 34.2079 0.2001 948 +950 4 333.2014 483.4475 33.7554 0.2134 949 +951 4 332.1387 483.8331 33.3715 0.2264 950 +952 4 331.0908 484.2072 33.8948 0.2392 951 +953 4 329.9891 484.3696 34.4868 0.2523 952 +954 4 328.8668 484.5652 34.51 0.2542 953 +955 4 327.9139 485.1326 33.9032 0.2186 954 +956 4 327.5272 486.0856 32.76 0.1144 955 +957 4 380.7495 433.8506 41.6178 0.2988 885 +958 4 380.7552 434.9763 41.2754 0.2784 957 +959 4 380.6797 436.0939 41.1158 0.2525 958 +960 4 380.3136 437.159 40.8867 0.2341 959 +961 4 380.0105 438.2161 40.213 0.2288 960 +962 4 379.816 439.3166 40.1349 0.2211 961 +963 4 379.5643 440.4263 40.311 0.208 962 +964 4 378.9569 441.3609 40.2483 0.1866 963 +965 4 378.2693 442.267 40.0428 0.178 964 +966 4 377.6744 443.2382 39.8028 0.1865 965 +967 4 377.1631 444.2552 39.5368 0.2079 966 +968 4 376.8256 445.3306 39.1524 0.2161 967 +969 4 376.4607 446.406 38.8755 0.2073 968 +970 4 375.9516 447.4138 39.1499 0.2034 969 +971 4 375.4528 448.4205 39.6634 0.2123 970 +972 4 374.9449 449.4021 40.3735 0.2344 971 +973 4 374.4003 450.3676 41.0598 0.2601 972 +974 4 373.85 451.3526 41.5148 0.2858 973 +975 4 373.492 452.4017 41.1093 0.2924 974 +976 4 373.4782 453.5182 41.3106 0.2714 975 +977 4 373.1808 454.6073 41.3417 0.2456 976 +978 4 372.9509 455.7067 40.8579 0.2309 977 +979 4 373.0653 456.8049 40.2142 0.2177 978 +980 4 373.079 457.9409 40.3046 0.2048 979 +981 4 372.7861 459.0392 40.1565 0.2034 980 +982 4 372.6546 460.1637 40.4922 0.2272 981 +983 4 372.9131 461.2196 39.7057 0.2534 982 +984 4 373.1064 462.3453 39.7205 0.2542 983 +985 4 372.7941 463.3966 40.4712 0.2542 984 +986 4 372.5413 464.5075 40.7011 0.2559 985 +987 4 372.3102 465.608 40.5672 0.2669 986 +988 4 371.8492 466.5655 39.6864 0.2693 987 +989 4 371.5357 467.6626 39.7804 0.2854 988 +990 4 371.3115 468.7792 39.674 0.3083 989 +991 4 371.2783 469.9072 39.9708 0.3143 990 +992 4 371.387 471.0168 40.5241 0.294 991 +993 4 371.2692 472.1311 40.9777 0.2591 992 +994 4 371.0793 473.2202 41.3644 0.2331 993 +995 4 370.9798 474.2772 42.3032 0.2115 994 +996 4 370.99 475.4018 42.3368 0.1987 995 +997 4 370.9683 476.5046 42.1912 0.1907 996 +998 4 370.648 477.5903 42.5166 0.1961 997 +999 4 370.5107 478.6004 41.8214 0.2096 998 +1000 4 370.9226 479.5248 41.256 0.2306 999 +1001 4 371.0953 480.5772 41.4971 0.2415 1000 +1002 4 371.0907 481.7121 41.3619 0.2415 1001 +1003 4 371.244 482.8286 40.922 0.2415 1002 +1004 4 371.4705 483.9417 40.7557 0.2495 1003 +1005 4 371.6147 485.0606 40.4323 0.2542 1004 +1006 4 371.9899 486.1119 40.2699 0.2372 1005 +1007 4 372.2793 487.1873 40.6913 0.201 1006 +1008 4 371.9464 488.2295 41.0458 0.1713 1007 +1009 4 371.3115 489.1149 40.4113 0.1549 1008 +1010 4 370.6034 489.9775 39.8076 0.1635 1009 +1011 4 370.0451 490.887 38.8237 0.177 1010 +1012 4 369.3004 491.7164 39.2557 0.1902 1011 +1013 4 369.4308 492.8123 39.6791 0.1907 1012 +1014 4 369.7911 493.8408 39.0852 0.1931 1013 +1015 4 369.615 494.9276 38.3692 0.2061 1014 +1016 4 369.4617 495.9366 37.2761 0.2233 1015 +1017 4 369.8884 496.8953 36.4006 0.2368 1016 +1018 4 370.4844 497.8539 36.489 0.2179 1017 +1019 4 370.7933 498.9236 36.5674 0.1803 1018 +1020 4 370.4615 499.8022 35.32 0.1652 1019 +1021 4 369.7957 500.6567 34.9129 0.1746 1020 +1022 4 369.2729 501.6246 34.328 0.178 1021 +1023 4 369.1985 502.7216 33.7725 0.158 1022 +1024 4 369.3907 503.8165 33.1489 0.1311 1023 +1025 4 369.4914 504.9456 33.266 0.1271 1024 +1026 4 368.9652 505.9294 33.0036 0.1507 1025 +1027 4 368.0694 506.5838 32.3845 0.2002 1026 +1028 4 367.6633 507.5802 31.6674 0.2426 1027 +1029 4 368.384 508.4508 31.274 0.2796 1028 +1030 4 368.8839 509.4747 31.211 0.2811 1029 +1031 4 369.1951 510.5478 30.6636 0.2924 1030 +1032 4 369.2843 511.686 30.5648 0.294 1031 +1033 4 369.2123 512.8197 30.3052 0.3032 1032 +1034 4 369.2088 513.9294 29.6915 0.2903 1033 +1035 4 369.1985 515.0608 29.673 0.2796 1034 +1036 4 369.0006 516.1328 29.4476 0.2866 1035 +1037 4 369.6184 517.0274 29.2524 0.3152 1036 +1038 4 370.3105 517.8533 29.4585 0.336 1037 +1039 4 370.7178 518.8612 29.0654 0.331 1038 +1040 4 371.093 519.8176 27.8762 0.3044 1039 +1041 4 371.3275 520.8666 26.9713 0.281 1040 +1042 4 371.6147 521.8036 28.31 0.3162 1041 +1043 4 371.7794 522.8595 27.4417 0.3559 1042 +1044 4 372.372 523.8376 27.44 0.3432 1043 +1045 4 402.998 411.7439 49.9117 0.2104 176 +1046 4 402.9065 410.6091 50.197 0.1334 1045 +1047 4 402.8161 409.4754 50.4823 0.1176 1046 +1048 4 402.7246 408.3405 50.7676 0.1335 1047 +1049 4 402.6308 407.2068 51.0546 0.1589 1048 +1050 4 402.4054 406.0903 51.214 0.1845 1049 +1051 4 402.0943 404.9897 51.2406 0.1713 1050 +1052 4 401.981 403.8583 51.24 0.1554 1051 +1053 4 402.2384 402.7658 51.5623 0.1424 1052 +1054 4 402.4626 401.6561 51.3694 0.1502 1053 +1055 4 402.7795 400.6231 52.1175 0.1632 1054 +1056 4 403.2817 399.6118 52.1296 0.1868 1055 +1057 4 403.8675 398.6337 51.919 0.2346 1056 +1058 4 404.1363 397.5549 51.3584 0.2746 1057 +1059 4 404.3868 396.4498 50.983 0.3128 1058 +1060 4 404.698 395.3595 50.6094 0.3066 1059 +1061 4 405.2826 394.3951 50.9068 0.2706 1060 +1062 4 405.9152 393.4971 50.2082 0.196 1061 +1063 4 406.6909 392.8359 48.9544 0.1549 1062 +1064 4 407.4379 391.9859 49.0941 0.1644 1063 +1065 4 408.0625 391.0295 49.1697 0.2277 1064 +1066 4 408.1277 389.9347 49.9411 0.2667 1065 +1067 4 408.1586 388.7918 50.0346 0.2542 1066 +1068 4 408.8107 387.9315 49.1851 0.2116 1067 +1069 4 409.6401 387.1925 48.8877 0.1985 1068 +1070 4 410.2453 386.251 49.469 0.2374 1069 +1071 4 410.9111 385.3518 49.9341 0.2757 1070 +1072 4 411.7439 384.6071 50.4924 0.302 1071 +1073 4 412.6259 383.9001 50.6702 0.2893 1072 +1074 4 413.6498 383.4082 50.9382 0.2764 1073 +1075 4 414.5936 382.8064 50.8567 0.2595 1074 +1076 4 415.3452 381.9793 51.1249 0.2269 1075 +1077 4 416.098 381.1945 51.3178 0.1977 1076 +1078 4 416.8095 380.3285 50.8486 0.2147 1077 +1079 4 417.6801 379.6078 50.8813 0.279 1078 +1080 4 418.6948 379.1811 51.4172 0.3439 1079 +1081 4 419.7942 379.125 52.0374 0.3753 1080 +1082 4 420.873 378.9168 52.334 0.374 1081 +1083 4 421.9438 378.5679 52.7072 0.3606 1082 +1084 4 422.97 378.1618 53.3828 0.3393 1083 +1085 4 424.0144 377.7499 53.8605 0.3137 1084 +1086 4 425.099 377.4067 53.7905 0.2882 1085 +1087 4 426.1652 377.0018 53.6452 0.2534 1086 +1088 4 427.1479 376.4389 53.3512 0.2234 1087 +1089 4 428.1306 375.8658 53.4097 0.1876 1088 +1090 4 428.8559 375.0124 53.5718 0.178 1089 +1091 4 429.5903 374.1383 53.7032 0.1886 1090 +1092 4 430.1692 373.1945 53.1191 0.2128 1091 +1093 4 431.0592 372.5024 53.1194 0.2161 1092 +1094 4 432.0122 371.8709 53.1762 0.2161 1093 +1095 4 432.7283 371.0472 52.4185 0.2279 1094 +1096 4 433.8094 370.7384 52.2696 0.2641 1095 +1097 4 434.911 370.5061 51.7843 0.2787 1096 +1098 4 436.0322 370.2899 51.6858 0.2676 1097 +1099 4 437.1132 369.9399 51.9935 0.2429 1098 +1100 4 438.0822 369.4868 51.0555 0.2291 1099 +1101 4 439.1461 369.0716 50.9247 0.2288 1100 +1102 4 440.146 368.7249 49.8683 0.2289 1101 +1103 4 441.2683 368.535 49.6283 0.2418 1102 +1104 4 442.2212 367.9973 50.4 0.2676 1103 +1105 4 443.2554 367.629 49.6602 0.2918 1104 +1106 4 444.2896 367.1943 50.1892 0.2772 1105 +1107 4 445.1956 366.5021 50.2799 0.2233 1106 +1108 4 445.9861 365.7093 50.1698 0.1602 1107 +1109 4 447.0992 365.4828 50.26 0.1271 1108 +1110 4 448.2352 365.5503 50.3171 0.1334 1109 +1111 4 449.3392 365.7025 49.7078 0.1683 1110 +1112 4 450.4408 365.8558 49.4334 0.1968 1111 +1113 4 451.5711 365.8855 49.7924 0.2034 1112 +1114 4 452.7014 365.7929 49.819 0.1971 1113 +1115 4 453.7973 365.5503 49.3906 0.1907 1114 +1116 4 454.835 365.1019 49.0605 0.1907 1115 +1117 4 455.8737 364.6283 49.075 0.1973 1116 +1118 4 456.8656 364.1821 48.5528 0.217 1117 +1119 4 457.7716 363.5815 47.8545 0.2357 1118 +1120 4 458.6525 362.8574 47.7058 0.2344 1119 +1121 4 459.6329 362.3002 47.5488 0.2143 1120 +1122 4 460.6751 361.838 47.3273 0.2106 1121 +1123 4 461.715 361.3736 47.0806 0.2307 1122 +1124 4 462.7926 361.0121 46.8252 0.249 1123 +1125 4 463.8954 360.8336 47.161 0.2309 1124 +1126 4 465.0108 360.7432 47.7226 0.1842 1125 +1127 4 466.1182 360.5144 48.0301 0.1489 1126 +1128 4 467.1718 360.1392 48.552 0.1398 1127 +1129 4 468.2037 359.6759 48.7998 0.1485 1128 +1130 4 469.1418 359.033 48.8186 0.1432 1129 +1131 4 470.0158 358.3019 49.0566 0.1398 1130 +1132 4 471.0145 357.7677 49.0748 0.1494 1131 +1133 4 472.0579 357.2998 49.0056 0.1718 1132 +1134 4 473.1367 356.9337 48.8079 0.178 1133 +1135 4 474.2635 356.928 48.8564 0.1582 1134 +1136 4 475.3492 356.6409 48.7452 0.1326 1135 +1137 4 476.4154 356.2736 49.1112 0.1169 1136 +1138 4 477.5205 356.1055 49.6658 0.1144 1137 +1139 4 478.6404 356.0242 49.3231 0.1144 1138 +1140 4 479.7307 356.1672 49.8988 0.1144 1139 +1141 4 480.8655 356.2439 50.08 0.1262 1140 +1142 4 481.8574 356.7919 49.8798 0.1519 1141 +1143 4 482.7417 357.516 49.7862 0.1774 1142 +1144 4 483.8251 357.8226 49.3335 0.178 1143 +1145 4 484.9416 358.072 49.28 0.1144 1144 +1146 3 413.7985 419.0724 49.0834 0.1403 1 +1147 3 412.8765 419.705 49.6672 0.2042 1146 +1148 3 411.9533 420.3376 50.2502 0.3064 1147 +1149 3 411.1925 421.1522 50.7282 0.3777 1148 +1150 3 410.5404 422.0845 50.9564 0.394 1149 +1151 3 409.7591 422.8979 51.282 0.3422 1150 +1152 3 408.7157 423.2217 51.5021 0.2744 1151 +1153 3 407.8349 423.8165 51.1176 0.1144 1152 +1154 3 407.4482 423.1198 51.0563 0.2532 1153 +1155 3 406.3316 422.8785 50.9877 0.2542 1154 +1156 3 405.1911 422.9345 51.1361 0.2795 1155 +1157 3 404.086 422.9208 51.8602 0.2669 1156 +1158 3 403.0907 422.3968 52.3648 0.2924 1157 +1159 3 402.1068 421.9873 53.3845 0.2924 1158 +1160 3 401.0235 421.8672 54.2279 0.3051 1159 +1161 3 399.9252 421.5754 54.5625 0.3305 1160 +1162 3 399.0432 420.9279 55.3748 0.3686 1161 +1163 3 397.969 420.5413 55.5677 0.4322 1162 +1164 3 396.42 420.4772 56.3914 0.3943 1163 +1165 3 395.3195 420.253 56.9254 0.3814 1164 +1166 3 394.2579 419.8777 57.4258 0.3939 1165 +1167 3 393.2386 419.3687 57.6514 0.4067 1166 +1168 3 392.2696 418.7612 57.6797 0.4194 1167 +1169 3 391.3475 418.084 57.6803 0.4195 1168 +1170 3 390.4335 417.3953 57.6808 0.4069 1169 +1171 3 389.54 416.6803 57.6859 0.4068 1170 +1172 3 388.5859 416.0499 57.7181 0.4068 1171 +1173 3 387.5437 415.5889 57.9684 0.4068 1172 +1174 3 386.545 415.1576 58.8311 0.3686 1173 +1175 3 385.1162 414.3316 58.6634 0.178 1174 +1176 3 384.106 413.8775 59.2701 0.178 1175 +1177 3 383.1164 413.3295 59.4549 0.1866 1176 +1178 3 382.1852 412.6888 59.6361 0.2122 1177 +1179 3 381.2163 412.1111 59.584 0.2377 1178 +1180 3 380.3754 411.3378 59.463 0.2542 1179 +1181 3 379.498 410.6045 59.4073 0.2497 1180 +1182 3 378.6434 409.8517 59.5076 0.2369 1181 +1183 3 377.9158 408.9743 59.64 0.2382 1182 +1184 3 377.2786 408.0248 59.64 0.2636 1183 +1185 3 376.7203 407.0341 59.7982 0.2939 1184 +1186 3 376.1666 406.0697 60.3562 0.3228 1185 +1187 3 375.3613 405.3444 60.555 0.3417 1186 +1188 3 374.4735 404.6706 60.2512 0.3559 1187 +1189 3 373.7608 403.7908 60.0065 0.349 1188 +1190 3 373.0458 402.9214 59.5426 0.3156 1189 +1191 3 372.197 402.1755 59.2262 0.2645 1190 +1192 3 371.2909 401.4799 59.1959 0.2202 1191 +1193 3 370.4398 400.734 59.5395 0.2034 1192 +1194 3 369.536 400.1186 60.2538 0.2262 1193 +1195 3 368.6426 399.4734 60.9207 0.2646 1194 +1196 3 367.8967 398.6291 60.9636 0.2796 1195 +1197 3 367.3258 397.651 61.0551 0.2474 1196 +1198 3 366.6337 396.8296 60.5262 0.2032 1197 +1199 3 366.0251 396.094 59.0492 0.2003 1198 +1200 3 365.0172 395.8881 58.7073 0.3143 1199 +1201 3 363.8927 395.6959 58.7916 0.2633 1200 +1202 3 362.8928 395.1593 58.592 0.2032 1201 +1203 3 362.3025 394.3402 59.8951 0.152 1202 +1204 3 361.8083 393.7168 61.871 0.1398 1203 +1205 3 360.837 393.2237 62.6128 0.1409 1204 +1206 3 360.0557 392.4492 62.0533 0.1539 1205 +1207 3 359.6667 391.5386 60.9599 0.1692 1206 +1208 3 358.7904 390.8465 61.4989 0.1948 1207 +1209 3 357.746 390.4335 61.9097 0.2138 1208 +1210 3 356.6248 390.2276 61.9982 0.1961 1209 +1211 3 355.5792 389.8054 62.3386 0.1598 1210 +1212 3 354.6606 389.1808 62.7626 0.1432 1211 +1213 3 353.7248 388.5607 62.3428 0.1697 1212 +1214 3 352.6963 388.0826 62.253 0.2212 1213 +1215 3 351.7182 387.5094 62.5044 0.2677 1214 +1216 3 350.8133 386.8139 62.4047 0.2878 1215 +1217 3 349.9713 386.0577 62.3095 0.2613 1216 +1218 3 349.1305 385.3038 62.5954 0.2058 1217 +1219 3 348.1375 384.7455 62.7312 0.1559 1218 +1220 3 347.1376 384.2044 62.8468 0.1398 1219 +1221 3 346.3906 383.4162 63.3203 0.1491 1220 +1222 3 345.8198 382.4964 64.0797 0.17 1221 +1223 3 344.9526 381.7986 64.2592 0.1829 1222 +1224 3 343.9104 381.389 64.0032 0.1907 1223 +1225 3 342.787 381.2986 64.2958 0.1972 1224 +1226 3 341.6705 381.3673 64.8726 0.228 1225 +1227 3 340.5562 381.2769 65.3859 0.2607 1226 +1228 3 339.5712 381.508 64.4731 0.2563 1227 +1229 3 338.4741 381.6739 64.6344 0.1999 1228 +1230 3 337.3324 381.7002 64.6775 0.1579 1229 +1231 3 336.2124 381.4885 64.6453 0.1415 1230 +1232 3 335.1165 381.1659 64.51 0.1508 1231 +1233 3 333.9942 380.952 64.4932 0.1413 1232 +1234 3 332.8994 380.6546 64.8133 0.1284 1233 +1235 3 331.9579 380.0391 65.2582 0.1271 1234 +1236 3 330.9867 379.562 64.4403 0.1398 1235 +1237 3 330.0783 378.8653 64.4129 0.1525 1236 +1238 3 329.2432 378.092 64.68 0.1144 1237 +1239 3 385.4948 415.3578 58.7045 0.1481 1174 +1240 3 384.4595 415.7227 58.4716 0.1492 1239 +1241 3 383.3338 415.6758 58.1134 0.1897 1240 +1242 3 382.2848 415.6678 57.0819 0.2636 1241 +1243 3 381.2369 415.86 56.4827 0.3314 1242 +1244 3 380.1295 416.1414 56.4925 0.3692 1243 +1245 3 379.0495 416.4469 56.0501 0.361 1244 +1246 3 377.9719 416.6871 55.3241 0.3154 1245 +1247 3 376.8599 416.8644 54.934 0.2501 1246 +1248 3 375.8829 417.3632 54.88 0.208 1247 +1249 3 375.2492 418.2933 55.008 0.2034 1248 +1250 3 374.8179 419.3481 55.1818 0.2388 1249 +1251 3 374.0926 420.1397 55.7715 0.2636 1250 +1252 3 373.3215 420.9222 55.4061 0.2861 1251 +1253 3 372.491 421.6784 54.9175 0.2728 1252 +1254 3 371.8641 422.6085 54.5443 0.2471 1253 +1255 3 371.1422 423.4813 54.2531 0.1909 1254 +1256 3 370.2922 424.2444 54.2357 0.1462 1255 +1257 3 369.2912 424.7741 53.9927 0.129 1256 +1258 3 368.2856 425.3175 53.9137 0.138 1257 +1259 3 367.3006 425.8986 53.9972 0.1508 1258 +1260 3 366.3282 426.4981 54.1321 0.1414 1259 +1261 3 365.4165 427.1742 54.453 0.1285 1260 +1262 3 364.3651 427.5814 54.8495 0.115 1261 +1263 3 363.2486 427.7999 55.137 0.1144 1262 +1264 3 362.1492 428.0974 55.389 0.1144 1263 +1265 3 361.1036 428.5195 55.8516 0.1144 1264 +1266 3 360.0809 429.0297 55.776 0.1144 1265 +1267 3 358.978 429.3032 56.096 0.1144 1266 +1268 3 357.8478 429.469 56.2078 0.1144 1267 +1269 3 356.8136 429.9152 55.72 0.1144 1268 +1270 3 356.5207 429.7505 56.84 0.1144 1269 +1271 3 356.3434 429.5846 56.84 0.1144 1270 +1272 3 356.0128 429.572 56.84 0.1144 1271 +1273 3 355.6696 429.572 56.84 0.1144 1272 +1274 3 355.4408 429.572 56.84 0.1144 1273 +1275 3 354.831 429.381 56.84 0.1144 1274 +1276 3 354.5759 429.2929 56.84 0.1144 1275 +1277 3 354.4753 429.0503 56.84 0.1144 1276 +1278 3 354.1824 429.0 56.84 0.1144 1277 +1279 3 353.8392 429.0 56.84 0.1144 1278 +1280 3 353.6104 429.0 56.84 0.1144 1279 +1281 3 352.8096 429.0 56.84 0.1144 1280 +1282 3 352.4664 429.0 56.84 0.1144 1281 +1283 3 352.1232 429.0 56.84 0.1144 1282 +1284 3 351.8178 428.9622 56.84 0.1144 1283 +1285 3 351.6782 428.7586 56.84 0.1144 1284 +1286 3 351.4368 428.428 56.84 0.1144 1285 +1287 3 351.1062 428.4154 56.84 0.1144 1286 +1288 3 351.017 428.3902 56.84 0.1144 1287 +1289 3 350.2928 428.3136 56.84 0.1144 1288 +1290 3 349.492 428.3136 56.84 0.1144 1289 +1291 3 348.6912 428.3136 56.84 0.1144 1290 +1292 3 347.8904 428.3136 56.84 0.1144 1291 +1293 3 347.5472 428.3136 56.84 0.1144 1292 +1294 3 347.2166 428.301 56.84 0.1144 1293 +1295 3 346.9752 428.1992 56.84 0.1144 1294 +1296 3 346.8482 427.983 56.84 0.1144 1295 +1297 3 346.4032 427.856 56.84 0.1144 1296 +1298 3 346.0978 427.8182 56.84 0.1144 1297 +1299 3 346.0222 427.7794 56.84 0.1144 1298 +1300 3 345.2592 427.7416 56.84 0.1144 1299 +1301 3 344.4584 427.7416 56.84 0.1144 1300 +1302 3 343.6576 427.7416 56.84 0.1144 1301 +1303 3 343.3144 427.7416 56.84 0.1144 1302 +1304 3 342.9838 427.729 56.84 0.1144 1303 +1305 3 342.7676 427.602 56.84 0.1144 1304 +1306 3 342.5639 427.4625 56.84 0.1144 1305 +1307 3 342.501 427.2966 56.84 0.1144 1306 +1308 3 342.2082 426.7886 56.84 0.1144 1307 +1309 3 341.7254 426.4706 56.84 0.1144 1308 +1310 3 341.5858 426.267 56.84 0.1144 1309 +1311 3 341.3696 426.14 56.84 0.1144 1310 +1312 3 341.0264 426.14 56.84 0.1144 1311 +1313 3 340.6832 426.14 56.84 0.1144 1312 +1314 3 340.4544 426.14 56.84 0.1144 1313 +1315 3 339.7806 426.013 56.84 0.1144 1314 +1316 3 339.196 425.7968 56.84 0.1144 1315 +1317 3 338.3952 425.7968 56.84 0.1144 1316 +1318 3 337.5944 425.7968 56.84 0.1144 1317 +1319 3 337.1368 425.568 56.84 0.1144 1318 +1320 3 397.3341 420.8925 57.2345 0.4499 1163 +1321 3 396.3422 421.4279 57.0119 0.3835 1320 +1322 3 395.5952 422.2275 56.8467 0.3027 1321 +1323 3 394.6846 422.6451 58.1101 0.2214 1322 +1324 3 393.6104 422.7583 58.9109 0.1907 1323 +1325 3 392.6505 422.8361 60.1087 0.1986 1324 +1326 3 391.7079 423.4459 60.5024 0.2207 1325 +1327 3 390.8453 424.0842 60.9826 0.2388 1326 +1328 3 390.0331 424.7169 61.6874 0.2766 1327 +1329 3 389.1053 425.3506 61.7044 0.3342 1328 +1330 3 388.2999 426.1549 61.9564 0.3804 1329 +1331 3 387.5678 427.0277 62.097 0.4001 1330 +1332 3 386.847 427.8869 62.5388 0.3945 1331 +1333 3 386.0542 428.6797 63.047 0.3626 1332 +1334 3 385.1722 429.3947 63.2475 0.2982 1333 +1335 3 384.1575 429.8969 63.4385 0.2145 1334 +1336 3 383.0467 430.0788 63.5606 0.1508 1335 +1337 3 381.9393 430.1234 64.0676 0.1271 1336 +1338 3 381.0229 430.2813 65.5752 0.1345 1337 +1339 3 380.0231 430.279 66.3659 0.1476 1338 +1340 3 378.9809 430.0754 67.1787 0.1446 1339 +1341 3 377.9147 429.9976 68.0638 0.1317 1340 +1342 3 376.8153 430.2218 68.3189 0.1187 1341 +1343 3 375.9024 430.7824 69.0183 0.1144 1342 +1344 3 375.3647 431.6163 70.3041 0.1144 1343 +1345 3 374.6325 432.4057 70.9971 0.1144 1344 +1346 3 373.5812 432.7798 71.1942 0.1144 1345 +1347 3 372.5161 433.1161 71.7517 0.1144 1346 +1348 3 371.4751 433.4891 72.4752 0.1144 1347 +1349 3 370.4924 434.0553 72.7913 0.1144 1348 +1350 3 369.5269 434.5999 73.4689 0.1144 1349 +1351 3 368.7604 435.2794 74.7141 0.1144 1350 +1352 3 368.4881 436.3479 75.4586 0.1144 1351 +1353 3 368.2536 437.4656 75.6 0.1144 1352 +1354 3 368.0248 437.58 74.48 0.1144 1353 +1355 3 367.7194 437.6178 74.48 0.1144 1354 +1356 3 367.4528 437.6944 74.48 0.1144 1355 +1357 3 367.1222 437.707 74.48 0.1144 1356 +1358 3 366.9574 437.771 74.48 0.1144 1357 +1359 3 366.4106 438.025 74.48 0.1144 1358 +1360 3 366.0674 438.4826 74.48 0.1144 1359 +1361 3 365.7242 438.9402 74.48 0.1144 1360 +1362 3 365.1648 439.1816 74.48 0.1144 1361 +1363 3 364.6694 439.487 74.48 0.1144 1362 +1364 3 364.4143 439.5751 74.48 0.1144 1363 +1365 3 364.3514 439.8554 74.48 0.1144 1364 +1366 3 364.1352 439.9824 74.48 0.1144 1365 +1367 3 363.792 439.9824 74.48 0.1144 1366 +1368 3 363.601 440.0202 74.48 0.1144 1367 +1369 3 362.8768 440.0968 74.48 0.1144 1368 +1370 3 362.2796 440.3004 74.48 0.1144 1369 +1371 3 361.695 440.5166 74.48 0.1144 1370 +1372 3 360.932 440.5544 74.48 0.1144 1371 +1373 3 360.1312 440.5544 74.48 0.1144 1372 +1374 3 359.4448 440.44 74.48 0.1144 1373 +1375 3 359.1016 440.44 74.48 0.1144 1374 +1376 3 358.7584 440.44 74.48 0.1144 1375 +1377 3 358.453 440.4022 74.48 0.1144 1376 +1378 3 358.3008 440.2112 74.48 0.1144 1377 +1379 3 358.2116 440.0716 74.48 0.1144 1378 +1380 3 357.9702 439.9698 74.48 0.1144 1379 +1381 3 357.7666 439.8302 74.48 0.1144 1380 +1382 3 357.6522 439.6014 74.48 0.1144 1381 +1383 3 357.5378 439.3726 74.48 0.1144 1382 +1384 3 357.5 439.1816 74.48 0.1144 1383 +1385 3 357.3856 438.9528 74.48 0.1144 1384 +1386 3 407.8188 424.019 51.3064 0.122 1153 +1387 3 407.8097 425.0978 52.0808 0.1615 1386 +1388 3 408.0568 426.1835 52.4297 0.1975 1387 +1389 3 408.4904 427.0804 53.6399 0.2161 1388 +1390 3 409.3518 427.6466 54.7467 0.2122 1389 +1391 3 410.4214 427.8743 55.3812 0.1993 1390 +1392 3 411.562 427.8526 55.3689 0.1907 1391 +1393 3 412.6602 427.8045 55.6587 0.1953 1392 +1394 3 413.6086 427.7576 57.1595 0.2034 1393 +1395 3 414.4632 427.4304 58.7538 0.2034 1394 +1396 3 415.3978 427.03 59.9561 0.1844 1395 +1397 3 415.9321 426.4489 61.4566 0.1503 1396 +1398 3 416.4492 425.6664 62.8432 0.1236 1397 +1399 3 417.258 425.0292 64.0455 0.1144 1398 +1400 3 417.8735 424.2089 65.1949 0.1239 1399 +1401 3 418.6331 423.4333 64.965 0.1381 1400 +1402 3 419.3263 422.5318 64.8533 0.1639 1401 +1403 3 419.5117 421.6727 66.5792 0.1652 1402 +1404 3 419.6192 420.5722 67.2932 0.1652 1403 +1405 3 419.5929 420.0745 68.7666 0.1343 1404 +1406 3 419.7187 419.1353 69.4949 0.1144 1405 +1407 3 419.8194 418.0199 69.6805 0.1144 1406 +1408 3 419.6741 417.163 71.239 0.1144 1407 +1409 3 419.1044 416.567 73.0705 0.1144 1408 +1410 3 418.601 415.6713 73.3211 0.1144 1409 +1411 3 418.45 414.5524 73.2245 0.1144 1410 +1412 3 418.736 413.5194 73.9502 0.1144 1411 +1413 3 418.9328 412.412 74.2 0.1144 1412 +1414 3 419.7439 420.4612 67.9395 0.1144 1404 +1415 3 420.5916 420.436 69.7956 0.1144 1414 +1416 3 421.2791 419.6787 70.8226 0.1144 1415 +1417 3 421.667 418.6251 70.6947 0.1144 1416 +1418 3 422.5776 417.9856 70.56 0.1144 1417 +1419 3 423.6289 417.5646 70.56 0.1144 1418 +1420 3 424.5659 416.9114 70.5124 0.1144 1419 +1421 3 425.457 416.1975 70.49 0.1144 1420 +1422 3 426.2853 415.4356 70.8652 0.1144 1421 +1423 3 427.0403 414.6382 71.6148 0.1144 1422 +1424 3 427.9544 414.033 72.0703 0.1144 1423 +1425 3 429.0275 413.6441 71.9662 0.1144 1424 +1426 3 430.1303 413.3501 71.8528 0.1144 1425 +1427 3 431.248 413.1224 71.685 0.1144 1426 +1428 3 432.3805 412.9932 71.68 0.1144 1427 +1429 3 433.5142 412.8868 71.6808 0.1144 1428 +1430 3 434.5324 412.4406 71.7391 0.1144 1429 +1431 3 435.4945 412.0139 72.2338 0.1144 1430 +1432 3 436.4383 412.3068 73.3625 0.1144 1431 +1433 3 437.3352 412.9142 74.0751 0.1144 1432 +1434 3 438.0868 413.7356 74.1944 0.1144 1433 +1435 3 438.5982 414.7114 74.797 0.1144 1434 +1436 3 439.3829 415.3898 74.4419 0.1144 1435 +1437 3 440.1963 416.1552 74.4554 0.1144 1436 +1438 3 441.0623 416.8942 74.6698 0.1144 1437 +1439 3 442.0222 417.5062 74.5402 0.1144 1438 +1440 3 443.0632 417.9673 74.6544 0.1144 1439 +1441 3 444.1694 418.0451 75.1596 0.1144 1440 +1442 3 445.1304 417.568 75.994 0.126 1441 +1443 3 445.914 416.8358 76.9563 0.1517 1442 +1444 3 445.9312 415.7296 77.56 0.2288 1443 +1445 3 415.9687 415.4985 47.9427 0.1671 1 +1446 3 416.1037 414.3625 47.9735 0.2466 1445 +1447 3 416.2627 413.23 47.9956 0.3358 1446 +1448 3 416.6173 412.1523 48.0917 0.4021 1447 +1449 3 417.5257 411.7576 48.4282 0.4744 1448 +1450 3 418.2544 412.5676 48.2748 0.5529 1449 +1451 3 418.8527 413.5388 48.4341 0.5944 1450 +1452 3 419.4453 414.517 48.4744 0.5504 1451 +1453 3 420.0116 415.5065 48.2524 0.4289 1452 +1454 3 420.7529 416.2009 49.4525 0.3193 1453 +1455 3 421.5617 415.6632 50.8864 0.2924 1454 +1456 3 422.557 415.0993 50.9564 0.3305 1455 +1457 3 423.3978 414.3236 50.9384 0.3432 1456 +1458 3 423.7513 412.8044 50.5532 0.3082 1457 +1459 3 423.9939 411.713 50.036 0.3252 1458 +1460 3 424.2078 410.5988 49.8425 0.3283 1459 +1461 3 424.5018 409.4948 49.84 0.3432 1460 +1462 3 424.7386 408.376 49.84 0.3485 1461 +1463 3 424.8805 407.2468 49.8394 0.3401 1462 +1464 3 424.8747 406.1028 49.8369 0.302 1463 +1465 3 425.2728 405.1968 50.0189 0.1144 1464 +1466 3 424.8336 404.6328 49.8145 0.3305 1465 +1467 3 424.7878 403.4911 49.6647 0.3813 1466 +1468 3 424.8827 402.3894 48.9418 0.3686 1467 +1469 3 424.8976 401.25 48.7206 0.3432 1468 +1470 3 424.9914 400.1094 48.7138 0.3178 1469 +1471 3 425.3907 399.0375 48.6842 0.3178 1470 +1472 3 425.8815 398.3339 48.4154 0.2373 1471 +1473 3 426.6033 397.4954 47.8341 0.1723 1472 +1474 3 427.4018 396.7586 46.9574 0.1538 1473 +1475 3 428.2209 396.1283 45.8382 0.1461 1474 +1476 3 428.7415 395.8732 43.713 0.1748 1475 +1477 3 428.5332 395.5998 41.2194 0.2314 1476 +1478 3 428.0287 394.9877 39.2526 0.2627 1477 +1479 3 427.5242 394.1572 37.8067 0.2496 1478 +1480 3 426.6388 393.7431 36.7808 0.22 1479 +1481 3 426.0691 394.4478 35.3665 0.2161 1480 +1482 3 426.2327 395.371 33.8271 0.2161 1481 +1483 3 426.839 396.2862 33.0991 0.1917 1482 +1484 3 427.173 397.3043 32.1255 0.1785 1483 +1485 3 426.2086 397.6613 31.0895 0.178 1484 +1486 3 425.147 397.8088 30.1087 0.178 1485 +1487 3 424.0751 398.207 30.1328 0.1525 1486 +1488 3 423.8772 398.4907 30.9498 0.1898 1487 +1489 3 423.7982 399.1622 32.9034 0.2577 1488 +1490 3 424.5281 399.7136 34.0721 0.2852 1489 +1491 3 425.3941 400.3668 34.1239 0.2867 1490 +1492 3 425.7385 401.4079 33.9018 0.2796 1491 +1493 3 425.6504 402.418 32.8714 0.2915 1492 +1494 3 425.4753 403.276 31.0761 0.3177 1493 +1495 3 425.8197 404.0276 29.5274 0.3238 1494 +1496 3 426.6148 404.7655 28.8075 0.3109 1495 +1497 3 427.5117 405.4576 28.8081 0.2981 1496 +1498 3 428.5538 405.8912 28.8044 0.2996 1497 +1499 3 429.6075 406.1406 28.054 0.2903 1498 +1500 3 430.6885 406.3259 27.4165 0.272 1499 +1501 3 431.8085 406.5318 27.4624 0.2749 1500 +1502 3 432.7249 407.0993 27.0698 0.3056 1501 +1503 3 433.1848 408.0488 26.1993 0.3267 1502 +1504 3 433.266 409.115 25.2784 0.2941 1503 +1505 3 432.9948 410.1881 24.7352 0.2516 1504 +1506 3 432.7489 411.2943 24.8735 0.2318 1505 +1507 3 433.195 412.2839 24.9749 0.2612 1506 +1508 3 434.1846 412.8113 24.8755 0.2892 1507 +1509 3 435.1948 413.3386 24.6268 0.2924 1508 +1510 3 436.1569 413.9255 24.1576 0.3037 1509 +1511 3 437.1785 414.3374 23.429 0.3051 1510 +1512 3 438.2435 414.5158 22.5224 0.3279 1511 +1513 3 439.3738 414.6279 22.3012 0.3189 1512 +1514 3 440.3187 415.2217 22.7391 0.3416 1513 +1515 3 441.2111 415.9298 22.9718 0.3313 1514 +1516 3 442.1869 416.5201 23.1594 0.3305 1515 +1517 3 443.0872 417.1493 23.9243 0.2946 1516 +1518 3 443.9807 417.3266 25.5822 0.268 1517 +1519 3 444.4417 416.424 24.5874 0.2161 1518 +1520 3 444.5584 415.5008 22.96 0.1144 1519 +1521 3 423.1473 398.2115 29.5196 0.1764 1487 +1522 3 422.1554 398.6291 28.6143 0.1909 1521 +1523 3 421.3043 398.2916 27.027 0.2297 1522 +1524 3 421.27 397.8958 24.5543 0.2458 1523 +1525 3 422.1966 398.0422 23.5777 0.2616 1524 +1526 3 423.2411 398.3831 23.3551 0.2433 1525 +1527 3 424.3199 398.5845 22.7268 0.2288 1526 +1528 3 425.3152 399.0272 22.9102 0.2407 1527 +1529 3 426.2716 399.5672 22.9631 0.2741 1528 +1530 3 427.2977 399.3967 22.4496 0.2996 1529 +1531 3 428.3182 398.9128 22.0772 0.2902 1530 +1532 3 429.3604 398.4518 22.1413 0.2555 1531 +1533 3 430.3396 397.8832 22.4949 0.2078 1532 +1534 3 431.3475 397.3661 22.4442 0.1993 1533 +1535 3 432.3622 396.9852 23.0745 0.2398 1534 +1536 3 433.2202 396.4978 24.4423 0.3104 1535 +1537 3 433.4685 395.514 24.9379 0.3305 1536 +1538 3 433.0829 394.5084 25.6004 0.3004 1537 +1539 3 432.9502 393.4056 25.9913 0.2458 1538 +1540 3 433.4433 392.3897 26.2363 0.2415 1539 +1541 3 433.4708 391.3052 27.0808 0.2541 1540 +1542 3 432.8896 390.3328 27.44 0.2288 1541 +1543 3 425.4307 398.1578 48.7099 0.2815 1471 +1544 3 425.6229 397.0366 48.4338 0.2796 1543 +1545 3 425.9558 395.9453 48.6228 0.2545 1544 +1546 3 426.426 394.9248 49.14 0.2542 1545 +1547 3 427.0083 393.941 49.2153 0.2416 1546 +1548 3 427.7164 393.0532 49.56 0.2288 1547 +1549 3 426.9488 392.1163 51.1277 0.1346 1548 +1550 3 426.307 391.3349 52.4367 0.1271 1549 +1551 3 425.6652 390.5524 53.7452 0.1449 1550 +1552 3 425.0154 389.7116 54.7599 0.1884 1551 +1553 3 424.2181 388.9245 55.1205 0.2397 1552 +1554 3 423.4505 388.0803 55.16 0.2908 1553 +1555 3 422.7011 387.2417 55.5904 0.3051 1554 +1556 3 422.2252 386.2304 55.732 0.2958 1555 +1557 3 421.5068 385.3861 55.979 0.2736 1556 +1558 3 420.7254 384.5567 56.1674 0.2952 1557 +1559 3 419.9613 383.7068 56.2148 0.3338 1558 +1560 3 419.3321 382.7687 56.5547 0.3724 1559 +1561 3 418.9031 381.7162 56.6857 0.3715 1560 +1562 3 418.4969 380.6694 57.1701 0.3582 1561 +1563 3 417.8403 379.7863 57.8648 0.3451 1562 +1564 3 417.0475 378.9717 57.8752 0.3212 1563 +1565 3 416.4824 377.9868 57.696 0.2829 1564 +1566 3 415.8749 377.043 58.1832 0.2441 1565 +1567 3 415.0043 376.3405 58.7278 0.2534 1566 +1568 3 414.1108 375.6381 59.0425 0.2781 1567 +1569 3 413.1956 374.962 59.3289 0.2916 1568 +1570 3 412.2404 374.3408 59.593 0.2684 1569 +1571 3 411.3435 373.6327 59.5781 0.231 1570 +1572 3 410.4718 373.0401 60.3968 0.2161 1571 +1573 3 409.6447 372.3377 61.04 0.2255 1572 +1574 3 408.9846 371.4145 61.2567 0.2094 1573 +1575 3 408.813 370.3139 61.364 0.1835 1574 +1576 3 408.7661 369.1825 61.7462 0.1579 1575 +1577 3 408.1964 368.2444 62.092 0.1627 1576 +1578 3 407.3063 367.5683 62.5792 0.1652 1577 +1579 3 406.3271 367.0879 63.3909 0.1652 1578 +1580 3 405.6647 366.1955 63.31 0.1431 1579 +1581 3 405.1956 365.1545 63.2565 0.1398 1580 +1582 3 404.666 364.1546 63.6177 0.1511 1581 +1583 3 403.983 363.2406 63.7305 0.1867 1582 +1584 3 403.1776 362.4409 64.0674 0.2021 1583 +1585 3 402.3311 361.6779 64.2919 0.192 1584 +1586 3 401.512 360.9034 64.7595 0.156 1585 +1587 3 400.7981 360.0294 65.2 0.1289 1586 +1588 3 400.2318 359.049 65.5956 0.1271 1587 +1589 3 399.5203 358.1567 65.6393 0.1511 1588 +1590 3 398.8762 357.4474 67.1286 0.1906 1589 +1591 3 398.3408 356.4704 67.76 0.2288 1590 +1592 3 428.0951 392.5636 48.6256 0.2608 1548 +1593 3 428.7334 391.7296 47.5773 0.2968 1592 +1594 3 429.3226 390.9002 46.3352 0.3146 1593 +1595 3 429.7642 390.5753 44.0191 0.2977 1594 +1596 3 430.0239 389.6544 43.1749 0.2805 1595 +1597 3 430.1966 389.0321 45.3636 0.267 1596 +1598 3 430.875 388.1134 45.5417 0.2799 1597 +1599 3 431.5099 387.1811 45.0993 0.3058 1598 +1600 3 431.8657 386.0943 45.1108 0.3308 1599 +1601 3 432.2387 385.0155 45.2413 0.3432 1600 +1602 3 432.4331 383.9195 45.8749 0.3441 1601 +1603 3 432.5864 382.8876 46.9652 0.357 1602 +1604 3 432.4892 381.7505 47.0392 0.3686 1603 +1605 3 432.2821 380.6557 46.8821 0.3644 1604 +1606 3 432.392 379.6307 45.7741 0.3331 1605 +1607 3 432.6196 378.5485 45.8368 0.3013 1606 +1608 3 433.0806 377.5543 46.4176 0.2924 1607 +1609 3 433.5417 376.519 46.1412 0.2966 1608 +1610 3 434.1331 375.5546 45.724 0.3051 1609 +1611 3 434.6765 374.6074 44.9694 0.3108 1610 +1612 3 435.2943 373.7288 44.5362 0.3236 1611 +1613 3 436.1191 372.9715 45.0556 0.3425 1612 +1614 3 436.9199 372.1878 45.4236 0.3495 1613 +1615 3 437.3569 371.1891 45.0943 0.3363 1614 +1616 3 437.3134 370.1069 44.3663 0.3025 1615 +1617 3 437.2322 368.9983 43.8348 0.2725 1616 +1618 3 437.6875 368.1472 42.9114 0.2587 1617 +1619 3 437.8546 367.1691 42.7252 0.263 1618 +1620 3 437.723 366.0365 42.7711 0.2669 1619 +1621 3 437.5194 364.912 42.8254 0.2573 1620 +1622 3 437.8214 363.8744 42.3604 0.2542 1621 +1623 3 438.2447 362.8368 41.8051 0.2542 1622 +1624 3 438.6737 361.8266 41.0164 0.2876 1623 +1625 3 439.2766 360.8897 41.4098 0.3151 1624 +1626 3 439.8337 359.8967 41.2846 0.3292 1625 +1627 3 439.9664 358.7698 41.2902 0.3062 1626 +1628 3 440.2993 357.8329 39.9602 0.2532 1627 +1629 3 441.052 357.0252 39.3431 0.202 1628 +1630 3 441.3541 356.0048 40.2144 0.1643 1629 +1631 3 441.3209 354.9294 39.3439 0.1525 1630 +1632 3 441.1607 353.8198 39.6567 0.1525 1631 +1633 3 441.4593 352.7215 39.7398 0.1525 1632 +1634 3 441.4936 351.5867 39.597 0.1567 1633 +1635 3 441.6046 350.4701 39.1633 0.1706 1634 +1636 3 441.7167 349.3387 39.0303 0.1891 1635 +1637 3 441.6961 348.197 38.9049 0.2089 1636 +1638 3 441.6469 347.0576 38.6932 0.2161 1637 +1639 3 441.5531 345.9273 38.3387 0.2105 1638 +1640 3 441.6103 344.8165 37.861 0.1978 1639 +1641 3 441.9741 343.7537 37.5169 0.1963 1640 +1642 3 442.3448 342.6829 37.4209 0.2091 1641 +1643 3 442.3859 341.5618 37.5418 0.2275 1642 +1644 3 442.2258 340.4372 37.7535 0.2472 1643 +1645 3 442.0691 339.3047 37.6796 0.26 1644 +1646 3 441.9432 338.1813 37.9327 0.2549 1645 +1647 3 441.8814 337.0556 38.337 0.2293 1646 +1648 3 441.9203 335.9162 38.386 0.197 1647 +1649 3 442.0759 334.7973 38.0394 0.1713 1648 +1650 3 442.3436 333.7002 37.7381 0.1652 1649 +1651 3 442.7051 332.6203 37.9025 0.1789 1650 +1652 3 443.1284 331.5667 38.2306 0.2045 1651 +1653 3 443.6524 330.5782 38.7545 0.2161 1652 +1654 3 444.2541 329.6253 38.988 0.2019 1653 +1655 3 444.8547 328.6529 38.9189 0.1765 1654 +1656 3 445.3535 327.629 38.7934 0.151 1655 +1657 3 445.9198 326.6486 38.8388 0.1398 1656 +1658 3 446.5318 325.6957 39.1969 0.1469 1657 +1659 3 447.121 324.7233 39.3092 0.1741 1658 +1660 3 447.6289 323.7085 39.4386 0.2051 1659 +1661 3 448.0762 322.6663 39.8 0.2161 1660 +1662 3 448.6276 321.6734 39.9552 0.2161 1661 +1663 3 449.3014 320.7536 40.0988 0.2238 1662 +1664 3 449.9993 319.8498 40.1106 0.2677 1663 +1665 3 450.6079 318.8866 40.1705 0.3319 1664 +1666 3 451.0334 317.8364 40.4202 0.3958 1665 +1667 3 451.2977 316.7278 40.6174 0.4195 1666 +1668 3 451.4807 315.601 40.7784 0.4035 1667 +1669 3 451.2451 314.5394 41.169 0.3686 1668 +1670 3 450.7989 313.4949 41.2482 0.3384 1669 +1671 3 450.2395 312.5053 41.3784 0.3032 1670 +1672 3 450.2223 311.4529 41.9695 0.231 1671 +1673 3 450.434 310.4908 43.3527 0.1578 1672 +1674 3 450.5678 309.3765 43.344 0.1278 1673 +1675 3 450.6754 308.3824 42.0333 0.1424 1674 +1676 3 450.2715 307.5289 40.5927 0.1836 1675 +1677 3 450.2326 306.4021 41.0698 0.2706 1676 +1678 3 450.1834 305.2672 41.2404 0.3562 1677 +1679 3 450.2578 304.1301 41.2196 0.397 1678 +1680 3 450.3653 303.0021 41.5167 0.3911 1679 +1681 3 450.2933 301.8741 41.797 0.3656 1680 +1682 3 449.9363 300.8526 41.2317 0.348 1681 +1683 3 449.6183 299.7966 41.032 0.3117 1682 +1684 3 449.5199 298.7064 41.6198 0.2748 1683 +1685 3 449.5462 297.6345 42.0174 0.2669 1684 +1686 3 449.417 296.5465 42.0927 0.2669 1685 +1687 3 449.2294 295.4735 42.9265 0.2612 1686 +1688 3 448.9228 294.5034 44.0342 0.2405 1687 +1689 3 448.4366 293.571 44.4884 0.2135 1688 +1690 3 447.916 292.5563 44.338 0.2034 1689 +1691 3 447.288 291.6411 43.8612 0.2272 1690 +1692 3 446.716 290.6858 43.3367 0.2801 1691 +1693 3 446.0456 289.8896 42.28 0.3432 1692 +1694 3 426.1617 404.5767 50.5719 0.1883 1465 +1695 3 427.117 403.9613 50.904 0.2277 1694 +1696 3 428.1042 403.3847 50.9527 0.2658 1695 +1697 3 429.0606 402.7566 50.9345 0.2916 1696 +1698 3 430.1177 402.3288 50.7637 0.2924 1697 +1699 3 431.2411 402.1126 50.7987 0.2675 1698 +1700 3 432.289 401.6733 51.1 0.2296 1699 +1701 3 433.2591 401.0795 51.3962 0.2039 1700 +1702 3 434.2681 400.5567 51.7244 0.2034 1701 +1703 3 435.3263 400.3394 52.6333 0.241 1702 +1704 3 436.4074 400.019 52.1956 0.2795 1703 +1705 3 437.5091 399.8829 51.515 0.3177 1704 +1706 3 438.5902 399.5077 51.5284 0.3305 1705 +1707 3 439.6335 399.0592 51.858 0.3559 1706 +1708 3 440.7191 398.8178 51.203 0.3432 1707 +1709 3 441.8574 398.7343 51.0051 0.3305 1708 +1710 3 442.9831 398.5467 51.2 0.2924 1709 +1711 3 444.0402 398.2825 52.0472 0.3051 1710 +1712 3 445.1087 398.0376 52.8514 0.3178 1711 +1713 3 446.192 397.699 53.1938 0.3559 1712 +1714 3 447.2662 397.3043 53.1815 0.3432 1713 +1715 3 448.289 396.7941 53.0788 0.3178 1714 +1716 3 449.0738 396.221 53.1731 0.2584 1715 +1717 3 450.1423 395.8629 53.1829 0.2511 1716 +1718 3 451.2428 395.5552 53.1174 0.2542 1717 +1719 3 452.2129 394.9694 53.0362 0.2247 1718 +1720 3 453.0354 394.2441 52.3359 0.1762 1719 +1721 3 454.0353 393.8128 51.6242 0.1432 1720 +1722 3 454.9985 393.4937 52.7271 0.1652 1721 +1723 3 455.8829 393.3324 54.4393 0.2303 1722 +1724 3 456.9902 393.56 54.8691 0.2938 1723 +1725 3 458.053 393.9742 54.9452 0.3312 1724 +1726 3 459.0323 394.4832 55.6693 0.3425 1725 +1727 3 460.0848 394.7246 56.4029 0.3292 1726 +1728 3 461.0881 394.1972 56.5079 0.3153 1727 +1729 3 461.9781 393.528 56.4245 0.308 1728 +1730 3 463.1004 393.433 56.3203 0.3216 1729 +1731 3 464.2146 393.6447 56.3604 0.3267 1730 +1732 3 465.2602 393.9181 57.1967 0.3098 1731 +1733 3 466.2189 394.3402 58.1756 0.2798 1732 +1734 3 467.2485 394.6903 58.133 0.2588 1733 +1735 3 468.3616 394.6617 58.0006 0.2718 1734 +1736 3 469.4644 394.6583 58.7345 0.2898 1735 +1737 3 470.5421 394.7864 59.383 0.2998 1736 +1738 3 471.6186 395.0667 59.9124 0.2762 1737 +1739 3 472.7294 395.125 60.4206 0.2431 1738 +1740 3 473.8654 395.0392 60.335 0.2231 1739 +1741 3 474.998 394.9752 60.2686 0.2221 1740 +1742 3 476.1385 394.9957 60.3142 0.2288 1741 +1743 3 477.2791 395.0415 60.3151 0.2288 1742 +1744 3 478.4185 395.0369 60.4898 0.2413 1743 +1745 3 479.5568 395.0529 60.5497 0.2542 1744 +1746 3 480.6813 395.2451 60.615 0.2478 1745 +1747 3 481.8013 395.3561 60.9255 0.2216 1746 +1748 3 482.9236 395.2165 61.2637 0.2102 1747 +1749 3 484.0539 395.0987 61.3718 0.2298 1748 +1750 3 485.1395 395.3012 61.7487 0.2415 1749 +1751 3 486.0719 395.0575 62.5257 0.2061 1750 +1752 3 486.6027 394.2167 63.7731 0.1526 1751 +1753 3 486.5775 393.1585 64.533 0.1206 1752 +1754 3 486.1908 392.1094 65.0336 0.1144 1753 +1755 3 485.9735 390.9998 65.219 0.1144 1754 +1756 3 485.5857 389.9335 65.329 0.1144 1755 +1757 3 485.2242 388.865 65.7591 0.1144 1756 +1758 3 484.9599 387.7782 66.3373 0.1144 1757 +1759 3 484.9347 386.6697 66.9606 0.1144 1758 +1760 3 484.873 385.5383 67.2946 0.1246 1759 +1761 3 484.5938 384.4538 67.804 0.1374 1760 +1762 3 484.1797 383.4173 68.4135 0.1501 1761 +1763 3 483.8193 382.3626 69.0365 0.1421 1762 +1764 3 483.9154 381.2574 69.4938 0.1398 1763 +1765 3 484.0996 380.142 69.923 0.1398 1764 +1766 3 483.888 379.1136 70.9411 0.1512 1765 +1767 3 484.1408 378.092 71.96 0.1144 1766 +1768 3 449.6904 396.6889 51.8938 0.2217 1715 +1769 3 450.7738 396.4006 51.6163 0.2476 1768 +1770 3 451.753 395.9167 50.9172 0.2638 1769 +1771 3 452.6636 395.2589 50.5061 0.2766 1770 +1772 3 453.5422 394.5313 50.3096 0.2895 1771 +1773 3 454.2561 393.647 50.3843 0.3127 1772 +1774 3 454.8315 392.6677 50.1469 0.328 1773 +1775 3 455.3692 391.6621 49.924 0.3408 1774 +1776 3 456.0602 390.7584 50.0422 0.312 1775 +1777 3 456.5693 389.7928 49.3618 0.2727 1776 +1778 3 457.0028 388.7472 49.0378 0.2233 1777 +1779 3 457.7956 387.9464 49.1862 0.2051 1778 +1780 3 458.6971 387.2497 49.005 0.1808 1779 +1781 3 459.6992 386.7029 49.0893 0.1663 1780 +1782 3 460.7208 386.2258 48.6517 0.1769 1781 +1783 3 461.8065 385.8804 48.7542 0.202 1782 +1784 3 462.8601 385.4411 48.573 0.2283 1783 +1785 3 463.9217 385.0704 48.0679 0.2163 1784 +1786 3 465.0063 384.7867 47.5121 0.2035 1785 +1787 3 466.0656 384.384 47.88 0.2288 1786 +1788 3 424.5304 414.5181 48.6119 0.4049 1457 +1789 3 425.6149 414.3488 48.4985 0.3843 1788 +1790 3 426.7326 414.3511 47.9606 0.3226 1789 +1791 3 427.8629 414.4518 48.193 0.293 1790 +1792 3 428.9222 414.4197 49.2402 0.3297 1791 +1793 3 430.0628 414.3614 49.1826 0.3939 1792 +1794 3 431.161 414.1658 48.5643 0.4576 1793 +1795 3 432.2512 413.365 49.2086 0.2714 1794 +1796 3 433.2728 412.8753 49.0532 0.2178 1795 +1797 3 434.3871 412.674 48.8684 0.1954 1796 +1798 3 435.5208 412.5367 48.7368 0.2072 1797 +1799 3 436.5996 412.1901 48.5598 0.2509 1798 +1800 3 437.6761 411.8228 48.7026 0.318 1799 +1801 3 438.6462 411.2348 48.648 0.3665 1800 +1802 3 439.7719 411.0918 48.4428 0.3813 1801 +1803 3 440.9102 411.0392 48.6889 0.3813 1802 +1804 3 441.4364 410.8836 48.9308 0.2766 1803 +1805 3 442.4832 410.5747 49.7518 0.2086 1804 +1806 3 443.4899 410.0565 49.77 0.2034 1805 +1807 3 444.4795 409.6218 50.6562 0.24 1806 +1808 3 445.4221 409.004 51.1188 0.2782 1807 +1809 3 446.255 408.2204 51.1778 0.2921 1808 +1810 3 447.264 407.7022 50.8547 0.2401 1809 +1811 3 448.2798 407.1988 50.5025 0.1775 1810 +1812 3 449.2545 406.6016 50.5646 0.1667 1811 +1813 3 450.2967 406.1703 50.9656 0.2067 1812 +1814 3 451.292 406.0022 52.2808 0.2805 1813 +1815 3 452.3296 405.7425 53.0818 0.2936 1814 +1816 3 453.2048 405.0698 52.4322 0.3051 1815 +1817 3 454.2504 404.6179 52.4031 0.3133 1816 +1818 3 455.2376 404.0986 52.9556 0.3625 1817 +1819 3 456.1048 403.3721 53.3652 0.3963 1818 +1820 3 456.9628 402.6388 53.6164 0.3994 1819 +1821 3 457.8139 401.9021 53.1835 0.3564 1820 +1822 3 458.6193 401.1001 53.3268 0.3014 1821 +1823 3 459.4636 400.3863 53.9221 0.2476 1822 +1824 3 460.4646 399.8623 54.2038 0.2254 1823 +1825 3 461.4816 399.399 54.014 0.2199 1824 +1826 3 462.6142 399.288 54.1321 0.2208 1825 +1827 3 463.7296 399.3178 54.595 0.1905 1826 +1828 3 464.798 399.6484 55.1062 0.1517 1827 +1829 3 465.7796 400.1723 55.7052 0.1225 1828 +1830 3 466.6811 400.6963 55.3316 0.1195 1829 +1831 3 467.5631 400.948 55.1653 0.1335 1830 +1832 3 468.5916 401.0075 55.5932 0.1613 1831 +1833 3 469.6109 401.2912 54.8041 0.2016 1832 +1834 3 470.5444 401.8025 55.1516 0.251 1833 +1835 3 471.6094 402.0108 55.8155 0.2759 1834 +1836 3 472.6859 401.7545 56.294 0.2701 1835 +1837 3 473.4066 400.9274 56.4973 0.2559 1836 +1838 3 473.8334 399.9664 57.5322 0.2542 1837 +1839 3 474.6033 399.2537 58.6062 0.2542 1838 +1840 3 475.578 398.6691 58.5956 0.2168 1839 +1841 3 476.4074 397.9095 58.0905 0.1781 1840 +1842 3 477.1212 397.0218 57.8435 0.1653 1841 +1843 3 478.0776 396.396 57.96 0.2288 1842 +1844 3 441.9592 411.1788 47.9024 0.2339 1803 +1845 3 443.0174 411.594 47.614 0.2042 1844 +1846 3 444.0047 412.1626 47.3729 0.2158 1845 +1847 3 444.8753 412.8913 47.6826 0.2659 1846 +1848 3 445.7138 413.6681 47.8036 0.2794 1847 +1849 3 446.684 414.2504 47.4074 0.2923 1848 +1850 3 447.5694 414.668 45.9637 0.2796 1849 +1851 3 448.6276 415.0009 45.2833 0.2794 1850 +1852 3 449.759 415.1599 45.2497 0.2675 1851 +1853 3 450.8973 415.0546 45.2012 0.2803 1852 +1854 3 452.039 415.0169 45.1576 0.2916 1853 +1855 3 453.143 414.8876 44.5024 0.278 1854 +1856 3 454.2366 414.668 43.9062 0.2525 1855 +1857 3 455.36 414.4655 44.0765 0.2297 1856 +1858 3 456.48 414.2424 44.0681 0.2424 1857 +1859 3 457.6034 414.2161 44.4212 0.2542 1858 +1860 3 458.6719 414.5753 43.967 0.2531 1859 +1861 3 459.7404 414.9666 44.1129 0.2402 1860 +1862 3 460.7849 415.2869 44.9056 0.2288 1861 +1863 3 461.8248 415.7571 45.0542 0.2307 1862 +1864 3 462.8384 416.265 44.9873 0.2415 1863 +1865 3 463.9263 416.5235 45.0318 0.247 1864 +1866 3 465.0349 416.6425 45.5333 0.2481 1865 +1867 3 466.1606 416.5258 45.7836 0.2536 1866 +1868 3 467.2645 416.2387 45.9052 0.2669 1867 +1869 3 468.3753 415.9813 45.8287 0.2731 1868 +1870 3 469.3889 416.2147 46.1552 0.2666 1869 +1871 3 470.2126 416.9605 46.7292 0.2542 1870 +1872 3 471.1427 417.5463 46.6371 0.2616 1871 +1873 3 472.1757 418.0084 46.2529 0.2746 1872 +1874 3 473.0749 418.6834 45.9264 0.264 1873 +1875 3 473.9443 419.4098 45.5661 0.2305 1874 +1876 3 474.9785 419.7599 45.1105 0.208 1875 +1877 3 476.0985 419.6947 45.1522 0.2202 1876 +1878 3 477.1944 419.7748 45.7542 0.2288 1877 +1879 3 478.16 420.3022 46.256 0.2113 1878 +1880 3 479.0626 420.9977 46.2997 0.1764 1879 +1881 3 479.9652 421.5983 45.5269 0.1557 1880 +1882 3 480.7717 422.1909 44.1888 0.1725 1881 +1883 3 481.8082 422.5467 43.7469 0.2106 1882 +1884 3 482.8664 422.1978 43.6276 0.2601 1883 +1885 3 483.9498 421.8546 43.3303 0.2782 1884 +1886 3 485.0686 421.8157 42.7994 0.2564 1885 +1887 3 486.2011 421.8958 42.4908 0.2075 1886 +1888 3 487.328 421.7299 42.3035 0.1555 1887 +1889 3 488.3313 421.1888 42.2232 0.1282 1888 +1890 3 489.3689 420.7071 42.3013 0.1149 1889 +1891 3 490.4911 420.4921 42.2878 0.1144 1890 +1892 3 491.626 420.3742 42.4637 0.1144 1891 +1893 3 492.7574 420.4738 42.1546 0.1144 1892 +1894 3 493.8316 420.7174 41.3963 0.1144 1893 +1895 3 494.9436 420.952 41.0617 0.1144 1894 +1896 3 496.0418 420.849 40.3217 0.1144 1895 +1897 3 497.1824 420.7632 40.32 0.1144 1896 +1898 3 431.9813 414.4735 48.5276 0.2727 1794 +1899 3 433.0852 414.7229 48.5624 0.1397 1898 +1900 3 434.1228 415.0558 48.2068 0.1335 1899 +1901 3 435.1467 415.4791 47.8579 0.1528 1900 +1902 3 436.142 415.9881 47.9632 0.1787 1901 +1903 3 437.0263 416.7089 47.8884 0.212 1902 +1904 3 437.8214 417.5074 48.0894 0.2361 1903 +1905 3 438.6451 418.283 48.309 0.2263 1904 +1906 3 439.5317 418.9957 48.0931 0.1929 1905 +1907 3 440.5647 419.3893 47.8862 0.1613 1906 +1908 3 441.6915 419.4842 47.5415 0.1525 1907 +1909 3 442.8241 419.5906 47.5138 0.17 1908 +1910 3 443.9338 419.4144 47.5745 0.2146 1909 +1911 3 445.0137 419.5506 47.1187 0.2662 1910 +1912 3 446.1142 419.7107 46.4971 0.2701 1911 +1913 3 447.2102 419.7954 45.7265 0.2183 1912 +1914 3 448.329 419.967 45.5661 0.1738 1913 +1915 3 449.4307 420.269 45.5927 0.1955 1914 +1916 3 450.466 420.746 45.7178 0.2747 1915 +1917 3 451.5231 421.1773 45.857 0.3439 1916 +1918 3 452.5138 421.7413 45.9774 0.3665 1917 +1919 3 453.4576 422.319 45.3432 0.3469 1918 +1920 3 454.327 423.0478 45.3242 0.2988 1919 +1921 3 455.3875 423.3898 44.8854 0.2584 1920 +1922 3 456.4068 423.8863 45.0526 0.2315 1921 +1923 3 457.4845 424.2364 44.7535 0.2402 1922 +1924 3 458.5884 424.1334 44.1521 0.2298 1923 +1925 3 459.721 424.1483 43.7928 0.2288 1924 +1926 3 460.7483 423.7342 44.4744 0.2298 1925 +1927 3 461.8465 423.455 44.5329 0.2818 1926 +1928 3 462.8704 423.6712 45.5062 0.3226 1927 +1929 3 463.8989 424.1346 45.194 0.3559 1928 +1930 3 464.8369 424.7375 45.6792 0.3536 1929 +1931 3 465.5394 425.6206 46.1068 0.3302 1930 +1932 3 466.2669 426.4878 46.2493 0.271 1931 +1933 3 467.1684 427.1364 46.8289 0.2345 1932 +1934 3 467.8868 427.8835 47.7462 0.2211 1933 +1935 3 468.3342 428.9234 48.1043 0.2229 1934 +1936 3 469.0297 429.715 48.5316 0.2161 1935 +1937 3 470.0604 430.1566 48.704 0.223 1936 +1938 3 470.9104 430.8361 48.7707 0.2426 1937 +1939 3 471.4561 431.82 49.1826 0.2612 1938 +1940 3 471.9652 432.8107 49.7748 0.2669 1939 +1941 3 472.798 433.5074 50.15 0.2747 1940 +1942 3 473.7636 434.0061 50.8878 0.2715 1941 +1943 3 474.6342 434.6651 51.5922 0.2669 1942 +1944 3 475.4739 435.427 51.9677 0.2406 1943 +1945 3 476.4543 435.9864 51.9652 0.2288 1944 +1946 3 477.4427 436.5447 52.19 0.2012 1945 +1947 3 478.1291 437.3912 52.8091 0.1811 1946 +1948 3 478.7102 438.3636 52.8021 0.1487 1947 +1949 3 479.4664 439.2113 52.8032 0.13 1948 +1950 3 480.2638 439.7845 54.0548 0.1168 1949 +1951 3 480.7671 440.7374 54.4897 0.1248 1950 +1952 3 481.2213 441.767 54.0837 0.1375 1951 +1953 3 481.7864 442.7543 53.8362 0.1504 1952 +1954 3 482.0622 443.8526 53.93 0.1417 1953 +1955 3 482.1422 444.9874 53.72 0.129 1954 +1956 3 482.323 446.1108 53.4498 0.1162 1955 +1957 3 482.5072 447.2388 53.3221 0.1144 1956 +1958 3 482.5449 448.3794 53.3607 0.1364 1957 +1959 3 482.1411 449.433 53.1852 0.1637 1958 +1960 3 481.2682 450.1617 53.1401 0.1893 1959 +1961 3 480.3427 450.8207 53.4517 0.1661 1960 +1962 3 479.4355 451.4693 54.084 0.1528 1961 +1963 3 478.5375 452.1317 54.6974 0.1525 1962 +1964 3 477.8488 453.024 55.16 0.2288 1963 +1965 2 416.948 419.5403 47.6647 0.1144 1 +1966 2 417.6046 420.4761 47.5507 0.1144 1965 +1967 2 418.2624 421.4107 47.4365 0.1144 1966 +1968 2 419.0827 422.1554 47.2511 0.1206 1967 +1969 2 419.8949 422.899 46.9409 0.1417 1968 +1970 2 420.3376 423.9332 46.9924 0.1684 1969 +1971 2 421.1339 424.5533 46.8101 0.1864 1970 +1972 2 422.2024 424.7397 47.327 0.1819 1971 +1973 2 423.0375 425.2854 48.4434 0.1678 1972 +1974 2 423.4688 426.3036 48.8449 0.1441 1973 +1975 2 423.9092 427.3504 49.1618 0.129 1974 +1976 2 424.4663 428.3456 49.1 0.1271 1975 +1977 2 425.044 429.326 48.8174 0.138 1976 +1978 2 425.6584 430.2641 49.264 0.1626 1977 +1979 2 426.5004 431.0043 49.7773 0.1652 1978 +1980 2 427.2176 431.86 49.2498 0.1652 1979 +1981 2 427.856 432.7752 49.84 0.1144 1980 +1982 3 416.8999 419.236 45.1746 0.1144 1 +1983 3 417.5245 420.0013 43.7637 0.1144 1982 +1984 3 418.1492 420.7666 42.3525 0.1256 1983 +1985 3 418.8058 421.5446 41.0732 0.161 1984 +1986 3 419.6936 422.2138 40.4936 0.2238 1985 +1987 3 420.7815 422.5284 40.2144 0.2883 1986 +1988 3 421.8306 422.136 39.8532 0.3432 1987 +1989 3 420.9016 421.6544 39.0558 0.2669 1988 +1990 3 420.6728 420.8055 37.8036 0.2669 1989 +1991 3 420.8696 419.7256 37.0546 0.2669 1990 +1992 3 420.8616 418.6216 36.7489 0.2838 1991 +1993 3 420.4063 418.0027 35.1926 0.3144 1992 +1994 3 419.3424 417.8208 34.6254 0.3178 1993 +1995 3 418.2556 417.4776 34.386 0.267 1994 +1996 3 417.2934 416.8988 33.8489 0.1144 1995 +1997 3 416.6826 416.4526 32.8378 0.1949 1996 +1998 3 415.7937 416.0373 31.4345 0.2569 1997 +1999 3 415.0318 415.725 32.6483 0.3018 1998 +2000 3 414.104 415.828 34.2311 0.3424 1999 +2001 3 412.9829 415.9492 34.6629 0.3807 2000 +2002 3 412.0562 416.0728 33.0711 0.4195 2001 +2003 3 411.3218 415.9836 33.0798 0.3811 2002 +2004 3 410.4649 416.0259 32.1793 0.3432 2003 +2005 3 409.989 416.7146 31.2967 0.3363 2004 +2006 3 409.3449 417.6046 32.006 0.3305 2005 +2007 3 408.5727 418.3928 32.0331 0.2806 2006 +2008 3 407.8738 419.2588 31.4084 0.244 2007 +2009 3 407.0947 420.0699 31.8041 0.2183 2008 +2010 3 406.311 420.8993 31.9318 0.2278 2009 +2011 3 405.6212 421.7699 31.2973 0.2288 2010 +2012 3 405.3478 422.6062 29.5565 0.2044 2011 +2013 3 404.7907 423.304 29.9611 0.1631 2012 +2014 3 404.9302 424.1872 30.3162 0.1398 2013 +2015 3 404.7712 424.8667 28.285 0.1398 2014 +2016 3 404.2461 425.6138 28.126 0.1658 2015 +2017 3 403.6993 426.402 29.6089 0.1991 2016 +2018 3 402.8768 427.1307 29.5758 0.2367 2017 +2019 3 402.267 427.5025 27.5783 0.2549 2018 +2020 3 401.1699 427.7748 27.2474 0.2669 2019 +2021 3 400.0488 427.8732 27.0144 0.2613 2020 +2022 3 398.9952 427.7954 26.4026 0.2345 2021 +2023 3 397.9335 427.5185 27.0337 0.2076 2022 +2024 3 396.8422 427.5437 26.9671 0.2073 2023 +2025 3 395.7943 427.379 26.068 0.2526 2024 +2026 3 394.7109 427.1284 25.6917 0.3043 2025 +2027 3 393.5886 426.9419 25.5492 0.3178 2026 +2028 3 392.4744 426.7749 25.6449 0.2911 2027 +2029 3 391.3658 426.744 26.3105 0.2574 2028 +2030 3 390.2584 426.831 26.364 0.2415 2029 +2031 3 389.151 426.9934 26.5317 0.2185 2030 +2032 3 388.1089 427.149 25.9809 0.1956 2031 +2033 3 387.0221 427.2783 25.5049 0.1907 2032 +2034 3 385.909 427.2119 25.9552 0.2287 2033 +2035 3 384.8565 427.4327 26.761 0.2852 2034 +2036 3 383.8051 427.4453 25.9179 0.3172 2035 +2037 3 383.0238 428.2347 25.3394 0.3042 2036 +2038 3 381.9896 428.563 25.1919 0.2841 2037 +2039 3 380.8696 428.5813 25.3266 0.2978 2038 +2040 3 379.76 428.7449 25.5338 0.3111 2039 +2041 3 378.791 429.1556 25.9759 0.2974 2040 +2042 3 378.4009 430.0102 25.0701 0.2707 2041 +2043 3 378.386 431.0169 25.5394 0.2563 2042 +2044 3 377.8826 431.9664 25.104 0.2881 2043 +2045 3 376.9228 432.4537 24.2948 0.3161 2044 +2046 3 376.1472 433.2328 24.92 0.3432 2045 +2047 3 411.3046 415.129 32.1364 0.3456 2002 +2048 3 410.4855 414.4174 31.99 0.3138 2047 +2049 3 409.4227 414.2413 32.5049 0.3226 2048 +2050 3 408.3096 414.2378 32.2269 0.3486 2049 +2051 3 407.248 413.9507 31.5722 0.3753 2050 +2052 3 406.215 414.1028 30.6886 0.3707 2051 +2053 3 405.2071 413.7654 29.8875 0.3457 2052 +2054 3 404.0848 413.6018 29.9158 0.3192 2053 +2055 3 402.9706 413.3466 29.8385 0.3052 2054 +2056 3 401.8872 412.984 29.68 0.3432 2055 +2057 3 417.5211 416.6917 30.9996 0.2585 1996 +2058 3 418.5049 416.2192 30.2204 0.3615 2057 +2059 3 419.6066 416.1208 29.965 0.4149 2058 +2060 3 420.3937 416.7192 28.9204 0.3664 2059 +2061 3 420.6831 417.3095 26.759 0.2968 2060 +2062 3 421.0195 418.2567 25.6124 0.2542 2061 +2063 3 421.6704 419.181 25.3901 0.2486 2062 +2064 3 422.5719 419.6444 25.4464 0.2545 2063 +2065 3 423.6827 419.578 25.9115 0.2744 2064 +2066 3 424.7775 419.3984 25.9818 0.2952 2065 +2067 3 425.8357 419.459 25.1835 0.3051 2066 +2068 3 426.3047 420.1786 23.7658 0.3155 2067 +2069 3 425.8849 421.1579 23.9176 0.3302 2068 +2070 3 425.4879 422.2287 24.0481 0.343 2069 +2071 3 424.4492 422.6954 23.9868 0.3432 2070 +2072 3 423.5317 423.1782 23.6723 0.3241 2071 +2073 3 422.6508 423.8188 22.8981 0.2773 2072 +2074 3 422.1371 424.6837 22.227 0.2488 2073 +2075 3 421.7939 425.6492 21.5152 0.2415 2074 +2076 3 421.2311 426.5965 21.0017 0.2415 2075 +2077 3 420.8536 427.6455 21.0126 0.2336 2076 +2078 3 420.0791 428.2141 21.9215 0.2466 2077 +2079 3 419.0518 428.3708 23.0787 0.2635 2078 +2080 3 418.3963 428.6717 25.0925 0.2669 2079 +2081 3 418.1103 429.6772 25.9507 0.2305 2080 +2082 3 417.3312 430.3728 24.92 0.2288 2081 +2083 3 425.8231 423.153 22.3068 0.225 2071 +2084 3 426.6731 423.7868 21.3234 0.193 2083 +2085 3 427.0072 424.8576 21.2206 0.1907 2084 +2086 3 426.9568 425.9581 21.9419 0.2278 2085 +2087 3 426.7417 427.0598 21.4424 0.254 2086 +2088 3 426.8264 428.1992 21.56 0.2288 2087 +2089 3 422.7709 421.3661 39.0477 0.256 1988 +2090 3 423.7387 420.7975 38.6831 0.2288 2089 +2091 3 424.8244 420.7964 38.0369 0.3008 2090 +2092 3 425.9409 420.5722 38.0584 0.3926 2091 +2093 3 426.9911 420.9794 37.6132 0.4957 2092 +2094 3 428.0928 420.8135 36.906 0.3934 2093 +2095 3 429.2185 420.754 36.7021 0.3232 2094 +2096 3 430.0113 420.9874 35.294 0.2963 2095 +2097 3 430.9928 421.167 34.3991 0.3017 2096 +2098 3 432.1128 421.024 34.188 0.3051 2097 +2099 3 433.147 421.0355 33.1618 0.3051 2098 +2100 3 434.1514 421.3283 32.0667 0.3051 2099 +2101 3 435.2623 421.3958 31.5487 0.3051 2100 +2102 3 436.3628 421.6681 31.2911 0.2933 2101 +2103 3 437.302 422.2996 31.586 0.2924 2102 +2104 3 438.3465 422.7526 31.3732 0.2924 2103 +2105 3 439.4276 422.43 31.2452 0.3296 2104 +2106 3 440.4652 421.9827 30.8042 0.3305 2105 +2107 3 441.5291 421.739 29.9782 0.318 2106 +2108 3 442.6719 421.7745 29.9541 0.3053 2107 +2109 3 443.7908 421.5468 29.8609 0.33 2108 +2110 3 444.913 421.3375 29.664 0.3806 2109 +2111 3 445.9724 421.6406 29.5322 0.3792 2110 +2112 3 446.3499 422.716 29.3829 0.3488 2111 +2113 3 446.5924 423.8211 29.6139 0.2828 2112 +2114 3 447.1942 424.7626 29.8824 0.2202 2113 +2115 3 448.0579 425.3552 29.1102 0.1725 2114 +2116 3 448.8324 425.3701 27.58 0.1525 2115 +2117 3 449.6435 424.5922 27.442 0.1699 2116 +2118 3 450.1102 424.0568 25.632 0.2161 2117 +2119 3 451.0197 423.7525 25.5559 0.2907 2118 +2120 3 452.1477 423.7731 25.5676 0.3373 2119 +2121 3 453.2574 423.6838 24.9785 0.3432 2120 +2122 3 454.2309 423.6461 23.5528 0.3104 2121 +2123 3 455.3143 423.7124 22.7273 0.2941 2122 +2124 3 456.2684 423.1793 23.1028 0.3036 2123 +2125 3 457.211 422.5536 23.506 0.3394 2124 +2126 3 458.3184 422.3076 23.6379 0.3549 2125 +2127 3 459.4315 422.3648 23.0686 0.3559 2126 +2128 3 460.2655 423.0398 22.1992 0.3311 2127 +2129 3 461.1453 423.7342 21.6303 0.3052 2128 +2130 3 461.8591 424.6265 21.5228 0.2288 2129 +2131 3 428.142 422.1623 36.9488 0.3607 2093 +2132 3 428.9966 422.7778 35.9517 0.2996 2131 +2133 3 429.9747 423.0112 34.9129 0.2597 2132 +2134 3 431.0935 423.0146 34.3395 0.2209 2133 +2135 3 432.114 423.2937 33.504 0.1746 2134 +2136 3 433.1333 423.7079 32.9602 0.1448 2135 +2137 3 434.2407 423.9081 33.2004 0.1398 2136 +2138 3 435.3721 424.0328 33.3992 0.1686 2137 +2139 3 436.3857 424.4549 32.7984 0.1993 2138 +2140 3 437.0629 425.3415 32.5702 0.2481 2139 +2141 3 437.2551 426.4557 32.7029 0.277 2140 +2142 3 437.9815 427.2829 33.231 0.3157 2141 +2143 3 439.0077 427.7553 32.933 0.33 2142 +2144 3 439.7078 428.6271 32.4288 0.3431 2143 +2145 3 440.1746 429.5926 33.3942 0.3299 2144 +2146 3 440.7397 430.5822 33.29 0.3034 2145 +2147 3 441.1195 431.598 32.408 0.2663 2146 +2148 3 441.7018 432.5636 32.0118 0.2535 2147 +2149 3 442.3756 433.4536 32.6225 0.2415 2148 +2150 3 443.0186 434.3162 33.5608 0.2406 2149 +2151 3 443.4876 435.3217 34.1928 0.2317 2150 +2152 3 443.8674 436.3948 33.9511 0.2688 2151 +2153 3 444.4028 437.3901 33.5524 0.2924 2152 +2154 3 445.1167 438.2572 33.2749 0.2855 2153 +2155 3 445.6395 439.1965 33.9478 0.2247 2154 +2156 3 446.2538 440.0819 33.4356 0.2071 2155 +2157 3 446.891 440.9411 33.9592 0.2369 2156 +2158 3 447.8337 441.5703 34.071 0.2931 2157 +2159 3 448.694 442.2979 33.7565 0.3296 2158 +2160 3 449.632 442.9225 33.3264 0.3358 2159 +2161 3 450.5438 443.6089 33.1962 0.3305 2160 +2162 3 451.2199 444.5069 33.1201 0.3305 2161 +2163 3 451.554 445.5846 33.2228 0.3305 2162 +2164 3 452.0791 446.5673 33.3119 0.314 2163 +2165 3 452.8856 447.3578 33.0484 0.2799 2164 +2166 3 453.7893 448.0282 32.5578 0.2582 2165 +2167 3 454.6828 448.6528 33.061 0.2542 2166 +2168 3 455.5854 449.2488 33.9704 0.282 2167 +2169 3 456.4835 449.8277 33.4496 0.312 2168 +2170 3 457.1699 450.6982 33.0798 0.3381 2169 +2171 3 457.9855 451.4888 32.951 0.333 2170 +2172 3 458.744 452.3307 32.625 0.3203 2171 +2173 3 459.5723 453.0652 33.1416 0.3075 2172 +2174 3 460.6591 453.1533 33.3698 0.3155 2173 +2175 3 461.7802 453.0446 33.8352 0.3286 2174 +2176 3 462.9127 453.1281 34.0298 0.3421 2175 +2177 3 464.0087 453.4393 34.2294 0.3305 2176 +2178 3 465.1115 453.3798 33.5093 0.303 2177 +2179 3 466.2132 453.2597 33.0711 0.277 2178 +2180 3 467.0472 453.3397 31.9206 0.2518 2179 +2181 3 467.9086 453.2551 33.5829 0.2336 2180 +2182 3 469.048 453.2757 33.8136 0.2161 2181 +2183 3 470.1257 453.0904 33.2979 0.2254 2182 +2184 3 471.0157 453.6006 32.881 0.258 2183 +2185 3 471.9263 454.2778 32.5486 0.2984 2184 +2186 3 472.9879 454.6725 32.6374 0.3161 2185 +2187 3 474.0622 455.0523 32.8947 0.3178 2186 +2188 3 475.1158 455.4378 32.408 0.2942 2187 +2189 3 476.2323 455.6552 32.1608 0.2675 2188 +2190 3 477.3477 455.7868 31.6327 0.2163 2189 +2191 3 478.4208 456.1128 31.08 0.1144 2190 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Rorb_325404214_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Rorb_325404214_m.swc new file mode 100644 index 0000000..cd1d585 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Rorb_325404214_m.swc @@ -0,0 +1,2194 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/neuron tracing and reconstruction/vaa3d/vaa3d_bin_msvc_64bit_v2921_a/vaa3d_bin_msvc_64bit_v2921_a/new 168053.04.01.01.swc +# id,type,x,y,z,r,pid +1 1 415.6095 417.7339 47.8951 6.2366 -1 +2 4 413.4633 416.9525 48.2236 0.1144 1 +3 4 412.3903 416.5624 48.3879 0.1652 2 +4 4 411.3172 416.1712 48.552 0.2542 3 +5 4 410.2441 415.7811 48.7166 0.3813 4 +6 4 409.1001 415.7559 48.72 0.4576 5 +7 4 409.1871 414.7286 47.5728 0.2587 6 +8 4 408.9468 413.7368 46.8028 0.2501 7 +9 4 408.4984 412.7644 46.6435 0.2908 8 +10 4 408.6242 411.7382 45.6862 0.3458 9 +11 4 409.0727 410.9088 44.2305 0.3686 10 +12 4 409.8048 410.1068 43.4174 0.3514 11 +13 4 410.4535 409.2797 43.8572 0.3085 12 +14 4 411.0884 408.408 44.1526 0.2746 13 +15 4 411.6181 407.415 43.7422 0.2852 14 +16 4 412.0162 406.3522 43.4109 0.3197 15 +17 4 412.4715 405.3181 43.0052 0.3672 16 +18 4 413.0721 404.4749 41.925 0.4006 17 +19 4 413.5045 403.538 40.7725 0.3955 18 +20 4 413.9804 402.5095 40.8229 0.3338 19 +21 4 414.533 401.5509 40.1475 0.2932 20 +22 4 415.3326 400.9068 38.9242 0.3176 21 +23 4 416.3394 400.972 37.6132 0.572 22 +24 4 416.9869 400.3554 39.8726 0.3938 23 +25 4 417.7831 400.1895 41.337 0.3185 24 +26 4 418.8962 400.0431 41.5464 0.2855 25 +27 4 419.9006 399.5306 41.4324 0.2954 26 +28 4 420.7186 398.787 40.8402 0.3374 27 +29 4 420.6717 397.6967 40.549 0.3432 28 +30 4 420.6763 396.5539 40.5409 0.3432 29 +31 4 420.4795 395.4293 40.5177 0.3432 30 +32 4 420.2175 394.3322 40.0576 0.3926 31 +33 4 420.1672 393.2317 39.3039 0.4188 32 +34 4 420.0779 392.1106 38.7923 0.4195 33 +35 4 420.1958 390.9849 39.1642 0.3822 34 +36 4 420.1546 389.8455 39.3565 0.3316 35 +37 4 420.0539 388.7209 39.8135 0.2806 36 +38 4 419.8549 387.6101 40.2632 0.2297 37 +39 4 419.848 386.4718 40.5278 0.2545 38 +40 4 420.2507 385.4136 40.178 0.3079 39 +41 4 420.4795 384.4206 38.9511 0.3813 40 +42 4 420.9943 383.4002 38.9544 0.3824 41 +43 4 421.4084 382.366 39.0348 0.394 42 +44 4 421.8683 381.5972 37.5304 0.3957 43 +45 4 422.6108 380.7655 38.134 0.3996 44 +46 4 423.2708 379.856 38.1679 0.3475 45 +47 4 423.6724 378.8081 37.8428 0.3077 46 +48 4 424.2261 377.8289 38.281 0.283 47 +49 4 424.6448 376.8485 38.7008 0.2885 48 +50 4 424.6322 375.7262 38.1615 0.2701 49 +51 4 424.7672 374.6154 37.7213 0.259 50 +52 4 425.3072 373.6853 37.2333 0.2619 51 +53 4 426.116 372.9177 36.7326 0.2598 52 +54 4 426.8939 372.0929 36.4652 0.2607 53 +55 4 427.6169 371.2269 36.2782 0.2477 54 +56 4 428.1729 370.2499 36.568 0.2482 55 +57 4 428.301 369.1997 37.119 0.268 56 +58 4 428.3296 368.0866 37.1496 0.2796 57 +59 4 428.476 366.9975 37.5558 0.2646 58 +60 4 428.4921 365.9404 38.614 0.2382 59 +61 4 428.6797 364.9795 38.04 0.2378 60 +62 4 428.9897 363.9556 38.1763 0.2415 61 +63 4 429.5823 362.9992 38.2914 0.2415 62 +64 4 430.096 362.2213 36.759 0.2418 63 +65 4 430.3202 361.1105 36.3874 0.2551 64 +66 4 430.7183 360.0397 36.2569 0.2796 65 +67 4 430.8579 358.9197 36.0772 0.2811 66 +68 4 430.525 357.8295 35.9792 0.2924 67 +69 4 430.2115 356.7541 35.4085 0.2942 68 +70 4 429.9884 355.6582 35.2243 0.3032 69 +71 4 429.9575 354.592 35.8677 0.2844 70 +72 4 429.6738 353.5406 35.5443 0.2442 71 +73 4 429.8992 352.4286 35.8708 0.2127 72 +74 4 430.1532 351.327 36.101 0.2107 73 +75 4 430.3842 350.2345 35.5944 0.2401 74 +76 4 430.6085 349.1705 34.858 0.271 75 +77 4 430.5833 348.0357 34.8202 0.2796 76 +78 4 430.4552 346.91 34.9826 0.2749 77 +79 4 430.1429 345.8644 35.2422 0.2669 78 +80 4 429.6887 344.8828 35.9436 0.2669 79 +81 4 429.4027 343.7823 35.9912 0.2617 80 +82 4 429.3283 342.644 35.9752 0.2488 81 +83 4 429.2654 341.5092 35.7739 0.2415 82 +84 4 428.9542 340.4315 35.8243 0.2476 83 +85 4 428.5435 339.3756 35.9411 0.2542 84 +86 4 428.2964 338.2659 35.7216 0.241 85 +87 4 428.253 337.1345 35.7787 0.2155 86 +88 4 428.1935 336.002 35.887 0.2034 87 +89 4 428.047 334.8694 35.7493 0.2102 88 +90 4 428.1168 333.7654 35.2537 0.223 89 +91 4 428.6431 332.8171 34.7704 0.2288 90 +92 4 429.3054 331.8961 34.8337 0.2288 91 +93 4 429.9449 330.9512 34.9664 0.2207 92 +94 4 430.3202 329.8987 34.8869 0.1989 93 +95 4 430.4174 328.7684 34.5817 0.1731 94 +96 4 430.6279 327.6588 34.2415 0.1564 95 +97 4 430.7926 326.5354 33.9646 0.1525 96 +98 4 430.9494 325.4142 33.5664 0.1436 97 +99 4 431.0912 324.2851 33.5502 0.1398 98 +100 4 431.0478 323.1537 33.8419 0.1398 99 +101 4 431.0958 322.02 33.7761 0.1683 100 +102 4 431.3578 320.9114 33.7848 0.2067 101 +103 4 431.8943 319.9127 33.9287 0.2647 102 +104 4 432.4148 318.9209 33.4818 0.3095 103 +105 4 432.9239 317.9176 33.7086 0.3281 104 +106 4 433.3358 316.8571 33.9564 0.3305 105 +107 4 433.4238 315.7566 34.571 0.32 106 +108 4 433.3461 314.6229 34.6052 0.3283 107 +109 4 433.2431 313.488 34.3664 0.3305 108 +110 4 433.0887 312.3589 34.5268 0.3517 109 +111 4 432.8175 311.2549 34.7973 0.3453 110 +112 4 432.5212 310.1636 35.2173 0.3218 111 +113 4 432.3656 309.0573 35.8081 0.2853 112 +114 4 432.0648 308.1101 34.6562 0.3042 113 +115 4 431.8589 307.0118 35.1266 0.3426 114 +116 4 431.6495 305.8873 35.1862 0.3808 115 +117 4 431.0535 304.9126 35.303 0.3813 116 +118 4 430.7801 303.8086 35.5578 0.3683 117 +119 4 430.2939 302.7882 35.1344 0.3556 118 +120 4 430.0639 301.6831 34.7032 0.3443 119 +121 4 430.0937 300.5505 34.3185 0.3686 120 +122 4 430.1097 299.4168 34.0116 0.3661 121 +123 4 430.2573 298.3014 34.214 0.3355 122 +124 4 430.7995 297.3164 33.9262 0.2754 123 +125 4 430.8773 296.1953 33.906 0.2567 124 +126 4 430.5833 295.1051 34.3484 0.2754 125 +127 4 430.3225 294.0137 34.8872 0.3123 126 +128 4 430.0273 292.9304 35.1792 0.3354 127 +129 4 429.8694 291.8069 35.0829 0.3377 128 +130 4 429.8408 290.6652 35.1207 0.3305 129 +131 4 429.7127 289.5327 35.0314 0.3249 130 +132 4 429.5125 288.4241 35.3021 0.3178 131 +133 4 429.3077 287.3534 36.1228 0.312 132 +134 4 429.3672 286.3329 36.2785 0.3111 133 +135 4 429.8305 285.3182 35.6964 0.3178 134 +136 4 430.2378 284.2783 35.8817 0.324 135 +137 4 430.5764 283.2144 36.4549 0.3305 136 +138 4 430.9356 282.29 35.7034 0.3378 137 +139 4 431.4768 281.4068 34.9874 0.3272 138 +140 4 432.1952 280.534 35.2635 0.2932 139 +141 4 432.9113 279.6497 35.4343 0.2627 140 +142 4 433.6607 278.7928 35.6118 0.2629 141 +143 4 434.4203 278.0069 36.3698 0.2845 142 +144 4 435.3046 277.3308 36.4988 0.2924 143 +145 4 436.1237 276.7164 35.4046 0.2924 144 +146 4 436.9531 276.1078 34.1916 0.2924 145 +147 4 437.683 275.4283 35.1582 0.2924 146 +148 4 437.8969 274.3449 35.6446 0.2439 147 +149 4 438.4952 273.416 35.0 0.1144 148 +150 4 415.304 399.582 36.0962 0.321 23 +151 4 414.6165 398.7 35.6356 0.286 150 +152 4 414.1074 397.7013 35.1806 0.2956 151 +153 4 413.6109 396.7049 34.594 0.3312 152 +154 4 413.1922 396.0082 32.8079 0.3432 153 +155 4 412.9577 395.0278 32.405 0.3337 154 +156 4 413.1442 393.9204 32.4181 0.3113 155 +157 4 413.6361 392.9057 32.7368 0.3051 156 +158 4 414.4129 392.3119 34.0194 0.3051 157 +159 4 415.3143 391.8303 33.3642 0.3199 158 +160 4 415.7754 390.9952 32.1745 0.3332 159 +161 4 415.4756 389.9232 31.5952 0.3367 160 +162 4 414.9837 388.9348 31.0271 0.3075 161 +163 4 414.3968 388.0551 30.0538 0.2597 162 +164 4 414.0822 387.061 29.3129 0.2108 163 +165 4 414.4048 386.1812 27.8964 0.2034 164 +166 4 414.4449 385.3106 26.6983 0.2496 165 +167 4 413.7802 384.6139 25.3638 0.3076 166 +168 4 413.6818 383.6255 25.338 0.3634 167 +169 4 414.3305 382.7652 26.1512 0.3324 168 +170 4 414.3568 381.6384 26.04 0.2288 169 +171 4 408.0202 415.4951 48.7203 0.483 6 +172 4 406.8808 415.3944 48.722 0.5084 171 +173 4 405.8214 414.9608 48.7309 0.5212 172 +174 4 404.8971 414.287 48.771 0.5466 173 +175 4 404.0402 413.532 48.9317 0.5212 174 +176 4 403.0941 412.952 49.6079 0.4576 175 +177 4 402.1812 412.4841 49.8131 0.4069 176 +178 4 401.1688 411.951 49.812 0.4195 177 +179 4 400.2009 411.3435 49.6801 0.394 178 +180 4 399.3876 410.5873 49.0104 0.3686 179 +181 4 398.5925 409.7682 48.8412 0.3559 180 +182 4 397.8649 408.8988 49.2358 0.3432 181 +183 4 397.111 408.0671 49.7594 0.3051 182 +184 4 396.0185 407.7273 49.6936 0.3178 183 +185 4 394.9077 407.7296 49.0249 0.3686 184 +186 4 393.7648 407.7754 48.9742 0.4449 185 +187 4 392.67 407.9813 49.4808 0.4299 186 +188 4 391.5832 407.9538 49.0952 0.3868 187 +189 4 390.6016 407.518 48.193 0.3358 188 +190 4 389.7093 406.8533 47.6756 0.3001 189 +191 4 388.8616 406.0868 47.6003 0.3025 190 +192 4 387.9613 405.3878 47.5933 0.343 191 +193 4 386.9763 404.8055 47.5619 0.4065 192 +194 4 385.9593 404.2965 47.3673 0.455 193 +195 4 384.9697 403.7679 46.8983 0.4703 194 +196 4 384.0911 403.0632 46.5136 0.4602 195 +197 4 383.2732 402.2636 46.4439 0.4399 196 +198 4 382.4655 401.4559 46.3336 0.4272 197 +199 4 381.6578 400.6494 46.2862 0.4303 198 +200 4 380.8502 399.844 46.48 0.4576 199 +201 4 380.4235 399.3956 45.3678 0.3814 200 +202 4 379.6467 398.557 45.3474 0.2288 201 +203 4 379.236 398.287 46.4797 0.3432 202 +204 4 379.2497 398.8911 48.2451 0.2529 203 +205 4 378.5096 398.4632 50.0976 0.2446 204 +206 4 377.7866 397.8855 51.7076 0.2687 205 +207 4 376.8061 397.4702 52.6896 0.2796 206 +208 4 375.7102 397.2128 53.1577 0.2775 207 +209 4 374.6154 396.8982 53.312 0.269 208 +210 4 373.5995 396.3868 53.606 0.282 209 +211 4 372.5733 395.9018 53.8331 0.295 210 +212 4 371.482 395.5998 54.1478 0.3051 211 +213 4 370.4398 395.228 54.8498 0.2992 212 +214 4 369.3827 394.8676 55.4196 0.2796 213 +215 4 368.2753 394.7292 55.923 0.2764 214 +216 4 367.1897 394.9546 56.4553 0.2706 215 +217 4 366.1647 395.4236 56.9215 0.2648 216 +218 4 365.1099 395.7737 57.5506 0.1946 217 +219 4 364.0437 396.0436 58.2845 0.1608 218 +220 4 363.0118 396.4841 58.7518 0.275 219 +221 4 362.0474 397.0835 59.0744 0.2843 220 +222 4 361.1105 397.6887 59.6562 0.2503 221 +223 4 360.1312 397.9393 60.5413 0.2065 222 +224 4 359.2755 397.3627 61.3416 0.1965 223 +225 4 358.7241 396.404 62.0234 0.2094 224 +226 4 358.1853 395.4282 62.5694 0.2282 225 +227 4 357.3948 394.6754 63.0974 0.2542 226 +228 4 356.4326 394.1595 63.922 0.2801 227 +229 4 355.6673 393.4136 64.3871 0.2924 228 +230 4 355.1685 392.3954 64.1855 0.2718 229 +231 4 354.8127 391.3796 64.6596 0.2182 230 +232 4 354.3185 390.4632 65.721 0.1674 231 +233 4 353.5864 390.0582 67.3389 0.1441 232 +234 4 352.7455 390.4621 68.5376 0.1753 233 +235 4 351.8395 391.1027 69.2101 0.2267 234 +236 4 350.9838 391.8257 69.7435 0.2783 235 +237 4 350.1475 392.5945 69.6993 0.2718 236 +238 4 349.8341 393.655 69.8524 0.2115 237 +239 4 348.8834 394.1778 69.7253 0.1414 238 +240 4 347.8744 394.7063 69.4823 0.1273 239 +241 4 346.8848 395.2806 69.5565 0.1522 240 +242 4 345.7717 395.3756 70.1296 0.1906 241 +243 4 344.6597 395.5838 70.5502 0.216 242 +244 4 343.5352 395.5014 71.0214 0.2161 243 +245 4 342.4358 395.3481 71.6937 0.2034 244 +246 4 341.3467 395.0301 72.065 0.1907 245 +247 4 340.34 394.68 73.08 0.2288 246 +248 4 378.3826 397.5995 46.4792 0.3676 203 +249 4 377.4983 396.8742 46.4766 0.3807 248 +250 4 376.678 396.0768 46.4666 0.3692 249 +251 4 375.9321 395.2097 46.4117 0.3686 250 +252 4 375.1107 394.4249 46.0888 0.3686 251 +253 4 374.0949 393.9444 45.5946 0.3933 252 +254 4 373.0355 393.5349 45.2698 0.394 253 +255 4 372.0299 393.0212 44.8274 0.394 254 +256 4 371.0793 392.3989 44.4973 0.3816 255 +257 4 370.0588 391.8909 44.7177 0.3688 256 +258 4 368.9377 391.6793 44.5665 0.3812 257 +259 4 367.8246 391.4413 44.2938 0.3939 258 +260 4 366.8328 390.8716 44.2406 0.457 259 +261 4 365.8924 390.2195 44.2322 0.4828 260 +262 4 364.9394 389.5881 44.2014 0.5082 261 +263 4 363.9865 388.9577 44.0605 0.4832 262 +264 4 362.9832 388.4544 43.5207 0.4704 263 +265 4 361.9891 387.9018 43.2281 0.4577 264 +266 4 360.9938 387.3424 43.4375 0.4576 265 +267 4 359.9871 386.839 43.937 0.445 266 +268 4 358.9494 386.3597 44.0152 0.4196 267 +269 4 357.9336 385.9009 43.3874 0.3941 268 +270 4 356.8044 385.7499 43.1214 0.3813 269 +271 4 355.6616 385.6973 43.1144 0.394 270 +272 4 354.5588 385.3953 43.0825 0.394 271 +273 4 353.488 384.9983 42.901 0.394 272 +274 4 352.5522 384.408 42.1901 0.3686 273 +275 4 351.8544 383.5054 42.0039 0.3686 274 +276 4 351.0364 382.7046 41.9941 0.3686 275 +277 4 350.0514 382.1235 41.9692 0.3813 276 +278 4 348.9372 381.8729 41.7981 0.3686 277 +279 4 347.8915 381.5148 41.0754 0.3432 278 +280 4 346.8608 381.0264 40.8797 0.3051 279 +281 4 345.9639 380.3239 40.8766 0.2648 280 +282 4 345.0224 379.6764 40.8626 0.25 281 +283 4 344.0122 379.1399 40.7929 0.2245 282 +284 4 343.0581 378.5313 40.5518 0.2034 283 +285 4 342.2688 377.7213 40.1178 0.2104 284 +286 4 341.4279 376.9674 39.8028 0.2513 285 +287 4 340.4212 376.4286 39.76 0.2949 286 +288 4 339.3562 376.0111 39.76 0.3001 287 +289 4 338.2854 375.6107 39.76 0.2722 288 +290 4 337.2489 375.137 39.76 0.2466 289 +291 4 336.3589 374.4289 39.76 0.2749 290 +292 4 335.637 373.5412 39.76 0.3105 291 +293 4 334.9495 372.6283 39.76 0.3278 292 +294 4 334.183 371.7806 39.7594 0.3178 293 +295 4 333.3158 371.0381 39.7572 0.3288 294 +296 4 332.3549 370.4192 39.7446 0.3769 295 +297 4 331.331 369.9113 39.6673 0.4124 296 +298 4 330.3048 369.4239 39.3896 0.4237 297 +299 4 329.329 368.8553 38.9385 0.3883 298 +300 4 328.3875 368.2181 38.6702 0.36 299 +301 4 327.4757 367.5283 38.64 0.3247 300 +302 4 326.6154 366.7756 38.6406 0.2964 301 +303 4 325.7117 366.08 38.6445 0.2639 302 +304 4 324.6924 365.5663 38.6669 0.2572 303 +305 4 323.6216 365.1682 38.7755 0.276 304 +306 4 322.5565 364.7713 39.088 0.3112 305 +307 4 321.5006 364.3663 39.5066 0.3397 306 +308 4 320.4561 363.9178 39.7051 0.3811 307 +309 4 319.51 363.2875 39.6326 0.4356 308 +310 4 318.7321 362.4615 39.3523 0.4863 309 +311 4 318.0572 361.5498 38.985 0.4924 310 +312 4 317.3879 360.6266 38.8388 0.4764 311 +313 4 316.6947 359.7171 38.9099 0.4609 312 +314 4 315.9762 358.8305 39.0729 0.4736 313 +315 4 315.212 357.9919 39.4201 0.4864 314 +316 4 314.417 357.1785 39.6676 0.4957 315 +317 4 313.6425 356.34 39.5324 0.4921 316 +318 4 312.9046 355.4786 39.1768 0.4725 317 +319 4 312.1381 354.6469 38.8032 0.4343 318 +320 4 311.2538 353.9307 38.6481 0.3995 319 +321 4 310.2517 353.3919 38.6378 0.3887 320 +322 4 309.1534 353.0899 38.6254 0.4144 321 +323 4 308.0186 352.9492 38.5529 0.436 322 +324 4 306.91 352.7192 38.3054 0.441 323 +325 4 305.8781 352.2662 37.8907 0.4282 324 +326 4 304.9424 351.6267 37.5911 0.4276 325 +327 4 304.1255 350.8328 37.5203 0.449 326 +328 4 303.4185 349.9336 37.5214 0.4617 327 +329 4 302.7722 348.9909 37.527 0.4662 328 +330 4 302.2025 348.0002 37.5575 0.4617 329 +331 4 301.6842 346.9821 37.6844 0.4745 330 +332 4 301.1019 346.0085 38.0041 0.483 331 +333 4 300.4453 345.0876 38.4062 0.4745 332 +334 4 299.76 344.1758 38.6131 0.4404 333 +335 4 299.0702 343.2641 38.631 0.3896 334 +336 4 298.3644 342.3637 38.598 0.3473 335 +337 4 297.6002 341.5183 38.463 0.3435 336 +338 4 296.7124 340.8228 38.1265 0.3953 337 +339 4 295.7171 340.2851 37.7236 0.4673 338 +340 4 294.6933 339.784 37.5374 0.513 339 +341 4 293.6694 339.2738 37.52 0.5166 340 +342 4 292.681 338.7006 37.52 0.5084 341 +343 4 291.752 338.0348 37.52 0.513 342 +344 4 290.8826 337.2924 37.52 0.5212 343 +345 4 290.0601 336.4973 37.52 0.5074 344 +346 4 289.265 335.6748 37.52 0.4646 345 +347 4 288.5134 334.8133 37.5194 0.4138 346 +348 4 287.8498 333.8833 37.5166 0.372 347 +349 4 287.2206 332.9292 37.5049 0.3559 348 +350 4 286.5079 332.0368 37.4452 0.3606 349 +351 4 285.7312 331.204 37.2263 0.3733 350 +352 4 284.9201 330.4204 36.7702 0.3766 351 +353 4 284.046 329.726 36.1777 0.3734 352 +354 4 283.1034 329.1368 35.5334 0.3909 353 +355 4 282.1161 328.63 34.86 0.4308 354 +356 4 281.1277 328.0981 34.3644 0.4703 355 +357 4 280.169 327.4803 34.1827 0.4703 356 +358 4 279.2367 326.8191 34.16 0.4606 357 +359 4 278.3226 326.1304 34.16 0.4693 358 +360 4 277.4177 325.4302 34.16 0.5182 359 +361 4 276.4808 324.7759 34.16 0.5436 360 +362 4 275.5072 324.1753 34.16 0.5347 361 +363 4 274.5737 323.5221 34.16 0.4859 362 +364 4 273.7786 322.7075 34.16 0.4552 363 +365 4 273.1003 321.7855 34.16 0.4322 364 +366 4 272.4528 320.8428 34.1592 0.4272 365 +367 4 271.7881 319.9127 34.1555 0.4245 366 +368 4 271.0456 319.0456 34.1379 0.4372 367 +369 4 270.1819 318.302 34.0435 0.4398 368 +370 4 269.2244 317.6911 33.7641 0.4219 369 +371 4 268.1856 317.269 33.3589 0.391 370 +372 4 267.0645 317.1317 33.0954 0.3794 371 +373 4 265.9331 317.0367 33.0324 0.3829 372 +374 4 264.9195 316.5745 32.9958 0.3802 373 +375 4 264.0466 315.8412 32.8037 0.388 374 +376 4 263.112 315.2223 32.4044 0.3994 375 +377 4 262.0618 314.7991 32.058 0.4073 376 +378 4 261.0208 314.3415 31.9348 0.3695 377 +379 4 260.1204 313.6562 31.92 0.3432 378 +380 4 259.4283 312.7547 31.92 0.3683 379 +381 4 258.925 311.732 31.92 0.4319 380 +382 4 258.576 310.644 31.92 0.4703 381 +383 4 258.2397 309.5527 31.92 0.4449 382 +384 4 257.7192 308.5437 31.92 0.4003 383 +385 4 256.9813 307.6777 31.9203 0.3749 384 +386 4 256.0901 306.9684 31.9208 0.375 385 +387 4 255.0994 306.3998 31.9236 0.3878 386 +388 4 254.0698 305.9022 31.9413 0.407 387 +389 4 253.062 305.3668 32.048 0.4324 388 +390 4 252.1319 304.7216 32.373 0.4384 389 +391 4 251.2499 304.0134 32.7981 0.4192 390 +392 4 250.3518 303.3144 33.0142 0.3871 391 +393 4 249.432 302.6349 33.0403 0.3686 392 +394 4 248.4917 301.984 33.0408 0.3621 393 +395 4 247.5948 301.2793 33.045 0.3691 394 +396 4 246.913 300.3812 33.073 0.3813 395 +397 4 246.5412 299.3162 33.2626 0.3813 396 +398 4 246.3959 298.1962 33.6736 0.3745 397 +399 4 246.2277 297.0785 34.0158 0.3821 398 +400 4 245.8296 296.018 34.0626 0.4279 399 +401 4 245.2439 295.0468 33.7896 0.478 400 +402 4 244.5723 294.1384 33.353 0.5024 401 +403 4 243.8116 293.2964 33.0775 0.4948 402 +404 4 242.9513 292.5471 32.9596 0.4694 403 +405 4 242.0189 291.8996 32.6813 0.4303 404 +406 4 241.0934 291.2532 32.2445 0.3931 405 +407 4 240.2594 290.4868 31.9768 0.3744 406 +408 4 239.5227 289.6139 31.922 0.3823 407 +409 4 238.8249 288.7078 31.92 0.4077 408 +410 4 238.0904 287.8315 31.92 0.4401 409 +411 4 237.2805 287.0262 31.9197 0.4782 410 +412 4 236.4305 286.2608 31.9192 0.4957 411 +413 4 235.5988 285.4749 31.9164 0.4888 412 +414 4 234.7854 284.6707 31.906 0.4693 413 +415 4 233.9663 283.8722 31.8637 0.4645 414 +416 4 233.114 283.1171 31.6534 0.484 415 +417 4 232.2091 282.4399 31.2385 0.4957 416 +418 4 231.2299 281.8747 30.903 0.4888 417 +419 4 230.1797 281.4274 30.8031 0.4555 418 +420 4 229.134 280.9675 30.7997 0.4253 419 +421 4 228.1502 280.3887 30.7994 0.4057 420 +422 4 227.2796 279.6542 30.7975 0.3871 421 +423 4 226.5726 278.7631 30.7852 0.3607 422 +424 4 225.9 277.8387 30.7269 0.3432 423 +425 4 225.0648 277.0894 30.4416 0.3708 424 +426 4 224.0375 276.6547 30.0476 0.4285 425 +427 4 222.9462 276.3401 30.0675 0.4576 426 +428 4 221.9028 275.9088 30.4612 0.4299 427 +429 4 220.9075 275.3619 30.7292 0.386 428 +430 4 219.9935 274.6836 30.7406 0.3756 429 +431 4 219.3174 273.7912 30.5004 0.3954 430 +432 4 218.9639 272.7319 30.0583 0.3926 431 +433 4 218.6756 271.6359 29.7497 0.3742 432 +434 4 218.1597 270.6292 29.68 0.3615 433 +435 4 217.3692 269.8204 29.68 0.3993 434 +436 4 216.375 269.2782 29.6797 0.4395 435 +437 4 215.358 268.7622 29.6786 0.4595 436 +438 4 214.4645 268.0586 29.6713 0.4555 437 +439 4 213.7633 267.1652 29.6344 0.4671 438 +440 4 213.102 266.2363 29.4742 0.4904 439 +441 4 212.363 265.3851 29.05 0.4957 440 +442 4 211.5565 264.5912 28.6854 0.4658 441 +443 4 210.7317 263.8007 28.5928 0.4149 442 +444 4 209.9251 262.9907 28.6689 0.3566 443 +445 4 209.1186 262.1876 28.9489 0.3154 444 +446 4 208.208 261.5184 29.2177 0.3051 445 +447 4 207.2264 260.9624 28.954 0.3281 446 +448 4 206.2678 260.3938 28.3296 0.3662 447 +449 4 205.316 259.8035 27.764 0.389 448 +450 4 204.387 259.1515 27.4935 0.4018 449 +451 4 203.5393 258.3873 27.4383 0.399 450 +452 4 202.7751 257.5373 27.4187 0.394 451 +453 4 202.0567 256.6484 27.3255 0.3784 452 +454 4 201.3028 255.8007 27.0217 0.3686 453 +455 4 200.4666 255.0342 26.6798 0.3686 454 +456 4 199.5388 254.3856 26.7848 0.3686 455 +457 4 198.6018 253.7381 27.0346 0.3445 456 +458 4 197.7427 253.007 26.7708 0.3062 457 +459 4 196.8904 252.2692 26.2962 0.276 458 +460 4 195.9317 251.6834 25.8591 0.2834 459 +461 4 194.9387 251.148 25.4038 0.3091 460 +462 4 194.099 250.3987 25.2151 0.3433 461 +463 4 193.4184 249.4824 25.1972 0.3559 462 +464 4 192.7949 248.5237 25.1854 0.3644 463 +465 4 192.1577 247.5742 25.1272 0.3772 464 +466 4 191.4129 246.715 24.9248 0.3986 465 +467 4 190.5675 245.9634 24.5428 0.4068 466 +468 4 189.7267 245.2015 24.2012 0.3981 467 +469 4 189.0025 244.3241 24.0878 0.3766 468 +470 4 188.4191 243.3425 24.0755 0.3599 469 +471 4 187.8334 242.361 24.0565 0.3383 470 +472 4 187.06 241.5304 23.9554 0.3305 471 +473 4 186.1368 240.8784 23.6239 0.3394 472 +474 4 185.1907 240.2823 23.0392 0.3521 473 +475 4 184.2687 239.6577 22.4062 0.347 474 +476 4 183.3454 239.0182 21.8744 0.3163 475 +477 4 182.3982 238.4016 21.4458 0.2961 476 +478 4 181.459 237.7621 21.1324 0.3016 477 +479 4 180.625 236.9922 21.2453 0.3327 478 +480 4 179.8185 236.1971 21.6258 0.3525 479 +481 4 178.941 235.4741 21.9047 0.3652 480 +482 4 177.9709 234.8872 22.2057 0.3592 481 +483 4 176.8818 234.6493 22.636 0.3463 482 +484 4 175.7459 234.6138 22.9093 0.3139 483 +485 4 174.6408 234.3587 22.972 0.2851 484 +486 4 173.6649 233.7787 23.0171 0.2898 485 +487 4 172.7863 233.0522 23.2008 0.3227 486 +488 4 171.9089 232.3372 23.5858 0.3709 487 +489 4 171.0383 231.6097 23.9509 0.4117 488 +490 4 170.2055 230.8306 24.1494 0.4297 489 +491 4 169.3967 230.0298 24.4166 0.422 490 +492 4 168.5947 229.2336 24.8441 0.3991 491 +493 4 167.7779 228.4408 25.132 0.3838 492 +494 4 166.9119 227.696 25.1961 0.3813 493 +495 4 165.9486 227.0829 25.2 0.3504 494 +496 4 164.9179 226.5886 25.1997 0.3226 495 +497 4 163.9386 226.0006 25.1994 0.2865 496 +498 4 163.1699 225.1644 25.1975 0.2902 497 +499 4 162.5075 224.2332 25.1877 0.2924 498 +500 4 161.7662 223.3637 25.1462 0.3137 499 +501 4 160.9551 222.5629 24.92 0.3391 500 +502 4 160.1474 221.7724 24.4986 0.3645 501 +503 4 159.3226 220.9899 24.1842 0.3792 502 +504 4 158.4005 220.3184 24.089 0.3813 503 +505 4 157.4052 219.7544 24.08 0.3813 504 +506 4 156.4763 219.0897 24.08 0.3704 505 +507 4 155.6309 218.321 24.08 0.3577 506 +508 4 154.7397 217.6048 24.08 0.3342 507 +509 4 153.7753 216.9905 24.08 0.3087 508 +510 4 152.7686 216.4482 24.0803 0.2831 509 +511 4 151.8202 215.811 24.0811 0.2796 510 +512 4 151.0194 214.9976 24.0853 0.3129 511 +513 4 150.2587 214.1431 24.1032 0.362 512 +514 4 149.4544 213.3308 24.1749 0.4019 513 +515 4 148.5964 212.5838 24.4712 0.4179 514 +516 4 147.727 211.8619 24.8931 0.4084 515 +517 4 146.9365 211.0428 25.1381 0.3621 516 +518 4 146.2307 210.1448 25.0807 0.2887 517 +519 4 145.4665 209.3154 24.6375 0.2345 518 +520 4 144.525 208.7308 23.9929 0.2288 519 +521 4 143.4782 208.2812 23.8067 0.2863 520 +522 4 142.4955 207.7001 23.9106 0.3387 521 +523 4 141.6775 206.9118 23.6776 0.3899 522 +524 4 140.9751 206.0264 23.2506 0.394 523 +525 4 140.3082 205.102 23.0317 0.3823 524 +526 4 139.6904 204.1399 23.0759 0.3578 525 +527 4 139.028 203.2236 23.4875 0.3441 526 +528 4 138.2261 202.4285 23.9173 0.3195 527 +529 4 137.2686 201.8085 24.0394 0.3059 528 +530 4 136.279 201.2365 23.9515 0.2932 529 +531 4 135.3638 200.5729 23.5306 0.3282 530 +532 4 134.5401 199.7859 23.3173 0.3305 531 +533 4 133.8194 198.8981 23.2876 0.3305 532 +534 4 133.1467 197.9898 22.8595 0.2823 533 +535 4 132.5736 197.0346 22.2306 0.2556 534 +536 4 131.8849 196.1308 21.9187 0.2058 535 +537 4 130.9319 195.505 21.9433 0.2034 536 +538 4 130.0019 194.8747 22.4608 0.2034 537 +539 4 129.3052 193.9835 22.8472 0.2651 538 +540 4 128.6371 193.0546 22.8894 0.2793 539 +541 4 128.2092 192.0021 22.5851 0.3169 540 +542 4 127.9427 190.9691 23.571 0.3178 541 +543 4 127.0492 190.309 24.2091 0.4576 542 +544 4 126.3559 189.8857 23.1672 0.3814 543 +545 4 125.5185 189.1124 22.9373 0.3559 544 +546 4 124.7212 188.2932 22.8298 0.3559 545 +547 4 123.9936 187.4318 22.3429 0.3559 546 +548 4 123.2568 186.6573 21.3503 0.3559 547 +549 4 122.3794 185.9606 20.7827 0.3559 548 +550 4 121.5603 185.1633 20.7211 0.394 549 +551 4 120.7561 184.3499 20.72 0.4449 550 +552 4 119.9678 183.5193 20.72 0.4322 551 +553 4 119.2826 182.6041 20.72 0.394 552 +554 4 118.5481 181.7267 20.72 0.3432 553 +555 4 117.7073 180.9511 20.72 0.3686 554 +556 4 116.7715 180.2933 20.72 0.3686 555 +557 4 115.9558 179.4913 20.72 0.3559 556 +558 4 115.3026 178.5521 20.72 0.3178 557 +559 4 114.7718 177.5385 20.72 0.3178 558 +560 4 113.9426 176.7503 20.7206 0.3305 559 +561 4 113.1704 176.2057 20.7239 0.3827 560 +562 4 112.2468 175.5308 20.7393 0.3836 561 +563 4 111.3422 174.8318 20.8261 0.3501 562 +564 4 110.4583 174.1122 21.063 0.312 563 +565 4 109.5664 173.4007 21.2691 0.2632 564 +566 4 108.6763 172.6857 21.4334 0.2017 565 +567 4 107.8196 171.9283 21.4046 0.1586 566 +568 4 106.9002 171.3209 20.7239 0.1416 567 +569 4 105.8424 170.9228 20.4058 0.1622 568 +570 4 104.7627 170.5464 20.3899 0.1765 569 +571 4 103.6407 170.3313 20.4075 0.2009 570 +572 4 102.516 170.194 20.7738 0.2264 571 +573 4 101.4505 169.8257 21.2038 0.2752 572 +574 4 100.4498 169.2754 21.1982 0.303 573 +575 4 99.4651 168.7068 20.8967 0.2934 574 +576 4 98.4155 168.2595 20.7446 0.2453 575 +577 4 97.289 168.0753 20.7354 0.2059 576 +578 4 96.1939 167.7482 20.8124 0.2034 577 +579 4 95.1674 167.2585 21.0865 0.1914 578 +580 4 94.0562 166.9988 20.9818 0.1786 579 +581 4 92.9713 166.6465 20.7757 0.1535 580 +582 4 92.0816 165.9326 20.778 0.1773 581 +583 4 91.1472 165.2863 21.0918 0.2274 582 +584 4 90.2014 164.6433 21.1851 0.2908 583 +585 4 89.3954 163.846 21.5404 0.3172 584 +586 4 88.3424 163.4101 21.7148 0.3178 585 +587 4 87.227 163.2374 21.2702 0.3052 586 +588 4 86.1868 162.7981 20.8211 0.3303 587 +589 4 85.2756 162.1082 20.7228 0.3557 588 +590 4 84.4582 161.3086 20.7175 0.3559 589 +591 4 83.696 160.4552 20.7091 0.2929 590 +592 4 83.4217 159.3455 20.6192 0.2035 591 +593 4 83.7408 158.3296 19.6 0.1144 592 +594 4 112.9716 175.9987 21.6857 0.3463 560 +595 4 112.3254 175.0755 21.84 0.294 594 +596 4 112.0351 173.9818 21.8406 0.2397 595 +597 4 111.7511 172.8744 21.8431 0.2185 596 +598 4 111.0932 171.9581 21.8627 0.2582 597 +599 4 110.3967 171.0532 22.0038 0.3204 598 +600 4 109.939 170.0224 22.3846 0.3521 599 +601 4 109.4909 168.9837 22.787 0.3559 600 +602 4 108.7492 168.1268 22.9446 0.3559 601 +603 4 107.7769 167.5342 22.9639 0.3783 602 +604 4 106.7066 167.1361 22.9849 0.3925 603 +605 4 105.6133 166.8055 23.1213 0.4053 604 +606 4 104.5667 166.3731 23.5024 0.3954 605 +607 4 103.6127 165.7645 23.8829 0.3827 606 +608 4 102.7241 165.0472 23.9728 0.3358 607 +609 4 101.7701 164.418 23.9137 0.2962 608 +610 4 100.76 163.8826 23.9557 0.2694 609 +611 4 99.829 163.2213 24.0495 0.2555 610 +612 4 98.9531 162.4858 24.0951 0.2312 611 +613 4 97.9642 161.916 24.1878 0.2172 612 +614 4 96.8823 161.5969 24.6061 0.2044 613 +615 4 95.7951 161.2857 25.0331 0.2034 614 +616 4 94.9175 160.5684 25.1849 0.1914 615 +617 4 94.1179 159.7504 25.1994 0.2027 616 +618 4 93.2906 158.9599 25.2 0.2154 617 +619 4 92.5872 158.0585 25.2 0.2161 618 +620 4 92.0293 157.0609 25.2006 0.204 619 +621 4 91.4189 156.0931 25.2025 0.1793 620 +622 4 90.652 155.2454 25.2106 0.1658 621 +623 4 89.7715 154.5166 25.2552 0.1409 622 +624 4 88.9659 153.733 25.7701 0.1277 623 +625 4 87.8592 153.7536 26.32 0.1144 624 +626 4 127.3878 189.7118 21.6006 0.2342 543 +627 4 127.7791 188.9911 20.5702 0.1568 626 +628 4 127.977 187.9134 21.2559 0.1217 627 +629 4 128.1051 186.8083 21.7804 0.1144 628 +630 4 128.6794 185.9137 21.8638 0.121 629 +631 4 129.6392 185.8794 21.0445 0.1349 630 +632 4 130.5315 186.4777 20.2124 0.1478 631 +633 4 131.4742 187.0943 19.9343 0.144 632 +634 4 132.4946 187.1309 20.6651 0.1303 633 +635 4 133.2954 186.512 21.8061 0.1173 634 +636 4 133.9818 185.6346 21.8011 0.1144 635 +637 4 134.8513 185.0283 20.8659 0.1144 636 +638 4 135.9129 184.6473 20.5862 0.1144 637 +639 4 136.6863 183.8316 20.683 0.1144 638 +640 4 137.145 182.7883 20.7085 0.1144 639 +641 4 137.2182 181.6523 20.6573 0.1144 640 +642 4 136.3385 180.9911 20.3974 0.1144 641 +643 4 135.4496 181.6672 20.72 0.1144 642 +644 4 346.4764 380.3869 43.5758 0.1526 280 +645 4 346.1401 379.5426 45.2712 0.1271 644 +646 4 345.5555 378.561 45.418 0.1145 645 +647 4 344.6986 377.8209 45.7789 0.1273 646 +648 4 343.6267 377.6069 46.5976 0.1401 647 +649 4 342.5639 377.3553 47.4032 0.1652 648 +650 4 341.7563 376.6631 48.4263 0.1657 649 +651 4 340.8926 375.9401 48.9006 0.1775 650 +652 4 339.8858 375.4539 49.4724 0.1652 651 +653 4 338.8448 375.2549 50.521 0.1646 652 +654 4 337.7809 375.2446 51.5494 0.1538 653 +655 4 336.7067 375.3018 52.498 0.1798 654 +656 4 335.6164 375.5054 53.1698 0.2175 655 +657 4 334.5182 375.82 53.2846 0.2408 656 +658 4 333.3879 375.971 53.3708 0.2259 657 +659 4 332.2542 375.8841 53.5382 0.1885 658 +660 4 331.1445 376.1586 53.6413 0.164 659 +661 4 330.0486 376.4652 53.7569 0.1525 660 +662 4 328.94 376.511 54.3987 0.1525 661 +663 4 327.8418 376.3199 55.0214 0.1506 662 +664 4 326.7184 376.2273 55.4316 0.1374 663 +665 4 325.5847 376.2078 55.2255 0.1246 664 +666 4 324.4853 376.3691 54.565 0.1144 665 +667 4 323.3916 376.6151 54.0952 0.1144 666 +668 4 322.3426 377.059 54.04 0.1178 667 +669 4 321.3324 377.5703 54.0921 0.1376 668 +670 4 320.3829 378.0165 54.5496 0.1834 669 +671 4 319.6828 378.7521 55.2241 0.2432 670 +672 4 318.5948 379.0701 55.1312 0.2669 671 +673 4 317.5755 379.5655 55.1396 0.2571 672 +674 4 316.7004 380.0677 53.9636 0.2542 673 +675 4 315.8458 380.7266 54.3424 0.2757 674 +676 4 315.1228 381.5995 54.5124 0.268 675 +677 4 314.2248 382.1658 53.5601 0.2551 676 +678 4 313.4377 382.9483 52.9217 0.2063 677 +679 4 312.4813 383.5695 52.8906 0.1668 678 +680 4 311.8544 384.0408 54.88 0.1144 679 +681 4 379.3618 398.12 45.3169 0.2171 202 +682 4 379.0438 397.0847 45.0506 0.2155 681 +683 4 379.204 396.0288 44.1857 0.2288 682 +684 4 379.7725 395.1582 43.4168 0.242 683 +685 4 380.5825 394.6011 42.2982 0.2474 684 +686 4 381.3993 394.1721 40.6588 0.2415 685 +687 4 382.3545 393.7099 39.8367 0.2347 686 +688 4 383.431 393.3495 39.5895 0.2219 687 +689 4 384.4595 392.9491 39.004 0.2092 688 +690 4 385.3999 392.4458 37.9982 0.2034 689 +691 4 386.3791 391.9493 37.3512 0.2242 690 +692 4 387.4007 391.4436 37.1232 0.2623 691 +693 4 388.3937 390.9014 36.7441 0.2796 692 +694 4 389.294 390.2344 36.2533 0.2655 693 +695 4 389.9873 389.3638 35.758 0.24 694 +696 4 390.5776 388.4029 35.299 0.2288 695 +697 4 391.3613 387.6158 34.8804 0.2288 696 +698 4 392.3371 387.0564 34.433 0.2215 697 +699 4 393.345 386.5301 34.1835 0.2161 698 +700 4 394.3299 385.9501 34.088 0.2087 699 +701 4 395.3492 385.4616 33.7744 0.2186 700 +702 4 396.3216 384.964 33.0114 0.2441 701 +703 4 397.2483 384.3794 32.2218 0.2931 702 +704 4 398.1486 383.6987 31.9332 0.3256 703 +705 4 399.0215 382.9597 31.9052 0.3227 704 +706 4 399.8188 382.144 31.8102 0.2858 705 +707 4 400.2341 381.1465 31.2612 0.2669 706 +708 4 400.3554 380.1272 30.0684 0.2669 707 +709 4 400.8393 379.1811 29.3429 0.2572 708 +710 4 401.5474 378.2911 29.3877 0.2345 709 +711 4 402.4878 377.6767 29.2006 0.2184 710 +712 4 403.5574 377.8335 28.6961 0.2384 711 +713 4 404.5756 378.3048 28.1753 0.2415 712 +714 4 405.6704 378.2339 27.5688 0.2534 713 +715 4 406.6325 377.6756 26.9805 0.2662 714 +716 4 407.5752 377.0532 26.5255 0.2909 715 +717 4 408.3783 376.2444 26.3754 0.3044 716 +718 4 409.0132 375.2972 26.5356 0.2809 717 +719 4 409.6881 374.3877 26.9416 0.2555 718 +720 4 410.3642 373.4702 26.7484 0.2421 719 +721 4 411.0804 372.5882 26.4272 0.278 720 +722 4 411.8411 371.7348 26.3301 0.3283 721 +723 4 412.5241 370.8173 26.3203 0.3792 722 +724 4 413.151 369.8609 26.3197 0.3934 723 +725 4 413.9667 369.0601 26.3189 0.3818 724 +726 4 414.9768 368.5259 26.3144 0.3445 725 +727 4 416.0591 368.1586 26.2828 0.3186 726 +728 4 417.0738 367.6358 26.1223 0.3302 727 +729 4 417.9432 366.9574 25.3898 0.3305 728 +730 4 418.3802 365.9656 24.5244 0.3305 729 +731 4 418.4272 364.9268 23.3587 0.293 730 +732 4 418.2281 363.8114 22.9908 0.2924 731 +733 4 418.3208 362.672 22.9393 0.2924 732 +734 4 418.7623 361.6184 22.8326 0.267 733 +735 4 419.2154 360.5934 22.265 0.229 734 +736 4 420.0676 359.8315 22.2432 0.1781 735 +737 4 421.1956 359.6782 22.4848 0.1652 736 +738 4 422.136 359.6736 24.08 0.1144 737 +739 4 380.0368 399.0386 46.48 0.4576 200 +740 4 392.4503 408.7638 48.701 0.4322 186 +741 4 391.5546 409.4754 48.6262 0.4068 740 +742 4 390.7446 410.2704 48.274 0.394 741 +743 4 390.1292 410.815 46.3336 0.2555 742 +744 4 389.5457 411.5094 44.688 0.1694 743 +745 4 389.1991 412.4726 43.5781 0.1525 744 +746 4 388.92 413.5411 42.8999 0.1674 745 +747 4 388.6465 414.6211 42.2834 0.178 746 +748 4 388.7552 415.669 41.421 0.1615 747 +749 4 389.3947 416.5498 40.8906 0.144 748 +750 4 390.0983 417.4364 40.5482 0.1578 749 +751 4 390.295 418.4924 39.94 0.2126 750 +752 4 390.0617 419.562 39.2101 0.2958 751 +753 4 389.8558 420.6591 38.6232 0.3664 752 +754 4 389.9679 421.7596 38.0198 0.4112 753 +755 4 390.3271 422.7846 37.1792 0.3796 754 +756 4 390.835 423.7765 36.5828 0.3281 755 +757 4 391.3246 424.8061 36.5327 0.2767 756 +758 4 391.3761 425.9284 36.4353 0.2669 757 +759 4 391.089 426.879 35.1607 0.2556 758 +760 4 390.7996 427.7336 33.4407 0.2428 759 +761 4 390.4518 428.7083 32.2736 0.2299 760 +762 4 390.3591 429.834 31.983 0.2407 761 +763 4 390.5433 430.9608 32.0734 0.2534 762 +764 4 390.8053 432.0739 32.0765 0.2781 763 +765 4 391.1645 433.1562 31.8752 0.2796 764 +766 4 391.4116 434.2601 31.4672 0.2676 765 +767 4 391.4871 435.3835 30.9809 0.2549 766 +768 4 391.5843 436.5172 30.686 0.2662 767 +769 4 391.7548 437.6212 30.091 0.3033 768 +770 4 391.7399 438.7492 29.636 0.3051 769 +771 4 391.5168 439.8463 30.1574 0.2683 770 +772 4 391.3052 440.9617 30.4965 0.2178 771 +773 4 391.3796 442.0736 29.8945 0.2161 772 +774 4 391.3166 443.1547 28.9971 0.2409 773 +775 4 390.8613 444.2003 28.8926 0.2541 774 +776 4 390.5994 445.302 29.2936 0.2416 775 +777 4 390.5319 446.4071 28.6017 0.2415 776 +778 4 390.342 447.5305 28.3536 0.2668 777 +779 4 389.8374 448.5544 28.5309 0.2924 778 +780 4 389.6132 449.6767 28.5538 0.3051 779 +781 4 389.3478 450.7886 28.5211 0.3051 780 +782 4 389.2586 451.9269 28.3212 0.3051 781 +783 4 389.5331 452.9931 27.5587 0.3051 782 +784 4 389.953 454.041 27.1152 0.2924 783 +785 4 390.096 455.1747 26.9539 0.2669 784 +786 4 390.0708 456.3096 27.2908 0.2288 785 +787 4 389.8741 457.4147 26.7512 0.2034 786 +788 4 389.6098 458.5152 27.1622 0.1907 787 +789 4 389.2243 459.8663 26.3494 0.2465 788 +790 4 388.8685 460.9096 25.5976 0.2748 789 +791 4 388.8856 462.0227 25.1664 0.3004 790 +792 4 389.2254 463.0981 24.7836 0.2947 791 +793 4 389.6384 464.1162 24.0285 0.2715 792 +794 4 389.9141 465.1859 23.315 0.235 793 +795 4 389.7768 466.3036 23.1669 0.218 794 +796 4 389.8386 467.4327 23.4486 0.238 795 +797 4 389.969 468.5584 23.1613 0.2747 796 +798 4 389.81 469.6806 22.9076 0.2796 797 +799 4 389.7688 470.8166 22.6212 0.235 798 +800 4 390.0033 471.9183 22.1945 0.1951 799 +801 4 390.0697 473.0406 22.58 0.1786 800 +802 4 389.3741 473.8711 23.3666 0.1902 801 +803 4 388.658 474.7497 23.5922 0.191 802 +804 4 388.5836 475.8834 23.7726 0.2034 803 +805 4 388.1775 476.9119 24.4751 0.2034 804 +806 4 387.6696 477.9106 24.9782 0.2034 805 +807 4 387.3881 479.0145 25.1429 0.2099 806 +808 4 387.2623 480.1482 25.0096 0.2481 807 +809 4 387.2749 481.2831 24.8349 0.2796 808 +810 4 387.5826 482.3813 24.9421 0.2699 809 +811 4 388.0459 483.4224 25.1451 0.2166 810 +812 4 388.6225 484.4096 25.2109 0.1578 811 +813 4 389.1659 485.4038 25.279 0.1246 812 +814 4 389.4187 486.5169 25.4892 0.1144 813 +815 4 389.7448 487.5957 25.5598 0.1199 814 +816 4 390.3786 488.5441 25.3453 0.1486 815 +817 4 390.9254 489.5405 25.2392 0.1957 816 +818 4 391.2434 490.6364 25.3142 0.2662 817 +819 4 391.4104 491.7621 25.5388 0.3112 818 +820 4 391.4002 492.8935 25.8821 0.3184 819 +821 4 391.1816 494.0067 26.1274 0.2674 820 +822 4 390.8876 495.1026 26.0982 0.2194 821 +823 4 390.8705 496.2375 26.2539 0.197 822 +824 4 390.835 497.3426 26.7949 0.2225 823 +825 4 390.4472 498.4065 26.7924 0.2512 824 +826 4 389.8489 499.3709 26.4802 0.2796 825 +827 4 389.2208 500.3204 26.5854 0.2764 826 +828 4 388.6099 501.2642 27.0738 0.2604 827 +829 4 388.0928 502.2675 27.1432 0.235 828 +830 4 387.8446 503.3657 26.7176 0.2161 829 +831 4 387.7405 504.4948 26.6395 0.2194 830 +832 4 387.5998 505.6125 26.9097 0.2422 831 +833 4 387.6753 506.7371 26.5818 0.2898 832 +834 4 388.0002 507.8273 26.3141 0.3212 833 +835 4 388.3914 508.8992 26.1254 0.3271 834 +836 4 388.8033 509.9517 25.7118 0.3076 835 +837 4 389.2174 511.0008 25.289 0.2727 836 +838 4 389.5755 512.0864 25.2039 0.2439 837 +839 4 389.9953 513.1401 25.2 0.2195 838 +840 4 390.6291 514.0919 25.2 0.2322 839 +841 4 391.2114 515.0757 25.2003 0.2521 840 +842 4 391.86 515.9852 25.2011 0.2869 841 +843 4 392.7775 516.667 25.2056 0.3199 842 +844 4 393.6058 517.4518 25.2263 0.3744 843 +845 4 394.3837 518.2846 25.3154 0.4307 844 +846 4 395.2978 518.9481 25.5948 0.4576 845 +847 4 396.3285 519.408 25.8216 0.4459 846 +848 4 397.3924 519.7981 25.4624 0.4156 847 +849 4 398.4952 520.0372 25.2025 0.4068 848 +850 4 399.6392 520.0544 25.2126 0.4028 849 +851 4 400.781 520.0178 25.2834 0.3781 850 +852 4 401.9101 519.9171 25.5906 0.3271 851 +853 4 403.0175 519.9057 26.1069 0.2841 852 +854 4 404.1317 520.1345 26.3208 0.2669 853 +855 4 405.2231 520.417 26.3948 0.2617 854 +856 4 406.1841 520.9913 26.9097 0.2446 855 +857 4 407.1096 521.537 26.199 0.219 856 +858 4 407.8612 522.0827 24.5846 0.2043 857 +859 4 408.4103 523.0139 25.1924 0.1914 858 +860 4 408.9136 524.0378 25.2115 0.1907 859 +861 4 409.147 525.1555 25.2067 0.1781 860 +862 4 408.8656 526.24 25.76 0.1144 861 +863 4 390.6039 411.3389 48.1779 0.3566 742 +864 4 390.5547 412.46 47.6462 0.3559 863 +865 4 390.4952 413.5674 46.9557 0.331 864 +866 4 390.231 414.6691 46.571 0.293 865 +867 4 389.9942 415.7879 46.548 0.2672 866 +868 4 390.0457 416.9194 46.9353 0.2921 867 +869 4 390.0331 418.0462 47.4169 0.3176 868 +870 4 389.7322 419.1456 47.2021 0.3556 869 +871 4 389.2723 420.1649 46.6166 0.3685 870 +872 4 388.8056 421.2025 46.3445 0.3686 871 +873 4 388.3777 422.1829 45.3513 0.356 872 +874 4 388.0368 423.2731 45.2281 0.3432 873 +875 4 387.387 424.2146 45.192 0.3305 874 +876 4 386.7326 425.1253 44.6359 0.3178 875 +877 4 386.0245 426.0107 44.268 0.3178 876 +878 4 385.282 426.8813 44.2333 0.3432 877 +879 4 384.7741 427.9063 44.1997 0.3559 878 +880 4 384.567 429.0275 43.9858 0.3432 879 +881 4 384.265 430.0685 43.0884 0.3051 880 +882 4 383.685 430.9299 41.916 0.2669 881 +883 4 382.7515 431.4745 40.9998 0.2288 882 +884 4 381.8031 432.1128 40.873 0.2161 883 +885 4 381.047 432.9708 40.8422 0.2415 884 +886 4 380.4887 433.2786 40.5574 0.2247 885 +887 4 379.4671 433.7396 40.2447 0.1924 886 +888 4 378.402 434.1034 40.4729 0.1614 887 +889 4 377.5211 434.8024 40.7344 0.1486 888 +890 4 376.8496 435.7096 40.4844 0.1398 889 +891 4 376.2479 436.6213 39.6752 0.1438 890 +892 4 375.5924 437.4942 38.8623 0.1644 891 +893 4 375.065 438.4689 38.2553 0.1947 892 +894 4 374.6657 439.5111 37.7121 0.2034 893 +895 4 374.0686 440.472 37.5424 0.2034 894 +896 4 373.2918 441.3117 37.5435 0.2115 895 +897 4 372.5974 442.2052 37.7194 0.2369 896 +898 4 372.0585 443.2028 38.0089 0.2542 897 +899 4 371.4808 444.182 37.8302 0.2501 898 +900 4 370.8345 445.1132 37.4766 0.2374 899 +901 4 370.2762 446.0959 37.1406 0.2247 900 +902 4 369.8495 447.1324 36.6148 0.2161 901 +903 4 369.4273 448.1872 36.4098 0.2161 902 +904 4 368.9263 449.2133 36.37 0.2245 903 +905 4 368.471 450.2578 36.2093 0.2457 904 +906 4 367.9035 451.2405 35.999 0.2625 905 +907 4 367.1817 452.1168 36.1917 0.2796 906 +908 4 366.3363 452.8753 36.4896 0.2754 907 +909 4 365.516 453.6452 36.8309 0.2543 908 +910 4 364.8674 454.5581 37.3397 0.2246 909 +911 4 364.3045 455.5477 37.403 0.2119 910 +912 4 363.8412 456.591 37.2375 0.1992 911 +913 4 363.3882 457.6389 37.2792 0.1821 912 +914 4 362.974 458.6948 37.3859 0.1652 913 +915 4 362.4306 459.6134 37.0185 0.1794 914 +916 4 361.4697 460.2083 36.5907 0.2238 915 +917 4 360.5144 460.8261 36.4112 0.2768 916 +918 4 359.6862 461.58 36.0898 0.3051 917 +919 4 359.4162 462.5512 35.3545 0.2844 918 +920 4 359.4093 463.6552 35.3354 0.2298 919 +921 4 358.906 464.6047 35.8495 0.1869 920 +922 4 357.9954 465.2659 35.9901 0.1952 921 +923 4 357.1156 465.9798 35.791 0.2298 922 +924 4 356.4361 466.8836 35.9243 0.2505 923 +925 4 355.7062 467.7438 36.318 0.2359 924 +926 4 354.8608 468.4932 36.1474 0.2102 925 +927 4 353.8198 468.9164 36.0522 0.2131 926 +928 4 352.8805 469.5228 36.4081 0.2476 927 +929 4 351.9184 470.0822 35.9341 0.2866 928 +930 4 351.0536 470.8121 35.6325 0.3035 929 +931 4 350.1933 471.511 34.9625 0.2822 930 +932 4 349.3902 472.3187 34.9149 0.2453 931 +933 4 348.8262 473.3094 34.869 0.1949 932 +934 4 347.9053 473.9523 34.5229 0.1781 933 +935 4 347.1743 474.7257 33.5504 0.193 934 +936 4 346.465 475.6066 33.8506 0.2298 935 +937 4 345.496 476.1866 34.2919 0.2415 936 +938 4 344.5614 476.8341 34.4655 0.2369 937 +939 4 343.5009 477.2448 34.5794 0.2034 938 +940 4 342.4747 477.6623 34.8953 0.2034 939 +941 4 341.6087 478.3098 34.3902 0.2224 940 +942 4 340.8926 479.1964 34.4232 0.2482 941 +943 4 340.1581 480.0602 34.3064 0.2614 942 +944 4 339.2726 480.7511 34.1312 0.2669 943 +945 4 338.3163 481.3357 33.71 0.2595 944 +946 4 337.297 481.7956 33.3239 0.2384 945 +947 4 336.209 481.9844 33.8027 0.2114 946 +948 4 335.1874 482.4111 34.0138 0.1943 947 +949 4 334.2242 483.022 34.2079 0.2001 948 +950 4 333.2014 483.4475 33.7554 0.2134 949 +951 4 332.1387 483.8331 33.3715 0.2264 950 +952 4 331.0908 484.2072 33.8948 0.2392 951 +953 4 329.9891 484.3696 34.4868 0.2523 952 +954 4 328.8668 484.5652 34.51 0.2542 953 +955 4 327.9139 485.1326 33.9032 0.2186 954 +956 4 327.5272 486.0856 32.76 0.1144 955 +957 4 380.7495 433.8506 41.6178 0.2988 885 +958 4 380.7552 434.9763 41.2754 0.2784 957 +959 4 380.6797 436.0939 41.1158 0.2525 958 +960 4 380.3136 437.159 40.8867 0.2341 959 +961 4 380.0105 438.2161 40.213 0.2288 960 +962 4 379.816 439.3166 40.1349 0.2211 961 +963 4 379.5643 440.4263 40.311 0.208 962 +964 4 378.9569 441.3609 40.2483 0.1866 963 +965 4 378.2693 442.267 40.0428 0.178 964 +966 4 377.6744 443.2382 39.8028 0.1865 965 +967 4 377.1631 444.2552 39.5368 0.2079 966 +968 4 376.8256 445.3306 39.1524 0.2161 967 +969 4 376.4607 446.406 38.8755 0.2073 968 +970 4 375.9516 447.4138 39.1499 0.2034 969 +971 4 375.4528 448.4205 39.6634 0.2123 970 +972 4 374.9449 449.4021 40.3735 0.2344 971 +973 4 374.4003 450.3676 41.0598 0.2601 972 +974 4 373.85 451.3526 41.5148 0.2858 973 +975 4 373.492 452.4017 41.1093 0.2924 974 +976 4 373.4782 453.5182 41.3106 0.2714 975 +977 4 373.1808 454.6073 41.3417 0.2456 976 +978 4 372.9509 455.7067 40.8579 0.2309 977 +979 4 373.0653 456.8049 40.2142 0.2177 978 +980 4 373.079 457.9409 40.3046 0.2048 979 +981 4 372.7861 459.0392 40.1565 0.2034 980 +982 4 372.6546 460.1637 40.4922 0.2272 981 +983 4 372.9131 461.2196 39.7057 0.2534 982 +984 4 373.1064 462.3453 39.7205 0.2542 983 +985 4 372.7941 463.3966 40.4712 0.2542 984 +986 4 372.5413 464.5075 40.7011 0.2559 985 +987 4 372.3102 465.608 40.5672 0.2669 986 +988 4 371.8492 466.5655 39.6864 0.2693 987 +989 4 371.5357 467.6626 39.7804 0.2854 988 +990 4 371.3115 468.7792 39.674 0.3083 989 +991 4 371.2783 469.9072 39.9708 0.3143 990 +992 4 371.387 471.0168 40.5241 0.294 991 +993 4 371.2692 472.1311 40.9777 0.2591 992 +994 4 371.0793 473.2202 41.3644 0.2331 993 +995 4 370.9798 474.2772 42.3032 0.2115 994 +996 4 370.99 475.4018 42.3368 0.1987 995 +997 4 370.9683 476.5046 42.1912 0.1907 996 +998 4 370.648 477.5903 42.5166 0.1961 997 +999 4 370.5107 478.6004 41.8214 0.2096 998 +1000 4 370.9226 479.5248 41.256 0.2306 999 +1001 4 371.0953 480.5772 41.4971 0.2415 1000 +1002 4 371.0907 481.7121 41.3619 0.2415 1001 +1003 4 371.244 482.8286 40.922 0.2415 1002 +1004 4 371.4705 483.9417 40.7557 0.2495 1003 +1005 4 371.6147 485.0606 40.4323 0.2542 1004 +1006 4 371.9899 486.1119 40.2699 0.2372 1005 +1007 4 372.2793 487.1873 40.6913 0.201 1006 +1008 4 371.9464 488.2295 41.0458 0.1713 1007 +1009 4 371.3115 489.1149 40.4113 0.1549 1008 +1010 4 370.6034 489.9775 39.8076 0.1635 1009 +1011 4 370.0451 490.887 38.8237 0.177 1010 +1012 4 369.3004 491.7164 39.2557 0.1902 1011 +1013 4 369.4308 492.8123 39.6791 0.1907 1012 +1014 4 369.7911 493.8408 39.0852 0.1931 1013 +1015 4 369.615 494.9276 38.3692 0.2061 1014 +1016 4 369.4617 495.9366 37.2761 0.2233 1015 +1017 4 369.8884 496.8953 36.4006 0.2368 1016 +1018 4 370.4844 497.8539 36.489 0.2179 1017 +1019 4 370.7933 498.9236 36.5674 0.1803 1018 +1020 4 370.4615 499.8022 35.32 0.1652 1019 +1021 4 369.7957 500.6567 34.9129 0.1746 1020 +1022 4 369.2729 501.6246 34.328 0.178 1021 +1023 4 369.1985 502.7216 33.7725 0.158 1022 +1024 4 369.3907 503.8165 33.1489 0.1311 1023 +1025 4 369.4914 504.9456 33.266 0.1271 1024 +1026 4 368.9652 505.9294 33.0036 0.1507 1025 +1027 4 368.0694 506.5838 32.3845 0.2002 1026 +1028 4 367.6633 507.5802 31.6674 0.2426 1027 +1029 4 368.384 508.4508 31.274 0.2796 1028 +1030 4 368.8839 509.4747 31.211 0.2811 1029 +1031 4 369.1951 510.5478 30.6636 0.2924 1030 +1032 4 369.2843 511.686 30.5648 0.294 1031 +1033 4 369.2123 512.8197 30.3052 0.3032 1032 +1034 4 369.2088 513.9294 29.6915 0.2903 1033 +1035 4 369.1985 515.0608 29.673 0.2796 1034 +1036 4 369.0006 516.1328 29.4476 0.2866 1035 +1037 4 369.6184 517.0274 29.2524 0.3152 1036 +1038 4 370.3105 517.8533 29.4585 0.336 1037 +1039 4 370.7178 518.8612 29.0654 0.331 1038 +1040 4 371.093 519.8176 27.8762 0.3044 1039 +1041 4 371.3275 520.8666 26.9713 0.281 1040 +1042 4 371.6147 521.8036 28.31 0.3162 1041 +1043 4 371.7794 522.8595 27.4417 0.3559 1042 +1044 4 372.372 523.8376 27.44 0.3432 1043 +1045 4 402.998 411.7439 49.9117 0.2104 176 +1046 4 402.9065 410.6091 50.197 0.1334 1045 +1047 4 402.8161 409.4754 50.4823 0.1176 1046 +1048 4 402.7246 408.3405 50.7676 0.1335 1047 +1049 4 402.6308 407.2068 51.0546 0.1589 1048 +1050 4 402.4054 406.0903 51.214 0.1845 1049 +1051 4 402.0943 404.9897 51.2406 0.1713 1050 +1052 4 401.981 403.8583 51.24 0.1554 1051 +1053 4 402.2384 402.7658 51.5623 0.1424 1052 +1054 4 402.4626 401.6561 51.3694 0.1502 1053 +1055 4 402.7795 400.6231 52.1175 0.1632 1054 +1056 4 403.2817 399.6118 52.1296 0.1868 1055 +1057 4 403.8675 398.6337 51.919 0.2346 1056 +1058 4 404.1363 397.5549 51.3584 0.2746 1057 +1059 4 404.3868 396.4498 50.983 0.3128 1058 +1060 4 404.698 395.3595 50.6094 0.3066 1059 +1061 4 405.2826 394.3951 50.9068 0.2706 1060 +1062 4 405.9152 393.4971 50.2082 0.196 1061 +1063 4 406.6909 392.8359 48.9544 0.1549 1062 +1064 4 407.4379 391.9859 49.0941 0.1644 1063 +1065 4 408.0625 391.0295 49.1697 0.2277 1064 +1066 4 408.1277 389.9347 49.9411 0.2667 1065 +1067 4 408.1586 388.7918 50.0346 0.2542 1066 +1068 4 408.8107 387.9315 49.1851 0.2116 1067 +1069 4 409.6401 387.1925 48.8877 0.1985 1068 +1070 4 410.2453 386.251 49.469 0.2374 1069 +1071 4 410.9111 385.3518 49.9341 0.2757 1070 +1072 4 411.7439 384.6071 50.4924 0.302 1071 +1073 4 412.6259 383.9001 50.6702 0.2893 1072 +1074 4 413.6498 383.4082 50.9382 0.2764 1073 +1075 4 414.5936 382.8064 50.8567 0.2595 1074 +1076 4 415.3452 381.9793 51.1249 0.2269 1075 +1077 4 416.098 381.1945 51.3178 0.1977 1076 +1078 4 416.8095 380.3285 50.8486 0.2147 1077 +1079 4 417.6801 379.6078 50.8813 0.279 1078 +1080 4 418.6948 379.1811 51.4172 0.3439 1079 +1081 4 419.7942 379.125 52.0374 0.3753 1080 +1082 4 420.873 378.9168 52.334 0.374 1081 +1083 4 421.9438 378.5679 52.7072 0.3606 1082 +1084 4 422.97 378.1618 53.3828 0.3393 1083 +1085 4 424.0144 377.7499 53.8605 0.3137 1084 +1086 4 425.099 377.4067 53.7905 0.2882 1085 +1087 4 426.1652 377.0018 53.6452 0.2534 1086 +1088 4 427.1479 376.4389 53.3512 0.2234 1087 +1089 4 428.1306 375.8658 53.4097 0.1876 1088 +1090 4 428.8559 375.0124 53.5718 0.178 1089 +1091 4 429.5903 374.1383 53.7032 0.1886 1090 +1092 4 430.1692 373.1945 53.1191 0.2128 1091 +1093 4 431.0592 372.5024 53.1194 0.2161 1092 +1094 4 432.0122 371.8709 53.1762 0.2161 1093 +1095 4 432.7283 371.0472 52.4185 0.2279 1094 +1096 4 433.8094 370.7384 52.2696 0.2641 1095 +1097 4 434.911 370.5061 51.7843 0.2787 1096 +1098 4 436.0322 370.2899 51.6858 0.2676 1097 +1099 4 437.1132 369.9399 51.9935 0.2429 1098 +1100 4 438.0822 369.4868 51.0555 0.2291 1099 +1101 4 439.1461 369.0716 50.9247 0.2288 1100 +1102 4 440.146 368.7249 49.8683 0.2289 1101 +1103 4 441.2683 368.535 49.6283 0.2418 1102 +1104 4 442.2212 367.9973 50.4 0.2676 1103 +1105 4 443.2554 367.629 49.6602 0.2918 1104 +1106 4 444.2896 367.1943 50.1892 0.2772 1105 +1107 4 445.1956 366.5021 50.2799 0.2233 1106 +1108 4 445.9861 365.7093 50.1698 0.1602 1107 +1109 4 447.0992 365.4828 50.26 0.1271 1108 +1110 4 448.2352 365.5503 50.3171 0.1334 1109 +1111 4 449.3392 365.7025 49.7078 0.1683 1110 +1112 4 450.4408 365.8558 49.4334 0.1968 1111 +1113 4 451.5711 365.8855 49.7924 0.2034 1112 +1114 4 452.7014 365.7929 49.819 0.1971 1113 +1115 4 453.7973 365.5503 49.3906 0.1907 1114 +1116 4 454.835 365.1019 49.0605 0.1907 1115 +1117 4 455.8737 364.6283 49.075 0.1973 1116 +1118 4 456.8656 364.1821 48.5528 0.217 1117 +1119 4 457.7716 363.5815 47.8545 0.2357 1118 +1120 4 458.6525 362.8574 47.7058 0.2344 1119 +1121 4 459.6329 362.3002 47.5488 0.2143 1120 +1122 4 460.6751 361.838 47.3273 0.2106 1121 +1123 4 461.715 361.3736 47.0806 0.2307 1122 +1124 4 462.7926 361.0121 46.8252 0.249 1123 +1125 4 463.8954 360.8336 47.161 0.2309 1124 +1126 4 465.0108 360.7432 47.7226 0.1842 1125 +1127 4 466.1182 360.5144 48.0301 0.1489 1126 +1128 4 467.1718 360.1392 48.552 0.1398 1127 +1129 4 468.2037 359.6759 48.7998 0.1485 1128 +1130 4 469.1418 359.033 48.8186 0.1432 1129 +1131 4 470.0158 358.3019 49.0566 0.1398 1130 +1132 4 471.0145 357.7677 49.0748 0.1494 1131 +1133 4 472.0579 357.2998 49.0056 0.1718 1132 +1134 4 473.1367 356.9337 48.8079 0.178 1133 +1135 4 474.2635 356.928 48.8564 0.1582 1134 +1136 4 475.3492 356.6409 48.7452 0.1326 1135 +1137 4 476.4154 356.2736 49.1112 0.1169 1136 +1138 4 477.5205 356.1055 49.6658 0.1144 1137 +1139 4 478.6404 356.0242 49.3231 0.1144 1138 +1140 4 479.7307 356.1672 49.8988 0.1144 1139 +1141 4 480.8655 356.2439 50.08 0.1262 1140 +1142 4 481.8574 356.7919 49.8798 0.1519 1141 +1143 4 482.7417 357.516 49.7862 0.1774 1142 +1144 4 483.8251 357.8226 49.3335 0.178 1143 +1145 4 484.9416 358.072 49.28 0.1144 1144 +1146 3 413.7985 419.0724 49.0834 0.1403 1 +1147 3 412.8765 419.705 49.6672 0.2042 1146 +1148 3 411.9533 420.3376 50.2502 0.3064 1147 +1149 3 411.1925 421.1522 50.7282 0.3777 1148 +1150 3 410.5404 422.0845 50.9564 0.394 1149 +1151 3 409.7591 422.8979 51.282 0.3422 1150 +1152 3 408.7157 423.2217 51.5021 0.2744 1151 +1153 3 407.8349 423.8165 51.1176 0.1144 1152 +1154 3 407.4482 423.1198 51.0563 0.2532 1153 +1155 3 406.3316 422.8785 50.9877 0.2542 1154 +1156 3 405.1911 422.9345 51.1361 0.2795 1155 +1157 3 404.086 422.9208 51.8602 0.2669 1156 +1158 3 403.0907 422.3968 52.3648 0.2924 1157 +1159 3 402.1068 421.9873 53.3845 0.2924 1158 +1160 3 401.0235 421.8672 54.2279 0.3051 1159 +1161 3 399.9252 421.5754 54.5625 0.3305 1160 +1162 3 399.0432 420.9279 55.3748 0.3686 1161 +1163 3 397.969 420.5413 55.5677 0.4322 1162 +1164 3 396.42 420.4772 56.3914 0.3943 1163 +1165 3 395.3195 420.253 56.9254 0.3814 1164 +1166 3 394.2579 419.8777 57.4258 0.3939 1165 +1167 3 393.2386 419.3687 57.6514 0.4067 1166 +1168 3 392.2696 418.7612 57.6797 0.4194 1167 +1169 3 391.3475 418.084 57.6803 0.4195 1168 +1170 3 390.4335 417.3953 57.6808 0.4069 1169 +1171 3 389.54 416.6803 57.6859 0.4068 1170 +1172 3 388.5859 416.0499 57.7181 0.4068 1171 +1173 3 387.5437 415.5889 57.9684 0.4068 1172 +1174 3 386.545 415.1576 58.8311 0.3686 1173 +1175 3 385.1162 414.3316 58.6634 0.178 1174 +1176 3 384.106 413.8775 59.2701 0.178 1175 +1177 3 383.1164 413.3295 59.4549 0.1866 1176 +1178 3 382.1852 412.6888 59.6361 0.2122 1177 +1179 3 381.2163 412.1111 59.584 0.2377 1178 +1180 3 380.3754 411.3378 59.463 0.2542 1179 +1181 3 379.498 410.6045 59.4073 0.2497 1180 +1182 3 378.6434 409.8517 59.5076 0.2369 1181 +1183 3 377.9158 408.9743 59.64 0.2382 1182 +1184 3 377.2786 408.0248 59.64 0.2636 1183 +1185 3 376.7203 407.0341 59.7982 0.2939 1184 +1186 3 376.1666 406.0697 60.3562 0.3228 1185 +1187 3 375.3613 405.3444 60.555 0.3417 1186 +1188 3 374.4735 404.6706 60.2512 0.3559 1187 +1189 3 373.7608 403.7908 60.0065 0.349 1188 +1190 3 373.0458 402.9214 59.5426 0.3156 1189 +1191 3 372.197 402.1755 59.2262 0.2645 1190 +1192 3 371.2909 401.4799 59.1959 0.2202 1191 +1193 3 370.4398 400.734 59.5395 0.2034 1192 +1194 3 369.536 400.1186 60.2538 0.2262 1193 +1195 3 368.6426 399.4734 60.9207 0.2646 1194 +1196 3 367.8967 398.6291 60.9636 0.2796 1195 +1197 3 367.3258 397.651 61.0551 0.2474 1196 +1198 3 366.6337 396.8296 60.5262 0.2032 1197 +1199 3 366.0251 396.094 59.0492 0.2003 1198 +1200 3 365.0172 395.8881 58.7073 0.3143 1199 +1201 3 363.8927 395.6959 58.7916 0.2633 1200 +1202 3 362.8928 395.1593 58.592 0.2032 1201 +1203 3 362.3025 394.3402 59.8951 0.152 1202 +1204 3 361.8083 393.7168 61.871 0.1398 1203 +1205 3 360.837 393.2237 62.6128 0.1409 1204 +1206 3 360.0557 392.4492 62.0533 0.1539 1205 +1207 3 359.6667 391.5386 60.9599 0.1692 1206 +1208 3 358.7904 390.8465 61.4989 0.1948 1207 +1209 3 357.746 390.4335 61.9097 0.2138 1208 +1210 3 356.6248 390.2276 61.9982 0.1961 1209 +1211 3 355.5792 389.8054 62.3386 0.1598 1210 +1212 3 354.6606 389.1808 62.7626 0.1432 1211 +1213 3 353.7248 388.5607 62.3428 0.1697 1212 +1214 3 352.6963 388.0826 62.253 0.2212 1213 +1215 3 351.7182 387.5094 62.5044 0.2677 1214 +1216 3 350.8133 386.8139 62.4047 0.2878 1215 +1217 3 349.9713 386.0577 62.3095 0.2613 1216 +1218 3 349.1305 385.3038 62.5954 0.2058 1217 +1219 3 348.1375 384.7455 62.7312 0.1559 1218 +1220 3 347.1376 384.2044 62.8468 0.1398 1219 +1221 3 346.3906 383.4162 63.3203 0.1491 1220 +1222 3 345.8198 382.4964 64.0797 0.17 1221 +1223 3 344.9526 381.7986 64.2592 0.1829 1222 +1224 3 343.9104 381.389 64.0032 0.1907 1223 +1225 3 342.787 381.2986 64.2958 0.1972 1224 +1226 3 341.6705 381.3673 64.8726 0.228 1225 +1227 3 340.5562 381.2769 65.3859 0.2607 1226 +1228 3 339.5712 381.508 64.4731 0.2563 1227 +1229 3 338.4741 381.6739 64.6344 0.1999 1228 +1230 3 337.3324 381.7002 64.6775 0.1579 1229 +1231 3 336.2124 381.4885 64.6453 0.1415 1230 +1232 3 335.1165 381.1659 64.51 0.1508 1231 +1233 3 333.9942 380.952 64.4932 0.1413 1232 +1234 3 332.8994 380.6546 64.8133 0.1284 1233 +1235 3 331.9579 380.0391 65.2582 0.1271 1234 +1236 3 330.9867 379.562 64.4403 0.1398 1235 +1237 3 330.0783 378.8653 64.4129 0.1525 1236 +1238 3 329.2432 378.092 64.68 0.1144 1237 +1239 3 385.4948 415.3578 58.7045 0.1481 1174 +1240 3 384.4595 415.7227 58.4716 0.1492 1239 +1241 3 383.3338 415.6758 58.1134 0.1897 1240 +1242 3 382.2848 415.6678 57.0819 0.2636 1241 +1243 3 381.2369 415.86 56.4827 0.3314 1242 +1244 3 380.1295 416.1414 56.4925 0.3692 1243 +1245 3 379.0495 416.4469 56.0501 0.361 1244 +1246 3 377.9719 416.6871 55.3241 0.3154 1245 +1247 3 376.8599 416.8644 54.934 0.2501 1246 +1248 3 375.8829 417.3632 54.88 0.208 1247 +1249 3 375.2492 418.2933 55.008 0.2034 1248 +1250 3 374.8179 419.3481 55.1818 0.2388 1249 +1251 3 374.0926 420.1397 55.7715 0.2636 1250 +1252 3 373.3215 420.9222 55.4061 0.2861 1251 +1253 3 372.491 421.6784 54.9175 0.2728 1252 +1254 3 371.8641 422.6085 54.5443 0.2471 1253 +1255 3 371.1422 423.4813 54.2531 0.1909 1254 +1256 3 370.2922 424.2444 54.2357 0.1462 1255 +1257 3 369.2912 424.7741 53.9927 0.129 1256 +1258 3 368.2856 425.3175 53.9137 0.138 1257 +1259 3 367.3006 425.8986 53.9972 0.1508 1258 +1260 3 366.3282 426.4981 54.1321 0.1414 1259 +1261 3 365.4165 427.1742 54.453 0.1285 1260 +1262 3 364.3651 427.5814 54.8495 0.115 1261 +1263 3 363.2486 427.7999 55.137 0.1144 1262 +1264 3 362.1492 428.0974 55.389 0.1144 1263 +1265 3 361.1036 428.5195 55.8516 0.1144 1264 +1266 3 360.0809 429.0297 55.776 0.1144 1265 +1267 3 358.978 429.3032 56.096 0.1144 1266 +1268 3 357.8478 429.469 56.2078 0.1144 1267 +1269 3 356.8136 429.9152 55.72 0.1144 1268 +1270 3 356.5207 429.7505 56.84 0.1144 1269 +1271 3 356.3434 429.5846 56.84 0.1144 1270 +1272 3 356.0128 429.572 56.84 0.1144 1271 +1273 3 355.6696 429.572 56.84 0.1144 1272 +1274 3 355.4408 429.572 56.84 0.1144 1273 +1275 3 354.831 429.381 56.84 0.1144 1274 +1276 3 354.5759 429.2929 56.84 0.1144 1275 +1277 3 354.4753 429.0503 56.84 0.1144 1276 +1278 3 354.1824 429.0 56.84 0.1144 1277 +1279 3 353.8392 429.0 56.84 0.1144 1278 +1280 3 353.6104 429.0 56.84 0.1144 1279 +1281 3 352.8096 429.0 56.84 0.1144 1280 +1282 3 352.4664 429.0 56.84 0.1144 1281 +1283 3 352.1232 429.0 56.84 0.1144 1282 +1284 3 351.8178 428.9622 56.84 0.1144 1283 +1285 3 351.6782 428.7586 56.84 0.1144 1284 +1286 3 351.4368 428.428 56.84 0.1144 1285 +1287 3 351.1062 428.4154 56.84 0.1144 1286 +1288 3 351.017 428.3902 56.84 0.1144 1287 +1289 3 350.2928 428.3136 56.84 0.1144 1288 +1290 3 349.492 428.3136 56.84 0.1144 1289 +1291 3 348.6912 428.3136 56.84 0.1144 1290 +1292 3 347.8904 428.3136 56.84 0.1144 1291 +1293 3 347.5472 428.3136 56.84 0.1144 1292 +1294 3 347.2166 428.301 56.84 0.1144 1293 +1295 3 346.9752 428.1992 56.84 0.1144 1294 +1296 3 346.8482 427.983 56.84 0.1144 1295 +1297 3 346.4032 427.856 56.84 0.1144 1296 +1298 3 346.0978 427.8182 56.84 0.1144 1297 +1299 3 346.0222 427.7794 56.84 0.1144 1298 +1300 3 345.2592 427.7416 56.84 0.1144 1299 +1301 3 344.4584 427.7416 56.84 0.1144 1300 +1302 3 343.6576 427.7416 56.84 0.1144 1301 +1303 3 343.3144 427.7416 56.84 0.1144 1302 +1304 3 342.9838 427.729 56.84 0.1144 1303 +1305 3 342.7676 427.602 56.84 0.1144 1304 +1306 3 342.5639 427.4625 56.84 0.1144 1305 +1307 3 342.501 427.2966 56.84 0.1144 1306 +1308 3 342.2082 426.7886 56.84 0.1144 1307 +1309 3 341.7254 426.4706 56.84 0.1144 1308 +1310 3 341.5858 426.267 56.84 0.1144 1309 +1311 3 341.3696 426.14 56.84 0.1144 1310 +1312 3 341.0264 426.14 56.84 0.1144 1311 +1313 3 340.6832 426.14 56.84 0.1144 1312 +1314 3 340.4544 426.14 56.84 0.1144 1313 +1315 3 339.7806 426.013 56.84 0.1144 1314 +1316 3 339.196 425.7968 56.84 0.1144 1315 +1317 3 338.3952 425.7968 56.84 0.1144 1316 +1318 3 337.5944 425.7968 56.84 0.1144 1317 +1319 3 337.1368 425.568 56.84 0.1144 1318 +1320 3 397.3341 420.8925 57.2345 0.4499 1163 +1321 3 396.3422 421.4279 57.0119 0.3835 1320 +1322 3 395.5952 422.2275 56.8467 0.3027 1321 +1323 3 394.6846 422.6451 58.1101 0.2214 1322 +1324 3 393.6104 422.7583 58.9109 0.1907 1323 +1325 3 392.6505 422.8361 60.1087 0.1986 1324 +1326 3 391.7079 423.4459 60.5024 0.2207 1325 +1327 3 390.8453 424.0842 60.9826 0.2388 1326 +1328 3 390.0331 424.7169 61.6874 0.2766 1327 +1329 3 389.1053 425.3506 61.7044 0.3342 1328 +1330 3 388.2999 426.1549 61.9564 0.3804 1329 +1331 3 387.5678 427.0277 62.097 0.4001 1330 +1332 3 386.847 427.8869 62.5388 0.3945 1331 +1333 3 386.0542 428.6797 63.047 0.3626 1332 +1334 3 385.1722 429.3947 63.2475 0.2982 1333 +1335 3 384.1575 429.8969 63.4385 0.2145 1334 +1336 3 383.0467 430.0788 63.5606 0.1508 1335 +1337 3 381.9393 430.1234 64.0676 0.1271 1336 +1338 3 381.0229 430.2813 65.5752 0.1345 1337 +1339 3 380.0231 430.279 66.3659 0.1476 1338 +1340 3 378.9809 430.0754 67.1787 0.1446 1339 +1341 3 377.9147 429.9976 68.0638 0.1317 1340 +1342 3 376.8153 430.2218 68.3189 0.1187 1341 +1343 3 375.9024 430.7824 69.0183 0.1144 1342 +1344 3 375.3647 431.6163 70.3041 0.1144 1343 +1345 3 374.6325 432.4057 70.9971 0.1144 1344 +1346 3 373.5812 432.7798 71.1942 0.1144 1345 +1347 3 372.5161 433.1161 71.7517 0.1144 1346 +1348 3 371.4751 433.4891 72.4752 0.1144 1347 +1349 3 370.4924 434.0553 72.7913 0.1144 1348 +1350 3 369.5269 434.5999 73.4689 0.1144 1349 +1351 3 368.7604 435.2794 74.7141 0.1144 1350 +1352 3 368.4881 436.3479 75.4586 0.1144 1351 +1353 3 368.2536 437.4656 75.6 0.1144 1352 +1354 3 368.0248 437.58 74.48 0.1144 1353 +1355 3 367.7194 437.6178 74.48 0.1144 1354 +1356 3 367.4528 437.6944 74.48 0.1144 1355 +1357 3 367.1222 437.707 74.48 0.1144 1356 +1358 3 366.9574 437.771 74.48 0.1144 1357 +1359 3 366.4106 438.025 74.48 0.1144 1358 +1360 3 366.0674 438.4826 74.48 0.1144 1359 +1361 3 365.7242 438.9402 74.48 0.1144 1360 +1362 3 365.1648 439.1816 74.48 0.1144 1361 +1363 3 364.6694 439.487 74.48 0.1144 1362 +1364 3 364.4143 439.5751 74.48 0.1144 1363 +1365 3 364.3514 439.8554 74.48 0.1144 1364 +1366 3 364.1352 439.9824 74.48 0.1144 1365 +1367 3 363.792 439.9824 74.48 0.1144 1366 +1368 3 363.601 440.0202 74.48 0.1144 1367 +1369 3 362.8768 440.0968 74.48 0.1144 1368 +1370 3 362.2796 440.3004 74.48 0.1144 1369 +1371 3 361.695 440.5166 74.48 0.1144 1370 +1372 3 360.932 440.5544 74.48 0.1144 1371 +1373 3 360.1312 440.5544 74.48 0.1144 1372 +1374 3 359.4448 440.44 74.48 0.1144 1373 +1375 3 359.1016 440.44 74.48 0.1144 1374 +1376 3 358.7584 440.44 74.48 0.1144 1375 +1377 3 358.453 440.4022 74.48 0.1144 1376 +1378 3 358.3008 440.2112 74.48 0.1144 1377 +1379 3 358.2116 440.0716 74.48 0.1144 1378 +1380 3 357.9702 439.9698 74.48 0.1144 1379 +1381 3 357.7666 439.8302 74.48 0.1144 1380 +1382 3 357.6522 439.6014 74.48 0.1144 1381 +1383 3 357.5378 439.3726 74.48 0.1144 1382 +1384 3 357.5 439.1816 74.48 0.1144 1383 +1385 3 357.3856 438.9528 74.48 0.1144 1384 +1386 3 407.8188 424.019 51.3064 0.122 1153 +1387 3 407.8097 425.0978 52.0808 0.1615 1386 +1388 3 408.0568 426.1835 52.4297 0.1975 1387 +1389 3 408.4904 427.0804 53.6399 0.2161 1388 +1390 3 409.3518 427.6466 54.7467 0.2122 1389 +1391 3 410.4214 427.8743 55.3812 0.1993 1390 +1392 3 411.562 427.8526 55.3689 0.1907 1391 +1393 3 412.6602 427.8045 55.6587 0.1953 1392 +1394 3 413.6086 427.7576 57.1595 0.2034 1393 +1395 3 414.4632 427.4304 58.7538 0.2034 1394 +1396 3 415.3978 427.03 59.9561 0.1844 1395 +1397 3 415.9321 426.4489 61.4566 0.1503 1396 +1398 3 416.4492 425.6664 62.8432 0.1236 1397 +1399 3 417.258 425.0292 64.0455 0.1144 1398 +1400 3 417.8735 424.2089 65.1949 0.1239 1399 +1401 3 418.6331 423.4333 64.965 0.1381 1400 +1402 3 419.3263 422.5318 64.8533 0.1639 1401 +1403 3 419.5117 421.6727 66.5792 0.1652 1402 +1404 3 419.6192 420.5722 67.2932 0.1652 1403 +1405 3 419.5929 420.0745 68.7666 0.1343 1404 +1406 3 419.7187 419.1353 69.4949 0.1144 1405 +1407 3 419.8194 418.0199 69.6805 0.1144 1406 +1408 3 419.6741 417.163 71.239 0.1144 1407 +1409 3 419.1044 416.567 73.0705 0.1144 1408 +1410 3 418.601 415.6713 73.3211 0.1144 1409 +1411 3 418.45 414.5524 73.2245 0.1144 1410 +1412 3 418.736 413.5194 73.9502 0.1144 1411 +1413 3 418.9328 412.412 74.2 0.1144 1412 +1414 3 419.7439 420.4612 67.9395 0.1144 1404 +1415 3 420.5916 420.436 69.7956 0.1144 1414 +1416 3 421.2791 419.6787 70.8226 0.1144 1415 +1417 3 421.667 418.6251 70.6947 0.1144 1416 +1418 3 422.5776 417.9856 70.56 0.1144 1417 +1419 3 423.6289 417.5646 70.56 0.1144 1418 +1420 3 424.5659 416.9114 70.5124 0.1144 1419 +1421 3 425.457 416.1975 70.49 0.1144 1420 +1422 3 426.2853 415.4356 70.8652 0.1144 1421 +1423 3 427.0403 414.6382 71.6148 0.1144 1422 +1424 3 427.9544 414.033 72.0703 0.1144 1423 +1425 3 429.0275 413.6441 71.9662 0.1144 1424 +1426 3 430.1303 413.3501 71.8528 0.1144 1425 +1427 3 431.248 413.1224 71.685 0.1144 1426 +1428 3 432.3805 412.9932 71.68 0.1144 1427 +1429 3 433.5142 412.8868 71.6808 0.1144 1428 +1430 3 434.5324 412.4406 71.7391 0.1144 1429 +1431 3 435.4945 412.0139 72.2338 0.1144 1430 +1432 3 436.4383 412.3068 73.3625 0.1144 1431 +1433 3 437.3352 412.9142 74.0751 0.1144 1432 +1434 3 438.0868 413.7356 74.1944 0.1144 1433 +1435 3 438.5982 414.7114 74.797 0.1144 1434 +1436 3 439.3829 415.3898 74.4419 0.1144 1435 +1437 3 440.1963 416.1552 74.4554 0.1144 1436 +1438 3 441.0623 416.8942 74.6698 0.1144 1437 +1439 3 442.0222 417.5062 74.5402 0.1144 1438 +1440 3 443.0632 417.9673 74.6544 0.1144 1439 +1441 3 444.1694 418.0451 75.1596 0.1144 1440 +1442 3 445.1304 417.568 75.994 0.126 1441 +1443 3 445.914 416.8358 76.9563 0.1517 1442 +1444 3 445.9312 415.7296 77.56 0.2288 1443 +1445 3 415.9687 415.4985 47.9427 0.1671 1 +1446 3 416.1037 414.3625 47.9735 0.2466 1445 +1447 3 416.2627 413.23 47.9956 0.3358 1446 +1448 3 416.6173 412.1523 48.0917 0.4021 1447 +1449 3 417.5257 411.7576 48.4282 0.4744 1448 +1450 3 418.2544 412.5676 48.2748 0.5529 1449 +1451 3 418.8527 413.5388 48.4341 0.5944 1450 +1452 3 419.4453 414.517 48.4744 0.5504 1451 +1453 3 420.0116 415.5065 48.2524 0.4289 1452 +1454 3 420.7529 416.2009 49.4525 0.3193 1453 +1455 3 421.5617 415.6632 50.8864 0.2924 1454 +1456 3 422.557 415.0993 50.9564 0.3305 1455 +1457 3 423.3978 414.3236 50.9384 0.3432 1456 +1458 3 423.7513 412.8044 50.5532 0.3082 1457 +1459 3 423.9939 411.713 50.036 0.3252 1458 +1460 3 424.2078 410.5988 49.8425 0.3283 1459 +1461 3 424.5018 409.4948 49.84 0.3432 1460 +1462 3 424.7386 408.376 49.84 0.3485 1461 +1463 3 424.8805 407.2468 49.8394 0.3401 1462 +1464 3 424.8747 406.1028 49.8369 0.302 1463 +1465 3 425.2728 405.1968 50.0189 0.1144 1464 +1466 3 424.8336 404.6328 49.8145 0.3305 1465 +1467 3 424.7878 403.4911 49.6647 0.3813 1466 +1468 3 424.8827 402.3894 48.9418 0.3686 1467 +1469 3 424.8976 401.25 48.7206 0.3432 1468 +1470 3 424.9914 400.1094 48.7138 0.3178 1469 +1471 3 425.3907 399.0375 48.6842 0.3178 1470 +1472 3 425.8815 398.3339 48.4154 0.2373 1471 +1473 3 426.6033 397.4954 47.8341 0.1723 1472 +1474 3 427.4018 396.7586 46.9574 0.1538 1473 +1475 3 428.2209 396.1283 45.8382 0.1461 1474 +1476 3 428.7415 395.8732 43.713 0.1748 1475 +1477 3 428.5332 395.5998 41.2194 0.2314 1476 +1478 3 428.0287 394.9877 39.2526 0.2627 1477 +1479 3 427.5242 394.1572 37.8067 0.2496 1478 +1480 3 426.6388 393.7431 36.7808 0.22 1479 +1481 3 426.0691 394.4478 35.3665 0.2161 1480 +1482 3 426.2327 395.371 33.8271 0.2161 1481 +1483 3 426.839 396.2862 33.0991 0.1917 1482 +1484 3 427.173 397.3043 32.1255 0.1785 1483 +1485 3 426.2086 397.6613 31.0895 0.178 1484 +1486 3 425.147 397.8088 30.1087 0.178 1485 +1487 3 424.0751 398.207 30.1328 0.1525 1486 +1488 3 423.8772 398.4907 30.9498 0.1898 1487 +1489 3 423.7982 399.1622 32.9034 0.2577 1488 +1490 3 424.5281 399.7136 34.0721 0.2852 1489 +1491 3 425.3941 400.3668 34.1239 0.2867 1490 +1492 3 425.7385 401.4079 33.9018 0.2796 1491 +1493 3 425.6504 402.418 32.8714 0.2915 1492 +1494 3 425.4753 403.276 31.0761 0.3177 1493 +1495 3 425.8197 404.0276 29.5274 0.3238 1494 +1496 3 426.6148 404.7655 28.8075 0.3109 1495 +1497 3 427.5117 405.4576 28.8081 0.2981 1496 +1498 3 428.5538 405.8912 28.8044 0.2996 1497 +1499 3 429.6075 406.1406 28.054 0.2903 1498 +1500 3 430.6885 406.3259 27.4165 0.272 1499 +1501 3 431.8085 406.5318 27.4624 0.2749 1500 +1502 3 432.7249 407.0993 27.0698 0.3056 1501 +1503 3 433.1848 408.0488 26.1993 0.3267 1502 +1504 3 433.266 409.115 25.2784 0.2941 1503 +1505 3 432.9948 410.1881 24.7352 0.2516 1504 +1506 3 432.7489 411.2943 24.8735 0.2318 1505 +1507 3 433.195 412.2839 24.9749 0.2612 1506 +1508 3 434.1846 412.8113 24.8755 0.2892 1507 +1509 3 435.1948 413.3386 24.6268 0.2924 1508 +1510 3 436.1569 413.9255 24.1576 0.3037 1509 +1511 3 437.1785 414.3374 23.429 0.3051 1510 +1512 3 438.2435 414.5158 22.5224 0.3279 1511 +1513 3 439.3738 414.6279 22.3012 0.3189 1512 +1514 3 440.3187 415.2217 22.7391 0.3416 1513 +1515 3 441.2111 415.9298 22.9718 0.3313 1514 +1516 3 442.1869 416.5201 23.1594 0.3305 1515 +1517 3 443.0872 417.1493 23.9243 0.2946 1516 +1518 3 443.9807 417.3266 25.5822 0.268 1517 +1519 3 444.4417 416.424 24.5874 0.2161 1518 +1520 3 444.5584 415.5008 22.96 0.1144 1519 +1521 3 423.1473 398.2115 29.5196 0.1764 1487 +1522 3 422.1554 398.6291 28.6143 0.1909 1521 +1523 3 421.3043 398.2916 27.027 0.2297 1522 +1524 3 421.27 397.8958 24.5543 0.2458 1523 +1525 3 422.1966 398.0422 23.5777 0.2616 1524 +1526 3 423.2411 398.3831 23.3551 0.2433 1525 +1527 3 424.3199 398.5845 22.7268 0.2288 1526 +1528 3 425.3152 399.0272 22.9102 0.2407 1527 +1529 3 426.2716 399.5672 22.9631 0.2741 1528 +1530 3 427.2977 399.3967 22.4496 0.2996 1529 +1531 3 428.3182 398.9128 22.0772 0.2902 1530 +1532 3 429.3604 398.4518 22.1413 0.2555 1531 +1533 3 430.3396 397.8832 22.4949 0.2078 1532 +1534 3 431.3475 397.3661 22.4442 0.1993 1533 +1535 3 432.3622 396.9852 23.0745 0.2398 1534 +1536 3 433.2202 396.4978 24.4423 0.3104 1535 +1537 3 433.4685 395.514 24.9379 0.3305 1536 +1538 3 433.0829 394.5084 25.6004 0.3004 1537 +1539 3 432.9502 393.4056 25.9913 0.2458 1538 +1540 3 433.4433 392.3897 26.2363 0.2415 1539 +1541 3 433.4708 391.3052 27.0808 0.2541 1540 +1542 3 432.8896 390.3328 27.44 0.2288 1541 +1543 3 425.4307 398.1578 48.7099 0.2815 1471 +1544 3 425.6229 397.0366 48.4338 0.2796 1543 +1545 3 425.9558 395.9453 48.6228 0.2545 1544 +1546 3 426.426 394.9248 49.14 0.2542 1545 +1547 3 427.0083 393.941 49.2153 0.2416 1546 +1548 3 427.7164 393.0532 49.56 0.2288 1547 +1549 3 426.9488 392.1163 51.1277 0.1346 1548 +1550 3 426.307 391.3349 52.4367 0.1271 1549 +1551 3 425.6652 390.5524 53.7452 0.1449 1550 +1552 3 425.0154 389.7116 54.7599 0.1884 1551 +1553 3 424.2181 388.9245 55.1205 0.2397 1552 +1554 3 423.4505 388.0803 55.16 0.2908 1553 +1555 3 422.7011 387.2417 55.5904 0.3051 1554 +1556 3 422.2252 386.2304 55.732 0.2958 1555 +1557 3 421.5068 385.3861 55.979 0.2736 1556 +1558 3 420.7254 384.5567 56.1674 0.2952 1557 +1559 3 419.9613 383.7068 56.2148 0.3338 1558 +1560 3 419.3321 382.7687 56.5547 0.3724 1559 +1561 3 418.9031 381.7162 56.6857 0.3715 1560 +1562 3 418.4969 380.6694 57.1701 0.3582 1561 +1563 3 417.8403 379.7863 57.8648 0.3451 1562 +1564 3 417.0475 378.9717 57.8752 0.3212 1563 +1565 3 416.4824 377.9868 57.696 0.2829 1564 +1566 3 415.8749 377.043 58.1832 0.2441 1565 +1567 3 415.0043 376.3405 58.7278 0.2534 1566 +1568 3 414.1108 375.6381 59.0425 0.2781 1567 +1569 3 413.1956 374.962 59.3289 0.2916 1568 +1570 3 412.2404 374.3408 59.593 0.2684 1569 +1571 3 411.3435 373.6327 59.5781 0.231 1570 +1572 3 410.4718 373.0401 60.3968 0.2161 1571 +1573 3 409.6447 372.3377 61.04 0.2255 1572 +1574 3 408.9846 371.4145 61.2567 0.2094 1573 +1575 3 408.813 370.3139 61.364 0.1835 1574 +1576 3 408.7661 369.1825 61.7462 0.1579 1575 +1577 3 408.1964 368.2444 62.092 0.1627 1576 +1578 3 407.3063 367.5683 62.5792 0.1652 1577 +1579 3 406.3271 367.0879 63.3909 0.1652 1578 +1580 3 405.6647 366.1955 63.31 0.1431 1579 +1581 3 405.1956 365.1545 63.2565 0.1398 1580 +1582 3 404.666 364.1546 63.6177 0.1511 1581 +1583 3 403.983 363.2406 63.7305 0.1867 1582 +1584 3 403.1776 362.4409 64.0674 0.2021 1583 +1585 3 402.3311 361.6779 64.2919 0.192 1584 +1586 3 401.512 360.9034 64.7595 0.156 1585 +1587 3 400.7981 360.0294 65.2 0.1289 1586 +1588 3 400.2318 359.049 65.5956 0.1271 1587 +1589 3 399.5203 358.1567 65.6393 0.1511 1588 +1590 3 398.8762 357.4474 67.1286 0.1906 1589 +1591 3 398.3408 356.4704 67.76 0.2288 1590 +1592 3 428.0951 392.5636 48.6256 0.2608 1548 +1593 3 428.7334 391.7296 47.5773 0.2968 1592 +1594 3 429.3226 390.9002 46.3352 0.3146 1593 +1595 3 429.7642 390.5753 44.0191 0.2977 1594 +1596 3 430.0239 389.6544 43.1749 0.2805 1595 +1597 3 430.1966 389.0321 45.3636 0.267 1596 +1598 3 430.875 388.1134 45.5417 0.2799 1597 +1599 3 431.5099 387.1811 45.0993 0.3058 1598 +1600 3 431.8657 386.0943 45.1108 0.3308 1599 +1601 3 432.2387 385.0155 45.2413 0.3432 1600 +1602 3 432.4331 383.9195 45.8749 0.3441 1601 +1603 3 432.5864 382.8876 46.9652 0.357 1602 +1604 3 432.4892 381.7505 47.0392 0.3686 1603 +1605 3 432.2821 380.6557 46.8821 0.3644 1604 +1606 3 432.392 379.6307 45.7741 0.3331 1605 +1607 3 432.6196 378.5485 45.8368 0.3013 1606 +1608 3 433.0806 377.5543 46.4176 0.2924 1607 +1609 3 433.5417 376.519 46.1412 0.2966 1608 +1610 3 434.1331 375.5546 45.724 0.3051 1609 +1611 3 434.6765 374.6074 44.9694 0.3108 1610 +1612 3 435.2943 373.7288 44.5362 0.3236 1611 +1613 3 436.1191 372.9715 45.0556 0.3425 1612 +1614 3 436.9199 372.1878 45.4236 0.3495 1613 +1615 3 437.3569 371.1891 45.0943 0.3363 1614 +1616 3 437.3134 370.1069 44.3663 0.3025 1615 +1617 3 437.2322 368.9983 43.8348 0.2725 1616 +1618 3 437.6875 368.1472 42.9114 0.2587 1617 +1619 3 437.8546 367.1691 42.7252 0.263 1618 +1620 3 437.723 366.0365 42.7711 0.2669 1619 +1621 3 437.5194 364.912 42.8254 0.2573 1620 +1622 3 437.8214 363.8744 42.3604 0.2542 1621 +1623 3 438.2447 362.8368 41.8051 0.2542 1622 +1624 3 438.6737 361.8266 41.0164 0.2876 1623 +1625 3 439.2766 360.8897 41.4098 0.3151 1624 +1626 3 439.8337 359.8967 41.2846 0.3292 1625 +1627 3 439.9664 358.7698 41.2902 0.3062 1626 +1628 3 440.2993 357.8329 39.9602 0.2532 1627 +1629 3 441.052 357.0252 39.3431 0.202 1628 +1630 3 441.3541 356.0048 40.2144 0.1643 1629 +1631 3 441.3209 354.9294 39.3439 0.1525 1630 +1632 3 441.1607 353.8198 39.6567 0.1525 1631 +1633 3 441.4593 352.7215 39.7398 0.1525 1632 +1634 3 441.4936 351.5867 39.597 0.1567 1633 +1635 3 441.6046 350.4701 39.1633 0.1706 1634 +1636 3 441.7167 349.3387 39.0303 0.1891 1635 +1637 3 441.6961 348.197 38.9049 0.2089 1636 +1638 3 441.6469 347.0576 38.6932 0.2161 1637 +1639 3 441.5531 345.9273 38.3387 0.2105 1638 +1640 3 441.6103 344.8165 37.861 0.1978 1639 +1641 3 441.9741 343.7537 37.5169 0.1963 1640 +1642 3 442.3448 342.6829 37.4209 0.2091 1641 +1643 3 442.3859 341.5618 37.5418 0.2275 1642 +1644 3 442.2258 340.4372 37.7535 0.2472 1643 +1645 3 442.0691 339.3047 37.6796 0.26 1644 +1646 3 441.9432 338.1813 37.9327 0.2549 1645 +1647 3 441.8814 337.0556 38.337 0.2293 1646 +1648 3 441.9203 335.9162 38.386 0.197 1647 +1649 3 442.0759 334.7973 38.0394 0.1713 1648 +1650 3 442.3436 333.7002 37.7381 0.1652 1649 +1651 3 442.7051 332.6203 37.9025 0.1789 1650 +1652 3 443.1284 331.5667 38.2306 0.2045 1651 +1653 3 443.6524 330.5782 38.7545 0.2161 1652 +1654 3 444.2541 329.6253 38.988 0.2019 1653 +1655 3 444.8547 328.6529 38.9189 0.1765 1654 +1656 3 445.3535 327.629 38.7934 0.151 1655 +1657 3 445.9198 326.6486 38.8388 0.1398 1656 +1658 3 446.5318 325.6957 39.1969 0.1469 1657 +1659 3 447.121 324.7233 39.3092 0.1741 1658 +1660 3 447.6289 323.7085 39.4386 0.2051 1659 +1661 3 448.0762 322.6663 39.8 0.2161 1660 +1662 3 448.6276 321.6734 39.9552 0.2161 1661 +1663 3 449.3014 320.7536 40.0988 0.2238 1662 +1664 3 449.9993 319.8498 40.1106 0.2677 1663 +1665 3 450.6079 318.8866 40.1705 0.3319 1664 +1666 3 451.0334 317.8364 40.4202 0.3958 1665 +1667 3 451.2977 316.7278 40.6174 0.4195 1666 +1668 3 451.4807 315.601 40.7784 0.4035 1667 +1669 3 451.2451 314.5394 41.169 0.3686 1668 +1670 3 450.7989 313.4949 41.2482 0.3384 1669 +1671 3 450.2395 312.5053 41.3784 0.3032 1670 +1672 3 450.2223 311.4529 41.9695 0.231 1671 +1673 3 450.434 310.4908 43.3527 0.1578 1672 +1674 3 450.5678 309.3765 43.344 0.1278 1673 +1675 3 450.6754 308.3824 42.0333 0.1424 1674 +1676 3 450.2715 307.5289 40.5927 0.1836 1675 +1677 3 450.2326 306.4021 41.0698 0.2706 1676 +1678 3 450.1834 305.2672 41.2404 0.3562 1677 +1679 3 450.2578 304.1301 41.2196 0.397 1678 +1680 3 450.3653 303.0021 41.5167 0.3911 1679 +1681 3 450.2933 301.8741 41.797 0.3656 1680 +1682 3 449.9363 300.8526 41.2317 0.348 1681 +1683 3 449.6183 299.7966 41.032 0.3117 1682 +1684 3 449.5199 298.7064 41.6198 0.2748 1683 +1685 3 449.5462 297.6345 42.0174 0.2669 1684 +1686 3 449.417 296.5465 42.0927 0.2669 1685 +1687 3 449.2294 295.4735 42.9265 0.2612 1686 +1688 3 448.9228 294.5034 44.0342 0.2405 1687 +1689 3 448.4366 293.571 44.4884 0.2135 1688 +1690 3 447.916 292.5563 44.338 0.2034 1689 +1691 3 447.288 291.6411 43.8612 0.2272 1690 +1692 3 446.716 290.6858 43.3367 0.2801 1691 +1693 3 446.0456 289.8896 42.28 0.3432 1692 +1694 3 426.1617 404.5767 50.5719 0.1883 1465 +1695 3 427.117 403.9613 50.904 0.2277 1694 +1696 3 428.1042 403.3847 50.9527 0.2658 1695 +1697 3 429.0606 402.7566 50.9345 0.2916 1696 +1698 3 430.1177 402.3288 50.7637 0.2924 1697 +1699 3 431.2411 402.1126 50.7987 0.2675 1698 +1700 3 432.289 401.6733 51.1 0.2296 1699 +1701 3 433.2591 401.0795 51.3962 0.2039 1700 +1702 3 434.2681 400.5567 51.7244 0.2034 1701 +1703 3 435.3263 400.3394 52.6333 0.241 1702 +1704 3 436.4074 400.019 52.1956 0.2795 1703 +1705 3 437.5091 399.8829 51.515 0.3177 1704 +1706 3 438.5902 399.5077 51.5284 0.3305 1705 +1707 3 439.6335 399.0592 51.858 0.3559 1706 +1708 3 440.7191 398.8178 51.203 0.3432 1707 +1709 3 441.8574 398.7343 51.0051 0.3305 1708 +1710 3 442.9831 398.5467 51.2 0.2924 1709 +1711 3 444.0402 398.2825 52.0472 0.3051 1710 +1712 3 445.1087 398.0376 52.8514 0.3178 1711 +1713 3 446.192 397.699 53.1938 0.3559 1712 +1714 3 447.2662 397.3043 53.1815 0.3432 1713 +1715 3 448.289 396.7941 53.0788 0.3178 1714 +1716 3 449.0738 396.221 53.1731 0.2584 1715 +1717 3 450.1423 395.8629 53.1829 0.2511 1716 +1718 3 451.2428 395.5552 53.1174 0.2542 1717 +1719 3 452.2129 394.9694 53.0362 0.2247 1718 +1720 3 453.0354 394.2441 52.3359 0.1762 1719 +1721 3 454.0353 393.8128 51.6242 0.1432 1720 +1722 3 454.9985 393.4937 52.7271 0.1652 1721 +1723 3 455.8829 393.3324 54.4393 0.2303 1722 +1724 3 456.9902 393.56 54.8691 0.2938 1723 +1725 3 458.053 393.9742 54.9452 0.3312 1724 +1726 3 459.0323 394.4832 55.6693 0.3425 1725 +1727 3 460.0848 394.7246 56.4029 0.3292 1726 +1728 3 461.0881 394.1972 56.5079 0.3153 1727 +1729 3 461.9781 393.528 56.4245 0.308 1728 +1730 3 463.1004 393.433 56.3203 0.3216 1729 +1731 3 464.2146 393.6447 56.3604 0.3267 1730 +1732 3 465.2602 393.9181 57.1967 0.3098 1731 +1733 3 466.2189 394.3402 58.1756 0.2798 1732 +1734 3 467.2485 394.6903 58.133 0.2588 1733 +1735 3 468.3616 394.6617 58.0006 0.2718 1734 +1736 3 469.4644 394.6583 58.7345 0.2898 1735 +1737 3 470.5421 394.7864 59.383 0.2998 1736 +1738 3 471.6186 395.0667 59.9124 0.2762 1737 +1739 3 472.7294 395.125 60.4206 0.2431 1738 +1740 3 473.8654 395.0392 60.335 0.2231 1739 +1741 3 474.998 394.9752 60.2686 0.2221 1740 +1742 3 476.1385 394.9957 60.3142 0.2288 1741 +1743 3 477.2791 395.0415 60.3151 0.2288 1742 +1744 3 478.4185 395.0369 60.4898 0.2413 1743 +1745 3 479.5568 395.0529 60.5497 0.2542 1744 +1746 3 480.6813 395.2451 60.615 0.2478 1745 +1747 3 481.8013 395.3561 60.9255 0.2216 1746 +1748 3 482.9236 395.2165 61.2637 0.2102 1747 +1749 3 484.0539 395.0987 61.3718 0.2298 1748 +1750 3 485.1395 395.3012 61.7487 0.2415 1749 +1751 3 486.0719 395.0575 62.5257 0.2061 1750 +1752 3 486.6027 394.2167 63.7731 0.1526 1751 +1753 3 486.5775 393.1585 64.533 0.1206 1752 +1754 3 486.1908 392.1094 65.0336 0.1144 1753 +1755 3 485.9735 390.9998 65.219 0.1144 1754 +1756 3 485.5857 389.9335 65.329 0.1144 1755 +1757 3 485.2242 388.865 65.7591 0.1144 1756 +1758 3 484.9599 387.7782 66.3373 0.1144 1757 +1759 3 484.9347 386.6697 66.9606 0.1144 1758 +1760 3 484.873 385.5383 67.2946 0.1246 1759 +1761 3 484.5938 384.4538 67.804 0.1374 1760 +1762 3 484.1797 383.4173 68.4135 0.1501 1761 +1763 3 483.8193 382.3626 69.0365 0.1421 1762 +1764 3 483.9154 381.2574 69.4938 0.1398 1763 +1765 3 484.0996 380.142 69.923 0.1398 1764 +1766 3 483.888 379.1136 70.9411 0.1512 1765 +1767 3 484.1408 378.092 71.96 0.1144 1766 +1768 3 449.6904 396.6889 51.8938 0.2217 1715 +1769 3 450.7738 396.4006 51.6163 0.2476 1768 +1770 3 451.753 395.9167 50.9172 0.2638 1769 +1771 3 452.6636 395.2589 50.5061 0.2766 1770 +1772 3 453.5422 394.5313 50.3096 0.2895 1771 +1773 3 454.2561 393.647 50.3843 0.3127 1772 +1774 3 454.8315 392.6677 50.1469 0.328 1773 +1775 3 455.3692 391.6621 49.924 0.3408 1774 +1776 3 456.0602 390.7584 50.0422 0.312 1775 +1777 3 456.5693 389.7928 49.3618 0.2727 1776 +1778 3 457.0028 388.7472 49.0378 0.2233 1777 +1779 3 457.7956 387.9464 49.1862 0.2051 1778 +1780 3 458.6971 387.2497 49.005 0.1808 1779 +1781 3 459.6992 386.7029 49.0893 0.1663 1780 +1782 3 460.7208 386.2258 48.6517 0.1769 1781 +1783 3 461.8065 385.8804 48.7542 0.202 1782 +1784 3 462.8601 385.4411 48.573 0.2283 1783 +1785 3 463.9217 385.0704 48.0679 0.2163 1784 +1786 3 465.0063 384.7867 47.5121 0.2035 1785 +1787 3 466.0656 384.384 47.88 0.2288 1786 +1788 3 424.5304 414.5181 48.6119 0.4049 1457 +1789 3 425.6149 414.3488 48.4985 0.3843 1788 +1790 3 426.7326 414.3511 47.9606 0.3226 1789 +1791 3 427.8629 414.4518 48.193 0.293 1790 +1792 3 428.9222 414.4197 49.2402 0.3297 1791 +1793 3 430.0628 414.3614 49.1826 0.3939 1792 +1794 3 431.161 414.1658 48.5643 0.4576 1793 +1795 3 432.2512 413.365 49.2086 0.2714 1794 +1796 3 433.2728 412.8753 49.0532 0.2178 1795 +1797 3 434.3871 412.674 48.8684 0.1954 1796 +1798 3 435.5208 412.5367 48.7368 0.2072 1797 +1799 3 436.5996 412.1901 48.5598 0.2509 1798 +1800 3 437.6761 411.8228 48.7026 0.318 1799 +1801 3 438.6462 411.2348 48.648 0.3665 1800 +1802 3 439.7719 411.0918 48.4428 0.3813 1801 +1803 3 440.9102 411.0392 48.6889 0.3813 1802 +1804 3 441.4364 410.8836 48.9308 0.2766 1803 +1805 3 442.4832 410.5747 49.7518 0.2086 1804 +1806 3 443.4899 410.0565 49.77 0.2034 1805 +1807 3 444.4795 409.6218 50.6562 0.24 1806 +1808 3 445.4221 409.004 51.1188 0.2782 1807 +1809 3 446.255 408.2204 51.1778 0.2921 1808 +1810 3 447.264 407.7022 50.8547 0.2401 1809 +1811 3 448.2798 407.1988 50.5025 0.1775 1810 +1812 3 449.2545 406.6016 50.5646 0.1667 1811 +1813 3 450.2967 406.1703 50.9656 0.2067 1812 +1814 3 451.292 406.0022 52.2808 0.2805 1813 +1815 3 452.3296 405.7425 53.0818 0.2936 1814 +1816 3 453.2048 405.0698 52.4322 0.3051 1815 +1817 3 454.2504 404.6179 52.4031 0.3133 1816 +1818 3 455.2376 404.0986 52.9556 0.3625 1817 +1819 3 456.1048 403.3721 53.3652 0.3963 1818 +1820 3 456.9628 402.6388 53.6164 0.3994 1819 +1821 3 457.8139 401.9021 53.1835 0.3564 1820 +1822 3 458.6193 401.1001 53.3268 0.3014 1821 +1823 3 459.4636 400.3863 53.9221 0.2476 1822 +1824 3 460.4646 399.8623 54.2038 0.2254 1823 +1825 3 461.4816 399.399 54.014 0.2199 1824 +1826 3 462.6142 399.288 54.1321 0.2208 1825 +1827 3 463.7296 399.3178 54.595 0.1905 1826 +1828 3 464.798 399.6484 55.1062 0.1517 1827 +1829 3 465.7796 400.1723 55.7052 0.1225 1828 +1830 3 466.6811 400.6963 55.3316 0.1195 1829 +1831 3 467.5631 400.948 55.1653 0.1335 1830 +1832 3 468.5916 401.0075 55.5932 0.1613 1831 +1833 3 469.6109 401.2912 54.8041 0.2016 1832 +1834 3 470.5444 401.8025 55.1516 0.251 1833 +1835 3 471.6094 402.0108 55.8155 0.2759 1834 +1836 3 472.6859 401.7545 56.294 0.2701 1835 +1837 3 473.4066 400.9274 56.4973 0.2559 1836 +1838 3 473.8334 399.9664 57.5322 0.2542 1837 +1839 3 474.6033 399.2537 58.6062 0.2542 1838 +1840 3 475.578 398.6691 58.5956 0.2168 1839 +1841 3 476.4074 397.9095 58.0905 0.1781 1840 +1842 3 477.1212 397.0218 57.8435 0.1653 1841 +1843 3 478.0776 396.396 57.96 0.2288 1842 +1844 3 441.9592 411.1788 47.9024 0.2339 1803 +1845 3 443.0174 411.594 47.614 0.2042 1844 +1846 3 444.0047 412.1626 47.3729 0.2158 1845 +1847 3 444.8753 412.8913 47.6826 0.2659 1846 +1848 3 445.7138 413.6681 47.8036 0.2794 1847 +1849 3 446.684 414.2504 47.4074 0.2923 1848 +1850 3 447.5694 414.668 45.9637 0.2796 1849 +1851 3 448.6276 415.0009 45.2833 0.2794 1850 +1852 3 449.759 415.1599 45.2497 0.2675 1851 +1853 3 450.8973 415.0546 45.2012 0.2803 1852 +1854 3 452.039 415.0169 45.1576 0.2916 1853 +1855 3 453.143 414.8876 44.5024 0.278 1854 +1856 3 454.2366 414.668 43.9062 0.2525 1855 +1857 3 455.36 414.4655 44.0765 0.2297 1856 +1858 3 456.48 414.2424 44.0681 0.2424 1857 +1859 3 457.6034 414.2161 44.4212 0.2542 1858 +1860 3 458.6719 414.5753 43.967 0.2531 1859 +1861 3 459.7404 414.9666 44.1129 0.2402 1860 +1862 3 460.7849 415.2869 44.9056 0.2288 1861 +1863 3 461.8248 415.7571 45.0542 0.2307 1862 +1864 3 462.8384 416.265 44.9873 0.2415 1863 +1865 3 463.9263 416.5235 45.0318 0.247 1864 +1866 3 465.0349 416.6425 45.5333 0.2481 1865 +1867 3 466.1606 416.5258 45.7836 0.2536 1866 +1868 3 467.2645 416.2387 45.9052 0.2669 1867 +1869 3 468.3753 415.9813 45.8287 0.2731 1868 +1870 3 469.3889 416.2147 46.1552 0.2666 1869 +1871 3 470.2126 416.9605 46.7292 0.2542 1870 +1872 3 471.1427 417.5463 46.6371 0.2616 1871 +1873 3 472.1757 418.0084 46.2529 0.2746 1872 +1874 3 473.0749 418.6834 45.9264 0.264 1873 +1875 3 473.9443 419.4098 45.5661 0.2305 1874 +1876 3 474.9785 419.7599 45.1105 0.208 1875 +1877 3 476.0985 419.6947 45.1522 0.2202 1876 +1878 3 477.1944 419.7748 45.7542 0.2288 1877 +1879 3 478.16 420.3022 46.256 0.2113 1878 +1880 3 479.0626 420.9977 46.2997 0.1764 1879 +1881 3 479.9652 421.5983 45.5269 0.1557 1880 +1882 3 480.7717 422.1909 44.1888 0.1725 1881 +1883 3 481.8082 422.5467 43.7469 0.2106 1882 +1884 3 482.8664 422.1978 43.6276 0.2601 1883 +1885 3 483.9498 421.8546 43.3303 0.2782 1884 +1886 3 485.0686 421.8157 42.7994 0.2564 1885 +1887 3 486.2011 421.8958 42.4908 0.2075 1886 +1888 3 487.328 421.7299 42.3035 0.1555 1887 +1889 3 488.3313 421.1888 42.2232 0.1282 1888 +1890 3 489.3689 420.7071 42.3013 0.1149 1889 +1891 3 490.4911 420.4921 42.2878 0.1144 1890 +1892 3 491.626 420.3742 42.4637 0.1144 1891 +1893 3 492.7574 420.4738 42.1546 0.1144 1892 +1894 3 493.8316 420.7174 41.3963 0.1144 1893 +1895 3 494.9436 420.952 41.0617 0.1144 1894 +1896 3 496.0418 420.849 40.3217 0.1144 1895 +1897 3 497.1824 420.7632 40.32 0.1144 1896 +1898 3 431.9813 414.4735 48.5276 0.2727 1794 +1899 3 433.0852 414.7229 48.5624 0.1397 1898 +1900 3 434.1228 415.0558 48.2068 0.1335 1899 +1901 3 435.1467 415.4791 47.8579 0.1528 1900 +1902 3 436.142 415.9881 47.9632 0.1787 1901 +1903 3 437.0263 416.7089 47.8884 0.212 1902 +1904 3 437.8214 417.5074 48.0894 0.2361 1903 +1905 3 438.6451 418.283 48.309 0.2263 1904 +1906 3 439.5317 418.9957 48.0931 0.1929 1905 +1907 3 440.5647 419.3893 47.8862 0.1613 1906 +1908 3 441.6915 419.4842 47.5415 0.1525 1907 +1909 3 442.8241 419.5906 47.5138 0.17 1908 +1910 3 443.9338 419.4144 47.5745 0.2146 1909 +1911 3 445.0137 419.5506 47.1187 0.2662 1910 +1912 3 446.1142 419.7107 46.4971 0.2701 1911 +1913 3 447.2102 419.7954 45.7265 0.2183 1912 +1914 3 448.329 419.967 45.5661 0.1738 1913 +1915 3 449.4307 420.269 45.5927 0.1955 1914 +1916 3 450.466 420.746 45.7178 0.2747 1915 +1917 3 451.5231 421.1773 45.857 0.3439 1916 +1918 3 452.5138 421.7413 45.9774 0.3665 1917 +1919 3 453.4576 422.319 45.3432 0.3469 1918 +1920 3 454.327 423.0478 45.3242 0.2988 1919 +1921 3 455.3875 423.3898 44.8854 0.2584 1920 +1922 3 456.4068 423.8863 45.0526 0.2315 1921 +1923 3 457.4845 424.2364 44.7535 0.2402 1922 +1924 3 458.5884 424.1334 44.1521 0.2298 1923 +1925 3 459.721 424.1483 43.7928 0.2288 1924 +1926 3 460.7483 423.7342 44.4744 0.2298 1925 +1927 3 461.8465 423.455 44.5329 0.2818 1926 +1928 3 462.8704 423.6712 45.5062 0.3226 1927 +1929 3 463.8989 424.1346 45.194 0.3559 1928 +1930 3 464.8369 424.7375 45.6792 0.3536 1929 +1931 3 465.5394 425.6206 46.1068 0.3302 1930 +1932 3 466.2669 426.4878 46.2493 0.271 1931 +1933 3 467.1684 427.1364 46.8289 0.2345 1932 +1934 3 467.8868 427.8835 47.7462 0.2211 1933 +1935 3 468.3342 428.9234 48.1043 0.2229 1934 +1936 3 469.0297 429.715 48.5316 0.2161 1935 +1937 3 470.0604 430.1566 48.704 0.223 1936 +1938 3 470.9104 430.8361 48.7707 0.2426 1937 +1939 3 471.4561 431.82 49.1826 0.2612 1938 +1940 3 471.9652 432.8107 49.7748 0.2669 1939 +1941 3 472.798 433.5074 50.15 0.2747 1940 +1942 3 473.7636 434.0061 50.8878 0.2715 1941 +1943 3 474.6342 434.6651 51.5922 0.2669 1942 +1944 3 475.4739 435.427 51.9677 0.2406 1943 +1945 3 476.4543 435.9864 51.9652 0.2288 1944 +1946 3 477.4427 436.5447 52.19 0.2012 1945 +1947 3 478.1291 437.3912 52.8091 0.1811 1946 +1948 3 478.7102 438.3636 52.8021 0.1487 1947 +1949 3 479.4664 439.2113 52.8032 0.13 1948 +1950 3 480.2638 439.7845 54.0548 0.1168 1949 +1951 3 480.7671 440.7374 54.4897 0.1248 1950 +1952 3 481.2213 441.767 54.0837 0.1375 1951 +1953 3 481.7864 442.7543 53.8362 0.1504 1952 +1954 3 482.0622 443.8526 53.93 0.1417 1953 +1955 3 482.1422 444.9874 53.72 0.129 1954 +1956 3 482.323 446.1108 53.4498 0.1162 1955 +1957 3 482.5072 447.2388 53.3221 0.1144 1956 +1958 3 482.5449 448.3794 53.3607 0.1364 1957 +1959 3 482.1411 449.433 53.1852 0.1637 1958 +1960 3 481.2682 450.1617 53.1401 0.1893 1959 +1961 3 480.3427 450.8207 53.4517 0.1661 1960 +1962 3 479.4355 451.4693 54.084 0.1528 1961 +1963 3 478.5375 452.1317 54.6974 0.1525 1962 +1964 3 477.8488 453.024 55.16 0.2288 1963 +1965 2 416.948 419.5403 47.6647 0.1144 1 +1966 2 417.6046 420.4761 47.5507 0.1144 1965 +1967 2 418.2624 421.4107 47.4365 0.1144 1966 +1968 2 419.0827 422.1554 47.2511 0.1206 1967 +1969 2 419.8949 422.899 46.9409 0.1417 1968 +1970 2 420.3376 423.9332 46.9924 0.1684 1969 +1971 2 421.1339 424.5533 46.8101 0.1864 1970 +1972 2 422.2024 424.7397 47.327 0.1819 1971 +1973 2 423.0375 425.2854 48.4434 0.1678 1972 +1974 2 423.4688 426.3036 48.8449 0.1441 1973 +1975 2 423.9092 427.3504 49.1618 0.129 1974 +1976 2 424.4663 428.3456 49.1 0.1271 1975 +1977 2 425.044 429.326 48.8174 0.138 1976 +1978 2 425.6584 430.2641 49.264 0.1626 1977 +1979 2 426.5004 431.0043 49.7773 0.1652 1978 +1980 2 427.2176 431.86 49.2498 0.1652 1979 +1981 2 427.856 432.7752 49.84 0.1144 1980 +1982 3 416.8999 419.236 45.1746 0.1144 1 +1983 3 417.5245 420.0013 43.7637 0.1144 1982 +1984 3 418.1492 420.7666 42.3525 0.1256 1983 +1985 3 418.8058 421.5446 41.0732 0.161 1984 +1986 3 419.6936 422.2138 40.4936 0.2238 1985 +1987 3 420.7815 422.5284 40.2144 0.2883 1986 +1988 3 421.8306 422.136 39.8532 0.3432 1987 +1989 3 420.9016 421.6544 39.0558 0.2669 1988 +1990 3 420.6728 420.8055 37.8036 0.2669 1989 +1991 3 420.8696 419.7256 37.0546 0.2669 1990 +1992 3 420.8616 418.6216 36.7489 0.2838 1991 +1993 3 420.4063 418.0027 35.1926 0.3144 1992 +1994 3 419.3424 417.8208 34.6254 0.3178 1993 +1995 3 418.2556 417.4776 34.386 0.267 1994 +1996 3 417.2934 416.8988 33.8489 0.1144 1995 +1997 3 416.6826 416.4526 32.8378 0.1949 1996 +1998 3 415.7937 416.0373 31.4345 0.2569 1997 +1999 3 415.0318 415.725 32.6483 0.3018 1998 +2000 3 414.104 415.828 34.2311 0.3424 1999 +2001 3 412.9829 415.9492 34.6629 0.3807 2000 +2002 3 412.0562 416.0728 33.0711 0.4195 2001 +2003 3 411.3218 415.9836 33.0798 0.3811 2002 +2004 3 410.4649 416.0259 32.1793 0.3432 2003 +2005 3 409.989 416.7146 31.2967 0.3363 2004 +2006 3 409.3449 417.6046 32.006 0.3305 2005 +2007 3 408.5727 418.3928 32.0331 0.2806 2006 +2008 3 407.8738 419.2588 31.4084 0.244 2007 +2009 3 407.0947 420.0699 31.8041 0.2183 2008 +2010 3 406.311 420.8993 31.9318 0.2278 2009 +2011 3 405.6212 421.7699 31.2973 0.2288 2010 +2012 3 405.3478 422.6062 29.5565 0.2044 2011 +2013 3 404.7907 423.304 29.9611 0.1631 2012 +2014 3 404.9302 424.1872 30.3162 0.1398 2013 +2015 3 404.7712 424.8667 28.285 0.1398 2014 +2016 3 404.2461 425.6138 28.126 0.1658 2015 +2017 3 403.6993 426.402 29.6089 0.1991 2016 +2018 3 402.8768 427.1307 29.5758 0.2367 2017 +2019 3 402.267 427.5025 27.5783 0.2549 2018 +2020 3 401.1699 427.7748 27.2474 0.2669 2019 +2021 3 400.0488 427.8732 27.0144 0.2613 2020 +2022 3 398.9952 427.7954 26.4026 0.2345 2021 +2023 3 397.9335 427.5185 27.0337 0.2076 2022 +2024 3 396.8422 427.5437 26.9671 0.2073 2023 +2025 3 395.7943 427.379 26.068 0.2526 2024 +2026 3 394.7109 427.1284 25.6917 0.3043 2025 +2027 3 393.5886 426.9419 25.5492 0.3178 2026 +2028 3 392.4744 426.7749 25.6449 0.2911 2027 +2029 3 391.3658 426.744 26.3105 0.2574 2028 +2030 3 390.2584 426.831 26.364 0.2415 2029 +2031 3 389.151 426.9934 26.5317 0.2185 2030 +2032 3 388.1089 427.149 25.9809 0.1956 2031 +2033 3 387.0221 427.2783 25.5049 0.1907 2032 +2034 3 385.909 427.2119 25.9552 0.2287 2033 +2035 3 384.8565 427.4327 26.761 0.2852 2034 +2036 3 383.8051 427.4453 25.9179 0.3172 2035 +2037 3 383.0238 428.2347 25.3394 0.3042 2036 +2038 3 381.9896 428.563 25.1919 0.2841 2037 +2039 3 380.8696 428.5813 25.3266 0.2978 2038 +2040 3 379.76 428.7449 25.5338 0.3111 2039 +2041 3 378.791 429.1556 25.9759 0.2974 2040 +2042 3 378.4009 430.0102 25.0701 0.2707 2041 +2043 3 378.386 431.0169 25.5394 0.2563 2042 +2044 3 377.8826 431.9664 25.104 0.2881 2043 +2045 3 376.9228 432.4537 24.2948 0.3161 2044 +2046 3 376.1472 433.2328 24.92 0.3432 2045 +2047 3 411.3046 415.129 32.1364 0.3456 2002 +2048 3 410.4855 414.4174 31.99 0.3138 2047 +2049 3 409.4227 414.2413 32.5049 0.3226 2048 +2050 3 408.3096 414.2378 32.2269 0.3486 2049 +2051 3 407.248 413.9507 31.5722 0.3753 2050 +2052 3 406.215 414.1028 30.6886 0.3707 2051 +2053 3 405.2071 413.7654 29.8875 0.3457 2052 +2054 3 404.0848 413.6018 29.9158 0.3192 2053 +2055 3 402.9706 413.3466 29.8385 0.3052 2054 +2056 3 401.8872 412.984 29.68 0.3432 2055 +2057 3 417.5211 416.6917 30.9996 0.2585 1996 +2058 3 418.5049 416.2192 30.2204 0.3615 2057 +2059 3 419.6066 416.1208 29.965 0.4149 2058 +2060 3 420.3937 416.7192 28.9204 0.3664 2059 +2061 3 420.6831 417.3095 26.759 0.2968 2060 +2062 3 421.0195 418.2567 25.6124 0.2542 2061 +2063 3 421.6704 419.181 25.3901 0.2486 2062 +2064 3 422.5719 419.6444 25.4464 0.2545 2063 +2065 3 423.6827 419.578 25.9115 0.2744 2064 +2066 3 424.7775 419.3984 25.9818 0.2952 2065 +2067 3 425.8357 419.459 25.1835 0.3051 2066 +2068 3 426.3047 420.1786 23.7658 0.3155 2067 +2069 3 425.8849 421.1579 23.9176 0.3302 2068 +2070 3 425.4879 422.2287 24.0481 0.343 2069 +2071 3 424.4492 422.6954 23.9868 0.3432 2070 +2072 3 423.5317 423.1782 23.6723 0.3241 2071 +2073 3 422.6508 423.8188 22.8981 0.2773 2072 +2074 3 422.1371 424.6837 22.227 0.2488 2073 +2075 3 421.7939 425.6492 21.5152 0.2415 2074 +2076 3 421.2311 426.5965 21.0017 0.2415 2075 +2077 3 420.8536 427.6455 21.0126 0.2336 2076 +2078 3 420.0791 428.2141 21.9215 0.2466 2077 +2079 3 419.0518 428.3708 23.0787 0.2635 2078 +2080 3 418.3963 428.6717 25.0925 0.2669 2079 +2081 3 418.1103 429.6772 25.9507 0.2305 2080 +2082 3 417.3312 430.3728 24.92 0.2288 2081 +2083 3 425.8231 423.153 22.3068 0.225 2071 +2084 3 426.6731 423.7868 21.3234 0.193 2083 +2085 3 427.0072 424.8576 21.2206 0.1907 2084 +2086 3 426.9568 425.9581 21.9419 0.2278 2085 +2087 3 426.7417 427.0598 21.4424 0.254 2086 +2088 3 426.8264 428.1992 21.56 0.2288 2087 +2089 3 422.7709 421.3661 39.0477 0.256 1988 +2090 3 423.7387 420.7975 38.6831 0.2288 2089 +2091 3 424.8244 420.7964 38.0369 0.3008 2090 +2092 3 425.9409 420.5722 38.0584 0.3926 2091 +2093 3 426.9911 420.9794 37.6132 0.4957 2092 +2094 3 428.0928 420.8135 36.906 0.3934 2093 +2095 3 429.2185 420.754 36.7021 0.3232 2094 +2096 3 430.0113 420.9874 35.294 0.2963 2095 +2097 3 430.9928 421.167 34.3991 0.3017 2096 +2098 3 432.1128 421.024 34.188 0.3051 2097 +2099 3 433.147 421.0355 33.1618 0.3051 2098 +2100 3 434.1514 421.3283 32.0667 0.3051 2099 +2101 3 435.2623 421.3958 31.5487 0.3051 2100 +2102 3 436.3628 421.6681 31.2911 0.2933 2101 +2103 3 437.302 422.2996 31.586 0.2924 2102 +2104 3 438.3465 422.7526 31.3732 0.2924 2103 +2105 3 439.4276 422.43 31.2452 0.3296 2104 +2106 3 440.4652 421.9827 30.8042 0.3305 2105 +2107 3 441.5291 421.739 29.9782 0.318 2106 +2108 3 442.6719 421.7745 29.9541 0.3053 2107 +2109 3 443.7908 421.5468 29.8609 0.33 2108 +2110 3 444.913 421.3375 29.664 0.3806 2109 +2111 3 445.9724 421.6406 29.5322 0.3792 2110 +2112 3 446.3499 422.716 29.3829 0.3488 2111 +2113 3 446.5924 423.8211 29.6139 0.2828 2112 +2114 3 447.1942 424.7626 29.8824 0.2202 2113 +2115 3 448.0579 425.3552 29.1102 0.1725 2114 +2116 3 448.8324 425.3701 27.58 0.1525 2115 +2117 3 449.6435 424.5922 27.442 0.1699 2116 +2118 3 450.1102 424.0568 25.632 0.2161 2117 +2119 3 451.0197 423.7525 25.5559 0.2907 2118 +2120 3 452.1477 423.7731 25.5676 0.3373 2119 +2121 3 453.2574 423.6838 24.9785 0.3432 2120 +2122 3 454.2309 423.6461 23.5528 0.3104 2121 +2123 3 455.3143 423.7124 22.7273 0.2941 2122 +2124 3 456.2684 423.1793 23.1028 0.3036 2123 +2125 3 457.211 422.5536 23.506 0.3394 2124 +2126 3 458.3184 422.3076 23.6379 0.3549 2125 +2127 3 459.4315 422.3648 23.0686 0.3559 2126 +2128 3 460.2655 423.0398 22.1992 0.3311 2127 +2129 3 461.1453 423.7342 21.6303 0.3052 2128 +2130 3 461.8591 424.6265 21.5228 0.2288 2129 +2131 3 428.142 422.1623 36.9488 0.3607 2093 +2132 3 428.9966 422.7778 35.9517 0.2996 2131 +2133 3 429.9747 423.0112 34.9129 0.2597 2132 +2134 3 431.0935 423.0146 34.3395 0.2209 2133 +2135 3 432.114 423.2937 33.504 0.1746 2134 +2136 3 433.1333 423.7079 32.9602 0.1448 2135 +2137 3 434.2407 423.9081 33.2004 0.1398 2136 +2138 3 435.3721 424.0328 33.3992 0.1686 2137 +2139 3 436.3857 424.4549 32.7984 0.1993 2138 +2140 3 437.0629 425.3415 32.5702 0.2481 2139 +2141 3 437.2551 426.4557 32.7029 0.277 2140 +2142 3 437.9815 427.2829 33.231 0.3157 2141 +2143 3 439.0077 427.7553 32.933 0.33 2142 +2144 3 439.7078 428.6271 32.4288 0.3431 2143 +2145 3 440.1746 429.5926 33.3942 0.3299 2144 +2146 3 440.7397 430.5822 33.29 0.3034 2145 +2147 3 441.1195 431.598 32.408 0.2663 2146 +2148 3 441.7018 432.5636 32.0118 0.2535 2147 +2149 3 442.3756 433.4536 32.6225 0.2415 2148 +2150 3 443.0186 434.3162 33.5608 0.2406 2149 +2151 3 443.4876 435.3217 34.1928 0.2317 2150 +2152 3 443.8674 436.3948 33.9511 0.2688 2151 +2153 3 444.4028 437.3901 33.5524 0.2924 2152 +2154 3 445.1167 438.2572 33.2749 0.2855 2153 +2155 3 445.6395 439.1965 33.9478 0.2247 2154 +2156 3 446.2538 440.0819 33.4356 0.2071 2155 +2157 3 446.891 440.9411 33.9592 0.2369 2156 +2158 3 447.8337 441.5703 34.071 0.2931 2157 +2159 3 448.694 442.2979 33.7565 0.3296 2158 +2160 3 449.632 442.9225 33.3264 0.3358 2159 +2161 3 450.5438 443.6089 33.1962 0.3305 2160 +2162 3 451.2199 444.5069 33.1201 0.3305 2161 +2163 3 451.554 445.5846 33.2228 0.3305 2162 +2164 3 452.0791 446.5673 33.3119 0.314 2163 +2165 3 452.8856 447.3578 33.0484 0.2799 2164 +2166 3 453.7893 448.0282 32.5578 0.2582 2165 +2167 3 454.6828 448.6528 33.061 0.2542 2166 +2168 3 455.5854 449.2488 33.9704 0.282 2167 +2169 3 456.4835 449.8277 33.4496 0.312 2168 +2170 3 457.1699 450.6982 33.0798 0.3381 2169 +2171 3 457.9855 451.4888 32.951 0.333 2170 +2172 3 458.744 452.3307 32.625 0.3203 2171 +2173 3 459.5723 453.0652 33.1416 0.3075 2172 +2174 3 460.6591 453.1533 33.3698 0.3155 2173 +2175 3 461.7802 453.0446 33.8352 0.3286 2174 +2176 3 462.9127 453.1281 34.0298 0.3421 2175 +2177 3 464.0087 453.4393 34.2294 0.3305 2176 +2178 3 465.1115 453.3798 33.5093 0.303 2177 +2179 3 466.2132 453.2597 33.0711 0.277 2178 +2180 3 467.0472 453.3397 31.9206 0.2518 2179 +2181 3 467.9086 453.2551 33.5829 0.2336 2180 +2182 3 469.048 453.2757 33.8136 0.2161 2181 +2183 3 470.1257 453.0904 33.2979 0.2254 2182 +2184 3 471.0157 453.6006 32.881 0.258 2183 +2185 3 471.9263 454.2778 32.5486 0.2984 2184 +2186 3 472.9879 454.6725 32.6374 0.3161 2185 +2187 3 474.0622 455.0523 32.8947 0.3178 2186 +2188 3 475.1158 455.4378 32.408 0.2942 2187 +2189 3 476.2323 455.6552 32.1608 0.2675 2188 +2190 3 477.3477 455.7868 31.6327 0.2163 2189 +2191 3 478.4208 456.1128 31.08 0.1144 2190 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc new file mode 100644 index 0000000..84e566f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc @@ -0,0 +1,3786 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/177300.01.02.01/reconstruction/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01___DS.swc +# id,type,x,y,z,r,pid +1 1 303.16 379.4648 28.56 5.4428 -1 +2 3 302.6646 375.232 23.2562 0.2524 1 +3 3 302.469 374.2356 21.9996 0.2615 2 +4 3 302.0057 373.2918 21.0081 0.3026 3 +5 3 301.2358 372.4956 20.7318 0.36 4 +6 3 300.3366 371.832 20.7847 0.3728 5 +7 3 299.7177 370.8768 20.9602 0.3575 6 +8 3 299.5049 369.798 21.7249 0.3935 7 +9 3 299.5198 368.6563 21.8372 0.4067 8 +10 3 299.6319 367.518 21.8288 0.432 9 +11 3 299.9305 366.414 21.7669 0.3941 10 +12 3 299.9534 365.2803 21.3934 0.3432 11 +13 3 299.2818 364.1844 21.835 0.3426 12 +14 3 298.4113 363.4442 21.8336 0.3307 13 +15 3 297.5372 362.7052 21.8064 0.2929 14 +16 3 297.0465 361.6756 21.639 0.2796 15 +17 3 296.5568 360.9103 20.5181 0.1964 16 +18 3 296.4024 359.8749 19.7562 0.1915 17 +19 3 296.2342 358.7584 19.6034 0.2477 18 +20 3 295.8212 357.6968 19.6199 0.3025 19 +21 3 295.3156 356.6717 19.7109 0.3267 20 +22 3 294.8111 355.6582 20.0852 0.3125 21 +23 3 294.0824 354.8276 20.6212 0.2917 22 +24 3 293.1958 354.116 20.4296 0.2796 23 +25 3 292.2016 353.6642 19.6 0.2759 24 +26 3 291.2704 353.0922 18.898 0.2278 25 +27 3 290.7682 352.0832 18.6127 0.2161 26 +28 3 290.5108 351.0433 17.754 0.2229 27 +29 3 289.7706 350.1956 17.3659 0.2669 28 +30 3 288.9069 349.46 17.3953 0.2585 29 +31 3 288.2308 348.5425 17.535 0.2245 30 +32 3 287.7171 347.5724 18.1266 0.1808 31 +33 3 287.8121 346.4821 18.8541 0.178 32 +34 3 288.0684 345.5772 17.267 0.1907 33 +35 3 288.1038 344.6838 15.5235 0.1907 34 +36 3 288.3566 343.6084 14.8921 0.1932 35 +37 3 289.0007 342.6692 15.113 0.2306 36 +38 3 289.4698 341.6281 15.0758 0.2553 37 +39 3 289.7329 340.523 14.8417 0.2621 38 +40 3 289.9468 339.4706 13.8762 0.2132 39 +41 3 289.9823 338.4535 12.9086 0.1907 40 +42 3 289.2009 337.6253 12.7764 0.193 41 +43 3 288.28 336.9618 12.5132 0.2034 42 +44 3 287.3865 336.447 12.6182 0.1978 43 +45 3 286.7791 336.0088 14.0918 0.1738 44 +46 3 285.6522 336.058 14.2492 0.1515 45 +47 3 284.6936 335.8498 15.4532 0.129 46 +48 3 284.0746 334.9357 15.6929 0.1155 47 +49 3 283.2212 334.4781 14.3422 0.1503 48 +50 3 282.1104 334.62 14.0 0.2288 49 +51 3 297.5086 361.2443 21.7473 0.2584 16 +52 3 298.2465 360.3806 21.812 0.2203 51 +53 3 299.0313 359.5729 21.5678 0.189 52 +54 3 299.8252 358.9929 20.3588 0.1631 53 +55 3 300.6764 358.4941 19.0198 0.1603 54 +56 3 301.6076 357.905 18.9526 0.1896 55 +57 3 302.6681 357.5847 19.1615 0.2288 56 +58 3 303.6462 357.6579 18.0536 0.259 57 +59 3 304.3143 358.2859 16.6068 0.2577 58 +60 3 305.273 358.7092 15.9995 0.2542 59 +61 3 306.3003 358.3855 15.4902 0.2746 60 +62 3 307.2201 357.7723 15.972 0.3216 61 +63 3 308.3194 357.5938 16.03 0.3518 62 +64 3 309.3719 357.9027 15.4003 0.3559 63 +65 3 310.27 358.5879 15.2365 0.3559 64 +66 3 311.2241 359.1908 15.6405 0.4007 65 +67 3 312.3452 359.3235 15.6626 0.4529 66 +68 3 313.3633 359.3281 14.45 0.4576 67 +69 3 314.4902 359.3155 14.0638 0.3872 68 +70 3 315.6227 359.2183 14.3315 0.275 69 +71 3 316.6146 358.6772 14.0784 0.1907 70 +72 3 297.6768 360.9823 21.0529 0.2519 16 +73 3 298.1767 360.1484 21.8341 0.2161 72 +74 3 298.8471 359.2503 21.56 0.2814 73 +75 3 299.5621 358.6211 20.615 0.3759 74 +76 3 300.0815 357.8238 20.72 0.2132 75 +77 3 300.292 357.1762 22.12 0.2339 76 +78 3 299.9568 356.1272 21.84 0.2542 77 +79 3 299.4386 355.2051 21.56 0.1682 78 +80 3 298.7739 355.0896 20.44 0.134 79 +81 3 298.0166 354.9249 20.144 0.1525 80 +82 3 297.3714 353.9856 20.16 0.1773 81 +83 3 296.8543 353.0487 20.16 0.2539 82 +84 3 296.296 352.6552 21.1915 0.2161 83 +85 3 295.9803 351.7892 22.2888 0.1689 84 +86 3 294.9953 351.6496 21.9878 0.2941 85 +87 3 294.31 350.8808 21.5746 0.2539 86 +88 3 294.0755 349.905 21.553 0.306 87 +89 3 294.1178 348.8777 21.5995 0.19 88 +90 3 293.8044 347.8172 21.9859 0.1909 89 +91 3 293.3216 347.2166 20.7444 0.2288 90 +92 3 292.88 346.2968 21.0288 0.2919 91 +93 3 292.0643 345.7408 21.4584 0.287 92 +94 3 291.5095 344.9286 21.9114 0.3051 93 +95 3 291.1274 344.3028 23.312 0.3181 94 +96 3 290.7224 343.3213 24.0131 0.2851 95 +97 3 290.0349 342.9987 22.4826 0.2796 96 +98 3 289.6368 342.072 22.5103 0.1907 97 +99 3 288.7639 341.8547 23.6482 0.1478 98 +100 3 288.5134 341.1408 22.7452 0.1144 99 +101 3 287.9894 340.7335 21.0946 0.1782 100 +102 3 287.5444 339.8401 21.1212 0.3741 101 +103 3 286.763 339.4969 22.6559 0.2734 102 +104 3 286.1144 338.7647 22.4328 0.2962 103 +105 3 285.1912 338.4993 21.5729 0.2551 104 +106 3 284.4579 337.6836 22.12 0.2834 105 +107 3 283.7726 337.0407 22.7903 0.2726 106 +108 3 283.029 336.4676 24.0041 0.3535 107 +109 3 282.2408 335.7526 23.9999 0.3137 108 +110 3 281.6459 335.0204 23.2201 0.2542 109 +111 3 281.1758 334.6051 21.6723 0.3279 110 +112 3 280.7239 333.8936 21.908 0.2878 111 +113 3 280.7204 333.2483 22.5652 0.178 112 +114 3 280.6106 331.9625 21.9254 0.2238 113 +115 3 280.2777 330.8974 21.8338 0.1859 114 +116 3 279.6336 329.9525 21.7932 0.1725 115 +117 3 279.4929 328.9766 21.4362 0.1713 116 +118 3 279.8762 327.9219 20.9927 0.178 117 +119 3 279.557 326.9964 20.8474 0.2002 118 +120 3 278.9838 326.04 20.7374 0.2394 119 +121 3 278.6063 324.9612 20.6027 0.2699 120 +122 3 278.318 323.8927 20.0052 0.2716 121 +123 3 277.9256 322.894 19.0859 0.242 122 +124 3 277.4726 321.933 19.4888 0.2288 123 +125 3 277.1031 320.9 19.395 0.2381 124 +126 3 276.8137 319.8567 18.5102 0.2604 125 +127 3 276.6444 318.7459 18.1843 0.2669 126 +128 3 276.6066 317.6705 18.996 0.2669 127 +129 3 276.5494 316.5757 18.625 0.2793 128 +130 3 276.2028 315.4889 18.4803 0.3048 129 +131 3 275.728 314.449 18.4696 0.3303 130 +132 3 275.259 313.4057 18.4229 0.3305 131 +133 3 274.528 312.5294 18.2322 0.3052 132 +134 3 273.9045 311.621 17.484 0.2668 133 +135 3 273.2902 310.691 17.3606 0.2264 134 +136 3 273.098 309.5881 17.365 0.2087 135 +137 3 272.6953 308.5791 17.3846 0.2034 136 +138 3 271.9505 307.7131 17.4605 0.2263 137 +139 3 271.2458 306.8345 17.8511 0.2724 138 +140 3 270.5903 305.9182 18.3238 0.3157 139 +141 3 269.9634 304.9675 18.482 0.3223 140 +142 3 269.3033 304.034 18.4895 0.2879 141 +143 3 268.6341 303.1097 18.5256 0.2646 142 +144 3 267.8436 302.2906 18.7183 0.2519 143 +145 3 267.0313 301.5218 19.1531 0.2441 144 +146 3 266.2122 300.737 18.8048 0.2542 145 +147 3 265.4572 299.8882 18.48 0.2542 146 +148 3 264.6541 299.0725 18.4803 0.2796 147 +149 3 263.8693 298.2408 18.4806 0.2669 148 +150 3 262.9278 296.9069 18.4859 0.3559 149 +151 3 262.2906 295.9562 18.5091 0.3559 150 +152 3 261.6111 295.0376 18.62 0.3305 151 +153 3 261.3651 294.6338 18.8754 0.3025 152 +154 3 260.9304 293.619 19.4855 0.3546 153 +155 3 260.6215 292.5185 19.6 0.394 154 +156 3 260.5586 291.3768 19.6 0.3813 155 +157 3 260.014 289.9205 19.6003 0.3112 156 +158 3 259.3448 288.995 19.6011 0.339 157 +159 3 258.7293 288.0317 19.605 0.3326 158 +160 3 258.369 286.9518 19.6297 0.309 159 +161 3 258.3507 285.8192 19.8562 0.2725 160 +162 3 258.5589 284.6993 19.7708 0.2447 161 +163 3 258.7442 283.5713 19.696 0.2191 162 +164 3 258.7316 282.4479 20.1611 0.2048 163 +165 3 258.6893 281.3245 20.678 0.1917 164 +166 3 258.8563 280.1953 20.722 0.214 165 +167 3 259.1972 279.1051 20.7326 0.2629 166 +168 3 259.4718 277.9954 20.8085 0.314 167 +169 3 259.3139 276.8892 21.3156 0.3418 168 +170 3 259.2235 275.7669 21.8182 0.3189 169 +171 3 259.1629 274.6252 21.845 0.3057 170 +172 3 258.814 273.5384 21.8708 0.2682 171 +173 3 258.3335 272.5019 22.0217 0.2544 172 +174 3 258.1482 271.4209 22.8038 0.2166 173 +175 3 257.4046 270.5606 23.0583 0.2161 174 +176 3 257.376 269.4589 23.7723 0.2169 175 +177 3 257.3989 268.3172 23.6776 0.2288 176 +178 3 257.3874 267.2041 23.1045 0.2288 177 +179 3 257.3188 266.0727 23.4097 0.2301 178 +180 3 257.0968 264.9618 23.3033 0.2442 179 +181 3 257.1723 263.8533 23.949 0.2722 180 +182 3 257.1106 262.7333 24.2225 0.3092 181 +183 3 256.7182 261.7003 24.6588 0.3283 182 +184 3 256.7685 260.5906 25.1857 0.3077 183 +185 3 256.5054 259.4786 25.2347 0.2504 184 +186 3 256.0947 258.4227 25.4514 0.1821 185 +187 3 255.6668 257.4057 25.9174 0.1493 186 +188 3 255.6074 256.2777 25.9837 0.1433 187 +189 3 255.7744 255.1967 26.7282 0.1525 188 +190 3 256.1485 254.1602 27.2308 0.1567 189 +191 3 256.4379 253.0734 27.1474 0.174 190 +192 3 256.4665 251.9363 27.3862 0.1996 191 +193 3 256.4493 250.7923 27.4484 0.2161 192 +194 3 256.6015 249.6746 27.4938 0.2113 193 +195 3 256.868 248.5843 27.7956 0.1936 194 +196 3 256.836 247.4758 28.4071 0.1882 195 +197 3 256.5386 246.4107 29.0318 0.2138 196 +198 3 256.1176 245.372 29.5506 0.2607 197 +199 3 255.7149 244.3058 29.766 0.3051 198 +200 3 255.303 243.2567 30.1381 0.3051 199 +201 3 254.9782 242.1848 30.6589 0.2826 200 +202 3 254.6853 241.0843 30.8904 0.2599 201 +203 3 254.397 239.9952 31.2897 0.2786 202 +204 3 254.365 238.8992 31.7878 0.3105 203 +205 3 254.564 237.7758 31.9194 0.3367 204 +206 3 254.6452 236.6387 31.9155 0.3308 205 +207 3 254.5835 235.497 31.885 0.293 206 +208 3 254.2243 234.4582 31.5837 0.2349 207 +209 3 254.1087 233.4812 30.8118 0.178 208 +210 3 254.5537 232.7788 32.1006 0.1652 209 +211 3 254.6944 231.755 32.4584 0.1652 210 +212 3 254.9107 230.651 32.0104 0.1652 211 +213 3 255.0411 229.5196 31.9483 0.1438 212 +214 3 255.0559 228.3859 32.2728 0.1281 213 +215 3 256.0421 227.9226 32.51 0.1271 214 +216 3 256.9424 227.7704 34.16 0.178 215 +217 3 261.2107 291.1674 23.0731 0.132 156 +218 3 261.3319 291.7349 25.429 0.1507 217 +219 3 261.3399 292.5185 27.4683 0.1652 218 +220 3 261.0516 292.6535 29.4815 0.1652 219 +221 3 260.2325 292.1364 30.6804 0.1578 220 +222 3 259.1698 291.9866 31.3396 0.1525 221 +223 3 258.0532 292.1456 31.5524 0.1525 222 +224 3 256.9538 292.0003 31.2376 0.1438 223 +225 3 255.8831 291.7978 31.7621 0.1309 224 +226 3 254.9965 292.1799 32.9613 0.1179 225 +227 3 254.2071 292.9223 33.7809 0.1144 226 +228 3 253.8307 293.8776 33.0526 0.1245 227 +229 3 253.9074 294.7356 31.2824 0.1478 228 +230 3 253.2175 295.3328 29.9491 0.1743 229 +231 3 252.1136 295.4414 29.9594 0.2016 230 +232 3 251.4512 295.0376 31.92 0.2288 231 +233 3 261.5584 294.532 16.9543 0.1308 152 +234 3 260.9761 294.4908 15.1875 0.1611 233 +235 3 259.9019 294.8809 15.218 0.178 234 +236 3 258.8769 295.271 15.7959 0.1683 235 +237 3 258.012 295.7366 17.2021 0.1421 236 +238 3 257.2696 296.4184 18.1712 0.1215 237 +239 3 256.3887 296.908 17.7859 0.1144 238 +240 3 256.0638 296.3543 16.7219 0.1144 239 +241 3 256.0901 295.2961 15.757 0.1144 240 +242 3 255.8979 294.2139 16.0994 0.1144 241 +243 3 255.6131 293.1431 16.7947 0.1144 242 +244 3 255.382 292.1215 17.8914 0.1244 243 +245 3 254.6132 291.434 18.7561 0.1374 244 +246 3 253.5539 291.0588 19.1251 0.1503 245 +247 3 252.6421 291.1388 17.7044 0.1415 246 +248 3 251.8459 291.5301 15.9541 0.1284 247 +249 3 251.5736 291.0393 13.6618 0.1147 248 +250 3 251.9088 290.004 12.88 0.1144 249 +251 3 263.0365 298.3815 16.9333 0.1207 149 +252 3 262.135 299.0222 16.2985 0.1144 251 +253 3 261.3262 299.8298 16.282 0.1144 252 +254 3 260.5757 300.6912 16.4343 0.1269 253 +255 3 259.7498 301.4371 17.0794 0.1398 254 +256 3 258.7431 301.778 16.214 0.1652 255 +257 3 257.8336 301.2198 15.2989 0.1652 256 +258 3 257.2444 300.5654 13.564 0.1619 257 +259 3 256.3578 300.4087 12.8741 0.1365 258 +260 3 255.5135 300.5757 14.7162 0.1233 259 +261 3 254.6041 300.7793 16.1795 0.1144 260 +262 3 253.7415 301.3616 17.075 0.1144 261 +263 3 253.2095 302.1521 17.3463 0.1144 262 +264 3 252.9842 302.2036 15.5907 0.1144 263 +265 3 252.7634 301.7597 13.638 0.1205 264 +266 3 251.8688 301.7849 12.1612 0.1337 265 +267 3 251.1 301.2369 12.2864 0.1483 266 +268 3 251.4089 300.9029 14.238 0.142 267 +269 3 251.9157 301.2003 16.6026 0.1286 268 +270 3 251.8173 302.2414 17.01 0.115 269 +271 3 251.4512 303.2744 16.24 0.1144 270 +272 3 279.9357 332.9074 22.2953 0.1951 113 +273 3 279.0079 333.3696 21.2652 0.1359 272 +274 3 278.5423 334.1624 19.686 0.1144 273 +275 3 278.3695 334.811 17.4812 0.1144 274 +276 3 278.2219 335.8178 16.4077 0.1144 275 +277 3 278.2757 336.9412 16.6925 0.1173 276 +278 3 278.1281 337.9959 17.7047 0.1303 277 +279 3 277.9691 339.0152 18.8966 0.1433 278 +280 3 277.7884 340.0757 19.5807 0.1525 279 +281 3 277.0997 340.7496 19.434 0.1525 280 +282 3 276.1044 340.8571 18.5035 0.1525 281 +283 3 275.4924 341.2426 16.3864 0.1462 282 +284 3 274.7716 341.3582 14.527 0.1326 283 +285 3 273.9663 341.8375 13.839 0.1189 284 +286 3 273.7077 342.8522 13.092 0.1144 285 +287 3 274.1756 343.7766 12.2651 0.1363 286 +288 3 274.7888 344.6872 12.88 0.1652 287 +289 3 299.9259 364.1718 19.7714 0.3256 12 +290 3 299.8024 363.1857 18.3994 0.2615 289 +291 3 300.1867 362.3208 17.1349 0.223 290 +292 3 300.7084 361.5806 15.4552 0.2161 291 +293 3 300.5585 360.5739 14.7638 0.2275 292 +294 3 299.617 360.0042 14.3074 0.2288 293 +295 3 298.7053 360.4664 13.1547 0.2163 294 +296 3 297.6917 360.9846 12.9111 0.2035 295 +297 3 296.5614 361.1459 13.0838 0.1907 296 +298 3 295.5204 360.9926 12.2881 0.2142 297 +299 3 294.7459 360.2159 12.3057 0.2714 298 +300 3 295.2927 359.4734 12.292 0.2542 299 +301 3 296.4047 359.4482 12.1187 0.2542 300 +302 3 296.8497 358.4003 12.1646 0.2669 301 +303 2 305.1826 383.232 22.9978 0.3252 1 +304 2 305.4286 384.3028 22.8676 0.3594 303 +305 2 305.3542 385.3575 23.898 0.3686 304 +306 2 305.0865 386.362 24.9337 0.3648 305 +307 2 304.6735 387.419 25.1149 0.3559 306 +308 2 304.3704 388.4772 24.5893 0.3398 307 +309 2 304.1621 389.5011 23.7555 0.2837 308 +310 2 304.6094 390.5399 23.4931 0.2424 309 +311 2 305.2958 391.4505 23.2809 0.2542 310 +312 2 305.6551 392.5178 23.7577 0.2288 311 +313 2 305.8598 393.5657 22.776 0.2282 312 +314 2 305.8427 394.5965 21.9346 0.2222 313 +315 2 306.258 395.6478 21.849 0.2288 314 +316 2 306.7121 396.69 21.8974 0.2352 315 +317 2 307.0999 397.7528 22.2233 0.2615 316 +318 2 307.5667 398.6863 21.7031 0.2938 317 +319 2 308.0163 399.2663 21.0885 0.3298 318 +320 2 308.4384 400.2009 21.0042 0.1924 319 +321 2 308.7679 400.9251 22.3936 0.2136 320 +322 2 309.1717 401.5989 23.984 0.2232 321 +323 2 309.6728 402.3082 25.5769 0.2074 322 +324 2 309.6808 403.0312 24.9942 0.1177 323 +325 2 310.1144 403.5437 24.855 0.2288 324 +326 2 309.7963 404.5504 24.4471 0.2628 325 +327 2 309.8501 405.4039 23.1179 0.1962 326 +328 2 309.9302 406.1703 22.1449 0.3121 327 +329 2 310.4336 407.081 22.12 0.2756 328 +330 2 310.7401 408.1186 22.3076 0.2059 329 +331 2 311.2298 409.0143 22.5123 0.2855 330 +332 2 311.8533 409.4422 20.8029 0.2437 331 +333 2 311.8407 410.2384 20.524 0.2288 332 +334 2 312.7639 410.3803 20.547 0.1144 333 +335 2 312.7696 410.8756 22.7214 0.1416 334 +336 2 313.0373 411.8514 23.52 0.206 335 +337 2 313.2924 412.9314 23.52 0.2539 336 +338 2 313.79 413.2586 22.4 0.178 337 +339 2 314.2271 414.0044 23.3374 0.1955 338 +340 2 314.1607 414.8888 22.4 0.2111 339 +341 2 314.7453 415.7754 21.8711 0.2939 340 +342 2 315.3928 416.4961 21.9904 0.3108 341 +343 2 315.744 417.3472 22.09 0.1484 342 +344 2 316.3869 418.2064 22.3728 0.2844 343 +345 2 316.8743 418.9957 21.7048 0.1824 344 +346 2 316.6947 419.7496 20.4067 0.1816 345 +347 2 317.0596 420.5802 19.1148 0.1398 346 +348 2 317.9874 420.8868 19.88 0.2893 347 +349 2 318.5262 421.5972 19.068 0.2288 348 +350 2 318.8683 422.5444 20.1505 0.3794 349 +351 2 319.2687 423.2548 18.6455 0.2754 350 +352 2 319.7526 423.8806 16.8291 0.1406 351 +353 2 320.0031 424.9411 17.1741 0.2503 352 +354 2 320.6335 425.4628 18.6519 0.15 353 +355 2 320.9995 426.2521 19.6 0.1205 354 +356 2 321.4102 427.0266 20.8057 0.2266 355 +357 2 321.8072 427.7016 20.4691 0.376 356 +358 2 321.845 428.6694 19.7954 0.3971 357 +359 2 322.1767 429.4576 20.5691 0.1525 358 +360 2 322.9512 430.0307 21.2783 0.1781 359 +361 2 323.18 431.1027 20.7068 0.2507 360 +362 2 322.9523 431.7204 19.0282 0.1899 361 +363 2 323.1125 432.7283 18.6379 0.1828 362 +364 2 323.752 433.3346 18.7911 0.4068 363 +365 2 323.752 433.759 19.32 0.2355 364 +366 2 324.2096 434.72 19.32 0.2669 365 +367 2 324.1295 433.8048 17.1441 0.3559 364 +368 2 324.5334 434.7658 17.36 0.3465 367 +369 2 325.1111 435.6466 17.3594 0.1908 368 +370 2 325.2209 436.7346 16.7524 0.1622 369 +371 2 325.6053 437.7996 16.6782 0.2207 370 +372 2 325.992 438.5078 15.96 0.2009 371 +373 2 326.6189 439.2754 16.5161 0.2028 372 +374 2 327.5283 439.4527 16.1672 0.3288 373 +375 2 328.4756 439.7456 16.5374 0.1663 374 +376 2 329.1231 440.4949 17.0103 0.3163 375 +377 2 329.7191 440.9354 17.5314 0.3373 376 +378 2 330.5496 441.3266 17.5174 0.2636 377 +379 2 331.4797 441.0189 17.08 0.3369 378 +380 2 332.4178 441.0738 17.1259 0.2575 379 +381 2 332.9132 441.3861 16.7807 0.3335 380 +382 2 333.8512 441.7934 17.2357 0.2132 381 +383 2 334.6864 442.4042 17.4264 0.1817 382 +384 2 335.5913 442.7383 16.8221 0.2989 383 +385 2 336.1953 442.8802 15.059 0.2078 384 +386 2 336.9778 443.5299 14.3959 0.2288 385 +387 2 337.8026 443.6249 15.3437 0.3432 386 +388 2 338.4776 444.4509 15.9034 0.2161 387 +389 2 338.624 445.3478 15.9034 0.1144 388 +390 2 338.8528 446.0456 14.84 0.2161 389 +391 2 339.2498 447.0306 15.54 0.1461 390 +392 2 339.5312 447.5557 13.3473 0.211 391 +393 2 340.0002 448.2169 13.9244 0.1421 392 +394 2 339.9728 449.1927 14.051 0.1424 393 +395 2 339.6628 450.0656 12.934 0.3336 394 +396 2 340.3892 450.6822 13.7334 0.2288 395 +397 2 341.023 451.5231 13.4697 0.1271 396 +398 2 341.7117 451.9967 13.4613 0.174 397 +399 2 342.485 452.5481 13.5663 0.169 398 +400 2 342.6486 453.1201 12.1834 0.1732 399 +401 2 343.3247 453.7104 12.0081 0.1841 400 +402 2 343.8567 454.3922 13.0046 0.1865 401 +403 2 344.4229 454.6256 14.1635 0.1285 402 +404 2 344.94 455.0546 12.7854 0.247 403 +405 2 345.6024 455.4264 11.76 0.2924 404 +406 3 301.5847 384.1975 25.1188 0.266 1 +407 3 300.9715 385.1219 24.5062 0.2776 406 +408 3 300.0792 385.7717 24.9561 0.2796 407 +409 3 299.601 385.8712 24.8889 0.3178 408 +410 3 299.1022 386.0954 26.0089 0.2034 409 +411 3 298.4959 386.4432 28.1512 0.2161 410 +412 3 297.8358 387.1536 28.3161 0.2895 411 +413 3 297.1563 387.7554 26.7473 0.1968 412 +414 3 296.2708 388.054 26.32 0.3147 413 +415 3 295.4426 388.1192 27.5495 0.3085 414 +416 3 294.6624 388.2358 28.6437 0.1937 415 +417 3 293.6396 388.65 28.9167 0.1824 416 +418 3 292.5494 388.9325 28.5172 0.2393 417 +419 3 291.45 389.071 27.832 0.1925 418 +420 3 290.3094 389.079 27.9558 0.1907 419 +421 3 289.2867 389.1007 26.7179 0.2156 420 +422 3 288.1667 389.238 26.2828 0.279 421 +423 3 287.2012 389.8466 26.124 0.3178 422 +424 3 285.9725 390.6634 26.2811 0.252 423 +425 3 285.0001 391.1222 27.2227 0.3034 424 +426 3 283.8813 391.3269 27.4739 0.3299 425 +427 3 282.7579 391.1416 27.6842 0.3305 426 +428 3 281.6963 390.9128 28.5636 0.3178 427 +429 3 280.6163 390.9254 29.4868 0.2796 428 +430 3 279.597 391.0398 30.196 0.3037 429 +431 3 278.9129 391.6392 28.6348 0.2957 430 +432 3 278.0858 392.2936 27.7707 0.2836 431 +433 3 277.1981 392.9571 28.1789 0.2615 432 +434 3 276.3172 393.6641 28.5155 0.2633 433 +435 3 275.4191 394.3723 28.5597 0.2577 434 +436 3 274.4902 395.0381 28.5578 0.2542 435 +437 3 273.5396 395.6753 28.5491 0.2635 436 +438 3 272.5157 396.1786 28.4962 0.2669 437 +439 3 271.4151 396.3663 28.0876 0.2479 438 +440 3 270.6224 396.3525 26.2741 0.2122 439 +441 3 269.6477 396.0951 25.2118 0.2034 440 +442 3 268.5243 396.0036 24.8928 0.2034 441 +443 3 267.4134 396.2233 24.6056 0.225 442 +444 3 266.417 396.1512 23.3486 0.2515 443 +445 3 266.2786 395.2142 22.104 0.3019 444 +446 3 265.5167 394.5473 20.9006 0.3051 445 +447 3 264.7662 393.6939 20.7833 0.2663 446 +448 3 263.9723 392.8851 21.0798 0.2611 447 +449 3 263.0525 392.4366 20.6038 0.2818 448 +450 3 262.0183 392.543 20.5906 0.2924 449 +451 3 260.9647 392.4046 21.2766 0.267 450 +452 3 260.0506 391.8475 20.7978 0.2365 451 +453 3 259.4089 391.2011 19.1794 0.2195 452 +454 3 258.5863 390.5296 18.559 0.2256 453 +455 3 257.7066 389.8066 18.7202 0.219 454 +456 3 256.645 389.6384 18.3042 0.2059 455 +457 3 255.6668 390.0216 17.3244 0.1929 456 +458 3 255.0079 390.7035 15.8211 0.1907 457 +459 3 254.0561 391.0901 14.7022 0.1907 458 +460 3 252.9807 391.3727 14.478 0.1907 459 +461 3 251.9111 391.7022 14.1028 0.1821 460 +462 3 250.9181 392.1678 13.3364 0.1691 461 +463 3 249.9766 392.7787 12.8573 0.1563 462 +464 3 248.971 393.3072 12.6571 0.1525 463 +465 3 248.0707 393.9902 12.8103 0.1525 464 +466 3 247.5399 394.974 12.8797 0.1718 465 +467 3 247.652 396.0734 12.8789 0.2074 466 +468 3 247.7172 397.2094 12.8719 0.2458 467 +469 3 247.9586 398.3202 12.8086 0.2437 468 +470 3 248.9413 398.6977 12.6235 0.2086 469 +471 3 250.0704 398.7469 12.9685 0.1694 470 +472 3 251.1606 398.4941 13.4901 0.1538 471 +473 3 252.2577 398.263 13.0374 0.1525 472 +474 3 253.3868 398.3522 12.7434 0.1408 473 +475 3 254.4977 398.2241 12.185 0.1398 474 +476 3 255.112 397.3112 12.88 0.1525 475 +477 3 279.4495 390.8934 30.7238 0.2453 429 +478 3 278.5423 390.9094 30.9336 0.2048 477 +479 3 277.7758 391.1279 31.9984 0.1731 478 +480 3 276.7862 390.7996 31.8228 0.2484 479 +481 3 276.0014 390.4975 30.2618 0.1945 480 +482 3 275.4054 390.2493 28.856 0.2183 481 +483 3 274.7327 389.7528 27.2588 0.1832 482 +484 3 273.8416 389.4496 27.2994 0.2605 483 +485 3 273.9308 389.1671 29.3796 0.2519 484 +486 3 273.8862 389.1682 31.8548 0.3621 485 +487 3 272.9996 389.0744 32.9714 0.2619 486 +488 3 272.1942 389.532 32.3515 0.1144 487 +489 3 271.5925 390.056 31.2754 0.2542 488 +490 3 270.6658 390.0571 32.4526 0.2258 489 +491 3 269.7438 390.2356 33.3948 0.13 490 +492 3 268.7794 390.5765 34.44 0.264 491 +493 3 268.0106 390.2115 33.6622 0.2739 492 +494 3 267.2922 389.4576 34.1312 0.1271 493 +495 3 266.3518 389.0675 33.5334 0.2814 494 +496 3 265.368 388.6134 34.3104 0.2591 495 +497 3 264.5237 388.1603 33.99 0.2398 496 +498 3 263.6245 388.1661 35.3114 0.2223 497 +499 3 262.7654 387.9098 35.56 0.1689 498 +500 3 262.2048 387.816 36.0805 0.3432 499 +501 3 261.6031 388.3194 35.567 0.2444 500 +502 3 260.6593 388.8033 36.3129 0.2542 501 +503 3 259.6308 388.8559 36.7486 0.2696 502 +504 3 258.7453 388.7049 37.9579 0.2078 503 +505 3 257.8519 388.3297 37.3388 0.2045 504 +506 3 256.8028 388.1626 37.2663 0.1459 505 +507 3 255.8888 388.1214 38.355 0.125 506 +508 3 254.9164 387.5586 38.3541 0.2542 507 +509 3 253.8158 387.3309 38.5255 0.2542 508 +510 3 252.9373 386.9992 38.5213 0.2415 509 +511 3 252.3858 386.553 39.2498 0.1945 510 +512 3 251.839 385.7476 38.9091 0.2392 511 +513 3 250.989 385.3587 39.2 0.2725 512 +514 3 250.0029 385.5131 39.508 0.2288 513 +515 3 249.2639 385.2557 38.6526 0.2875 514 +516 3 248.1805 385.0784 39.1978 0.1816 515 +517 3 247.1132 384.8565 39.4895 0.1269 516 +518 3 246.1877 385.2168 39.7379 0.1789 517 +519 3 245.2336 384.9285 40.0249 0.235 518 +520 3 244.1765 384.7661 40.1657 0.1906 519 +521 3 243.0748 384.6208 39.7701 0.202 520 +522 3 242.004 384.6837 40.1551 0.2161 521 +523 3 240.9378 384.3474 40.46 0.1808 522 +524 3 239.9826 384.0545 40.2576 0.2161 523 +525 3 239.0079 383.5981 40.6 0.1604 524 +526 3 238.0595 382.9883 40.9763 0.1652 525 +527 3 237.1638 382.2951 41.2821 0.1568 526 +528 3 236.1628 381.7883 41.2378 0.1525 527 +529 3 235.4649 380.9348 41.4308 0.1645 528 +530 3 234.79 380.3674 41.44 0.2415 529 +531 3 234.0349 379.5941 41.8566 0.1415 530 +532 3 233.1529 378.9248 41.7665 0.2098 531 +533 3 232.137 378.4455 41.72 0.2134 532 +534 3 231.0972 378.0359 41.4546 0.2728 533 +535 3 230.087 377.5486 41.274 0.2541 534 +536 3 229.0997 377.0773 41.72 0.2034 535 +537 3 228.3195 376.3302 41.804 0.1144 536 +538 3 227.2865 375.8887 41.8964 0.1144 537 +539 3 226.1562 375.804 42.0006 0.1146 538 +540 3 225.0545 375.7319 42.408 0.1452 539 +541 3 223.9998 375.6896 42.0014 0.3295 540 +542 3 223.088 375.6747 42.2831 0.2534 541 +543 3 222.0412 375.28 42.8243 0.1151 542 +544 3 220.9922 374.8259 42.84 0.1144 543 +545 3 219.8562 374.7744 42.84 0.1144 544 +546 3 218.7122 374.7744 42.84 0.1144 545 +547 3 217.6014 374.676 42.84 0.1144 546 +548 3 217.1472 373.8157 43.2247 0.2288 547 +549 3 216.788 373.5103 44.518 0.2288 548 +550 3 216.0021 373.1945 43.96 0.2309 549 +551 3 215.2928 372.4235 43.1281 0.2147 550 +552 3 214.4531 371.6833 42.8305 0.2083 551 +553 3 213.396 371.4637 43.3462 0.3256 552 +554 3 212.3722 371.1228 44.032 0.3686 553 +555 3 211.4444 371.379 44.1913 0.4129 554 +556 3 210.3862 371.1662 43.4162 0.1591 555 +557 3 209.3612 370.7635 43.4 0.1144 556 +558 3 208.7674 370.0977 44.52 0.178 557 +559 3 208.4368 369.2249 43.7898 0.2497 558 +560 3 207.6829 368.7798 43.5193 0.3636 559 +561 3 206.6396 368.622 43.3784 0.3898 560 +562 3 205.5871 368.4641 42.9618 0.3296 561 +563 3 204.6639 368.2387 42.0204 0.3217 562 +564 3 203.7944 367.9298 41.72 0.3305 563 +565 3 202.734 367.9104 42.142 0.384 564 +566 3 201.6586 367.8269 41.4999 0.2598 565 +567 3 200.7846 368.193 40.88 0.2663 566 +568 3 199.9415 367.7949 41.6248 0.2775 567 +569 3 199.1704 367.224 41.16 0.2669 568 +570 3 287.2115 390.1829 25.6178 0.2688 423 +571 3 287.2481 391.1565 24.1534 0.1433 570 +572 3 287.3385 392.1186 22.6792 0.1828 571 +573 3 287.1875 393.0075 20.9756 0.2215 572 +574 3 287.3877 393.8197 19.1523 0.2448 573 +575 3 287.978 394.203 17.3737 0.188 574 +576 3 287.9013 393.5371 15.2382 0.1738 575 +577 3 287.4414 392.6288 14.187 0.1697 576 +578 3 286.7058 391.7571 13.9997 0.1735 577 +579 3 285.8135 391.1931 13.9983 0.1699 578 +580 3 284.6867 391.0547 13.9882 0.1727 579 +581 3 283.815 390.4472 13.9205 0.1652 580 +582 3 283.4146 389.4016 14.0134 0.1531 581 +583 3 282.9638 388.5413 14.996 0.1398 582 +584 3 282.3609 387.8046 16.483 0.1465 583 +585 3 281.6688 386.9992 17.1492 0.1663 584 +586 3 280.7376 386.6194 16.4133 0.178 585 +587 3 280.2411 385.9044 15.8567 0.1697 586 +588 3 279.5925 385.0681 15.4342 0.1652 587 +589 3 278.6738 384.6563 16.4245 0.1763 588 +590 3 278.8031 384.1209 18.6477 0.178 589 +591 3 278.9198 383.0901 19.6624 0.1544 590 +592 3 279.033 382.0022 20.477 0.1286 591 +593 3 279.5536 381.1865 21.9338 0.1149 592 +594 3 280.248 380.3972 23.0336 0.1144 593 +595 3 281.1952 379.9224 24.08 0.1271 594 +596 3 299.696 386.1835 25.3509 0.3103 409 +597 3 299.9831 387.1319 26.752 0.2875 596 +598 3 300.2714 388.0791 28.1529 0.2647 597 +599 3 300.5425 388.6054 27.4324 0.1144 598 +600 3 300.9624 389.524 27.6203 0.3407 599 +601 3 301.6087 390.1395 28.4374 0.1485 600 +602 3 301.3285 390.8613 27.0418 0.223 601 +603 3 301.0585 391.7571 27.5248 0.268 602 +604 3 300.848 392.8645 27.8715 0.1875 603 +605 3 300.594 393.925 28.289 0.1234 604 +606 3 300.3023 394.6823 29.4 0.1972 605 +607 3 300.3057 395.7085 28.5732 0.2433 606 +608 3 300.1856 396.8376 28.5625 0.2789 607 +609 3 299.9808 397.9335 28.1716 0.2464 608 +610 3 299.704 398.5971 26.88 0.1144 609 +611 3 299.9991 399.5134 27.5587 0.1808 610 +612 3 300.2417 400.4343 28.6289 0.1144 611 +613 3 299.6422 401.1836 29.6425 0.2635 612 +614 3 299.5118 402.0256 31.2648 0.3303 613 +615 3 299.855 402.99 30.5864 0.2415 614 +616 3 299.9728 403.9144 30.87 0.307 615 +617 3 299.9568 404.6522 32.48 0.1268 616 +618 3 299.9362 405.7768 32.3028 0.1144 617 +619 3 299.3688 406.263 30.5458 0.1144 618 +620 3 299.0016 406.9208 31.5487 0.24 619 +621 3 298.0989 406.9757 31.8665 0.236 620 +622 3 297.2993 407.1645 32.6116 0.2123 621 +623 3 296.868 407.6873 32.9731 0.3432 622 +624 3 296.2994 407.9115 32.0695 0.3178 623 +625 3 295.4849 408.5018 31.3928 0.3167 624 +626 3 295.0971 408.8656 33.0562 0.2288 625 +627 3 295.3042 408.7009 35.5289 0.3051 626 +628 3 295.1463 407.4013 34.72 0.2931 627 +629 3 295.0365 406.4392 34.2241 0.2539 628 +630 3 295.6004 406.2573 36.6134 0.2542 629 +631 3 296.1255 406.112 38.8612 0.2488 630 +632 3 295.1863 406.4117 38.332 0.2931 631 +633 3 294.564 407.0958 37.6662 0.3342 632 +634 3 293.6865 407.7205 37.828 0.4068 633 +635 3 293.6648 407.9024 40.3287 0.2653 634 +636 3 293.0493 408.4412 41.097 0.2386 635 +637 3 292.7874 409.4296 41.44 0.1907 636 +638 3 293.2324 410.1869 41.6993 0.305 637 +639 3 293.4646 410.8447 42.0742 0.3589 638 +640 3 293.5687 411.8457 42.7207 0.2804 639 +641 3 293.436 412.7987 42.9685 0.2103 640 +642 3 293.9016 413.3135 44.8232 0.36 641 +643 3 293.889 414.0228 45.7422 0.293 642 +644 3 293.8501 415.0604 45.6753 0.4261 643 +645 3 293.3937 416.0602 46.1387 0.4676 644 +646 3 293.0242 417.1299 46.2 0.3605 645 +647 3 292.9784 418.1228 45.9802 0.5101 646 +648 3 293.2072 418.9866 46.1664 0.2702 647 +649 3 293.0287 419.9624 46.2552 0.2288 648 +650 3 292.3721 420.094 48.16 0.4438 649 +651 3 291.6056 419.8652 49.0 0.3704 650 +652 3 291.3265 418.9683 49.628 0.4449 651 +653 3 290.6904 418.9763 51.2089 0.178 652 +654 3 290.8117 419.8549 50.4851 0.2786 653 +655 3 290.7476 420.571 51.7454 0.3892 654 +656 3 290.2408 421.4061 52.8763 0.2644 655 +657 3 290.3426 422.446 52.8864 0.3456 656 +658 3 290.576 423.5042 53.48 0.3228 657 +659 3 290.3278 424.3474 53.9879 0.2611 658 +660 3 290.528 425.2168 52.9836 0.2034 659 +661 3 290.9192 425.3907 54.985 0.237 660 +662 3 291.0919 425.8162 56.3242 0.3432 661 +663 3 291.8699 426.3208 56.3749 0.1574 662 +664 3 292.0449 427.2565 57.4 0.2137 663 +665 3 292.5116 427.1993 58.3377 0.1731 664 +666 3 292.737 427.967 59.7498 0.2415 665 +667 3 293.6431 428.476 60.6522 0.366 666 +668 3 293.6923 429.4736 60.5377 0.2927 667 +669 3 294.1201 430.2916 61.9864 0.2131 668 +670 3 294.4988 431.2686 62.72 0.2034 669 +671 3 294.8809 432.2913 63.212 0.1734 670 +672 3 294.9232 433.3781 63.84 0.1144 671 +673 3 295.4609 434.2292 63.5986 0.1255 672 +674 3 295.2206 435.1936 62.9821 0.2897 673 +675 3 294.8637 436.2106 63.56 0.3375 674 +676 3 294.2608 436.6648 64.0494 0.2347 675 +677 3 294.3581 437.0172 66.1256 0.2266 676 +678 3 293.6431 437.7219 66.6543 0.1398 677 +679 3 293.0939 437.8088 64.5411 0.2034 678 +680 3 292.5208 438.2538 65.8417 0.1875 679 +681 3 291.9488 438.5112 66.915 0.2115 680 +682 3 291.6033 438.9082 68.3133 0.1952 681 +683 3 290.8345 439.4802 68.3544 0.1257 682 +684 3 290.0109 440.1311 68.32 0.2802 683 +685 3 289.7752 441.1744 68.7425 0.275 684 +686 3 289.5235 442.1926 69.6147 0.1144 685 +687 3 289.1815 442.9785 67.9496 0.1144 686 +688 3 288.5912 443.8056 67.0709 0.1144 687 +689 3 288.0638 444.706 67.405 0.1144 688 +690 3 287.565 445.6463 67.8146 0.1731 689 +691 3 287.3476 446.6942 68.1652 0.2118 690 +692 3 286.4507 446.748 69.6704 0.1948 691 +693 3 286.2883 447.6358 69.991 0.2389 692 +694 3 286.0 448.3302 68.5292 0.1271 693 +695 3 285.9851 449.0463 66.6526 0.1473 694 +696 3 285.5424 448.9216 68.5896 0.3173 695 +697 3 285.3113 449.314 70.56 0.3201 696 +698 3 284.7416 450.2784 70.28 0.3305 697 +699 3 294.1464 409.4937 35.1772 0.2682 627 +700 3 293.2072 410.1354 34.8916 0.2382 699 +701 3 292.268 410.7784 34.6063 0.2082 700 +702 3 291.6571 410.7235 34.7637 0.2034 701 +703 3 290.8162 410.5816 35.9296 0.2966 702 +704 3 290.6298 410.2384 37.602 0.3097 703 +705 3 289.7821 410.8287 38.08 0.3302 704 +706 3 288.892 411.4968 37.9756 0.1663 705 +707 3 288.0867 411.1891 37.0972 0.139 706 +708 3 287.033 411.4373 37.5164 0.1403 707 +709 3 286.2997 411.165 38.871 0.3051 708 +710 3 285.4177 411.1536 38.4384 0.1144 709 +711 3 284.7851 411.7302 38.2794 0.1939 710 +712 3 284.0289 412.1924 38.9096 0.2076 711 +713 3 283.3905 412.9348 38.0534 0.2924 712 +714 3 282.8323 413.4256 37.52 0.2537 713 +715 3 282.5188 414.366 36.9275 0.2004 714 +716 3 282.576 415.3624 37.2686 0.1548 715 +717 3 281.9949 415.9584 38.9211 0.1144 716 +718 3 280.8966 416.0728 39.2 0.1144 717 +719 3 279.7526 416.0728 39.2 0.1322 718 +720 3 278.8214 416.0728 40.3066 0.2614 719 +721 3 277.8913 416.3405 39.485 0.299 720 +722 3 277.11 415.7296 39.6396 0.3594 721 +723 3 276.0197 415.5111 40.2094 0.3213 722 +724 3 274.9673 415.8348 40.171 0.2834 723 +725 3 274.2271 415.836 38.8486 0.3212 724 +726 3 273.4995 416.297 38.08 0.1902 725 +727 3 272.4116 416.6219 38.08 0.1576 726 +728 3 271.3465 416.8736 38.187 0.1144 727 +729 3 270.4874 416.8736 39.9459 0.1155 728 +730 3 269.8341 417.3312 41.16 0.1144 729 +731 3 268.7107 417.3312 41.5554 0.1515 730 +732 3 267.736 417.4078 42.8954 0.1773 731 +733 3 267.0279 416.8644 43.1659 0.2288 732 +734 3 266.2706 416.8725 41.7393 0.1938 733 +735 3 265.8359 417.4124 40.4373 0.4306 734 +736 3 264.8005 417.7625 40.6266 0.2631 735 +737 3 263.986 418.084 40.0389 0.2288 736 +738 3 263.0685 418.2807 38.9225 0.1271 737 +739 3 262.6944 418.942 40.5563 0.24 738 +740 3 262.5423 419.8789 41.3003 0.2861 739 +741 3 262.0973 420.706 41.44 0.2558 740 +742 3 262.2883 421.5388 42.0403 0.2691 741 +743 3 262.0435 422.2447 40.3976 0.1467 742 +744 3 261.9794 422.9196 38.64 0.1144 743 +745 3 261.7461 423.8303 37.7292 0.133 744 +746 3 261.1054 424.6162 36.7794 0.1772 745 +747 3 260.9052 425.6607 36.7069 0.3132 746 +748 3 260.5929 426.5965 36.1645 0.2106 747 +749 3 260.1456 427.6135 36.12 0.1445 748 +750 3 259.8516 428.5733 35.7227 0.1722 749 +751 3 259.3677 429.2139 35.7098 0.2847 750 +752 3 259.2327 430.3133 36.12 0.3411 751 +753 3 259.8459 431.0649 36.6016 0.2375 752 +754 3 260.0712 431.9138 38.2928 0.1518 753 +755 3 260.1387 431.6941 40.329 0.1144 754 +756 3 260.26 432.0739 42.3195 0.1907 755 +757 3 260.7256 433.0292 42.2408 0.1907 756 +758 3 261.38 433.9009 42.28 0.2241 757 +759 3 261.0688 434.6022 42.8389 0.3056 758 +760 3 260.8892 435.5219 43.7461 0.2771 759 +761 3 260.8457 436.4577 44.1017 0.1178 760 +762 3 261.6328 437.0469 44.1913 0.2542 761 +763 3 261.6408 438.0101 42.7336 0.2433 762 +764 3 262.2048 438.724 41.44 0.178 763 +765 3 304.9355 375.1977 30.2879 0.3278 1 +766 3 304.9984 374.1532 31.3407 0.3083 765 +767 3 305.0442 373.047 32.018 0.294 766 +768 3 305.3347 371.9785 32.6869 0.2924 767 +769 3 306.0303 371.0861 32.753 0.2693 768 +770 3 306.6778 370.2556 31.7075 0.2552 769 +771 3 307.116 369.2821 30.7244 0.3017 770 +772 3 307.9945 368.5922 30.2492 0.368 771 +773 3 309.1088 368.4847 30.8 0.394 772 +774 3 309.9565 368.4916 30.8 0.3645 773 +775 3 311.0982 368.5499 30.8006 0.3567 774 +776 3 312.1839 368.9022 30.8025 0.3197 775 +777 3 313.0785 369.6104 30.8106 0.3299 776 +778 3 314.0738 370.1721 30.856 0.3797 777 +779 3 315.18 369.9536 31.1878 0.4066 778 +780 3 316.2451 369.6275 31.8214 0.394 779 +781 3 317.1706 369.3896 31.6772 0.3726 780 +782 3 318.2482 369.1345 31.0097 0.3686 781 +783 3 319.3785 369.1299 30.8162 0.326 782 +784 3 320.3292 369.7145 30.8193 0.2639 783 +785 3 321.0693 370.5794 30.9002 0.2001 784 +786 3 321.9239 371.3081 31.362 0.1685 785 +787 3 322.9432 371.7176 30.7787 0.1882 786 +788 3 323.903 371.903 29.349 0.2542 787 +789 3 325.1671 371.7211 28.2125 0.2892 788 +790 3 326.2722 371.8469 27.8522 0.2696 789 +791 3 327.3705 371.9613 28.2954 0.2415 790 +792 3 328.4859 371.7474 28.4099 0.2529 791 +793 3 329.5933 371.6536 27.8642 0.2989 792 +794 3 330.6503 371.514 26.9097 0.3472 793 +795 3 331.7348 371.2646 26.6641 0.3518 794 +796 3 332.8434 371.0884 27.1762 0.3345 795 +797 3 333.9599 370.9626 27.3795 0.3178 796 +798 3 335.0822 371.0953 27.0542 0.3226 797 +799 3 336.1861 371.1216 26.4715 0.3355 798 +800 3 337.3038 370.9226 26.1551 0.3328 799 +801 3 338.4192 370.9054 26.2452 0.3123 800 +802 3 339.4683 371.2978 26.5978 0.2876 801 +803 3 340.4578 371.7348 26.1926 0.2607 802 +804 3 341.3559 372.2713 25.8188 0.2353 803 +805 3 342.1555 373.0538 25.6956 0.2096 804 +806 3 342.9163 373.8672 25.0858 0.21 805 +807 3 343.6198 374.652 24.1058 0.2366 806 +808 3 344.4893 375.2503 23.2224 0.286 807 +809 3 345.5441 375.6461 22.9561 0.3352 808 +810 3 346.6709 375.7548 22.932 0.3735 809 +811 3 347.7863 375.5546 22.7942 0.3999 810 +812 3 348.8411 375.216 22.2068 0.3948 811 +813 3 349.8764 374.9357 21.2456 0.3482 812 +814 3 350.9678 374.7103 20.7687 0.2889 813 +815 3 352.0797 374.7813 20.7197 0.2744 814 +816 3 353.0281 375.3636 20.7183 0.3106 815 +817 3 353.8552 376.1529 20.7136 0.3305 816 +818 3 354.68 376.9457 20.694 0.2994 817 +819 3 355.5609 377.6722 20.601 0.2406 818 +820 3 356.5791 378.0748 20.1124 0.2082 819 +821 3 357.6258 378.4672 20.0402 0.2288 820 +822 3 358.4747 379.188 20.4714 0.2768 821 +823 3 359.2778 379.9796 20.3031 0.3104 822 +824 3 360.1815 380.3674 19.1052 0.3087 823 +825 3 361.2523 380.3285 18.4184 0.2636 824 +826 3 362.3734 380.1718 18.1129 0.2508 825 +827 3 363.4671 380.0654 17.5246 0.238 826 +828 3 364.5825 380.1146 17.3424 0.2177 827 +829 3 365.6727 379.7771 17.2281 0.183 828 +830 3 366.6142 379.2314 16.7706 0.1611 829 +831 3 367.4105 378.4993 16.2392 0.1614 830 +832 3 368.4767 378.3174 16.235 0.1924 831 +833 3 369.5829 378.6114 16.2044 0.2259 832 +834 3 370.6171 379.0324 15.9354 0.2313 833 +835 3 371.6318 379.4007 15.6229 0.1997 834 +836 3 372.7289 379.2337 15.9883 0.1722 835 +837 3 373.683 378.7109 16.7238 0.1713 836 +838 3 374.652 378.1904 17.2309 0.1905 837 +839 3 375.7685 378.0337 17.3594 0.2102 838 +840 3 376.7764 378.4386 17.3552 0.2306 839 +841 3 377.7168 379.0873 17.3337 0.2488 840 +842 3 378.7727 379.4705 17.1931 0.2542 841 +843 3 379.8618 379.4133 16.6001 0.2624 842 +844 3 380.9749 379.3996 16.5245 0.2843 843 +845 3 382.08 379.2246 16.3531 0.328 844 +846 3 383.2091 379.1205 16.24 0.3522 845 +847 3 384.3497 379.1971 16.24 0.3653 846 +848 3 385.3861 379.0781 15.2995 0.2233 847 +849 3 386.3425 378.7784 15.12 0.1146 848 +850 3 387.4842 378.759 15.2163 0.1403 849 +851 3 388.4612 378.8276 15.68 0.1859 850 +852 3 389.5858 378.8928 16.0115 0.1328 851 +853 3 390.4758 378.7509 15.4241 0.1438 852 +854 3 391.3292 378.8505 15.4104 0.2302 853 +855 3 391.8314 378.4421 14.0403 0.2428 854 +856 3 392.7421 378.092 14.7252 0.1468 855 +857 3 393.4491 378.6125 13.72 0.1144 856 +858 3 394.5667 378.7406 13.72 0.1144 857 +859 3 395.5963 379.0072 13.8774 0.1144 858 +860 3 396.7049 378.918 13.44 0.1144 859 +861 3 397.8374 378.7921 13.44 0.1481 860 +862 3 398.8327 378.4798 13.9776 0.1455 861 +863 3 399.5695 377.6619 13.9605 0.1497 862 +864 3 400.3234 377.1894 13.4246 0.2267 863 +865 3 401.083 376.7741 13.7911 0.2342 864 +866 3 401.9753 376.2639 13.7155 0.2288 865 +867 3 402.863 376.0271 13.7511 0.1944 866 +868 3 403.6432 375.6095 14.0017 0.1144 867 +869 3 404.4063 375.3567 13.9342 0.1708 868 +870 3 405.2803 375.693 13.16 0.1564 869 +871 3 406.1486 376.2261 12.5938 0.1296 870 +872 3 407.0123 375.6473 12.3544 0.1773 871 +873 3 407.8406 375.0879 12.7042 0.1951 872 +874 3 408.6162 375.5088 13.0488 0.131 873 +875 3 409.5108 376.2055 12.8391 0.157 874 +876 3 410.5347 376.5442 12.8391 0.1849 875 +877 3 411.4716 375.9504 12.8391 0.1556 876 +878 3 412.118 375.0089 12.8391 0.1467 877 +879 3 412.746 374.0525 12.8391 0.1398 878 +880 3 323.609 371.6993 28.1929 0.2288 788 +881 3 324.4384 371.8618 28.9036 0.2288 880 +882 3 324.5608 372.7186 30.4763 0.1271 881 +883 3 324.896 373.7048 31.451 0.2412 882 +884 3 325.7151 374.1795 31.2404 0.2091 883 +885 3 326.4107 375.0261 30.8311 0.2653 884 +886 3 327.3281 375.5088 30.9173 0.3157 885 +887 3 328.0191 376.2913 30.5701 0.3187 886 +888 3 328.5557 377.0887 31.3734 0.1945 887 +889 3 328.5568 378.0783 32.4615 0.3077 888 +890 3 328.4813 379.1468 31.9816 0.2754 889 +891 3 329.1185 379.8915 32.804 0.1423 890 +892 3 329.329 380.714 33.9329 0.1597 891 +893 3 329.5143 381.699 34.0948 0.2161 892 +894 3 329.8415 382.5422 35.278 0.1144 893 +895 3 330.4993 383.2652 35.0767 0.2071 894 +896 3 330.7361 384.1506 34.8345 0.1726 895 +897 3 331.6868 384.5888 34.9706 0.1667 896 +898 3 332.2268 385.3839 35.1459 0.1993 897 +899 3 332.7896 386.1698 35.6972 0.2049 898 +900 3 332.888 387.0747 35.8142 0.148 899 +901 3 333.1385 387.8789 34.7026 0.3956 900 +902 3 333.5183 388.801 34.16 0.3534 901 +903 3 333.6716 389.7459 35.1375 0.308 902 +904 3 333.8192 390.644 35.8789 0.2182 903 +905 3 334.0102 391.5912 34.7861 0.2208 904 +906 3 334.1498 392.1815 33.6048 0.2671 905 +907 3 334.4747 392.6151 35.5673 0.3305 906 +908 3 334.7344 393.663 35.4668 0.2394 907 +909 3 334.866 394.6869 36.2284 0.212 908 +910 3 334.9209 395.7954 35.915 0.1603 909 +911 3 335.1325 396.6511 35.0773 0.1804 910 +912 3 335.1119 397.6281 33.9312 0.1144 911 +913 3 335.1783 398.1383 36.0595 0.1367 912 +914 3 335.192 399.1256 36.955 0.2542 913 +915 3 335.192 399.9046 35.9332 0.3051 914 +916 3 335.3808 400.9903 36.3689 0.3168 915 +917 3 335.8326 401.878 36.3334 0.2397 916 +918 3 335.7537 402.2064 37.52 0.1144 917 +919 3 336.2937 403.0255 37.24 0.2108 918 +920 3 337.0933 403.1273 35.588 0.1504 919 +921 3 337.075 404.1969 36.197 0.2231 920 +922 3 337.2581 405.2689 36.7077 0.2669 921 +923 3 337.663 405.9804 37.5264 0.3305 922 +924 3 337.48 406.7503 39.1902 0.1431 923 +925 3 337.3656 407.7982 39.9468 0.1398 924 +926 3 337.4811 408.6402 38.409 0.1937 925 +927 3 337.2718 409.4982 37.1927 0.1271 926 +928 3 337.3336 410.4066 36.47 0.1462 927 +929 3 337.242 411.2691 37.3898 0.219 928 +930 3 337.3622 412.0757 38.8119 0.3075 929 +931 3 337.4491 412.8433 37.7871 0.3358 930 +932 3 337.5944 413.739 38.8321 0.1144 931 +933 3 337.194 414.6211 38.08 0.1201 932 +934 3 336.7387 415.5008 38.5437 0.136 933 +935 3 336.1381 416.1655 37.413 0.2754 934 +936 3 335.7766 416.8095 38.7058 0.2453 935 +937 3 336.1518 417.4479 40.2559 0.2288 936 +938 3 336.5293 418.251 39.3781 0.1652 937 +939 3 336.5591 419.2771 39.4108 0.1382 938 +940 3 335.9928 420.0928 38.92 0.3147 939 +941 3 335.9928 421.0114 39.7541 0.2977 940 +942 3 336.0546 422.0719 39.0631 0.2762 941 +943 3 336.2365 422.9528 38.2088 0.2184 942 +944 3 336.7501 423.4779 36.2264 0.2245 943 +945 3 337.1002 424.0762 37.91 0.1907 944 +946 3 337.2249 424.6574 39.9143 0.1144 945 +947 3 337.2523 425.6126 41.3504 0.1147 946 +948 3 337.48 426.4935 42.6188 0.1384 947 +949 3 338.2042 426.966 43.6439 0.262 948 +950 3 339.0358 427.4041 42.84 0.2079 949 +951 3 339.4889 428.0082 43.3224 0.2733 950 +952 3 340.0334 428.6591 43.96 0.1313 951 +953 3 340.3606 429.3329 42.7087 0.1759 952 +954 3 341.1294 430.1177 43.0422 0.2394 953 +955 3 341.9393 430.8865 42.56 0.267 954 +956 3 342.5136 431.7845 42.233 0.3305 955 +957 3 343.1794 432.5247 41.4946 0.21 956 +958 3 343.6576 433.4433 41.16 0.1144 957 +959 3 344.3509 433.5897 42.3948 0.2219 958 +960 3 345.1517 434.2487 42.9887 0.2206 959 +961 3 345.742 435.0575 43.2373 0.2828 960 +962 3 346.4329 435.8846 42.56 0.3178 961 +963 3 346.8768 436.7895 41.8286 0.1218 962 +964 3 347.204 437.5056 40.166 0.1368 963 +965 3 347.5495 438.1703 39.8614 0.1803 964 +966 3 348.2336 438.4632 41.5862 0.2351 965 +967 3 348.8479 439.3555 41.5716 0.2235 966 +968 3 349.0653 440.2101 41.2084 0.3065 967 +969 3 349.2152 440.8633 42.8428 0.1676 968 +970 3 349.1488 441.862 42.9296 0.3061 969 +971 3 349.1236 442.9236 43.265 0.3051 970 +972 3 349.5023 443.0632 45.7447 0.1983 971 +973 3 349.8352 443.5528 45.7615 0.1862 972 +974 3 350.2047 444.0093 44.4489 0.1878 973 +975 3 350.5067 444.6671 43.1172 0.1514 974 +976 3 350.2928 445.5136 42.0227 0.1941 975 +977 3 350.8648 445.9312 42.56 0.1144 976 +978 3 317.1191 369.2214 30.52 0.2756 780 +979 3 318.0652 368.5865 30.5348 0.1519 978 +980 3 318.8168 368.3829 32.2255 0.3121 979 +981 3 319.5169 367.6404 32.965 0.2059 980 +982 3 320.3486 366.9906 32.6228 0.2736 981 +983 3 321.0133 366.4186 31.8998 0.2895 982 +984 3 321.5212 365.9198 31.0766 0.3079 983 +985 3 322.1893 365.2792 31.9074 0.1996 984 +986 3 322.8951 364.8124 31.6546 0.3265 985 +987 3 323.7245 364.6008 32.9871 0.3567 986 +988 3 324.2794 364.5779 32.3036 0.2655 987 +989 3 325.2827 364.8777 32.851 0.2449 988 +990 3 326.1452 365.2598 32.6794 0.2666 989 +991 3 327.2126 365.2552 32.7712 0.2288 990 +992 3 327.9082 365.5675 34.3888 0.2456 991 +993 3 328.8542 365.8844 33.6389 0.233 992 +994 3 329.9079 366.1029 33.9643 0.1639 993 +995 3 330.7727 366.5902 33.5709 0.1525 994 +996 3 331.6422 366.8774 34.4884 0.1144 995 +997 3 332.7187 366.9998 34.9499 0.1202 996 +998 3 333.6854 367.3384 35.8439 0.1943 997 +999 3 334.5353 367.1096 35.138 0.175 998 +1000 3 335.4814 366.835 34.1099 0.2092 999 +1001 3 336.3623 367.1611 33.5208 0.2518 1000 +1002 3 337.1276 367.6816 32.3882 0.2734 1001 +1003 3 337.8712 367.7628 32.2591 0.1427 1002 +1004 3 338.6778 367.6622 33.4734 0.2347 1003 +1005 3 339.4145 367.3247 32.1992 0.3308 1004 +1006 3 339.6307 366.4232 32.4215 0.2011 1005 +1007 3 340.2931 366.5376 32.6239 0.1506 1006 +1008 3 341.3421 366.5422 31.8206 0.2058 1007 +1009 3 342.1075 366.7161 31.92 0.3307 1008 +1010 3 342.9334 367.224 32.7771 0.3351 1009 +1011 3 343.8281 367.748 32.6852 0.1729 1010 +1012 3 344.7364 367.645 34.0544 0.1652 1011 +1013 3 345.7351 367.3384 34.7774 0.4209 1012 +1014 3 346.4455 366.9014 33.9522 0.3178 1013 +1015 3 347.101 366.5639 35.4668 0.3222 1014 +1016 3 347.8835 365.8695 34.7645 0.3305 1015 +1017 3 348.9074 365.6224 34.4946 0.2994 1016 +1018 3 349.6201 365.3192 34.3185 0.2294 1017 +1019 3 350.4175 365.0824 33.0529 0.2258 1018 +1020 3 350.8637 364.3732 32.97 0.178 1019 +1021 3 351.3224 363.4888 32.6749 0.2429 1020 +1022 3 352.2296 363.4694 31.8889 0.2924 1021 +1023 3 353.1391 363.4019 31.1097 0.4057 1022 +1024 3 354.0097 363.1914 31.5011 0.1938 1023 +1025 3 354.9386 363.1056 30.3108 0.1745 1024 +1026 3 355.8355 363.1056 30.6432 0.178 1025 +1027 3 356.5024 363.2932 31.3572 0.2818 1026 +1028 3 357.5057 363.5518 31.0402 0.1804 1027 +1029 3 358.2825 363.5472 31.64 0.2034 1028 +1030 3 359.0044 362.8173 31.5025 0.2579 1029 +1031 3 359.6484 361.9708 31.36 0.1411 1030 +1032 3 360.4366 361.3004 31.8268 0.2161 1031 +1033 3 361.0716 360.9343 32.1446 0.2061 1032 +1034 3 361.8358 360.3394 32.1476 0.1907 1033 +1035 3 362.696 359.9733 31.3158 0.1786 1034 +1036 3 363.5563 359.4826 30.8 0.2948 1035 +1037 3 364.2153 358.8728 30.9005 0.2549 1036 +1038 3 364.761 358.3534 30.0868 0.1652 1037 +1039 3 365.4737 357.7231 30.2728 0.2321 1038 +1040 3 365.9793 356.8422 30.6594 0.1891 1039 +1041 3 366.8716 356.3091 30.6664 0.1875 1040 +1042 3 367.9367 356.3034 29.96 0.2484 1041 +1043 3 368.9995 356.2519 29.4608 0.1271 1042 +1044 3 369.9296 355.7623 29.6708 0.2231 1043 +1045 3 370.9706 355.4271 28.8912 0.2203 1044 +1046 3 371.7897 355.2097 29.1948 0.1144 1045 +1047 3 372.1146 354.5176 29.0657 0.2002 1046 +1048 3 372.9246 353.8346 29.4 0.1144 1047 +1049 3 373.7276 353.2214 29.2788 0.1144 1048 +1050 3 374.2173 352.2662 29.6145 0.178 1049 +1051 3 374.4758 351.3476 29.7707 0.2257 1050 +1052 3 374.8041 350.4667 29.6677 0.1757 1051 +1053 3 375.5535 349.6728 29.3412 0.1374 1052 +1054 3 376.2204 349.0824 28.7042 0.1973 1053 +1055 3 377.1779 348.6283 28.9979 0.1144 1054 +1056 3 377.9948 347.9545 28.56 0.1475 1055 +1057 3 379.0793 347.824 28.3665 0.1995 1056 +1058 3 380.1043 347.9064 28.2044 0.1707 1057 +1059 3 380.8319 347.3802 27.4327 0.1144 1058 +1060 3 381.4885 346.5119 27.9989 0.1144 1059 +1061 3 382.2756 345.7237 28.1588 0.148 1060 +1062 3 383.2537 345.2855 28.1644 0.1144 1061 +1063 3 384.1586 344.8371 28.3847 0.1649 1062 +1064 3 384.8633 344.3486 28.1022 0.1652 1063 +1065 3 385.8609 344.2319 28.5589 0.2288 1064 +1066 3 386.847 344.1152 29.3882 0.1669 1065 +1067 3 387.8595 343.8578 28.84 0.1144 1066 +1068 3 388.7301 343.756 29.8402 0.2288 1067 +1069 3 389.723 343.6622 29.0175 0.1144 1068 +1070 3 390.6783 343.772 29.6909 0.1271 1069 +1071 3 391.693 343.6599 29.2886 0.1893 1070 +1072 3 392.5464 343.0055 28.3965 0.1271 1071 +1073 3 393.3919 342.3855 27.8029 0.2227 1072 +1074 3 394.2327 341.8409 27.4509 0.136 1073 +1075 3 395.3641 341.7082 27.3224 0.1144 1074 +1076 3 396.4807 341.7471 27.5232 0.1144 1075 +1077 3 397.5411 341.9896 27.7264 0.1306 1076 +1078 3 398.5399 342.2711 27.4305 0.2408 1077 +1079 3 399.5786 342.2631 27.0824 0.1652 1078 +1080 3 400.6357 342.3683 26.8537 0.1579 1079 +1081 3 401.4994 342.0457 26.0968 0.1866 1080 +1082 3 402.5233 341.6579 26.1246 0.1144 1081 +1083 3 403.4671 341.2541 26.4256 0.178 1082 +1084 3 404.42 340.809 26.1114 0.1907 1083 +1085 3 405.3089 340.4395 26.7702 0.1837 1084 +1086 3 406.0685 339.7794 26.7064 0.1661 1085 +1087 3 407.073 339.4111 26.88 0.1882 1086 +1088 3 408.0614 339.0519 27.4232 0.1144 1087 +1089 3 409.02 338.9294 26.8265 0.2616 1088 +1090 3 410.0016 339.0233 26.0212 0.157 1089 +1091 3 411.1044 339.1731 25.6119 0.1554 1090 +1092 3 412.2015 338.9672 25.2 0.2803 1091 +1093 3 413.1453 338.6583 24.9427 0.178 1092 +1094 3 414.0628 338.4272 25.4892 0.2029 1093 +1095 3 415.1313 338.4215 25.8672 0.2249 1094 +1096 3 416.0991 338.1664 25.9473 0.215 1095 +1097 3 416.702 338.8848 26.0316 0.2151 1096 +1098 3 417.5165 339.4088 25.5066 0.3141 1097 +1099 3 418.5221 339.5438 26.1649 0.2796 1098 +1100 3 419.5803 339.6124 26.04 0.3072 1099 +1101 3 420.6705 339.4545 25.583 0.339 1100 +1102 3 421.6452 339.9099 25.8838 0.3156 1101 +1103 3 422.6336 339.9533 24.8178 0.3971 1102 +1104 3 423.5088 340.4544 25.2 0.2161 1103 +1105 3 360.9457 361.504 31.36 0.2034 1032 +1106 3 361.8369 361.6905 32.3196 0.1504 1105 +1107 3 362.5748 362.3323 31.374 0.1309 1106 +1108 3 363.5849 362.7521 31.7204 0.1169 1107 +1109 3 364.7061 362.9088 31.92 0.1499 1108 +1110 3 365.7585 363.3458 31.92 0.178 1109 +1111 3 366.8671 363.5987 31.92 0.1467 1110 +1112 3 367.8921 364.0402 31.948 0.1475 1111 +1113 3 368.8553 364.6088 31.8046 0.1877 1112 +1114 3 369.8575 365.1145 31.8534 0.1579 1113 +1115 3 370.7761 365.0847 31.4709 0.1289 1114 +1116 3 371.5197 365.1408 31.843 0.2288 1115 +1117 3 372.4098 365.3879 31.4978 0.2321 1116 +1118 3 373.1877 365.556 32.48 0.2159 1117 +1119 3 374.2207 365.8226 32.9132 0.1421 1118 +1120 3 375.1256 366.1681 31.92 0.1687 1119 +1121 3 376.1792 366.207 32.3148 0.2288 1120 +1122 3 377.0956 366.1944 33.4337 0.1382 1121 +1123 3 377.8792 366.6531 32.76 0.2536 1122 +1124 3 378.7326 367.1199 32.8205 0.2007 1123 +1125 3 379.7325 367.2343 33.551 0.2264 1124 +1126 3 380.6019 367.1611 33.4841 0.1197 1125 +1127 3 381.7162 366.9952 33.4622 0.1428 1126 +1128 3 382.8385 367.0078 33.6888 0.1399 1127 +1129 3 383.8715 367.2148 34.3179 0.1818 1128 +1130 3 384.9194 367.383 34.2345 0.1759 1129 +1131 3 385.8529 367.6816 35.0 0.1144 1130 +1132 3 386.9923 367.7399 35.0 0.1144 1131 +1133 3 387.9922 368.1392 35.2248 0.1144 1132 +1134 3 389.119 368.1392 34.9247 0.1144 1133 +1135 3 390.1852 368.2456 34.9238 0.1595 1134 +1136 3 391.2606 368.5579 35.453 0.2262 1135 +1137 3 392.3028 368.9732 35.3298 0.2005 1136 +1138 3 393.2889 369.2603 35.9719 0.2288 1137 +1139 3 394.0428 369.8895 36.7556 0.154 1138 +1140 3 394.9237 370.4764 36.1953 0.2071 1139 +1141 3 394.9305 371.1502 37.6628 0.1954 1140 +1142 3 395.0232 371.4934 36.36 0.1502 1141 +1143 3 394.7441 371.5334 34.4089 0.178 1142 +1144 3 395.3286 372.0963 33.88 0.2224 1143 +1145 3 396.1672 372.5505 33.1643 0.2288 1144 +1146 3 396.2816 373.1728 34.72 0.2161 1145 +1147 3 396.5916 372.9486 33.2268 0.1915 1145 +1148 3 397.3272 373.7151 33.1453 0.2709 1147 +1149 3 397.6944 374.5925 32.8703 0.1193 1148 +1150 3 398.3831 375.3567 32.76 0.1144 1149 +1151 3 399.3166 375.9985 32.7578 0.1144 1150 +1152 3 400.1094 376.6448 32.76 0.1144 1151 +1153 3 400.9606 377.3839 32.76 0.1144 1152 +1154 3 401.6641 378.2544 32.76 0.1334 1153 +1155 3 402.3345 379.1422 32.76 0.1469 1154 +1156 3 403.284 379.5609 33.2833 0.1244 1155 +1157 3 404.2942 380.0402 32.9918 0.2815 1156 +1158 3 405.3078 380.3445 33.0333 0.1448 1157 +1159 3 406.422 380.4063 32.6018 0.1144 1158 +1160 3 407.4802 380.7495 32.1376 0.1144 1159 +1161 3 408.4343 381.3158 31.64 0.156 1160 +1162 3 409.3163 382.0171 31.2348 0.216 1161 +1163 3 410.2075 382.7229 31.08 0.1336 1162 +1164 3 410.7818 383.6736 31.08 0.1144 1163 +1165 3 411.7382 384.201 31.1044 0.1169 1164 +1166 3 412.2496 384.7569 32.608 0.274 1165 +1167 3 413.2677 384.3977 32.226 0.1806 1166 +1168 3 414.0868 384.6128 32.1314 0.1924 1167 +1169 3 414.9929 385.0361 31.92 0.2288 1168 +1170 3 415.9607 385.5383 31.7419 0.2027 1169 +1171 3 416.6139 386.1103 31.309 0.1987 1170 +1172 3 417.4456 386.4832 32.4512 0.1793 1171 +1173 3 418.0359 386.958 31.4381 0.2283 1172 +1174 3 418.1469 387.9727 32.0832 0.3284 1173 +1175 3 419.0392 388.1592 32.8843 0.143 1174 +1176 3 419.6856 388.6168 33.6 0.1673 1175 +1177 3 420.7152 388.8044 34.4226 0.1342 1176 +1178 3 421.826 388.6248 34.72 0.1144 1177 +1179 3 422.6886 388.6168 33.3572 0.286 1178 +1180 3 423.614 388.968 33.88 0.2457 1179 +1181 3 424.4766 389.4485 33.8828 0.1628 1180 +1182 3 425.5268 389.6144 34.5685 0.2336 1181 +1183 3 426.6354 389.659 34.7354 0.3305 1182 +1184 3 427.1765 390.3351 34.694 0.4237 1183 +1185 3 427.8125 390.9689 34.9034 0.2349 1184 +1186 3 427.9933 391.9436 34.1468 0.1232 1185 +1187 3 428.5081 392.8759 34.7071 0.2105 1186 +1188 3 429.1865 393.6801 34.16 0.2678 1187 +1189 3 429.9404 394.426 34.16 0.1907 1188 +1190 3 430.5764 395.2394 33.833 0.1885 1189 +1191 3 431.1667 395.9762 33.4718 0.1941 1190 +1192 3 431.9733 396.5047 34.2622 0.2078 1191 +1193 3 432.6597 397.1808 34.72 0.115 1192 +1194 3 433.3712 397.7208 33.922 0.1566 1193 +1195 3 434.2018 398.2458 33.6748 0.2355 1194 +1196 3 434.6868 398.5673 33.6417 0.2075 1195 +1197 3 435.5837 398.4552 33.796 0.249 1196 +1198 3 436.6785 398.557 33.88 0.2418 1197 +1199 3 437.4713 398.716 33.2741 0.3112 1198 +1200 3 438.2115 398.7401 33.4642 0.1845 1199 +1201 3 439.026 398.6142 33.6924 0.2507 1200 +1202 3 439.9824 398.9128 32.76 0.1907 1201 +1203 3 394.132 370.9992 33.8898 0.2025 1143 +1204 3 393.2946 370.3071 33.4527 0.1679 1203 +1205 3 392.1941 370.0954 33.8008 0.1914 1204 +1206 3 391.0878 369.9696 33.9741 0.2203 1205 +1207 3 390.1406 370.362 34.3882 0.2174 1206 +1208 3 389.1945 370.9054 34.72 0.1649 1207 +1209 3 388.3663 371.6753 34.72 0.1873 1208 +1210 3 387.355 371.8904 35.4945 0.2288 1209 +1211 3 386.251 371.9144 35.2262 0.2288 1210 +1212 3 385.2042 372.0654 35.1434 0.2064 1211 +1213 3 384.0797 372.2507 35.0 0.2281 1212 +1214 3 382.9734 372.4864 35.373 0.1907 1213 +1215 3 381.9004 372.547 34.7393 0.2691 1214 +1216 3 380.9806 372.769 35.5846 0.2596 1215 +1217 3 380.1512 373.0206 36.0769 0.1588 1216 +1218 3 379.363 373.3341 36.8822 0.178 1217 +1219 3 378.4386 372.944 36.4 0.2543 1218 +1220 3 377.6344 373.381 35.4897 0.1287 1219 +1221 3 377.0407 374.0091 36.3947 0.2714 1220 +1222 3 376.3325 374.7252 37.2814 0.2796 1221 +1223 3 375.2995 374.954 37.5794 0.1749 1222 +1224 3 374.3969 375.4608 38.08 0.1144 1223 +1225 3 373.8329 375.9092 38.2687 0.1719 1224 +1226 3 373.6784 376.8233 37.6214 0.193 1225 +1227 3 372.8845 377.6264 37.8 0.2144 1226 +1228 3 372.07 377.9776 38.3062 0.3046 1227 +1229 3 371.2131 377.8632 39.3232 0.1144 1228 +1230 3 370.3151 377.3781 38.92 0.1846 1229 +1231 3 369.4491 377.0109 39.6841 0.1733 1230 +1232 3 368.3348 377.0624 39.76 0.2743 1231 +1233 3 367.3029 377.1768 39.3705 0.1907 1232 +1234 3 366.4209 376.8553 39.7869 0.1788 1233 +1235 3 365.5995 377.0841 41.1348 0.1374 1234 +1236 3 364.7038 377.6127 40.5958 0.1343 1235 +1237 3 364.0586 378.3185 40.0674 0.3033 1236 +1238 3 363.3344 378.537 39.44 0.3527 1237 +1239 3 362.7521 379.3069 40.2749 0.1455 1238 +1240 3 361.6195 379.3161 40.32 0.1499 1239 +1241 3 360.5247 379.2715 40.8702 0.2168 1240 +1242 3 360.1781 379.6135 39.503 0.2542 1241 +1243 3 359.7811 379.2921 37.5351 0.1652 1242 +1244 3 359.3178 379.3504 40.0089 0.2288 1243 +1245 3 359.1828 380.0013 40.04 0.2585 1244 +1246 3 358.5239 380.8422 39.949 0.2069 1245 +1247 3 358.0217 381.0389 37.8619 0.2143 1246 +1248 3 357.5927 381.484 39.968 0.2759 1247 +1249 3 356.8616 381.5537 41.3596 0.3305 1248 +1250 3 355.9293 382.048 41.1018 0.2415 1249 +1251 3 355.6639 382.3648 40.2892 0.2106 1250 +1252 3 354.9798 382.533 40.5706 0.3017 1251 +1253 3 354.0554 382.7298 40.6 0.274 1252 +1254 3 353.5658 383.4974 41.1533 0.2288 1253 +1255 3 353.0887 384.3966 40.9732 0.3051 1254 +1256 3 352.2468 385.1265 41.44 0.2288 1255 +1257 3 351.6988 385.9307 40.5871 0.3141 1256 +1258 3 351.4814 386.9065 39.76 0.3065 1257 +1259 3 350.6509 387.4511 40.0075 0.2613 1258 +1260 3 349.7666 387.784 39.7818 0.2746 1259 +1261 3 349.0744 388.4589 39.6984 0.4533 1260 +1262 3 348.2084 388.96 40.0128 0.2987 1261 +1263 3 347.6204 389.6372 39.76 0.2577 1262 +1264 3 346.5233 389.7059 40.0711 0.2288 1263 +1265 3 345.6253 389.993 40.6137 0.2288 1264 +1266 3 344.9503 390.5616 39.76 0.2415 1265 +1267 3 344.4916 390.3328 38.08 0.37 1266 +1268 3 343.5512 390.5319 37.9854 0.1907 1267 +1269 3 343.0273 391.1222 38.722 0.2019 1268 +1270 3 342.0583 391.5912 38.36 0.2664 1269 +1271 3 341.2666 391.4768 38.7943 0.2454 1270 +1272 3 340.5093 391.8966 39.6838 0.4021 1271 +1273 3 339.9213 392.2776 39.3649 0.2433 1272 +1274 3 338.9054 392.5293 40.0218 0.2702 1273 +1275 3 338.195 393.2637 40.4678 0.2825 1274 +1276 3 337.5155 393.9925 39.7645 0.2204 1275 +1277 3 337.2924 394.4844 37.5225 0.2278 1276 +1278 3 336.5351 395.1296 37.7451 0.259 1277 +1279 3 335.8326 395.8023 37.2537 0.3665 1278 +1280 3 334.8751 396.0917 37.7474 0.2337 1279 +1281 3 334.2745 396.7975 38.36 0.4065 1280 +1282 3 333.476 397.3112 37.6709 0.2161 1281 +1283 3 332.5379 397.0183 37.0154 0.2988 1282 +1284 3 331.7314 396.7392 35.84 0.232 1283 +1285 3 330.8608 397.1922 35.434 0.3559 1284 +1286 3 330.0898 397.0492 35.5359 0.3281 1285 +1287 3 329.2958 396.8639 36.2076 0.3536 1286 +1288 3 328.5259 397.1842 37.6566 0.3402 1287 +1289 3 327.6187 396.833 36.9667 0.2134 1288 +1290 3 327.1337 396.6328 35.5225 0.2619 1289 +1291 3 326.2173 396.523 34.2513 0.1913 1290 +1292 3 325.5355 396.968 34.9423 0.3365 1291 +1293 3 324.4636 397.1968 35.2884 0.3051 1292 +1294 3 323.6365 396.968 35.5902 0.2592 1293 +1295 3 322.656 396.7392 35.0154 0.1717 1294 +1296 3 321.7271 397.1968 35.2876 0.2858 1295 +1297 3 320.7879 396.8593 36.12 0.3522 1296 +1298 3 319.748 396.5104 35.84 0.2415 1297 +1299 3 318.8362 396.5504 36.9866 0.2505 1298 +1300 3 318.7207 395.9384 36.1304 0.2288 1299 +1301 3 317.9782 395.2566 35.8204 0.1753 1300 +1302 3 317.174 394.6811 35.7185 0.1697 1301 +1303 3 316.2416 394.2316 36.6596 0.1907 1302 +1304 3 315.2864 393.8792 35.84 0.2415 1303 +1305 3 319.9871 397.2597 36.0366 0.3413 1298 +1306 3 320.471 397.9987 35.2884 0.2277 1305 +1307 3 321.4262 397.9084 36.2471 0.212 1306 +1308 3 321.4423 398.5204 38.3443 0.1724 1307 +1309 3 321.6356 399.4596 38.5795 0.1209 1308 +1310 3 322.0623 400.0248 37.24 0.1983 1309 +1311 3 322.5256 400.9331 36.9874 0.2146 1310 +1312 3 322.7727 401.997 36.9496 0.1566 1311 +1313 3 323.1789 402.6788 35.3444 0.1285 1312 +1314 3 323.6033 403.26 33.8366 0.1271 1313 +1315 3 323.8675 404.1763 33.8803 0.1272 1314 +1316 3 324.6649 404.5733 34.5604 0.1206 1315 +1317 3 325.2392 404.9028 35.331 0.2477 1316 +1318 3 325.2552 406.0296 35.6014 0.2155 1317 +1319 3 325.2564 407.153 35.84 0.1928 1318 +1320 3 325.4348 408.1437 36.6506 0.1907 1319 +1321 3 325.4714 409.147 35.6468 0.1907 1320 +1322 3 325.7357 409.8769 37.1683 0.1359 1321 +1323 3 325.6968 410.8882 36.8656 0.2764 1322 +1324 3 325.8101 411.8983 35.8918 0.1894 1323 +1325 3 325.6831 413.0103 36.0612 0.3272 1324 +1326 3 325.6888 414.0902 36.251 0.4226 1325 +1327 3 325.357 415.0432 36.3311 0.3079 1326 +1328 3 325.6087 415.9595 37.6037 0.3432 1327 +1329 3 325.8043 416.8633 37.3937 0.2569 1328 +1330 3 326.0434 417.7122 37.8328 0.1174 1329 +1331 3 326.2997 418.7772 37.2907 0.1711 1330 +1332 3 326.5765 419.8526 36.6489 0.2691 1331 +1333 3 326.9563 420.666 37.4965 0.2921 1332 +1334 3 327.1211 421.5045 38.5434 0.2702 1333 +1335 3 326.7264 422.3373 37.5738 0.2895 1334 +1336 3 326.7264 423.4104 38.1671 0.3133 1335 +1337 3 326.4404 424.44 38.4423 0.3006 1336 +1338 3 326.3706 425.4158 38.7649 0.2542 1337 +1339 3 326.2791 426.4203 39.2269 0.2779 1338 +1340 3 326.4072 426.887 41.2261 0.2455 1339 +1341 3 326.6017 427.681 40.0582 0.3077 1340 +1342 3 326.6109 428.531 39.8115 0.2185 1341 +1343 3 326.6909 429.0103 40.4762 0.1832 1342 +1344 3 327.1806 429.8191 40.2114 0.1897 1343 +1345 3 327.629 430.7389 40.88 0.3048 1344 +1346 3 327.645 431.8806 40.9004 0.276 1345 +1347 3 327.756 432.758 42.0 0.1368 1346 +1348 3 327.4242 433.6904 41.7236 0.3432 1347 +1349 3 327.0296 434.3207 41.8681 0.2595 1348 +1350 3 327.0696 435.149 40.6 0.3082 1349 +1351 3 327.1771 436.0848 41.8146 0.1703 1350 +1352 3 326.8454 436.6614 42.8425 0.19 1351 +1353 3 326.5731 437.6029 43.4308 0.3303 1352 +1354 3 326.8957 438.5089 44.7199 0.1598 1353 +1355 3 327.192 439.4573 43.692 0.2063 1354 +1356 3 327.5295 440.5407 43.8869 0.3079 1355 +1357 3 328.2616 441.282 44.4058 0.2218 1356 +1358 3 328.749 442.2475 44.3265 0.1771 1357 +1359 3 328.8783 442.9568 43.5341 0.1216 1358 +1360 3 328.9458 444.0001 43.3107 0.1616 1359 +1361 3 329.7511 444.595 42.574 0.1144 1360 +1362 3 330.0772 445.6772 42.56 0.1144 1361 +1363 3 330.3758 446.7526 42.7403 0.217 1362 +1364 3 330.4055 447.1793 44.6519 0.1592 1363 +1365 3 330.7327 447.741 46.5478 0.178 1364 +1366 3 330.9569 448.6059 45.9763 0.2391 1365 +1367 3 331.1571 449.6103 45.92 0.1271 1366 +1368 3 331.3722 450.6136 46.879 0.2415 1367 +1369 3 331.4671 451.7393 47.2268 0.1965 1368 +1370 3 331.6822 452.841 47.4578 0.1586 1369 +1371 3 331.76 453.5262 47.6854 0.2073 1370 +1372 3 332.1032 454.0914 48.4089 0.3432 1371 +1373 3 332.4613 454.8636 47.88 0.3202 1372 +1374 3 332.904 455.5408 46.76 0.1907 1373 +1375 3 359.4448 378.6503 40.8708 0.1767 1244 +1376 3 359.4917 377.5406 40.3816 0.1612 1375 +1377 3 360.1918 376.7535 40.3472 0.2128 1376 +1378 3 361.2546 376.9411 40.2298 0.2358 1377 +1379 3 361.9044 376.2627 41.1191 0.2614 1378 +1380 3 362.4467 375.9642 41.515 0.2464 1379 +1381 3 363.1056 375.3796 42.1775 0.1612 1380 +1382 3 363.5632 374.485 42.2528 0.2796 1381 +1383 3 364.1832 373.7906 42.0 0.1608 1382 +1384 3 365.2426 373.4153 41.7004 0.1679 1383 +1385 3 366.1566 373.0435 42.5138 0.2146 1384 +1386 3 367.1862 372.8754 43.1015 0.249 1385 +1387 3 368.0488 372.4155 42.5309 0.2232 1386 +1388 3 368.5648 371.8675 41.9955 0.1875 1387 +1389 3 368.9114 370.9557 41.9356 0.2334 1388 +1390 3 369.695 370.966 42.2554 0.3255 1389 +1391 3 370.3025 370.1046 42.84 0.2819 1390 +1392 3 371.2715 369.6539 43.2916 0.2079 1391 +1393 3 372.3537 369.4045 43.4361 0.1677 1392 +1394 3 373.4851 369.4319 43.2706 0.2232 1393 +1395 3 374.2321 369.3976 43.7108 0.3407 1394 +1396 3 375.1336 369.1688 44.3694 0.3432 1395 +1397 3 376.0179 368.6826 44.8 0.2607 1396 +1398 3 376.376 367.8726 43.7732 0.1525 1397 +1399 3 375.9184 367.6816 43.68 0.1525 1398 +1400 3 377.1173 367.1565 44.8291 0.2423 1398 +1401 3 378.0096 366.8064 45.0825 0.1522 1400 +1402 3 378.6846 366.0949 45.1637 0.1618 1401 +1403 3 379.1685 365.3375 45.9732 0.2034 1402 +1404 3 380.0196 364.793 46.6575 0.2447 1403 +1405 3 380.6088 364.2416 47.6966 0.2091 1404 +1406 3 380.936 363.3161 47.1383 0.214 1405 +1407 3 381.4668 362.402 47.3833 0.1173 1406 +1408 3 382.2161 361.5543 47.32 0.1144 1407 +1409 3 382.9368 360.8176 47.32 0.1144 1408 +1410 3 383.9493 360.4927 47.3088 0.119 1409 +1411 3 384.7306 359.7869 47.0977 0.1446 1410 +1412 3 385.4914 359.0524 47.6 0.153 1411 +1413 3 385.8106 357.9954 47.8464 0.2034 1412 +1414 3 386.3917 357.031 47.5714 0.1292 1413 +1415 3 387.435 356.92 47.2458 0.1407 1414 +1416 3 388.5196 356.7564 47.8979 0.1375 1415 +1417 3 389.4027 356.0963 47.978 0.1217 1416 +1418 3 390.0605 355.1605 47.978 0.1144 1417 +1419 3 390.7057 354.2202 48.1034 0.1144 1418 +1420 3 391.375 353.3107 48.5416 0.1144 1419 +1421 3 392.0442 352.4 48.9796 0.1144 1420 +1422 3 392.7135 351.4894 49.4178 0.1144 1421 +1423 3 393.3827 350.5799 49.856 0.1144 1422 +1424 3 393.8918 349.5686 50.0055 0.1144 1423 +1425 3 394.3162 348.507 50.0055 0.1144 1424 +1426 3 308.8262 367.7846 31.4258 0.344 773 +1427 3 308.6134 367.0066 33.3189 0.2659 1426 +1428 3 308.2771 365.9793 33.3928 0.1979 1427 +1429 3 307.5587 365.1351 33.9052 0.1555 1428 +1430 3 307.5015 364.1112 35.028 0.1647 1429 +1431 3 307.7063 362.9958 35.3438 0.1652 1430 +1432 3 307.5209 361.901 36.0018 0.1907 1431 +1433 3 306.7819 362.076 36.2443 0.3024 1432 +1434 3 305.6722 362.3242 36.54 0.3998 1433 +1435 3 304.5923 362.2876 37.0306 0.3947 1434 +1436 3 303.5604 361.8735 37.613 0.344 1435 +1437 3 302.5445 361.536 38.4048 0.2859 1436 +1438 3 301.6888 361.0247 39.4593 0.2601 1437 +1439 3 300.9956 360.1747 40.2433 0.2542 1438 +1440 3 300.0952 359.6919 41.1124 0.2542 1439 +1441 3 299.2052 359.1279 41.8561 0.2463 1440 +1442 3 298.5771 358.215 42.4536 0.2497 1441 +1443 3 297.8004 357.4256 42.905 0.2373 1442 +1444 3 296.9698 356.6614 42.7372 0.2462 1443 +1445 3 296.1747 355.8664 42.2282 0.263 1444 +1446 3 295.5066 354.9569 42.2663 0.3212 1445 +1447 3 295.0193 353.9593 42.875 0.3524 1446 +1448 3 294.3832 353.0338 43.2312 0.3466 1447 +1449 3 293.4852 352.5762 44.2467 0.2927 1448 +1450 3 292.4567 352.5167 45.4297 0.2567 1449 +1451 3 291.7131 351.7663 46.3053 0.29 1450 +1452 3 290.9032 351.1988 47.696 0.3305 1451 +1453 3 289.861 351.2721 48.3708 0.306 1452 +1454 3 288.8497 351.7606 48.8673 0.3297 1453 +1455 3 287.8819 352.3383 49.3408 0.2924 1454 +1456 3 286.7733 352.4675 48.7295 0.2791 1455 +1457 3 285.6316 352.4801 48.5968 0.2289 1456 +1458 3 284.6569 352.654 49.8602 0.2428 1457 +1459 3 284.0792 353.2535 51.3724 0.2641 1458 +1460 3 283.1343 352.7993 51.1025 0.3226 1459 +1461 3 282.6858 352.3932 51.2627 0.3432 1460 +1462 3 282.3953 351.5112 51.8311 0.2684 1461 +1463 3 282.0818 350.7207 53.4391 0.1967 1462 +1464 3 281.0991 350.3569 52.9659 0.2988 1463 +1465 3 279.9677 350.4049 52.9491 0.2685 1464 +1466 3 279.0056 350.4335 52.08 0.2757 1465 +1467 3 278.0721 350.2493 52.7481 0.1453 1466 +1468 3 277.1397 350.4484 52.1564 0.1769 1467 +1469 3 276.1696 350.6829 51.5343 0.1329 1468 +1470 3 275.5965 351.1073 52.92 0.1549 1469 +1471 3 274.7922 351.5867 53.6547 0.1144 1470 +1472 3 273.7958 351.2881 53.333 0.3505 1471 +1473 3 272.7319 350.9414 53.1544 0.3499 1472 +1474 3 271.9929 350.2928 53.636 0.2415 1473 +1475 3 270.9141 350.1601 54.1618 0.2102 1474 +1476 3 270.1213 349.468 54.0184 0.1917 1475 +1477 3 269.3674 348.92 53.1742 0.3327 1476 +1478 3 268.7164 348.8697 51.9848 0.3432 1477 +1479 3 267.7692 348.5676 52.9592 0.2129 1478 +1480 3 266.7808 348.3663 53.8432 0.1763 1479 +1481 3 266.5051 347.4362 54.8932 0.1217 1480 +1482 3 266.2191 346.8322 54.2982 0.1535 1481 +1483 3 265.686 345.8987 53.6281 0.277 1482 +1484 3 265.3016 344.8954 53.8294 0.2388 1483 +1485 3 264.685 344.447 55.1692 0.1209 1484 +1486 3 264.566 343.6118 56.28 0.1301 1485 +1487 3 263.5193 343.653 56.2257 0.1751 1486 +1488 3 262.8935 343.3933 54.654 0.1918 1487 +1489 3 261.9051 342.9266 54.5208 0.2142 1488 +1490 3 261.1191 342.9712 54.4513 0.3135 1489 +1491 3 260.2417 342.5628 54.0876 0.2982 1490 +1492 3 259.164 342.2242 53.8779 0.2081 1491 +1493 3 258.1287 341.8055 53.6679 0.1238 1492 +1494 3 257.0065 341.7128 53.76 0.1144 1493 +1495 3 256.0409 341.5698 54.4544 0.148 1494 +1496 3 255.533 340.817 55.2919 0.1854 1495 +1497 3 255.0354 339.9716 54.5689 0.2415 1496 +1498 3 254.7928 339.6959 55.4229 0.1144 1497 +1499 3 253.7918 339.3356 56.0 0.1144 1498 +1500 3 252.7817 338.9718 56.0 0.1144 1499 +1501 3 251.9477 338.5096 55.347 0.1525 1500 +1502 3 251.0851 337.9376 55.0889 0.1144 1501 +1503 3 250.1608 337.3885 54.6378 0.1195 1502 +1504 3 249.1609 337.0224 55.4408 0.1268 1503 +1505 3 248.82 336.1701 55.72 0.1144 1504 +1506 3 248.5935 335.1359 55.72 0.1144 1505 +1507 3 247.6474 334.5765 55.72 0.1144 1506 +1508 3 246.5412 334.3912 55.72 0.1144 1507 +1509 3 245.4052 334.3363 55.72 0.1144 1508 +1510 3 244.4648 333.7448 55.72 0.1144 1509 +1511 3 243.5782 333.0424 55.6349 0.1341 1510 +1512 3 242.7202 332.3389 55.592 0.2161 1511 +1513 3 242.1493 331.5632 54.6 0.1775 1512 +1514 3 241.1975 331.1834 55.3101 0.1144 1513 +1515 3 240.2526 330.7178 55.44 0.1144 1514 +1516 3 239.7035 329.9239 55.44 0.1144 1515 +1517 3 238.6098 329.7305 55.44 0.1144 1516 +1518 3 237.6557 329.1894 55.44 0.1144 1517 +1519 3 236.7668 328.479 55.44 0.1144 1518 +1520 3 235.7658 327.9974 55.16 0.1525 1519 +1521 3 235.4352 328.5568 55.16 0.1144 1520 +1522 3 234.8609 327.6027 55.4764 0.1612 1520 +1523 3 233.821 327.1497 55.8398 0.1713 1522 +1524 3 232.7743 326.7047 56.0871 0.1722 1523 +1525 3 231.7126 326.2802 56.0871 0.1538 1524 +1526 3 230.6315 325.9794 56.0871 0.1328 1525 +1527 3 229.5367 325.8478 56.0871 0.1144 1526 +1528 3 228.514 325.3364 56.0871 0.1144 1527 +1529 3 227.5141 324.7805 56.0871 0.1144 1528 +1530 3 226.5314 324.1959 56.0871 0.1144 1529 +1531 3 225.5739 323.5701 56.0871 0.1144 1530 +1532 3 224.6152 322.9455 56.0871 0.1144 1531 +1533 3 290.3278 351.1165 47.679 0.2708 1452 +1534 3 289.4446 351.3213 48.44 0.4465 1533 +1535 3 288.8692 350.8808 48.9726 0.3231 1534 +1536 3 288.9378 349.8627 49.6104 0.1838 1535 +1537 3 288.5168 348.8182 49.84 0.1158 1536 +1538 3 288.0615 348.2233 50.6125 0.2119 1537 +1539 3 287.5124 347.8069 52.6414 0.3371 1538 +1540 3 287.4666 346.8814 54.061 0.2598 1539 +1541 3 287.0342 346.2533 55.2619 0.2531 1540 +1542 3 286.7402 345.2592 55.1911 0.3012 1541 +1543 3 286.3981 344.5934 56.4668 0.3432 1542 +1544 3 286.8008 344.3703 58.2319 0.3305 1543 +1545 3 287.1383 343.772 56.8837 0.2669 1544 +1546 3 287.9448 343.7068 58.1101 0.1539 1545 +1547 3 288.3841 343.963 59.8041 0.1144 1546 +1548 3 288.852 342.938 59.92 0.2255 1547 +1549 3 289.4228 342.239 61.0697 0.178 1548 +1550 3 290.0132 341.5412 61.0467 0.218 1549 +1551 3 290.2191 340.4636 60.7583 0.2682 1550 +1552 3 289.6608 339.7794 61.2724 0.1457 1551 +1553 3 289.1117 338.8459 61.2363 0.1701 1552 +1554 3 288.4676 338.0875 61.0095 0.15 1553 +1555 3 288.0272 337.2821 62.0203 0.3305 1554 +1556 3 288.3658 336.9663 63.5295 0.1396 1555 +1557 3 288.6667 336.0328 63.8448 0.19 1556 +1558 3 288.9744 335.2858 62.4943 0.2224 1557 +1559 3 289.4423 334.5525 63.56 0.1329 1558 +1560 3 289.5487 333.6098 63.4805 0.2288 1559 +1561 3 289.6528 332.5837 64.0836 0.2262 1560 +1562 3 290.3804 332.1032 65.2215 0.1144 1561 +1563 3 291.4477 331.863 65.5102 0.1412 1562 +1564 3 292.1479 331.0919 65.52 0.1457 1563 +1565 3 293.2896 331.045 65.52 0.1144 1564 +1566 3 294.2894 330.5691 65.52 0.1195 1565 +1567 3 295.1028 329.8632 65.4682 0.2259 1566 +1568 3 295.4975 329.1288 65.5682 0.1247 1567 +1569 3 295.621 328.7078 67.7009 0.1144 1568 +1570 3 296.4264 328.3543 66.901 0.1905 1569 +1571 3 297.0739 327.5981 66.64 0.2635 1570 +1572 3 297.4446 326.5994 67.2532 0.1256 1571 +1573 3 298.1527 325.8638 67.76 0.1144 1572 +1574 3 298.9135 325.1191 67.0289 0.1957 1573 +1575 3 299.156 324.205 67.4909 0.3051 1574 +1576 3 299.4786 323.2441 68.3516 0.3178 1575 +1577 3 299.728 322.2671 68.5404 0.1988 1576 +1578 3 300.0346 321.2238 68.3284 0.178 1577 +1579 3 299.9568 320.2342 69.3118 0.326 1578 +1580 3 299.8516 319.4025 67.8031 0.2669 1579 +1581 3 300.332 319.3625 66.0887 0.2341 1580 +1582 3 300.0712 319.9768 64.1455 0.1147 1581 +1583 3 300.0712 319.9768 61.3455 0.1144 1582 +1584 3 300.5265 319.8372 59.1923 0.1854 1583 +1585 3 300.7496 318.7344 59.08 0.2262 1584 +1586 3 300.2165 318.3489 57.801 0.2102 1585 +1587 3 300.5059 317.6213 56.56 0.2163 1586 +1588 3 300.5288 316.7519 56.3066 0.1144 1587 +1589 3 300.7954 316.2908 58.0303 0.3378 1588 +1590 3 300.5265 315.5186 59.4642 0.2684 1589 +1591 3 300.5803 314.4273 59.619 0.2201 1590 +1592 3 300.3 313.4823 58.8 0.3589 1591 +1593 3 300.872 312.6552 59.36 0.2415 1592 +1594 3 307.5392 361.6859 36.8749 0.278 1432 +1595 3 307.6594 360.7101 37.3873 0.2759 1594 +1596 3 307.6216 359.7079 36.5616 0.2277 1595 +1597 3 307.5072 358.7939 36.2776 0.2034 1596 +1598 3 307.9511 358.0342 35.0669 0.1342 1597 +1599 3 308.4224 357.1316 35.2184 0.1144 1598 +1600 3 308.2645 356.5882 37.3752 0.2288 1599 +1601 3 308.6089 355.7005 37.8725 0.3276 1600 +1602 3 308.427 354.7544 38.5445 0.2064 1601 +1603 3 308.1982 354.3014 40.2822 0.1681 1602 +1604 3 308.4144 353.2031 40.32 0.1144 1603 +1605 3 308.1833 352.352 39.5142 0.3432 1604 +1606 3 307.998 351.4665 39.6662 0.22 1605 +1607 3 307.4111 351.1279 41.1289 0.1463 1606 +1608 3 307.617 350.5308 39.4271 0.1731 1607 +1609 3 306.9043 350.1635 38.3037 0.1423 1608 +1610 3 306.4776 349.2312 38.1595 0.1488 1609 +1611 3 306.9112 348.9944 40.159 0.2481 1610 +1612 3 306.4696 348.4773 40.3231 0.2918 1611 +1613 3 305.8644 348.1352 40.7154 0.1411 1612 +1614 3 306.0394 347.5872 42.56 0.1205 1613 +1615 3 305.7912 346.8619 41.2264 0.2934 1614 +1616 3 305.8656 345.9113 40.3262 0.1279 1615 +1617 3 305.5532 345.1036 41.2087 0.126 1616 +1618 3 305.4125 344.1141 42.5216 0.1194 1617 +1619 3 305.2261 343.1165 42.9176 0.2288 1618 +1620 3 305.1197 342.1933 42.0095 0.1907 1619 +1621 3 305.2958 341.2644 43.1805 0.2871 1620 +1622 3 305.5418 340.221 42.9741 0.3178 1621 +1623 3 305.2524 339.2646 43.2849 0.1691 1622 +1624 3 305.0579 338.1607 43.12 0.2235 1623 +1625 3 305.0407 337.3278 42.7781 0.2287 1624 +1626 3 304.5236 336.4241 42.1725 0.1144 1625 +1627 3 303.9768 335.8212 43.12 0.3 1626 +1628 3 303.629 335.2618 43.68 0.1816 1627 +1629 3 303.4586 334.5228 43.0181 0.2392 1628 +1630 3 303.3144 333.8055 43.0004 0.2295 1629 +1631 3 303.732 333.1328 42.5919 0.2527 1630 +1632 3 303.7549 332.2496 42.3956 0.2529 1631 +1633 3 303.9128 331.2921 42.2422 0.2899 1632 +1634 3 304.1518 330.616 42.9332 0.2796 1633 +1635 3 303.6176 330.8448 43.4 0.1271 1634 +1636 3 304.0752 329.3656 42.9649 0.1971 1634 +1637 3 303.9379 328.4813 43.7172 0.2211 1636 +1638 3 304.0237 327.4826 43.7984 0.2288 1637 +1639 3 303.7366 326.5834 44.0798 0.2152 1638 +1640 3 303.263 326.2871 45.64 0.1391 1639 +1641 3 303.2103 325.5183 44.0255 0.2034 1640 +1642 3 303.168 324.5494 44.4763 0.2535 1641 +1643 3 303.7446 323.9934 45.6145 0.171 1642 +1644 3 304.2891 323.0736 45.472 0.1144 1643 +1645 3 304.4756 322.2202 45.36 0.1922 1644 +1646 3 303.9516 321.4102 44.5449 0.1594 1645 +1647 3 303.7583 321.035 46.7432 0.1144 1646 +1648 3 302.7836 320.6884 46.9501 0.1271 1647 +1649 3 301.7483 320.2502 46.9535 0.1866 1648 +1650 3 301.0242 319.9699 47.9032 0.2034 1649 +1651 3 300.3721 319.2355 48.314 0.414 1650 +1652 3 300.0769 318.2345 48.0668 0.3417 1651 +1653 3 300.1284 317.1614 48.44 0.3773 1652 +1654 3 300.1387 316.1215 47.8092 0.2415 1653 +1655 3 300.7576 315.5278 48.7463 0.3264 1654 +1656 3 301.3113 314.9123 50.029 0.3082 1655 +1657 3 301.9016 314.8288 50.68 0.2161 1656 +1658 4 299.8081 376.1609 30.4601 0.3051 1 +1659 4 299.3013 375.1451 30.7992 0.3564 1658 +1660 4 298.8506 374.0937 30.7941 0.4198 1659 +1661 4 298.0509 373.2769 30.7602 0.4587 1660 +1662 4 297.2352 372.4795 30.5836 0.4971 1661 +1663 4 296.5694 371.6067 29.8116 0.5346 1662 +1664 4 295.8361 370.7304 29.6834 0.5439 1663 +1665 4 295.0902 369.8655 29.6951 0.4923 1664 +1666 4 294.5285 368.8702 29.7615 0.43 1665 +1667 4 294.0446 367.8429 30.109 0.3964 1666 +1668 4 293.6465 366.8076 30.7479 0.434 1667 +1669 4 293.5138 365.6727 30.8496 0.4585 1668 +1670 4 293.3433 364.5493 31.1094 0.4703 1669 +1671 4 293.1065 363.4968 32.027 0.4692 1670 +1672 4 293.0836 362.4203 32.928 0.453 1671 +1673 4 293.0436 361.2775 33.0453 0.4068 1672 +1674 4 292.7954 360.2307 33.073 0.3705 1673 +1675 4 292.6398 359.1005 33.2525 0.3928 1674 +1676 4 292.6226 357.9999 34.0102 0.4062 1675 +1677 4 292.5528 356.8628 34.1984 0.4312 1676 +1678 4 292.2382 355.7668 34.4064 0.4322 1677 +1679 4 292.0746 354.6789 35.1644 0.4198 1678 +1680 4 291.609 353.6379 35.2895 0.3568 1679 +1681 4 291.1148 352.606 35.3405 0.3054 1680 +1682 4 290.4753 351.6633 35.5897 0.2669 1681 +1683 4 289.8759 350.9495 36.5243 0.2694 1682 +1684 4 289.3016 350.0526 37.5057 0.2357 1683 +1685 4 288.6369 349.2335 37.863 0.2288 1684 +1686 4 287.7503 348.5574 37.2428 0.254 1685 +1687 4 286.9621 347.7703 36.9382 0.2927 1686 +1688 4 286.3077 346.8471 37.2775 0.312 1687 +1689 4 285.6614 345.9147 37.5234 0.3108 1688 +1690 4 284.9979 344.9835 37.5365 0.3121 1689 +1691 4 284.2691 344.106 37.5906 0.3389 1690 +1692 4 283.4946 343.2744 37.8624 0.3701 1691 +1693 4 282.8895 342.4335 38.8769 0.3885 1692 +1694 4 282.3609 341.5046 39.6357 0.3792 1693 +1695 4 281.9056 340.4624 39.6536 0.3612 1694 +1696 4 281.5373 339.4008 39.2008 0.3559 1695 +1697 4 281.0682 338.378 38.8234 0.3636 1696 +1698 4 280.4699 337.4171 39.0328 0.3764 1697 +1699 4 279.8247 336.4939 39.5248 0.3734 1698 +1700 4 279.1943 335.5489 39.7446 0.3607 1699 +1701 4 278.7859 334.4942 39.7603 0.3479 1700 +1702 4 278.2929 333.4771 39.7625 0.3512 1701 +1703 4 277.7197 332.4876 39.7743 0.364 1702 +1704 4 277.1443 331.4992 39.8362 0.3848 1703 +1705 4 276.6535 330.4844 40.2108 0.394 1704 +1706 4 276.2188 329.4468 40.7154 0.4025 1705 +1707 4 275.7921 328.3909 40.88 0.3814 1706 +1708 4 275.4134 327.3133 40.8806 0.3346 1707 +1709 4 275.132 326.2047 40.8836 0.2579 1708 +1710 4 275.0668 325.0699 40.9055 0.2029 1709 +1711 4 274.6664 324.0426 41.0228 0.1995 1710 +1712 4 273.9697 323.2418 41.8933 0.2402 1711 +1713 4 273.4377 322.314 42.7798 0.2954 1712 +1714 4 273.0614 321.2993 42.1565 0.3375 1713 +1715 4 272.6152 320.7524 41.9695 0.2288 1714 +1716 4 272.2548 319.6954 41.6987 0.3461 1715 +1717 4 271.6851 318.8751 41.6464 0.3855 1716 +1718 4 270.9999 318.175 42.4326 0.4599 1717 +1719 4 270.4393 317.2552 43.2054 0.3625 1718 +1720 4 270.0961 316.2336 43.7791 0.3183 1719 +1721 4 269.3662 315.5095 44.4444 0.2868 1720 +1722 4 269.2621 314.6458 43.127 0.3296 1721 +1723 4 268.4659 314.0692 42.4511 0.309 1722 +1724 4 267.863 313.1952 42.014 0.4068 1723 +1725 4 267.0188 312.5099 41.5904 0.3432 1724 +1726 4 266.4113 311.7343 42.0263 0.3988 1725 +1727 4 265.9251 310.9815 41.9614 0.3432 1726 +1728 4 265.7512 310.286 43.4372 0.3489 1727 +1729 4 265.3439 309.2873 43.12 0.3051 1728 +1730 4 265.2478 308.7073 42.3116 0.2998 1729 +1731 4 264.836 308.3892 41.0894 0.3316 1730 +1732 4 265.3748 307.5633 40.9175 0.2034 1731 +1733 4 265.1792 306.6675 40.1321 0.1144 1732 +1734 4 264.8474 306.258 40.0011 0.1652 1733 +1735 4 265.2501 305.4755 41.498 0.1813 1734 +1736 4 265.702 304.6049 42.56 0.317 1735 +1737 4 265.6505 303.7446 41.993 0.1675 1736 +1738 4 266.4708 303.343 41.6858 0.2187 1737 +1739 4 267.0519 302.6258 40.7162 0.2177 1738 +1740 4 267.8413 301.9966 41.0822 0.2161 1739 +1741 4 268.5288 301.3776 41.6612 0.2288 1740 +1742 4 268.5849 300.4373 41.6147 0.2875 1741 +1743 4 269.0631 299.5736 41.7836 0.4758 1742 +1744 4 269.3914 298.9936 40.8884 0.3212 1743 +1745 4 269.8318 298.3255 41.2056 0.4036 1744 +1746 4 270.2368 297.3084 40.6137 0.2486 1745 +1747 4 270.6246 296.3692 41.0295 0.3533 1746 +1748 4 270.858 295.3854 41.8037 0.2288 1747 +1749 4 271.4449 294.6418 42.6056 0.2717 1748 +1750 4 272.3452 294.1018 42.814 0.1144 1749 +1751 4 272.4539 293.6087 40.8814 0.1646 1750 +1752 4 272.7204 292.8034 41.979 0.2878 1751 +1753 4 272.8143 291.9248 40.7901 0.3051 1752 +1754 4 273.2318 291.2544 41.5232 0.2044 1753 +1755 4 273.416 290.282 42.1518 0.1271 1754 +1756 4 272.7925 289.8461 40.8962 0.198 1755 +1757 4 272.6209 288.9836 40.3808 0.2981 1756 +1758 4 272.5752 288.4493 39.2081 0.2321 1757 +1759 4 272.6678 287.5341 40.2833 0.1348 1758 +1760 4 272.7662 286.7596 38.92 0.2034 1759 +1761 4 273.0488 286.1064 40.0319 0.1923 1760 +1762 4 272.8818 285.1271 40.3096 0.2076 1761 +1763 4 272.9584 284.2691 39.5111 0.1652 1762 +1764 4 273.5498 283.6811 40.6347 0.1144 1763 +1765 4 274.1333 282.9146 39.6525 0.135 1764 +1766 4 274.2477 281.8381 39.0757 0.2477 1765 +1767 4 274.2385 280.9481 38.3975 0.2257 1766 +1768 4 273.8381 279.9242 38.4 0.1608 1767 +1769 4 273.3542 278.9278 38.1562 0.1745 1768 +1770 4 272.8348 278.0824 38.2018 0.1922 1769 +1771 4 272.3864 277.1775 38.519 0.2669 1770 +1772 4 272.1553 276.2691 37.8008 0.1528 1771 +1773 4 271.9288 275.1984 38.4185 0.1891 1772 +1774 4 272.3086 274.4124 38.0405 0.2547 1773 +1775 4 272.5752 273.4354 38.3214 0.2034 1774 +1776 4 272.3281 272.7582 38.0467 0.2834 1775 +1777 4 271.5982 272.2411 36.9163 0.2465 1776 +1778 4 271.1303 271.5684 38.2782 0.1144 1777 +1779 4 271.6863 270.8077 37.8616 0.2034 1778 +1780 4 271.875 269.9565 36.8329 0.2258 1779 +1781 4 271.6314 269.0722 37.3332 0.1783 1780 +1782 4 271.2413 268.3206 36.2782 0.2715 1781 +1783 4 271.2104 267.5198 36.0186 0.1965 1782 +1784 4 271.128 266.7373 36.9883 0.2924 1783 +1785 4 270.9244 265.726 36.4 0.2034 1784 +1786 4 270.8992 265.8656 37.24 0.2288 1785 +1787 4 271.1166 265.1277 36.12 0.1314 1785 +1788 4 271.2378 264.2434 36.2631 0.1144 1787 +1789 4 271.1177 263.1715 36.0511 0.1252 1788 +1790 4 270.9793 262.2403 37.1862 0.1181 1789 +1791 4 271.3225 261.2484 37.2089 0.1631 1790 +1792 4 271.2424 260.5483 36.1147 0.17 1791 +1793 4 271.128 259.8768 35.3027 0.2322 1792 +1794 4 271.1841 258.9398 36.1043 0.1841 1793 +1795 4 271.4712 257.9926 35.8907 0.1635 1794 +1796 4 271.5856 257.0682 35.5264 0.1904 1795 +1797 4 271.3831 256.065 34.7922 0.1447 1796 +1798 4 271.1406 254.9987 34.7516 0.2287 1797 +1799 4 271.128 254.0572 35.4824 0.2669 1798 +1800 4 271.0216 253.4772 34.2278 0.1983 1799 +1801 4 271.0948 252.5517 34.9602 0.1636 1800 +1802 4 271.3568 251.6811 35.3447 0.178 1801 +1803 4 271.8007 250.7545 35.2814 0.216 1802 +1804 4 271.9528 249.9285 34.2157 0.1446 1803 +1805 4 272.0306 249.0728 33.32 0.2889 1804 +1806 4 272.5408 248.5855 35.0 0.2669 1805 +1807 4 272.7296 247.5856 34.1986 0.1677 1806 +1808 4 272.518 246.564 34.7589 0.2193 1807 +1809 4 272.1233 245.4978 35.0 0.269 1808 +1810 4 271.8144 244.4476 35.0297 0.2444 1809 +1811 4 271.7023 243.338 35.3186 0.1659 1810 +1812 4 271.8888 242.5291 35.0 0.247 1811 +1813 4 272.5008 241.8313 35.5236 0.2798 1812 +1814 4 273.2558 241.1815 35.6112 0.2288 1813 +1815 4 273.8278 240.2755 36.2239 0.202 1814 +1816 4 274.1264 239.2516 36.0335 0.1725 1815 +1817 4 274.3266 238.1819 36.2085 0.1144 1816 +1818 4 274.6469 237.2564 35.1226 0.1695 1817 +1819 4 275.1514 236.4614 35.7316 0.1652 1818 +1820 4 275.704 235.7212 35.5776 0.1955 1819 +1821 4 275.7646 234.6676 35.6908 0.1967 1820 +1822 4 276.1353 233.7489 36.0923 0.2556 1821 +1823 4 276.276 232.7903 35.2531 0.2288 1822 +1824 4 276.7004 231.9666 34.5369 0.3238 1823 +1825 4 276.7462 230.9644 33.6 0.2204 1824 +1826 4 276.9933 230.2346 33.8254 0.2288 1825 +1827 4 277.857 229.7072 34.16 0.1144 1826 +1828 4 277.9989 228.6215 33.8125 0.2052 1827 +1829 4 278.6956 227.8299 33.6129 0.1306 1828 +1830 4 279.3431 227.1023 33.0711 0.1512 1829 +1831 4 279.2001 226.2066 33.8484 0.2924 1830 +1832 4 279.4792 225.8256 35.0 0.2415 1831 +1833 4 264.6175 308.5723 44.3792 0.3432 1729 +1834 4 264.0352 308.1101 43.7251 0.3051 1833 +1835 4 263.4106 307.3013 43.7478 0.4046 1834 +1836 4 263.0548 306.4787 43.4862 0.2063 1835 +1837 4 262.397 305.8793 43.9267 0.1913 1836 +1838 4 261.8593 305.4263 44.24 0.3159 1837 +1839 4 261.2919 304.5145 43.7203 0.405 1838 +1840 4 261.0288 303.5158 43.5868 0.3016 1839 +1841 4 261.0768 302.5445 43.787 0.2613 1840 +1842 4 260.7874 301.8112 42.4673 0.3777 1841 +1843 4 260.705 300.8548 41.2639 0.243 1842 +1844 4 260.2474 300.0071 41.8135 0.3305 1843 +1845 4 259.8985 299.3619 43.3874 0.3813 1844 +1846 4 259.1286 298.624 42.8565 0.2601 1845 +1847 4 258.655 298.0578 43.2172 0.2669 1846 +1848 4 258.1413 297.1712 43.1343 0.3247 1847 +1849 4 257.6288 296.6392 43.96 0.3686 1848 +1850 4 257.0648 295.7469 44.8678 0.276 1849 +1851 4 256.7239 294.8706 46.3028 0.1907 1850 +1852 4 256.2205 294.4965 45.6817 0.3671 1851 +1853 4 255.8956 293.5252 45.9388 0.3934 1852 +1854 4 255.7881 292.4098 45.4096 0.3386 1853 +1855 4 255.1692 291.7989 45.0251 0.486 1854 +1856 4 254.6544 291.2521 46.5273 0.3553 1855 +1857 4 254.3512 290.576 46.132 0.2844 1856 +1858 4 253.7392 289.9376 46.058 0.1661 1857 +1859 4 253.4326 289.2673 47.7621 0.275 1858 +1860 4 253.078 288.383 47.1654 0.2204 1859 +1861 4 252.7737 287.311 46.8532 0.2094 1860 +1862 4 252.3492 286.4862 47.0719 0.3208 1861 +1863 4 252.0426 285.7254 48.1449 0.2672 1862 +1864 4 251.9752 284.9143 49.3147 0.2288 1863 +1865 4 251.2064 284.2794 50.3468 0.2288 1864 +1866 4 250.5543 283.4043 50.0458 0.3202 1865 +1867 4 249.9937 282.997 48.16 0.2812 1866 +1868 4 249.4229 282.4628 49.287 0.3432 1867 +1869 4 249.1254 281.551 49.9022 0.2796 1868 +1870 4 248.5626 281.6242 48.8846 0.1683 1869 +1871 4 247.4918 281.4274 49.5628 0.2463 1870 +1872 4 246.7505 280.7982 49.3511 0.2515 1871 +1873 4 245.8525 280.3807 50.1315 0.281 1872 +1874 4 245.2816 279.8853 50.1273 0.2169 1873 +1875 4 244.5666 279.454 49.28 0.3051 1874 +1876 4 243.6812 278.7917 49.6138 0.2918 1875 +1877 4 243.0119 278.1613 50.6066 0.3382 1876 +1878 4 242.3106 277.4028 51.2865 0.2942 1877 +1879 4 241.9754 276.657 50.4053 0.2393 1878 +1880 4 241.4755 275.7978 50.8094 0.2587 1879 +1881 4 240.7239 275.1034 51.8507 0.178 1880 +1882 4 240.2343 274.2065 52.0618 0.2288 1881 +1883 4 239.7103 273.3828 52.1007 0.2203 1882 +1884 4 239.5833 272.4505 53.1185 0.3305 1883 +1885 4 238.9473 271.9196 52.7853 0.2432 1884 +1886 4 238.5938 271.1852 53.6505 0.1971 1885 +1887 4 237.8342 270.421 53.9773 0.1652 1886 +1888 4 237.0288 270.3855 54.3074 0.2339 1887 +1889 4 236.3229 269.7529 53.5836 0.2843 1888 +1890 4 235.672 269.0185 54.2688 0.2011 1889 +1891 4 235.0623 268.2451 53.7323 0.2161 1890 +1892 4 234.568 267.3791 53.5648 0.2474 1891 +1893 4 234.1368 266.6767 54.0492 0.211 1892 +1894 4 234.0464 266.4273 56.2489 0.229 1893 +1895 4 233.7192 265.3314 56.2489 0.2516 1894 +1896 4 232.8463 264.6518 56.0311 0.2193 1895 +1897 4 232.2423 264.0752 54.9332 0.217 1896 +1898 4 231.7206 263.2699 54.9489 0.2288 1897 +1899 4 231.0102 262.9015 55.5892 0.2543 1898 +1900 4 230.794 262.2483 55.9908 0.2587 1899 +1901 4 230.6007 261.3857 56.5454 0.3432 1900 +1902 4 230.0641 260.4819 55.5845 0.2424 1901 +1903 4 229.8296 259.6251 54.5714 0.4277 1902 +1904 4 229.5962 258.7854 54.6501 0.2934 1903 +1905 4 228.8092 258.3598 55.8144 0.3215 1904 +1906 4 228.5026 257.4057 56.4029 0.2382 1905 +1907 4 228.5884 256.5981 56.84 0.1876 1906 +1908 4 228.2589 255.5055 56.8851 0.1709 1907 +1909 4 227.5942 254.7322 57.3448 0.1963 1908 +1910 4 226.8598 254.1671 56.6222 0.2669 1909 +1911 4 226.1665 253.3377 56.9898 0.1986 1910 +1912 4 225.9045 252.379 57.12 0.1984 1911 +1913 4 225.3989 251.3608 57.3017 0.2666 1912 +1914 4 225.1449 250.7328 58.3472 0.2994 1913 +1915 4 224.6438 250.1505 59.6285 0.2255 1914 +1916 4 224.621 249.2078 59.0848 0.3197 1915 +1917 4 223.9094 248.5718 59.64 0.2767 1916 +1918 4 223.8808 247.9574 59.8441 0.3122 1917 +1919 4 223.0125 247.5994 59.3158 0.2549 1918 +1920 4 222.9656 246.6464 60.48 0.3051 1919 +1921 4 222.2849 246.1327 61.6753 0.1889 1920 +1922 4 221.4841 245.5882 61.88 0.1873 1921 +1923 4 221.0059 245.0402 60.1888 0.2364 1922 +1924 4 220.4705 244.8057 60.76 0.1271 1923 +1925 4 219.6491 244.1296 60.48 0.2288 1924 +1926 4 219.2224 243.7635 62.5162 0.2321 1925 +1927 4 218.6321 243.1309 63.4094 0.2669 1926 +1928 4 218.3736 242.3232 64.4028 0.3264 1927 +1929 4 217.5625 241.7592 64.3283 0.309 1928 +1930 4 216.8155 240.9344 64.12 0.3726 1929 +1931 4 216.0696 240.0947 64.3737 0.5053 1930 +1932 4 215.4655 239.3626 65.2288 0.5131 1931 +1933 4 215.0182 238.5366 66.0988 0.4272 1932 +1934 4 214.1248 237.9451 66.5414 0.3382 1933 +1935 4 213.3743 237.1054 66.6534 0.3432 1934 +1936 4 213.4693 236.236 66.9186 0.2671 1935 +1937 4 212.6204 235.6663 65.8 0.3358 1936 +1938 4 212.4374 234.7751 66.642 0.1922 1937 +1939 4 211.7498 234.3141 67.0466 0.3437 1938 +1940 4 211.2522 233.6048 67.7359 0.482 1939 +1941 4 210.5726 232.78 67.7757 0.3434 1940 +1942 4 209.9023 232.041 67.1216 0.3281 1941 +1943 4 209.4515 231.1921 66.9393 0.3765 1942 +1944 4 208.9951 230.3776 67.6855 0.353 1943 +1945 4 208.4814 229.69 68.88 0.4491 1944 +1946 4 207.9792 228.7222 68.698 0.2569 1945 +1947 4 207.5113 228.228 69.953 0.3875 1946 +1948 4 207.0137 227.4913 70.5186 0.2924 1947 +1949 4 206.3925 226.6939 70.74 0.4721 1948 +1950 4 205.5768 225.7146 68.9307 0.2469 1949 +1951 4 205.0071 225.0488 69.7799 0.3204 1950 +1952 4 204.355 224.2858 69.19 0.2288 1951 +1953 4 203.8883 223.7607 70.6776 0.3775 1952 +1954 4 203.6961 223.0514 70.6726 0.3268 1953 +1955 4 202.9788 222.6521 71.4692 0.472 1954 +1956 4 202.6138 221.6969 71.6864 0.3536 1955 +1957 4 201.9743 221.0116 72.142 0.3725 1956 +1958 4 201.36 220.1559 71.2379 0.2436 1957 +1959 4 201.1838 219.9088 72.266 0.1144 1958 +1960 4 200.812 219.171 73.67 0.1657 1959 +1961 4 200.2892 218.226 74.403 0.1977 1960 +1962 4 199.8465 217.2227 73.7769 0.2776 1961 +1963 4 199.5228 216.3704 72.6037 0.2765 1962 +1964 4 198.8009 215.5696 72.4802 0.394 1963 +1965 4 198.2403 214.6624 72.0619 0.2288 1964 +1966 4 198.0161 214.0893 74.1482 0.2818 1965 +1967 4 197.5082 213.3343 75.0126 0.4173 1966 +1968 4 196.9167 212.538 74.6911 0.2423 1967 +1969 4 196.5472 211.7372 75.3514 0.3432 1968 +1970 4 195.9706 211.0211 75.7884 0.4558 1969 +1971 4 195.6549 210.1459 75.7711 0.3156 1970 +1972 4 194.9628 209.7684 74.2092 0.4919 1971 +1973 4 194.5944 208.8052 75.0795 0.395 1972 +1974 4 194.2237 207.9346 75.8545 0.4263 1973 +1975 4 192.9001 206.7242 77.1 0.4235 1974 +1976 4 192.4151 206.031 77.5869 0.3298 1975 +1977 4 191.8946 205.3903 77.3111 0.2567 1976 +1978 4 191.5708 204.6536 77.28 0.2584 1977 +1979 4 190.8604 203.9763 77.9212 0.5339 1978 +1980 4 190.7689 203.4467 79.8238 0.3861 1979 +1981 4 190.2472 202.7317 80.0873 0.4454 1980 +1982 4 190.0276 201.7055 80.2984 0.3557 1981 +1983 4 189.2473 201.1518 80.0103 0.3756 1982 +1984 4 189.0071 200.3945 78.5932 0.3821 1983 +1985 4 188.7646 199.9083 80.1206 0.2245 1984 +1986 4 188.2612 199.2287 79.6816 0.3159 1985 +1987 4 187.3437 198.7471 79.002 0.4299 1986 +1988 4 186.6425 197.9566 79.469 0.3586 1987 +1989 4 185.9526 197.4601 80.3799 0.4454 1988 +1990 4 185.5728 197.1981 82.04 0.4195 1989 +1991 4 185.1312 196.1903 82.2343 0.3686 1990 +1992 4 184.3464 195.4181 82.7114 0.3313 1991 +1993 4 183.6074 194.623 83.4165 0.3811 1992 +1994 4 183.3294 193.5476 83.72 0.4602 1993 +1995 4 182.7197 192.732 83.5853 0.3615 1994 +1996 4 182.1214 191.8294 83.8956 0.353 1995 +1997 4 181.4773 191.1384 82.88 0.3813 1996 +1998 4 180.9716 190.2094 82.9116 0.3038 1997 +1999 4 180.315 189.4178 82.88 0.3704 1998 +2000 4 179.608 189.0014 83.54 0.2319 1999 +2001 4 179.3998 188.1811 84.5513 0.3051 2000 +2002 4 178.9124 187.33 84.6866 0.3691 2001 +2003 4 178.0201 186.758 84.9971 0.3392 2002 +2004 4 177.5728 185.8245 84.84 0.2953 2003 +2005 4 177.0923 184.8773 84.0062 0.4058 2004 +2006 4 176.6096 184.0833 84.0118 0.321 2005 +2007 4 175.8397 183.4953 84.5995 0.4174 2006 +2008 4 175.4873 182.9439 85.8561 0.3348 2007 +2009 4 174.9336 182.158 86.6746 0.2415 2008 +2010 4 174.6774 181.324 85.9636 0.4307 2009 +2011 4 174.3399 180.5953 87.08 0.3747 2010 +2012 4 173.6386 179.934 86.8935 0.4109 2011 +2013 4 173.3812 178.9754 86.8045 0.3424 2012 +2014 4 173.0769 178.3324 87.3152 0.2388 2013 +2015 4 172.8287 177.423 86.133 0.3051 2014 +2016 4 172.0576 176.6977 86.5354 0.4068 2015 +2017 4 171.6938 176.128 88.2837 0.3386 2016 +2018 4 171.1985 175.2608 89.0798 0.2352 2017 +2019 4 170.6619 174.6831 89.7005 0.3368 2018 +2020 4 170.1563 173.745 88.7788 0.2916 2019 +2021 4 169.5076 173.054 89.32 0.3295 2020 +2022 4 169.0729 172.3802 88.2059 0.3099 2021 +2023 4 168.3373 171.695 88.4366 0.1781 2022 +2024 4 167.5834 171.2614 89.6221 0.3887 2023 +2025 4 167.0675 170.5761 90.72 0.3487 2024 +2026 4 166.6922 169.5774 90.9504 0.2736 2025 +2027 4 166.0104 168.6805 90.8214 0.3615 2026 +2028 4 165.5334 167.8648 89.4449 0.4909 2027 +2029 4 164.776 167.2093 89.5843 0.4261 2028 +2030 4 164.2018 166.2575 89.6132 0.3665 2029 +2031 4 163.8826 165.6604 91.0482 0.337 2030 +2032 4 163.7007 164.641 90.5915 0.3375 2031 +2033 4 163.3964 163.616 91.0115 0.2341 2032 +2034 4 163.3312 162.7351 91.56 0.2229 2033 +2035 4 162.8347 161.9069 91.9881 0.3491 2034 +2036 4 162.0785 161.137 92.694 0.2981 2035 +2037 4 161.1759 160.5066 93.1837 0.2377 2036 +2038 4 160.7595 159.5045 93.2467 0.2034 2037 +2039 4 160.2561 158.5721 93.7045 0.2094 2038 +2040 4 159.7493 157.9235 93.0404 0.2898 2039 +2041 4 159.461 156.9625 93.5558 0.2677 2040 +2042 4 159.135 156.029 94.5098 0.2206 2041 +2043 4 158.6042 155.1664 95.1686 0.1738 2042 +2044 4 158.2884 154.0888 94.92 0.1192 2043 +2045 4 157.753 153.2171 95.2812 0.3227 2044 +2046 4 157.4236 152.1291 95.2 0.3284 2045 +2047 4 157.0575 151.0549 95.4198 0.2915 2046 +2048 4 156.6616 150.198 96.8103 0.2605 2047 +2049 4 156.2304 149.3995 97.7693 0.2601 2048 +2050 4 155.7579 148.5976 97.071 0.3911 2049 +2051 4 155.3323 147.7636 96.9422 0.3122 2050 +2052 4 154.8976 146.9548 98.4326 0.1401 2051 +2053 4 154.3245 146.0613 98.84 0.1144 2052 +2054 4 153.6049 145.3143 98.8308 0.1182 2053 +2055 4 152.8155 144.5398 98.4931 0.1898 2054 +2056 4 152.2458 143.5926 98.7792 0.1846 2055 +2057 4 151.5537 142.8616 99.12 0.3122 2056 +2058 4 150.7563 142.2644 98.7109 0.2288 2057 +2059 4 149.9933 141.8331 99.6128 0.2669 2058 +2060 4 149.7004 140.9419 100.6138 0.3392 2059 +2061 4 149.3698 139.9329 101.39 0.2084 2060 +2062 4 149.1593 138.8553 102.0124 0.124 2061 +2063 4 148.5187 137.9264 102.2 0.1144 2062 +2064 4 147.6549 137.3143 102.4666 0.1144 2063 +2065 4 146.9937 136.4243 102.48 0.1336 2064 +2066 4 146.4755 135.4599 102.7869 0.1725 2065 +2067 4 146.2146 134.4349 103.1414 0.1635 2066 +2068 4 145.7559 133.5448 103.9004 0.1144 2067 +2069 4 145.3418 132.5198 104.16 0.1144 2068 +2070 4 144.4769 131.8952 104.2272 0.1225 2069 +2071 4 143.7081 131.1173 104.4291 0.2116 2070 +2072 4 143.5617 130.5693 106.3866 0.167 2071 +2073 4 143.1201 129.7182 106.6985 0.1939 2072 +2074 4 142.7815 128.7927 106.2384 0.2288 2073 +2075 4 142.4257 127.8614 106.7878 0.1907 2074 +2076 4 142.0779 127.0458 107.8 0.1714 2075 +2077 4 141.7038 125.9922 107.7997 0.1907 2076 +2078 4 141.0678 125.109 107.8246 0.1325 2077 +2079 4 140.2292 124.5278 108.5468 0.1144 2078 +2080 4 139.4547 123.7064 108.64 0.1144 2079 +2081 4 138.8587 122.9651 109.482 0.1144 2080 +2082 4 138.5338 122.0202 109.9134 0.1312 2081 +2083 4 137.9515 121.089 110.2469 0.1191 2082 +2084 4 137.1919 120.3133 111.0547 0.1514 2083 +2085 4 136.7034 119.3112 111.517 0.2034 2084 +2086 4 136.16 118.3376 112.0 0.162 2085 +2087 4 136.033 117.3241 112.572 0.116 2086 +2088 4 136.2298 116.2876 113.3457 0.1341 2087 +2089 4 136.0857 115.1791 113.68 0.1487 2088 +2090 4 135.7676 114.0822 113.68 0.2288 2089 +2091 4 135.3981 113.5568 113.96 0.3382 2090 +2092 4 134.8776 112.7799 114.7471 0.3216 2091 +2093 4 134.8421 111.7206 115.0932 0.265 2092 +2094 4 135.4416 110.8978 115.4829 0.2255 2093 +2095 4 135.6933 110.0838 114.0 0.2614 2094 +2096 4 135.6784 109.1147 114.408 0.2728 2095 +2097 4 135.9644 108.3403 116.1345 0.2731 2096 +2098 4 135.7734 107.3832 116.247 0.2754 2097 +2099 4 135.8157 106.3778 116.713 0.1801 2098 +2100 4 135.7562 105.2764 117.2979 0.2305 2099 +2101 4 135.4313 104.1866 117.4362 0.2765 2100 +2102 4 135.1762 103.141 118.1471 0.2258 2101 +2103 4 134.6808 102.7232 116.5688 0.1973 2102 +2104 4 134.6305 101.8254 115.64 0.2256 2103 +2105 4 134.6488 100.7918 116.0944 0.1144 2104 +2106 4 134.6911 100.0884 117.6512 0.148 2105 +2107 4 134.7815 99.3526 118.72 0.3813 2106 +2108 4 135.2116 98.4157 118.2686 0.3241 2107 +2109 4 135.2437 97.7976 116.3408 0.2519 2108 +2110 4 135.54 96.8788 117.32 0.1947 2109 +2111 4 135.6384 96.0939 116.9518 0.2655 2110 +2112 4 135.5686 95.3231 116.0323 0.2111 2111 +2113 4 135.961 94.9299 114.4307 0.2341 2112 +2114 4 136.247 93.8935 113.96 0.2448 2113 +2115 4 136.3568 92.8218 114.1753 0.2625 2114 +2116 4 136.4529 91.8987 115.36 0.1849 2115 +2117 4 137.0512 91.0443 115.5636 0.2385 2116 +2118 4 136.9402 90.948 118.258 0.1332 2117 +2119 4 136.9368 90.9226 121.0527 0.1144 2118 +2120 4 137.0512 90.5832 123.489 0.1144 2119 +2121 4 137.0638 89.7208 125.1228 0.1144 2120 +2122 4 137.0215 89.0255 127.1393 0.1349 2121 +2123 4 137.0592 88.0054 127.9911 0.2262 2122 +2124 4 137.1805 86.96 128.7784 0.1232 2123 +2125 4 137.8566 86.1886 129.0635 0.1719 2124 +2126 4 138.0808 85.5975 129.8321 0.2235 2125 +2127 4 138.6082 84.7646 130.188 0.1144 2126 +2128 4 139.2008 83.8653 130.76 0.2266 2127 +2129 4 139.465 83.1791 129.3804 0.1773 2128 +2130 4 140.2121 82.5405 129.2609 0.1562 2129 +2131 4 140.8264 81.6683 129.08 0.1182 2130 +2132 4 141.6215 80.9534 129.0187 0.1144 2131 +2133 4 142.5664 80.3992 128.5889 0.1144 2132 +2134 4 143.1178 79.4848 128.3582 0.1144 2133 +2135 4 143.2288 78.4465 128.4875 0.1144 2134 +2136 4 143.0149 77.6787 129.3454 0.1675 2135 +2137 4 143.1522 77.233 131.0431 0.2472 2136 +2138 4 143.4702 76.4309 132.16 0.2478 2137 +2139 4 143.8706 75.5771 132.6601 0.2069 2138 +2140 4 143.7962 74.8564 134.1166 0.1254 2139 +2141 4 143.3032 74.0542 135.2425 0.1144 2140 +2142 4 143.0801 73.2361 136.2155 0.1468 2141 +2143 4 143.2174 72.1136 136.08 0.2382 2142 +2144 4 143.4576 71.3856 136.64 0.1398 2143 +2145 4 135.3993 113.6063 114.2098 0.3051 2090 +2146 4 134.6705 113.0582 113.1259 0.2772 2145 +2147 4 134.2839 112.9949 114.6107 0.3276 2146 +2148 4 133.7771 112.7324 116.48 0.2415 2147 +2149 4 133.0724 112.0937 117.7081 0.2775 2148 +2150 4 132.9751 111.1348 118.6234 0.2504 2149 +2151 4 132.3414 110.3951 118.454 0.1563 2150 +2152 4 131.56 110.0009 119.576 0.273 2151 +2153 4 131.2111 109.3296 121.2224 0.1453 2152 +2154 4 130.6368 108.7944 122.2931 0.2055 2153 +2155 4 129.9607 108.2954 121.2926 0.265 2154 +2156 4 129.5225 107.9852 122.703 0.1314 2155 +2157 4 129.725 107.3733 124.2497 0.1478 2156 +2158 4 129.2892 106.8544 123.7054 0.2288 2157 +2159 4 128.5948 106.3221 124.88 0.2314 2158 +2160 4 128.3431 105.2986 125.5346 0.1652 2159 +2161 4 127.4553 104.8079 126.28 0.1144 2160 +2162 4 126.8971 104.0031 127.073 0.2605 2161 +2163 4 125.9418 103.4019 127.12 0.2765 2162 +2164 4 125.1742 102.8517 127.9116 0.1907 2163 +2165 4 124.4523 102.6348 129.64 0.1271 2164 +2166 4 123.5692 101.9666 129.92 0.1333 2165 +2167 4 122.8233 101.3039 130.7348 0.1265 2166 +2168 4 121.8028 100.8097 130.76 0.131 2167 +2169 4 120.9437 100.4054 131.224 0.2008 2168 +2170 4 120.0754 99.7797 130.6836 0.1849 2169 +2171 4 119.4061 99.3095 129.1987 0.1302 2170 +2172 4 118.515 99.143 128.6659 0.1144 2171 +2173 4 117.6696 98.5148 128.24 0.1144 2172 +2174 4 116.5496 98.384 128.4363 0.1144 2173 +2175 4 115.409 98.384 128.52 0.1194 2174 +2176 4 114.5167 98.384 129.7778 0.1619 2175 +2177 4 113.8957 98.4984 132.0063 0.2288 2176 +2178 4 113.0108 98.9001 132.0852 0.2868 2177 +2179 4 112.0936 99.2735 131.3301 0.2418 2178 +2180 4 111.1802 99.3057 131.068 0.2135 2179 +2181 4 110.123 99.362 131.0397 0.2287 2180 +2182 4 109.268 99.4342 132.02 0.2431 2181 +2183 4 108.3749 99.0196 131.6311 0.3178 2182 +2184 4 107.9407 98.8416 132.7418 0.3199 2183 +2185 4 107.5813 98.384 132.7782 0.1477 2184 +2186 4 107.269 98.023 131.2394 0.2898 2185 +2187 4 106.4616 97.3663 131.6078 0.1263 2186 +2188 4 105.8261 97.391 133.2612 0.1144 2187 +2189 4 105.6227 96.6324 133.56 0.1271 2188 +2190 4 105.4783 95.6784 132.9051 0.1907 2189 +2191 4 104.7904 95.5017 131.4712 0.1504 2190 +2192 4 104.719 94.465 130.975 0.2004 2191 +2193 4 104.7546 93.4246 131.0512 0.1788 2192 +2194 4 104.9176 92.3282 131.0501 0.1566 2193 +2195 4 105.1714 91.5068 129.8564 0.1522 2194 +2196 4 104.9646 90.7354 129.5868 0.2288 2195 +2197 4 105.1305 90.376 131.8929 0.1715 2196 +2198 4 105.0192 89.9533 133.387 0.313 2197 +2199 4 104.676 89.1177 132.6399 0.1953 2198 +2200 4 104.4472 88.307 133.5298 0.2743 2199 +2201 4 104.3328 87.3038 132.4621 0.2692 2200 +2202 4 104.0619 86.414 130.9991 0.1921 2201 +2203 4 103.2351 85.8715 130.3224 0.2015 2202 +2204 4 103.0362 85.1773 128.8319 0.1907 2203 +2205 4 103.293 84.8392 127.1651 0.155 2204 +2206 4 103.6284 83.8574 126.84 0.1981 2205 +2207 4 102.9944 83.0582 127.132 0.1682 2206 +2208 4 102.325 82.3305 126.9036 0.3387 2207 +2209 4 102.1894 81.4099 126.5561 0.1382 2208 +2210 4 101.5258 80.9671 124.6666 0.2407 2209 +2211 4 101.2654 80.3004 123.9762 0.1228 2210 +2212 4 101.538 79.6142 124.1198 0.2542 2211 +2213 4 101.5872 78.8216 124.04 0.2542 2212 +2214 4 107.6236 98.956 132.314 0.249 2183 +2215 4 107.0173 99.6743 131.8738 0.2094 2214 +2216 4 106.4612 100.224 130.5581 0.1718 2215 +2217 4 105.7241 100.6961 131.5591 0.1652 2216 +2218 4 105.3258 101.2052 133.0 0.2547 2217 +2219 4 104.5105 101.914 132.7306 0.2672 2218 +2220 4 103.7482 102.3552 133.7563 0.1605 2219 +2221 4 103.0297 102.8874 134.3734 0.1922 2220 +2222 4 102.4516 103.6337 134.0268 0.2288 2221 +2223 4 101.816 103.9133 134.2132 0.2288 2222 +2224 4 101.6215 104.0517 134.9334 0.1416 2222 +2225 4 100.8323 104.4483 134.7819 0.2519 2224 +2226 4 100.2006 104.9818 135.4564 0.1777 2225 +2227 4 99.5304 105.5897 134.6374 0.1144 2226 +2228 4 99.1649 106.396 135.5973 0.142 2227 +2229 4 98.4944 106.9781 136.8906 0.1144 2228 +2230 4 97.8302 107.3853 138.1134 0.2188 2229 +2231 4 97.2462 107.7832 139.806 0.1657 2230 +2232 4 97.0504 108.4184 139.7536 0.2012 2231 +2233 4 96.6121 109.1376 140.4455 0.2718 2232 +2234 4 96.2954 109.7806 141.9558 0.2051 2233 +2235 4 95.3715 109.824 143.2668 0.2034 2234 +2236 4 94.4802 110.2816 143.5031 0.2134 2235 +2237 4 93.6863 110.4196 144.8868 0.1568 2236 +2238 4 93.1176 111.073 144.9384 0.1398 2237 +2239 4 92.3406 110.968 143.7419 0.2631 2238 +2240 4 91.5187 110.8489 145.4379 0.1954 2239 +2241 4 90.5336 110.5398 146.5738 0.1652 2240 +2242 4 89.9027 110.7393 148.6492 0.178 2241 +2243 4 88.9348 111.0824 147.9848 0.2539 2242 +2244 4 87.9145 110.9666 146.886 0.1586 2243 +2245 4 86.8543 111.2734 146.7357 0.1652 2244 +2246 4 85.9644 111.8899 147.499 0.1652 2245 +2247 4 85.1134 112.2264 148.4115 0.1905 2246 +2248 4 84.7254 112.2592 150.6086 0.1499 2247 +2249 4 83.9685 112.6759 151.5816 0.2261 2248 +2250 4 83.2832 112.4552 149.8 0.1525 2249 +2251 4 223.8064 247.0079 61.161 0.2799 1920 +2252 4 224.224 247.9048 59.92 0.2796 2251 +2253 4 248.3876 280.598 49.28 0.3178 1869 +2254 4 248.5306 279.4792 50.3552 0.2932 2253 +2255 4 249.3497 278.9861 51.3752 0.2613 2254 +2256 4 249.1907 278.0355 50.5926 0.1907 2255 +2257 4 249.5064 277.1512 51.711 0.242 2256 +2258 4 249.527 276.2806 52.5893 0.2756 2257 +2259 4 250.3232 275.6662 51.8263 0.138 2258 +2260 4 250.5463 274.6538 52.3508 0.2656 2259 +2261 4 250.9032 273.8999 52.4465 0.1332 2260 +2262 4 250.8792 272.812 52.92 0.1707 2261 +2263 4 251.227 271.8853 53.2734 0.2374 2262 +2264 4 251.6583 271.239 53.7068 0.2372 2263 +2265 4 251.7944 270.4576 54.2497 0.2288 2264 +2266 4 251.7944 269.5447 55.0642 0.2288 2265 +2267 4 251.68 268.8469 54.962 0.3373 2266 +2268 4 252.1902 268.165 55.5307 0.115 2267 +2269 4 252.7222 267.3551 54.7929 0.2075 2268 +2270 4 253.1478 266.5394 56.1554 0.2224 2269 +2271 4 253.7323 265.6059 56.203 0.2669 2270 +2272 4 253.396 264.725 56.5452 0.2542 2271 +2273 4 253.1066 263.7778 56.3046 0.2288 2272 +2274 4 253.6751 262.8489 56.3634 0.2504 2273 +2275 4 254.3112 262.2197 56.6989 0.3893 2274 +2276 4 254.6544 261.404 58.002 0.2911 2275 +2277 4 254.5812 260.3504 57.6265 0.1184 2276 +2278 4 253.9188 259.9088 56.7602 0.1326 2277 +2279 4 253.7312 259.3448 57.5523 0.3715 2278 +2280 4 253.865 258.5577 57.1096 0.178 2279 +2281 4 254.8043 258.417 57.148 0.323 2280 +2282 4 255.6325 258.0944 58.0398 0.2039 2281 +2283 4 256.3315 257.4389 58.3862 0.1652 2282 +2284 4 257.3451 257.154 58.7997 0.2627 2283 +2285 4 258.147 256.8612 60.1888 0.1785 2284 +2286 4 259.1412 256.4848 60.2 0.243 2285 +2287 4 259.8859 256.8989 61.3021 0.3069 2286 +2288 4 260.641 257.5144 62.6268 0.1907 2287 +2289 4 261.4395 258.1802 63.7185 0.2503 2288 +2290 4 261.9463 257.8656 65.1568 0.1144 2289 +2291 4 262.4691 258.3827 66.36 0.1144 2290 +2292 4 263.1543 258.7579 64.6996 0.1968 2291 +2293 4 264.0146 259.0165 63.9954 0.2161 2292 +2294 4 265.0065 259.4295 63.84 0.2722 2293 +2295 4 265.6746 259.5976 65.3114 0.269 2294 +2296 4 266.5074 259.4558 65.9789 0.2196 2295 +2297 4 267.0714 258.6778 66.6439 0.2637 2296 +2298 4 268.0232 258.6275 67.4579 0.1433 2297 +2299 4 268.6318 257.9663 67.7295 0.2168 2298 +2300 4 269.5687 257.376 68.2223 0.2438 2299 +2301 4 270.3261 256.8337 68.8433 0.1525 2300 +2302 4 270.1476 256.6084 66.3426 0.1834 2301 +2303 4 270.7871 256.5981 65.24 0.1525 2302 +2304 4 271.128 256.4699 66.9774 0.2399 2303 +2305 4 271.5822 256.3326 69.3199 0.3499 2304 +2306 4 272.4619 255.9757 69.1911 0.233 2305 +2307 4 272.9447 255.3934 70.7585 0.1144 2306 +2308 4 273.416 254.8409 70.0694 0.2082 2307 +2309 4 274.0704 254.2048 70.6558 0.2043 2308 +2310 4 275.0691 253.8067 70.5488 0.2692 2309 +2311 4 275.7189 252.951 70.8397 0.2028 2310 +2312 4 276.7176 252.7004 70.4701 0.1144 2311 +2313 4 277.2701 252.4808 72.3192 0.1144 2312 +2314 4 278.2803 252.1765 73.1259 0.1223 2313 +2315 4 279.311 251.7361 73.36 0.1673 2314 +2316 4 280.0798 250.9456 73.8038 0.1907 2315 +2317 4 280.5786 250.0315 74.1401 0.2049 2316 +2318 4 281.4801 249.6208 73.64 0.1314 2317 +2319 4 282.1104 248.9722 74.7093 0.2135 2318 +2320 4 282.1928 247.9677 74.8362 0.2397 2319 +2321 4 282.7385 247.255 75.9433 0.2288 2320 +2322 4 283.4706 246.8672 76.979 0.1185 2321 +2323 4 283.7028 245.7884 76.72 0.1144 2322 +2324 4 283.9294 244.6913 76.72 0.1144 2323 +2325 4 284.8308 244.0381 76.7138 0.1144 2324 +2326 4 285.3056 243.1229 76.44 0.1144 2325 +2327 4 285.4886 242.4159 77.8445 0.1507 2326 +2328 4 285.476 241.6082 78.1063 0.2577 2327 +2329 4 286.1659 240.7708 78.4 0.2346 2328 +2330 4 286.4793 239.8339 79.2714 0.1907 2329 +2331 4 287.4254 239.2973 79.3766 0.2703 2330 +2332 4 288.4093 238.9187 80.0892 0.1144 2331 +2333 4 288.6552 238.2758 82.0187 0.1994 2332 +2334 4 289.3336 238.1808 80.421 0.1743 2333 +2335 4 289.7626 237.6145 78.797 0.3321 2334 +2336 4 290.2408 237.7918 79.8389 0.1907 2335 +2337 4 290.8208 237.0265 81.3596 0.1907 2336 +2338 4 291.402 236.2612 82.88 0.1907 2337 +2339 4 291.768 235.8928 83.5344 0.1144 2338 +2340 4 292.2703 235.7292 85.9606 0.1144 2339 +2341 4 292.5723 234.9776 87.0643 0.1144 2340 +2342 4 292.6352 233.853 86.8 0.1144 2341 +2343 4 292.6352 232.709 86.8 0.1144 2342 +2344 4 292.6283 231.5868 87.0794 0.1405 2343 +2345 4 292.7496 230.7448 87.92 0.178 2344 +2346 4 291.1549 236.3698 82.885 0.1265 2338 +2347 4 290.7076 237.1066 84.3951 0.2151 2346 +2348 4 290.2328 237.7232 85.68 0.1525 2347 +2349 4 260.3744 257.5144 63.0 0.1652 2288 +2350 4 247.8796 280.4196 48.72 0.2415 2253 +2351 4 256.0112 296.6975 44.9501 0.3236 1849 +2352 4 254.9015 296.7364 45.6288 0.2929 2351 +2353 4 253.9497 296.8577 44.9366 0.3467 2352 +2354 4 253.0974 296.7479 45.8354 0.1963 2353 +2355 4 252.562 297.4995 45.8088 0.2974 2354 +2356 4 252.061 298.2625 46.1437 0.1754 2355 +2357 4 251.7178 298.9272 45.7472 0.281 2356 +2358 4 251.0188 299.7028 46.1378 0.2444 2357 +2359 4 250.8792 300.5288 45.9091 0.1265 2358 +2360 4 250.3484 300.9715 45.1931 0.1144 2359 +2361 4 249.4892 301.0676 46.3456 0.1811 2360 +2362 4 248.4951 300.9864 46.9482 0.1591 2361 +2363 4 247.5307 301.1443 46.9288 0.2089 2362 +2364 4 246.5 301.2198 46.762 0.178 2363 +2365 4 245.4887 301.6248 47.0109 0.1915 2364 +2366 4 244.6021 302.0492 46.2 0.1165 2365 +2367 4 244.3801 302.9049 46.5077 0.2556 2366 +2368 4 243.863 303.8075 47.2077 0.1602 2367 +2369 4 243.4729 304.5568 46.9384 0.1739 2368 +2370 4 243.4672 305.6127 46.7082 0.2855 2369 +2371 4 243.5542 306.4707 47.4116 0.3405 2370 +2372 4 243.577 307.3951 48.5206 0.3191 2371 +2373 4 243.9992 308.1318 48.7589 0.2129 2372 +2374 4 243.5576 308.8972 48.5593 0.1179 2373 +2375 4 243.5576 309.6362 46.7286 0.2052 2374 +2376 4 243.2144 310.4267 45.4168 0.1329 2375 +2377 4 243.434 311.3648 45.8693 0.2063 2376 +2378 4 243.4066 312.0512 47.6 0.2262 2377 +2379 4 243.0108 313.0728 47.1414 0.1305 2378 +2380 4 242.5349 313.9571 46.5548 0.2086 2379 +2381 4 242.1676 315.0187 46.4145 0.2542 2380 +2382 4 241.8256 315.99 45.876 0.1723 2381 +2383 4 241.1884 316.8388 45.64 0.2481 2382 +2384 4 240.1233 317.1145 45.6218 0.1734 2383 +2385 4 239.3202 317.3811 45.1825 0.1563 2384 +2386 4 238.349 317.6934 45.1732 0.1953 2385 +2387 4 237.7953 318.612 45.5972 0.1612 2386 +2388 4 237.2816 319.5112 44.8636 0.1991 2387 +2389 4 236.4648 320.185 44.8146 0.1443 2388 +2390 4 235.7201 320.6666 44.24 0.1144 2389 +2391 4 235.1606 321.6642 44.24 0.1144 2390 +2392 4 234.544 322.5565 43.701 0.1144 2391 +2393 4 234.099 323.5735 43.96 0.1144 2392 +2394 4 233.9354 324.6786 43.7427 0.1144 2393 +2395 4 233.1426 325.2792 43.68 0.1144 2394 +2396 4 232.7811 326.3386 43.615 0.1144 2395 +2397 4 232.0032 326.9792 43.4 0.1144 2396 +2398 4 231.6714 328.002 43.4 0.1144 2397 +2399 4 231.3637 329.0762 43.4 0.1144 2398 +2400 4 231.1429 330.1264 43.209 0.1144 2399 +2401 4 230.7723 330.7579 42.6717 0.2008 2400 +2402 4 230.6304 331.7543 43.4437 0.1678 2401 +2403 4 230.5961 332.8846 43.12 0.1398 2402 +2404 4 230.341 333.9828 43.4 0.1489 2403 +2405 4 229.9543 335.0318 43.12 0.1244 2404 +2406 4 229.7484 336.1381 43.12 0.1144 2405 +2407 4 229.5711 337.2649 43.12 0.1144 2406 +2408 4 229.4864 338.346 42.5877 0.1144 2407 +2409 4 229.0723 339.3539 43.12 0.1144 2408 +2410 4 229.0288 340.4544 43.12 0.1144 2409 +2411 4 290.1184 350.8454 35.0 0.3686 1682 +2412 4 290.4113 349.9439 34.1653 0.2466 2411 +2413 4 289.8027 349.4085 33.7159 0.1479 2412 +2414 4 290.2328 348.7106 35.1868 0.3321 2413 +2415 4 290.4948 347.7119 35.56 0.2963 2414 +2416 4 290.0166 346.8482 34.7208 0.3306 2415 +2417 4 289.8267 345.9353 35.4668 0.2613 2416 +2418 4 289.7752 345.0373 33.8705 0.1435 2417 +2419 4 289.6608 343.9882 33.1139 0.2542 2418 +2420 4 289.7798 343.0753 33.6806 0.208 2419 +2421 4 289.7752 342.175 34.5044 0.2156 2420 +2422 4 290.1378 341.1282 34.44 0.1179 2421 +2423 4 290.1184 340.6603 32.5077 0.3472 2422 +2424 4 290.1184 339.768 33.32 0.2415 2423 +2425 4 290.29 339.4065 32.8076 0.2082 2424 +2426 4 290.6492 339.196 30.3363 0.2288 2425 +2427 4 291.299 339.5323 31.306 0.2288 2426 +2428 4 291.8321 339.871 30.9137 0.3713 2427 +2429 4 292.7748 339.9911 31.1419 0.2288 2428 +2430 4 293.3308 340.0151 32.2 0.2321 2429 +2431 4 293.7872 340.7679 30.8314 0.2122 2430 +2432 4 294.5869 340.8296 30.081 0.3149 2431 +2433 4 295.3888 341.2632 30.7476 0.2161 2432 +2434 4 296.3132 341.1397 29.7128 0.2791 2433 +2435 4 297.4194 340.9131 29.96 0.1788 2434 +2436 4 298.1447 340.9989 28.5631 0.2661 2435 +2437 4 298.9192 341.6213 29.1942 0.2849 2436 +2438 4 299.9053 342.0423 29.986 0.2629 2437 +2439 4 300.6821 341.3993 29.7195 0.3051 2438 +2440 4 301.6614 341.2186 29.3048 0.1683 2439 +2441 4 302.6864 340.912 29.68 0.3548 2440 +2442 4 303.303 340.2199 28.4917 0.341 2441 +2443 4 304.2662 339.8172 27.7732 0.2851 2442 +2444 4 305.067 339.3642 28.3984 0.171 2443 +2445 4 305.6002 338.5794 28.94 0.1444 2444 +2446 4 306.1344 337.9147 29.6363 0.2804 2445 +2447 4 306.3655 337.8003 27.72 0.2755 2446 +2448 4 307.2006 337.4262 27.7794 0.3077 2447 +2449 4 307.8435 336.8886 28.7468 0.2211 2448 +2450 4 308.6501 336.241 28.2559 0.3305 2449 +2451 4 309.4074 335.9928 27.9028 0.2812 2450 +2452 4 310.1933 335.4505 27.5775 0.3529 2451 +2453 4 310.834 334.668 27.1043 0.37 2452 +2454 4 311.7549 334.1075 26.6213 0.2924 2453 +2455 4 312.8096 333.8615 27.1384 0.309 2454 +2456 4 313.5578 333.1957 27.6273 0.3557 2455 +2457 4 314.0566 332.5448 26.9713 0.3299 2456 +2458 4 314.8929 332.0815 26.5826 0.2924 2457 +2459 4 315.6536 331.3688 26.8442 0.2492 2458 +2460 4 316.4762 330.7453 26.6924 0.1984 2459 +2461 4 317.1694 330.2854 27.4565 0.3131 2460 +2462 4 317.9165 330.6046 27.3935 0.316 2461 +2463 4 318.4656 329.8575 27.4991 0.2241 2462 +2464 4 318.604 328.8657 27.5164 0.3144 2463 +2465 4 318.572 327.8006 28.3119 0.2524 2464 +2466 4 318.9483 326.9609 29.3812 0.2161 2465 +2467 4 319.7629 326.4473 28.5135 0.3273 2466 +2468 4 320.5202 325.9096 28.6572 0.3073 2467 +2469 4 321.297 325.206 28.6513 0.1497 2468 +2470 4 321.996 324.634 27.8844 0.2924 2469 +2471 4 322.7602 323.8618 28.1249 0.2669 2470 +2472 4 323.2864 323.2658 28.84 0.1757 2471 +2473 4 323.887 322.6057 28.1473 0.1496 2472 +2474 4 324.3984 321.9102 27.9451 0.1803 2473 +2475 4 324.9738 321.337 27.5022 0.1526 2474 +2476 4 326.0148 320.9034 27.48 0.2161 2475 +2477 4 326.7527 320.0763 27.3938 0.2034 2476 +2478 4 326.8111 318.9666 26.9954 0.256 2477 +2479 4 326.7264 317.8512 26.5798 0.2669 2478 +2480 4 327.2412 317.3708 25.2857 0.2952 2479 +2481 4 328.3406 317.2198 25.3772 0.3064 2480 +2482 4 328.9995 316.7267 25.9823 0.22 2481 +2483 4 329.7088 315.9579 25.947 0.3516 2482 +2484 4 330.2511 315.1022 26.04 0.2509 2483 +2485 4 330.6103 314.0795 25.6869 0.3305 2484 +2486 4 330.5771 313.3096 24.4042 0.2615 2485 +2487 4 331.2807 312.5614 23.4982 0.2221 2486 +2488 4 332.2885 312.185 22.6657 0.2995 2487 +2489 4 333.2312 311.6062 22.5624 0.2161 2488 +2490 4 334.1624 311.2355 22.414 0.2334 2489 +2491 4 335.152 311.3224 21.9624 0.3368 2490 +2492 4 336.1552 311.7743 21.3206 0.2343 2491 +2493 4 336.8519 311.6348 22.0352 0.2195 2492 +2494 4 337.5967 310.9827 21.1904 0.2548 2493 +2495 4 338.4181 310.7218 21.2789 0.2592 2494 +2496 4 339.4648 310.596 21.4693 0.3053 2495 +2497 4 340.2256 310.1407 21.5516 0.3298 2496 +2498 4 340.9555 309.5687 22.526 0.2209 2497 +2499 4 341.6053 309.3342 21.0 0.1652 2498 +2500 4 342.628 308.9178 20.6268 0.2288 2499 +2501 4 343.4196 309.7483 21.2587 0.1592 2500 +2502 4 344.0706 310.6463 21.7641 0.1398 2501 +2503 4 344.7581 311.4712 22.0494 0.1639 2502 +2504 4 345.8461 311.1543 22.1822 0.1652 2503 +2505 4 346.9741 311.1394 21.947 0.152 2504 +2506 4 347.9247 310.8591 21.7479 0.1373 2505 +2507 4 348.5448 309.8982 21.7862 0.1301 2506 +2508 4 348.7884 308.832 21.6224 0.1271 2507 +2509 4 348.8273 307.7017 21.5869 0.1334 2508 +2510 4 348.7621 306.5794 21.5572 0.1464 2509 +2511 4 348.2588 305.6951 21.3786 0.1525 2510 +2512 4 348.0597 303.6634 19.4102 0.3116 2511 +2513 4 348.8971 302.9335 19.32 0.3178 2512 +2514 4 349.7963 302.27 19.465 0.287 2513 +2515 4 350.6921 301.7231 19.7728 0.2712 2514 +2516 4 351.3052 301.6842 19.8923 0.2148 2515 +2517 4 352.0157 300.9338 19.5054 0.2796 2516 +2518 4 352.4344 300.0163 20.16 0.1814 2517 +2519 4 352.6792 299.1194 19.88 0.1584 2518 +2520 4 353.2786 298.7041 19.0756 0.1398 2519 +2521 4 353.6035 297.6985 19.3934 0.2977 2520 +2522 4 353.5692 296.6289 18.7415 0.3153 2521 +2523 4 353.4285 295.7526 18.6782 0.1255 2522 +2524 4 353.48 294.8912 19.4062 0.3417 2523 +2525 4 353.1528 293.8947 19.206 0.2313 2524 +2526 4 353.2306 292.9178 18.76 0.3296 2525 +2527 4 353.178 291.8561 19.32 0.1861 2526 +2528 4 353.7442 290.8929 19.6078 0.1939 2527 +2529 4 353.9399 289.8061 20.0869 0.2208 2528 +2530 4 354.0783 288.7307 20.72 0.2025 2529 +2531 4 354.64 288.288 19.32 0.1525 2530 +2532 4 343.1371 308.4258 20.5128 0.2366 2500 +2533 4 290.0921 338.4604 34.3658 0.1388 2424 +2534 4 290.0681 337.6962 32.3868 0.2924 2533 +2535 4 290.1047 337.4777 31.3883 0.1519 2534 +2536 4 289.4103 336.7959 30.8266 0.2706 2535 +2537 4 289.3588 335.8052 31.08 0.2542 2536 +2538 4 289.3176 334.8888 29.9827 0.2542 2537 +2539 4 289.5372 334.2219 28.9201 0.3969 2538 +2540 4 289.3142 333.4131 29.8189 0.2867 2539 +2541 4 289.0122 332.5722 30.6541 0.2061 2540 +2542 4 288.2491 331.9064 30.4088 0.131 2541 +2543 4 288.0958 331.1594 29.0746 0.1525 2542 +2544 4 287.9448 330.5405 29.972 0.2796 2543 +2545 4 287.819 329.7534 28.651 0.2039 2544 +2546 4 287.6222 328.9275 28.2212 0.2415 2545 +2547 4 287.2344 327.9974 28.0 0.2619 2546 +2548 4 286.4061 327.43 28.5463 0.1818 2547 +2549 4 285.3788 327.1485 27.9919 0.2734 2548 +2550 4 284.8766 326.3946 26.9802 0.3022 2549 +2551 4 284.0049 325.8123 26.8688 0.2417 2550 +2552 4 283.4809 325.0962 26.9111 0.2415 2551 +2553 4 283.1148 324.2988 27.1603 0.1528 2552 +2554 4 282.2671 324.0929 26.476 0.117 2553 +2555 4 281.2982 323.752 26.6874 0.1669 2554 +2556 4 280.4196 323.8161 26.63 0.1611 2555 +2557 4 279.5787 323.3745 26.857 0.2408 2556 +2558 4 278.4976 323.0702 26.6916 0.2163 2557 +2559 4 277.6259 322.9489 25.76 0.2853 2558 +2560 4 276.9498 322.2396 26.3388 0.2186 2559 +2561 4 275.9774 322.0703 25.7673 0.2288 2560 +2562 4 274.981 321.9559 24.6616 0.3012 2561 +2563 4 274.2431 321.8312 25.9028 0.2474 2562 +2564 4 273.1449 321.9216 25.716 0.3025 2563 +2565 4 272.4242 322.5028 24.638 0.2892 2564 +2566 4 271.748 322.5508 22.7035 0.2638 2565 +2567 4 270.8477 322.6892 23.0023 0.2004 2566 +2568 4 269.857 322.862 22.4932 0.1907 2567 +2569 4 269.412 322.8162 22.7172 0.2383 2568 +2570 4 268.9544 322.4936 23.8 0.1398 2569 +2571 4 269.2713 322.9512 22.4319 0.24 2568 +2572 4 268.284 323.2006 22.0886 0.2415 2571 +2573 4 267.3356 323.1892 21.7022 0.2669 2572 +2574 4 266.3507 322.989 21.1994 0.2325 2573 +2575 4 265.8301 323.4969 22.8928 0.1907 2574 +2576 4 265.2982 323.9888 21.6639 0.2246 2575 +2577 4 265.1872 324.7564 21.0683 0.1221 2576 +2578 4 264.6083 325.3536 21.2783 0.2289 2577 +2579 4 263.8007 325.6396 21.0157 0.1779 2578 +2580 4 262.6956 325.5515 21.0356 0.3021 2579 +2581 4 261.7072 325.5927 21.4749 0.1282 2580 +2582 4 260.9281 325.7517 21.7305 0.2034 2581 +2583 4 260.0575 325.7746 21.0339 0.1907 2582 +2584 4 259.3448 325.905 21.3052 0.1456 2583 +2585 4 258.7797 326.2139 19.3486 0.1671 2584 +2586 4 257.7661 326.1498 19.1464 0.2288 2585 +2587 4 257.4 326.3821 20.4674 0.1144 2586 +2588 4 256.8108 325.7929 20.6774 0.2033 2587 +2589 4 256.1473 325.2403 19.0994 0.2658 2588 +2590 4 255.0914 325.1648 19.0725 0.2533 2589 +2591 4 254.7345 324.6089 18.1877 0.2615 2590 +2592 4 253.7872 324.1959 17.8245 0.2412 2591 +2593 4 252.9567 323.5198 17.92 0.1234 2592 +2594 4 252.0461 323.0873 17.5305 0.1429 2593 +2595 4 251.1046 323.6079 17.3564 0.2542 2594 +2596 4 250.3266 323.172 16.3918 0.2288 2595 +2597 4 249.3028 322.8757 17.2875 0.1718 2596 +2598 4 248.3166 322.9523 16.9501 0.2277 2597 +2599 4 247.7904 322.9512 15.68 0.2669 2598 +2600 4 289.4446 338.2614 32.2 0.2674 2534 +2601 4 289.7752 339.3104 31.92 0.2669 2600 +2602 4 293.2598 361.4102 35.4603 0.3043 1673 +2603 4 293.5035 361.5601 38.1721 0.1891 2602 +2604 4 294.1533 361.7282 39.6091 0.1271 2603 +2605 4 294.9987 362.4787 39.6463 0.138 2604 +2606 4 295.1612 363.4911 39.6082 0.1811 2605 +2607 4 294.4782 364.3514 39.48 0.2161 2606 +2608 4 293.9394 364.8811 39.8709 0.1565 2607 +2609 4 293.4234 364.4143 42.0932 0.2669 2608 +2610 4 293.436 364.7861 41.6783 0.1652 2609 +2611 4 293.7609 365.6224 41.16 0.1485 2610 +2612 4 294.572 366.2596 41.461 0.1923 2611 +2613 4 295.1589 367.2274 41.7816 0.3514 2612 +2614 4 295.4952 368.2708 42.1366 0.3822 2613 +2615 4 295.6096 369.385 42.5919 0.2795 2614 +2616 4 296.2331 370.0588 43.7928 0.185 2615 +2617 4 296.5317 371.0942 43.7464 0.1497 2616 +2618 4 297.3256 371.8 43.4 0.2288 2617 +2619 4 292.4053 364.936 41.7189 0.3181 2609 +2620 4 291.8802 365.0504 43.143 0.3432 2619 +2621 4 290.7728 365.0321 43.5554 0.286 2620 +2622 4 289.8976 364.7072 42.7706 0.2392 2621 +2623 4 289.1368 364.7358 42.8515 0.2048 2622 +2624 4 288.24 364.1386 43.5266 0.3156 2623 +2625 4 287.3602 363.4614 43.68 0.4449 2624 +2626 4 286.3112 363.5632 44.5917 0.3148 2625 +2627 4 285.3834 363.832 45.808 0.1718 2626 +2628 4 284.3172 363.6776 45.6646 0.2382 2627 +2629 4 283.4443 363.0793 45.7114 0.272 2628 +2630 4 282.5383 362.9866 46.6374 0.194 2629 +2631 4 281.6173 362.6926 46.7496 0.1398 2630 +2632 4 280.8188 363.403 46.6312 0.3362 2631 +2633 4 279.7824 363.5174 47.031 0.3419 2632 +2634 4 279.1463 362.9912 48.0472 0.3432 2633 +2635 4 278.3947 362.4501 48.5447 0.2644 2634 +2636 4 277.5367 362.4192 50.2354 0.1211 2635 +2637 4 276.411 362.4718 50.4969 0.1662 2636 +2638 4 275.3379 362.6789 49.9425 0.2415 2637 +2639 4 274.4902 363.1399 49.84 0.2924 2638 +2640 4 273.877 363.1319 51.6174 0.3344 2639 +2641 4 273.0522 362.5588 51.9669 0.2843 2640 +2642 4 272.2491 362.5588 50.4311 0.2571 2641 +2643 4 271.3774 362.6308 51.52 0.1708 2642 +2644 4 270.2677 362.4215 51.52 0.1165 2643 +2645 4 269.2999 362.1618 50.7111 0.2004 2644 +2646 4 268.7084 362.1801 52.0719 0.2321 2645 +2647 4 267.7589 361.7454 51.333 0.2797 2646 +2648 4 266.7808 361.5418 51.7672 0.2789 2647 +2649 4 266.3209 361.6882 53.6942 0.3985 2648 +2650 4 265.4057 362.0474 53.4526 0.2439 2649 +2651 4 264.574 362.489 53.4411 0.2783 2650 +2652 4 263.954 362.7624 55.3714 0.1711 2651 +2653 4 263.1749 362.3746 55.6721 0.2334 2652 +2654 4 262.5286 362.8642 54.3262 0.2913 2653 +2655 4 261.6545 362.9866 55.9026 0.1447 2654 +2656 4 260.84 363.6559 56.5356 0.1864 2655 +2657 4 260.0243 364.1466 55.44 0.2384 2656 +2658 4 259.3494 364.7072 56.467 0.1685 2657 +2659 4 258.9787 365.532 57.4 0.1652 2658 +2660 4 258.989 366.4575 57.4445 0.323 2659 +2661 4 258.6332 367.1954 58.905 0.2582 2660 +2662 4 258.7213 367.6599 60.2 0.2539 2661 +2663 4 258.2591 368.4241 60.944 0.3108 2662 +2664 4 257.567 367.9161 59.5952 0.1271 2663 +2665 4 257.019 368.1117 58.0854 0.1233 2664 +2666 4 256.3876 368.9011 58.2106 0.1144 2665 +2667 4 256.256 370.0314 58.24 0.1144 2666 +2668 4 255.6863 370.4364 59.7954 0.1144 2667 +2669 4 254.9312 370.5988 61.8593 0.1144 2668 +2670 4 254.1751 370.7624 63.9234 0.1144 2669 +2671 4 253.976 371.7714 64.1962 0.1144 2670 +2672 4 253.7495 372.8788 64.1962 0.1144 2671 +2673 4 253.2553 373.897 64.1962 0.1144 2672 +2674 4 252.1387 373.6487 64.1962 0.1144 2673 +2675 4 251.203 373.3684 65.2669 0.1144 2674 +2676 4 250.401 373.063 67.118 0.1144 2675 +2677 4 249.5041 373.055 68.2506 0.1144 2676 +2678 4 248.4562 373.516 68.2506 0.1144 2677 +2679 4 247.4701 373.6533 68.2506 0.1144 2678 +2680 4 246.6922 372.9715 68.9321 0.1144 2679 +2681 4 245.9669 372.5036 70.7717 0.1144 2680 +2682 4 245.1981 372.0196 72.305 0.1144 2681 +2683 4 244.2074 371.4476 72.305 0.1144 2682 +2684 4 243.2167 370.8745 72.305 0.1144 2683 +2685 4 242.226 370.3025 72.305 0.1144 2684 +2686 4 241.2273 369.8209 72.305 0.1144 2685 +2687 4 240.1439 370.1915 72.305 0.1144 2686 +2688 4 239.0617 370.5622 72.305 0.1144 2687 +2689 4 237.9692 370.8379 72.305 0.1144 2688 +2690 4 237.0174 370.4558 72.8028 0.1144 2689 +2691 4 236.3367 369.6825 74.0242 0.1144 2690 +2692 4 235.6571 368.9091 75.2455 0.1144 2691 +2693 4 234.9925 368.114 76.3596 0.1144 2692 +2694 4 234.4811 367.0913 76.3596 0.1144 2693 +2695 4 233.9709 366.0674 76.3596 0.1144 2694 +2696 4 233.5018 365.0252 76.3596 0.1144 2695 +2697 4 233.0854 363.9602 76.3596 0.1144 2696 +2698 4 232.6679 362.894 76.3596 0.1144 2697 +2699 4 232.2503 361.8289 76.3596 0.1144 2698 +2700 4 231.8694 360.7547 76.3596 0.1144 2699 +2701 4 231.4953 359.8132 76.3596 0.117 2700 +2702 4 230.3661 359.6256 76.3596 0.1303 2701 +2703 4 229.3628 359.2309 76.3596 0.1511 2702 +2704 4 228.665 358.3237 76.3596 0.1907 2703 +2705 4 295.0822 364.602 38.6672 0.3194 2607 +2706 4 295.9951 364.7495 37.52 0.2414 2705 +2707 4 296.1976 363.7828 36.4311 0.2886 2706 +2708 4 296.5717 363.3996 38.5311 0.1894 2707 +2709 4 297.3828 363.1056 39.76 0.1186 2708 +2710 4 298.3975 362.7624 39.5097 0.2107 2709 +2711 4 299.0691 363.3275 38.36 0.1144 2710 +2712 4 300.165 363.4488 38.36 0.157 2711 +2713 4 301.2747 363.2978 38.5571 0.2108 2712 +2714 4 302.3146 363.1159 39.48 0.2691 2713 +2715 4 303.1978 362.608 39.0286 0.2902 2714 +2716 4 303.9963 362.2682 38.0766 0.4112 2715 +2717 4 304.5751 361.7923 37.8834 0.2246 2716 +2718 4 304.8188 362.076 35.9254 0.3115 2717 +2719 4 305.7146 361.9616 35.9327 0.127 2718 +2720 4 306.4856 361.6996 35.9904 0.2119 2719 +2721 4 307.172 361.4891 37.3514 0.1144 2720 +2722 4 307.8264 360.8576 37.52 0.2955 2721 +2723 4 308.0769 359.8395 37.0423 0.3545 2722 +2724 4 308.7427 359.5375 38.6562 0.1591 2723 +2725 4 309.3445 359.0455 40.241 0.2827 2724 +2726 4 309.9233 358.7515 41.9989 0.1276 2725 +2727 4 310.8511 358.6932 41.1401 0.1282 2726 +2728 4 311.716 359.0913 40.4001 0.3788 2727 +2729 4 312.8074 359.1016 41.0239 0.3432 2728 +2730 4 313.8267 359.0536 41.44 0.2796 2729 +2731 4 314.8162 358.9872 41.8132 0.2796 2730 +2732 4 315.8939 358.9174 42.6574 0.2288 2731 +2733 4 317.0104 358.9849 42.84 0.2804 2732 +2734 4 318.1109 358.8522 42.707 0.3885 2733 +2735 4 319.1028 359.1794 41.7267 0.3426 2734 +2736 4 319.8269 359.47 43.0469 0.2311 2735 +2737 4 320.7684 359.7708 43.5072 0.2161 2736 +2738 4 321.5509 359.4642 44.3794 0.1729 2737 +2739 4 322.5142 359.1725 44.3442 0.2288 2738 +2740 4 323.1869 358.4186 43.4 0.1993 2739 +2741 4 323.9019 357.7288 42.9044 0.3753 2740 +2742 4 324.8422 357.8672 43.6657 0.3258 2741 +2743 4 325.5321 357.9931 42.383 0.3363 2742 +2744 4 326.358 358.3466 43.6738 0.2719 2743 +2745 4 326.8648 358.6749 42.84 0.2354 2744 +2746 4 327.9356 358.811 42.56 0.2541 2745 +2747 4 328.7467 359.2938 41.8317 0.2001 2746 +2748 4 329.8358 359.3304 42.0885 0.3305 2747 +2749 4 330.6274 359.3579 43.6836 0.237 2748 +2750 4 331.2578 360.0225 44.8 0.2979 2749 +2751 4 332.2325 360.4744 44.8 0.3162 2750 +2752 4 333.2895 360.8084 44.564 0.2288 2751 +2753 4 334.1121 361.3221 44.5886 0.2891 2752 +2754 4 334.7241 362.0302 44.24 0.2583 2753 +2755 4 335.0776 362.5336 45.6095 0.3418 2754 +2756 4 335.9356 362.9317 45.92 0.2924 2755 +2757 4 336.9389 363.4156 45.9584 0.3442 2756 +2758 4 337.7546 364.1386 46.1555 0.4909 2757 +2759 4 338.6114 364.6889 46.0813 0.2382 2758 +2760 4 339.156 365.1534 46.8138 0.3051 2759 +2761 4 340.0975 365.4634 47.2567 0.2929 2760 +2762 4 340.8823 365.6075 45.7307 0.3305 2761 +2763 4 341.5 366.0823 47.2892 0.3561 2762 +2764 4 342.4553 366.6566 47.1313 0.3167 2763 +2765 4 343.4551 367.1256 47.3796 0.2679 2764 +2766 4 344.447 367.5089 47.971 0.3038 2765 +2767 4 345.3828 367.8212 47.9027 0.2796 2766 +2768 4 346.4501 368.1129 47.6 0.2129 2767 +2769 4 347.5575 368.2467 47.2335 0.1539 2768 +2770 4 348.4521 368.638 47.5264 0.2593 2769 +2771 4 349.3341 369.1688 47.9419 0.2287 2770 +2772 4 350.4106 369.1688 48.16 0.2039 2771 +2773 4 351.0616 369.3232 46.76 0.3025 2772 +2774 4 352.098 369.7271 47.0159 0.1907 2773 +2775 4 353.1471 370.1481 46.9907 0.1837 2774 +2776 4 354.0611 370.5405 45.92 0.128 2775 +2777 4 354.8596 370.5416 47.1531 0.1481 2776 +2778 4 355.3264 371.0964 47.3718 0.144 2777 +2779 4 355.8366 371.7908 46.3669 0.1679 2778 +2780 4 356.3411 372.5676 47.7907 0.1644 2779 +2781 4 356.9246 373.4702 48.5654 0.1993 2780 +2782 4 357.5812 374.088 48.6797 0.2343 2781 +2783 4 357.8569 374.9792 49.4337 0.2916 2782 +2784 4 358.3054 375.7891 48.1631 0.2389 2783 +2785 4 358.8282 376.3302 49.5362 0.2258 2784 +2786 4 359.3647 377.0532 50.267 0.1917 2785 +2787 4 360.0534 377.8197 50.7931 0.1591 2786 +2788 4 360.6643 378.5462 51.2117 0.2669 2787 +2789 4 361.3564 379.3996 50.96 0.2916 2788 +2790 4 361.8575 380.3217 51.1081 0.2303 2789 +2791 4 362.195 381.0584 50.2555 0.1271 2790 +2792 4 362.8825 381.5869 49.28 0.1832 2791 +2793 4 363.6696 382.1029 50.2001 0.1144 2792 +2794 4 364.348 382.2607 52.3382 0.1552 2793 +2795 4 364.9852 383.1164 52.7881 0.2288 2794 +2796 4 365.9839 383.5386 53.0956 0.2622 2795 +2797 4 366.906 384.1403 53.503 0.2134 2796 +2798 4 367.7788 384.6265 53.2258 0.1316 2797 +2799 4 368.479 385.2763 54.4043 0.2344 2798 +2800 4 369.1002 386.0943 55.295 0.1384 2799 +2801 4 370.0108 386.6137 54.6507 0.2095 2800 +2802 4 371.0678 386.7624 54.7016 0.1652 2801 +2803 4 372.0277 387.1262 55.3468 0.2288 2802 +2804 4 372.833 387.061 56.0515 0.1559 2803 +2805 4 373.6945 387.1662 56.84 0.1255 2804 +2806 4 374.4701 387.9933 56.84 0.1144 2805 +2807 4 375.542 388.2358 57.12 0.1287 2806 +2808 4 376.2124 389.119 56.6913 0.1245 2807 +2809 4 376.8599 390.0136 57.1463 0.1144 2808 +2810 4 377.5566 390.8545 57.4 0.1682 2809 +2811 4 378.3906 391.5855 57.4781 0.1454 2810 +2812 4 379.4717 391.7502 57.96 0.1144 2811 +2813 4 380.5848 391.947 57.96 0.1144 2812 +2814 4 381.3501 392.6757 58.655 0.2223 2813 +2815 4 382.1635 393.2889 59.1808 0.1556 2814 +2816 4 382.4346 393.9936 60.5164 0.1144 2815 +2817 4 383.5615 393.9936 60.76 0.1144 2816 +2818 4 384.4984 394.251 61.0137 0.1144 2817 +2819 4 384.4984 395.3939 61.04 0.1144 2818 +2820 4 384.5545 396.5093 61.3186 0.1144 2819 +2821 4 385.5612 396.7392 61.768 0.1144 2820 +2822 4 386.2796 397.381 62.344 0.1721 2821 +2823 4 387.339 397.7253 62.16 0.1398 2822 +2824 4 387.8412 398.1944 62.72 0.1144 2823 +2825 4 388.2313 399.1336 63.4063 0.1313 2824 +2826 4 389.0607 399.256 64.6979 0.1144 2825 +2827 4 389.9496 399.3944 65.9674 0.1652 2826 +2828 4 390.4232 400.1712 66.0232 0.1144 2827 +2829 4 391.0146 400.2524 67.2 0.1353 2828 +2830 4 391.8989 400.559 68.278 0.1144 2829 +2831 4 392.9091 400.7421 69.5159 0.1144 2830 +2832 4 393.782 401.2145 70.2778 0.1144 2831 +2833 4 394.4386 402.1515 70.2778 0.1144 2832 +2834 4 395.0941 403.0884 70.2778 0.1144 2833 +2835 4 395.8297 403.959 70.2778 0.1144 2834 +2836 4 396.6385 404.7678 70.2778 0.1144 2835 +2837 4 397.4977 405.4828 70.835 0.1144 2836 +2838 4 398.3637 406.1818 71.4823 0.1144 2837 +2839 4 399.2297 406.8808 72.1297 0.1144 2838 +2840 4 400.0545 407.6598 72.305 0.1144 2839 +2841 4 400.8633 408.4686 72.305 0.1144 2840 +2842 4 401.6733 409.2443 71.9141 0.1144 2841 +2843 4 402.4844 409.9879 71.1505 0.1144 2842 +2844 4 403.2943 410.7326 70.3867 0.1144 2843 +2845 4 404.1054 411.4762 69.6231 0.1144 2844 +2846 4 404.8616 412.1798 69.099 0.1144 2845 +2847 4 405.23 412.3399 71.3798 0.125 2846 +2848 4 405.6384 412.7632 73.3477 0.2874 2847 +2849 4 406.4438 413.2139 74.3761 0.3003 2848 +2850 4 407.5317 413.4233 74.76 0.1546 2849 +2851 4 408.6448 413.4439 75.04 0.1528 2850 +2852 4 409.7293 413.548 75.5255 0.2313 2851 +2853 4 410.7761 413.3901 76.2818 0.2598 2852 +2854 4 411.4076 413.874 77.84 0.2288 2853 +2855 4 412.0173 414.5913 78.8379 0.2595 2854 +2856 4 412.9199 414.9517 77.7151 0.352 2855 +2857 4 413.3409 415.6255 76.2947 0.3201 2856 +2858 4 413.8317 416.1872 77.2131 0.3327 2857 +2859 4 414.3568 416.0728 77.0 0.1525 2858 +2860 3 302.6715 383.7216 32.6642 0.3043 1 +2861 3 302.453 384.821 33.2063 0.2806 2860 +2862 3 302.3157 385.8575 34.3378 0.2415 2861 +2863 3 302.7402 386.5896 35.1868 0.1983 2862 +2864 3 303.7206 387.0827 35.6171 0.2476 2863 +2865 3 304.8131 386.8367 35.7064 0.3018 2864 +2866 3 305.8759 386.5141 35.0546 0.317 2865 +2867 3 306.9901 386.4066 34.4957 0.3299 2866 +2868 3 308.0026 386.775 35.352 0.3179 2867 +2869 3 308.6615 387.6307 36.2673 0.3178 2868 +2870 3 309.3959 388.3148 36.3852 0.2726 2869 +2871 3 310.0446 389.254 36.4014 0.2669 2870 +2872 3 310.7642 390.1418 36.4059 0.2782 2871 +2873 3 311.6862 390.811 36.4297 0.2568 2872 +2874 3 312.5694 391.5363 36.5445 0.2542 2873 +2875 3 313.4583 392.1415 37.4556 0.2542 2874 +2876 3 314.1893 392.9457 38.3135 0.242 2875 +2877 3 315.132 393.4513 37.4072 0.1916 2876 +2878 3 315.9728 394.108 36.4 0.1652 2877 +2879 3 308.9109 388.2667 36.2933 0.3758 2869 +2880 3 308.2519 388.841 37.5782 0.2585 2879 +2881 3 307.3516 389.3867 37.8 0.1144 2880 +2882 3 306.6446 390.1017 37.8 0.2186 2881 +2883 3 306.1813 391.0581 37.5416 0.2239 2882 +2884 3 305.5601 391.8223 37.6449 0.3075 2883 +2885 3 304.6358 392.3771 37.8 0.2925 2884 +2886 3 303.8636 393.1768 37.5522 0.2709 2885 +2887 3 303.0056 393.6916 38.5846 0.3178 2886 +2888 3 302.477 394.0085 40.32 0.2429 2887 +2889 3 301.5984 394.5347 40.5866 0.1743 2888 +2890 3 300.8731 394.9649 41.5528 0.2241 2889 +2891 3 301.3193 394.8665 43.8623 0.2755 2890 +2892 3 300.9109 393.9433 44.52 0.2965 2891 +2893 3 300.2062 393.4216 43.2432 0.3432 2892 +2894 3 300.1856 392.7169 41.7766 0.3432 2893 +2895 3 299.7246 391.7639 42.0 0.2415 2894 +2896 3 299.7257 390.6943 41.72 0.388 2895 +2897 3 299.0851 390.2184 43.1973 0.2161 2896 +2898 3 298.9249 389.8535 45.395 0.1907 2897 +2899 3 298.9855 388.7701 45.64 0.2601 2898 +2900 3 299.0874 387.9716 44.5883 0.2619 2899 +2901 3 299.156 387.1593 45.3986 0.3046 2900 +2902 3 298.4925 386.4535 46.422 0.2034 2901 +2903 3 297.7397 385.8689 47.04 0.2873 2902 +2904 3 297.0545 385.3255 46.494 0.3146 2903 +2905 3 296.6609 384.8427 47.248 0.1926 2904 +2906 3 296.5374 384.2627 48.6836 0.1447 2905 +2907 3 296.2971 383.804 46.7191 0.1365 2906 +2908 3 295.6222 383.1256 46.5027 0.2288 2907 +2909 3 294.9507 382.5147 46.6771 0.4243 2908 +2910 3 294.2093 381.7013 47.2125 0.4117 2909 +2911 3 293.817 380.9142 48.72 0.2415 2910 +2912 3 293.0104 379.9007 48.72 0.2432 2911 +2913 3 292.3812 378.9855 48.974 0.2648 2912 +2914 3 292.0907 377.9684 48.841 0.2299 2913 +2915 3 291.9488 377.3358 50.96 0.312 2914 +2916 3 291.9614 376.2467 51.2392 0.3431 2915 +2917 3 291.3779 375.4047 50.68 0.2985 2916 +2918 3 290.6023 374.7206 50.9846 0.278 2917 +2919 3 290.7144 374.1681 52.9108 0.2835 2918 +2920 3 290.8048 373.2792 54.1652 0.1481 2919 +2921 3 290.385 372.6008 53.3868 0.2161 2920 +2922 3 290.3472 372.0299 52.64 0.2583 2921 +2923 3 290.1184 371.085 53.436 0.3193 2922 +2924 3 289.9422 370.124 54.4421 0.2892 2923 +2925 3 289.7535 369.2477 55.1698 0.3225 2924 +2926 3 289.98 368.5728 57.2592 0.2831 2925 +2927 3 290.4238 367.987 58.52 0.2161 2926 +2928 3 290.6446 367.7274 58.688 0.3051 2927 +2929 3 291.6262 367.3212 59.36 0.3384 2928 +2930 3 292.4968 366.6154 59.4339 0.2977 2929 +2931 3 292.872 365.6533 59.9701 0.1612 2930 +2932 3 293.6648 365.1648 61.04 0.1652 2931 +2933 3 290.5611 367.8749 59.4359 0.1503 2927 +2934 3 290.393 367.0638 60.5357 0.1144 2933 +2935 3 289.7272 366.5376 61.3404 0.2034 2934 +2936 3 289.3679 365.8306 61.8419 0.2182 2935 +2937 3 289.9411 365.254 62.519 0.2288 2936 +2938 3 290.536 364.9017 64.3983 0.2041 2937 +2939 3 290.1745 363.9339 63.84 0.1714 2938 +2940 3 289.6574 363.0793 64.2852 0.1447 2939 +2941 3 289.3176 362.2076 64.68 0.1253 2940 +2942 3 289.3325 361.639 63.1912 0.1261 2941 +2943 3 289.1494 361.4674 60.4593 0.1241 2942 +2944 3 288.9675 361.2958 57.7273 0.1222 2943 +2945 3 288.7845 361.123 54.9956 0.1202 2944 +2946 3 288.6015 360.9514 52.2637 0.1183 2945 +2947 3 288.4184 360.7798 49.5317 0.1163 2946 +2948 3 288.2365 360.6082 46.8 0.1144 2947 +2949 3 287.5444 359.7159 46.7289 0.1144 2948 +2950 3 286.8019 358.8591 46.7149 0.1144 2949 +2951 3 285.8307 358.2539 46.7561 0.1144 2950 +2952 3 284.9487 357.5858 46.8082 0.1144 2951 +2953 3 284.332 356.7312 46.858 0.1144 2952 +2954 3 283.2922 356.2919 46.6906 0.1391 2953 +2955 3 282.7934 355.2703 46.809 0.1907 2954 +2956 3 289.9296 372.4864 52.08 0.1144 2921 +2957 3 288.8714 372.5619 51.6617 0.2465 2956 +2958 3 287.8865 372.944 51.52 0.2099 2957 +2959 3 287.144 373.0584 52.561 0.2852 2958 +2960 3 286.4599 372.944 54.04 0.3556 2959 +2961 3 285.3445 372.9818 53.7656 0.2773 2960 +2962 3 284.7416 372.9314 55.4616 0.2169 2961 +2963 3 284.1078 372.6008 56.56 0.1401 2962 +2964 3 283.6399 373.0584 57.862 0.3485 2963 +2965 3 282.5966 373.2163 57.9992 0.5607 2964 +2966 3 282.1001 374.0686 58.8 0.3448 2965 +2967 3 281.2547 373.9816 60.0006 0.1652 2966 +2968 3 281.1449 374.2024 61.9125 0.2333 2967 +2969 3 281.0591 374.6577 63.9733 0.2866 2968 +2970 3 280.9344 375.7651 64.3952 0.1858 2969 +2971 3 280.4367 376.5899 65.0448 0.125 2970 +2972 3 280.3944 377.6733 65.52 0.1158 2971 +2973 3 280.7788 378.6297 65.728 0.13 2972 +2974 3 280.6209 379.6959 65.7233 0.2258 2973 +2975 3 279.8933 380.3114 66.6324 0.2405 2974 +2976 3 279.7641 381.2083 65.8182 0.3782 2975 +2977 3 279.9276 381.9633 67.1437 0.3173 2976 +2978 3 279.8773 382.6302 68.7977 0.2118 2977 +2979 3 279.5032 383.5775 69.1964 0.1144 2978 +2980 3 279.2527 384.5945 68.7786 0.1861 2979 +2981 3 279.4106 384.9766 71.2944 0.1321 2980 +2982 3 278.7642 385.7099 71.12 0.2981 2981 +2983 3 277.6488 385.8712 70.84 0.3305 2982 +2984 3 293.0894 380.5894 46.76 0.1271 2911 +2985 3 291.9614 380.7232 46.76 0.1538 2984 +2986 3 290.8586 380.8193 46.1504 0.2162 2985 +2987 3 289.7718 380.5916 46.0222 0.2161 2986 +2988 3 288.6781 380.6454 46.569 0.2034 2987 +2989 3 287.843 381.0698 47.3659 0.2164 2988 +2990 3 287.4689 381.2952 49.56 0.1144 2989 +2991 3 286.4198 381.2895 49.474 0.3917 2990 +2992 3 285.7987 381.1362 47.6291 0.2502 2991 +2993 3 285.1889 381.2609 49.3774 0.3268 2992 +2994 3 284.2382 381.2849 50.0567 0.1769 2993 +2995 3 283.5496 381.4531 50.9362 0.1191 2994 +2996 3 282.5783 381.7116 51.0138 0.2955 2995 +2997 3 281.5544 381.7048 50.3496 0.2034 2996 +2998 3 281.3508 382.525 50.9832 0.2532 2997 +2999 3 280.6404 383.2022 51.52 0.1144 2998 +3000 3 279.7583 383.4688 52.2348 0.1399 2999 +3001 3 278.7493 383.3075 51.8476 0.1907 3000 +3002 3 278.111 383.0226 49.8753 0.1152 3001 +3003 3 277.6488 383.4665 51.2845 0.1317 3002 +3004 3 277.269 383.2354 52.92 0.119 3003 +3005 3 276.6078 383.4059 54.0921 0.1398 3004 +3006 3 275.6674 383.4791 53.4988 0.2567 3005 +3007 3 274.9432 383.0512 52.4569 0.241 3006 +3008 3 274.1871 383.0192 52.7344 0.3432 3007 +3009 3 273.9171 383.5775 54.32 0.2651 3008 +3010 3 272.8348 383.5695 54.6 0.1894 3009 +3011 3 272.2182 382.9254 53.3431 0.2984 3010 +3012 3 271.2584 382.7824 53.4733 0.3298 3011 +3013 3 270.858 382.668 55.1729 0.3138 3012 +3014 3 270.3764 382.3179 53.3095 0.329 3013 +3015 3 269.4852 381.9164 53.8037 0.2201 3014 +3016 3 268.8514 381.1797 54.6538 0.1144 3015 +3017 3 268.3366 380.6866 56.0804 0.2325 3016 +3018 3 267.4592 380.0471 55.8768 0.2652 3017 +3019 3 266.7042 379.999 54.04 0.1525 3018 +3020 3 266.0303 379.4648 53.48 0.3377 3019 +3021 3 265.17 379.1811 53.004 0.2123 3020 +3022 3 264.407 378.7555 54.061 0.2164 3021 +3023 3 263.5181 378.3059 54.628 0.3394 3022 +3024 3 262.9816 377.3209 55.0556 0.3694 3023 +3025 3 262.4405 376.4321 54.5476 0.3101 3024 +3026 3 261.9737 375.55 54.36 0.3044 3025 +3027 3 261.1878 375.0798 55.421 0.1761 3026 +3028 3 260.8126 374.1749 54.5619 0.1209 3027 +3029 3 260.1662 373.3764 54.5667 0.2115 3028 +3030 3 259.3368 372.8193 53.76 0.2829 3029 +3031 3 258.6927 371.9464 54.1013 0.3026 3030 +3032 3 257.9125 371.228 53.5413 0.1691 3031 +3033 3 257.0351 370.7372 52.9477 0.3278 3032 +3034 3 256.3155 370.259 53.7499 0.2712 3033 +3035 3 255.5444 369.5978 53.1342 0.2398 3034 +3036 3 254.8832 368.9434 53.3448 0.3489 3035 +3037 3 254.3673 368.2639 52.169 0.2641 3036 +3038 3 253.7838 367.6164 53.48 0.1221 3037 +3039 3 252.9087 366.9288 53.48 0.2652 3038 +3040 3 252.0873 366.1498 53.1748 0.2877 3039 +3041 3 251.2556 365.3719 53.2 0.3013 3040 +3042 3 250.4868 364.5802 53.7205 0.2342 3041 +3043 3 249.5899 363.9316 53.739 0.1439 3042 +3044 3 248.6724 363.5632 53.872 0.2132 3043 +3045 3 247.9162 363.0621 53.8311 0.3348 3044 +3046 3 247.2264 362.3254 53.9406 0.2788 3045 +3047 3 246.4405 361.6115 54.3077 0.1448 3046 +3048 3 245.6786 360.813 54.04 0.1398 3047 +3049 3 245.2095 359.7937 54.243 0.1503 3048 +3050 3 244.53 358.9243 54.6 0.1445 3049 +3051 3 243.9477 358.0251 54.642 0.2542 3050 +3052 3 243.5576 357.3318 53.5553 0.1221 3051 +3053 3 243.275 356.6042 53.3238 0.1588 3052 +3054 3 242.8289 356.0322 54.6244 0.2288 3053 +3055 3 242.2992 355.1502 54.899 0.2669 3054 +3056 3 242.1207 354.2751 56.28 0.3432 3055 +3057 3 241.6357 353.3679 56.0123 0.2643 3056 +3058 3 240.8269 352.6094 56.089 0.1144 3057 +3059 3 240.645 351.7148 57.12 0.1144 3058 +3060 3 239.8922 351.2366 57.68 0.1144 3059 +3061 3 239.0422 350.5399 57.9356 0.1144 3060 +3062 3 238.8214 349.4417 57.68 0.1144 3061 +3063 3 238.7517 348.3057 57.68 0.1144 3062 +3064 3 238.0492 347.5529 57.68 0.1144 3063 +3065 3 237.1283 346.9249 57.68 0.1144 3064 +3066 3 236.2383 346.4226 57.68 0.1246 3065 +3067 3 236.4648 345.488 58.24 0.1652 3066 +3068 3 301.8021 385.9673 32.2 0.2793 2862 +3069 3 300.9864 386.2281 32.3224 0.2621 3068 +3070 3 301.0562 386.5576 34.214 0.285 3069 +3071 3 300.3 386.4604 35.5289 0.2288 3070 +3072 3 299.9568 386.4512 33.717 0.1441 3071 +3073 3 299.5209 387.3081 32.7891 0.1158 3072 +3074 3 299.2372 388.3583 33.0509 0.1652 3073 +3075 3 298.5074 388.6809 34.4084 0.2413 3074 +3076 3 297.5086 388.6202 34.2768 0.2446 3075 +3077 3 296.7708 389.1202 34.5391 0.2262 3076 +3078 3 296.2903 389.8203 35.3847 0.2984 3077 +3079 3 295.8018 390.6794 35.3133 0.2512 3078 +3080 3 295.0307 391.0524 35.399 0.1151 3079 +3081 3 294.5022 391.6598 36.2202 0.1943 3080 +3082 3 293.8536 392.4606 35.6334 0.2314 3081 +3083 3 293.0345 392.9308 35.6964 0.1635 3082 +3084 3 292.705 393.4067 37.413 0.1756 3083 +3085 3 291.8115 393.536 36.2429 0.2452 3084 +3086 3 291.0908 394.0451 36.7394 0.2924 3085 +3087 3 290.3232 394.8676 36.6402 0.3487 3086 +3088 3 289.7969 395.8206 37.4128 0.3686 3087 +3089 3 289.337 396.7335 38.3197 0.3618 3088 +3090 3 288.8749 397.7528 37.8179 0.3355 3089 +3091 3 288.1816 398.6394 37.6398 0.3178 3090 +3092 3 287.2538 399.1999 38.1455 0.329 3091 +3093 3 286.1991 399.5843 38.6672 0.3305 3092 +3094 3 285.3765 400.3703 38.8872 0.3178 3093 +3095 3 285.1351 401.0841 39.4862 0.309 3094 +3096 3 284.8903 402.1469 40.3077 0.2871 3095 +3097 3 284.7382 403.2623 40.7478 0.2887 3096 +3098 3 284.2932 404.2907 40.6952 0.3016 3097 +3099 3 283.7429 405.2654 40.1495 0.3235 3098 +3100 3 283.259 406.287 40.1386 0.3119 3099 +3101 3 282.9501 407.3212 40.9646 0.3051 3100 +3102 3 282.3644 408.019 42.4886 0.2759 3101 +3103 3 281.4675 408.6105 43.2656 0.2569 3102 +3104 3 280.4505 409.0326 43.9835 0.2241 3103 +3105 3 279.3854 409.4147 44.3092 0.2161 3104 +3106 3 278.373 409.1344 45.0106 0.2385 3105 +3107 3 277.6271 408.3325 45.7288 0.2879 3106 +3108 3 276.9624 407.6324 46.8222 0.3305 3107 +3109 3 277.0768 407.1382 48.0374 0.2994 3108 +3110 3 276.6089 406.4815 48.4624 0.2034 3109 +3111 3 276.4545 405.9964 46.727 0.3432 3110 +3112 3 276.5071 405.3627 48.1037 0.2949 3111 +3113 3 276.7267 405.0218 50.1592 0.166 3112 +3114 3 276.562 404.6271 52.624 0.2542 3113 +3115 3 276.5208 403.6043 52.08 0.2632 3114 +3116 3 277.0173 402.9168 51.5032 0.1965 3115 +3117 3 277.42 402.0508 50.9886 0.1631 3116 +3118 3 277.5344 401.7122 53.496 0.2886 3117 +3119 3 277.4978 400.7695 54.4981 0.3625 3118 +3120 3 277.42 399.9573 56.3069 0.191 3119 +3121 3 277.4852 399.2457 55.7511 0.2288 3120 +3122 3 276.8572 398.4483 55.5302 0.2458 3121 +3123 3 277.2415 398.112 56.7157 0.1652 3122 +3124 3 277.0082 397.6201 57.134 0.2924 3123 +3125 3 276.1616 397.4256 56.0 0.1398 3124 +3126 3 277.3559 397.9896 57.1217 0.1461 3123 +3127 3 277.0711 397.4256 58.8 0.3184 3126 +3128 3 275.9694 397.3112 58.4248 0.3432 3127 +3129 3 275.4638 398.0354 59.08 0.1289 3128 +3130 3 274.8105 398.1566 60.4094 0.1674 3129 +3131 3 274.258 398.4769 61.0156 0.4399 3130 +3132 3 273.2593 398.9368 60.727 0.314 3131 +3133 3 272.7307 399.6736 59.5501 0.2247 3132 +3134 3 272.2377 399.9321 60.3288 0.1488 3133 +3135 3 272.272 399.828 62.9796 0.2043 3134 +3136 3 271.4003 399.566 63.1621 0.4282 3135 +3137 3 270.3455 399.4711 63.7241 0.1451 3136 +3138 3 269.3342 399.256 64.12 0.1144 3137 +3139 3 268.1902 399.256 64.12 0.121 3138 +3140 3 267.0474 399.2182 64.12 0.1525 3139 +3141 3 266.0852 398.6337 64.12 0.2262 3140 +3142 3 265.1517 398.7206 63.56 0.1864 3141 +3143 3 264.4699 399.0581 64.496 0.1398 3142 +3144 3 263.4094 399.129 65.2028 0.1169 3143 +3145 3 262.4061 398.7984 65.0188 0.2034 3144 +3146 3 261.3903 398.9437 65.6172 0.2879 3145 +3147 3 260.4888 399.5065 65.8 0.2272 3146 +3148 3 260.2108 400.2673 66.743 0.2918 3147 +3149 3 259.4592 399.8532 67.3868 0.178 3148 +3150 3 276.9075 407.3876 49.266 0.3917 3108 +3151 3 277.1637 408.122 50.85 0.2542 3150 +3152 3 277.4795 409.1161 51.45 0.2924 3151 +3153 3 278.1819 409.8506 51.254 0.3254 3152 +3154 3 278.8443 409.6069 51.2011 0.2288 3153 +3155 3 279.819 409.6046 51.8115 0.3988 3154 +3156 3 280.4825 409.7259 53.2549 0.3432 3155 +3157 3 280.6324 410.4203 54.3906 0.1144 3156 +3158 3 279.9036 411.1708 55.16 0.2471 3157 +3159 3 279.708 412.1638 55.4663 0.394 3158 +3160 3 279.4838 413.1682 56.0899 0.3137 3159 +3161 3 279.8121 413.9804 56.9985 0.475 3160 +3162 3 279.7103 414.5719 58.175 0.2853 3161 +3163 3 280.2239 415.518 58.5108 0.1996 3162 +3164 3 280.6724 416.5327 58.0042 0.1301 3163 +3165 3 281.5716 417.1562 57.96 0.1144 3164 +3166 3 281.7466 418.2567 58.1955 0.2175 3165 +3167 3 281.6825 419.3309 59.005 0.3222 3166 +3168 3 281.686 420.3639 59.36 0.3051 3167 +3169 3 281.7832 421.2116 59.0996 0.286 3168 +3170 3 282.1424 422.1749 59.36 0.4296 3169 +3171 3 282.8403 422.9746 59.64 0.3432 3170 +3172 3 282.7247 423.9229 58.3181 0.287 3171 +3173 3 282.3518 424.8027 57.3266 0.1763 3172 +3174 3 282.1207 425.7625 56.2884 0.2231 3173 +3175 3 282.1196 426.4935 57.9961 0.1258 3174 +3176 3 282.6103 426.8573 60.1488 0.3085 3175 +3177 3 282.9272 427.4522 61.8425 0.3381 3176 +3178 3 282.568 428.3594 63.1408 0.3267 3177 +3179 3 282.7888 429.2791 63.936 0.1522 3178 +3180 3 282.6881 430.3293 64.412 0.1867 3179 +3181 3 282.3598 431.185 64.4232 0.2946 3180 +3182 3 282.1104 431.852 62.7718 0.2859 3181 +3183 3 281.6963 432.432 63.6236 0.1947 3182 +3184 3 281.4068 433.0601 65.4696 0.3099 3183 +3185 3 281.1952 433.9158 64.9006 0.2322 3184 +3186 3 280.7845 434.2887 65.6645 0.1525 3185 +3187 3 280.8543 435.0907 66.6658 0.1271 3186 +3188 3 280.8383 436.0711 66.1097 0.1867 3187 +3189 3 280.9767 436.9233 66.64 0.1802 3188 +3190 3 281.122 437.7951 68.0103 0.1265 3189 +3191 3 281.3199 438.8395 67.345 0.1144 3190 +3192 3 281.6528 439.3624 65.5085 0.1144 3191 +3193 3 281.0808 439.9138 64.328 0.2288 3192 +3194 3 281.7786 440.5864 64.6702 0.2454 3193 +3195 3 281.9834 441.6767 64.43 0.3173 3194 +3196 3 282.4616 442.6914 64.4221 0.3432 3195 +3197 3 283.1858 443.5208 64.96 0.3432 3196 +3198 3 283.7417 444.4703 64.757 0.2963 3197 +3199 3 284.316 445.4084 64.2502 0.208 3198 +3200 3 284.5185 446.4357 63.28 0.2288 3199 +3201 3 285.3079 446.8796 64.045 0.2924 3200 +3202 3 285.825 447.836 63.9262 0.2924 3201 +3203 3 286.3661 448.7523 63.635 0.2796 3202 +3204 3 286.8008 449.7064 64.12 0.1652 3203 +3205 3 284.7508 401.0761 36.9678 0.2938 3094 +3206 3 283.8539 401.417 37.3548 0.1907 3205 +3207 3 282.9249 402.005 37.24 0.2796 3206 +3208 3 282.1081 402.5358 36.5078 0.2034 3207 +3209 3 281.2879 403.117 36.12 0.1657 3208 +3210 3 280.328 403.1456 37.1675 0.1398 3209 +3211 3 279.6714 403.1124 35.2377 0.196 3210 +3212 3 278.7356 402.9168 34.7536 0.1956 3211 +3213 3 278.0069 403.26 35.84 0.3232 3212 +3214 3 276.9635 403.4888 36.5394 0.178 3213 +3215 3 275.887 403.7531 36.68 0.1144 3214 +3216 3 275.3539 404.404 36.1544 0.1248 3215 +3217 3 274.9066 404.9199 37.7216 0.1525 3216 +3218 3 274.4673 405.4004 35.84 0.2354 3217 +3219 3 273.7363 406.1074 36.1598 0.2691 3218 +3220 3 272.9321 406.1234 35.84 0.2034 3219 +3221 3 272.089 406.644 35.0672 0.2637 3220 +3222 3 271.1715 407.2182 35.6367 0.1726 3221 +3223 3 270.4164 407.8349 35.6793 0.236 3222 +3224 3 269.6637 407.979 33.9052 0.3051 3223 +3225 3 268.9029 408.2593 32.48 0.179 3224 +3226 3 268.0472 408.8576 32.7146 0.1629 3225 +3227 3 266.9375 408.7512 33.04 0.3062 3226 +3228 3 265.9365 408.6139 32.0146 0.2568 3227 +3229 3 264.9527 408.6974 31.5182 0.2667 3228 +3230 3 263.9059 408.7318 31.4266 0.2288 3229 +3231 3 262.8088 408.8656 31.7685 0.2007 3230 +3232 3 261.6831 408.8141 31.92 0.1652 3231 +3233 3 260.5597 408.932 31.619 0.1693 3232 +3234 3 259.4352 409.075 31.2483 0.14 3233 +3235 3 258.6001 409.679 31.0845 0.1171 3234 +3236 3 257.5968 410.1572 31.0845 0.1144 3235 +3237 3 256.5248 410.5576 31.0845 0.1144 3236 +3238 3 255.4552 410.9614 31.0845 0.1144 3237 +3239 3 254.3135 411.0255 31.0845 0.1144 3238 +3240 3 253.1866 411.2074 31.0845 0.1144 3239 +3241 3 252.0953 411.522 31.0845 0.1173 3240 +3242 3 251.0794 412.0505 31.0845 0.1292 3241 +3243 3 250.075 412.5893 31.019 0.1411 3242 +3244 3 249.1632 413.2254 30.3652 0.1534 3243 +3245 3 248.2503 413.8626 29.7111 0.1657 3244 +3246 3 247.3385 414.4987 29.0573 0.178 3245 +3247 3 304.8096 381.4679 38.6523 0.2153 1 +3248 3 305.1963 381.9381 41.022 0.2092 3247 +3249 3 305.5841 382.4083 43.3919 0.2031 3248 +3250 3 305.9708 382.8785 45.7618 0.1969 3249 +3251 3 306.3586 383.3487 48.1317 0.1908 3250 +3252 3 306.878 384.2765 47.9699 0.3432 3251 +3253 3 307.2967 385.1882 48.9698 0.3432 3252 +3254 3 307.6376 386.0714 49.2293 0.2466 3253 +3255 3 307.6445 387.0918 50.104 0.2488 3254 +3256 3 307.9511 388.0597 49.7342 0.1685 3255 +3257 3 308.2005 389.1419 49.3119 0.146 3256 +3258 3 308.4304 389.9198 50.4 0.1144 3257 +3259 3 308.4807 390.9414 49.8677 0.1616 3258 +3260 3 308.6878 391.8246 49.1817 0.3371 3259 +3261 3 308.7656 392.8633 49.5001 0.2322 3260 +3262 3 308.5368 393.5738 50.2107 0.3432 3261 +3263 3 308.7656 394.2567 49.6667 0.3432 3262 +3264 3 308.4773 394.9214 51.142 0.2143 3263 +3265 3 308.6512 395.8938 50.0354 0.2518 3264 +3266 3 308.6157 396.7998 49.7227 0.3896 3265 +3267 3 308.5368 397.9381 49.7487 0.2531 3266 +3268 3 308.5585 399.0775 49.733 0.2107 3267 +3269 3 308.6787 400.2021 49.8408 0.2771 3268 +3270 3 308.9132 401.2557 49.8532 0.3632 3269 +3271 3 309.1088 402.3185 49.5729 0.2924 3270 +3272 3 309.2232 403.4041 49.8308 0.2644 3271 +3273 3 309.452 404.1512 48.095 0.178 3272 +3274 3 309.4428 404.9737 46.2944 0.1302 3273 +3275 3 309.1088 405.675 44.8711 0.2415 3274 +3276 3 309.325 406.5398 46.0443 0.2161 3275 +3277 3 309.4017 406.6931 46.3918 0.2221 3276 +3278 3 309.5664 407.5592 47.8649 0.1144 3277 +3279 3 309.5664 408.7032 47.88 0.1144 3278 +3280 3 309.7483 409.552 49.1047 0.2597 3279 +3281 3 310.0446 410.0565 51.1157 0.4068 3280 +3282 3 309.9096 411.0564 51.5217 0.3044 3281 +3283 3 309.5721 411.8194 52.8315 0.1191 3282 +3284 3 309.1546 412.6545 51.7496 0.2576 3283 +3285 3 308.3984 413.0755 50.2944 0.3067 3284 +3286 3 307.919 413.9118 49.0896 0.3686 3285 +3287 3 307.5221 414.9505 49.28 0.3257 3286 +3288 3 307.0507 415.6072 49.5709 0.1159 3287 +3289 3 307.2361 416.6459 49.0 0.1242 3288 +3290 3 306.592 417.4696 48.7676 0.2855 3289 +3291 3 306.0841 417.9066 50.0948 0.1811 3290 +3292 3 305.575 418.6903 48.9404 0.2918 3291 +3293 3 305.448 419.5048 49.2313 0.1337 3292 +3294 3 304.8577 419.8869 49.84 0.1407 3293 +3295 3 304.542 420.9691 50.0088 0.1985 3294 +3296 3 304.304 421.588 51.7129 0.3954 3295 +3297 3 303.8922 422.3648 51.938 0.1304 3296 +3298 3 303.0433 422.7137 52.0425 0.31 3297 +3299 3 302.5102 423.6163 51.3766 0.2288 3298 +3300 3 302.421 424.5144 50.7396 0.1495 3299 +3301 3 301.8661 425.3014 50.7237 0.1144 3300 +3302 3 301.2976 425.8071 49.2954 0.2227 3301 +3303 3 300.8526 426.6045 48.4319 0.1968 3302 +3304 3 300.3194 427.284 48.972 0.2669 3303 +3305 3 300.2016 427.6272 50.9886 0.2304 3304 +3306 3 299.5255 428.2095 50.2354 0.3051 3305 +3307 3 298.7979 428.873 49.0008 0.3052 3306 +3308 3 298.3907 429.5102 49.9215 0.1997 3307 +3309 3 298.6275 430.3739 50.9821 0.1925 3308 +3310 3 298.8128 431.3727 50.65 0.1525 3309 +3311 3 298.2957 432.0053 49.2226 0.1199 3310 +3312 3 297.4526 432.4881 48.2731 0.1584 3311 +3313 3 296.7147 432.9617 48.8113 0.2259 3312 +3314 3 296.137 433.8929 49.2744 0.3432 3313 +3315 3 295.621 434.6216 49.8859 0.2779 3314 +3316 3 295.0754 434.9488 48.627 0.1653 3315 +3317 3 294.58 435.4373 49.6874 0.2065 3316 +3318 3 294.1327 435.7679 51.52 0.3305 3317 +3319 3 293.5721 436.7414 51.7588 0.3424 3318 +3320 3 293.0059 437.3512 53.1894 0.3406 3319 +3321 3 292.1078 437.4656 54.5742 0.1614 3320 +3322 3 291.1308 437.9449 54.6 0.2161 3321 +3323 3 290.7876 438.2687 56.558 0.1144 3322 +3324 3 290.4055 439.0203 57.9569 0.1144 3323 +3325 3 290.1218 439.6907 56.2906 0.2096 3324 +3326 3 289.6597 440.329 54.6 0.254 3325 +3327 3 289.2295 441.2316 54.2987 0.2845 3326 +3328 3 289.0179 441.9135 55.8494 0.2187 3327 +3329 3 288.5191 442.7841 55.44 0.3979 3328 +3330 3 288.3955 443.8217 55.9689 0.3409 3329 +3331 3 287.6737 444.4463 56.1383 0.2359 3330 +3332 3 287.3728 445.016 56.1686 0.2592 3331 +3333 3 286.961 444.5904 57.904 0.1165 3332 +3334 3 286.3432 445.2723 57.0769 0.1703 3333 +3335 3 285.476 445.5617 56.8282 0.3426 3334 +3336 3 284.586 445.9953 58.0994 0.3135 3335 +3337 3 283.5839 446.0456 59.0573 0.3711 3336 +3338 3 282.5508 446.0467 58.9596 0.2833 3337 +3339 3 281.948 446.6462 59.3718 0.2876 3338 +3340 3 281.1254 446.7366 58.1423 0.3386 3339 +3341 3 280.2239 446.6702 57.3493 0.2585 3340 +3342 3 279.3728 446.3888 56.7204 0.1144 3341 +3343 3 278.7928 446.16 54.88 0.2288 3342 +3344 3 309.9748 406.8121 46.0188 0.2369 3276 +3345 3 311.0296 407.2548 45.9777 0.2707 3344 +3346 3 312.0843 407.6976 45.9365 0.3044 3345 +3347 3 312.7696 408.2341 44.8417 0.1737 3346 +3348 3 313.178 408.9514 44.1854 0.2288 3347 +3349 3 313.2203 408.7512 46.6082 0.1522 3348 +3350 3 313.7786 408.9571 47.6132 0.1687 3349 +3351 3 314.028 409.671 48.5948 0.2263 3350 +3352 3 314.4044 410.0119 50.4431 0.1761 3351 +3353 3 314.6 410.7978 49.5886 0.3051 3352 +3354 3 315.148 411.1673 50.0436 0.2299 3353 +3355 3 316.0071 411.7256 50.3829 0.2605 3354 +3356 3 316.5414 411.4041 52.6288 0.2288 3355 +3357 3 317.2598 411.3355 53.503 0.2257 3356 +3358 3 317.4806 412.2187 54.0238 0.247 3357 +3359 3 318.5216 412.412 53.5049 0.3432 3358 +3360 3 319.2446 412.0814 55.0458 0.2796 3359 +3361 3 320.3154 412.3491 55.1342 0.2669 3360 +3362 3 321.0236 412.722 56.0829 0.2682 3361 +3363 3 321.6493 413.4153 56.84 0.2924 3362 +3364 3 322.1412 414.3454 57.0713 0.3033 3363 +3365 3 322.608 414.9871 58.52 0.2162 3364 +3366 3 323.0656 415.6381 57.636 0.433 3365 +3367 3 323.935 416.0362 57.12 0.4287 3366 +3368 3 324.2096 417.1127 57.391 0.4539 3367 +3369 3 324.0529 417.949 58.7891 0.3985 3368 +3370 3 324.3126 418.7223 60.2 0.3432 3369 +3371 3 324.8823 419.5231 60.3691 0.2942 3370 +3372 3 325.0459 420.5218 60.6472 0.1473 3371 +3373 3 325.4165 421.4416 60.48 0.3432 3372 +3374 3 325.2667 422.4312 60.6889 0.3119 3373 +3375 3 325.7082 423.2972 60.226 0.38 3374 +3376 3 325.8661 424.0865 61.2926 0.2585 3375 +3377 3 325.9199 425.0177 60.2588 0.2841 3376 +3378 3 325.7071 425.862 61.6358 0.2314 3377 +3379 3 326.0972 426.1366 63.3153 0.2695 3378 +3380 3 326.4507 426.6262 65.0787 0.2192 3379 +3381 3 326.7264 427.419 66.561 0.2398 3380 +3382 3 326.8763 428.3742 66.6456 0.3059 3381 +3383 3 326.8442 429.3947 67.4338 0.3148 3382 +3384 3 327.1096 430.3419 67.7748 0.2868 3383 +3385 3 327.5078 431.161 67.8936 0.1971 3384 +3386 3 328.1713 431.5626 66.7019 0.144 3385 +3387 3 329.0213 431.5454 67.2294 0.1544 3386 +3388 3 329.798 432.1872 66.64 0.2924 3387 +3389 3 329.9948 432.9662 67.7648 0.2911 3388 +3390 3 330.1801 433.004 70.4287 0.3371 3389 +3391 3 330.5645 433.6298 72.228 0.1314 3390 +3392 3 331.2875 434.1526 73.4877 0.1144 3391 +3393 3 331.8538 434.7303 72.4069 0.1975 3392 +3394 3 332.8823 435.0609 72.5502 0.2422 3393 +3395 3 333.5252 435.2909 74.4629 0.3375 3394 +3396 3 334.4678 435.6306 75.5014 0.2812 3395 +3397 3 335.2378 435.7496 74.8157 0.333 3396 +3398 3 335.0776 436.436 73.64 0.3305 3397 +3399 3 305.1414 375.2514 27.8631 0.2871 1 +3400 3 305.353 374.191 28.0683 0.4743 3399 +3401 3 305.4926 373.3318 29.0111 0.2337 3400 +3402 3 306.2442 372.8079 28.9262 0.2288 3401 +3403 3 306.7636 371.8332 28.6373 0.2288 3402 +3404 3 307.4077 371.4568 27.7245 0.2288 3403 +3405 3 308.1215 371.228 29.3124 0.2796 3404 +3406 3 308.8056 370.4718 29.5221 0.2708 3405 +3407 3 309.3708 370.2293 27.7206 0.2075 3406 +3408 3 309.2507 369.3244 27.6763 0.3161 3407 +3409 3 309.4165 368.3817 27.9832 0.2611 3408 +3410 3 310.0515 367.7708 27.1438 0.3432 3409 +3411 3 310.4942 367.113 27.6755 0.2672 3410 +3412 3 310.6818 366.1898 28.5524 0.3049 3411 +3413 3 311.0078 365.2986 28.0162 0.3257 3412 +3414 3 311.9413 364.936 27.2852 0.2056 3413 +3415 3 312.8703 365.2792 28.1708 0.3685 3414 +3416 3 313.8942 365.2598 28.4698 0.394 3415 +3417 3 314.8231 364.8777 27.1281 0.394 3416 +3418 3 315.6307 364.5756 26.8223 0.44 3417 +3419 3 315.9877 363.5438 26.3511 0.425 3418 +3420 3 316.6009 362.8356 27.16 0.1892 3419 +3421 3 316.888 361.8529 27.6231 0.178 3420 +3422 3 317.3445 361.4697 29.5854 0.1598 3421 +3423 3 318.2711 360.94 30.24 0.1525 3422 +3424 3 318.4999 360.1438 28.8812 0.2013 3423 +3425 3 319.5284 359.9882 28.5519 0.1409 3424 +3426 3 320.3394 359.6072 27.2507 0.2127 3425 +3427 3 320.9092 358.914 27.0637 0.4514 3426 +3428 3 321.6127 358.1933 27.6587 0.3943 3427 +3429 3 322.2774 357.3044 27.711 0.3632 3428 +3430 3 322.894 356.451 27.44 0.339 3429 +3431 3 323.784 355.8435 26.861 0.4089 3430 +3432 3 324.3629 354.9649 26.6406 0.1952 3431 +3433 3 325.1225 354.3437 26.88 0.1253 3432 +3434 3 325.7048 353.8392 27.3073 0.1195 3433 +3435 3 326.6944 353.7248 28.238 0.165 3434 +3436 3 327.6416 353.3953 28.1812 0.2288 3435 +3437 3 328.0031 352.8016 26.7358 0.2907 3436 +3438 3 328.7845 352.4664 25.4806 0.2282 3437 +3439 3 329.3999 352.5545 27.3697 0.1705 3438 +3440 3 330.028 352.3955 28.5852 0.1246 3439 +3441 3 330.3872 351.5237 28.9528 0.2258 3440 +3442 3 331.0942 351.3224 29.223 0.2415 3441 +3443 3 331.8161 350.7996 29.2172 0.2773 3442 +3444 3 332.6832 350.1601 28.5925 0.2279 3443 +3445 3 333.5103 349.4268 28.091 0.1652 3444 +3446 3 334.2116 348.5688 27.72 0.2152 3445 +3447 3 334.9003 347.7588 27.6786 0.283 3446 +3448 3 335.5432 346.902 27.7186 0.2272 3447 +3449 3 336.2628 346.3872 28.4866 0.3051 3448 +3450 3 337.011 345.8712 28.056 0.3432 3449 +3451 3 337.5624 345.2741 27.2275 0.1636 3450 +3452 3 338.3426 344.8016 26.5073 0.1194 3451 +3453 3 339.1983 344.8931 28.2192 0.2161 3452 +3454 3 339.9396 344.4401 27.7794 0.2288 3453 +3455 3 340.9086 344.3657 27.9644 0.2288 3454 +3456 3 341.7414 344.3486 28.1212 0.1825 3455 +3457 3 342.5994 344.1358 28.6051 0.3243 3456 +3458 3 343.4437 343.5329 28.6345 0.2217 3457 +3459 3 344.0488 343.2 28.4976 0.2465 3458 +3460 3 344.8565 342.7355 28.4343 0.2288 3459 +3461 3 345.7202 342.3271 28.3228 0.2407 3460 +3462 3 346.6766 341.9096 28.0468 0.2351 3461 +3463 3 346.6503 341.015 27.2863 0.217 3462 +3464 3 347.0416 340.0037 27.141 0.1415 3463 +3465 3 347.6902 339.2898 27.72 0.2476 3464 +3466 3 348.1684 338.6183 27.7253 0.2346 3465 +3467 3 348.7335 337.7294 27.6156 0.3036 3466 +3468 3 349.3902 337.1894 26.9461 0.1828 3467 +3469 3 350.0411 336.7719 28.0 0.2034 3468 +3470 3 351.0959 336.3852 27.7343 0.2493 3469 +3471 3 351.4368 335.8384 26.129 0.1145 3470 +3472 3 351.9928 335.2652 26.6 0.2288 3471 +3473 3 352.4367 334.4427 27.2292 0.2288 3472 +3474 3 352.5957 333.587 27.5131 0.1948 3473 +3475 3 353.1551 332.7965 27.9443 0.1271 3474 +3476 3 354.0165 332.1444 28.5541 0.1765 3475 +3477 3 354.5519 331.156 28.3772 0.1907 3476 +3478 3 355.3424 330.3792 28.6532 0.1843 3477 +3479 3 356.3102 330.1927 28.7787 0.1737 3478 +3480 3 357.4119 330.0978 29.342 0.1626 3479 +3481 3 358.4827 329.8095 29.1673 0.1526 3480 +3482 3 359.2354 329.1585 28.448 0.1755 3481 +3483 3 360.0523 328.4996 28.8271 0.1907 3482 +3484 3 360.9663 328.2525 28.6294 0.2162 3483 +3485 3 361.6287 327.6977 29.7223 0.2288 3484 +3486 3 362.2556 326.9952 29.2754 0.1483 3485 +3487 3 363.347 326.8122 29.3927 0.1144 3486 +3488 3 364.4715 326.6337 29.4 0.1144 3487 +3489 3 365.5949 326.4976 29.4 0.1144 3488 +3490 3 366.7275 326.4461 29.4622 0.1653 3489 +3491 3 367.8486 326.3306 29.0433 0.2346 3490 +3492 3 368.9446 326.2688 28.317 0.2288 3491 +3493 3 369.6802 325.9325 28.1002 0.1144 3492 +3494 3 370.5199 325.9062 29.0976 0.1631 3493 +3495 3 371.2555 326.4953 28.6373 0.2288 3494 +3496 3 372.1695 326.6257 29.0492 0.2115 3495 +3497 3 373.1797 326.8065 28.7468 0.1163 3496 +3498 3 374.279 326.9792 29.12 0.135 3497 +3499 3 375.1862 327.4082 28.2562 0.2131 3498 +3500 3 376.1724 327.7503 28.3825 0.1658 3499 +3501 3 376.9903 327.7182 28.0104 0.1822 3500 +3502 3 377.8335 327.4059 28.7106 0.2647 3501 +3503 3 378.664 326.9563 28.7249 0.2273 3502 +3504 3 379.6913 326.5514 28.2971 0.1318 3503 +3505 3 380.7083 326.2963 28.901 0.1481 3504 +3506 3 381.6601 325.865 29.1032 0.1676 3505 +3507 3 382.676 325.5778 28.28 0.2716 3506 +3508 3 383.6782 325.15 28.4581 0.1782 3507 +3509 3 384.7867 324.9578 28.0563 0.1144 3508 +3510 3 385.8906 324.6752 28.0 0.1144 3509 +3511 3 387.0072 324.451 28.0 0.1144 3510 +3512 3 388.1054 324.1398 28.0 0.1144 3511 +3513 3 389.1591 323.7005 27.9555 0.1265 3512 +3514 3 390.1292 323.5163 28.2047 0.1829 3513 +3515 3 391.1096 323.1159 28.6532 0.201 3514 +3516 3 392.0923 322.608 28.84 0.1493 3515 +3517 3 393.1722 322.6194 29.3171 0.1493 3516 +3518 3 394.2167 322.608 30.2089 0.1441 3517 +3519 3 395.2509 322.7224 29.9594 0.1272 3518 +3520 3 396.158 322.5039 30.3419 0.1591 3519 +3521 3 397.2586 322.608 29.96 0.1144 3520 +3522 3 398.1578 323.1789 29.6918 0.1144 3521 +3523 3 399.1233 323.5232 29.12 0.1144 3522 +3524 3 400.2673 323.5232 29.12 0.1144 3523 +3525 3 401.1951 323.9808 28.8417 0.1144 3524 +3526 3 401.8906 324.6741 28.6916 0.1144 3525 +3527 3 402.9832 324.7816 29.1292 0.1336 3526 +3528 3 404.0482 324.7816 29.9499 0.1652 3527 +3529 3 405.1087 324.8708 30.52 0.1151 3528 +3530 3 406.1646 324.4327 30.52 0.1622 3529 +3531 3 407.0295 323.7211 30.6186 0.2789 3530 +3532 3 407.4608 322.8608 31.08 0.1361 3531 +3533 3 407.9836 322.0246 31.08 0.1144 3532 +3534 3 408.9937 321.5864 30.7045 0.1144 3533 +3535 3 410.1309 321.5784 30.52 0.1144 3534 +3536 3 411.2405 321.6711 30.464 0.2066 3535 +3537 3 411.84 322.0806 30.3604 0.178 3536 +3538 3 412.6751 322.4936 30.4774 0.2913 3537 +3539 3 413.7745 322.5394 30.4746 0.304 3538 +3540 3 414.795 322.8425 30.0507 0.2482 3539 +3541 3 415.876 322.5588 29.68 0.2719 3540 +3542 3 416.5544 323.0393 28.5222 0.1959 3541 +3543 3 417.5474 322.9592 27.7612 0.3079 3542 +3544 3 418.267 322.6183 28.0319 0.1144 3543 +3545 3 419.1353 322.6286 27.2532 0.1941 3544 +3546 3 419.8057 323.22 27.6651 0.1652 3545 +3547 3 420.5367 323.6353 26.8402 0.3432 3546 +3548 3 421.4427 324.0918 27.0337 0.4014 3547 +3549 3 422.4449 323.9282 27.5979 0.3683 3548 +3550 3 423.455 323.8378 28.6516 0.3178 3549 +3551 3 424.424 323.4877 28.5051 0.3051 3550 +3552 3 425.1127 322.8608 27.9359 0.3116 3551 +3553 3 425.7979 322.4284 27.4254 0.3222 3552 +3554 3 426.7166 322.0337 27.6298 0.3972 3553 +3555 3 427.5231 322.2213 28.6698 0.3926 3554 +3556 3 428.2312 322.3849 29.5736 0.1254 3555 +3557 3 429.0092 321.6917 29.5806 0.2151 3556 +3558 3 429.4576 320.892 29.12 0.3051 3557 +3559 3 315.7131 364.7266 26.4046 0.3717 3417 +3560 3 315.9762 365.2712 24.6618 0.3089 3559 +3561 3 316.7393 365.8032 24.2222 0.2924 3560 +3562 3 317.7254 366.1544 24.4348 0.2619 3561 +3563 3 318.6303 365.6716 24.719 0.3421 3562 +3564 3 319.5913 365.8512 24.5347 0.2795 3563 +3565 3 319.9768 365.0058 23.9781 0.1185 3564 +3566 3 320.7147 364.3972 24.059 0.2767 3565 +3567 3 321.7111 364.6214 24.1024 0.1928 3566 +3568 3 322.5314 364.1592 23.52 0.3241 3567 +3569 3 323.6021 364.1146 23.5771 0.1878 3568 +3570 3 324.0506 363.5129 22.7035 0.2669 3569 +3571 3 324.0288 363.236 20.267 0.3432 3570 +3572 3 324.4453 362.2716 20.1659 0.355 3571 +3573 3 325.3387 361.8106 20.8544 0.1997 3572 +3574 3 326.0995 361.0395 21.0 0.2049 3573 +3575 3 326.1189 359.9665 20.4154 0.3065 3574 +3576 3 325.492 359.1863 20.0883 0.1682 3575 +3577 3 325.7014 358.628 19.2147 0.1636 3576 +3578 3 325.9256 357.8215 20.4336 0.2971 3577 +3579 3 325.9496 356.9314 19.4387 0.2669 3578 +3580 3 325.6339 356.5425 16.921 0.2669 3579 +3581 3 325.2575 355.8995 16.4909 0.3288 3580 +3582 3 324.7816 355.5197 15.745 0.3432 3581 +3583 3 324.8514 354.9832 14.5737 0.2288 3582 +3584 3 325.9062 355.0598 14.1168 0.3205 3583 +3585 3 326.6886 354.7029 15.057 0.1568 3584 +3586 3 327.1783 354.537 13.1452 0.198 3585 +3587 3 327.51 353.734 12.0532 0.178 3586 +3588 3 327.9608 352.8405 12.6 0.2601 3587 +3589 3 328.8908 353.2569 12.731 0.188 3588 +3590 3 329.5418 353.6356 13.7203 0.2987 3589 +3591 3 330.457 353.8014 14.5656 0.2418 3590 +3592 3 331.3356 353.5681 13.5542 0.2161 3591 +3593 3 331.6239 354.1366 12.2844 0.2034 3592 +3594 3 332.3995 354.5164 12.087 0.2011 3593 +3595 3 333.5218 354.6503 12.04 0.1314 3594 +3596 3 334.1693 355.4957 11.7888 0.1144 3595 +3597 3 334.7344 355.5632 12.9968 0.3216 3596 +3598 3 335.5352 355.212 13.44 0.2542 3597 +3599 3 301.5344 375.9367 23.3178 0.2033 1 +3600 3 301.1157 375.0272 21.966 0.1935 3599 +3601 3 300.5563 374.2321 22.4974 0.2398 3600 +3602 3 299.8756 373.6796 23.6998 0.1444 3601 +3603 3 298.87 373.6682 23.7132 0.167 3602 +3604 3 297.7626 373.5286 23.3369 0.2288 3603 +3605 3 296.7914 373.3055 22.68 0.1289 3604 +3606 3 296.0008 373.3776 24.0027 0.1762 3605 +3607 3 295.1772 373.0126 24.92 0.2138 3606 +3608 3 294.7665 372.8468 22.7923 0.1303 3607 +3609 3 293.8936 372.9028 22.9284 0.1813 3608 +3610 3 293.4177 372.515 24.3314 0.3422 3609 +3611 3 292.3744 372.1432 24.1287 0.2909 3610 +3612 3 291.3288 371.967 23.9428 0.1969 3611 +3613 3 290.4776 371.6581 22.6307 0.2609 3612 +3614 3 290.0864 371.7371 24.2155 0.2004 3613 +3615 3 289.3073 371.5941 25.2608 0.1628 3614 +3616 3 288.5168 371.4065 25.1384 0.1481 3615 +3617 3 287.8853 370.9866 23.9887 0.3051 3616 +3618 3 286.9999 370.5302 24.2298 0.2929 3617 +3619 3 285.9199 370.3872 24.362 0.2661 3618 +3620 3 285.293 369.5726 24.92 0.1543 3619 +3621 3 284.435 369.2832 24.2001 0.178 3620 +3622 3 283.6582 368.7146 22.902 0.1144 3621 +3623 3 283.3494 368.2536 21.7669 0.1144 3622 +3624 3 283.0256 367.8303 21.9876 0.2088 3623 +3625 3 282.2843 367.6953 23.4424 0.1961 3624 +3626 3 281.6425 367.264 21.9478 0.2569 3625 +3627 3 280.9618 367.1782 20.4596 0.1766 3626 +3628 3 280.2217 366.5376 21.0484 0.178 3627 +3629 3 279.3099 366.1647 21.9526 0.3272 3628 +3630 3 278.516 365.5995 21.5424 0.2307 3629 +3631 3 277.666 365.2826 22.0234 0.4256 3630 +3632 3 276.7645 364.8296 21.5838 0.1968 3631 +3633 3 275.9591 364.0288 21.2383 0.2074 3632 +3634 3 275.1549 363.228 20.893 0.2182 3633 +3635 3 274.3495 362.4272 20.5475 0.2288 3634 +3636 3 274.0086 362.2007 20.417 0.1834 3635 +3637 3 273.1517 361.5669 19.4051 0.178 3636 +3638 3 272.7342 360.5991 18.3408 0.1654 3637 +3639 3 272.1324 359.7468 17.1959 0.178 3638 +3640 3 271.9803 359.1645 16.1445 0.1508 3639 +3641 3 272.3715 358.199 15.171 0.1822 3640 +3642 3 272.1542 357.2151 14.5897 0.2049 3641 +3643 3 271.4209 356.3869 14.5961 0.2288 3642 +3644 3 270.9816 355.5369 13.6086 0.2401 3643 +3645 3 271.0216 354.457 12.964 0.2413 3644 +3646 3 270.4885 353.631 13.2376 0.2288 3645 +3647 3 269.4875 353.3221 14.1644 0.2142 3646 +3648 3 268.451 353.0178 14.4956 0.2111 3647 +3649 3 267.5164 352.4756 13.7063 0.2081 3648 +3650 3 267.0748 351.5409 13.4476 0.2202 3649 +3651 3 267.0119 350.4152 13.8457 0.2375 3650 +3652 3 267.0279 349.2769 13.9997 0.2502 3651 +3653 3 267.1389 348.1398 13.9989 0.2455 3652 +3654 3 267.4718 347.053 13.9941 0.2328 3653 +3655 3 267.5484 345.9353 13.9616 0.238 3654 +3656 3 266.9959 344.9881 13.7052 0.2511 3655 +3657 3 266.0601 344.36 13.6181 0.2746 3656 +3658 3 265.1414 343.6828 13.704 0.2796 3657 +3659 3 264.3864 342.9575 12.7128 0.2583 3658 +3660 3 263.6783 342.1121 12.0123 0.1991 3659 +3661 3 262.7047 341.6579 12.7042 0.1435 3660 +3662 3 261.8227 342.2528 13.4966 0.1274 3661 +3663 3 261.5184 343.3144 12.88 0.1525 3662 +3664 3 270.9919 360.2204 17.9925 0.1387 3639 +3665 3 269.8719 360.249 17.6128 0.1518 3664 +3666 3 268.8034 360.265 16.6219 0.1403 3665 +3667 3 267.8047 360.5842 15.6657 0.1252 3666 +3668 3 267.0828 361.2409 14.6471 0.1144 3667 +3669 3 266.1184 361.5806 15.5982 0.1144 3668 +3670 3 265.2227 361.3873 16.9036 0.1144 3669 +3671 3 264.701 360.6552 16.0037 0.1144 3670 +3672 3 264.4665 359.8097 14.2313 0.1144 3671 +3673 3 264.0878 358.8945 14.0526 0.1217 3672 +3674 3 263.6817 358.2722 15.9303 0.1351 3673 +3675 3 263.3225 358.6898 17.901 0.1484 3674 +3676 3 262.7116 359.3887 19.4491 0.1433 3675 +3677 3 262.0195 360.2342 19.9346 0.1297 3676 +3678 3 261.3628 361.17 20.0416 0.1163 3677 +3679 3 261.0608 360.7032 21.84 0.1271 3678 +3680 3 274.2042 361.7683 21.7151 0.2669 3635 +3681 3 273.7958 360.7021 21.8392 0.2477 3680 +3682 3 273.2158 359.7365 21.835 0.2064 3681 +3683 3 272.3338 359.0341 21.8131 0.1907 3682 +3684 3 271.3351 358.4838 21.6882 0.2009 3683 +3685 3 270.3844 357.8878 21.212 0.2265 3684 +3686 3 269.4475 357.2838 20.7281 0.2415 3685 +3687 3 268.5483 356.5814 20.6886 0.2469 3686 +3688 3 267.8047 355.7337 20.4834 0.2542 3687 +3689 3 267.1949 354.7761 20.1608 0.26 3688 +3690 3 266.4765 353.8998 20.1967 0.2669 3689 +3691 3 265.6414 353.218 19.7008 0.2669 3690 +3692 3 265.1323 352.3417 19.2217 0.2669 3691 +3693 3 264.6838 351.3132 19.4253 0.2592 3692 +3694 3 263.8693 350.5525 19.3225 0.2306 3693 +3695 3 263.0525 349.937 18.2426 0.1836 3694 +3696 3 262.4061 349.2392 16.7065 0.1403 3695 +3697 3 261.5115 348.8525 15.5254 0.1271 3696 +3698 3 260.7073 348.793 16.9098 0.1469 3697 +3699 3 260.0987 348.729 19.2685 0.1931 3698 +3700 3 259.2064 348.3594 20.5587 0.2461 3699 +3701 3 258.1608 347.9247 20.6758 0.2758 3700 +3702 3 257.1346 347.4362 20.396 0.2577 3701 +3703 3 256.2102 346.815 19.7862 0.1985 3702 +3704 3 255.1429 346.4936 20.1709 0.1443 3703 +3705 3 254.2151 346.0783 19.0078 0.1153 3704 +3706 3 253.6122 346.2739 19.6 0.1899 3705 +3707 3 252.8103 346.1824 20.5422 0.1144 3706 +3708 3 251.7692 346.2591 19.88 0.1345 3707 +3709 3 250.7934 345.9959 19.9576 0.1239 3708 +3710 3 250.242 345.4045 21.0 0.2288 3709 +3711 3 249.5258 344.7055 20.2765 0.1935 3710 +3712 3 248.6907 344.2788 21.0423 0.159 3711 +3713 3 247.9037 344.0477 20.0236 0.2161 3712 +3714 3 247.2378 343.4688 19.6 0.178 3713 +3715 3 246.3959 342.8568 20.1303 0.2159 3714 +3716 3 245.2725 342.9197 20.4089 0.1182 3715 +3717 3 244.2188 342.9586 20.3468 0.1652 3716 +3718 3 244.1296 342.4964 20.519 0.1144 3717 +3719 3 244.5872 341.7128 19.32 0.1398 3718 +3720 3 244.1651 343.1943 20.1984 0.1719 3717 +3721 3 243.4123 343.8795 19.88 0.1215 3720 +3722 3 242.2683 343.8864 19.88 0.1144 3721 +3723 3 241.1243 343.8864 19.88 0.1144 3722 +3724 3 240.0375 343.8864 20.5313 0.1191 3723 +3725 3 239.0994 343.4002 20.9782 0.224 3724 +3726 3 238.4885 343.0856 20.9353 0.1674 3725 +3727 3 237.4303 342.9735 20.72 0.1163 3726 +3728 3 236.3596 343.0993 21.28 0.1541 3727 +3729 3 235.6022 342.5685 21.84 0.2862 3728 +3730 3 234.6333 342.342 21.4194 0.1462 3729 +3731 3 233.686 342.4621 21.6006 0.1891 3730 +3732 3 232.8909 342.8339 22.6789 0.1666 3731 +3733 3 232.2709 343.0192 21.1238 0.1185 3732 +3734 3 231.2196 343.0398 21.8156 0.1271 3733 +3735 3 230.2529 342.5571 22.4 0.2012 3734 +3736 3 229.2073 342.3878 21.7767 0.2171 3735 +3737 3 228.7085 341.5252 20.8393 0.167 3736 +3738 3 227.8745 340.7953 20.7152 0.1144 3737 +3739 3 226.7934 340.475 20.44 0.1144 3738 +3740 3 225.7467 340.0151 20.44 0.1372 3739 +3741 3 224.8543 339.3276 20.0712 0.1652 3740 +3742 3 224.1908 338.5554 20.6422 0.1306 3741 +3743 3 223.2996 337.917 20.44 0.1144 3742 +3744 3 222.5663 337.1368 20.16 0.1317 3743 +3745 3 221.7026 336.4161 20.3157 0.1652 3744 +3746 3 220.6787 336.1312 20.7642 0.1497 3745 +3747 3 219.656 335.9814 21.8025 0.1257 3746 +3748 3 218.9044 335.8441 20.5265 0.1925 3747 +3749 3 217.8382 335.6496 20.9936 0.2805 3748 +3750 3 217.0877 335.5421 19.462 0.3127 3749 +3751 3 216.6713 334.9117 20.1984 0.2539 3750 +3752 3 216.4654 334.0549 19.6381 0.2232 3751 +3753 3 216.0776 334.3489 18.5623 0.2557 3752 +3754 3 215.1578 334.0469 18.0796 0.3205 3753 +3755 3 214.5366 333.182 17.6159 0.1936 3754 +3756 3 213.7701 332.7541 16.3534 0.2366 3755 +3757 3 212.9442 332.1696 17.0458 0.2865 3756 +3758 3 211.8951 332.2416 17.36 0.3432 3757 +3759 3 211.8596 333.2186 17.0727 0.3432 3758 +3760 3 211.3723 333.9325 16.1269 0.2819 3759 +3761 3 211.0508 333.333 15.5893 0.3432 3760 +3762 3 210.0784 332.9749 15.1718 0.3009 3761 +3763 3 209.0077 332.8434 14.6695 0.2384 3762 +3764 3 207.9712 332.5928 15.12 0.4115 3763 +3765 3 206.9084 332.2256 14.7008 0.302 3764 +3766 3 205.9177 331.7657 14.6818 0.2727 3765 +3767 3 204.9453 332.157 14.6793 0.2608 3766 +3768 3 204.3607 332.6935 13.1911 0.3037 3767 +3769 3 203.4043 332.7175 12.3166 0.3312 3768 +3770 3 202.5727 332.904 12.0851 0.1533 3769 +3771 3 201.5362 332.8411 12.7812 0.2616 3770 +3772 3 200.6748 332.5608 13.1897 0.1541 3771 +3773 3 199.7824 332.801 14.1159 0.142 3772 +3774 3 198.7483 333.0424 13.8667 0.3057 3773 +3775 3 198.5481 333.484 12.868 0.3686 3774 +3776 3 198.1717 333.7345 11.3226 0.3026 3775 +3777 3 197.7427 334.5102 12.3385 0.2186 3776 +3778 3 196.7028 334.8694 12.9396 0.2089 3777 +3779 3 195.7636 334.8191 12.9847 0.1992 3778 +3780 3 195.5027 334.8431 11.3277 0.1794 3779 +3781 3 194.8655 334.2619 10.9175 0.1261 3780 +3782 3 194.1711 333.5263 11.3341 0.2603 3781 +3783 3 194.1368 332.904 12.04 0.1144 3782 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Scnn1a_473845048_m.swc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Scnn1a_473845048_m.swc new file mode 100644 index 0000000..84e566f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/biophysical/morphology/Scnn1a_473845048_m.swc @@ -0,0 +1,3786 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/177300.01.02.01/reconstruction/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01___DS.swc +# id,type,x,y,z,r,pid +1 1 303.16 379.4648 28.56 5.4428 -1 +2 3 302.6646 375.232 23.2562 0.2524 1 +3 3 302.469 374.2356 21.9996 0.2615 2 +4 3 302.0057 373.2918 21.0081 0.3026 3 +5 3 301.2358 372.4956 20.7318 0.36 4 +6 3 300.3366 371.832 20.7847 0.3728 5 +7 3 299.7177 370.8768 20.9602 0.3575 6 +8 3 299.5049 369.798 21.7249 0.3935 7 +9 3 299.5198 368.6563 21.8372 0.4067 8 +10 3 299.6319 367.518 21.8288 0.432 9 +11 3 299.9305 366.414 21.7669 0.3941 10 +12 3 299.9534 365.2803 21.3934 0.3432 11 +13 3 299.2818 364.1844 21.835 0.3426 12 +14 3 298.4113 363.4442 21.8336 0.3307 13 +15 3 297.5372 362.7052 21.8064 0.2929 14 +16 3 297.0465 361.6756 21.639 0.2796 15 +17 3 296.5568 360.9103 20.5181 0.1964 16 +18 3 296.4024 359.8749 19.7562 0.1915 17 +19 3 296.2342 358.7584 19.6034 0.2477 18 +20 3 295.8212 357.6968 19.6199 0.3025 19 +21 3 295.3156 356.6717 19.7109 0.3267 20 +22 3 294.8111 355.6582 20.0852 0.3125 21 +23 3 294.0824 354.8276 20.6212 0.2917 22 +24 3 293.1958 354.116 20.4296 0.2796 23 +25 3 292.2016 353.6642 19.6 0.2759 24 +26 3 291.2704 353.0922 18.898 0.2278 25 +27 3 290.7682 352.0832 18.6127 0.2161 26 +28 3 290.5108 351.0433 17.754 0.2229 27 +29 3 289.7706 350.1956 17.3659 0.2669 28 +30 3 288.9069 349.46 17.3953 0.2585 29 +31 3 288.2308 348.5425 17.535 0.2245 30 +32 3 287.7171 347.5724 18.1266 0.1808 31 +33 3 287.8121 346.4821 18.8541 0.178 32 +34 3 288.0684 345.5772 17.267 0.1907 33 +35 3 288.1038 344.6838 15.5235 0.1907 34 +36 3 288.3566 343.6084 14.8921 0.1932 35 +37 3 289.0007 342.6692 15.113 0.2306 36 +38 3 289.4698 341.6281 15.0758 0.2553 37 +39 3 289.7329 340.523 14.8417 0.2621 38 +40 3 289.9468 339.4706 13.8762 0.2132 39 +41 3 289.9823 338.4535 12.9086 0.1907 40 +42 3 289.2009 337.6253 12.7764 0.193 41 +43 3 288.28 336.9618 12.5132 0.2034 42 +44 3 287.3865 336.447 12.6182 0.1978 43 +45 3 286.7791 336.0088 14.0918 0.1738 44 +46 3 285.6522 336.058 14.2492 0.1515 45 +47 3 284.6936 335.8498 15.4532 0.129 46 +48 3 284.0746 334.9357 15.6929 0.1155 47 +49 3 283.2212 334.4781 14.3422 0.1503 48 +50 3 282.1104 334.62 14.0 0.2288 49 +51 3 297.5086 361.2443 21.7473 0.2584 16 +52 3 298.2465 360.3806 21.812 0.2203 51 +53 3 299.0313 359.5729 21.5678 0.189 52 +54 3 299.8252 358.9929 20.3588 0.1631 53 +55 3 300.6764 358.4941 19.0198 0.1603 54 +56 3 301.6076 357.905 18.9526 0.1896 55 +57 3 302.6681 357.5847 19.1615 0.2288 56 +58 3 303.6462 357.6579 18.0536 0.259 57 +59 3 304.3143 358.2859 16.6068 0.2577 58 +60 3 305.273 358.7092 15.9995 0.2542 59 +61 3 306.3003 358.3855 15.4902 0.2746 60 +62 3 307.2201 357.7723 15.972 0.3216 61 +63 3 308.3194 357.5938 16.03 0.3518 62 +64 3 309.3719 357.9027 15.4003 0.3559 63 +65 3 310.27 358.5879 15.2365 0.3559 64 +66 3 311.2241 359.1908 15.6405 0.4007 65 +67 3 312.3452 359.3235 15.6626 0.4529 66 +68 3 313.3633 359.3281 14.45 0.4576 67 +69 3 314.4902 359.3155 14.0638 0.3872 68 +70 3 315.6227 359.2183 14.3315 0.275 69 +71 3 316.6146 358.6772 14.0784 0.1907 70 +72 3 297.6768 360.9823 21.0529 0.2519 16 +73 3 298.1767 360.1484 21.8341 0.2161 72 +74 3 298.8471 359.2503 21.56 0.2814 73 +75 3 299.5621 358.6211 20.615 0.3759 74 +76 3 300.0815 357.8238 20.72 0.2132 75 +77 3 300.292 357.1762 22.12 0.2339 76 +78 3 299.9568 356.1272 21.84 0.2542 77 +79 3 299.4386 355.2051 21.56 0.1682 78 +80 3 298.7739 355.0896 20.44 0.134 79 +81 3 298.0166 354.9249 20.144 0.1525 80 +82 3 297.3714 353.9856 20.16 0.1773 81 +83 3 296.8543 353.0487 20.16 0.2539 82 +84 3 296.296 352.6552 21.1915 0.2161 83 +85 3 295.9803 351.7892 22.2888 0.1689 84 +86 3 294.9953 351.6496 21.9878 0.2941 85 +87 3 294.31 350.8808 21.5746 0.2539 86 +88 3 294.0755 349.905 21.553 0.306 87 +89 3 294.1178 348.8777 21.5995 0.19 88 +90 3 293.8044 347.8172 21.9859 0.1909 89 +91 3 293.3216 347.2166 20.7444 0.2288 90 +92 3 292.88 346.2968 21.0288 0.2919 91 +93 3 292.0643 345.7408 21.4584 0.287 92 +94 3 291.5095 344.9286 21.9114 0.3051 93 +95 3 291.1274 344.3028 23.312 0.3181 94 +96 3 290.7224 343.3213 24.0131 0.2851 95 +97 3 290.0349 342.9987 22.4826 0.2796 96 +98 3 289.6368 342.072 22.5103 0.1907 97 +99 3 288.7639 341.8547 23.6482 0.1478 98 +100 3 288.5134 341.1408 22.7452 0.1144 99 +101 3 287.9894 340.7335 21.0946 0.1782 100 +102 3 287.5444 339.8401 21.1212 0.3741 101 +103 3 286.763 339.4969 22.6559 0.2734 102 +104 3 286.1144 338.7647 22.4328 0.2962 103 +105 3 285.1912 338.4993 21.5729 0.2551 104 +106 3 284.4579 337.6836 22.12 0.2834 105 +107 3 283.7726 337.0407 22.7903 0.2726 106 +108 3 283.029 336.4676 24.0041 0.3535 107 +109 3 282.2408 335.7526 23.9999 0.3137 108 +110 3 281.6459 335.0204 23.2201 0.2542 109 +111 3 281.1758 334.6051 21.6723 0.3279 110 +112 3 280.7239 333.8936 21.908 0.2878 111 +113 3 280.7204 333.2483 22.5652 0.178 112 +114 3 280.6106 331.9625 21.9254 0.2238 113 +115 3 280.2777 330.8974 21.8338 0.1859 114 +116 3 279.6336 329.9525 21.7932 0.1725 115 +117 3 279.4929 328.9766 21.4362 0.1713 116 +118 3 279.8762 327.9219 20.9927 0.178 117 +119 3 279.557 326.9964 20.8474 0.2002 118 +120 3 278.9838 326.04 20.7374 0.2394 119 +121 3 278.6063 324.9612 20.6027 0.2699 120 +122 3 278.318 323.8927 20.0052 0.2716 121 +123 3 277.9256 322.894 19.0859 0.242 122 +124 3 277.4726 321.933 19.4888 0.2288 123 +125 3 277.1031 320.9 19.395 0.2381 124 +126 3 276.8137 319.8567 18.5102 0.2604 125 +127 3 276.6444 318.7459 18.1843 0.2669 126 +128 3 276.6066 317.6705 18.996 0.2669 127 +129 3 276.5494 316.5757 18.625 0.2793 128 +130 3 276.2028 315.4889 18.4803 0.3048 129 +131 3 275.728 314.449 18.4696 0.3303 130 +132 3 275.259 313.4057 18.4229 0.3305 131 +133 3 274.528 312.5294 18.2322 0.3052 132 +134 3 273.9045 311.621 17.484 0.2668 133 +135 3 273.2902 310.691 17.3606 0.2264 134 +136 3 273.098 309.5881 17.365 0.2087 135 +137 3 272.6953 308.5791 17.3846 0.2034 136 +138 3 271.9505 307.7131 17.4605 0.2263 137 +139 3 271.2458 306.8345 17.8511 0.2724 138 +140 3 270.5903 305.9182 18.3238 0.3157 139 +141 3 269.9634 304.9675 18.482 0.3223 140 +142 3 269.3033 304.034 18.4895 0.2879 141 +143 3 268.6341 303.1097 18.5256 0.2646 142 +144 3 267.8436 302.2906 18.7183 0.2519 143 +145 3 267.0313 301.5218 19.1531 0.2441 144 +146 3 266.2122 300.737 18.8048 0.2542 145 +147 3 265.4572 299.8882 18.48 0.2542 146 +148 3 264.6541 299.0725 18.4803 0.2796 147 +149 3 263.8693 298.2408 18.4806 0.2669 148 +150 3 262.9278 296.9069 18.4859 0.3559 149 +151 3 262.2906 295.9562 18.5091 0.3559 150 +152 3 261.6111 295.0376 18.62 0.3305 151 +153 3 261.3651 294.6338 18.8754 0.3025 152 +154 3 260.9304 293.619 19.4855 0.3546 153 +155 3 260.6215 292.5185 19.6 0.394 154 +156 3 260.5586 291.3768 19.6 0.3813 155 +157 3 260.014 289.9205 19.6003 0.3112 156 +158 3 259.3448 288.995 19.6011 0.339 157 +159 3 258.7293 288.0317 19.605 0.3326 158 +160 3 258.369 286.9518 19.6297 0.309 159 +161 3 258.3507 285.8192 19.8562 0.2725 160 +162 3 258.5589 284.6993 19.7708 0.2447 161 +163 3 258.7442 283.5713 19.696 0.2191 162 +164 3 258.7316 282.4479 20.1611 0.2048 163 +165 3 258.6893 281.3245 20.678 0.1917 164 +166 3 258.8563 280.1953 20.722 0.214 165 +167 3 259.1972 279.1051 20.7326 0.2629 166 +168 3 259.4718 277.9954 20.8085 0.314 167 +169 3 259.3139 276.8892 21.3156 0.3418 168 +170 3 259.2235 275.7669 21.8182 0.3189 169 +171 3 259.1629 274.6252 21.845 0.3057 170 +172 3 258.814 273.5384 21.8708 0.2682 171 +173 3 258.3335 272.5019 22.0217 0.2544 172 +174 3 258.1482 271.4209 22.8038 0.2166 173 +175 3 257.4046 270.5606 23.0583 0.2161 174 +176 3 257.376 269.4589 23.7723 0.2169 175 +177 3 257.3989 268.3172 23.6776 0.2288 176 +178 3 257.3874 267.2041 23.1045 0.2288 177 +179 3 257.3188 266.0727 23.4097 0.2301 178 +180 3 257.0968 264.9618 23.3033 0.2442 179 +181 3 257.1723 263.8533 23.949 0.2722 180 +182 3 257.1106 262.7333 24.2225 0.3092 181 +183 3 256.7182 261.7003 24.6588 0.3283 182 +184 3 256.7685 260.5906 25.1857 0.3077 183 +185 3 256.5054 259.4786 25.2347 0.2504 184 +186 3 256.0947 258.4227 25.4514 0.1821 185 +187 3 255.6668 257.4057 25.9174 0.1493 186 +188 3 255.6074 256.2777 25.9837 0.1433 187 +189 3 255.7744 255.1967 26.7282 0.1525 188 +190 3 256.1485 254.1602 27.2308 0.1567 189 +191 3 256.4379 253.0734 27.1474 0.174 190 +192 3 256.4665 251.9363 27.3862 0.1996 191 +193 3 256.4493 250.7923 27.4484 0.2161 192 +194 3 256.6015 249.6746 27.4938 0.2113 193 +195 3 256.868 248.5843 27.7956 0.1936 194 +196 3 256.836 247.4758 28.4071 0.1882 195 +197 3 256.5386 246.4107 29.0318 0.2138 196 +198 3 256.1176 245.372 29.5506 0.2607 197 +199 3 255.7149 244.3058 29.766 0.3051 198 +200 3 255.303 243.2567 30.1381 0.3051 199 +201 3 254.9782 242.1848 30.6589 0.2826 200 +202 3 254.6853 241.0843 30.8904 0.2599 201 +203 3 254.397 239.9952 31.2897 0.2786 202 +204 3 254.365 238.8992 31.7878 0.3105 203 +205 3 254.564 237.7758 31.9194 0.3367 204 +206 3 254.6452 236.6387 31.9155 0.3308 205 +207 3 254.5835 235.497 31.885 0.293 206 +208 3 254.2243 234.4582 31.5837 0.2349 207 +209 3 254.1087 233.4812 30.8118 0.178 208 +210 3 254.5537 232.7788 32.1006 0.1652 209 +211 3 254.6944 231.755 32.4584 0.1652 210 +212 3 254.9107 230.651 32.0104 0.1652 211 +213 3 255.0411 229.5196 31.9483 0.1438 212 +214 3 255.0559 228.3859 32.2728 0.1281 213 +215 3 256.0421 227.9226 32.51 0.1271 214 +216 3 256.9424 227.7704 34.16 0.178 215 +217 3 261.2107 291.1674 23.0731 0.132 156 +218 3 261.3319 291.7349 25.429 0.1507 217 +219 3 261.3399 292.5185 27.4683 0.1652 218 +220 3 261.0516 292.6535 29.4815 0.1652 219 +221 3 260.2325 292.1364 30.6804 0.1578 220 +222 3 259.1698 291.9866 31.3396 0.1525 221 +223 3 258.0532 292.1456 31.5524 0.1525 222 +224 3 256.9538 292.0003 31.2376 0.1438 223 +225 3 255.8831 291.7978 31.7621 0.1309 224 +226 3 254.9965 292.1799 32.9613 0.1179 225 +227 3 254.2071 292.9223 33.7809 0.1144 226 +228 3 253.8307 293.8776 33.0526 0.1245 227 +229 3 253.9074 294.7356 31.2824 0.1478 228 +230 3 253.2175 295.3328 29.9491 0.1743 229 +231 3 252.1136 295.4414 29.9594 0.2016 230 +232 3 251.4512 295.0376 31.92 0.2288 231 +233 3 261.5584 294.532 16.9543 0.1308 152 +234 3 260.9761 294.4908 15.1875 0.1611 233 +235 3 259.9019 294.8809 15.218 0.178 234 +236 3 258.8769 295.271 15.7959 0.1683 235 +237 3 258.012 295.7366 17.2021 0.1421 236 +238 3 257.2696 296.4184 18.1712 0.1215 237 +239 3 256.3887 296.908 17.7859 0.1144 238 +240 3 256.0638 296.3543 16.7219 0.1144 239 +241 3 256.0901 295.2961 15.757 0.1144 240 +242 3 255.8979 294.2139 16.0994 0.1144 241 +243 3 255.6131 293.1431 16.7947 0.1144 242 +244 3 255.382 292.1215 17.8914 0.1244 243 +245 3 254.6132 291.434 18.7561 0.1374 244 +246 3 253.5539 291.0588 19.1251 0.1503 245 +247 3 252.6421 291.1388 17.7044 0.1415 246 +248 3 251.8459 291.5301 15.9541 0.1284 247 +249 3 251.5736 291.0393 13.6618 0.1147 248 +250 3 251.9088 290.004 12.88 0.1144 249 +251 3 263.0365 298.3815 16.9333 0.1207 149 +252 3 262.135 299.0222 16.2985 0.1144 251 +253 3 261.3262 299.8298 16.282 0.1144 252 +254 3 260.5757 300.6912 16.4343 0.1269 253 +255 3 259.7498 301.4371 17.0794 0.1398 254 +256 3 258.7431 301.778 16.214 0.1652 255 +257 3 257.8336 301.2198 15.2989 0.1652 256 +258 3 257.2444 300.5654 13.564 0.1619 257 +259 3 256.3578 300.4087 12.8741 0.1365 258 +260 3 255.5135 300.5757 14.7162 0.1233 259 +261 3 254.6041 300.7793 16.1795 0.1144 260 +262 3 253.7415 301.3616 17.075 0.1144 261 +263 3 253.2095 302.1521 17.3463 0.1144 262 +264 3 252.9842 302.2036 15.5907 0.1144 263 +265 3 252.7634 301.7597 13.638 0.1205 264 +266 3 251.8688 301.7849 12.1612 0.1337 265 +267 3 251.1 301.2369 12.2864 0.1483 266 +268 3 251.4089 300.9029 14.238 0.142 267 +269 3 251.9157 301.2003 16.6026 0.1286 268 +270 3 251.8173 302.2414 17.01 0.115 269 +271 3 251.4512 303.2744 16.24 0.1144 270 +272 3 279.9357 332.9074 22.2953 0.1951 113 +273 3 279.0079 333.3696 21.2652 0.1359 272 +274 3 278.5423 334.1624 19.686 0.1144 273 +275 3 278.3695 334.811 17.4812 0.1144 274 +276 3 278.2219 335.8178 16.4077 0.1144 275 +277 3 278.2757 336.9412 16.6925 0.1173 276 +278 3 278.1281 337.9959 17.7047 0.1303 277 +279 3 277.9691 339.0152 18.8966 0.1433 278 +280 3 277.7884 340.0757 19.5807 0.1525 279 +281 3 277.0997 340.7496 19.434 0.1525 280 +282 3 276.1044 340.8571 18.5035 0.1525 281 +283 3 275.4924 341.2426 16.3864 0.1462 282 +284 3 274.7716 341.3582 14.527 0.1326 283 +285 3 273.9663 341.8375 13.839 0.1189 284 +286 3 273.7077 342.8522 13.092 0.1144 285 +287 3 274.1756 343.7766 12.2651 0.1363 286 +288 3 274.7888 344.6872 12.88 0.1652 287 +289 3 299.9259 364.1718 19.7714 0.3256 12 +290 3 299.8024 363.1857 18.3994 0.2615 289 +291 3 300.1867 362.3208 17.1349 0.223 290 +292 3 300.7084 361.5806 15.4552 0.2161 291 +293 3 300.5585 360.5739 14.7638 0.2275 292 +294 3 299.617 360.0042 14.3074 0.2288 293 +295 3 298.7053 360.4664 13.1547 0.2163 294 +296 3 297.6917 360.9846 12.9111 0.2035 295 +297 3 296.5614 361.1459 13.0838 0.1907 296 +298 3 295.5204 360.9926 12.2881 0.2142 297 +299 3 294.7459 360.2159 12.3057 0.2714 298 +300 3 295.2927 359.4734 12.292 0.2542 299 +301 3 296.4047 359.4482 12.1187 0.2542 300 +302 3 296.8497 358.4003 12.1646 0.2669 301 +303 2 305.1826 383.232 22.9978 0.3252 1 +304 2 305.4286 384.3028 22.8676 0.3594 303 +305 2 305.3542 385.3575 23.898 0.3686 304 +306 2 305.0865 386.362 24.9337 0.3648 305 +307 2 304.6735 387.419 25.1149 0.3559 306 +308 2 304.3704 388.4772 24.5893 0.3398 307 +309 2 304.1621 389.5011 23.7555 0.2837 308 +310 2 304.6094 390.5399 23.4931 0.2424 309 +311 2 305.2958 391.4505 23.2809 0.2542 310 +312 2 305.6551 392.5178 23.7577 0.2288 311 +313 2 305.8598 393.5657 22.776 0.2282 312 +314 2 305.8427 394.5965 21.9346 0.2222 313 +315 2 306.258 395.6478 21.849 0.2288 314 +316 2 306.7121 396.69 21.8974 0.2352 315 +317 2 307.0999 397.7528 22.2233 0.2615 316 +318 2 307.5667 398.6863 21.7031 0.2938 317 +319 2 308.0163 399.2663 21.0885 0.3298 318 +320 2 308.4384 400.2009 21.0042 0.1924 319 +321 2 308.7679 400.9251 22.3936 0.2136 320 +322 2 309.1717 401.5989 23.984 0.2232 321 +323 2 309.6728 402.3082 25.5769 0.2074 322 +324 2 309.6808 403.0312 24.9942 0.1177 323 +325 2 310.1144 403.5437 24.855 0.2288 324 +326 2 309.7963 404.5504 24.4471 0.2628 325 +327 2 309.8501 405.4039 23.1179 0.1962 326 +328 2 309.9302 406.1703 22.1449 0.3121 327 +329 2 310.4336 407.081 22.12 0.2756 328 +330 2 310.7401 408.1186 22.3076 0.2059 329 +331 2 311.2298 409.0143 22.5123 0.2855 330 +332 2 311.8533 409.4422 20.8029 0.2437 331 +333 2 311.8407 410.2384 20.524 0.2288 332 +334 2 312.7639 410.3803 20.547 0.1144 333 +335 2 312.7696 410.8756 22.7214 0.1416 334 +336 2 313.0373 411.8514 23.52 0.206 335 +337 2 313.2924 412.9314 23.52 0.2539 336 +338 2 313.79 413.2586 22.4 0.178 337 +339 2 314.2271 414.0044 23.3374 0.1955 338 +340 2 314.1607 414.8888 22.4 0.2111 339 +341 2 314.7453 415.7754 21.8711 0.2939 340 +342 2 315.3928 416.4961 21.9904 0.3108 341 +343 2 315.744 417.3472 22.09 0.1484 342 +344 2 316.3869 418.2064 22.3728 0.2844 343 +345 2 316.8743 418.9957 21.7048 0.1824 344 +346 2 316.6947 419.7496 20.4067 0.1816 345 +347 2 317.0596 420.5802 19.1148 0.1398 346 +348 2 317.9874 420.8868 19.88 0.2893 347 +349 2 318.5262 421.5972 19.068 0.2288 348 +350 2 318.8683 422.5444 20.1505 0.3794 349 +351 2 319.2687 423.2548 18.6455 0.2754 350 +352 2 319.7526 423.8806 16.8291 0.1406 351 +353 2 320.0031 424.9411 17.1741 0.2503 352 +354 2 320.6335 425.4628 18.6519 0.15 353 +355 2 320.9995 426.2521 19.6 0.1205 354 +356 2 321.4102 427.0266 20.8057 0.2266 355 +357 2 321.8072 427.7016 20.4691 0.376 356 +358 2 321.845 428.6694 19.7954 0.3971 357 +359 2 322.1767 429.4576 20.5691 0.1525 358 +360 2 322.9512 430.0307 21.2783 0.1781 359 +361 2 323.18 431.1027 20.7068 0.2507 360 +362 2 322.9523 431.7204 19.0282 0.1899 361 +363 2 323.1125 432.7283 18.6379 0.1828 362 +364 2 323.752 433.3346 18.7911 0.4068 363 +365 2 323.752 433.759 19.32 0.2355 364 +366 2 324.2096 434.72 19.32 0.2669 365 +367 2 324.1295 433.8048 17.1441 0.3559 364 +368 2 324.5334 434.7658 17.36 0.3465 367 +369 2 325.1111 435.6466 17.3594 0.1908 368 +370 2 325.2209 436.7346 16.7524 0.1622 369 +371 2 325.6053 437.7996 16.6782 0.2207 370 +372 2 325.992 438.5078 15.96 0.2009 371 +373 2 326.6189 439.2754 16.5161 0.2028 372 +374 2 327.5283 439.4527 16.1672 0.3288 373 +375 2 328.4756 439.7456 16.5374 0.1663 374 +376 2 329.1231 440.4949 17.0103 0.3163 375 +377 2 329.7191 440.9354 17.5314 0.3373 376 +378 2 330.5496 441.3266 17.5174 0.2636 377 +379 2 331.4797 441.0189 17.08 0.3369 378 +380 2 332.4178 441.0738 17.1259 0.2575 379 +381 2 332.9132 441.3861 16.7807 0.3335 380 +382 2 333.8512 441.7934 17.2357 0.2132 381 +383 2 334.6864 442.4042 17.4264 0.1817 382 +384 2 335.5913 442.7383 16.8221 0.2989 383 +385 2 336.1953 442.8802 15.059 0.2078 384 +386 2 336.9778 443.5299 14.3959 0.2288 385 +387 2 337.8026 443.6249 15.3437 0.3432 386 +388 2 338.4776 444.4509 15.9034 0.2161 387 +389 2 338.624 445.3478 15.9034 0.1144 388 +390 2 338.8528 446.0456 14.84 0.2161 389 +391 2 339.2498 447.0306 15.54 0.1461 390 +392 2 339.5312 447.5557 13.3473 0.211 391 +393 2 340.0002 448.2169 13.9244 0.1421 392 +394 2 339.9728 449.1927 14.051 0.1424 393 +395 2 339.6628 450.0656 12.934 0.3336 394 +396 2 340.3892 450.6822 13.7334 0.2288 395 +397 2 341.023 451.5231 13.4697 0.1271 396 +398 2 341.7117 451.9967 13.4613 0.174 397 +399 2 342.485 452.5481 13.5663 0.169 398 +400 2 342.6486 453.1201 12.1834 0.1732 399 +401 2 343.3247 453.7104 12.0081 0.1841 400 +402 2 343.8567 454.3922 13.0046 0.1865 401 +403 2 344.4229 454.6256 14.1635 0.1285 402 +404 2 344.94 455.0546 12.7854 0.247 403 +405 2 345.6024 455.4264 11.76 0.2924 404 +406 3 301.5847 384.1975 25.1188 0.266 1 +407 3 300.9715 385.1219 24.5062 0.2776 406 +408 3 300.0792 385.7717 24.9561 0.2796 407 +409 3 299.601 385.8712 24.8889 0.3178 408 +410 3 299.1022 386.0954 26.0089 0.2034 409 +411 3 298.4959 386.4432 28.1512 0.2161 410 +412 3 297.8358 387.1536 28.3161 0.2895 411 +413 3 297.1563 387.7554 26.7473 0.1968 412 +414 3 296.2708 388.054 26.32 0.3147 413 +415 3 295.4426 388.1192 27.5495 0.3085 414 +416 3 294.6624 388.2358 28.6437 0.1937 415 +417 3 293.6396 388.65 28.9167 0.1824 416 +418 3 292.5494 388.9325 28.5172 0.2393 417 +419 3 291.45 389.071 27.832 0.1925 418 +420 3 290.3094 389.079 27.9558 0.1907 419 +421 3 289.2867 389.1007 26.7179 0.2156 420 +422 3 288.1667 389.238 26.2828 0.279 421 +423 3 287.2012 389.8466 26.124 0.3178 422 +424 3 285.9725 390.6634 26.2811 0.252 423 +425 3 285.0001 391.1222 27.2227 0.3034 424 +426 3 283.8813 391.3269 27.4739 0.3299 425 +427 3 282.7579 391.1416 27.6842 0.3305 426 +428 3 281.6963 390.9128 28.5636 0.3178 427 +429 3 280.6163 390.9254 29.4868 0.2796 428 +430 3 279.597 391.0398 30.196 0.3037 429 +431 3 278.9129 391.6392 28.6348 0.2957 430 +432 3 278.0858 392.2936 27.7707 0.2836 431 +433 3 277.1981 392.9571 28.1789 0.2615 432 +434 3 276.3172 393.6641 28.5155 0.2633 433 +435 3 275.4191 394.3723 28.5597 0.2577 434 +436 3 274.4902 395.0381 28.5578 0.2542 435 +437 3 273.5396 395.6753 28.5491 0.2635 436 +438 3 272.5157 396.1786 28.4962 0.2669 437 +439 3 271.4151 396.3663 28.0876 0.2479 438 +440 3 270.6224 396.3525 26.2741 0.2122 439 +441 3 269.6477 396.0951 25.2118 0.2034 440 +442 3 268.5243 396.0036 24.8928 0.2034 441 +443 3 267.4134 396.2233 24.6056 0.225 442 +444 3 266.417 396.1512 23.3486 0.2515 443 +445 3 266.2786 395.2142 22.104 0.3019 444 +446 3 265.5167 394.5473 20.9006 0.3051 445 +447 3 264.7662 393.6939 20.7833 0.2663 446 +448 3 263.9723 392.8851 21.0798 0.2611 447 +449 3 263.0525 392.4366 20.6038 0.2818 448 +450 3 262.0183 392.543 20.5906 0.2924 449 +451 3 260.9647 392.4046 21.2766 0.267 450 +452 3 260.0506 391.8475 20.7978 0.2365 451 +453 3 259.4089 391.2011 19.1794 0.2195 452 +454 3 258.5863 390.5296 18.559 0.2256 453 +455 3 257.7066 389.8066 18.7202 0.219 454 +456 3 256.645 389.6384 18.3042 0.2059 455 +457 3 255.6668 390.0216 17.3244 0.1929 456 +458 3 255.0079 390.7035 15.8211 0.1907 457 +459 3 254.0561 391.0901 14.7022 0.1907 458 +460 3 252.9807 391.3727 14.478 0.1907 459 +461 3 251.9111 391.7022 14.1028 0.1821 460 +462 3 250.9181 392.1678 13.3364 0.1691 461 +463 3 249.9766 392.7787 12.8573 0.1563 462 +464 3 248.971 393.3072 12.6571 0.1525 463 +465 3 248.0707 393.9902 12.8103 0.1525 464 +466 3 247.5399 394.974 12.8797 0.1718 465 +467 3 247.652 396.0734 12.8789 0.2074 466 +468 3 247.7172 397.2094 12.8719 0.2458 467 +469 3 247.9586 398.3202 12.8086 0.2437 468 +470 3 248.9413 398.6977 12.6235 0.2086 469 +471 3 250.0704 398.7469 12.9685 0.1694 470 +472 3 251.1606 398.4941 13.4901 0.1538 471 +473 3 252.2577 398.263 13.0374 0.1525 472 +474 3 253.3868 398.3522 12.7434 0.1408 473 +475 3 254.4977 398.2241 12.185 0.1398 474 +476 3 255.112 397.3112 12.88 0.1525 475 +477 3 279.4495 390.8934 30.7238 0.2453 429 +478 3 278.5423 390.9094 30.9336 0.2048 477 +479 3 277.7758 391.1279 31.9984 0.1731 478 +480 3 276.7862 390.7996 31.8228 0.2484 479 +481 3 276.0014 390.4975 30.2618 0.1945 480 +482 3 275.4054 390.2493 28.856 0.2183 481 +483 3 274.7327 389.7528 27.2588 0.1832 482 +484 3 273.8416 389.4496 27.2994 0.2605 483 +485 3 273.9308 389.1671 29.3796 0.2519 484 +486 3 273.8862 389.1682 31.8548 0.3621 485 +487 3 272.9996 389.0744 32.9714 0.2619 486 +488 3 272.1942 389.532 32.3515 0.1144 487 +489 3 271.5925 390.056 31.2754 0.2542 488 +490 3 270.6658 390.0571 32.4526 0.2258 489 +491 3 269.7438 390.2356 33.3948 0.13 490 +492 3 268.7794 390.5765 34.44 0.264 491 +493 3 268.0106 390.2115 33.6622 0.2739 492 +494 3 267.2922 389.4576 34.1312 0.1271 493 +495 3 266.3518 389.0675 33.5334 0.2814 494 +496 3 265.368 388.6134 34.3104 0.2591 495 +497 3 264.5237 388.1603 33.99 0.2398 496 +498 3 263.6245 388.1661 35.3114 0.2223 497 +499 3 262.7654 387.9098 35.56 0.1689 498 +500 3 262.2048 387.816 36.0805 0.3432 499 +501 3 261.6031 388.3194 35.567 0.2444 500 +502 3 260.6593 388.8033 36.3129 0.2542 501 +503 3 259.6308 388.8559 36.7486 0.2696 502 +504 3 258.7453 388.7049 37.9579 0.2078 503 +505 3 257.8519 388.3297 37.3388 0.2045 504 +506 3 256.8028 388.1626 37.2663 0.1459 505 +507 3 255.8888 388.1214 38.355 0.125 506 +508 3 254.9164 387.5586 38.3541 0.2542 507 +509 3 253.8158 387.3309 38.5255 0.2542 508 +510 3 252.9373 386.9992 38.5213 0.2415 509 +511 3 252.3858 386.553 39.2498 0.1945 510 +512 3 251.839 385.7476 38.9091 0.2392 511 +513 3 250.989 385.3587 39.2 0.2725 512 +514 3 250.0029 385.5131 39.508 0.2288 513 +515 3 249.2639 385.2557 38.6526 0.2875 514 +516 3 248.1805 385.0784 39.1978 0.1816 515 +517 3 247.1132 384.8565 39.4895 0.1269 516 +518 3 246.1877 385.2168 39.7379 0.1789 517 +519 3 245.2336 384.9285 40.0249 0.235 518 +520 3 244.1765 384.7661 40.1657 0.1906 519 +521 3 243.0748 384.6208 39.7701 0.202 520 +522 3 242.004 384.6837 40.1551 0.2161 521 +523 3 240.9378 384.3474 40.46 0.1808 522 +524 3 239.9826 384.0545 40.2576 0.2161 523 +525 3 239.0079 383.5981 40.6 0.1604 524 +526 3 238.0595 382.9883 40.9763 0.1652 525 +527 3 237.1638 382.2951 41.2821 0.1568 526 +528 3 236.1628 381.7883 41.2378 0.1525 527 +529 3 235.4649 380.9348 41.4308 0.1645 528 +530 3 234.79 380.3674 41.44 0.2415 529 +531 3 234.0349 379.5941 41.8566 0.1415 530 +532 3 233.1529 378.9248 41.7665 0.2098 531 +533 3 232.137 378.4455 41.72 0.2134 532 +534 3 231.0972 378.0359 41.4546 0.2728 533 +535 3 230.087 377.5486 41.274 0.2541 534 +536 3 229.0997 377.0773 41.72 0.2034 535 +537 3 228.3195 376.3302 41.804 0.1144 536 +538 3 227.2865 375.8887 41.8964 0.1144 537 +539 3 226.1562 375.804 42.0006 0.1146 538 +540 3 225.0545 375.7319 42.408 0.1452 539 +541 3 223.9998 375.6896 42.0014 0.3295 540 +542 3 223.088 375.6747 42.2831 0.2534 541 +543 3 222.0412 375.28 42.8243 0.1151 542 +544 3 220.9922 374.8259 42.84 0.1144 543 +545 3 219.8562 374.7744 42.84 0.1144 544 +546 3 218.7122 374.7744 42.84 0.1144 545 +547 3 217.6014 374.676 42.84 0.1144 546 +548 3 217.1472 373.8157 43.2247 0.2288 547 +549 3 216.788 373.5103 44.518 0.2288 548 +550 3 216.0021 373.1945 43.96 0.2309 549 +551 3 215.2928 372.4235 43.1281 0.2147 550 +552 3 214.4531 371.6833 42.8305 0.2083 551 +553 3 213.396 371.4637 43.3462 0.3256 552 +554 3 212.3722 371.1228 44.032 0.3686 553 +555 3 211.4444 371.379 44.1913 0.4129 554 +556 3 210.3862 371.1662 43.4162 0.1591 555 +557 3 209.3612 370.7635 43.4 0.1144 556 +558 3 208.7674 370.0977 44.52 0.178 557 +559 3 208.4368 369.2249 43.7898 0.2497 558 +560 3 207.6829 368.7798 43.5193 0.3636 559 +561 3 206.6396 368.622 43.3784 0.3898 560 +562 3 205.5871 368.4641 42.9618 0.3296 561 +563 3 204.6639 368.2387 42.0204 0.3217 562 +564 3 203.7944 367.9298 41.72 0.3305 563 +565 3 202.734 367.9104 42.142 0.384 564 +566 3 201.6586 367.8269 41.4999 0.2598 565 +567 3 200.7846 368.193 40.88 0.2663 566 +568 3 199.9415 367.7949 41.6248 0.2775 567 +569 3 199.1704 367.224 41.16 0.2669 568 +570 3 287.2115 390.1829 25.6178 0.2688 423 +571 3 287.2481 391.1565 24.1534 0.1433 570 +572 3 287.3385 392.1186 22.6792 0.1828 571 +573 3 287.1875 393.0075 20.9756 0.2215 572 +574 3 287.3877 393.8197 19.1523 0.2448 573 +575 3 287.978 394.203 17.3737 0.188 574 +576 3 287.9013 393.5371 15.2382 0.1738 575 +577 3 287.4414 392.6288 14.187 0.1697 576 +578 3 286.7058 391.7571 13.9997 0.1735 577 +579 3 285.8135 391.1931 13.9983 0.1699 578 +580 3 284.6867 391.0547 13.9882 0.1727 579 +581 3 283.815 390.4472 13.9205 0.1652 580 +582 3 283.4146 389.4016 14.0134 0.1531 581 +583 3 282.9638 388.5413 14.996 0.1398 582 +584 3 282.3609 387.8046 16.483 0.1465 583 +585 3 281.6688 386.9992 17.1492 0.1663 584 +586 3 280.7376 386.6194 16.4133 0.178 585 +587 3 280.2411 385.9044 15.8567 0.1697 586 +588 3 279.5925 385.0681 15.4342 0.1652 587 +589 3 278.6738 384.6563 16.4245 0.1763 588 +590 3 278.8031 384.1209 18.6477 0.178 589 +591 3 278.9198 383.0901 19.6624 0.1544 590 +592 3 279.033 382.0022 20.477 0.1286 591 +593 3 279.5536 381.1865 21.9338 0.1149 592 +594 3 280.248 380.3972 23.0336 0.1144 593 +595 3 281.1952 379.9224 24.08 0.1271 594 +596 3 299.696 386.1835 25.3509 0.3103 409 +597 3 299.9831 387.1319 26.752 0.2875 596 +598 3 300.2714 388.0791 28.1529 0.2647 597 +599 3 300.5425 388.6054 27.4324 0.1144 598 +600 3 300.9624 389.524 27.6203 0.3407 599 +601 3 301.6087 390.1395 28.4374 0.1485 600 +602 3 301.3285 390.8613 27.0418 0.223 601 +603 3 301.0585 391.7571 27.5248 0.268 602 +604 3 300.848 392.8645 27.8715 0.1875 603 +605 3 300.594 393.925 28.289 0.1234 604 +606 3 300.3023 394.6823 29.4 0.1972 605 +607 3 300.3057 395.7085 28.5732 0.2433 606 +608 3 300.1856 396.8376 28.5625 0.2789 607 +609 3 299.9808 397.9335 28.1716 0.2464 608 +610 3 299.704 398.5971 26.88 0.1144 609 +611 3 299.9991 399.5134 27.5587 0.1808 610 +612 3 300.2417 400.4343 28.6289 0.1144 611 +613 3 299.6422 401.1836 29.6425 0.2635 612 +614 3 299.5118 402.0256 31.2648 0.3303 613 +615 3 299.855 402.99 30.5864 0.2415 614 +616 3 299.9728 403.9144 30.87 0.307 615 +617 3 299.9568 404.6522 32.48 0.1268 616 +618 3 299.9362 405.7768 32.3028 0.1144 617 +619 3 299.3688 406.263 30.5458 0.1144 618 +620 3 299.0016 406.9208 31.5487 0.24 619 +621 3 298.0989 406.9757 31.8665 0.236 620 +622 3 297.2993 407.1645 32.6116 0.2123 621 +623 3 296.868 407.6873 32.9731 0.3432 622 +624 3 296.2994 407.9115 32.0695 0.3178 623 +625 3 295.4849 408.5018 31.3928 0.3167 624 +626 3 295.0971 408.8656 33.0562 0.2288 625 +627 3 295.3042 408.7009 35.5289 0.3051 626 +628 3 295.1463 407.4013 34.72 0.2931 627 +629 3 295.0365 406.4392 34.2241 0.2539 628 +630 3 295.6004 406.2573 36.6134 0.2542 629 +631 3 296.1255 406.112 38.8612 0.2488 630 +632 3 295.1863 406.4117 38.332 0.2931 631 +633 3 294.564 407.0958 37.6662 0.3342 632 +634 3 293.6865 407.7205 37.828 0.4068 633 +635 3 293.6648 407.9024 40.3287 0.2653 634 +636 3 293.0493 408.4412 41.097 0.2386 635 +637 3 292.7874 409.4296 41.44 0.1907 636 +638 3 293.2324 410.1869 41.6993 0.305 637 +639 3 293.4646 410.8447 42.0742 0.3589 638 +640 3 293.5687 411.8457 42.7207 0.2804 639 +641 3 293.436 412.7987 42.9685 0.2103 640 +642 3 293.9016 413.3135 44.8232 0.36 641 +643 3 293.889 414.0228 45.7422 0.293 642 +644 3 293.8501 415.0604 45.6753 0.4261 643 +645 3 293.3937 416.0602 46.1387 0.4676 644 +646 3 293.0242 417.1299 46.2 0.3605 645 +647 3 292.9784 418.1228 45.9802 0.5101 646 +648 3 293.2072 418.9866 46.1664 0.2702 647 +649 3 293.0287 419.9624 46.2552 0.2288 648 +650 3 292.3721 420.094 48.16 0.4438 649 +651 3 291.6056 419.8652 49.0 0.3704 650 +652 3 291.3265 418.9683 49.628 0.4449 651 +653 3 290.6904 418.9763 51.2089 0.178 652 +654 3 290.8117 419.8549 50.4851 0.2786 653 +655 3 290.7476 420.571 51.7454 0.3892 654 +656 3 290.2408 421.4061 52.8763 0.2644 655 +657 3 290.3426 422.446 52.8864 0.3456 656 +658 3 290.576 423.5042 53.48 0.3228 657 +659 3 290.3278 424.3474 53.9879 0.2611 658 +660 3 290.528 425.2168 52.9836 0.2034 659 +661 3 290.9192 425.3907 54.985 0.237 660 +662 3 291.0919 425.8162 56.3242 0.3432 661 +663 3 291.8699 426.3208 56.3749 0.1574 662 +664 3 292.0449 427.2565 57.4 0.2137 663 +665 3 292.5116 427.1993 58.3377 0.1731 664 +666 3 292.737 427.967 59.7498 0.2415 665 +667 3 293.6431 428.476 60.6522 0.366 666 +668 3 293.6923 429.4736 60.5377 0.2927 667 +669 3 294.1201 430.2916 61.9864 0.2131 668 +670 3 294.4988 431.2686 62.72 0.2034 669 +671 3 294.8809 432.2913 63.212 0.1734 670 +672 3 294.9232 433.3781 63.84 0.1144 671 +673 3 295.4609 434.2292 63.5986 0.1255 672 +674 3 295.2206 435.1936 62.9821 0.2897 673 +675 3 294.8637 436.2106 63.56 0.3375 674 +676 3 294.2608 436.6648 64.0494 0.2347 675 +677 3 294.3581 437.0172 66.1256 0.2266 676 +678 3 293.6431 437.7219 66.6543 0.1398 677 +679 3 293.0939 437.8088 64.5411 0.2034 678 +680 3 292.5208 438.2538 65.8417 0.1875 679 +681 3 291.9488 438.5112 66.915 0.2115 680 +682 3 291.6033 438.9082 68.3133 0.1952 681 +683 3 290.8345 439.4802 68.3544 0.1257 682 +684 3 290.0109 440.1311 68.32 0.2802 683 +685 3 289.7752 441.1744 68.7425 0.275 684 +686 3 289.5235 442.1926 69.6147 0.1144 685 +687 3 289.1815 442.9785 67.9496 0.1144 686 +688 3 288.5912 443.8056 67.0709 0.1144 687 +689 3 288.0638 444.706 67.405 0.1144 688 +690 3 287.565 445.6463 67.8146 0.1731 689 +691 3 287.3476 446.6942 68.1652 0.2118 690 +692 3 286.4507 446.748 69.6704 0.1948 691 +693 3 286.2883 447.6358 69.991 0.2389 692 +694 3 286.0 448.3302 68.5292 0.1271 693 +695 3 285.9851 449.0463 66.6526 0.1473 694 +696 3 285.5424 448.9216 68.5896 0.3173 695 +697 3 285.3113 449.314 70.56 0.3201 696 +698 3 284.7416 450.2784 70.28 0.3305 697 +699 3 294.1464 409.4937 35.1772 0.2682 627 +700 3 293.2072 410.1354 34.8916 0.2382 699 +701 3 292.268 410.7784 34.6063 0.2082 700 +702 3 291.6571 410.7235 34.7637 0.2034 701 +703 3 290.8162 410.5816 35.9296 0.2966 702 +704 3 290.6298 410.2384 37.602 0.3097 703 +705 3 289.7821 410.8287 38.08 0.3302 704 +706 3 288.892 411.4968 37.9756 0.1663 705 +707 3 288.0867 411.1891 37.0972 0.139 706 +708 3 287.033 411.4373 37.5164 0.1403 707 +709 3 286.2997 411.165 38.871 0.3051 708 +710 3 285.4177 411.1536 38.4384 0.1144 709 +711 3 284.7851 411.7302 38.2794 0.1939 710 +712 3 284.0289 412.1924 38.9096 0.2076 711 +713 3 283.3905 412.9348 38.0534 0.2924 712 +714 3 282.8323 413.4256 37.52 0.2537 713 +715 3 282.5188 414.366 36.9275 0.2004 714 +716 3 282.576 415.3624 37.2686 0.1548 715 +717 3 281.9949 415.9584 38.9211 0.1144 716 +718 3 280.8966 416.0728 39.2 0.1144 717 +719 3 279.7526 416.0728 39.2 0.1322 718 +720 3 278.8214 416.0728 40.3066 0.2614 719 +721 3 277.8913 416.3405 39.485 0.299 720 +722 3 277.11 415.7296 39.6396 0.3594 721 +723 3 276.0197 415.5111 40.2094 0.3213 722 +724 3 274.9673 415.8348 40.171 0.2834 723 +725 3 274.2271 415.836 38.8486 0.3212 724 +726 3 273.4995 416.297 38.08 0.1902 725 +727 3 272.4116 416.6219 38.08 0.1576 726 +728 3 271.3465 416.8736 38.187 0.1144 727 +729 3 270.4874 416.8736 39.9459 0.1155 728 +730 3 269.8341 417.3312 41.16 0.1144 729 +731 3 268.7107 417.3312 41.5554 0.1515 730 +732 3 267.736 417.4078 42.8954 0.1773 731 +733 3 267.0279 416.8644 43.1659 0.2288 732 +734 3 266.2706 416.8725 41.7393 0.1938 733 +735 3 265.8359 417.4124 40.4373 0.4306 734 +736 3 264.8005 417.7625 40.6266 0.2631 735 +737 3 263.986 418.084 40.0389 0.2288 736 +738 3 263.0685 418.2807 38.9225 0.1271 737 +739 3 262.6944 418.942 40.5563 0.24 738 +740 3 262.5423 419.8789 41.3003 0.2861 739 +741 3 262.0973 420.706 41.44 0.2558 740 +742 3 262.2883 421.5388 42.0403 0.2691 741 +743 3 262.0435 422.2447 40.3976 0.1467 742 +744 3 261.9794 422.9196 38.64 0.1144 743 +745 3 261.7461 423.8303 37.7292 0.133 744 +746 3 261.1054 424.6162 36.7794 0.1772 745 +747 3 260.9052 425.6607 36.7069 0.3132 746 +748 3 260.5929 426.5965 36.1645 0.2106 747 +749 3 260.1456 427.6135 36.12 0.1445 748 +750 3 259.8516 428.5733 35.7227 0.1722 749 +751 3 259.3677 429.2139 35.7098 0.2847 750 +752 3 259.2327 430.3133 36.12 0.3411 751 +753 3 259.8459 431.0649 36.6016 0.2375 752 +754 3 260.0712 431.9138 38.2928 0.1518 753 +755 3 260.1387 431.6941 40.329 0.1144 754 +756 3 260.26 432.0739 42.3195 0.1907 755 +757 3 260.7256 433.0292 42.2408 0.1907 756 +758 3 261.38 433.9009 42.28 0.2241 757 +759 3 261.0688 434.6022 42.8389 0.3056 758 +760 3 260.8892 435.5219 43.7461 0.2771 759 +761 3 260.8457 436.4577 44.1017 0.1178 760 +762 3 261.6328 437.0469 44.1913 0.2542 761 +763 3 261.6408 438.0101 42.7336 0.2433 762 +764 3 262.2048 438.724 41.44 0.178 763 +765 3 304.9355 375.1977 30.2879 0.3278 1 +766 3 304.9984 374.1532 31.3407 0.3083 765 +767 3 305.0442 373.047 32.018 0.294 766 +768 3 305.3347 371.9785 32.6869 0.2924 767 +769 3 306.0303 371.0861 32.753 0.2693 768 +770 3 306.6778 370.2556 31.7075 0.2552 769 +771 3 307.116 369.2821 30.7244 0.3017 770 +772 3 307.9945 368.5922 30.2492 0.368 771 +773 3 309.1088 368.4847 30.8 0.394 772 +774 3 309.9565 368.4916 30.8 0.3645 773 +775 3 311.0982 368.5499 30.8006 0.3567 774 +776 3 312.1839 368.9022 30.8025 0.3197 775 +777 3 313.0785 369.6104 30.8106 0.3299 776 +778 3 314.0738 370.1721 30.856 0.3797 777 +779 3 315.18 369.9536 31.1878 0.4066 778 +780 3 316.2451 369.6275 31.8214 0.394 779 +781 3 317.1706 369.3896 31.6772 0.3726 780 +782 3 318.2482 369.1345 31.0097 0.3686 781 +783 3 319.3785 369.1299 30.8162 0.326 782 +784 3 320.3292 369.7145 30.8193 0.2639 783 +785 3 321.0693 370.5794 30.9002 0.2001 784 +786 3 321.9239 371.3081 31.362 0.1685 785 +787 3 322.9432 371.7176 30.7787 0.1882 786 +788 3 323.903 371.903 29.349 0.2542 787 +789 3 325.1671 371.7211 28.2125 0.2892 788 +790 3 326.2722 371.8469 27.8522 0.2696 789 +791 3 327.3705 371.9613 28.2954 0.2415 790 +792 3 328.4859 371.7474 28.4099 0.2529 791 +793 3 329.5933 371.6536 27.8642 0.2989 792 +794 3 330.6503 371.514 26.9097 0.3472 793 +795 3 331.7348 371.2646 26.6641 0.3518 794 +796 3 332.8434 371.0884 27.1762 0.3345 795 +797 3 333.9599 370.9626 27.3795 0.3178 796 +798 3 335.0822 371.0953 27.0542 0.3226 797 +799 3 336.1861 371.1216 26.4715 0.3355 798 +800 3 337.3038 370.9226 26.1551 0.3328 799 +801 3 338.4192 370.9054 26.2452 0.3123 800 +802 3 339.4683 371.2978 26.5978 0.2876 801 +803 3 340.4578 371.7348 26.1926 0.2607 802 +804 3 341.3559 372.2713 25.8188 0.2353 803 +805 3 342.1555 373.0538 25.6956 0.2096 804 +806 3 342.9163 373.8672 25.0858 0.21 805 +807 3 343.6198 374.652 24.1058 0.2366 806 +808 3 344.4893 375.2503 23.2224 0.286 807 +809 3 345.5441 375.6461 22.9561 0.3352 808 +810 3 346.6709 375.7548 22.932 0.3735 809 +811 3 347.7863 375.5546 22.7942 0.3999 810 +812 3 348.8411 375.216 22.2068 0.3948 811 +813 3 349.8764 374.9357 21.2456 0.3482 812 +814 3 350.9678 374.7103 20.7687 0.2889 813 +815 3 352.0797 374.7813 20.7197 0.2744 814 +816 3 353.0281 375.3636 20.7183 0.3106 815 +817 3 353.8552 376.1529 20.7136 0.3305 816 +818 3 354.68 376.9457 20.694 0.2994 817 +819 3 355.5609 377.6722 20.601 0.2406 818 +820 3 356.5791 378.0748 20.1124 0.2082 819 +821 3 357.6258 378.4672 20.0402 0.2288 820 +822 3 358.4747 379.188 20.4714 0.2768 821 +823 3 359.2778 379.9796 20.3031 0.3104 822 +824 3 360.1815 380.3674 19.1052 0.3087 823 +825 3 361.2523 380.3285 18.4184 0.2636 824 +826 3 362.3734 380.1718 18.1129 0.2508 825 +827 3 363.4671 380.0654 17.5246 0.238 826 +828 3 364.5825 380.1146 17.3424 0.2177 827 +829 3 365.6727 379.7771 17.2281 0.183 828 +830 3 366.6142 379.2314 16.7706 0.1611 829 +831 3 367.4105 378.4993 16.2392 0.1614 830 +832 3 368.4767 378.3174 16.235 0.1924 831 +833 3 369.5829 378.6114 16.2044 0.2259 832 +834 3 370.6171 379.0324 15.9354 0.2313 833 +835 3 371.6318 379.4007 15.6229 0.1997 834 +836 3 372.7289 379.2337 15.9883 0.1722 835 +837 3 373.683 378.7109 16.7238 0.1713 836 +838 3 374.652 378.1904 17.2309 0.1905 837 +839 3 375.7685 378.0337 17.3594 0.2102 838 +840 3 376.7764 378.4386 17.3552 0.2306 839 +841 3 377.7168 379.0873 17.3337 0.2488 840 +842 3 378.7727 379.4705 17.1931 0.2542 841 +843 3 379.8618 379.4133 16.6001 0.2624 842 +844 3 380.9749 379.3996 16.5245 0.2843 843 +845 3 382.08 379.2246 16.3531 0.328 844 +846 3 383.2091 379.1205 16.24 0.3522 845 +847 3 384.3497 379.1971 16.24 0.3653 846 +848 3 385.3861 379.0781 15.2995 0.2233 847 +849 3 386.3425 378.7784 15.12 0.1146 848 +850 3 387.4842 378.759 15.2163 0.1403 849 +851 3 388.4612 378.8276 15.68 0.1859 850 +852 3 389.5858 378.8928 16.0115 0.1328 851 +853 3 390.4758 378.7509 15.4241 0.1438 852 +854 3 391.3292 378.8505 15.4104 0.2302 853 +855 3 391.8314 378.4421 14.0403 0.2428 854 +856 3 392.7421 378.092 14.7252 0.1468 855 +857 3 393.4491 378.6125 13.72 0.1144 856 +858 3 394.5667 378.7406 13.72 0.1144 857 +859 3 395.5963 379.0072 13.8774 0.1144 858 +860 3 396.7049 378.918 13.44 0.1144 859 +861 3 397.8374 378.7921 13.44 0.1481 860 +862 3 398.8327 378.4798 13.9776 0.1455 861 +863 3 399.5695 377.6619 13.9605 0.1497 862 +864 3 400.3234 377.1894 13.4246 0.2267 863 +865 3 401.083 376.7741 13.7911 0.2342 864 +866 3 401.9753 376.2639 13.7155 0.2288 865 +867 3 402.863 376.0271 13.7511 0.1944 866 +868 3 403.6432 375.6095 14.0017 0.1144 867 +869 3 404.4063 375.3567 13.9342 0.1708 868 +870 3 405.2803 375.693 13.16 0.1564 869 +871 3 406.1486 376.2261 12.5938 0.1296 870 +872 3 407.0123 375.6473 12.3544 0.1773 871 +873 3 407.8406 375.0879 12.7042 0.1951 872 +874 3 408.6162 375.5088 13.0488 0.131 873 +875 3 409.5108 376.2055 12.8391 0.157 874 +876 3 410.5347 376.5442 12.8391 0.1849 875 +877 3 411.4716 375.9504 12.8391 0.1556 876 +878 3 412.118 375.0089 12.8391 0.1467 877 +879 3 412.746 374.0525 12.8391 0.1398 878 +880 3 323.609 371.6993 28.1929 0.2288 788 +881 3 324.4384 371.8618 28.9036 0.2288 880 +882 3 324.5608 372.7186 30.4763 0.1271 881 +883 3 324.896 373.7048 31.451 0.2412 882 +884 3 325.7151 374.1795 31.2404 0.2091 883 +885 3 326.4107 375.0261 30.8311 0.2653 884 +886 3 327.3281 375.5088 30.9173 0.3157 885 +887 3 328.0191 376.2913 30.5701 0.3187 886 +888 3 328.5557 377.0887 31.3734 0.1945 887 +889 3 328.5568 378.0783 32.4615 0.3077 888 +890 3 328.4813 379.1468 31.9816 0.2754 889 +891 3 329.1185 379.8915 32.804 0.1423 890 +892 3 329.329 380.714 33.9329 0.1597 891 +893 3 329.5143 381.699 34.0948 0.2161 892 +894 3 329.8415 382.5422 35.278 0.1144 893 +895 3 330.4993 383.2652 35.0767 0.2071 894 +896 3 330.7361 384.1506 34.8345 0.1726 895 +897 3 331.6868 384.5888 34.9706 0.1667 896 +898 3 332.2268 385.3839 35.1459 0.1993 897 +899 3 332.7896 386.1698 35.6972 0.2049 898 +900 3 332.888 387.0747 35.8142 0.148 899 +901 3 333.1385 387.8789 34.7026 0.3956 900 +902 3 333.5183 388.801 34.16 0.3534 901 +903 3 333.6716 389.7459 35.1375 0.308 902 +904 3 333.8192 390.644 35.8789 0.2182 903 +905 3 334.0102 391.5912 34.7861 0.2208 904 +906 3 334.1498 392.1815 33.6048 0.2671 905 +907 3 334.4747 392.6151 35.5673 0.3305 906 +908 3 334.7344 393.663 35.4668 0.2394 907 +909 3 334.866 394.6869 36.2284 0.212 908 +910 3 334.9209 395.7954 35.915 0.1603 909 +911 3 335.1325 396.6511 35.0773 0.1804 910 +912 3 335.1119 397.6281 33.9312 0.1144 911 +913 3 335.1783 398.1383 36.0595 0.1367 912 +914 3 335.192 399.1256 36.955 0.2542 913 +915 3 335.192 399.9046 35.9332 0.3051 914 +916 3 335.3808 400.9903 36.3689 0.3168 915 +917 3 335.8326 401.878 36.3334 0.2397 916 +918 3 335.7537 402.2064 37.52 0.1144 917 +919 3 336.2937 403.0255 37.24 0.2108 918 +920 3 337.0933 403.1273 35.588 0.1504 919 +921 3 337.075 404.1969 36.197 0.2231 920 +922 3 337.2581 405.2689 36.7077 0.2669 921 +923 3 337.663 405.9804 37.5264 0.3305 922 +924 3 337.48 406.7503 39.1902 0.1431 923 +925 3 337.3656 407.7982 39.9468 0.1398 924 +926 3 337.4811 408.6402 38.409 0.1937 925 +927 3 337.2718 409.4982 37.1927 0.1271 926 +928 3 337.3336 410.4066 36.47 0.1462 927 +929 3 337.242 411.2691 37.3898 0.219 928 +930 3 337.3622 412.0757 38.8119 0.3075 929 +931 3 337.4491 412.8433 37.7871 0.3358 930 +932 3 337.5944 413.739 38.8321 0.1144 931 +933 3 337.194 414.6211 38.08 0.1201 932 +934 3 336.7387 415.5008 38.5437 0.136 933 +935 3 336.1381 416.1655 37.413 0.2754 934 +936 3 335.7766 416.8095 38.7058 0.2453 935 +937 3 336.1518 417.4479 40.2559 0.2288 936 +938 3 336.5293 418.251 39.3781 0.1652 937 +939 3 336.5591 419.2771 39.4108 0.1382 938 +940 3 335.9928 420.0928 38.92 0.3147 939 +941 3 335.9928 421.0114 39.7541 0.2977 940 +942 3 336.0546 422.0719 39.0631 0.2762 941 +943 3 336.2365 422.9528 38.2088 0.2184 942 +944 3 336.7501 423.4779 36.2264 0.2245 943 +945 3 337.1002 424.0762 37.91 0.1907 944 +946 3 337.2249 424.6574 39.9143 0.1144 945 +947 3 337.2523 425.6126 41.3504 0.1147 946 +948 3 337.48 426.4935 42.6188 0.1384 947 +949 3 338.2042 426.966 43.6439 0.262 948 +950 3 339.0358 427.4041 42.84 0.2079 949 +951 3 339.4889 428.0082 43.3224 0.2733 950 +952 3 340.0334 428.6591 43.96 0.1313 951 +953 3 340.3606 429.3329 42.7087 0.1759 952 +954 3 341.1294 430.1177 43.0422 0.2394 953 +955 3 341.9393 430.8865 42.56 0.267 954 +956 3 342.5136 431.7845 42.233 0.3305 955 +957 3 343.1794 432.5247 41.4946 0.21 956 +958 3 343.6576 433.4433 41.16 0.1144 957 +959 3 344.3509 433.5897 42.3948 0.2219 958 +960 3 345.1517 434.2487 42.9887 0.2206 959 +961 3 345.742 435.0575 43.2373 0.2828 960 +962 3 346.4329 435.8846 42.56 0.3178 961 +963 3 346.8768 436.7895 41.8286 0.1218 962 +964 3 347.204 437.5056 40.166 0.1368 963 +965 3 347.5495 438.1703 39.8614 0.1803 964 +966 3 348.2336 438.4632 41.5862 0.2351 965 +967 3 348.8479 439.3555 41.5716 0.2235 966 +968 3 349.0653 440.2101 41.2084 0.3065 967 +969 3 349.2152 440.8633 42.8428 0.1676 968 +970 3 349.1488 441.862 42.9296 0.3061 969 +971 3 349.1236 442.9236 43.265 0.3051 970 +972 3 349.5023 443.0632 45.7447 0.1983 971 +973 3 349.8352 443.5528 45.7615 0.1862 972 +974 3 350.2047 444.0093 44.4489 0.1878 973 +975 3 350.5067 444.6671 43.1172 0.1514 974 +976 3 350.2928 445.5136 42.0227 0.1941 975 +977 3 350.8648 445.9312 42.56 0.1144 976 +978 3 317.1191 369.2214 30.52 0.2756 780 +979 3 318.0652 368.5865 30.5348 0.1519 978 +980 3 318.8168 368.3829 32.2255 0.3121 979 +981 3 319.5169 367.6404 32.965 0.2059 980 +982 3 320.3486 366.9906 32.6228 0.2736 981 +983 3 321.0133 366.4186 31.8998 0.2895 982 +984 3 321.5212 365.9198 31.0766 0.3079 983 +985 3 322.1893 365.2792 31.9074 0.1996 984 +986 3 322.8951 364.8124 31.6546 0.3265 985 +987 3 323.7245 364.6008 32.9871 0.3567 986 +988 3 324.2794 364.5779 32.3036 0.2655 987 +989 3 325.2827 364.8777 32.851 0.2449 988 +990 3 326.1452 365.2598 32.6794 0.2666 989 +991 3 327.2126 365.2552 32.7712 0.2288 990 +992 3 327.9082 365.5675 34.3888 0.2456 991 +993 3 328.8542 365.8844 33.6389 0.233 992 +994 3 329.9079 366.1029 33.9643 0.1639 993 +995 3 330.7727 366.5902 33.5709 0.1525 994 +996 3 331.6422 366.8774 34.4884 0.1144 995 +997 3 332.7187 366.9998 34.9499 0.1202 996 +998 3 333.6854 367.3384 35.8439 0.1943 997 +999 3 334.5353 367.1096 35.138 0.175 998 +1000 3 335.4814 366.835 34.1099 0.2092 999 +1001 3 336.3623 367.1611 33.5208 0.2518 1000 +1002 3 337.1276 367.6816 32.3882 0.2734 1001 +1003 3 337.8712 367.7628 32.2591 0.1427 1002 +1004 3 338.6778 367.6622 33.4734 0.2347 1003 +1005 3 339.4145 367.3247 32.1992 0.3308 1004 +1006 3 339.6307 366.4232 32.4215 0.2011 1005 +1007 3 340.2931 366.5376 32.6239 0.1506 1006 +1008 3 341.3421 366.5422 31.8206 0.2058 1007 +1009 3 342.1075 366.7161 31.92 0.3307 1008 +1010 3 342.9334 367.224 32.7771 0.3351 1009 +1011 3 343.8281 367.748 32.6852 0.1729 1010 +1012 3 344.7364 367.645 34.0544 0.1652 1011 +1013 3 345.7351 367.3384 34.7774 0.4209 1012 +1014 3 346.4455 366.9014 33.9522 0.3178 1013 +1015 3 347.101 366.5639 35.4668 0.3222 1014 +1016 3 347.8835 365.8695 34.7645 0.3305 1015 +1017 3 348.9074 365.6224 34.4946 0.2994 1016 +1018 3 349.6201 365.3192 34.3185 0.2294 1017 +1019 3 350.4175 365.0824 33.0529 0.2258 1018 +1020 3 350.8637 364.3732 32.97 0.178 1019 +1021 3 351.3224 363.4888 32.6749 0.2429 1020 +1022 3 352.2296 363.4694 31.8889 0.2924 1021 +1023 3 353.1391 363.4019 31.1097 0.4057 1022 +1024 3 354.0097 363.1914 31.5011 0.1938 1023 +1025 3 354.9386 363.1056 30.3108 0.1745 1024 +1026 3 355.8355 363.1056 30.6432 0.178 1025 +1027 3 356.5024 363.2932 31.3572 0.2818 1026 +1028 3 357.5057 363.5518 31.0402 0.1804 1027 +1029 3 358.2825 363.5472 31.64 0.2034 1028 +1030 3 359.0044 362.8173 31.5025 0.2579 1029 +1031 3 359.6484 361.9708 31.36 0.1411 1030 +1032 3 360.4366 361.3004 31.8268 0.2161 1031 +1033 3 361.0716 360.9343 32.1446 0.2061 1032 +1034 3 361.8358 360.3394 32.1476 0.1907 1033 +1035 3 362.696 359.9733 31.3158 0.1786 1034 +1036 3 363.5563 359.4826 30.8 0.2948 1035 +1037 3 364.2153 358.8728 30.9005 0.2549 1036 +1038 3 364.761 358.3534 30.0868 0.1652 1037 +1039 3 365.4737 357.7231 30.2728 0.2321 1038 +1040 3 365.9793 356.8422 30.6594 0.1891 1039 +1041 3 366.8716 356.3091 30.6664 0.1875 1040 +1042 3 367.9367 356.3034 29.96 0.2484 1041 +1043 3 368.9995 356.2519 29.4608 0.1271 1042 +1044 3 369.9296 355.7623 29.6708 0.2231 1043 +1045 3 370.9706 355.4271 28.8912 0.2203 1044 +1046 3 371.7897 355.2097 29.1948 0.1144 1045 +1047 3 372.1146 354.5176 29.0657 0.2002 1046 +1048 3 372.9246 353.8346 29.4 0.1144 1047 +1049 3 373.7276 353.2214 29.2788 0.1144 1048 +1050 3 374.2173 352.2662 29.6145 0.178 1049 +1051 3 374.4758 351.3476 29.7707 0.2257 1050 +1052 3 374.8041 350.4667 29.6677 0.1757 1051 +1053 3 375.5535 349.6728 29.3412 0.1374 1052 +1054 3 376.2204 349.0824 28.7042 0.1973 1053 +1055 3 377.1779 348.6283 28.9979 0.1144 1054 +1056 3 377.9948 347.9545 28.56 0.1475 1055 +1057 3 379.0793 347.824 28.3665 0.1995 1056 +1058 3 380.1043 347.9064 28.2044 0.1707 1057 +1059 3 380.8319 347.3802 27.4327 0.1144 1058 +1060 3 381.4885 346.5119 27.9989 0.1144 1059 +1061 3 382.2756 345.7237 28.1588 0.148 1060 +1062 3 383.2537 345.2855 28.1644 0.1144 1061 +1063 3 384.1586 344.8371 28.3847 0.1649 1062 +1064 3 384.8633 344.3486 28.1022 0.1652 1063 +1065 3 385.8609 344.2319 28.5589 0.2288 1064 +1066 3 386.847 344.1152 29.3882 0.1669 1065 +1067 3 387.8595 343.8578 28.84 0.1144 1066 +1068 3 388.7301 343.756 29.8402 0.2288 1067 +1069 3 389.723 343.6622 29.0175 0.1144 1068 +1070 3 390.6783 343.772 29.6909 0.1271 1069 +1071 3 391.693 343.6599 29.2886 0.1893 1070 +1072 3 392.5464 343.0055 28.3965 0.1271 1071 +1073 3 393.3919 342.3855 27.8029 0.2227 1072 +1074 3 394.2327 341.8409 27.4509 0.136 1073 +1075 3 395.3641 341.7082 27.3224 0.1144 1074 +1076 3 396.4807 341.7471 27.5232 0.1144 1075 +1077 3 397.5411 341.9896 27.7264 0.1306 1076 +1078 3 398.5399 342.2711 27.4305 0.2408 1077 +1079 3 399.5786 342.2631 27.0824 0.1652 1078 +1080 3 400.6357 342.3683 26.8537 0.1579 1079 +1081 3 401.4994 342.0457 26.0968 0.1866 1080 +1082 3 402.5233 341.6579 26.1246 0.1144 1081 +1083 3 403.4671 341.2541 26.4256 0.178 1082 +1084 3 404.42 340.809 26.1114 0.1907 1083 +1085 3 405.3089 340.4395 26.7702 0.1837 1084 +1086 3 406.0685 339.7794 26.7064 0.1661 1085 +1087 3 407.073 339.4111 26.88 0.1882 1086 +1088 3 408.0614 339.0519 27.4232 0.1144 1087 +1089 3 409.02 338.9294 26.8265 0.2616 1088 +1090 3 410.0016 339.0233 26.0212 0.157 1089 +1091 3 411.1044 339.1731 25.6119 0.1554 1090 +1092 3 412.2015 338.9672 25.2 0.2803 1091 +1093 3 413.1453 338.6583 24.9427 0.178 1092 +1094 3 414.0628 338.4272 25.4892 0.2029 1093 +1095 3 415.1313 338.4215 25.8672 0.2249 1094 +1096 3 416.0991 338.1664 25.9473 0.215 1095 +1097 3 416.702 338.8848 26.0316 0.2151 1096 +1098 3 417.5165 339.4088 25.5066 0.3141 1097 +1099 3 418.5221 339.5438 26.1649 0.2796 1098 +1100 3 419.5803 339.6124 26.04 0.3072 1099 +1101 3 420.6705 339.4545 25.583 0.339 1100 +1102 3 421.6452 339.9099 25.8838 0.3156 1101 +1103 3 422.6336 339.9533 24.8178 0.3971 1102 +1104 3 423.5088 340.4544 25.2 0.2161 1103 +1105 3 360.9457 361.504 31.36 0.2034 1032 +1106 3 361.8369 361.6905 32.3196 0.1504 1105 +1107 3 362.5748 362.3323 31.374 0.1309 1106 +1108 3 363.5849 362.7521 31.7204 0.1169 1107 +1109 3 364.7061 362.9088 31.92 0.1499 1108 +1110 3 365.7585 363.3458 31.92 0.178 1109 +1111 3 366.8671 363.5987 31.92 0.1467 1110 +1112 3 367.8921 364.0402 31.948 0.1475 1111 +1113 3 368.8553 364.6088 31.8046 0.1877 1112 +1114 3 369.8575 365.1145 31.8534 0.1579 1113 +1115 3 370.7761 365.0847 31.4709 0.1289 1114 +1116 3 371.5197 365.1408 31.843 0.2288 1115 +1117 3 372.4098 365.3879 31.4978 0.2321 1116 +1118 3 373.1877 365.556 32.48 0.2159 1117 +1119 3 374.2207 365.8226 32.9132 0.1421 1118 +1120 3 375.1256 366.1681 31.92 0.1687 1119 +1121 3 376.1792 366.207 32.3148 0.2288 1120 +1122 3 377.0956 366.1944 33.4337 0.1382 1121 +1123 3 377.8792 366.6531 32.76 0.2536 1122 +1124 3 378.7326 367.1199 32.8205 0.2007 1123 +1125 3 379.7325 367.2343 33.551 0.2264 1124 +1126 3 380.6019 367.1611 33.4841 0.1197 1125 +1127 3 381.7162 366.9952 33.4622 0.1428 1126 +1128 3 382.8385 367.0078 33.6888 0.1399 1127 +1129 3 383.8715 367.2148 34.3179 0.1818 1128 +1130 3 384.9194 367.383 34.2345 0.1759 1129 +1131 3 385.8529 367.6816 35.0 0.1144 1130 +1132 3 386.9923 367.7399 35.0 0.1144 1131 +1133 3 387.9922 368.1392 35.2248 0.1144 1132 +1134 3 389.119 368.1392 34.9247 0.1144 1133 +1135 3 390.1852 368.2456 34.9238 0.1595 1134 +1136 3 391.2606 368.5579 35.453 0.2262 1135 +1137 3 392.3028 368.9732 35.3298 0.2005 1136 +1138 3 393.2889 369.2603 35.9719 0.2288 1137 +1139 3 394.0428 369.8895 36.7556 0.154 1138 +1140 3 394.9237 370.4764 36.1953 0.2071 1139 +1141 3 394.9305 371.1502 37.6628 0.1954 1140 +1142 3 395.0232 371.4934 36.36 0.1502 1141 +1143 3 394.7441 371.5334 34.4089 0.178 1142 +1144 3 395.3286 372.0963 33.88 0.2224 1143 +1145 3 396.1672 372.5505 33.1643 0.2288 1144 +1146 3 396.2816 373.1728 34.72 0.2161 1145 +1147 3 396.5916 372.9486 33.2268 0.1915 1145 +1148 3 397.3272 373.7151 33.1453 0.2709 1147 +1149 3 397.6944 374.5925 32.8703 0.1193 1148 +1150 3 398.3831 375.3567 32.76 0.1144 1149 +1151 3 399.3166 375.9985 32.7578 0.1144 1150 +1152 3 400.1094 376.6448 32.76 0.1144 1151 +1153 3 400.9606 377.3839 32.76 0.1144 1152 +1154 3 401.6641 378.2544 32.76 0.1334 1153 +1155 3 402.3345 379.1422 32.76 0.1469 1154 +1156 3 403.284 379.5609 33.2833 0.1244 1155 +1157 3 404.2942 380.0402 32.9918 0.2815 1156 +1158 3 405.3078 380.3445 33.0333 0.1448 1157 +1159 3 406.422 380.4063 32.6018 0.1144 1158 +1160 3 407.4802 380.7495 32.1376 0.1144 1159 +1161 3 408.4343 381.3158 31.64 0.156 1160 +1162 3 409.3163 382.0171 31.2348 0.216 1161 +1163 3 410.2075 382.7229 31.08 0.1336 1162 +1164 3 410.7818 383.6736 31.08 0.1144 1163 +1165 3 411.7382 384.201 31.1044 0.1169 1164 +1166 3 412.2496 384.7569 32.608 0.274 1165 +1167 3 413.2677 384.3977 32.226 0.1806 1166 +1168 3 414.0868 384.6128 32.1314 0.1924 1167 +1169 3 414.9929 385.0361 31.92 0.2288 1168 +1170 3 415.9607 385.5383 31.7419 0.2027 1169 +1171 3 416.6139 386.1103 31.309 0.1987 1170 +1172 3 417.4456 386.4832 32.4512 0.1793 1171 +1173 3 418.0359 386.958 31.4381 0.2283 1172 +1174 3 418.1469 387.9727 32.0832 0.3284 1173 +1175 3 419.0392 388.1592 32.8843 0.143 1174 +1176 3 419.6856 388.6168 33.6 0.1673 1175 +1177 3 420.7152 388.8044 34.4226 0.1342 1176 +1178 3 421.826 388.6248 34.72 0.1144 1177 +1179 3 422.6886 388.6168 33.3572 0.286 1178 +1180 3 423.614 388.968 33.88 0.2457 1179 +1181 3 424.4766 389.4485 33.8828 0.1628 1180 +1182 3 425.5268 389.6144 34.5685 0.2336 1181 +1183 3 426.6354 389.659 34.7354 0.3305 1182 +1184 3 427.1765 390.3351 34.694 0.4237 1183 +1185 3 427.8125 390.9689 34.9034 0.2349 1184 +1186 3 427.9933 391.9436 34.1468 0.1232 1185 +1187 3 428.5081 392.8759 34.7071 0.2105 1186 +1188 3 429.1865 393.6801 34.16 0.2678 1187 +1189 3 429.9404 394.426 34.16 0.1907 1188 +1190 3 430.5764 395.2394 33.833 0.1885 1189 +1191 3 431.1667 395.9762 33.4718 0.1941 1190 +1192 3 431.9733 396.5047 34.2622 0.2078 1191 +1193 3 432.6597 397.1808 34.72 0.115 1192 +1194 3 433.3712 397.7208 33.922 0.1566 1193 +1195 3 434.2018 398.2458 33.6748 0.2355 1194 +1196 3 434.6868 398.5673 33.6417 0.2075 1195 +1197 3 435.5837 398.4552 33.796 0.249 1196 +1198 3 436.6785 398.557 33.88 0.2418 1197 +1199 3 437.4713 398.716 33.2741 0.3112 1198 +1200 3 438.2115 398.7401 33.4642 0.1845 1199 +1201 3 439.026 398.6142 33.6924 0.2507 1200 +1202 3 439.9824 398.9128 32.76 0.1907 1201 +1203 3 394.132 370.9992 33.8898 0.2025 1143 +1204 3 393.2946 370.3071 33.4527 0.1679 1203 +1205 3 392.1941 370.0954 33.8008 0.1914 1204 +1206 3 391.0878 369.9696 33.9741 0.2203 1205 +1207 3 390.1406 370.362 34.3882 0.2174 1206 +1208 3 389.1945 370.9054 34.72 0.1649 1207 +1209 3 388.3663 371.6753 34.72 0.1873 1208 +1210 3 387.355 371.8904 35.4945 0.2288 1209 +1211 3 386.251 371.9144 35.2262 0.2288 1210 +1212 3 385.2042 372.0654 35.1434 0.2064 1211 +1213 3 384.0797 372.2507 35.0 0.2281 1212 +1214 3 382.9734 372.4864 35.373 0.1907 1213 +1215 3 381.9004 372.547 34.7393 0.2691 1214 +1216 3 380.9806 372.769 35.5846 0.2596 1215 +1217 3 380.1512 373.0206 36.0769 0.1588 1216 +1218 3 379.363 373.3341 36.8822 0.178 1217 +1219 3 378.4386 372.944 36.4 0.2543 1218 +1220 3 377.6344 373.381 35.4897 0.1287 1219 +1221 3 377.0407 374.0091 36.3947 0.2714 1220 +1222 3 376.3325 374.7252 37.2814 0.2796 1221 +1223 3 375.2995 374.954 37.5794 0.1749 1222 +1224 3 374.3969 375.4608 38.08 0.1144 1223 +1225 3 373.8329 375.9092 38.2687 0.1719 1224 +1226 3 373.6784 376.8233 37.6214 0.193 1225 +1227 3 372.8845 377.6264 37.8 0.2144 1226 +1228 3 372.07 377.9776 38.3062 0.3046 1227 +1229 3 371.2131 377.8632 39.3232 0.1144 1228 +1230 3 370.3151 377.3781 38.92 0.1846 1229 +1231 3 369.4491 377.0109 39.6841 0.1733 1230 +1232 3 368.3348 377.0624 39.76 0.2743 1231 +1233 3 367.3029 377.1768 39.3705 0.1907 1232 +1234 3 366.4209 376.8553 39.7869 0.1788 1233 +1235 3 365.5995 377.0841 41.1348 0.1374 1234 +1236 3 364.7038 377.6127 40.5958 0.1343 1235 +1237 3 364.0586 378.3185 40.0674 0.3033 1236 +1238 3 363.3344 378.537 39.44 0.3527 1237 +1239 3 362.7521 379.3069 40.2749 0.1455 1238 +1240 3 361.6195 379.3161 40.32 0.1499 1239 +1241 3 360.5247 379.2715 40.8702 0.2168 1240 +1242 3 360.1781 379.6135 39.503 0.2542 1241 +1243 3 359.7811 379.2921 37.5351 0.1652 1242 +1244 3 359.3178 379.3504 40.0089 0.2288 1243 +1245 3 359.1828 380.0013 40.04 0.2585 1244 +1246 3 358.5239 380.8422 39.949 0.2069 1245 +1247 3 358.0217 381.0389 37.8619 0.2143 1246 +1248 3 357.5927 381.484 39.968 0.2759 1247 +1249 3 356.8616 381.5537 41.3596 0.3305 1248 +1250 3 355.9293 382.048 41.1018 0.2415 1249 +1251 3 355.6639 382.3648 40.2892 0.2106 1250 +1252 3 354.9798 382.533 40.5706 0.3017 1251 +1253 3 354.0554 382.7298 40.6 0.274 1252 +1254 3 353.5658 383.4974 41.1533 0.2288 1253 +1255 3 353.0887 384.3966 40.9732 0.3051 1254 +1256 3 352.2468 385.1265 41.44 0.2288 1255 +1257 3 351.6988 385.9307 40.5871 0.3141 1256 +1258 3 351.4814 386.9065 39.76 0.3065 1257 +1259 3 350.6509 387.4511 40.0075 0.2613 1258 +1260 3 349.7666 387.784 39.7818 0.2746 1259 +1261 3 349.0744 388.4589 39.6984 0.4533 1260 +1262 3 348.2084 388.96 40.0128 0.2987 1261 +1263 3 347.6204 389.6372 39.76 0.2577 1262 +1264 3 346.5233 389.7059 40.0711 0.2288 1263 +1265 3 345.6253 389.993 40.6137 0.2288 1264 +1266 3 344.9503 390.5616 39.76 0.2415 1265 +1267 3 344.4916 390.3328 38.08 0.37 1266 +1268 3 343.5512 390.5319 37.9854 0.1907 1267 +1269 3 343.0273 391.1222 38.722 0.2019 1268 +1270 3 342.0583 391.5912 38.36 0.2664 1269 +1271 3 341.2666 391.4768 38.7943 0.2454 1270 +1272 3 340.5093 391.8966 39.6838 0.4021 1271 +1273 3 339.9213 392.2776 39.3649 0.2433 1272 +1274 3 338.9054 392.5293 40.0218 0.2702 1273 +1275 3 338.195 393.2637 40.4678 0.2825 1274 +1276 3 337.5155 393.9925 39.7645 0.2204 1275 +1277 3 337.2924 394.4844 37.5225 0.2278 1276 +1278 3 336.5351 395.1296 37.7451 0.259 1277 +1279 3 335.8326 395.8023 37.2537 0.3665 1278 +1280 3 334.8751 396.0917 37.7474 0.2337 1279 +1281 3 334.2745 396.7975 38.36 0.4065 1280 +1282 3 333.476 397.3112 37.6709 0.2161 1281 +1283 3 332.5379 397.0183 37.0154 0.2988 1282 +1284 3 331.7314 396.7392 35.84 0.232 1283 +1285 3 330.8608 397.1922 35.434 0.3559 1284 +1286 3 330.0898 397.0492 35.5359 0.3281 1285 +1287 3 329.2958 396.8639 36.2076 0.3536 1286 +1288 3 328.5259 397.1842 37.6566 0.3402 1287 +1289 3 327.6187 396.833 36.9667 0.2134 1288 +1290 3 327.1337 396.6328 35.5225 0.2619 1289 +1291 3 326.2173 396.523 34.2513 0.1913 1290 +1292 3 325.5355 396.968 34.9423 0.3365 1291 +1293 3 324.4636 397.1968 35.2884 0.3051 1292 +1294 3 323.6365 396.968 35.5902 0.2592 1293 +1295 3 322.656 396.7392 35.0154 0.1717 1294 +1296 3 321.7271 397.1968 35.2876 0.2858 1295 +1297 3 320.7879 396.8593 36.12 0.3522 1296 +1298 3 319.748 396.5104 35.84 0.2415 1297 +1299 3 318.8362 396.5504 36.9866 0.2505 1298 +1300 3 318.7207 395.9384 36.1304 0.2288 1299 +1301 3 317.9782 395.2566 35.8204 0.1753 1300 +1302 3 317.174 394.6811 35.7185 0.1697 1301 +1303 3 316.2416 394.2316 36.6596 0.1907 1302 +1304 3 315.2864 393.8792 35.84 0.2415 1303 +1305 3 319.9871 397.2597 36.0366 0.3413 1298 +1306 3 320.471 397.9987 35.2884 0.2277 1305 +1307 3 321.4262 397.9084 36.2471 0.212 1306 +1308 3 321.4423 398.5204 38.3443 0.1724 1307 +1309 3 321.6356 399.4596 38.5795 0.1209 1308 +1310 3 322.0623 400.0248 37.24 0.1983 1309 +1311 3 322.5256 400.9331 36.9874 0.2146 1310 +1312 3 322.7727 401.997 36.9496 0.1566 1311 +1313 3 323.1789 402.6788 35.3444 0.1285 1312 +1314 3 323.6033 403.26 33.8366 0.1271 1313 +1315 3 323.8675 404.1763 33.8803 0.1272 1314 +1316 3 324.6649 404.5733 34.5604 0.1206 1315 +1317 3 325.2392 404.9028 35.331 0.2477 1316 +1318 3 325.2552 406.0296 35.6014 0.2155 1317 +1319 3 325.2564 407.153 35.84 0.1928 1318 +1320 3 325.4348 408.1437 36.6506 0.1907 1319 +1321 3 325.4714 409.147 35.6468 0.1907 1320 +1322 3 325.7357 409.8769 37.1683 0.1359 1321 +1323 3 325.6968 410.8882 36.8656 0.2764 1322 +1324 3 325.8101 411.8983 35.8918 0.1894 1323 +1325 3 325.6831 413.0103 36.0612 0.3272 1324 +1326 3 325.6888 414.0902 36.251 0.4226 1325 +1327 3 325.357 415.0432 36.3311 0.3079 1326 +1328 3 325.6087 415.9595 37.6037 0.3432 1327 +1329 3 325.8043 416.8633 37.3937 0.2569 1328 +1330 3 326.0434 417.7122 37.8328 0.1174 1329 +1331 3 326.2997 418.7772 37.2907 0.1711 1330 +1332 3 326.5765 419.8526 36.6489 0.2691 1331 +1333 3 326.9563 420.666 37.4965 0.2921 1332 +1334 3 327.1211 421.5045 38.5434 0.2702 1333 +1335 3 326.7264 422.3373 37.5738 0.2895 1334 +1336 3 326.7264 423.4104 38.1671 0.3133 1335 +1337 3 326.4404 424.44 38.4423 0.3006 1336 +1338 3 326.3706 425.4158 38.7649 0.2542 1337 +1339 3 326.2791 426.4203 39.2269 0.2779 1338 +1340 3 326.4072 426.887 41.2261 0.2455 1339 +1341 3 326.6017 427.681 40.0582 0.3077 1340 +1342 3 326.6109 428.531 39.8115 0.2185 1341 +1343 3 326.6909 429.0103 40.4762 0.1832 1342 +1344 3 327.1806 429.8191 40.2114 0.1897 1343 +1345 3 327.629 430.7389 40.88 0.3048 1344 +1346 3 327.645 431.8806 40.9004 0.276 1345 +1347 3 327.756 432.758 42.0 0.1368 1346 +1348 3 327.4242 433.6904 41.7236 0.3432 1347 +1349 3 327.0296 434.3207 41.8681 0.2595 1348 +1350 3 327.0696 435.149 40.6 0.3082 1349 +1351 3 327.1771 436.0848 41.8146 0.1703 1350 +1352 3 326.8454 436.6614 42.8425 0.19 1351 +1353 3 326.5731 437.6029 43.4308 0.3303 1352 +1354 3 326.8957 438.5089 44.7199 0.1598 1353 +1355 3 327.192 439.4573 43.692 0.2063 1354 +1356 3 327.5295 440.5407 43.8869 0.3079 1355 +1357 3 328.2616 441.282 44.4058 0.2218 1356 +1358 3 328.749 442.2475 44.3265 0.1771 1357 +1359 3 328.8783 442.9568 43.5341 0.1216 1358 +1360 3 328.9458 444.0001 43.3107 0.1616 1359 +1361 3 329.7511 444.595 42.574 0.1144 1360 +1362 3 330.0772 445.6772 42.56 0.1144 1361 +1363 3 330.3758 446.7526 42.7403 0.217 1362 +1364 3 330.4055 447.1793 44.6519 0.1592 1363 +1365 3 330.7327 447.741 46.5478 0.178 1364 +1366 3 330.9569 448.6059 45.9763 0.2391 1365 +1367 3 331.1571 449.6103 45.92 0.1271 1366 +1368 3 331.3722 450.6136 46.879 0.2415 1367 +1369 3 331.4671 451.7393 47.2268 0.1965 1368 +1370 3 331.6822 452.841 47.4578 0.1586 1369 +1371 3 331.76 453.5262 47.6854 0.2073 1370 +1372 3 332.1032 454.0914 48.4089 0.3432 1371 +1373 3 332.4613 454.8636 47.88 0.3202 1372 +1374 3 332.904 455.5408 46.76 0.1907 1373 +1375 3 359.4448 378.6503 40.8708 0.1767 1244 +1376 3 359.4917 377.5406 40.3816 0.1612 1375 +1377 3 360.1918 376.7535 40.3472 0.2128 1376 +1378 3 361.2546 376.9411 40.2298 0.2358 1377 +1379 3 361.9044 376.2627 41.1191 0.2614 1378 +1380 3 362.4467 375.9642 41.515 0.2464 1379 +1381 3 363.1056 375.3796 42.1775 0.1612 1380 +1382 3 363.5632 374.485 42.2528 0.2796 1381 +1383 3 364.1832 373.7906 42.0 0.1608 1382 +1384 3 365.2426 373.4153 41.7004 0.1679 1383 +1385 3 366.1566 373.0435 42.5138 0.2146 1384 +1386 3 367.1862 372.8754 43.1015 0.249 1385 +1387 3 368.0488 372.4155 42.5309 0.2232 1386 +1388 3 368.5648 371.8675 41.9955 0.1875 1387 +1389 3 368.9114 370.9557 41.9356 0.2334 1388 +1390 3 369.695 370.966 42.2554 0.3255 1389 +1391 3 370.3025 370.1046 42.84 0.2819 1390 +1392 3 371.2715 369.6539 43.2916 0.2079 1391 +1393 3 372.3537 369.4045 43.4361 0.1677 1392 +1394 3 373.4851 369.4319 43.2706 0.2232 1393 +1395 3 374.2321 369.3976 43.7108 0.3407 1394 +1396 3 375.1336 369.1688 44.3694 0.3432 1395 +1397 3 376.0179 368.6826 44.8 0.2607 1396 +1398 3 376.376 367.8726 43.7732 0.1525 1397 +1399 3 375.9184 367.6816 43.68 0.1525 1398 +1400 3 377.1173 367.1565 44.8291 0.2423 1398 +1401 3 378.0096 366.8064 45.0825 0.1522 1400 +1402 3 378.6846 366.0949 45.1637 0.1618 1401 +1403 3 379.1685 365.3375 45.9732 0.2034 1402 +1404 3 380.0196 364.793 46.6575 0.2447 1403 +1405 3 380.6088 364.2416 47.6966 0.2091 1404 +1406 3 380.936 363.3161 47.1383 0.214 1405 +1407 3 381.4668 362.402 47.3833 0.1173 1406 +1408 3 382.2161 361.5543 47.32 0.1144 1407 +1409 3 382.9368 360.8176 47.32 0.1144 1408 +1410 3 383.9493 360.4927 47.3088 0.119 1409 +1411 3 384.7306 359.7869 47.0977 0.1446 1410 +1412 3 385.4914 359.0524 47.6 0.153 1411 +1413 3 385.8106 357.9954 47.8464 0.2034 1412 +1414 3 386.3917 357.031 47.5714 0.1292 1413 +1415 3 387.435 356.92 47.2458 0.1407 1414 +1416 3 388.5196 356.7564 47.8979 0.1375 1415 +1417 3 389.4027 356.0963 47.978 0.1217 1416 +1418 3 390.0605 355.1605 47.978 0.1144 1417 +1419 3 390.7057 354.2202 48.1034 0.1144 1418 +1420 3 391.375 353.3107 48.5416 0.1144 1419 +1421 3 392.0442 352.4 48.9796 0.1144 1420 +1422 3 392.7135 351.4894 49.4178 0.1144 1421 +1423 3 393.3827 350.5799 49.856 0.1144 1422 +1424 3 393.8918 349.5686 50.0055 0.1144 1423 +1425 3 394.3162 348.507 50.0055 0.1144 1424 +1426 3 308.8262 367.7846 31.4258 0.344 773 +1427 3 308.6134 367.0066 33.3189 0.2659 1426 +1428 3 308.2771 365.9793 33.3928 0.1979 1427 +1429 3 307.5587 365.1351 33.9052 0.1555 1428 +1430 3 307.5015 364.1112 35.028 0.1647 1429 +1431 3 307.7063 362.9958 35.3438 0.1652 1430 +1432 3 307.5209 361.901 36.0018 0.1907 1431 +1433 3 306.7819 362.076 36.2443 0.3024 1432 +1434 3 305.6722 362.3242 36.54 0.3998 1433 +1435 3 304.5923 362.2876 37.0306 0.3947 1434 +1436 3 303.5604 361.8735 37.613 0.344 1435 +1437 3 302.5445 361.536 38.4048 0.2859 1436 +1438 3 301.6888 361.0247 39.4593 0.2601 1437 +1439 3 300.9956 360.1747 40.2433 0.2542 1438 +1440 3 300.0952 359.6919 41.1124 0.2542 1439 +1441 3 299.2052 359.1279 41.8561 0.2463 1440 +1442 3 298.5771 358.215 42.4536 0.2497 1441 +1443 3 297.8004 357.4256 42.905 0.2373 1442 +1444 3 296.9698 356.6614 42.7372 0.2462 1443 +1445 3 296.1747 355.8664 42.2282 0.263 1444 +1446 3 295.5066 354.9569 42.2663 0.3212 1445 +1447 3 295.0193 353.9593 42.875 0.3524 1446 +1448 3 294.3832 353.0338 43.2312 0.3466 1447 +1449 3 293.4852 352.5762 44.2467 0.2927 1448 +1450 3 292.4567 352.5167 45.4297 0.2567 1449 +1451 3 291.7131 351.7663 46.3053 0.29 1450 +1452 3 290.9032 351.1988 47.696 0.3305 1451 +1453 3 289.861 351.2721 48.3708 0.306 1452 +1454 3 288.8497 351.7606 48.8673 0.3297 1453 +1455 3 287.8819 352.3383 49.3408 0.2924 1454 +1456 3 286.7733 352.4675 48.7295 0.2791 1455 +1457 3 285.6316 352.4801 48.5968 0.2289 1456 +1458 3 284.6569 352.654 49.8602 0.2428 1457 +1459 3 284.0792 353.2535 51.3724 0.2641 1458 +1460 3 283.1343 352.7993 51.1025 0.3226 1459 +1461 3 282.6858 352.3932 51.2627 0.3432 1460 +1462 3 282.3953 351.5112 51.8311 0.2684 1461 +1463 3 282.0818 350.7207 53.4391 0.1967 1462 +1464 3 281.0991 350.3569 52.9659 0.2988 1463 +1465 3 279.9677 350.4049 52.9491 0.2685 1464 +1466 3 279.0056 350.4335 52.08 0.2757 1465 +1467 3 278.0721 350.2493 52.7481 0.1453 1466 +1468 3 277.1397 350.4484 52.1564 0.1769 1467 +1469 3 276.1696 350.6829 51.5343 0.1329 1468 +1470 3 275.5965 351.1073 52.92 0.1549 1469 +1471 3 274.7922 351.5867 53.6547 0.1144 1470 +1472 3 273.7958 351.2881 53.333 0.3505 1471 +1473 3 272.7319 350.9414 53.1544 0.3499 1472 +1474 3 271.9929 350.2928 53.636 0.2415 1473 +1475 3 270.9141 350.1601 54.1618 0.2102 1474 +1476 3 270.1213 349.468 54.0184 0.1917 1475 +1477 3 269.3674 348.92 53.1742 0.3327 1476 +1478 3 268.7164 348.8697 51.9848 0.3432 1477 +1479 3 267.7692 348.5676 52.9592 0.2129 1478 +1480 3 266.7808 348.3663 53.8432 0.1763 1479 +1481 3 266.5051 347.4362 54.8932 0.1217 1480 +1482 3 266.2191 346.8322 54.2982 0.1535 1481 +1483 3 265.686 345.8987 53.6281 0.277 1482 +1484 3 265.3016 344.8954 53.8294 0.2388 1483 +1485 3 264.685 344.447 55.1692 0.1209 1484 +1486 3 264.566 343.6118 56.28 0.1301 1485 +1487 3 263.5193 343.653 56.2257 0.1751 1486 +1488 3 262.8935 343.3933 54.654 0.1918 1487 +1489 3 261.9051 342.9266 54.5208 0.2142 1488 +1490 3 261.1191 342.9712 54.4513 0.3135 1489 +1491 3 260.2417 342.5628 54.0876 0.2982 1490 +1492 3 259.164 342.2242 53.8779 0.2081 1491 +1493 3 258.1287 341.8055 53.6679 0.1238 1492 +1494 3 257.0065 341.7128 53.76 0.1144 1493 +1495 3 256.0409 341.5698 54.4544 0.148 1494 +1496 3 255.533 340.817 55.2919 0.1854 1495 +1497 3 255.0354 339.9716 54.5689 0.2415 1496 +1498 3 254.7928 339.6959 55.4229 0.1144 1497 +1499 3 253.7918 339.3356 56.0 0.1144 1498 +1500 3 252.7817 338.9718 56.0 0.1144 1499 +1501 3 251.9477 338.5096 55.347 0.1525 1500 +1502 3 251.0851 337.9376 55.0889 0.1144 1501 +1503 3 250.1608 337.3885 54.6378 0.1195 1502 +1504 3 249.1609 337.0224 55.4408 0.1268 1503 +1505 3 248.82 336.1701 55.72 0.1144 1504 +1506 3 248.5935 335.1359 55.72 0.1144 1505 +1507 3 247.6474 334.5765 55.72 0.1144 1506 +1508 3 246.5412 334.3912 55.72 0.1144 1507 +1509 3 245.4052 334.3363 55.72 0.1144 1508 +1510 3 244.4648 333.7448 55.72 0.1144 1509 +1511 3 243.5782 333.0424 55.6349 0.1341 1510 +1512 3 242.7202 332.3389 55.592 0.2161 1511 +1513 3 242.1493 331.5632 54.6 0.1775 1512 +1514 3 241.1975 331.1834 55.3101 0.1144 1513 +1515 3 240.2526 330.7178 55.44 0.1144 1514 +1516 3 239.7035 329.9239 55.44 0.1144 1515 +1517 3 238.6098 329.7305 55.44 0.1144 1516 +1518 3 237.6557 329.1894 55.44 0.1144 1517 +1519 3 236.7668 328.479 55.44 0.1144 1518 +1520 3 235.7658 327.9974 55.16 0.1525 1519 +1521 3 235.4352 328.5568 55.16 0.1144 1520 +1522 3 234.8609 327.6027 55.4764 0.1612 1520 +1523 3 233.821 327.1497 55.8398 0.1713 1522 +1524 3 232.7743 326.7047 56.0871 0.1722 1523 +1525 3 231.7126 326.2802 56.0871 0.1538 1524 +1526 3 230.6315 325.9794 56.0871 0.1328 1525 +1527 3 229.5367 325.8478 56.0871 0.1144 1526 +1528 3 228.514 325.3364 56.0871 0.1144 1527 +1529 3 227.5141 324.7805 56.0871 0.1144 1528 +1530 3 226.5314 324.1959 56.0871 0.1144 1529 +1531 3 225.5739 323.5701 56.0871 0.1144 1530 +1532 3 224.6152 322.9455 56.0871 0.1144 1531 +1533 3 290.3278 351.1165 47.679 0.2708 1452 +1534 3 289.4446 351.3213 48.44 0.4465 1533 +1535 3 288.8692 350.8808 48.9726 0.3231 1534 +1536 3 288.9378 349.8627 49.6104 0.1838 1535 +1537 3 288.5168 348.8182 49.84 0.1158 1536 +1538 3 288.0615 348.2233 50.6125 0.2119 1537 +1539 3 287.5124 347.8069 52.6414 0.3371 1538 +1540 3 287.4666 346.8814 54.061 0.2598 1539 +1541 3 287.0342 346.2533 55.2619 0.2531 1540 +1542 3 286.7402 345.2592 55.1911 0.3012 1541 +1543 3 286.3981 344.5934 56.4668 0.3432 1542 +1544 3 286.8008 344.3703 58.2319 0.3305 1543 +1545 3 287.1383 343.772 56.8837 0.2669 1544 +1546 3 287.9448 343.7068 58.1101 0.1539 1545 +1547 3 288.3841 343.963 59.8041 0.1144 1546 +1548 3 288.852 342.938 59.92 0.2255 1547 +1549 3 289.4228 342.239 61.0697 0.178 1548 +1550 3 290.0132 341.5412 61.0467 0.218 1549 +1551 3 290.2191 340.4636 60.7583 0.2682 1550 +1552 3 289.6608 339.7794 61.2724 0.1457 1551 +1553 3 289.1117 338.8459 61.2363 0.1701 1552 +1554 3 288.4676 338.0875 61.0095 0.15 1553 +1555 3 288.0272 337.2821 62.0203 0.3305 1554 +1556 3 288.3658 336.9663 63.5295 0.1396 1555 +1557 3 288.6667 336.0328 63.8448 0.19 1556 +1558 3 288.9744 335.2858 62.4943 0.2224 1557 +1559 3 289.4423 334.5525 63.56 0.1329 1558 +1560 3 289.5487 333.6098 63.4805 0.2288 1559 +1561 3 289.6528 332.5837 64.0836 0.2262 1560 +1562 3 290.3804 332.1032 65.2215 0.1144 1561 +1563 3 291.4477 331.863 65.5102 0.1412 1562 +1564 3 292.1479 331.0919 65.52 0.1457 1563 +1565 3 293.2896 331.045 65.52 0.1144 1564 +1566 3 294.2894 330.5691 65.52 0.1195 1565 +1567 3 295.1028 329.8632 65.4682 0.2259 1566 +1568 3 295.4975 329.1288 65.5682 0.1247 1567 +1569 3 295.621 328.7078 67.7009 0.1144 1568 +1570 3 296.4264 328.3543 66.901 0.1905 1569 +1571 3 297.0739 327.5981 66.64 0.2635 1570 +1572 3 297.4446 326.5994 67.2532 0.1256 1571 +1573 3 298.1527 325.8638 67.76 0.1144 1572 +1574 3 298.9135 325.1191 67.0289 0.1957 1573 +1575 3 299.156 324.205 67.4909 0.3051 1574 +1576 3 299.4786 323.2441 68.3516 0.3178 1575 +1577 3 299.728 322.2671 68.5404 0.1988 1576 +1578 3 300.0346 321.2238 68.3284 0.178 1577 +1579 3 299.9568 320.2342 69.3118 0.326 1578 +1580 3 299.8516 319.4025 67.8031 0.2669 1579 +1581 3 300.332 319.3625 66.0887 0.2341 1580 +1582 3 300.0712 319.9768 64.1455 0.1147 1581 +1583 3 300.0712 319.9768 61.3455 0.1144 1582 +1584 3 300.5265 319.8372 59.1923 0.1854 1583 +1585 3 300.7496 318.7344 59.08 0.2262 1584 +1586 3 300.2165 318.3489 57.801 0.2102 1585 +1587 3 300.5059 317.6213 56.56 0.2163 1586 +1588 3 300.5288 316.7519 56.3066 0.1144 1587 +1589 3 300.7954 316.2908 58.0303 0.3378 1588 +1590 3 300.5265 315.5186 59.4642 0.2684 1589 +1591 3 300.5803 314.4273 59.619 0.2201 1590 +1592 3 300.3 313.4823 58.8 0.3589 1591 +1593 3 300.872 312.6552 59.36 0.2415 1592 +1594 3 307.5392 361.6859 36.8749 0.278 1432 +1595 3 307.6594 360.7101 37.3873 0.2759 1594 +1596 3 307.6216 359.7079 36.5616 0.2277 1595 +1597 3 307.5072 358.7939 36.2776 0.2034 1596 +1598 3 307.9511 358.0342 35.0669 0.1342 1597 +1599 3 308.4224 357.1316 35.2184 0.1144 1598 +1600 3 308.2645 356.5882 37.3752 0.2288 1599 +1601 3 308.6089 355.7005 37.8725 0.3276 1600 +1602 3 308.427 354.7544 38.5445 0.2064 1601 +1603 3 308.1982 354.3014 40.2822 0.1681 1602 +1604 3 308.4144 353.2031 40.32 0.1144 1603 +1605 3 308.1833 352.352 39.5142 0.3432 1604 +1606 3 307.998 351.4665 39.6662 0.22 1605 +1607 3 307.4111 351.1279 41.1289 0.1463 1606 +1608 3 307.617 350.5308 39.4271 0.1731 1607 +1609 3 306.9043 350.1635 38.3037 0.1423 1608 +1610 3 306.4776 349.2312 38.1595 0.1488 1609 +1611 3 306.9112 348.9944 40.159 0.2481 1610 +1612 3 306.4696 348.4773 40.3231 0.2918 1611 +1613 3 305.8644 348.1352 40.7154 0.1411 1612 +1614 3 306.0394 347.5872 42.56 0.1205 1613 +1615 3 305.7912 346.8619 41.2264 0.2934 1614 +1616 3 305.8656 345.9113 40.3262 0.1279 1615 +1617 3 305.5532 345.1036 41.2087 0.126 1616 +1618 3 305.4125 344.1141 42.5216 0.1194 1617 +1619 3 305.2261 343.1165 42.9176 0.2288 1618 +1620 3 305.1197 342.1933 42.0095 0.1907 1619 +1621 3 305.2958 341.2644 43.1805 0.2871 1620 +1622 3 305.5418 340.221 42.9741 0.3178 1621 +1623 3 305.2524 339.2646 43.2849 0.1691 1622 +1624 3 305.0579 338.1607 43.12 0.2235 1623 +1625 3 305.0407 337.3278 42.7781 0.2287 1624 +1626 3 304.5236 336.4241 42.1725 0.1144 1625 +1627 3 303.9768 335.8212 43.12 0.3 1626 +1628 3 303.629 335.2618 43.68 0.1816 1627 +1629 3 303.4586 334.5228 43.0181 0.2392 1628 +1630 3 303.3144 333.8055 43.0004 0.2295 1629 +1631 3 303.732 333.1328 42.5919 0.2527 1630 +1632 3 303.7549 332.2496 42.3956 0.2529 1631 +1633 3 303.9128 331.2921 42.2422 0.2899 1632 +1634 3 304.1518 330.616 42.9332 0.2796 1633 +1635 3 303.6176 330.8448 43.4 0.1271 1634 +1636 3 304.0752 329.3656 42.9649 0.1971 1634 +1637 3 303.9379 328.4813 43.7172 0.2211 1636 +1638 3 304.0237 327.4826 43.7984 0.2288 1637 +1639 3 303.7366 326.5834 44.0798 0.2152 1638 +1640 3 303.263 326.2871 45.64 0.1391 1639 +1641 3 303.2103 325.5183 44.0255 0.2034 1640 +1642 3 303.168 324.5494 44.4763 0.2535 1641 +1643 3 303.7446 323.9934 45.6145 0.171 1642 +1644 3 304.2891 323.0736 45.472 0.1144 1643 +1645 3 304.4756 322.2202 45.36 0.1922 1644 +1646 3 303.9516 321.4102 44.5449 0.1594 1645 +1647 3 303.7583 321.035 46.7432 0.1144 1646 +1648 3 302.7836 320.6884 46.9501 0.1271 1647 +1649 3 301.7483 320.2502 46.9535 0.1866 1648 +1650 3 301.0242 319.9699 47.9032 0.2034 1649 +1651 3 300.3721 319.2355 48.314 0.414 1650 +1652 3 300.0769 318.2345 48.0668 0.3417 1651 +1653 3 300.1284 317.1614 48.44 0.3773 1652 +1654 3 300.1387 316.1215 47.8092 0.2415 1653 +1655 3 300.7576 315.5278 48.7463 0.3264 1654 +1656 3 301.3113 314.9123 50.029 0.3082 1655 +1657 3 301.9016 314.8288 50.68 0.2161 1656 +1658 4 299.8081 376.1609 30.4601 0.3051 1 +1659 4 299.3013 375.1451 30.7992 0.3564 1658 +1660 4 298.8506 374.0937 30.7941 0.4198 1659 +1661 4 298.0509 373.2769 30.7602 0.4587 1660 +1662 4 297.2352 372.4795 30.5836 0.4971 1661 +1663 4 296.5694 371.6067 29.8116 0.5346 1662 +1664 4 295.8361 370.7304 29.6834 0.5439 1663 +1665 4 295.0902 369.8655 29.6951 0.4923 1664 +1666 4 294.5285 368.8702 29.7615 0.43 1665 +1667 4 294.0446 367.8429 30.109 0.3964 1666 +1668 4 293.6465 366.8076 30.7479 0.434 1667 +1669 4 293.5138 365.6727 30.8496 0.4585 1668 +1670 4 293.3433 364.5493 31.1094 0.4703 1669 +1671 4 293.1065 363.4968 32.027 0.4692 1670 +1672 4 293.0836 362.4203 32.928 0.453 1671 +1673 4 293.0436 361.2775 33.0453 0.4068 1672 +1674 4 292.7954 360.2307 33.073 0.3705 1673 +1675 4 292.6398 359.1005 33.2525 0.3928 1674 +1676 4 292.6226 357.9999 34.0102 0.4062 1675 +1677 4 292.5528 356.8628 34.1984 0.4312 1676 +1678 4 292.2382 355.7668 34.4064 0.4322 1677 +1679 4 292.0746 354.6789 35.1644 0.4198 1678 +1680 4 291.609 353.6379 35.2895 0.3568 1679 +1681 4 291.1148 352.606 35.3405 0.3054 1680 +1682 4 290.4753 351.6633 35.5897 0.2669 1681 +1683 4 289.8759 350.9495 36.5243 0.2694 1682 +1684 4 289.3016 350.0526 37.5057 0.2357 1683 +1685 4 288.6369 349.2335 37.863 0.2288 1684 +1686 4 287.7503 348.5574 37.2428 0.254 1685 +1687 4 286.9621 347.7703 36.9382 0.2927 1686 +1688 4 286.3077 346.8471 37.2775 0.312 1687 +1689 4 285.6614 345.9147 37.5234 0.3108 1688 +1690 4 284.9979 344.9835 37.5365 0.3121 1689 +1691 4 284.2691 344.106 37.5906 0.3389 1690 +1692 4 283.4946 343.2744 37.8624 0.3701 1691 +1693 4 282.8895 342.4335 38.8769 0.3885 1692 +1694 4 282.3609 341.5046 39.6357 0.3792 1693 +1695 4 281.9056 340.4624 39.6536 0.3612 1694 +1696 4 281.5373 339.4008 39.2008 0.3559 1695 +1697 4 281.0682 338.378 38.8234 0.3636 1696 +1698 4 280.4699 337.4171 39.0328 0.3764 1697 +1699 4 279.8247 336.4939 39.5248 0.3734 1698 +1700 4 279.1943 335.5489 39.7446 0.3607 1699 +1701 4 278.7859 334.4942 39.7603 0.3479 1700 +1702 4 278.2929 333.4771 39.7625 0.3512 1701 +1703 4 277.7197 332.4876 39.7743 0.364 1702 +1704 4 277.1443 331.4992 39.8362 0.3848 1703 +1705 4 276.6535 330.4844 40.2108 0.394 1704 +1706 4 276.2188 329.4468 40.7154 0.4025 1705 +1707 4 275.7921 328.3909 40.88 0.3814 1706 +1708 4 275.4134 327.3133 40.8806 0.3346 1707 +1709 4 275.132 326.2047 40.8836 0.2579 1708 +1710 4 275.0668 325.0699 40.9055 0.2029 1709 +1711 4 274.6664 324.0426 41.0228 0.1995 1710 +1712 4 273.9697 323.2418 41.8933 0.2402 1711 +1713 4 273.4377 322.314 42.7798 0.2954 1712 +1714 4 273.0614 321.2993 42.1565 0.3375 1713 +1715 4 272.6152 320.7524 41.9695 0.2288 1714 +1716 4 272.2548 319.6954 41.6987 0.3461 1715 +1717 4 271.6851 318.8751 41.6464 0.3855 1716 +1718 4 270.9999 318.175 42.4326 0.4599 1717 +1719 4 270.4393 317.2552 43.2054 0.3625 1718 +1720 4 270.0961 316.2336 43.7791 0.3183 1719 +1721 4 269.3662 315.5095 44.4444 0.2868 1720 +1722 4 269.2621 314.6458 43.127 0.3296 1721 +1723 4 268.4659 314.0692 42.4511 0.309 1722 +1724 4 267.863 313.1952 42.014 0.4068 1723 +1725 4 267.0188 312.5099 41.5904 0.3432 1724 +1726 4 266.4113 311.7343 42.0263 0.3988 1725 +1727 4 265.9251 310.9815 41.9614 0.3432 1726 +1728 4 265.7512 310.286 43.4372 0.3489 1727 +1729 4 265.3439 309.2873 43.12 0.3051 1728 +1730 4 265.2478 308.7073 42.3116 0.2998 1729 +1731 4 264.836 308.3892 41.0894 0.3316 1730 +1732 4 265.3748 307.5633 40.9175 0.2034 1731 +1733 4 265.1792 306.6675 40.1321 0.1144 1732 +1734 4 264.8474 306.258 40.0011 0.1652 1733 +1735 4 265.2501 305.4755 41.498 0.1813 1734 +1736 4 265.702 304.6049 42.56 0.317 1735 +1737 4 265.6505 303.7446 41.993 0.1675 1736 +1738 4 266.4708 303.343 41.6858 0.2187 1737 +1739 4 267.0519 302.6258 40.7162 0.2177 1738 +1740 4 267.8413 301.9966 41.0822 0.2161 1739 +1741 4 268.5288 301.3776 41.6612 0.2288 1740 +1742 4 268.5849 300.4373 41.6147 0.2875 1741 +1743 4 269.0631 299.5736 41.7836 0.4758 1742 +1744 4 269.3914 298.9936 40.8884 0.3212 1743 +1745 4 269.8318 298.3255 41.2056 0.4036 1744 +1746 4 270.2368 297.3084 40.6137 0.2486 1745 +1747 4 270.6246 296.3692 41.0295 0.3533 1746 +1748 4 270.858 295.3854 41.8037 0.2288 1747 +1749 4 271.4449 294.6418 42.6056 0.2717 1748 +1750 4 272.3452 294.1018 42.814 0.1144 1749 +1751 4 272.4539 293.6087 40.8814 0.1646 1750 +1752 4 272.7204 292.8034 41.979 0.2878 1751 +1753 4 272.8143 291.9248 40.7901 0.3051 1752 +1754 4 273.2318 291.2544 41.5232 0.2044 1753 +1755 4 273.416 290.282 42.1518 0.1271 1754 +1756 4 272.7925 289.8461 40.8962 0.198 1755 +1757 4 272.6209 288.9836 40.3808 0.2981 1756 +1758 4 272.5752 288.4493 39.2081 0.2321 1757 +1759 4 272.6678 287.5341 40.2833 0.1348 1758 +1760 4 272.7662 286.7596 38.92 0.2034 1759 +1761 4 273.0488 286.1064 40.0319 0.1923 1760 +1762 4 272.8818 285.1271 40.3096 0.2076 1761 +1763 4 272.9584 284.2691 39.5111 0.1652 1762 +1764 4 273.5498 283.6811 40.6347 0.1144 1763 +1765 4 274.1333 282.9146 39.6525 0.135 1764 +1766 4 274.2477 281.8381 39.0757 0.2477 1765 +1767 4 274.2385 280.9481 38.3975 0.2257 1766 +1768 4 273.8381 279.9242 38.4 0.1608 1767 +1769 4 273.3542 278.9278 38.1562 0.1745 1768 +1770 4 272.8348 278.0824 38.2018 0.1922 1769 +1771 4 272.3864 277.1775 38.519 0.2669 1770 +1772 4 272.1553 276.2691 37.8008 0.1528 1771 +1773 4 271.9288 275.1984 38.4185 0.1891 1772 +1774 4 272.3086 274.4124 38.0405 0.2547 1773 +1775 4 272.5752 273.4354 38.3214 0.2034 1774 +1776 4 272.3281 272.7582 38.0467 0.2834 1775 +1777 4 271.5982 272.2411 36.9163 0.2465 1776 +1778 4 271.1303 271.5684 38.2782 0.1144 1777 +1779 4 271.6863 270.8077 37.8616 0.2034 1778 +1780 4 271.875 269.9565 36.8329 0.2258 1779 +1781 4 271.6314 269.0722 37.3332 0.1783 1780 +1782 4 271.2413 268.3206 36.2782 0.2715 1781 +1783 4 271.2104 267.5198 36.0186 0.1965 1782 +1784 4 271.128 266.7373 36.9883 0.2924 1783 +1785 4 270.9244 265.726 36.4 0.2034 1784 +1786 4 270.8992 265.8656 37.24 0.2288 1785 +1787 4 271.1166 265.1277 36.12 0.1314 1785 +1788 4 271.2378 264.2434 36.2631 0.1144 1787 +1789 4 271.1177 263.1715 36.0511 0.1252 1788 +1790 4 270.9793 262.2403 37.1862 0.1181 1789 +1791 4 271.3225 261.2484 37.2089 0.1631 1790 +1792 4 271.2424 260.5483 36.1147 0.17 1791 +1793 4 271.128 259.8768 35.3027 0.2322 1792 +1794 4 271.1841 258.9398 36.1043 0.1841 1793 +1795 4 271.4712 257.9926 35.8907 0.1635 1794 +1796 4 271.5856 257.0682 35.5264 0.1904 1795 +1797 4 271.3831 256.065 34.7922 0.1447 1796 +1798 4 271.1406 254.9987 34.7516 0.2287 1797 +1799 4 271.128 254.0572 35.4824 0.2669 1798 +1800 4 271.0216 253.4772 34.2278 0.1983 1799 +1801 4 271.0948 252.5517 34.9602 0.1636 1800 +1802 4 271.3568 251.6811 35.3447 0.178 1801 +1803 4 271.8007 250.7545 35.2814 0.216 1802 +1804 4 271.9528 249.9285 34.2157 0.1446 1803 +1805 4 272.0306 249.0728 33.32 0.2889 1804 +1806 4 272.5408 248.5855 35.0 0.2669 1805 +1807 4 272.7296 247.5856 34.1986 0.1677 1806 +1808 4 272.518 246.564 34.7589 0.2193 1807 +1809 4 272.1233 245.4978 35.0 0.269 1808 +1810 4 271.8144 244.4476 35.0297 0.2444 1809 +1811 4 271.7023 243.338 35.3186 0.1659 1810 +1812 4 271.8888 242.5291 35.0 0.247 1811 +1813 4 272.5008 241.8313 35.5236 0.2798 1812 +1814 4 273.2558 241.1815 35.6112 0.2288 1813 +1815 4 273.8278 240.2755 36.2239 0.202 1814 +1816 4 274.1264 239.2516 36.0335 0.1725 1815 +1817 4 274.3266 238.1819 36.2085 0.1144 1816 +1818 4 274.6469 237.2564 35.1226 0.1695 1817 +1819 4 275.1514 236.4614 35.7316 0.1652 1818 +1820 4 275.704 235.7212 35.5776 0.1955 1819 +1821 4 275.7646 234.6676 35.6908 0.1967 1820 +1822 4 276.1353 233.7489 36.0923 0.2556 1821 +1823 4 276.276 232.7903 35.2531 0.2288 1822 +1824 4 276.7004 231.9666 34.5369 0.3238 1823 +1825 4 276.7462 230.9644 33.6 0.2204 1824 +1826 4 276.9933 230.2346 33.8254 0.2288 1825 +1827 4 277.857 229.7072 34.16 0.1144 1826 +1828 4 277.9989 228.6215 33.8125 0.2052 1827 +1829 4 278.6956 227.8299 33.6129 0.1306 1828 +1830 4 279.3431 227.1023 33.0711 0.1512 1829 +1831 4 279.2001 226.2066 33.8484 0.2924 1830 +1832 4 279.4792 225.8256 35.0 0.2415 1831 +1833 4 264.6175 308.5723 44.3792 0.3432 1729 +1834 4 264.0352 308.1101 43.7251 0.3051 1833 +1835 4 263.4106 307.3013 43.7478 0.4046 1834 +1836 4 263.0548 306.4787 43.4862 0.2063 1835 +1837 4 262.397 305.8793 43.9267 0.1913 1836 +1838 4 261.8593 305.4263 44.24 0.3159 1837 +1839 4 261.2919 304.5145 43.7203 0.405 1838 +1840 4 261.0288 303.5158 43.5868 0.3016 1839 +1841 4 261.0768 302.5445 43.787 0.2613 1840 +1842 4 260.7874 301.8112 42.4673 0.3777 1841 +1843 4 260.705 300.8548 41.2639 0.243 1842 +1844 4 260.2474 300.0071 41.8135 0.3305 1843 +1845 4 259.8985 299.3619 43.3874 0.3813 1844 +1846 4 259.1286 298.624 42.8565 0.2601 1845 +1847 4 258.655 298.0578 43.2172 0.2669 1846 +1848 4 258.1413 297.1712 43.1343 0.3247 1847 +1849 4 257.6288 296.6392 43.96 0.3686 1848 +1850 4 257.0648 295.7469 44.8678 0.276 1849 +1851 4 256.7239 294.8706 46.3028 0.1907 1850 +1852 4 256.2205 294.4965 45.6817 0.3671 1851 +1853 4 255.8956 293.5252 45.9388 0.3934 1852 +1854 4 255.7881 292.4098 45.4096 0.3386 1853 +1855 4 255.1692 291.7989 45.0251 0.486 1854 +1856 4 254.6544 291.2521 46.5273 0.3553 1855 +1857 4 254.3512 290.576 46.132 0.2844 1856 +1858 4 253.7392 289.9376 46.058 0.1661 1857 +1859 4 253.4326 289.2673 47.7621 0.275 1858 +1860 4 253.078 288.383 47.1654 0.2204 1859 +1861 4 252.7737 287.311 46.8532 0.2094 1860 +1862 4 252.3492 286.4862 47.0719 0.3208 1861 +1863 4 252.0426 285.7254 48.1449 0.2672 1862 +1864 4 251.9752 284.9143 49.3147 0.2288 1863 +1865 4 251.2064 284.2794 50.3468 0.2288 1864 +1866 4 250.5543 283.4043 50.0458 0.3202 1865 +1867 4 249.9937 282.997 48.16 0.2812 1866 +1868 4 249.4229 282.4628 49.287 0.3432 1867 +1869 4 249.1254 281.551 49.9022 0.2796 1868 +1870 4 248.5626 281.6242 48.8846 0.1683 1869 +1871 4 247.4918 281.4274 49.5628 0.2463 1870 +1872 4 246.7505 280.7982 49.3511 0.2515 1871 +1873 4 245.8525 280.3807 50.1315 0.281 1872 +1874 4 245.2816 279.8853 50.1273 0.2169 1873 +1875 4 244.5666 279.454 49.28 0.3051 1874 +1876 4 243.6812 278.7917 49.6138 0.2918 1875 +1877 4 243.0119 278.1613 50.6066 0.3382 1876 +1878 4 242.3106 277.4028 51.2865 0.2942 1877 +1879 4 241.9754 276.657 50.4053 0.2393 1878 +1880 4 241.4755 275.7978 50.8094 0.2587 1879 +1881 4 240.7239 275.1034 51.8507 0.178 1880 +1882 4 240.2343 274.2065 52.0618 0.2288 1881 +1883 4 239.7103 273.3828 52.1007 0.2203 1882 +1884 4 239.5833 272.4505 53.1185 0.3305 1883 +1885 4 238.9473 271.9196 52.7853 0.2432 1884 +1886 4 238.5938 271.1852 53.6505 0.1971 1885 +1887 4 237.8342 270.421 53.9773 0.1652 1886 +1888 4 237.0288 270.3855 54.3074 0.2339 1887 +1889 4 236.3229 269.7529 53.5836 0.2843 1888 +1890 4 235.672 269.0185 54.2688 0.2011 1889 +1891 4 235.0623 268.2451 53.7323 0.2161 1890 +1892 4 234.568 267.3791 53.5648 0.2474 1891 +1893 4 234.1368 266.6767 54.0492 0.211 1892 +1894 4 234.0464 266.4273 56.2489 0.229 1893 +1895 4 233.7192 265.3314 56.2489 0.2516 1894 +1896 4 232.8463 264.6518 56.0311 0.2193 1895 +1897 4 232.2423 264.0752 54.9332 0.217 1896 +1898 4 231.7206 263.2699 54.9489 0.2288 1897 +1899 4 231.0102 262.9015 55.5892 0.2543 1898 +1900 4 230.794 262.2483 55.9908 0.2587 1899 +1901 4 230.6007 261.3857 56.5454 0.3432 1900 +1902 4 230.0641 260.4819 55.5845 0.2424 1901 +1903 4 229.8296 259.6251 54.5714 0.4277 1902 +1904 4 229.5962 258.7854 54.6501 0.2934 1903 +1905 4 228.8092 258.3598 55.8144 0.3215 1904 +1906 4 228.5026 257.4057 56.4029 0.2382 1905 +1907 4 228.5884 256.5981 56.84 0.1876 1906 +1908 4 228.2589 255.5055 56.8851 0.1709 1907 +1909 4 227.5942 254.7322 57.3448 0.1963 1908 +1910 4 226.8598 254.1671 56.6222 0.2669 1909 +1911 4 226.1665 253.3377 56.9898 0.1986 1910 +1912 4 225.9045 252.379 57.12 0.1984 1911 +1913 4 225.3989 251.3608 57.3017 0.2666 1912 +1914 4 225.1449 250.7328 58.3472 0.2994 1913 +1915 4 224.6438 250.1505 59.6285 0.2255 1914 +1916 4 224.621 249.2078 59.0848 0.3197 1915 +1917 4 223.9094 248.5718 59.64 0.2767 1916 +1918 4 223.8808 247.9574 59.8441 0.3122 1917 +1919 4 223.0125 247.5994 59.3158 0.2549 1918 +1920 4 222.9656 246.6464 60.48 0.3051 1919 +1921 4 222.2849 246.1327 61.6753 0.1889 1920 +1922 4 221.4841 245.5882 61.88 0.1873 1921 +1923 4 221.0059 245.0402 60.1888 0.2364 1922 +1924 4 220.4705 244.8057 60.76 0.1271 1923 +1925 4 219.6491 244.1296 60.48 0.2288 1924 +1926 4 219.2224 243.7635 62.5162 0.2321 1925 +1927 4 218.6321 243.1309 63.4094 0.2669 1926 +1928 4 218.3736 242.3232 64.4028 0.3264 1927 +1929 4 217.5625 241.7592 64.3283 0.309 1928 +1930 4 216.8155 240.9344 64.12 0.3726 1929 +1931 4 216.0696 240.0947 64.3737 0.5053 1930 +1932 4 215.4655 239.3626 65.2288 0.5131 1931 +1933 4 215.0182 238.5366 66.0988 0.4272 1932 +1934 4 214.1248 237.9451 66.5414 0.3382 1933 +1935 4 213.3743 237.1054 66.6534 0.3432 1934 +1936 4 213.4693 236.236 66.9186 0.2671 1935 +1937 4 212.6204 235.6663 65.8 0.3358 1936 +1938 4 212.4374 234.7751 66.642 0.1922 1937 +1939 4 211.7498 234.3141 67.0466 0.3437 1938 +1940 4 211.2522 233.6048 67.7359 0.482 1939 +1941 4 210.5726 232.78 67.7757 0.3434 1940 +1942 4 209.9023 232.041 67.1216 0.3281 1941 +1943 4 209.4515 231.1921 66.9393 0.3765 1942 +1944 4 208.9951 230.3776 67.6855 0.353 1943 +1945 4 208.4814 229.69 68.88 0.4491 1944 +1946 4 207.9792 228.7222 68.698 0.2569 1945 +1947 4 207.5113 228.228 69.953 0.3875 1946 +1948 4 207.0137 227.4913 70.5186 0.2924 1947 +1949 4 206.3925 226.6939 70.74 0.4721 1948 +1950 4 205.5768 225.7146 68.9307 0.2469 1949 +1951 4 205.0071 225.0488 69.7799 0.3204 1950 +1952 4 204.355 224.2858 69.19 0.2288 1951 +1953 4 203.8883 223.7607 70.6776 0.3775 1952 +1954 4 203.6961 223.0514 70.6726 0.3268 1953 +1955 4 202.9788 222.6521 71.4692 0.472 1954 +1956 4 202.6138 221.6969 71.6864 0.3536 1955 +1957 4 201.9743 221.0116 72.142 0.3725 1956 +1958 4 201.36 220.1559 71.2379 0.2436 1957 +1959 4 201.1838 219.9088 72.266 0.1144 1958 +1960 4 200.812 219.171 73.67 0.1657 1959 +1961 4 200.2892 218.226 74.403 0.1977 1960 +1962 4 199.8465 217.2227 73.7769 0.2776 1961 +1963 4 199.5228 216.3704 72.6037 0.2765 1962 +1964 4 198.8009 215.5696 72.4802 0.394 1963 +1965 4 198.2403 214.6624 72.0619 0.2288 1964 +1966 4 198.0161 214.0893 74.1482 0.2818 1965 +1967 4 197.5082 213.3343 75.0126 0.4173 1966 +1968 4 196.9167 212.538 74.6911 0.2423 1967 +1969 4 196.5472 211.7372 75.3514 0.3432 1968 +1970 4 195.9706 211.0211 75.7884 0.4558 1969 +1971 4 195.6549 210.1459 75.7711 0.3156 1970 +1972 4 194.9628 209.7684 74.2092 0.4919 1971 +1973 4 194.5944 208.8052 75.0795 0.395 1972 +1974 4 194.2237 207.9346 75.8545 0.4263 1973 +1975 4 192.9001 206.7242 77.1 0.4235 1974 +1976 4 192.4151 206.031 77.5869 0.3298 1975 +1977 4 191.8946 205.3903 77.3111 0.2567 1976 +1978 4 191.5708 204.6536 77.28 0.2584 1977 +1979 4 190.8604 203.9763 77.9212 0.5339 1978 +1980 4 190.7689 203.4467 79.8238 0.3861 1979 +1981 4 190.2472 202.7317 80.0873 0.4454 1980 +1982 4 190.0276 201.7055 80.2984 0.3557 1981 +1983 4 189.2473 201.1518 80.0103 0.3756 1982 +1984 4 189.0071 200.3945 78.5932 0.3821 1983 +1985 4 188.7646 199.9083 80.1206 0.2245 1984 +1986 4 188.2612 199.2287 79.6816 0.3159 1985 +1987 4 187.3437 198.7471 79.002 0.4299 1986 +1988 4 186.6425 197.9566 79.469 0.3586 1987 +1989 4 185.9526 197.4601 80.3799 0.4454 1988 +1990 4 185.5728 197.1981 82.04 0.4195 1989 +1991 4 185.1312 196.1903 82.2343 0.3686 1990 +1992 4 184.3464 195.4181 82.7114 0.3313 1991 +1993 4 183.6074 194.623 83.4165 0.3811 1992 +1994 4 183.3294 193.5476 83.72 0.4602 1993 +1995 4 182.7197 192.732 83.5853 0.3615 1994 +1996 4 182.1214 191.8294 83.8956 0.353 1995 +1997 4 181.4773 191.1384 82.88 0.3813 1996 +1998 4 180.9716 190.2094 82.9116 0.3038 1997 +1999 4 180.315 189.4178 82.88 0.3704 1998 +2000 4 179.608 189.0014 83.54 0.2319 1999 +2001 4 179.3998 188.1811 84.5513 0.3051 2000 +2002 4 178.9124 187.33 84.6866 0.3691 2001 +2003 4 178.0201 186.758 84.9971 0.3392 2002 +2004 4 177.5728 185.8245 84.84 0.2953 2003 +2005 4 177.0923 184.8773 84.0062 0.4058 2004 +2006 4 176.6096 184.0833 84.0118 0.321 2005 +2007 4 175.8397 183.4953 84.5995 0.4174 2006 +2008 4 175.4873 182.9439 85.8561 0.3348 2007 +2009 4 174.9336 182.158 86.6746 0.2415 2008 +2010 4 174.6774 181.324 85.9636 0.4307 2009 +2011 4 174.3399 180.5953 87.08 0.3747 2010 +2012 4 173.6386 179.934 86.8935 0.4109 2011 +2013 4 173.3812 178.9754 86.8045 0.3424 2012 +2014 4 173.0769 178.3324 87.3152 0.2388 2013 +2015 4 172.8287 177.423 86.133 0.3051 2014 +2016 4 172.0576 176.6977 86.5354 0.4068 2015 +2017 4 171.6938 176.128 88.2837 0.3386 2016 +2018 4 171.1985 175.2608 89.0798 0.2352 2017 +2019 4 170.6619 174.6831 89.7005 0.3368 2018 +2020 4 170.1563 173.745 88.7788 0.2916 2019 +2021 4 169.5076 173.054 89.32 0.3295 2020 +2022 4 169.0729 172.3802 88.2059 0.3099 2021 +2023 4 168.3373 171.695 88.4366 0.1781 2022 +2024 4 167.5834 171.2614 89.6221 0.3887 2023 +2025 4 167.0675 170.5761 90.72 0.3487 2024 +2026 4 166.6922 169.5774 90.9504 0.2736 2025 +2027 4 166.0104 168.6805 90.8214 0.3615 2026 +2028 4 165.5334 167.8648 89.4449 0.4909 2027 +2029 4 164.776 167.2093 89.5843 0.4261 2028 +2030 4 164.2018 166.2575 89.6132 0.3665 2029 +2031 4 163.8826 165.6604 91.0482 0.337 2030 +2032 4 163.7007 164.641 90.5915 0.3375 2031 +2033 4 163.3964 163.616 91.0115 0.2341 2032 +2034 4 163.3312 162.7351 91.56 0.2229 2033 +2035 4 162.8347 161.9069 91.9881 0.3491 2034 +2036 4 162.0785 161.137 92.694 0.2981 2035 +2037 4 161.1759 160.5066 93.1837 0.2377 2036 +2038 4 160.7595 159.5045 93.2467 0.2034 2037 +2039 4 160.2561 158.5721 93.7045 0.2094 2038 +2040 4 159.7493 157.9235 93.0404 0.2898 2039 +2041 4 159.461 156.9625 93.5558 0.2677 2040 +2042 4 159.135 156.029 94.5098 0.2206 2041 +2043 4 158.6042 155.1664 95.1686 0.1738 2042 +2044 4 158.2884 154.0888 94.92 0.1192 2043 +2045 4 157.753 153.2171 95.2812 0.3227 2044 +2046 4 157.4236 152.1291 95.2 0.3284 2045 +2047 4 157.0575 151.0549 95.4198 0.2915 2046 +2048 4 156.6616 150.198 96.8103 0.2605 2047 +2049 4 156.2304 149.3995 97.7693 0.2601 2048 +2050 4 155.7579 148.5976 97.071 0.3911 2049 +2051 4 155.3323 147.7636 96.9422 0.3122 2050 +2052 4 154.8976 146.9548 98.4326 0.1401 2051 +2053 4 154.3245 146.0613 98.84 0.1144 2052 +2054 4 153.6049 145.3143 98.8308 0.1182 2053 +2055 4 152.8155 144.5398 98.4931 0.1898 2054 +2056 4 152.2458 143.5926 98.7792 0.1846 2055 +2057 4 151.5537 142.8616 99.12 0.3122 2056 +2058 4 150.7563 142.2644 98.7109 0.2288 2057 +2059 4 149.9933 141.8331 99.6128 0.2669 2058 +2060 4 149.7004 140.9419 100.6138 0.3392 2059 +2061 4 149.3698 139.9329 101.39 0.2084 2060 +2062 4 149.1593 138.8553 102.0124 0.124 2061 +2063 4 148.5187 137.9264 102.2 0.1144 2062 +2064 4 147.6549 137.3143 102.4666 0.1144 2063 +2065 4 146.9937 136.4243 102.48 0.1336 2064 +2066 4 146.4755 135.4599 102.7869 0.1725 2065 +2067 4 146.2146 134.4349 103.1414 0.1635 2066 +2068 4 145.7559 133.5448 103.9004 0.1144 2067 +2069 4 145.3418 132.5198 104.16 0.1144 2068 +2070 4 144.4769 131.8952 104.2272 0.1225 2069 +2071 4 143.7081 131.1173 104.4291 0.2116 2070 +2072 4 143.5617 130.5693 106.3866 0.167 2071 +2073 4 143.1201 129.7182 106.6985 0.1939 2072 +2074 4 142.7815 128.7927 106.2384 0.2288 2073 +2075 4 142.4257 127.8614 106.7878 0.1907 2074 +2076 4 142.0779 127.0458 107.8 0.1714 2075 +2077 4 141.7038 125.9922 107.7997 0.1907 2076 +2078 4 141.0678 125.109 107.8246 0.1325 2077 +2079 4 140.2292 124.5278 108.5468 0.1144 2078 +2080 4 139.4547 123.7064 108.64 0.1144 2079 +2081 4 138.8587 122.9651 109.482 0.1144 2080 +2082 4 138.5338 122.0202 109.9134 0.1312 2081 +2083 4 137.9515 121.089 110.2469 0.1191 2082 +2084 4 137.1919 120.3133 111.0547 0.1514 2083 +2085 4 136.7034 119.3112 111.517 0.2034 2084 +2086 4 136.16 118.3376 112.0 0.162 2085 +2087 4 136.033 117.3241 112.572 0.116 2086 +2088 4 136.2298 116.2876 113.3457 0.1341 2087 +2089 4 136.0857 115.1791 113.68 0.1487 2088 +2090 4 135.7676 114.0822 113.68 0.2288 2089 +2091 4 135.3981 113.5568 113.96 0.3382 2090 +2092 4 134.8776 112.7799 114.7471 0.3216 2091 +2093 4 134.8421 111.7206 115.0932 0.265 2092 +2094 4 135.4416 110.8978 115.4829 0.2255 2093 +2095 4 135.6933 110.0838 114.0 0.2614 2094 +2096 4 135.6784 109.1147 114.408 0.2728 2095 +2097 4 135.9644 108.3403 116.1345 0.2731 2096 +2098 4 135.7734 107.3832 116.247 0.2754 2097 +2099 4 135.8157 106.3778 116.713 0.1801 2098 +2100 4 135.7562 105.2764 117.2979 0.2305 2099 +2101 4 135.4313 104.1866 117.4362 0.2765 2100 +2102 4 135.1762 103.141 118.1471 0.2258 2101 +2103 4 134.6808 102.7232 116.5688 0.1973 2102 +2104 4 134.6305 101.8254 115.64 0.2256 2103 +2105 4 134.6488 100.7918 116.0944 0.1144 2104 +2106 4 134.6911 100.0884 117.6512 0.148 2105 +2107 4 134.7815 99.3526 118.72 0.3813 2106 +2108 4 135.2116 98.4157 118.2686 0.3241 2107 +2109 4 135.2437 97.7976 116.3408 0.2519 2108 +2110 4 135.54 96.8788 117.32 0.1947 2109 +2111 4 135.6384 96.0939 116.9518 0.2655 2110 +2112 4 135.5686 95.3231 116.0323 0.2111 2111 +2113 4 135.961 94.9299 114.4307 0.2341 2112 +2114 4 136.247 93.8935 113.96 0.2448 2113 +2115 4 136.3568 92.8218 114.1753 0.2625 2114 +2116 4 136.4529 91.8987 115.36 0.1849 2115 +2117 4 137.0512 91.0443 115.5636 0.2385 2116 +2118 4 136.9402 90.948 118.258 0.1332 2117 +2119 4 136.9368 90.9226 121.0527 0.1144 2118 +2120 4 137.0512 90.5832 123.489 0.1144 2119 +2121 4 137.0638 89.7208 125.1228 0.1144 2120 +2122 4 137.0215 89.0255 127.1393 0.1349 2121 +2123 4 137.0592 88.0054 127.9911 0.2262 2122 +2124 4 137.1805 86.96 128.7784 0.1232 2123 +2125 4 137.8566 86.1886 129.0635 0.1719 2124 +2126 4 138.0808 85.5975 129.8321 0.2235 2125 +2127 4 138.6082 84.7646 130.188 0.1144 2126 +2128 4 139.2008 83.8653 130.76 0.2266 2127 +2129 4 139.465 83.1791 129.3804 0.1773 2128 +2130 4 140.2121 82.5405 129.2609 0.1562 2129 +2131 4 140.8264 81.6683 129.08 0.1182 2130 +2132 4 141.6215 80.9534 129.0187 0.1144 2131 +2133 4 142.5664 80.3992 128.5889 0.1144 2132 +2134 4 143.1178 79.4848 128.3582 0.1144 2133 +2135 4 143.2288 78.4465 128.4875 0.1144 2134 +2136 4 143.0149 77.6787 129.3454 0.1675 2135 +2137 4 143.1522 77.233 131.0431 0.2472 2136 +2138 4 143.4702 76.4309 132.16 0.2478 2137 +2139 4 143.8706 75.5771 132.6601 0.2069 2138 +2140 4 143.7962 74.8564 134.1166 0.1254 2139 +2141 4 143.3032 74.0542 135.2425 0.1144 2140 +2142 4 143.0801 73.2361 136.2155 0.1468 2141 +2143 4 143.2174 72.1136 136.08 0.2382 2142 +2144 4 143.4576 71.3856 136.64 0.1398 2143 +2145 4 135.3993 113.6063 114.2098 0.3051 2090 +2146 4 134.6705 113.0582 113.1259 0.2772 2145 +2147 4 134.2839 112.9949 114.6107 0.3276 2146 +2148 4 133.7771 112.7324 116.48 0.2415 2147 +2149 4 133.0724 112.0937 117.7081 0.2775 2148 +2150 4 132.9751 111.1348 118.6234 0.2504 2149 +2151 4 132.3414 110.3951 118.454 0.1563 2150 +2152 4 131.56 110.0009 119.576 0.273 2151 +2153 4 131.2111 109.3296 121.2224 0.1453 2152 +2154 4 130.6368 108.7944 122.2931 0.2055 2153 +2155 4 129.9607 108.2954 121.2926 0.265 2154 +2156 4 129.5225 107.9852 122.703 0.1314 2155 +2157 4 129.725 107.3733 124.2497 0.1478 2156 +2158 4 129.2892 106.8544 123.7054 0.2288 2157 +2159 4 128.5948 106.3221 124.88 0.2314 2158 +2160 4 128.3431 105.2986 125.5346 0.1652 2159 +2161 4 127.4553 104.8079 126.28 0.1144 2160 +2162 4 126.8971 104.0031 127.073 0.2605 2161 +2163 4 125.9418 103.4019 127.12 0.2765 2162 +2164 4 125.1742 102.8517 127.9116 0.1907 2163 +2165 4 124.4523 102.6348 129.64 0.1271 2164 +2166 4 123.5692 101.9666 129.92 0.1333 2165 +2167 4 122.8233 101.3039 130.7348 0.1265 2166 +2168 4 121.8028 100.8097 130.76 0.131 2167 +2169 4 120.9437 100.4054 131.224 0.2008 2168 +2170 4 120.0754 99.7797 130.6836 0.1849 2169 +2171 4 119.4061 99.3095 129.1987 0.1302 2170 +2172 4 118.515 99.143 128.6659 0.1144 2171 +2173 4 117.6696 98.5148 128.24 0.1144 2172 +2174 4 116.5496 98.384 128.4363 0.1144 2173 +2175 4 115.409 98.384 128.52 0.1194 2174 +2176 4 114.5167 98.384 129.7778 0.1619 2175 +2177 4 113.8957 98.4984 132.0063 0.2288 2176 +2178 4 113.0108 98.9001 132.0852 0.2868 2177 +2179 4 112.0936 99.2735 131.3301 0.2418 2178 +2180 4 111.1802 99.3057 131.068 0.2135 2179 +2181 4 110.123 99.362 131.0397 0.2287 2180 +2182 4 109.268 99.4342 132.02 0.2431 2181 +2183 4 108.3749 99.0196 131.6311 0.3178 2182 +2184 4 107.9407 98.8416 132.7418 0.3199 2183 +2185 4 107.5813 98.384 132.7782 0.1477 2184 +2186 4 107.269 98.023 131.2394 0.2898 2185 +2187 4 106.4616 97.3663 131.6078 0.1263 2186 +2188 4 105.8261 97.391 133.2612 0.1144 2187 +2189 4 105.6227 96.6324 133.56 0.1271 2188 +2190 4 105.4783 95.6784 132.9051 0.1907 2189 +2191 4 104.7904 95.5017 131.4712 0.1504 2190 +2192 4 104.719 94.465 130.975 0.2004 2191 +2193 4 104.7546 93.4246 131.0512 0.1788 2192 +2194 4 104.9176 92.3282 131.0501 0.1566 2193 +2195 4 105.1714 91.5068 129.8564 0.1522 2194 +2196 4 104.9646 90.7354 129.5868 0.2288 2195 +2197 4 105.1305 90.376 131.8929 0.1715 2196 +2198 4 105.0192 89.9533 133.387 0.313 2197 +2199 4 104.676 89.1177 132.6399 0.1953 2198 +2200 4 104.4472 88.307 133.5298 0.2743 2199 +2201 4 104.3328 87.3038 132.4621 0.2692 2200 +2202 4 104.0619 86.414 130.9991 0.1921 2201 +2203 4 103.2351 85.8715 130.3224 0.2015 2202 +2204 4 103.0362 85.1773 128.8319 0.1907 2203 +2205 4 103.293 84.8392 127.1651 0.155 2204 +2206 4 103.6284 83.8574 126.84 0.1981 2205 +2207 4 102.9944 83.0582 127.132 0.1682 2206 +2208 4 102.325 82.3305 126.9036 0.3387 2207 +2209 4 102.1894 81.4099 126.5561 0.1382 2208 +2210 4 101.5258 80.9671 124.6666 0.2407 2209 +2211 4 101.2654 80.3004 123.9762 0.1228 2210 +2212 4 101.538 79.6142 124.1198 0.2542 2211 +2213 4 101.5872 78.8216 124.04 0.2542 2212 +2214 4 107.6236 98.956 132.314 0.249 2183 +2215 4 107.0173 99.6743 131.8738 0.2094 2214 +2216 4 106.4612 100.224 130.5581 0.1718 2215 +2217 4 105.7241 100.6961 131.5591 0.1652 2216 +2218 4 105.3258 101.2052 133.0 0.2547 2217 +2219 4 104.5105 101.914 132.7306 0.2672 2218 +2220 4 103.7482 102.3552 133.7563 0.1605 2219 +2221 4 103.0297 102.8874 134.3734 0.1922 2220 +2222 4 102.4516 103.6337 134.0268 0.2288 2221 +2223 4 101.816 103.9133 134.2132 0.2288 2222 +2224 4 101.6215 104.0517 134.9334 0.1416 2222 +2225 4 100.8323 104.4483 134.7819 0.2519 2224 +2226 4 100.2006 104.9818 135.4564 0.1777 2225 +2227 4 99.5304 105.5897 134.6374 0.1144 2226 +2228 4 99.1649 106.396 135.5973 0.142 2227 +2229 4 98.4944 106.9781 136.8906 0.1144 2228 +2230 4 97.8302 107.3853 138.1134 0.2188 2229 +2231 4 97.2462 107.7832 139.806 0.1657 2230 +2232 4 97.0504 108.4184 139.7536 0.2012 2231 +2233 4 96.6121 109.1376 140.4455 0.2718 2232 +2234 4 96.2954 109.7806 141.9558 0.2051 2233 +2235 4 95.3715 109.824 143.2668 0.2034 2234 +2236 4 94.4802 110.2816 143.5031 0.2134 2235 +2237 4 93.6863 110.4196 144.8868 0.1568 2236 +2238 4 93.1176 111.073 144.9384 0.1398 2237 +2239 4 92.3406 110.968 143.7419 0.2631 2238 +2240 4 91.5187 110.8489 145.4379 0.1954 2239 +2241 4 90.5336 110.5398 146.5738 0.1652 2240 +2242 4 89.9027 110.7393 148.6492 0.178 2241 +2243 4 88.9348 111.0824 147.9848 0.2539 2242 +2244 4 87.9145 110.9666 146.886 0.1586 2243 +2245 4 86.8543 111.2734 146.7357 0.1652 2244 +2246 4 85.9644 111.8899 147.499 0.1652 2245 +2247 4 85.1134 112.2264 148.4115 0.1905 2246 +2248 4 84.7254 112.2592 150.6086 0.1499 2247 +2249 4 83.9685 112.6759 151.5816 0.2261 2248 +2250 4 83.2832 112.4552 149.8 0.1525 2249 +2251 4 223.8064 247.0079 61.161 0.2799 1920 +2252 4 224.224 247.9048 59.92 0.2796 2251 +2253 4 248.3876 280.598 49.28 0.3178 1869 +2254 4 248.5306 279.4792 50.3552 0.2932 2253 +2255 4 249.3497 278.9861 51.3752 0.2613 2254 +2256 4 249.1907 278.0355 50.5926 0.1907 2255 +2257 4 249.5064 277.1512 51.711 0.242 2256 +2258 4 249.527 276.2806 52.5893 0.2756 2257 +2259 4 250.3232 275.6662 51.8263 0.138 2258 +2260 4 250.5463 274.6538 52.3508 0.2656 2259 +2261 4 250.9032 273.8999 52.4465 0.1332 2260 +2262 4 250.8792 272.812 52.92 0.1707 2261 +2263 4 251.227 271.8853 53.2734 0.2374 2262 +2264 4 251.6583 271.239 53.7068 0.2372 2263 +2265 4 251.7944 270.4576 54.2497 0.2288 2264 +2266 4 251.7944 269.5447 55.0642 0.2288 2265 +2267 4 251.68 268.8469 54.962 0.3373 2266 +2268 4 252.1902 268.165 55.5307 0.115 2267 +2269 4 252.7222 267.3551 54.7929 0.2075 2268 +2270 4 253.1478 266.5394 56.1554 0.2224 2269 +2271 4 253.7323 265.6059 56.203 0.2669 2270 +2272 4 253.396 264.725 56.5452 0.2542 2271 +2273 4 253.1066 263.7778 56.3046 0.2288 2272 +2274 4 253.6751 262.8489 56.3634 0.2504 2273 +2275 4 254.3112 262.2197 56.6989 0.3893 2274 +2276 4 254.6544 261.404 58.002 0.2911 2275 +2277 4 254.5812 260.3504 57.6265 0.1184 2276 +2278 4 253.9188 259.9088 56.7602 0.1326 2277 +2279 4 253.7312 259.3448 57.5523 0.3715 2278 +2280 4 253.865 258.5577 57.1096 0.178 2279 +2281 4 254.8043 258.417 57.148 0.323 2280 +2282 4 255.6325 258.0944 58.0398 0.2039 2281 +2283 4 256.3315 257.4389 58.3862 0.1652 2282 +2284 4 257.3451 257.154 58.7997 0.2627 2283 +2285 4 258.147 256.8612 60.1888 0.1785 2284 +2286 4 259.1412 256.4848 60.2 0.243 2285 +2287 4 259.8859 256.8989 61.3021 0.3069 2286 +2288 4 260.641 257.5144 62.6268 0.1907 2287 +2289 4 261.4395 258.1802 63.7185 0.2503 2288 +2290 4 261.9463 257.8656 65.1568 0.1144 2289 +2291 4 262.4691 258.3827 66.36 0.1144 2290 +2292 4 263.1543 258.7579 64.6996 0.1968 2291 +2293 4 264.0146 259.0165 63.9954 0.2161 2292 +2294 4 265.0065 259.4295 63.84 0.2722 2293 +2295 4 265.6746 259.5976 65.3114 0.269 2294 +2296 4 266.5074 259.4558 65.9789 0.2196 2295 +2297 4 267.0714 258.6778 66.6439 0.2637 2296 +2298 4 268.0232 258.6275 67.4579 0.1433 2297 +2299 4 268.6318 257.9663 67.7295 0.2168 2298 +2300 4 269.5687 257.376 68.2223 0.2438 2299 +2301 4 270.3261 256.8337 68.8433 0.1525 2300 +2302 4 270.1476 256.6084 66.3426 0.1834 2301 +2303 4 270.7871 256.5981 65.24 0.1525 2302 +2304 4 271.128 256.4699 66.9774 0.2399 2303 +2305 4 271.5822 256.3326 69.3199 0.3499 2304 +2306 4 272.4619 255.9757 69.1911 0.233 2305 +2307 4 272.9447 255.3934 70.7585 0.1144 2306 +2308 4 273.416 254.8409 70.0694 0.2082 2307 +2309 4 274.0704 254.2048 70.6558 0.2043 2308 +2310 4 275.0691 253.8067 70.5488 0.2692 2309 +2311 4 275.7189 252.951 70.8397 0.2028 2310 +2312 4 276.7176 252.7004 70.4701 0.1144 2311 +2313 4 277.2701 252.4808 72.3192 0.1144 2312 +2314 4 278.2803 252.1765 73.1259 0.1223 2313 +2315 4 279.311 251.7361 73.36 0.1673 2314 +2316 4 280.0798 250.9456 73.8038 0.1907 2315 +2317 4 280.5786 250.0315 74.1401 0.2049 2316 +2318 4 281.4801 249.6208 73.64 0.1314 2317 +2319 4 282.1104 248.9722 74.7093 0.2135 2318 +2320 4 282.1928 247.9677 74.8362 0.2397 2319 +2321 4 282.7385 247.255 75.9433 0.2288 2320 +2322 4 283.4706 246.8672 76.979 0.1185 2321 +2323 4 283.7028 245.7884 76.72 0.1144 2322 +2324 4 283.9294 244.6913 76.72 0.1144 2323 +2325 4 284.8308 244.0381 76.7138 0.1144 2324 +2326 4 285.3056 243.1229 76.44 0.1144 2325 +2327 4 285.4886 242.4159 77.8445 0.1507 2326 +2328 4 285.476 241.6082 78.1063 0.2577 2327 +2329 4 286.1659 240.7708 78.4 0.2346 2328 +2330 4 286.4793 239.8339 79.2714 0.1907 2329 +2331 4 287.4254 239.2973 79.3766 0.2703 2330 +2332 4 288.4093 238.9187 80.0892 0.1144 2331 +2333 4 288.6552 238.2758 82.0187 0.1994 2332 +2334 4 289.3336 238.1808 80.421 0.1743 2333 +2335 4 289.7626 237.6145 78.797 0.3321 2334 +2336 4 290.2408 237.7918 79.8389 0.1907 2335 +2337 4 290.8208 237.0265 81.3596 0.1907 2336 +2338 4 291.402 236.2612 82.88 0.1907 2337 +2339 4 291.768 235.8928 83.5344 0.1144 2338 +2340 4 292.2703 235.7292 85.9606 0.1144 2339 +2341 4 292.5723 234.9776 87.0643 0.1144 2340 +2342 4 292.6352 233.853 86.8 0.1144 2341 +2343 4 292.6352 232.709 86.8 0.1144 2342 +2344 4 292.6283 231.5868 87.0794 0.1405 2343 +2345 4 292.7496 230.7448 87.92 0.178 2344 +2346 4 291.1549 236.3698 82.885 0.1265 2338 +2347 4 290.7076 237.1066 84.3951 0.2151 2346 +2348 4 290.2328 237.7232 85.68 0.1525 2347 +2349 4 260.3744 257.5144 63.0 0.1652 2288 +2350 4 247.8796 280.4196 48.72 0.2415 2253 +2351 4 256.0112 296.6975 44.9501 0.3236 1849 +2352 4 254.9015 296.7364 45.6288 0.2929 2351 +2353 4 253.9497 296.8577 44.9366 0.3467 2352 +2354 4 253.0974 296.7479 45.8354 0.1963 2353 +2355 4 252.562 297.4995 45.8088 0.2974 2354 +2356 4 252.061 298.2625 46.1437 0.1754 2355 +2357 4 251.7178 298.9272 45.7472 0.281 2356 +2358 4 251.0188 299.7028 46.1378 0.2444 2357 +2359 4 250.8792 300.5288 45.9091 0.1265 2358 +2360 4 250.3484 300.9715 45.1931 0.1144 2359 +2361 4 249.4892 301.0676 46.3456 0.1811 2360 +2362 4 248.4951 300.9864 46.9482 0.1591 2361 +2363 4 247.5307 301.1443 46.9288 0.2089 2362 +2364 4 246.5 301.2198 46.762 0.178 2363 +2365 4 245.4887 301.6248 47.0109 0.1915 2364 +2366 4 244.6021 302.0492 46.2 0.1165 2365 +2367 4 244.3801 302.9049 46.5077 0.2556 2366 +2368 4 243.863 303.8075 47.2077 0.1602 2367 +2369 4 243.4729 304.5568 46.9384 0.1739 2368 +2370 4 243.4672 305.6127 46.7082 0.2855 2369 +2371 4 243.5542 306.4707 47.4116 0.3405 2370 +2372 4 243.577 307.3951 48.5206 0.3191 2371 +2373 4 243.9992 308.1318 48.7589 0.2129 2372 +2374 4 243.5576 308.8972 48.5593 0.1179 2373 +2375 4 243.5576 309.6362 46.7286 0.2052 2374 +2376 4 243.2144 310.4267 45.4168 0.1329 2375 +2377 4 243.434 311.3648 45.8693 0.2063 2376 +2378 4 243.4066 312.0512 47.6 0.2262 2377 +2379 4 243.0108 313.0728 47.1414 0.1305 2378 +2380 4 242.5349 313.9571 46.5548 0.2086 2379 +2381 4 242.1676 315.0187 46.4145 0.2542 2380 +2382 4 241.8256 315.99 45.876 0.1723 2381 +2383 4 241.1884 316.8388 45.64 0.2481 2382 +2384 4 240.1233 317.1145 45.6218 0.1734 2383 +2385 4 239.3202 317.3811 45.1825 0.1563 2384 +2386 4 238.349 317.6934 45.1732 0.1953 2385 +2387 4 237.7953 318.612 45.5972 0.1612 2386 +2388 4 237.2816 319.5112 44.8636 0.1991 2387 +2389 4 236.4648 320.185 44.8146 0.1443 2388 +2390 4 235.7201 320.6666 44.24 0.1144 2389 +2391 4 235.1606 321.6642 44.24 0.1144 2390 +2392 4 234.544 322.5565 43.701 0.1144 2391 +2393 4 234.099 323.5735 43.96 0.1144 2392 +2394 4 233.9354 324.6786 43.7427 0.1144 2393 +2395 4 233.1426 325.2792 43.68 0.1144 2394 +2396 4 232.7811 326.3386 43.615 0.1144 2395 +2397 4 232.0032 326.9792 43.4 0.1144 2396 +2398 4 231.6714 328.002 43.4 0.1144 2397 +2399 4 231.3637 329.0762 43.4 0.1144 2398 +2400 4 231.1429 330.1264 43.209 0.1144 2399 +2401 4 230.7723 330.7579 42.6717 0.2008 2400 +2402 4 230.6304 331.7543 43.4437 0.1678 2401 +2403 4 230.5961 332.8846 43.12 0.1398 2402 +2404 4 230.341 333.9828 43.4 0.1489 2403 +2405 4 229.9543 335.0318 43.12 0.1244 2404 +2406 4 229.7484 336.1381 43.12 0.1144 2405 +2407 4 229.5711 337.2649 43.12 0.1144 2406 +2408 4 229.4864 338.346 42.5877 0.1144 2407 +2409 4 229.0723 339.3539 43.12 0.1144 2408 +2410 4 229.0288 340.4544 43.12 0.1144 2409 +2411 4 290.1184 350.8454 35.0 0.3686 1682 +2412 4 290.4113 349.9439 34.1653 0.2466 2411 +2413 4 289.8027 349.4085 33.7159 0.1479 2412 +2414 4 290.2328 348.7106 35.1868 0.3321 2413 +2415 4 290.4948 347.7119 35.56 0.2963 2414 +2416 4 290.0166 346.8482 34.7208 0.3306 2415 +2417 4 289.8267 345.9353 35.4668 0.2613 2416 +2418 4 289.7752 345.0373 33.8705 0.1435 2417 +2419 4 289.6608 343.9882 33.1139 0.2542 2418 +2420 4 289.7798 343.0753 33.6806 0.208 2419 +2421 4 289.7752 342.175 34.5044 0.2156 2420 +2422 4 290.1378 341.1282 34.44 0.1179 2421 +2423 4 290.1184 340.6603 32.5077 0.3472 2422 +2424 4 290.1184 339.768 33.32 0.2415 2423 +2425 4 290.29 339.4065 32.8076 0.2082 2424 +2426 4 290.6492 339.196 30.3363 0.2288 2425 +2427 4 291.299 339.5323 31.306 0.2288 2426 +2428 4 291.8321 339.871 30.9137 0.3713 2427 +2429 4 292.7748 339.9911 31.1419 0.2288 2428 +2430 4 293.3308 340.0151 32.2 0.2321 2429 +2431 4 293.7872 340.7679 30.8314 0.2122 2430 +2432 4 294.5869 340.8296 30.081 0.3149 2431 +2433 4 295.3888 341.2632 30.7476 0.2161 2432 +2434 4 296.3132 341.1397 29.7128 0.2791 2433 +2435 4 297.4194 340.9131 29.96 0.1788 2434 +2436 4 298.1447 340.9989 28.5631 0.2661 2435 +2437 4 298.9192 341.6213 29.1942 0.2849 2436 +2438 4 299.9053 342.0423 29.986 0.2629 2437 +2439 4 300.6821 341.3993 29.7195 0.3051 2438 +2440 4 301.6614 341.2186 29.3048 0.1683 2439 +2441 4 302.6864 340.912 29.68 0.3548 2440 +2442 4 303.303 340.2199 28.4917 0.341 2441 +2443 4 304.2662 339.8172 27.7732 0.2851 2442 +2444 4 305.067 339.3642 28.3984 0.171 2443 +2445 4 305.6002 338.5794 28.94 0.1444 2444 +2446 4 306.1344 337.9147 29.6363 0.2804 2445 +2447 4 306.3655 337.8003 27.72 0.2755 2446 +2448 4 307.2006 337.4262 27.7794 0.3077 2447 +2449 4 307.8435 336.8886 28.7468 0.2211 2448 +2450 4 308.6501 336.241 28.2559 0.3305 2449 +2451 4 309.4074 335.9928 27.9028 0.2812 2450 +2452 4 310.1933 335.4505 27.5775 0.3529 2451 +2453 4 310.834 334.668 27.1043 0.37 2452 +2454 4 311.7549 334.1075 26.6213 0.2924 2453 +2455 4 312.8096 333.8615 27.1384 0.309 2454 +2456 4 313.5578 333.1957 27.6273 0.3557 2455 +2457 4 314.0566 332.5448 26.9713 0.3299 2456 +2458 4 314.8929 332.0815 26.5826 0.2924 2457 +2459 4 315.6536 331.3688 26.8442 0.2492 2458 +2460 4 316.4762 330.7453 26.6924 0.1984 2459 +2461 4 317.1694 330.2854 27.4565 0.3131 2460 +2462 4 317.9165 330.6046 27.3935 0.316 2461 +2463 4 318.4656 329.8575 27.4991 0.2241 2462 +2464 4 318.604 328.8657 27.5164 0.3144 2463 +2465 4 318.572 327.8006 28.3119 0.2524 2464 +2466 4 318.9483 326.9609 29.3812 0.2161 2465 +2467 4 319.7629 326.4473 28.5135 0.3273 2466 +2468 4 320.5202 325.9096 28.6572 0.3073 2467 +2469 4 321.297 325.206 28.6513 0.1497 2468 +2470 4 321.996 324.634 27.8844 0.2924 2469 +2471 4 322.7602 323.8618 28.1249 0.2669 2470 +2472 4 323.2864 323.2658 28.84 0.1757 2471 +2473 4 323.887 322.6057 28.1473 0.1496 2472 +2474 4 324.3984 321.9102 27.9451 0.1803 2473 +2475 4 324.9738 321.337 27.5022 0.1526 2474 +2476 4 326.0148 320.9034 27.48 0.2161 2475 +2477 4 326.7527 320.0763 27.3938 0.2034 2476 +2478 4 326.8111 318.9666 26.9954 0.256 2477 +2479 4 326.7264 317.8512 26.5798 0.2669 2478 +2480 4 327.2412 317.3708 25.2857 0.2952 2479 +2481 4 328.3406 317.2198 25.3772 0.3064 2480 +2482 4 328.9995 316.7267 25.9823 0.22 2481 +2483 4 329.7088 315.9579 25.947 0.3516 2482 +2484 4 330.2511 315.1022 26.04 0.2509 2483 +2485 4 330.6103 314.0795 25.6869 0.3305 2484 +2486 4 330.5771 313.3096 24.4042 0.2615 2485 +2487 4 331.2807 312.5614 23.4982 0.2221 2486 +2488 4 332.2885 312.185 22.6657 0.2995 2487 +2489 4 333.2312 311.6062 22.5624 0.2161 2488 +2490 4 334.1624 311.2355 22.414 0.2334 2489 +2491 4 335.152 311.3224 21.9624 0.3368 2490 +2492 4 336.1552 311.7743 21.3206 0.2343 2491 +2493 4 336.8519 311.6348 22.0352 0.2195 2492 +2494 4 337.5967 310.9827 21.1904 0.2548 2493 +2495 4 338.4181 310.7218 21.2789 0.2592 2494 +2496 4 339.4648 310.596 21.4693 0.3053 2495 +2497 4 340.2256 310.1407 21.5516 0.3298 2496 +2498 4 340.9555 309.5687 22.526 0.2209 2497 +2499 4 341.6053 309.3342 21.0 0.1652 2498 +2500 4 342.628 308.9178 20.6268 0.2288 2499 +2501 4 343.4196 309.7483 21.2587 0.1592 2500 +2502 4 344.0706 310.6463 21.7641 0.1398 2501 +2503 4 344.7581 311.4712 22.0494 0.1639 2502 +2504 4 345.8461 311.1543 22.1822 0.1652 2503 +2505 4 346.9741 311.1394 21.947 0.152 2504 +2506 4 347.9247 310.8591 21.7479 0.1373 2505 +2507 4 348.5448 309.8982 21.7862 0.1301 2506 +2508 4 348.7884 308.832 21.6224 0.1271 2507 +2509 4 348.8273 307.7017 21.5869 0.1334 2508 +2510 4 348.7621 306.5794 21.5572 0.1464 2509 +2511 4 348.2588 305.6951 21.3786 0.1525 2510 +2512 4 348.0597 303.6634 19.4102 0.3116 2511 +2513 4 348.8971 302.9335 19.32 0.3178 2512 +2514 4 349.7963 302.27 19.465 0.287 2513 +2515 4 350.6921 301.7231 19.7728 0.2712 2514 +2516 4 351.3052 301.6842 19.8923 0.2148 2515 +2517 4 352.0157 300.9338 19.5054 0.2796 2516 +2518 4 352.4344 300.0163 20.16 0.1814 2517 +2519 4 352.6792 299.1194 19.88 0.1584 2518 +2520 4 353.2786 298.7041 19.0756 0.1398 2519 +2521 4 353.6035 297.6985 19.3934 0.2977 2520 +2522 4 353.5692 296.6289 18.7415 0.3153 2521 +2523 4 353.4285 295.7526 18.6782 0.1255 2522 +2524 4 353.48 294.8912 19.4062 0.3417 2523 +2525 4 353.1528 293.8947 19.206 0.2313 2524 +2526 4 353.2306 292.9178 18.76 0.3296 2525 +2527 4 353.178 291.8561 19.32 0.1861 2526 +2528 4 353.7442 290.8929 19.6078 0.1939 2527 +2529 4 353.9399 289.8061 20.0869 0.2208 2528 +2530 4 354.0783 288.7307 20.72 0.2025 2529 +2531 4 354.64 288.288 19.32 0.1525 2530 +2532 4 343.1371 308.4258 20.5128 0.2366 2500 +2533 4 290.0921 338.4604 34.3658 0.1388 2424 +2534 4 290.0681 337.6962 32.3868 0.2924 2533 +2535 4 290.1047 337.4777 31.3883 0.1519 2534 +2536 4 289.4103 336.7959 30.8266 0.2706 2535 +2537 4 289.3588 335.8052 31.08 0.2542 2536 +2538 4 289.3176 334.8888 29.9827 0.2542 2537 +2539 4 289.5372 334.2219 28.9201 0.3969 2538 +2540 4 289.3142 333.4131 29.8189 0.2867 2539 +2541 4 289.0122 332.5722 30.6541 0.2061 2540 +2542 4 288.2491 331.9064 30.4088 0.131 2541 +2543 4 288.0958 331.1594 29.0746 0.1525 2542 +2544 4 287.9448 330.5405 29.972 0.2796 2543 +2545 4 287.819 329.7534 28.651 0.2039 2544 +2546 4 287.6222 328.9275 28.2212 0.2415 2545 +2547 4 287.2344 327.9974 28.0 0.2619 2546 +2548 4 286.4061 327.43 28.5463 0.1818 2547 +2549 4 285.3788 327.1485 27.9919 0.2734 2548 +2550 4 284.8766 326.3946 26.9802 0.3022 2549 +2551 4 284.0049 325.8123 26.8688 0.2417 2550 +2552 4 283.4809 325.0962 26.9111 0.2415 2551 +2553 4 283.1148 324.2988 27.1603 0.1528 2552 +2554 4 282.2671 324.0929 26.476 0.117 2553 +2555 4 281.2982 323.752 26.6874 0.1669 2554 +2556 4 280.4196 323.8161 26.63 0.1611 2555 +2557 4 279.5787 323.3745 26.857 0.2408 2556 +2558 4 278.4976 323.0702 26.6916 0.2163 2557 +2559 4 277.6259 322.9489 25.76 0.2853 2558 +2560 4 276.9498 322.2396 26.3388 0.2186 2559 +2561 4 275.9774 322.0703 25.7673 0.2288 2560 +2562 4 274.981 321.9559 24.6616 0.3012 2561 +2563 4 274.2431 321.8312 25.9028 0.2474 2562 +2564 4 273.1449 321.9216 25.716 0.3025 2563 +2565 4 272.4242 322.5028 24.638 0.2892 2564 +2566 4 271.748 322.5508 22.7035 0.2638 2565 +2567 4 270.8477 322.6892 23.0023 0.2004 2566 +2568 4 269.857 322.862 22.4932 0.1907 2567 +2569 4 269.412 322.8162 22.7172 0.2383 2568 +2570 4 268.9544 322.4936 23.8 0.1398 2569 +2571 4 269.2713 322.9512 22.4319 0.24 2568 +2572 4 268.284 323.2006 22.0886 0.2415 2571 +2573 4 267.3356 323.1892 21.7022 0.2669 2572 +2574 4 266.3507 322.989 21.1994 0.2325 2573 +2575 4 265.8301 323.4969 22.8928 0.1907 2574 +2576 4 265.2982 323.9888 21.6639 0.2246 2575 +2577 4 265.1872 324.7564 21.0683 0.1221 2576 +2578 4 264.6083 325.3536 21.2783 0.2289 2577 +2579 4 263.8007 325.6396 21.0157 0.1779 2578 +2580 4 262.6956 325.5515 21.0356 0.3021 2579 +2581 4 261.7072 325.5927 21.4749 0.1282 2580 +2582 4 260.9281 325.7517 21.7305 0.2034 2581 +2583 4 260.0575 325.7746 21.0339 0.1907 2582 +2584 4 259.3448 325.905 21.3052 0.1456 2583 +2585 4 258.7797 326.2139 19.3486 0.1671 2584 +2586 4 257.7661 326.1498 19.1464 0.2288 2585 +2587 4 257.4 326.3821 20.4674 0.1144 2586 +2588 4 256.8108 325.7929 20.6774 0.2033 2587 +2589 4 256.1473 325.2403 19.0994 0.2658 2588 +2590 4 255.0914 325.1648 19.0725 0.2533 2589 +2591 4 254.7345 324.6089 18.1877 0.2615 2590 +2592 4 253.7872 324.1959 17.8245 0.2412 2591 +2593 4 252.9567 323.5198 17.92 0.1234 2592 +2594 4 252.0461 323.0873 17.5305 0.1429 2593 +2595 4 251.1046 323.6079 17.3564 0.2542 2594 +2596 4 250.3266 323.172 16.3918 0.2288 2595 +2597 4 249.3028 322.8757 17.2875 0.1718 2596 +2598 4 248.3166 322.9523 16.9501 0.2277 2597 +2599 4 247.7904 322.9512 15.68 0.2669 2598 +2600 4 289.4446 338.2614 32.2 0.2674 2534 +2601 4 289.7752 339.3104 31.92 0.2669 2600 +2602 4 293.2598 361.4102 35.4603 0.3043 1673 +2603 4 293.5035 361.5601 38.1721 0.1891 2602 +2604 4 294.1533 361.7282 39.6091 0.1271 2603 +2605 4 294.9987 362.4787 39.6463 0.138 2604 +2606 4 295.1612 363.4911 39.6082 0.1811 2605 +2607 4 294.4782 364.3514 39.48 0.2161 2606 +2608 4 293.9394 364.8811 39.8709 0.1565 2607 +2609 4 293.4234 364.4143 42.0932 0.2669 2608 +2610 4 293.436 364.7861 41.6783 0.1652 2609 +2611 4 293.7609 365.6224 41.16 0.1485 2610 +2612 4 294.572 366.2596 41.461 0.1923 2611 +2613 4 295.1589 367.2274 41.7816 0.3514 2612 +2614 4 295.4952 368.2708 42.1366 0.3822 2613 +2615 4 295.6096 369.385 42.5919 0.2795 2614 +2616 4 296.2331 370.0588 43.7928 0.185 2615 +2617 4 296.5317 371.0942 43.7464 0.1497 2616 +2618 4 297.3256 371.8 43.4 0.2288 2617 +2619 4 292.4053 364.936 41.7189 0.3181 2609 +2620 4 291.8802 365.0504 43.143 0.3432 2619 +2621 4 290.7728 365.0321 43.5554 0.286 2620 +2622 4 289.8976 364.7072 42.7706 0.2392 2621 +2623 4 289.1368 364.7358 42.8515 0.2048 2622 +2624 4 288.24 364.1386 43.5266 0.3156 2623 +2625 4 287.3602 363.4614 43.68 0.4449 2624 +2626 4 286.3112 363.5632 44.5917 0.3148 2625 +2627 4 285.3834 363.832 45.808 0.1718 2626 +2628 4 284.3172 363.6776 45.6646 0.2382 2627 +2629 4 283.4443 363.0793 45.7114 0.272 2628 +2630 4 282.5383 362.9866 46.6374 0.194 2629 +2631 4 281.6173 362.6926 46.7496 0.1398 2630 +2632 4 280.8188 363.403 46.6312 0.3362 2631 +2633 4 279.7824 363.5174 47.031 0.3419 2632 +2634 4 279.1463 362.9912 48.0472 0.3432 2633 +2635 4 278.3947 362.4501 48.5447 0.2644 2634 +2636 4 277.5367 362.4192 50.2354 0.1211 2635 +2637 4 276.411 362.4718 50.4969 0.1662 2636 +2638 4 275.3379 362.6789 49.9425 0.2415 2637 +2639 4 274.4902 363.1399 49.84 0.2924 2638 +2640 4 273.877 363.1319 51.6174 0.3344 2639 +2641 4 273.0522 362.5588 51.9669 0.2843 2640 +2642 4 272.2491 362.5588 50.4311 0.2571 2641 +2643 4 271.3774 362.6308 51.52 0.1708 2642 +2644 4 270.2677 362.4215 51.52 0.1165 2643 +2645 4 269.2999 362.1618 50.7111 0.2004 2644 +2646 4 268.7084 362.1801 52.0719 0.2321 2645 +2647 4 267.7589 361.7454 51.333 0.2797 2646 +2648 4 266.7808 361.5418 51.7672 0.2789 2647 +2649 4 266.3209 361.6882 53.6942 0.3985 2648 +2650 4 265.4057 362.0474 53.4526 0.2439 2649 +2651 4 264.574 362.489 53.4411 0.2783 2650 +2652 4 263.954 362.7624 55.3714 0.1711 2651 +2653 4 263.1749 362.3746 55.6721 0.2334 2652 +2654 4 262.5286 362.8642 54.3262 0.2913 2653 +2655 4 261.6545 362.9866 55.9026 0.1447 2654 +2656 4 260.84 363.6559 56.5356 0.1864 2655 +2657 4 260.0243 364.1466 55.44 0.2384 2656 +2658 4 259.3494 364.7072 56.467 0.1685 2657 +2659 4 258.9787 365.532 57.4 0.1652 2658 +2660 4 258.989 366.4575 57.4445 0.323 2659 +2661 4 258.6332 367.1954 58.905 0.2582 2660 +2662 4 258.7213 367.6599 60.2 0.2539 2661 +2663 4 258.2591 368.4241 60.944 0.3108 2662 +2664 4 257.567 367.9161 59.5952 0.1271 2663 +2665 4 257.019 368.1117 58.0854 0.1233 2664 +2666 4 256.3876 368.9011 58.2106 0.1144 2665 +2667 4 256.256 370.0314 58.24 0.1144 2666 +2668 4 255.6863 370.4364 59.7954 0.1144 2667 +2669 4 254.9312 370.5988 61.8593 0.1144 2668 +2670 4 254.1751 370.7624 63.9234 0.1144 2669 +2671 4 253.976 371.7714 64.1962 0.1144 2670 +2672 4 253.7495 372.8788 64.1962 0.1144 2671 +2673 4 253.2553 373.897 64.1962 0.1144 2672 +2674 4 252.1387 373.6487 64.1962 0.1144 2673 +2675 4 251.203 373.3684 65.2669 0.1144 2674 +2676 4 250.401 373.063 67.118 0.1144 2675 +2677 4 249.5041 373.055 68.2506 0.1144 2676 +2678 4 248.4562 373.516 68.2506 0.1144 2677 +2679 4 247.4701 373.6533 68.2506 0.1144 2678 +2680 4 246.6922 372.9715 68.9321 0.1144 2679 +2681 4 245.9669 372.5036 70.7717 0.1144 2680 +2682 4 245.1981 372.0196 72.305 0.1144 2681 +2683 4 244.2074 371.4476 72.305 0.1144 2682 +2684 4 243.2167 370.8745 72.305 0.1144 2683 +2685 4 242.226 370.3025 72.305 0.1144 2684 +2686 4 241.2273 369.8209 72.305 0.1144 2685 +2687 4 240.1439 370.1915 72.305 0.1144 2686 +2688 4 239.0617 370.5622 72.305 0.1144 2687 +2689 4 237.9692 370.8379 72.305 0.1144 2688 +2690 4 237.0174 370.4558 72.8028 0.1144 2689 +2691 4 236.3367 369.6825 74.0242 0.1144 2690 +2692 4 235.6571 368.9091 75.2455 0.1144 2691 +2693 4 234.9925 368.114 76.3596 0.1144 2692 +2694 4 234.4811 367.0913 76.3596 0.1144 2693 +2695 4 233.9709 366.0674 76.3596 0.1144 2694 +2696 4 233.5018 365.0252 76.3596 0.1144 2695 +2697 4 233.0854 363.9602 76.3596 0.1144 2696 +2698 4 232.6679 362.894 76.3596 0.1144 2697 +2699 4 232.2503 361.8289 76.3596 0.1144 2698 +2700 4 231.8694 360.7547 76.3596 0.1144 2699 +2701 4 231.4953 359.8132 76.3596 0.117 2700 +2702 4 230.3661 359.6256 76.3596 0.1303 2701 +2703 4 229.3628 359.2309 76.3596 0.1511 2702 +2704 4 228.665 358.3237 76.3596 0.1907 2703 +2705 4 295.0822 364.602 38.6672 0.3194 2607 +2706 4 295.9951 364.7495 37.52 0.2414 2705 +2707 4 296.1976 363.7828 36.4311 0.2886 2706 +2708 4 296.5717 363.3996 38.5311 0.1894 2707 +2709 4 297.3828 363.1056 39.76 0.1186 2708 +2710 4 298.3975 362.7624 39.5097 0.2107 2709 +2711 4 299.0691 363.3275 38.36 0.1144 2710 +2712 4 300.165 363.4488 38.36 0.157 2711 +2713 4 301.2747 363.2978 38.5571 0.2108 2712 +2714 4 302.3146 363.1159 39.48 0.2691 2713 +2715 4 303.1978 362.608 39.0286 0.2902 2714 +2716 4 303.9963 362.2682 38.0766 0.4112 2715 +2717 4 304.5751 361.7923 37.8834 0.2246 2716 +2718 4 304.8188 362.076 35.9254 0.3115 2717 +2719 4 305.7146 361.9616 35.9327 0.127 2718 +2720 4 306.4856 361.6996 35.9904 0.2119 2719 +2721 4 307.172 361.4891 37.3514 0.1144 2720 +2722 4 307.8264 360.8576 37.52 0.2955 2721 +2723 4 308.0769 359.8395 37.0423 0.3545 2722 +2724 4 308.7427 359.5375 38.6562 0.1591 2723 +2725 4 309.3445 359.0455 40.241 0.2827 2724 +2726 4 309.9233 358.7515 41.9989 0.1276 2725 +2727 4 310.8511 358.6932 41.1401 0.1282 2726 +2728 4 311.716 359.0913 40.4001 0.3788 2727 +2729 4 312.8074 359.1016 41.0239 0.3432 2728 +2730 4 313.8267 359.0536 41.44 0.2796 2729 +2731 4 314.8162 358.9872 41.8132 0.2796 2730 +2732 4 315.8939 358.9174 42.6574 0.2288 2731 +2733 4 317.0104 358.9849 42.84 0.2804 2732 +2734 4 318.1109 358.8522 42.707 0.3885 2733 +2735 4 319.1028 359.1794 41.7267 0.3426 2734 +2736 4 319.8269 359.47 43.0469 0.2311 2735 +2737 4 320.7684 359.7708 43.5072 0.2161 2736 +2738 4 321.5509 359.4642 44.3794 0.1729 2737 +2739 4 322.5142 359.1725 44.3442 0.2288 2738 +2740 4 323.1869 358.4186 43.4 0.1993 2739 +2741 4 323.9019 357.7288 42.9044 0.3753 2740 +2742 4 324.8422 357.8672 43.6657 0.3258 2741 +2743 4 325.5321 357.9931 42.383 0.3363 2742 +2744 4 326.358 358.3466 43.6738 0.2719 2743 +2745 4 326.8648 358.6749 42.84 0.2354 2744 +2746 4 327.9356 358.811 42.56 0.2541 2745 +2747 4 328.7467 359.2938 41.8317 0.2001 2746 +2748 4 329.8358 359.3304 42.0885 0.3305 2747 +2749 4 330.6274 359.3579 43.6836 0.237 2748 +2750 4 331.2578 360.0225 44.8 0.2979 2749 +2751 4 332.2325 360.4744 44.8 0.3162 2750 +2752 4 333.2895 360.8084 44.564 0.2288 2751 +2753 4 334.1121 361.3221 44.5886 0.2891 2752 +2754 4 334.7241 362.0302 44.24 0.2583 2753 +2755 4 335.0776 362.5336 45.6095 0.3418 2754 +2756 4 335.9356 362.9317 45.92 0.2924 2755 +2757 4 336.9389 363.4156 45.9584 0.3442 2756 +2758 4 337.7546 364.1386 46.1555 0.4909 2757 +2759 4 338.6114 364.6889 46.0813 0.2382 2758 +2760 4 339.156 365.1534 46.8138 0.3051 2759 +2761 4 340.0975 365.4634 47.2567 0.2929 2760 +2762 4 340.8823 365.6075 45.7307 0.3305 2761 +2763 4 341.5 366.0823 47.2892 0.3561 2762 +2764 4 342.4553 366.6566 47.1313 0.3167 2763 +2765 4 343.4551 367.1256 47.3796 0.2679 2764 +2766 4 344.447 367.5089 47.971 0.3038 2765 +2767 4 345.3828 367.8212 47.9027 0.2796 2766 +2768 4 346.4501 368.1129 47.6 0.2129 2767 +2769 4 347.5575 368.2467 47.2335 0.1539 2768 +2770 4 348.4521 368.638 47.5264 0.2593 2769 +2771 4 349.3341 369.1688 47.9419 0.2287 2770 +2772 4 350.4106 369.1688 48.16 0.2039 2771 +2773 4 351.0616 369.3232 46.76 0.3025 2772 +2774 4 352.098 369.7271 47.0159 0.1907 2773 +2775 4 353.1471 370.1481 46.9907 0.1837 2774 +2776 4 354.0611 370.5405 45.92 0.128 2775 +2777 4 354.8596 370.5416 47.1531 0.1481 2776 +2778 4 355.3264 371.0964 47.3718 0.144 2777 +2779 4 355.8366 371.7908 46.3669 0.1679 2778 +2780 4 356.3411 372.5676 47.7907 0.1644 2779 +2781 4 356.9246 373.4702 48.5654 0.1993 2780 +2782 4 357.5812 374.088 48.6797 0.2343 2781 +2783 4 357.8569 374.9792 49.4337 0.2916 2782 +2784 4 358.3054 375.7891 48.1631 0.2389 2783 +2785 4 358.8282 376.3302 49.5362 0.2258 2784 +2786 4 359.3647 377.0532 50.267 0.1917 2785 +2787 4 360.0534 377.8197 50.7931 0.1591 2786 +2788 4 360.6643 378.5462 51.2117 0.2669 2787 +2789 4 361.3564 379.3996 50.96 0.2916 2788 +2790 4 361.8575 380.3217 51.1081 0.2303 2789 +2791 4 362.195 381.0584 50.2555 0.1271 2790 +2792 4 362.8825 381.5869 49.28 0.1832 2791 +2793 4 363.6696 382.1029 50.2001 0.1144 2792 +2794 4 364.348 382.2607 52.3382 0.1552 2793 +2795 4 364.9852 383.1164 52.7881 0.2288 2794 +2796 4 365.9839 383.5386 53.0956 0.2622 2795 +2797 4 366.906 384.1403 53.503 0.2134 2796 +2798 4 367.7788 384.6265 53.2258 0.1316 2797 +2799 4 368.479 385.2763 54.4043 0.2344 2798 +2800 4 369.1002 386.0943 55.295 0.1384 2799 +2801 4 370.0108 386.6137 54.6507 0.2095 2800 +2802 4 371.0678 386.7624 54.7016 0.1652 2801 +2803 4 372.0277 387.1262 55.3468 0.2288 2802 +2804 4 372.833 387.061 56.0515 0.1559 2803 +2805 4 373.6945 387.1662 56.84 0.1255 2804 +2806 4 374.4701 387.9933 56.84 0.1144 2805 +2807 4 375.542 388.2358 57.12 0.1287 2806 +2808 4 376.2124 389.119 56.6913 0.1245 2807 +2809 4 376.8599 390.0136 57.1463 0.1144 2808 +2810 4 377.5566 390.8545 57.4 0.1682 2809 +2811 4 378.3906 391.5855 57.4781 0.1454 2810 +2812 4 379.4717 391.7502 57.96 0.1144 2811 +2813 4 380.5848 391.947 57.96 0.1144 2812 +2814 4 381.3501 392.6757 58.655 0.2223 2813 +2815 4 382.1635 393.2889 59.1808 0.1556 2814 +2816 4 382.4346 393.9936 60.5164 0.1144 2815 +2817 4 383.5615 393.9936 60.76 0.1144 2816 +2818 4 384.4984 394.251 61.0137 0.1144 2817 +2819 4 384.4984 395.3939 61.04 0.1144 2818 +2820 4 384.5545 396.5093 61.3186 0.1144 2819 +2821 4 385.5612 396.7392 61.768 0.1144 2820 +2822 4 386.2796 397.381 62.344 0.1721 2821 +2823 4 387.339 397.7253 62.16 0.1398 2822 +2824 4 387.8412 398.1944 62.72 0.1144 2823 +2825 4 388.2313 399.1336 63.4063 0.1313 2824 +2826 4 389.0607 399.256 64.6979 0.1144 2825 +2827 4 389.9496 399.3944 65.9674 0.1652 2826 +2828 4 390.4232 400.1712 66.0232 0.1144 2827 +2829 4 391.0146 400.2524 67.2 0.1353 2828 +2830 4 391.8989 400.559 68.278 0.1144 2829 +2831 4 392.9091 400.7421 69.5159 0.1144 2830 +2832 4 393.782 401.2145 70.2778 0.1144 2831 +2833 4 394.4386 402.1515 70.2778 0.1144 2832 +2834 4 395.0941 403.0884 70.2778 0.1144 2833 +2835 4 395.8297 403.959 70.2778 0.1144 2834 +2836 4 396.6385 404.7678 70.2778 0.1144 2835 +2837 4 397.4977 405.4828 70.835 0.1144 2836 +2838 4 398.3637 406.1818 71.4823 0.1144 2837 +2839 4 399.2297 406.8808 72.1297 0.1144 2838 +2840 4 400.0545 407.6598 72.305 0.1144 2839 +2841 4 400.8633 408.4686 72.305 0.1144 2840 +2842 4 401.6733 409.2443 71.9141 0.1144 2841 +2843 4 402.4844 409.9879 71.1505 0.1144 2842 +2844 4 403.2943 410.7326 70.3867 0.1144 2843 +2845 4 404.1054 411.4762 69.6231 0.1144 2844 +2846 4 404.8616 412.1798 69.099 0.1144 2845 +2847 4 405.23 412.3399 71.3798 0.125 2846 +2848 4 405.6384 412.7632 73.3477 0.2874 2847 +2849 4 406.4438 413.2139 74.3761 0.3003 2848 +2850 4 407.5317 413.4233 74.76 0.1546 2849 +2851 4 408.6448 413.4439 75.04 0.1528 2850 +2852 4 409.7293 413.548 75.5255 0.2313 2851 +2853 4 410.7761 413.3901 76.2818 0.2598 2852 +2854 4 411.4076 413.874 77.84 0.2288 2853 +2855 4 412.0173 414.5913 78.8379 0.2595 2854 +2856 4 412.9199 414.9517 77.7151 0.352 2855 +2857 4 413.3409 415.6255 76.2947 0.3201 2856 +2858 4 413.8317 416.1872 77.2131 0.3327 2857 +2859 4 414.3568 416.0728 77.0 0.1525 2858 +2860 3 302.6715 383.7216 32.6642 0.3043 1 +2861 3 302.453 384.821 33.2063 0.2806 2860 +2862 3 302.3157 385.8575 34.3378 0.2415 2861 +2863 3 302.7402 386.5896 35.1868 0.1983 2862 +2864 3 303.7206 387.0827 35.6171 0.2476 2863 +2865 3 304.8131 386.8367 35.7064 0.3018 2864 +2866 3 305.8759 386.5141 35.0546 0.317 2865 +2867 3 306.9901 386.4066 34.4957 0.3299 2866 +2868 3 308.0026 386.775 35.352 0.3179 2867 +2869 3 308.6615 387.6307 36.2673 0.3178 2868 +2870 3 309.3959 388.3148 36.3852 0.2726 2869 +2871 3 310.0446 389.254 36.4014 0.2669 2870 +2872 3 310.7642 390.1418 36.4059 0.2782 2871 +2873 3 311.6862 390.811 36.4297 0.2568 2872 +2874 3 312.5694 391.5363 36.5445 0.2542 2873 +2875 3 313.4583 392.1415 37.4556 0.2542 2874 +2876 3 314.1893 392.9457 38.3135 0.242 2875 +2877 3 315.132 393.4513 37.4072 0.1916 2876 +2878 3 315.9728 394.108 36.4 0.1652 2877 +2879 3 308.9109 388.2667 36.2933 0.3758 2869 +2880 3 308.2519 388.841 37.5782 0.2585 2879 +2881 3 307.3516 389.3867 37.8 0.1144 2880 +2882 3 306.6446 390.1017 37.8 0.2186 2881 +2883 3 306.1813 391.0581 37.5416 0.2239 2882 +2884 3 305.5601 391.8223 37.6449 0.3075 2883 +2885 3 304.6358 392.3771 37.8 0.2925 2884 +2886 3 303.8636 393.1768 37.5522 0.2709 2885 +2887 3 303.0056 393.6916 38.5846 0.3178 2886 +2888 3 302.477 394.0085 40.32 0.2429 2887 +2889 3 301.5984 394.5347 40.5866 0.1743 2888 +2890 3 300.8731 394.9649 41.5528 0.2241 2889 +2891 3 301.3193 394.8665 43.8623 0.2755 2890 +2892 3 300.9109 393.9433 44.52 0.2965 2891 +2893 3 300.2062 393.4216 43.2432 0.3432 2892 +2894 3 300.1856 392.7169 41.7766 0.3432 2893 +2895 3 299.7246 391.7639 42.0 0.2415 2894 +2896 3 299.7257 390.6943 41.72 0.388 2895 +2897 3 299.0851 390.2184 43.1973 0.2161 2896 +2898 3 298.9249 389.8535 45.395 0.1907 2897 +2899 3 298.9855 388.7701 45.64 0.2601 2898 +2900 3 299.0874 387.9716 44.5883 0.2619 2899 +2901 3 299.156 387.1593 45.3986 0.3046 2900 +2902 3 298.4925 386.4535 46.422 0.2034 2901 +2903 3 297.7397 385.8689 47.04 0.2873 2902 +2904 3 297.0545 385.3255 46.494 0.3146 2903 +2905 3 296.6609 384.8427 47.248 0.1926 2904 +2906 3 296.5374 384.2627 48.6836 0.1447 2905 +2907 3 296.2971 383.804 46.7191 0.1365 2906 +2908 3 295.6222 383.1256 46.5027 0.2288 2907 +2909 3 294.9507 382.5147 46.6771 0.4243 2908 +2910 3 294.2093 381.7013 47.2125 0.4117 2909 +2911 3 293.817 380.9142 48.72 0.2415 2910 +2912 3 293.0104 379.9007 48.72 0.2432 2911 +2913 3 292.3812 378.9855 48.974 0.2648 2912 +2914 3 292.0907 377.9684 48.841 0.2299 2913 +2915 3 291.9488 377.3358 50.96 0.312 2914 +2916 3 291.9614 376.2467 51.2392 0.3431 2915 +2917 3 291.3779 375.4047 50.68 0.2985 2916 +2918 3 290.6023 374.7206 50.9846 0.278 2917 +2919 3 290.7144 374.1681 52.9108 0.2835 2918 +2920 3 290.8048 373.2792 54.1652 0.1481 2919 +2921 3 290.385 372.6008 53.3868 0.2161 2920 +2922 3 290.3472 372.0299 52.64 0.2583 2921 +2923 3 290.1184 371.085 53.436 0.3193 2922 +2924 3 289.9422 370.124 54.4421 0.2892 2923 +2925 3 289.7535 369.2477 55.1698 0.3225 2924 +2926 3 289.98 368.5728 57.2592 0.2831 2925 +2927 3 290.4238 367.987 58.52 0.2161 2926 +2928 3 290.6446 367.7274 58.688 0.3051 2927 +2929 3 291.6262 367.3212 59.36 0.3384 2928 +2930 3 292.4968 366.6154 59.4339 0.2977 2929 +2931 3 292.872 365.6533 59.9701 0.1612 2930 +2932 3 293.6648 365.1648 61.04 0.1652 2931 +2933 3 290.5611 367.8749 59.4359 0.1503 2927 +2934 3 290.393 367.0638 60.5357 0.1144 2933 +2935 3 289.7272 366.5376 61.3404 0.2034 2934 +2936 3 289.3679 365.8306 61.8419 0.2182 2935 +2937 3 289.9411 365.254 62.519 0.2288 2936 +2938 3 290.536 364.9017 64.3983 0.2041 2937 +2939 3 290.1745 363.9339 63.84 0.1714 2938 +2940 3 289.6574 363.0793 64.2852 0.1447 2939 +2941 3 289.3176 362.2076 64.68 0.1253 2940 +2942 3 289.3325 361.639 63.1912 0.1261 2941 +2943 3 289.1494 361.4674 60.4593 0.1241 2942 +2944 3 288.9675 361.2958 57.7273 0.1222 2943 +2945 3 288.7845 361.123 54.9956 0.1202 2944 +2946 3 288.6015 360.9514 52.2637 0.1183 2945 +2947 3 288.4184 360.7798 49.5317 0.1163 2946 +2948 3 288.2365 360.6082 46.8 0.1144 2947 +2949 3 287.5444 359.7159 46.7289 0.1144 2948 +2950 3 286.8019 358.8591 46.7149 0.1144 2949 +2951 3 285.8307 358.2539 46.7561 0.1144 2950 +2952 3 284.9487 357.5858 46.8082 0.1144 2951 +2953 3 284.332 356.7312 46.858 0.1144 2952 +2954 3 283.2922 356.2919 46.6906 0.1391 2953 +2955 3 282.7934 355.2703 46.809 0.1907 2954 +2956 3 289.9296 372.4864 52.08 0.1144 2921 +2957 3 288.8714 372.5619 51.6617 0.2465 2956 +2958 3 287.8865 372.944 51.52 0.2099 2957 +2959 3 287.144 373.0584 52.561 0.2852 2958 +2960 3 286.4599 372.944 54.04 0.3556 2959 +2961 3 285.3445 372.9818 53.7656 0.2773 2960 +2962 3 284.7416 372.9314 55.4616 0.2169 2961 +2963 3 284.1078 372.6008 56.56 0.1401 2962 +2964 3 283.6399 373.0584 57.862 0.3485 2963 +2965 3 282.5966 373.2163 57.9992 0.5607 2964 +2966 3 282.1001 374.0686 58.8 0.3448 2965 +2967 3 281.2547 373.9816 60.0006 0.1652 2966 +2968 3 281.1449 374.2024 61.9125 0.2333 2967 +2969 3 281.0591 374.6577 63.9733 0.2866 2968 +2970 3 280.9344 375.7651 64.3952 0.1858 2969 +2971 3 280.4367 376.5899 65.0448 0.125 2970 +2972 3 280.3944 377.6733 65.52 0.1158 2971 +2973 3 280.7788 378.6297 65.728 0.13 2972 +2974 3 280.6209 379.6959 65.7233 0.2258 2973 +2975 3 279.8933 380.3114 66.6324 0.2405 2974 +2976 3 279.7641 381.2083 65.8182 0.3782 2975 +2977 3 279.9276 381.9633 67.1437 0.3173 2976 +2978 3 279.8773 382.6302 68.7977 0.2118 2977 +2979 3 279.5032 383.5775 69.1964 0.1144 2978 +2980 3 279.2527 384.5945 68.7786 0.1861 2979 +2981 3 279.4106 384.9766 71.2944 0.1321 2980 +2982 3 278.7642 385.7099 71.12 0.2981 2981 +2983 3 277.6488 385.8712 70.84 0.3305 2982 +2984 3 293.0894 380.5894 46.76 0.1271 2911 +2985 3 291.9614 380.7232 46.76 0.1538 2984 +2986 3 290.8586 380.8193 46.1504 0.2162 2985 +2987 3 289.7718 380.5916 46.0222 0.2161 2986 +2988 3 288.6781 380.6454 46.569 0.2034 2987 +2989 3 287.843 381.0698 47.3659 0.2164 2988 +2990 3 287.4689 381.2952 49.56 0.1144 2989 +2991 3 286.4198 381.2895 49.474 0.3917 2990 +2992 3 285.7987 381.1362 47.6291 0.2502 2991 +2993 3 285.1889 381.2609 49.3774 0.3268 2992 +2994 3 284.2382 381.2849 50.0567 0.1769 2993 +2995 3 283.5496 381.4531 50.9362 0.1191 2994 +2996 3 282.5783 381.7116 51.0138 0.2955 2995 +2997 3 281.5544 381.7048 50.3496 0.2034 2996 +2998 3 281.3508 382.525 50.9832 0.2532 2997 +2999 3 280.6404 383.2022 51.52 0.1144 2998 +3000 3 279.7583 383.4688 52.2348 0.1399 2999 +3001 3 278.7493 383.3075 51.8476 0.1907 3000 +3002 3 278.111 383.0226 49.8753 0.1152 3001 +3003 3 277.6488 383.4665 51.2845 0.1317 3002 +3004 3 277.269 383.2354 52.92 0.119 3003 +3005 3 276.6078 383.4059 54.0921 0.1398 3004 +3006 3 275.6674 383.4791 53.4988 0.2567 3005 +3007 3 274.9432 383.0512 52.4569 0.241 3006 +3008 3 274.1871 383.0192 52.7344 0.3432 3007 +3009 3 273.9171 383.5775 54.32 0.2651 3008 +3010 3 272.8348 383.5695 54.6 0.1894 3009 +3011 3 272.2182 382.9254 53.3431 0.2984 3010 +3012 3 271.2584 382.7824 53.4733 0.3298 3011 +3013 3 270.858 382.668 55.1729 0.3138 3012 +3014 3 270.3764 382.3179 53.3095 0.329 3013 +3015 3 269.4852 381.9164 53.8037 0.2201 3014 +3016 3 268.8514 381.1797 54.6538 0.1144 3015 +3017 3 268.3366 380.6866 56.0804 0.2325 3016 +3018 3 267.4592 380.0471 55.8768 0.2652 3017 +3019 3 266.7042 379.999 54.04 0.1525 3018 +3020 3 266.0303 379.4648 53.48 0.3377 3019 +3021 3 265.17 379.1811 53.004 0.2123 3020 +3022 3 264.407 378.7555 54.061 0.2164 3021 +3023 3 263.5181 378.3059 54.628 0.3394 3022 +3024 3 262.9816 377.3209 55.0556 0.3694 3023 +3025 3 262.4405 376.4321 54.5476 0.3101 3024 +3026 3 261.9737 375.55 54.36 0.3044 3025 +3027 3 261.1878 375.0798 55.421 0.1761 3026 +3028 3 260.8126 374.1749 54.5619 0.1209 3027 +3029 3 260.1662 373.3764 54.5667 0.2115 3028 +3030 3 259.3368 372.8193 53.76 0.2829 3029 +3031 3 258.6927 371.9464 54.1013 0.3026 3030 +3032 3 257.9125 371.228 53.5413 0.1691 3031 +3033 3 257.0351 370.7372 52.9477 0.3278 3032 +3034 3 256.3155 370.259 53.7499 0.2712 3033 +3035 3 255.5444 369.5978 53.1342 0.2398 3034 +3036 3 254.8832 368.9434 53.3448 0.3489 3035 +3037 3 254.3673 368.2639 52.169 0.2641 3036 +3038 3 253.7838 367.6164 53.48 0.1221 3037 +3039 3 252.9087 366.9288 53.48 0.2652 3038 +3040 3 252.0873 366.1498 53.1748 0.2877 3039 +3041 3 251.2556 365.3719 53.2 0.3013 3040 +3042 3 250.4868 364.5802 53.7205 0.2342 3041 +3043 3 249.5899 363.9316 53.739 0.1439 3042 +3044 3 248.6724 363.5632 53.872 0.2132 3043 +3045 3 247.9162 363.0621 53.8311 0.3348 3044 +3046 3 247.2264 362.3254 53.9406 0.2788 3045 +3047 3 246.4405 361.6115 54.3077 0.1448 3046 +3048 3 245.6786 360.813 54.04 0.1398 3047 +3049 3 245.2095 359.7937 54.243 0.1503 3048 +3050 3 244.53 358.9243 54.6 0.1445 3049 +3051 3 243.9477 358.0251 54.642 0.2542 3050 +3052 3 243.5576 357.3318 53.5553 0.1221 3051 +3053 3 243.275 356.6042 53.3238 0.1588 3052 +3054 3 242.8289 356.0322 54.6244 0.2288 3053 +3055 3 242.2992 355.1502 54.899 0.2669 3054 +3056 3 242.1207 354.2751 56.28 0.3432 3055 +3057 3 241.6357 353.3679 56.0123 0.2643 3056 +3058 3 240.8269 352.6094 56.089 0.1144 3057 +3059 3 240.645 351.7148 57.12 0.1144 3058 +3060 3 239.8922 351.2366 57.68 0.1144 3059 +3061 3 239.0422 350.5399 57.9356 0.1144 3060 +3062 3 238.8214 349.4417 57.68 0.1144 3061 +3063 3 238.7517 348.3057 57.68 0.1144 3062 +3064 3 238.0492 347.5529 57.68 0.1144 3063 +3065 3 237.1283 346.9249 57.68 0.1144 3064 +3066 3 236.2383 346.4226 57.68 0.1246 3065 +3067 3 236.4648 345.488 58.24 0.1652 3066 +3068 3 301.8021 385.9673 32.2 0.2793 2862 +3069 3 300.9864 386.2281 32.3224 0.2621 3068 +3070 3 301.0562 386.5576 34.214 0.285 3069 +3071 3 300.3 386.4604 35.5289 0.2288 3070 +3072 3 299.9568 386.4512 33.717 0.1441 3071 +3073 3 299.5209 387.3081 32.7891 0.1158 3072 +3074 3 299.2372 388.3583 33.0509 0.1652 3073 +3075 3 298.5074 388.6809 34.4084 0.2413 3074 +3076 3 297.5086 388.6202 34.2768 0.2446 3075 +3077 3 296.7708 389.1202 34.5391 0.2262 3076 +3078 3 296.2903 389.8203 35.3847 0.2984 3077 +3079 3 295.8018 390.6794 35.3133 0.2512 3078 +3080 3 295.0307 391.0524 35.399 0.1151 3079 +3081 3 294.5022 391.6598 36.2202 0.1943 3080 +3082 3 293.8536 392.4606 35.6334 0.2314 3081 +3083 3 293.0345 392.9308 35.6964 0.1635 3082 +3084 3 292.705 393.4067 37.413 0.1756 3083 +3085 3 291.8115 393.536 36.2429 0.2452 3084 +3086 3 291.0908 394.0451 36.7394 0.2924 3085 +3087 3 290.3232 394.8676 36.6402 0.3487 3086 +3088 3 289.7969 395.8206 37.4128 0.3686 3087 +3089 3 289.337 396.7335 38.3197 0.3618 3088 +3090 3 288.8749 397.7528 37.8179 0.3355 3089 +3091 3 288.1816 398.6394 37.6398 0.3178 3090 +3092 3 287.2538 399.1999 38.1455 0.329 3091 +3093 3 286.1991 399.5843 38.6672 0.3305 3092 +3094 3 285.3765 400.3703 38.8872 0.3178 3093 +3095 3 285.1351 401.0841 39.4862 0.309 3094 +3096 3 284.8903 402.1469 40.3077 0.2871 3095 +3097 3 284.7382 403.2623 40.7478 0.2887 3096 +3098 3 284.2932 404.2907 40.6952 0.3016 3097 +3099 3 283.7429 405.2654 40.1495 0.3235 3098 +3100 3 283.259 406.287 40.1386 0.3119 3099 +3101 3 282.9501 407.3212 40.9646 0.3051 3100 +3102 3 282.3644 408.019 42.4886 0.2759 3101 +3103 3 281.4675 408.6105 43.2656 0.2569 3102 +3104 3 280.4505 409.0326 43.9835 0.2241 3103 +3105 3 279.3854 409.4147 44.3092 0.2161 3104 +3106 3 278.373 409.1344 45.0106 0.2385 3105 +3107 3 277.6271 408.3325 45.7288 0.2879 3106 +3108 3 276.9624 407.6324 46.8222 0.3305 3107 +3109 3 277.0768 407.1382 48.0374 0.2994 3108 +3110 3 276.6089 406.4815 48.4624 0.2034 3109 +3111 3 276.4545 405.9964 46.727 0.3432 3110 +3112 3 276.5071 405.3627 48.1037 0.2949 3111 +3113 3 276.7267 405.0218 50.1592 0.166 3112 +3114 3 276.562 404.6271 52.624 0.2542 3113 +3115 3 276.5208 403.6043 52.08 0.2632 3114 +3116 3 277.0173 402.9168 51.5032 0.1965 3115 +3117 3 277.42 402.0508 50.9886 0.1631 3116 +3118 3 277.5344 401.7122 53.496 0.2886 3117 +3119 3 277.4978 400.7695 54.4981 0.3625 3118 +3120 3 277.42 399.9573 56.3069 0.191 3119 +3121 3 277.4852 399.2457 55.7511 0.2288 3120 +3122 3 276.8572 398.4483 55.5302 0.2458 3121 +3123 3 277.2415 398.112 56.7157 0.1652 3122 +3124 3 277.0082 397.6201 57.134 0.2924 3123 +3125 3 276.1616 397.4256 56.0 0.1398 3124 +3126 3 277.3559 397.9896 57.1217 0.1461 3123 +3127 3 277.0711 397.4256 58.8 0.3184 3126 +3128 3 275.9694 397.3112 58.4248 0.3432 3127 +3129 3 275.4638 398.0354 59.08 0.1289 3128 +3130 3 274.8105 398.1566 60.4094 0.1674 3129 +3131 3 274.258 398.4769 61.0156 0.4399 3130 +3132 3 273.2593 398.9368 60.727 0.314 3131 +3133 3 272.7307 399.6736 59.5501 0.2247 3132 +3134 3 272.2377 399.9321 60.3288 0.1488 3133 +3135 3 272.272 399.828 62.9796 0.2043 3134 +3136 3 271.4003 399.566 63.1621 0.4282 3135 +3137 3 270.3455 399.4711 63.7241 0.1451 3136 +3138 3 269.3342 399.256 64.12 0.1144 3137 +3139 3 268.1902 399.256 64.12 0.121 3138 +3140 3 267.0474 399.2182 64.12 0.1525 3139 +3141 3 266.0852 398.6337 64.12 0.2262 3140 +3142 3 265.1517 398.7206 63.56 0.1864 3141 +3143 3 264.4699 399.0581 64.496 0.1398 3142 +3144 3 263.4094 399.129 65.2028 0.1169 3143 +3145 3 262.4061 398.7984 65.0188 0.2034 3144 +3146 3 261.3903 398.9437 65.6172 0.2879 3145 +3147 3 260.4888 399.5065 65.8 0.2272 3146 +3148 3 260.2108 400.2673 66.743 0.2918 3147 +3149 3 259.4592 399.8532 67.3868 0.178 3148 +3150 3 276.9075 407.3876 49.266 0.3917 3108 +3151 3 277.1637 408.122 50.85 0.2542 3150 +3152 3 277.4795 409.1161 51.45 0.2924 3151 +3153 3 278.1819 409.8506 51.254 0.3254 3152 +3154 3 278.8443 409.6069 51.2011 0.2288 3153 +3155 3 279.819 409.6046 51.8115 0.3988 3154 +3156 3 280.4825 409.7259 53.2549 0.3432 3155 +3157 3 280.6324 410.4203 54.3906 0.1144 3156 +3158 3 279.9036 411.1708 55.16 0.2471 3157 +3159 3 279.708 412.1638 55.4663 0.394 3158 +3160 3 279.4838 413.1682 56.0899 0.3137 3159 +3161 3 279.8121 413.9804 56.9985 0.475 3160 +3162 3 279.7103 414.5719 58.175 0.2853 3161 +3163 3 280.2239 415.518 58.5108 0.1996 3162 +3164 3 280.6724 416.5327 58.0042 0.1301 3163 +3165 3 281.5716 417.1562 57.96 0.1144 3164 +3166 3 281.7466 418.2567 58.1955 0.2175 3165 +3167 3 281.6825 419.3309 59.005 0.3222 3166 +3168 3 281.686 420.3639 59.36 0.3051 3167 +3169 3 281.7832 421.2116 59.0996 0.286 3168 +3170 3 282.1424 422.1749 59.36 0.4296 3169 +3171 3 282.8403 422.9746 59.64 0.3432 3170 +3172 3 282.7247 423.9229 58.3181 0.287 3171 +3173 3 282.3518 424.8027 57.3266 0.1763 3172 +3174 3 282.1207 425.7625 56.2884 0.2231 3173 +3175 3 282.1196 426.4935 57.9961 0.1258 3174 +3176 3 282.6103 426.8573 60.1488 0.3085 3175 +3177 3 282.9272 427.4522 61.8425 0.3381 3176 +3178 3 282.568 428.3594 63.1408 0.3267 3177 +3179 3 282.7888 429.2791 63.936 0.1522 3178 +3180 3 282.6881 430.3293 64.412 0.1867 3179 +3181 3 282.3598 431.185 64.4232 0.2946 3180 +3182 3 282.1104 431.852 62.7718 0.2859 3181 +3183 3 281.6963 432.432 63.6236 0.1947 3182 +3184 3 281.4068 433.0601 65.4696 0.3099 3183 +3185 3 281.1952 433.9158 64.9006 0.2322 3184 +3186 3 280.7845 434.2887 65.6645 0.1525 3185 +3187 3 280.8543 435.0907 66.6658 0.1271 3186 +3188 3 280.8383 436.0711 66.1097 0.1867 3187 +3189 3 280.9767 436.9233 66.64 0.1802 3188 +3190 3 281.122 437.7951 68.0103 0.1265 3189 +3191 3 281.3199 438.8395 67.345 0.1144 3190 +3192 3 281.6528 439.3624 65.5085 0.1144 3191 +3193 3 281.0808 439.9138 64.328 0.2288 3192 +3194 3 281.7786 440.5864 64.6702 0.2454 3193 +3195 3 281.9834 441.6767 64.43 0.3173 3194 +3196 3 282.4616 442.6914 64.4221 0.3432 3195 +3197 3 283.1858 443.5208 64.96 0.3432 3196 +3198 3 283.7417 444.4703 64.757 0.2963 3197 +3199 3 284.316 445.4084 64.2502 0.208 3198 +3200 3 284.5185 446.4357 63.28 0.2288 3199 +3201 3 285.3079 446.8796 64.045 0.2924 3200 +3202 3 285.825 447.836 63.9262 0.2924 3201 +3203 3 286.3661 448.7523 63.635 0.2796 3202 +3204 3 286.8008 449.7064 64.12 0.1652 3203 +3205 3 284.7508 401.0761 36.9678 0.2938 3094 +3206 3 283.8539 401.417 37.3548 0.1907 3205 +3207 3 282.9249 402.005 37.24 0.2796 3206 +3208 3 282.1081 402.5358 36.5078 0.2034 3207 +3209 3 281.2879 403.117 36.12 0.1657 3208 +3210 3 280.328 403.1456 37.1675 0.1398 3209 +3211 3 279.6714 403.1124 35.2377 0.196 3210 +3212 3 278.7356 402.9168 34.7536 0.1956 3211 +3213 3 278.0069 403.26 35.84 0.3232 3212 +3214 3 276.9635 403.4888 36.5394 0.178 3213 +3215 3 275.887 403.7531 36.68 0.1144 3214 +3216 3 275.3539 404.404 36.1544 0.1248 3215 +3217 3 274.9066 404.9199 37.7216 0.1525 3216 +3218 3 274.4673 405.4004 35.84 0.2354 3217 +3219 3 273.7363 406.1074 36.1598 0.2691 3218 +3220 3 272.9321 406.1234 35.84 0.2034 3219 +3221 3 272.089 406.644 35.0672 0.2637 3220 +3222 3 271.1715 407.2182 35.6367 0.1726 3221 +3223 3 270.4164 407.8349 35.6793 0.236 3222 +3224 3 269.6637 407.979 33.9052 0.3051 3223 +3225 3 268.9029 408.2593 32.48 0.179 3224 +3226 3 268.0472 408.8576 32.7146 0.1629 3225 +3227 3 266.9375 408.7512 33.04 0.3062 3226 +3228 3 265.9365 408.6139 32.0146 0.2568 3227 +3229 3 264.9527 408.6974 31.5182 0.2667 3228 +3230 3 263.9059 408.7318 31.4266 0.2288 3229 +3231 3 262.8088 408.8656 31.7685 0.2007 3230 +3232 3 261.6831 408.8141 31.92 0.1652 3231 +3233 3 260.5597 408.932 31.619 0.1693 3232 +3234 3 259.4352 409.075 31.2483 0.14 3233 +3235 3 258.6001 409.679 31.0845 0.1171 3234 +3236 3 257.5968 410.1572 31.0845 0.1144 3235 +3237 3 256.5248 410.5576 31.0845 0.1144 3236 +3238 3 255.4552 410.9614 31.0845 0.1144 3237 +3239 3 254.3135 411.0255 31.0845 0.1144 3238 +3240 3 253.1866 411.2074 31.0845 0.1144 3239 +3241 3 252.0953 411.522 31.0845 0.1173 3240 +3242 3 251.0794 412.0505 31.0845 0.1292 3241 +3243 3 250.075 412.5893 31.019 0.1411 3242 +3244 3 249.1632 413.2254 30.3652 0.1534 3243 +3245 3 248.2503 413.8626 29.7111 0.1657 3244 +3246 3 247.3385 414.4987 29.0573 0.178 3245 +3247 3 304.8096 381.4679 38.6523 0.2153 1 +3248 3 305.1963 381.9381 41.022 0.2092 3247 +3249 3 305.5841 382.4083 43.3919 0.2031 3248 +3250 3 305.9708 382.8785 45.7618 0.1969 3249 +3251 3 306.3586 383.3487 48.1317 0.1908 3250 +3252 3 306.878 384.2765 47.9699 0.3432 3251 +3253 3 307.2967 385.1882 48.9698 0.3432 3252 +3254 3 307.6376 386.0714 49.2293 0.2466 3253 +3255 3 307.6445 387.0918 50.104 0.2488 3254 +3256 3 307.9511 388.0597 49.7342 0.1685 3255 +3257 3 308.2005 389.1419 49.3119 0.146 3256 +3258 3 308.4304 389.9198 50.4 0.1144 3257 +3259 3 308.4807 390.9414 49.8677 0.1616 3258 +3260 3 308.6878 391.8246 49.1817 0.3371 3259 +3261 3 308.7656 392.8633 49.5001 0.2322 3260 +3262 3 308.5368 393.5738 50.2107 0.3432 3261 +3263 3 308.7656 394.2567 49.6667 0.3432 3262 +3264 3 308.4773 394.9214 51.142 0.2143 3263 +3265 3 308.6512 395.8938 50.0354 0.2518 3264 +3266 3 308.6157 396.7998 49.7227 0.3896 3265 +3267 3 308.5368 397.9381 49.7487 0.2531 3266 +3268 3 308.5585 399.0775 49.733 0.2107 3267 +3269 3 308.6787 400.2021 49.8408 0.2771 3268 +3270 3 308.9132 401.2557 49.8532 0.3632 3269 +3271 3 309.1088 402.3185 49.5729 0.2924 3270 +3272 3 309.2232 403.4041 49.8308 0.2644 3271 +3273 3 309.452 404.1512 48.095 0.178 3272 +3274 3 309.4428 404.9737 46.2944 0.1302 3273 +3275 3 309.1088 405.675 44.8711 0.2415 3274 +3276 3 309.325 406.5398 46.0443 0.2161 3275 +3277 3 309.4017 406.6931 46.3918 0.2221 3276 +3278 3 309.5664 407.5592 47.8649 0.1144 3277 +3279 3 309.5664 408.7032 47.88 0.1144 3278 +3280 3 309.7483 409.552 49.1047 0.2597 3279 +3281 3 310.0446 410.0565 51.1157 0.4068 3280 +3282 3 309.9096 411.0564 51.5217 0.3044 3281 +3283 3 309.5721 411.8194 52.8315 0.1191 3282 +3284 3 309.1546 412.6545 51.7496 0.2576 3283 +3285 3 308.3984 413.0755 50.2944 0.3067 3284 +3286 3 307.919 413.9118 49.0896 0.3686 3285 +3287 3 307.5221 414.9505 49.28 0.3257 3286 +3288 3 307.0507 415.6072 49.5709 0.1159 3287 +3289 3 307.2361 416.6459 49.0 0.1242 3288 +3290 3 306.592 417.4696 48.7676 0.2855 3289 +3291 3 306.0841 417.9066 50.0948 0.1811 3290 +3292 3 305.575 418.6903 48.9404 0.2918 3291 +3293 3 305.448 419.5048 49.2313 0.1337 3292 +3294 3 304.8577 419.8869 49.84 0.1407 3293 +3295 3 304.542 420.9691 50.0088 0.1985 3294 +3296 3 304.304 421.588 51.7129 0.3954 3295 +3297 3 303.8922 422.3648 51.938 0.1304 3296 +3298 3 303.0433 422.7137 52.0425 0.31 3297 +3299 3 302.5102 423.6163 51.3766 0.2288 3298 +3300 3 302.421 424.5144 50.7396 0.1495 3299 +3301 3 301.8661 425.3014 50.7237 0.1144 3300 +3302 3 301.2976 425.8071 49.2954 0.2227 3301 +3303 3 300.8526 426.6045 48.4319 0.1968 3302 +3304 3 300.3194 427.284 48.972 0.2669 3303 +3305 3 300.2016 427.6272 50.9886 0.2304 3304 +3306 3 299.5255 428.2095 50.2354 0.3051 3305 +3307 3 298.7979 428.873 49.0008 0.3052 3306 +3308 3 298.3907 429.5102 49.9215 0.1997 3307 +3309 3 298.6275 430.3739 50.9821 0.1925 3308 +3310 3 298.8128 431.3727 50.65 0.1525 3309 +3311 3 298.2957 432.0053 49.2226 0.1199 3310 +3312 3 297.4526 432.4881 48.2731 0.1584 3311 +3313 3 296.7147 432.9617 48.8113 0.2259 3312 +3314 3 296.137 433.8929 49.2744 0.3432 3313 +3315 3 295.621 434.6216 49.8859 0.2779 3314 +3316 3 295.0754 434.9488 48.627 0.1653 3315 +3317 3 294.58 435.4373 49.6874 0.2065 3316 +3318 3 294.1327 435.7679 51.52 0.3305 3317 +3319 3 293.5721 436.7414 51.7588 0.3424 3318 +3320 3 293.0059 437.3512 53.1894 0.3406 3319 +3321 3 292.1078 437.4656 54.5742 0.1614 3320 +3322 3 291.1308 437.9449 54.6 0.2161 3321 +3323 3 290.7876 438.2687 56.558 0.1144 3322 +3324 3 290.4055 439.0203 57.9569 0.1144 3323 +3325 3 290.1218 439.6907 56.2906 0.2096 3324 +3326 3 289.6597 440.329 54.6 0.254 3325 +3327 3 289.2295 441.2316 54.2987 0.2845 3326 +3328 3 289.0179 441.9135 55.8494 0.2187 3327 +3329 3 288.5191 442.7841 55.44 0.3979 3328 +3330 3 288.3955 443.8217 55.9689 0.3409 3329 +3331 3 287.6737 444.4463 56.1383 0.2359 3330 +3332 3 287.3728 445.016 56.1686 0.2592 3331 +3333 3 286.961 444.5904 57.904 0.1165 3332 +3334 3 286.3432 445.2723 57.0769 0.1703 3333 +3335 3 285.476 445.5617 56.8282 0.3426 3334 +3336 3 284.586 445.9953 58.0994 0.3135 3335 +3337 3 283.5839 446.0456 59.0573 0.3711 3336 +3338 3 282.5508 446.0467 58.9596 0.2833 3337 +3339 3 281.948 446.6462 59.3718 0.2876 3338 +3340 3 281.1254 446.7366 58.1423 0.3386 3339 +3341 3 280.2239 446.6702 57.3493 0.2585 3340 +3342 3 279.3728 446.3888 56.7204 0.1144 3341 +3343 3 278.7928 446.16 54.88 0.2288 3342 +3344 3 309.9748 406.8121 46.0188 0.2369 3276 +3345 3 311.0296 407.2548 45.9777 0.2707 3344 +3346 3 312.0843 407.6976 45.9365 0.3044 3345 +3347 3 312.7696 408.2341 44.8417 0.1737 3346 +3348 3 313.178 408.9514 44.1854 0.2288 3347 +3349 3 313.2203 408.7512 46.6082 0.1522 3348 +3350 3 313.7786 408.9571 47.6132 0.1687 3349 +3351 3 314.028 409.671 48.5948 0.2263 3350 +3352 3 314.4044 410.0119 50.4431 0.1761 3351 +3353 3 314.6 410.7978 49.5886 0.3051 3352 +3354 3 315.148 411.1673 50.0436 0.2299 3353 +3355 3 316.0071 411.7256 50.3829 0.2605 3354 +3356 3 316.5414 411.4041 52.6288 0.2288 3355 +3357 3 317.2598 411.3355 53.503 0.2257 3356 +3358 3 317.4806 412.2187 54.0238 0.247 3357 +3359 3 318.5216 412.412 53.5049 0.3432 3358 +3360 3 319.2446 412.0814 55.0458 0.2796 3359 +3361 3 320.3154 412.3491 55.1342 0.2669 3360 +3362 3 321.0236 412.722 56.0829 0.2682 3361 +3363 3 321.6493 413.4153 56.84 0.2924 3362 +3364 3 322.1412 414.3454 57.0713 0.3033 3363 +3365 3 322.608 414.9871 58.52 0.2162 3364 +3366 3 323.0656 415.6381 57.636 0.433 3365 +3367 3 323.935 416.0362 57.12 0.4287 3366 +3368 3 324.2096 417.1127 57.391 0.4539 3367 +3369 3 324.0529 417.949 58.7891 0.3985 3368 +3370 3 324.3126 418.7223 60.2 0.3432 3369 +3371 3 324.8823 419.5231 60.3691 0.2942 3370 +3372 3 325.0459 420.5218 60.6472 0.1473 3371 +3373 3 325.4165 421.4416 60.48 0.3432 3372 +3374 3 325.2667 422.4312 60.6889 0.3119 3373 +3375 3 325.7082 423.2972 60.226 0.38 3374 +3376 3 325.8661 424.0865 61.2926 0.2585 3375 +3377 3 325.9199 425.0177 60.2588 0.2841 3376 +3378 3 325.7071 425.862 61.6358 0.2314 3377 +3379 3 326.0972 426.1366 63.3153 0.2695 3378 +3380 3 326.4507 426.6262 65.0787 0.2192 3379 +3381 3 326.7264 427.419 66.561 0.2398 3380 +3382 3 326.8763 428.3742 66.6456 0.3059 3381 +3383 3 326.8442 429.3947 67.4338 0.3148 3382 +3384 3 327.1096 430.3419 67.7748 0.2868 3383 +3385 3 327.5078 431.161 67.8936 0.1971 3384 +3386 3 328.1713 431.5626 66.7019 0.144 3385 +3387 3 329.0213 431.5454 67.2294 0.1544 3386 +3388 3 329.798 432.1872 66.64 0.2924 3387 +3389 3 329.9948 432.9662 67.7648 0.2911 3388 +3390 3 330.1801 433.004 70.4287 0.3371 3389 +3391 3 330.5645 433.6298 72.228 0.1314 3390 +3392 3 331.2875 434.1526 73.4877 0.1144 3391 +3393 3 331.8538 434.7303 72.4069 0.1975 3392 +3394 3 332.8823 435.0609 72.5502 0.2422 3393 +3395 3 333.5252 435.2909 74.4629 0.3375 3394 +3396 3 334.4678 435.6306 75.5014 0.2812 3395 +3397 3 335.2378 435.7496 74.8157 0.333 3396 +3398 3 335.0776 436.436 73.64 0.3305 3397 +3399 3 305.1414 375.2514 27.8631 0.2871 1 +3400 3 305.353 374.191 28.0683 0.4743 3399 +3401 3 305.4926 373.3318 29.0111 0.2337 3400 +3402 3 306.2442 372.8079 28.9262 0.2288 3401 +3403 3 306.7636 371.8332 28.6373 0.2288 3402 +3404 3 307.4077 371.4568 27.7245 0.2288 3403 +3405 3 308.1215 371.228 29.3124 0.2796 3404 +3406 3 308.8056 370.4718 29.5221 0.2708 3405 +3407 3 309.3708 370.2293 27.7206 0.2075 3406 +3408 3 309.2507 369.3244 27.6763 0.3161 3407 +3409 3 309.4165 368.3817 27.9832 0.2611 3408 +3410 3 310.0515 367.7708 27.1438 0.3432 3409 +3411 3 310.4942 367.113 27.6755 0.2672 3410 +3412 3 310.6818 366.1898 28.5524 0.3049 3411 +3413 3 311.0078 365.2986 28.0162 0.3257 3412 +3414 3 311.9413 364.936 27.2852 0.2056 3413 +3415 3 312.8703 365.2792 28.1708 0.3685 3414 +3416 3 313.8942 365.2598 28.4698 0.394 3415 +3417 3 314.8231 364.8777 27.1281 0.394 3416 +3418 3 315.6307 364.5756 26.8223 0.44 3417 +3419 3 315.9877 363.5438 26.3511 0.425 3418 +3420 3 316.6009 362.8356 27.16 0.1892 3419 +3421 3 316.888 361.8529 27.6231 0.178 3420 +3422 3 317.3445 361.4697 29.5854 0.1598 3421 +3423 3 318.2711 360.94 30.24 0.1525 3422 +3424 3 318.4999 360.1438 28.8812 0.2013 3423 +3425 3 319.5284 359.9882 28.5519 0.1409 3424 +3426 3 320.3394 359.6072 27.2507 0.2127 3425 +3427 3 320.9092 358.914 27.0637 0.4514 3426 +3428 3 321.6127 358.1933 27.6587 0.3943 3427 +3429 3 322.2774 357.3044 27.711 0.3632 3428 +3430 3 322.894 356.451 27.44 0.339 3429 +3431 3 323.784 355.8435 26.861 0.4089 3430 +3432 3 324.3629 354.9649 26.6406 0.1952 3431 +3433 3 325.1225 354.3437 26.88 0.1253 3432 +3434 3 325.7048 353.8392 27.3073 0.1195 3433 +3435 3 326.6944 353.7248 28.238 0.165 3434 +3436 3 327.6416 353.3953 28.1812 0.2288 3435 +3437 3 328.0031 352.8016 26.7358 0.2907 3436 +3438 3 328.7845 352.4664 25.4806 0.2282 3437 +3439 3 329.3999 352.5545 27.3697 0.1705 3438 +3440 3 330.028 352.3955 28.5852 0.1246 3439 +3441 3 330.3872 351.5237 28.9528 0.2258 3440 +3442 3 331.0942 351.3224 29.223 0.2415 3441 +3443 3 331.8161 350.7996 29.2172 0.2773 3442 +3444 3 332.6832 350.1601 28.5925 0.2279 3443 +3445 3 333.5103 349.4268 28.091 0.1652 3444 +3446 3 334.2116 348.5688 27.72 0.2152 3445 +3447 3 334.9003 347.7588 27.6786 0.283 3446 +3448 3 335.5432 346.902 27.7186 0.2272 3447 +3449 3 336.2628 346.3872 28.4866 0.3051 3448 +3450 3 337.011 345.8712 28.056 0.3432 3449 +3451 3 337.5624 345.2741 27.2275 0.1636 3450 +3452 3 338.3426 344.8016 26.5073 0.1194 3451 +3453 3 339.1983 344.8931 28.2192 0.2161 3452 +3454 3 339.9396 344.4401 27.7794 0.2288 3453 +3455 3 340.9086 344.3657 27.9644 0.2288 3454 +3456 3 341.7414 344.3486 28.1212 0.1825 3455 +3457 3 342.5994 344.1358 28.6051 0.3243 3456 +3458 3 343.4437 343.5329 28.6345 0.2217 3457 +3459 3 344.0488 343.2 28.4976 0.2465 3458 +3460 3 344.8565 342.7355 28.4343 0.2288 3459 +3461 3 345.7202 342.3271 28.3228 0.2407 3460 +3462 3 346.6766 341.9096 28.0468 0.2351 3461 +3463 3 346.6503 341.015 27.2863 0.217 3462 +3464 3 347.0416 340.0037 27.141 0.1415 3463 +3465 3 347.6902 339.2898 27.72 0.2476 3464 +3466 3 348.1684 338.6183 27.7253 0.2346 3465 +3467 3 348.7335 337.7294 27.6156 0.3036 3466 +3468 3 349.3902 337.1894 26.9461 0.1828 3467 +3469 3 350.0411 336.7719 28.0 0.2034 3468 +3470 3 351.0959 336.3852 27.7343 0.2493 3469 +3471 3 351.4368 335.8384 26.129 0.1145 3470 +3472 3 351.9928 335.2652 26.6 0.2288 3471 +3473 3 352.4367 334.4427 27.2292 0.2288 3472 +3474 3 352.5957 333.587 27.5131 0.1948 3473 +3475 3 353.1551 332.7965 27.9443 0.1271 3474 +3476 3 354.0165 332.1444 28.5541 0.1765 3475 +3477 3 354.5519 331.156 28.3772 0.1907 3476 +3478 3 355.3424 330.3792 28.6532 0.1843 3477 +3479 3 356.3102 330.1927 28.7787 0.1737 3478 +3480 3 357.4119 330.0978 29.342 0.1626 3479 +3481 3 358.4827 329.8095 29.1673 0.1526 3480 +3482 3 359.2354 329.1585 28.448 0.1755 3481 +3483 3 360.0523 328.4996 28.8271 0.1907 3482 +3484 3 360.9663 328.2525 28.6294 0.2162 3483 +3485 3 361.6287 327.6977 29.7223 0.2288 3484 +3486 3 362.2556 326.9952 29.2754 0.1483 3485 +3487 3 363.347 326.8122 29.3927 0.1144 3486 +3488 3 364.4715 326.6337 29.4 0.1144 3487 +3489 3 365.5949 326.4976 29.4 0.1144 3488 +3490 3 366.7275 326.4461 29.4622 0.1653 3489 +3491 3 367.8486 326.3306 29.0433 0.2346 3490 +3492 3 368.9446 326.2688 28.317 0.2288 3491 +3493 3 369.6802 325.9325 28.1002 0.1144 3492 +3494 3 370.5199 325.9062 29.0976 0.1631 3493 +3495 3 371.2555 326.4953 28.6373 0.2288 3494 +3496 3 372.1695 326.6257 29.0492 0.2115 3495 +3497 3 373.1797 326.8065 28.7468 0.1163 3496 +3498 3 374.279 326.9792 29.12 0.135 3497 +3499 3 375.1862 327.4082 28.2562 0.2131 3498 +3500 3 376.1724 327.7503 28.3825 0.1658 3499 +3501 3 376.9903 327.7182 28.0104 0.1822 3500 +3502 3 377.8335 327.4059 28.7106 0.2647 3501 +3503 3 378.664 326.9563 28.7249 0.2273 3502 +3504 3 379.6913 326.5514 28.2971 0.1318 3503 +3505 3 380.7083 326.2963 28.901 0.1481 3504 +3506 3 381.6601 325.865 29.1032 0.1676 3505 +3507 3 382.676 325.5778 28.28 0.2716 3506 +3508 3 383.6782 325.15 28.4581 0.1782 3507 +3509 3 384.7867 324.9578 28.0563 0.1144 3508 +3510 3 385.8906 324.6752 28.0 0.1144 3509 +3511 3 387.0072 324.451 28.0 0.1144 3510 +3512 3 388.1054 324.1398 28.0 0.1144 3511 +3513 3 389.1591 323.7005 27.9555 0.1265 3512 +3514 3 390.1292 323.5163 28.2047 0.1829 3513 +3515 3 391.1096 323.1159 28.6532 0.201 3514 +3516 3 392.0923 322.608 28.84 0.1493 3515 +3517 3 393.1722 322.6194 29.3171 0.1493 3516 +3518 3 394.2167 322.608 30.2089 0.1441 3517 +3519 3 395.2509 322.7224 29.9594 0.1272 3518 +3520 3 396.158 322.5039 30.3419 0.1591 3519 +3521 3 397.2586 322.608 29.96 0.1144 3520 +3522 3 398.1578 323.1789 29.6918 0.1144 3521 +3523 3 399.1233 323.5232 29.12 0.1144 3522 +3524 3 400.2673 323.5232 29.12 0.1144 3523 +3525 3 401.1951 323.9808 28.8417 0.1144 3524 +3526 3 401.8906 324.6741 28.6916 0.1144 3525 +3527 3 402.9832 324.7816 29.1292 0.1336 3526 +3528 3 404.0482 324.7816 29.9499 0.1652 3527 +3529 3 405.1087 324.8708 30.52 0.1151 3528 +3530 3 406.1646 324.4327 30.52 0.1622 3529 +3531 3 407.0295 323.7211 30.6186 0.2789 3530 +3532 3 407.4608 322.8608 31.08 0.1361 3531 +3533 3 407.9836 322.0246 31.08 0.1144 3532 +3534 3 408.9937 321.5864 30.7045 0.1144 3533 +3535 3 410.1309 321.5784 30.52 0.1144 3534 +3536 3 411.2405 321.6711 30.464 0.2066 3535 +3537 3 411.84 322.0806 30.3604 0.178 3536 +3538 3 412.6751 322.4936 30.4774 0.2913 3537 +3539 3 413.7745 322.5394 30.4746 0.304 3538 +3540 3 414.795 322.8425 30.0507 0.2482 3539 +3541 3 415.876 322.5588 29.68 0.2719 3540 +3542 3 416.5544 323.0393 28.5222 0.1959 3541 +3543 3 417.5474 322.9592 27.7612 0.3079 3542 +3544 3 418.267 322.6183 28.0319 0.1144 3543 +3545 3 419.1353 322.6286 27.2532 0.1941 3544 +3546 3 419.8057 323.22 27.6651 0.1652 3545 +3547 3 420.5367 323.6353 26.8402 0.3432 3546 +3548 3 421.4427 324.0918 27.0337 0.4014 3547 +3549 3 422.4449 323.9282 27.5979 0.3683 3548 +3550 3 423.455 323.8378 28.6516 0.3178 3549 +3551 3 424.424 323.4877 28.5051 0.3051 3550 +3552 3 425.1127 322.8608 27.9359 0.3116 3551 +3553 3 425.7979 322.4284 27.4254 0.3222 3552 +3554 3 426.7166 322.0337 27.6298 0.3972 3553 +3555 3 427.5231 322.2213 28.6698 0.3926 3554 +3556 3 428.2312 322.3849 29.5736 0.1254 3555 +3557 3 429.0092 321.6917 29.5806 0.2151 3556 +3558 3 429.4576 320.892 29.12 0.3051 3557 +3559 3 315.7131 364.7266 26.4046 0.3717 3417 +3560 3 315.9762 365.2712 24.6618 0.3089 3559 +3561 3 316.7393 365.8032 24.2222 0.2924 3560 +3562 3 317.7254 366.1544 24.4348 0.2619 3561 +3563 3 318.6303 365.6716 24.719 0.3421 3562 +3564 3 319.5913 365.8512 24.5347 0.2795 3563 +3565 3 319.9768 365.0058 23.9781 0.1185 3564 +3566 3 320.7147 364.3972 24.059 0.2767 3565 +3567 3 321.7111 364.6214 24.1024 0.1928 3566 +3568 3 322.5314 364.1592 23.52 0.3241 3567 +3569 3 323.6021 364.1146 23.5771 0.1878 3568 +3570 3 324.0506 363.5129 22.7035 0.2669 3569 +3571 3 324.0288 363.236 20.267 0.3432 3570 +3572 3 324.4453 362.2716 20.1659 0.355 3571 +3573 3 325.3387 361.8106 20.8544 0.1997 3572 +3574 3 326.0995 361.0395 21.0 0.2049 3573 +3575 3 326.1189 359.9665 20.4154 0.3065 3574 +3576 3 325.492 359.1863 20.0883 0.1682 3575 +3577 3 325.7014 358.628 19.2147 0.1636 3576 +3578 3 325.9256 357.8215 20.4336 0.2971 3577 +3579 3 325.9496 356.9314 19.4387 0.2669 3578 +3580 3 325.6339 356.5425 16.921 0.2669 3579 +3581 3 325.2575 355.8995 16.4909 0.3288 3580 +3582 3 324.7816 355.5197 15.745 0.3432 3581 +3583 3 324.8514 354.9832 14.5737 0.2288 3582 +3584 3 325.9062 355.0598 14.1168 0.3205 3583 +3585 3 326.6886 354.7029 15.057 0.1568 3584 +3586 3 327.1783 354.537 13.1452 0.198 3585 +3587 3 327.51 353.734 12.0532 0.178 3586 +3588 3 327.9608 352.8405 12.6 0.2601 3587 +3589 3 328.8908 353.2569 12.731 0.188 3588 +3590 3 329.5418 353.6356 13.7203 0.2987 3589 +3591 3 330.457 353.8014 14.5656 0.2418 3590 +3592 3 331.3356 353.5681 13.5542 0.2161 3591 +3593 3 331.6239 354.1366 12.2844 0.2034 3592 +3594 3 332.3995 354.5164 12.087 0.2011 3593 +3595 3 333.5218 354.6503 12.04 0.1314 3594 +3596 3 334.1693 355.4957 11.7888 0.1144 3595 +3597 3 334.7344 355.5632 12.9968 0.3216 3596 +3598 3 335.5352 355.212 13.44 0.2542 3597 +3599 3 301.5344 375.9367 23.3178 0.2033 1 +3600 3 301.1157 375.0272 21.966 0.1935 3599 +3601 3 300.5563 374.2321 22.4974 0.2398 3600 +3602 3 299.8756 373.6796 23.6998 0.1444 3601 +3603 3 298.87 373.6682 23.7132 0.167 3602 +3604 3 297.7626 373.5286 23.3369 0.2288 3603 +3605 3 296.7914 373.3055 22.68 0.1289 3604 +3606 3 296.0008 373.3776 24.0027 0.1762 3605 +3607 3 295.1772 373.0126 24.92 0.2138 3606 +3608 3 294.7665 372.8468 22.7923 0.1303 3607 +3609 3 293.8936 372.9028 22.9284 0.1813 3608 +3610 3 293.4177 372.515 24.3314 0.3422 3609 +3611 3 292.3744 372.1432 24.1287 0.2909 3610 +3612 3 291.3288 371.967 23.9428 0.1969 3611 +3613 3 290.4776 371.6581 22.6307 0.2609 3612 +3614 3 290.0864 371.7371 24.2155 0.2004 3613 +3615 3 289.3073 371.5941 25.2608 0.1628 3614 +3616 3 288.5168 371.4065 25.1384 0.1481 3615 +3617 3 287.8853 370.9866 23.9887 0.3051 3616 +3618 3 286.9999 370.5302 24.2298 0.2929 3617 +3619 3 285.9199 370.3872 24.362 0.2661 3618 +3620 3 285.293 369.5726 24.92 0.1543 3619 +3621 3 284.435 369.2832 24.2001 0.178 3620 +3622 3 283.6582 368.7146 22.902 0.1144 3621 +3623 3 283.3494 368.2536 21.7669 0.1144 3622 +3624 3 283.0256 367.8303 21.9876 0.2088 3623 +3625 3 282.2843 367.6953 23.4424 0.1961 3624 +3626 3 281.6425 367.264 21.9478 0.2569 3625 +3627 3 280.9618 367.1782 20.4596 0.1766 3626 +3628 3 280.2217 366.5376 21.0484 0.178 3627 +3629 3 279.3099 366.1647 21.9526 0.3272 3628 +3630 3 278.516 365.5995 21.5424 0.2307 3629 +3631 3 277.666 365.2826 22.0234 0.4256 3630 +3632 3 276.7645 364.8296 21.5838 0.1968 3631 +3633 3 275.9591 364.0288 21.2383 0.2074 3632 +3634 3 275.1549 363.228 20.893 0.2182 3633 +3635 3 274.3495 362.4272 20.5475 0.2288 3634 +3636 3 274.0086 362.2007 20.417 0.1834 3635 +3637 3 273.1517 361.5669 19.4051 0.178 3636 +3638 3 272.7342 360.5991 18.3408 0.1654 3637 +3639 3 272.1324 359.7468 17.1959 0.178 3638 +3640 3 271.9803 359.1645 16.1445 0.1508 3639 +3641 3 272.3715 358.199 15.171 0.1822 3640 +3642 3 272.1542 357.2151 14.5897 0.2049 3641 +3643 3 271.4209 356.3869 14.5961 0.2288 3642 +3644 3 270.9816 355.5369 13.6086 0.2401 3643 +3645 3 271.0216 354.457 12.964 0.2413 3644 +3646 3 270.4885 353.631 13.2376 0.2288 3645 +3647 3 269.4875 353.3221 14.1644 0.2142 3646 +3648 3 268.451 353.0178 14.4956 0.2111 3647 +3649 3 267.5164 352.4756 13.7063 0.2081 3648 +3650 3 267.0748 351.5409 13.4476 0.2202 3649 +3651 3 267.0119 350.4152 13.8457 0.2375 3650 +3652 3 267.0279 349.2769 13.9997 0.2502 3651 +3653 3 267.1389 348.1398 13.9989 0.2455 3652 +3654 3 267.4718 347.053 13.9941 0.2328 3653 +3655 3 267.5484 345.9353 13.9616 0.238 3654 +3656 3 266.9959 344.9881 13.7052 0.2511 3655 +3657 3 266.0601 344.36 13.6181 0.2746 3656 +3658 3 265.1414 343.6828 13.704 0.2796 3657 +3659 3 264.3864 342.9575 12.7128 0.2583 3658 +3660 3 263.6783 342.1121 12.0123 0.1991 3659 +3661 3 262.7047 341.6579 12.7042 0.1435 3660 +3662 3 261.8227 342.2528 13.4966 0.1274 3661 +3663 3 261.5184 343.3144 12.88 0.1525 3662 +3664 3 270.9919 360.2204 17.9925 0.1387 3639 +3665 3 269.8719 360.249 17.6128 0.1518 3664 +3666 3 268.8034 360.265 16.6219 0.1403 3665 +3667 3 267.8047 360.5842 15.6657 0.1252 3666 +3668 3 267.0828 361.2409 14.6471 0.1144 3667 +3669 3 266.1184 361.5806 15.5982 0.1144 3668 +3670 3 265.2227 361.3873 16.9036 0.1144 3669 +3671 3 264.701 360.6552 16.0037 0.1144 3670 +3672 3 264.4665 359.8097 14.2313 0.1144 3671 +3673 3 264.0878 358.8945 14.0526 0.1217 3672 +3674 3 263.6817 358.2722 15.9303 0.1351 3673 +3675 3 263.3225 358.6898 17.901 0.1484 3674 +3676 3 262.7116 359.3887 19.4491 0.1433 3675 +3677 3 262.0195 360.2342 19.9346 0.1297 3676 +3678 3 261.3628 361.17 20.0416 0.1163 3677 +3679 3 261.0608 360.7032 21.84 0.1271 3678 +3680 3 274.2042 361.7683 21.7151 0.2669 3635 +3681 3 273.7958 360.7021 21.8392 0.2477 3680 +3682 3 273.2158 359.7365 21.835 0.2064 3681 +3683 3 272.3338 359.0341 21.8131 0.1907 3682 +3684 3 271.3351 358.4838 21.6882 0.2009 3683 +3685 3 270.3844 357.8878 21.212 0.2265 3684 +3686 3 269.4475 357.2838 20.7281 0.2415 3685 +3687 3 268.5483 356.5814 20.6886 0.2469 3686 +3688 3 267.8047 355.7337 20.4834 0.2542 3687 +3689 3 267.1949 354.7761 20.1608 0.26 3688 +3690 3 266.4765 353.8998 20.1967 0.2669 3689 +3691 3 265.6414 353.218 19.7008 0.2669 3690 +3692 3 265.1323 352.3417 19.2217 0.2669 3691 +3693 3 264.6838 351.3132 19.4253 0.2592 3692 +3694 3 263.8693 350.5525 19.3225 0.2306 3693 +3695 3 263.0525 349.937 18.2426 0.1836 3694 +3696 3 262.4061 349.2392 16.7065 0.1403 3695 +3697 3 261.5115 348.8525 15.5254 0.1271 3696 +3698 3 260.7073 348.793 16.9098 0.1469 3697 +3699 3 260.0987 348.729 19.2685 0.1931 3698 +3700 3 259.2064 348.3594 20.5587 0.2461 3699 +3701 3 258.1608 347.9247 20.6758 0.2758 3700 +3702 3 257.1346 347.4362 20.396 0.2577 3701 +3703 3 256.2102 346.815 19.7862 0.1985 3702 +3704 3 255.1429 346.4936 20.1709 0.1443 3703 +3705 3 254.2151 346.0783 19.0078 0.1153 3704 +3706 3 253.6122 346.2739 19.6 0.1899 3705 +3707 3 252.8103 346.1824 20.5422 0.1144 3706 +3708 3 251.7692 346.2591 19.88 0.1345 3707 +3709 3 250.7934 345.9959 19.9576 0.1239 3708 +3710 3 250.242 345.4045 21.0 0.2288 3709 +3711 3 249.5258 344.7055 20.2765 0.1935 3710 +3712 3 248.6907 344.2788 21.0423 0.159 3711 +3713 3 247.9037 344.0477 20.0236 0.2161 3712 +3714 3 247.2378 343.4688 19.6 0.178 3713 +3715 3 246.3959 342.8568 20.1303 0.2159 3714 +3716 3 245.2725 342.9197 20.4089 0.1182 3715 +3717 3 244.2188 342.9586 20.3468 0.1652 3716 +3718 3 244.1296 342.4964 20.519 0.1144 3717 +3719 3 244.5872 341.7128 19.32 0.1398 3718 +3720 3 244.1651 343.1943 20.1984 0.1719 3717 +3721 3 243.4123 343.8795 19.88 0.1215 3720 +3722 3 242.2683 343.8864 19.88 0.1144 3721 +3723 3 241.1243 343.8864 19.88 0.1144 3722 +3724 3 240.0375 343.8864 20.5313 0.1191 3723 +3725 3 239.0994 343.4002 20.9782 0.224 3724 +3726 3 238.4885 343.0856 20.9353 0.1674 3725 +3727 3 237.4303 342.9735 20.72 0.1163 3726 +3728 3 236.3596 343.0993 21.28 0.1541 3727 +3729 3 235.6022 342.5685 21.84 0.2862 3728 +3730 3 234.6333 342.342 21.4194 0.1462 3729 +3731 3 233.686 342.4621 21.6006 0.1891 3730 +3732 3 232.8909 342.8339 22.6789 0.1666 3731 +3733 3 232.2709 343.0192 21.1238 0.1185 3732 +3734 3 231.2196 343.0398 21.8156 0.1271 3733 +3735 3 230.2529 342.5571 22.4 0.2012 3734 +3736 3 229.2073 342.3878 21.7767 0.2171 3735 +3737 3 228.7085 341.5252 20.8393 0.167 3736 +3738 3 227.8745 340.7953 20.7152 0.1144 3737 +3739 3 226.7934 340.475 20.44 0.1144 3738 +3740 3 225.7467 340.0151 20.44 0.1372 3739 +3741 3 224.8543 339.3276 20.0712 0.1652 3740 +3742 3 224.1908 338.5554 20.6422 0.1306 3741 +3743 3 223.2996 337.917 20.44 0.1144 3742 +3744 3 222.5663 337.1368 20.16 0.1317 3743 +3745 3 221.7026 336.4161 20.3157 0.1652 3744 +3746 3 220.6787 336.1312 20.7642 0.1497 3745 +3747 3 219.656 335.9814 21.8025 0.1257 3746 +3748 3 218.9044 335.8441 20.5265 0.1925 3747 +3749 3 217.8382 335.6496 20.9936 0.2805 3748 +3750 3 217.0877 335.5421 19.462 0.3127 3749 +3751 3 216.6713 334.9117 20.1984 0.2539 3750 +3752 3 216.4654 334.0549 19.6381 0.2232 3751 +3753 3 216.0776 334.3489 18.5623 0.2557 3752 +3754 3 215.1578 334.0469 18.0796 0.3205 3753 +3755 3 214.5366 333.182 17.6159 0.1936 3754 +3756 3 213.7701 332.7541 16.3534 0.2366 3755 +3757 3 212.9442 332.1696 17.0458 0.2865 3756 +3758 3 211.8951 332.2416 17.36 0.3432 3757 +3759 3 211.8596 333.2186 17.0727 0.3432 3758 +3760 3 211.3723 333.9325 16.1269 0.2819 3759 +3761 3 211.0508 333.333 15.5893 0.3432 3760 +3762 3 210.0784 332.9749 15.1718 0.3009 3761 +3763 3 209.0077 332.8434 14.6695 0.2384 3762 +3764 3 207.9712 332.5928 15.12 0.4115 3763 +3765 3 206.9084 332.2256 14.7008 0.302 3764 +3766 3 205.9177 331.7657 14.6818 0.2727 3765 +3767 3 204.9453 332.157 14.6793 0.2608 3766 +3768 3 204.3607 332.6935 13.1911 0.3037 3767 +3769 3 203.4043 332.7175 12.3166 0.3312 3768 +3770 3 202.5727 332.904 12.0851 0.1533 3769 +3771 3 201.5362 332.8411 12.7812 0.2616 3770 +3772 3 200.6748 332.5608 13.1897 0.1541 3771 +3773 3 199.7824 332.801 14.1159 0.142 3772 +3774 3 198.7483 333.0424 13.8667 0.3057 3773 +3775 3 198.5481 333.484 12.868 0.3686 3774 +3776 3 198.1717 333.7345 11.3226 0.3026 3775 +3777 3 197.7427 334.5102 12.3385 0.2186 3776 +3778 3 196.7028 334.8694 12.9396 0.2089 3777 +3779 3 195.7636 334.8191 12.9847 0.1992 3778 +3780 3 195.5027 334.8431 11.3277 0.1794 3779 +3781 3 194.8655 334.2619 10.9175 0.1261 3780 +3782 3 194.1711 333.5263 11.3341 0.2603 3781 +3783 3 194.1368 332.904 12.04 0.1144 3782 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/hoc_templates/BioAllen_old.hoc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/hoc_templates/BioAllen_old.hoc new file mode 100644 index 0000000..fde930d --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/hoc_templates/BioAllen_old.hoc @@ -0,0 +1,21 @@ +begintemplate BioAllenOld + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal +objref all, somatic, basal, apical, axonal + +objref this + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() +} + +create soma[1], dend[1], apic[1], axon[1] + +endtemplate BioAllenOld diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/hoc_templates/BioAxonStub.hoc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/hoc_templates/BioAxonStub.hoc new file mode 100644 index 0000000..df8660d --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/hoc_templates/BioAxonStub.hoc @@ -0,0 +1,61 @@ +begintemplate BioAxonStub + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + + simplify_axon() +} + +proc simplify_axon() { + + forsec axonal { delete_section() } + create axon[2] + + axon[0] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + axon[1] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + connect axon(0), soma(0.5) + connect axon[1](0), axon[0](1) + define_shape() + + +} + +endtemplate BioAxonStub \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/hoc_templates/Biophys1.hoc b/bmtk-vb/docs/tutorial/sources/bionet_files/components/hoc_templates/Biophys1.hoc new file mode 100644 index 0000000..bac9b0f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/hoc_templates/Biophys1.hoc @@ -0,0 +1,34 @@ +begintemplate Biophys1 + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + +} + +endtemplate Biophys1 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/intfire/IntFire1_exc_1.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/intfire/IntFire1_exc_1.json new file mode 100644 index 0000000..6a58d3b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/intfire/IntFire1_exc_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.024, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/intfire/IntFire1_inh_1.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/intfire/IntFire1_inh_1.json new file mode 100644 index 0000000..0da2f1f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/intfire/IntFire1_inh_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.007, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/CaDynamics.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/CaDynamics.mod new file mode 100644 index 0000000..12af065 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/CaDynamics.mod @@ -0,0 +1,40 @@ +: Dynamics that track inside calcium concentration +: modified from Destexhe et al. 1994 + +NEURON { + SUFFIX CaDynamics + USEION ca READ ica WRITE cai + RANGE decay, gamma, minCai, depth +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + FARADAY = (faraday) (coulombs) + (molar) = (1/liter) + (mM) = (millimolar) + (um) = (micron) +} + +PARAMETER { + gamma = 0.05 : percent of free calcium (not buffered) + decay = 80 (ms) : rate of removal of calcium + depth = 0.1 (um) : depth of shell + minCai = 1e-4 (mM) +} + +ASSIGNED {ica (mA/cm2)} + +INITIAL { + cai = minCai +} + +STATE { + cai (mM) +} + +BREAKPOINT { SOLVE states METHOD cnexp } + +DERIVATIVE states { + cai' = -(10000)*(ica*gamma/(2*FARADAY*depth)) - (cai - minCai)/decay +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Ca_HVA.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Ca_HVA.mod new file mode 100644 index 0000000..84db2d3 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Ca_HVA.mod @@ -0,0 +1,82 @@ +: Reference: Reuveni, Friedman, Amitai, and Gutnick, J.Neurosci. 1993 + +NEURON { + SUFFIX Ca_HVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + UNITSOFF + : if((v == -27) ){ + : v = v+0.0001 + : } + :mAlpha = (0.055*(-27-v))/(exp((-27-v)/3.8) - 1) + mAlpha = 0.055 * vtrap(-27 - v, 3.8) + mBeta = (0.94*exp((-75-v)/17)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + hAlpha = (0.000457*exp((-13-v)/50)) + hBeta = (0.0065/(exp((-v-15)/28)+1)) + hInf = hAlpha/(hAlpha + hBeta) + hTau = 1/(hAlpha + hBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Ca_LVA.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Ca_LVA.mod new file mode 100644 index 0000000..ab151d0 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Ca_LVA.mod @@ -0,0 +1,69 @@ +: Comment: LVA ca channel. Note: mtau is an approximation from the plots +: Reference: Avery and Johnston 1996, tau from Randall 1997 +: Comment: shifted by -10 mv to correct for junction potential +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Ca_LVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + v = v + 10 + mInf = 1.0000/(1+ exp((v - -30.000)/-6)) + mTau = (5.0000 + 20.0000/(1+exp((v - -25.000)/5)))/qt + hInf = 1.0000/(1+ exp((v - -80.000)/6.4)) + hTau = (20.0000 + 50.0000/(1+exp((v - -40.000)/7)))/qt + v = v - 10 + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Ih.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Ih.mod new file mode 100644 index 0000000..73b97d8 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Ih.mod @@ -0,0 +1,71 @@ +: Reference: Kole,Hallermann,and Stuart, J. Neurosci. 2006 + +NEURON { + SUFFIX Ih + NONSPECIFIC_CURRENT ihcn + RANGE gbar, g, ihcn +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + ehcn = -45.0 (mV) +} + +ASSIGNED { + v (mV) + ihcn (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ihcn = g*(v-ehcn) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + : if(v == -154.9){ + : v = v + 0.0001 + : } + :mAlpha = 0.001*6.43*(v+154.9)/(exp((v+154.9)/11.9)-1) + mAlpha = 0.001 * 6.43 * vtrap(v + 154.9, 11.9) + mBeta = 0.001*193*exp(v/33.1) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Im.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Im.mod new file mode 100644 index 0000000..d6112d5 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Im.mod @@ -0,0 +1,62 @@ +: Reference: Adams et al. 1982 - M-currents and other potassium currents in bullfrog sympathetic neurones +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Im + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mAlpha = 3.3e-3*exp(2.5*0.04*(v - -35)) + mBeta = 3.3e-3*exp(-2.5*0.04*(v - -35)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Im_v2.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Im_v2.mod new file mode 100644 index 0000000..fc219f7 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Im_v2.mod @@ -0,0 +1,59 @@ +: Based on Im model of Vervaeke et al. (2006) + +NEURON { + SUFFIX Im_v2 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-30)/10) + mAlpha = 0.007 * exp( (6 * 0.4 * (v - (-48))) / 26.12 ) + mBeta = 0.007 * exp( (-6 * (1 - 0.4) * (v - (-48))) / 26.12 ) + + mInf = mAlpha / (mAlpha + mBeta) + mTau = (15 + 1 / (mAlpha + mBeta)) / qt +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/K_P.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/K_P.mod new file mode 100644 index 0000000..0a1238f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/K_P.mod @@ -0,0 +1,71 @@ +: Comment: The persistent component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + + +NEURON { + SUFFIX K_P + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + tauF = 1 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mInf = 1 / (1 + exp(-(v - (-14.3 + vshift)) / 14.6)) + if (v < -50 + vshift){ + mTau = tauF * (1.25+175.03*exp(-(v - vshift) * -0.026))/qt + } else { + mTau = tauF * (1.25+13*exp(-(v - vshift) * 0.026))/qt + } + hInf = 1/(1 + exp(-(v - (-54 + vshift))/-11)) + hTau = (360+(1010+24*(v - (-55 + vshift)))*exp(-((v - (-75 + vshift))/48)^2))/qt + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/K_T.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/K_T.mod new file mode 100644 index 0000000..c31beaf --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/K_T.mod @@ -0,0 +1,68 @@ +: Comment: The transient component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + +NEURON { + SUFFIX K_T + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + mTauF = 1.0 + hTauF = 1.0 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1/(1 + exp(-(v - (-47 + vshift)) / 29)) + mTau = (0.34 + mTauF * 0.92*exp(-((v+71-vshift)/59)^2))/qt + hInf = 1/(1 + exp(-(v+66-vshift)/-10)) + hTau = (8 + hTauF * 49*exp(-((v+73-vshift)/23)^2))/qt + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Kd.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Kd.mod new file mode 100644 index 0000000..82cbe59 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Kd.mod @@ -0,0 +1,62 @@ +: Based on Kd model of Foust et al. (2011) + + +NEURON { + SUFFIX Kd + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * h + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h' = (hInf - h) / hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-23)/10) + mInf = 1 - 1 / (1 + exp((v - (-43)) / 8)) + mTau = 1 + hInf = 1 / (1 + exp((v - (-67)) / 7.3)) + hTau = 1500 +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Kv2like.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Kv2like.mod new file mode 100644 index 0000000..1cbdf84 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Kv2like.mod @@ -0,0 +1,86 @@ +: Kv2-like channel +: Adapted from model implemented in Keren et al. 2005 +: Adjusted parameters to be similar to guangxitoxin-sensitive current in mouse CA1 pyramids from Liu and Bean 2014 + + +NEURON { + SUFFIX Kv2like + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mAlpha + mBeta + mTau + hInf + h1Tau + h2Tau +} + +STATE { + m + h1 + h2 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * m * (0.5 * h1 + 0.5 * h2) + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h1' = (hInf - h1) / h1Tau + h2' = (hInf - h2) / h2Tau +} + +INITIAL{ + rates() + m = mInf + h1 = hInf + h2 = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mAlpha = 0.12 * vtrap( -(v - 43), 11.0) + mBeta = 0.02 * exp(-(v + 1.27) / 120) + mInf = mAlpha / (mAlpha + mBeta) + mTau = 2.5 * (1 / (qt * (mAlpha + mBeta))) + + hInf = 1/(1 + exp((v + 58) / 11)) + h1Tau = (360 + (1010 + 23.7 * (v + 54)) * exp(-((v + 75) / 48)^2)) / qt + h2Tau = (2350 + 1380 * exp(-0.011 * v) - 210 * exp(-0.03 * v)) / qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Kv3_1.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Kv3_1.mod new file mode 100644 index 0000000..e244657 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Kv3_1.mod @@ -0,0 +1,54 @@ +: Comment: Kv3-like potassium current + +NEURON { + SUFFIX Kv3_1 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + mInf + mTau +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + mInf = 1/(1+exp(((v -(18.700 + vshift))/(-9.700)))) + mTau = 0.2*20.000/(1+exp(((v -(-46.560 + vshift))/(-44.140)))) + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/NaTa.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/NaTa.mod new file mode 100644 index 0000000..fcf7bd3 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/NaTa.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTa + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -48 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -69 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/NaTs.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/NaTs.mod new file mode 100644 index 0000000..f753e71 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/NaTs.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTs + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -40 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -66 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/NaV.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/NaV.mod new file mode 100644 index 0000000..a702395 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/NaV.mod @@ -0,0 +1,186 @@ +TITLE Mouse sodium current +: Kinetics of Carter et al. (2012) +: Based on 37 degC recordings from mouse hippocampal CA1 pyramids + +NEURON { + SUFFIX NaV + USEION na READ ena WRITE ina + RANGE g, gbar +} + +UNITS { + (mV) = (millivolt) + (S) = (siemens) +} + +PARAMETER { + gbar = .015 (S/cm2) + + : kinetic parameters + Con = 0.01 (/ms) : closed -> inactivated transitions + Coff = 40 (/ms) : inactivated -> closed transitions + Oon = 8 (/ms) : open -> Ineg transition + Ooff = 0.05 (/ms) : Ineg -> open transition + alpha = 400 (/ms) + beta = 12 (/ms) + gamma = 250 (/ms) : opening + delta = 60 (/ms) : closing + + alfac = 2.51 + btfac = 5.32 + + : Vdep + x1 = 24 (mV) : Vdep of activation (alpha) + x2 = -24 (mV) : Vdep of deactivation (beta) +} + +ASSIGNED { + + : rates + f01 (/ms) + f02 (/ms) + f03 (/ms) + f04 (/ms) + f0O (/ms) + f11 (/ms) + f12 (/ms) + f13 (/ms) + f14 (/ms) + f1n (/ms) + fi1 (/ms) + fi2 (/ms) + fi3 (/ms) + fi4 (/ms) + fi5 (/ms) + fin (/ms) + + b01 (/ms) + b02 (/ms) + b03 (/ms) + b04 (/ms) + b0O (/ms) + b11 (/ms) + b12 (/ms) + b13 (/ms) + b14 (/ms) + b1n (/ms) + bi1 (/ms) + bi2 (/ms) + bi3 (/ms) + bi4 (/ms) + bi5 (/ms) + bin (/ms) + + v (mV) + ena (mV) + ina (milliamp/cm2) + g (S/cm2) + celsius (degC) +} + +STATE { + C1 FROM 0 TO 1 + C2 FROM 0 TO 1 + C3 FROM 0 TO 1 + C4 FROM 0 TO 1 + C5 FROM 0 TO 1 + I1 FROM 0 TO 1 + I2 FROM 0 TO 1 + I3 FROM 0 TO 1 + I4 FROM 0 TO 1 + I5 FROM 0 TO 1 + O FROM 0 TO 1 + I6 FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE activation METHOD sparse + g = gbar * O + ina = g * (v - ena) +} + +INITIAL { + rates(v) + SOLVE seqinitial +} + +KINETIC activation +{ + rates(v) + ~ C1 <-> C2 (f01,b01) + ~ C2 <-> C3 (f02,b02) + ~ C3 <-> C4 (f03,b03) + ~ C4 <-> C5 (f04,b04) + ~ C5 <-> O (f0O,b0O) + ~ O <-> I6 (fin,bin) + ~ I1 <-> I2 (f11,b11) + ~ I2 <-> I3 (f12,b12) + ~ I3 <-> I4 (f13,b13) + ~ I4 <-> I5 (f14,b14) + ~ I5 <-> I6 (f1n,b1n) + ~ C1 <-> I1 (fi1,bi1) + ~ C2 <-> I2 (fi2,bi2) + ~ C3 <-> I3 (fi3,bi3) + ~ C4 <-> I4 (fi4,bi4) + ~ C5 <-> I5 (fi5,bi5) + + CONSERVE C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +LINEAR seqinitial { : sets initial equilibrium + ~ I1*bi1 + C2*b01 - C1*( fi1+f01) = 0 + ~ C1*f01 + I2*bi2 + C3*b02 - C2*(b01+fi2+f02) = 0 + ~ C2*f02 + I3*bi3 + C4*b03 - C3*(b02+fi3+f03) = 0 + ~ C3*f03 + I4*bi4 + C5*b04 - C4*(b03+fi4+f04) = 0 + ~ C4*f04 + I5*bi5 + O*b0O - C5*(b04+fi5+f0O) = 0 + ~ C5*f0O + I6*bin - O*(b0O+fin) = 0 + + ~ C1*fi1 + I2*b11 - I1*( bi1+f11) = 0 + ~ I1*f11 + C2*fi2 + I3*b12 - I2*(b11+bi2+f12) = 0 + ~ I2*f12 + C3*fi3 + I4*bi3 - I3*(b12+bi3+f13) = 0 + ~ I3*f13 + C4*fi4 + I5*b14 - I4*(b13+bi4+f14) = 0 + ~ I4*f14 + C5*fi5 + I6*b1n - I5*(b14+bi5+f1n) = 0 + + ~ C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +PROCEDURE rates(v(mV) ) +{ + LOCAL qt + qt = 2.3^((celsius-37)/10) + + f01 = qt * 4 * alpha * exp(v/x1) + f02 = qt * 3 * alpha * exp(v/x1) + f03 = qt * 2 * alpha * exp(v/x1) + f04 = qt * 1 * alpha * exp(v/x1) + f0O = qt * gamma + f11 = qt * 4 * alpha * alfac * exp(v/x1) + f12 = qt * 3 * alpha * alfac * exp(v/x1) + f13 = qt * 2 * alpha * alfac * exp(v/x1) + f14 = qt * 1 * alpha * alfac * exp(v/x1) + f1n = qt * gamma + fi1 = qt * Con + fi2 = qt * Con * alfac + fi3 = qt * Con * alfac^2 + fi4 = qt * Con * alfac^3 + fi5 = qt * Con * alfac^4 + fin = qt * Oon + + b01 = qt * 1 * beta * exp(v/x2) + b02 = qt * 2 * beta * exp(v/x2) + b03 = qt * 3 * beta * exp(v/x2) + b04 = qt * 4 * beta * exp(v/x2) + b0O = qt * delta + b11 = qt * 1 * beta * exp(v/x2) / btfac + b12 = qt * 2 * beta * exp(v/x2) / btfac + b13 = qt * 3 * beta * exp(v/x2) / btfac + b14 = qt * 4 * beta * exp(v/x2) / btfac + b1n = qt * delta + bi1 = qt * Coff + bi2 = qt * Coff / (btfac) + bi3 = qt * Coff / (btfac^2) + bi4 = qt * Coff / (btfac^3) + bi5 = qt * Coff / (btfac^4) + bin = qt * Ooff +} + diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Nap.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Nap.mod new file mode 100644 index 0000000..ef8021e --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/Nap.mod @@ -0,0 +1,77 @@ +:Reference : Modeled according to kinetics derived from Magistretti & Alonso 1999 +:Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Nap + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + hInf + hTau + hAlpha + hBeta +} + +STATE { + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + rates() + g = gbar*mInf*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1.0/(1+exp((v- -52.6)/-4.6)) : assuming instantaneous activation as modeled by Magistretti and Alonso + + hInf = 1.0/(1+exp((v- -48.8)/10)) + hAlpha = 2.88e-6 * vtrap(v + 17, 4.63) + hBeta = 6.94e-6 * vtrap(-(v + 64.4), 2.63) + + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/SK.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/SK.mod new file mode 100644 index 0000000..8bfa3b7 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/SK.mod @@ -0,0 +1,56 @@ +: SK-type calcium-activated potassium current +: Reference : Kohler et al. 1996 + +NEURON { + SUFFIX SK + USEION k READ ek WRITE ik + USEION ca READ cai + RANGE gbar, g, ik +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + (mM) = (milli/liter) +} + +PARAMETER { + v (mV) + gbar = .000001 (mho/cm2) + zTau = 1 (ms) + ek (mV) + cai (mM) +} + +ASSIGNED { + zInf + ik (mA/cm2) + g (S/cm2) +} + +STATE { + z FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * z + ik = g * (v - ek) +} + +DERIVATIVE states { + rates(cai) + z' = (zInf - z) / zTau +} + +PROCEDURE rates(ca(mM)) { + if(ca < 1e-7){ + ca = ca + 1e-07 + } + zInf = 1/(1 + (0.00043 / ca)^4.8) +} + +INITIAL { + rates(cai) + z = zInf +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/vecevent.mod b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/vecevent.mod new file mode 100644 index 0000000..503dfd2 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/mechanisms/modfiles/vecevent.mod @@ -0,0 +1,71 @@ +: Vector stream of events + +NEURON { + ARTIFICIAL_CELL VecStim +} + +ASSIGNED { + index + etime (ms) + space +} + +INITIAL { + index = 0 + element() + if (index > 0) { + net_send(etime - t, 1) + } +} + +NET_RECEIVE (w) { + if (flag == 1) { + net_event(t) + element() + if (index > 0) { + net_send(etime - t, 1) + } + } +} + +VERBATIM +extern double* vector_vec(); +extern int vector_capacity(); +extern void* vector_arg(); +ENDVERBATIM + +PROCEDURE element() { +VERBATIM + { void* vv; int i, size; double* px; + i = (int)index; + if (i >= 0) { + vv = *((void**)(&space)); + if (vv) { + size = vector_capacity(vv); + px = vector_vec(vv); + if (i < size) { + etime = px[i]; + index += 1.; + }else{ + index = -1.; + } + }else{ + index = -1.; + } + } + } +ENDVERBATIM +} + +PROCEDURE play() { +VERBATIM + void** vv; + vv = (void**)(&space); + *vv = (void*)0; + if (ifarg(1)) { + *vv = vector_arg(1); + } +ENDVERBATIM +} + + diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/recXelectrodes/linear_electrode.csv b/bmtk-vb/docs/tutorial/sources/bionet_files/components/recXelectrodes/linear_electrode.csv new file mode 100644 index 0000000..d99c28f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/recXelectrodes/linear_electrode.csv @@ -0,0 +1,87 @@ +channel x_pos y_pos z_pos +0 10.0 0 5.0 +1 10.0 -10 5.0 +2 10.0 -20 5.0 +3 10.0 -30 5.0 +4 10.0 -40 5.0 +5 10.0 -50 5.0 +6 10.0 -60 5.0 +7 10.0 -70 5.0 +8 10.0 -80 5.0 +9 10.0 -90 5.0 +10 10.0 -100 5.0 +11 10.0 -110 5.0 +12 10.0 -120 5.0 +13 10.0 -130 5.0 +14 10.0 -140 5.0 +15 10.0 -150 5.0 +16 10.0 -160 5.0 +17 10.0 -170 5.0 +18 10.0 -180 5.0 +19 10.0 -190 5.0 +20 10.0 -200 5.0 +21 10.0 -210 5.0 +22 10.0 -220 5.0 +23 10.0 -230 5.0 +24 10.0 -240 5.0 +25 10.0 -250 5.0 +26 10.0 -260 5.0 +27 10.0 -270 5.0 +28 10.0 -280 5.0 +29 10.0 -290 5.0 +30 10.0 -300 5.0 +31 10.0 -310 5.0 +32 10.0 -320 5.0 +33 10.0 -330 5.0 +34 10.0 -340 5.0 +35 10.0 -350 5.0 +36 10.0 -360 5.0 +37 10.0 -370 5.0 +38 10.0 -380 5.0 +39 10.0 -390 5.0 +40 10.0 -400 5.0 +41 10.0 -410 5.0 +42 10.0 -420 5.0 +43 10.0 -430 5.0 +44 10.0 -440 5.0 +45 10.0 -450 5.0 +46 10.0 -460 5.0 +47 10.0 -470 5.0 +48 10.0 -480 5.0 +49 10.0 -490 5.0 +50 10.0 -500 5.0 +51 10.0 -510 5.0 +52 10.0 -520 5.0 +53 10.0 -530 5.0 +54 10.0 -540 5.0 +55 10.0 -550 5.0 +56 10.0 -560 5.0 +57 10.0 -570 5.0 +58 10.0 -580 5.0 +59 10.0 -590 5.0 +60 10.0 -600 5.0 +61 10.0 -610 5.0 +62 10.0 -620 5.0 +63 10.0 -630 5.0 +64 10.0 -640 5.0 +65 10.0 -650 5.0 +66 10.0 -660 5.0 +67 10.0 -670 5.0 +68 10.0 -680 5.0 +69 10.0 -690 5.0 +70 10.0 -700 5.0 +71 10.0 -710 5.0 +72 10.0 -720 5.0 +73 10.0 -730 5.0 +74 10.0 -740 5.0 +75 10.0 -750 5.0 +76 10.0 -760 5.0 +77 10.0 -770 5.0 +78 10.0 -780 5.0 +79 10.0 -790 5.0 +80 10.0 -800 5.0 +81 10.0 -810 5.0 +82 10.0 -820 5.0 +83 10.0 -830 5.0 +84 10.0 -840 5.0 +85 10.0 -850 5.0 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/recXelectrodes/mesh_electrode.csv b/bmtk-vb/docs/tutorial/sources/bionet_files/components/recXelectrodes/mesh_electrode.csv new file mode 100644 index 0000000..6eb41f1 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/recXelectrodes/mesh_electrode.csv @@ -0,0 +1,388 @@ +channel x_pos y_pos z_pos +0 -80.0 0.0 10.0 +1 -80.0 -20.0 10.0 +2 -80.0 -40.0 10.0 +3 -80.0 -60.0 10.0 +4 -80.0 -80.0 10.0 +5 -80.0 -100.0 10.0 +6 -80.0 -120.0 10.0 +7 -80.0 -140.0 10.0 +8 -80.0 -160.0 10.0 +9 -80.0 -180.0 10.0 +10 -80.0 -200.0 10.0 +11 -80.0 -220.0 10.0 +12 -80.0 -240.0 10.0 +13 -80.0 -260.0 10.0 +14 -80.0 -280.0 10.0 +15 -80.0 -300.0 10.0 +16 -80.0 -320.0 10.0 +17 -80.0 -340.0 10.0 +18 -80.0 -360.0 10.0 +19 -80.0 -380.0 10.0 +20 -80.0 -400.0 10.0 +21 -80.0 -420.0 10.0 +22 -80.0 -440.0 10.0 +23 -80.0 -460.0 10.0 +24 -80.0 -480.0 10.0 +25 -80.0 -500.0 10.0 +26 -80.0 -520.0 10.0 +27 -80.0 -540.0 10.0 +28 -80.0 -560.0 10.0 +29 -80.0 -580.0 10.0 +30 -80.0 -600.0 10.0 +31 -80.0 -620.0 10.0 +32 -80.0 -640.0 10.0 +33 -80.0 -660.0 10.0 +34 -80.0 -680.0 10.0 +35 -80.0 -700.0 10.0 +36 -80.0 -720.0 10.0 +37 -80.0 -740.0 10.0 +38 -80.0 -760.0 10.0 +39 -80.0 -780.0 10.0 +40 -80.0 -800.0 10.0 +41 -80.0 -820.0 10.0 +42 -80.0 -840.0 10.0 +43 -60.0 0.0 10.0 +44 -60.0 -20.0 10.0 +45 -60.0 -40.0 10.0 +46 -60.0 -60.0 10.0 +47 -60.0 -80.0 10.0 +48 -60.0 -100.0 10.0 +49 -60.0 -120.0 10.0 +50 -60.0 -140.0 10.0 +51 -60.0 -160.0 10.0 +52 -60.0 -180.0 10.0 +53 -60.0 -200.0 10.0 +54 -60.0 -220.0 10.0 +55 -60.0 -240.0 10.0 +56 -60.0 -260.0 10.0 +57 -60.0 -280.0 10.0 +58 -60.0 -300.0 10.0 +59 -60.0 -320.0 10.0 +60 -60.0 -340.0 10.0 +61 -60.0 -360.0 10.0 +62 -60.0 -380.0 10.0 +63 -60.0 -400.0 10.0 +64 -60.0 -420.0 10.0 +65 -60.0 -440.0 10.0 +66 -60.0 -460.0 10.0 +67 -60.0 -480.0 10.0 +68 -60.0 -500.0 10.0 +69 -60.0 -520.0 10.0 +70 -60.0 -540.0 10.0 +71 -60.0 -560.0 10.0 +72 -60.0 -580.0 10.0 +73 -60.0 -600.0 10.0 +74 -60.0 -620.0 10.0 +75 -60.0 -640.0 10.0 +76 -60.0 -660.0 10.0 +77 -60.0 -680.0 10.0 +78 -60.0 -700.0 10.0 +79 -60.0 -720.0 10.0 +80 -60.0 -740.0 10.0 +81 -60.0 -760.0 10.0 +82 -60.0 -780.0 10.0 +83 -60.0 -800.0 10.0 +84 -60.0 -820.0 10.0 +85 -60.0 -840.0 10.0 +86 -40.0 0.0 10.0 +87 -40.0 -20.0 10.0 +88 -40.0 -40.0 10.0 +89 -40.0 -60.0 10.0 +90 -40.0 -80.0 10.0 +91 -40.0 -100.0 10.0 +92 -40.0 -120.0 10.0 +93 -40.0 -140.0 10.0 +94 -40.0 -160.0 10.0 +95 -40.0 -180.0 10.0 +96 -40.0 -200.0 10.0 +97 -40.0 -220.0 10.0 +98 -40.0 -240.0 10.0 +99 -40.0 -260.0 10.0 +100 -40.0 -280.0 10.0 +101 -40.0 -300.0 10.0 +102 -40.0 -320.0 10.0 +103 -40.0 -340.0 10.0 +104 -40.0 -360.0 10.0 +105 -40.0 -380.0 10.0 +106 -40.0 -400.0 10.0 +107 -40.0 -420.0 10.0 +108 -40.0 -440.0 10.0 +109 -40.0 -460.0 10.0 +110 -40.0 -480.0 10.0 +111 -40.0 -500.0 10.0 +112 -40.0 -520.0 10.0 +113 -40.0 -540.0 10.0 +114 -40.0 -560.0 10.0 +115 -40.0 -580.0 10.0 +116 -40.0 -600.0 10.0 +117 -40.0 -620.0 10.0 +118 -40.0 -640.0 10.0 +119 -40.0 -660.0 10.0 +120 -40.0 -680.0 10.0 +121 -40.0 -700.0 10.0 +122 -40.0 -720.0 10.0 +123 -40.0 -740.0 10.0 +124 -40.0 -760.0 10.0 +125 -40.0 -780.0 10.0 +126 -40.0 -800.0 10.0 +127 -40.0 -820.0 10.0 +128 -40.0 -840.0 10.0 +129 -20.0 0.0 10.0 +130 -20.0 -20.0 10.0 +131 -20.0 -40.0 10.0 +132 -20.0 -60.0 10.0 +133 -20.0 -80.0 10.0 +134 -20.0 -100.0 10.0 +135 -20.0 -120.0 10.0 +136 -20.0 -140.0 10.0 +137 -20.0 -160.0 10.0 +138 -20.0 -180.0 10.0 +139 -20.0 -200.0 10.0 +140 -20.0 -220.0 10.0 +141 -20.0 -240.0 10.0 +142 -20.0 -260.0 10.0 +143 -20.0 -280.0 10.0 +144 -20.0 -300.0 10.0 +145 -20.0 -320.0 10.0 +146 -20.0 -340.0 10.0 +147 -20.0 -360.0 10.0 +148 -20.0 -380.0 10.0 +149 -20.0 -400.0 10.0 +150 -20.0 -420.0 10.0 +151 -20.0 -440.0 10.0 +152 -20.0 -460.0 10.0 +153 -20.0 -480.0 10.0 +154 -20.0 -500.0 10.0 +155 -20.0 -520.0 10.0 +156 -20.0 -540.0 10.0 +157 -20.0 -560.0 10.0 +158 -20.0 -580.0 10.0 +159 -20.0 -600.0 10.0 +160 -20.0 -620.0 10.0 +161 -20.0 -640.0 10.0 +162 -20.0 -660.0 10.0 +163 -20.0 -680.0 10.0 +164 -20.0 -700.0 10.0 +165 -20.0 -720.0 10.0 +166 -20.0 -740.0 10.0 +167 -20.0 -760.0 10.0 +168 -20.0 -780.0 10.0 +169 -20.0 -800.0 10.0 +170 -20.0 -820.0 10.0 +171 -20.0 -840.0 10.0 +172 0.0 0.0 10.0 +173 0.0 -20.0 10.0 +174 0.0 -40.0 10.0 +175 0.0 -60.0 10.0 +176 0.0 -80.0 10.0 +177 0.0 -100.0 10.0 +178 0.0 -120.0 10.0 +179 0.0 -140.0 10.0 +180 0.0 -160.0 10.0 +181 0.0 -180.0 10.0 +182 0.0 -200.0 10.0 +183 0.0 -220.0 10.0 +184 0.0 -240.0 10.0 +185 0.0 -260.0 10.0 +186 0.0 -280.0 10.0 +187 0.0 -300.0 10.0 +188 0.0 -320.0 10.0 +189 0.0 -340.0 10.0 +190 0.0 -360.0 10.0 +191 0.0 -380.0 10.0 +192 0.0 -400.0 10.0 +193 0.0 -420.0 10.0 +194 0.0 -440.0 10.0 +195 0.0 -460.0 10.0 +196 0.0 -480.0 10.0 +197 0.0 -500.0 10.0 +198 0.0 -520.0 10.0 +199 0.0 -540.0 10.0 +200 0.0 -560.0 10.0 +201 0.0 -580.0 10.0 +202 0.0 -600.0 10.0 +203 0.0 -620.0 10.0 +204 0.0 -640.0 10.0 +205 0.0 -660.0 10.0 +206 0.0 -680.0 10.0 +207 0.0 -700.0 10.0 +208 0.0 -720.0 10.0 +209 0.0 -740.0 10.0 +210 0.0 -760.0 10.0 +211 0.0 -780.0 10.0 +212 0.0 -800.0 10.0 +213 0.0 -820.0 10.0 +214 0.0 -840.0 10.0 +215 20.0 0.0 10.0 +216 20.0 -20.0 10.0 +217 20.0 -40.0 10.0 +218 20.0 -60.0 10.0 +219 20.0 -80.0 10.0 +220 20.0 -100.0 10.0 +221 20.0 -120.0 10.0 +222 20.0 -140.0 10.0 +223 20.0 -160.0 10.0 +224 20.0 -180.0 10.0 +225 20.0 -200.0 10.0 +226 20.0 -220.0 10.0 +227 20.0 -240.0 10.0 +228 20.0 -260.0 10.0 +229 20.0 -280.0 10.0 +230 20.0 -300.0 10.0 +231 20.0 -320.0 10.0 +232 20.0 -340.0 10.0 +233 20.0 -360.0 10.0 +234 20.0 -380.0 10.0 +235 20.0 -400.0 10.0 +236 20.0 -420.0 10.0 +237 20.0 -440.0 10.0 +238 20.0 -460.0 10.0 +239 20.0 -480.0 10.0 +240 20.0 -500.0 10.0 +241 20.0 -520.0 10.0 +242 20.0 -540.0 10.0 +243 20.0 -560.0 10.0 +244 20.0 -580.0 10.0 +245 20.0 -600.0 10.0 +246 20.0 -620.0 10.0 +247 20.0 -640.0 10.0 +248 20.0 -660.0 10.0 +249 20.0 -680.0 10.0 +250 20.0 -700.0 10.0 +251 20.0 -720.0 10.0 +252 20.0 -740.0 10.0 +253 20.0 -760.0 10.0 +254 20.0 -780.0 10.0 +255 20.0 -800.0 10.0 +256 20.0 -820.0 10.0 +257 20.0 -840.0 10.0 +258 40.0 0.0 10.0 +259 40.0 -20.0 10.0 +260 40.0 -40.0 10.0 +261 40.0 -60.0 10.0 +262 40.0 -80.0 10.0 +263 40.0 -100.0 10.0 +264 40.0 -120.0 10.0 +265 40.0 -140.0 10.0 +266 40.0 -160.0 10.0 +267 40.0 -180.0 10.0 +268 40.0 -200.0 10.0 +269 40.0 -220.0 10.0 +270 40.0 -240.0 10.0 +271 40.0 -260.0 10.0 +272 40.0 -280.0 10.0 +273 40.0 -300.0 10.0 +274 40.0 -320.0 10.0 +275 40.0 -340.0 10.0 +276 40.0 -360.0 10.0 +277 40.0 -380.0 10.0 +278 40.0 -400.0 10.0 +279 40.0 -420.0 10.0 +280 40.0 -440.0 10.0 +281 40.0 -460.0 10.0 +282 40.0 -480.0 10.0 +283 40.0 -500.0 10.0 +284 40.0 -520.0 10.0 +285 40.0 -540.0 10.0 +286 40.0 -560.0 10.0 +287 40.0 -580.0 10.0 +288 40.0 -600.0 10.0 +289 40.0 -620.0 10.0 +290 40.0 -640.0 10.0 +291 40.0 -660.0 10.0 +292 40.0 -680.0 10.0 +293 40.0 -700.0 10.0 +294 40.0 -720.0 10.0 +295 40.0 -740.0 10.0 +296 40.0 -760.0 10.0 +297 40.0 -780.0 10.0 +298 40.0 -800.0 10.0 +299 40.0 -820.0 10.0 +300 40.0 -840.0 10.0 +301 60.0 0.0 10.0 +302 60.0 -20.0 10.0 +303 60.0 -40.0 10.0 +304 60.0 -60.0 10.0 +305 60.0 -80.0 10.0 +306 60.0 -100.0 10.0 +307 60.0 -120.0 10.0 +308 60.0 -140.0 10.0 +309 60.0 -160.0 10.0 +310 60.0 -180.0 10.0 +311 60.0 -200.0 10.0 +312 60.0 -220.0 10.0 +313 60.0 -240.0 10.0 +314 60.0 -260.0 10.0 +315 60.0 -280.0 10.0 +316 60.0 -300.0 10.0 +317 60.0 -320.0 10.0 +318 60.0 -340.0 10.0 +319 60.0 -360.0 10.0 +320 60.0 -380.0 10.0 +321 60.0 -400.0 10.0 +322 60.0 -420.0 10.0 +323 60.0 -440.0 10.0 +324 60.0 -460.0 10.0 +325 60.0 -480.0 10.0 +326 60.0 -500.0 10.0 +327 60.0 -520.0 10.0 +328 60.0 -540.0 10.0 +329 60.0 -560.0 10.0 +330 60.0 -580.0 10.0 +331 60.0 -600.0 10.0 +332 60.0 -620.0 10.0 +333 60.0 -640.0 10.0 +334 60.0 -660.0 10.0 +335 60.0 -680.0 10.0 +336 60.0 -700.0 10.0 +337 60.0 -720.0 10.0 +338 60.0 -740.0 10.0 +339 60.0 -760.0 10.0 +340 60.0 -780.0 10.0 +341 60.0 -800.0 10.0 +342 60.0 -820.0 10.0 +343 60.0 -840.0 10.0 +344 80.0 0.0 10.0 +345 80.0 -20.0 10.0 +346 80.0 -40.0 10.0 +347 80.0 -60.0 10.0 +348 80.0 -80.0 10.0 +349 80.0 -100.0 10.0 +350 80.0 -120.0 10.0 +351 80.0 -140.0 10.0 +352 80.0 -160.0 10.0 +353 80.0 -180.0 10.0 +354 80.0 -200.0 10.0 +355 80.0 -220.0 10.0 +356 80.0 -240.0 10.0 +357 80.0 -260.0 10.0 +358 80.0 -280.0 10.0 +359 80.0 -300.0 10.0 +360 80.0 -320.0 10.0 +361 80.0 -340.0 10.0 +362 80.0 -360.0 10.0 +363 80.0 -380.0 10.0 +364 80.0 -400.0 10.0 +365 80.0 -420.0 10.0 +366 80.0 -440.0 10.0 +367 80.0 -460.0 10.0 +368 80.0 -480.0 10.0 +369 80.0 -500.0 10.0 +370 80.0 -520.0 10.0 +371 80.0 -540.0 10.0 +372 80.0 -560.0 10.0 +373 80.0 -580.0 10.0 +374 80.0 -600.0 10.0 +375 80.0 -620.0 10.0 +376 80.0 -640.0 10.0 +377 80.0 -660.0 10.0 +378 80.0 -680.0 10.0 +379 80.0 -700.0 10.0 +380 80.0 -720.0 10.0 +381 80.0 -740.0 10.0 +382 80.0 -760.0 10.0 +383 80.0 -780.0 10.0 +384 80.0 -800.0 10.0 +385 80.0 -820.0 10.0 +386 80.0 -840.0 10.0 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/recXelectrodes/mesh_electrode_half.csv b/bmtk-vb/docs/tutorial/sources/bionet_files/components/recXelectrodes/mesh_electrode_half.csv new file mode 100644 index 0000000..bf5373f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/recXelectrodes/mesh_electrode_half.csv @@ -0,0 +1,216 @@ +channel x_pos y_pos z_pos +0 -80.0 0.0 10.0 +1 -80.0 -20.0 10.0 +2 -80.0 -40.0 10.0 +3 -80.0 -60.0 10.0 +4 -80.0 -80.0 10.0 +5 -80.0 -100.0 10.0 +6 -80.0 -120.0 10.0 +7 -80.0 -140.0 10.0 +8 -80.0 -160.0 10.0 +9 -80.0 -180.0 10.0 +10 -80.0 -200.0 10.0 +11 -80.0 -220.0 10.0 +12 -80.0 -240.0 10.0 +13 -80.0 -260.0 10.0 +14 -80.0 -280.0 10.0 +15 -80.0 -300.0 10.0 +16 -80.0 -320.0 10.0 +17 -80.0 -340.0 10.0 +18 -80.0 -360.0 10.0 +19 -80.0 -380.0 10.0 +20 -80.0 -400.0 10.0 +21 -80.0 -420.0 10.0 +22 -80.0 -440.0 10.0 +23 -80.0 -460.0 10.0 +24 -80.0 -480.0 10.0 +25 -80.0 -500.0 10.0 +26 -80.0 -520.0 10.0 +27 -80.0 -540.0 10.0 +28 -80.0 -560.0 10.0 +29 -80.0 -580.0 10.0 +30 -80.0 -600.0 10.0 +31 -80.0 -620.0 10.0 +32 -80.0 -640.0 10.0 +33 -80.0 -660.0 10.0 +34 -80.0 -680.0 10.0 +35 -80.0 -700.0 10.0 +36 -80.0 -720.0 10.0 +37 -80.0 -740.0 10.0 +38 -80.0 -760.0 10.0 +39 -80.0 -780.0 10.0 +40 -80.0 -800.0 10.0 +41 -80.0 -820.0 10.0 +42 -80.0 -840.0 10.0 +43 -60.0 0.0 10.0 +44 -60.0 -20.0 10.0 +45 -60.0 -40.0 10.0 +46 -60.0 -60.0 10.0 +47 -60.0 -80.0 10.0 +48 -60.0 -100.0 10.0 +49 -60.0 -120.0 10.0 +50 -60.0 -140.0 10.0 +51 -60.0 -160.0 10.0 +52 -60.0 -180.0 10.0 +53 -60.0 -200.0 10.0 +54 -60.0 -220.0 10.0 +55 -60.0 -240.0 10.0 +56 -60.0 -260.0 10.0 +57 -60.0 -280.0 10.0 +58 -60.0 -300.0 10.0 +59 -60.0 -320.0 10.0 +60 -60.0 -340.0 10.0 +61 -60.0 -360.0 10.0 +62 -60.0 -380.0 10.0 +63 -60.0 -400.0 10.0 +64 -60.0 -420.0 10.0 +65 -60.0 -440.0 10.0 +66 -60.0 -460.0 10.0 +67 -60.0 -480.0 10.0 +68 -60.0 -500.0 10.0 +69 -60.0 -520.0 10.0 +70 -60.0 -540.0 10.0 +71 -60.0 -560.0 10.0 +72 -60.0 -580.0 10.0 +73 -60.0 -600.0 10.0 +74 -60.0 -620.0 10.0 +75 -60.0 -640.0 10.0 +76 -60.0 -660.0 10.0 +77 -60.0 -680.0 10.0 +78 -60.0 -700.0 10.0 +79 -60.0 -720.0 10.0 +80 -60.0 -740.0 10.0 +81 -60.0 -760.0 10.0 +82 -60.0 -780.0 10.0 +83 -60.0 -800.0 10.0 +84 -60.0 -820.0 10.0 +85 -60.0 -840.0 10.0 +86 -40.0 0.0 10.0 +87 -40.0 -20.0 10.0 +88 -40.0 -40.0 10.0 +89 -40.0 -60.0 10.0 +90 -40.0 -80.0 10.0 +91 -40.0 -100.0 10.0 +92 -40.0 -120.0 10.0 +93 -40.0 -140.0 10.0 +94 -40.0 -160.0 10.0 +95 -40.0 -180.0 10.0 +96 -40.0 -200.0 10.0 +97 -40.0 -220.0 10.0 +98 -40.0 -240.0 10.0 +99 -40.0 -260.0 10.0 +100 -40.0 -280.0 10.0 +101 -40.0 -300.0 10.0 +102 -40.0 -320.0 10.0 +103 -40.0 -340.0 10.0 +104 -40.0 -360.0 10.0 +105 -40.0 -380.0 10.0 +106 -40.0 -400.0 10.0 +107 -40.0 -420.0 10.0 +108 -40.0 -440.0 10.0 +109 -40.0 -460.0 10.0 +110 -40.0 -480.0 10.0 +111 -40.0 -500.0 10.0 +112 -40.0 -520.0 10.0 +113 -40.0 -540.0 10.0 +114 -40.0 -560.0 10.0 +115 -40.0 -580.0 10.0 +116 -40.0 -600.0 10.0 +117 -40.0 -620.0 10.0 +118 -40.0 -640.0 10.0 +119 -40.0 -660.0 10.0 +120 -40.0 -680.0 10.0 +121 -40.0 -700.0 10.0 +122 -40.0 -720.0 10.0 +123 -40.0 -740.0 10.0 +124 -40.0 -760.0 10.0 +125 -40.0 -780.0 10.0 +126 -40.0 -800.0 10.0 +127 -40.0 -820.0 10.0 +128 -40.0 -840.0 10.0 +129 -20.0 0.0 10.0 +130 -20.0 -20.0 10.0 +131 -20.0 -40.0 10.0 +132 -20.0 -60.0 10.0 +133 -20.0 -80.0 10.0 +134 -20.0 -100.0 10.0 +135 -20.0 -120.0 10.0 +136 -20.0 -140.0 10.0 +137 -20.0 -160.0 10.0 +138 -20.0 -180.0 10.0 +139 -20.0 -200.0 10.0 +140 -20.0 -220.0 10.0 +141 -20.0 -240.0 10.0 +142 -20.0 -260.0 10.0 +143 -20.0 -280.0 10.0 +144 -20.0 -300.0 10.0 +145 -20.0 -320.0 10.0 +146 -20.0 -340.0 10.0 +147 -20.0 -360.0 10.0 +148 -20.0 -380.0 10.0 +149 -20.0 -400.0 10.0 +150 -20.0 -420.0 10.0 +151 -20.0 -440.0 10.0 +152 -20.0 -460.0 10.0 +153 -20.0 -480.0 10.0 +154 -20.0 -500.0 10.0 +155 -20.0 -520.0 10.0 +156 -20.0 -540.0 10.0 +157 -20.0 -560.0 10.0 +158 -20.0 -580.0 10.0 +159 -20.0 -600.0 10.0 +160 -20.0 -620.0 10.0 +161 -20.0 -640.0 10.0 +162 -20.0 -660.0 10.0 +163 -20.0 -680.0 10.0 +164 -20.0 -700.0 10.0 +165 -20.0 -720.0 10.0 +166 -20.0 -740.0 10.0 +167 -20.0 -760.0 10.0 +168 -20.0 -780.0 10.0 +169 -20.0 -800.0 10.0 +170 -20.0 -820.0 10.0 +171 -20.0 -840.0 10.0 +172 0.0 0.0 10.0 +173 0.0 -20.0 10.0 +174 0.0 -40.0 10.0 +175 0.0 -60.0 10.0 +176 0.0 -80.0 10.0 +177 0.0 -100.0 10.0 +178 0.0 -120.0 10.0 +179 0.0 -140.0 10.0 +180 0.0 -160.0 10.0 +181 0.0 -180.0 10.0 +182 0.0 -200.0 10.0 +183 0.0 -220.0 10.0 +184 0.0 -240.0 10.0 +185 0.0 -260.0 10.0 +186 0.0 -280.0 10.0 +187 0.0 -300.0 10.0 +188 0.0 -320.0 10.0 +189 0.0 -340.0 10.0 +190 0.0 -360.0 10.0 +191 0.0 -380.0 10.0 +192 0.0 -400.0 10.0 +193 0.0 -420.0 10.0 +194 0.0 -440.0 10.0 +195 0.0 -460.0 10.0 +196 0.0 -480.0 10.0 +197 0.0 -500.0 10.0 +198 0.0 -520.0 10.0 +199 0.0 -540.0 10.0 +200 0.0 -560.0 10.0 +201 0.0 -580.0 10.0 +202 0.0 -600.0 10.0 +203 0.0 -620.0 10.0 +204 0.0 -640.0 10.0 +205 0.0 -660.0 10.0 +206 0.0 -680.0 10.0 +207 0.0 -700.0 10.0 +208 0.0 -720.0 10.0 +209 0.0 -740.0 10.0 +210 0.0 -760.0 10.0 +211 0.0 -780.0 10.0 +212 0.0 -800.0 10.0 +213 0.0 -820.0 10.0 +214 0.0 -840.0 10.0 diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/AMPA_ExcToExc.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/AMPA_ExcToExc.json new file mode 100644 index 0000000..c758540 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/AMPA_ExcToExc.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 1.0, + "tau2": 3.0, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/AMPA_ExcToInh.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/AMPA_ExcToInh.json new file mode 100644 index 0000000..4388799 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/AMPA_ExcToInh.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.1, + "tau2": 0.5, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/GABA_InhToExc.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/GABA_InhToExc.json new file mode 100644 index 0000000..702ce9b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/GABA_InhToExc.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 2.7, + "tau2": 15.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/GABA_InhToInh.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/GABA_InhToInh.json new file mode 100644 index 0000000..ed4130a --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/GABA_InhToInh.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.2, + "tau2": 8.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/instanteneousExc.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/instanteneousExc.json new file mode 100644 index 0000000..9a6d0a5 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/instanteneousExc.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": 1 +} + diff --git a/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/instanteneousInh.json b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/instanteneousInh.json new file mode 100644 index 0000000..3bac514 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/bionet_files/components/synaptic_models/instanteneousInh.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": -1 +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/analyze_simulation.py b/bmtk-vb/docs/tutorial/sources/chapter01/analyze_simulation.py new file mode 100644 index 0000000..3e2964b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/analyze_simulation.py @@ -0,0 +1,6 @@ +from bmtk.analyzer.spike_trains import to_dataframe +from bmtk.analyzer.cell_vars import plot_report + +config_file = 'simulation_config.json' +print to_dataframe(config_file=config_file) +plot_report(config_file=config_file) diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/build_network.py b/bmtk-vb/docs/tutorial/sources/chapter01/build_network.py new file mode 100644 index 0000000..67768af --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/build_network.py @@ -0,0 +1,15 @@ +from bmtk.builder.networks import NetworkBuilder + + +# First thing is to create a network builder object +net = NetworkBuilder('mcortex') +net.add_nodes(cell_name='Scnn1a_473845048', + potental='exc', + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic', + dynamics_params='472363762_fit.json', + morphology='Scnn1a_473845048_m.swc') + +net.build() +net.save_nodes(output_dir='network') \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/circuit_config.json b/bmtk-vb/docs/tutorial/sources/chapter01/circuit_config.json new file mode 100644 index 0000000..23cd073 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/circuit_config.json @@ -0,0 +1,23 @@ +{ + "manifest": { + "$BASE_DIR": ".", + "$COMPONENTS_DIR": "$BASE_DIR/biophys_components", + "$NETWORK_DIR": "$BASE_DIR/network" + }, + "components": { + "point_neuron_models_dir": "$COMPONENTS_DIR/point_neuron_templates", + "biophysical_neuron_models_dir": "$COMPONENTS_DIR/biophysical_neuron_templates", + "mechanisms_dir": "$COMPONENTS_DIR/mechanisms", + "morphologies_dir": "$COMPONENTS_DIR/morphologies", + "synaptic_models_dir": "$COMPONENTS_DIR/synaptic_models" + }, + "networks": { + "nodes": [ + { + "node_types_file": "$NETWORK_DIR/mcortex_node_types.csv", + "nodes_file": "$NETWORK_DIR/mcortex_nodes.h5" + } + ], + "edges": [] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/472363762_fit.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/472363762_fit.json new file mode 100644 index 0000000..99f0eb3 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/472363762_fit.json @@ -0,0 +1,173 @@ +{ + "passive": [ + { + "ra": 138.28, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "apic", + "cm": 2.12 + }, + { + "section": "dend", + "cm": 2.12 + } + ], + "e_pas": -92.49911499023438 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 38 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -92.49911499023438 + } + ], + "genome": [ + { + "value": 0.0012021154978800002, + "section": "soma", + "name": "gbar_Im", + "mechanism": "Im" + }, + { + "value": 4.12225901169e-05, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.98228995892999993, + "section": "soma", + "name": "gbar_NaTs", + "mechanism": "NaTs" + }, + { + "value": 0.000209348990528, + "section": "soma", + "name": "gbar_Nap", + "mechanism": "Nap" + }, + { + "value": 0.051758360920800002, + "section": "soma", + "name": "gbar_K_P", + "mechanism": "K_P" + }, + { + "value": 0.00073160714529799998, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00019222004878899999, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.057264803402699994, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.00053599731839199991, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0070061294358100008, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.0012510775510599999, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 717.91660042899991, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 5.71880766722e-06, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00045738760076499994, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 3.2393273274400003e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 9.5861855476200007e-05, + "section": "apic", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/472912177_fit.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/472912177_fit.json new file mode 100644 index 0000000..f06b7f7 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/472912177_fit.json @@ -0,0 +1,163 @@ +{ + "passive": [ + { + "ra": 143.65, + "cm": [ + { + "section": "soma", + "cm": 2.16 + }, + { + "section": "axon", + "cm": 2.16 + }, + { + "section": "dend", + "cm": 2.16 + } + ], + "e_pas": -95.53709411621094 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 55 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -95.53709411621094 + } + ], + "genome": [ + { + "value": 5.1162860430100002e-05, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.058520185129300004, + "section": "soma", + "name": "gbar_NaV", + "mechanism": "NaV" + }, + { + "value": 0.00031192529327399998, + "section": "soma", + "name": "gbar_Kd", + "mechanism": "Kd" + }, + { + "value": 0.051060238264300006, + "section": "soma", + "name": "gbar_Kv2like", + "mechanism": "Kv2like" + }, + { + "value": 0.65076055389700005, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.033385946416300001, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00775048605222, + "section": "soma", + "name": "gbar_Im_v2", + "mechanism": "Im_v2" + }, + { + "value": 0.0027340091995900003, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.00056478972054199987, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0032114779487500003, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.0077204433411699998, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 20.300246788599999, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00026705534351299998, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00066246357111199989, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 9.8019833221899986e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/473862421_fit.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/473862421_fit.json new file mode 100644 index 0000000..9a4e6d1 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/473862421_fit.json @@ -0,0 +1,163 @@ +{ + "passive": [ + { + "ra": 138.99, + "cm": [ + { + "section": "soma", + "cm": 1.94 + }, + { + "section": "axon", + "cm": 1.94 + }, + { + "section": "dend", + "cm": 1.94 + } + ], + "e_pas": -88.23363494873047 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 58 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -88.23363494873047 + } + ], + "genome": [ + { + "value": 0.00030357031297000004, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.052161472289300001, + "section": "soma", + "name": "gbar_NaV", + "mechanism": "NaV" + }, + { + "value": 0.0033126476739899998, + "section": "soma", + "name": "gbar_Kd", + "mechanism": "Kd" + }, + { + "value": 0.019206276717599998, + "section": "soma", + "name": "gbar_Kv2like", + "mechanism": "Kv2like" + }, + { + "value": 1.2128893375100001, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 1.4016010650299999e-05, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.0011153668151199999, + "section": "soma", + "name": "gbar_Im_v2", + "mechanism": "Im_v2" + }, + { + "value": 0.048152669735999999, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.0, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.046090335451600004, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 574.74935741900003, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00058689407428699997, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.0009617982321389999, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 4.1690838408899998e-07, + "section": "dend", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/473863035_fit.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/473863035_fit.json new file mode 100644 index 0000000..35967ea --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/473863035_fit.json @@ -0,0 +1,173 @@ +{ + "passive": [ + { + "ra": 122.88, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "apic", + "cm": 2.28 + }, + { + "section": "dend", + "cm": 2.28 + } + ], + "e_pas": -89.4614028930664 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 41 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -89.4614028930664 + } + ], + "genome": [ + { + "value": 0.00204889965055, + "section": "soma", + "name": "gbar_Im", + "mechanism": "Im" + }, + { + "value": 3.7269252291999993e-05, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.60927080502300002, + "section": "soma", + "name": "gbar_NaTs", + "mechanism": "NaTs" + }, + { + "value": 6.2161868365100004e-05, + "section": "soma", + "name": "gbar_Nap", + "mechanism": "Nap" + }, + { + "value": 0.018147424450599997, + "section": "soma", + "name": "gbar_K_P", + "mechanism": "K_P" + }, + { + "value": 0.000555828337834, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00041743171143300003, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.12468487969900001, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.00097272189665800009, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0066296509568100001, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.00071152004894800005, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 798.67999240300003, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00054589151280800012, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00021542161812900001, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 6.2827249623699998e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 5.9318998497700001e-06, + "section": "apic", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/473863510_fit.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/473863510_fit.json new file mode 100644 index 0000000..e5f322e --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/electrophysiology/473863510_fit.json @@ -0,0 +1,173 @@ +{ + "passive": [ + { + "ra": 35.64, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "apic", + "cm": 2.19 + }, + { + "section": "dend", + "cm": 2.19 + } + ], + "e_pas": -85.07815551757812 + } + ], + "axon_morph": [ + { + "delete_axon": [ + "forsec axonal{delete_section()}", + " create axon[2]", + " axon[0]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + " axon[1]{", + " L= 30", + " diam = 1", + " nseg = 1+2*int(L/40)", + " all.append()", + " axonal.append()", + " }", + "", + "nSecAxonal = 2", + "connect axon(0), soma(0.5)", + "connect axon[1](0), axon[0](1) ", + "access soma" + ], + "setup_line": "create soma[1], dend[1], apic[1], axon[1]" + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 38 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -85.07815551757812 + } + ], + "genome": [ + { + "value": 0.00043788364247700001, + "section": "soma", + "name": "gbar_Im", + "mechanism": "Im" + }, + { + "value": 0.0019922075246600001, + "section": "soma", + "name": "gbar_Ih", + "mechanism": "Ih" + }, + { + "value": 0.71282189194800005, + "section": "soma", + "name": "gbar_NaTs", + "mechanism": "NaTs" + }, + { + "value": 0.0012493753876800001, + "section": "soma", + "name": "gbar_Nap", + "mechanism": "Nap" + }, + { + "value": 0.034836377263399998, + "section": "soma", + "name": "gbar_K_P", + "mechanism": "K_P" + }, + { + "value": 0.0166428509042, + "section": "soma", + "name": "gbar_K_T", + "mechanism": "K_T" + }, + { + "value": 0.00024972209054299998, + "section": "soma", + "name": "gbar_SK", + "mechanism": "SK" + }, + { + "value": 0.28059766435600003, + "section": "soma", + "name": "gbar_Kv3_1", + "mechanism": "Kv3_1" + }, + { + "value": 0.00015339031713199999, + "section": "soma", + "name": "gbar_Ca_HVA", + "mechanism": "Ca_HVA" + }, + { + "value": 0.0033469316039000004, + "section": "soma", + "name": "gbar_Ca_LVA", + "mechanism": "Ca_LVA" + }, + { + "value": 0.0040218816981199999, + "section": "soma", + "name": "gamma_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 991.140696832, + "section": "soma", + "name": "decay_CaDynamics", + "mechanism": "CaDynamics" + }, + { + "value": 0.00092865666454699993, + "section": "soma", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 0.00091423093354899986, + "section": "axon", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 3.8264043188599994e-06, + "section": "dend", + "name": "g_pas", + "mechanism": "" + }, + { + "value": 2.11145615996e-06, + "section": "apic", + "name": "g_pas", + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc new file mode 100644 index 0000000..7376d58 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Nr5a1-Cre_Ai14_IVSCC_-169250.03.02.01_471087815_m.swc @@ -0,0 +1,1534 @@ +#name E:/Vaa3D-2.938/169250.03.02.01/169250.03.02.01_470218928_Nivi7.swc +#comment +##n,type,x,y,z,radius,parent +1 1 414.8144 408.5224 15.12 6.4406 -1 +2 3 415.7685 414.0582 14.8882 0.3686 1 +3 3 415.6495 414.9757 16.5147 0.5339 2 +4 3 415.3658 416.0739 16.8563 0.661 3 +5 3 415.6415 417.1756 16.515 0.6991 4 +6 3 416.1872 418.1366 17.2357 0.7118 5 +7 3 416.8393 419.0758 17.3597 0.7245 6 +8 3 417.5886 419.9407 17.36 0.7627 7 +9 3 418.4752 420.6625 17.36 0.8008 8 +10 3 419.4945 422.4128 17.3135 0.5466 9 +11 3 420.1923 423.3166 17.1464 0.5212 10 +12 3 420.6133 424.3393 16.4335 0.4957 11 +13 3 421.135 425.3369 15.9295 0.4957 12 +14 3 421.3546 426.458 16.0826 0.4449 13 +15 3 421.6567 427.5608 16.0269 0.3559 14 +16 3 421.5423 428.5184 17.4675 0.2669 15 +17 3 421.4713 429.6498 17.4583 0.2924 16 +18 3 421.4118 430.7492 17.8839 0.3432 17 +19 3 420.9199 431.7662 17.7391 0.3686 18 +20 3 420.174 432.6116 17.9446 0.3686 19 +21 3 419.371 433.3804 17.7316 0.3432 20 +22 3 419.0014 434.3562 16.9249 0.3559 21 +23 3 418.7212 435.324 15.9732 0.3686 22 +24 3 418.4203 436.4211 16.0723 0.3813 23 +25 3 418.1846 437.4965 16.7093 0.394 24 +26 3 417.7648 438.4963 17.4961 0.394 25 +27 3 417.1802 439.1278 16.5441 0.3813 26 +28 3 416.543 439.733 16.4973 0.3432 27 +29 3 415.8188 440.2512 18.1639 0.3178 28 +30 3 414.8453 440.6013 18.958 0.3051 29 +31 3 413.7242 440.6082 18.9213 0.2796 30 +32 3 412.6202 440.8038 19.0162 0.2796 31 +33 3 412.118 441.6995 19.4015 0.3051 32 +34 3 412.285 442.7749 20.083 0.394 33 +35 3 412.817 443.729 20.869 0.4449 34 +36 3 413.5102 444.6316 21.0196 0.4957 35 +37 3 413.556 445.7585 21.2654 0.5212 36 +38 3 413.143 447.0741 19.6034 0.4322 37 +39 3 412.6168 448.0808 19.8881 0.394 38 +40 3 412.0562 449.0143 20.657 0.3432 39 +41 3 411.5151 449.926 21.4312 0.3051 40 +42 3 410.8848 450.8744 21.2789 0.2924 41 +43 3 410.2292 451.8056 21.1624 0.2542 42 +44 3 409.6698 452.7929 20.9762 0.2034 43 +45 3 409.2568 453.8294 20.4523 0.178 44 +46 3 409.0704 454.9436 20.1698 0.178 45 +47 3 409.1802 456.0339 20.5537 0.1907 46 +48 3 409.1585 457.0211 21.546 0.2034 47 +49 3 408.7409 458.0141 22.437 0.2161 48 +50 3 408.4881 459.1055 22.78 0.2161 49 +51 3 408.4904 460.2426 22.8189 0.2034 50 +52 3 408.6723 461.3706 22.8502 0.1907 51 +53 3 408.9983 462.462 22.8077 0.2034 52 +54 3 409.3038 463.5351 23.119 0.2161 53 +55 3 409.2202 464.6299 23.3598 0.2288 54 +56 3 408.6654 465.5977 23.214 0.2161 55 +57 3 408.1895 466.6021 23.0574 0.178 56 +58 3 407.7937 467.658 22.6853 0.1398 57 +59 3 407.1096 468.5458 22.4742 0.1271 58 +60 3 406.1921 469.0686 23.1949 0.1525 59 +61 3 405.2128 469.4415 24.3166 0.178 60 +62 3 404.4051 470.0868 25.3742 0.178 61 +63 3 403.5494 470.7869 25.4982 0.178 62 +64 3 402.6651 471.4756 25.8037 0.1907 63 +65 3 401.6881 472.0396 26.0574 0.2415 64 +66 3 400.9526 472.8244 26.6879 0.2542 65 +67 3 400.4972 473.8471 26.6627 0.2415 66 +68 3 400.1929 474.9465 26.6081 0.2034 67 +69 3 399.693 475.809 27.7763 0.2161 68 +70 3 398.9185 476.6007 27.4254 0.2669 69 +71 3 397.9564 477.1212 26.6462 0.3051 70 +72 3 396.9051 477.5262 26.1811 0.3051 71 +73 3 395.9258 478.0753 25.664 0.2669 72 +74 3 395.0358 478.7617 26.1218 0.2415 73 +75 3 394.2796 479.5877 26.6865 0.2415 74 +76 3 394.2979 480.4628 28.3556 0.2542 75 +77 3 393.9936 481.4684 28.3256 0.2669 76 +78 3 393.1653 482.2029 28.7921 0.2542 77 +79 3 392.3051 482.9499 28.8492 0.2288 78 +80 3 391.4688 483.6088 29.6657 0.2161 79 +81 3 390.4838 483.9257 30.6312 0.2415 80 +82 3 389.5057 484.3719 30.3834 0.2924 81 +83 3 388.6191 485.0594 29.8824 0.3305 82 +84 3 387.6398 485.6314 29.7548 0.3305 83 +85 3 386.7441 486.3178 29.9541 0.3051 84 +86 3 385.8312 486.9253 29.412 0.2542 85 +87 3 385.0429 487.7295 29.0755 0.2288 86 +88 3 385.0704 488.8312 29.4 0.2288 87 +89 3 413.8923 446.5295 21.2332 0.3305 37 +90 3 414.0719 447.6209 21.6059 0.3051 89 +91 3 413.9209 448.7306 21.5765 0.2796 90 +92 3 413.8763 449.846 21.0935 0.2542 91 +93 3 413.8466 450.9797 20.9381 0.1907 92 +94 3 413.2814 451.9166 21.294 0.1652 93 +95 3 412.3491 452.5172 21.782 0.178 94 +96 3 411.2897 452.8616 22.3804 0.2288 95 +97 3 410.3208 453.2002 23.5788 0.2542 96 +98 3 409.218 453.2986 24.0853 0.2796 97 +99 3 408.5087 454.065 24.8021 0.2796 98 +100 3 408.4114 455.1507 25.4965 0.2796 99 +101 3 408.6185 456.1403 26.7708 0.2669 100 +102 3 409.0178 457.1332 27.7544 0.2796 101 +103 3 409.3953 458.1548 28.5242 0.2669 102 +104 3 408.9789 458.8973 30.2677 0.2542 103 +105 3 407.9515 459.356 30.3562 0.2161 104 +106 3 407.2068 460.1763 29.6979 0.2161 105 +107 3 406.6874 461.1681 29.3798 0.2161 106 +108 3 406.4792 462.2847 29.687 0.2288 107 +109 3 406.4232 463.3829 30.3103 0.2288 108 +110 3 406.5341 464.4182 31.3561 0.2161 109 +111 3 406.2985 465.481 32.097 0.2161 110 +112 3 406.0285 466.4706 33.1758 0.2288 111 +113 3 406.0239 467.5745 33.2567 0.2669 112 +114 3 406.2035 468.611 32.58 0.3051 113 +115 3 406.7515 469.6063 32.415 0.3051 114 +116 3 407.2846 470.6004 32.1434 0.2669 115 +117 3 407.645 471.5591 32.5606 0.2161 116 +118 3 407.2034 472.337 33.9486 0.1907 117 +119 3 406.4735 473.1492 34.613 0.2034 118 +120 3 405.9187 473.9901 35.7904 0.2034 119 +121 3 405.0687 474.5941 35.7104 0.2161 120 +122 3 404.0654 474.7108 36.834 0.2161 121 +123 3 403.9075 475.8354 36.5403 0.2415 122 +124 3 403.4785 476.8672 37.0034 0.2542 123 +125 3 402.8218 477.4598 38.7218 0.2542 124 +126 3 401.8952 477.6989 39.7194 0.2288 125 +127 3 401.8106 478.7697 39.459 0.2161 126 +128 3 402.3219 479.7604 39.1384 0.2288 127 +129 3 402.5622 480.8266 39.7446 0.2415 128 +130 3 402.6571 481.8173 41.1012 0.2415 129 +131 3 402.4009 482.8252 41.4795 0.2161 130 +132 3 402.0702 483.7393 42.0918 0.2034 131 +133 3 401.9547 484.7162 43.3311 0.178 132 +134 3 402.219 485.747 43.3927 0.178 133 +135 3 402.6194 486.7777 43.4686 0.178 134 +136 3 402.4889 487.773 44.448 0.1907 135 +137 3 401.8826 488.5932 45.6378 0.2034 136 +138 3 401.1402 489.3986 46.3901 0.2415 137 +139 3 400.3096 490.1685 46.5377 0.2796 138 +140 3 399.526 490.9934 46.478 0.3051 139 +141 3 398.8945 491.9131 46.9462 0.2924 140 +142 3 398.3488 492.8844 47.5555 0.2669 141 +143 3 397.9038 493.9197 48.0208 0.2415 142 +144 3 397.4176 494.9424 48.3753 0.2415 143 +145 3 396.7392 495.8245 48.909 0.2542 144 +146 3 396.1649 496.79 49.1725 0.2415 145 +147 3 395.9716 497.8963 49.2988 0.2161 146 +148 3 395.9476 498.8549 50.664 0.1907 147 +149 3 396.3045 499.8765 51.3192 0.1907 148 +150 3 396.5962 500.9336 52.0904 0.178 149 +151 3 396.2679 502.0101 52.1452 0.2034 150 +152 3 396.1672 503.1312 52.64 0.2796 151 +153 3 421.7573 429.151 15.1718 0.483 15 +154 3 421.9244 430.2653 14.6978 0.4195 153 +155 3 422.0662 431.3841 14.2232 0.3305 154 +156 3 422.12 432.5018 14.6902 0.2796 155 +157 3 422.1966 433.6206 15.2452 0.3432 156 +158 3 422.1406 434.7543 14.9027 0.3813 157 +159 3 421.882 435.8388 14.28 0.394 158 +160 3 420.8296 436.9577 13.186 0.3686 159 +161 3 420.0779 437.6166 11.8448 0.3305 160 +162 3 419.8777 438.5249 12.0445 0.2542 161 +163 3 419.5426 439.3578 13.6772 0.2161 162 +164 3 419.181 440.3679 13.2686 0.2415 163 +165 3 418.8436 441.4559 13.2356 0.2924 164 +166 3 418.4638 442.5335 13.3319 0.3178 165 +167 3 417.8883 443.5128 13.5985 0.3305 166 +168 3 417.4856 444.5767 13.8382 0.3559 167 +169 3 417.425 445.7161 14.0258 0.4195 168 +170 3 417.1299 446.8155 14.273 0.4449 169 +171 3 416.5865 447.8039 13.8558 0.4195 170 +172 3 416.2936 448.7008 12.376 0.3559 171 +173 3 415.7605 449.6686 13.0239 0.3178 172 +174 3 414.9368 450.4317 12.8534 0.2924 173 +175 3 413.9015 450.8493 13.2983 0.2796 174 +176 3 412.9165 451.3961 12.8517 0.2542 175 +177 3 411.8961 451.872 12.549 0.2288 176 +178 3 411.0358 452.611 12.2189 0.1907 177 +179 3 410.1926 453.3478 11.7572 0.178 178 +180 3 409.5314 454.2675 11.6967 0.1907 179 +181 3 408.9949 455.2662 11.655 0.2288 180 +182 3 408.3291 456.1162 12.3222 0.2669 181 +183 3 407.6003 456.7546 13.6881 0.3051 182 +184 3 406.7217 457.3151 13.9454 0.3305 183 +185 3 405.9839 458.0702 12.8789 0.3432 184 +186 3 405.3981 458.9682 12.0534 0.3305 185 +187 3 404.9257 460.0001 11.8423 0.3178 186 +188 3 404.4543 461.0309 11.6248 0.2796 187 +189 3 404.007 462.073 11.3347 0.2542 188 +190 3 403.5037 463.0832 11.6222 0.2161 189 +191 3 402.95 464.0304 12.3953 0.2034 190 +192 3 402.4466 464.9994 13.2031 0.1907 191 +193 3 402.2075 466.0519 13.0155 0.1907 192 +194 3 402.0451 467.1581 12.6353 0.1907 193 +195 3 401.8174 468.2792 12.644 0.1907 194 +196 3 401.4708 469.3626 12.7716 0.178 195 +197 3 400.8519 470.2995 13.1191 0.1652 196 +198 3 400.1106 471.145 13.6234 0.1398 197 +199 3 399.7113 472.1791 13.8687 0.1271 198 +200 3 399.3109 473.2328 13.4935 0.1271 199 +201 3 398.6508 474.148 13.701 0.1525 200 +202 3 398.2596 475.1776 14.3612 0.2034 201 +203 3 398.2722 476.2609 15.1833 0.2542 202 +204 3 397.8409 477.2917 15.3742 0.2924 203 +205 3 397.349 478.2858 14.7389 0.2924 204 +206 3 397.2231 479.3955 15.0836 0.2669 205 +207 3 397.2792 480.5315 14.9005 0.2542 206 +208 3 397.1751 481.6686 14.9134 0.2542 207 +209 3 397.0458 482.7508 15.7142 0.2542 208 +210 3 396.7403 483.8239 15.141 0.2288 209 +211 3 396.3079 484.865 15.4974 0.2034 210 +212 3 396.2908 485.9987 15.5518 0.2161 211 +213 3 396.5653 487.0992 15.3952 0.2415 212 +214 3 396.9634 488.154 15.8682 0.2542 213 +215 3 397.2746 489.2122 16.3523 0.2288 214 +216 3 397.0938 490.3138 16.4032 0.2034 215 +217 3 396.7529 491.3457 15.7492 0.1907 216 +218 3 396.2805 492.3787 16.0202 0.1907 217 +219 3 395.7016 493.3626 16.1857 0.2034 218 +220 3 395.133 494.3418 16.1364 0.2161 219 +221 3 394.5118 495.2742 15.7651 0.2288 220 +222 3 393.8357 496.1757 16.1616 0.2034 221 +223 3 393.1825 497.084 16.5472 0.178 222 +224 3 392.6608 498.0953 16.4119 0.1398 223 +225 3 392.3851 499.1878 16.1297 0.1398 224 +226 3 392.3954 500.3158 15.8334 0.1652 225 +227 3 392.5579 501.4381 16.0118 0.2034 226 +228 3 392.6654 502.5626 16.3489 0.2288 227 +229 3 392.5304 503.6563 15.9905 0.2161 228 +230 3 392.8485 504.6058 15.703 0.2161 229 +231 3 393.679 505.3712 15.9558 0.2161 230 +232 3 394.5942 506.0484 15.9706 0.2415 231 +233 3 395.5815 506.6032 15.6699 0.2415 232 +234 3 396.6225 507.0711 15.5168 0.2288 233 +235 3 397.7082 507.3892 15.7598 0.178 234 +236 3 398.8064 507.3571 16.3929 0.1398 235 +237 3 399.7822 507.8559 16.4368 0.1398 236 +238 3 400.7066 508.5206 16.1647 0.178 237 +239 3 401.5143 509.3237 15.9827 0.2542 238 +240 3 401.7728 510.224 14.56 0.3432 239 +241 3 421.5491 436.4589 14.488 0.4703 159 +242 3 421.8203 437.5217 13.7939 0.4068 241 +243 3 422.0651 438.5936 13.0189 0.3686 242 +244 3 422.2927 439.7056 13.3171 0.3559 243 +245 3 422.2698 440.8347 13.734 0.3686 244 +246 3 422.1818 441.9741 13.6581 0.394 245 +247 3 422.2733 443.0895 13.221 0.3813 246 +248 3 422.8235 443.9956 12.1755 0.3686 247 +249 3 423.4642 444.8307 11.0984 0.3178 248 +250 3 424.2181 445.4484 9.6359 0.2924 249 +251 3 424.9697 446.1234 8.7802 0.2542 250 +252 3 425.5749 446.7126 10.1234 0.2415 251 +253 3 426.3116 447.4619 9.7479 0.2415 252 +254 3 427.0907 448.1551 10.7674 0.2669 253 +255 3 427.7439 449.0646 10.9533 0.2796 254 +256 3 428.5241 449.838 10.7607 0.2796 255 +257 3 429.4873 450.3917 11.4128 0.2415 256 +258 3 430.0822 451.2325 12.0772 0.2288 257 +259 3 430.549 452.2255 11.9157 0.1907 258 +260 3 431.3635 452.9805 11.7505 0.1907 259 +261 3 432.3531 453.5491 11.7524 0.178 260 +262 3 432.9765 454.4563 11.5486 0.2034 261 +263 3 433.3655 455.5316 11.5206 0.2034 262 +264 3 433.9215 456.3004 10.0691 0.2034 263 +265 3 434.704 456.9857 9.4102 0.1907 264 +266 3 434.998 457.8448 11.1104 0.1907 265 +267 3 435.4053 458.7234 12.5023 0.1907 266 +268 3 436.0333 459.6272 12.6302 0.1907 267 +269 3 436.5424 460.508 11.4363 0.1907 268 +270 3 437.2688 461.2986 11.0706 0.2034 269 +271 3 437.7985 462.2629 11.3011 0.2034 270 +272 3 438.3053 463.2548 10.8296 0.2161 271 +273 3 438.9173 464.2066 10.6515 0.2161 272 +274 3 439.4241 465.227 10.5636 0.2415 273 +275 3 439.7845 466.2898 10.7484 0.2415 274 +276 3 440.2101 467.3286 11.062 0.2288 275 +277 3 440.7695 468.2895 10.5963 0.2034 276 +278 3 441.584 469.0068 10.0509 0.2034 277 +279 3 442.5221 469.6532 9.9355 0.2161 278 +280 3 443.3355 470.4048 9.3864 0.2288 279 +281 3 444.1877 471.1427 9.3254 0.2288 280 +282 3 445.1121 471.8142 9.3856 0.2288 281 +283 3 446.0284 472.4869 9.1188 0.2161 282 +284 3 446.7331 473.3586 9.3332 0.2034 283 +285 3 447.4413 474.2452 9.205 0.178 284 +286 3 448.2112 475.0895 9.2305 0.1652 285 +287 3 448.7786 476.0767 9.1448 0.178 286 +288 3 449.3632 477.048 9.52 0.2415 287 +289 3 420.3742 420.9268 17.3779 0.4703 9 +290 3 421.5137 420.857 17.5042 0.483 289 +291 3 422.6565 420.8238 17.5941 0.483 290 +292 3 423.7811 420.6694 17.2483 0.4703 291 +293 3 424.8816 420.3605 17.3186 0.4957 292 +294 3 426.0245 420.3571 17.4199 0.483 293 +295 3 427.2634 421.0252 16.7042 0.4576 294 +296 3 428.1111 421.6658 15.6918 0.4449 295 +297 3 429.0984 422.2161 15.4381 0.4068 296 +298 3 429.8386 422.9951 16.2999 0.3813 297 +299 3 430.422 423.9161 17.1332 0.3559 298 +300 3 430.9597 424.8965 17.7167 0.3178 299 +301 3 431.6941 425.7533 17.3169 0.2924 300 +302 3 432.0613 426.8333 17.3177 0.2415 301 +303 3 432.1918 427.9658 17.0853 0.2669 302 +304 3 432.6986 428.9874 16.8622 0.3178 303 +305 3 432.829 429.699 16.4027 0.2542 304 +306 3 433.1047 430.6405 15.0086 0.3305 305 +307 3 433.4376 431.6804 15.3588 0.3813 306 +308 3 433.4616 432.6608 16.8 0.4195 307 +309 3 433.2431 433.2214 17.6039 0.2161 308 +310 3 433.2236 434.2773 18.4173 0.2415 309 +311 3 433.4399 435.3892 18.4122 0.2542 310 +312 3 433.8734 436.4108 17.8545 0.2796 311 +313 3 434.4626 437.3295 17.0316 0.2669 312 +314 3 434.9968 438.3167 16.613 0.2415 313 +315 3 435.8034 439.0683 16.8876 0.2161 314 +316 3 436.8616 439.471 16.7415 0.2415 315 +317 3 437.8763 439.9881 16.5043 0.2924 316 +318 3 438.8075 440.5704 17.2301 0.3432 317 +319 3 439.1233 441.6012 18.0578 0.3559 318 +320 3 439.2148 442.7188 17.5605 0.3432 319 +321 3 439.2411 443.8617 17.6568 0.3051 320 +322 3 439.296 444.9634 17.185 0.2796 321 +323 3 439.2411 446.0033 16.83 0.2669 322 +324 3 438.8853 446.9288 18.1132 0.2542 323 +325 3 438.7229 447.8817 19.2805 0.2542 324 +326 3 439.002 448.9285 19.0991 0.2415 325 +327 3 439.4161 449.9592 18.7183 0.2542 326 +328 3 439.8737 450.9991 18.935 0.2415 327 +329 3 440.345 451.9612 19.7576 0.2415 328 +330 3 440.9617 452.8364 20.4445 0.2288 329 +331 3 441.4707 453.8042 20.921 0.2415 330 +332 3 442.0828 454.6862 20.7435 0.2669 331 +333 3 442.8321 455.5191 20.7046 0.2796 332 +334 3 443.4224 456.4743 21.1523 0.2924 333 +335 3 443.92 457.4181 20.5523 0.3051 334 +336 3 444.5584 458.323 20.1698 0.3305 335 +337 3 444.9222 459.3755 20.3045 0.3305 336 +338 3 445.3718 460.4085 20.1572 0.3178 337 +339 3 445.7768 461.4232 20.7444 0.3051 338 +340 3 446.1406 462.4666 21.4645 0.2924 339 +341 3 446.6691 463.4676 21.6219 0.2796 340 +342 3 447.2765 464.4114 22.0833 0.2542 341 +343 3 447.8302 465.4009 22.3874 0.2542 342 +344 3 448.1517 466.4912 22.4692 0.2542 343 +345 3 448.6619 467.4842 22.9284 0.2796 344 +346 3 449.2076 468.4749 23.3388 0.2796 345 +347 3 449.8746 469.3935 23.1501 0.2796 346 +348 3 450.6731 470.1554 22.4619 0.2669 347 +349 3 451.5345 470.8818 22.6814 0.2796 348 +350 3 452.1923 471.7833 23.238 0.3051 349 +351 3 452.8044 472.7431 23.1594 0.3559 350 +352 3 453.2482 473.7922 22.9827 0.394 351 +353 3 453.3512 474.9213 23.1829 0.394 352 +354 3 453.4061 476.0619 23.3503 0.3432 353 +355 3 453.4496 477.1956 23.6936 0.2796 354 +356 3 453.3741 478.3236 24.1259 0.2542 355 +357 3 453.8134 479.3612 24.3421 0.2669 356 +358 3 454.6702 480.0933 23.9915 0.2796 357 +359 3 455.4298 480.8221 23.4203 0.2669 358 +360 3 456.4674 481.2156 24.0178 0.2415 359 +361 3 457.5622 481.5279 24.2298 0.2288 360 +362 3 458.6067 481.942 24.6854 0.2161 361 +363 3 459.5997 482.482 24.7352 0.1907 362 +364 3 460.5607 483.022 24.0943 0.1907 363 +365 3 461.4015 483.7507 23.4559 0.2288 364 +366 3 462.3956 484.2106 23.0728 0.2669 365 +367 3 463.4058 484.6362 23.4788 0.2542 366 +368 3 464.0464 485.4861 23.5088 0.2161 367 +369 3 464.3565 486.4654 22.3975 0.2034 368 +370 3 464.901 487.3486 22.2583 0.2288 369 +371 3 465.5302 488.2729 22.1032 0.2288 370 +372 3 465.9443 489.3243 22.1194 0.2161 371 +373 3 466.2978 490.4111 22.1878 0.1907 372 +374 3 466.6204 491.5013 22.451 0.2034 373 +375 3 467.1902 492.444 22.0301 0.2288 374 +376 3 467.5059 493.5262 21.9974 0.2669 375 +377 3 467.9486 494.5203 22.5758 0.3051 376 +378 3 468.1809 495.598 22.0374 0.3051 377 +379 3 468.7952 496.5463 21.8355 0.2669 378 +380 3 469.477 497.4112 22.2468 0.1907 379 +381 3 470.47 497.9512 21.9666 0.1398 380 +382 3 471.4996 498.2429 21.3632 0.1271 381 +383 3 472.6093 498.2143 21.3332 0.1398 382 +384 3 473.6297 498.689 21.2612 0.1525 383 +385 3 474.5404 499.2553 21.2744 0.1398 384 +386 3 475.4624 499.777 21.9915 0.1525 385 +387 3 476.0562 500.6453 21.2089 0.178 386 +388 3 476.4188 501.6097 21.8036 0.2288 387 +389 3 477.1887 502.375 22.2925 0.2415 388 +390 3 478.1359 503.0054 22.1418 0.2288 389 +391 3 479.0694 503.6597 22.2667 0.2034 390 +392 3 479.8016 504.5234 22.4787 0.178 391 +393 3 480.448 505.4043 21.7697 0.178 392 +394 3 481.06 506.3573 21.7974 0.1652 393 +395 3 481.8231 507.205 21.9271 0.1652 394 +396 3 482.3951 508.1225 21.0613 0.1525 395 +397 3 483.2256 508.7368 19.88 0.1907 396 +398 3 433.9467 433.0315 16.2554 0.1525 308 +399 3 434.5953 433.6481 14.5919 0.1652 398 +400 3 435.6958 433.7259 13.9961 0.1907 399 +401 3 436.7083 434.1949 13.8625 0.2161 400 +402 3 437.8305 434.1068 14.2601 0.2288 401 +403 3 438.9356 434.2052 14.8229 0.2288 402 +404 3 440.0133 433.9295 14.9223 0.2288 403 +405 3 441.0223 433.6309 14.1876 0.2415 404 +406 3 442.1446 433.7339 14.5827 0.2669 405 +407 3 443.2382 434.0325 14.7224 0.3051 406 +408 3 444.325 434.3676 14.5113 0.3178 407 +409 3 445.3878 434.7726 14.4337 0.3051 408 +410 3 446.446 435.0895 13.8989 0.2669 409 +411 3 447.4722 435.4361 13.7329 0.2542 410 +412 3 448.4594 435.9967 13.7931 0.2796 411 +413 3 449.5108 436.3674 13.314 0.3305 412 +414 3 450.6022 436.5355 12.6112 0.3813 413 +415 3 451.7244 436.5893 12.444 0.3813 414 +416 3 452.8101 436.8501 12.7361 0.3559 415 +417 3 453.6017 437.3626 11.7267 0.3051 416 +418 3 454.5204 437.6498 11.5307 0.2924 417 +419 3 455.5019 437.8957 12.7725 0.2924 418 +420 3 456.5018 438.3099 13.4848 0.2924 419 +421 3 457.5428 438.7068 13.0687 0.2796 420 +422 3 458.5701 439.1267 12.3973 0.2796 421 +423 3 459.5734 439.5717 11.611 0.2796 422 +424 3 460.6636 439.8257 11.6886 0.2796 423 +425 3 461.7916 439.7673 12.0036 0.2542 424 +426 3 462.8018 439.7113 10.8951 0.2669 425 +427 3 463.9149 439.7994 10.5633 0.2542 426 +428 3 464.9662 439.9916 11.4733 0.2542 427 +429 3 466.0725 439.9138 11.1432 0.2161 428 +430 3 467.1261 439.5031 10.7456 0.2034 429 +431 3 468.2495 439.6918 10.6529 0.1907 430 +432 3 469.2688 440.2112 10.64 0.2034 431 +433 3 432.7226 429.1121 17.598 0.1652 304 +434 3 433.4284 429.4896 18.6074 0.2161 433 +435 3 434.4443 429.7905 17.736 0.2669 434 +436 3 435.4853 430.1703 17.8595 0.3051 435 +437 3 436.3422 430.39 19.5054 0.3305 436 +438 3 437.3569 430.724 20.4061 0.3178 437 +439 3 438.4048 431.177 20.5887 0.2669 438 +440 3 439.2743 431.8829 21.1495 0.2034 439 +441 3 440.1094 432.6608 20.9689 0.1652 440 +442 3 440.2318 433.3781 22.388 0.178 441 +443 3 440.4423 434.418 23.273 0.2161 442 +444 3 440.7855 435.3892 24.3858 0.2542 443 +445 3 441.1573 436.3262 23.8218 0.2542 444 +446 3 441.0395 437.2791 24.7338 0.2288 445 +447 3 441.1973 438.3579 25.4083 0.2034 446 +448 3 441.7842 439.288 26.0859 0.2034 447 +449 3 441.8185 440.3702 26.9472 0.2288 448 +450 3 441.6755 441.465 27.5293 0.2542 449 +451 3 441.9741 442.5381 27.7606 0.2669 450 +452 3 442.3562 443.5402 27.0626 0.2796 451 +453 3 442.7486 444.5698 27.2101 0.3051 452 +454 3 443.2291 445.548 26.7375 0.3178 453 +455 3 443.5139 446.6359 26.4919 0.3178 454 +456 3 443.8834 447.4733 27.8149 0.2924 455 +457 3 444.023 448.4068 29.1508 0.2796 456 +458 3 443.8148 449.4879 28.9282 0.2415 457 +459 3 443.8937 450.5255 27.8975 0.2415 458 +460 3 444.2735 451.5746 27.5937 0.2415 459 +461 3 444.5939 452.3788 29.1805 0.2796 460 +462 3 445.3626 452.9107 30.6872 0.2669 461 +463 3 445.9964 453.8145 31.3488 0.2415 462 +464 3 446.1028 454.9379 31.717 0.2034 463 +465 3 445.6315 455.9606 32.1457 0.2034 464 +466 3 444.913 456.7008 33.3357 0.2161 465 +467 3 444.3399 457.6057 34.2574 0.2288 466 +468 3 443.4579 458.3276 34.2227 0.2288 467 +469 3 442.601 458.99 33.3934 0.2542 468 +470 3 441.6526 459.6134 33.5616 0.2669 469 +471 3 440.5773 459.8571 33.6389 0.2669 470 +472 3 439.5831 459.7347 34.6735 0.2288 471 +473 3 438.7606 460.412 35.0826 0.2161 472 +474 3 438.3739 461.4782 35.4404 0.2161 473 +475 3 438.0204 462.5512 35.87 0.2161 474 +476 3 437.5972 463.5797 36.3653 0.1907 475 +477 3 436.8204 464.2386 37.3173 0.1652 476 +478 3 435.7588 464.4983 37.8434 0.1652 477 +479 3 434.6331 464.655 38.0481 0.2034 478 +480 3 433.5989 465.052 38.3827 0.2415 479 +481 3 432.8839 465.6366 39.6301 0.2796 480 +482 3 432.6802 466.2921 41.8065 0.2669 481 +483 3 432.44 467.2233 43.2524 0.2415 482 +484 3 432.1391 468.3216 43.3936 0.178 483 +485 3 431.288 469.04 43.96 0.1525 484 +486 3 441.3232 433.1905 20.1667 0.2542 441 +487 3 442.2395 433.8597 20.3403 0.3051 486 +488 3 443.1822 434.4466 20.9404 0.3305 487 +489 3 444.1225 435.0689 20.8468 0.3432 488 +490 3 445.1224 435.5002 20.0567 0.3305 489 +491 3 446.0113 435.9864 18.7603 0.3051 490 +492 3 446.859 436.5355 18.7345 0.2796 491 +493 3 447.7158 437.2151 19.0733 0.2796 492 +494 3 448.6974 437.7665 19.1786 0.2924 493 +495 3 449.5222 438.5089 19.3158 0.2796 494 +496 3 450.442 438.557 20.4137 0.2415 495 +497 3 451.5082 438.311 21.1462 0.2034 496 +498 3 452.3605 438.8956 21.7308 0.2034 497 +499 3 453.0434 439.7936 21.3662 0.2034 498 +500 3 453.8408 440.5338 22.2113 0.2161 499 +501 3 454.5306 441.4399 22.3289 0.2161 500 +502 3 455.304 442.1537 21.4315 0.2288 501 +503 3 456.3794 442.3871 21.957 0.2288 502 +504 3 457.3929 442.5358 23.1087 0.2288 503 +505 3 458.1869 443.1696 23.6748 0.2542 504 +506 3 458.8424 444.0539 23.5735 0.2796 505 +507 3 459.8045 444.6019 24.1324 0.3051 506 +508 3 460.8787 444.9176 24.5162 0.2924 507 +509 3 461.9632 445.1304 24.019 0.2542 508 +510 3 463.0283 445.3066 23.1059 0.2161 509 +511 3 464.1219 445.4484 23.0653 0.1907 510 +512 3 465.1744 445.7596 23.2148 0.1907 511 +513 3 465.9077 446.5204 23.5253 0.178 512 +514 3 466.6113 447.3795 23.8479 0.1525 513 +515 3 467.6111 447.8646 23.7622 0.1398 514 +516 3 468.7117 448.1734 23.683 0.1525 515 +517 3 469.66 448.7626 23.4368 0.1907 516 +518 3 470.6256 449.2854 22.7704 0.2034 517 +519 3 471.6483 449.7613 22.4644 0.2034 518 +520 3 472.6997 450.204 22.6173 0.2034 519 +521 3 473.7544 450.6227 22.9592 0.2288 520 +522 3 474.8229 451.006 22.8547 0.2415 521 +523 3 475.9303 451.2702 22.64 0.2288 522 +524 3 476.9862 451.4979 23.3814 0.1907 523 +525 3 478.0913 451.6821 23.4783 0.1652 524 +526 3 478.764 452.452 24.36 0.1525 525 +527 3 427.2886 420.0013 17.3099 0.394 294 +528 3 428.3491 419.5895 17.4538 0.4068 527 +529 3 429.4565 419.3767 17.2584 0.4068 528 +530 3 430.4037 418.9717 17.9315 0.4068 529 +531 3 431.3704 418.4191 17.5484 0.3559 530 +532 3 432.4171 418.1228 17.8377 0.3051 531 +533 3 433.0372 417.5932 18.9356 0.2542 532 +534 3 433.9352 417.1722 17.841 0.2796 533 +535 3 434.6056 416.3954 18.3996 0.3051 534 +536 3 434.8962 415.4436 19.4362 0.3432 535 +537 3 434.2967 414.6417 20.0684 0.3305 536 +538 3 435.0026 414.0388 19.9548 0.3305 537 +539 3 436.0905 414.0868 19.8374 0.3686 538 +540 3 437.0732 414.5341 20.1942 0.4322 539 +541 3 438.1245 414.7721 20.6618 0.4576 540 +542 3 439.0466 414.938 21.8781 0.4068 541 +543 3 440.0533 415.248 22.1024 0.3305 542 +544 3 440.6665 415.0432 24.1704 0.2924 543 +545 3 441.7007 414.5913 24.3342 0.2924 544 +546 3 442.8264 414.6417 24.7117 0.3051 545 +547 3 443.9269 414.8739 24.9343 0.3051 546 +548 3 445.0618 414.7629 25.0275 0.3178 547 +549 3 446.1508 414.5421 24.9743 0.3432 548 +550 3 447.2354 414.3328 24.6036 0.3686 549 +551 3 448.3405 414.5593 24.4367 0.394 550 +552 3 449.2877 415.1816 24.5176 0.394 551 +553 3 450.291 415.6964 24.5574 0.4068 552 +554 3 451.2588 416.1048 25.0919 0.394 553 +555 3 452.0001 416.797 23.9562 0.3686 554 +556 3 452.873 417.3838 23.0236 0.3178 555 +557 3 453.9712 417.6515 22.7388 0.2796 556 +558 3 455.0283 417.584 23.6062 0.3051 557 +559 3 455.9309 418.2807 23.4024 0.3559 558 +560 3 456.8758 418.8985 23.3906 0.4068 559 +561 3 457.7499 419.5334 23.1232 0.4068 560 +562 3 458.4855 420.3468 22.3608 0.394 561 +563 3 459.2577 421.0549 22.9684 0.394 562 +564 3 460.222 421.3535 24.11 0.394 563 +565 3 461.334 421.3695 24.5809 0.3813 564 +566 3 462.4025 421.4622 23.8568 0.3432 565 +567 3 463.4047 421.9152 23.952 0.3178 566 +568 3 464.3851 422.1955 25.1952 0.2796 567 +569 3 464.9605 423.1713 25.412 0.2542 568 +570 3 465.703 423.9435 25.158 0.2288 569 +571 3 466.7303 423.7502 25.1826 0.2288 570 +572 3 467.7702 424.1369 25.6264 0.2288 571 +573 3 468.8284 424.4995 25.1902 0.2288 572 +574 3 469.8831 424.6642 25.0802 0.2415 573 +575 3 470.8635 424.8908 24.1368 0.2288 574 +576 3 471.3738 425.7476 25.2694 0.2288 575 +577 3 472.1174 425.7774 25.8978 0.2161 576 +578 3 473.1367 425.2934 25.4814 0.2288 577 +579 3 474.2383 425.1333 25.8182 0.2034 578 +580 3 475.3457 425.1573 25.7858 0.1907 579 +581 3 476.3925 425.3735 25.8454 0.2034 580 +582 3 477.3443 425.9753 26.0151 0.2542 581 +583 3 478.0261 426.7097 27.1309 0.2796 582 +584 3 479.0054 427.1879 27.4504 0.2542 583 +585 3 479.9641 427.0403 26.4505 0.2161 584 +586 3 480.9067 427.0644 26.7333 0.1907 585 +587 3 481.9889 426.9534 26.8579 0.2034 586 +588 3 483.0105 426.7784 25.6889 0.2161 587 +589 3 484.1099 426.4832 25.482 0.2161 588 +590 3 485.1921 426.6148 26.1064 0.2161 589 +591 3 486.1005 427.1124 27.27 0.2034 590 +592 3 486.9768 427.713 28.2114 0.2161 591 +593 3 487.9549 428.2289 28.0375 0.2034 592 +594 3 488.909 428.0207 28.2551 0.2161 593 +595 3 490.0049 427.9544 28.5113 0.2161 594 +596 3 491.03 428.4246 28.3074 0.2415 595 +597 3 492.0378 428.6957 29.3762 0.2415 596 +598 3 493.0537 429.1499 29.5904 0.2415 597 +599 3 494.0593 429.4542 30.2117 0.2161 598 +600 3 495.1335 429.3329 29.6738 0.2034 599 +601 3 496.1745 429.1258 29.6136 0.2034 600 +602 3 497.2682 429.119 30.333 0.2161 601 +603 3 498.2292 428.9462 31.3855 0.2542 602 +604 3 498.4774 427.9887 32.7664 0.2669 603 +605 3 498.7989 426.9854 32.975 0.2669 604 +606 3 499.3617 426.2384 33.4216 0.2288 605 +607 3 500.3856 426.14 32.76 0.2034 606 +608 3 409.576 406.4106 15.2239 0.3813 1 +609 3 408.5945 405.85 15.6554 0.483 608 +610 3 407.5408 405.4244 15.9838 0.5084 609 +611 3 406.5284 404.9154 15.6111 0.4703 610 +612 3 405.5629 404.3399 16.1291 0.4449 611 +613 3 404.5928 403.7348 16.2364 0.4449 612 +614 3 403.5906 403.1834 16.24 0.4449 613 +615 3 402.4478 403.1422 16.2403 0.394 614 +616 3 401.4193 403.6444 16.2414 0.3305 615 +617 3 400.5842 404.4257 16.245 0.3051 616 +618 3 399.7422 405.2002 16.2607 0.3305 617 +619 3 399.367 405.556 16.3604 0.2161 618 +620 3 398.8476 406.4243 17.099 0.1652 619 +621 3 398.7446 407.3818 18.6099 0.1398 620 +622 3 398.0559 407.979 19.626 0.1144 621 +623 3 397.0321 407.8932 20.6665 0.1144 622 +624 3 396.0917 407.812 22.2194 0.1144 623 +625 3 395.1193 407.359 22.9026 0.1144 624 +626 3 394.235 406.6428 23.0966 0.1144 625 +627 3 393.1539 406.5936 23.6499 0.1398 626 +628 3 392.4343 407.4047 24.2712 0.178 627 +629 3 392.4023 408.4629 25.2109 0.2161 628 +630 3 393.0578 409.3587 25.7667 0.2288 629 +631 3 393.5257 410.3997 25.8499 0.2669 630 +632 3 393.393 411.5014 26.4844 0.3305 631 +633 3 393.0189 412.4761 27.6315 0.4195 632 +634 3 392.8462 413.4519 29.0256 0.4322 633 +635 3 392.7432 414.5684 29.5529 0.394 634 +636 3 392.384 415.6427 29.3213 0.3178 635 +637 3 391.4894 416.2741 29.0363 0.2669 636 +638 3 390.3637 416.1895 29.4423 0.2924 637 +639 3 389.2952 416.138 30.2716 0.2924 638 +640 3 388.3628 416.5945 31.4154 0.3432 639 +641 3 387.4865 417.1665 32.4727 0.2924 640 +642 3 386.4546 417.592 33.0504 0.2924 641 +643 3 385.6115 418.251 33.469 0.2161 642 +644 3 385.2042 419.2989 33.9811 0.2288 643 +645 3 384.4961 419.9841 34.3353 0.2288 644 +646 3 383.4425 419.7897 34.8989 0.2924 645 +647 3 382.4198 419.3652 35.6017 0.3178 646 +648 3 381.3307 419.1524 36.1362 0.3559 647 +649 3 380.2027 419.2325 36.3675 0.3686 648 +650 3 379.0804 419.4487 36.4428 0.3432 649 +651 3 377.957 419.6478 36.6411 0.3051 650 +652 3 376.8908 419.5345 37.3674 0.2669 651 +653 3 375.9928 419.0666 38.5983 0.2669 652 +654 3 375.0787 418.5244 39.5914 0.2669 653 +655 3 374.0274 418.1972 40.2475 0.2669 654 +656 3 372.9291 417.981 40.8201 0.2924 655 +657 3 371.8847 417.5955 41.3899 0.2924 656 +658 3 370.8093 417.266 41.8452 0.3051 657 +659 3 369.7671 417.5451 42.2145 0.2924 658 +660 3 369.226 418.4763 42.5466 0.3305 659 +661 3 368.5957 419.3835 43.1525 0.3178 660 +662 3 368.0511 420.0734 44.8381 0.3305 661 +663 3 367.8257 420.69 47.0974 0.3305 662 +664 3 367.6152 421.556 48.7878 0.3813 663 +665 3 367.184 422.5387 49.6588 0.3686 664 +666 3 366.6291 423.5225 50.0685 0.3432 665 +667 3 366.0377 424.4492 50.8158 0.3051 666 +668 3 365.6567 425.4891 51.4326 0.2924 667 +669 3 365.2735 426.4958 52.3561 0.2669 668 +670 3 364.6534 427.3721 53.2714 0.2288 669 +671 3 363.9853 428.134 54.5538 0.2161 670 +672 3 363.2886 428.6991 56.2691 0.2034 671 +673 3 362.5851 429.4954 57.195 0.2161 672 +674 3 361.7648 430.0857 58.45 0.2034 673 +675 3 360.9423 430.756 59.4804 0.2161 674 +676 3 360.4641 431.7605 59.9995 0.2034 675 +677 3 359.955 432.5761 61.4709 0.2034 676 +678 3 358.9872 432.8896 62.72 0.1652 677 +679 3 399.208 405.1693 15.1729 0.3686 618 +680 3 398.366 404.698 13.6867 0.3813 679 +681 3 397.4508 404.0539 13.1463 0.394 680 +682 3 396.4852 403.4716 13.587 0.4195 681 +683 3 395.3858 403.2051 13.9765 0.4576 682 +684 3 394.2624 403.4019 14.0958 0.4957 683 +685 3 393.1322 403.5025 14.4547 0.5084 684 +686 3 392.0225 403.6146 15.0685 0.483 685 +687 3 390.954 404.007 15.3448 0.4195 686 +688 3 390.0159 404.6259 15.869 0.3813 687 +689 3 389.103 405.2963 16.2551 0.3686 688 +690 3 388.1443 405.9129 16.4914 0.3813 689 +691 3 387.1216 406.3717 17.0419 0.3813 690 +692 3 386.0188 406.6497 17.3426 0.3813 691 +693 3 384.8748 406.6291 17.3457 0.3686 692 +694 3 383.7456 406.4472 17.2712 0.3432 693 +695 3 382.6291 406.239 16.9361 0.2924 694 +696 3 381.5126 406.1783 16.3453 0.2669 695 +697 3 380.3937 405.9381 16.3184 0.2542 696 +698 3 379.403 405.3753 16.5628 0.2924 697 +699 3 378.3734 404.9154 17.0313 0.2924 698 +700 3 377.25 404.7449 17.3519 0.2924 699 +701 3 376.1278 404.523 17.3239 0.2415 700 +702 3 374.9929 404.9199 17.5249 0.2669 701 +703 3 373.9118 405.1991 18.123 0.3305 702 +704 3 372.7827 405.2975 18.4041 0.3686 703 +705 3 371.6398 405.2883 18.3369 0.3813 704 +706 3 370.5302 405.1236 17.836 0.394 705 +707 3 369.4319 404.8467 17.4611 0.394 706 +708 3 368.3703 404.4246 17.367 0.3686 707 +709 3 367.4162 403.7988 17.3606 0.3051 708 +710 3 366.3557 403.3824 17.3653 0.2415 709 +711 3 365.325 403.7977 17.3992 0.2161 710 +712 3 364.3754 404.4292 17.591 0.2034 711 +713 3 363.2875 404.7369 17.9687 0.2161 712 +714 3 362.1629 404.5767 17.7646 0.2034 713 +715 3 361.1494 404.0619 17.4952 0.2161 714 +716 3 360.0957 403.6432 17.8475 0.2034 715 +717 3 359.0227 403.5471 18.7821 0.2288 716 +718 3 357.905 403.7313 19.1559 0.2542 717 +719 3 356.8994 404.1855 18.433 0.2924 718 +720 3 355.8172 404.38 17.6593 0.2796 719 +721 3 354.6789 404.3811 17.3958 0.2542 720 +722 3 353.5418 404.2599 17.4079 0.2415 721 +723 3 352.5328 403.7245 17.5888 0.2796 722 +724 3 351.5981 403.1216 18.2414 0.3178 723 +725 3 350.7058 402.4123 18.461 0.3305 724 +726 3 349.7231 401.8266 18.4772 0.3178 725 +727 3 348.682 401.3518 18.4643 0.3051 726 +728 3 347.593 401.0052 18.3775 0.3178 727 +729 3 346.4993 400.7569 17.8147 0.3178 728 +730 3 345.3702 400.7009 17.3886 0.3051 729 +731 3 344.2536 400.4549 17.3345 0.2669 730 +732 3 343.1806 400.0637 17.1786 0.2542 731 +733 3 342.3523 399.3441 16.3825 0.2415 732 +734 3 341.5801 398.5021 16.242 0.2542 733 +735 3 340.5505 398.0033 16.24 0.2415 734 +736 3 339.4912 397.5732 16.2403 0.2669 735 +737 3 338.5359 396.9428 16.2408 0.2924 736 +738 3 337.7248 396.1363 16.2431 0.3432 737 +739 3 336.8771 394.7978 16.329 0.2669 738 +740 3 336.4367 393.7511 16.6387 0.2924 739 +741 3 335.9242 392.7466 17.0901 0.3051 740 +742 3 335.3419 391.7685 17.3471 0.2669 741 +743 3 334.7436 390.795 17.4815 0.2415 742 +744 3 334.326 389.7436 17.8139 0.2288 743 +745 3 334.2871 388.6248 18.2487 0.2542 744 +746 3 334.3271 387.4854 18.438 0.2542 745 +747 3 334.0434 386.3849 18.4033 0.2288 746 +748 3 333.4554 385.4159 18.1544 0.2034 747 +749 3 332.7839 384.5064 17.733 0.1907 748 +750 3 332.0826 383.6072 17.5101 0.178 749 +751 3 331.4214 382.6806 17.7206 0.1907 750 +752 3 330.7945 381.7288 17.9698 0.2288 751 +753 3 330.0509 380.8696 17.7192 0.3051 752 +754 3 329.1425 380.189 17.4381 0.3432 753 +755 3 328.1427 379.6353 17.3648 0.3178 754 +756 3 327.2183 378.9626 17.36 0.2415 755 +757 3 326.5342 378.052 17.36 0.1652 756 +758 3 326.016 377.0327 17.3589 0.1271 757 +759 3 325.4588 376.0339 17.3541 0.1398 758 +760 3 324.6626 375.2171 17.3278 0.178 759 +761 3 323.6902 374.6234 17.1699 0.2288 760 +762 3 322.6858 374.1029 16.7479 0.2415 761 +763 3 321.7042 373.5366 16.3685 0.2288 762 +764 3 320.7799 372.8651 16.2784 0.2034 763 +765 3 319.9242 372.1077 16.3951 0.2034 764 +766 3 319.0364 371.395 16.6676 0.2161 765 +767 3 318.0789 370.7944 17.0937 0.2415 766 +768 3 317.134 370.2178 17.7873 0.2415 767 +769 3 316.3606 369.3873 18.086 0.2669 768 +770 3 315.6605 368.4881 17.8794 0.2796 769 +771 3 314.9032 367.6416 17.533 0.3305 770 +772 3 314.06 366.8728 17.3799 0.3305 771 +773 3 313.1872 366.1326 17.3597 0.3305 772 +774 3 312.3429 365.3604 17.3541 0.2669 773 +775 3 311.6359 364.4624 17.323 0.2542 774 +776 3 310.8385 363.6456 17.1573 0.2161 775 +777 3 309.8387 363.2292 16.2884 0.2288 776 +778 3 308.7942 362.8516 15.6125 0.1907 777 +779 3 307.8996 362.179 16.1476 0.1907 778 +780 3 307.0107 361.5326 16.9168 0.178 779 +781 3 306.1939 360.9091 18.1496 0.1907 780 +782 3 305.4549 360.0465 18.4584 0.1907 781 +783 3 304.5202 359.3865 18.4741 0.1907 782 +784 3 303.4174 359.0844 18.443 0.2034 783 +785 3 302.2917 358.9014 18.244 0.2288 784 +786 3 301.2472 358.5994 17.3774 0.2542 785 +787 3 300.6306 357.7071 16.4881 0.2542 786 +788 3 300.1856 356.8136 15.12 0.2288 787 +789 3 336.5236 395.4545 15.8169 0.2161 738 +790 3 335.4677 395.6249 15.9572 0.2034 789 +791 3 334.429 395.9727 16.354 0.2288 790 +792 3 333.5561 396.6614 16.0087 0.2288 791 +793 3 332.7198 397.4245 15.6758 0.2161 792 +794 3 331.8206 398.0662 15.0637 0.178 793 +795 3 331.0805 398.8716 14.4516 0.178 794 +796 3 330.1378 399.4859 14.7476 0.1652 795 +797 3 329.2798 400.1437 15.3667 0.1907 796 +798 3 328.28 400.6597 15.0948 0.2034 797 +799 3 327.1771 400.948 15.2197 0.2542 798 +800 3 326.1121 401.2626 14.9369 0.2669 799 +801 3 325.166 401.735 14.8296 0.2669 800 +802 3 324.2371 402.2624 15.2429 0.2161 801 +803 3 323.3047 402.9179 15.1519 0.178 802 +804 3 322.4547 403.6593 15.398 0.1652 803 +805 3 321.4674 404.1077 15.5344 0.2161 804 +806 3 320.4058 404.4349 15.0167 0.2669 805 +807 3 319.3682 404.7666 15.3252 0.3178 806 +808 3 318.3397 405.2059 15.8337 0.3051 807 +809 3 317.4543 405.8729 15.416 0.3051 808 +810 3 316.5585 406.5719 15.2048 0.2924 809 +811 3 315.5015 406.9277 15.5529 0.3051 810 +812 3 314.433 407.2228 16.2375 0.2924 811 +813 3 313.4491 407.7662 16.6023 0.2796 812 +814 3 312.5751 408.4972 16.525 0.2669 813 +815 3 311.5318 408.932 16.5108 0.2542 814 +816 3 310.6052 409.4959 15.7114 0.2415 815 +817 3 309.7952 409.8952 14.0 0.2288 816 +818 3 375.8806 404.1523 15.6237 0.2415 701 +819 3 375.7788 403.1948 14.4864 0.2161 818 +820 3 375.7342 402.0519 14.436 0.1907 819 +821 3 375.558 400.9342 14.3072 0.2161 820 +822 3 374.9895 400.0248 14.6616 0.2796 821 +823 3 374.1292 399.3395 14.8022 0.3178 822 +824 3 373.1648 398.7687 14.8904 0.2924 823 +825 3 372.1409 398.3854 14.4376 0.2669 824 +826 3 371.2646 397.7699 13.6167 0.2542 825 +827 3 370.6263 396.8467 13.512 0.2669 826 +828 3 370.0176 395.9098 13.0158 0.2542 827 +829 3 369.2569 395.0712 12.8288 0.2288 828 +830 3 368.4961 394.3929 13.9574 0.2288 829 +831 3 367.8109 393.7213 12.8106 0.2542 830 +832 3 367.1691 392.8016 12.4958 0.3051 831 +833 3 366.6348 391.7925 12.3592 0.3178 832 +834 3 365.9645 390.8773 12.6658 0.3178 833 +835 3 365.0504 390.3328 13.6578 0.2924 834 +836 3 364.7289 389.8592 12.4785 0.178 835 +837 3 363.7085 389.5492 12.574 0.1907 836 +838 3 362.6709 389.087 12.4261 0.1907 837 +839 3 361.814 388.3697 12.899 0.2161 838 +840 3 361.0338 387.6032 13.5598 0.2415 839 +841 3 360.2673 387.0861 11.9347 0.2669 840 +842 3 359.2595 386.7486 11.1958 0.2415 841 +843 3 358.1612 386.5233 11.6124 0.2161 842 +844 3 357.1476 386.2316 12.1327 0.178 843 +845 3 356.1444 386.0977 12.7039 0.178 844 +846 3 355.0484 385.9192 12.0369 0.178 845 +847 3 354.1641 385.2798 11.6301 0.2161 846 +848 3 353.8872 384.2273 12.1526 0.2288 847 +849 3 353.5143 383.2766 13.3756 0.2542 848 +850 3 352.6231 382.6131 13.2958 0.2542 849 +851 3 351.7869 382.2973 11.6094 0.2924 850 +852 3 350.7104 381.9816 12.0772 0.3051 851 +853 3 349.5755 381.8695 12.3161 0.3051 852 +854 3 348.5654 381.4188 12.8344 0.2669 853 +855 3 348.3034 380.3308 12.5871 0.2288 854 +856 3 347.5975 379.6341 11.2823 0.2034 855 +857 3 346.6331 379.1765 10.5073 0.1907 856 +858 3 345.8186 378.4032 10.8609 0.2161 857 +859 3 344.8828 377.8129 11.5433 0.2288 858 +860 3 343.8681 377.3656 12.0226 0.2415 859 +861 3 342.7664 377.3244 12.6683 0.2034 860 +862 3 341.746 377.1104 12.794 0.1907 861 +863 3 340.9017 376.4698 11.9188 0.1652 862 +864 3 340.0769 375.915 10.5459 0.178 863 +865 3 339.1194 375.3967 10.9444 0.1652 864 +866 3 338.1126 375.1256 10.0523 0.1652 865 +867 3 337.4342 374.4712 9.6838 0.1525 866 +868 3 337.1974 373.7311 9.2943 0.1652 867 +869 3 336.3017 373.1339 10.0537 0.1907 868 +870 3 335.3956 372.4372 10.1556 0.2161 869 +871 3 334.5422 371.6867 10.3236 0.2288 870 +872 3 333.746 370.966 9.9005 0.2161 871 +873 3 332.9006 370.4158 10.1909 0.1907 872 +874 3 332.0403 369.8987 9.548 0.1525 873 +875 3 331.4465 369.0944 8.2648 0.1398 874 +876 3 330.8574 368.1323 8.6489 0.1652 875 +877 3 330.044 367.3384 8.96 0.2161 876 +878 3 365.2723 389.5126 12.3609 0.2288 835 +879 3 365.3089 388.3972 12.7406 0.2161 878 +880 3 365.3135 387.3161 13.4971 0.2161 879 +881 3 365.1945 386.2041 13.685 0.2288 880 +882 3 364.896 385.194 13.5094 0.2415 881 +883 3 364.6443 384.2147 12.4432 0.2669 882 +884 3 363.9339 383.4585 11.8628 0.2924 883 +885 3 363.0198 383.0707 12.2265 0.2796 884 +886 3 362.1252 382.7172 13.7298 0.2415 885 +887 3 361.0739 382.4975 14.5516 0.2034 886 +888 3 359.9859 382.2676 14.2708 0.2161 887 +889 3 359.2091 382.2539 15.6988 0.2415 888 +890 3 358.1143 382.3442 16.3769 0.2796 889 +891 3 356.9806 382.2424 16.13 0.2669 890 +892 3 355.8801 382.0651 15.5753 0.2542 891 +893 3 354.7441 382.0399 15.8438 0.2288 892 +894 3 353.6573 381.7379 15.9004 0.2542 893 +895 3 352.7821 381.0172 15.9564 0.2669 894 +896 3 351.9047 380.4349 17.0274 0.2796 895 +897 3 351.0112 380.0242 18.3036 0.2415 896 +898 3 349.8958 379.983 18.2804 0.2288 897 +899 3 349.0115 380.2176 18.3271 0.1907 898 +900 3 348.2542 380.4258 20.2182 0.2034 899 +901 3 347.1319 380.4715 19.9973 0.1907 900 +902 3 346.2808 379.7268 20.4064 0.2034 901 +903 3 345.4994 378.9614 21.1781 0.1652 902 +904 3 344.6929 378.1652 20.8482 0.1652 903 +905 3 343.8281 377.5006 20.3529 0.2034 904 +906 3 343.359 376.6105 19.1307 0.2669 905 +907 3 342.676 375.7491 19.1097 0.3051 906 +908 3 341.8501 375.0776 20.0525 0.2669 907 +909 3 340.8948 374.6497 20.244 0.2288 908 +910 3 339.8321 374.4049 20.5884 0.1652 909 +911 3 338.7167 374.2779 20.8376 0.1398 910 +912 3 337.6276 374.4609 20.3302 0.1271 911 +913 3 336.6243 374.6257 19.1103 0.1398 912 +914 3 335.7583 375.0043 17.5806 0.1525 913 +915 3 335.2767 375.3258 15.2032 0.1398 914 +916 3 334.7927 375.9401 13.1737 0.1398 915 +917 3 333.9336 376.6048 12.32 0.1525 916 +918 4 417.8826 404.2438 16.2112 0.1907 1 +919 4 418.6617 403.4156 16.5152 0.2669 918 +920 4 419.5494 402.7212 16.996 0.3178 919 +921 4 420.4177 401.9913 17.3516 0.3432 920 +922 4 421.2528 401.2145 17.5703 0.3813 921 +923 4 422.0719 400.4423 18.0701 0.4322 922 +924 4 422.8865 399.6518 18.4279 0.4957 923 +925 4 423.8211 398.994 18.471 0.4957 924 +926 4 424.7889 398.3843 18.4444 0.483 925 +927 4 425.6378 397.6189 18.3282 0.4576 926 +928 4 426.3265 396.7255 17.8595 0.4576 927 +929 4 426.9545 395.7862 17.4224 0.4703 928 +930 4 427.5883 394.839 17.183 0.4703 929 +931 4 428.1534 393.8735 16.6026 0.4703 930 +932 4 428.5149 392.8404 15.7884 0.4576 931 +933 4 428.8261 391.7605 15.258 0.483 932 +934 4 429.2094 390.684 15.122 0.5212 933 +935 4 429.7367 389.6693 15.1203 0.5466 934 +936 4 430.4392 388.7667 15.122 0.5212 935 +937 4 431.2194 387.9304 15.1276 0.483 936 +938 4 431.8794 386.9958 15.1556 0.4576 937 +939 4 432.4926 386.0314 15.3023 0.483 938 +940 4 432.8679 384.9938 16.0384 0.483 939 +941 4 433.187 383.9378 16.7815 0.4703 940 +942 4 433.465 382.8293 16.9322 0.3813 941 +943 4 433.2465 381.7917 15.8844 0.3051 942 +944 4 433.2202 380.6935 15.3969 0.2796 943 +945 4 433.4833 380.2885 15.9138 0.2161 944 +946 4 434.4214 379.665 16.3817 0.2288 945 +947 4 435.2359 378.9191 17.113 0.2542 946 +948 4 435.9956 378.0828 17.5501 0.2669 947 +949 4 436.5973 377.1505 18.2277 0.2669 948 +950 4 437.1201 376.1392 18.5153 0.2796 949 +951 4 437.1704 375.0089 18.9188 0.2924 950 +952 4 436.9611 373.913 19.5294 0.2924 951 +953 4 437.31 372.8239 19.5992 0.2669 952 +954 4 438.0799 371.9773 19.6 0.2542 953 +955 4 438.8716 371.1514 19.6003 0.2669 954 +956 4 439.5912 370.2625 19.6011 0.2924 955 +957 4 440.3393 369.3965 19.6056 0.3178 956 +958 4 441.3552 368.8714 19.6291 0.3051 957 +959 4 441.8231 368.9606 19.7282 0.2415 958 +960 4 442.9431 369.0658 20.1312 0.2415 959 +961 4 444.0528 368.9125 20.5503 0.2034 960 +962 4 445.1704 368.6918 20.706 0.178 961 +963 4 446.3007 368.7261 20.7203 0.1907 962 +964 4 447.4207 368.9526 20.722 0.2288 963 +965 4 448.5532 369.0704 20.734 0.2669 964 +966 4 449.6858 368.9583 20.8177 0.2924 965 +967 4 450.8081 368.7821 21.1067 0.2924 966 +968 4 451.9383 368.6414 21.336 0.2669 967 +969 4 453.0332 368.4469 20.8888 0.2415 968 +970 4 454.1062 368.2994 20.011 0.2288 969 +971 4 455.2193 368.2811 19.8976 0.2415 970 +972 4 456.2821 368.3463 20.8253 0.2669 971 +973 4 457.3655 368.3977 21.6591 0.3178 972 +974 4 458.4877 368.3257 22.1435 0.3559 973 +975 4 459.6134 368.2582 22.6036 0.3813 974 +976 4 460.7506 368.2136 22.7035 0.3559 975 +977 4 461.8797 368.0889 22.4378 0.3051 976 +978 4 463.0077 367.9184 22.3107 0.2542 977 +979 4 464.1425 367.9253 22.4608 0.2161 978 +980 4 465.2705 368.0751 22.7388 0.2161 979 +981 4 466.4065 368.1655 22.8004 0.1907 980 +982 4 467.5368 368.1083 22.4792 0.1907 981 +983 4 468.5927 367.7422 22.0679 0.178 982 +984 4 469.509 367.0776 21.9904 0.1907 983 +985 4 470.3579 366.3614 22.5686 0.1907 984 +986 4 471.1896 365.7688 23.7899 0.1907 985 +987 4 472.1425 365.3135 24.8046 0.1907 986 +988 4 473.1424 364.8124 25.3397 0.178 987 +989 4 474.0633 364.1489 25.3364 0.1525 988 +990 4 474.8161 363.2955 25.2274 0.1398 989 +991 4 475.499 362.3792 25.1012 0.1652 990 +992 4 476.0424 361.3839 24.8108 0.2034 991 +993 4 476.5675 360.3863 25.1084 0.2415 992 +994 4 477.2631 359.502 25.5441 0.2415 993 +995 4 477.7813 358.525 26.1691 0.2669 994 +996 4 478.2824 357.5194 26.6826 0.2542 995 +997 4 478.9848 356.7701 27.816 0.2415 996 +998 4 479.9 356.1249 28.0294 0.178 997 +999 4 480.6184 355.2578 28.3545 0.1525 998 +1000 4 481.4284 354.457 28.5085 0.1398 999 +1001 4 482.4637 354.0211 28.1747 0.178 1000 +1002 4 483.5688 354.2293 27.7522 0.1907 1001 +1003 4 484.5355 354.8093 28.1806 0.2161 1002 +1004 4 485.3992 355.5552 28.0 0.2034 1003 +1005 4 441.8322 368.3417 19.6039 0.2542 958 +1006 4 442.6365 367.5283 19.544 0.2542 1005 +1007 4 443.0826 366.5056 19.3245 0.2924 1006 +1008 4 443.1581 365.3753 19.1517 0.3178 1007 +1009 4 443.0769 364.2473 19.4793 0.3432 1008 +1010 4 443.0483 363.1102 19.7378 0.3432 1009 +1011 4 443.3984 362.0508 20.1359 0.3305 1010 +1012 4 444.0207 361.115 20.5783 0.3178 1011 +1013 4 444.8295 360.3154 20.7105 0.3051 1012 +1014 4 445.6646 359.5329 20.7248 0.3051 1013 +1015 4 446.3911 358.652 20.7438 0.3051 1014 +1016 4 446.9963 357.6842 20.8429 0.3051 1015 +1017 4 447.3944 356.6283 21.219 0.3051 1016 +1018 4 447.6415 355.5335 21.7412 0.3051 1017 +1019 4 447.7833 354.4123 22.1581 0.3051 1018 +1020 4 447.9607 353.3004 22.6436 0.3178 1019 +1021 4 448.3279 352.2273 22.923 0.3051 1020 +1022 4 448.9205 351.256 22.9928 0.2796 1021 +1023 4 449.7258 350.4518 23.1165 0.2161 1022 +1024 4 450.3997 349.5515 23.5231 0.178 1023 +1025 4 451.0884 348.6523 23.903 0.1525 1024 +1026 4 452.0058 347.9899 23.8246 0.178 1025 +1027 4 452.7906 347.2017 23.2515 0.2034 1026 +1028 4 453.159 346.1572 22.685 0.2288 1027 +1029 4 453.2288 345.0224 22.6797 0.2288 1028 +1030 4 453.1521 343.8853 22.9085 0.2288 1029 +1031 4 452.9874 342.7584 23.1518 0.2161 1030 +1032 4 452.9439 341.6293 23.5712 0.178 1031 +1033 4 453.151 340.5173 23.9464 0.1398 1032 +1034 4 453.4622 339.4179 24.0705 0.1398 1033 +1035 4 453.7722 338.3174 24.08 0.1652 1034 +1036 4 454.1119 337.2249 24.08 0.2034 1035 +1037 4 454.5295 336.1598 24.08 0.2161 1036 +1038 4 454.931 335.089 24.08 0.2542 1037 +1039 4 455.2228 333.9839 24.0806 0.2796 1038 +1040 4 455.5522 332.888 24.0828 0.2924 1039 +1041 4 456.0087 331.8401 24.1035 0.2542 1040 +1042 4 456.5395 330.8288 24.2483 0.2288 1041 +1043 4 457.068 329.8266 24.6336 0.2288 1042 +1044 4 457.6549 328.8611 25.0659 0.2669 1043 +1045 4 458.3116 327.9379 25.4556 0.2924 1044 +1046 4 458.9877 327.0364 25.9392 0.3051 1045 +1047 4 459.6764 326.1372 26.3222 0.3051 1046 +1048 4 460.3696 325.2426 26.7294 0.2924 1047 +1049 4 461.0228 324.3229 27.1984 0.2669 1048 +1050 4 461.4667 323.2727 27.358 0.2415 1049 +1051 4 461.7195 322.1676 27.0301 0.2415 1050 +1052 4 461.9255 321.0579 26.5815 0.2796 1051 +1053 4 462.1863 319.9459 26.6837 0.3178 1052 +1054 4 462.5844 318.9117 27.3666 0.3432 1053 +1055 4 463.034 317.8924 28.0092 0.3305 1054 +1056 4 463.4401 316.8239 27.9706 0.3305 1055 +1057 4 463.6987 315.7143 28.194 0.3305 1056 +1058 4 463.781 314.6389 29.1231 0.3686 1057 +1059 4 463.8405 313.5178 29.6447 0.4068 1058 +1060 4 464.0933 312.4035 29.7604 0.4449 1059 +1061 4 464.5406 311.359 30.0947 0.4576 1060 +1062 4 465.068 310.3638 30.5673 0.4576 1061 +1063 4 465.7144 309.4245 30.7661 0.483 1062 +1064 4 466.4649 308.5608 30.7104 0.4957 1063 +1065 4 467.2016 307.6948 30.42 0.5084 1064 +1066 4 467.8926 306.8002 29.9897 0.4957 1065 +1067 4 468.6087 305.9113 29.8724 0.5084 1066 +1068 4 469.2368 304.9744 30.2957 0.5084 1067 +1069 4 469.6017 303.9093 30.7555 0.4957 1068 +1070 4 469.6532 302.7813 31.1441 0.4576 1069 +1071 4 469.4598 301.6739 31.663 0.4449 1070 +1072 4 469.3123 300.5482 31.9911 0.4322 1071 +1073 4 469.3603 299.418 32.3327 0.4195 1072 +1074 4 469.7184 298.3575 32.695 0.394 1073 +1075 4 470.4803 297.5132 32.48 0.394 1074 +1076 4 471.3555 296.7936 32.1591 0.4195 1075 +1077 4 472.1986 296.0226 32.2675 0.4195 1076 +1078 4 472.9685 295.1817 32.3302 0.394 1077 +1079 4 473.5737 294.2208 32.233 0.3432 1078 +1080 4 473.9603 293.174 32.7496 0.3305 1079 +1081 4 474.0839 292.0804 33.5017 0.3305 1080 +1082 4 474.1983 290.9661 33.9948 0.3432 1081 +1083 4 474.5598 289.8885 34.1505 0.3432 1082 +1084 4 475.1455 288.908 34.1827 0.3432 1083 +1085 4 475.8354 287.9951 34.263 0.3432 1084 +1086 4 476.5023 287.0788 34.5394 0.3432 1085 +1087 4 477.0114 286.0744 35.0193 0.3432 1086 +1088 4 477.5045 285.0482 35.2526 0.3432 1087 +1089 4 478.0524 284.0438 35.3237 0.3305 1088 +1090 4 478.6244 283.0599 35.5208 0.2924 1089 +1091 4 479.1175 282.0635 36.1455 0.2542 1090 +1092 4 479.471 281.0339 36.9673 0.2542 1091 +1093 4 479.6998 279.9288 37.3386 0.3178 1092 +1094 4 480.0327 278.842 37.1398 0.3559 1093 +1095 4 480.4491 277.7975 36.6484 0.3432 1094 +1096 4 480.9673 276.7828 36.5 0.2669 1095 +1097 4 481.5702 275.8173 36.717 0.2542 1096 +1098 4 482.1983 274.8883 37.2655 0.2924 1097 +1099 4 482.8561 273.9788 37.7818 0.3813 1098 +1100 4 483.3995 273.0099 38.4014 0.4195 1099 +1101 4 483.801 271.9643 38.9617 0.4322 1100 +1102 4 484.3021 270.9758 39.5587 0.4068 1101 +1103 4 485.024 270.095 39.825 0.4068 1102 +1104 4 485.7367 269.2164 40.1181 0.394 1103 +1105 4 486.2835 268.2405 40.6526 0.394 1104 +1106 4 486.7548 267.2041 40.8607 0.3813 1105 +1107 4 487.3634 266.2374 40.9116 0.3559 1106 +1108 4 488.0533 265.3291 41.0572 0.3432 1107 +1109 4 488.8198 264.4997 41.4809 0.3178 1108 +1110 4 489.5988 263.6828 41.9115 0.3432 1109 +1111 4 490.3356 262.8123 41.9958 0.3432 1110 +1112 4 490.9545 261.8513 42.0022 0.3686 1111 +1113 4 491.4796 260.8377 42.0137 0.3686 1112 +1114 4 491.8628 259.7612 42.082 0.3686 1113 +1115 4 492.1808 258.6744 42.3987 0.3178 1114 +1116 4 492.4039 257.5899 43.0895 0.2669 1115 +1117 4 492.6636 256.5157 43.6268 0.2415 1116 +1118 4 493.3237 255.6176 43.8295 0.2542 1117 +1119 4 494.1977 254.9084 43.573 0.2542 1118 +1120 4 494.9585 254.0778 43.9765 0.2415 1119 +1121 4 495.5682 253.1169 44.2299 0.2669 1120 +1122 4 496.1288 252.1204 44.24 0.3305 1121 +1123 4 496.6276 251.0931 44.24 0.394 1122 +1124 4 497.1801 250.0944 44.2408 0.4068 1123 +1125 4 497.6652 249.0591 44.2439 0.3813 1124 +1126 4 498.2566 248.081 44.2593 0.3686 1125 +1127 4 498.8378 247.1029 44.3408 0.3559 1126 +1128 4 499.2736 246.0572 44.6631 0.3432 1127 +1129 4 499.7495 245.0448 45.2012 0.2796 1128 +1130 4 500.1854 243.99 45.3611 0.2161 1129 +1131 4 500.6647 242.9513 45.3718 0.1525 1130 +1132 4 501.0628 241.8816 45.4443 0.1398 1131 +1133 4 501.4324 240.82 45.7716 0.1652 1132 +1134 4 502.0318 239.8808 46.3943 0.2161 1133 +1135 4 502.7194 238.9896 46.8552 0.2542 1134 +1136 4 503.5133 238.1888 47.2749 0.2415 1135 +1137 4 504.3713 237.4383 47.2114 0.2288 1136 +1138 4 505.211 236.6833 46.9571 0.2288 1137 +1139 4 505.8802 235.7773 47.2982 0.2542 1138 +1140 4 506.2589 234.7477 47.948 0.2415 1139 +1141 4 506.2932 233.6277 48.4722 0.1907 1140 +1142 4 506.3653 232.526 48.743 0.1652 1141 +1143 4 506.8881 231.5113 48.8684 0.178 1142 +1144 4 507.4795 230.5446 49.2282 0.2415 1143 +1145 4 508.0607 229.5756 49.6283 0.2542 1144 +1146 4 508.6224 228.5804 49.6605 0.2542 1145 +1147 4 509.1818 227.5851 49.5485 0.2161 1146 +1148 4 509.7286 226.5818 49.672 0.2034 1147 +1149 4 510.2286 225.5602 49.9223 0.1907 1148 +1150 4 510.5729 224.4814 50.2026 0.2034 1149 +1151 4 510.8864 223.4095 50.673 0.2288 1150 +1152 4 511.495 222.4565 50.9477 0.2669 1151 +1153 4 512.2638 221.6111 50.9793 0.2924 1152 +1154 4 513.0634 220.7931 51.0577 0.2924 1153 +1155 4 513.8631 219.9855 51.3369 0.2542 1154 +1156 4 514.6295 219.1584 51.7818 0.1907 1155 +1157 4 515.348 218.2752 52.015 0.178 1156 +1158 4 516.0595 217.3829 51.9126 0.2034 1157 +1159 4 516.6979 216.4482 51.5704 0.3051 1158 +1160 4 517.2093 215.4381 51.2333 0.3686 1159 +1161 4 517.7 214.4096 51.3204 0.4576 1160 +1162 4 518.2034 213.4029 51.8064 0.4703 1161 +1163 4 518.7308 212.4214 52.4367 0.4957 1162 +1164 4 519.3337 211.4913 53.1143 0.483 1163 +1165 4 520.0281 210.6207 53.7541 0.483 1164 +1166 4 520.7305 209.7387 54.1464 0.4449 1165 +1167 4 521.3185 208.7651 54.122 0.3559 1166 +1168 4 521.7773 207.7264 53.7816 0.3051 1167 +1169 4 522.2852 206.7185 53.5161 0.2796 1168 +1170 4 522.9659 205.809 53.7121 0.3432 1169 +1171 4 523.7243 204.967 54.0977 0.3686 1170 +1172 4 524.4782 204.1113 54.2895 0.4195 1171 +1173 4 525.2173 203.2385 54.322 0.4322 1172 +1174 4 525.9918 202.3988 54.3284 0.4576 1173 +1175 4 526.7914 201.5808 54.3528 0.4322 1174 +1176 4 527.5762 200.7503 54.467 0.3813 1175 +1177 4 528.3141 199.8877 54.7912 0.3178 1176 +1178 4 529.0234 199.0148 55.2992 0.2669 1177 +1179 4 529.7647 198.1648 55.7519 0.2415 1178 +1180 4 530.5071 197.3091 55.7522 0.2542 1179 +1181 4 531.1272 196.3745 55.2608 0.3051 1180 +1182 4 531.6271 195.3643 55.1004 0.3686 1181 +1183 4 532.1476 194.3748 55.6396 0.394 1182 +1184 4 532.7905 193.471 56.2724 0.3686 1183 +1185 4 533.5971 192.6851 56.6656 0.3305 1184 +1186 4 534.5157 192.025 57.0497 0.3051 1185 +1187 4 535.3966 191.3248 57.4538 0.3559 1186 +1188 4 536.1013 190.4394 57.6503 0.4195 1187 +1189 4 536.6241 189.4247 57.6764 0.483 1188 +1190 4 537.0542 188.3653 57.664 0.4322 1189 +1191 4 537.442 187.29 57.575 0.3432 1190 +1192 4 537.7361 186.1952 57.265 0.2415 1191 +1193 4 538.0827 185.1267 56.8378 0.2288 1192 +1194 4 538.6124 184.1211 56.6625 0.2415 1193 +1195 4 539.1935 183.1521 56.9904 0.2669 1194 +1196 4 539.6957 182.2243 57.9933 0.2415 1195 +1197 4 540.0721 181.2393 59.0075 0.2415 1196 +1198 4 540.5732 180.2452 59.5022 0.2288 1197 +1199 4 541.3877 179.4902 59.9348 0.2542 1198 +1200 4 542.2331 178.734 60.121 0.2415 1199 +1201 4 542.7422 177.7387 60.305 0.2669 1200 +1202 4 543.1655 176.6919 60.7309 0.3178 1201 +1203 4 543.7512 175.7218 61.0112 0.3813 1202 +1204 4 544.4376 174.8089 61.1341 0.4322 1203 +1205 4 545.1332 173.9086 61.4228 0.4068 1204 +1206 4 545.7612 172.9705 61.8517 0.3813 1205 +1207 4 546.4179 172.0404 62.0718 0.3305 1206 +1208 4 547.1878 171.1996 61.9791 0.3432 1207 +1209 4 548.0263 170.4423 61.5717 0.3559 1208 +1210 4 548.786 169.6037 61.1999 0.394 1209 +1211 4 549.3934 168.6416 61.2209 0.394 1210 +1212 4 549.9734 167.6749 61.6641 0.3813 1211 +1213 4 550.6164 166.746 62.0886 0.3178 1212 +1214 4 551.3302 165.8583 62.3258 0.2415 1213 +1215 4 552.1619 165.0964 62.7326 0.1907 1214 +1216 4 553.0474 164.3882 63.1151 0.178 1215 +1217 4 553.7097 163.4707 63.1481 0.2161 1216 +1218 4 554.2074 162.4503 62.8586 0.2161 1217 +1219 4 555.0688 161.7364 63.0011 0.2288 1218 +1220 4 556.1785 161.5191 63.2559 0.2288 1219 +1221 4 557.1555 160.9402 63.3847 0.2796 1220 +1222 4 557.9437 160.1268 63.7448 0.3051 1221 +1223 4 558.7079 159.3077 64.3082 0.2796 1222 +1224 4 559.5087 158.5184 64.832 0.2161 1223 +1225 4 560.3964 157.8285 65.3447 0.1907 1224 +1226 4 560.886 156.8046 65.2392 0.2288 1225 +1227 4 561.9191 156.323 65.4396 0.2669 1226 +1228 4 562.8388 155.6652 65.0538 0.2669 1227 +1229 4 563.8902 155.2202 65.2123 0.2161 1228 +1230 4 564.8145 154.6036 65.5908 0.2034 1229 +1231 4 565.3831 153.6712 66.3491 0.1907 1230 +1232 4 566.2297 152.9208 66.5487 0.2161 1231 +1233 4 567.2627 152.4437 66.6935 0.1907 1232 +1234 4 568.3484 152.1497 67.1779 0.1907 1233 +1235 4 569.4271 151.8946 67.664 0.1652 1234 +1236 4 570.2726 151.2093 68.3402 0.1652 1235 +1237 4 570.856 150.2804 69.1054 0.1398 1236 +1238 4 571.571 149.4258 69.7385 0.1271 1237 +1239 4 572.2334 148.5278 70.3492 0.1144 1238 +1240 4 572.9152 147.6412 70.7935 0.1144 1239 +1241 4 573.7412 146.853 70.8347 0.1144 1240 +1242 4 574.3509 145.9103 70.784 0.1144 1241 +1243 4 574.693 144.8201 70.6577 0.1144 1242 +1244 4 575.2204 143.8305 70.56 0.1144 1243 +1245 4 576.0509 143.0561 70.7482 0.1144 1244 +1246 4 576.9455 142.5424 71.6853 0.1144 1245 +1247 4 577.9351 142.1786 72.4679 0.1271 1246 +1248 4 578.8171 141.4991 72.6986 0.1525 1247 +1249 4 579.5069 140.5953 72.9848 0.178 1248 +1250 4 580.3501 139.9638 73.619 0.178 1249 +1251 4 581.3019 139.4193 74.2899 0.1525 1250 +1252 4 582.1633 138.6814 74.5898 0.1398 1251 +1253 4 583.0831 138.0328 74.9073 0.1398 1252 +1254 4 584.0681 137.4619 75.1097 0.1525 1253 +1255 4 585.1114 137.018 75.2102 0.1525 1254 +1256 4 586.181 136.6302 75.4656 0.1525 1255 +1257 4 587.1763 136.1509 76.1211 0.1525 1256 +1258 4 588.1842 135.7345 76.9266 0.1398 1257 +1259 4 589.2481 135.3489 77.2178 0.1271 1258 +1260 4 590.0912 134.6625 77.9108 0.1144 1259 +1261 4 590.7627 133.7485 78.1071 0.1144 1260 +1262 4 591.694 133.1044 78.12 0.1144 1261 +1263 4 592.203 132.1023 78.12 0.1144 1262 +1264 4 592.2545 130.9628 78.12 0.1144 1263 +1265 4 593.1285 130.2524 78.12 0.1398 1264 +1266 4 594.0792 129.6152 78.12 0.1907 1265 +1267 4 432.7855 379.5861 15.1883 0.3813 944 +1268 4 432.3794 378.5187 15.2043 0.3305 1267 +1269 4 431.9538 377.4639 15.4969 0.2924 1268 +1270 4 431.5832 376.4035 16.0068 0.2669 1269 +1271 4 431.2125 375.327 16.1736 0.2669 1270 +1272 4 430.859 374.2436 15.9807 0.2669 1271 +1273 4 430.4392 373.2003 15.5008 0.2415 1272 +1274 4 429.7344 372.3274 15.1698 0.2288 1273 +1275 4 428.7804 371.7188 15.0592 0.2161 1274 +1276 4 427.6821 371.4431 14.9531 0.2288 1275 +1277 4 426.5759 371.1639 15.073 0.2034 1276 +1278 4 425.743 370.5061 15.8942 0.1907 1277 +1279 4 424.9971 369.6619 16.2106 0.2034 1278 +1280 4 424.2787 368.7718 16.24 0.2796 1279 +1281 4 423.5534 367.8864 16.2397 0.3432 1280 +1282 4 422.7641 367.0593 16.238 0.3813 1281 +1283 4 421.9484 366.2573 16.2327 0.3686 1282 +1284 4 421.1053 365.484 16.2064 0.3432 1283 +1285 4 420.1649 364.8399 16.0611 0.3051 1284 +1286 4 419.1216 364.4349 15.573 0.2669 1285 +1287 4 418.2109 363.8469 14.747 0.2669 1286 +1288 4 417.6 362.9271 14.1554 0.2796 1287 +1289 4 416.9743 361.9742 14.0112 0.3051 1288 +1290 4 416.3325 361.027 14.0 0.2924 1289 +1291 4 415.542 360.2056 14.0 0.2924 1290 +1292 4 414.5925 359.5729 14.0 0.3178 1291 +1293 4 413.7116 358.8465 14.0 0.3559 1292 +1294 4 412.9474 357.9965 14.0008 0.3559 1293 +1295 4 412.2884 357.063 14.0042 0.2924 1294 +1296 4 411.7634 356.0483 14.0263 0.2161 1295 +1297 4 411.3275 354.9924 14.1529 0.1907 1296 +1298 4 410.7624 354.0097 14.4917 0.2161 1297 +1299 4 410.0782 353.0967 14.6748 0.2542 1298 +1300 4 409.4731 352.1404 14.3363 0.2542 1299 +1301 4 408.9571 351.1256 14.065 0.2415 1300 +1302 4 408.567 350.0526 14.0045 0.2161 1301 +1303 4 408.2192 348.9623 14.0022 0.1907 1302 +1304 4 408.0145 347.8378 14.0148 0.1525 1303 +1305 4 408.0991 346.7018 14.0997 0.1271 1304 +1306 4 408.3474 345.5864 14.2066 0.1144 1305 +1307 4 408.6528 344.4847 14.11 0.1144 1306 +1308 4 409.1836 343.4746 14.1131 0.1398 1307 +1309 4 409.3781 342.3637 14.2369 0.178 1308 +1310 4 408.8061 341.3788 13.9762 0.2288 1309 +1311 4 408.2055 340.4292 13.4532 0.2415 1310 +1312 4 407.6324 339.4408 13.2989 0.2542 1311 +1313 4 407.0444 338.4604 13.2255 0.2415 1312 +1314 4 406.4037 337.5223 12.9178 0.2542 1313 +1315 4 405.715 336.6083 12.8803 0.2542 1314 +1316 4 405.0366 335.6874 12.8822 0.2796 1315 +1317 4 404.3662 334.7607 12.8909 0.2796 1316 +1318 4 403.713 333.8226 12.9338 0.2669 1317 +1319 4 402.982 332.9463 13.1244 0.2288 1318 +1320 4 402.1915 332.141 13.5626 0.2034 1319 +1321 4 401.584 331.1869 13.7536 0.1907 1320 +1322 4 401.3381 330.0818 13.3683 0.2034 1321 +1323 4 401.155 328.9629 13.0029 0.2034 1322 +1324 4 400.9194 327.8441 12.9514 0.2034 1323 +1325 4 400.6322 326.7424 13.1916 0.1907 1324 +1326 4 400.2227 325.6934 13.6335 0.1907 1325 +1327 4 399.5843 324.7587 13.9412 0.178 1326 +1328 4 398.7275 324.0025 13.9969 0.1652 1327 +1329 4 397.794 323.3436 13.9838 0.178 1328 +1330 4 396.7987 322.7807 13.9121 0.2161 1329 +1331 4 395.7531 322.3403 13.627 0.2415 1330 +1332 4 394.7246 321.9399 13.1566 0.2288 1331 +1333 4 393.965 321.1231 13.4946 0.2415 1332 +1334 4 393.4388 320.1084 13.5055 0.2924 1333 +1335 4 392.8668 319.1371 13.1827 0.3559 1334 +1336 4 392.2513 318.2082 12.773 0.3432 1335 +1337 4 391.7125 317.2049 13.0141 0.2924 1336 +1338 4 391.2102 316.1959 13.1648 0.2288 1337 +1339 4 390.7675 315.1846 13.3658 0.2034 1338 +1340 4 390.2104 314.2396 14.1053 0.178 1339 +1341 4 389.7471 313.2066 14.2864 0.178 1340 +1342 4 389.4233 312.1656 13.65 0.1907 1341 +1343 4 389.2666 311.128 12.5566 0.2288 1342 +1344 4 389.0801 310.056 11.7642 0.2542 1343 +1345 4 388.8731 308.9566 11.2566 0.2415 1344 +1346 4 388.4784 307.9408 10.9614 0.2288 1345 +1347 4 387.7439 307.0656 10.8175 0.2288 1346 +1348 4 387.4122 306.0337 10.2435 0.2796 1347 +1349 4 386.6949 305.2329 10.4885 0.3305 1348 +1350 4 386.06 304.3074 10.2015 0.3559 1349 +1351 4 385.5497 303.3362 9.4259 0.3559 1350 +1352 4 385.1962 302.302 8.6097 0.3178 1351 +1353 4 384.8004 301.293 9.3607 0.2924 1352 +1354 4 384.1255 300.451 10.2819 0.2669 1353 +1355 4 383.24 299.728 10.36 0.2542 1354 +1356 4 433.4948 381.6235 18.1658 0.2924 943 +1357 4 434.1228 381.4668 20.2387 0.2034 1356 +1358 4 435.1067 381.4634 21.6325 0.1652 1357 +1359 4 436.1672 381.659 22.4507 0.178 1358 +1360 4 436.6911 382.4678 22.3471 0.2288 1359 +1361 4 436.7083 383.5981 22.1788 0.2542 1360 +1362 4 436.6362 384.7203 22.5845 0.2542 1361 +1363 4 436.6419 385.8449 23.0667 0.2415 1362 +1364 4 436.6934 386.9774 22.9566 0.2034 1363 +1365 4 437.0206 388.0288 22.3874 0.2034 1364 +1366 4 437.4542 389.0767 22.2429 0.2034 1365 +1367 4 438.0296 390.0422 21.9145 0.2542 1366 +1368 4 438.605 391.0181 22.008 0.2669 1367 +1369 4 439.2159 391.9813 22.1278 0.2924 1368 +1370 4 440.1883 392.495 22.0937 0.2669 1369 +1371 4 441.2946 392.7821 22.1236 0.2669 1370 +1372 4 442.2052 393.4319 22.2919 0.2542 1371 +1373 4 442.6628 394.4501 22.0623 0.2924 1372 +1374 4 442.8676 395.5712 21.9512 0.3178 1373 +1375 4 443.0678 396.6957 21.7955 0.3432 1374 +1376 4 443.578 397.6979 22.1746 0.3178 1375 +1377 4 444.1752 398.4712 20.8544 0.2924 1376 +1378 4 444.8215 399.4093 20.6668 0.2796 1377 +1379 4 445.5239 400.2353 21.56 0.3305 1378 +1380 4 446.2469 400.7832 21.866 0.2415 1379 +1381 4 447.2445 401.0967 22.9942 0.2542 1380 +1382 4 448.3073 401.4468 22.468 0.2415 1381 +1383 4 449.3438 401.8712 22.9359 0.2034 1382 +1384 4 450.45 401.8735 23.4702 0.1652 1383 +1385 4 451.4704 401.798 22.7223 0.1525 1384 +1386 4 452.3536 401.2237 22.8262 0.178 1385 +1387 4 453.3615 401.1001 23.6088 0.2034 1386 +1388 4 454.3076 401.5692 24.2589 0.2415 1387 +1389 4 455.1564 402.2487 25.0524 0.2669 1388 +1390 4 456.0762 402.8825 24.876 0.3051 1389 +1391 4 457.0074 403.4728 24.1343 0.3432 1390 +1392 4 457.8631 404.1638 23.4262 0.3432 1391 +1393 4 458.8138 404.6854 23.5626 0.3305 1392 +1394 4 459.6478 405.1979 24.885 0.2924 1393 +1395 4 460.4909 405.6372 26.4256 0.2669 1394 +1396 4 461.31 406.3351 27.1762 0.2161 1395 +1397 4 462.0994 407.0741 28.0036 0.1652 1396 +1398 4 462.7903 407.8131 27.83 0.1398 1397 +1399 4 462.7194 408.9388 27.9446 0.1398 1398 +1400 4 462.6725 410.0451 27.6965 0.1652 1399 +1401 4 462.7091 411.1399 28.5046 0.178 1400 +1402 4 462.8578 412.2129 29.0987 0.2034 1401 +1403 4 463.1896 413.1853 29.6456 0.2161 1402 +1404 4 463.2296 413.9427 31.7198 0.2161 1403 +1405 4 463.5328 414.7023 31.9715 0.2161 1404 +1406 4 463.8234 415.4711 33.2511 0.2288 1405 +1407 4 463.892 414.8647 35.1758 0.2669 1406 +1408 4 464.3496 414.684 37.4198 0.2796 1407 +1409 4 464.496 415.7216 38.4462 0.2796 1408 +1410 4 465.274 416.4412 39.0706 0.2542 1409 +1411 4 466.3505 416.8187 38.8654 0.2288 1410 +1412 4 467.276 417.3861 38.7335 0.178 1411 +1413 4 468.0504 417.8712 39.6371 0.1652 1412 +1414 4 469.1235 417.7362 40.3908 0.1652 1413 +1415 4 470.0845 417.9467 41.4809 0.2161 1414 +1416 4 471.0031 418.3608 42.7941 0.2542 1415 +1417 4 472.067 418.6846 43.1575 0.3178 1416 +1418 4 473.1492 419.0495 43.0648 0.3305 1417 +1419 4 474.2521 419.3046 43.3112 0.3051 1418 +1420 4 475.3331 419.0644 43.7108 0.2288 1419 +1421 4 476.3216 418.5232 44.1465 0.1907 1420 +1422 4 477.3409 418.8584 44.2198 0.1907 1421 +1423 4 478.4677 418.9431 44.093 0.2288 1422 +1424 4 479.5648 419.038 44.7714 0.2796 1423 +1425 4 480.6116 419.387 45.4728 0.3178 1424 +1426 4 481.6274 419.9063 45.5703 0.3686 1425 +1427 4 482.7497 420.102 45.7131 0.3813 1426 +1428 4 483.7976 420.5344 45.36 0.3686 1427 +1429 4 445.461 401.679 21.9845 0.2924 1379 +1430 4 445.1659 402.7727 21.7115 0.2924 1429 +1431 4 445.1945 403.8549 21.4799 0.3051 1430 +1432 4 445.771 404.8067 21.3013 0.3051 1431 +1433 4 446.2687 405.7619 21.8425 0.2924 1432 +1434 4 446.3808 406.851 21.9724 0.2924 1433 +1435 4 446.2904 407.979 21.6037 0.2669 1434 +1436 4 445.9415 409.0509 21.4144 0.2542 1435 +1437 4 445.5422 410.0588 22.0562 0.2542 1436 +1438 4 445.0618 411.0598 22.4006 0.3051 1437 +1439 4 444.833 412.1512 22.5826 0.3686 1438 +1440 4 444.9577 413.2792 22.7581 0.3686 1439 +1441 4 444.9039 414.4094 22.9611 0.3178 1440 +1442 4 444.8009 415.5466 22.9653 0.2415 1441 +1443 4 444.6534 416.6711 23.2529 0.2288 1442 +1444 4 444.7128 417.7991 23.1344 0.2669 1443 +1445 4 445.191 418.815 22.8724 0.3051 1444 +1446 4 445.6635 419.8263 23.3646 0.3051 1445 +1447 4 446.0021 420.8948 23.0208 0.2669 1446 +1448 4 446.3842 421.9129 22.1598 0.2542 1447 +1449 4 446.8464 422.9162 22.7094 0.2415 1448 +1450 4 447.2182 423.9858 22.678 0.2415 1449 +1451 4 447.2743 425.1173 22.5464 0.2288 1450 +1452 4 447.3784 426.2132 23.0896 0.2161 1451 +1453 4 447.0329 427.284 23.5656 0.2034 1452 +1454 4 446.6851 428.3308 24.3158 0.1907 1453 +1455 4 446.3842 429.3981 24.9298 0.2034 1454 +1456 4 446.2687 430.5009 24.7372 0.2034 1455 +1457 4 446.4254 431.5568 23.8924 0.1907 1456 +1458 4 446.764 432.6459 23.868 0.178 1457 +1459 4 446.9414 433.7453 24.3768 0.178 1458 +1460 4 446.8853 434.8561 24.2586 0.2161 1459 +1461 4 446.9528 435.9075 25.2084 0.2415 1460 +1462 4 446.8544 436.9714 26.1985 0.2796 1461 +1463 4 446.6153 438.0673 26.7252 0.2924 1462 +1464 4 446.6268 439.1736 26.0543 0.3178 1463 +1465 4 446.6965 440.3016 25.655 0.3305 1464 +1466 4 446.7228 441.3987 26.4359 0.3178 1465 +1467 4 446.6794 442.5404 26.4902 0.2669 1466 +1468 4 446.5535 443.6512 26.9503 0.2288 1467 +1469 4 446.5867 444.7025 27.4691 0.2161 1468 +1470 4 446.7526 445.7745 26.7058 0.2415 1469 +1471 4 446.8327 446.883 26.2136 0.2415 1470 +1472 4 446.9642 447.9526 25.7807 0.2669 1471 +1473 4 447.042 449.0566 26.4443 0.2669 1472 +1474 4 446.8727 450.1182 27.3179 0.2924 1473 +1475 4 446.7778 451.1844 28.2324 0.2669 1474 +1476 4 446.5879 452.2529 27.8597 0.2796 1475 +1477 4 446.6782 453.3615 27.8678 0.2796 1476 +1478 4 447.288 454.2664 27.3767 0.3051 1477 +1479 4 447.7994 455.2468 27.7934 0.2924 1478 +1480 4 447.9675 456.3485 27.4842 0.2796 1479 +1481 4 447.9732 457.3529 26.3096 0.2796 1480 +1482 4 448.3107 458.4225 26.8122 0.2924 1481 +1483 4 448.734 459.4773 26.8652 0.3051 1482 +1484 4 448.9731 460.5858 26.6375 0.3051 1483 +1485 4 449.2271 461.6406 25.8059 0.2796 1484 +1486 4 449.3964 462.6771 25.9274 0.2288 1485 +1487 4 449.7682 463.7032 26.2332 0.1652 1486 +1488 4 450.005 464.798 25.9854 0.1525 1487 +1489 4 450.0976 465.91 26.3864 0.1907 1488 +1490 4 450.1194 467.0002 25.9826 0.2415 1489 +1491 4 450.1869 468.1282 25.6676 0.2542 1490 +1492 4 450.291 468.6716 23.4268 0.2415 1491 +1493 2 414.4174 413.7882 15.3527 0.1907 1 +1494 2 414.3522 414.9185 15.0766 0.2669 1493 +1495 2 414.287 416.0213 14.3632 0.3305 1494 +1496 2 414.1326 417.1093 13.5979 0.3813 1495 +1497 2 413.9564 418.1938 12.8352 0.4068 1496 +1498 2 413.9335 419.2989 12.136 0.4068 1497 +1499 2 414.0605 420.412 11.6236 0.3559 1498 +1500 2 414.3236 421.4896 11.0018 0.3051 1499 +1501 2 414.2561 422.4826 10.0867 0.2796 1500 +1502 2 413.4931 423.2537 9.6502 0.2924 1501 +1503 2 412.5207 423.8463 9.8403 0.3051 1502 +1504 2 411.7462 424.6322 9.9644 0.2796 1503 +1505 2 411.3744 425.5829 9.0264 0.2669 1504 +1506 2 411.0152 426.5496 8.2065 0.2288 1505 +1507 2 410.6914 427.6249 8.4067 0.2288 1506 +1508 2 410.4683 428.7243 8.9289 0.2034 1507 +1509 2 410.2933 429.8111 9.6664 0.2161 1508 +1510 2 410.0622 430.899 9.6303 0.2034 1509 +1511 2 409.8243 432.011 9.4004 0.2288 1510 +1512 2 409.0624 432.6619 9.9117 0.2415 1511 +1513 2 409.0944 433.576 10.92 0.2796 1512 +1514 3 420.0002 408.7546 10.0285 0.3051 1 +1515 3 421.0904 408.6276 9.3506 0.3686 1514 +1516 3 422.1371 408.2124 9.3579 0.4195 1515 +1517 3 423.0867 407.5866 9.5656 0.394 1516 +1518 3 424.0556 406.9952 9.8697 0.3432 1517 +1519 3 425.1138 406.5833 9.9075 0.2796 1518 +1520 3 426.2075 406.2676 9.6527 0.2161 1519 +1521 3 427.332 406.2401 9.4366 0.178 1520 +1522 3 428.4509 406.4277 9.1146 0.1652 1521 +1523 3 429.3329 406.6771 10.3457 0.178 1522 +1524 3 430.0079 407.1073 12.3208 0.178 1523 +1525 3 430.9288 407.169 13.7455 0.178 1524 +1526 3 431.765 406.4987 13.9502 0.1907 1525 +1527 3 432.4629 405.6029 13.6391 0.2415 1526 +1528 3 433.3735 404.9245 13.7175 0.2669 1527 +1529 3 434.1926 404.1558 14.2106 0.2669 1528 +1530 3 435.0655 403.4911 14.9923 0.2161 1529 +1531 3 435.864 403.3744 13.16 0.1652 1530 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Nr5a1_471087815_m.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Nr5a1_471087815_m.swc new file mode 100644 index 0000000..7376d58 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Nr5a1_471087815_m.swc @@ -0,0 +1,1534 @@ +#name E:/Vaa3D-2.938/169250.03.02.01/169250.03.02.01_470218928_Nivi7.swc +#comment +##n,type,x,y,z,radius,parent +1 1 414.8144 408.5224 15.12 6.4406 -1 +2 3 415.7685 414.0582 14.8882 0.3686 1 +3 3 415.6495 414.9757 16.5147 0.5339 2 +4 3 415.3658 416.0739 16.8563 0.661 3 +5 3 415.6415 417.1756 16.515 0.6991 4 +6 3 416.1872 418.1366 17.2357 0.7118 5 +7 3 416.8393 419.0758 17.3597 0.7245 6 +8 3 417.5886 419.9407 17.36 0.7627 7 +9 3 418.4752 420.6625 17.36 0.8008 8 +10 3 419.4945 422.4128 17.3135 0.5466 9 +11 3 420.1923 423.3166 17.1464 0.5212 10 +12 3 420.6133 424.3393 16.4335 0.4957 11 +13 3 421.135 425.3369 15.9295 0.4957 12 +14 3 421.3546 426.458 16.0826 0.4449 13 +15 3 421.6567 427.5608 16.0269 0.3559 14 +16 3 421.5423 428.5184 17.4675 0.2669 15 +17 3 421.4713 429.6498 17.4583 0.2924 16 +18 3 421.4118 430.7492 17.8839 0.3432 17 +19 3 420.9199 431.7662 17.7391 0.3686 18 +20 3 420.174 432.6116 17.9446 0.3686 19 +21 3 419.371 433.3804 17.7316 0.3432 20 +22 3 419.0014 434.3562 16.9249 0.3559 21 +23 3 418.7212 435.324 15.9732 0.3686 22 +24 3 418.4203 436.4211 16.0723 0.3813 23 +25 3 418.1846 437.4965 16.7093 0.394 24 +26 3 417.7648 438.4963 17.4961 0.394 25 +27 3 417.1802 439.1278 16.5441 0.3813 26 +28 3 416.543 439.733 16.4973 0.3432 27 +29 3 415.8188 440.2512 18.1639 0.3178 28 +30 3 414.8453 440.6013 18.958 0.3051 29 +31 3 413.7242 440.6082 18.9213 0.2796 30 +32 3 412.6202 440.8038 19.0162 0.2796 31 +33 3 412.118 441.6995 19.4015 0.3051 32 +34 3 412.285 442.7749 20.083 0.394 33 +35 3 412.817 443.729 20.869 0.4449 34 +36 3 413.5102 444.6316 21.0196 0.4957 35 +37 3 413.556 445.7585 21.2654 0.5212 36 +38 3 413.143 447.0741 19.6034 0.4322 37 +39 3 412.6168 448.0808 19.8881 0.394 38 +40 3 412.0562 449.0143 20.657 0.3432 39 +41 3 411.5151 449.926 21.4312 0.3051 40 +42 3 410.8848 450.8744 21.2789 0.2924 41 +43 3 410.2292 451.8056 21.1624 0.2542 42 +44 3 409.6698 452.7929 20.9762 0.2034 43 +45 3 409.2568 453.8294 20.4523 0.178 44 +46 3 409.0704 454.9436 20.1698 0.178 45 +47 3 409.1802 456.0339 20.5537 0.1907 46 +48 3 409.1585 457.0211 21.546 0.2034 47 +49 3 408.7409 458.0141 22.437 0.2161 48 +50 3 408.4881 459.1055 22.78 0.2161 49 +51 3 408.4904 460.2426 22.8189 0.2034 50 +52 3 408.6723 461.3706 22.8502 0.1907 51 +53 3 408.9983 462.462 22.8077 0.2034 52 +54 3 409.3038 463.5351 23.119 0.2161 53 +55 3 409.2202 464.6299 23.3598 0.2288 54 +56 3 408.6654 465.5977 23.214 0.2161 55 +57 3 408.1895 466.6021 23.0574 0.178 56 +58 3 407.7937 467.658 22.6853 0.1398 57 +59 3 407.1096 468.5458 22.4742 0.1271 58 +60 3 406.1921 469.0686 23.1949 0.1525 59 +61 3 405.2128 469.4415 24.3166 0.178 60 +62 3 404.4051 470.0868 25.3742 0.178 61 +63 3 403.5494 470.7869 25.4982 0.178 62 +64 3 402.6651 471.4756 25.8037 0.1907 63 +65 3 401.6881 472.0396 26.0574 0.2415 64 +66 3 400.9526 472.8244 26.6879 0.2542 65 +67 3 400.4972 473.8471 26.6627 0.2415 66 +68 3 400.1929 474.9465 26.6081 0.2034 67 +69 3 399.693 475.809 27.7763 0.2161 68 +70 3 398.9185 476.6007 27.4254 0.2669 69 +71 3 397.9564 477.1212 26.6462 0.3051 70 +72 3 396.9051 477.5262 26.1811 0.3051 71 +73 3 395.9258 478.0753 25.664 0.2669 72 +74 3 395.0358 478.7617 26.1218 0.2415 73 +75 3 394.2796 479.5877 26.6865 0.2415 74 +76 3 394.2979 480.4628 28.3556 0.2542 75 +77 3 393.9936 481.4684 28.3256 0.2669 76 +78 3 393.1653 482.2029 28.7921 0.2542 77 +79 3 392.3051 482.9499 28.8492 0.2288 78 +80 3 391.4688 483.6088 29.6657 0.2161 79 +81 3 390.4838 483.9257 30.6312 0.2415 80 +82 3 389.5057 484.3719 30.3834 0.2924 81 +83 3 388.6191 485.0594 29.8824 0.3305 82 +84 3 387.6398 485.6314 29.7548 0.3305 83 +85 3 386.7441 486.3178 29.9541 0.3051 84 +86 3 385.8312 486.9253 29.412 0.2542 85 +87 3 385.0429 487.7295 29.0755 0.2288 86 +88 3 385.0704 488.8312 29.4 0.2288 87 +89 3 413.8923 446.5295 21.2332 0.3305 37 +90 3 414.0719 447.6209 21.6059 0.3051 89 +91 3 413.9209 448.7306 21.5765 0.2796 90 +92 3 413.8763 449.846 21.0935 0.2542 91 +93 3 413.8466 450.9797 20.9381 0.1907 92 +94 3 413.2814 451.9166 21.294 0.1652 93 +95 3 412.3491 452.5172 21.782 0.178 94 +96 3 411.2897 452.8616 22.3804 0.2288 95 +97 3 410.3208 453.2002 23.5788 0.2542 96 +98 3 409.218 453.2986 24.0853 0.2796 97 +99 3 408.5087 454.065 24.8021 0.2796 98 +100 3 408.4114 455.1507 25.4965 0.2796 99 +101 3 408.6185 456.1403 26.7708 0.2669 100 +102 3 409.0178 457.1332 27.7544 0.2796 101 +103 3 409.3953 458.1548 28.5242 0.2669 102 +104 3 408.9789 458.8973 30.2677 0.2542 103 +105 3 407.9515 459.356 30.3562 0.2161 104 +106 3 407.2068 460.1763 29.6979 0.2161 105 +107 3 406.6874 461.1681 29.3798 0.2161 106 +108 3 406.4792 462.2847 29.687 0.2288 107 +109 3 406.4232 463.3829 30.3103 0.2288 108 +110 3 406.5341 464.4182 31.3561 0.2161 109 +111 3 406.2985 465.481 32.097 0.2161 110 +112 3 406.0285 466.4706 33.1758 0.2288 111 +113 3 406.0239 467.5745 33.2567 0.2669 112 +114 3 406.2035 468.611 32.58 0.3051 113 +115 3 406.7515 469.6063 32.415 0.3051 114 +116 3 407.2846 470.6004 32.1434 0.2669 115 +117 3 407.645 471.5591 32.5606 0.2161 116 +118 3 407.2034 472.337 33.9486 0.1907 117 +119 3 406.4735 473.1492 34.613 0.2034 118 +120 3 405.9187 473.9901 35.7904 0.2034 119 +121 3 405.0687 474.5941 35.7104 0.2161 120 +122 3 404.0654 474.7108 36.834 0.2161 121 +123 3 403.9075 475.8354 36.5403 0.2415 122 +124 3 403.4785 476.8672 37.0034 0.2542 123 +125 3 402.8218 477.4598 38.7218 0.2542 124 +126 3 401.8952 477.6989 39.7194 0.2288 125 +127 3 401.8106 478.7697 39.459 0.2161 126 +128 3 402.3219 479.7604 39.1384 0.2288 127 +129 3 402.5622 480.8266 39.7446 0.2415 128 +130 3 402.6571 481.8173 41.1012 0.2415 129 +131 3 402.4009 482.8252 41.4795 0.2161 130 +132 3 402.0702 483.7393 42.0918 0.2034 131 +133 3 401.9547 484.7162 43.3311 0.178 132 +134 3 402.219 485.747 43.3927 0.178 133 +135 3 402.6194 486.7777 43.4686 0.178 134 +136 3 402.4889 487.773 44.448 0.1907 135 +137 3 401.8826 488.5932 45.6378 0.2034 136 +138 3 401.1402 489.3986 46.3901 0.2415 137 +139 3 400.3096 490.1685 46.5377 0.2796 138 +140 3 399.526 490.9934 46.478 0.3051 139 +141 3 398.8945 491.9131 46.9462 0.2924 140 +142 3 398.3488 492.8844 47.5555 0.2669 141 +143 3 397.9038 493.9197 48.0208 0.2415 142 +144 3 397.4176 494.9424 48.3753 0.2415 143 +145 3 396.7392 495.8245 48.909 0.2542 144 +146 3 396.1649 496.79 49.1725 0.2415 145 +147 3 395.9716 497.8963 49.2988 0.2161 146 +148 3 395.9476 498.8549 50.664 0.1907 147 +149 3 396.3045 499.8765 51.3192 0.1907 148 +150 3 396.5962 500.9336 52.0904 0.178 149 +151 3 396.2679 502.0101 52.1452 0.2034 150 +152 3 396.1672 503.1312 52.64 0.2796 151 +153 3 421.7573 429.151 15.1718 0.483 15 +154 3 421.9244 430.2653 14.6978 0.4195 153 +155 3 422.0662 431.3841 14.2232 0.3305 154 +156 3 422.12 432.5018 14.6902 0.2796 155 +157 3 422.1966 433.6206 15.2452 0.3432 156 +158 3 422.1406 434.7543 14.9027 0.3813 157 +159 3 421.882 435.8388 14.28 0.394 158 +160 3 420.8296 436.9577 13.186 0.3686 159 +161 3 420.0779 437.6166 11.8448 0.3305 160 +162 3 419.8777 438.5249 12.0445 0.2542 161 +163 3 419.5426 439.3578 13.6772 0.2161 162 +164 3 419.181 440.3679 13.2686 0.2415 163 +165 3 418.8436 441.4559 13.2356 0.2924 164 +166 3 418.4638 442.5335 13.3319 0.3178 165 +167 3 417.8883 443.5128 13.5985 0.3305 166 +168 3 417.4856 444.5767 13.8382 0.3559 167 +169 3 417.425 445.7161 14.0258 0.4195 168 +170 3 417.1299 446.8155 14.273 0.4449 169 +171 3 416.5865 447.8039 13.8558 0.4195 170 +172 3 416.2936 448.7008 12.376 0.3559 171 +173 3 415.7605 449.6686 13.0239 0.3178 172 +174 3 414.9368 450.4317 12.8534 0.2924 173 +175 3 413.9015 450.8493 13.2983 0.2796 174 +176 3 412.9165 451.3961 12.8517 0.2542 175 +177 3 411.8961 451.872 12.549 0.2288 176 +178 3 411.0358 452.611 12.2189 0.1907 177 +179 3 410.1926 453.3478 11.7572 0.178 178 +180 3 409.5314 454.2675 11.6967 0.1907 179 +181 3 408.9949 455.2662 11.655 0.2288 180 +182 3 408.3291 456.1162 12.3222 0.2669 181 +183 3 407.6003 456.7546 13.6881 0.3051 182 +184 3 406.7217 457.3151 13.9454 0.3305 183 +185 3 405.9839 458.0702 12.8789 0.3432 184 +186 3 405.3981 458.9682 12.0534 0.3305 185 +187 3 404.9257 460.0001 11.8423 0.3178 186 +188 3 404.4543 461.0309 11.6248 0.2796 187 +189 3 404.007 462.073 11.3347 0.2542 188 +190 3 403.5037 463.0832 11.6222 0.2161 189 +191 3 402.95 464.0304 12.3953 0.2034 190 +192 3 402.4466 464.9994 13.2031 0.1907 191 +193 3 402.2075 466.0519 13.0155 0.1907 192 +194 3 402.0451 467.1581 12.6353 0.1907 193 +195 3 401.8174 468.2792 12.644 0.1907 194 +196 3 401.4708 469.3626 12.7716 0.178 195 +197 3 400.8519 470.2995 13.1191 0.1652 196 +198 3 400.1106 471.145 13.6234 0.1398 197 +199 3 399.7113 472.1791 13.8687 0.1271 198 +200 3 399.3109 473.2328 13.4935 0.1271 199 +201 3 398.6508 474.148 13.701 0.1525 200 +202 3 398.2596 475.1776 14.3612 0.2034 201 +203 3 398.2722 476.2609 15.1833 0.2542 202 +204 3 397.8409 477.2917 15.3742 0.2924 203 +205 3 397.349 478.2858 14.7389 0.2924 204 +206 3 397.2231 479.3955 15.0836 0.2669 205 +207 3 397.2792 480.5315 14.9005 0.2542 206 +208 3 397.1751 481.6686 14.9134 0.2542 207 +209 3 397.0458 482.7508 15.7142 0.2542 208 +210 3 396.7403 483.8239 15.141 0.2288 209 +211 3 396.3079 484.865 15.4974 0.2034 210 +212 3 396.2908 485.9987 15.5518 0.2161 211 +213 3 396.5653 487.0992 15.3952 0.2415 212 +214 3 396.9634 488.154 15.8682 0.2542 213 +215 3 397.2746 489.2122 16.3523 0.2288 214 +216 3 397.0938 490.3138 16.4032 0.2034 215 +217 3 396.7529 491.3457 15.7492 0.1907 216 +218 3 396.2805 492.3787 16.0202 0.1907 217 +219 3 395.7016 493.3626 16.1857 0.2034 218 +220 3 395.133 494.3418 16.1364 0.2161 219 +221 3 394.5118 495.2742 15.7651 0.2288 220 +222 3 393.8357 496.1757 16.1616 0.2034 221 +223 3 393.1825 497.084 16.5472 0.178 222 +224 3 392.6608 498.0953 16.4119 0.1398 223 +225 3 392.3851 499.1878 16.1297 0.1398 224 +226 3 392.3954 500.3158 15.8334 0.1652 225 +227 3 392.5579 501.4381 16.0118 0.2034 226 +228 3 392.6654 502.5626 16.3489 0.2288 227 +229 3 392.5304 503.6563 15.9905 0.2161 228 +230 3 392.8485 504.6058 15.703 0.2161 229 +231 3 393.679 505.3712 15.9558 0.2161 230 +232 3 394.5942 506.0484 15.9706 0.2415 231 +233 3 395.5815 506.6032 15.6699 0.2415 232 +234 3 396.6225 507.0711 15.5168 0.2288 233 +235 3 397.7082 507.3892 15.7598 0.178 234 +236 3 398.8064 507.3571 16.3929 0.1398 235 +237 3 399.7822 507.8559 16.4368 0.1398 236 +238 3 400.7066 508.5206 16.1647 0.178 237 +239 3 401.5143 509.3237 15.9827 0.2542 238 +240 3 401.7728 510.224 14.56 0.3432 239 +241 3 421.5491 436.4589 14.488 0.4703 159 +242 3 421.8203 437.5217 13.7939 0.4068 241 +243 3 422.0651 438.5936 13.0189 0.3686 242 +244 3 422.2927 439.7056 13.3171 0.3559 243 +245 3 422.2698 440.8347 13.734 0.3686 244 +246 3 422.1818 441.9741 13.6581 0.394 245 +247 3 422.2733 443.0895 13.221 0.3813 246 +248 3 422.8235 443.9956 12.1755 0.3686 247 +249 3 423.4642 444.8307 11.0984 0.3178 248 +250 3 424.2181 445.4484 9.6359 0.2924 249 +251 3 424.9697 446.1234 8.7802 0.2542 250 +252 3 425.5749 446.7126 10.1234 0.2415 251 +253 3 426.3116 447.4619 9.7479 0.2415 252 +254 3 427.0907 448.1551 10.7674 0.2669 253 +255 3 427.7439 449.0646 10.9533 0.2796 254 +256 3 428.5241 449.838 10.7607 0.2796 255 +257 3 429.4873 450.3917 11.4128 0.2415 256 +258 3 430.0822 451.2325 12.0772 0.2288 257 +259 3 430.549 452.2255 11.9157 0.1907 258 +260 3 431.3635 452.9805 11.7505 0.1907 259 +261 3 432.3531 453.5491 11.7524 0.178 260 +262 3 432.9765 454.4563 11.5486 0.2034 261 +263 3 433.3655 455.5316 11.5206 0.2034 262 +264 3 433.9215 456.3004 10.0691 0.2034 263 +265 3 434.704 456.9857 9.4102 0.1907 264 +266 3 434.998 457.8448 11.1104 0.1907 265 +267 3 435.4053 458.7234 12.5023 0.1907 266 +268 3 436.0333 459.6272 12.6302 0.1907 267 +269 3 436.5424 460.508 11.4363 0.1907 268 +270 3 437.2688 461.2986 11.0706 0.2034 269 +271 3 437.7985 462.2629 11.3011 0.2034 270 +272 3 438.3053 463.2548 10.8296 0.2161 271 +273 3 438.9173 464.2066 10.6515 0.2161 272 +274 3 439.4241 465.227 10.5636 0.2415 273 +275 3 439.7845 466.2898 10.7484 0.2415 274 +276 3 440.2101 467.3286 11.062 0.2288 275 +277 3 440.7695 468.2895 10.5963 0.2034 276 +278 3 441.584 469.0068 10.0509 0.2034 277 +279 3 442.5221 469.6532 9.9355 0.2161 278 +280 3 443.3355 470.4048 9.3864 0.2288 279 +281 3 444.1877 471.1427 9.3254 0.2288 280 +282 3 445.1121 471.8142 9.3856 0.2288 281 +283 3 446.0284 472.4869 9.1188 0.2161 282 +284 3 446.7331 473.3586 9.3332 0.2034 283 +285 3 447.4413 474.2452 9.205 0.178 284 +286 3 448.2112 475.0895 9.2305 0.1652 285 +287 3 448.7786 476.0767 9.1448 0.178 286 +288 3 449.3632 477.048 9.52 0.2415 287 +289 3 420.3742 420.9268 17.3779 0.4703 9 +290 3 421.5137 420.857 17.5042 0.483 289 +291 3 422.6565 420.8238 17.5941 0.483 290 +292 3 423.7811 420.6694 17.2483 0.4703 291 +293 3 424.8816 420.3605 17.3186 0.4957 292 +294 3 426.0245 420.3571 17.4199 0.483 293 +295 3 427.2634 421.0252 16.7042 0.4576 294 +296 3 428.1111 421.6658 15.6918 0.4449 295 +297 3 429.0984 422.2161 15.4381 0.4068 296 +298 3 429.8386 422.9951 16.2999 0.3813 297 +299 3 430.422 423.9161 17.1332 0.3559 298 +300 3 430.9597 424.8965 17.7167 0.3178 299 +301 3 431.6941 425.7533 17.3169 0.2924 300 +302 3 432.0613 426.8333 17.3177 0.2415 301 +303 3 432.1918 427.9658 17.0853 0.2669 302 +304 3 432.6986 428.9874 16.8622 0.3178 303 +305 3 432.829 429.699 16.4027 0.2542 304 +306 3 433.1047 430.6405 15.0086 0.3305 305 +307 3 433.4376 431.6804 15.3588 0.3813 306 +308 3 433.4616 432.6608 16.8 0.4195 307 +309 3 433.2431 433.2214 17.6039 0.2161 308 +310 3 433.2236 434.2773 18.4173 0.2415 309 +311 3 433.4399 435.3892 18.4122 0.2542 310 +312 3 433.8734 436.4108 17.8545 0.2796 311 +313 3 434.4626 437.3295 17.0316 0.2669 312 +314 3 434.9968 438.3167 16.613 0.2415 313 +315 3 435.8034 439.0683 16.8876 0.2161 314 +316 3 436.8616 439.471 16.7415 0.2415 315 +317 3 437.8763 439.9881 16.5043 0.2924 316 +318 3 438.8075 440.5704 17.2301 0.3432 317 +319 3 439.1233 441.6012 18.0578 0.3559 318 +320 3 439.2148 442.7188 17.5605 0.3432 319 +321 3 439.2411 443.8617 17.6568 0.3051 320 +322 3 439.296 444.9634 17.185 0.2796 321 +323 3 439.2411 446.0033 16.83 0.2669 322 +324 3 438.8853 446.9288 18.1132 0.2542 323 +325 3 438.7229 447.8817 19.2805 0.2542 324 +326 3 439.002 448.9285 19.0991 0.2415 325 +327 3 439.4161 449.9592 18.7183 0.2542 326 +328 3 439.8737 450.9991 18.935 0.2415 327 +329 3 440.345 451.9612 19.7576 0.2415 328 +330 3 440.9617 452.8364 20.4445 0.2288 329 +331 3 441.4707 453.8042 20.921 0.2415 330 +332 3 442.0828 454.6862 20.7435 0.2669 331 +333 3 442.8321 455.5191 20.7046 0.2796 332 +334 3 443.4224 456.4743 21.1523 0.2924 333 +335 3 443.92 457.4181 20.5523 0.3051 334 +336 3 444.5584 458.323 20.1698 0.3305 335 +337 3 444.9222 459.3755 20.3045 0.3305 336 +338 3 445.3718 460.4085 20.1572 0.3178 337 +339 3 445.7768 461.4232 20.7444 0.3051 338 +340 3 446.1406 462.4666 21.4645 0.2924 339 +341 3 446.6691 463.4676 21.6219 0.2796 340 +342 3 447.2765 464.4114 22.0833 0.2542 341 +343 3 447.8302 465.4009 22.3874 0.2542 342 +344 3 448.1517 466.4912 22.4692 0.2542 343 +345 3 448.6619 467.4842 22.9284 0.2796 344 +346 3 449.2076 468.4749 23.3388 0.2796 345 +347 3 449.8746 469.3935 23.1501 0.2796 346 +348 3 450.6731 470.1554 22.4619 0.2669 347 +349 3 451.5345 470.8818 22.6814 0.2796 348 +350 3 452.1923 471.7833 23.238 0.3051 349 +351 3 452.8044 472.7431 23.1594 0.3559 350 +352 3 453.2482 473.7922 22.9827 0.394 351 +353 3 453.3512 474.9213 23.1829 0.394 352 +354 3 453.4061 476.0619 23.3503 0.3432 353 +355 3 453.4496 477.1956 23.6936 0.2796 354 +356 3 453.3741 478.3236 24.1259 0.2542 355 +357 3 453.8134 479.3612 24.3421 0.2669 356 +358 3 454.6702 480.0933 23.9915 0.2796 357 +359 3 455.4298 480.8221 23.4203 0.2669 358 +360 3 456.4674 481.2156 24.0178 0.2415 359 +361 3 457.5622 481.5279 24.2298 0.2288 360 +362 3 458.6067 481.942 24.6854 0.2161 361 +363 3 459.5997 482.482 24.7352 0.1907 362 +364 3 460.5607 483.022 24.0943 0.1907 363 +365 3 461.4015 483.7507 23.4559 0.2288 364 +366 3 462.3956 484.2106 23.0728 0.2669 365 +367 3 463.4058 484.6362 23.4788 0.2542 366 +368 3 464.0464 485.4861 23.5088 0.2161 367 +369 3 464.3565 486.4654 22.3975 0.2034 368 +370 3 464.901 487.3486 22.2583 0.2288 369 +371 3 465.5302 488.2729 22.1032 0.2288 370 +372 3 465.9443 489.3243 22.1194 0.2161 371 +373 3 466.2978 490.4111 22.1878 0.1907 372 +374 3 466.6204 491.5013 22.451 0.2034 373 +375 3 467.1902 492.444 22.0301 0.2288 374 +376 3 467.5059 493.5262 21.9974 0.2669 375 +377 3 467.9486 494.5203 22.5758 0.3051 376 +378 3 468.1809 495.598 22.0374 0.3051 377 +379 3 468.7952 496.5463 21.8355 0.2669 378 +380 3 469.477 497.4112 22.2468 0.1907 379 +381 3 470.47 497.9512 21.9666 0.1398 380 +382 3 471.4996 498.2429 21.3632 0.1271 381 +383 3 472.6093 498.2143 21.3332 0.1398 382 +384 3 473.6297 498.689 21.2612 0.1525 383 +385 3 474.5404 499.2553 21.2744 0.1398 384 +386 3 475.4624 499.777 21.9915 0.1525 385 +387 3 476.0562 500.6453 21.2089 0.178 386 +388 3 476.4188 501.6097 21.8036 0.2288 387 +389 3 477.1887 502.375 22.2925 0.2415 388 +390 3 478.1359 503.0054 22.1418 0.2288 389 +391 3 479.0694 503.6597 22.2667 0.2034 390 +392 3 479.8016 504.5234 22.4787 0.178 391 +393 3 480.448 505.4043 21.7697 0.178 392 +394 3 481.06 506.3573 21.7974 0.1652 393 +395 3 481.8231 507.205 21.9271 0.1652 394 +396 3 482.3951 508.1225 21.0613 0.1525 395 +397 3 483.2256 508.7368 19.88 0.1907 396 +398 3 433.9467 433.0315 16.2554 0.1525 308 +399 3 434.5953 433.6481 14.5919 0.1652 398 +400 3 435.6958 433.7259 13.9961 0.1907 399 +401 3 436.7083 434.1949 13.8625 0.2161 400 +402 3 437.8305 434.1068 14.2601 0.2288 401 +403 3 438.9356 434.2052 14.8229 0.2288 402 +404 3 440.0133 433.9295 14.9223 0.2288 403 +405 3 441.0223 433.6309 14.1876 0.2415 404 +406 3 442.1446 433.7339 14.5827 0.2669 405 +407 3 443.2382 434.0325 14.7224 0.3051 406 +408 3 444.325 434.3676 14.5113 0.3178 407 +409 3 445.3878 434.7726 14.4337 0.3051 408 +410 3 446.446 435.0895 13.8989 0.2669 409 +411 3 447.4722 435.4361 13.7329 0.2542 410 +412 3 448.4594 435.9967 13.7931 0.2796 411 +413 3 449.5108 436.3674 13.314 0.3305 412 +414 3 450.6022 436.5355 12.6112 0.3813 413 +415 3 451.7244 436.5893 12.444 0.3813 414 +416 3 452.8101 436.8501 12.7361 0.3559 415 +417 3 453.6017 437.3626 11.7267 0.3051 416 +418 3 454.5204 437.6498 11.5307 0.2924 417 +419 3 455.5019 437.8957 12.7725 0.2924 418 +420 3 456.5018 438.3099 13.4848 0.2924 419 +421 3 457.5428 438.7068 13.0687 0.2796 420 +422 3 458.5701 439.1267 12.3973 0.2796 421 +423 3 459.5734 439.5717 11.611 0.2796 422 +424 3 460.6636 439.8257 11.6886 0.2796 423 +425 3 461.7916 439.7673 12.0036 0.2542 424 +426 3 462.8018 439.7113 10.8951 0.2669 425 +427 3 463.9149 439.7994 10.5633 0.2542 426 +428 3 464.9662 439.9916 11.4733 0.2542 427 +429 3 466.0725 439.9138 11.1432 0.2161 428 +430 3 467.1261 439.5031 10.7456 0.2034 429 +431 3 468.2495 439.6918 10.6529 0.1907 430 +432 3 469.2688 440.2112 10.64 0.2034 431 +433 3 432.7226 429.1121 17.598 0.1652 304 +434 3 433.4284 429.4896 18.6074 0.2161 433 +435 3 434.4443 429.7905 17.736 0.2669 434 +436 3 435.4853 430.1703 17.8595 0.3051 435 +437 3 436.3422 430.39 19.5054 0.3305 436 +438 3 437.3569 430.724 20.4061 0.3178 437 +439 3 438.4048 431.177 20.5887 0.2669 438 +440 3 439.2743 431.8829 21.1495 0.2034 439 +441 3 440.1094 432.6608 20.9689 0.1652 440 +442 3 440.2318 433.3781 22.388 0.178 441 +443 3 440.4423 434.418 23.273 0.2161 442 +444 3 440.7855 435.3892 24.3858 0.2542 443 +445 3 441.1573 436.3262 23.8218 0.2542 444 +446 3 441.0395 437.2791 24.7338 0.2288 445 +447 3 441.1973 438.3579 25.4083 0.2034 446 +448 3 441.7842 439.288 26.0859 0.2034 447 +449 3 441.8185 440.3702 26.9472 0.2288 448 +450 3 441.6755 441.465 27.5293 0.2542 449 +451 3 441.9741 442.5381 27.7606 0.2669 450 +452 3 442.3562 443.5402 27.0626 0.2796 451 +453 3 442.7486 444.5698 27.2101 0.3051 452 +454 3 443.2291 445.548 26.7375 0.3178 453 +455 3 443.5139 446.6359 26.4919 0.3178 454 +456 3 443.8834 447.4733 27.8149 0.2924 455 +457 3 444.023 448.4068 29.1508 0.2796 456 +458 3 443.8148 449.4879 28.9282 0.2415 457 +459 3 443.8937 450.5255 27.8975 0.2415 458 +460 3 444.2735 451.5746 27.5937 0.2415 459 +461 3 444.5939 452.3788 29.1805 0.2796 460 +462 3 445.3626 452.9107 30.6872 0.2669 461 +463 3 445.9964 453.8145 31.3488 0.2415 462 +464 3 446.1028 454.9379 31.717 0.2034 463 +465 3 445.6315 455.9606 32.1457 0.2034 464 +466 3 444.913 456.7008 33.3357 0.2161 465 +467 3 444.3399 457.6057 34.2574 0.2288 466 +468 3 443.4579 458.3276 34.2227 0.2288 467 +469 3 442.601 458.99 33.3934 0.2542 468 +470 3 441.6526 459.6134 33.5616 0.2669 469 +471 3 440.5773 459.8571 33.6389 0.2669 470 +472 3 439.5831 459.7347 34.6735 0.2288 471 +473 3 438.7606 460.412 35.0826 0.2161 472 +474 3 438.3739 461.4782 35.4404 0.2161 473 +475 3 438.0204 462.5512 35.87 0.2161 474 +476 3 437.5972 463.5797 36.3653 0.1907 475 +477 3 436.8204 464.2386 37.3173 0.1652 476 +478 3 435.7588 464.4983 37.8434 0.1652 477 +479 3 434.6331 464.655 38.0481 0.2034 478 +480 3 433.5989 465.052 38.3827 0.2415 479 +481 3 432.8839 465.6366 39.6301 0.2796 480 +482 3 432.6802 466.2921 41.8065 0.2669 481 +483 3 432.44 467.2233 43.2524 0.2415 482 +484 3 432.1391 468.3216 43.3936 0.178 483 +485 3 431.288 469.04 43.96 0.1525 484 +486 3 441.3232 433.1905 20.1667 0.2542 441 +487 3 442.2395 433.8597 20.3403 0.3051 486 +488 3 443.1822 434.4466 20.9404 0.3305 487 +489 3 444.1225 435.0689 20.8468 0.3432 488 +490 3 445.1224 435.5002 20.0567 0.3305 489 +491 3 446.0113 435.9864 18.7603 0.3051 490 +492 3 446.859 436.5355 18.7345 0.2796 491 +493 3 447.7158 437.2151 19.0733 0.2796 492 +494 3 448.6974 437.7665 19.1786 0.2924 493 +495 3 449.5222 438.5089 19.3158 0.2796 494 +496 3 450.442 438.557 20.4137 0.2415 495 +497 3 451.5082 438.311 21.1462 0.2034 496 +498 3 452.3605 438.8956 21.7308 0.2034 497 +499 3 453.0434 439.7936 21.3662 0.2034 498 +500 3 453.8408 440.5338 22.2113 0.2161 499 +501 3 454.5306 441.4399 22.3289 0.2161 500 +502 3 455.304 442.1537 21.4315 0.2288 501 +503 3 456.3794 442.3871 21.957 0.2288 502 +504 3 457.3929 442.5358 23.1087 0.2288 503 +505 3 458.1869 443.1696 23.6748 0.2542 504 +506 3 458.8424 444.0539 23.5735 0.2796 505 +507 3 459.8045 444.6019 24.1324 0.3051 506 +508 3 460.8787 444.9176 24.5162 0.2924 507 +509 3 461.9632 445.1304 24.019 0.2542 508 +510 3 463.0283 445.3066 23.1059 0.2161 509 +511 3 464.1219 445.4484 23.0653 0.1907 510 +512 3 465.1744 445.7596 23.2148 0.1907 511 +513 3 465.9077 446.5204 23.5253 0.178 512 +514 3 466.6113 447.3795 23.8479 0.1525 513 +515 3 467.6111 447.8646 23.7622 0.1398 514 +516 3 468.7117 448.1734 23.683 0.1525 515 +517 3 469.66 448.7626 23.4368 0.1907 516 +518 3 470.6256 449.2854 22.7704 0.2034 517 +519 3 471.6483 449.7613 22.4644 0.2034 518 +520 3 472.6997 450.204 22.6173 0.2034 519 +521 3 473.7544 450.6227 22.9592 0.2288 520 +522 3 474.8229 451.006 22.8547 0.2415 521 +523 3 475.9303 451.2702 22.64 0.2288 522 +524 3 476.9862 451.4979 23.3814 0.1907 523 +525 3 478.0913 451.6821 23.4783 0.1652 524 +526 3 478.764 452.452 24.36 0.1525 525 +527 3 427.2886 420.0013 17.3099 0.394 294 +528 3 428.3491 419.5895 17.4538 0.4068 527 +529 3 429.4565 419.3767 17.2584 0.4068 528 +530 3 430.4037 418.9717 17.9315 0.4068 529 +531 3 431.3704 418.4191 17.5484 0.3559 530 +532 3 432.4171 418.1228 17.8377 0.3051 531 +533 3 433.0372 417.5932 18.9356 0.2542 532 +534 3 433.9352 417.1722 17.841 0.2796 533 +535 3 434.6056 416.3954 18.3996 0.3051 534 +536 3 434.8962 415.4436 19.4362 0.3432 535 +537 3 434.2967 414.6417 20.0684 0.3305 536 +538 3 435.0026 414.0388 19.9548 0.3305 537 +539 3 436.0905 414.0868 19.8374 0.3686 538 +540 3 437.0732 414.5341 20.1942 0.4322 539 +541 3 438.1245 414.7721 20.6618 0.4576 540 +542 3 439.0466 414.938 21.8781 0.4068 541 +543 3 440.0533 415.248 22.1024 0.3305 542 +544 3 440.6665 415.0432 24.1704 0.2924 543 +545 3 441.7007 414.5913 24.3342 0.2924 544 +546 3 442.8264 414.6417 24.7117 0.3051 545 +547 3 443.9269 414.8739 24.9343 0.3051 546 +548 3 445.0618 414.7629 25.0275 0.3178 547 +549 3 446.1508 414.5421 24.9743 0.3432 548 +550 3 447.2354 414.3328 24.6036 0.3686 549 +551 3 448.3405 414.5593 24.4367 0.394 550 +552 3 449.2877 415.1816 24.5176 0.394 551 +553 3 450.291 415.6964 24.5574 0.4068 552 +554 3 451.2588 416.1048 25.0919 0.394 553 +555 3 452.0001 416.797 23.9562 0.3686 554 +556 3 452.873 417.3838 23.0236 0.3178 555 +557 3 453.9712 417.6515 22.7388 0.2796 556 +558 3 455.0283 417.584 23.6062 0.3051 557 +559 3 455.9309 418.2807 23.4024 0.3559 558 +560 3 456.8758 418.8985 23.3906 0.4068 559 +561 3 457.7499 419.5334 23.1232 0.4068 560 +562 3 458.4855 420.3468 22.3608 0.394 561 +563 3 459.2577 421.0549 22.9684 0.394 562 +564 3 460.222 421.3535 24.11 0.394 563 +565 3 461.334 421.3695 24.5809 0.3813 564 +566 3 462.4025 421.4622 23.8568 0.3432 565 +567 3 463.4047 421.9152 23.952 0.3178 566 +568 3 464.3851 422.1955 25.1952 0.2796 567 +569 3 464.9605 423.1713 25.412 0.2542 568 +570 3 465.703 423.9435 25.158 0.2288 569 +571 3 466.7303 423.7502 25.1826 0.2288 570 +572 3 467.7702 424.1369 25.6264 0.2288 571 +573 3 468.8284 424.4995 25.1902 0.2288 572 +574 3 469.8831 424.6642 25.0802 0.2415 573 +575 3 470.8635 424.8908 24.1368 0.2288 574 +576 3 471.3738 425.7476 25.2694 0.2288 575 +577 3 472.1174 425.7774 25.8978 0.2161 576 +578 3 473.1367 425.2934 25.4814 0.2288 577 +579 3 474.2383 425.1333 25.8182 0.2034 578 +580 3 475.3457 425.1573 25.7858 0.1907 579 +581 3 476.3925 425.3735 25.8454 0.2034 580 +582 3 477.3443 425.9753 26.0151 0.2542 581 +583 3 478.0261 426.7097 27.1309 0.2796 582 +584 3 479.0054 427.1879 27.4504 0.2542 583 +585 3 479.9641 427.0403 26.4505 0.2161 584 +586 3 480.9067 427.0644 26.7333 0.1907 585 +587 3 481.9889 426.9534 26.8579 0.2034 586 +588 3 483.0105 426.7784 25.6889 0.2161 587 +589 3 484.1099 426.4832 25.482 0.2161 588 +590 3 485.1921 426.6148 26.1064 0.2161 589 +591 3 486.1005 427.1124 27.27 0.2034 590 +592 3 486.9768 427.713 28.2114 0.2161 591 +593 3 487.9549 428.2289 28.0375 0.2034 592 +594 3 488.909 428.0207 28.2551 0.2161 593 +595 3 490.0049 427.9544 28.5113 0.2161 594 +596 3 491.03 428.4246 28.3074 0.2415 595 +597 3 492.0378 428.6957 29.3762 0.2415 596 +598 3 493.0537 429.1499 29.5904 0.2415 597 +599 3 494.0593 429.4542 30.2117 0.2161 598 +600 3 495.1335 429.3329 29.6738 0.2034 599 +601 3 496.1745 429.1258 29.6136 0.2034 600 +602 3 497.2682 429.119 30.333 0.2161 601 +603 3 498.2292 428.9462 31.3855 0.2542 602 +604 3 498.4774 427.9887 32.7664 0.2669 603 +605 3 498.7989 426.9854 32.975 0.2669 604 +606 3 499.3617 426.2384 33.4216 0.2288 605 +607 3 500.3856 426.14 32.76 0.2034 606 +608 3 409.576 406.4106 15.2239 0.3813 1 +609 3 408.5945 405.85 15.6554 0.483 608 +610 3 407.5408 405.4244 15.9838 0.5084 609 +611 3 406.5284 404.9154 15.6111 0.4703 610 +612 3 405.5629 404.3399 16.1291 0.4449 611 +613 3 404.5928 403.7348 16.2364 0.4449 612 +614 3 403.5906 403.1834 16.24 0.4449 613 +615 3 402.4478 403.1422 16.2403 0.394 614 +616 3 401.4193 403.6444 16.2414 0.3305 615 +617 3 400.5842 404.4257 16.245 0.3051 616 +618 3 399.7422 405.2002 16.2607 0.3305 617 +619 3 399.367 405.556 16.3604 0.2161 618 +620 3 398.8476 406.4243 17.099 0.1652 619 +621 3 398.7446 407.3818 18.6099 0.1398 620 +622 3 398.0559 407.979 19.626 0.1144 621 +623 3 397.0321 407.8932 20.6665 0.1144 622 +624 3 396.0917 407.812 22.2194 0.1144 623 +625 3 395.1193 407.359 22.9026 0.1144 624 +626 3 394.235 406.6428 23.0966 0.1144 625 +627 3 393.1539 406.5936 23.6499 0.1398 626 +628 3 392.4343 407.4047 24.2712 0.178 627 +629 3 392.4023 408.4629 25.2109 0.2161 628 +630 3 393.0578 409.3587 25.7667 0.2288 629 +631 3 393.5257 410.3997 25.8499 0.2669 630 +632 3 393.393 411.5014 26.4844 0.3305 631 +633 3 393.0189 412.4761 27.6315 0.4195 632 +634 3 392.8462 413.4519 29.0256 0.4322 633 +635 3 392.7432 414.5684 29.5529 0.394 634 +636 3 392.384 415.6427 29.3213 0.3178 635 +637 3 391.4894 416.2741 29.0363 0.2669 636 +638 3 390.3637 416.1895 29.4423 0.2924 637 +639 3 389.2952 416.138 30.2716 0.2924 638 +640 3 388.3628 416.5945 31.4154 0.3432 639 +641 3 387.4865 417.1665 32.4727 0.2924 640 +642 3 386.4546 417.592 33.0504 0.2924 641 +643 3 385.6115 418.251 33.469 0.2161 642 +644 3 385.2042 419.2989 33.9811 0.2288 643 +645 3 384.4961 419.9841 34.3353 0.2288 644 +646 3 383.4425 419.7897 34.8989 0.2924 645 +647 3 382.4198 419.3652 35.6017 0.3178 646 +648 3 381.3307 419.1524 36.1362 0.3559 647 +649 3 380.2027 419.2325 36.3675 0.3686 648 +650 3 379.0804 419.4487 36.4428 0.3432 649 +651 3 377.957 419.6478 36.6411 0.3051 650 +652 3 376.8908 419.5345 37.3674 0.2669 651 +653 3 375.9928 419.0666 38.5983 0.2669 652 +654 3 375.0787 418.5244 39.5914 0.2669 653 +655 3 374.0274 418.1972 40.2475 0.2669 654 +656 3 372.9291 417.981 40.8201 0.2924 655 +657 3 371.8847 417.5955 41.3899 0.2924 656 +658 3 370.8093 417.266 41.8452 0.3051 657 +659 3 369.7671 417.5451 42.2145 0.2924 658 +660 3 369.226 418.4763 42.5466 0.3305 659 +661 3 368.5957 419.3835 43.1525 0.3178 660 +662 3 368.0511 420.0734 44.8381 0.3305 661 +663 3 367.8257 420.69 47.0974 0.3305 662 +664 3 367.6152 421.556 48.7878 0.3813 663 +665 3 367.184 422.5387 49.6588 0.3686 664 +666 3 366.6291 423.5225 50.0685 0.3432 665 +667 3 366.0377 424.4492 50.8158 0.3051 666 +668 3 365.6567 425.4891 51.4326 0.2924 667 +669 3 365.2735 426.4958 52.3561 0.2669 668 +670 3 364.6534 427.3721 53.2714 0.2288 669 +671 3 363.9853 428.134 54.5538 0.2161 670 +672 3 363.2886 428.6991 56.2691 0.2034 671 +673 3 362.5851 429.4954 57.195 0.2161 672 +674 3 361.7648 430.0857 58.45 0.2034 673 +675 3 360.9423 430.756 59.4804 0.2161 674 +676 3 360.4641 431.7605 59.9995 0.2034 675 +677 3 359.955 432.5761 61.4709 0.2034 676 +678 3 358.9872 432.8896 62.72 0.1652 677 +679 3 399.208 405.1693 15.1729 0.3686 618 +680 3 398.366 404.698 13.6867 0.3813 679 +681 3 397.4508 404.0539 13.1463 0.394 680 +682 3 396.4852 403.4716 13.587 0.4195 681 +683 3 395.3858 403.2051 13.9765 0.4576 682 +684 3 394.2624 403.4019 14.0958 0.4957 683 +685 3 393.1322 403.5025 14.4547 0.5084 684 +686 3 392.0225 403.6146 15.0685 0.483 685 +687 3 390.954 404.007 15.3448 0.4195 686 +688 3 390.0159 404.6259 15.869 0.3813 687 +689 3 389.103 405.2963 16.2551 0.3686 688 +690 3 388.1443 405.9129 16.4914 0.3813 689 +691 3 387.1216 406.3717 17.0419 0.3813 690 +692 3 386.0188 406.6497 17.3426 0.3813 691 +693 3 384.8748 406.6291 17.3457 0.3686 692 +694 3 383.7456 406.4472 17.2712 0.3432 693 +695 3 382.6291 406.239 16.9361 0.2924 694 +696 3 381.5126 406.1783 16.3453 0.2669 695 +697 3 380.3937 405.9381 16.3184 0.2542 696 +698 3 379.403 405.3753 16.5628 0.2924 697 +699 3 378.3734 404.9154 17.0313 0.2924 698 +700 3 377.25 404.7449 17.3519 0.2924 699 +701 3 376.1278 404.523 17.3239 0.2415 700 +702 3 374.9929 404.9199 17.5249 0.2669 701 +703 3 373.9118 405.1991 18.123 0.3305 702 +704 3 372.7827 405.2975 18.4041 0.3686 703 +705 3 371.6398 405.2883 18.3369 0.3813 704 +706 3 370.5302 405.1236 17.836 0.394 705 +707 3 369.4319 404.8467 17.4611 0.394 706 +708 3 368.3703 404.4246 17.367 0.3686 707 +709 3 367.4162 403.7988 17.3606 0.3051 708 +710 3 366.3557 403.3824 17.3653 0.2415 709 +711 3 365.325 403.7977 17.3992 0.2161 710 +712 3 364.3754 404.4292 17.591 0.2034 711 +713 3 363.2875 404.7369 17.9687 0.2161 712 +714 3 362.1629 404.5767 17.7646 0.2034 713 +715 3 361.1494 404.0619 17.4952 0.2161 714 +716 3 360.0957 403.6432 17.8475 0.2034 715 +717 3 359.0227 403.5471 18.7821 0.2288 716 +718 3 357.905 403.7313 19.1559 0.2542 717 +719 3 356.8994 404.1855 18.433 0.2924 718 +720 3 355.8172 404.38 17.6593 0.2796 719 +721 3 354.6789 404.3811 17.3958 0.2542 720 +722 3 353.5418 404.2599 17.4079 0.2415 721 +723 3 352.5328 403.7245 17.5888 0.2796 722 +724 3 351.5981 403.1216 18.2414 0.3178 723 +725 3 350.7058 402.4123 18.461 0.3305 724 +726 3 349.7231 401.8266 18.4772 0.3178 725 +727 3 348.682 401.3518 18.4643 0.3051 726 +728 3 347.593 401.0052 18.3775 0.3178 727 +729 3 346.4993 400.7569 17.8147 0.3178 728 +730 3 345.3702 400.7009 17.3886 0.3051 729 +731 3 344.2536 400.4549 17.3345 0.2669 730 +732 3 343.1806 400.0637 17.1786 0.2542 731 +733 3 342.3523 399.3441 16.3825 0.2415 732 +734 3 341.5801 398.5021 16.242 0.2542 733 +735 3 340.5505 398.0033 16.24 0.2415 734 +736 3 339.4912 397.5732 16.2403 0.2669 735 +737 3 338.5359 396.9428 16.2408 0.2924 736 +738 3 337.7248 396.1363 16.2431 0.3432 737 +739 3 336.8771 394.7978 16.329 0.2669 738 +740 3 336.4367 393.7511 16.6387 0.2924 739 +741 3 335.9242 392.7466 17.0901 0.3051 740 +742 3 335.3419 391.7685 17.3471 0.2669 741 +743 3 334.7436 390.795 17.4815 0.2415 742 +744 3 334.326 389.7436 17.8139 0.2288 743 +745 3 334.2871 388.6248 18.2487 0.2542 744 +746 3 334.3271 387.4854 18.438 0.2542 745 +747 3 334.0434 386.3849 18.4033 0.2288 746 +748 3 333.4554 385.4159 18.1544 0.2034 747 +749 3 332.7839 384.5064 17.733 0.1907 748 +750 3 332.0826 383.6072 17.5101 0.178 749 +751 3 331.4214 382.6806 17.7206 0.1907 750 +752 3 330.7945 381.7288 17.9698 0.2288 751 +753 3 330.0509 380.8696 17.7192 0.3051 752 +754 3 329.1425 380.189 17.4381 0.3432 753 +755 3 328.1427 379.6353 17.3648 0.3178 754 +756 3 327.2183 378.9626 17.36 0.2415 755 +757 3 326.5342 378.052 17.36 0.1652 756 +758 3 326.016 377.0327 17.3589 0.1271 757 +759 3 325.4588 376.0339 17.3541 0.1398 758 +760 3 324.6626 375.2171 17.3278 0.178 759 +761 3 323.6902 374.6234 17.1699 0.2288 760 +762 3 322.6858 374.1029 16.7479 0.2415 761 +763 3 321.7042 373.5366 16.3685 0.2288 762 +764 3 320.7799 372.8651 16.2784 0.2034 763 +765 3 319.9242 372.1077 16.3951 0.2034 764 +766 3 319.0364 371.395 16.6676 0.2161 765 +767 3 318.0789 370.7944 17.0937 0.2415 766 +768 3 317.134 370.2178 17.7873 0.2415 767 +769 3 316.3606 369.3873 18.086 0.2669 768 +770 3 315.6605 368.4881 17.8794 0.2796 769 +771 3 314.9032 367.6416 17.533 0.3305 770 +772 3 314.06 366.8728 17.3799 0.3305 771 +773 3 313.1872 366.1326 17.3597 0.3305 772 +774 3 312.3429 365.3604 17.3541 0.2669 773 +775 3 311.6359 364.4624 17.323 0.2542 774 +776 3 310.8385 363.6456 17.1573 0.2161 775 +777 3 309.8387 363.2292 16.2884 0.2288 776 +778 3 308.7942 362.8516 15.6125 0.1907 777 +779 3 307.8996 362.179 16.1476 0.1907 778 +780 3 307.0107 361.5326 16.9168 0.178 779 +781 3 306.1939 360.9091 18.1496 0.1907 780 +782 3 305.4549 360.0465 18.4584 0.1907 781 +783 3 304.5202 359.3865 18.4741 0.1907 782 +784 3 303.4174 359.0844 18.443 0.2034 783 +785 3 302.2917 358.9014 18.244 0.2288 784 +786 3 301.2472 358.5994 17.3774 0.2542 785 +787 3 300.6306 357.7071 16.4881 0.2542 786 +788 3 300.1856 356.8136 15.12 0.2288 787 +789 3 336.5236 395.4545 15.8169 0.2161 738 +790 3 335.4677 395.6249 15.9572 0.2034 789 +791 3 334.429 395.9727 16.354 0.2288 790 +792 3 333.5561 396.6614 16.0087 0.2288 791 +793 3 332.7198 397.4245 15.6758 0.2161 792 +794 3 331.8206 398.0662 15.0637 0.178 793 +795 3 331.0805 398.8716 14.4516 0.178 794 +796 3 330.1378 399.4859 14.7476 0.1652 795 +797 3 329.2798 400.1437 15.3667 0.1907 796 +798 3 328.28 400.6597 15.0948 0.2034 797 +799 3 327.1771 400.948 15.2197 0.2542 798 +800 3 326.1121 401.2626 14.9369 0.2669 799 +801 3 325.166 401.735 14.8296 0.2669 800 +802 3 324.2371 402.2624 15.2429 0.2161 801 +803 3 323.3047 402.9179 15.1519 0.178 802 +804 3 322.4547 403.6593 15.398 0.1652 803 +805 3 321.4674 404.1077 15.5344 0.2161 804 +806 3 320.4058 404.4349 15.0167 0.2669 805 +807 3 319.3682 404.7666 15.3252 0.3178 806 +808 3 318.3397 405.2059 15.8337 0.3051 807 +809 3 317.4543 405.8729 15.416 0.3051 808 +810 3 316.5585 406.5719 15.2048 0.2924 809 +811 3 315.5015 406.9277 15.5529 0.3051 810 +812 3 314.433 407.2228 16.2375 0.2924 811 +813 3 313.4491 407.7662 16.6023 0.2796 812 +814 3 312.5751 408.4972 16.525 0.2669 813 +815 3 311.5318 408.932 16.5108 0.2542 814 +816 3 310.6052 409.4959 15.7114 0.2415 815 +817 3 309.7952 409.8952 14.0 0.2288 816 +818 3 375.8806 404.1523 15.6237 0.2415 701 +819 3 375.7788 403.1948 14.4864 0.2161 818 +820 3 375.7342 402.0519 14.436 0.1907 819 +821 3 375.558 400.9342 14.3072 0.2161 820 +822 3 374.9895 400.0248 14.6616 0.2796 821 +823 3 374.1292 399.3395 14.8022 0.3178 822 +824 3 373.1648 398.7687 14.8904 0.2924 823 +825 3 372.1409 398.3854 14.4376 0.2669 824 +826 3 371.2646 397.7699 13.6167 0.2542 825 +827 3 370.6263 396.8467 13.512 0.2669 826 +828 3 370.0176 395.9098 13.0158 0.2542 827 +829 3 369.2569 395.0712 12.8288 0.2288 828 +830 3 368.4961 394.3929 13.9574 0.2288 829 +831 3 367.8109 393.7213 12.8106 0.2542 830 +832 3 367.1691 392.8016 12.4958 0.3051 831 +833 3 366.6348 391.7925 12.3592 0.3178 832 +834 3 365.9645 390.8773 12.6658 0.3178 833 +835 3 365.0504 390.3328 13.6578 0.2924 834 +836 3 364.7289 389.8592 12.4785 0.178 835 +837 3 363.7085 389.5492 12.574 0.1907 836 +838 3 362.6709 389.087 12.4261 0.1907 837 +839 3 361.814 388.3697 12.899 0.2161 838 +840 3 361.0338 387.6032 13.5598 0.2415 839 +841 3 360.2673 387.0861 11.9347 0.2669 840 +842 3 359.2595 386.7486 11.1958 0.2415 841 +843 3 358.1612 386.5233 11.6124 0.2161 842 +844 3 357.1476 386.2316 12.1327 0.178 843 +845 3 356.1444 386.0977 12.7039 0.178 844 +846 3 355.0484 385.9192 12.0369 0.178 845 +847 3 354.1641 385.2798 11.6301 0.2161 846 +848 3 353.8872 384.2273 12.1526 0.2288 847 +849 3 353.5143 383.2766 13.3756 0.2542 848 +850 3 352.6231 382.6131 13.2958 0.2542 849 +851 3 351.7869 382.2973 11.6094 0.2924 850 +852 3 350.7104 381.9816 12.0772 0.3051 851 +853 3 349.5755 381.8695 12.3161 0.3051 852 +854 3 348.5654 381.4188 12.8344 0.2669 853 +855 3 348.3034 380.3308 12.5871 0.2288 854 +856 3 347.5975 379.6341 11.2823 0.2034 855 +857 3 346.6331 379.1765 10.5073 0.1907 856 +858 3 345.8186 378.4032 10.8609 0.2161 857 +859 3 344.8828 377.8129 11.5433 0.2288 858 +860 3 343.8681 377.3656 12.0226 0.2415 859 +861 3 342.7664 377.3244 12.6683 0.2034 860 +862 3 341.746 377.1104 12.794 0.1907 861 +863 3 340.9017 376.4698 11.9188 0.1652 862 +864 3 340.0769 375.915 10.5459 0.178 863 +865 3 339.1194 375.3967 10.9444 0.1652 864 +866 3 338.1126 375.1256 10.0523 0.1652 865 +867 3 337.4342 374.4712 9.6838 0.1525 866 +868 3 337.1974 373.7311 9.2943 0.1652 867 +869 3 336.3017 373.1339 10.0537 0.1907 868 +870 3 335.3956 372.4372 10.1556 0.2161 869 +871 3 334.5422 371.6867 10.3236 0.2288 870 +872 3 333.746 370.966 9.9005 0.2161 871 +873 3 332.9006 370.4158 10.1909 0.1907 872 +874 3 332.0403 369.8987 9.548 0.1525 873 +875 3 331.4465 369.0944 8.2648 0.1398 874 +876 3 330.8574 368.1323 8.6489 0.1652 875 +877 3 330.044 367.3384 8.96 0.2161 876 +878 3 365.2723 389.5126 12.3609 0.2288 835 +879 3 365.3089 388.3972 12.7406 0.2161 878 +880 3 365.3135 387.3161 13.4971 0.2161 879 +881 3 365.1945 386.2041 13.685 0.2288 880 +882 3 364.896 385.194 13.5094 0.2415 881 +883 3 364.6443 384.2147 12.4432 0.2669 882 +884 3 363.9339 383.4585 11.8628 0.2924 883 +885 3 363.0198 383.0707 12.2265 0.2796 884 +886 3 362.1252 382.7172 13.7298 0.2415 885 +887 3 361.0739 382.4975 14.5516 0.2034 886 +888 3 359.9859 382.2676 14.2708 0.2161 887 +889 3 359.2091 382.2539 15.6988 0.2415 888 +890 3 358.1143 382.3442 16.3769 0.2796 889 +891 3 356.9806 382.2424 16.13 0.2669 890 +892 3 355.8801 382.0651 15.5753 0.2542 891 +893 3 354.7441 382.0399 15.8438 0.2288 892 +894 3 353.6573 381.7379 15.9004 0.2542 893 +895 3 352.7821 381.0172 15.9564 0.2669 894 +896 3 351.9047 380.4349 17.0274 0.2796 895 +897 3 351.0112 380.0242 18.3036 0.2415 896 +898 3 349.8958 379.983 18.2804 0.2288 897 +899 3 349.0115 380.2176 18.3271 0.1907 898 +900 3 348.2542 380.4258 20.2182 0.2034 899 +901 3 347.1319 380.4715 19.9973 0.1907 900 +902 3 346.2808 379.7268 20.4064 0.2034 901 +903 3 345.4994 378.9614 21.1781 0.1652 902 +904 3 344.6929 378.1652 20.8482 0.1652 903 +905 3 343.8281 377.5006 20.3529 0.2034 904 +906 3 343.359 376.6105 19.1307 0.2669 905 +907 3 342.676 375.7491 19.1097 0.3051 906 +908 3 341.8501 375.0776 20.0525 0.2669 907 +909 3 340.8948 374.6497 20.244 0.2288 908 +910 3 339.8321 374.4049 20.5884 0.1652 909 +911 3 338.7167 374.2779 20.8376 0.1398 910 +912 3 337.6276 374.4609 20.3302 0.1271 911 +913 3 336.6243 374.6257 19.1103 0.1398 912 +914 3 335.7583 375.0043 17.5806 0.1525 913 +915 3 335.2767 375.3258 15.2032 0.1398 914 +916 3 334.7927 375.9401 13.1737 0.1398 915 +917 3 333.9336 376.6048 12.32 0.1525 916 +918 4 417.8826 404.2438 16.2112 0.1907 1 +919 4 418.6617 403.4156 16.5152 0.2669 918 +920 4 419.5494 402.7212 16.996 0.3178 919 +921 4 420.4177 401.9913 17.3516 0.3432 920 +922 4 421.2528 401.2145 17.5703 0.3813 921 +923 4 422.0719 400.4423 18.0701 0.4322 922 +924 4 422.8865 399.6518 18.4279 0.4957 923 +925 4 423.8211 398.994 18.471 0.4957 924 +926 4 424.7889 398.3843 18.4444 0.483 925 +927 4 425.6378 397.6189 18.3282 0.4576 926 +928 4 426.3265 396.7255 17.8595 0.4576 927 +929 4 426.9545 395.7862 17.4224 0.4703 928 +930 4 427.5883 394.839 17.183 0.4703 929 +931 4 428.1534 393.8735 16.6026 0.4703 930 +932 4 428.5149 392.8404 15.7884 0.4576 931 +933 4 428.8261 391.7605 15.258 0.483 932 +934 4 429.2094 390.684 15.122 0.5212 933 +935 4 429.7367 389.6693 15.1203 0.5466 934 +936 4 430.4392 388.7667 15.122 0.5212 935 +937 4 431.2194 387.9304 15.1276 0.483 936 +938 4 431.8794 386.9958 15.1556 0.4576 937 +939 4 432.4926 386.0314 15.3023 0.483 938 +940 4 432.8679 384.9938 16.0384 0.483 939 +941 4 433.187 383.9378 16.7815 0.4703 940 +942 4 433.465 382.8293 16.9322 0.3813 941 +943 4 433.2465 381.7917 15.8844 0.3051 942 +944 4 433.2202 380.6935 15.3969 0.2796 943 +945 4 433.4833 380.2885 15.9138 0.2161 944 +946 4 434.4214 379.665 16.3817 0.2288 945 +947 4 435.2359 378.9191 17.113 0.2542 946 +948 4 435.9956 378.0828 17.5501 0.2669 947 +949 4 436.5973 377.1505 18.2277 0.2669 948 +950 4 437.1201 376.1392 18.5153 0.2796 949 +951 4 437.1704 375.0089 18.9188 0.2924 950 +952 4 436.9611 373.913 19.5294 0.2924 951 +953 4 437.31 372.8239 19.5992 0.2669 952 +954 4 438.0799 371.9773 19.6 0.2542 953 +955 4 438.8716 371.1514 19.6003 0.2669 954 +956 4 439.5912 370.2625 19.6011 0.2924 955 +957 4 440.3393 369.3965 19.6056 0.3178 956 +958 4 441.3552 368.8714 19.6291 0.3051 957 +959 4 441.8231 368.9606 19.7282 0.2415 958 +960 4 442.9431 369.0658 20.1312 0.2415 959 +961 4 444.0528 368.9125 20.5503 0.2034 960 +962 4 445.1704 368.6918 20.706 0.178 961 +963 4 446.3007 368.7261 20.7203 0.1907 962 +964 4 447.4207 368.9526 20.722 0.2288 963 +965 4 448.5532 369.0704 20.734 0.2669 964 +966 4 449.6858 368.9583 20.8177 0.2924 965 +967 4 450.8081 368.7821 21.1067 0.2924 966 +968 4 451.9383 368.6414 21.336 0.2669 967 +969 4 453.0332 368.4469 20.8888 0.2415 968 +970 4 454.1062 368.2994 20.011 0.2288 969 +971 4 455.2193 368.2811 19.8976 0.2415 970 +972 4 456.2821 368.3463 20.8253 0.2669 971 +973 4 457.3655 368.3977 21.6591 0.3178 972 +974 4 458.4877 368.3257 22.1435 0.3559 973 +975 4 459.6134 368.2582 22.6036 0.3813 974 +976 4 460.7506 368.2136 22.7035 0.3559 975 +977 4 461.8797 368.0889 22.4378 0.3051 976 +978 4 463.0077 367.9184 22.3107 0.2542 977 +979 4 464.1425 367.9253 22.4608 0.2161 978 +980 4 465.2705 368.0751 22.7388 0.2161 979 +981 4 466.4065 368.1655 22.8004 0.1907 980 +982 4 467.5368 368.1083 22.4792 0.1907 981 +983 4 468.5927 367.7422 22.0679 0.178 982 +984 4 469.509 367.0776 21.9904 0.1907 983 +985 4 470.3579 366.3614 22.5686 0.1907 984 +986 4 471.1896 365.7688 23.7899 0.1907 985 +987 4 472.1425 365.3135 24.8046 0.1907 986 +988 4 473.1424 364.8124 25.3397 0.178 987 +989 4 474.0633 364.1489 25.3364 0.1525 988 +990 4 474.8161 363.2955 25.2274 0.1398 989 +991 4 475.499 362.3792 25.1012 0.1652 990 +992 4 476.0424 361.3839 24.8108 0.2034 991 +993 4 476.5675 360.3863 25.1084 0.2415 992 +994 4 477.2631 359.502 25.5441 0.2415 993 +995 4 477.7813 358.525 26.1691 0.2669 994 +996 4 478.2824 357.5194 26.6826 0.2542 995 +997 4 478.9848 356.7701 27.816 0.2415 996 +998 4 479.9 356.1249 28.0294 0.178 997 +999 4 480.6184 355.2578 28.3545 0.1525 998 +1000 4 481.4284 354.457 28.5085 0.1398 999 +1001 4 482.4637 354.0211 28.1747 0.178 1000 +1002 4 483.5688 354.2293 27.7522 0.1907 1001 +1003 4 484.5355 354.8093 28.1806 0.2161 1002 +1004 4 485.3992 355.5552 28.0 0.2034 1003 +1005 4 441.8322 368.3417 19.6039 0.2542 958 +1006 4 442.6365 367.5283 19.544 0.2542 1005 +1007 4 443.0826 366.5056 19.3245 0.2924 1006 +1008 4 443.1581 365.3753 19.1517 0.3178 1007 +1009 4 443.0769 364.2473 19.4793 0.3432 1008 +1010 4 443.0483 363.1102 19.7378 0.3432 1009 +1011 4 443.3984 362.0508 20.1359 0.3305 1010 +1012 4 444.0207 361.115 20.5783 0.3178 1011 +1013 4 444.8295 360.3154 20.7105 0.3051 1012 +1014 4 445.6646 359.5329 20.7248 0.3051 1013 +1015 4 446.3911 358.652 20.7438 0.3051 1014 +1016 4 446.9963 357.6842 20.8429 0.3051 1015 +1017 4 447.3944 356.6283 21.219 0.3051 1016 +1018 4 447.6415 355.5335 21.7412 0.3051 1017 +1019 4 447.7833 354.4123 22.1581 0.3051 1018 +1020 4 447.9607 353.3004 22.6436 0.3178 1019 +1021 4 448.3279 352.2273 22.923 0.3051 1020 +1022 4 448.9205 351.256 22.9928 0.2796 1021 +1023 4 449.7258 350.4518 23.1165 0.2161 1022 +1024 4 450.3997 349.5515 23.5231 0.178 1023 +1025 4 451.0884 348.6523 23.903 0.1525 1024 +1026 4 452.0058 347.9899 23.8246 0.178 1025 +1027 4 452.7906 347.2017 23.2515 0.2034 1026 +1028 4 453.159 346.1572 22.685 0.2288 1027 +1029 4 453.2288 345.0224 22.6797 0.2288 1028 +1030 4 453.1521 343.8853 22.9085 0.2288 1029 +1031 4 452.9874 342.7584 23.1518 0.2161 1030 +1032 4 452.9439 341.6293 23.5712 0.178 1031 +1033 4 453.151 340.5173 23.9464 0.1398 1032 +1034 4 453.4622 339.4179 24.0705 0.1398 1033 +1035 4 453.7722 338.3174 24.08 0.1652 1034 +1036 4 454.1119 337.2249 24.08 0.2034 1035 +1037 4 454.5295 336.1598 24.08 0.2161 1036 +1038 4 454.931 335.089 24.08 0.2542 1037 +1039 4 455.2228 333.9839 24.0806 0.2796 1038 +1040 4 455.5522 332.888 24.0828 0.2924 1039 +1041 4 456.0087 331.8401 24.1035 0.2542 1040 +1042 4 456.5395 330.8288 24.2483 0.2288 1041 +1043 4 457.068 329.8266 24.6336 0.2288 1042 +1044 4 457.6549 328.8611 25.0659 0.2669 1043 +1045 4 458.3116 327.9379 25.4556 0.2924 1044 +1046 4 458.9877 327.0364 25.9392 0.3051 1045 +1047 4 459.6764 326.1372 26.3222 0.3051 1046 +1048 4 460.3696 325.2426 26.7294 0.2924 1047 +1049 4 461.0228 324.3229 27.1984 0.2669 1048 +1050 4 461.4667 323.2727 27.358 0.2415 1049 +1051 4 461.7195 322.1676 27.0301 0.2415 1050 +1052 4 461.9255 321.0579 26.5815 0.2796 1051 +1053 4 462.1863 319.9459 26.6837 0.3178 1052 +1054 4 462.5844 318.9117 27.3666 0.3432 1053 +1055 4 463.034 317.8924 28.0092 0.3305 1054 +1056 4 463.4401 316.8239 27.9706 0.3305 1055 +1057 4 463.6987 315.7143 28.194 0.3305 1056 +1058 4 463.781 314.6389 29.1231 0.3686 1057 +1059 4 463.8405 313.5178 29.6447 0.4068 1058 +1060 4 464.0933 312.4035 29.7604 0.4449 1059 +1061 4 464.5406 311.359 30.0947 0.4576 1060 +1062 4 465.068 310.3638 30.5673 0.4576 1061 +1063 4 465.7144 309.4245 30.7661 0.483 1062 +1064 4 466.4649 308.5608 30.7104 0.4957 1063 +1065 4 467.2016 307.6948 30.42 0.5084 1064 +1066 4 467.8926 306.8002 29.9897 0.4957 1065 +1067 4 468.6087 305.9113 29.8724 0.5084 1066 +1068 4 469.2368 304.9744 30.2957 0.5084 1067 +1069 4 469.6017 303.9093 30.7555 0.4957 1068 +1070 4 469.6532 302.7813 31.1441 0.4576 1069 +1071 4 469.4598 301.6739 31.663 0.4449 1070 +1072 4 469.3123 300.5482 31.9911 0.4322 1071 +1073 4 469.3603 299.418 32.3327 0.4195 1072 +1074 4 469.7184 298.3575 32.695 0.394 1073 +1075 4 470.4803 297.5132 32.48 0.394 1074 +1076 4 471.3555 296.7936 32.1591 0.4195 1075 +1077 4 472.1986 296.0226 32.2675 0.4195 1076 +1078 4 472.9685 295.1817 32.3302 0.394 1077 +1079 4 473.5737 294.2208 32.233 0.3432 1078 +1080 4 473.9603 293.174 32.7496 0.3305 1079 +1081 4 474.0839 292.0804 33.5017 0.3305 1080 +1082 4 474.1983 290.9661 33.9948 0.3432 1081 +1083 4 474.5598 289.8885 34.1505 0.3432 1082 +1084 4 475.1455 288.908 34.1827 0.3432 1083 +1085 4 475.8354 287.9951 34.263 0.3432 1084 +1086 4 476.5023 287.0788 34.5394 0.3432 1085 +1087 4 477.0114 286.0744 35.0193 0.3432 1086 +1088 4 477.5045 285.0482 35.2526 0.3432 1087 +1089 4 478.0524 284.0438 35.3237 0.3305 1088 +1090 4 478.6244 283.0599 35.5208 0.2924 1089 +1091 4 479.1175 282.0635 36.1455 0.2542 1090 +1092 4 479.471 281.0339 36.9673 0.2542 1091 +1093 4 479.6998 279.9288 37.3386 0.3178 1092 +1094 4 480.0327 278.842 37.1398 0.3559 1093 +1095 4 480.4491 277.7975 36.6484 0.3432 1094 +1096 4 480.9673 276.7828 36.5 0.2669 1095 +1097 4 481.5702 275.8173 36.717 0.2542 1096 +1098 4 482.1983 274.8883 37.2655 0.2924 1097 +1099 4 482.8561 273.9788 37.7818 0.3813 1098 +1100 4 483.3995 273.0099 38.4014 0.4195 1099 +1101 4 483.801 271.9643 38.9617 0.4322 1100 +1102 4 484.3021 270.9758 39.5587 0.4068 1101 +1103 4 485.024 270.095 39.825 0.4068 1102 +1104 4 485.7367 269.2164 40.1181 0.394 1103 +1105 4 486.2835 268.2405 40.6526 0.394 1104 +1106 4 486.7548 267.2041 40.8607 0.3813 1105 +1107 4 487.3634 266.2374 40.9116 0.3559 1106 +1108 4 488.0533 265.3291 41.0572 0.3432 1107 +1109 4 488.8198 264.4997 41.4809 0.3178 1108 +1110 4 489.5988 263.6828 41.9115 0.3432 1109 +1111 4 490.3356 262.8123 41.9958 0.3432 1110 +1112 4 490.9545 261.8513 42.0022 0.3686 1111 +1113 4 491.4796 260.8377 42.0137 0.3686 1112 +1114 4 491.8628 259.7612 42.082 0.3686 1113 +1115 4 492.1808 258.6744 42.3987 0.3178 1114 +1116 4 492.4039 257.5899 43.0895 0.2669 1115 +1117 4 492.6636 256.5157 43.6268 0.2415 1116 +1118 4 493.3237 255.6176 43.8295 0.2542 1117 +1119 4 494.1977 254.9084 43.573 0.2542 1118 +1120 4 494.9585 254.0778 43.9765 0.2415 1119 +1121 4 495.5682 253.1169 44.2299 0.2669 1120 +1122 4 496.1288 252.1204 44.24 0.3305 1121 +1123 4 496.6276 251.0931 44.24 0.394 1122 +1124 4 497.1801 250.0944 44.2408 0.4068 1123 +1125 4 497.6652 249.0591 44.2439 0.3813 1124 +1126 4 498.2566 248.081 44.2593 0.3686 1125 +1127 4 498.8378 247.1029 44.3408 0.3559 1126 +1128 4 499.2736 246.0572 44.6631 0.3432 1127 +1129 4 499.7495 245.0448 45.2012 0.2796 1128 +1130 4 500.1854 243.99 45.3611 0.2161 1129 +1131 4 500.6647 242.9513 45.3718 0.1525 1130 +1132 4 501.0628 241.8816 45.4443 0.1398 1131 +1133 4 501.4324 240.82 45.7716 0.1652 1132 +1134 4 502.0318 239.8808 46.3943 0.2161 1133 +1135 4 502.7194 238.9896 46.8552 0.2542 1134 +1136 4 503.5133 238.1888 47.2749 0.2415 1135 +1137 4 504.3713 237.4383 47.2114 0.2288 1136 +1138 4 505.211 236.6833 46.9571 0.2288 1137 +1139 4 505.8802 235.7773 47.2982 0.2542 1138 +1140 4 506.2589 234.7477 47.948 0.2415 1139 +1141 4 506.2932 233.6277 48.4722 0.1907 1140 +1142 4 506.3653 232.526 48.743 0.1652 1141 +1143 4 506.8881 231.5113 48.8684 0.178 1142 +1144 4 507.4795 230.5446 49.2282 0.2415 1143 +1145 4 508.0607 229.5756 49.6283 0.2542 1144 +1146 4 508.6224 228.5804 49.6605 0.2542 1145 +1147 4 509.1818 227.5851 49.5485 0.2161 1146 +1148 4 509.7286 226.5818 49.672 0.2034 1147 +1149 4 510.2286 225.5602 49.9223 0.1907 1148 +1150 4 510.5729 224.4814 50.2026 0.2034 1149 +1151 4 510.8864 223.4095 50.673 0.2288 1150 +1152 4 511.495 222.4565 50.9477 0.2669 1151 +1153 4 512.2638 221.6111 50.9793 0.2924 1152 +1154 4 513.0634 220.7931 51.0577 0.2924 1153 +1155 4 513.8631 219.9855 51.3369 0.2542 1154 +1156 4 514.6295 219.1584 51.7818 0.1907 1155 +1157 4 515.348 218.2752 52.015 0.178 1156 +1158 4 516.0595 217.3829 51.9126 0.2034 1157 +1159 4 516.6979 216.4482 51.5704 0.3051 1158 +1160 4 517.2093 215.4381 51.2333 0.3686 1159 +1161 4 517.7 214.4096 51.3204 0.4576 1160 +1162 4 518.2034 213.4029 51.8064 0.4703 1161 +1163 4 518.7308 212.4214 52.4367 0.4957 1162 +1164 4 519.3337 211.4913 53.1143 0.483 1163 +1165 4 520.0281 210.6207 53.7541 0.483 1164 +1166 4 520.7305 209.7387 54.1464 0.4449 1165 +1167 4 521.3185 208.7651 54.122 0.3559 1166 +1168 4 521.7773 207.7264 53.7816 0.3051 1167 +1169 4 522.2852 206.7185 53.5161 0.2796 1168 +1170 4 522.9659 205.809 53.7121 0.3432 1169 +1171 4 523.7243 204.967 54.0977 0.3686 1170 +1172 4 524.4782 204.1113 54.2895 0.4195 1171 +1173 4 525.2173 203.2385 54.322 0.4322 1172 +1174 4 525.9918 202.3988 54.3284 0.4576 1173 +1175 4 526.7914 201.5808 54.3528 0.4322 1174 +1176 4 527.5762 200.7503 54.467 0.3813 1175 +1177 4 528.3141 199.8877 54.7912 0.3178 1176 +1178 4 529.0234 199.0148 55.2992 0.2669 1177 +1179 4 529.7647 198.1648 55.7519 0.2415 1178 +1180 4 530.5071 197.3091 55.7522 0.2542 1179 +1181 4 531.1272 196.3745 55.2608 0.3051 1180 +1182 4 531.6271 195.3643 55.1004 0.3686 1181 +1183 4 532.1476 194.3748 55.6396 0.394 1182 +1184 4 532.7905 193.471 56.2724 0.3686 1183 +1185 4 533.5971 192.6851 56.6656 0.3305 1184 +1186 4 534.5157 192.025 57.0497 0.3051 1185 +1187 4 535.3966 191.3248 57.4538 0.3559 1186 +1188 4 536.1013 190.4394 57.6503 0.4195 1187 +1189 4 536.6241 189.4247 57.6764 0.483 1188 +1190 4 537.0542 188.3653 57.664 0.4322 1189 +1191 4 537.442 187.29 57.575 0.3432 1190 +1192 4 537.7361 186.1952 57.265 0.2415 1191 +1193 4 538.0827 185.1267 56.8378 0.2288 1192 +1194 4 538.6124 184.1211 56.6625 0.2415 1193 +1195 4 539.1935 183.1521 56.9904 0.2669 1194 +1196 4 539.6957 182.2243 57.9933 0.2415 1195 +1197 4 540.0721 181.2393 59.0075 0.2415 1196 +1198 4 540.5732 180.2452 59.5022 0.2288 1197 +1199 4 541.3877 179.4902 59.9348 0.2542 1198 +1200 4 542.2331 178.734 60.121 0.2415 1199 +1201 4 542.7422 177.7387 60.305 0.2669 1200 +1202 4 543.1655 176.6919 60.7309 0.3178 1201 +1203 4 543.7512 175.7218 61.0112 0.3813 1202 +1204 4 544.4376 174.8089 61.1341 0.4322 1203 +1205 4 545.1332 173.9086 61.4228 0.4068 1204 +1206 4 545.7612 172.9705 61.8517 0.3813 1205 +1207 4 546.4179 172.0404 62.0718 0.3305 1206 +1208 4 547.1878 171.1996 61.9791 0.3432 1207 +1209 4 548.0263 170.4423 61.5717 0.3559 1208 +1210 4 548.786 169.6037 61.1999 0.394 1209 +1211 4 549.3934 168.6416 61.2209 0.394 1210 +1212 4 549.9734 167.6749 61.6641 0.3813 1211 +1213 4 550.6164 166.746 62.0886 0.3178 1212 +1214 4 551.3302 165.8583 62.3258 0.2415 1213 +1215 4 552.1619 165.0964 62.7326 0.1907 1214 +1216 4 553.0474 164.3882 63.1151 0.178 1215 +1217 4 553.7097 163.4707 63.1481 0.2161 1216 +1218 4 554.2074 162.4503 62.8586 0.2161 1217 +1219 4 555.0688 161.7364 63.0011 0.2288 1218 +1220 4 556.1785 161.5191 63.2559 0.2288 1219 +1221 4 557.1555 160.9402 63.3847 0.2796 1220 +1222 4 557.9437 160.1268 63.7448 0.3051 1221 +1223 4 558.7079 159.3077 64.3082 0.2796 1222 +1224 4 559.5087 158.5184 64.832 0.2161 1223 +1225 4 560.3964 157.8285 65.3447 0.1907 1224 +1226 4 560.886 156.8046 65.2392 0.2288 1225 +1227 4 561.9191 156.323 65.4396 0.2669 1226 +1228 4 562.8388 155.6652 65.0538 0.2669 1227 +1229 4 563.8902 155.2202 65.2123 0.2161 1228 +1230 4 564.8145 154.6036 65.5908 0.2034 1229 +1231 4 565.3831 153.6712 66.3491 0.1907 1230 +1232 4 566.2297 152.9208 66.5487 0.2161 1231 +1233 4 567.2627 152.4437 66.6935 0.1907 1232 +1234 4 568.3484 152.1497 67.1779 0.1907 1233 +1235 4 569.4271 151.8946 67.664 0.1652 1234 +1236 4 570.2726 151.2093 68.3402 0.1652 1235 +1237 4 570.856 150.2804 69.1054 0.1398 1236 +1238 4 571.571 149.4258 69.7385 0.1271 1237 +1239 4 572.2334 148.5278 70.3492 0.1144 1238 +1240 4 572.9152 147.6412 70.7935 0.1144 1239 +1241 4 573.7412 146.853 70.8347 0.1144 1240 +1242 4 574.3509 145.9103 70.784 0.1144 1241 +1243 4 574.693 144.8201 70.6577 0.1144 1242 +1244 4 575.2204 143.8305 70.56 0.1144 1243 +1245 4 576.0509 143.0561 70.7482 0.1144 1244 +1246 4 576.9455 142.5424 71.6853 0.1144 1245 +1247 4 577.9351 142.1786 72.4679 0.1271 1246 +1248 4 578.8171 141.4991 72.6986 0.1525 1247 +1249 4 579.5069 140.5953 72.9848 0.178 1248 +1250 4 580.3501 139.9638 73.619 0.178 1249 +1251 4 581.3019 139.4193 74.2899 0.1525 1250 +1252 4 582.1633 138.6814 74.5898 0.1398 1251 +1253 4 583.0831 138.0328 74.9073 0.1398 1252 +1254 4 584.0681 137.4619 75.1097 0.1525 1253 +1255 4 585.1114 137.018 75.2102 0.1525 1254 +1256 4 586.181 136.6302 75.4656 0.1525 1255 +1257 4 587.1763 136.1509 76.1211 0.1525 1256 +1258 4 588.1842 135.7345 76.9266 0.1398 1257 +1259 4 589.2481 135.3489 77.2178 0.1271 1258 +1260 4 590.0912 134.6625 77.9108 0.1144 1259 +1261 4 590.7627 133.7485 78.1071 0.1144 1260 +1262 4 591.694 133.1044 78.12 0.1144 1261 +1263 4 592.203 132.1023 78.12 0.1144 1262 +1264 4 592.2545 130.9628 78.12 0.1144 1263 +1265 4 593.1285 130.2524 78.12 0.1398 1264 +1266 4 594.0792 129.6152 78.12 0.1907 1265 +1267 4 432.7855 379.5861 15.1883 0.3813 944 +1268 4 432.3794 378.5187 15.2043 0.3305 1267 +1269 4 431.9538 377.4639 15.4969 0.2924 1268 +1270 4 431.5832 376.4035 16.0068 0.2669 1269 +1271 4 431.2125 375.327 16.1736 0.2669 1270 +1272 4 430.859 374.2436 15.9807 0.2669 1271 +1273 4 430.4392 373.2003 15.5008 0.2415 1272 +1274 4 429.7344 372.3274 15.1698 0.2288 1273 +1275 4 428.7804 371.7188 15.0592 0.2161 1274 +1276 4 427.6821 371.4431 14.9531 0.2288 1275 +1277 4 426.5759 371.1639 15.073 0.2034 1276 +1278 4 425.743 370.5061 15.8942 0.1907 1277 +1279 4 424.9971 369.6619 16.2106 0.2034 1278 +1280 4 424.2787 368.7718 16.24 0.2796 1279 +1281 4 423.5534 367.8864 16.2397 0.3432 1280 +1282 4 422.7641 367.0593 16.238 0.3813 1281 +1283 4 421.9484 366.2573 16.2327 0.3686 1282 +1284 4 421.1053 365.484 16.2064 0.3432 1283 +1285 4 420.1649 364.8399 16.0611 0.3051 1284 +1286 4 419.1216 364.4349 15.573 0.2669 1285 +1287 4 418.2109 363.8469 14.747 0.2669 1286 +1288 4 417.6 362.9271 14.1554 0.2796 1287 +1289 4 416.9743 361.9742 14.0112 0.3051 1288 +1290 4 416.3325 361.027 14.0 0.2924 1289 +1291 4 415.542 360.2056 14.0 0.2924 1290 +1292 4 414.5925 359.5729 14.0 0.3178 1291 +1293 4 413.7116 358.8465 14.0 0.3559 1292 +1294 4 412.9474 357.9965 14.0008 0.3559 1293 +1295 4 412.2884 357.063 14.0042 0.2924 1294 +1296 4 411.7634 356.0483 14.0263 0.2161 1295 +1297 4 411.3275 354.9924 14.1529 0.1907 1296 +1298 4 410.7624 354.0097 14.4917 0.2161 1297 +1299 4 410.0782 353.0967 14.6748 0.2542 1298 +1300 4 409.4731 352.1404 14.3363 0.2542 1299 +1301 4 408.9571 351.1256 14.065 0.2415 1300 +1302 4 408.567 350.0526 14.0045 0.2161 1301 +1303 4 408.2192 348.9623 14.0022 0.1907 1302 +1304 4 408.0145 347.8378 14.0148 0.1525 1303 +1305 4 408.0991 346.7018 14.0997 0.1271 1304 +1306 4 408.3474 345.5864 14.2066 0.1144 1305 +1307 4 408.6528 344.4847 14.11 0.1144 1306 +1308 4 409.1836 343.4746 14.1131 0.1398 1307 +1309 4 409.3781 342.3637 14.2369 0.178 1308 +1310 4 408.8061 341.3788 13.9762 0.2288 1309 +1311 4 408.2055 340.4292 13.4532 0.2415 1310 +1312 4 407.6324 339.4408 13.2989 0.2542 1311 +1313 4 407.0444 338.4604 13.2255 0.2415 1312 +1314 4 406.4037 337.5223 12.9178 0.2542 1313 +1315 4 405.715 336.6083 12.8803 0.2542 1314 +1316 4 405.0366 335.6874 12.8822 0.2796 1315 +1317 4 404.3662 334.7607 12.8909 0.2796 1316 +1318 4 403.713 333.8226 12.9338 0.2669 1317 +1319 4 402.982 332.9463 13.1244 0.2288 1318 +1320 4 402.1915 332.141 13.5626 0.2034 1319 +1321 4 401.584 331.1869 13.7536 0.1907 1320 +1322 4 401.3381 330.0818 13.3683 0.2034 1321 +1323 4 401.155 328.9629 13.0029 0.2034 1322 +1324 4 400.9194 327.8441 12.9514 0.2034 1323 +1325 4 400.6322 326.7424 13.1916 0.1907 1324 +1326 4 400.2227 325.6934 13.6335 0.1907 1325 +1327 4 399.5843 324.7587 13.9412 0.178 1326 +1328 4 398.7275 324.0025 13.9969 0.1652 1327 +1329 4 397.794 323.3436 13.9838 0.178 1328 +1330 4 396.7987 322.7807 13.9121 0.2161 1329 +1331 4 395.7531 322.3403 13.627 0.2415 1330 +1332 4 394.7246 321.9399 13.1566 0.2288 1331 +1333 4 393.965 321.1231 13.4946 0.2415 1332 +1334 4 393.4388 320.1084 13.5055 0.2924 1333 +1335 4 392.8668 319.1371 13.1827 0.3559 1334 +1336 4 392.2513 318.2082 12.773 0.3432 1335 +1337 4 391.7125 317.2049 13.0141 0.2924 1336 +1338 4 391.2102 316.1959 13.1648 0.2288 1337 +1339 4 390.7675 315.1846 13.3658 0.2034 1338 +1340 4 390.2104 314.2396 14.1053 0.178 1339 +1341 4 389.7471 313.2066 14.2864 0.178 1340 +1342 4 389.4233 312.1656 13.65 0.1907 1341 +1343 4 389.2666 311.128 12.5566 0.2288 1342 +1344 4 389.0801 310.056 11.7642 0.2542 1343 +1345 4 388.8731 308.9566 11.2566 0.2415 1344 +1346 4 388.4784 307.9408 10.9614 0.2288 1345 +1347 4 387.7439 307.0656 10.8175 0.2288 1346 +1348 4 387.4122 306.0337 10.2435 0.2796 1347 +1349 4 386.6949 305.2329 10.4885 0.3305 1348 +1350 4 386.06 304.3074 10.2015 0.3559 1349 +1351 4 385.5497 303.3362 9.4259 0.3559 1350 +1352 4 385.1962 302.302 8.6097 0.3178 1351 +1353 4 384.8004 301.293 9.3607 0.2924 1352 +1354 4 384.1255 300.451 10.2819 0.2669 1353 +1355 4 383.24 299.728 10.36 0.2542 1354 +1356 4 433.4948 381.6235 18.1658 0.2924 943 +1357 4 434.1228 381.4668 20.2387 0.2034 1356 +1358 4 435.1067 381.4634 21.6325 0.1652 1357 +1359 4 436.1672 381.659 22.4507 0.178 1358 +1360 4 436.6911 382.4678 22.3471 0.2288 1359 +1361 4 436.7083 383.5981 22.1788 0.2542 1360 +1362 4 436.6362 384.7203 22.5845 0.2542 1361 +1363 4 436.6419 385.8449 23.0667 0.2415 1362 +1364 4 436.6934 386.9774 22.9566 0.2034 1363 +1365 4 437.0206 388.0288 22.3874 0.2034 1364 +1366 4 437.4542 389.0767 22.2429 0.2034 1365 +1367 4 438.0296 390.0422 21.9145 0.2542 1366 +1368 4 438.605 391.0181 22.008 0.2669 1367 +1369 4 439.2159 391.9813 22.1278 0.2924 1368 +1370 4 440.1883 392.495 22.0937 0.2669 1369 +1371 4 441.2946 392.7821 22.1236 0.2669 1370 +1372 4 442.2052 393.4319 22.2919 0.2542 1371 +1373 4 442.6628 394.4501 22.0623 0.2924 1372 +1374 4 442.8676 395.5712 21.9512 0.3178 1373 +1375 4 443.0678 396.6957 21.7955 0.3432 1374 +1376 4 443.578 397.6979 22.1746 0.3178 1375 +1377 4 444.1752 398.4712 20.8544 0.2924 1376 +1378 4 444.8215 399.4093 20.6668 0.2796 1377 +1379 4 445.5239 400.2353 21.56 0.3305 1378 +1380 4 446.2469 400.7832 21.866 0.2415 1379 +1381 4 447.2445 401.0967 22.9942 0.2542 1380 +1382 4 448.3073 401.4468 22.468 0.2415 1381 +1383 4 449.3438 401.8712 22.9359 0.2034 1382 +1384 4 450.45 401.8735 23.4702 0.1652 1383 +1385 4 451.4704 401.798 22.7223 0.1525 1384 +1386 4 452.3536 401.2237 22.8262 0.178 1385 +1387 4 453.3615 401.1001 23.6088 0.2034 1386 +1388 4 454.3076 401.5692 24.2589 0.2415 1387 +1389 4 455.1564 402.2487 25.0524 0.2669 1388 +1390 4 456.0762 402.8825 24.876 0.3051 1389 +1391 4 457.0074 403.4728 24.1343 0.3432 1390 +1392 4 457.8631 404.1638 23.4262 0.3432 1391 +1393 4 458.8138 404.6854 23.5626 0.3305 1392 +1394 4 459.6478 405.1979 24.885 0.2924 1393 +1395 4 460.4909 405.6372 26.4256 0.2669 1394 +1396 4 461.31 406.3351 27.1762 0.2161 1395 +1397 4 462.0994 407.0741 28.0036 0.1652 1396 +1398 4 462.7903 407.8131 27.83 0.1398 1397 +1399 4 462.7194 408.9388 27.9446 0.1398 1398 +1400 4 462.6725 410.0451 27.6965 0.1652 1399 +1401 4 462.7091 411.1399 28.5046 0.178 1400 +1402 4 462.8578 412.2129 29.0987 0.2034 1401 +1403 4 463.1896 413.1853 29.6456 0.2161 1402 +1404 4 463.2296 413.9427 31.7198 0.2161 1403 +1405 4 463.5328 414.7023 31.9715 0.2161 1404 +1406 4 463.8234 415.4711 33.2511 0.2288 1405 +1407 4 463.892 414.8647 35.1758 0.2669 1406 +1408 4 464.3496 414.684 37.4198 0.2796 1407 +1409 4 464.496 415.7216 38.4462 0.2796 1408 +1410 4 465.274 416.4412 39.0706 0.2542 1409 +1411 4 466.3505 416.8187 38.8654 0.2288 1410 +1412 4 467.276 417.3861 38.7335 0.178 1411 +1413 4 468.0504 417.8712 39.6371 0.1652 1412 +1414 4 469.1235 417.7362 40.3908 0.1652 1413 +1415 4 470.0845 417.9467 41.4809 0.2161 1414 +1416 4 471.0031 418.3608 42.7941 0.2542 1415 +1417 4 472.067 418.6846 43.1575 0.3178 1416 +1418 4 473.1492 419.0495 43.0648 0.3305 1417 +1419 4 474.2521 419.3046 43.3112 0.3051 1418 +1420 4 475.3331 419.0644 43.7108 0.2288 1419 +1421 4 476.3216 418.5232 44.1465 0.1907 1420 +1422 4 477.3409 418.8584 44.2198 0.1907 1421 +1423 4 478.4677 418.9431 44.093 0.2288 1422 +1424 4 479.5648 419.038 44.7714 0.2796 1423 +1425 4 480.6116 419.387 45.4728 0.3178 1424 +1426 4 481.6274 419.9063 45.5703 0.3686 1425 +1427 4 482.7497 420.102 45.7131 0.3813 1426 +1428 4 483.7976 420.5344 45.36 0.3686 1427 +1429 4 445.461 401.679 21.9845 0.2924 1379 +1430 4 445.1659 402.7727 21.7115 0.2924 1429 +1431 4 445.1945 403.8549 21.4799 0.3051 1430 +1432 4 445.771 404.8067 21.3013 0.3051 1431 +1433 4 446.2687 405.7619 21.8425 0.2924 1432 +1434 4 446.3808 406.851 21.9724 0.2924 1433 +1435 4 446.2904 407.979 21.6037 0.2669 1434 +1436 4 445.9415 409.0509 21.4144 0.2542 1435 +1437 4 445.5422 410.0588 22.0562 0.2542 1436 +1438 4 445.0618 411.0598 22.4006 0.3051 1437 +1439 4 444.833 412.1512 22.5826 0.3686 1438 +1440 4 444.9577 413.2792 22.7581 0.3686 1439 +1441 4 444.9039 414.4094 22.9611 0.3178 1440 +1442 4 444.8009 415.5466 22.9653 0.2415 1441 +1443 4 444.6534 416.6711 23.2529 0.2288 1442 +1444 4 444.7128 417.7991 23.1344 0.2669 1443 +1445 4 445.191 418.815 22.8724 0.3051 1444 +1446 4 445.6635 419.8263 23.3646 0.3051 1445 +1447 4 446.0021 420.8948 23.0208 0.2669 1446 +1448 4 446.3842 421.9129 22.1598 0.2542 1447 +1449 4 446.8464 422.9162 22.7094 0.2415 1448 +1450 4 447.2182 423.9858 22.678 0.2415 1449 +1451 4 447.2743 425.1173 22.5464 0.2288 1450 +1452 4 447.3784 426.2132 23.0896 0.2161 1451 +1453 4 447.0329 427.284 23.5656 0.2034 1452 +1454 4 446.6851 428.3308 24.3158 0.1907 1453 +1455 4 446.3842 429.3981 24.9298 0.2034 1454 +1456 4 446.2687 430.5009 24.7372 0.2034 1455 +1457 4 446.4254 431.5568 23.8924 0.1907 1456 +1458 4 446.764 432.6459 23.868 0.178 1457 +1459 4 446.9414 433.7453 24.3768 0.178 1458 +1460 4 446.8853 434.8561 24.2586 0.2161 1459 +1461 4 446.9528 435.9075 25.2084 0.2415 1460 +1462 4 446.8544 436.9714 26.1985 0.2796 1461 +1463 4 446.6153 438.0673 26.7252 0.2924 1462 +1464 4 446.6268 439.1736 26.0543 0.3178 1463 +1465 4 446.6965 440.3016 25.655 0.3305 1464 +1466 4 446.7228 441.3987 26.4359 0.3178 1465 +1467 4 446.6794 442.5404 26.4902 0.2669 1466 +1468 4 446.5535 443.6512 26.9503 0.2288 1467 +1469 4 446.5867 444.7025 27.4691 0.2161 1468 +1470 4 446.7526 445.7745 26.7058 0.2415 1469 +1471 4 446.8327 446.883 26.2136 0.2415 1470 +1472 4 446.9642 447.9526 25.7807 0.2669 1471 +1473 4 447.042 449.0566 26.4443 0.2669 1472 +1474 4 446.8727 450.1182 27.3179 0.2924 1473 +1475 4 446.7778 451.1844 28.2324 0.2669 1474 +1476 4 446.5879 452.2529 27.8597 0.2796 1475 +1477 4 446.6782 453.3615 27.8678 0.2796 1476 +1478 4 447.288 454.2664 27.3767 0.3051 1477 +1479 4 447.7994 455.2468 27.7934 0.2924 1478 +1480 4 447.9675 456.3485 27.4842 0.2796 1479 +1481 4 447.9732 457.3529 26.3096 0.2796 1480 +1482 4 448.3107 458.4225 26.8122 0.2924 1481 +1483 4 448.734 459.4773 26.8652 0.3051 1482 +1484 4 448.9731 460.5858 26.6375 0.3051 1483 +1485 4 449.2271 461.6406 25.8059 0.2796 1484 +1486 4 449.3964 462.6771 25.9274 0.2288 1485 +1487 4 449.7682 463.7032 26.2332 0.1652 1486 +1488 4 450.005 464.798 25.9854 0.1525 1487 +1489 4 450.0976 465.91 26.3864 0.1907 1488 +1490 4 450.1194 467.0002 25.9826 0.2415 1489 +1491 4 450.1869 468.1282 25.6676 0.2542 1490 +1492 4 450.291 468.6716 23.4268 0.2415 1491 +1493 2 414.4174 413.7882 15.3527 0.1907 1 +1494 2 414.3522 414.9185 15.0766 0.2669 1493 +1495 2 414.287 416.0213 14.3632 0.3305 1494 +1496 2 414.1326 417.1093 13.5979 0.3813 1495 +1497 2 413.9564 418.1938 12.8352 0.4068 1496 +1498 2 413.9335 419.2989 12.136 0.4068 1497 +1499 2 414.0605 420.412 11.6236 0.3559 1498 +1500 2 414.3236 421.4896 11.0018 0.3051 1499 +1501 2 414.2561 422.4826 10.0867 0.2796 1500 +1502 2 413.4931 423.2537 9.6502 0.2924 1501 +1503 2 412.5207 423.8463 9.8403 0.3051 1502 +1504 2 411.7462 424.6322 9.9644 0.2796 1503 +1505 2 411.3744 425.5829 9.0264 0.2669 1504 +1506 2 411.0152 426.5496 8.2065 0.2288 1505 +1507 2 410.6914 427.6249 8.4067 0.2288 1506 +1508 2 410.4683 428.7243 8.9289 0.2034 1507 +1509 2 410.2933 429.8111 9.6664 0.2161 1508 +1510 2 410.0622 430.899 9.6303 0.2034 1509 +1511 2 409.8243 432.011 9.4004 0.2288 1510 +1512 2 409.0624 432.6619 9.9117 0.2415 1511 +1513 2 409.0944 433.576 10.92 0.2796 1512 +1514 3 420.0002 408.7546 10.0285 0.3051 1 +1515 3 421.0904 408.6276 9.3506 0.3686 1514 +1516 3 422.1371 408.2124 9.3579 0.4195 1515 +1517 3 423.0867 407.5866 9.5656 0.394 1516 +1518 3 424.0556 406.9952 9.8697 0.3432 1517 +1519 3 425.1138 406.5833 9.9075 0.2796 1518 +1520 3 426.2075 406.2676 9.6527 0.2161 1519 +1521 3 427.332 406.2401 9.4366 0.178 1520 +1522 3 428.4509 406.4277 9.1146 0.1652 1521 +1523 3 429.3329 406.6771 10.3457 0.178 1522 +1524 3 430.0079 407.1073 12.3208 0.178 1523 +1525 3 430.9288 407.169 13.7455 0.178 1524 +1526 3 431.765 406.4987 13.9502 0.1907 1525 +1527 3 432.4629 405.6029 13.6391 0.2415 1526 +1528 3 433.3735 404.9245 13.7175 0.2669 1527 +1529 3 434.1926 404.1558 14.2106 0.2669 1528 +1530 3 435.0655 403.4911 14.9923 0.2161 1529 +1531 3 435.864 403.3744 13.16 0.1652 1530 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc new file mode 100644 index 0000000..4fe67b4 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-169125.03.01.01_469628681_m.swc @@ -0,0 +1,1250 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/February 2015/169125.03.01.01/reconstructions/Pvalb-IRES-Cre; Ai14(IVSCC)-169125.03.01.01.DS.swc +# id,type,x,y,z,r,pid +1 1 312.0832 372.8296 27.44 5.1972 -1 +2 3 310.5926 376.7913 27.4061 0.2161 1 +3 3 310.5274 377.8643 27.3406 0.2796 2 +4 3 310.6829 378.9637 26.7414 0.2924 3 +5 3 310.6372 380.0368 25.7981 0.2542 4 +6 3 310.1784 380.9817 26.6462 0.2161 5 +7 3 309.7906 381.945 27.8124 0.1907 6 +8 3 309.6373 383.0558 27.412 0.1907 7 +9 3 308.9521 383.9264 26.7898 0.2288 8 +10 3 308.0803 384.6437 26.3326 0.2796 9 +11 3 307.3013 385.4811 26.2685 0.3686 10 +12 3 306.6515 386.418 26.0495 0.4576 11 +13 3 306.163 386.8493 25.4593 0.2542 12 +14 3 305.2078 387.4522 25.2165 0.2415 13 +15 3 304.1713 387.935 25.1997 0.2415 14 +16 3 303.1646 388.4772 25.1983 0.2034 15 +17 3 302.6612 389.4794 25.1899 0.2415 16 +18 3 302.0526 390.4449 25.1437 0.2669 17 +19 3 301.1488 391.113 24.7388 0.3051 18 +20 3 300.2908 391.8269 24.1321 0.2669 19 +21 3 299.3196 392.4252 24.0517 0.2542 20 +22 3 298.2831 392.9057 23.9078 0.2542 21 +23 3 297.186 392.9846 23.1896 0.3178 22 +24 3 296.0592 393.1093 22.8334 0.3178 23 +25 3 295.0021 393.4719 22.2421 0.3051 24 +26 3 293.9371 393.8781 22.4277 0.2415 25 +27 3 292.9361 394.3848 22.9662 0.2161 26 +28 3 292.4899 394.9992 22.9832 0.2161 27 +29 3 291.9008 395.9762 23.1025 0.2034 28 +30 3 291.2498 396.8708 23.7213 0.2288 29 +31 3 290.5634 397.7688 24.0411 0.2415 30 +32 3 289.8049 398.6234 24.0806 0.2669 31 +33 3 288.9069 399.3235 24.0828 0.2796 32 +34 3 288.05 400.0785 24.0904 0.2796 33 +35 3 287.2355 400.8816 24.1237 0.3051 34 +36 3 286.429 401.6904 24.2673 0.2924 35 +37 3 285.6545 402.4855 24.8928 0.2924 36 +38 3 284.9018 403.3321 25.1149 0.2415 37 +39 3 284.2554 404.2564 24.7358 0.2415 38 +40 3 283.5427 405.1282 24.2746 0.2669 39 +41 3 282.6424 405.7802 24.6834 0.3305 40 +42 3 281.8976 406.5742 25.4755 0.3432 41 +43 3 281.2192 407.4836 25.5206 0.3305 42 +44 3 280.3715 408.2387 25.2538 0.3051 43 +45 3 279.5433 409.0258 25.2843 0.3178 44 +46 3 278.7242 409.8083 25.6662 0.3178 45 +47 3 277.8204 410.4638 26.264 0.3051 46 +48 3 276.9144 411.1582 26.3071 0.2796 47 +49 3 275.99 411.832 26.2576 0.2669 48 +50 3 275.0862 412.523 25.9955 0.2796 49 +51 3 274.3198 413.3215 25.3011 0.3051 50 +52 3 273.7043 414.2813 25.2031 0.3432 51 +53 3 273.2352 415.3235 25.2 0.3813 52 +54 3 272.6312 416.2947 25.2 0.3813 53 +55 3 272.0638 417.2877 25.2 0.3686 54 +56 3 271.3637 418.1915 25.1997 0.3178 55 +57 3 270.7059 419.1284 25.1983 0.3051 56 +58 3 270.0423 420.0596 25.1919 0.3051 57 +59 3 269.3731 420.9874 25.1605 0.3559 58 +60 3 268.586 421.8157 25.0281 0.3813 59 +61 3 267.8001 422.5936 24.3247 0.3813 60 +62 3 266.9776 423.3807 24.0618 0.3432 61 +63 3 266.0761 424.0842 23.9635 0.3051 62 +64 3 265.1609 424.7066 23.259 0.2542 63 +65 3 264.2091 425.3117 22.7979 0.2161 64 +66 3 263.39 426.0634 22.9298 0.2034 65 +67 3 262.4485 426.3825 24.1791 0.2415 66 +68 3 261.4246 426.879 24.4507 0.2542 67 +69 3 260.395 427.3572 24.6235 0.2542 68 +70 3 259.3414 427.7485 24.5118 0.2288 69 +71 3 258.2923 428.0265 24.6938 0.2542 70 +72 3 257.392 428.5435 23.7191 0.2924 71 +73 3 256.6942 428.9554 24.3012 0.3305 72 +74 3 255.9357 429.7276 24.64 0.3305 73 +75 3 255.009 430.2584 24.6344 0.3178 74 +76 3 254.1831 430.6634 23.6824 0.3051 75 +77 3 253.4395 431.3852 23.7252 0.3051 76 +78 3 252.5277 431.884 24.5468 0.2796 77 +79 3 251.7738 432.3588 23.6477 0.2415 78 +80 3 250.6882 432.5556 23.6606 0.2161 79 +81 3 249.8427 432.9193 24.5949 0.2415 80 +82 3 249.2787 433.8025 24.9186 0.2924 81 +83 3 248.7285 434.3962 23.8501 0.3178 82 +84 3 248.1485 435.3538 23.8171 0.2924 83 +85 3 247.668 436.1122 22.9415 0.2415 84 +86 3 247.0262 436.9714 22.675 0.1907 85 +87 3 246.2517 437.4587 24.2332 0.178 86 +88 3 245.5562 438.0468 24.8853 0.178 87 +89 3 245.134 438.883 24.1363 0.2034 88 +90 3 244.4739 439.6072 24.2189 0.2034 89 +91 3 243.7864 440.4022 23.6132 0.2034 90 +92 3 243.7098 441.2465 22.68 0.2034 91 +93 3 243.1275 441.8002 24.0089 0.2161 92 +94 3 242.9478 442.8413 23.6141 0.2161 93 +95 3 242.6138 443.8125 23.9828 0.178 94 +96 3 242.1299 444.6373 23.2663 0.1398 95 +97 3 241.2925 445.3638 23.4889 0.1271 96 +98 3 240.4253 445.4736 22.202 0.1398 97 +99 3 239.7824 446.0433 21.0 0.1525 98 +100 3 239.4335 446.732 21.884 0.1525 99 +101 3 238.818 447.4481 22.6209 0.1525 100 +102 3 237.7221 447.6506 22.398 0.1525 101 +103 3 236.9979 448.4366 21.6418 0.1398 102 +104 3 236.3058 449.3312 21.5261 0.1398 103 +105 3 235.6834 450.0702 21.7196 0.1398 104 +106 3 234.8907 450.8378 21.84 0.1652 105 +107 3 234.2695 451.3938 21.8378 0.1652 106 +108 3 233.6059 452.2896 21.56 0.1652 107 +109 3 232.7434 452.8227 21.56 0.1525 108 +110 3 231.835 453.4747 21.8126 0.178 109 +111 3 230.9301 454.0753 22.1673 0.2161 110 +112 3 229.9703 454.6027 21.7403 0.2542 111 +113 3 228.9716 454.8544 21.7193 0.2415 112 +114 3 227.9523 454.5226 22.12 0.2034 113 +115 3 227.0405 454.7366 22.96 0.1525 114 +116 3 226.3587 455.4573 22.96 0.1271 115 +117 3 225.5636 456.1849 22.96 0.1144 116 +118 3 224.6953 456.925 22.96 0.1271 117 +119 3 223.9014 457.5966 23.2285 0.1398 118 +120 3 223.5399 458.6731 23.24 0.1525 119 +121 3 222.8787 459.4556 22.965 0.1525 120 +122 3 221.8399 459.7736 23.5074 0.1652 121 +123 3 220.9453 460.2884 23.6846 0.178 122 +124 3 220.3905 461.2459 24.0321 0.178 123 +125 3 219.7624 461.7253 25.1622 0.1525 124 +126 3 219.7624 462.8521 25.4906 0.1271 125 +127 3 219.6011 463.94 26.1092 0.1144 126 +128 3 218.9627 464.798 26.5496 0.1144 127 +129 3 218.401 465.6538 27.594 0.1144 128 +130 3 217.7101 466.3127 28.0 0.1144 129 +131 3 217.1381 467.2794 28.1078 0.1525 130 +132 3 217.1312 468.3536 28.0 0.1907 131 +133 3 292.6455 393.8414 22.9662 0.2924 27 +134 3 292.0746 392.8542 22.9704 0.2924 133 +135 3 291.2876 392.0408 23.0171 0.2924 134 +136 3 290.2534 391.6084 23.2767 0.2669 135 +137 3 289.1517 391.4962 23.949 0.2669 136 +138 3 288.0489 391.2583 24.3723 0.2288 137 +139 3 286.9461 391.1222 25.0146 0.2288 138 +140 3 285.8227 391.0581 25.4668 0.2034 139 +141 3 284.7485 390.7835 26.0232 0.1907 140 +142 3 283.7189 390.3259 26.1685 0.1907 141 +143 3 282.5897 390.1784 26.0893 0.2161 142 +144 3 281.4812 389.985 26.3085 0.2542 143 +145 3 280.4322 389.5297 26.2489 0.2542 144 +146 3 279.3785 389.238 25.7748 0.2415 145 +147 3 278.3855 388.992 25.1258 0.2415 146 +148 3 277.515 388.3937 25.8048 0.2288 147 +149 3 276.5689 388.0963 26.8097 0.2288 148 +150 3 275.6582 387.6215 26.88 0.2288 149 +151 3 274.7751 387.816 26.1974 0.2669 150 +152 3 273.7821 387.6661 25.9529 0.2796 151 +153 3 272.7708 387.4362 26.04 0.2796 152 +154 3 272.097 387.0964 27.4336 0.2542 153 +155 3 271.7 386.7498 25.6819 0.2542 154 +156 3 270.6979 386.4661 25.48 0.2542 155 +157 3 269.706 386.3185 26.3113 0.2669 156 +158 3 269.1146 385.9684 25.0883 0.2669 157 +159 3 268.395 385.2466 24.8786 0.2415 158 +160 3 267.688 384.6414 25.4072 0.2288 159 +161 3 266.9867 384.2776 23.8 0.2161 160 +162 3 266.1276 383.6164 23.9599 0.2542 161 +163 3 265.2947 382.9071 24.575 0.2924 162 +164 3 264.4482 382.5948 23.8286 0.3305 163 +165 3 263.6359 382.0331 23.5626 0.3305 164 +166 3 263.0308 381.1465 24.0075 0.3051 165 +167 3 262.2929 380.3731 23.2772 0.2542 166 +168 3 261.5184 379.562 23.56 0.2161 167 +169 3 260.7336 378.9935 24.5227 0.2034 168 +170 3 259.8928 378.4661 23.4346 0.2288 169 +171 3 259.1961 377.7923 22.68 0.2415 170 +172 3 258.4525 377.2248 22.9205 0.2415 171 +173 3 257.4252 377.0544 23.24 0.2161 172 +174 3 256.6392 376.4538 22.6789 0.2034 173 +175 3 255.819 375.7788 22.3219 0.178 174 +176 3 255.2115 375.343 22.094 0.1907 175 +177 3 254.1808 375.3041 21.887 0.2288 176 +178 3 253.0814 375.4002 21.9601 0.2796 177 +179 3 251.9706 375.5054 22.1746 0.2796 178 +180 3 250.9204 375.8543 22.6898 0.2288 179 +181 3 250.1322 375.9333 21.784 0.178 180 +182 3 249.2273 375.5752 21.1434 0.1907 181 +183 3 249.0053 375.5752 18.7698 0.2288 182 +184 3 248.3109 376.058 18.4478 0.2542 183 +185 3 247.4529 375.8463 19.32 0.2161 184 +186 3 246.4073 375.4356 19.32 0.2034 185 +187 3 245.3972 375.0215 19.5734 0.2288 186 +188 3 244.9087 375.3578 19.7109 0.2796 187 +189 3 243.9694 375.2743 18.8563 0.3051 188 +190 3 242.9124 374.9826 18.613 0.3051 189 +191 3 242.1734 374.8259 20.1127 0.3051 190 +192 3 241.3703 374.1646 19.4435 0.2924 191 +193 3 240.2606 374.088 19.2363 0.2796 192 +194 3 239.2436 373.8169 19.8934 0.2669 193 +195 3 238.6384 373.508 19.1668 0.2542 194 +196 3 237.904 372.9074 19.3164 0.2415 195 +197 3 237.2748 372.0917 19.1453 0.2161 196 +198 3 236.816 371.3447 18.1594 0.2034 197 +199 3 235.8585 370.8345 17.4675 0.1652 198 +200 3 234.83 370.4764 16.611 0.1398 199 +201 3 233.8016 370.1183 15.7545 0.1144 200 +202 3 232.9848 369.4537 15.4 0.1144 201 +203 3 232.6896 368.4755 15.4 0.1144 202 +204 3 232.6896 367.3315 15.4 0.1144 203 +205 3 232.6164 366.191 15.4 0.1144 204 +206 3 232.3681 365.1797 15.4 0.1271 205 +207 3 231.2665 364.8777 15.4 0.1398 206 +208 3 230.8592 363.9064 15.4 0.178 207 +209 3 230.8592 362.7624 15.4 0.1907 208 +210 3 306.4433 388.0608 26.5065 0.2542 12 +211 3 306.0303 389.111 26.4446 0.2542 210 +212 3 305.7065 390.1875 26.502 0.2288 211 +213 3 305.5144 391.28 27.1065 0.2415 212 +214 3 305.0545 392.273 27.7141 0.2288 213 +215 3 304.463 393.2077 28.4032 0.2669 214 +216 3 303.7217 393.9902 29.2457 0.2669 215 +217 3 302.7859 394.6034 29.6803 0.3051 216 +218 3 301.8112 395.1765 30.0818 0.3178 217 +219 3 300.864 395.7771 30.6298 0.3305 218 +220 3 300.0518 396.5596 30.8322 0.3178 219 +221 3 299.537 397.5617 30.9798 0.2924 220 +222 3 299.0576 398.5662 31.5577 0.2796 221 +223 3 298.4707 399.5317 31.9015 0.2415 222 +224 3 297.686 400.3497 32.0855 0.2288 223 +225 3 296.987 401.1951 32.7701 0.2288 224 +226 3 296.598 402.2407 33.1243 0.2796 225 +227 3 296.4939 403.3481 33.6806 0.2924 226 +228 3 296.2994 404.4566 34.1166 0.2669 227 +229 3 295.867 405.5068 34.3272 0.2034 228 +230 3 295.5867 406.4861 35.4684 0.2034 229 +231 3 295.2458 407.5168 36.2978 0.2415 230 +232 3 294.6704 408.4949 36.4008 0.3051 231 +233 3 294.2105 409.5406 36.4048 0.3178 232 +234 3 293.7895 410.6045 36.4274 0.3305 233 +235 3 293.3662 411.6661 36.5674 0.3305 234 +236 3 293.0402 412.7106 37.343 0.3432 235 +237 3 292.3801 413.4771 38.5918 0.3432 236 +238 3 291.5038 413.6624 40.2956 0.3432 237 +239 3 290.7751 414.2024 41.9924 0.3178 238 +240 3 290.1562 414.9528 43.4591 0.2924 239 +241 3 289.5887 415.82 44.24 0.2542 240 +242 3 288.7422 416.3062 44.24 0.2415 241 +243 3 287.8361 416.7935 44.1582 0.2161 242 +244 3 287.2172 417.4033 44.1952 0.1907 243 +245 3 286.7036 418.3802 44.2963 0.1907 244 +246 3 285.7895 418.9031 44.8767 0.2161 245 +247 3 285.1042 419.602 45.36 0.2542 246 +248 3 284.316 420.2187 44.8 0.2415 247 +249 3 283.5976 420.8032 45.6084 0.1907 248 +250 3 282.9181 421.5949 45.7148 0.1398 249 +251 3 282.3998 422.3785 45.0178 0.1144 250 +252 3 282.2282 423.4596 44.6365 0.1144 251 +253 3 282.1104 424.5087 43.7388 0.1271 252 +254 3 282.1573 425.5932 43.9438 0.1652 253 +255 3 282.1596 426.2487 45.1063 0.2161 254 +256 3 282.3014 427.3218 44.8 0.2669 255 +257 3 309.8341 368.9766 27.3356 0.3432 1 +258 3 309.7941 367.8692 26.7624 0.4195 257 +259 3 309.7906 366.7401 26.3228 0.4703 258 +260 3 309.7643 365.5972 26.1934 0.483 259 +261 3 309.5847 364.499 25.5623 0.483 260 +262 3 309.0813 363.4797 25.3084 0.4449 261 +263 3 308.499 362.5119 25.7272 0.3813 262 +264 3 308.1044 361.464 26.2956 0.3432 263 +265 3 307.6548 360.4126 26.3197 0.3432 264 +266 3 307.4878 359.2812 26.32 0.3813 265 +267 3 307.3768 358.1418 26.32 0.394 266 +268 3 307.0748 357.039 26.3197 0.3559 267 +269 3 307.0496 355.8973 26.3172 0.3051 268 +270 3 307.0507 354.7533 26.2984 0.2542 269 +271 3 307.0553 353.6104 26.1772 0.2034 270 +272 3 307.0828 352.6105 25.5343 0.3432 271 +273 3 307.283 351.4997 25.1034 0.3559 272 +274 3 307.4809 350.4026 24.4773 0.3559 273 +275 3 307.3997 349.2735 24.096 0.3305 274 +276 3 307.0027 348.2039 24.0856 0.3432 275 +277 3 306.5405 347.1571 24.1139 0.3559 276 +278 3 306.0269 346.1366 24.2662 0.3813 277 +279 3 305.424 345.2009 24.9024 0.3686 278 +280 3 304.7788 344.2639 25.1969 0.3559 279 +281 3 304.1507 343.3075 25.2 0.3432 280 +282 3 303.5684 342.3226 25.2 0.3432 281 +283 3 303.0387 341.309 25.1994 0.3432 282 +284 3 302.4747 340.3137 25.1966 0.3305 283 +285 3 302.6303 339.8584 26.0229 0.3051 284 +286 3 302.5056 338.7967 25.7527 0.2924 285 +287 3 302.2574 337.8552 25.8852 0.2669 286 +288 3 302.3592 336.7742 26.4726 0.2415 287 +289 3 302.1647 335.7125 26.32 0.2288 288 +290 3 302.0995 334.7538 25.76 0.2288 289 +291 3 301.6705 333.778 26.2718 0.2415 290 +292 3 301.6728 332.7324 25.7723 0.2542 291 +293 3 301.5584 331.8755 26.01 0.2796 292 +294 3 301.2175 330.9089 26.7624 0.2924 293 +295 3 301.317 329.8655 25.8532 0.3178 294 +296 3 300.9143 329.1608 26.6 0.1144 295 +297 3 300.9349 328.1186 25.6236 0.1271 296 +298 3 300.9864 327.0124 25.0527 0.1398 297 +299 3 300.9761 325.8707 24.92 0.178 298 +300 3 300.7519 324.9612 26.04 0.2034 299 +301 3 300.1227 324.221 25.48 0.2415 300 +302 3 300.0712 323.1663 25.8308 0.2415 301 +303 3 300.0243 322.06 25.9627 0.2669 302 +304 3 300.1902 320.9686 26.1288 0.2924 303 +305 3 300.4899 319.9905 25.2162 0.3178 304 +306 3 300.745 318.9255 24.6338 0.2924 305 +307 3 301.1809 317.8913 24.36 0.2415 306 +308 3 301.3868 316.8056 24.08 0.2288 307 +309 3 301.3719 315.8767 25.3949 0.2542 308 +310 3 301.1431 314.7796 25.7961 0.3051 309 +311 3 300.904 313.6905 26.2492 0.3305 310 +312 3 300.5322 312.7662 27.1765 0.3305 311 +313 3 299.9511 311.9585 26.7476 0.3178 312 +314 3 299.5267 311.2366 27.16 0.2924 313 +315 3 298.7281 310.5777 26.3374 0.2924 314 +316 3 297.9708 309.9611 26.717 0.2669 315 +317 3 297.4217 309.0688 26.2268 0.2669 316 +318 3 297.1986 308.2039 25.4047 0.2415 317 +319 3 296.5957 307.3631 25.2 0.2415 318 +320 3 296.4653 306.3815 25.5682 0.2161 319 +321 3 296.0066 305.5144 26.04 0.1907 320 +322 3 295.4929 304.6689 26.7464 0.1652 321 +323 3 294.8077 303.978 26.1408 0.1398 322 +324 3 294.1567 303.4826 26.7235 0.1271 323 +325 3 294.1293 302.6406 28.2878 0.1271 324 +326 3 294.2368 301.5744 28.1999 0.1652 325 +327 3 293.8375 301.1649 26.32 0.2161 326 +328 3 293.015 300.4899 26.6 0.2542 327 +329 3 293.0928 299.3962 27.0323 0.2669 328 +330 3 293.0207 298.3426 26.6 0.2796 329 +331 3 292.8995 297.2798 26.9385 0.3178 330 +332 3 292.7885 296.2102 27.4229 0.3305 331 +333 3 292.5128 295.2058 26.9578 0.3305 332 +334 3 291.9625 294.5697 27.72 0.2796 333 +335 3 291.4512 293.7083 27.44 0.2796 334 +336 3 291.2475 292.6489 27.9812 0.2542 335 +337 3 291.2349 291.7761 26.7338 0.2542 336 +338 3 291.9076 291.72 25.48 0.2161 337 +339 3 292.3069 291.2361 23.9173 0.2288 338 +340 3 291.9785 290.1939 24.0724 0.2542 339 +341 3 291.8252 289.4995 25.5035 0.2796 340 +342 3 292.2897 288.7525 25.48 0.2669 341 +343 3 292.3492 287.7686 26.1618 0.2415 342 +344 3 292.1696 286.8466 26.2441 0.2415 343 +345 3 292.4064 286.2196 26.5037 0.2415 344 +346 3 292.4064 285.5092 25.0272 0.2415 345 +347 3 292.5208 284.4133 24.64 0.2415 346 +348 3 292.8926 283.7463 25.8023 0.2924 347 +349 3 293.0013 283.1434 27.8916 0.3305 348 +350 3 293.1592 282.1047 27.8317 0.3559 349 +351 3 292.8411 281.5464 28.7456 0.3305 350 +352 3 292.6764 281.0568 30.2599 0.3178 351 +353 3 293.0436 280.1496 31.0741 0.2924 352 +354 3 293.5378 279.3351 30.5595 0.2796 353 +355 3 294.0252 278.604 31.1926 0.2796 354 +356 3 294.9266 278.0378 31.309 0.2924 355 +357 3 295.8224 277.4955 30.8216 0.2924 356 +358 3 296.8074 277.0024 30.8904 0.2669 357 +359 3 297.8427 276.7267 30.52 0.2288 358 +360 3 298.4822 276.371 31.08 0.2161 359 +361 3 299.3024 275.7646 31.08 0.2034 360 +362 3 299.8035 274.9547 31.0453 0.2161 361 +363 3 300.0357 275.1148 29.0368 0.1907 362 +364 3 300.5048 274.4765 27.8421 0.1907 363 +365 3 300.7576 274.242 29.6722 0.1652 364 +366 3 300.7931 273.4675 30.5452 0.1652 365 +367 3 300.6432 273.0019 28.6852 0.1398 366 +368 3 301.0676 272.844 26.9069 0.1271 367 +369 3 301.317 271.9666 26.1671 0.1144 368 +370 3 301.5584 271.4117 26.6 0.1271 369 +371 3 301.6442 270.2826 26.6596 0.1525 370 +372 3 301.6728 269.2175 27.4072 0.1907 371 +373 3 301.8341 268.8308 29.7044 0.2034 372 +374 3 302.6612 268.2932 30.42 0.1907 373 +375 3 303.581 267.72 30.5497 0.1525 374 +376 3 304.4985 267.3093 29.8306 0.1271 375 +377 3 305.5716 266.9581 29.6887 0.1144 376 +378 3 306.5634 266.4742 29.4 0.1271 377 +379 3 306.9478 265.7981 30.24 0.1398 378 +380 3 307.6399 264.9195 30.24 0.1652 379 +381 3 308.0792 264.0341 30.2403 0.1907 380 +382 3 308.7587 263.2195 30.7994 0.2288 381 +383 3 309.6328 262.7413 29.9695 0.2669 382 +384 3 310.596 262.3192 30.24 0.2924 383 +385 3 301.7803 329.2398 25.1208 0.2669 295 +386 3 302.6292 328.6048 25.1552 0.3051 385 +387 3 303.0731 327.8567 23.6205 0.3305 386 +388 3 303.3064 326.9083 23.9865 0.3559 387 +389 3 303.692 326.0823 23.6636 0.3178 388 +390 3 304.0706 325.3319 23.5407 0.2796 389 +391 3 304.5065 324.3457 23.8202 0.2161 390 +392 3 304.8554 323.3699 22.9236 0.1907 391 +393 3 304.3212 322.4764 22.5865 0.2161 392 +394 3 304.0683 321.6722 22.3101 0.3051 393 +395 3 304.5328 320.9698 21.7448 0.3813 394 +396 3 304.9149 320.01 22.6696 0.3813 395 +397 3 304.9664 318.9403 22.0805 0.3178 396 +398 3 305.3874 317.9233 21.56 0.2669 397 +399 3 305.7569 316.848 21.7216 0.2924 398 +400 3 305.9079 315.8332 21.6532 0.3559 399 +401 3 305.7615 314.8402 21.56 0.3813 400 +402 3 305.7043 314.0086 20.1015 0.3432 401 +403 3 305.7226 312.9504 19.8926 0.3178 402 +404 3 306.3243 312.1598 19.6 0.3432 403 +405 3 306.6938 311.136 20.102 0.394 404 +406 3 306.4776 310.048 19.6238 0.3813 405 +407 3 306.2728 309.1752 18.7606 0.3432 406 +408 3 305.9536 308.5906 17.3617 0.3051 407 +409 3 306.2271 307.728 18.4929 0.3178 408 +410 3 306.3003 307.1571 19.88 0.3178 409 +411 3 306.2202 306.2385 19.4522 0.3305 410 +412 3 305.8324 305.472 18.692 0.3051 411 +413 3 306.0543 304.6483 17.0626 0.2669 412 +414 3 305.9125 303.7331 16.1081 0.1907 413 +415 3 306.3277 303.2332 17.9668 0.1398 414 +416 3 306.5028 302.3924 17.1954 0.1398 415 +417 3 306.6847 301.6236 15.4 0.1907 416 +418 3 306.4776 300.5402 14.8081 0.2669 417 +419 3 306.4021 299.5415 13.7206 0.3178 418 +420 3 306.6481 298.4707 14.2313 0.3432 419 +421 3 307.1548 297.4983 13.6046 0.3432 420 +422 3 307.5083 296.4276 13.433 0.3305 421 +423 3 308.0392 295.7034 14.5746 0.2924 422 +424 3 308.1261 294.7299 15.6968 0.2415 423 +425 3 308.3172 294.3867 18.051 0.1907 424 +426 3 308.5379 293.8272 18.3327 0.1652 425 +427 3 308.6478 293.0402 19.8005 0.1398 426 +428 3 308.9944 292.1776 19.32 0.1271 427 +429 3 301.7563 339.7005 25.1784 0.2161 284 +430 3 300.7198 339.2406 25.0488 0.2415 429 +431 3 299.8596 338.5531 24.4076 0.2669 430 +432 3 299.2475 337.6127 24.6694 0.2924 431 +433 3 298.584 336.7032 24.2603 0.3051 432 +434 3 298.1012 335.669 24.1738 0.3178 433 +435 3 297.4766 334.7241 24.5151 0.3432 434 +436 3 296.8074 333.8272 25.0947 0.3686 435 +437 3 295.9677 333.055 25.1944 0.3432 436 +438 3 295.1497 332.2554 25.1891 0.2796 437 +439 3 294.58 331.2658 25.1412 0.2161 438 +440 3 293.8501 330.3941 24.841 0.2161 439 +441 3 292.9281 329.79 24.1032 0.2669 440 +442 3 291.9122 329.2649 24.0794 0.2924 441 +443 3 291.0954 328.4641 24.0778 0.2924 442 +444 3 290.3941 327.6359 24.0705 0.3305 443 +445 3 289.9731 326.5754 24.0218 0.3432 444 +446 3 289.5922 325.508 23.6622 0.3051 445 +447 3 289.106 324.4739 23.7756 0.2542 446 +448 3 288.5031 323.5049 23.9355 0.2415 447 +449 3 287.9848 322.5348 23.1792 0.2669 448 +450 3 287.4334 321.5361 22.9522 0.2796 449 +451 3 286.8923 320.5294 22.9141 0.2924 450 +452 3 286.2116 319.6176 22.7242 0.2796 451 +453 3 285.3342 318.9369 22.0601 0.2924 452 +454 3 284.5483 318.1338 21.6026 0.2796 453 +455 3 284.0644 317.1328 20.9616 0.3178 454 +456 3 283.6754 316.0609 20.7477 0.3432 455 +457 3 283.2533 315.0096 20.9504 0.3686 456 +458 3 282.751 314.131 21.5046 0.3178 457 +459 3 282.099 313.6791 20.1116 0.2669 458 +460 3 281.1414 313.1506 19.8066 0.2415 459 +461 3 280.5111 312.9858 18.4475 0.2796 460 +462 3 279.9883 312.4344 20.0788 0.3051 461 +463 3 279.1726 311.8727 19.88 0.3178 462 +464 3 278.2094 311.3465 19.4373 0.3051 463 +465 3 277.2335 310.874 19.6932 0.3051 464 +466 3 276.2577 310.342 19.3332 0.2924 465 +467 3 275.4512 309.7449 19.7425 0.2924 466 +468 3 274.9089 308.9761 18.7628 0.3051 467 +469 3 274.7613 307.982 18.7228 0.3305 468 +470 3 273.9949 307.4958 18.8647 0.3432 469 +471 3 273.5144 306.7899 19.5331 0.3305 470 +472 3 272.7399 306.1367 19.32 0.3178 471 +473 3 272.4093 305.3805 18.76 0.2924 472 +474 3 271.5158 304.8314 18.6668 0.2669 473 +475 3 270.834 304.3749 18.5816 0.2415 474 +476 3 270.7082 303.5444 17.3958 0.2161 475 +477 3 270.7139 302.4542 17.08 0.2161 476 +478 3 270.556 301.6739 18.9095 0.2161 477 +479 3 270.2174 300.8331 19.88 0.2415 478 +480 3 270.9656 300.2531 19.3606 0.2669 479 +481 3 271.0102 299.3917 18.7132 0.3305 480 +482 3 270.8317 298.4341 18.4951 0.3686 481 +483 3 270.7402 297.4068 18.2034 0.3686 482 +484 3 269.9657 296.7433 17.8536 0.3051 483 +485 3 269.5744 295.7663 17.6047 0.2542 484 +486 3 269.5275 294.842 17.9556 0.2415 485 +487 3 268.7084 294.572 17.1433 0.2542 486 +488 3 268.1616 294.0114 16.5211 0.2669 487 +489 3 267.2498 293.5698 16.3058 0.2924 488 +490 3 266.2866 293.3811 16.2333 0.2924 489 +491 3 265.7706 292.5139 16.1266 0.2924 490 +492 3 265.2719 291.593 16.7759 0.2415 491 +493 3 264.6072 290.8048 17.08 0.2288 492 +494 3 290.4033 328.0706 22.5728 0.178 443 +495 3 289.7752 328.0123 24.1357 0.1525 494 +496 3 288.8131 327.8704 24.6543 0.1398 495 +497 3 288.288 327.5123 23.602 0.1398 496 +498 3 287.4792 327.184 22.8407 0.1525 497 +499 3 286.7264 327.0936 21.0204 0.1525 498 +500 3 285.9428 326.6063 21.8238 0.1652 499 +501 3 285.2942 326.4747 21.2932 0.1907 500 +502 3 284.4819 326.0572 20.72 0.2034 501 +503 3 283.5198 325.6579 21.28 0.2034 502 +504 3 282.6824 324.9429 21.252 0.178 503 +505 3 281.7638 324.4842 20.3174 0.1652 504 +506 3 280.8772 323.8023 20.0189 0.1525 505 +507 3 279.9036 323.2441 20.0203 0.1525 506 +508 3 278.9404 322.8368 19.6031 0.1525 507 +509 3 278.0698 322.3792 18.7673 0.1398 508 +510 3 276.9521 322.274 18.48 0.1271 509 +511 3 275.8298 322.1504 18.48 0.1271 510 +512 3 274.9032 321.8518 18.48 0.1398 511 +513 3 274.3392 321.0201 18.0141 0.178 512 +514 3 273.3428 320.5099 17.64 0.2161 513 +515 3 272.3212 320.034 17.6308 0.2669 514 +516 3 271.4277 319.4197 17.4751 0.2796 515 +517 3 270.5537 318.7756 17.1772 0.2796 516 +518 3 269.5573 318.3683 18.0026 0.2669 517 +519 3 268.6352 318.1144 18.5111 0.2542 518 +520 3 267.7864 318.3741 18.2311 0.2288 519 +521 3 267.0725 317.8032 18.2185 0.1907 520 +522 3 266.1413 317.6648 19.2688 0.1652 521 +523 3 265.0511 317.5744 19.567 0.1398 522 +524 3 263.9288 317.4611 19.32 0.1398 523 +525 3 263.2344 317.1225 19.1408 0.1652 524 +526 3 262.7848 316.2165 19.908 0.2034 525 +527 3 262.4336 315.8492 18.5679 0.2161 526 +528 3 261.6511 315.6353 17.5641 0.2161 527 +529 3 260.864 315.6296 17.08 0.2288 528 +530 3 259.7715 315.6353 17.3732 0.2669 529 +531 3 258.8346 315.1823 17.8254 0.2796 530 +532 3 257.8015 314.9203 17.668 0.2796 531 +533 3 256.8326 314.497 17.9544 0.3051 532 +534 3 255.8911 314.473 16.6197 0.3178 533 +535 3 254.9804 314.012 17.0663 0.3305 534 +536 3 254.1922 313.5704 18.4369 0.2924 535 +537 3 253.5104 312.8966 19.0089 0.3051 536 +538 3 253.0528 312.7696 18.2 0.1652 537 +539 3 252.6181 312.5408 16.998 0.2796 537 +540 3 251.7566 312.4138 16.9548 0.2796 539 +541 3 251.3322 312.7101 18.2 0.2415 540 +542 3 250.3964 312.3463 17.1422 0.2034 541 +543 3 249.781 311.6336 16.4004 0.2034 542 +544 3 249.6322 310.9289 16.7597 0.2288 543 +545 3 249.0751 310.7104 16.2016 0.2415 544 +546 3 248.3006 310.4736 15.9664 0.2542 545 +547 3 247.6691 309.9096 16.7026 0.2415 546 +548 3 247.0125 309.5893 18.4528 0.2542 547 +549 3 246.1636 309.3914 19.6 0.2415 548 +550 3 246.278 308.8994 17.7568 0.2288 549 +551 3 246.6464 308.5116 16.4433 0.2034 550 +552 3 246.0469 308.0426 15.7161 0.178 551 +553 3 245.8456 307.7749 17.827 0.1652 552 +554 3 246.0744 307.0496 17.92 0.1525 553 +555 3 307.5175 353.1997 23.016 0.2924 271 +556 3 307.1079 353.4194 20.7553 0.2796 555 +557 3 306.1733 353.7763 19.4611 0.2415 556 +558 3 305.3004 353.9181 17.8702 0.1907 557 +559 3 304.256 353.7042 16.879 0.1652 558 +560 3 303.168 353.6642 16.0686 0.1525 559 +561 3 302.286 354.0817 15.9202 0.1525 560 +562 3 302.1373 355.0839 16.8627 0.1652 561 +563 3 302.5102 356.1112 16.9459 0.1907 562 +564 3 302.6143 357.1053 15.9138 0.2161 563 +565 3 301.968 357.8981 15.2757 0.2161 564 +566 3 300.9315 358.2653 15.6022 0.2034 565 +567 3 300.4544 358.9998 16.791 0.178 566 +568 3 301.0928 359.5867 15.6106 0.178 567 +569 3 302.016 359.5592 14.0 0.1907 568 +570 3 306.1218 356.5768 26.1514 0.3178 268 +571 3 305.2238 356.245 24.876 0.3178 570 +572 3 304.2125 356.0048 24.7976 0.2669 571 +573 3 303.295 355.6799 24.3214 0.2415 572 +574 3 302.3295 355.6582 24.92 0.1907 573 +575 3 301.2072 355.5998 25.121 0.178 574 +576 3 300.2485 355.3058 24.0128 0.2034 575 +577 3 299.3287 355.2886 22.96 0.2542 576 +578 3 298.3483 354.9958 23.0737 0.2796 577 +579 3 297.4926 354.8654 22.8934 0.2796 578 +580 3 296.5488 354.5256 22.6873 0.2796 579 +581 3 295.5993 354.1069 21.8565 0.3051 580 +582 3 294.7299 353.377 21.56 0.3305 581 +583 3 293.9634 352.598 22.0142 0.3305 582 +584 3 293.0184 352.1415 21.5642 0.3305 583 +585 3 292.2256 351.6416 21.7003 0.3305 584 +586 3 291.3596 351.0272 21.3592 0.3305 585 +587 3 290.4227 350.525 21.0731 0.3178 586 +588 3 289.4 350.1475 20.8603 0.3178 587 +589 3 289.0064 349.333 20.16 0.3305 588 +590 3 288.2239 348.5757 20.6489 0.3305 589 +591 3 287.549 347.7691 20.7827 0.2796 590 +592 3 286.6429 347.2852 19.8761 0.2415 591 +593 3 285.9348 346.6148 19.8573 0.2161 592 +594 3 285.0036 346.2064 20.1401 0.2288 593 +595 3 284.3469 345.8655 19.6622 0.2034 594 +596 3 283.7074 345.4114 19.4219 0.178 595 +597 3 283.14 344.9137 19.4622 0.1525 596 +598 3 282.6481 344.1816 20.6951 0.1652 597 +599 3 281.837 343.6679 19.6288 0.1907 598 +600 3 280.9881 343.2629 19.88 0.2161 599 +601 3 280.0512 342.914 19.88 0.2415 600 +602 3 279.3019 342.382 19.4384 0.2542 601 +603 3 278.3855 341.8924 19.8755 0.2796 602 +604 3 277.4875 341.341 19.3486 0.2796 603 +605 3 276.6135 340.8399 19.32 0.2796 604 +606 3 275.7555 340.0986 19.3869 0.2669 605 +607 3 275.1126 339.3035 19.1041 0.2542 606 +608 3 274.4033 338.4764 19.0551 0.2161 607 +609 3 273.8862 337.4617 19.164 0.1652 608 +610 3 273.1323 336.6517 19.32 0.1525 609 +611 3 272.4882 335.7766 19.32 0.1907 610 +612 3 272.264 335.2423 19.32 0.2034 611 +613 3 271.5856 334.5056 19.32 0.2415 612 +614 3 272.59 335.1714 19.5513 0.2034 611 +615 3 272.3841 334.0732 19.9839 0.2415 614 +616 3 271.9368 333.198 19.6078 0.2669 615 +617 3 271.239 332.4819 19.9755 0.2669 616 +618 3 270.3421 331.8138 20.3748 0.2161 617 +619 3 269.7083 330.8986 19.8016 0.178 618 +620 3 269.3182 329.9376 19.3113 0.1398 619 +621 3 268.8743 328.9149 19.32 0.1271 620 +622 3 268.117 328.0843 19.1159 0.1271 621 +623 3 267.2075 327.5478 19.3166 0.1398 622 +624 3 266.1836 327.0971 19.04 0.1525 623 +625 3 265.0934 326.8786 19.3945 0.1398 624 +626 3 264.2228 326.5068 20.72 0.1271 625 +627 3 263.3477 326.3889 19.3189 0.1144 626 +628 3 262.3993 325.9336 18.48 0.1144 627 +629 3 261.2667 325.8112 18.48 0.1271 628 +630 3 260.1273 325.7837 18.48 0.1398 629 +631 3 259.3677 325.1683 18.3674 0.1525 630 +632 3 258.7145 324.419 17.7086 0.1398 631 +633 3 257.8553 323.7051 17.92 0.1271 632 +634 3 257.0213 322.9947 17.92 0.1144 633 +635 3 256.3155 322.171 17.92 0.1144 634 +636 3 255.7137 321.2741 17.897 0.1398 635 +637 3 255.3111 320.8989 16.849 0.1907 636 +638 3 254.6452 320.0088 16.8566 0.2669 637 +639 3 253.7346 319.3339 16.8582 0.3178 638 +640 3 253.07 318.5823 16.9044 0.3432 639 +641 3 252.379 317.7082 16.8224 0.3432 640 +642 3 251.4546 317.428 16.4956 0.3559 641 +643 3 250.4948 317.0173 16.6286 0.394 642 +644 3 249.7386 316.2005 16.52 0.4195 643 +645 3 249.0133 315.3493 16.2977 0.4195 644 +646 3 248.129 314.6561 16.6116 0.3686 645 +647 3 247.4655 314.1058 16.4615 0.3432 646 +648 3 246.6178 313.5178 16.3047 0.3178 647 +649 3 245.5848 313.1094 16.87 0.3178 648 +650 3 244.7119 312.4584 17.4672 0.3051 649 +651 3 243.7784 311.8372 17.4846 0.3305 650 +652 3 242.9662 311.1165 17.1632 0.3432 651 +653 3 242.4765 310.4702 16.6365 0.3432 652 +654 3 241.6872 309.9073 16.3302 0.2924 653 +655 3 241.4115 309.452 18.1269 0.2415 654 +656 3 241.4206 309.4703 16.52 0.1907 655 +657 3 241.0774 308.4647 16.5217 0.1652 656 +658 3 241.4069 307.633 14.966 0.178 657 +659 3 241.1506 306.7842 14.9271 0.2161 658 +660 3 240.5752 306.6137 16.8932 0.2415 659 +661 3 240.1954 305.6962 16.6281 0.2288 660 +662 3 240.2617 305.0339 18.0849 0.1907 661 +663 3 240.637 304.4173 17.92 0.1907 662 +664 3 240.6301 303.9196 17.0405 0.2034 663 +665 3 240.3738 303.0834 15.96 0.2669 664 +666 3 239.9803 302.4015 15.3524 0.3051 665 +667 3 239.3591 301.579 15.1256 0.3305 666 +668 3 238.7471 300.9978 16.1073 0.3051 667 +669 3 238.0195 300.4075 15.8668 0.2669 668 +670 3 237.9165 300.014 14.0358 0.2542 669 +671 3 237.2736 299.3196 14.2419 0.2288 670 +672 3 236.6936 299.156 12.88 0.2034 671 +673 3 312.0306 368.2181 26.1411 0.1652 1 +674 3 311.78 367.1565 25.3375 0.2161 673 +675 3 311.2504 366.223 24.3908 0.2542 674 +676 3 310.9037 365.2781 23.0723 0.2415 675 +677 3 311.2183 364.1935 22.96 0.2161 676 +678 3 311.8498 363.6547 22.9597 0.394 677 +679 3 312.7696 362.9752 22.958 0.4195 678 +680 3 313.6047 362.1938 22.9513 0.4068 679 +681 3 314.4742 361.4502 22.9222 0.394 680 +682 3 315.4214 360.813 22.7665 0.3686 681 +683 3 316.2851 360.1198 22.0604 0.3432 682 +684 3 317.1465 359.3739 21.84 0.3051 683 +685 3 318.0148 358.6314 21.84 0.2669 684 +686 3 318.8362 357.8363 21.84 0.2542 685 +687 3 319.6416 357.023 21.84 0.2415 686 +688 3 320.4333 356.197 21.84 0.2542 687 +689 3 321.1666 355.3218 21.84 0.2669 688 +690 3 321.8404 354.3986 21.8394 0.3178 689 +691 3 322.5485 353.5017 21.8375 0.3559 690 +692 3 323.2601 352.6105 21.8285 0.3559 691 +693 3 324.1169 351.8612 21.7795 0.3305 692 +694 3 325.047 351.2286 21.429 0.2924 693 +695 3 325.8169 350.469 20.6265 0.2924 694 +696 3 326.5079 349.6098 19.9601 0.2796 695 +697 3 327.3293 348.8342 19.6504 0.2796 696 +698 3 328.1415 348.046 19.936 0.2669 697 +699 3 328.8657 347.1971 20.151 0.2924 698 +700 3 329.5349 346.2865 19.7893 0.3432 699 +701 3 330.3106 345.4571 19.5244 0.3686 700 +702 3 331.1239 344.6792 19.0999 0.3559 701 +703 3 331.9099 343.8727 18.6348 0.3051 702 +704 3 332.5951 342.9655 18.5945 0.2924 703 +705 3 333.2735 342.0823 19.14 0.2924 704 +706 3 334.0423 341.2644 19.6092 0.3051 705 +707 3 334.8465 340.4761 20.097 0.3051 706 +708 3 335.6896 339.7302 20.5808 0.2924 707 +709 3 336.6186 339.0736 20.7189 0.2796 708 +710 3 337.5704 338.4398 20.7152 0.2669 709 +711 3 338.4787 337.7466 20.6982 0.2669 710 +712 3 339.3905 337.0556 20.6136 0.2542 711 +713 3 340.4155 336.797 19.9066 0.2288 712 +714 3 340.888 336.7021 20.7054 0.2034 713 +715 3 341.7357 336.2182 20.4498 0.178 714 +716 3 342.6898 335.8143 19.9534 0.1907 715 +717 3 343.5409 335.6496 18.6522 0.2288 716 +718 3 344.1221 334.8843 18.1961 0.2924 717 +719 3 344.5465 334.0194 18.6458 0.3178 718 +720 3 345.0476 333.0459 19.0036 0.2796 719 +721 3 345.3461 332.1272 19.264 0.2161 720 +722 3 345.8907 331.3127 19.6795 0.1652 721 +723 3 346.5256 330.8276 19.49 0.1525 722 +724 3 346.7864 330.0337 19.9335 0.178 723 +725 3 347.0107 329.2009 20.7088 0.1907 724 +726 3 347.3138 328.5774 19.2556 0.2288 725 +727 3 346.5519 328.328 17.5574 0.2415 726 +728 3 346.5359 327.9951 15.68 0.2796 727 +729 3 346.6 327.2984 15.0192 0.2924 728 +730 3 346.2888 326.4496 14.6462 0.2796 729 +731 3 346.2888 326.1544 17.2052 0.2542 730 +732 3 346.7773 325.3822 17.92 0.2288 731 +733 3 347.204 324.721 18.5643 0.2288 732 +734 3 347.2635 323.7509 18.1902 0.2415 733 +735 3 347.3962 322.8585 17.0125 0.2415 734 +736 3 347.744 321.9651 18.2 0.2669 735 +737 3 347.911 320.9641 17.3768 0.2796 736 +738 3 348.5459 320.1141 17.8315 0.3305 737 +739 3 348.8056 319.3693 18.0029 0.3686 738 +740 3 349.2781 318.3969 17.5647 0.394 739 +741 3 349.8352 317.7185 17.08 0.394 740 +742 3 350.1326 316.8537 16.2173 0.3686 741 +743 3 350.31 315.8206 16.0096 0.3559 742 +744 3 350.5582 314.7338 16.387 0.3305 743 +745 3 350.8797 313.782 17.4628 0.3051 744 +746 3 351.526 313.0636 18.3985 0.2796 745 +747 3 352.0946 312.2262 17.7682 0.2415 746 +748 3 353.0052 311.5707 17.92 0.2288 747 +749 3 353.774 310.9575 16.8146 0.2034 748 +750 3 354.5439 310.4724 15.6842 0.2288 749 +751 3 355.1411 310.008 15.7872 0.2288 750 +752 3 355.8458 309.3994 15.0598 0.2542 751 +753 3 356.2656 308.6054 14.56 0.2669 752 +754 3 356.9337 307.8401 15.12 0.2924 753 +755 3 357.595 307.053 14.9226 0.3178 754 +756 3 358.3042 306.4273 16.2442 0.3178 755 +757 3 358.9231 305.8244 15.3765 0.3051 756 +758 3 359.1668 304.828 15.6624 0.2796 757 +759 3 359.4459 303.8464 15.2127 0.2415 758 +760 3 359.6622 302.8454 14.082 0.2288 759 +761 3 360.0889 302.1704 15.0889 0.2161 760 +762 3 360.5488 301.5893 14.4393 0.2542 761 +763 3 361.4491 301.2072 14.4878 0.2796 762 +764 3 362.1458 300.7187 15.4 0.2924 763 +765 3 362.759 300.2199 17.0999 0.2796 764 +766 3 363.1182 299.2921 16.681 0.2542 765 +767 3 363.5632 298.433 15.4311 0.2415 766 +768 3 363.6467 297.7626 17.2939 0.2034 767 +769 3 363.8389 297.0968 16.7356 0.1907 768 +770 3 364.3114 296.717 16.2686 0.1907 769 +771 3 364.1558 295.9128 17.3474 0.2161 770 +772 3 364.2496 294.9186 16.1381 0.2288 771 +773 3 364.2302 294.5823 13.8012 0.2161 772 +774 3 363.8721 293.8639 14.3632 0.2034 773 +775 3 364.4784 293.0928 15.4 0.178 774 +776 3 311.2515 363.5666 23.2739 0.3051 677 +777 3 311.6279 362.8608 25.2036 0.2415 776 +778 3 311.7995 362.4352 27.6895 0.2034 777 +779 3 312.0535 362.0497 29.6856 0.2034 778 +780 3 311.5078 361.1825 30.4539 0.2542 779 +781 3 310.7596 360.3772 30.875 0.3051 780 +782 3 310.1064 359.4757 31.3404 0.3305 781 +783 3 310.2482 358.7836 32.2291 0.3432 782 +784 3 311.0708 358.1349 33.3287 0.3305 783 +785 3 311.3007 357.1156 34.0796 0.2924 784 +786 3 310.8854 356.0746 34.2222 0.2669 785 +787 3 310.453 355.0518 34.853 0.2542 786 +788 3 310.9861 354.1298 35.4858 0.2796 787 +789 3 311.9345 353.5864 36.2782 0.3051 788 +790 3 312.4516 352.5831 36.6072 0.3559 789 +791 3 311.7903 351.3453 38.0428 0.2924 790 +792 3 311.2183 350.4884 39.1381 0.3178 791 +793 3 310.8305 349.4863 40.0814 0.394 792 +794 3 310.3603 348.5288 41.0603 0.4322 793 +795 3 309.7723 347.6341 41.9689 0.4195 794 +796 3 309.0219 346.8276 42.6549 0.3305 795 +797 3 308.2005 346.0703 43.1046 0.2669 796 +798 3 307.3882 345.2649 43.169 0.2288 797 +799 3 306.5634 344.479 43.379 0.2288 798 +800 3 305.6402 344.0008 44.0409 0.2415 799 +801 3 304.9469 343.2915 44.3948 0.2542 800 +802 3 304.5317 342.4106 44.1983 0.2669 801 +803 3 304.2834 341.5046 44.1126 0.2542 802 +804 3 303.6393 340.5951 43.68 0.2415 803 +805 3 302.8088 339.8389 43.68 0.2415 804 +806 3 301.9863 339.2589 43.0254 0.2415 805 +807 3 301.2461 338.4261 43.001 0.2161 806 +808 3 300.5551 337.6642 43.4 0.1907 807 +809 3 299.7463 336.9 43.3958 0.1907 808 +810 3 298.8277 336.2433 43.1981 0.2288 809 +811 3 297.9788 335.5398 43.68 0.2415 810 +812 3 297.3634 334.6154 43.96 0.2415 811 +813 3 296.3921 334.2642 44.4906 0.2415 812 +814 3 295.581 333.5732 44.3167 0.2796 813 +815 3 295.0216 333.0184 43.12 0.3305 814 +816 3 294.2654 332.3503 43.4904 0.3559 815 +817 3 293.6602 331.5873 43.5422 0.3432 816 +818 3 292.999 330.9363 43.68 0.3051 817 +819 3 292.2623 330.0955 43.96 0.2669 818 +820 3 291.6205 329.1997 43.4826 0.2161 819 +821 3 290.8254 328.4127 43.12 0.178 820 +822 3 290.1253 327.5238 43.12 0.178 821 +823 3 289.5441 326.7115 42.9195 0.2034 822 +824 3 288.9744 326.1292 43.0903 0.2415 823 +825 3 288.439 325.206 43.1589 0.2415 824 +826 3 288.4367 324.1616 42.8431 0.2669 825 +827 3 288.1393 323.1789 42.7966 0.2542 826 +828 3 287.5558 322.2545 42.56 0.2542 827 +829 3 286.977 321.2947 42.2531 0.2161 828 +830 3 286.4233 320.4584 41.5663 0.2161 829 +831 3 285.3388 320.1701 41.44 0.2034 830 +832 3 284.6798 319.3682 41.1695 0.1907 831 +833 3 283.9557 318.5926 40.8853 0.178 832 +834 3 283.2899 317.9885 39.7424 0.2034 833 +835 3 282.2248 317.6122 39.3862 0.2669 834 +836 3 281.7706 316.8617 39.8717 0.3051 835 +837 3 281.535 315.8595 39.4708 0.3305 836 +838 3 280.9172 315.7486 38.099 0.3305 837 +839 3 280.3063 314.9981 38.456 0.3305 838 +840 3 279.4643 314.5279 38.0993 0.2796 839 +841 3 278.8523 313.718 39.058 0.2161 840 +842 3 278.2505 312.8977 38.6389 0.178 841 +843 3 277.5664 312.2594 37.4657 0.2034 842 +844 3 276.9944 311.406 37.1272 0.2288 843 +845 3 276.3858 310.8957 38.5666 0.2669 844 +846 3 275.6823 310.7035 37.5376 0.2542 845 +847 3 274.6092 310.5068 36.96 0.2669 846 +848 3 273.551 310.2597 36.5106 0.2161 847 +849 3 272.9492 309.5824 35.8218 0.1907 848 +850 3 271.9677 309.1614 35.84 0.1525 849 +851 3 271.1429 308.5242 36.4 0.1652 850 +852 3 270.3375 307.8207 36.7111 0.1907 851 +853 3 269.4612 307.1308 36.7223 0.2288 852 +854 3 268.7794 306.2568 36.7875 0.2669 853 +855 3 268.0552 305.4217 36.5316 0.3178 854 +856 3 267.601 304.5808 36.0287 0.3432 855 +857 3 267.2407 303.8464 35.3214 0.3686 856 +858 3 266.9581 303.176 35.2694 0.3432 857 +859 3 266.7511 302.4221 35.5496 0.3432 858 +860 3 266.1344 301.6877 35.5541 0.3305 859 +861 3 265.6746 300.872 34.5332 0.3305 860 +862 3 265.6368 300.5288 35.56 0.2415 861 +863 3 265.4034 300.2096 34.7141 0.2669 861 +864 3 265.0145 299.3356 35.2612 0.2542 863 +865 3 264.542 298.33 35.0022 0.2796 864 +866 3 264.2114 297.678 33.3169 0.3051 865 +867 3 263.9711 296.9435 32.0051 0.3305 866 +868 3 263.6405 296.1393 33.0145 0.3305 867 +869 3 263.6771 295.0982 33.6196 0.3051 868 +870 3 264.0249 294.2746 34.2286 0.2415 869 +871 3 264.0352 293.293 33.3214 0.2034 870 +872 3 264.2732 292.3069 33.532 0.2034 871 +873 3 264.2365 291.4512 32.0158 0.2669 872 +874 3 264.0924 290.4273 32.3109 0.3178 873 +875 3 263.4632 289.7134 32.2 0.3178 874 +876 3 263.3442 288.6564 32.48 0.2924 875 +877 3 263.3156 287.8956 31.4336 0.2796 876 +878 3 262.8683 287.1257 29.8343 0.3051 877 +879 3 262.397 286.2528 30.2599 0.3305 878 +880 3 261.706 286.0812 31.92 0.3305 879 +881 3 261.2633 285.2244 31.2833 0.2924 880 +882 3 260.5609 284.5483 30.24 0.2542 881 +883 3 260.0621 283.9797 31.3284 0.2288 882 +884 3 259.4054 283.2716 31.3894 0.2542 883 +885 3 258.5371 282.6424 30.7597 0.2924 884 +886 3 257.9194 281.8839 30.2347 0.3305 885 +887 3 257.4 281.2135 29.4294 0.3305 886 +888 3 256.9859 280.4276 29.5809 0.2796 887 +889 3 256.2331 279.9368 28.4547 0.2288 888 +890 3 255.4804 279.454 29.4 0.2034 889 +891 3 255.2092 279.1349 29.9348 0.2924 890 +892 3 254.6544 279.5936 30.8 0.2669 891 +893 3 255.0617 278.945 29.9289 0.2924 890 +894 3 254.0424 278.5732 29.0458 0.2161 893 +895 3 253.2107 278.326 29.1578 0.1907 894 +896 3 252.4259 277.6522 28.5659 0.1652 895 +897 3 252.3653 276.8594 27.72 0.1525 896 +898 3 251.6789 276.1193 27.587 0.1525 897 +899 3 251.108 275.2384 27.6749 0.1652 898 +900 3 250.9833 274.1356 27.1768 0.1652 899 +901 3 250.1585 273.5304 26.8562 0.1652 900 +902 3 249.3851 273.1597 26.1033 0.1398 901 +903 3 248.7331 273.4126 27.44 0.1271 902 +904 3 247.6051 273.4046 27.1631 0.1398 903 +905 3 246.8775 272.9984 28.56 0.1652 904 +906 3 245.8216 272.8223 27.83 0.1907 905 +907 3 244.7782 272.844 26.88 0.1907 906 +908 3 243.6354 272.8749 26.9052 0.2034 907 +909 3 242.6046 273.1426 27.0446 0.2288 908 +910 3 241.5819 273.1506 27.4898 0.2288 909 +911 3 240.8669 272.5717 27.5058 0.2034 910 +912 3 240.4562 272.1565 26.2601 0.1525 911 +913 3 239.4438 272.0432 25.76 0.1398 912 +914 3 238.7974 271.9288 27.3535 0.1398 913 +915 3 238.1225 271.2676 27.6744 0.1525 914 +916 3 237.3537 271.3568 26.3194 0.1525 915 +917 3 236.8069 270.969 25.1166 0.1525 916 +918 3 236.7028 270.6704 27.0304 0.1525 917 +919 3 236.3504 269.9291 28.4668 0.1398 918 +920 3 236.3195 268.824 28.8728 0.1525 919 +921 3 235.6834 268.0495 28.2523 0.178 920 +922 3 235.5839 267.2064 27.1216 0.2415 921 +923 3 236.1216 266.4376 27.16 0.2796 922 +924 3 254.4988 278.0858 29.4 0.2161 893 +925 3 254.2037 277.0505 29.0338 0.2288 924 +926 3 253.9428 276.0632 29.1939 0.2161 925 +927 3 253.5825 275.0805 29.6388 0.178 926 +928 3 253.5104 274.0955 28.84 0.1398 927 +929 3 253.5104 272.9515 28.84 0.1271 928 +930 3 253.1409 271.8865 28.8534 0.1398 929 +931 3 252.5437 270.9347 28.5692 0.1652 930 +932 3 252.252 269.9291 28.28 0.178 931 +933 3 252.5758 268.951 28.273 0.1907 932 +934 3 252.5986 267.9626 28.7207 0.178 933 +935 3 252.7096 266.9856 28.3861 0.1652 934 +936 3 252.1856 266.155 28.28 0.1525 935 +937 3 251.4398 265.3817 28.28 0.1525 936 +938 3 250.3678 265.0648 28.2072 0.1525 937 +939 3 249.2593 265.2684 28.0101 0.1652 938 +940 3 248.3418 265.2833 27.2443 0.2034 939 +941 3 247.6989 264.4962 27.4792 0.2288 940 +942 3 247.0205 263.8693 26.9744 0.2288 941 +943 3 246.27 263.0342 27.2429 0.178 942 +944 3 245.3274 262.5503 28.0 0.1652 943 +945 3 244.5918 261.9863 27.1821 0.178 944 +946 3 243.7155 261.7278 27.0357 0.2288 945 +947 3 243.2991 260.9475 26.0495 0.2415 946 +948 3 243.2144 260.1753 26.4396 0.2415 947 +949 3 242.9295 259.3185 26.5426 0.2161 948 +950 3 242.4422 258.5062 25.9938 0.2034 949 +951 3 242.1825 257.4721 25.48 0.178 950 +952 3 241.9423 256.3807 25.9484 0.178 951 +953 3 241.5682 255.3648 26.2539 0.178 952 +954 3 240.8726 254.4817 26.6224 0.2034 953 +955 3 240.121 253.6992 26.7128 0.2161 954 +956 3 239.6222 252.8 26.7966 0.2288 955 +957 3 239.5033 251.7406 26.4695 0.2161 956 +958 3 239.5628 250.6069 26.6647 0.1907 957 +959 3 239.5467 249.4641 26.6 0.1525 958 +960 3 239.1029 248.4688 27.0866 0.1271 959 +961 3 238.389 247.6291 27.44 0.1144 960 +962 3 237.7507 246.7574 27.44 0.1271 961 +963 3 237.5722 245.6362 27.44 0.1525 962 +964 3 236.9636 244.8126 27.7875 0.1907 963 +965 3 236.7348 243.8916 28.338 0.2161 964 +966 3 236.236 243.1057 28.716 0.2288 965 +967 3 235.6915 242.3873 29.461 0.2161 966 +968 3 234.8049 241.956 28.6479 0.2034 967 +969 3 233.7661 241.7615 28.56 0.1907 968 +970 3 232.939 241.1232 28.8002 0.2034 969 +971 3 231.9746 240.5683 28.3027 0.2034 970 +972 3 231.0537 239.8968 28.222 0.1907 971 +973 3 230.0881 239.3728 28.2402 0.1525 972 +974 3 229.4864 238.5972 28.56 0.1398 973 +975 3 229.0631 237.5745 28.56 0.1525 974 +976 3 228.3561 236.6822 28.56 0.178 975 +977 3 227.8745 236.0129 27.5131 0.178 976 +978 3 227.4272 235.124 28.28 0.1525 977 +979 3 227.2201 234.0567 28.28 0.1271 978 +980 3 226.9696 233.0774 28.28 0.1271 979 +981 3 226.7946 232.0192 28.28 0.1525 980 +982 3 225.956 231.66 27.1432 0.178 981 +983 3 226.0567 230.8901 27.3364 0.178 982 +984 3 225.8256 229.8468 27.72 0.1525 983 +985 3 225.8256 228.7028 27.72 0.1271 984 +986 3 225.8256 227.5588 27.72 0.1271 985 +987 3 225.7112 226.4331 27.9947 0.1398 986 +988 3 225.4984 225.5476 28.4824 0.1525 987 +989 3 225.6986 224.5661 28.285 0.1652 988 +990 3 225.7112 223.4232 28.28 0.1907 989 +991 3 312.7742 352.0122 37.4774 0.394 790 +992 3 313.4629 352.018 39.2 0.3559 991 +993 3 314.5531 352.1232 39.0611 0.3051 992 +994 3 315.6937 352.1232 39.2 0.2415 993 +995 3 316.6272 352.2319 40.0697 0.2161 994 +996 3 317.2449 351.6645 39.4985 0.2161 995 +997 3 317.8615 351.5501 38.3634 0.2034 996 +998 3 318.8236 351.3087 39.2 0.1652 997 +999 3 319.9539 351.1966 39.256 0.1271 998 +1000 3 320.9915 350.827 39.5508 0.1271 999 +1001 3 322.0085 350.4781 40.32 0.1525 1000 +1002 3 323.1388 350.2997 40.32 0.178 1001 +1003 3 324.0357 349.9496 39.5024 0.178 1002 +1004 3 325.0436 349.9496 40.32 0.1525 1003 +1005 3 326.0537 349.7242 39.48 0.1525 1004 +1006 3 326.9049 349.1271 39.1737 0.1907 1005 +1007 3 327.8933 348.6546 38.4574 0.2669 1006 +1008 3 328.9126 348.3091 38.2824 0.2924 1007 +1009 3 329.9422 348.1512 39.0362 0.2924 1008 +1010 3 330.8162 347.6513 38.8066 0.2542 1009 +1011 3 331.6685 347.0953 38.7383 0.2415 1010 +1012 3 332.443 346.5176 39.0572 0.2161 1011 +1013 3 333.5298 346.2716 38.9567 0.2161 1012 +1014 3 334.6006 345.9422 39.2 0.2415 1013 +1015 3 335.7148 345.75 39.2 0.2796 1014 +1016 3 336.6552 345.2066 38.92 0.2796 1015 +1017 3 337.6367 344.7204 38.906 0.2415 1016 +1018 3 338.5222 344.1083 38.64 0.2034 1017 +1019 3 339.3493 343.7068 39.4472 0.1907 1018 +1020 3 340.1306 343.1268 38.703 0.178 1019 +1021 3 341.1374 342.8007 38.8433 0.1525 1020 +1022 3 341.6968 342.0343 38.2917 0.1271 1021 +1023 3 342.7699 341.8272 38.4994 0.1271 1022 +1024 3 343.8807 341.8272 38.92 0.1398 1023 +1025 3 344.9995 341.6831 38.64 0.1525 1024 +1026 3 345.9765 341.2277 39.3921 0.1398 1025 +1027 3 346.9214 340.809 39.48 0.1271 1026 +1028 3 347.9201 340.3514 39.2 0.1271 1027 +1029 3 348.7152 339.768 39.17 0.1398 1028 +1030 3 349.8158 339.5861 39.2465 0.1525 1029 +1031 3 350.4941 338.9157 40.054 0.1398 1030 +1032 3 351.184 338.0497 40.1649 0.1398 1031 +1033 3 351.9779 337.2375 40.04 0.1398 1032 +1034 3 352.7627 336.4161 39.7754 0.1525 1033 +1035 3 353.4537 335.7834 40.304 0.1398 1034 +1036 3 354.0062 334.8179 40.2942 0.1398 1035 +1037 3 354.6022 333.9977 39.5335 0.1398 1036 +1038 3 354.8688 333.2232 40.1047 0.1525 1037 +1039 3 354.8688 332.1146 39.76 0.1398 1038 +1040 3 354.926 330.9821 39.76 0.1398 1039 +1041 3 355.5575 330.1161 39.9524 0.1525 1040 +1042 3 355.6868 329.2466 41.44 0.178 1041 +1043 3 356.0872 328.233 41.0396 0.2034 1042 +1044 3 356.928 327.6416 40.6 0.2034 1043 +1045 2 313.9491 377.5497 28.194 0.2034 1 +1046 2 314.3346 378.4878 29.4406 0.3051 1045 +1047 2 315.2921 379.0438 29.8995 0.394 1046 +1048 2 316.1364 379.7222 30.7801 0.4449 1047 +1049 2 316.2531 380.8536 30.8048 0.4576 1048 +1050 2 316.5425 381.9599 30.8286 0.4449 1049 +1051 3 314.7499 376.7741 26.964 0.1398 1 +1052 3 315.3905 377.7213 26.8498 0.178 1051 +1053 3 315.8264 378.5427 27.6531 0.2288 1052 +1054 3 316.9498 378.5324 27.44 0.2288 1053 +1055 3 317.5115 378.2064 29.1007 0.2288 1054 +1056 3 318.6543 378.2064 29.12 0.2288 1055 +1057 3 319.7903 378.3094 29.12 0.2924 1056 +1058 3 320.6632 378.2762 28.1529 0.3432 1057 +1059 3 321.3084 377.6104 28.7398 0.3686 1058 +1060 3 322.314 377.091 28.9512 0.3432 1059 +1061 3 323.3836 376.7192 28.9022 0.3051 1060 +1062 3 324.5196 376.3852 28.6958 0.2669 1061 +1063 3 325.341 376.6426 28.6843 0.2288 1062 +1064 3 325.9519 376.4424 29.4493 0.178 1063 +1065 3 327.0158 376.1472 29.4 0.1652 1064 +1066 3 327.7938 375.7274 28.28 0.1907 1065 +1067 3 328.5396 375.621 28.4964 0.2415 1066 +1068 3 329.3553 375.3624 29.5546 0.2669 1067 +1069 3 330.2305 375.5535 30.5978 0.2796 1068 +1070 3 331.1937 375.2675 31.8942 0.2669 1069 +1071 3 332.0037 375.0032 30.6956 0.2924 1070 +1072 3 332.9761 374.6886 30.0754 0.2924 1071 +1073 3 333.9359 374.6108 29.9622 0.2796 1072 +1074 3 335.025 374.4312 30.3635 0.2669 1073 +1075 3 335.7148 373.842 31.2332 0.2924 1074 +1076 3 336.7101 373.4771 30.5354 0.3432 1075 +1077 3 337.5178 373.2231 30.7376 0.3178 1076 +1078 3 338.5462 372.8857 30.6348 0.2796 1077 +1079 3 339.6216 372.8548 30.3873 0.2161 1078 +1080 3 340.6043 372.6569 29.9838 0.2288 1079 +1081 3 341.1408 372.4784 28.2072 0.2288 1080 +1082 3 341.6625 372.8799 27.72 0.2288 1081 +1083 3 342.1189 373.3616 27.72 0.2924 1082 +1084 3 342.7962 374.0514 27.47 0.3178 1083 +1085 3 343.7068 374.231 28.3346 0.3178 1084 +1086 3 344.4401 374.0777 27.4652 0.3178 1085 +1087 3 345.2009 374.0571 26.1884 0.3559 1086 +1088 3 345.6035 374.088 24.6884 0.394 1087 +1089 3 345.8312 374.7378 25.1006 0.4068 1088 +1090 3 346.6251 375.0032 25.5178 0.3813 1089 +1091 3 347.4351 375.3922 25.951 0.3686 1090 +1092 3 348.3251 375.1187 24.9511 0.3559 1091 +1093 3 349.3765 375.232 24.64 0.3305 1092 +1094 3 349.7208 375.7079 23.2184 0.2669 1093 +1095 3 350.334 376.249 23.3806 0.2288 1094 +1096 3 351.1096 376.0248 22.3401 0.2288 1095 +1097 3 351.9287 375.6804 23.0812 0.2669 1096 +1098 3 352.789 375.4333 21.9601 0.2924 1097 +1099 3 353.83 375.4436 21.0022 0.2924 1098 +1100 3 354.6526 375.4608 21.4315 0.2796 1099 +1101 3 355.7531 375.6919 21.28 0.2669 1100 +1102 3 356.4029 376.336 20.44 0.2796 1101 +1103 3 357.3604 376.2616 20.1211 0.2924 1102 +1104 3 358.4026 376.5407 20.4168 0.2924 1103 +1105 3 358.9586 376.948 19.04 0.3051 1104 +1106 3 359.7891 377.4193 19.6935 0.3178 1105 +1107 3 360.6368 377.52 20.55 0.3432 1106 +1108 3 361.6813 377.6424 20.1704 0.3178 1107 +1109 3 362.767 377.7042 20.2118 0.2669 1108 +1110 3 363.6307 378.2339 19.6834 0.2288 1109 +1111 3 364.269 378.664 19.0453 0.2161 1110 +1112 3 365.1053 379.1674 20.1905 0.2542 1111 +1113 3 365.8992 379.538 19.4121 0.2796 1112 +1114 3 366.5845 380.2233 19.1332 0.3178 1113 +1115 3 367.1439 380.7976 20.44 0.3305 1114 +1116 3 367.8566 381.4039 19.3466 0.3432 1115 +1117 3 368.4389 381.8111 20.44 0.3432 1116 +1118 3 369.226 382.4266 20.7158 0.3305 1117 +1119 3 370.0279 383.1416 20.713 0.2924 1118 +1120 3 370.6549 383.987 20.9905 0.2288 1119 +1121 3 371.0964 384.956 20.0603 0.1907 1120 +1122 3 371.6238 385.9067 19.6862 0.1907 1121 +1123 3 372.356 386.7098 20.0836 0.2161 1122 +1124 3 373.135 387.5106 19.6006 0.2161 1123 +1125 3 373.7803 388.2484 20.2082 0.2034 1124 +1126 3 374.4426 389.151 19.7098 0.2161 1125 +1127 3 375.113 390.0571 19.3166 0.2288 1126 +1128 3 375.9092 390.7812 19.6 0.2288 1127 +1129 3 376.8302 391.2457 19.1556 0.178 1128 +1130 3 377.9238 391.4951 19.32 0.1652 1129 +1131 3 379.0518 391.6759 19.32 0.178 1130 +1132 3 380.1798 391.7822 19.516 0.2161 1131 +1133 3 381.2083 391.7159 19.0711 0.2034 1132 +1134 3 382.1726 391.7662 19.4855 0.178 1133 +1135 3 383.2457 391.9905 20.2056 0.1652 1134 +1136 3 384.3817 392.0488 20.454 0.1907 1135 +1137 3 385.48 391.9767 20.9412 0.2161 1136 +1138 3 386.434 392.0259 20.1698 0.2288 1137 +1139 3 387.3744 392.5602 20.72 0.2161 1138 +1140 3 388.2828 393.0464 20.3428 0.2161 1139 +1141 3 389.2334 393.6424 19.9416 0.2161 1140 +1142 3 390.1097 394.3254 20.3162 0.2542 1141 +1143 3 391.1325 394.7246 20.8312 0.2796 1142 +1144 3 392.0133 395.4064 20.9084 0.2924 1143 +1145 3 393.0761 395.7771 21.1176 0.2542 1144 +1146 3 394.0405 395.9224 21.1081 0.1907 1145 +1147 3 395.1193 396.1523 21.3027 0.1525 1146 +1148 3 396.237 396.2816 20.8933 0.1525 1147 +1149 3 397.3421 396.1672 21.28 0.1907 1148 +1150 3 398.3351 396.0082 20.3633 0.2034 1149 +1151 3 399.4047 395.7176 20.417 0.1907 1150 +1152 3 400.1929 395.1456 19.6 0.1652 1151 +1153 3 401.3369 395.1376 19.6 0.1525 1152 +1154 3 402.4134 394.807 19.6 0.1525 1153 +1155 3 403.3389 394.8756 20.6735 0.1525 1154 +1156 3 404.3228 394.3334 20.503 0.178 1155 +1157 3 405.3009 393.7614 20.4666 0.2034 1156 +1158 3 406.2447 393.3678 19.9531 0.2161 1157 +1159 3 407.0055 393.1928 20.4142 0.1907 1158 +1160 3 407.5958 393.1528 18.769 0.1652 1159 +1161 3 408.543 392.7352 18.4736 0.1525 1160 +1162 3 409.6412 392.9514 18.2 0.1652 1161 +1163 3 410.7852 392.964 18.177 0.2034 1162 +1164 3 411.9006 393.075 17.7422 0.2415 1163 +1165 3 412.9199 393.2271 18.2246 0.2415 1164 +1166 3 413.6704 393.3507 18.3546 0.1907 1165 +1167 3 414.5936 393.3072 17.64 0.1652 1166 +1168 3 415.7319 393.2786 17.5336 0.1652 1167 +1169 3 416.8393 393.1928 17.801 0.2161 1168 +1170 3 417.7945 393.4216 19.0028 0.2415 1169 +1171 3 418.6651 393.3667 17.7052 0.2924 1170 +1172 3 419.7473 393.0784 17.9161 0.2924 1171 +1173 3 420.8284 393.0933 17.6568 0.2796 1172 +1174 3 421.7276 393.2431 18.4052 0.2288 1173 +1175 3 422.7091 393.29 17.4513 0.2034 1174 +1176 3 423.5614 392.9823 17.9018 0.1907 1175 +1177 3 424.6379 392.8496 17.92 0.2034 1176 +1178 3 425.2694 392.6643 16.6939 0.2288 1177 +1179 3 426.0942 392.1643 15.8841 0.2669 1178 +1180 3 426.1434 391.407 14.6555 0.2924 1179 +1181 3 426.9763 390.8533 14.9456 0.2924 1180 +1182 3 427.9349 390.4541 14.5032 0.2669 1181 +1183 3 428.8547 390.0651 15.4031 0.2161 1182 +1184 3 429.8992 389.9896 16.3702 0.1907 1183 +1185 3 430.8304 390.2184 17.36 0.1907 1184 +1186 3 341.2243 372.5573 28.089 0.1652 1082 +1187 3 340.34 372.4098 28.9332 0.2288 1186 +1188 3 328.2433 375.4802 28.4889 0.2161 1066 +1189 3 328.7753 374.6692 29.5291 0.178 1188 +1190 3 328.6712 374.3557 31.3818 0.1907 1189 +1191 3 329.1345 373.476 31.92 0.2034 1190 +1192 3 329.2707 372.4509 32.2176 0.2669 1191 +1193 3 330.0108 371.7371 33.1324 0.2796 1192 +1194 3 330.9455 371.1182 33.32 0.2924 1193 +1195 3 331.4031 370.537 33.7296 0.2415 1194 +1196 3 331.4305 369.4994 33.847 0.2415 1195 +1197 3 331.4099 368.3897 33.7924 0.2415 1196 +1198 3 330.926 367.4837 34.44 0.2542 1197 +1199 3 330.6743 366.4026 34.839 0.2161 1198 +1200 3 330.7167 365.3375 35.5491 0.1652 1199 +1201 3 330.5016 364.3262 36.2132 0.1398 1200 +1202 3 330.0657 363.7188 35.0115 0.1398 1201 +1203 3 329.5269 362.8585 36.0828 0.1652 1202 +1204 3 329.1013 362.3483 38.2687 0.1907 1203 +1205 3 328.3646 361.8083 38.3583 0.2415 1204 +1206 3 327.6473 361.1402 38.6028 0.2669 1205 +1207 3 326.7847 360.5899 38.5532 0.2669 1206 +1208 3 325.9656 360.2605 39.3156 0.2161 1207 +1209 3 325.3536 359.963 39.48 0.1907 1208 +1210 3 324.5963 359.2263 39.48 0.1652 1209 +1211 3 323.5953 358.7893 39.4834 0.1652 1210 +1212 3 323.5827 358.485 41.4355 0.1398 1211 +1213 3 322.9512 357.762 41.16 0.1398 1212 +1214 3 322.6538 357.1568 42.336 0.1652 1213 +1215 3 322.0326 356.6695 43.68 0.2034 1214 +1216 3 321.9216 355.538 43.6122 0.2288 1215 +1217 3 322.3792 354.9889 44.133 0.2034 1216 +1218 3 322.2225 354.6389 46.4366 0.1907 1217 +1219 3 321.5086 354.1778 47.4281 0.1652 1218 +1220 3 321.1094 353.4605 49.0557 0.1652 1219 +1221 3 320.7707 353.2672 51.4408 0.1398 1220 +1222 3 319.748 353.0384 51.8 0.1398 1221 +1223 3 325.5172 376.5453 29.1396 0.2161 1063 +1224 3 326.5674 376.2158 29.4557 0.2542 1223 +1225 3 327.5398 375.8166 29.12 0.2415 1224 +1226 3 324.1158 376.376 28.849 0.4576 1061 +1227 3 324.761 376.0294 27.6923 0.2796 1226 +1228 3 324.435 375.6713 26.054 0.2288 1227 +1229 3 325.0104 375.4608 24.0803 0.1907 1228 +1230 3 325.492 375.232 25.6948 0.2034 1229 +1231 3 326.0812 375.0879 27.1382 0.2288 1230 +1232 3 326.5308 374.7744 25.347 0.2542 1231 +1233 3 326.7893 374.5834 22.8903 0.2542 1232 +1234 3 326.8145 375.1222 20.6702 0.2288 1233 +1235 3 327.5203 375.3464 18.7687 0.1907 1234 +1236 3 328.5751 375.232 18.951 0.1907 1235 +1237 3 329.3954 374.7824 19.9116 0.2161 1236 +1238 3 329.9605 373.8935 19.88 0.2415 1237 +1239 3 330.8414 373.7448 18.6074 0.2288 1238 +1240 3 331.6456 374.1074 18.6435 0.2034 1239 +1241 3 332.3755 374.4667 18.6777 0.2034 1240 +1242 3 332.5677 374.1509 19.3404 0.2415 1241 +1243 3 333.3708 374.0914 20.4873 0.2796 1242 +1244 3 333.9862 373.4096 19.6 0.2924 1243 +1245 3 334.342 372.8365 21.0227 0.2415 1244 +1246 3 334.9724 372.6008 22.6467 0.1907 1245 +1247 3 336.1072 372.6008 22.96 0.178 1246 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc new file mode 100644 index 0000000..c270082 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb-IRES-Cre_Ai14_IVSCC_-176847.04.02.01_470522102_m.swc @@ -0,0 +1,1966 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/MouseCellTypes/176847.04.02.01/176847.04.02.01_MDF.swc_sorted.swc +# id,type,x,y,z,r,pid +1 1 237.4944 233.8336 35.28 5.9212 -1 +2 3 232.5043 230.7745 35.28 0.2669 1 +3 3 231.4495 231.199 35.28 0.2796 2 +4 3 230.3513 231.5181 35.28 0.2796 3 +5 3 229.2084 231.5159 35.28 0.2542 4 +6 3 228.0793 231.3282 35.28 0.2542 5 +7 3 226.9616 231.0846 35.28 0.2669 6 +8 3 225.8176 231.0617 35.28 0.3305 7 +9 3 224.6816 230.9313 35.2803 0.4576 8 +10 3 223.2768 230.103 35.2825 0.4068 9 +11 3 222.4268 229.3377 35.2898 0.3813 10 +12 3 221.523 228.6364 35.3265 0.3051 11 +13 3 220.8629 227.775 35.6944 0.4322 12 +14 3 220.4488 226.75 35.6216 0.4322 13 +15 3 220.1548 225.6803 34.9891 0.4068 14 +16 3 219.823 224.6198 34.3207 0.3305 15 +17 3 219.6572 223.5159 33.8643 0.2542 16 +18 3 219.7075 222.4039 33.2562 0.2288 17 +19 3 219.9523 221.3102 33.0162 0.2669 18 +20 3 220.5003 220.3138 32.8628 0.3178 19 +21 3 220.9121 219.2648 32.3744 0.3432 20 +22 3 220.7828 218.1482 31.9312 0.3559 21 +23 3 220.2623 217.1312 31.9368 0.3686 22 +24 3 220.2383 215.9895 32.0306 0.4068 23 +25 3 220.7977 214.4005 32.426 0.2288 24 +26 3 220.7211 213.2908 31.92 0.2796 25 +27 3 220.53 212.1754 31.6366 0.3305 26 +28 3 220.3333 211.0783 31.2928 0.3178 27 +29 3 219.7956 210.0899 31.5381 0.2924 28 +30 3 219.2911 209.1106 31.6926 0.2796 29 +31 3 219.0497 208.0135 31.1898 0.3051 30 +32 3 218.7763 206.921 30.8129 0.3178 31 +33 3 218.464 205.8205 30.77 0.2924 32 +34 3 218.2889 204.7039 30.5665 0.2542 33 +35 3 218.2821 203.5714 30.5469 0.2669 34 +36 3 218.321 202.4342 30.8241 0.3051 35 +37 3 218.5555 201.3246 31.1539 0.3178 36 +38 3 218.6104 200.208 31.7103 0.2924 37 +39 3 218.2374 199.159 31.2561 0.2924 38 +40 3 217.7867 198.1259 30.7882 0.3178 39 +41 3 217.2685 197.1112 30.5396 0.3305 40 +42 3 216.8612 196.156 29.3952 0.3051 41 +43 3 216.5695 195.0589 29.6587 0.3305 42 +44 3 216.0856 194.0224 29.741 0.3686 43 +45 3 214.9896 193.582 29.5781 0.2034 44 +46 3 214.1545 192.8349 29.1992 0.2161 45 +47 3 213.5436 191.9152 28.5219 0.1907 46 +48 3 212.808 191.0903 27.9535 0.1652 47 +49 3 212.3847 190.2243 26.7529 0.1907 48 +50 3 212.3012 189.141 26.1708 0.2415 49 +51 3 211.8299 188.1388 25.5808 0.2924 50 +52 3 211.6045 187.1424 24.353 0.2924 51 +53 3 211.8516 186.0933 23.4917 0.2542 52 +54 3 211.7727 184.9791 24.0668 0.2415 53 +55 3 210.9628 184.2446 23.9061 0.2415 54 +56 3 210.218 183.5571 23.1552 0.2796 55 +57 3 209.8805 182.6064 21.8562 0.2924 56 +58 3 209.6472 181.5928 21.107 0.2924 57 +59 3 209.4355 180.4889 21.1991 0.2669 58 +60 3 209.0706 179.4593 20.4764 0.2161 59 +61 3 208.7606 178.3965 20.16 0.178 60 +62 3 208.232 177.5488 20.16 0.178 61 +63 3 207.3752 177.1427 19.32 0.2161 62 +64 3 206.9748 176.1005 18.9241 0.2669 63 +65 3 206.3364 175.1773 18.48 0.2796 64 +66 3 205.9452 174.1111 18.48 0.2924 65 +67 3 205.4041 173.1158 18.2104 0.2669 66 +68 3 204.9098 172.1583 17.3872 0.2542 67 +69 3 204.7657 171.0383 17.1268 0.2161 68 +70 3 204.2257 170.0808 16.8725 0.2288 69 +71 3 203.1778 169.6403 16.8 0.2542 70 +72 3 202.218 169.0477 16.5819 0.3051 71 +73 3 201.3737 168.3247 16.1622 0.3051 72 +74 3 201.344 167.2093 15.7676 0.2669 73 +75 3 200.6576 166.5664 14.84 0.2161 74 +76 3 215.9494 194.0602 30.8 0.178 44 +77 3 215.7618 193.6575 30.8 0.1907 76 +78 3 215.7584 192.5135 30.8 0.2161 77 +79 3 215.4381 191.4347 30.8 0.2288 78 +80 3 215.064 190.3547 30.8 0.2161 79 +81 3 214.8638 189.229 30.8 0.2034 80 +82 3 214.7288 188.0953 30.8 0.178 81 +83 3 214.7391 186.9513 30.8 0.1525 82 +84 3 215.0354 185.868 31.0607 0.1398 83 +85 3 215.2894 184.8304 32.0354 0.1398 84 +86 3 215.6955 183.8339 32.737 0.1652 85 +87 3 215.9929 182.7346 32.76 0.178 86 +88 3 216.2858 181.634 32.76 0.1907 87 +89 3 216.5066 180.5587 32.2216 0.1907 88 +90 3 216.8406 179.505 31.92 0.178 89 +91 3 216.9024 178.3633 31.92 0.178 90 +92 3 216.9024 177.2193 31.92 0.178 91 +93 3 216.8258 176.0833 31.9827 0.2161 92 +94 3 216.6072 174.9965 32.5234 0.2542 93 +95 3 216.5592 173.8891 32.9048 0.2924 94 +96 3 216.5592 172.7795 33.488 0.2796 95 +97 3 216.5592 171.6366 33.6 0.2542 96 +98 3 216.5592 170.4926 33.6 0.2161 97 +99 3 216.51 169.3566 33.7218 0.2034 98 +100 3 216.4448 168.2229 33.88 0.1907 99 +101 3 216.4448 167.0812 33.9674 0.2161 100 +102 3 216.4448 165.9555 34.4448 0.2415 101 +103 3 216.4448 164.8744 35.0708 0.2415 102 +104 3 216.4448 163.7991 35.84 0.1907 103 +105 3 216.4448 162.6551 35.84 0.1525 104 +106 3 216.4448 161.5111 35.84 0.1398 105 +107 3 216.454 160.3671 35.84 0.1652 106 +108 3 216.5992 159.2334 35.84 0.178 107 +109 3 216.6736 158.0962 35.8672 0.1907 108 +110 3 216.6736 156.9591 36.1334 0.178 109 +111 3 216.8086 155.838 36.4 0.1652 110 +112 3 216.9996 154.7123 36.4 0.1525 111 +113 3 217.2239 153.6037 36.7189 0.1525 112 +114 3 217.2456 152.6611 37.7877 0.1398 113 +115 3 217.3497 151.5262 37.8 0.1271 114 +116 3 217.9183 150.6305 37.8 0.1144 115 +117 3 217.9732 149.4968 37.9033 0.1144 116 +118 3 218.2924 148.4569 38.64 0.1144 117 +119 3 218.7889 147.441 38.64 0.1271 118 +120 3 218.8472 146.3016 38.7374 0.1398 119 +121 3 219.0428 145.2148 39.3775 0.1525 120 +122 3 219.4341 144.176 39.6724 0.1398 121 +123 3 220.0427 143.2139 39.76 0.1271 122 +124 3 220.8538 142.4635 39.76 0.1144 123 +125 3 221.5081 141.6592 40.04 0.1144 124 +126 3 221.8182 140.569 40.04 0.1144 125 +127 3 222.2254 139.552 40.2016 0.1144 126 +128 3 222.4325 138.4595 40.6 0.1144 127 +129 3 222.7368 137.4161 40.6 0.1144 128 +130 3 222.7665 136.2744 40.6428 0.1144 129 +131 3 222.8706 135.1945 41.4442 0.1144 130 +132 3 223.0731 134.1271 42.0 0.1144 131 +133 3 223.2367 133.038 42.1842 0.1144 132 +134 3 223.4678 131.941 42.28 0.1144 133 +135 3 223.8808 130.9319 42.3525 0.1144 134 +136 3 224.3487 130.0717 43.12 0.1144 135 +137 3 224.8887 129.0787 43.2149 0.1144 136 +138 3 225.5041 128.239 44.3254 0.1144 137 +139 3 226.3141 127.6304 44.8 0.1144 138 +140 3 226.4376 126.5104 44.8 0.1144 139 +141 3 226.9021 125.6455 44.0115 0.1144 140 +142 3 227.3597 124.7383 43.4 0.1144 141 +143 3 227.7658 123.6893 43.4 0.1144 142 +144 3 227.8848 122.5682 43.12 0.1144 143 +145 3 228.3504 121.7079 42.5508 0.1144 144 +146 3 228.4911 120.6268 42.28 0.1144 145 +147 3 228.7931 119.5263 42.28 0.1144 146 +148 3 229.4441 118.722 42.9234 0.1144 147 +149 3 229.5711 117.6238 43.1978 0.1144 148 +150 3 229.7152 116.5324 43.68 0.1144 149 +151 3 229.706 115.4056 43.2849 0.1144 150 +152 3 229.4898 114.2952 43.12 0.1144 151 +153 3 229.4864 113.1517 43.12 0.1144 152 +154 3 229.4864 112.071 42.4463 0.1271 153 +155 3 229.4864 110.9306 42.28 0.1398 154 +156 3 229.4864 109.7952 42.1574 0.1652 155 +157 3 229.3434 108.8181 40.8668 0.1652 156 +158 3 229.1993 107.8714 39.4064 0.1652 157 +159 3 229.1432 106.7387 39.2 0.1525 158 +160 3 229.1398 105.5947 39.2 0.1525 159 +161 3 229.0288 104.4855 38.787 0.178 160 +162 3 229.0288 103.3659 38.36 0.2161 161 +163 3 228.8206 102.2481 38.36 0.2542 162 +164 3 228.6993 101.1362 38.0685 0.2415 163 +165 3 228.9144 100.2135 36.533 0.1907 164 +166 3 228.959 99.2882 35.0347 0.1398 165 +167 3 229.6809 98.7205 33.88 0.1144 166 +168 3 230.2872 97.835 33.88 0.1144 167 +169 3 230.81 96.8919 33.88 0.1144 168 +170 3 231.7824 96.2999 33.88 0.1144 169 +171 3 232.6416 95.581 33.88 0.1144 170 +172 3 233.0946 94.7028 33.88 0.1144 171 +173 3 233.7489 93.8609 33.88 0.1144 172 +174 3 234.52 93.3316 33.88 0.1271 173 +175 3 234.7545 92.236 33.88 0.1398 174 +176 3 235.5439 91.411 33.88 0.1525 175 +177 3 236.4648 90.971 34.384 0.1398 176 +178 3 236.5872 89.8573 34.44 0.1271 177 +179 3 237.4017 89.2013 33.8918 0.1144 178 +180 3 238.4348 89.1176 32.9459 0.1144 179 +181 3 239.1406 88.8369 31.351 0.1144 180 +182 3 239.5536 87.9258 30.2865 0.1144 181 +183 3 240.3361 87.2805 30.0434 0.1144 182 +184 3 241.0671 86.6914 29.12 0.1144 183 +185 3 241.8816 86.0381 28.84 0.1144 184 +186 3 243.005 85.8469 28.84 0.1144 185 +187 3 244.0644 85.4372 28.84 0.1144 186 +188 3 244.3332 84.347 28.8691 0.1144 187 +189 3 244.7531 83.4076 29.3272 0.1271 188 +190 3 245.8456 83.1688 29.4 0.1652 189 +191 3 218.8655 216.0352 29.6892 0.2288 24 +192 3 217.9709 215.4472 29.1472 0.2924 191 +193 3 217.3886 214.532 28.2688 0.3305 192 +194 3 216.7743 213.6306 27.501 0.3305 193 +195 3 216.0398 212.7897 26.9248 0.3178 194 +196 3 215.3271 211.934 26.3796 0.2924 195 +197 3 214.5435 211.1252 26.2102 0.3051 196 +198 3 213.5974 210.5166 25.7942 0.3178 197 +199 3 212.6971 209.8954 25.0183 0.3305 198 +200 3 211.8745 209.1552 24.3177 0.2924 199 +201 3 211.0348 208.4048 23.8599 0.2542 200 +202 3 210.115 207.8911 23.098 0.2288 201 +203 3 209.0717 207.7767 22.1598 0.2161 202 +204 3 207.9472 207.787 21.7213 0.1907 203 +205 3 206.9393 207.5765 20.9392 0.1652 204 +206 3 206.7494 208.2595 18.9126 0.1652 205 +207 3 205.7415 208.4505 18.3109 0.1652 206 +208 3 219.9901 228.7828 36.1637 0.178 12 +209 3 218.9582 228.649 35.8758 0.2288 208 +210 3 217.9652 228.6398 34.5369 0.2669 209 +211 3 216.8967 228.7188 33.6361 0.2924 210 +212 3 215.819 228.4968 33.8341 0.3305 211 +213 3 214.7391 228.1616 34.1113 0.3305 212 +214 3 213.666 227.823 33.7378 0.3178 213 +215 3 212.6181 227.5141 33.0005 0.2796 214 +216 3 211.5485 227.6537 32.3075 0.2669 215 +217 3 210.4674 227.7372 32.9966 0.2924 216 +218 3 209.3612 227.4672 33.04 0.3051 217 +219 3 208.2183 227.4226 33.04 0.3178 218 +220 3 207.0743 227.4055 33.04 0.3051 219 +221 3 205.9475 227.2384 33.0397 0.2924 220 +222 3 204.8321 226.9822 33.0383 0.2796 221 +223 3 203.7018 226.8243 33.0285 0.2669 222 +224 3 202.6321 226.4182 32.982 0.2542 223 +225 3 201.5522 226.0441 32.9017 0.2288 224 +226 3 200.5135 225.8199 33.9307 0.2034 225 +227 3 199.4587 225.9629 32.9574 0.2161 226 +228 3 198.436 225.7409 31.9197 0.2796 227 +229 3 197.3 225.6117 31.9183 0.3559 228 +230 3 196.1605 225.5018 31.9099 0.4195 229 +231 3 195.0646 225.2021 31.8469 0.4195 230 +232 3 193.9915 224.8509 31.4586 0.394 231 +233 3 192.8887 224.6484 30.9543 0.3305 232 +234 3 191.787 224.3727 30.8157 0.2796 233 +235 3 190.6979 224.0249 30.896 0.2288 234 +236 3 189.6088 223.7229 31.2715 0.2161 235 +237 3 188.5095 223.4884 31.4448 0.2161 236 +238 3 187.3975 223.6303 31.2682 0.2161 237 +239 3 186.321 223.7664 32.1437 0.1907 238 +240 3 185.2445 223.7653 31.1996 0.1907 239 +241 3 184.1497 223.7584 30.3957 0.2161 240 +242 3 183.0091 223.7069 30.3064 0.2542 241 +243 3 181.8949 223.509 30.2042 0.2542 242 +244 3 180.8618 223.6898 29.3157 0.2415 243 +245 3 179.9295 224.2503 30.1753 0.2161 244 +246 3 178.845 224.2503 29.8222 0.2034 245 +247 3 177.7135 224.184 29.4879 0.1907 246 +248 3 176.6233 223.9849 28.8907 0.2161 247 +249 3 175.5102 223.8064 28.5891 0.2415 248 +250 3 174.3685 223.7607 28.5614 0.2669 249 +251 3 173.2245 223.7309 28.5698 0.2415 250 +252 3 172.1022 223.5353 28.6236 0.2034 251 +253 3 170.98 223.342 28.8436 0.1652 252 +254 3 169.8485 223.2539 28.6614 0.1652 253 +255 3 168.7514 222.9702 28.5998 0.178 254 +256 3 167.8706 222.6418 27.5915 0.1907 255 +257 3 166.9302 222.0996 27.44 0.178 256 +258 3 165.9555 221.5196 27.3546 0.1652 257 +259 3 164.9293 221.0997 26.88 0.1652 258 +260 3 163.9455 220.5987 26.6 0.1907 259 +261 3 162.925 220.1148 26.6 0.2161 260 +262 3 161.8554 219.751 26.4146 0.2034 261 +263 3 160.8761 219.1687 26.32 0.178 262 +264 3 159.7756 218.9078 26.2284 0.1525 263 +265 3 158.7414 218.6218 25.529 0.1652 264 +266 3 157.6409 218.3759 25.2 0.1652 265 +267 3 156.5129 218.2752 24.943 0.1652 266 +268 3 155.3769 218.2752 24.6954 0.1525 267 +269 3 154.2444 218.2706 24.36 0.1525 268 +270 3 153.1095 218.1528 24.36 0.1525 269 +271 3 152.0262 218.0132 23.5824 0.1525 270 +272 3 150.9199 217.8176 23.3666 0.1525 271 +273 3 149.7988 217.8176 22.8351 0.1525 272 +274 3 148.6582 217.8176 22.68 0.1398 273 +275 3 147.5302 217.9663 22.5543 0.1271 274 +276 3 146.4286 218.1608 22.12 0.1144 275 +277 3 145.2846 218.1608 22.12 0.1144 276 +278 3 144.1417 218.1802 22.12 0.1144 277 +279 3 143.0206 218.4045 22.12 0.1144 278 +280 3 141.9544 218.7969 22.12 0.1144 279 +281 3 140.8161 218.8472 22.12 0.1271 280 +282 3 139.6767 218.9147 22.12 0.1398 281 +283 3 138.5418 218.9616 22.0276 0.1525 282 +284 3 137.455 218.8472 21.2582 0.1398 283 +285 3 136.327 218.8472 20.7978 0.1271 284 +286 3 135.1945 218.7328 20.72 0.1144 285 +287 3 134.0699 218.6195 20.4736 0.1144 286 +288 3 132.9305 218.6687 20.44 0.1144 287 +289 3 131.8014 218.8472 20.44 0.1144 288 +290 3 130.6574 218.8472 20.44 0.1271 289 +291 3 129.5145 218.8346 20.44 0.1398 290 +292 3 128.4975 218.4296 19.88 0.1525 291 +293 3 127.365 218.3896 19.7089 0.1398 292 +294 3 126.285 218.0819 19.6 0.1271 293 +295 3 125.1948 217.8062 19.5782 0.1144 294 +296 3 124.1103 217.487 19.32 0.1144 295 +297 3 122.9869 217.2753 19.32 0.1144 296 +298 3 121.8909 217.0168 19.1425 0.1144 297 +299 3 120.7526 216.9367 19.04 0.1144 298 +300 3 119.6269 216.788 19.04 0.1271 299 +301 3 118.5184 216.9024 19.04 0.1652 300 +302 3 224.1199 231.1955 36.0307 0.2034 9 +303 3 223.271 231.8064 37.0908 0.2161 302 +304 3 222.4096 232.518 37.329 0.2288 303 +305 3 221.5814 233.265 36.7937 0.2288 304 +306 3 220.7645 234.0441 36.5649 0.2415 305 +307 3 219.8962 234.7534 37.0205 0.2796 306 +308 3 219.0726 235.497 37.6709 0.3305 307 +309 3 218.4182 236.3882 38.3275 0.3432 308 +310 3 217.8714 237.3789 38.61 0.3305 309 +311 3 217.3062 238.373 38.64 0.2924 310 +312 3 216.6564 239.3134 38.6403 0.2796 311 +313 3 216.0822 240.2983 38.6408 0.2669 312 +314 3 215.5445 241.3085 38.645 0.2796 313 +315 3 214.8981 242.2489 38.6641 0.3178 314 +316 3 214.2312 243.1778 38.7545 0.3559 315 +317 3 213.682 244.1525 39.2815 0.3686 316 +318 3 213.0792 245.0894 39.902 0.3305 317 +319 3 212.5895 246.0744 40.6006 0.2924 318 +320 3 211.9935 247.0376 40.6193 0.2796 319 +321 3 211.2842 247.8785 39.8541 0.3051 320 +322 3 210.5829 248.7056 39.0071 0.3305 321 +323 3 209.7902 249.4995 39.5382 0.3432 322 +324 3 209.018 250.2786 40.3292 0.3432 323 +325 3 208.2812 251.1263 40.8374 0.3432 324 +326 3 207.4724 251.9351 40.8736 0.3432 325 +327 3 206.6281 252.705 40.8514 0.3178 326 +328 3 205.7038 253.3743 40.7123 0.2796 327 +329 3 204.8629 254.0961 40.0336 0.2288 328 +330 3 204.0747 254.8066 39.1622 0.2288 329 +331 3 203.2327 255.5364 39.6494 0.2288 330 +332 3 202.6813 256.5374 39.7046 0.2288 331 +333 3 202.1928 257.5636 39.4624 0.2034 332 +334 3 201.5751 258.4628 39.2529 0.2288 333 +335 3 200.6427 259.1011 39.6486 0.2796 334 +336 3 199.7401 259.7898 39.7603 0.3051 335 +337 3 199.0251 260.6753 39.7614 0.2669 336 +338 3 198.4348 261.6545 39.767 0.2288 337 +339 3 197.7679 262.58 39.7911 0.2161 338 +340 3 197.0448 263.4575 39.9608 0.2161 339 +341 3 196.3424 264.3418 40.3609 0.2161 340 +342 3 195.505 265.0785 40.3273 0.2542 341 +343 3 194.6276 265.7684 39.8247 0.3178 342 +344 3 193.8565 266.6103 39.76 0.3559 343 +345 3 193.1381 267.5004 39.76 0.3305 344 +346 3 192.3133 268.2806 39.76 0.2796 345 +347 3 191.3329 268.8594 39.7603 0.2542 346 +348 3 190.4188 269.5264 39.7608 0.2415 347 +349 3 189.6443 270.365 39.7636 0.2542 348 +350 3 188.7554 271.0159 40.1682 0.2161 349 +351 3 187.7064 271.4506 40.32 0.1907 350 +352 3 186.6024 271.7252 40.32 0.1398 351 +353 3 185.5957 272.2617 40.3365 0.1398 352 +354 3 184.6931 272.9527 40.6 0.1398 353 +355 3 183.8557 273.7192 40.6 0.1652 354 +356 3 183.2242 274.5875 41.1188 0.1652 355 +357 3 182.9736 275.6708 41.44 0.1652 356 +358 3 182.3181 276.5803 41.44 0.1398 357 +359 3 181.2199 276.8137 41.5184 0.1271 358 +360 3 180.7406 277.7071 41.72 0.1271 359 +361 3 180.2269 278.6978 42.2223 0.1525 360 +362 3 179.5394 279.5902 42.5401 0.178 361 +363 3 178.5784 280.1656 42.84 0.1907 362 +364 3 177.4824 280.4184 43.1147 0.178 363 +365 3 176.6347 281.0774 43.12 0.1652 364 +366 3 175.866 281.9205 43.12 0.1652 365 +367 3 175.0114 282.6549 43.2135 0.178 366 +368 3 174.1694 283.3711 43.68 0.1907 367 +369 3 173.0506 283.5907 43.68 0.1652 368 +370 3 172.0748 284.1433 43.68 0.1398 369 +371 3 171.2419 284.9143 43.68 0.1144 370 +372 3 170.5933 285.6957 43.96 0.1144 371 +373 3 169.8565 286.5674 43.96 0.1144 372 +374 3 168.9368 287.2138 43.9863 0.1144 373 +375 3 167.9701 287.7572 44.52 0.1144 374 +376 3 167.2013 288.5957 44.52 0.1144 375 +377 3 166.4932 289.4686 44.52 0.1144 376 +378 3 165.4956 290.0143 44.52 0.1144 377 +379 3 164.72 290.822 44.8935 0.1144 378 +380 3 164.0622 291.5072 45.92 0.1144 379 +381 3 163.6835 292.5586 45.92 0.1144 380 +382 3 162.7798 293.245 45.92 0.1144 381 +383 3 161.9252 294.0 45.92 0.1144 382 +384 3 160.9528 294.5892 45.92 0.1144 383 +385 3 160.0605 295.2847 45.92 0.1144 384 +386 3 159.4873 296.2697 45.92 0.1144 385 +387 3 158.9817 297.2947 45.92 0.1144 386 +388 3 158.3834 298.2683 45.92 0.1144 387 +389 3 157.5906 299.0176 45.92 0.1144 388 +390 3 156.8127 299.8493 45.9413 0.1144 389 +391 3 156.148 300.7404 46.48 0.1271 390 +392 3 155.4479 301.6259 46.76 0.1525 391 +393 3 154.5956 302.3855 46.76 0.178 392 +394 3 153.6495 303.009 47.0246 0.178 393 +395 3 152.7263 303.684 47.04 0.1525 394 +396 3 151.7173 304.1965 46.8524 0.1271 395 +397 3 150.7586 304.8016 46.76 0.1144 396 +398 3 149.856 305.4892 46.6203 0.1144 397 +399 3 148.8939 306.0966 46.48 0.1144 398 +400 3 148.0668 306.8448 46.48 0.1144 399 +401 3 147.1195 307.474 46.48 0.1144 400 +402 3 146.3611 308.3149 46.48 0.1271 401 +403 3 145.6564 309.1832 46.6612 0.1398 402 +404 3 144.6577 309.452 47.6 0.1525 403 +405 3 143.6807 309.9702 47.6 0.1398 404 +406 3 142.8055 310.6589 47.836 0.1271 405 +407 3 142.1878 311.3774 48.72 0.1144 406 +408 3 141.2394 311.8109 48.72 0.1144 407 +409 3 140.1675 312.1633 48.72 0.1144 408 +410 3 139.1081 312.59 48.72 0.1144 409 +411 3 138.0385 312.9824 48.6329 0.1144 410 +412 3 137.0432 313.4766 48.44 0.1144 411 +413 3 135.9941 313.9182 48.44 0.1144 412 +414 3 135.0755 314.5863 48.6951 0.1144 413 +415 3 134.0596 315.1091 48.72 0.1144 414 +416 3 133.0609 315.6651 48.72 0.1144 415 +417 3 132.1148 316.2885 48.4448 0.1398 416 +418 3 131.266 317.0299 48.6114 0.1652 417 +419 3 130.2089 317.4486 48.72 0.1907 418 +420 3 129.1759 317.8112 49.275 0.1652 419 +421 3 128.2859 318.4988 49.28 0.1398 420 +422 3 127.6715 319.4517 49.0244 0.1144 421 +423 3 126.7872 320.1495 49.0 0.1144 422 +424 3 125.7828 320.5488 49.0 0.1144 423 +425 3 124.6731 320.757 49.0596 0.1144 424 +426 3 123.6927 321.3347 49.28 0.1144 425 +427 3 122.7764 321.988 49.6667 0.1144 426 +428 3 121.7765 322.5005 49.84 0.1144 427 +429 3 121.097 323.299 49.84 0.1144 428 +430 3 120.5696 324.3057 49.9288 0.1144 429 +431 3 119.834 325.1511 50.4 0.1144 430 +432 3 119.0607 325.9531 50.9158 0.1144 431 +433 3 118.3457 326.8271 51.24 0.1144 432 +434 3 117.5174 327.6096 51.24 0.1271 433 +435 3 116.7475 328.4207 51.7913 0.1398 434 +436 3 115.925 329.146 52.2684 0.1525 435 +437 3 115.1642 329.7855 53.5248 0.1398 436 +438 3 114.3723 330.5176 53.2927 0.1271 437 +439 3 113.7229 331.4568 53.2 0.1144 438 +440 3 112.7701 332.0609 53.2 0.1144 439 +441 3 111.718 332.4944 53.2 0.1144 440 +442 3 110.7486 333.063 53.2 0.1144 441 +443 3 109.967 333.8913 53.2 0.1144 442 +444 3 109.1294 334.6669 53.2 0.1398 443 +445 3 108.5156 335.5009 53.683 0.1907 444 +446 3 107.7837 336.3738 53.76 0.2415 445 +447 3 107.2058 337.3015 53.76 0.2415 446 +448 3 106.2723 337.9582 53.8331 0.1907 447 +449 3 105.5559 338.8356 54.04 0.1398 448 +450 3 104.908 339.7772 54.04 0.1144 449 +451 3 104.1519 340.634 54.04 0.1144 450 +452 3 103.1077 341.0859 54.04 0.1144 451 +453 3 102.0581 341.5343 54.0862 0.1144 452 +454 3 101.8118 342.5491 54.32 0.1144 453 +455 3 101.6026 343.3865 54.8733 0.1144 454 +456 3 101.1508 343.1931 57.4014 0.1144 455 +457 3 100.4262 343.2755 58.8 0.1144 456 +458 3 99.3275 343.4105 58.8 0.1144 457 +459 3 98.8076 344.2285 59.2567 0.1144 458 +460 3 97.6953 344.4092 59.36 0.1144 459 +461 3 96.6997 344.9698 59.36 0.1144 460 +462 3 95.6858 345.4846 59.6268 0.1144 461 +463 3 94.7804 345.9696 60.5268 0.1144 462 +464 3 94.1035 346.8173 61.0176 0.1144 463 +465 3 93.3807 347.6788 61.04 0.1144 464 +466 3 92.7652 348.6168 61.2567 0.1144 465 +467 3 92.1127 349.5309 61.6 0.1144 466 +468 3 91.2521 350.2402 61.6 0.1144 467 +469 3 90.4192 351.0044 61.6 0.1144 468 +470 3 89.5734 351.7651 61.6 0.1144 469 +471 3 88.7967 352.5819 61.6 0.1144 470 +472 3 87.992 353.3667 61.6123 0.1144 471 +473 3 87.0861 353.965 62.16 0.1144 472 +474 3 86.2486 354.5828 62.7312 0.1144 473 +475 3 85.446 355.0312 63.84 0.1144 474 +476 3 84.7198 355.8847 63.84 0.1144 475 +477 3 84.2332 356.9074 63.973 0.1144 476 +478 3 83.7408 357.8432 64.68 0.1398 477 +479 3 82.8438 358.2722 64.68 0.1144 478 +480 3 81.9626 358.9506 64.4 0.1144 479 +481 3 81.2031 359.7846 64.4 0.1144 480 +482 3 80.4524 360.6346 64.4 0.1144 481 +483 3 79.7633 361.52 64.4 0.1144 482 +484 3 79.0041 362.2133 64.4 0.1144 483 +485 3 78.1748 362.9718 64.5162 0.1144 484 +486 3 77.7279 363.9899 64.68 0.1144 485 +487 3 76.9223 364.7164 64.68 0.1144 486 +488 3 75.9201 365.2552 64.6638 0.1144 487 +489 3 75.0315 365.9061 64.12 0.1144 488 +490 3 74.6171 366.7836 63.2976 0.1144 489 +491 3 74.0669 367.7045 62.9244 0.1144 490 +492 3 73.9024 368.7364 62.16 0.1144 491 +493 3 73.9024 369.8804 62.16 0.1144 492 +494 3 73.9024 371.0244 62.16 0.1144 493 +495 3 73.9024 372.1684 62.16 0.1144 494 +496 3 73.9024 373.3124 62.16 0.1144 495 +497 3 73.9024 374.4564 62.16 0.1144 496 +498 3 73.9024 375.5992 62.2776 0.1144 497 +499 3 73.5174 376.5396 62.7542 0.1271 498 +500 3 73.1628 377.5841 63.0 0.1398 499 +501 3 72.6368 378.5553 63.0 0.1652 500 +502 3 71.9363 379.3618 63.0 0.1652 501 +503 3 71.2712 380.1718 62.72 0.1652 502 +504 3 70.8321 381.0252 62.72 0.1398 503 +505 3 69.8133 381.5148 62.72 0.1271 504 +506 3 68.8119 381.8489 62.72 0.1144 505 +507 3 68.3347 382.8213 62.3829 0.1398 506 +508 3 67.8392 383.812 61.88 0.1652 507 +509 3 83.5032 357.0699 66.7646 0.178 478 +510 3 83.0829 356.0769 67.6987 0.1398 509 +511 3 82.6625 355.0839 68.6328 0.1144 510 +512 3 82.2813 354.0623 69.4529 0.1144 511 +513 3 81.9674 352.9926 70.077 0.1144 512 +514 3 81.6533 351.9219 70.7011 0.1144 513 +515 3 81.3393 350.8522 71.3252 0.1271 514 +516 3 81.0253 349.7826 71.9494 0.1398 515 +517 3 80.5544 349.0001 73.211 0.1525 516 +518 3 79.8958 348.5642 75.236 0.1398 517 +519 3 79.1332 348.1878 77.0781 0.1398 518 +520 3 78.2696 347.8721 78.7427 0.1398 519 +521 3 77.406 347.5552 80.4076 0.1525 520 +522 3 76.5425 347.2383 82.0725 0.1398 521 +523 3 75.7549 346.9775 83.9941 0.1271 522 +524 3 74.9835 346.7304 85.9709 0.1144 523 +525 3 74.2122 346.4821 87.9474 0.1144 524 +526 3 73.4408 346.2339 89.9242 0.1144 525 +527 3 72.4419 345.9227 90.9412 0.1144 526 +528 3 71.3976 345.6001 91.7672 0.1144 527 +529 3 70.3534 345.2764 92.5932 0.1144 528 +530 3 69.3092 344.9538 93.4192 0.1144 529 +531 3 68.265 344.63 94.2455 0.1144 530 +532 3 67.2208 344.3074 95.0715 0.1144 531 +533 3 240.6827 238.4599 38.6478 0.2796 1 +534 3 241.4549 238.6247 40.6739 0.2415 533 +535 3 242.3736 238.4977 43.2348 0.2161 534 +536 3 242.7145 238.993 45.3995 0.2034 535 +537 3 242.528 239.8968 46.7916 0.2669 536 +538 3 242.2191 240.6187 48.3557 0.3051 537 +539 3 242.4628 241.718 48.8544 0.3178 538 +540 3 243.1698 241.964 49.3766 0.3305 539 +541 3 244.2715 242.0384 49.9397 0.3559 540 +542 3 245.3903 241.8519 49.8896 0.3305 541 +543 3 246.5045 241.5956 49.84 0.3178 542 +544 3 247.6039 241.2788 49.8408 0.2796 543 +545 3 248.6987 240.947 49.845 0.3051 544 +546 3 249.781 240.6987 50.4 0.3051 545 +547 3 250.8849 240.8623 50.6097 0.2924 546 +548 3 251.8436 241.3829 51.249 0.2796 547 +549 3 252.8823 241.7627 51.52 0.2796 548 +550 3 253.7586 242.4022 51.8885 0.3051 549 +551 3 254.3615 242.9353 52.92 0.2542 550 +552 3 255.0365 242.9856 52.92 0.2161 551 +553 3 256.1782 243.0439 52.92 0.2288 552 +554 3 257.3165 243.1 53.0754 0.2669 553 +555 3 258.4353 243.1 53.6396 0.2669 554 +556 3 259.5747 243.1 53.7608 0.2924 555 +557 3 260.5654 243.5954 54.04 0.3051 556 +558 3 260.6627 243.839 54.04 0.1525 557 +559 3 261.2255 244.7828 54.04 0.178 558 +560 3 262.0996 245.4795 54.04 0.2161 559 +561 3 262.8786 246.3009 54.04 0.2669 560 +562 3 263.8224 246.9061 54.04 0.2669 561 +563 3 264.844 247.4129 54.04 0.2415 562 +564 3 265.7775 248.0592 54.04 0.2034 563 +565 3 266.8151 248.4768 54.04 0.178 564 +566 3 267.9145 248.7514 54.1671 0.178 565 +567 3 269.0059 249.0808 54.32 0.178 566 +568 3 270.024 249.5808 54.32 0.1907 567 +569 3 271.0308 250.0452 54.7688 0.2034 568 +570 3 272.0318 250.4651 55.4022 0.2161 569 +571 3 272.9492 251.132 55.6083 0.2288 570 +572 3 273.9079 251.6445 56.2598 0.2034 571 +573 3 274.512 252.1399 58.0854 0.1652 572 +574 3 275.1412 252.6581 59.691 0.1271 573 +575 3 275.8825 253.491 59.92 0.1144 574 +576 3 276.4465 254.4325 60.0603 0.1144 575 +577 3 276.5917 255.4644 60.7684 0.1144 576 +578 3 276.6192 256.5706 61.2942 0.1144 577 +579 3 276.7336 257.4069 62.7645 0.1144 578 +580 3 276.6787 258.5326 63.0 0.1144 579 +581 3 276.6192 259.672 63.0 0.1144 580 +582 3 276.3561 260.5746 64.0808 0.1144 581 +583 3 276.1616 261.4566 65.6936 0.1144 582 +584 3 275.8035 262.389 66.4457 0.1144 583 +585 3 275.4649 263.4106 67.3935 0.1144 584 +586 3 275.1263 264.4322 68.3413 0.1144 585 +587 3 274.8082 265.4629 69.2227 0.1271 586 +588 3 274.7751 266.6058 69.2227 0.1398 587 +589 3 274.7682 267.6628 69.7432 0.1525 588 +590 3 274.8357 268.4785 71.6993 0.1398 589 +591 3 275.4901 269.1569 72.8255 0.1271 590 +592 3 276.4007 269.7758 73.593 0.1144 591 +593 3 277.3102 270.3936 74.3607 0.1144 592 +594 3 278.2197 271.0125 75.1282 0.1144 593 +595 3 279.1291 271.6314 75.896 0.1144 594 +596 3 280.0901 272.1965 76.4898 0.1144 595 +597 3 281.0888 272.7216 76.9479 0.1144 596 +598 3 282.0887 273.2455 77.406 0.1144 597 +599 3 283.0874 273.7695 77.8641 0.1144 598 +600 3 284.0872 274.2946 78.3224 0.1144 599 +601 3 285.0859 274.8185 78.7805 0.1144 600 +602 3 286.0858 275.3425 79.2386 0.1144 601 +603 3 287.0857 275.8676 79.6967 0.1144 602 +604 3 288.0844 276.3915 80.155 0.1144 603 +605 3 289.0842 276.9155 80.6131 0.1144 604 +606 3 289.988 277.5939 81.0566 0.1144 605 +607 3 290.8917 278.2711 81.5004 0.1144 606 +608 3 291.7955 278.9484 81.944 0.1144 607 +609 3 292.6993 279.6268 82.3878 0.1144 608 +610 3 293.611 280.2846 82.8509 0.1144 609 +611 3 294.6532 280.6392 83.6136 0.1144 610 +612 3 295.6954 280.9927 84.376 0.1144 611 +613 3 296.7376 281.3474 85.1388 0.1144 612 +614 3 297.7798 281.7008 85.9015 0.1144 613 +615 3 298.7613 282.2008 86.5225 0.1144 614 +616 3 299.6719 282.8666 86.9812 0.1144 615 +617 3 300.5826 283.5324 87.4401 0.1144 616 +618 3 301.4943 284.1982 87.8987 0.1144 617 +619 3 302.405 284.864 88.3574 0.1144 618 +620 3 303.3167 285.531 88.816 0.1144 619 +621 3 304.0477 286.3535 89.4768 0.1144 620 +622 3 304.7147 287.2332 90.2101 0.1144 621 +623 3 305.3816 288.113 90.9434 0.1144 622 +624 3 306.0486 288.9927 91.677 0.1144 623 +625 3 306.7156 289.8736 92.4106 0.1144 624 +626 3 307.41 290.7339 93.1157 0.1144 625 +627 3 308.1524 291.5621 93.7706 0.1144 626 +628 3 308.8949 292.3904 94.4255 0.1144 627 +629 3 309.6385 293.2175 95.0804 0.1144 628 +630 3 310.3809 294.0458 95.7354 0.1144 629 +631 3 311.1234 294.874 96.3903 0.1144 630 +632 3 311.867 295.7011 97.0452 0.1398 631 +633 3 312.6094 296.5294 97.7001 0.1652 632 +634 3 260.8698 243.1378 55.44 0.1525 557 +635 3 261.5012 242.2958 55.44 0.1525 634 +636 3 262.3123 241.5716 55.6696 0.1525 635 +637 3 263.2882 241.1792 56.3637 0.1525 636 +638 3 264.1885 240.5386 56.84 0.1398 637 +639 3 264.9641 239.7389 56.847 0.1271 638 +640 3 265.6562 238.858 57.2592 0.1144 639 +641 3 266.4696 238.1682 58.0983 0.1144 640 +642 3 267.4146 237.6019 58.52 0.1144 641 +643 3 268.5105 237.2782 58.52 0.1144 642 +644 3 269.261 236.4877 58.52 0.1271 643 +645 3 270.0195 235.7727 58.8512 0.1398 644 +646 3 270.9312 235.1778 59.5689 0.1652 645 +647 3 271.6336 234.3427 59.92 0.1652 646 +648 3 272.1965 233.4069 60.3764 0.1652 647 +649 3 272.4402 232.4654 61.754 0.1398 648 +650 3 273.0133 231.5891 62.44 0.1398 649 +651 3 273.7958 230.7848 62.44 0.1398 650 +652 3 274.4616 229.9932 62.6772 0.1525 651 +653 3 274.9032 229.2061 64.0926 0.1398 652 +654 3 275.0256 228.0873 64.3922 0.1271 653 +655 3 275.6399 227.219 65.24 0.1144 654 +656 3 276.3504 226.3976 65.814 0.1144 655 +657 3 276.8777 225.4229 66.3289 0.1144 656 +658 3 277.6637 224.6061 66.5552 0.1144 657 +659 3 278.429 223.7996 66.64 0.1144 658 +660 3 279.1063 222.8855 66.64 0.1144 659 +661 3 279.8762 222.0859 67.1698 0.1144 660 +662 3 280.7147 221.3823 67.7331 0.1144 661 +663 3 281.3096 220.5941 68.32 0.1144 662 +664 3 281.9811 219.8574 68.8576 0.1144 663 +665 3 282.7785 219.0611 69.16 0.1144 664 +666 3 283.3391 218.0979 69.44 0.1144 665 +667 3 284.1467 217.3852 69.44 0.1144 666 +668 3 284.7164 216.4059 69.44 0.1144 667 +669 3 285.1534 215.4358 69.6578 0.1144 668 +670 3 285.4852 214.3719 70.2937 0.1144 669 +671 3 285.817 213.308 70.9296 0.1144 670 +672 3 286.1487 212.244 71.5652 0.1144 671 +673 3 286.4793 211.1813 72.2011 0.1144 672 +674 3 286.8111 210.1173 72.837 0.1271 673 +675 3 287.1429 209.0534 73.4726 0.1525 674 +676 3 287.4746 207.9895 74.1084 0.178 675 +677 3 287.8487 206.9336 74.6382 0.178 676 +678 3 288.2846 205.8868 75.0184 0.1525 677 +679 3 288.7193 204.8401 75.399 0.1271 678 +680 3 289.154 203.7933 75.7795 0.1144 679 +681 3 289.5899 202.7477 76.16 0.1144 680 +682 3 290.0246 201.7009 76.5402 0.1144 681 +683 3 290.4605 200.6542 76.9208 0.1144 682 +684 3 290.8952 199.6074 77.3013 0.1144 683 +685 3 291.331 198.5618 77.6815 0.1144 684 +686 3 291.8413 197.5631 77.985 0.1144 685 +687 3 292.6512 196.7543 77.985 0.1144 686 +688 3 293.253 195.8391 78.2849 0.1144 687 +689 3 293.579 194.7797 78.9852 0.1144 688 +690 3 293.905 193.7215 79.6852 0.1144 689 +691 3 294.2311 192.6633 80.3855 0.1144 690 +692 3 294.6063 191.5983 80.7699 0.1144 691 +693 3 295.0056 190.5298 81.0015 0.1144 692 +694 3 295.4048 189.4624 81.233 0.1144 693 +695 3 295.8041 188.3939 81.4646 0.1144 694 +696 3 296.2033 187.3266 81.6962 0.1144 695 +697 3 296.6026 186.2581 81.928 0.1144 696 +698 3 296.9618 185.3314 82.7375 0.1144 697 +699 3 297.3839 184.3259 83.587 0.1144 698 +700 3 297.8049 183.3214 84.4365 0.1144 699 +701 3 298.2271 182.3158 85.286 0.1144 700 +702 3 298.6492 181.3114 86.1356 0.1144 701 +703 3 299.1011 180.3116 86.9193 0.1144 702 +704 3 299.6308 179.3289 87.5336 0.1144 703 +705 3 300.1593 178.3462 88.1476 0.1144 704 +706 3 300.689 177.3635 88.762 0.1271 705 +707 3 301.2175 176.3808 89.376 0.1398 706 +708 3 254.8054 243.9683 52.92 0.1652 551 +709 3 255.3294 244.9842 52.92 0.178 708 +710 3 255.8064 245.9817 53.2 0.2034 709 +711 3 256.5283 246.81 53.2 0.2161 710 +712 3 256.7742 247.9174 53.2165 0.2415 711 +713 3 257.1312 248.9538 53.48 0.2669 712 +714 3 257.8473 249.8153 53.48 0.2924 713 +715 3 258.0864 250.9204 53.48 0.2924 714 +716 3 258.0864 252.0644 53.4951 0.2542 715 +717 3 258.107 253.1649 54.1083 0.2161 716 +718 3 258.2088 254.2654 54.6 0.178 717 +719 3 258.7248 255.2436 54.8688 0.1652 718 +720 3 258.9696 256.3338 54.88 0.1398 719 +721 3 259.4684 257.2822 55.16 0.1525 720 +722 3 259.8802 258.3175 55.3938 0.178 721 +723 3 260.5574 259.2098 55.5794 0.2161 722 +724 3 260.9498 260.2669 55.9868 0.2288 723 +725 3 261.5081 261.2541 56.1061 0.2161 724 +726 3 261.873 262.2998 56.546 0.2034 725 +727 3 262.2528 263.374 56.56 0.1652 726 +728 3 262.5823 264.4653 56.56 0.1652 727 +729 3 262.9919 265.5327 56.56 0.178 728 +730 3 263.2344 266.5966 57.0668 0.2288 729 +731 3 263.263 267.736 57.1318 0.2288 730 +732 3 263.5753 268.7656 57.4 0.2034 731 +733 3 263.7744 269.881 57.4 0.1525 732 +734 3 263.954 271.009 57.4 0.1271 733 +735 3 264.1496 272.1336 57.4 0.1144 734 +736 3 264.5408 273.1483 57.4 0.1271 735 +737 3 265.2616 274.0097 57.7466 0.1525 736 +738 3 266.0143 274.6652 58.8056 0.178 737 +739 3 266.5886 275.4924 59.4961 0.178 738 +740 3 266.8952 276.5345 60.039 0.1525 739 +741 3 266.8952 277.6294 60.5783 0.1271 740 +742 3 266.655 278.707 60.7841 0.1144 741 +743 3 266.1184 279.5833 61.32 0.1144 742 +744 3 266.0075 280.121 63.488 0.1144 743 +745 3 265.9514 280.5568 66.0733 0.1144 744 +746 3 265.6551 281.035 68.2111 0.1144 745 +747 3 264.7685 281.6185 69.2541 0.1144 746 +748 3 263.8808 282.2031 70.2968 0.1144 747 +749 3 263.4792 283.1389 71.2821 0.1144 748 +750 3 263.2218 284.181 72.2501 0.1144 749 +751 3 262.9656 285.2232 73.218 0.1144 750 +752 3 262.7082 286.2654 74.1863 0.1144 751 +753 3 262.6555 287.2996 75.3242 0.1144 752 +754 3 262.6933 288.3303 76.5363 0.1144 753 +755 3 262.7299 289.3611 77.7484 0.1144 754 +756 3 262.7665 290.3918 78.9603 0.1144 755 +757 3 263.4083 291.2098 79.2994 0.1144 756 +758 3 264.2743 291.8024 79.4774 0.1144 757 +759 3 265.0534 291.275 81.0698 0.1144 758 +760 3 265.8336 290.7476 82.6619 0.1144 759 +761 3 266.6126 290.2202 84.2542 0.1144 760 +762 3 267.3917 289.6928 85.8466 0.1144 761 +763 3 268.1708 289.1654 87.439 0.1144 762 +764 3 268.951 288.6381 89.031 0.1144 763 +765 3 269.7941 288.1747 90.4616 0.1144 764 +766 3 270.8466 287.9185 91.359 0.1144 765 +767 3 271.9002 287.6634 92.2564 0.1144 766 +768 3 272.9527 287.4071 93.1538 0.1144 767 +769 3 274.0063 287.152 94.0512 0.1144 768 +770 3 275.0588 286.8958 94.9488 0.1144 769 +771 3 276.1124 286.6406 95.8462 0.1144 770 +772 3 277.1649 286.3844 96.7436 0.1144 771 +773 3 278.2185 286.1293 97.641 0.1144 772 +774 3 279.271 285.873 98.5387 0.1144 773 +775 3 280.2297 286.1052 99.9306 0.1144 774 +776 3 281.1838 286.3592 101.3446 0.1144 775 +777 3 282.139 286.612 102.7586 0.1144 776 +778 3 283.0931 286.866 104.1723 0.1271 777 +779 3 284.0472 287.1188 105.5863 0.1398 778 +780 3 241.6746 240.6633 49.56 0.3051 539 +781 3 240.7376 240.0089 49.56 0.2415 780 +782 3 239.7286 239.4701 49.56 0.2288 781 +783 3 238.7436 238.905 49.56 0.2542 782 +784 3 237.9211 238.111 49.56 0.2924 783 +785 3 237.0871 237.3297 49.56 0.2796 784 +786 3 236.0701 236.8355 49.84 0.2542 785 +787 3 235.1435 236.1742 49.8778 0.2161 786 +788 3 234.5555 235.5542 51.24 0.2415 787 +789 3 233.6574 234.9936 51.5852 0.2542 788 +790 3 233.1175 234.0144 51.8 0.2796 789 +791 3 232.2274 233.3028 51.8686 0.2542 790 +792 3 231.398 232.5946 52.3494 0.2415 791 +793 3 231.088 231.6589 53.2 0.2288 792 +794 3 230.5229 230.834 53.2 0.2415 793 +795 3 229.61 230.1579 53.3341 0.2669 794 +796 3 228.7382 229.5447 54.1635 0.2924 795 +797 3 227.775 228.9888 54.588 0.2796 796 +798 3 226.7465 228.498 54.6 0.2542 797 +799 3 225.6895 228.0598 54.637 0.2415 798 +800 3 224.7274 227.4684 54.9755 0.2542 799 +801 3 223.7241 226.9547 55.3235 0.2542 800 +802 3 222.7002 226.496 55.72 0.2415 801 +803 3 221.6008 226.2317 55.72 0.2288 802 +804 3 220.4717 226.0567 55.72 0.2288 803 +805 3 219.4192 225.7112 56.28 0.2161 804 +806 3 218.4777 225.0866 56.56 0.2161 805 +807 3 217.5133 224.4814 56.56 0.2415 806 +808 3 216.4608 224.081 56.7403 0.3051 807 +809 3 215.6429 223.318 57.1637 0.3432 808 +810 3 214.6464 222.7929 57.4 0.3305 809 +811 3 213.5368 222.5286 57.4 0.2669 810 +812 3 212.8892 222.1488 59.08 0.2034 811 +813 3 212.1422 221.3045 59.08 0.1525 812 +814 3 211.3643 220.4831 59.08 0.1652 813 +815 3 210.599 219.8207 59.08 0.2161 814 +816 3 209.6929 219.2419 59.1007 0.2796 815 +817 3 208.9974 218.7374 60.1138 0.2796 816 +818 3 208.1062 218.3919 61.299 0.2288 817 +819 3 207.1063 217.9778 61.6 0.2034 818 +820 3 206.0939 217.4469 61.6 0.2034 819 +821 3 205.03 217.0809 61.6 0.2288 820 +822 3 204.0633 216.4723 61.6 0.2034 821 +823 3 203.0325 215.9872 61.6 0.1652 822 +824 3 201.9606 215.7115 61.6 0.1271 823 +825 3 201.0443 215.0388 61.6 0.1144 824 +826 3 200.0639 214.4554 61.6 0.1144 825 +827 3 199.0606 213.9452 61.6 0.1271 826 +828 3 198.1991 213.2405 61.6 0.1525 827 +829 3 197.3022 212.5815 61.8377 0.1907 828 +830 3 196.5564 211.7761 61.88 0.2034 829 +831 3 196.1468 210.7442 61.88 0.2034 830 +832 3 195.624 209.8611 61.88 0.178 831 +833 3 195.5817 208.7182 61.88 0.1652 832 +834 3 195.3666 207.6028 61.88 0.1398 833 +835 3 195.2808 206.7162 62.9541 0.1271 834 +836 3 195.2808 205.6111 63.5513 0.1144 835 +837 3 195.2808 204.4717 63.7003 0.1144 836 +838 3 195.2911 203.3426 64.12 0.1144 837 +839 3 195.5474 202.2306 64.12 0.1144 838 +840 3 195.6926 201.1038 64.12 0.1144 839 +841 3 195.9729 199.9964 64.12 0.1271 840 +842 3 196.2578 198.9176 64.12 0.1398 841 +843 3 196.5838 197.8342 64.12 0.1525 842 +844 3 196.6822 196.7028 64.3765 0.1398 843 +845 3 196.768 195.5668 64.4 0.1271 844 +846 3 197.0975 194.599 65.4251 0.1271 845 +847 3 197.1112 193.5168 66.08 0.1398 846 +848 3 197.0952 192.3762 66.1046 0.1525 847 +849 3 196.7783 191.3374 66.8682 0.1525 848 +850 3 196.307 190.5275 67.76 0.1525 849 +851 3 196.0942 189.4086 67.76 0.1525 850 +852 3 195.5657 188.4408 68.32 0.1398 851 +853 3 194.7294 187.7167 68.4536 0.1271 852 +854 3 194.4445 186.6848 69.1807 0.1144 853 +855 3 193.8233 185.7501 69.6508 0.1271 854 +856 3 193.439 184.6851 69.72 0.1398 855 +857 3 193.2239 183.6086 70.2388 0.1525 856 +858 3 193.1221 182.5275 70.56 0.1398 857 +859 3 192.4574 181.8045 70.9923 0.1271 858 +860 3 192.1531 180.7634 71.8796 0.1144 859 +861 3 191.8488 179.7213 72.7672 0.1144 860 +862 3 191.5445 178.6802 73.6548 0.1144 861 +863 3 191.2402 177.6392 74.5424 0.1144 862 +864 3 190.9347 176.597 75.43 0.1144 863 +865 3 190.6304 175.556 76.3174 0.1144 864 +866 3 190.3261 174.5149 77.205 0.1144 865 +867 3 189.8022 173.5402 77.5468 0.1144 866 +868 3 189.1398 172.6067 77.5468 0.1144 867 +869 3 188.4774 171.6744 77.5468 0.1144 868 +870 3 187.8151 170.742 77.5468 0.1144 869 +871 3 186.9193 170.067 77.9691 0.1144 870 +872 3 185.9915 169.4264 78.4476 0.1144 871 +873 3 185.0637 168.7858 78.9261 0.1144 872 +874 3 184.1325 168.144 79.2994 0.1144 873 +875 3 183.1864 167.501 79.2994 0.1144 874 +876 3 182.2392 166.8581 79.2994 0.1144 875 +877 3 181.2931 166.2163 79.2994 0.1144 876 +878 3 180.347 165.5734 79.2994 0.1144 877 +879 3 179.4844 164.8344 79.4066 0.1144 878 +880 3 178.7054 164.0016 79.6208 0.1144 879 +881 3 177.9263 163.1687 79.835 0.1144 880 +882 3 177.1473 162.3359 80.0492 0.1144 881 +883 3 176.3682 161.5031 80.2634 0.1144 882 +884 3 175.588 160.6702 80.4776 0.1271 883 +885 3 174.8089 159.8362 80.6921 0.1398 884 +886 3 174.0299 159.0034 80.9063 0.1525 885 +887 3 173.2519 158.1752 81.1983 0.1398 886 +888 3 172.4763 157.3549 81.6564 0.1271 887 +889 3 171.7007 156.5358 82.1145 0.1144 888 +890 3 170.925 155.7156 82.5726 0.1144 889 +891 3 170.1483 154.8965 83.0304 0.1144 890 +892 3 169.3726 154.0762 83.4884 0.1144 891 +893 3 168.597 153.2571 83.9465 0.1144 892 +894 3 167.8214 152.4369 84.4046 0.1144 893 +895 3 167.0457 151.6178 84.8627 0.1144 894 +896 3 166.0848 151.0572 85.2944 0.1144 895 +897 3 165.0495 150.603 85.7158 0.1144 896 +898 3 164.0141 150.1477 86.137 0.1144 897 +899 3 162.9239 149.8468 86.3092 0.1144 898 +900 3 161.7971 149.6512 86.3092 0.1144 899 +901 3 160.6714 149.4808 86.3092 0.1144 900 +902 3 159.58 149.8251 86.3092 0.1144 901 +903 3 158.4715 149.5711 86.3092 0.1144 902 +904 3 157.6226 148.9133 86.5875 0.1144 903 +905 3 156.9374 148.0153 87.0402 0.1144 904 +906 3 156.2521 147.1184 87.4927 0.1144 905 +907 3 155.5668 146.2215 87.9455 0.1144 906 +908 3 154.8816 145.3235 88.398 0.1144 907 +909 3 154.1963 144.4266 88.8507 0.1144 908 +910 3 153.5111 143.5297 89.3035 0.1144 909 +911 3 152.827 142.6316 89.756 0.1144 910 +912 3 152.1417 141.7347 90.2087 0.1144 911 +913 3 151.4564 140.8378 90.6615 0.1144 912 +914 3 150.7712 139.9398 91.114 0.1271 913 +915 3 150.0859 139.0429 91.5667 0.1398 914 +916 3 241.9972 239.7961 42.4637 0.2288 534 +917 3 242.0429 240.9378 42.4147 0.2796 916 +918 3 241.9125 242.0693 42.4371 0.3178 917 +919 3 241.5556 243.1538 42.3444 0.3559 918 +920 3 241.2627 244.2451 41.9922 0.3432 919 +921 3 241.1552 245.3823 41.946 0.3432 920 +922 3 241.1552 246.5171 41.6836 0.3305 921 +923 3 241.1552 247.6291 41.0589 0.3686 922 +924 3 241.1495 248.7708 40.88 0.4068 923 +925 3 241.1174 249.9137 40.88 0.4322 924 +926 3 241.0008 251.0508 40.88 0.4195 925 +927 3 240.8349 252.1811 40.8814 0.394 926 +928 3 240.8532 253.3159 40.8915 0.3813 927 +929 3 241.1312 254.4256 40.9223 0.3559 928 +930 3 241.4057 254.8546 41.0052 0.3432 929 +931 3 241.9263 255.8373 41.4901 0.3432 930 +932 3 242.353 256.8051 42.5244 0.3178 931 +933 3 242.9181 257.7649 43.0377 0.2796 932 +934 3 243.4958 258.7442 42.8288 0.2796 933 +935 3 243.934 259.7669 42.3074 0.3051 934 +936 3 244.2085 260.8663 42.049 0.3305 935 +937 3 244.5998 261.9325 42.2979 0.3559 936 +938 3 245.0517 262.9598 42.8252 0.3686 937 +939 3 245.5241 263.9906 43.1113 0.3686 938 +940 3 245.9554 265.0499 43.066 0.3432 939 +941 3 246.421 266.0852 42.8109 0.3178 940 +942 3 246.9896 267.0531 42.2999 0.3178 941 +943 3 247.6314 267.9877 42.0118 0.3305 942 +944 3 248.2995 268.9144 42.0109 0.3432 943 +945 3 248.9973 269.8181 42.058 0.3305 944 +946 3 249.6448 270.7493 42.3279 0.3051 945 +947 3 250.1505 271.7172 42.4556 0.2669 946 +948 3 250.2042 272.8268 42.0574 0.2542 947 +949 3 250.0509 273.9594 42.0 0.2415 948 +950 3 250.131 275.0794 41.9994 0.2542 949 +951 3 250.4365 276.181 41.9969 0.2415 950 +952 3 250.6641 277.301 41.9787 0.2669 951 +953 3 250.7648 278.4359 41.8659 0.2542 952 +954 3 250.7659 279.5581 41.405 0.2415 953 +955 3 250.7717 280.677 40.9312 0.1907 954 +956 3 250.8117 281.8187 40.88 0.1907 955 +957 3 251.0245 282.9329 40.88 0.2161 956 +958 3 251.4535 283.9923 40.88 0.2542 957 +959 3 251.8974 285.0448 40.88 0.2415 958 +960 3 252.1708 286.1476 40.88 0.2034 959 +961 3 252.4087 287.2595 40.88 0.1652 960 +962 3 252.7588 288.3486 40.8811 0.1652 961 +963 3 252.9887 289.464 40.8873 0.2034 962 +964 3 253.0379 290.6046 40.9391 0.2415 963 +965 3 253.0459 291.7463 40.9116 0.2669 964 +966 3 253.0539 292.8903 40.9035 0.2542 965 +967 3 253.0608 294.032 41.0455 0.2542 966 +968 3 253.1066 295.1428 41.6777 0.2669 967 +969 3 253.4257 296.2194 41.4974 0.2796 968 +970 3 253.8822 297.2432 40.9441 0.2669 969 +971 3 254.381 298.2694 40.88 0.2288 970 +972 3 254.8798 299.299 40.88 0.2161 971 +973 3 255.3683 300.3332 40.88 0.2288 972 +974 3 255.7675 301.4051 40.88 0.2415 973 +975 3 256.0352 302.5159 40.88 0.2415 974 +976 3 256.24 303.6416 40.88 0.2034 975 +977 3 256.256 304.7845 40.88 0.1907 976 +978 3 256.2549 305.9285 40.88 0.1907 977 +979 3 256.2457 307.0725 40.8794 0.2415 978 +980 3 256.1839 308.2142 40.8766 0.3051 979 +981 3 255.8716 309.3124 40.8587 0.3559 980 +982 3 255.5307 310.4038 40.7509 0.394 981 +983 3 255.4415 311.5192 40.2097 0.4068 982 +984 3 255.4941 312.6312 39.9403 0.4068 983 +985 3 255.7515 313.7271 40.3894 0.394 984 +986 3 255.9975 314.8208 40.8551 0.3686 985 +987 3 256.1874 315.9373 40.9156 0.3686 986 +988 3 255.978 317.0379 41.2118 0.3305 987 +989 3 255.5742 318.0881 41.7043 0.2924 988 +990 3 255.0823 319.1062 42.0538 0.2161 989 +991 3 254.9015 320.2193 42.4514 0.2034 990 +992 3 254.8832 321.345 42.9346 0.2288 991 +993 3 254.8821 322.4581 42.3979 0.2924 992 +994 3 254.8775 323.5976 42.28 0.3178 993 +995 3 254.8317 324.6958 42.9554 0.3051 994 +996 3 254.6338 325.7963 43.4034 0.2796 995 +997 3 254.1842 326.8271 43.8948 0.2669 996 +998 3 253.7678 327.8727 43.8463 0.2415 997 +999 3 253.6843 328.9526 43.2625 0.2288 998 +1000 3 254.0881 330.0085 43.0408 0.2034 999 +1001 3 254.7036 330.9546 42.7059 0.2161 1000 +1002 3 255.2195 331.903 42.0913 0.2161 1001 +1003 3 255.3282 333.0378 41.9972 0.2542 1002 +1004 3 255.247 334.1761 41.9821 0.2924 1003 +1005 3 254.961 335.2767 41.8956 0.3305 1004 +1006 3 254.5789 336.3326 41.5209 0.3559 1005 +1007 3 254.4439 337.4308 40.9612 0.3559 1006 +1008 3 254.5503 338.5645 40.9083 0.3559 1007 +1009 3 254.786 339.6811 41.0337 0.3432 1008 +1010 3 254.8866 340.7804 41.6478 0.3559 1009 +1011 3 254.9107 341.8901 42.2962 0.3686 1010 +1012 3 255.1314 342.9563 43.1029 0.3686 1011 +1013 3 255.3133 344.0706 43.2737 0.3305 1012 +1014 3 255.3442 345.2123 43.1642 0.2796 1013 +1015 3 255.3602 346.3552 43.2387 0.2415 1014 +1016 3 255.4701 347.4603 43.8556 0.2415 1015 +1017 3 255.7286 348.5276 44.6281 0.2542 1016 +1018 3 255.8007 349.6293 45.3202 0.2669 1017 +1019 3 255.8396 350.7607 45.6966 0.2924 1018 +1020 3 256.0741 351.8681 45.4474 0.3305 1019 +1021 3 256.5466 352.9057 45.4188 0.3686 1020 +1022 3 257.0122 353.9433 45.7064 0.3686 1021 +1023 3 257.3462 355.0026 46.3456 0.3432 1022 +1024 3 257.591 356.1158 46.4738 0.3051 1023 +1025 3 257.5316 357.2506 46.48 0.2542 1024 +1026 3 257.3062 358.3706 46.4803 0.2288 1025 +1027 3 257.2879 359.502 46.4822 0.2034 1026 +1028 3 257.6174 360.5968 46.4932 0.2415 1027 +1029 3 257.9594 361.6756 46.5674 0.2415 1028 +1030 3 257.9297 362.791 46.916 0.2796 1029 +1031 3 257.5556 363.8355 47.5132 0.2669 1030 +1032 3 257.1998 364.9005 47.6694 0.3178 1031 +1033 3 257.1712 366.0251 48.0399 0.3432 1032 +1034 3 257.1678 367.0799 49.0921 0.3813 1033 +1035 3 257.1449 368.1083 50.2642 0.3559 1034 +1036 3 257.0065 369.2054 50.5201 0.3178 1035 +1037 3 256.6278 370.2579 50.2874 0.2542 1036 +1038 3 256.3201 371.3149 50.7184 0.2288 1037 +1039 3 256.4837 372.4223 50.9897 0.2161 1038 +1040 3 257.0259 373.4005 51.2366 0.2542 1039 +1041 3 257.7649 374.2459 51.774 0.2542 1040 +1042 3 258.0875 375.3338 52.0772 0.2669 1041 +1043 3 258.2019 376.4721 52.0836 0.2542 1042 +1044 3 258.7019 377.5006 52.1004 0.2924 1043 +1045 3 259.3128 378.4638 52.1906 0.3051 1044 +1046 3 259.3414 379.5803 52.7772 0.3178 1045 +1047 3 259.0336 380.666 53.1936 0.2924 1046 +1048 3 258.973 381.8089 53.1558 0.2669 1047 +1049 3 258.8071 382.9288 52.8713 0.2415 1048 +1050 3 258.5486 383.9001 51.6541 0.2288 1049 +1051 3 258.5749 385.0235 52.1587 0.2288 1050 +1052 3 258.695 386.1023 52.8917 0.2288 1051 +1053 3 258.981 387.1788 52.6616 0.2161 1052 +1054 3 259.1023 388.2404 53.4971 0.2288 1053 +1055 3 259.3745 389.3158 53.0928 0.2288 1054 +1056 3 259.2487 390.4335 53.076 0.2542 1055 +1057 3 258.4879 391.2606 53.2053 0.2288 1056 +1058 3 257.7695 392.1495 53.2804 0.2161 1057 +1059 3 257.5293 393.2443 53.7457 0.1907 1058 +1060 3 257.2101 394.3357 53.5021 0.1907 1059 +1061 3 257.1518 395.4648 53.0905 0.178 1060 +1062 3 256.9207 396.5356 52.3426 0.1652 1061 +1063 3 256.7525 397.3615 52.7078 0.178 1062 +1064 3 256.7033 398.4998 52.5518 0.2034 1063 +1065 3 256.645 399.6186 53.0986 0.2288 1064 +1066 3 256.4436 400.7386 53.1997 0.2288 1065 +1067 3 256.5614 401.8689 53.1983 0.2288 1066 +1068 3 256.2148 402.9568 53.1882 0.2288 1067 +1069 3 255.7057 403.9716 53.1331 0.2161 1068 +1070 3 255.6131 405.0904 52.7808 0.2161 1069 +1071 3 254.9084 405.9576 52.7556 0.1271 1070 +1072 3 254.0069 406.3477 53.9748 0.1525 1071 +1073 3 253.2004 407.1393 54.3497 0.1907 1072 +1074 3 252.4362 407.9859 54.4796 0.2034 1073 +1075 3 251.7418 408.8782 54.885 0.1907 1074 +1076 3 251.0748 409.7728 55.0449 0.1525 1075 +1077 3 250.4536 410.6788 54.2718 0.1271 1076 +1078 3 249.7844 411.4785 54.2175 0.1144 1077 +1079 3 249.0499 412.2118 55.2782 0.1144 1078 +1080 3 248.5329 413.1922 55.8146 0.1398 1079 +1081 3 248.0158 414.176 55.9532 0.178 1080 +1082 3 247.2962 415.0592 55.7525 0.2415 1081 +1083 3 246.5892 415.955 55.6077 0.2669 1082 +1084 3 245.8273 416.7821 55.9518 0.2796 1083 +1085 3 245.0425 417.5852 56.4718 0.2415 1084 +1086 3 244.2795 418.4249 56.7983 0.2161 1085 +1087 3 243.5896 419.3126 57.2698 0.1907 1086 +1088 3 242.8518 420.166 57.4882 0.1907 1087 +1089 3 241.9754 420.7643 58.1658 0.178 1088 +1090 3 241.1255 421.4027 58.8 0.1525 1089 +1091 3 240.3327 422.2207 58.8 0.1271 1090 +1092 3 239.6977 423.1496 58.8 0.1144 1091 +1093 3 239.3889 424.2158 58.8 0.1144 1092 +1094 3 238.834 425.2145 58.819 0.1144 1093 +1095 3 238.3021 426.2132 59.08 0.1144 1094 +1096 3 237.5333 427.0049 59.08 0.1144 1095 +1097 3 236.7531 427.8057 59.08 0.1144 1096 +1098 3 236.411 428.8376 59.619 0.1144 1097 +1099 3 235.5187 429.5182 59.64 0.1144 1098 +1100 3 234.774 430.3762 59.64 0.1144 1099 +1101 3 234.1654 431.328 59.64 0.1144 1100 +1102 3 233.9503 432.4423 59.7985 0.1144 1101 +1103 3 233.5831 433.4547 60.5346 0.1271 1102 +1104 3 232.4871 433.7053 60.76 0.1398 1103 +1105 3 232.0032 434.5713 61.035 0.1525 1104 +1106 3 232.0032 435.7153 61.04 0.1398 1105 +1107 3 231.7458 436.7918 61.339 0.1271 1106 +1108 3 231.2928 437.7996 61.8579 0.1144 1107 +1109 3 230.5675 438.676 61.88 0.1144 1108 +1110 3 229.8159 439.5134 61.88 0.1144 1109 +1111 3 228.8572 440.059 61.9853 0.1144 1110 +1112 3 228.0495 440.6768 62.44 0.1144 1111 +1113 3 227.3929 441.5657 62.9698 0.1144 1112 +1114 3 226.663 442.3368 63.5522 0.1144 1113 +1115 3 225.765 443.038 63.56 0.1144 1114 +1116 3 224.8498 443.7198 63.56 0.1144 1115 +1117 3 223.9826 444.4143 64.0192 0.1144 1116 +1118 3 223.1715 445.2059 64.12 0.1144 1117 +1119 3 222.3078 445.9552 64.12 0.1144 1118 +1120 3 221.483 446.7263 64.3986 0.1271 1119 +1121 3 220.6948 447.542 64.4 0.1525 1120 +1122 3 219.68 448.0156 64.5372 0.1907 1121 +1123 3 219.0531 448.6516 65.8 0.2034 1122 +1124 3 218.4205 449.6012 65.8 0.1907 1123 +1125 3 217.6838 450.474 65.8 0.1525 1124 +1126 3 217.0477 451.3721 66.2245 0.1271 1125 +1127 3 216.4334 452.2392 66.64 0.1144 1126 +1128 3 215.7092 453.1212 66.64 0.1144 1127 +1129 3 215.048 454.0502 66.7044 0.1144 1128 +1130 3 214.4611 454.9905 67.34 0.1144 1129 +1131 3 214.0424 455.884 68.32 0.1144 1130 +1132 3 213.6992 456.925 68.32 0.1144 1131 +1133 3 213.3137 457.8208 68.32 0.1144 1132 +1134 3 212.3836 458.1731 68.32 0.1144 1133 +1135 3 211.8894 459.1753 68.5017 0.1271 1134 +1136 3 211.0897 459.9383 68.8246 0.1398 1135 +1137 3 210.385 460.579 70.2822 0.1525 1136 +1138 3 209.7032 461.3146 70.56 0.1525 1137 +1139 3 208.8486 462.0044 70.56 0.1652 1138 +1140 3 208.041 462.8132 70.56 0.2161 1139 +1141 3 207.7504 463.7776 70.28 0.2796 1140 +1142 3 255.8991 405.8008 53.2 0.2034 1070 +1143 3 256.4585 406.7698 53.2 0.2161 1142 +1144 3 256.8131 407.8577 53.2 0.178 1143 +1145 3 257.0374 408.9789 53.2 0.1398 1144 +1146 3 257.2673 410.0908 53.2 0.1144 1145 +1147 3 257.2856 411.2348 53.2 0.1144 1146 +1148 3 257.4 412.3697 53.2 0.1271 1147 +1149 3 257.3222 413.5091 53.2081 0.1398 1148 +1150 3 257.3108 414.6462 53.4486 0.1525 1149 +1151 3 257.392 415.7857 53.48 0.1525 1150 +1152 3 257.2719 416.9216 53.48 0.178 1151 +1153 3 257.1266 418.0554 53.48 0.2161 1152 +1154 3 256.7902 419.1158 53.8745 0.2415 1153 +1155 3 256.7136 420.2473 54.04 0.2161 1154 +1156 3 256.8108 421.381 54.1915 0.1652 1155 +1157 3 256.828 422.5101 54.6176 0.1271 1156 +1158 3 256.828 423.6507 54.8279 0.1144 1157 +1159 3 256.7262 424.7855 54.88 0.1144 1158 +1160 3 256.8131 425.9238 54.88 0.1271 1159 +1161 3 256.828 427.0666 54.88 0.1398 1160 +1162 3 256.7891 428.2095 54.88 0.1525 1161 +1163 3 256.4345 429.2768 54.88 0.1398 1162 +1164 3 256.232 430.4025 54.88 0.1271 1163 +1165 3 255.9643 431.5122 54.88 0.1144 1164 +1166 3 255.3763 432.4915 54.88 0.1144 1165 +1167 3 254.9347 433.5257 54.88 0.1144 1166 +1168 3 254.1762 434.3493 54.88 0.1144 1167 +1169 3 253.968 435.4567 54.88 0.1144 1168 +1170 3 253.7381 436.5561 54.8772 0.1144 1169 +1171 3 253.4269 437.6452 54.6 0.1398 1170 +1172 3 253.2816 438.7629 54.332 0.1652 1171 +1173 3 253.2816 439.9069 54.32 0.1907 1172 +1174 3 253.2816 441.0463 54.474 0.1652 1173 +1175 3 253.2816 442.1857 54.6 0.1398 1174 +1176 3 253.2816 443.3297 54.6 0.1144 1175 +1177 3 253.3171 444.4726 54.6 0.1144 1176 +1178 3 253.4635 445.604 54.49 0.1144 1177 +1179 3 253.5127 446.7389 54.2696 0.1144 1178 +1180 3 253.6248 447.8119 53.48 0.1144 1179 +1181 3 253.6248 448.9559 53.48 0.1144 1180 +1182 3 253.6248 450.0999 53.48 0.1144 1181 +1183 3 253.6248 451.2348 53.76 0.1144 1182 +1184 3 253.6248 452.3788 53.76 0.1144 1183 +1185 3 253.6248 453.5228 53.76 0.1144 1184 +1186 3 253.6248 454.6668 53.76 0.1144 1185 +1187 3 253.6248 455.8108 53.76 0.1144 1186 +1188 3 253.6248 456.9548 53.76 0.1144 1187 +1189 3 253.6248 458.0931 53.655 0.1144 1188 +1190 3 253.7369 459.0723 52.6481 0.1144 1189 +1191 3 253.7392 460.2152 52.64 0.1144 1190 +1192 3 253.7392 461.3592 52.64 0.1144 1191 +1193 3 253.7392 462.5032 52.64 0.1144 1192 +1194 3 253.7392 463.6472 52.64 0.1144 1193 +1195 3 253.7392 464.7912 52.64 0.1144 1194 +1196 3 253.7392 465.9352 52.694 0.1144 1195 +1197 3 253.7392 467.0746 52.92 0.1144 1196 +1198 3 253.7278 468.2175 52.9298 0.1144 1197 +1199 3 253.3331 468.937 54.32 0.1144 1198 +1200 3 253.1672 470.0559 54.1615 0.1144 1199 +1201 3 253.1672 471.1976 54.04 0.1144 1200 +1202 3 253.4829 472.234 53.366 0.1144 1201 +1203 3 253.7266 473.3071 52.92 0.1144 1202 +1204 3 253.7392 474.45 52.92 0.1144 1203 +1205 3 253.7392 475.594 52.92 0.1144 1204 +1206 3 253.7392 476.7288 53.2 0.1144 1205 +1207 3 253.7632 477.8728 53.2 0.1144 1206 +1208 3 254.0538 478.9631 53.3014 0.1144 1207 +1209 3 254.206 480.0647 53.48 0.1144 1208 +1210 3 254.4004 481.1904 53.48 0.1144 1209 +1211 3 254.4256 482.2944 54.0212 0.1144 1210 +1212 3 254.4313 483.4086 54.5112 0.1144 1211 +1213 3 254.8363 484.4485 54.6 0.1144 1212 +1214 3 255.1944 485.5205 54.6 0.1144 1213 +1215 3 255.2264 486.6622 54.6 0.1144 1214 +1216 3 255.2264 487.805 54.5437 0.1398 1215 +1217 3 255.2264 488.9433 54.2685 0.1907 1216 +1218 3 255.2424 489.9683 53.1927 0.2542 1217 +1219 3 255.6989 490.9716 52.64 0.2669 1218 +1220 3 256.1244 492.0344 52.64 0.2288 1219 +1221 3 256.1244 493.1773 52.64 0.178 1220 +1222 3 256.0283 494.3167 52.64 0.1652 1221 +1223 3 255.7801 495.4309 52.64 0.178 1222 +1224 3 255.5696 496.5292 52.9197 0.178 1223 +1225 3 255.5696 497.6526 53.2 0.1525 1224 +1226 3 255.6954 498.7737 53.2 0.1271 1225 +1227 3 256.256 499.7038 53.7107 0.1144 1226 +1228 3 256.2938 500.5766 52.08 0.1144 1227 +1229 3 256.2434 500.7414 52.36 0.1144 1228 +1230 3 256.3841 500.969 52.36 0.1271 1229 +1231 3 256.5992 502.065 52.36 0.1398 1230 +1232 3 256.5992 503.2033 52.5294 0.1652 1231 +1233 3 256.5992 504.3438 52.64 0.1652 1232 +1234 3 256.6839 505.4753 52.7649 0.1652 1233 +1235 3 257.1254 506.5014 52.92 0.1525 1234 +1236 3 257.4538 507.5951 52.92 0.1525 1235 +1237 3 257.9857 508.5778 52.92 0.1525 1236 +1238 3 258.6996 509.3752 53.0505 0.1652 1237 +1239 3 259.2773 510.3556 53.2459 0.178 1238 +1240 3 259.8024 511.2502 53.9904 0.2034 1239 +1241 3 259.783 512.3278 54.6 0.2034 1240 +1242 3 259.4592 513.2705 55.16 0.2034 1241 +1243 3 259.5084 514.411 55.16 0.178 1242 +1244 3 259.7887 515.5047 55.16 0.1525 1243 +1245 3 259.6686 516.6418 55.16 0.1271 1244 +1246 3 259.5736 517.7813 55.16 0.1144 1245 +1247 3 259.4786 518.9173 55.16 0.1144 1246 +1248 3 259.4592 520.0601 55.16 0.1144 1247 +1249 3 259.4592 521.2041 55.16 0.1144 1248 +1250 3 259.4592 522.3481 55.16 0.1144 1249 +1251 3 259.4592 523.4921 55.16 0.1144 1250 +1252 3 259.4592 524.5194 56.1921 0.1144 1251 +1253 3 259.4592 525.6325 56.56 0.1144 1252 +1254 3 259.3036 526.764 56.56 0.1144 1253 +1255 3 259.116 527.8896 56.5799 0.1144 1254 +1256 3 259.116 529.0073 57.0494 0.1144 1255 +1257 3 259.076 530.1445 57.12 0.1144 1256 +1258 3 258.7625 531.237 57.12 0.1144 1257 +1259 3 258.5474 532.3421 57.12 0.1144 1258 +1260 3 258.544 533.3271 58.2722 0.1144 1259 +1261 3 258.504 534.4299 58.9375 0.1144 1260 +1262 3 258.4113 535.559 59.08 0.1144 1261 +1263 3 258.0006 536.5932 59.08 0.1144 1262 +1264 3 257.972 537.7349 59.08 0.1144 1263 +1265 3 257.9011 538.8274 59.6008 0.1144 1264 +1266 3 257.4583 539.7644 60.7578 0.1144 1265 +1267 3 257.1277 540.8283 61.04 0.1144 1266 +1268 3 256.7159 541.8945 61.0708 0.1144 1267 +1269 3 256.7136 542.9996 61.6 0.1144 1268 +1270 3 256.4848 543.8873 62.5806 0.1144 1269 +1271 3 256.4848 545.0233 62.72 0.1144 1270 +1272 3 256.4848 546.1673 62.72 0.1144 1271 +1273 3 256.4848 547.1946 63.6913 0.1144 1272 +1274 3 256.4848 548.3055 64.12 0.1144 1273 +1275 3 256.4848 549.4495 64.12 0.1144 1274 +1276 3 256.5123 550.5923 64.12 0.1271 1275 +1277 3 256.7136 551.7077 64.12 0.1525 1276 +1278 3 257.1357 552.6767 64.4815 0.178 1277 +1279 3 257.7993 553.4317 65.52 0.178 1278 +1280 3 258.1836 554.4934 65.52 0.1525 1279 +1281 3 258.5703 555.5664 65.52 0.1271 1280 +1282 3 258.7579 556.6944 65.52 0.1144 1281 +1283 3 259.3002 557.6645 65.52 0.1144 1282 +1284 3 259.4592 558.7593 65.52 0.1144 1283 +1285 3 259.4592 559.9033 65.52 0.1144 1284 +1286 3 259.7498 560.7865 65.8423 0.1144 1285 +1287 3 259.9683 561.8127 66.9578 0.1144 1286 +1288 3 260.1868 562.84 68.0733 0.1144 1287 +1289 3 260.4053 563.8662 69.1888 0.1144 1288 +1290 3 260.6226 564.8923 70.3044 0.1144 1289 +1291 3 260.8412 565.9185 71.4199 0.1144 1290 +1292 3 260.8023 567.0007 72.0658 0.1144 1291 +1293 3 260.6009 568.1173 72.4156 0.1144 1292 +1294 3 260.3996 569.235 72.7653 0.1144 1293 +1295 3 260.1971 570.3515 73.115 0.1144 1294 +1296 3 259.9957 571.468 73.4644 0.1144 1295 +1297 3 259.7944 572.5857 73.8142 0.1144 1296 +1298 3 259.593 573.7023 74.1639 0.1144 1297 +1299 3 259.3917 574.82 74.5136 0.1144 1298 +1300 3 259.1892 575.9365 74.8633 0.1144 1299 +1301 3 258.9879 577.053 75.213 0.1144 1300 +1302 3 258.6481 578.1318 75.511 0.1144 1301 +1303 3 258.2122 579.1843 75.7733 0.1144 1302 +1304 3 257.7764 580.2368 76.0357 0.1144 1303 +1305 3 257.3405 581.2893 76.298 0.1144 1304 +1306 3 256.9046 582.3418 76.5604 0.1144 1305 +1307 3 256.7445 583.4457 76.6083 0.1144 1306 +1308 3 256.7822 584.5886 76.5005 0.1144 1307 +1309 3 256.8211 585.7314 76.3924 0.1144 1308 +1310 3 256.86 586.8731 76.2846 0.1144 1309 +1311 3 256.8989 588.016 76.1768 0.1144 1310 +1312 3 256.9378 589.1589 76.0687 0.1144 1311 +1313 3 256.9756 590.3006 75.9609 0.1144 1312 +1314 3 257.0145 591.4434 75.8531 0.1144 1313 +1315 3 257.0534 592.5863 75.745 0.1144 1314 +1316 3 257.0923 593.728 75.6372 0.1144 1315 +1317 3 257.1312 594.8708 75.5292 0.1144 1316 +1318 3 257.1701 596.0137 75.4214 0.1144 1317 +1319 3 256.9733 597.0994 75.3561 0.1271 1318 +1320 3 256.6106 598.1187 75.3561 0.1525 1319 +1321 3 256.7548 599.2409 75.4191 0.178 1320 +1322 3 256.7742 600.3849 75.521 0.178 1321 +1323 3 256.7948 601.5278 75.6227 0.1525 1322 +1324 3 256.8143 602.6706 75.7243 0.1271 1323 +1325 3 256.8337 603.8135 75.826 0.1144 1324 +1326 3 256.8543 604.9564 75.9276 0.1144 1325 +1327 3 256.8738 606.1004 76.0292 0.1144 1326 +1328 3 256.8944 607.2432 76.1309 0.1271 1327 +1329 3 256.9138 608.3861 76.2325 0.1652 1328 +1330 3 256.5981 500.8398 52.08 0.2034 1228 +1331 3 256.828 501.93 52.0551 0.2034 1330 +1332 3 256.828 503.034 51.3906 0.2034 1331 +1333 3 256.828 504.1722 51.24 0.1652 1332 +1334 3 257.0374 505.1984 50.96 0.1398 1333 +1335 3 257.273 506.2909 50.68 0.1144 1334 +1336 3 257.6288 507.3057 50.68 0.1144 1335 +1337 3 258.0258 507.9268 49.2192 0.1271 1336 +1338 3 258.544 508.5492 47.6896 0.1525 1337 +1339 3 258.5509 509.6566 47.1794 0.178 1338 +1340 3 258.8758 510.6793 46.48 0.178 1339 +1341 3 258.8872 511.8233 46.48 0.1652 1340 +1342 3 258.8426 512.8094 45.3306 0.1525 1341 +1343 3 258.7728 513.8139 44.151 0.1525 1342 +1344 3 258.671 514.943 43.958 0.1398 1343 +1345 3 258.5612 516.047 43.5095 0.1271 1344 +1346 3 258.1974 517.0319 42.84 0.1271 1345 +1347 3 258.0406 518.1645 42.84 0.1652 1346 +1348 3 257.972 519.3028 42.7512 0.2034 1347 +1349 3 257.6094 520.3324 42.009 0.2161 1348 +1350 3 257.4847 521.4546 41.72 0.1907 1349 +1351 3 257.4046 522.5906 41.6326 0.2034 1350 +1352 3 257.7226 523.6523 41.3837 0.2542 1351 +1353 3 258.3678 524.5206 40.8456 0.3051 1352 +1354 3 258.6584 525.422 40.0632 0.2796 1353 +1355 3 258.6859 526.5649 40.04 0.2288 1354 +1356 3 259.1926 527.5327 39.7222 0.1907 1355 +1357 3 259.7978 528.4594 39.2613 0.1907 1356 +1358 3 260.3321 529.4283 38.92 0.1652 1357 +1359 3 260.3744 530.5678 38.8805 0.1398 1358 +1360 3 260.387 531.6809 38.36 0.1144 1359 +1361 3 260.7759 532.7368 38.36 0.1144 1360 +1362 3 261.2873 533.4964 37.4413 0.1144 1361 +1363 3 261.404 534.4619 36.4 0.1144 1362 +1364 3 261.8799 535.4881 36.4 0.1144 1363 +1365 3 261.976 536.6092 36.3927 0.1271 1364 +1366 3 261.976 537.68 35.7056 0.1525 1365 +1367 3 262.4714 538.6089 35.28 0.178 1366 +1368 3 263.2172 539.4463 34.9297 0.178 1367 +1369 3 264.1004 540.0847 34.72 0.1525 1368 +1370 3 265.0351 540.6796 34.72 0.1398 1369 +1371 3 265.5647 541.6646 34.4669 0.1398 1370 +1372 3 266.0269 542.6678 33.88 0.1525 1371 +1373 3 266.7305 543.3886 33.0394 0.1398 1372 +1374 3 267.2258 544.1585 31.645 0.1271 1373 +1375 3 268.077 544.7922 31.8298 0.1144 1374 +1376 3 268.848 545.5221 32.2 0.1144 1375 +1377 3 268.9544 546.6032 31.92 0.1144 1376 +1378 3 241.0259 254.9621 40.3556 0.4195 929 +1379 3 240.7491 255.9963 39.4316 0.3559 1378 +1380 3 240.1965 256.947 38.8573 0.2924 1379 +1381 3 239.342 257.6929 38.6224 0.2669 1380 +1382 3 238.492 258.4559 38.5112 0.2669 1381 +1383 3 237.6397 259.2064 38.2323 0.2415 1382 +1384 3 236.776 259.9202 38.523 0.2034 1383 +1385 3 235.7715 260.4099 38.729 0.178 1384 +1386 3 234.8518 261.0002 38.1262 0.1907 1385 +1387 3 234.0601 261.7918 37.6088 0.2415 1386 +1388 3 233.1621 262.4874 37.4693 0.2669 1387 +1389 3 232.2309 263.1394 37.1731 0.2796 1388 +1390 3 231.2585 263.6771 36.5442 0.2415 1389 +1391 3 230.2918 264.272 36.3698 0.2288 1390 +1392 3 229.3068 264.8497 36.2247 0.2161 1391 +1393 3 228.4122 265.4904 35.5292 0.2288 1392 +1394 3 227.5633 266.2385 35.2262 0.2161 1393 +1395 3 226.7923 267.0771 34.9933 0.2034 1394 +1396 3 226.2203 267.9969 34.1695 0.1907 1395 +1397 3 225.6826 268.943 33.3029 0.1907 1396 +1398 3 225.0946 269.9119 33.0593 0.1907 1397 +1399 3 224.5615 270.9232 33.0366 0.2034 1398 +1400 3 224.049 271.946 33.0215 0.2288 1399 +1401 3 223.5662 272.9824 32.9342 0.2542 1400 +1402 3 223.3237 274.0715 32.4075 0.2669 1401 +1403 3 223.2299 275.2052 32.4461 0.2669 1402 +1404 3 222.9805 276.3149 32.69 0.2542 1403 +1405 3 223.1132 277.4028 32.0418 0.2415 1404 +1406 3 222.921 278.5171 31.8049 0.2034 1405 +1407 3 222.3067 279.4517 31.2903 0.2034 1406 +1408 3 221.5676 280.3029 30.8081 0.2161 1407 +1409 3 220.6307 280.9515 30.6561 0.2542 1408 +1410 3 219.799 281.6825 29.967 0.2542 1409 +1411 3 218.8792 282.3529 29.6834 0.2415 1410 +1412 3 217.8645 282.8792 29.6657 0.2542 1411 +1413 3 216.8681 283.442 29.5963 0.2924 1412 +1414 3 216.0078 284.1742 29.1654 0.3305 1413 +1415 3 215.3019 285.0001 28.2937 0.3432 1414 +1416 3 214.8524 285.9725 27.3112 0.3559 1415 +1417 3 214.1339 286.691 26.0282 0.3813 1416 +1418 3 213.3205 287.2962 24.7307 0.3813 1417 +1419 3 212.5998 287.9254 23.2058 0.3305 1418 +1420 3 211.9386 288.7422 22.1634 0.2415 1419 +1421 3 211.2602 289.6562 22.3306 0.178 1420 +1422 3 210.5692 290.5451 21.8576 0.178 1421 +1423 3 209.8554 291.3459 20.9138 0.1907 1422 +1424 3 209.0317 291.8859 19.5966 0.2034 1423 +1425 3 208.073 292.0003 18.1381 0.178 1424 +1426 3 207.6223 292.856 17.92 0.1652 1425 +1427 3 207.1212 293.8055 17.92 0.1525 1426 +1428 3 206.1797 294.4347 17.712 0.1398 1427 +1429 3 205.3366 295.1108 16.8314 0.1398 1428 +1430 3 204.5975 295.9436 16.6172 0.1652 1429 +1431 3 203.9432 296.6804 17.64 0.2161 1430 +1432 3 203.2579 297.4423 18.1815 0.2415 1431 +1433 3 202.6779 298.3563 17.6616 0.2288 1432 +1434 3 202.385 299.3837 16.8328 0.1907 1433 +1435 3 201.9904 300.4338 16.52 0.178 1434 +1436 3 201.511 301.4612 16.2582 0.178 1435 +1437 3 201.2296 302.5651 16.2014 0.1907 1436 +1438 3 200.7159 303.398 15.4339 0.1907 1437 +1439 3 199.9758 304.2239 14.8506 0.1907 1438 +1440 3 199.3992 305.1048 14.28 0.1907 1439 +1441 3 241.813 228.7279 37.5626 0.3686 1 +1442 3 242.3976 227.7658 37.7896 0.4449 1441 +1443 3 242.8586 226.7397 38.2886 0.4322 1442 +1444 3 243.275 225.6952 38.6366 0.3686 1443 +1445 3 243.4272 224.5752 38.7629 0.3432 1444 +1446 3 243.3471 223.461 39.2529 0.3686 1445 +1447 3 242.9936 222.4325 39.8796 0.4068 1446 +1448 3 242.4811 221.467 40.6227 0.4068 1447 +1449 3 242.234 220.4419 41.6968 0.394 1448 +1450 3 242.6756 219.4158 42.2038 0.4068 1449 +1451 3 243.219 218.4502 42.8907 0.4322 1450 +1452 3 243.5954 217.3737 43.1203 0.4576 1451 +1453 3 244.5037 215.9918 43.1284 0.2542 1452 +1454 3 245.3972 215.2916 43.1791 0.2924 1453 +1455 3 246.429 214.8054 43.3756 0.3051 1454 +1456 3 247.1063 214.174 44.24 0.2415 1455 +1457 3 247.8934 213.4555 44.24 0.178 1456 +1458 3 248.693 212.6582 44.24 0.1271 1457 +1459 3 249.527 211.9798 44.24 0.1144 1458 +1460 3 250.6069 211.648 44.24 0.1144 1459 +1461 3 251.3974 210.8472 43.9852 0.1144 1460 +1462 3 252.3458 210.2386 43.68 0.1525 1461 +1463 3 253.2816 209.5808 43.68 0.2415 1462 +1464 3 253.4944 209.4344 43.68 0.1144 1463 +1465 3 254.2609 208.7251 43.12 0.1144 1464 +1466 3 255.2127 208.208 43.12 0.1271 1465 +1467 3 256.0535 207.7424 42.5779 0.1398 1466 +1468 3 256.6095 206.7677 42.4074 0.1525 1467 +1469 3 257.1426 205.7804 42.28 0.1398 1468 +1470 3 257.8336 204.8915 42.0 0.1271 1469 +1471 3 258.4605 203.9363 42.0 0.1398 1470 +1472 3 259.2178 203.084 42.0 0.1907 1471 +1473 3 260.0015 202.2592 42.0 0.2415 1472 +1474 3 260.943 201.7524 41.8981 0.2542 1473 +1475 3 261.4909 201.4012 39.9728 0.2161 1474 +1476 3 262.4794 200.8956 39.76 0.1907 1475 +1477 3 263.3259 200.1428 39.76 0.1652 1476 +1478 3 264.1954 199.5159 39.76 0.178 1477 +1479 3 264.6209 198.8238 38.9211 0.1907 1478 +1480 3 264.7605 197.8354 37.5533 0.2288 1479 +1481 3 265.2478 196.9796 36.8018 0.2415 1480 +1482 3 266.2008 196.6021 35.7311 0.2288 1481 +1483 3 266.8975 196.0221 34.3294 0.2034 1482 +1484 3 267.3139 195.1492 32.8378 0.1907 1483 +1485 3 268.0872 194.4834 31.5717 0.1907 1484 +1486 3 268.7599 193.8016 30.0639 0.178 1485 +1487 3 269.3708 193.1026 28.4362 0.178 1486 +1488 3 269.8719 192.1794 27.326 0.1652 1487 +1489 3 270.373 191.2562 26.2161 0.178 1488 +1490 3 270.874 190.3044 25.4108 0.1652 1489 +1491 3 271.3751 189.2759 25.4108 0.1652 1490 +1492 3 271.8075 188.3116 24.6176 0.1652 1491 +1493 3 272.1885 187.3964 23.2201 0.1907 1492 +1494 3 253.4772 209.6986 44.2061 0.2924 1463 +1495 3 254.5068 209.8096 44.8 0.2288 1494 +1496 3 255.6405 209.924 44.8 0.178 1495 +1497 3 256.7845 209.924 44.8 0.1525 1496 +1498 3 257.9285 209.924 44.8 0.1652 1497 +1499 3 259.021 209.9515 45.1455 0.178 1498 +1500 3 260.0175 210.3278 45.6238 0.2034 1499 +1501 3 261.134 210.52 45.92 0.2034 1500 +1502 3 262.2437 210.7248 46.216 0.2034 1501 +1503 3 263.3728 210.7248 46.6763 0.2034 1502 +1504 3 264.4528 210.7248 47.5518 0.2161 1503 +1505 3 265.4629 210.7248 48.6612 0.2288 1504 +1506 3 266.4101 210.3793 49.28 0.2161 1505 +1507 3 267.4008 210.0384 49.8187 0.2034 1506 +1508 3 268.3744 209.9755 51.0804 0.178 1507 +1509 3 269.1821 209.6952 52.7083 0.1652 1508 +1510 3 270.318 209.6952 52.92 0.1525 1509 +1511 3 271.4323 209.5808 53.3932 0.1525 1510 +1512 3 272.5397 209.5316 54.021 0.1398 1511 +1513 3 273.5979 209.2262 54.4026 0.1271 1512 +1514 3 274.4239 208.5432 55.0984 0.1144 1513 +1515 3 275.2521 207.8248 55.9 0.1144 1514 +1516 3 276.0804 207.1075 56.7017 0.1144 1515 +1517 3 276.9361 206.5698 57.9446 0.1271 1516 +1518 3 277.8044 206.1168 59.3914 0.1398 1517 +1519 3 278.6967 205.7164 60.8247 0.1525 1518 +1520 3 279.6554 205.4647 62.2205 0.1398 1519 +1521 3 280.6152 205.213 63.6163 0.1271 1520 +1522 3 281.5739 204.9602 65.0118 0.1144 1521 +1523 3 282.552 204.5758 66.0999 0.1144 1522 +1524 3 283.5335 204.1594 67.1149 0.1144 1523 +1525 3 284.5151 203.7441 68.1296 0.1144 1524 +1526 3 285.4966 203.3277 69.1446 0.1271 1525 +1527 3 286.3581 202.6756 70.0437 0.1398 1526 +1528 3 287.2104 202.0041 70.933 0.1652 1527 +1529 3 288.2319 201.5259 71.3658 0.1652 1528 +1530 3 289.2627 201.058 71.776 0.1652 1529 +1531 3 290.2923 200.5901 72.186 0.1525 1530 +1532 3 291.323 200.1222 72.5962 0.1525 1531 +1533 3 292.4007 199.8316 73.1254 0.1525 1532 +1534 3 293.5001 199.6246 73.71 0.1398 1533 +1535 3 294.5994 199.4175 74.2949 0.1271 1534 +1536 3 295.6988 199.2104 74.8796 0.1144 1535 +1537 3 296.7982 199.0034 75.4645 0.1144 1536 +1538 3 297.8701 198.7105 76.0754 0.1144 1537 +1539 3 298.9089 198.3078 76.7203 0.1144 1538 +1540 3 299.9465 197.9051 77.3648 0.1144 1539 +1541 3 300.9841 197.5024 78.0097 0.1144 1540 +1542 3 302.0217 197.0986 78.6545 0.1144 1541 +1543 3 303.0593 196.6959 79.2994 0.1144 1542 +1544 3 243.2899 216.2652 43.6612 0.178 1452 +1545 3 242.5555 215.4484 44.3646 0.2542 1544 +1546 3 241.6036 214.8729 45.0136 0.3051 1545 +1547 3 240.7674 214.1213 45.5104 0.3432 1546 +1548 3 240.2022 213.1764 46.2297 0.3432 1547 +1549 3 239.6794 212.2383 47.1904 0.3432 1548 +1550 3 238.9233 211.4432 47.976 0.3686 1549 +1551 3 238.19 210.5875 48.447 0.3813 1550 +1552 3 237.6969 209.5957 47.7705 0.4195 1551 +1553 3 237.7426 208.4871 47.9394 0.4195 1552 +1554 3 238.1819 207.4861 48.7449 0.4068 1553 +1555 3 238.6807 206.524 49.6034 0.3432 1554 +1556 3 238.9507 205.5139 50.1231 0.2924 1555 +1557 3 238.4279 204.5541 50.7265 0.2924 1556 +1558 3 237.5962 203.8734 51.52 0.3051 1557 +1559 3 236.7165 202.7992 51.52 0.2161 1558 +1560 3 236.2463 201.765 51.52 0.2034 1559 +1561 3 235.8104 200.74 51.7409 0.1652 1560 +1562 3 235.7784 199.6005 51.8 0.1271 1561 +1563 3 235.5118 198.5721 51.8392 0.1398 1562 +1564 3 235.346 197.4876 52.36 0.1652 1563 +1565 3 234.9707 196.4237 52.542 0.1907 1564 +1566 3 234.4514 195.465 53.2 0.1907 1565 +1567 3 233.9686 194.4411 53.2 0.1907 1566 +1568 3 233.5934 193.4161 53.2 0.1907 1567 +1569 3 233.1186 192.3888 53.2 0.1652 1568 +1570 3 232.6038 191.3718 53.2 0.1398 1569 +1571 3 232.4425 190.2483 53.2 0.1144 1570 +1572 3 231.8774 189.578 54.3158 0.1398 1571 +1573 3 231.3431 188.5667 54.32 0.178 1572 +1574 3 230.5377 187.7887 54.32 0.2161 1573 +1575 3 229.8593 186.9124 54.6 0.2161 1574 +1576 3 229.2908 185.9412 54.8836 0.1907 1575 +1577 3 229.0185 185.137 56.0 0.178 1576 +1578 3 228.6787 184.0456 56.0 0.1652 1577 +1579 3 228.4454 182.9496 56.1243 0.1652 1578 +1580 3 228.1925 181.9177 56.9265 0.1525 1579 +1581 3 227.8333 180.8447 57.12 0.1652 1580 +1582 3 227.2201 180.1114 58.212 0.2034 1581 +1583 3 226.7179 179.1412 58.5298 0.2415 1582 +1584 3 226.0555 178.4903 59.852 0.2542 1583 +1585 3 225.471 177.7032 61.2545 0.2288 1584 +1586 3 224.9493 176.7503 61.917 0.2034 1585 +1587 3 224.4963 175.7459 62.44 0.1907 1586 +1588 3 223.6406 175.0377 62.44 0.178 1587 +1589 3 223.2928 174.3948 63.2789 0.1525 1588 +1590 3 222.8066 173.9052 64.4 0.1271 1589 +1591 3 222.1671 172.9762 64.4 0.1144 1590 +1592 3 221.6225 171.9718 64.4 0.1144 1591 +1593 3 220.832 171.1664 64.4 0.1144 1592 +1594 3 220.5655 170.0842 64.4 0.1144 1593 +1595 3 220.1285 169.0775 64.4 0.1144 1594 +1596 3 219.7464 168.192 64.8844 0.1144 1595 +1597 3 219.076 167.6818 66.4132 0.1144 1596 +1598 3 218.7328 166.9885 68.04 0.1144 1597 +1599 3 218.5623 165.8651 68.04 0.1144 1598 +1600 3 218.2946 164.7577 68.04 0.1144 1599 +1601 3 218.1608 163.624 68.04 0.1144 1600 +1602 3 218.0533 162.4892 68.04 0.1144 1601 +1603 3 217.8542 161.3704 68.2312 0.1271 1602 +1604 3 217.8176 160.3545 69.3342 0.1398 1603 +1605 3 217.8176 159.3237 70.3875 0.1525 1604 +1606 3 217.8176 158.1866 70.56 0.1398 1605 +1607 3 217.8942 157.054 70.56 0.1271 1606 +1608 3 218.1391 155.9695 70.761 0.1144 1607 +1609 3 218.4193 154.9491 71.4 0.1144 1608 +1610 3 218.7328 153.8714 71.6783 0.1144 1609 +1611 3 219.0497 152.7892 71.96 0.1144 1610 +1612 3 219.3162 151.7138 72.5049 0.1144 1611 +1613 3 219.5954 150.6259 72.8 0.1144 1612 +1614 3 219.9306 149.5437 72.8 0.1144 1613 +1615 3 219.9912 148.4043 72.8 0.1144 1614 +1616 3 220.1056 147.2671 72.8 0.1144 1615 +1617 3 220.252 146.3107 73.6221 0.1144 1616 +1618 3 220.8572 145.5992 73.9007 0.1144 1617 +1619 3 220.9808 144.5295 74.8434 0.1144 1618 +1620 3 221.1055 143.4599 75.7859 0.1144 1619 +1621 3 221.229 142.3891 76.7284 0.1144 1620 +1622 3 221.3526 141.3195 77.6709 0.1144 1621 +1623 3 221.5608 140.2395 78.416 0.1144 1622 +1624 3 221.8102 139.155 79.0622 0.1144 1623 +1625 3 222.0607 138.0694 79.7084 0.1144 1624 +1626 3 222.3101 136.9848 80.3547 0.1144 1625 +1627 3 222.5606 135.9003 81.0009 0.1144 1626 +1628 3 222.81 134.8158 81.6472 0.1144 1627 +1629 3 222.9473 133.7096 82.2273 0.1144 1628 +1630 3 222.9976 132.5873 82.7568 0.1144 1629 +1631 3 223.048 131.465 83.2863 0.1144 1630 +1632 3 223.0994 130.3428 83.8158 0.1144 1631 +1633 3 223.1498 129.2205 84.3452 0.1144 1632 +1634 3 223.2001 128.0983 84.8747 0.1144 1633 +1635 3 223.0125 126.9897 85.26 0.1144 1634 +1636 3 222.754 125.8835 85.6027 0.1144 1635 +1637 3 222.4966 124.7784 85.9454 0.1144 1636 +1638 3 222.2392 123.6721 86.2884 0.1144 1637 +1639 3 221.9806 122.5659 86.6312 0.1144 1638 +1640 3 221.7232 121.4608 86.9739 0.1144 1639 +1641 3 221.4658 120.3545 87.3169 0.1144 1640 +1642 3 221.2073 119.2494 87.6596 0.1144 1641 +1643 3 220.9499 118.1432 88.0023 0.1144 1642 +1644 3 221.2233 117.0609 88.0617 0.1144 1643 +1645 3 221.6088 115.9844 88.0617 0.1144 1644 +1646 3 221.9932 114.9068 88.0617 0.1144 1645 +1647 3 222.3787 113.8295 88.0617 0.1144 1646 +1648 3 222.7631 112.7522 88.0617 0.1271 1647 +1649 3 223.1486 111.6749 88.0617 0.1398 1648 +1650 3 223.4186 110.5707 88.2725 0.1525 1649 +1651 3 223.6383 109.4548 88.5749 0.1398 1650 +1652 3 223.8579 108.339 88.8773 0.1271 1651 +1653 3 224.0776 107.2231 89.18 0.1144 1652 +1654 3 224.2972 106.1071 89.4824 0.1144 1653 +1655 3 224.5169 104.9913 89.7848 0.1144 1654 +1656 3 224.7365 103.8754 90.0875 0.1144 1655 +1657 3 224.9562 102.7596 90.3899 0.1144 1656 +1658 3 225.1758 101.6437 90.6903 0.1144 1657 +1659 3 225.4378 100.5298 90.6903 0.1144 1658 +1660 3 225.6986 99.416 90.6903 0.1144 1659 +1661 3 226.2615 98.491 91.4805 0.1144 1660 +1662 3 226.8666 97.5917 92.3782 0.1144 1661 +1663 3 227.4707 96.6925 93.2758 0.1144 1662 +1664 3 228.0758 95.7932 94.1738 0.1144 1663 +1665 3 228.6799 94.8939 95.0715 0.1398 1664 +1666 3 237.65 203.7464 53.2 0.178 1558 +1667 3 238.7722 203.6686 53.4531 0.1907 1666 +1668 3 239.763 203.6045 54.32 0.1652 1667 +1669 3 240.4242 202.8529 54.32 0.1398 1668 +1670 3 241.2616 202.1128 54.5784 0.1144 1669 +1671 3 242.0521 201.2914 54.6 0.1144 1670 +1672 3 242.5177 200.3281 54.6 0.1144 1671 +1673 3 243.2407 199.7573 55.3714 0.1144 1672 +1674 3 243.8287 198.9748 56.7398 0.1144 1673 +1675 3 244.4785 198.2849 58.0633 0.1144 1674 +1676 3 245.3411 197.5928 58.329 0.1144 1675 +1677 3 245.865 196.6639 58.5239 0.1398 1676 +1678 3 246.5938 196.2189 60.0678 0.1652 1677 +1679 3 247.5204 195.8528 60.7866 0.1907 1678 +1680 3 248.4356 195.8528 62.3742 0.1652 1679 +1681 3 249.4309 195.7384 63.1907 0.1398 1680 +1682 3 250.512 195.7384 63.84 0.1271 1681 +1683 3 251.5313 195.7384 64.7592 0.1525 1682 +1684 3 252.6684 195.7384 64.9883 0.178 1683 +1685 3 253.5298 195.2442 66.103 0.178 1684 +1686 3 254.492 194.7523 66.36 0.178 1685 +1687 3 255.0537 194.3656 67.6404 0.178 1686 +1688 3 255.6176 194.3015 70.0711 0.2034 1687 +1689 3 256.1816 194.2363 72.5021 0.1907 1688 +1690 3 256.8886 194.0338 74.5766 0.178 1689 +1691 3 257.7123 193.717 76.356 0.1398 1690 +1692 3 258.5371 193.3989 78.1351 0.1271 1691 +1693 3 259.3608 193.0809 79.9145 0.1144 1692 +1694 3 260.1834 192.7388 81.6693 0.1144 1693 +1695 3 261.0025 192.3522 83.3806 0.1144 1694 +1696 3 261.8216 191.9655 85.0917 0.1144 1695 +1697 3 262.6418 191.5697 86.767 0.1144 1696 +1698 3 263.5318 190.8936 87.3712 0.1144 1697 +1699 3 264.4207 190.2175 87.9754 0.1144 1698 +1700 3 265.3096 189.5414 88.5797 0.1144 1699 +1701 3 266.1996 188.8652 89.1839 0.1144 1700 +1702 3 267.0885 188.1891 89.7882 0.1144 1701 +1703 3 267.9774 187.513 90.3921 0.1144 1702 +1704 3 268.8503 186.8918 91.2559 0.1144 1703 +1705 3 269.7277 186.3198 92.3835 0.1144 1704 +1706 3 270.6052 185.7478 93.5113 0.1144 1705 +1707 3 271.4163 185.2205 94.9892 0.1144 1706 +1708 3 272.2091 184.7057 96.565 0.1144 1707 +1709 3 273.003 184.1897 98.1406 0.1144 1708 +1710 3 273.7958 183.6749 99.7164 0.1144 1709 +1711 3 274.6847 183.2059 100.767 0.1144 1710 +1712 3 275.6697 183.0423 101.6364 0.1398 1711 +1713 3 276.5574 183.0995 103.3959 0.178 1712 +1714 2 243.2087 232.2354 37.4839 0.4068 1 +1715 2 243.767 231.2379 37.52 0.4068 1714 +1716 2 244.4007 230.2861 37.52 0.4068 1715 +1717 2 245.2942 229.5848 37.5194 0.4068 1716 +1718 2 246.2563 228.967 37.5175 0.394 1717 +1719 2 247.3053 228.514 37.5049 0.3432 1718 +1720 2 248.3269 228.0003 37.4402 0.2796 1719 +1721 2 249.4343 227.8551 36.955 0.2542 1720 +1722 2 250.4296 227.6754 35.6776 0.2669 1721 +1723 2 251.4798 227.3197 35.0406 0.2924 1722 +1724 2 252.4053 226.7545 34.167 0.3051 1723 +1725 2 253.4029 226.3312 33.3416 0.2796 1724 +1726 2 254.2757 225.7684 32.2375 0.2542 1725 +1727 2 255.1337 225.0282 31.9421 0.2288 1726 +1728 2 256.0558 224.351 31.92 0.2542 1727 +1729 2 257.0076 223.7172 31.92 0.2796 1728 +1730 2 257.9686 223.0972 31.92 0.2924 1729 +1731 2 258.9158 222.4554 31.92 0.2542 1730 +1732 2 259.7669 221.7152 32.1191 0.2034 1731 +1733 2 260.6226 220.9968 32.2 0.1652 1732 +1734 2 261.6808 220.5769 32.1538 0.1525 1733 +1735 2 262.5766 219.8985 31.7307 0.1525 1734 +1736 2 263.4643 219.1893 31.57 0.1398 1735 +1737 2 264.2983 218.4376 31.36 0.1398 1736 +1738 2 265.2238 217.8119 30.8918 0.1398 1737 +1739 2 266.1813 217.2021 30.7936 0.1525 1738 +1740 2 267.1995 216.7079 30.52 0.1398 1739 +1741 2 268.1204 216.033 30.5155 0.1271 1740 +1742 2 268.9281 215.2367 30.24 0.1144 1741 +1743 2 269.6191 214.3261 30.24 0.1144 1742 +1744 2 270.4416 213.5436 30.24 0.1271 1743 +1745 2 271.2252 212.7428 29.9785 0.1652 1744 +1746 2 272.177 212.2921 29.136 0.2161 1745 +1747 2 273.265 212.021 29.12 0.2415 1746 +1748 2 274.3026 211.5588 29.12 0.2415 1747 +1749 2 275.4409 211.4387 29.12 0.2288 1748 +1750 2 276.5826 211.4238 29.12 0.2288 1749 +1751 2 277.7152 211.5805 29.12 0.2161 1750 +1752 2 278.85 211.6892 29.12 0.2034 1751 +1753 2 279.6588 212.3001 28.2528 0.1907 1752 +1754 2 280.4493 212.8252 27.0959 0.1907 1753 +1755 2 281.5338 213.1215 26.8976 0.1907 1754 +1756 2 282.6058 213.4693 27.16 0.1907 1755 +1757 2 283.6651 213.8868 27.16 0.1907 1756 +1758 2 284.7794 214.0424 27.16 0.1907 1757 +1759 2 285.7735 214.1568 25.9151 0.2034 1758 +1760 2 286.8855 214.2106 25.48 0.2034 1759 +1761 2 287.7686 214.8226 24.9452 0.1907 1760 +1762 2 288.8451 214.8432 24.2466 0.178 1761 +1763 2 289.7226 214.5046 23.2562 0.1907 1762 +1764 2 290.7522 214.2815 22.8841 0.2161 1763 +1765 2 291.8573 214.508 22.68 0.2034 1764 +1766 2 292.9544 214.8169 22.68 0.1652 1765 +1767 2 294.0961 214.8432 22.68 0.1398 1766 +1768 2 295.2321 214.754 22.68 0.1398 1767 +1769 2 296.3601 214.8009 22.68 0.1652 1768 +1770 2 297.4743 214.9576 22.68 0.178 1769 +1771 2 298.5909 214.7757 22.4 0.1907 1770 +1772 2 299.7108 214.8432 22.1388 0.1907 1771 +1773 2 300.8548 214.8432 22.12 0.178 1772 +1774 2 301.9988 214.8432 22.12 0.1652 1773 +1775 2 303.1291 214.8432 21.8492 0.1525 1774 +1776 2 303.9139 214.0561 21.84 0.1525 1775 +1777 2 304.6564 213.2553 21.84 0.1525 1776 +1778 2 305.7912 213.1272 21.84 0.1652 1777 +1779 3 240.9744 238.9724 35.8481 0.1907 1 +1780 3 241.8393 239.3534 34.4294 0.2288 1779 +1781 3 242.6127 239.6783 32.5332 0.3305 1780 +1782 3 243.4649 240.3967 31.9152 0.3813 1781 +1783 3 244.3939 241.0648 31.8844 0.3813 1782 +1784 3 245.2622 241.7936 31.7251 0.3051 1783 +1785 3 245.9314 242.7065 31.5266 0.2796 1784 +1786 3 246.5137 243.6457 32.0214 0.2924 1785 +1787 3 247.2344 244.4511 32.8115 0.3178 1786 +1788 3 248.105 245.1821 32.8485 0.3178 1787 +1789 3 248.9596 245.8227 32.0754 0.2924 1788 +1790 3 249.7638 246.3535 30.6043 0.3051 1789 +1791 3 250.6801 246.8683 29.7587 0.3305 1790 +1792 3 251.5267 247.6177 29.6792 0.3813 1791 +1793 3 252.1502 248.5763 29.675 0.394 1792 +1794 3 252.6856 249.583 29.652 0.394 1793 +1795 3 253.1294 250.6332 29.5142 0.394 1794 +1796 3 253.6648 251.6251 29.0752 0.4195 1795 +1797 3 254.2609 252.5712 28.5202 0.4322 1796 +1798 3 254.9175 253.4829 28.0885 0.4195 1797 +1799 3 255.652 254.3123 27.4582 0.3813 1798 +1800 3 256.4162 255.1589 27.2401 0.3305 1799 +1801 3 256.9573 256.129 26.747 0.2796 1800 +1802 3 257.5567 257.0808 26.8142 0.2415 1801 +1803 3 258.4319 257.5945 26.4874 0.2796 1802 +1804 3 259.4752 257.6917 25.3949 0.3432 1803 +1805 3 260.8526 258.0429 26.038 0.1144 1804 +1806 3 261.992 258.0933 26.2035 0.1144 1805 +1807 3 263.1314 258.1299 26.297 0.1271 1806 +1808 3 264.256 258.3198 26.341 0.1398 1807 +1809 3 265.3119 258.7476 26.4592 0.178 1808 +1810 3 266.409 258.9009 26.8358 0.2161 1809 +1811 3 267.4958 258.6298 26.4174 0.2669 1810 +1812 3 268.6341 258.6584 26.4706 0.2669 1811 +1813 3 269.7438 258.8666 26.6 0.2415 1812 +1814 3 270.8637 259.0943 26.6 0.2034 1813 +1815 3 271.9997 259.1549 26.542 0.1907 1814 +1816 3 273.0785 259.5095 26.32 0.178 1815 +1817 3 274.1859 259.7955 26.32 0.1652 1816 +1818 3 275.1755 260.3458 26.32 0.1652 1817 +1819 3 276.2302 260.7233 26.255 0.178 1818 +1820 3 277.1615 261.3651 25.8807 0.2034 1819 +1821 3 278.2631 261.65 25.76 0.2161 1820 +1822 3 279.4003 261.7701 25.7351 0.2415 1821 +1823 3 280.4665 262.1144 25.48 0.2288 1822 +1824 3 281.5292 262.5057 25.48 0.2034 1823 +1825 3 282.5508 262.9987 25.366 0.1525 1824 +1826 3 283.6697 263.12 24.9897 0.1271 1825 +1827 3 284.7942 263.12 24.64 0.1144 1826 +1828 3 285.9359 263.1589 24.64 0.1144 1827 +1829 3 287.0662 263.2344 24.3919 0.1398 1828 +1830 3 288.1953 263.2882 24.08 0.178 1829 +1831 3 289.289 263.6062 24.071 0.2288 1830 +1832 3 290.2294 264.1485 23.4178 0.2415 1831 +1833 3 291.1457 264.7067 22.5285 0.2288 1832 +1834 3 292.0746 265.2284 21.5891 0.1907 1833 +1835 3 293.1832 265.4995 21.56 0.1525 1834 +1836 3 294.2013 265.8553 20.7606 0.1271 1835 +1837 3 295.2241 266.2809 20.5058 0.1144 1836 +1838 3 296.3143 266.5817 20.44 0.1144 1837 +1839 3 297.2741 267.1423 20.2667 0.1144 1838 +1840 3 298.3575 267.4672 20.16 0.1144 1839 +1841 3 298.8128 267.8127 18.4341 0.1144 1840 +1842 3 299.3413 268.1765 17.0419 0.1144 1841 +1843 3 300.4144 268.538 16.8 0.1144 1842 +1844 3 301.4932 268.6936 17.1382 0.1144 1843 +1845 3 302.1167 268.7496 19.276 0.1144 1844 +1846 3 303.2115 269.0608 19.3351 0.1144 1845 +1847 3 304.2262 269.4063 20.0796 0.1144 1846 +1848 3 305.3496 269.5424 20.2199 0.1144 1847 +1849 3 306.4787 269.6408 20.4386 0.1144 1848 +1850 3 307.482 269.7415 19.6 0.1398 1849 +1851 3 308.5276 270.1567 19.7602 0.1652 1850 +1852 3 309.6488 270.3604 19.88 0.1907 1851 +1853 3 310.7779 270.548 19.88 0.178 1852 +1854 3 311.891 270.3318 20.1359 0.1907 1853 +1855 3 312.9732 269.9634 20.16 0.2415 1854 +1856 3 314.0989 269.8582 20.16 0.2924 1855 +1857 3 315.2349 269.7552 20.16 0.2924 1856 +1858 3 316.3492 269.9611 20.16 0.2542 1857 +1859 3 317.4589 270.1956 20.16 0.2542 1858 +1860 3 318.5239 270.5606 20.16 0.2796 1859 +1861 3 319.51 271.1188 19.934 0.2669 1860 +1862 3 320.5465 271.573 19.88 0.2288 1861 +1863 3 321.5258 272.1462 19.88 0.2034 1862 +1864 3 322.5428 272.6518 19.88 0.2161 1863 +1865 3 323.625 272.9618 19.88 0.2288 1864 +1866 3 324.7564 273.0888 19.88 0.2161 1865 +1867 3 325.8798 273.3039 19.88 0.2034 1866 +1868 3 326.9769 273.6276 19.88 0.1652 1867 +1869 3 328.0706 273.9617 19.88 0.1398 1868 +1870 3 329.1974 274.1024 19.88 0.1144 1869 +1871 3 330.3243 274.1745 20.1183 0.1144 1870 +1872 3 331.4019 274.3026 20.72 0.1144 1871 +1873 3 332.5276 274.1848 20.4565 0.1398 1872 +1874 3 333.5938 273.9891 19.88 0.1907 1873 +1875 3 334.7264 273.8736 19.7537 0.2669 1874 +1876 3 335.8452 273.9811 19.2934 0.2924 1875 +1877 3 336.9217 274.258 18.8513 0.2924 1876 +1878 3 338.0326 274.528 18.76 0.2542 1877 +1879 3 339.0576 274.981 18.5517 0.2415 1878 +1880 3 340.0574 275.5061 18.3386 0.2034 1879 +1881 3 341.0813 275.9923 18.2 0.178 1880 +1882 3 342.2127 276.0106 18.2 0.1652 1881 +1883 3 343.3384 275.8241 18.114 0.178 1882 +1884 3 344.4607 275.966 17.92 0.1907 1883 +1885 3 345.5486 276.3183 17.9068 0.1907 1884 +1886 3 346.5862 276.7565 17.64 0.1907 1885 +1887 3 347.5278 277.3994 17.5619 0.178 1886 +1888 3 348.5882 277.7632 17.36 0.1652 1887 +1889 3 349.7322 277.7632 17.36 0.1525 1888 +1890 3 350.8202 277.8902 16.8622 0.1525 1889 +1891 3 351.8967 278.2448 16.8 0.1525 1890 +1892 3 353.0373 278.3295 16.8 0.1525 1891 +1893 3 354.1721 278.3352 16.52 0.1525 1892 +1894 3 355.3058 278.2219 16.5508 0.1398 1893 +1895 3 356.4429 278.2208 16.8 0.1271 1894 +1896 3 357.5618 278.0675 17.057 0.1144 1895 +1897 3 358.7001 277.992 17.08 0.1144 1896 +1898 3 359.8383 277.9451 17.08 0.1271 1897 +1899 3 360.8233 277.5596 16.8179 0.1525 1898 +1900 3 361.5452 277.3056 18.5954 0.178 1899 +1901 3 362.6183 277.42 19.0509 0.178 1900 +1902 3 363.5998 277.3502 19.8408 0.1652 1901 +1903 3 364.7415 277.3056 19.88 0.1525 1902 +1904 3 365.8626 277.3056 20.2392 0.1525 1903 +1905 3 366.9826 277.3056 20.72 0.1398 1904 +1906 3 368.1266 277.3056 20.72 0.1271 1905 +1907 3 369.2706 277.309 20.72 0.1271 1906 +1908 3 370.402 277.436 20.72 0.1652 1907 +1909 3 371.5117 277.6911 20.72 0.2034 1908 +1910 3 372.4967 278.1728 20.72 0.2161 1909 +1911 3 373.4805 278.6304 20.72 0.178 1910 +1912 3 374.5262 278.9552 20.72 0.1398 1911 +1913 3 375.494 279.4563 20.72 0.1398 1912 +1914 3 376.622 279.5398 20.72 0.1652 1913 +1915 3 377.6905 279.9151 20.72 0.1907 1914 +1916 3 378.4524 280.6232 20.72 0.1652 1915 +1917 3 379.4385 281.1128 20.5556 0.1398 1916 +1918 3 380.5527 281.1952 20.6713 0.1144 1917 +1919 3 381.6956 281.2021 20.7138 0.1144 1918 +1920 3 382.62 281.5098 19.4432 0.1271 1919 +1921 3 383.661 281.8072 19.32 0.1398 1920 +1922 3 384.6689 282.2603 19.32 0.1652 1921 +1923 3 385.663 282.7568 19.32 0.178 1922 +1924 3 386.7978 282.8094 19.1024 0.1907 1923 +1925 3 387.5403 283.5198 18.7415 0.178 1924 +1926 3 388.428 283.823 17.6638 0.1652 1925 +1927 3 389.4988 283.5759 17.9186 0.1525 1926 +1928 3 390.5765 283.3688 18.3478 0.1652 1927 +1929 3 391.7022 283.3688 18.76 0.2034 1928 +1930 3 392.4103 283.3802 17.1839 0.2669 1929 +1931 3 393.5268 283.4832 17.0579 0.3051 1930 +1932 3 394.6262 283.6926 16.8 0.2796 1931 +1933 3 395.7691 283.712 16.8 0.2161 1932 +1934 3 396.9039 283.617 16.7838 0.1652 1933 +1935 3 398.0376 283.712 16.6628 0.1525 1934 +1936 3 399.1588 283.5976 17.0492 0.1398 1935 +1937 3 400.265 283.4363 17.08 0.1271 1936 +1938 3 401.3793 283.2361 17.08 0.1271 1937 +1939 3 402.5187 283.1377 17.08 0.1398 1938 +1940 3 403.6432 283.0256 17.3687 0.1652 1939 +1941 3 404.7472 283.14 17.92 0.1652 1940 +1942 3 259.243 257.5876 23.8 0.2288 1804 +1943 3 259.3448 258.7236 23.8 0.2796 1942 +1944 3 259.3654 259.8619 23.5942 0.2669 1943 +1945 3 259.4569 260.999 23.52 0.2415 1944 +1946 3 259.7509 261.8959 22.96 0.2542 1945 +1947 3 260.5552 262.5572 22.12 0.2924 1946 +1948 3 261.2496 263.4655 22.12 0.3432 1947 +1949 3 261.936 264.3807 22.12 0.3432 1948 +1950 3 262.5549 265.3005 21.5533 0.3178 1949 +1951 3 263.0056 266.1894 20.4375 0.2669 1950 +1952 3 263.2207 267.1457 19.1559 0.2542 1951 +1953 3 264.0009 267.9591 19.04 0.2415 1952 +1954 3 264.7136 268.8354 18.7194 0.2288 1953 +1955 3 265.3405 269.5264 18.2 0.2161 1954 +1956 3 266.0498 270.2174 17.8942 0.2288 1955 +1957 3 266.7007 271.0113 17.36 0.2542 1956 +1958 3 267.4924 271.8258 17.36 0.2415 1957 +1959 3 268.1273 272.749 17.36 0.2034 1958 +1960 3 268.1536 273.8461 16.7597 0.1525 1959 +1961 3 268.1536 274.9741 16.2963 0.1271 1960 +1962 3 268.1925 276.0037 15.2967 0.1144 1961 +1963 3 269.2976 276.0472 15.12 0.1144 1962 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb_469628681_m.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb_469628681_m.swc new file mode 100644 index 0000000..4fe67b4 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb_469628681_m.swc @@ -0,0 +1,1250 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/February 2015/169125.03.01.01/reconstructions/Pvalb-IRES-Cre; Ai14(IVSCC)-169125.03.01.01.DS.swc +# id,type,x,y,z,r,pid +1 1 312.0832 372.8296 27.44 5.1972 -1 +2 3 310.5926 376.7913 27.4061 0.2161 1 +3 3 310.5274 377.8643 27.3406 0.2796 2 +4 3 310.6829 378.9637 26.7414 0.2924 3 +5 3 310.6372 380.0368 25.7981 0.2542 4 +6 3 310.1784 380.9817 26.6462 0.2161 5 +7 3 309.7906 381.945 27.8124 0.1907 6 +8 3 309.6373 383.0558 27.412 0.1907 7 +9 3 308.9521 383.9264 26.7898 0.2288 8 +10 3 308.0803 384.6437 26.3326 0.2796 9 +11 3 307.3013 385.4811 26.2685 0.3686 10 +12 3 306.6515 386.418 26.0495 0.4576 11 +13 3 306.163 386.8493 25.4593 0.2542 12 +14 3 305.2078 387.4522 25.2165 0.2415 13 +15 3 304.1713 387.935 25.1997 0.2415 14 +16 3 303.1646 388.4772 25.1983 0.2034 15 +17 3 302.6612 389.4794 25.1899 0.2415 16 +18 3 302.0526 390.4449 25.1437 0.2669 17 +19 3 301.1488 391.113 24.7388 0.3051 18 +20 3 300.2908 391.8269 24.1321 0.2669 19 +21 3 299.3196 392.4252 24.0517 0.2542 20 +22 3 298.2831 392.9057 23.9078 0.2542 21 +23 3 297.186 392.9846 23.1896 0.3178 22 +24 3 296.0592 393.1093 22.8334 0.3178 23 +25 3 295.0021 393.4719 22.2421 0.3051 24 +26 3 293.9371 393.8781 22.4277 0.2415 25 +27 3 292.9361 394.3848 22.9662 0.2161 26 +28 3 292.4899 394.9992 22.9832 0.2161 27 +29 3 291.9008 395.9762 23.1025 0.2034 28 +30 3 291.2498 396.8708 23.7213 0.2288 29 +31 3 290.5634 397.7688 24.0411 0.2415 30 +32 3 289.8049 398.6234 24.0806 0.2669 31 +33 3 288.9069 399.3235 24.0828 0.2796 32 +34 3 288.05 400.0785 24.0904 0.2796 33 +35 3 287.2355 400.8816 24.1237 0.3051 34 +36 3 286.429 401.6904 24.2673 0.2924 35 +37 3 285.6545 402.4855 24.8928 0.2924 36 +38 3 284.9018 403.3321 25.1149 0.2415 37 +39 3 284.2554 404.2564 24.7358 0.2415 38 +40 3 283.5427 405.1282 24.2746 0.2669 39 +41 3 282.6424 405.7802 24.6834 0.3305 40 +42 3 281.8976 406.5742 25.4755 0.3432 41 +43 3 281.2192 407.4836 25.5206 0.3305 42 +44 3 280.3715 408.2387 25.2538 0.3051 43 +45 3 279.5433 409.0258 25.2843 0.3178 44 +46 3 278.7242 409.8083 25.6662 0.3178 45 +47 3 277.8204 410.4638 26.264 0.3051 46 +48 3 276.9144 411.1582 26.3071 0.2796 47 +49 3 275.99 411.832 26.2576 0.2669 48 +50 3 275.0862 412.523 25.9955 0.2796 49 +51 3 274.3198 413.3215 25.3011 0.3051 50 +52 3 273.7043 414.2813 25.2031 0.3432 51 +53 3 273.2352 415.3235 25.2 0.3813 52 +54 3 272.6312 416.2947 25.2 0.3813 53 +55 3 272.0638 417.2877 25.2 0.3686 54 +56 3 271.3637 418.1915 25.1997 0.3178 55 +57 3 270.7059 419.1284 25.1983 0.3051 56 +58 3 270.0423 420.0596 25.1919 0.3051 57 +59 3 269.3731 420.9874 25.1605 0.3559 58 +60 3 268.586 421.8157 25.0281 0.3813 59 +61 3 267.8001 422.5936 24.3247 0.3813 60 +62 3 266.9776 423.3807 24.0618 0.3432 61 +63 3 266.0761 424.0842 23.9635 0.3051 62 +64 3 265.1609 424.7066 23.259 0.2542 63 +65 3 264.2091 425.3117 22.7979 0.2161 64 +66 3 263.39 426.0634 22.9298 0.2034 65 +67 3 262.4485 426.3825 24.1791 0.2415 66 +68 3 261.4246 426.879 24.4507 0.2542 67 +69 3 260.395 427.3572 24.6235 0.2542 68 +70 3 259.3414 427.7485 24.5118 0.2288 69 +71 3 258.2923 428.0265 24.6938 0.2542 70 +72 3 257.392 428.5435 23.7191 0.2924 71 +73 3 256.6942 428.9554 24.3012 0.3305 72 +74 3 255.9357 429.7276 24.64 0.3305 73 +75 3 255.009 430.2584 24.6344 0.3178 74 +76 3 254.1831 430.6634 23.6824 0.3051 75 +77 3 253.4395 431.3852 23.7252 0.3051 76 +78 3 252.5277 431.884 24.5468 0.2796 77 +79 3 251.7738 432.3588 23.6477 0.2415 78 +80 3 250.6882 432.5556 23.6606 0.2161 79 +81 3 249.8427 432.9193 24.5949 0.2415 80 +82 3 249.2787 433.8025 24.9186 0.2924 81 +83 3 248.7285 434.3962 23.8501 0.3178 82 +84 3 248.1485 435.3538 23.8171 0.2924 83 +85 3 247.668 436.1122 22.9415 0.2415 84 +86 3 247.0262 436.9714 22.675 0.1907 85 +87 3 246.2517 437.4587 24.2332 0.178 86 +88 3 245.5562 438.0468 24.8853 0.178 87 +89 3 245.134 438.883 24.1363 0.2034 88 +90 3 244.4739 439.6072 24.2189 0.2034 89 +91 3 243.7864 440.4022 23.6132 0.2034 90 +92 3 243.7098 441.2465 22.68 0.2034 91 +93 3 243.1275 441.8002 24.0089 0.2161 92 +94 3 242.9478 442.8413 23.6141 0.2161 93 +95 3 242.6138 443.8125 23.9828 0.178 94 +96 3 242.1299 444.6373 23.2663 0.1398 95 +97 3 241.2925 445.3638 23.4889 0.1271 96 +98 3 240.4253 445.4736 22.202 0.1398 97 +99 3 239.7824 446.0433 21.0 0.1525 98 +100 3 239.4335 446.732 21.884 0.1525 99 +101 3 238.818 447.4481 22.6209 0.1525 100 +102 3 237.7221 447.6506 22.398 0.1525 101 +103 3 236.9979 448.4366 21.6418 0.1398 102 +104 3 236.3058 449.3312 21.5261 0.1398 103 +105 3 235.6834 450.0702 21.7196 0.1398 104 +106 3 234.8907 450.8378 21.84 0.1652 105 +107 3 234.2695 451.3938 21.8378 0.1652 106 +108 3 233.6059 452.2896 21.56 0.1652 107 +109 3 232.7434 452.8227 21.56 0.1525 108 +110 3 231.835 453.4747 21.8126 0.178 109 +111 3 230.9301 454.0753 22.1673 0.2161 110 +112 3 229.9703 454.6027 21.7403 0.2542 111 +113 3 228.9716 454.8544 21.7193 0.2415 112 +114 3 227.9523 454.5226 22.12 0.2034 113 +115 3 227.0405 454.7366 22.96 0.1525 114 +116 3 226.3587 455.4573 22.96 0.1271 115 +117 3 225.5636 456.1849 22.96 0.1144 116 +118 3 224.6953 456.925 22.96 0.1271 117 +119 3 223.9014 457.5966 23.2285 0.1398 118 +120 3 223.5399 458.6731 23.24 0.1525 119 +121 3 222.8787 459.4556 22.965 0.1525 120 +122 3 221.8399 459.7736 23.5074 0.1652 121 +123 3 220.9453 460.2884 23.6846 0.178 122 +124 3 220.3905 461.2459 24.0321 0.178 123 +125 3 219.7624 461.7253 25.1622 0.1525 124 +126 3 219.7624 462.8521 25.4906 0.1271 125 +127 3 219.6011 463.94 26.1092 0.1144 126 +128 3 218.9627 464.798 26.5496 0.1144 127 +129 3 218.401 465.6538 27.594 0.1144 128 +130 3 217.7101 466.3127 28.0 0.1144 129 +131 3 217.1381 467.2794 28.1078 0.1525 130 +132 3 217.1312 468.3536 28.0 0.1907 131 +133 3 292.6455 393.8414 22.9662 0.2924 27 +134 3 292.0746 392.8542 22.9704 0.2924 133 +135 3 291.2876 392.0408 23.0171 0.2924 134 +136 3 290.2534 391.6084 23.2767 0.2669 135 +137 3 289.1517 391.4962 23.949 0.2669 136 +138 3 288.0489 391.2583 24.3723 0.2288 137 +139 3 286.9461 391.1222 25.0146 0.2288 138 +140 3 285.8227 391.0581 25.4668 0.2034 139 +141 3 284.7485 390.7835 26.0232 0.1907 140 +142 3 283.7189 390.3259 26.1685 0.1907 141 +143 3 282.5897 390.1784 26.0893 0.2161 142 +144 3 281.4812 389.985 26.3085 0.2542 143 +145 3 280.4322 389.5297 26.2489 0.2542 144 +146 3 279.3785 389.238 25.7748 0.2415 145 +147 3 278.3855 388.992 25.1258 0.2415 146 +148 3 277.515 388.3937 25.8048 0.2288 147 +149 3 276.5689 388.0963 26.8097 0.2288 148 +150 3 275.6582 387.6215 26.88 0.2288 149 +151 3 274.7751 387.816 26.1974 0.2669 150 +152 3 273.7821 387.6661 25.9529 0.2796 151 +153 3 272.7708 387.4362 26.04 0.2796 152 +154 3 272.097 387.0964 27.4336 0.2542 153 +155 3 271.7 386.7498 25.6819 0.2542 154 +156 3 270.6979 386.4661 25.48 0.2542 155 +157 3 269.706 386.3185 26.3113 0.2669 156 +158 3 269.1146 385.9684 25.0883 0.2669 157 +159 3 268.395 385.2466 24.8786 0.2415 158 +160 3 267.688 384.6414 25.4072 0.2288 159 +161 3 266.9867 384.2776 23.8 0.2161 160 +162 3 266.1276 383.6164 23.9599 0.2542 161 +163 3 265.2947 382.9071 24.575 0.2924 162 +164 3 264.4482 382.5948 23.8286 0.3305 163 +165 3 263.6359 382.0331 23.5626 0.3305 164 +166 3 263.0308 381.1465 24.0075 0.3051 165 +167 3 262.2929 380.3731 23.2772 0.2542 166 +168 3 261.5184 379.562 23.56 0.2161 167 +169 3 260.7336 378.9935 24.5227 0.2034 168 +170 3 259.8928 378.4661 23.4346 0.2288 169 +171 3 259.1961 377.7923 22.68 0.2415 170 +172 3 258.4525 377.2248 22.9205 0.2415 171 +173 3 257.4252 377.0544 23.24 0.2161 172 +174 3 256.6392 376.4538 22.6789 0.2034 173 +175 3 255.819 375.7788 22.3219 0.178 174 +176 3 255.2115 375.343 22.094 0.1907 175 +177 3 254.1808 375.3041 21.887 0.2288 176 +178 3 253.0814 375.4002 21.9601 0.2796 177 +179 3 251.9706 375.5054 22.1746 0.2796 178 +180 3 250.9204 375.8543 22.6898 0.2288 179 +181 3 250.1322 375.9333 21.784 0.178 180 +182 3 249.2273 375.5752 21.1434 0.1907 181 +183 3 249.0053 375.5752 18.7698 0.2288 182 +184 3 248.3109 376.058 18.4478 0.2542 183 +185 3 247.4529 375.8463 19.32 0.2161 184 +186 3 246.4073 375.4356 19.32 0.2034 185 +187 3 245.3972 375.0215 19.5734 0.2288 186 +188 3 244.9087 375.3578 19.7109 0.2796 187 +189 3 243.9694 375.2743 18.8563 0.3051 188 +190 3 242.9124 374.9826 18.613 0.3051 189 +191 3 242.1734 374.8259 20.1127 0.3051 190 +192 3 241.3703 374.1646 19.4435 0.2924 191 +193 3 240.2606 374.088 19.2363 0.2796 192 +194 3 239.2436 373.8169 19.8934 0.2669 193 +195 3 238.6384 373.508 19.1668 0.2542 194 +196 3 237.904 372.9074 19.3164 0.2415 195 +197 3 237.2748 372.0917 19.1453 0.2161 196 +198 3 236.816 371.3447 18.1594 0.2034 197 +199 3 235.8585 370.8345 17.4675 0.1652 198 +200 3 234.83 370.4764 16.611 0.1398 199 +201 3 233.8016 370.1183 15.7545 0.1144 200 +202 3 232.9848 369.4537 15.4 0.1144 201 +203 3 232.6896 368.4755 15.4 0.1144 202 +204 3 232.6896 367.3315 15.4 0.1144 203 +205 3 232.6164 366.191 15.4 0.1144 204 +206 3 232.3681 365.1797 15.4 0.1271 205 +207 3 231.2665 364.8777 15.4 0.1398 206 +208 3 230.8592 363.9064 15.4 0.178 207 +209 3 230.8592 362.7624 15.4 0.1907 208 +210 3 306.4433 388.0608 26.5065 0.2542 12 +211 3 306.0303 389.111 26.4446 0.2542 210 +212 3 305.7065 390.1875 26.502 0.2288 211 +213 3 305.5144 391.28 27.1065 0.2415 212 +214 3 305.0545 392.273 27.7141 0.2288 213 +215 3 304.463 393.2077 28.4032 0.2669 214 +216 3 303.7217 393.9902 29.2457 0.2669 215 +217 3 302.7859 394.6034 29.6803 0.3051 216 +218 3 301.8112 395.1765 30.0818 0.3178 217 +219 3 300.864 395.7771 30.6298 0.3305 218 +220 3 300.0518 396.5596 30.8322 0.3178 219 +221 3 299.537 397.5617 30.9798 0.2924 220 +222 3 299.0576 398.5662 31.5577 0.2796 221 +223 3 298.4707 399.5317 31.9015 0.2415 222 +224 3 297.686 400.3497 32.0855 0.2288 223 +225 3 296.987 401.1951 32.7701 0.2288 224 +226 3 296.598 402.2407 33.1243 0.2796 225 +227 3 296.4939 403.3481 33.6806 0.2924 226 +228 3 296.2994 404.4566 34.1166 0.2669 227 +229 3 295.867 405.5068 34.3272 0.2034 228 +230 3 295.5867 406.4861 35.4684 0.2034 229 +231 3 295.2458 407.5168 36.2978 0.2415 230 +232 3 294.6704 408.4949 36.4008 0.3051 231 +233 3 294.2105 409.5406 36.4048 0.3178 232 +234 3 293.7895 410.6045 36.4274 0.3305 233 +235 3 293.3662 411.6661 36.5674 0.3305 234 +236 3 293.0402 412.7106 37.343 0.3432 235 +237 3 292.3801 413.4771 38.5918 0.3432 236 +238 3 291.5038 413.6624 40.2956 0.3432 237 +239 3 290.7751 414.2024 41.9924 0.3178 238 +240 3 290.1562 414.9528 43.4591 0.2924 239 +241 3 289.5887 415.82 44.24 0.2542 240 +242 3 288.7422 416.3062 44.24 0.2415 241 +243 3 287.8361 416.7935 44.1582 0.2161 242 +244 3 287.2172 417.4033 44.1952 0.1907 243 +245 3 286.7036 418.3802 44.2963 0.1907 244 +246 3 285.7895 418.9031 44.8767 0.2161 245 +247 3 285.1042 419.602 45.36 0.2542 246 +248 3 284.316 420.2187 44.8 0.2415 247 +249 3 283.5976 420.8032 45.6084 0.1907 248 +250 3 282.9181 421.5949 45.7148 0.1398 249 +251 3 282.3998 422.3785 45.0178 0.1144 250 +252 3 282.2282 423.4596 44.6365 0.1144 251 +253 3 282.1104 424.5087 43.7388 0.1271 252 +254 3 282.1573 425.5932 43.9438 0.1652 253 +255 3 282.1596 426.2487 45.1063 0.2161 254 +256 3 282.3014 427.3218 44.8 0.2669 255 +257 3 309.8341 368.9766 27.3356 0.3432 1 +258 3 309.7941 367.8692 26.7624 0.4195 257 +259 3 309.7906 366.7401 26.3228 0.4703 258 +260 3 309.7643 365.5972 26.1934 0.483 259 +261 3 309.5847 364.499 25.5623 0.483 260 +262 3 309.0813 363.4797 25.3084 0.4449 261 +263 3 308.499 362.5119 25.7272 0.3813 262 +264 3 308.1044 361.464 26.2956 0.3432 263 +265 3 307.6548 360.4126 26.3197 0.3432 264 +266 3 307.4878 359.2812 26.32 0.3813 265 +267 3 307.3768 358.1418 26.32 0.394 266 +268 3 307.0748 357.039 26.3197 0.3559 267 +269 3 307.0496 355.8973 26.3172 0.3051 268 +270 3 307.0507 354.7533 26.2984 0.2542 269 +271 3 307.0553 353.6104 26.1772 0.2034 270 +272 3 307.0828 352.6105 25.5343 0.3432 271 +273 3 307.283 351.4997 25.1034 0.3559 272 +274 3 307.4809 350.4026 24.4773 0.3559 273 +275 3 307.3997 349.2735 24.096 0.3305 274 +276 3 307.0027 348.2039 24.0856 0.3432 275 +277 3 306.5405 347.1571 24.1139 0.3559 276 +278 3 306.0269 346.1366 24.2662 0.3813 277 +279 3 305.424 345.2009 24.9024 0.3686 278 +280 3 304.7788 344.2639 25.1969 0.3559 279 +281 3 304.1507 343.3075 25.2 0.3432 280 +282 3 303.5684 342.3226 25.2 0.3432 281 +283 3 303.0387 341.309 25.1994 0.3432 282 +284 3 302.4747 340.3137 25.1966 0.3305 283 +285 3 302.6303 339.8584 26.0229 0.3051 284 +286 3 302.5056 338.7967 25.7527 0.2924 285 +287 3 302.2574 337.8552 25.8852 0.2669 286 +288 3 302.3592 336.7742 26.4726 0.2415 287 +289 3 302.1647 335.7125 26.32 0.2288 288 +290 3 302.0995 334.7538 25.76 0.2288 289 +291 3 301.6705 333.778 26.2718 0.2415 290 +292 3 301.6728 332.7324 25.7723 0.2542 291 +293 3 301.5584 331.8755 26.01 0.2796 292 +294 3 301.2175 330.9089 26.7624 0.2924 293 +295 3 301.317 329.8655 25.8532 0.3178 294 +296 3 300.9143 329.1608 26.6 0.1144 295 +297 3 300.9349 328.1186 25.6236 0.1271 296 +298 3 300.9864 327.0124 25.0527 0.1398 297 +299 3 300.9761 325.8707 24.92 0.178 298 +300 3 300.7519 324.9612 26.04 0.2034 299 +301 3 300.1227 324.221 25.48 0.2415 300 +302 3 300.0712 323.1663 25.8308 0.2415 301 +303 3 300.0243 322.06 25.9627 0.2669 302 +304 3 300.1902 320.9686 26.1288 0.2924 303 +305 3 300.4899 319.9905 25.2162 0.3178 304 +306 3 300.745 318.9255 24.6338 0.2924 305 +307 3 301.1809 317.8913 24.36 0.2415 306 +308 3 301.3868 316.8056 24.08 0.2288 307 +309 3 301.3719 315.8767 25.3949 0.2542 308 +310 3 301.1431 314.7796 25.7961 0.3051 309 +311 3 300.904 313.6905 26.2492 0.3305 310 +312 3 300.5322 312.7662 27.1765 0.3305 311 +313 3 299.9511 311.9585 26.7476 0.3178 312 +314 3 299.5267 311.2366 27.16 0.2924 313 +315 3 298.7281 310.5777 26.3374 0.2924 314 +316 3 297.9708 309.9611 26.717 0.2669 315 +317 3 297.4217 309.0688 26.2268 0.2669 316 +318 3 297.1986 308.2039 25.4047 0.2415 317 +319 3 296.5957 307.3631 25.2 0.2415 318 +320 3 296.4653 306.3815 25.5682 0.2161 319 +321 3 296.0066 305.5144 26.04 0.1907 320 +322 3 295.4929 304.6689 26.7464 0.1652 321 +323 3 294.8077 303.978 26.1408 0.1398 322 +324 3 294.1567 303.4826 26.7235 0.1271 323 +325 3 294.1293 302.6406 28.2878 0.1271 324 +326 3 294.2368 301.5744 28.1999 0.1652 325 +327 3 293.8375 301.1649 26.32 0.2161 326 +328 3 293.015 300.4899 26.6 0.2542 327 +329 3 293.0928 299.3962 27.0323 0.2669 328 +330 3 293.0207 298.3426 26.6 0.2796 329 +331 3 292.8995 297.2798 26.9385 0.3178 330 +332 3 292.7885 296.2102 27.4229 0.3305 331 +333 3 292.5128 295.2058 26.9578 0.3305 332 +334 3 291.9625 294.5697 27.72 0.2796 333 +335 3 291.4512 293.7083 27.44 0.2796 334 +336 3 291.2475 292.6489 27.9812 0.2542 335 +337 3 291.2349 291.7761 26.7338 0.2542 336 +338 3 291.9076 291.72 25.48 0.2161 337 +339 3 292.3069 291.2361 23.9173 0.2288 338 +340 3 291.9785 290.1939 24.0724 0.2542 339 +341 3 291.8252 289.4995 25.5035 0.2796 340 +342 3 292.2897 288.7525 25.48 0.2669 341 +343 3 292.3492 287.7686 26.1618 0.2415 342 +344 3 292.1696 286.8466 26.2441 0.2415 343 +345 3 292.4064 286.2196 26.5037 0.2415 344 +346 3 292.4064 285.5092 25.0272 0.2415 345 +347 3 292.5208 284.4133 24.64 0.2415 346 +348 3 292.8926 283.7463 25.8023 0.2924 347 +349 3 293.0013 283.1434 27.8916 0.3305 348 +350 3 293.1592 282.1047 27.8317 0.3559 349 +351 3 292.8411 281.5464 28.7456 0.3305 350 +352 3 292.6764 281.0568 30.2599 0.3178 351 +353 3 293.0436 280.1496 31.0741 0.2924 352 +354 3 293.5378 279.3351 30.5595 0.2796 353 +355 3 294.0252 278.604 31.1926 0.2796 354 +356 3 294.9266 278.0378 31.309 0.2924 355 +357 3 295.8224 277.4955 30.8216 0.2924 356 +358 3 296.8074 277.0024 30.8904 0.2669 357 +359 3 297.8427 276.7267 30.52 0.2288 358 +360 3 298.4822 276.371 31.08 0.2161 359 +361 3 299.3024 275.7646 31.08 0.2034 360 +362 3 299.8035 274.9547 31.0453 0.2161 361 +363 3 300.0357 275.1148 29.0368 0.1907 362 +364 3 300.5048 274.4765 27.8421 0.1907 363 +365 3 300.7576 274.242 29.6722 0.1652 364 +366 3 300.7931 273.4675 30.5452 0.1652 365 +367 3 300.6432 273.0019 28.6852 0.1398 366 +368 3 301.0676 272.844 26.9069 0.1271 367 +369 3 301.317 271.9666 26.1671 0.1144 368 +370 3 301.5584 271.4117 26.6 0.1271 369 +371 3 301.6442 270.2826 26.6596 0.1525 370 +372 3 301.6728 269.2175 27.4072 0.1907 371 +373 3 301.8341 268.8308 29.7044 0.2034 372 +374 3 302.6612 268.2932 30.42 0.1907 373 +375 3 303.581 267.72 30.5497 0.1525 374 +376 3 304.4985 267.3093 29.8306 0.1271 375 +377 3 305.5716 266.9581 29.6887 0.1144 376 +378 3 306.5634 266.4742 29.4 0.1271 377 +379 3 306.9478 265.7981 30.24 0.1398 378 +380 3 307.6399 264.9195 30.24 0.1652 379 +381 3 308.0792 264.0341 30.2403 0.1907 380 +382 3 308.7587 263.2195 30.7994 0.2288 381 +383 3 309.6328 262.7413 29.9695 0.2669 382 +384 3 310.596 262.3192 30.24 0.2924 383 +385 3 301.7803 329.2398 25.1208 0.2669 295 +386 3 302.6292 328.6048 25.1552 0.3051 385 +387 3 303.0731 327.8567 23.6205 0.3305 386 +388 3 303.3064 326.9083 23.9865 0.3559 387 +389 3 303.692 326.0823 23.6636 0.3178 388 +390 3 304.0706 325.3319 23.5407 0.2796 389 +391 3 304.5065 324.3457 23.8202 0.2161 390 +392 3 304.8554 323.3699 22.9236 0.1907 391 +393 3 304.3212 322.4764 22.5865 0.2161 392 +394 3 304.0683 321.6722 22.3101 0.3051 393 +395 3 304.5328 320.9698 21.7448 0.3813 394 +396 3 304.9149 320.01 22.6696 0.3813 395 +397 3 304.9664 318.9403 22.0805 0.3178 396 +398 3 305.3874 317.9233 21.56 0.2669 397 +399 3 305.7569 316.848 21.7216 0.2924 398 +400 3 305.9079 315.8332 21.6532 0.3559 399 +401 3 305.7615 314.8402 21.56 0.3813 400 +402 3 305.7043 314.0086 20.1015 0.3432 401 +403 3 305.7226 312.9504 19.8926 0.3178 402 +404 3 306.3243 312.1598 19.6 0.3432 403 +405 3 306.6938 311.136 20.102 0.394 404 +406 3 306.4776 310.048 19.6238 0.3813 405 +407 3 306.2728 309.1752 18.7606 0.3432 406 +408 3 305.9536 308.5906 17.3617 0.3051 407 +409 3 306.2271 307.728 18.4929 0.3178 408 +410 3 306.3003 307.1571 19.88 0.3178 409 +411 3 306.2202 306.2385 19.4522 0.3305 410 +412 3 305.8324 305.472 18.692 0.3051 411 +413 3 306.0543 304.6483 17.0626 0.2669 412 +414 3 305.9125 303.7331 16.1081 0.1907 413 +415 3 306.3277 303.2332 17.9668 0.1398 414 +416 3 306.5028 302.3924 17.1954 0.1398 415 +417 3 306.6847 301.6236 15.4 0.1907 416 +418 3 306.4776 300.5402 14.8081 0.2669 417 +419 3 306.4021 299.5415 13.7206 0.3178 418 +420 3 306.6481 298.4707 14.2313 0.3432 419 +421 3 307.1548 297.4983 13.6046 0.3432 420 +422 3 307.5083 296.4276 13.433 0.3305 421 +423 3 308.0392 295.7034 14.5746 0.2924 422 +424 3 308.1261 294.7299 15.6968 0.2415 423 +425 3 308.3172 294.3867 18.051 0.1907 424 +426 3 308.5379 293.8272 18.3327 0.1652 425 +427 3 308.6478 293.0402 19.8005 0.1398 426 +428 3 308.9944 292.1776 19.32 0.1271 427 +429 3 301.7563 339.7005 25.1784 0.2161 284 +430 3 300.7198 339.2406 25.0488 0.2415 429 +431 3 299.8596 338.5531 24.4076 0.2669 430 +432 3 299.2475 337.6127 24.6694 0.2924 431 +433 3 298.584 336.7032 24.2603 0.3051 432 +434 3 298.1012 335.669 24.1738 0.3178 433 +435 3 297.4766 334.7241 24.5151 0.3432 434 +436 3 296.8074 333.8272 25.0947 0.3686 435 +437 3 295.9677 333.055 25.1944 0.3432 436 +438 3 295.1497 332.2554 25.1891 0.2796 437 +439 3 294.58 331.2658 25.1412 0.2161 438 +440 3 293.8501 330.3941 24.841 0.2161 439 +441 3 292.9281 329.79 24.1032 0.2669 440 +442 3 291.9122 329.2649 24.0794 0.2924 441 +443 3 291.0954 328.4641 24.0778 0.2924 442 +444 3 290.3941 327.6359 24.0705 0.3305 443 +445 3 289.9731 326.5754 24.0218 0.3432 444 +446 3 289.5922 325.508 23.6622 0.3051 445 +447 3 289.106 324.4739 23.7756 0.2542 446 +448 3 288.5031 323.5049 23.9355 0.2415 447 +449 3 287.9848 322.5348 23.1792 0.2669 448 +450 3 287.4334 321.5361 22.9522 0.2796 449 +451 3 286.8923 320.5294 22.9141 0.2924 450 +452 3 286.2116 319.6176 22.7242 0.2796 451 +453 3 285.3342 318.9369 22.0601 0.2924 452 +454 3 284.5483 318.1338 21.6026 0.2796 453 +455 3 284.0644 317.1328 20.9616 0.3178 454 +456 3 283.6754 316.0609 20.7477 0.3432 455 +457 3 283.2533 315.0096 20.9504 0.3686 456 +458 3 282.751 314.131 21.5046 0.3178 457 +459 3 282.099 313.6791 20.1116 0.2669 458 +460 3 281.1414 313.1506 19.8066 0.2415 459 +461 3 280.5111 312.9858 18.4475 0.2796 460 +462 3 279.9883 312.4344 20.0788 0.3051 461 +463 3 279.1726 311.8727 19.88 0.3178 462 +464 3 278.2094 311.3465 19.4373 0.3051 463 +465 3 277.2335 310.874 19.6932 0.3051 464 +466 3 276.2577 310.342 19.3332 0.2924 465 +467 3 275.4512 309.7449 19.7425 0.2924 466 +468 3 274.9089 308.9761 18.7628 0.3051 467 +469 3 274.7613 307.982 18.7228 0.3305 468 +470 3 273.9949 307.4958 18.8647 0.3432 469 +471 3 273.5144 306.7899 19.5331 0.3305 470 +472 3 272.7399 306.1367 19.32 0.3178 471 +473 3 272.4093 305.3805 18.76 0.2924 472 +474 3 271.5158 304.8314 18.6668 0.2669 473 +475 3 270.834 304.3749 18.5816 0.2415 474 +476 3 270.7082 303.5444 17.3958 0.2161 475 +477 3 270.7139 302.4542 17.08 0.2161 476 +478 3 270.556 301.6739 18.9095 0.2161 477 +479 3 270.2174 300.8331 19.88 0.2415 478 +480 3 270.9656 300.2531 19.3606 0.2669 479 +481 3 271.0102 299.3917 18.7132 0.3305 480 +482 3 270.8317 298.4341 18.4951 0.3686 481 +483 3 270.7402 297.4068 18.2034 0.3686 482 +484 3 269.9657 296.7433 17.8536 0.3051 483 +485 3 269.5744 295.7663 17.6047 0.2542 484 +486 3 269.5275 294.842 17.9556 0.2415 485 +487 3 268.7084 294.572 17.1433 0.2542 486 +488 3 268.1616 294.0114 16.5211 0.2669 487 +489 3 267.2498 293.5698 16.3058 0.2924 488 +490 3 266.2866 293.3811 16.2333 0.2924 489 +491 3 265.7706 292.5139 16.1266 0.2924 490 +492 3 265.2719 291.593 16.7759 0.2415 491 +493 3 264.6072 290.8048 17.08 0.2288 492 +494 3 290.4033 328.0706 22.5728 0.178 443 +495 3 289.7752 328.0123 24.1357 0.1525 494 +496 3 288.8131 327.8704 24.6543 0.1398 495 +497 3 288.288 327.5123 23.602 0.1398 496 +498 3 287.4792 327.184 22.8407 0.1525 497 +499 3 286.7264 327.0936 21.0204 0.1525 498 +500 3 285.9428 326.6063 21.8238 0.1652 499 +501 3 285.2942 326.4747 21.2932 0.1907 500 +502 3 284.4819 326.0572 20.72 0.2034 501 +503 3 283.5198 325.6579 21.28 0.2034 502 +504 3 282.6824 324.9429 21.252 0.178 503 +505 3 281.7638 324.4842 20.3174 0.1652 504 +506 3 280.8772 323.8023 20.0189 0.1525 505 +507 3 279.9036 323.2441 20.0203 0.1525 506 +508 3 278.9404 322.8368 19.6031 0.1525 507 +509 3 278.0698 322.3792 18.7673 0.1398 508 +510 3 276.9521 322.274 18.48 0.1271 509 +511 3 275.8298 322.1504 18.48 0.1271 510 +512 3 274.9032 321.8518 18.48 0.1398 511 +513 3 274.3392 321.0201 18.0141 0.178 512 +514 3 273.3428 320.5099 17.64 0.2161 513 +515 3 272.3212 320.034 17.6308 0.2669 514 +516 3 271.4277 319.4197 17.4751 0.2796 515 +517 3 270.5537 318.7756 17.1772 0.2796 516 +518 3 269.5573 318.3683 18.0026 0.2669 517 +519 3 268.6352 318.1144 18.5111 0.2542 518 +520 3 267.7864 318.3741 18.2311 0.2288 519 +521 3 267.0725 317.8032 18.2185 0.1907 520 +522 3 266.1413 317.6648 19.2688 0.1652 521 +523 3 265.0511 317.5744 19.567 0.1398 522 +524 3 263.9288 317.4611 19.32 0.1398 523 +525 3 263.2344 317.1225 19.1408 0.1652 524 +526 3 262.7848 316.2165 19.908 0.2034 525 +527 3 262.4336 315.8492 18.5679 0.2161 526 +528 3 261.6511 315.6353 17.5641 0.2161 527 +529 3 260.864 315.6296 17.08 0.2288 528 +530 3 259.7715 315.6353 17.3732 0.2669 529 +531 3 258.8346 315.1823 17.8254 0.2796 530 +532 3 257.8015 314.9203 17.668 0.2796 531 +533 3 256.8326 314.497 17.9544 0.3051 532 +534 3 255.8911 314.473 16.6197 0.3178 533 +535 3 254.9804 314.012 17.0663 0.3305 534 +536 3 254.1922 313.5704 18.4369 0.2924 535 +537 3 253.5104 312.8966 19.0089 0.3051 536 +538 3 253.0528 312.7696 18.2 0.1652 537 +539 3 252.6181 312.5408 16.998 0.2796 537 +540 3 251.7566 312.4138 16.9548 0.2796 539 +541 3 251.3322 312.7101 18.2 0.2415 540 +542 3 250.3964 312.3463 17.1422 0.2034 541 +543 3 249.781 311.6336 16.4004 0.2034 542 +544 3 249.6322 310.9289 16.7597 0.2288 543 +545 3 249.0751 310.7104 16.2016 0.2415 544 +546 3 248.3006 310.4736 15.9664 0.2542 545 +547 3 247.6691 309.9096 16.7026 0.2415 546 +548 3 247.0125 309.5893 18.4528 0.2542 547 +549 3 246.1636 309.3914 19.6 0.2415 548 +550 3 246.278 308.8994 17.7568 0.2288 549 +551 3 246.6464 308.5116 16.4433 0.2034 550 +552 3 246.0469 308.0426 15.7161 0.178 551 +553 3 245.8456 307.7749 17.827 0.1652 552 +554 3 246.0744 307.0496 17.92 0.1525 553 +555 3 307.5175 353.1997 23.016 0.2924 271 +556 3 307.1079 353.4194 20.7553 0.2796 555 +557 3 306.1733 353.7763 19.4611 0.2415 556 +558 3 305.3004 353.9181 17.8702 0.1907 557 +559 3 304.256 353.7042 16.879 0.1652 558 +560 3 303.168 353.6642 16.0686 0.1525 559 +561 3 302.286 354.0817 15.9202 0.1525 560 +562 3 302.1373 355.0839 16.8627 0.1652 561 +563 3 302.5102 356.1112 16.9459 0.1907 562 +564 3 302.6143 357.1053 15.9138 0.2161 563 +565 3 301.968 357.8981 15.2757 0.2161 564 +566 3 300.9315 358.2653 15.6022 0.2034 565 +567 3 300.4544 358.9998 16.791 0.178 566 +568 3 301.0928 359.5867 15.6106 0.178 567 +569 3 302.016 359.5592 14.0 0.1907 568 +570 3 306.1218 356.5768 26.1514 0.3178 268 +571 3 305.2238 356.245 24.876 0.3178 570 +572 3 304.2125 356.0048 24.7976 0.2669 571 +573 3 303.295 355.6799 24.3214 0.2415 572 +574 3 302.3295 355.6582 24.92 0.1907 573 +575 3 301.2072 355.5998 25.121 0.178 574 +576 3 300.2485 355.3058 24.0128 0.2034 575 +577 3 299.3287 355.2886 22.96 0.2542 576 +578 3 298.3483 354.9958 23.0737 0.2796 577 +579 3 297.4926 354.8654 22.8934 0.2796 578 +580 3 296.5488 354.5256 22.6873 0.2796 579 +581 3 295.5993 354.1069 21.8565 0.3051 580 +582 3 294.7299 353.377 21.56 0.3305 581 +583 3 293.9634 352.598 22.0142 0.3305 582 +584 3 293.0184 352.1415 21.5642 0.3305 583 +585 3 292.2256 351.6416 21.7003 0.3305 584 +586 3 291.3596 351.0272 21.3592 0.3305 585 +587 3 290.4227 350.525 21.0731 0.3178 586 +588 3 289.4 350.1475 20.8603 0.3178 587 +589 3 289.0064 349.333 20.16 0.3305 588 +590 3 288.2239 348.5757 20.6489 0.3305 589 +591 3 287.549 347.7691 20.7827 0.2796 590 +592 3 286.6429 347.2852 19.8761 0.2415 591 +593 3 285.9348 346.6148 19.8573 0.2161 592 +594 3 285.0036 346.2064 20.1401 0.2288 593 +595 3 284.3469 345.8655 19.6622 0.2034 594 +596 3 283.7074 345.4114 19.4219 0.178 595 +597 3 283.14 344.9137 19.4622 0.1525 596 +598 3 282.6481 344.1816 20.6951 0.1652 597 +599 3 281.837 343.6679 19.6288 0.1907 598 +600 3 280.9881 343.2629 19.88 0.2161 599 +601 3 280.0512 342.914 19.88 0.2415 600 +602 3 279.3019 342.382 19.4384 0.2542 601 +603 3 278.3855 341.8924 19.8755 0.2796 602 +604 3 277.4875 341.341 19.3486 0.2796 603 +605 3 276.6135 340.8399 19.32 0.2796 604 +606 3 275.7555 340.0986 19.3869 0.2669 605 +607 3 275.1126 339.3035 19.1041 0.2542 606 +608 3 274.4033 338.4764 19.0551 0.2161 607 +609 3 273.8862 337.4617 19.164 0.1652 608 +610 3 273.1323 336.6517 19.32 0.1525 609 +611 3 272.4882 335.7766 19.32 0.1907 610 +612 3 272.264 335.2423 19.32 0.2034 611 +613 3 271.5856 334.5056 19.32 0.2415 612 +614 3 272.59 335.1714 19.5513 0.2034 611 +615 3 272.3841 334.0732 19.9839 0.2415 614 +616 3 271.9368 333.198 19.6078 0.2669 615 +617 3 271.239 332.4819 19.9755 0.2669 616 +618 3 270.3421 331.8138 20.3748 0.2161 617 +619 3 269.7083 330.8986 19.8016 0.178 618 +620 3 269.3182 329.9376 19.3113 0.1398 619 +621 3 268.8743 328.9149 19.32 0.1271 620 +622 3 268.117 328.0843 19.1159 0.1271 621 +623 3 267.2075 327.5478 19.3166 0.1398 622 +624 3 266.1836 327.0971 19.04 0.1525 623 +625 3 265.0934 326.8786 19.3945 0.1398 624 +626 3 264.2228 326.5068 20.72 0.1271 625 +627 3 263.3477 326.3889 19.3189 0.1144 626 +628 3 262.3993 325.9336 18.48 0.1144 627 +629 3 261.2667 325.8112 18.48 0.1271 628 +630 3 260.1273 325.7837 18.48 0.1398 629 +631 3 259.3677 325.1683 18.3674 0.1525 630 +632 3 258.7145 324.419 17.7086 0.1398 631 +633 3 257.8553 323.7051 17.92 0.1271 632 +634 3 257.0213 322.9947 17.92 0.1144 633 +635 3 256.3155 322.171 17.92 0.1144 634 +636 3 255.7137 321.2741 17.897 0.1398 635 +637 3 255.3111 320.8989 16.849 0.1907 636 +638 3 254.6452 320.0088 16.8566 0.2669 637 +639 3 253.7346 319.3339 16.8582 0.3178 638 +640 3 253.07 318.5823 16.9044 0.3432 639 +641 3 252.379 317.7082 16.8224 0.3432 640 +642 3 251.4546 317.428 16.4956 0.3559 641 +643 3 250.4948 317.0173 16.6286 0.394 642 +644 3 249.7386 316.2005 16.52 0.4195 643 +645 3 249.0133 315.3493 16.2977 0.4195 644 +646 3 248.129 314.6561 16.6116 0.3686 645 +647 3 247.4655 314.1058 16.4615 0.3432 646 +648 3 246.6178 313.5178 16.3047 0.3178 647 +649 3 245.5848 313.1094 16.87 0.3178 648 +650 3 244.7119 312.4584 17.4672 0.3051 649 +651 3 243.7784 311.8372 17.4846 0.3305 650 +652 3 242.9662 311.1165 17.1632 0.3432 651 +653 3 242.4765 310.4702 16.6365 0.3432 652 +654 3 241.6872 309.9073 16.3302 0.2924 653 +655 3 241.4115 309.452 18.1269 0.2415 654 +656 3 241.4206 309.4703 16.52 0.1907 655 +657 3 241.0774 308.4647 16.5217 0.1652 656 +658 3 241.4069 307.633 14.966 0.178 657 +659 3 241.1506 306.7842 14.9271 0.2161 658 +660 3 240.5752 306.6137 16.8932 0.2415 659 +661 3 240.1954 305.6962 16.6281 0.2288 660 +662 3 240.2617 305.0339 18.0849 0.1907 661 +663 3 240.637 304.4173 17.92 0.1907 662 +664 3 240.6301 303.9196 17.0405 0.2034 663 +665 3 240.3738 303.0834 15.96 0.2669 664 +666 3 239.9803 302.4015 15.3524 0.3051 665 +667 3 239.3591 301.579 15.1256 0.3305 666 +668 3 238.7471 300.9978 16.1073 0.3051 667 +669 3 238.0195 300.4075 15.8668 0.2669 668 +670 3 237.9165 300.014 14.0358 0.2542 669 +671 3 237.2736 299.3196 14.2419 0.2288 670 +672 3 236.6936 299.156 12.88 0.2034 671 +673 3 312.0306 368.2181 26.1411 0.1652 1 +674 3 311.78 367.1565 25.3375 0.2161 673 +675 3 311.2504 366.223 24.3908 0.2542 674 +676 3 310.9037 365.2781 23.0723 0.2415 675 +677 3 311.2183 364.1935 22.96 0.2161 676 +678 3 311.8498 363.6547 22.9597 0.394 677 +679 3 312.7696 362.9752 22.958 0.4195 678 +680 3 313.6047 362.1938 22.9513 0.4068 679 +681 3 314.4742 361.4502 22.9222 0.394 680 +682 3 315.4214 360.813 22.7665 0.3686 681 +683 3 316.2851 360.1198 22.0604 0.3432 682 +684 3 317.1465 359.3739 21.84 0.3051 683 +685 3 318.0148 358.6314 21.84 0.2669 684 +686 3 318.8362 357.8363 21.84 0.2542 685 +687 3 319.6416 357.023 21.84 0.2415 686 +688 3 320.4333 356.197 21.84 0.2542 687 +689 3 321.1666 355.3218 21.84 0.2669 688 +690 3 321.8404 354.3986 21.8394 0.3178 689 +691 3 322.5485 353.5017 21.8375 0.3559 690 +692 3 323.2601 352.6105 21.8285 0.3559 691 +693 3 324.1169 351.8612 21.7795 0.3305 692 +694 3 325.047 351.2286 21.429 0.2924 693 +695 3 325.8169 350.469 20.6265 0.2924 694 +696 3 326.5079 349.6098 19.9601 0.2796 695 +697 3 327.3293 348.8342 19.6504 0.2796 696 +698 3 328.1415 348.046 19.936 0.2669 697 +699 3 328.8657 347.1971 20.151 0.2924 698 +700 3 329.5349 346.2865 19.7893 0.3432 699 +701 3 330.3106 345.4571 19.5244 0.3686 700 +702 3 331.1239 344.6792 19.0999 0.3559 701 +703 3 331.9099 343.8727 18.6348 0.3051 702 +704 3 332.5951 342.9655 18.5945 0.2924 703 +705 3 333.2735 342.0823 19.14 0.2924 704 +706 3 334.0423 341.2644 19.6092 0.3051 705 +707 3 334.8465 340.4761 20.097 0.3051 706 +708 3 335.6896 339.7302 20.5808 0.2924 707 +709 3 336.6186 339.0736 20.7189 0.2796 708 +710 3 337.5704 338.4398 20.7152 0.2669 709 +711 3 338.4787 337.7466 20.6982 0.2669 710 +712 3 339.3905 337.0556 20.6136 0.2542 711 +713 3 340.4155 336.797 19.9066 0.2288 712 +714 3 340.888 336.7021 20.7054 0.2034 713 +715 3 341.7357 336.2182 20.4498 0.178 714 +716 3 342.6898 335.8143 19.9534 0.1907 715 +717 3 343.5409 335.6496 18.6522 0.2288 716 +718 3 344.1221 334.8843 18.1961 0.2924 717 +719 3 344.5465 334.0194 18.6458 0.3178 718 +720 3 345.0476 333.0459 19.0036 0.2796 719 +721 3 345.3461 332.1272 19.264 0.2161 720 +722 3 345.8907 331.3127 19.6795 0.1652 721 +723 3 346.5256 330.8276 19.49 0.1525 722 +724 3 346.7864 330.0337 19.9335 0.178 723 +725 3 347.0107 329.2009 20.7088 0.1907 724 +726 3 347.3138 328.5774 19.2556 0.2288 725 +727 3 346.5519 328.328 17.5574 0.2415 726 +728 3 346.5359 327.9951 15.68 0.2796 727 +729 3 346.6 327.2984 15.0192 0.2924 728 +730 3 346.2888 326.4496 14.6462 0.2796 729 +731 3 346.2888 326.1544 17.2052 0.2542 730 +732 3 346.7773 325.3822 17.92 0.2288 731 +733 3 347.204 324.721 18.5643 0.2288 732 +734 3 347.2635 323.7509 18.1902 0.2415 733 +735 3 347.3962 322.8585 17.0125 0.2415 734 +736 3 347.744 321.9651 18.2 0.2669 735 +737 3 347.911 320.9641 17.3768 0.2796 736 +738 3 348.5459 320.1141 17.8315 0.3305 737 +739 3 348.8056 319.3693 18.0029 0.3686 738 +740 3 349.2781 318.3969 17.5647 0.394 739 +741 3 349.8352 317.7185 17.08 0.394 740 +742 3 350.1326 316.8537 16.2173 0.3686 741 +743 3 350.31 315.8206 16.0096 0.3559 742 +744 3 350.5582 314.7338 16.387 0.3305 743 +745 3 350.8797 313.782 17.4628 0.3051 744 +746 3 351.526 313.0636 18.3985 0.2796 745 +747 3 352.0946 312.2262 17.7682 0.2415 746 +748 3 353.0052 311.5707 17.92 0.2288 747 +749 3 353.774 310.9575 16.8146 0.2034 748 +750 3 354.5439 310.4724 15.6842 0.2288 749 +751 3 355.1411 310.008 15.7872 0.2288 750 +752 3 355.8458 309.3994 15.0598 0.2542 751 +753 3 356.2656 308.6054 14.56 0.2669 752 +754 3 356.9337 307.8401 15.12 0.2924 753 +755 3 357.595 307.053 14.9226 0.3178 754 +756 3 358.3042 306.4273 16.2442 0.3178 755 +757 3 358.9231 305.8244 15.3765 0.3051 756 +758 3 359.1668 304.828 15.6624 0.2796 757 +759 3 359.4459 303.8464 15.2127 0.2415 758 +760 3 359.6622 302.8454 14.082 0.2288 759 +761 3 360.0889 302.1704 15.0889 0.2161 760 +762 3 360.5488 301.5893 14.4393 0.2542 761 +763 3 361.4491 301.2072 14.4878 0.2796 762 +764 3 362.1458 300.7187 15.4 0.2924 763 +765 3 362.759 300.2199 17.0999 0.2796 764 +766 3 363.1182 299.2921 16.681 0.2542 765 +767 3 363.5632 298.433 15.4311 0.2415 766 +768 3 363.6467 297.7626 17.2939 0.2034 767 +769 3 363.8389 297.0968 16.7356 0.1907 768 +770 3 364.3114 296.717 16.2686 0.1907 769 +771 3 364.1558 295.9128 17.3474 0.2161 770 +772 3 364.2496 294.9186 16.1381 0.2288 771 +773 3 364.2302 294.5823 13.8012 0.2161 772 +774 3 363.8721 293.8639 14.3632 0.2034 773 +775 3 364.4784 293.0928 15.4 0.178 774 +776 3 311.2515 363.5666 23.2739 0.3051 677 +777 3 311.6279 362.8608 25.2036 0.2415 776 +778 3 311.7995 362.4352 27.6895 0.2034 777 +779 3 312.0535 362.0497 29.6856 0.2034 778 +780 3 311.5078 361.1825 30.4539 0.2542 779 +781 3 310.7596 360.3772 30.875 0.3051 780 +782 3 310.1064 359.4757 31.3404 0.3305 781 +783 3 310.2482 358.7836 32.2291 0.3432 782 +784 3 311.0708 358.1349 33.3287 0.3305 783 +785 3 311.3007 357.1156 34.0796 0.2924 784 +786 3 310.8854 356.0746 34.2222 0.2669 785 +787 3 310.453 355.0518 34.853 0.2542 786 +788 3 310.9861 354.1298 35.4858 0.2796 787 +789 3 311.9345 353.5864 36.2782 0.3051 788 +790 3 312.4516 352.5831 36.6072 0.3559 789 +791 3 311.7903 351.3453 38.0428 0.2924 790 +792 3 311.2183 350.4884 39.1381 0.3178 791 +793 3 310.8305 349.4863 40.0814 0.394 792 +794 3 310.3603 348.5288 41.0603 0.4322 793 +795 3 309.7723 347.6341 41.9689 0.4195 794 +796 3 309.0219 346.8276 42.6549 0.3305 795 +797 3 308.2005 346.0703 43.1046 0.2669 796 +798 3 307.3882 345.2649 43.169 0.2288 797 +799 3 306.5634 344.479 43.379 0.2288 798 +800 3 305.6402 344.0008 44.0409 0.2415 799 +801 3 304.9469 343.2915 44.3948 0.2542 800 +802 3 304.5317 342.4106 44.1983 0.2669 801 +803 3 304.2834 341.5046 44.1126 0.2542 802 +804 3 303.6393 340.5951 43.68 0.2415 803 +805 3 302.8088 339.8389 43.68 0.2415 804 +806 3 301.9863 339.2589 43.0254 0.2415 805 +807 3 301.2461 338.4261 43.001 0.2161 806 +808 3 300.5551 337.6642 43.4 0.1907 807 +809 3 299.7463 336.9 43.3958 0.1907 808 +810 3 298.8277 336.2433 43.1981 0.2288 809 +811 3 297.9788 335.5398 43.68 0.2415 810 +812 3 297.3634 334.6154 43.96 0.2415 811 +813 3 296.3921 334.2642 44.4906 0.2415 812 +814 3 295.581 333.5732 44.3167 0.2796 813 +815 3 295.0216 333.0184 43.12 0.3305 814 +816 3 294.2654 332.3503 43.4904 0.3559 815 +817 3 293.6602 331.5873 43.5422 0.3432 816 +818 3 292.999 330.9363 43.68 0.3051 817 +819 3 292.2623 330.0955 43.96 0.2669 818 +820 3 291.6205 329.1997 43.4826 0.2161 819 +821 3 290.8254 328.4127 43.12 0.178 820 +822 3 290.1253 327.5238 43.12 0.178 821 +823 3 289.5441 326.7115 42.9195 0.2034 822 +824 3 288.9744 326.1292 43.0903 0.2415 823 +825 3 288.439 325.206 43.1589 0.2415 824 +826 3 288.4367 324.1616 42.8431 0.2669 825 +827 3 288.1393 323.1789 42.7966 0.2542 826 +828 3 287.5558 322.2545 42.56 0.2542 827 +829 3 286.977 321.2947 42.2531 0.2161 828 +830 3 286.4233 320.4584 41.5663 0.2161 829 +831 3 285.3388 320.1701 41.44 0.2034 830 +832 3 284.6798 319.3682 41.1695 0.1907 831 +833 3 283.9557 318.5926 40.8853 0.178 832 +834 3 283.2899 317.9885 39.7424 0.2034 833 +835 3 282.2248 317.6122 39.3862 0.2669 834 +836 3 281.7706 316.8617 39.8717 0.3051 835 +837 3 281.535 315.8595 39.4708 0.3305 836 +838 3 280.9172 315.7486 38.099 0.3305 837 +839 3 280.3063 314.9981 38.456 0.3305 838 +840 3 279.4643 314.5279 38.0993 0.2796 839 +841 3 278.8523 313.718 39.058 0.2161 840 +842 3 278.2505 312.8977 38.6389 0.178 841 +843 3 277.5664 312.2594 37.4657 0.2034 842 +844 3 276.9944 311.406 37.1272 0.2288 843 +845 3 276.3858 310.8957 38.5666 0.2669 844 +846 3 275.6823 310.7035 37.5376 0.2542 845 +847 3 274.6092 310.5068 36.96 0.2669 846 +848 3 273.551 310.2597 36.5106 0.2161 847 +849 3 272.9492 309.5824 35.8218 0.1907 848 +850 3 271.9677 309.1614 35.84 0.1525 849 +851 3 271.1429 308.5242 36.4 0.1652 850 +852 3 270.3375 307.8207 36.7111 0.1907 851 +853 3 269.4612 307.1308 36.7223 0.2288 852 +854 3 268.7794 306.2568 36.7875 0.2669 853 +855 3 268.0552 305.4217 36.5316 0.3178 854 +856 3 267.601 304.5808 36.0287 0.3432 855 +857 3 267.2407 303.8464 35.3214 0.3686 856 +858 3 266.9581 303.176 35.2694 0.3432 857 +859 3 266.7511 302.4221 35.5496 0.3432 858 +860 3 266.1344 301.6877 35.5541 0.3305 859 +861 3 265.6746 300.872 34.5332 0.3305 860 +862 3 265.6368 300.5288 35.56 0.2415 861 +863 3 265.4034 300.2096 34.7141 0.2669 861 +864 3 265.0145 299.3356 35.2612 0.2542 863 +865 3 264.542 298.33 35.0022 0.2796 864 +866 3 264.2114 297.678 33.3169 0.3051 865 +867 3 263.9711 296.9435 32.0051 0.3305 866 +868 3 263.6405 296.1393 33.0145 0.3305 867 +869 3 263.6771 295.0982 33.6196 0.3051 868 +870 3 264.0249 294.2746 34.2286 0.2415 869 +871 3 264.0352 293.293 33.3214 0.2034 870 +872 3 264.2732 292.3069 33.532 0.2034 871 +873 3 264.2365 291.4512 32.0158 0.2669 872 +874 3 264.0924 290.4273 32.3109 0.3178 873 +875 3 263.4632 289.7134 32.2 0.3178 874 +876 3 263.3442 288.6564 32.48 0.2924 875 +877 3 263.3156 287.8956 31.4336 0.2796 876 +878 3 262.8683 287.1257 29.8343 0.3051 877 +879 3 262.397 286.2528 30.2599 0.3305 878 +880 3 261.706 286.0812 31.92 0.3305 879 +881 3 261.2633 285.2244 31.2833 0.2924 880 +882 3 260.5609 284.5483 30.24 0.2542 881 +883 3 260.0621 283.9797 31.3284 0.2288 882 +884 3 259.4054 283.2716 31.3894 0.2542 883 +885 3 258.5371 282.6424 30.7597 0.2924 884 +886 3 257.9194 281.8839 30.2347 0.3305 885 +887 3 257.4 281.2135 29.4294 0.3305 886 +888 3 256.9859 280.4276 29.5809 0.2796 887 +889 3 256.2331 279.9368 28.4547 0.2288 888 +890 3 255.4804 279.454 29.4 0.2034 889 +891 3 255.2092 279.1349 29.9348 0.2924 890 +892 3 254.6544 279.5936 30.8 0.2669 891 +893 3 255.0617 278.945 29.9289 0.2924 890 +894 3 254.0424 278.5732 29.0458 0.2161 893 +895 3 253.2107 278.326 29.1578 0.1907 894 +896 3 252.4259 277.6522 28.5659 0.1652 895 +897 3 252.3653 276.8594 27.72 0.1525 896 +898 3 251.6789 276.1193 27.587 0.1525 897 +899 3 251.108 275.2384 27.6749 0.1652 898 +900 3 250.9833 274.1356 27.1768 0.1652 899 +901 3 250.1585 273.5304 26.8562 0.1652 900 +902 3 249.3851 273.1597 26.1033 0.1398 901 +903 3 248.7331 273.4126 27.44 0.1271 902 +904 3 247.6051 273.4046 27.1631 0.1398 903 +905 3 246.8775 272.9984 28.56 0.1652 904 +906 3 245.8216 272.8223 27.83 0.1907 905 +907 3 244.7782 272.844 26.88 0.1907 906 +908 3 243.6354 272.8749 26.9052 0.2034 907 +909 3 242.6046 273.1426 27.0446 0.2288 908 +910 3 241.5819 273.1506 27.4898 0.2288 909 +911 3 240.8669 272.5717 27.5058 0.2034 910 +912 3 240.4562 272.1565 26.2601 0.1525 911 +913 3 239.4438 272.0432 25.76 0.1398 912 +914 3 238.7974 271.9288 27.3535 0.1398 913 +915 3 238.1225 271.2676 27.6744 0.1525 914 +916 3 237.3537 271.3568 26.3194 0.1525 915 +917 3 236.8069 270.969 25.1166 0.1525 916 +918 3 236.7028 270.6704 27.0304 0.1525 917 +919 3 236.3504 269.9291 28.4668 0.1398 918 +920 3 236.3195 268.824 28.8728 0.1525 919 +921 3 235.6834 268.0495 28.2523 0.178 920 +922 3 235.5839 267.2064 27.1216 0.2415 921 +923 3 236.1216 266.4376 27.16 0.2796 922 +924 3 254.4988 278.0858 29.4 0.2161 893 +925 3 254.2037 277.0505 29.0338 0.2288 924 +926 3 253.9428 276.0632 29.1939 0.2161 925 +927 3 253.5825 275.0805 29.6388 0.178 926 +928 3 253.5104 274.0955 28.84 0.1398 927 +929 3 253.5104 272.9515 28.84 0.1271 928 +930 3 253.1409 271.8865 28.8534 0.1398 929 +931 3 252.5437 270.9347 28.5692 0.1652 930 +932 3 252.252 269.9291 28.28 0.178 931 +933 3 252.5758 268.951 28.273 0.1907 932 +934 3 252.5986 267.9626 28.7207 0.178 933 +935 3 252.7096 266.9856 28.3861 0.1652 934 +936 3 252.1856 266.155 28.28 0.1525 935 +937 3 251.4398 265.3817 28.28 0.1525 936 +938 3 250.3678 265.0648 28.2072 0.1525 937 +939 3 249.2593 265.2684 28.0101 0.1652 938 +940 3 248.3418 265.2833 27.2443 0.2034 939 +941 3 247.6989 264.4962 27.4792 0.2288 940 +942 3 247.0205 263.8693 26.9744 0.2288 941 +943 3 246.27 263.0342 27.2429 0.178 942 +944 3 245.3274 262.5503 28.0 0.1652 943 +945 3 244.5918 261.9863 27.1821 0.178 944 +946 3 243.7155 261.7278 27.0357 0.2288 945 +947 3 243.2991 260.9475 26.0495 0.2415 946 +948 3 243.2144 260.1753 26.4396 0.2415 947 +949 3 242.9295 259.3185 26.5426 0.2161 948 +950 3 242.4422 258.5062 25.9938 0.2034 949 +951 3 242.1825 257.4721 25.48 0.178 950 +952 3 241.9423 256.3807 25.9484 0.178 951 +953 3 241.5682 255.3648 26.2539 0.178 952 +954 3 240.8726 254.4817 26.6224 0.2034 953 +955 3 240.121 253.6992 26.7128 0.2161 954 +956 3 239.6222 252.8 26.7966 0.2288 955 +957 3 239.5033 251.7406 26.4695 0.2161 956 +958 3 239.5628 250.6069 26.6647 0.1907 957 +959 3 239.5467 249.4641 26.6 0.1525 958 +960 3 239.1029 248.4688 27.0866 0.1271 959 +961 3 238.389 247.6291 27.44 0.1144 960 +962 3 237.7507 246.7574 27.44 0.1271 961 +963 3 237.5722 245.6362 27.44 0.1525 962 +964 3 236.9636 244.8126 27.7875 0.1907 963 +965 3 236.7348 243.8916 28.338 0.2161 964 +966 3 236.236 243.1057 28.716 0.2288 965 +967 3 235.6915 242.3873 29.461 0.2161 966 +968 3 234.8049 241.956 28.6479 0.2034 967 +969 3 233.7661 241.7615 28.56 0.1907 968 +970 3 232.939 241.1232 28.8002 0.2034 969 +971 3 231.9746 240.5683 28.3027 0.2034 970 +972 3 231.0537 239.8968 28.222 0.1907 971 +973 3 230.0881 239.3728 28.2402 0.1525 972 +974 3 229.4864 238.5972 28.56 0.1398 973 +975 3 229.0631 237.5745 28.56 0.1525 974 +976 3 228.3561 236.6822 28.56 0.178 975 +977 3 227.8745 236.0129 27.5131 0.178 976 +978 3 227.4272 235.124 28.28 0.1525 977 +979 3 227.2201 234.0567 28.28 0.1271 978 +980 3 226.9696 233.0774 28.28 0.1271 979 +981 3 226.7946 232.0192 28.28 0.1525 980 +982 3 225.956 231.66 27.1432 0.178 981 +983 3 226.0567 230.8901 27.3364 0.178 982 +984 3 225.8256 229.8468 27.72 0.1525 983 +985 3 225.8256 228.7028 27.72 0.1271 984 +986 3 225.8256 227.5588 27.72 0.1271 985 +987 3 225.7112 226.4331 27.9947 0.1398 986 +988 3 225.4984 225.5476 28.4824 0.1525 987 +989 3 225.6986 224.5661 28.285 0.1652 988 +990 3 225.7112 223.4232 28.28 0.1907 989 +991 3 312.7742 352.0122 37.4774 0.394 790 +992 3 313.4629 352.018 39.2 0.3559 991 +993 3 314.5531 352.1232 39.0611 0.3051 992 +994 3 315.6937 352.1232 39.2 0.2415 993 +995 3 316.6272 352.2319 40.0697 0.2161 994 +996 3 317.2449 351.6645 39.4985 0.2161 995 +997 3 317.8615 351.5501 38.3634 0.2034 996 +998 3 318.8236 351.3087 39.2 0.1652 997 +999 3 319.9539 351.1966 39.256 0.1271 998 +1000 3 320.9915 350.827 39.5508 0.1271 999 +1001 3 322.0085 350.4781 40.32 0.1525 1000 +1002 3 323.1388 350.2997 40.32 0.178 1001 +1003 3 324.0357 349.9496 39.5024 0.178 1002 +1004 3 325.0436 349.9496 40.32 0.1525 1003 +1005 3 326.0537 349.7242 39.48 0.1525 1004 +1006 3 326.9049 349.1271 39.1737 0.1907 1005 +1007 3 327.8933 348.6546 38.4574 0.2669 1006 +1008 3 328.9126 348.3091 38.2824 0.2924 1007 +1009 3 329.9422 348.1512 39.0362 0.2924 1008 +1010 3 330.8162 347.6513 38.8066 0.2542 1009 +1011 3 331.6685 347.0953 38.7383 0.2415 1010 +1012 3 332.443 346.5176 39.0572 0.2161 1011 +1013 3 333.5298 346.2716 38.9567 0.2161 1012 +1014 3 334.6006 345.9422 39.2 0.2415 1013 +1015 3 335.7148 345.75 39.2 0.2796 1014 +1016 3 336.6552 345.2066 38.92 0.2796 1015 +1017 3 337.6367 344.7204 38.906 0.2415 1016 +1018 3 338.5222 344.1083 38.64 0.2034 1017 +1019 3 339.3493 343.7068 39.4472 0.1907 1018 +1020 3 340.1306 343.1268 38.703 0.178 1019 +1021 3 341.1374 342.8007 38.8433 0.1525 1020 +1022 3 341.6968 342.0343 38.2917 0.1271 1021 +1023 3 342.7699 341.8272 38.4994 0.1271 1022 +1024 3 343.8807 341.8272 38.92 0.1398 1023 +1025 3 344.9995 341.6831 38.64 0.1525 1024 +1026 3 345.9765 341.2277 39.3921 0.1398 1025 +1027 3 346.9214 340.809 39.48 0.1271 1026 +1028 3 347.9201 340.3514 39.2 0.1271 1027 +1029 3 348.7152 339.768 39.17 0.1398 1028 +1030 3 349.8158 339.5861 39.2465 0.1525 1029 +1031 3 350.4941 338.9157 40.054 0.1398 1030 +1032 3 351.184 338.0497 40.1649 0.1398 1031 +1033 3 351.9779 337.2375 40.04 0.1398 1032 +1034 3 352.7627 336.4161 39.7754 0.1525 1033 +1035 3 353.4537 335.7834 40.304 0.1398 1034 +1036 3 354.0062 334.8179 40.2942 0.1398 1035 +1037 3 354.6022 333.9977 39.5335 0.1398 1036 +1038 3 354.8688 333.2232 40.1047 0.1525 1037 +1039 3 354.8688 332.1146 39.76 0.1398 1038 +1040 3 354.926 330.9821 39.76 0.1398 1039 +1041 3 355.5575 330.1161 39.9524 0.1525 1040 +1042 3 355.6868 329.2466 41.44 0.178 1041 +1043 3 356.0872 328.233 41.0396 0.2034 1042 +1044 3 356.928 327.6416 40.6 0.2034 1043 +1045 2 313.9491 377.5497 28.194 0.2034 1 +1046 2 314.3346 378.4878 29.4406 0.3051 1045 +1047 2 315.2921 379.0438 29.8995 0.394 1046 +1048 2 316.1364 379.7222 30.7801 0.4449 1047 +1049 2 316.2531 380.8536 30.8048 0.4576 1048 +1050 2 316.5425 381.9599 30.8286 0.4449 1049 +1051 3 314.7499 376.7741 26.964 0.1398 1 +1052 3 315.3905 377.7213 26.8498 0.178 1051 +1053 3 315.8264 378.5427 27.6531 0.2288 1052 +1054 3 316.9498 378.5324 27.44 0.2288 1053 +1055 3 317.5115 378.2064 29.1007 0.2288 1054 +1056 3 318.6543 378.2064 29.12 0.2288 1055 +1057 3 319.7903 378.3094 29.12 0.2924 1056 +1058 3 320.6632 378.2762 28.1529 0.3432 1057 +1059 3 321.3084 377.6104 28.7398 0.3686 1058 +1060 3 322.314 377.091 28.9512 0.3432 1059 +1061 3 323.3836 376.7192 28.9022 0.3051 1060 +1062 3 324.5196 376.3852 28.6958 0.2669 1061 +1063 3 325.341 376.6426 28.6843 0.2288 1062 +1064 3 325.9519 376.4424 29.4493 0.178 1063 +1065 3 327.0158 376.1472 29.4 0.1652 1064 +1066 3 327.7938 375.7274 28.28 0.1907 1065 +1067 3 328.5396 375.621 28.4964 0.2415 1066 +1068 3 329.3553 375.3624 29.5546 0.2669 1067 +1069 3 330.2305 375.5535 30.5978 0.2796 1068 +1070 3 331.1937 375.2675 31.8942 0.2669 1069 +1071 3 332.0037 375.0032 30.6956 0.2924 1070 +1072 3 332.9761 374.6886 30.0754 0.2924 1071 +1073 3 333.9359 374.6108 29.9622 0.2796 1072 +1074 3 335.025 374.4312 30.3635 0.2669 1073 +1075 3 335.7148 373.842 31.2332 0.2924 1074 +1076 3 336.7101 373.4771 30.5354 0.3432 1075 +1077 3 337.5178 373.2231 30.7376 0.3178 1076 +1078 3 338.5462 372.8857 30.6348 0.2796 1077 +1079 3 339.6216 372.8548 30.3873 0.2161 1078 +1080 3 340.6043 372.6569 29.9838 0.2288 1079 +1081 3 341.1408 372.4784 28.2072 0.2288 1080 +1082 3 341.6625 372.8799 27.72 0.2288 1081 +1083 3 342.1189 373.3616 27.72 0.2924 1082 +1084 3 342.7962 374.0514 27.47 0.3178 1083 +1085 3 343.7068 374.231 28.3346 0.3178 1084 +1086 3 344.4401 374.0777 27.4652 0.3178 1085 +1087 3 345.2009 374.0571 26.1884 0.3559 1086 +1088 3 345.6035 374.088 24.6884 0.394 1087 +1089 3 345.8312 374.7378 25.1006 0.4068 1088 +1090 3 346.6251 375.0032 25.5178 0.3813 1089 +1091 3 347.4351 375.3922 25.951 0.3686 1090 +1092 3 348.3251 375.1187 24.9511 0.3559 1091 +1093 3 349.3765 375.232 24.64 0.3305 1092 +1094 3 349.7208 375.7079 23.2184 0.2669 1093 +1095 3 350.334 376.249 23.3806 0.2288 1094 +1096 3 351.1096 376.0248 22.3401 0.2288 1095 +1097 3 351.9287 375.6804 23.0812 0.2669 1096 +1098 3 352.789 375.4333 21.9601 0.2924 1097 +1099 3 353.83 375.4436 21.0022 0.2924 1098 +1100 3 354.6526 375.4608 21.4315 0.2796 1099 +1101 3 355.7531 375.6919 21.28 0.2669 1100 +1102 3 356.4029 376.336 20.44 0.2796 1101 +1103 3 357.3604 376.2616 20.1211 0.2924 1102 +1104 3 358.4026 376.5407 20.4168 0.2924 1103 +1105 3 358.9586 376.948 19.04 0.3051 1104 +1106 3 359.7891 377.4193 19.6935 0.3178 1105 +1107 3 360.6368 377.52 20.55 0.3432 1106 +1108 3 361.6813 377.6424 20.1704 0.3178 1107 +1109 3 362.767 377.7042 20.2118 0.2669 1108 +1110 3 363.6307 378.2339 19.6834 0.2288 1109 +1111 3 364.269 378.664 19.0453 0.2161 1110 +1112 3 365.1053 379.1674 20.1905 0.2542 1111 +1113 3 365.8992 379.538 19.4121 0.2796 1112 +1114 3 366.5845 380.2233 19.1332 0.3178 1113 +1115 3 367.1439 380.7976 20.44 0.3305 1114 +1116 3 367.8566 381.4039 19.3466 0.3432 1115 +1117 3 368.4389 381.8111 20.44 0.3432 1116 +1118 3 369.226 382.4266 20.7158 0.3305 1117 +1119 3 370.0279 383.1416 20.713 0.2924 1118 +1120 3 370.6549 383.987 20.9905 0.2288 1119 +1121 3 371.0964 384.956 20.0603 0.1907 1120 +1122 3 371.6238 385.9067 19.6862 0.1907 1121 +1123 3 372.356 386.7098 20.0836 0.2161 1122 +1124 3 373.135 387.5106 19.6006 0.2161 1123 +1125 3 373.7803 388.2484 20.2082 0.2034 1124 +1126 3 374.4426 389.151 19.7098 0.2161 1125 +1127 3 375.113 390.0571 19.3166 0.2288 1126 +1128 3 375.9092 390.7812 19.6 0.2288 1127 +1129 3 376.8302 391.2457 19.1556 0.178 1128 +1130 3 377.9238 391.4951 19.32 0.1652 1129 +1131 3 379.0518 391.6759 19.32 0.178 1130 +1132 3 380.1798 391.7822 19.516 0.2161 1131 +1133 3 381.2083 391.7159 19.0711 0.2034 1132 +1134 3 382.1726 391.7662 19.4855 0.178 1133 +1135 3 383.2457 391.9905 20.2056 0.1652 1134 +1136 3 384.3817 392.0488 20.454 0.1907 1135 +1137 3 385.48 391.9767 20.9412 0.2161 1136 +1138 3 386.434 392.0259 20.1698 0.2288 1137 +1139 3 387.3744 392.5602 20.72 0.2161 1138 +1140 3 388.2828 393.0464 20.3428 0.2161 1139 +1141 3 389.2334 393.6424 19.9416 0.2161 1140 +1142 3 390.1097 394.3254 20.3162 0.2542 1141 +1143 3 391.1325 394.7246 20.8312 0.2796 1142 +1144 3 392.0133 395.4064 20.9084 0.2924 1143 +1145 3 393.0761 395.7771 21.1176 0.2542 1144 +1146 3 394.0405 395.9224 21.1081 0.1907 1145 +1147 3 395.1193 396.1523 21.3027 0.1525 1146 +1148 3 396.237 396.2816 20.8933 0.1525 1147 +1149 3 397.3421 396.1672 21.28 0.1907 1148 +1150 3 398.3351 396.0082 20.3633 0.2034 1149 +1151 3 399.4047 395.7176 20.417 0.1907 1150 +1152 3 400.1929 395.1456 19.6 0.1652 1151 +1153 3 401.3369 395.1376 19.6 0.1525 1152 +1154 3 402.4134 394.807 19.6 0.1525 1153 +1155 3 403.3389 394.8756 20.6735 0.1525 1154 +1156 3 404.3228 394.3334 20.503 0.178 1155 +1157 3 405.3009 393.7614 20.4666 0.2034 1156 +1158 3 406.2447 393.3678 19.9531 0.2161 1157 +1159 3 407.0055 393.1928 20.4142 0.1907 1158 +1160 3 407.5958 393.1528 18.769 0.1652 1159 +1161 3 408.543 392.7352 18.4736 0.1525 1160 +1162 3 409.6412 392.9514 18.2 0.1652 1161 +1163 3 410.7852 392.964 18.177 0.2034 1162 +1164 3 411.9006 393.075 17.7422 0.2415 1163 +1165 3 412.9199 393.2271 18.2246 0.2415 1164 +1166 3 413.6704 393.3507 18.3546 0.1907 1165 +1167 3 414.5936 393.3072 17.64 0.1652 1166 +1168 3 415.7319 393.2786 17.5336 0.1652 1167 +1169 3 416.8393 393.1928 17.801 0.2161 1168 +1170 3 417.7945 393.4216 19.0028 0.2415 1169 +1171 3 418.6651 393.3667 17.7052 0.2924 1170 +1172 3 419.7473 393.0784 17.9161 0.2924 1171 +1173 3 420.8284 393.0933 17.6568 0.2796 1172 +1174 3 421.7276 393.2431 18.4052 0.2288 1173 +1175 3 422.7091 393.29 17.4513 0.2034 1174 +1176 3 423.5614 392.9823 17.9018 0.1907 1175 +1177 3 424.6379 392.8496 17.92 0.2034 1176 +1178 3 425.2694 392.6643 16.6939 0.2288 1177 +1179 3 426.0942 392.1643 15.8841 0.2669 1178 +1180 3 426.1434 391.407 14.6555 0.2924 1179 +1181 3 426.9763 390.8533 14.9456 0.2924 1180 +1182 3 427.9349 390.4541 14.5032 0.2669 1181 +1183 3 428.8547 390.0651 15.4031 0.2161 1182 +1184 3 429.8992 389.9896 16.3702 0.1907 1183 +1185 3 430.8304 390.2184 17.36 0.1907 1184 +1186 3 341.2243 372.5573 28.089 0.1652 1082 +1187 3 340.34 372.4098 28.9332 0.2288 1186 +1188 3 328.2433 375.4802 28.4889 0.2161 1066 +1189 3 328.7753 374.6692 29.5291 0.178 1188 +1190 3 328.6712 374.3557 31.3818 0.1907 1189 +1191 3 329.1345 373.476 31.92 0.2034 1190 +1192 3 329.2707 372.4509 32.2176 0.2669 1191 +1193 3 330.0108 371.7371 33.1324 0.2796 1192 +1194 3 330.9455 371.1182 33.32 0.2924 1193 +1195 3 331.4031 370.537 33.7296 0.2415 1194 +1196 3 331.4305 369.4994 33.847 0.2415 1195 +1197 3 331.4099 368.3897 33.7924 0.2415 1196 +1198 3 330.926 367.4837 34.44 0.2542 1197 +1199 3 330.6743 366.4026 34.839 0.2161 1198 +1200 3 330.7167 365.3375 35.5491 0.1652 1199 +1201 3 330.5016 364.3262 36.2132 0.1398 1200 +1202 3 330.0657 363.7188 35.0115 0.1398 1201 +1203 3 329.5269 362.8585 36.0828 0.1652 1202 +1204 3 329.1013 362.3483 38.2687 0.1907 1203 +1205 3 328.3646 361.8083 38.3583 0.2415 1204 +1206 3 327.6473 361.1402 38.6028 0.2669 1205 +1207 3 326.7847 360.5899 38.5532 0.2669 1206 +1208 3 325.9656 360.2605 39.3156 0.2161 1207 +1209 3 325.3536 359.963 39.48 0.1907 1208 +1210 3 324.5963 359.2263 39.48 0.1652 1209 +1211 3 323.5953 358.7893 39.4834 0.1652 1210 +1212 3 323.5827 358.485 41.4355 0.1398 1211 +1213 3 322.9512 357.762 41.16 0.1398 1212 +1214 3 322.6538 357.1568 42.336 0.1652 1213 +1215 3 322.0326 356.6695 43.68 0.2034 1214 +1216 3 321.9216 355.538 43.6122 0.2288 1215 +1217 3 322.3792 354.9889 44.133 0.2034 1216 +1218 3 322.2225 354.6389 46.4366 0.1907 1217 +1219 3 321.5086 354.1778 47.4281 0.1652 1218 +1220 3 321.1094 353.4605 49.0557 0.1652 1219 +1221 3 320.7707 353.2672 51.4408 0.1398 1220 +1222 3 319.748 353.0384 51.8 0.1398 1221 +1223 3 325.5172 376.5453 29.1396 0.2161 1063 +1224 3 326.5674 376.2158 29.4557 0.2542 1223 +1225 3 327.5398 375.8166 29.12 0.2415 1224 +1226 3 324.1158 376.376 28.849 0.4576 1061 +1227 3 324.761 376.0294 27.6923 0.2796 1226 +1228 3 324.435 375.6713 26.054 0.2288 1227 +1229 3 325.0104 375.4608 24.0803 0.1907 1228 +1230 3 325.492 375.232 25.6948 0.2034 1229 +1231 3 326.0812 375.0879 27.1382 0.2288 1230 +1232 3 326.5308 374.7744 25.347 0.2542 1231 +1233 3 326.7893 374.5834 22.8903 0.2542 1232 +1234 3 326.8145 375.1222 20.6702 0.2288 1233 +1235 3 327.5203 375.3464 18.7687 0.1907 1234 +1236 3 328.5751 375.232 18.951 0.1907 1235 +1237 3 329.3954 374.7824 19.9116 0.2161 1236 +1238 3 329.9605 373.8935 19.88 0.2415 1237 +1239 3 330.8414 373.7448 18.6074 0.2288 1238 +1240 3 331.6456 374.1074 18.6435 0.2034 1239 +1241 3 332.3755 374.4667 18.6777 0.2034 1240 +1242 3 332.5677 374.1509 19.3404 0.2415 1241 +1243 3 333.3708 374.0914 20.4873 0.2796 1242 +1244 3 333.9862 373.4096 19.6 0.2924 1243 +1245 3 334.342 372.8365 21.0227 0.2415 1244 +1246 3 334.9724 372.6008 22.6467 0.1907 1245 +1247 3 336.1072 372.6008 22.96 0.178 1246 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb_470522102_m.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb_470522102_m.swc new file mode 100644 index 0000000..c270082 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Pvalb_470522102_m.swc @@ -0,0 +1,1966 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/MouseCellTypes/176847.04.02.01/176847.04.02.01_MDF.swc_sorted.swc +# id,type,x,y,z,r,pid +1 1 237.4944 233.8336 35.28 5.9212 -1 +2 3 232.5043 230.7745 35.28 0.2669 1 +3 3 231.4495 231.199 35.28 0.2796 2 +4 3 230.3513 231.5181 35.28 0.2796 3 +5 3 229.2084 231.5159 35.28 0.2542 4 +6 3 228.0793 231.3282 35.28 0.2542 5 +7 3 226.9616 231.0846 35.28 0.2669 6 +8 3 225.8176 231.0617 35.28 0.3305 7 +9 3 224.6816 230.9313 35.2803 0.4576 8 +10 3 223.2768 230.103 35.2825 0.4068 9 +11 3 222.4268 229.3377 35.2898 0.3813 10 +12 3 221.523 228.6364 35.3265 0.3051 11 +13 3 220.8629 227.775 35.6944 0.4322 12 +14 3 220.4488 226.75 35.6216 0.4322 13 +15 3 220.1548 225.6803 34.9891 0.4068 14 +16 3 219.823 224.6198 34.3207 0.3305 15 +17 3 219.6572 223.5159 33.8643 0.2542 16 +18 3 219.7075 222.4039 33.2562 0.2288 17 +19 3 219.9523 221.3102 33.0162 0.2669 18 +20 3 220.5003 220.3138 32.8628 0.3178 19 +21 3 220.9121 219.2648 32.3744 0.3432 20 +22 3 220.7828 218.1482 31.9312 0.3559 21 +23 3 220.2623 217.1312 31.9368 0.3686 22 +24 3 220.2383 215.9895 32.0306 0.4068 23 +25 3 220.7977 214.4005 32.426 0.2288 24 +26 3 220.7211 213.2908 31.92 0.2796 25 +27 3 220.53 212.1754 31.6366 0.3305 26 +28 3 220.3333 211.0783 31.2928 0.3178 27 +29 3 219.7956 210.0899 31.5381 0.2924 28 +30 3 219.2911 209.1106 31.6926 0.2796 29 +31 3 219.0497 208.0135 31.1898 0.3051 30 +32 3 218.7763 206.921 30.8129 0.3178 31 +33 3 218.464 205.8205 30.77 0.2924 32 +34 3 218.2889 204.7039 30.5665 0.2542 33 +35 3 218.2821 203.5714 30.5469 0.2669 34 +36 3 218.321 202.4342 30.8241 0.3051 35 +37 3 218.5555 201.3246 31.1539 0.3178 36 +38 3 218.6104 200.208 31.7103 0.2924 37 +39 3 218.2374 199.159 31.2561 0.2924 38 +40 3 217.7867 198.1259 30.7882 0.3178 39 +41 3 217.2685 197.1112 30.5396 0.3305 40 +42 3 216.8612 196.156 29.3952 0.3051 41 +43 3 216.5695 195.0589 29.6587 0.3305 42 +44 3 216.0856 194.0224 29.741 0.3686 43 +45 3 214.9896 193.582 29.5781 0.2034 44 +46 3 214.1545 192.8349 29.1992 0.2161 45 +47 3 213.5436 191.9152 28.5219 0.1907 46 +48 3 212.808 191.0903 27.9535 0.1652 47 +49 3 212.3847 190.2243 26.7529 0.1907 48 +50 3 212.3012 189.141 26.1708 0.2415 49 +51 3 211.8299 188.1388 25.5808 0.2924 50 +52 3 211.6045 187.1424 24.353 0.2924 51 +53 3 211.8516 186.0933 23.4917 0.2542 52 +54 3 211.7727 184.9791 24.0668 0.2415 53 +55 3 210.9628 184.2446 23.9061 0.2415 54 +56 3 210.218 183.5571 23.1552 0.2796 55 +57 3 209.8805 182.6064 21.8562 0.2924 56 +58 3 209.6472 181.5928 21.107 0.2924 57 +59 3 209.4355 180.4889 21.1991 0.2669 58 +60 3 209.0706 179.4593 20.4764 0.2161 59 +61 3 208.7606 178.3965 20.16 0.178 60 +62 3 208.232 177.5488 20.16 0.178 61 +63 3 207.3752 177.1427 19.32 0.2161 62 +64 3 206.9748 176.1005 18.9241 0.2669 63 +65 3 206.3364 175.1773 18.48 0.2796 64 +66 3 205.9452 174.1111 18.48 0.2924 65 +67 3 205.4041 173.1158 18.2104 0.2669 66 +68 3 204.9098 172.1583 17.3872 0.2542 67 +69 3 204.7657 171.0383 17.1268 0.2161 68 +70 3 204.2257 170.0808 16.8725 0.2288 69 +71 3 203.1778 169.6403 16.8 0.2542 70 +72 3 202.218 169.0477 16.5819 0.3051 71 +73 3 201.3737 168.3247 16.1622 0.3051 72 +74 3 201.344 167.2093 15.7676 0.2669 73 +75 3 200.6576 166.5664 14.84 0.2161 74 +76 3 215.9494 194.0602 30.8 0.178 44 +77 3 215.7618 193.6575 30.8 0.1907 76 +78 3 215.7584 192.5135 30.8 0.2161 77 +79 3 215.4381 191.4347 30.8 0.2288 78 +80 3 215.064 190.3547 30.8 0.2161 79 +81 3 214.8638 189.229 30.8 0.2034 80 +82 3 214.7288 188.0953 30.8 0.178 81 +83 3 214.7391 186.9513 30.8 0.1525 82 +84 3 215.0354 185.868 31.0607 0.1398 83 +85 3 215.2894 184.8304 32.0354 0.1398 84 +86 3 215.6955 183.8339 32.737 0.1652 85 +87 3 215.9929 182.7346 32.76 0.178 86 +88 3 216.2858 181.634 32.76 0.1907 87 +89 3 216.5066 180.5587 32.2216 0.1907 88 +90 3 216.8406 179.505 31.92 0.178 89 +91 3 216.9024 178.3633 31.92 0.178 90 +92 3 216.9024 177.2193 31.92 0.178 91 +93 3 216.8258 176.0833 31.9827 0.2161 92 +94 3 216.6072 174.9965 32.5234 0.2542 93 +95 3 216.5592 173.8891 32.9048 0.2924 94 +96 3 216.5592 172.7795 33.488 0.2796 95 +97 3 216.5592 171.6366 33.6 0.2542 96 +98 3 216.5592 170.4926 33.6 0.2161 97 +99 3 216.51 169.3566 33.7218 0.2034 98 +100 3 216.4448 168.2229 33.88 0.1907 99 +101 3 216.4448 167.0812 33.9674 0.2161 100 +102 3 216.4448 165.9555 34.4448 0.2415 101 +103 3 216.4448 164.8744 35.0708 0.2415 102 +104 3 216.4448 163.7991 35.84 0.1907 103 +105 3 216.4448 162.6551 35.84 0.1525 104 +106 3 216.4448 161.5111 35.84 0.1398 105 +107 3 216.454 160.3671 35.84 0.1652 106 +108 3 216.5992 159.2334 35.84 0.178 107 +109 3 216.6736 158.0962 35.8672 0.1907 108 +110 3 216.6736 156.9591 36.1334 0.178 109 +111 3 216.8086 155.838 36.4 0.1652 110 +112 3 216.9996 154.7123 36.4 0.1525 111 +113 3 217.2239 153.6037 36.7189 0.1525 112 +114 3 217.2456 152.6611 37.7877 0.1398 113 +115 3 217.3497 151.5262 37.8 0.1271 114 +116 3 217.9183 150.6305 37.8 0.1144 115 +117 3 217.9732 149.4968 37.9033 0.1144 116 +118 3 218.2924 148.4569 38.64 0.1144 117 +119 3 218.7889 147.441 38.64 0.1271 118 +120 3 218.8472 146.3016 38.7374 0.1398 119 +121 3 219.0428 145.2148 39.3775 0.1525 120 +122 3 219.4341 144.176 39.6724 0.1398 121 +123 3 220.0427 143.2139 39.76 0.1271 122 +124 3 220.8538 142.4635 39.76 0.1144 123 +125 3 221.5081 141.6592 40.04 0.1144 124 +126 3 221.8182 140.569 40.04 0.1144 125 +127 3 222.2254 139.552 40.2016 0.1144 126 +128 3 222.4325 138.4595 40.6 0.1144 127 +129 3 222.7368 137.4161 40.6 0.1144 128 +130 3 222.7665 136.2744 40.6428 0.1144 129 +131 3 222.8706 135.1945 41.4442 0.1144 130 +132 3 223.0731 134.1271 42.0 0.1144 131 +133 3 223.2367 133.038 42.1842 0.1144 132 +134 3 223.4678 131.941 42.28 0.1144 133 +135 3 223.8808 130.9319 42.3525 0.1144 134 +136 3 224.3487 130.0717 43.12 0.1144 135 +137 3 224.8887 129.0787 43.2149 0.1144 136 +138 3 225.5041 128.239 44.3254 0.1144 137 +139 3 226.3141 127.6304 44.8 0.1144 138 +140 3 226.4376 126.5104 44.8 0.1144 139 +141 3 226.9021 125.6455 44.0115 0.1144 140 +142 3 227.3597 124.7383 43.4 0.1144 141 +143 3 227.7658 123.6893 43.4 0.1144 142 +144 3 227.8848 122.5682 43.12 0.1144 143 +145 3 228.3504 121.7079 42.5508 0.1144 144 +146 3 228.4911 120.6268 42.28 0.1144 145 +147 3 228.7931 119.5263 42.28 0.1144 146 +148 3 229.4441 118.722 42.9234 0.1144 147 +149 3 229.5711 117.6238 43.1978 0.1144 148 +150 3 229.7152 116.5324 43.68 0.1144 149 +151 3 229.706 115.4056 43.2849 0.1144 150 +152 3 229.4898 114.2952 43.12 0.1144 151 +153 3 229.4864 113.1517 43.12 0.1144 152 +154 3 229.4864 112.071 42.4463 0.1271 153 +155 3 229.4864 110.9306 42.28 0.1398 154 +156 3 229.4864 109.7952 42.1574 0.1652 155 +157 3 229.3434 108.8181 40.8668 0.1652 156 +158 3 229.1993 107.8714 39.4064 0.1652 157 +159 3 229.1432 106.7387 39.2 0.1525 158 +160 3 229.1398 105.5947 39.2 0.1525 159 +161 3 229.0288 104.4855 38.787 0.178 160 +162 3 229.0288 103.3659 38.36 0.2161 161 +163 3 228.8206 102.2481 38.36 0.2542 162 +164 3 228.6993 101.1362 38.0685 0.2415 163 +165 3 228.9144 100.2135 36.533 0.1907 164 +166 3 228.959 99.2882 35.0347 0.1398 165 +167 3 229.6809 98.7205 33.88 0.1144 166 +168 3 230.2872 97.835 33.88 0.1144 167 +169 3 230.81 96.8919 33.88 0.1144 168 +170 3 231.7824 96.2999 33.88 0.1144 169 +171 3 232.6416 95.581 33.88 0.1144 170 +172 3 233.0946 94.7028 33.88 0.1144 171 +173 3 233.7489 93.8609 33.88 0.1144 172 +174 3 234.52 93.3316 33.88 0.1271 173 +175 3 234.7545 92.236 33.88 0.1398 174 +176 3 235.5439 91.411 33.88 0.1525 175 +177 3 236.4648 90.971 34.384 0.1398 176 +178 3 236.5872 89.8573 34.44 0.1271 177 +179 3 237.4017 89.2013 33.8918 0.1144 178 +180 3 238.4348 89.1176 32.9459 0.1144 179 +181 3 239.1406 88.8369 31.351 0.1144 180 +182 3 239.5536 87.9258 30.2865 0.1144 181 +183 3 240.3361 87.2805 30.0434 0.1144 182 +184 3 241.0671 86.6914 29.12 0.1144 183 +185 3 241.8816 86.0381 28.84 0.1144 184 +186 3 243.005 85.8469 28.84 0.1144 185 +187 3 244.0644 85.4372 28.84 0.1144 186 +188 3 244.3332 84.347 28.8691 0.1144 187 +189 3 244.7531 83.4076 29.3272 0.1271 188 +190 3 245.8456 83.1688 29.4 0.1652 189 +191 3 218.8655 216.0352 29.6892 0.2288 24 +192 3 217.9709 215.4472 29.1472 0.2924 191 +193 3 217.3886 214.532 28.2688 0.3305 192 +194 3 216.7743 213.6306 27.501 0.3305 193 +195 3 216.0398 212.7897 26.9248 0.3178 194 +196 3 215.3271 211.934 26.3796 0.2924 195 +197 3 214.5435 211.1252 26.2102 0.3051 196 +198 3 213.5974 210.5166 25.7942 0.3178 197 +199 3 212.6971 209.8954 25.0183 0.3305 198 +200 3 211.8745 209.1552 24.3177 0.2924 199 +201 3 211.0348 208.4048 23.8599 0.2542 200 +202 3 210.115 207.8911 23.098 0.2288 201 +203 3 209.0717 207.7767 22.1598 0.2161 202 +204 3 207.9472 207.787 21.7213 0.1907 203 +205 3 206.9393 207.5765 20.9392 0.1652 204 +206 3 206.7494 208.2595 18.9126 0.1652 205 +207 3 205.7415 208.4505 18.3109 0.1652 206 +208 3 219.9901 228.7828 36.1637 0.178 12 +209 3 218.9582 228.649 35.8758 0.2288 208 +210 3 217.9652 228.6398 34.5369 0.2669 209 +211 3 216.8967 228.7188 33.6361 0.2924 210 +212 3 215.819 228.4968 33.8341 0.3305 211 +213 3 214.7391 228.1616 34.1113 0.3305 212 +214 3 213.666 227.823 33.7378 0.3178 213 +215 3 212.6181 227.5141 33.0005 0.2796 214 +216 3 211.5485 227.6537 32.3075 0.2669 215 +217 3 210.4674 227.7372 32.9966 0.2924 216 +218 3 209.3612 227.4672 33.04 0.3051 217 +219 3 208.2183 227.4226 33.04 0.3178 218 +220 3 207.0743 227.4055 33.04 0.3051 219 +221 3 205.9475 227.2384 33.0397 0.2924 220 +222 3 204.8321 226.9822 33.0383 0.2796 221 +223 3 203.7018 226.8243 33.0285 0.2669 222 +224 3 202.6321 226.4182 32.982 0.2542 223 +225 3 201.5522 226.0441 32.9017 0.2288 224 +226 3 200.5135 225.8199 33.9307 0.2034 225 +227 3 199.4587 225.9629 32.9574 0.2161 226 +228 3 198.436 225.7409 31.9197 0.2796 227 +229 3 197.3 225.6117 31.9183 0.3559 228 +230 3 196.1605 225.5018 31.9099 0.4195 229 +231 3 195.0646 225.2021 31.8469 0.4195 230 +232 3 193.9915 224.8509 31.4586 0.394 231 +233 3 192.8887 224.6484 30.9543 0.3305 232 +234 3 191.787 224.3727 30.8157 0.2796 233 +235 3 190.6979 224.0249 30.896 0.2288 234 +236 3 189.6088 223.7229 31.2715 0.2161 235 +237 3 188.5095 223.4884 31.4448 0.2161 236 +238 3 187.3975 223.6303 31.2682 0.2161 237 +239 3 186.321 223.7664 32.1437 0.1907 238 +240 3 185.2445 223.7653 31.1996 0.1907 239 +241 3 184.1497 223.7584 30.3957 0.2161 240 +242 3 183.0091 223.7069 30.3064 0.2542 241 +243 3 181.8949 223.509 30.2042 0.2542 242 +244 3 180.8618 223.6898 29.3157 0.2415 243 +245 3 179.9295 224.2503 30.1753 0.2161 244 +246 3 178.845 224.2503 29.8222 0.2034 245 +247 3 177.7135 224.184 29.4879 0.1907 246 +248 3 176.6233 223.9849 28.8907 0.2161 247 +249 3 175.5102 223.8064 28.5891 0.2415 248 +250 3 174.3685 223.7607 28.5614 0.2669 249 +251 3 173.2245 223.7309 28.5698 0.2415 250 +252 3 172.1022 223.5353 28.6236 0.2034 251 +253 3 170.98 223.342 28.8436 0.1652 252 +254 3 169.8485 223.2539 28.6614 0.1652 253 +255 3 168.7514 222.9702 28.5998 0.178 254 +256 3 167.8706 222.6418 27.5915 0.1907 255 +257 3 166.9302 222.0996 27.44 0.178 256 +258 3 165.9555 221.5196 27.3546 0.1652 257 +259 3 164.9293 221.0997 26.88 0.1652 258 +260 3 163.9455 220.5987 26.6 0.1907 259 +261 3 162.925 220.1148 26.6 0.2161 260 +262 3 161.8554 219.751 26.4146 0.2034 261 +263 3 160.8761 219.1687 26.32 0.178 262 +264 3 159.7756 218.9078 26.2284 0.1525 263 +265 3 158.7414 218.6218 25.529 0.1652 264 +266 3 157.6409 218.3759 25.2 0.1652 265 +267 3 156.5129 218.2752 24.943 0.1652 266 +268 3 155.3769 218.2752 24.6954 0.1525 267 +269 3 154.2444 218.2706 24.36 0.1525 268 +270 3 153.1095 218.1528 24.36 0.1525 269 +271 3 152.0262 218.0132 23.5824 0.1525 270 +272 3 150.9199 217.8176 23.3666 0.1525 271 +273 3 149.7988 217.8176 22.8351 0.1525 272 +274 3 148.6582 217.8176 22.68 0.1398 273 +275 3 147.5302 217.9663 22.5543 0.1271 274 +276 3 146.4286 218.1608 22.12 0.1144 275 +277 3 145.2846 218.1608 22.12 0.1144 276 +278 3 144.1417 218.1802 22.12 0.1144 277 +279 3 143.0206 218.4045 22.12 0.1144 278 +280 3 141.9544 218.7969 22.12 0.1144 279 +281 3 140.8161 218.8472 22.12 0.1271 280 +282 3 139.6767 218.9147 22.12 0.1398 281 +283 3 138.5418 218.9616 22.0276 0.1525 282 +284 3 137.455 218.8472 21.2582 0.1398 283 +285 3 136.327 218.8472 20.7978 0.1271 284 +286 3 135.1945 218.7328 20.72 0.1144 285 +287 3 134.0699 218.6195 20.4736 0.1144 286 +288 3 132.9305 218.6687 20.44 0.1144 287 +289 3 131.8014 218.8472 20.44 0.1144 288 +290 3 130.6574 218.8472 20.44 0.1271 289 +291 3 129.5145 218.8346 20.44 0.1398 290 +292 3 128.4975 218.4296 19.88 0.1525 291 +293 3 127.365 218.3896 19.7089 0.1398 292 +294 3 126.285 218.0819 19.6 0.1271 293 +295 3 125.1948 217.8062 19.5782 0.1144 294 +296 3 124.1103 217.487 19.32 0.1144 295 +297 3 122.9869 217.2753 19.32 0.1144 296 +298 3 121.8909 217.0168 19.1425 0.1144 297 +299 3 120.7526 216.9367 19.04 0.1144 298 +300 3 119.6269 216.788 19.04 0.1271 299 +301 3 118.5184 216.9024 19.04 0.1652 300 +302 3 224.1199 231.1955 36.0307 0.2034 9 +303 3 223.271 231.8064 37.0908 0.2161 302 +304 3 222.4096 232.518 37.329 0.2288 303 +305 3 221.5814 233.265 36.7937 0.2288 304 +306 3 220.7645 234.0441 36.5649 0.2415 305 +307 3 219.8962 234.7534 37.0205 0.2796 306 +308 3 219.0726 235.497 37.6709 0.3305 307 +309 3 218.4182 236.3882 38.3275 0.3432 308 +310 3 217.8714 237.3789 38.61 0.3305 309 +311 3 217.3062 238.373 38.64 0.2924 310 +312 3 216.6564 239.3134 38.6403 0.2796 311 +313 3 216.0822 240.2983 38.6408 0.2669 312 +314 3 215.5445 241.3085 38.645 0.2796 313 +315 3 214.8981 242.2489 38.6641 0.3178 314 +316 3 214.2312 243.1778 38.7545 0.3559 315 +317 3 213.682 244.1525 39.2815 0.3686 316 +318 3 213.0792 245.0894 39.902 0.3305 317 +319 3 212.5895 246.0744 40.6006 0.2924 318 +320 3 211.9935 247.0376 40.6193 0.2796 319 +321 3 211.2842 247.8785 39.8541 0.3051 320 +322 3 210.5829 248.7056 39.0071 0.3305 321 +323 3 209.7902 249.4995 39.5382 0.3432 322 +324 3 209.018 250.2786 40.3292 0.3432 323 +325 3 208.2812 251.1263 40.8374 0.3432 324 +326 3 207.4724 251.9351 40.8736 0.3432 325 +327 3 206.6281 252.705 40.8514 0.3178 326 +328 3 205.7038 253.3743 40.7123 0.2796 327 +329 3 204.8629 254.0961 40.0336 0.2288 328 +330 3 204.0747 254.8066 39.1622 0.2288 329 +331 3 203.2327 255.5364 39.6494 0.2288 330 +332 3 202.6813 256.5374 39.7046 0.2288 331 +333 3 202.1928 257.5636 39.4624 0.2034 332 +334 3 201.5751 258.4628 39.2529 0.2288 333 +335 3 200.6427 259.1011 39.6486 0.2796 334 +336 3 199.7401 259.7898 39.7603 0.3051 335 +337 3 199.0251 260.6753 39.7614 0.2669 336 +338 3 198.4348 261.6545 39.767 0.2288 337 +339 3 197.7679 262.58 39.7911 0.2161 338 +340 3 197.0448 263.4575 39.9608 0.2161 339 +341 3 196.3424 264.3418 40.3609 0.2161 340 +342 3 195.505 265.0785 40.3273 0.2542 341 +343 3 194.6276 265.7684 39.8247 0.3178 342 +344 3 193.8565 266.6103 39.76 0.3559 343 +345 3 193.1381 267.5004 39.76 0.3305 344 +346 3 192.3133 268.2806 39.76 0.2796 345 +347 3 191.3329 268.8594 39.7603 0.2542 346 +348 3 190.4188 269.5264 39.7608 0.2415 347 +349 3 189.6443 270.365 39.7636 0.2542 348 +350 3 188.7554 271.0159 40.1682 0.2161 349 +351 3 187.7064 271.4506 40.32 0.1907 350 +352 3 186.6024 271.7252 40.32 0.1398 351 +353 3 185.5957 272.2617 40.3365 0.1398 352 +354 3 184.6931 272.9527 40.6 0.1398 353 +355 3 183.8557 273.7192 40.6 0.1652 354 +356 3 183.2242 274.5875 41.1188 0.1652 355 +357 3 182.9736 275.6708 41.44 0.1652 356 +358 3 182.3181 276.5803 41.44 0.1398 357 +359 3 181.2199 276.8137 41.5184 0.1271 358 +360 3 180.7406 277.7071 41.72 0.1271 359 +361 3 180.2269 278.6978 42.2223 0.1525 360 +362 3 179.5394 279.5902 42.5401 0.178 361 +363 3 178.5784 280.1656 42.84 0.1907 362 +364 3 177.4824 280.4184 43.1147 0.178 363 +365 3 176.6347 281.0774 43.12 0.1652 364 +366 3 175.866 281.9205 43.12 0.1652 365 +367 3 175.0114 282.6549 43.2135 0.178 366 +368 3 174.1694 283.3711 43.68 0.1907 367 +369 3 173.0506 283.5907 43.68 0.1652 368 +370 3 172.0748 284.1433 43.68 0.1398 369 +371 3 171.2419 284.9143 43.68 0.1144 370 +372 3 170.5933 285.6957 43.96 0.1144 371 +373 3 169.8565 286.5674 43.96 0.1144 372 +374 3 168.9368 287.2138 43.9863 0.1144 373 +375 3 167.9701 287.7572 44.52 0.1144 374 +376 3 167.2013 288.5957 44.52 0.1144 375 +377 3 166.4932 289.4686 44.52 0.1144 376 +378 3 165.4956 290.0143 44.52 0.1144 377 +379 3 164.72 290.822 44.8935 0.1144 378 +380 3 164.0622 291.5072 45.92 0.1144 379 +381 3 163.6835 292.5586 45.92 0.1144 380 +382 3 162.7798 293.245 45.92 0.1144 381 +383 3 161.9252 294.0 45.92 0.1144 382 +384 3 160.9528 294.5892 45.92 0.1144 383 +385 3 160.0605 295.2847 45.92 0.1144 384 +386 3 159.4873 296.2697 45.92 0.1144 385 +387 3 158.9817 297.2947 45.92 0.1144 386 +388 3 158.3834 298.2683 45.92 0.1144 387 +389 3 157.5906 299.0176 45.92 0.1144 388 +390 3 156.8127 299.8493 45.9413 0.1144 389 +391 3 156.148 300.7404 46.48 0.1271 390 +392 3 155.4479 301.6259 46.76 0.1525 391 +393 3 154.5956 302.3855 46.76 0.178 392 +394 3 153.6495 303.009 47.0246 0.178 393 +395 3 152.7263 303.684 47.04 0.1525 394 +396 3 151.7173 304.1965 46.8524 0.1271 395 +397 3 150.7586 304.8016 46.76 0.1144 396 +398 3 149.856 305.4892 46.6203 0.1144 397 +399 3 148.8939 306.0966 46.48 0.1144 398 +400 3 148.0668 306.8448 46.48 0.1144 399 +401 3 147.1195 307.474 46.48 0.1144 400 +402 3 146.3611 308.3149 46.48 0.1271 401 +403 3 145.6564 309.1832 46.6612 0.1398 402 +404 3 144.6577 309.452 47.6 0.1525 403 +405 3 143.6807 309.9702 47.6 0.1398 404 +406 3 142.8055 310.6589 47.836 0.1271 405 +407 3 142.1878 311.3774 48.72 0.1144 406 +408 3 141.2394 311.8109 48.72 0.1144 407 +409 3 140.1675 312.1633 48.72 0.1144 408 +410 3 139.1081 312.59 48.72 0.1144 409 +411 3 138.0385 312.9824 48.6329 0.1144 410 +412 3 137.0432 313.4766 48.44 0.1144 411 +413 3 135.9941 313.9182 48.44 0.1144 412 +414 3 135.0755 314.5863 48.6951 0.1144 413 +415 3 134.0596 315.1091 48.72 0.1144 414 +416 3 133.0609 315.6651 48.72 0.1144 415 +417 3 132.1148 316.2885 48.4448 0.1398 416 +418 3 131.266 317.0299 48.6114 0.1652 417 +419 3 130.2089 317.4486 48.72 0.1907 418 +420 3 129.1759 317.8112 49.275 0.1652 419 +421 3 128.2859 318.4988 49.28 0.1398 420 +422 3 127.6715 319.4517 49.0244 0.1144 421 +423 3 126.7872 320.1495 49.0 0.1144 422 +424 3 125.7828 320.5488 49.0 0.1144 423 +425 3 124.6731 320.757 49.0596 0.1144 424 +426 3 123.6927 321.3347 49.28 0.1144 425 +427 3 122.7764 321.988 49.6667 0.1144 426 +428 3 121.7765 322.5005 49.84 0.1144 427 +429 3 121.097 323.299 49.84 0.1144 428 +430 3 120.5696 324.3057 49.9288 0.1144 429 +431 3 119.834 325.1511 50.4 0.1144 430 +432 3 119.0607 325.9531 50.9158 0.1144 431 +433 3 118.3457 326.8271 51.24 0.1144 432 +434 3 117.5174 327.6096 51.24 0.1271 433 +435 3 116.7475 328.4207 51.7913 0.1398 434 +436 3 115.925 329.146 52.2684 0.1525 435 +437 3 115.1642 329.7855 53.5248 0.1398 436 +438 3 114.3723 330.5176 53.2927 0.1271 437 +439 3 113.7229 331.4568 53.2 0.1144 438 +440 3 112.7701 332.0609 53.2 0.1144 439 +441 3 111.718 332.4944 53.2 0.1144 440 +442 3 110.7486 333.063 53.2 0.1144 441 +443 3 109.967 333.8913 53.2 0.1144 442 +444 3 109.1294 334.6669 53.2 0.1398 443 +445 3 108.5156 335.5009 53.683 0.1907 444 +446 3 107.7837 336.3738 53.76 0.2415 445 +447 3 107.2058 337.3015 53.76 0.2415 446 +448 3 106.2723 337.9582 53.8331 0.1907 447 +449 3 105.5559 338.8356 54.04 0.1398 448 +450 3 104.908 339.7772 54.04 0.1144 449 +451 3 104.1519 340.634 54.04 0.1144 450 +452 3 103.1077 341.0859 54.04 0.1144 451 +453 3 102.0581 341.5343 54.0862 0.1144 452 +454 3 101.8118 342.5491 54.32 0.1144 453 +455 3 101.6026 343.3865 54.8733 0.1144 454 +456 3 101.1508 343.1931 57.4014 0.1144 455 +457 3 100.4262 343.2755 58.8 0.1144 456 +458 3 99.3275 343.4105 58.8 0.1144 457 +459 3 98.8076 344.2285 59.2567 0.1144 458 +460 3 97.6953 344.4092 59.36 0.1144 459 +461 3 96.6997 344.9698 59.36 0.1144 460 +462 3 95.6858 345.4846 59.6268 0.1144 461 +463 3 94.7804 345.9696 60.5268 0.1144 462 +464 3 94.1035 346.8173 61.0176 0.1144 463 +465 3 93.3807 347.6788 61.04 0.1144 464 +466 3 92.7652 348.6168 61.2567 0.1144 465 +467 3 92.1127 349.5309 61.6 0.1144 466 +468 3 91.2521 350.2402 61.6 0.1144 467 +469 3 90.4192 351.0044 61.6 0.1144 468 +470 3 89.5734 351.7651 61.6 0.1144 469 +471 3 88.7967 352.5819 61.6 0.1144 470 +472 3 87.992 353.3667 61.6123 0.1144 471 +473 3 87.0861 353.965 62.16 0.1144 472 +474 3 86.2486 354.5828 62.7312 0.1144 473 +475 3 85.446 355.0312 63.84 0.1144 474 +476 3 84.7198 355.8847 63.84 0.1144 475 +477 3 84.2332 356.9074 63.973 0.1144 476 +478 3 83.7408 357.8432 64.68 0.1398 477 +479 3 82.8438 358.2722 64.68 0.1144 478 +480 3 81.9626 358.9506 64.4 0.1144 479 +481 3 81.2031 359.7846 64.4 0.1144 480 +482 3 80.4524 360.6346 64.4 0.1144 481 +483 3 79.7633 361.52 64.4 0.1144 482 +484 3 79.0041 362.2133 64.4 0.1144 483 +485 3 78.1748 362.9718 64.5162 0.1144 484 +486 3 77.7279 363.9899 64.68 0.1144 485 +487 3 76.9223 364.7164 64.68 0.1144 486 +488 3 75.9201 365.2552 64.6638 0.1144 487 +489 3 75.0315 365.9061 64.12 0.1144 488 +490 3 74.6171 366.7836 63.2976 0.1144 489 +491 3 74.0669 367.7045 62.9244 0.1144 490 +492 3 73.9024 368.7364 62.16 0.1144 491 +493 3 73.9024 369.8804 62.16 0.1144 492 +494 3 73.9024 371.0244 62.16 0.1144 493 +495 3 73.9024 372.1684 62.16 0.1144 494 +496 3 73.9024 373.3124 62.16 0.1144 495 +497 3 73.9024 374.4564 62.16 0.1144 496 +498 3 73.9024 375.5992 62.2776 0.1144 497 +499 3 73.5174 376.5396 62.7542 0.1271 498 +500 3 73.1628 377.5841 63.0 0.1398 499 +501 3 72.6368 378.5553 63.0 0.1652 500 +502 3 71.9363 379.3618 63.0 0.1652 501 +503 3 71.2712 380.1718 62.72 0.1652 502 +504 3 70.8321 381.0252 62.72 0.1398 503 +505 3 69.8133 381.5148 62.72 0.1271 504 +506 3 68.8119 381.8489 62.72 0.1144 505 +507 3 68.3347 382.8213 62.3829 0.1398 506 +508 3 67.8392 383.812 61.88 0.1652 507 +509 3 83.5032 357.0699 66.7646 0.178 478 +510 3 83.0829 356.0769 67.6987 0.1398 509 +511 3 82.6625 355.0839 68.6328 0.1144 510 +512 3 82.2813 354.0623 69.4529 0.1144 511 +513 3 81.9674 352.9926 70.077 0.1144 512 +514 3 81.6533 351.9219 70.7011 0.1144 513 +515 3 81.3393 350.8522 71.3252 0.1271 514 +516 3 81.0253 349.7826 71.9494 0.1398 515 +517 3 80.5544 349.0001 73.211 0.1525 516 +518 3 79.8958 348.5642 75.236 0.1398 517 +519 3 79.1332 348.1878 77.0781 0.1398 518 +520 3 78.2696 347.8721 78.7427 0.1398 519 +521 3 77.406 347.5552 80.4076 0.1525 520 +522 3 76.5425 347.2383 82.0725 0.1398 521 +523 3 75.7549 346.9775 83.9941 0.1271 522 +524 3 74.9835 346.7304 85.9709 0.1144 523 +525 3 74.2122 346.4821 87.9474 0.1144 524 +526 3 73.4408 346.2339 89.9242 0.1144 525 +527 3 72.4419 345.9227 90.9412 0.1144 526 +528 3 71.3976 345.6001 91.7672 0.1144 527 +529 3 70.3534 345.2764 92.5932 0.1144 528 +530 3 69.3092 344.9538 93.4192 0.1144 529 +531 3 68.265 344.63 94.2455 0.1144 530 +532 3 67.2208 344.3074 95.0715 0.1144 531 +533 3 240.6827 238.4599 38.6478 0.2796 1 +534 3 241.4549 238.6247 40.6739 0.2415 533 +535 3 242.3736 238.4977 43.2348 0.2161 534 +536 3 242.7145 238.993 45.3995 0.2034 535 +537 3 242.528 239.8968 46.7916 0.2669 536 +538 3 242.2191 240.6187 48.3557 0.3051 537 +539 3 242.4628 241.718 48.8544 0.3178 538 +540 3 243.1698 241.964 49.3766 0.3305 539 +541 3 244.2715 242.0384 49.9397 0.3559 540 +542 3 245.3903 241.8519 49.8896 0.3305 541 +543 3 246.5045 241.5956 49.84 0.3178 542 +544 3 247.6039 241.2788 49.8408 0.2796 543 +545 3 248.6987 240.947 49.845 0.3051 544 +546 3 249.781 240.6987 50.4 0.3051 545 +547 3 250.8849 240.8623 50.6097 0.2924 546 +548 3 251.8436 241.3829 51.249 0.2796 547 +549 3 252.8823 241.7627 51.52 0.2796 548 +550 3 253.7586 242.4022 51.8885 0.3051 549 +551 3 254.3615 242.9353 52.92 0.2542 550 +552 3 255.0365 242.9856 52.92 0.2161 551 +553 3 256.1782 243.0439 52.92 0.2288 552 +554 3 257.3165 243.1 53.0754 0.2669 553 +555 3 258.4353 243.1 53.6396 0.2669 554 +556 3 259.5747 243.1 53.7608 0.2924 555 +557 3 260.5654 243.5954 54.04 0.3051 556 +558 3 260.6627 243.839 54.04 0.1525 557 +559 3 261.2255 244.7828 54.04 0.178 558 +560 3 262.0996 245.4795 54.04 0.2161 559 +561 3 262.8786 246.3009 54.04 0.2669 560 +562 3 263.8224 246.9061 54.04 0.2669 561 +563 3 264.844 247.4129 54.04 0.2415 562 +564 3 265.7775 248.0592 54.04 0.2034 563 +565 3 266.8151 248.4768 54.04 0.178 564 +566 3 267.9145 248.7514 54.1671 0.178 565 +567 3 269.0059 249.0808 54.32 0.178 566 +568 3 270.024 249.5808 54.32 0.1907 567 +569 3 271.0308 250.0452 54.7688 0.2034 568 +570 3 272.0318 250.4651 55.4022 0.2161 569 +571 3 272.9492 251.132 55.6083 0.2288 570 +572 3 273.9079 251.6445 56.2598 0.2034 571 +573 3 274.512 252.1399 58.0854 0.1652 572 +574 3 275.1412 252.6581 59.691 0.1271 573 +575 3 275.8825 253.491 59.92 0.1144 574 +576 3 276.4465 254.4325 60.0603 0.1144 575 +577 3 276.5917 255.4644 60.7684 0.1144 576 +578 3 276.6192 256.5706 61.2942 0.1144 577 +579 3 276.7336 257.4069 62.7645 0.1144 578 +580 3 276.6787 258.5326 63.0 0.1144 579 +581 3 276.6192 259.672 63.0 0.1144 580 +582 3 276.3561 260.5746 64.0808 0.1144 581 +583 3 276.1616 261.4566 65.6936 0.1144 582 +584 3 275.8035 262.389 66.4457 0.1144 583 +585 3 275.4649 263.4106 67.3935 0.1144 584 +586 3 275.1263 264.4322 68.3413 0.1144 585 +587 3 274.8082 265.4629 69.2227 0.1271 586 +588 3 274.7751 266.6058 69.2227 0.1398 587 +589 3 274.7682 267.6628 69.7432 0.1525 588 +590 3 274.8357 268.4785 71.6993 0.1398 589 +591 3 275.4901 269.1569 72.8255 0.1271 590 +592 3 276.4007 269.7758 73.593 0.1144 591 +593 3 277.3102 270.3936 74.3607 0.1144 592 +594 3 278.2197 271.0125 75.1282 0.1144 593 +595 3 279.1291 271.6314 75.896 0.1144 594 +596 3 280.0901 272.1965 76.4898 0.1144 595 +597 3 281.0888 272.7216 76.9479 0.1144 596 +598 3 282.0887 273.2455 77.406 0.1144 597 +599 3 283.0874 273.7695 77.8641 0.1144 598 +600 3 284.0872 274.2946 78.3224 0.1144 599 +601 3 285.0859 274.8185 78.7805 0.1144 600 +602 3 286.0858 275.3425 79.2386 0.1144 601 +603 3 287.0857 275.8676 79.6967 0.1144 602 +604 3 288.0844 276.3915 80.155 0.1144 603 +605 3 289.0842 276.9155 80.6131 0.1144 604 +606 3 289.988 277.5939 81.0566 0.1144 605 +607 3 290.8917 278.2711 81.5004 0.1144 606 +608 3 291.7955 278.9484 81.944 0.1144 607 +609 3 292.6993 279.6268 82.3878 0.1144 608 +610 3 293.611 280.2846 82.8509 0.1144 609 +611 3 294.6532 280.6392 83.6136 0.1144 610 +612 3 295.6954 280.9927 84.376 0.1144 611 +613 3 296.7376 281.3474 85.1388 0.1144 612 +614 3 297.7798 281.7008 85.9015 0.1144 613 +615 3 298.7613 282.2008 86.5225 0.1144 614 +616 3 299.6719 282.8666 86.9812 0.1144 615 +617 3 300.5826 283.5324 87.4401 0.1144 616 +618 3 301.4943 284.1982 87.8987 0.1144 617 +619 3 302.405 284.864 88.3574 0.1144 618 +620 3 303.3167 285.531 88.816 0.1144 619 +621 3 304.0477 286.3535 89.4768 0.1144 620 +622 3 304.7147 287.2332 90.2101 0.1144 621 +623 3 305.3816 288.113 90.9434 0.1144 622 +624 3 306.0486 288.9927 91.677 0.1144 623 +625 3 306.7156 289.8736 92.4106 0.1144 624 +626 3 307.41 290.7339 93.1157 0.1144 625 +627 3 308.1524 291.5621 93.7706 0.1144 626 +628 3 308.8949 292.3904 94.4255 0.1144 627 +629 3 309.6385 293.2175 95.0804 0.1144 628 +630 3 310.3809 294.0458 95.7354 0.1144 629 +631 3 311.1234 294.874 96.3903 0.1144 630 +632 3 311.867 295.7011 97.0452 0.1398 631 +633 3 312.6094 296.5294 97.7001 0.1652 632 +634 3 260.8698 243.1378 55.44 0.1525 557 +635 3 261.5012 242.2958 55.44 0.1525 634 +636 3 262.3123 241.5716 55.6696 0.1525 635 +637 3 263.2882 241.1792 56.3637 0.1525 636 +638 3 264.1885 240.5386 56.84 0.1398 637 +639 3 264.9641 239.7389 56.847 0.1271 638 +640 3 265.6562 238.858 57.2592 0.1144 639 +641 3 266.4696 238.1682 58.0983 0.1144 640 +642 3 267.4146 237.6019 58.52 0.1144 641 +643 3 268.5105 237.2782 58.52 0.1144 642 +644 3 269.261 236.4877 58.52 0.1271 643 +645 3 270.0195 235.7727 58.8512 0.1398 644 +646 3 270.9312 235.1778 59.5689 0.1652 645 +647 3 271.6336 234.3427 59.92 0.1652 646 +648 3 272.1965 233.4069 60.3764 0.1652 647 +649 3 272.4402 232.4654 61.754 0.1398 648 +650 3 273.0133 231.5891 62.44 0.1398 649 +651 3 273.7958 230.7848 62.44 0.1398 650 +652 3 274.4616 229.9932 62.6772 0.1525 651 +653 3 274.9032 229.2061 64.0926 0.1398 652 +654 3 275.0256 228.0873 64.3922 0.1271 653 +655 3 275.6399 227.219 65.24 0.1144 654 +656 3 276.3504 226.3976 65.814 0.1144 655 +657 3 276.8777 225.4229 66.3289 0.1144 656 +658 3 277.6637 224.6061 66.5552 0.1144 657 +659 3 278.429 223.7996 66.64 0.1144 658 +660 3 279.1063 222.8855 66.64 0.1144 659 +661 3 279.8762 222.0859 67.1698 0.1144 660 +662 3 280.7147 221.3823 67.7331 0.1144 661 +663 3 281.3096 220.5941 68.32 0.1144 662 +664 3 281.9811 219.8574 68.8576 0.1144 663 +665 3 282.7785 219.0611 69.16 0.1144 664 +666 3 283.3391 218.0979 69.44 0.1144 665 +667 3 284.1467 217.3852 69.44 0.1144 666 +668 3 284.7164 216.4059 69.44 0.1144 667 +669 3 285.1534 215.4358 69.6578 0.1144 668 +670 3 285.4852 214.3719 70.2937 0.1144 669 +671 3 285.817 213.308 70.9296 0.1144 670 +672 3 286.1487 212.244 71.5652 0.1144 671 +673 3 286.4793 211.1813 72.2011 0.1144 672 +674 3 286.8111 210.1173 72.837 0.1271 673 +675 3 287.1429 209.0534 73.4726 0.1525 674 +676 3 287.4746 207.9895 74.1084 0.178 675 +677 3 287.8487 206.9336 74.6382 0.178 676 +678 3 288.2846 205.8868 75.0184 0.1525 677 +679 3 288.7193 204.8401 75.399 0.1271 678 +680 3 289.154 203.7933 75.7795 0.1144 679 +681 3 289.5899 202.7477 76.16 0.1144 680 +682 3 290.0246 201.7009 76.5402 0.1144 681 +683 3 290.4605 200.6542 76.9208 0.1144 682 +684 3 290.8952 199.6074 77.3013 0.1144 683 +685 3 291.331 198.5618 77.6815 0.1144 684 +686 3 291.8413 197.5631 77.985 0.1144 685 +687 3 292.6512 196.7543 77.985 0.1144 686 +688 3 293.253 195.8391 78.2849 0.1144 687 +689 3 293.579 194.7797 78.9852 0.1144 688 +690 3 293.905 193.7215 79.6852 0.1144 689 +691 3 294.2311 192.6633 80.3855 0.1144 690 +692 3 294.6063 191.5983 80.7699 0.1144 691 +693 3 295.0056 190.5298 81.0015 0.1144 692 +694 3 295.4048 189.4624 81.233 0.1144 693 +695 3 295.8041 188.3939 81.4646 0.1144 694 +696 3 296.2033 187.3266 81.6962 0.1144 695 +697 3 296.6026 186.2581 81.928 0.1144 696 +698 3 296.9618 185.3314 82.7375 0.1144 697 +699 3 297.3839 184.3259 83.587 0.1144 698 +700 3 297.8049 183.3214 84.4365 0.1144 699 +701 3 298.2271 182.3158 85.286 0.1144 700 +702 3 298.6492 181.3114 86.1356 0.1144 701 +703 3 299.1011 180.3116 86.9193 0.1144 702 +704 3 299.6308 179.3289 87.5336 0.1144 703 +705 3 300.1593 178.3462 88.1476 0.1144 704 +706 3 300.689 177.3635 88.762 0.1271 705 +707 3 301.2175 176.3808 89.376 0.1398 706 +708 3 254.8054 243.9683 52.92 0.1652 551 +709 3 255.3294 244.9842 52.92 0.178 708 +710 3 255.8064 245.9817 53.2 0.2034 709 +711 3 256.5283 246.81 53.2 0.2161 710 +712 3 256.7742 247.9174 53.2165 0.2415 711 +713 3 257.1312 248.9538 53.48 0.2669 712 +714 3 257.8473 249.8153 53.48 0.2924 713 +715 3 258.0864 250.9204 53.48 0.2924 714 +716 3 258.0864 252.0644 53.4951 0.2542 715 +717 3 258.107 253.1649 54.1083 0.2161 716 +718 3 258.2088 254.2654 54.6 0.178 717 +719 3 258.7248 255.2436 54.8688 0.1652 718 +720 3 258.9696 256.3338 54.88 0.1398 719 +721 3 259.4684 257.2822 55.16 0.1525 720 +722 3 259.8802 258.3175 55.3938 0.178 721 +723 3 260.5574 259.2098 55.5794 0.2161 722 +724 3 260.9498 260.2669 55.9868 0.2288 723 +725 3 261.5081 261.2541 56.1061 0.2161 724 +726 3 261.873 262.2998 56.546 0.2034 725 +727 3 262.2528 263.374 56.56 0.1652 726 +728 3 262.5823 264.4653 56.56 0.1652 727 +729 3 262.9919 265.5327 56.56 0.178 728 +730 3 263.2344 266.5966 57.0668 0.2288 729 +731 3 263.263 267.736 57.1318 0.2288 730 +732 3 263.5753 268.7656 57.4 0.2034 731 +733 3 263.7744 269.881 57.4 0.1525 732 +734 3 263.954 271.009 57.4 0.1271 733 +735 3 264.1496 272.1336 57.4 0.1144 734 +736 3 264.5408 273.1483 57.4 0.1271 735 +737 3 265.2616 274.0097 57.7466 0.1525 736 +738 3 266.0143 274.6652 58.8056 0.178 737 +739 3 266.5886 275.4924 59.4961 0.178 738 +740 3 266.8952 276.5345 60.039 0.1525 739 +741 3 266.8952 277.6294 60.5783 0.1271 740 +742 3 266.655 278.707 60.7841 0.1144 741 +743 3 266.1184 279.5833 61.32 0.1144 742 +744 3 266.0075 280.121 63.488 0.1144 743 +745 3 265.9514 280.5568 66.0733 0.1144 744 +746 3 265.6551 281.035 68.2111 0.1144 745 +747 3 264.7685 281.6185 69.2541 0.1144 746 +748 3 263.8808 282.2031 70.2968 0.1144 747 +749 3 263.4792 283.1389 71.2821 0.1144 748 +750 3 263.2218 284.181 72.2501 0.1144 749 +751 3 262.9656 285.2232 73.218 0.1144 750 +752 3 262.7082 286.2654 74.1863 0.1144 751 +753 3 262.6555 287.2996 75.3242 0.1144 752 +754 3 262.6933 288.3303 76.5363 0.1144 753 +755 3 262.7299 289.3611 77.7484 0.1144 754 +756 3 262.7665 290.3918 78.9603 0.1144 755 +757 3 263.4083 291.2098 79.2994 0.1144 756 +758 3 264.2743 291.8024 79.4774 0.1144 757 +759 3 265.0534 291.275 81.0698 0.1144 758 +760 3 265.8336 290.7476 82.6619 0.1144 759 +761 3 266.6126 290.2202 84.2542 0.1144 760 +762 3 267.3917 289.6928 85.8466 0.1144 761 +763 3 268.1708 289.1654 87.439 0.1144 762 +764 3 268.951 288.6381 89.031 0.1144 763 +765 3 269.7941 288.1747 90.4616 0.1144 764 +766 3 270.8466 287.9185 91.359 0.1144 765 +767 3 271.9002 287.6634 92.2564 0.1144 766 +768 3 272.9527 287.4071 93.1538 0.1144 767 +769 3 274.0063 287.152 94.0512 0.1144 768 +770 3 275.0588 286.8958 94.9488 0.1144 769 +771 3 276.1124 286.6406 95.8462 0.1144 770 +772 3 277.1649 286.3844 96.7436 0.1144 771 +773 3 278.2185 286.1293 97.641 0.1144 772 +774 3 279.271 285.873 98.5387 0.1144 773 +775 3 280.2297 286.1052 99.9306 0.1144 774 +776 3 281.1838 286.3592 101.3446 0.1144 775 +777 3 282.139 286.612 102.7586 0.1144 776 +778 3 283.0931 286.866 104.1723 0.1271 777 +779 3 284.0472 287.1188 105.5863 0.1398 778 +780 3 241.6746 240.6633 49.56 0.3051 539 +781 3 240.7376 240.0089 49.56 0.2415 780 +782 3 239.7286 239.4701 49.56 0.2288 781 +783 3 238.7436 238.905 49.56 0.2542 782 +784 3 237.9211 238.111 49.56 0.2924 783 +785 3 237.0871 237.3297 49.56 0.2796 784 +786 3 236.0701 236.8355 49.84 0.2542 785 +787 3 235.1435 236.1742 49.8778 0.2161 786 +788 3 234.5555 235.5542 51.24 0.2415 787 +789 3 233.6574 234.9936 51.5852 0.2542 788 +790 3 233.1175 234.0144 51.8 0.2796 789 +791 3 232.2274 233.3028 51.8686 0.2542 790 +792 3 231.398 232.5946 52.3494 0.2415 791 +793 3 231.088 231.6589 53.2 0.2288 792 +794 3 230.5229 230.834 53.2 0.2415 793 +795 3 229.61 230.1579 53.3341 0.2669 794 +796 3 228.7382 229.5447 54.1635 0.2924 795 +797 3 227.775 228.9888 54.588 0.2796 796 +798 3 226.7465 228.498 54.6 0.2542 797 +799 3 225.6895 228.0598 54.637 0.2415 798 +800 3 224.7274 227.4684 54.9755 0.2542 799 +801 3 223.7241 226.9547 55.3235 0.2542 800 +802 3 222.7002 226.496 55.72 0.2415 801 +803 3 221.6008 226.2317 55.72 0.2288 802 +804 3 220.4717 226.0567 55.72 0.2288 803 +805 3 219.4192 225.7112 56.28 0.2161 804 +806 3 218.4777 225.0866 56.56 0.2161 805 +807 3 217.5133 224.4814 56.56 0.2415 806 +808 3 216.4608 224.081 56.7403 0.3051 807 +809 3 215.6429 223.318 57.1637 0.3432 808 +810 3 214.6464 222.7929 57.4 0.3305 809 +811 3 213.5368 222.5286 57.4 0.2669 810 +812 3 212.8892 222.1488 59.08 0.2034 811 +813 3 212.1422 221.3045 59.08 0.1525 812 +814 3 211.3643 220.4831 59.08 0.1652 813 +815 3 210.599 219.8207 59.08 0.2161 814 +816 3 209.6929 219.2419 59.1007 0.2796 815 +817 3 208.9974 218.7374 60.1138 0.2796 816 +818 3 208.1062 218.3919 61.299 0.2288 817 +819 3 207.1063 217.9778 61.6 0.2034 818 +820 3 206.0939 217.4469 61.6 0.2034 819 +821 3 205.03 217.0809 61.6 0.2288 820 +822 3 204.0633 216.4723 61.6 0.2034 821 +823 3 203.0325 215.9872 61.6 0.1652 822 +824 3 201.9606 215.7115 61.6 0.1271 823 +825 3 201.0443 215.0388 61.6 0.1144 824 +826 3 200.0639 214.4554 61.6 0.1144 825 +827 3 199.0606 213.9452 61.6 0.1271 826 +828 3 198.1991 213.2405 61.6 0.1525 827 +829 3 197.3022 212.5815 61.8377 0.1907 828 +830 3 196.5564 211.7761 61.88 0.2034 829 +831 3 196.1468 210.7442 61.88 0.2034 830 +832 3 195.624 209.8611 61.88 0.178 831 +833 3 195.5817 208.7182 61.88 0.1652 832 +834 3 195.3666 207.6028 61.88 0.1398 833 +835 3 195.2808 206.7162 62.9541 0.1271 834 +836 3 195.2808 205.6111 63.5513 0.1144 835 +837 3 195.2808 204.4717 63.7003 0.1144 836 +838 3 195.2911 203.3426 64.12 0.1144 837 +839 3 195.5474 202.2306 64.12 0.1144 838 +840 3 195.6926 201.1038 64.12 0.1144 839 +841 3 195.9729 199.9964 64.12 0.1271 840 +842 3 196.2578 198.9176 64.12 0.1398 841 +843 3 196.5838 197.8342 64.12 0.1525 842 +844 3 196.6822 196.7028 64.3765 0.1398 843 +845 3 196.768 195.5668 64.4 0.1271 844 +846 3 197.0975 194.599 65.4251 0.1271 845 +847 3 197.1112 193.5168 66.08 0.1398 846 +848 3 197.0952 192.3762 66.1046 0.1525 847 +849 3 196.7783 191.3374 66.8682 0.1525 848 +850 3 196.307 190.5275 67.76 0.1525 849 +851 3 196.0942 189.4086 67.76 0.1525 850 +852 3 195.5657 188.4408 68.32 0.1398 851 +853 3 194.7294 187.7167 68.4536 0.1271 852 +854 3 194.4445 186.6848 69.1807 0.1144 853 +855 3 193.8233 185.7501 69.6508 0.1271 854 +856 3 193.439 184.6851 69.72 0.1398 855 +857 3 193.2239 183.6086 70.2388 0.1525 856 +858 3 193.1221 182.5275 70.56 0.1398 857 +859 3 192.4574 181.8045 70.9923 0.1271 858 +860 3 192.1531 180.7634 71.8796 0.1144 859 +861 3 191.8488 179.7213 72.7672 0.1144 860 +862 3 191.5445 178.6802 73.6548 0.1144 861 +863 3 191.2402 177.6392 74.5424 0.1144 862 +864 3 190.9347 176.597 75.43 0.1144 863 +865 3 190.6304 175.556 76.3174 0.1144 864 +866 3 190.3261 174.5149 77.205 0.1144 865 +867 3 189.8022 173.5402 77.5468 0.1144 866 +868 3 189.1398 172.6067 77.5468 0.1144 867 +869 3 188.4774 171.6744 77.5468 0.1144 868 +870 3 187.8151 170.742 77.5468 0.1144 869 +871 3 186.9193 170.067 77.9691 0.1144 870 +872 3 185.9915 169.4264 78.4476 0.1144 871 +873 3 185.0637 168.7858 78.9261 0.1144 872 +874 3 184.1325 168.144 79.2994 0.1144 873 +875 3 183.1864 167.501 79.2994 0.1144 874 +876 3 182.2392 166.8581 79.2994 0.1144 875 +877 3 181.2931 166.2163 79.2994 0.1144 876 +878 3 180.347 165.5734 79.2994 0.1144 877 +879 3 179.4844 164.8344 79.4066 0.1144 878 +880 3 178.7054 164.0016 79.6208 0.1144 879 +881 3 177.9263 163.1687 79.835 0.1144 880 +882 3 177.1473 162.3359 80.0492 0.1144 881 +883 3 176.3682 161.5031 80.2634 0.1144 882 +884 3 175.588 160.6702 80.4776 0.1271 883 +885 3 174.8089 159.8362 80.6921 0.1398 884 +886 3 174.0299 159.0034 80.9063 0.1525 885 +887 3 173.2519 158.1752 81.1983 0.1398 886 +888 3 172.4763 157.3549 81.6564 0.1271 887 +889 3 171.7007 156.5358 82.1145 0.1144 888 +890 3 170.925 155.7156 82.5726 0.1144 889 +891 3 170.1483 154.8965 83.0304 0.1144 890 +892 3 169.3726 154.0762 83.4884 0.1144 891 +893 3 168.597 153.2571 83.9465 0.1144 892 +894 3 167.8214 152.4369 84.4046 0.1144 893 +895 3 167.0457 151.6178 84.8627 0.1144 894 +896 3 166.0848 151.0572 85.2944 0.1144 895 +897 3 165.0495 150.603 85.7158 0.1144 896 +898 3 164.0141 150.1477 86.137 0.1144 897 +899 3 162.9239 149.8468 86.3092 0.1144 898 +900 3 161.7971 149.6512 86.3092 0.1144 899 +901 3 160.6714 149.4808 86.3092 0.1144 900 +902 3 159.58 149.8251 86.3092 0.1144 901 +903 3 158.4715 149.5711 86.3092 0.1144 902 +904 3 157.6226 148.9133 86.5875 0.1144 903 +905 3 156.9374 148.0153 87.0402 0.1144 904 +906 3 156.2521 147.1184 87.4927 0.1144 905 +907 3 155.5668 146.2215 87.9455 0.1144 906 +908 3 154.8816 145.3235 88.398 0.1144 907 +909 3 154.1963 144.4266 88.8507 0.1144 908 +910 3 153.5111 143.5297 89.3035 0.1144 909 +911 3 152.827 142.6316 89.756 0.1144 910 +912 3 152.1417 141.7347 90.2087 0.1144 911 +913 3 151.4564 140.8378 90.6615 0.1144 912 +914 3 150.7712 139.9398 91.114 0.1271 913 +915 3 150.0859 139.0429 91.5667 0.1398 914 +916 3 241.9972 239.7961 42.4637 0.2288 534 +917 3 242.0429 240.9378 42.4147 0.2796 916 +918 3 241.9125 242.0693 42.4371 0.3178 917 +919 3 241.5556 243.1538 42.3444 0.3559 918 +920 3 241.2627 244.2451 41.9922 0.3432 919 +921 3 241.1552 245.3823 41.946 0.3432 920 +922 3 241.1552 246.5171 41.6836 0.3305 921 +923 3 241.1552 247.6291 41.0589 0.3686 922 +924 3 241.1495 248.7708 40.88 0.4068 923 +925 3 241.1174 249.9137 40.88 0.4322 924 +926 3 241.0008 251.0508 40.88 0.4195 925 +927 3 240.8349 252.1811 40.8814 0.394 926 +928 3 240.8532 253.3159 40.8915 0.3813 927 +929 3 241.1312 254.4256 40.9223 0.3559 928 +930 3 241.4057 254.8546 41.0052 0.3432 929 +931 3 241.9263 255.8373 41.4901 0.3432 930 +932 3 242.353 256.8051 42.5244 0.3178 931 +933 3 242.9181 257.7649 43.0377 0.2796 932 +934 3 243.4958 258.7442 42.8288 0.2796 933 +935 3 243.934 259.7669 42.3074 0.3051 934 +936 3 244.2085 260.8663 42.049 0.3305 935 +937 3 244.5998 261.9325 42.2979 0.3559 936 +938 3 245.0517 262.9598 42.8252 0.3686 937 +939 3 245.5241 263.9906 43.1113 0.3686 938 +940 3 245.9554 265.0499 43.066 0.3432 939 +941 3 246.421 266.0852 42.8109 0.3178 940 +942 3 246.9896 267.0531 42.2999 0.3178 941 +943 3 247.6314 267.9877 42.0118 0.3305 942 +944 3 248.2995 268.9144 42.0109 0.3432 943 +945 3 248.9973 269.8181 42.058 0.3305 944 +946 3 249.6448 270.7493 42.3279 0.3051 945 +947 3 250.1505 271.7172 42.4556 0.2669 946 +948 3 250.2042 272.8268 42.0574 0.2542 947 +949 3 250.0509 273.9594 42.0 0.2415 948 +950 3 250.131 275.0794 41.9994 0.2542 949 +951 3 250.4365 276.181 41.9969 0.2415 950 +952 3 250.6641 277.301 41.9787 0.2669 951 +953 3 250.7648 278.4359 41.8659 0.2542 952 +954 3 250.7659 279.5581 41.405 0.2415 953 +955 3 250.7717 280.677 40.9312 0.1907 954 +956 3 250.8117 281.8187 40.88 0.1907 955 +957 3 251.0245 282.9329 40.88 0.2161 956 +958 3 251.4535 283.9923 40.88 0.2542 957 +959 3 251.8974 285.0448 40.88 0.2415 958 +960 3 252.1708 286.1476 40.88 0.2034 959 +961 3 252.4087 287.2595 40.88 0.1652 960 +962 3 252.7588 288.3486 40.8811 0.1652 961 +963 3 252.9887 289.464 40.8873 0.2034 962 +964 3 253.0379 290.6046 40.9391 0.2415 963 +965 3 253.0459 291.7463 40.9116 0.2669 964 +966 3 253.0539 292.8903 40.9035 0.2542 965 +967 3 253.0608 294.032 41.0455 0.2542 966 +968 3 253.1066 295.1428 41.6777 0.2669 967 +969 3 253.4257 296.2194 41.4974 0.2796 968 +970 3 253.8822 297.2432 40.9441 0.2669 969 +971 3 254.381 298.2694 40.88 0.2288 970 +972 3 254.8798 299.299 40.88 0.2161 971 +973 3 255.3683 300.3332 40.88 0.2288 972 +974 3 255.7675 301.4051 40.88 0.2415 973 +975 3 256.0352 302.5159 40.88 0.2415 974 +976 3 256.24 303.6416 40.88 0.2034 975 +977 3 256.256 304.7845 40.88 0.1907 976 +978 3 256.2549 305.9285 40.88 0.1907 977 +979 3 256.2457 307.0725 40.8794 0.2415 978 +980 3 256.1839 308.2142 40.8766 0.3051 979 +981 3 255.8716 309.3124 40.8587 0.3559 980 +982 3 255.5307 310.4038 40.7509 0.394 981 +983 3 255.4415 311.5192 40.2097 0.4068 982 +984 3 255.4941 312.6312 39.9403 0.4068 983 +985 3 255.7515 313.7271 40.3894 0.394 984 +986 3 255.9975 314.8208 40.8551 0.3686 985 +987 3 256.1874 315.9373 40.9156 0.3686 986 +988 3 255.978 317.0379 41.2118 0.3305 987 +989 3 255.5742 318.0881 41.7043 0.2924 988 +990 3 255.0823 319.1062 42.0538 0.2161 989 +991 3 254.9015 320.2193 42.4514 0.2034 990 +992 3 254.8832 321.345 42.9346 0.2288 991 +993 3 254.8821 322.4581 42.3979 0.2924 992 +994 3 254.8775 323.5976 42.28 0.3178 993 +995 3 254.8317 324.6958 42.9554 0.3051 994 +996 3 254.6338 325.7963 43.4034 0.2796 995 +997 3 254.1842 326.8271 43.8948 0.2669 996 +998 3 253.7678 327.8727 43.8463 0.2415 997 +999 3 253.6843 328.9526 43.2625 0.2288 998 +1000 3 254.0881 330.0085 43.0408 0.2034 999 +1001 3 254.7036 330.9546 42.7059 0.2161 1000 +1002 3 255.2195 331.903 42.0913 0.2161 1001 +1003 3 255.3282 333.0378 41.9972 0.2542 1002 +1004 3 255.247 334.1761 41.9821 0.2924 1003 +1005 3 254.961 335.2767 41.8956 0.3305 1004 +1006 3 254.5789 336.3326 41.5209 0.3559 1005 +1007 3 254.4439 337.4308 40.9612 0.3559 1006 +1008 3 254.5503 338.5645 40.9083 0.3559 1007 +1009 3 254.786 339.6811 41.0337 0.3432 1008 +1010 3 254.8866 340.7804 41.6478 0.3559 1009 +1011 3 254.9107 341.8901 42.2962 0.3686 1010 +1012 3 255.1314 342.9563 43.1029 0.3686 1011 +1013 3 255.3133 344.0706 43.2737 0.3305 1012 +1014 3 255.3442 345.2123 43.1642 0.2796 1013 +1015 3 255.3602 346.3552 43.2387 0.2415 1014 +1016 3 255.4701 347.4603 43.8556 0.2415 1015 +1017 3 255.7286 348.5276 44.6281 0.2542 1016 +1018 3 255.8007 349.6293 45.3202 0.2669 1017 +1019 3 255.8396 350.7607 45.6966 0.2924 1018 +1020 3 256.0741 351.8681 45.4474 0.3305 1019 +1021 3 256.5466 352.9057 45.4188 0.3686 1020 +1022 3 257.0122 353.9433 45.7064 0.3686 1021 +1023 3 257.3462 355.0026 46.3456 0.3432 1022 +1024 3 257.591 356.1158 46.4738 0.3051 1023 +1025 3 257.5316 357.2506 46.48 0.2542 1024 +1026 3 257.3062 358.3706 46.4803 0.2288 1025 +1027 3 257.2879 359.502 46.4822 0.2034 1026 +1028 3 257.6174 360.5968 46.4932 0.2415 1027 +1029 3 257.9594 361.6756 46.5674 0.2415 1028 +1030 3 257.9297 362.791 46.916 0.2796 1029 +1031 3 257.5556 363.8355 47.5132 0.2669 1030 +1032 3 257.1998 364.9005 47.6694 0.3178 1031 +1033 3 257.1712 366.0251 48.0399 0.3432 1032 +1034 3 257.1678 367.0799 49.0921 0.3813 1033 +1035 3 257.1449 368.1083 50.2642 0.3559 1034 +1036 3 257.0065 369.2054 50.5201 0.3178 1035 +1037 3 256.6278 370.2579 50.2874 0.2542 1036 +1038 3 256.3201 371.3149 50.7184 0.2288 1037 +1039 3 256.4837 372.4223 50.9897 0.2161 1038 +1040 3 257.0259 373.4005 51.2366 0.2542 1039 +1041 3 257.7649 374.2459 51.774 0.2542 1040 +1042 3 258.0875 375.3338 52.0772 0.2669 1041 +1043 3 258.2019 376.4721 52.0836 0.2542 1042 +1044 3 258.7019 377.5006 52.1004 0.2924 1043 +1045 3 259.3128 378.4638 52.1906 0.3051 1044 +1046 3 259.3414 379.5803 52.7772 0.3178 1045 +1047 3 259.0336 380.666 53.1936 0.2924 1046 +1048 3 258.973 381.8089 53.1558 0.2669 1047 +1049 3 258.8071 382.9288 52.8713 0.2415 1048 +1050 3 258.5486 383.9001 51.6541 0.2288 1049 +1051 3 258.5749 385.0235 52.1587 0.2288 1050 +1052 3 258.695 386.1023 52.8917 0.2288 1051 +1053 3 258.981 387.1788 52.6616 0.2161 1052 +1054 3 259.1023 388.2404 53.4971 0.2288 1053 +1055 3 259.3745 389.3158 53.0928 0.2288 1054 +1056 3 259.2487 390.4335 53.076 0.2542 1055 +1057 3 258.4879 391.2606 53.2053 0.2288 1056 +1058 3 257.7695 392.1495 53.2804 0.2161 1057 +1059 3 257.5293 393.2443 53.7457 0.1907 1058 +1060 3 257.2101 394.3357 53.5021 0.1907 1059 +1061 3 257.1518 395.4648 53.0905 0.178 1060 +1062 3 256.9207 396.5356 52.3426 0.1652 1061 +1063 3 256.7525 397.3615 52.7078 0.178 1062 +1064 3 256.7033 398.4998 52.5518 0.2034 1063 +1065 3 256.645 399.6186 53.0986 0.2288 1064 +1066 3 256.4436 400.7386 53.1997 0.2288 1065 +1067 3 256.5614 401.8689 53.1983 0.2288 1066 +1068 3 256.2148 402.9568 53.1882 0.2288 1067 +1069 3 255.7057 403.9716 53.1331 0.2161 1068 +1070 3 255.6131 405.0904 52.7808 0.2161 1069 +1071 3 254.9084 405.9576 52.7556 0.1271 1070 +1072 3 254.0069 406.3477 53.9748 0.1525 1071 +1073 3 253.2004 407.1393 54.3497 0.1907 1072 +1074 3 252.4362 407.9859 54.4796 0.2034 1073 +1075 3 251.7418 408.8782 54.885 0.1907 1074 +1076 3 251.0748 409.7728 55.0449 0.1525 1075 +1077 3 250.4536 410.6788 54.2718 0.1271 1076 +1078 3 249.7844 411.4785 54.2175 0.1144 1077 +1079 3 249.0499 412.2118 55.2782 0.1144 1078 +1080 3 248.5329 413.1922 55.8146 0.1398 1079 +1081 3 248.0158 414.176 55.9532 0.178 1080 +1082 3 247.2962 415.0592 55.7525 0.2415 1081 +1083 3 246.5892 415.955 55.6077 0.2669 1082 +1084 3 245.8273 416.7821 55.9518 0.2796 1083 +1085 3 245.0425 417.5852 56.4718 0.2415 1084 +1086 3 244.2795 418.4249 56.7983 0.2161 1085 +1087 3 243.5896 419.3126 57.2698 0.1907 1086 +1088 3 242.8518 420.166 57.4882 0.1907 1087 +1089 3 241.9754 420.7643 58.1658 0.178 1088 +1090 3 241.1255 421.4027 58.8 0.1525 1089 +1091 3 240.3327 422.2207 58.8 0.1271 1090 +1092 3 239.6977 423.1496 58.8 0.1144 1091 +1093 3 239.3889 424.2158 58.8 0.1144 1092 +1094 3 238.834 425.2145 58.819 0.1144 1093 +1095 3 238.3021 426.2132 59.08 0.1144 1094 +1096 3 237.5333 427.0049 59.08 0.1144 1095 +1097 3 236.7531 427.8057 59.08 0.1144 1096 +1098 3 236.411 428.8376 59.619 0.1144 1097 +1099 3 235.5187 429.5182 59.64 0.1144 1098 +1100 3 234.774 430.3762 59.64 0.1144 1099 +1101 3 234.1654 431.328 59.64 0.1144 1100 +1102 3 233.9503 432.4423 59.7985 0.1144 1101 +1103 3 233.5831 433.4547 60.5346 0.1271 1102 +1104 3 232.4871 433.7053 60.76 0.1398 1103 +1105 3 232.0032 434.5713 61.035 0.1525 1104 +1106 3 232.0032 435.7153 61.04 0.1398 1105 +1107 3 231.7458 436.7918 61.339 0.1271 1106 +1108 3 231.2928 437.7996 61.8579 0.1144 1107 +1109 3 230.5675 438.676 61.88 0.1144 1108 +1110 3 229.8159 439.5134 61.88 0.1144 1109 +1111 3 228.8572 440.059 61.9853 0.1144 1110 +1112 3 228.0495 440.6768 62.44 0.1144 1111 +1113 3 227.3929 441.5657 62.9698 0.1144 1112 +1114 3 226.663 442.3368 63.5522 0.1144 1113 +1115 3 225.765 443.038 63.56 0.1144 1114 +1116 3 224.8498 443.7198 63.56 0.1144 1115 +1117 3 223.9826 444.4143 64.0192 0.1144 1116 +1118 3 223.1715 445.2059 64.12 0.1144 1117 +1119 3 222.3078 445.9552 64.12 0.1144 1118 +1120 3 221.483 446.7263 64.3986 0.1271 1119 +1121 3 220.6948 447.542 64.4 0.1525 1120 +1122 3 219.68 448.0156 64.5372 0.1907 1121 +1123 3 219.0531 448.6516 65.8 0.2034 1122 +1124 3 218.4205 449.6012 65.8 0.1907 1123 +1125 3 217.6838 450.474 65.8 0.1525 1124 +1126 3 217.0477 451.3721 66.2245 0.1271 1125 +1127 3 216.4334 452.2392 66.64 0.1144 1126 +1128 3 215.7092 453.1212 66.64 0.1144 1127 +1129 3 215.048 454.0502 66.7044 0.1144 1128 +1130 3 214.4611 454.9905 67.34 0.1144 1129 +1131 3 214.0424 455.884 68.32 0.1144 1130 +1132 3 213.6992 456.925 68.32 0.1144 1131 +1133 3 213.3137 457.8208 68.32 0.1144 1132 +1134 3 212.3836 458.1731 68.32 0.1144 1133 +1135 3 211.8894 459.1753 68.5017 0.1271 1134 +1136 3 211.0897 459.9383 68.8246 0.1398 1135 +1137 3 210.385 460.579 70.2822 0.1525 1136 +1138 3 209.7032 461.3146 70.56 0.1525 1137 +1139 3 208.8486 462.0044 70.56 0.1652 1138 +1140 3 208.041 462.8132 70.56 0.2161 1139 +1141 3 207.7504 463.7776 70.28 0.2796 1140 +1142 3 255.8991 405.8008 53.2 0.2034 1070 +1143 3 256.4585 406.7698 53.2 0.2161 1142 +1144 3 256.8131 407.8577 53.2 0.178 1143 +1145 3 257.0374 408.9789 53.2 0.1398 1144 +1146 3 257.2673 410.0908 53.2 0.1144 1145 +1147 3 257.2856 411.2348 53.2 0.1144 1146 +1148 3 257.4 412.3697 53.2 0.1271 1147 +1149 3 257.3222 413.5091 53.2081 0.1398 1148 +1150 3 257.3108 414.6462 53.4486 0.1525 1149 +1151 3 257.392 415.7857 53.48 0.1525 1150 +1152 3 257.2719 416.9216 53.48 0.178 1151 +1153 3 257.1266 418.0554 53.48 0.2161 1152 +1154 3 256.7902 419.1158 53.8745 0.2415 1153 +1155 3 256.7136 420.2473 54.04 0.2161 1154 +1156 3 256.8108 421.381 54.1915 0.1652 1155 +1157 3 256.828 422.5101 54.6176 0.1271 1156 +1158 3 256.828 423.6507 54.8279 0.1144 1157 +1159 3 256.7262 424.7855 54.88 0.1144 1158 +1160 3 256.8131 425.9238 54.88 0.1271 1159 +1161 3 256.828 427.0666 54.88 0.1398 1160 +1162 3 256.7891 428.2095 54.88 0.1525 1161 +1163 3 256.4345 429.2768 54.88 0.1398 1162 +1164 3 256.232 430.4025 54.88 0.1271 1163 +1165 3 255.9643 431.5122 54.88 0.1144 1164 +1166 3 255.3763 432.4915 54.88 0.1144 1165 +1167 3 254.9347 433.5257 54.88 0.1144 1166 +1168 3 254.1762 434.3493 54.88 0.1144 1167 +1169 3 253.968 435.4567 54.88 0.1144 1168 +1170 3 253.7381 436.5561 54.8772 0.1144 1169 +1171 3 253.4269 437.6452 54.6 0.1398 1170 +1172 3 253.2816 438.7629 54.332 0.1652 1171 +1173 3 253.2816 439.9069 54.32 0.1907 1172 +1174 3 253.2816 441.0463 54.474 0.1652 1173 +1175 3 253.2816 442.1857 54.6 0.1398 1174 +1176 3 253.2816 443.3297 54.6 0.1144 1175 +1177 3 253.3171 444.4726 54.6 0.1144 1176 +1178 3 253.4635 445.604 54.49 0.1144 1177 +1179 3 253.5127 446.7389 54.2696 0.1144 1178 +1180 3 253.6248 447.8119 53.48 0.1144 1179 +1181 3 253.6248 448.9559 53.48 0.1144 1180 +1182 3 253.6248 450.0999 53.48 0.1144 1181 +1183 3 253.6248 451.2348 53.76 0.1144 1182 +1184 3 253.6248 452.3788 53.76 0.1144 1183 +1185 3 253.6248 453.5228 53.76 0.1144 1184 +1186 3 253.6248 454.6668 53.76 0.1144 1185 +1187 3 253.6248 455.8108 53.76 0.1144 1186 +1188 3 253.6248 456.9548 53.76 0.1144 1187 +1189 3 253.6248 458.0931 53.655 0.1144 1188 +1190 3 253.7369 459.0723 52.6481 0.1144 1189 +1191 3 253.7392 460.2152 52.64 0.1144 1190 +1192 3 253.7392 461.3592 52.64 0.1144 1191 +1193 3 253.7392 462.5032 52.64 0.1144 1192 +1194 3 253.7392 463.6472 52.64 0.1144 1193 +1195 3 253.7392 464.7912 52.64 0.1144 1194 +1196 3 253.7392 465.9352 52.694 0.1144 1195 +1197 3 253.7392 467.0746 52.92 0.1144 1196 +1198 3 253.7278 468.2175 52.9298 0.1144 1197 +1199 3 253.3331 468.937 54.32 0.1144 1198 +1200 3 253.1672 470.0559 54.1615 0.1144 1199 +1201 3 253.1672 471.1976 54.04 0.1144 1200 +1202 3 253.4829 472.234 53.366 0.1144 1201 +1203 3 253.7266 473.3071 52.92 0.1144 1202 +1204 3 253.7392 474.45 52.92 0.1144 1203 +1205 3 253.7392 475.594 52.92 0.1144 1204 +1206 3 253.7392 476.7288 53.2 0.1144 1205 +1207 3 253.7632 477.8728 53.2 0.1144 1206 +1208 3 254.0538 478.9631 53.3014 0.1144 1207 +1209 3 254.206 480.0647 53.48 0.1144 1208 +1210 3 254.4004 481.1904 53.48 0.1144 1209 +1211 3 254.4256 482.2944 54.0212 0.1144 1210 +1212 3 254.4313 483.4086 54.5112 0.1144 1211 +1213 3 254.8363 484.4485 54.6 0.1144 1212 +1214 3 255.1944 485.5205 54.6 0.1144 1213 +1215 3 255.2264 486.6622 54.6 0.1144 1214 +1216 3 255.2264 487.805 54.5437 0.1398 1215 +1217 3 255.2264 488.9433 54.2685 0.1907 1216 +1218 3 255.2424 489.9683 53.1927 0.2542 1217 +1219 3 255.6989 490.9716 52.64 0.2669 1218 +1220 3 256.1244 492.0344 52.64 0.2288 1219 +1221 3 256.1244 493.1773 52.64 0.178 1220 +1222 3 256.0283 494.3167 52.64 0.1652 1221 +1223 3 255.7801 495.4309 52.64 0.178 1222 +1224 3 255.5696 496.5292 52.9197 0.178 1223 +1225 3 255.5696 497.6526 53.2 0.1525 1224 +1226 3 255.6954 498.7737 53.2 0.1271 1225 +1227 3 256.256 499.7038 53.7107 0.1144 1226 +1228 3 256.2938 500.5766 52.08 0.1144 1227 +1229 3 256.2434 500.7414 52.36 0.1144 1228 +1230 3 256.3841 500.969 52.36 0.1271 1229 +1231 3 256.5992 502.065 52.36 0.1398 1230 +1232 3 256.5992 503.2033 52.5294 0.1652 1231 +1233 3 256.5992 504.3438 52.64 0.1652 1232 +1234 3 256.6839 505.4753 52.7649 0.1652 1233 +1235 3 257.1254 506.5014 52.92 0.1525 1234 +1236 3 257.4538 507.5951 52.92 0.1525 1235 +1237 3 257.9857 508.5778 52.92 0.1525 1236 +1238 3 258.6996 509.3752 53.0505 0.1652 1237 +1239 3 259.2773 510.3556 53.2459 0.178 1238 +1240 3 259.8024 511.2502 53.9904 0.2034 1239 +1241 3 259.783 512.3278 54.6 0.2034 1240 +1242 3 259.4592 513.2705 55.16 0.2034 1241 +1243 3 259.5084 514.411 55.16 0.178 1242 +1244 3 259.7887 515.5047 55.16 0.1525 1243 +1245 3 259.6686 516.6418 55.16 0.1271 1244 +1246 3 259.5736 517.7813 55.16 0.1144 1245 +1247 3 259.4786 518.9173 55.16 0.1144 1246 +1248 3 259.4592 520.0601 55.16 0.1144 1247 +1249 3 259.4592 521.2041 55.16 0.1144 1248 +1250 3 259.4592 522.3481 55.16 0.1144 1249 +1251 3 259.4592 523.4921 55.16 0.1144 1250 +1252 3 259.4592 524.5194 56.1921 0.1144 1251 +1253 3 259.4592 525.6325 56.56 0.1144 1252 +1254 3 259.3036 526.764 56.56 0.1144 1253 +1255 3 259.116 527.8896 56.5799 0.1144 1254 +1256 3 259.116 529.0073 57.0494 0.1144 1255 +1257 3 259.076 530.1445 57.12 0.1144 1256 +1258 3 258.7625 531.237 57.12 0.1144 1257 +1259 3 258.5474 532.3421 57.12 0.1144 1258 +1260 3 258.544 533.3271 58.2722 0.1144 1259 +1261 3 258.504 534.4299 58.9375 0.1144 1260 +1262 3 258.4113 535.559 59.08 0.1144 1261 +1263 3 258.0006 536.5932 59.08 0.1144 1262 +1264 3 257.972 537.7349 59.08 0.1144 1263 +1265 3 257.9011 538.8274 59.6008 0.1144 1264 +1266 3 257.4583 539.7644 60.7578 0.1144 1265 +1267 3 257.1277 540.8283 61.04 0.1144 1266 +1268 3 256.7159 541.8945 61.0708 0.1144 1267 +1269 3 256.7136 542.9996 61.6 0.1144 1268 +1270 3 256.4848 543.8873 62.5806 0.1144 1269 +1271 3 256.4848 545.0233 62.72 0.1144 1270 +1272 3 256.4848 546.1673 62.72 0.1144 1271 +1273 3 256.4848 547.1946 63.6913 0.1144 1272 +1274 3 256.4848 548.3055 64.12 0.1144 1273 +1275 3 256.4848 549.4495 64.12 0.1144 1274 +1276 3 256.5123 550.5923 64.12 0.1271 1275 +1277 3 256.7136 551.7077 64.12 0.1525 1276 +1278 3 257.1357 552.6767 64.4815 0.178 1277 +1279 3 257.7993 553.4317 65.52 0.178 1278 +1280 3 258.1836 554.4934 65.52 0.1525 1279 +1281 3 258.5703 555.5664 65.52 0.1271 1280 +1282 3 258.7579 556.6944 65.52 0.1144 1281 +1283 3 259.3002 557.6645 65.52 0.1144 1282 +1284 3 259.4592 558.7593 65.52 0.1144 1283 +1285 3 259.4592 559.9033 65.52 0.1144 1284 +1286 3 259.7498 560.7865 65.8423 0.1144 1285 +1287 3 259.9683 561.8127 66.9578 0.1144 1286 +1288 3 260.1868 562.84 68.0733 0.1144 1287 +1289 3 260.4053 563.8662 69.1888 0.1144 1288 +1290 3 260.6226 564.8923 70.3044 0.1144 1289 +1291 3 260.8412 565.9185 71.4199 0.1144 1290 +1292 3 260.8023 567.0007 72.0658 0.1144 1291 +1293 3 260.6009 568.1173 72.4156 0.1144 1292 +1294 3 260.3996 569.235 72.7653 0.1144 1293 +1295 3 260.1971 570.3515 73.115 0.1144 1294 +1296 3 259.9957 571.468 73.4644 0.1144 1295 +1297 3 259.7944 572.5857 73.8142 0.1144 1296 +1298 3 259.593 573.7023 74.1639 0.1144 1297 +1299 3 259.3917 574.82 74.5136 0.1144 1298 +1300 3 259.1892 575.9365 74.8633 0.1144 1299 +1301 3 258.9879 577.053 75.213 0.1144 1300 +1302 3 258.6481 578.1318 75.511 0.1144 1301 +1303 3 258.2122 579.1843 75.7733 0.1144 1302 +1304 3 257.7764 580.2368 76.0357 0.1144 1303 +1305 3 257.3405 581.2893 76.298 0.1144 1304 +1306 3 256.9046 582.3418 76.5604 0.1144 1305 +1307 3 256.7445 583.4457 76.6083 0.1144 1306 +1308 3 256.7822 584.5886 76.5005 0.1144 1307 +1309 3 256.8211 585.7314 76.3924 0.1144 1308 +1310 3 256.86 586.8731 76.2846 0.1144 1309 +1311 3 256.8989 588.016 76.1768 0.1144 1310 +1312 3 256.9378 589.1589 76.0687 0.1144 1311 +1313 3 256.9756 590.3006 75.9609 0.1144 1312 +1314 3 257.0145 591.4434 75.8531 0.1144 1313 +1315 3 257.0534 592.5863 75.745 0.1144 1314 +1316 3 257.0923 593.728 75.6372 0.1144 1315 +1317 3 257.1312 594.8708 75.5292 0.1144 1316 +1318 3 257.1701 596.0137 75.4214 0.1144 1317 +1319 3 256.9733 597.0994 75.3561 0.1271 1318 +1320 3 256.6106 598.1187 75.3561 0.1525 1319 +1321 3 256.7548 599.2409 75.4191 0.178 1320 +1322 3 256.7742 600.3849 75.521 0.178 1321 +1323 3 256.7948 601.5278 75.6227 0.1525 1322 +1324 3 256.8143 602.6706 75.7243 0.1271 1323 +1325 3 256.8337 603.8135 75.826 0.1144 1324 +1326 3 256.8543 604.9564 75.9276 0.1144 1325 +1327 3 256.8738 606.1004 76.0292 0.1144 1326 +1328 3 256.8944 607.2432 76.1309 0.1271 1327 +1329 3 256.9138 608.3861 76.2325 0.1652 1328 +1330 3 256.5981 500.8398 52.08 0.2034 1228 +1331 3 256.828 501.93 52.0551 0.2034 1330 +1332 3 256.828 503.034 51.3906 0.2034 1331 +1333 3 256.828 504.1722 51.24 0.1652 1332 +1334 3 257.0374 505.1984 50.96 0.1398 1333 +1335 3 257.273 506.2909 50.68 0.1144 1334 +1336 3 257.6288 507.3057 50.68 0.1144 1335 +1337 3 258.0258 507.9268 49.2192 0.1271 1336 +1338 3 258.544 508.5492 47.6896 0.1525 1337 +1339 3 258.5509 509.6566 47.1794 0.178 1338 +1340 3 258.8758 510.6793 46.48 0.178 1339 +1341 3 258.8872 511.8233 46.48 0.1652 1340 +1342 3 258.8426 512.8094 45.3306 0.1525 1341 +1343 3 258.7728 513.8139 44.151 0.1525 1342 +1344 3 258.671 514.943 43.958 0.1398 1343 +1345 3 258.5612 516.047 43.5095 0.1271 1344 +1346 3 258.1974 517.0319 42.84 0.1271 1345 +1347 3 258.0406 518.1645 42.84 0.1652 1346 +1348 3 257.972 519.3028 42.7512 0.2034 1347 +1349 3 257.6094 520.3324 42.009 0.2161 1348 +1350 3 257.4847 521.4546 41.72 0.1907 1349 +1351 3 257.4046 522.5906 41.6326 0.2034 1350 +1352 3 257.7226 523.6523 41.3837 0.2542 1351 +1353 3 258.3678 524.5206 40.8456 0.3051 1352 +1354 3 258.6584 525.422 40.0632 0.2796 1353 +1355 3 258.6859 526.5649 40.04 0.2288 1354 +1356 3 259.1926 527.5327 39.7222 0.1907 1355 +1357 3 259.7978 528.4594 39.2613 0.1907 1356 +1358 3 260.3321 529.4283 38.92 0.1652 1357 +1359 3 260.3744 530.5678 38.8805 0.1398 1358 +1360 3 260.387 531.6809 38.36 0.1144 1359 +1361 3 260.7759 532.7368 38.36 0.1144 1360 +1362 3 261.2873 533.4964 37.4413 0.1144 1361 +1363 3 261.404 534.4619 36.4 0.1144 1362 +1364 3 261.8799 535.4881 36.4 0.1144 1363 +1365 3 261.976 536.6092 36.3927 0.1271 1364 +1366 3 261.976 537.68 35.7056 0.1525 1365 +1367 3 262.4714 538.6089 35.28 0.178 1366 +1368 3 263.2172 539.4463 34.9297 0.178 1367 +1369 3 264.1004 540.0847 34.72 0.1525 1368 +1370 3 265.0351 540.6796 34.72 0.1398 1369 +1371 3 265.5647 541.6646 34.4669 0.1398 1370 +1372 3 266.0269 542.6678 33.88 0.1525 1371 +1373 3 266.7305 543.3886 33.0394 0.1398 1372 +1374 3 267.2258 544.1585 31.645 0.1271 1373 +1375 3 268.077 544.7922 31.8298 0.1144 1374 +1376 3 268.848 545.5221 32.2 0.1144 1375 +1377 3 268.9544 546.6032 31.92 0.1144 1376 +1378 3 241.0259 254.9621 40.3556 0.4195 929 +1379 3 240.7491 255.9963 39.4316 0.3559 1378 +1380 3 240.1965 256.947 38.8573 0.2924 1379 +1381 3 239.342 257.6929 38.6224 0.2669 1380 +1382 3 238.492 258.4559 38.5112 0.2669 1381 +1383 3 237.6397 259.2064 38.2323 0.2415 1382 +1384 3 236.776 259.9202 38.523 0.2034 1383 +1385 3 235.7715 260.4099 38.729 0.178 1384 +1386 3 234.8518 261.0002 38.1262 0.1907 1385 +1387 3 234.0601 261.7918 37.6088 0.2415 1386 +1388 3 233.1621 262.4874 37.4693 0.2669 1387 +1389 3 232.2309 263.1394 37.1731 0.2796 1388 +1390 3 231.2585 263.6771 36.5442 0.2415 1389 +1391 3 230.2918 264.272 36.3698 0.2288 1390 +1392 3 229.3068 264.8497 36.2247 0.2161 1391 +1393 3 228.4122 265.4904 35.5292 0.2288 1392 +1394 3 227.5633 266.2385 35.2262 0.2161 1393 +1395 3 226.7923 267.0771 34.9933 0.2034 1394 +1396 3 226.2203 267.9969 34.1695 0.1907 1395 +1397 3 225.6826 268.943 33.3029 0.1907 1396 +1398 3 225.0946 269.9119 33.0593 0.1907 1397 +1399 3 224.5615 270.9232 33.0366 0.2034 1398 +1400 3 224.049 271.946 33.0215 0.2288 1399 +1401 3 223.5662 272.9824 32.9342 0.2542 1400 +1402 3 223.3237 274.0715 32.4075 0.2669 1401 +1403 3 223.2299 275.2052 32.4461 0.2669 1402 +1404 3 222.9805 276.3149 32.69 0.2542 1403 +1405 3 223.1132 277.4028 32.0418 0.2415 1404 +1406 3 222.921 278.5171 31.8049 0.2034 1405 +1407 3 222.3067 279.4517 31.2903 0.2034 1406 +1408 3 221.5676 280.3029 30.8081 0.2161 1407 +1409 3 220.6307 280.9515 30.6561 0.2542 1408 +1410 3 219.799 281.6825 29.967 0.2542 1409 +1411 3 218.8792 282.3529 29.6834 0.2415 1410 +1412 3 217.8645 282.8792 29.6657 0.2542 1411 +1413 3 216.8681 283.442 29.5963 0.2924 1412 +1414 3 216.0078 284.1742 29.1654 0.3305 1413 +1415 3 215.3019 285.0001 28.2937 0.3432 1414 +1416 3 214.8524 285.9725 27.3112 0.3559 1415 +1417 3 214.1339 286.691 26.0282 0.3813 1416 +1418 3 213.3205 287.2962 24.7307 0.3813 1417 +1419 3 212.5998 287.9254 23.2058 0.3305 1418 +1420 3 211.9386 288.7422 22.1634 0.2415 1419 +1421 3 211.2602 289.6562 22.3306 0.178 1420 +1422 3 210.5692 290.5451 21.8576 0.178 1421 +1423 3 209.8554 291.3459 20.9138 0.1907 1422 +1424 3 209.0317 291.8859 19.5966 0.2034 1423 +1425 3 208.073 292.0003 18.1381 0.178 1424 +1426 3 207.6223 292.856 17.92 0.1652 1425 +1427 3 207.1212 293.8055 17.92 0.1525 1426 +1428 3 206.1797 294.4347 17.712 0.1398 1427 +1429 3 205.3366 295.1108 16.8314 0.1398 1428 +1430 3 204.5975 295.9436 16.6172 0.1652 1429 +1431 3 203.9432 296.6804 17.64 0.2161 1430 +1432 3 203.2579 297.4423 18.1815 0.2415 1431 +1433 3 202.6779 298.3563 17.6616 0.2288 1432 +1434 3 202.385 299.3837 16.8328 0.1907 1433 +1435 3 201.9904 300.4338 16.52 0.178 1434 +1436 3 201.511 301.4612 16.2582 0.178 1435 +1437 3 201.2296 302.5651 16.2014 0.1907 1436 +1438 3 200.7159 303.398 15.4339 0.1907 1437 +1439 3 199.9758 304.2239 14.8506 0.1907 1438 +1440 3 199.3992 305.1048 14.28 0.1907 1439 +1441 3 241.813 228.7279 37.5626 0.3686 1 +1442 3 242.3976 227.7658 37.7896 0.4449 1441 +1443 3 242.8586 226.7397 38.2886 0.4322 1442 +1444 3 243.275 225.6952 38.6366 0.3686 1443 +1445 3 243.4272 224.5752 38.7629 0.3432 1444 +1446 3 243.3471 223.461 39.2529 0.3686 1445 +1447 3 242.9936 222.4325 39.8796 0.4068 1446 +1448 3 242.4811 221.467 40.6227 0.4068 1447 +1449 3 242.234 220.4419 41.6968 0.394 1448 +1450 3 242.6756 219.4158 42.2038 0.4068 1449 +1451 3 243.219 218.4502 42.8907 0.4322 1450 +1452 3 243.5954 217.3737 43.1203 0.4576 1451 +1453 3 244.5037 215.9918 43.1284 0.2542 1452 +1454 3 245.3972 215.2916 43.1791 0.2924 1453 +1455 3 246.429 214.8054 43.3756 0.3051 1454 +1456 3 247.1063 214.174 44.24 0.2415 1455 +1457 3 247.8934 213.4555 44.24 0.178 1456 +1458 3 248.693 212.6582 44.24 0.1271 1457 +1459 3 249.527 211.9798 44.24 0.1144 1458 +1460 3 250.6069 211.648 44.24 0.1144 1459 +1461 3 251.3974 210.8472 43.9852 0.1144 1460 +1462 3 252.3458 210.2386 43.68 0.1525 1461 +1463 3 253.2816 209.5808 43.68 0.2415 1462 +1464 3 253.4944 209.4344 43.68 0.1144 1463 +1465 3 254.2609 208.7251 43.12 0.1144 1464 +1466 3 255.2127 208.208 43.12 0.1271 1465 +1467 3 256.0535 207.7424 42.5779 0.1398 1466 +1468 3 256.6095 206.7677 42.4074 0.1525 1467 +1469 3 257.1426 205.7804 42.28 0.1398 1468 +1470 3 257.8336 204.8915 42.0 0.1271 1469 +1471 3 258.4605 203.9363 42.0 0.1398 1470 +1472 3 259.2178 203.084 42.0 0.1907 1471 +1473 3 260.0015 202.2592 42.0 0.2415 1472 +1474 3 260.943 201.7524 41.8981 0.2542 1473 +1475 3 261.4909 201.4012 39.9728 0.2161 1474 +1476 3 262.4794 200.8956 39.76 0.1907 1475 +1477 3 263.3259 200.1428 39.76 0.1652 1476 +1478 3 264.1954 199.5159 39.76 0.178 1477 +1479 3 264.6209 198.8238 38.9211 0.1907 1478 +1480 3 264.7605 197.8354 37.5533 0.2288 1479 +1481 3 265.2478 196.9796 36.8018 0.2415 1480 +1482 3 266.2008 196.6021 35.7311 0.2288 1481 +1483 3 266.8975 196.0221 34.3294 0.2034 1482 +1484 3 267.3139 195.1492 32.8378 0.1907 1483 +1485 3 268.0872 194.4834 31.5717 0.1907 1484 +1486 3 268.7599 193.8016 30.0639 0.178 1485 +1487 3 269.3708 193.1026 28.4362 0.178 1486 +1488 3 269.8719 192.1794 27.326 0.1652 1487 +1489 3 270.373 191.2562 26.2161 0.178 1488 +1490 3 270.874 190.3044 25.4108 0.1652 1489 +1491 3 271.3751 189.2759 25.4108 0.1652 1490 +1492 3 271.8075 188.3116 24.6176 0.1652 1491 +1493 3 272.1885 187.3964 23.2201 0.1907 1492 +1494 3 253.4772 209.6986 44.2061 0.2924 1463 +1495 3 254.5068 209.8096 44.8 0.2288 1494 +1496 3 255.6405 209.924 44.8 0.178 1495 +1497 3 256.7845 209.924 44.8 0.1525 1496 +1498 3 257.9285 209.924 44.8 0.1652 1497 +1499 3 259.021 209.9515 45.1455 0.178 1498 +1500 3 260.0175 210.3278 45.6238 0.2034 1499 +1501 3 261.134 210.52 45.92 0.2034 1500 +1502 3 262.2437 210.7248 46.216 0.2034 1501 +1503 3 263.3728 210.7248 46.6763 0.2034 1502 +1504 3 264.4528 210.7248 47.5518 0.2161 1503 +1505 3 265.4629 210.7248 48.6612 0.2288 1504 +1506 3 266.4101 210.3793 49.28 0.2161 1505 +1507 3 267.4008 210.0384 49.8187 0.2034 1506 +1508 3 268.3744 209.9755 51.0804 0.178 1507 +1509 3 269.1821 209.6952 52.7083 0.1652 1508 +1510 3 270.318 209.6952 52.92 0.1525 1509 +1511 3 271.4323 209.5808 53.3932 0.1525 1510 +1512 3 272.5397 209.5316 54.021 0.1398 1511 +1513 3 273.5979 209.2262 54.4026 0.1271 1512 +1514 3 274.4239 208.5432 55.0984 0.1144 1513 +1515 3 275.2521 207.8248 55.9 0.1144 1514 +1516 3 276.0804 207.1075 56.7017 0.1144 1515 +1517 3 276.9361 206.5698 57.9446 0.1271 1516 +1518 3 277.8044 206.1168 59.3914 0.1398 1517 +1519 3 278.6967 205.7164 60.8247 0.1525 1518 +1520 3 279.6554 205.4647 62.2205 0.1398 1519 +1521 3 280.6152 205.213 63.6163 0.1271 1520 +1522 3 281.5739 204.9602 65.0118 0.1144 1521 +1523 3 282.552 204.5758 66.0999 0.1144 1522 +1524 3 283.5335 204.1594 67.1149 0.1144 1523 +1525 3 284.5151 203.7441 68.1296 0.1144 1524 +1526 3 285.4966 203.3277 69.1446 0.1271 1525 +1527 3 286.3581 202.6756 70.0437 0.1398 1526 +1528 3 287.2104 202.0041 70.933 0.1652 1527 +1529 3 288.2319 201.5259 71.3658 0.1652 1528 +1530 3 289.2627 201.058 71.776 0.1652 1529 +1531 3 290.2923 200.5901 72.186 0.1525 1530 +1532 3 291.323 200.1222 72.5962 0.1525 1531 +1533 3 292.4007 199.8316 73.1254 0.1525 1532 +1534 3 293.5001 199.6246 73.71 0.1398 1533 +1535 3 294.5994 199.4175 74.2949 0.1271 1534 +1536 3 295.6988 199.2104 74.8796 0.1144 1535 +1537 3 296.7982 199.0034 75.4645 0.1144 1536 +1538 3 297.8701 198.7105 76.0754 0.1144 1537 +1539 3 298.9089 198.3078 76.7203 0.1144 1538 +1540 3 299.9465 197.9051 77.3648 0.1144 1539 +1541 3 300.9841 197.5024 78.0097 0.1144 1540 +1542 3 302.0217 197.0986 78.6545 0.1144 1541 +1543 3 303.0593 196.6959 79.2994 0.1144 1542 +1544 3 243.2899 216.2652 43.6612 0.178 1452 +1545 3 242.5555 215.4484 44.3646 0.2542 1544 +1546 3 241.6036 214.8729 45.0136 0.3051 1545 +1547 3 240.7674 214.1213 45.5104 0.3432 1546 +1548 3 240.2022 213.1764 46.2297 0.3432 1547 +1549 3 239.6794 212.2383 47.1904 0.3432 1548 +1550 3 238.9233 211.4432 47.976 0.3686 1549 +1551 3 238.19 210.5875 48.447 0.3813 1550 +1552 3 237.6969 209.5957 47.7705 0.4195 1551 +1553 3 237.7426 208.4871 47.9394 0.4195 1552 +1554 3 238.1819 207.4861 48.7449 0.4068 1553 +1555 3 238.6807 206.524 49.6034 0.3432 1554 +1556 3 238.9507 205.5139 50.1231 0.2924 1555 +1557 3 238.4279 204.5541 50.7265 0.2924 1556 +1558 3 237.5962 203.8734 51.52 0.3051 1557 +1559 3 236.7165 202.7992 51.52 0.2161 1558 +1560 3 236.2463 201.765 51.52 0.2034 1559 +1561 3 235.8104 200.74 51.7409 0.1652 1560 +1562 3 235.7784 199.6005 51.8 0.1271 1561 +1563 3 235.5118 198.5721 51.8392 0.1398 1562 +1564 3 235.346 197.4876 52.36 0.1652 1563 +1565 3 234.9707 196.4237 52.542 0.1907 1564 +1566 3 234.4514 195.465 53.2 0.1907 1565 +1567 3 233.9686 194.4411 53.2 0.1907 1566 +1568 3 233.5934 193.4161 53.2 0.1907 1567 +1569 3 233.1186 192.3888 53.2 0.1652 1568 +1570 3 232.6038 191.3718 53.2 0.1398 1569 +1571 3 232.4425 190.2483 53.2 0.1144 1570 +1572 3 231.8774 189.578 54.3158 0.1398 1571 +1573 3 231.3431 188.5667 54.32 0.178 1572 +1574 3 230.5377 187.7887 54.32 0.2161 1573 +1575 3 229.8593 186.9124 54.6 0.2161 1574 +1576 3 229.2908 185.9412 54.8836 0.1907 1575 +1577 3 229.0185 185.137 56.0 0.178 1576 +1578 3 228.6787 184.0456 56.0 0.1652 1577 +1579 3 228.4454 182.9496 56.1243 0.1652 1578 +1580 3 228.1925 181.9177 56.9265 0.1525 1579 +1581 3 227.8333 180.8447 57.12 0.1652 1580 +1582 3 227.2201 180.1114 58.212 0.2034 1581 +1583 3 226.7179 179.1412 58.5298 0.2415 1582 +1584 3 226.0555 178.4903 59.852 0.2542 1583 +1585 3 225.471 177.7032 61.2545 0.2288 1584 +1586 3 224.9493 176.7503 61.917 0.2034 1585 +1587 3 224.4963 175.7459 62.44 0.1907 1586 +1588 3 223.6406 175.0377 62.44 0.178 1587 +1589 3 223.2928 174.3948 63.2789 0.1525 1588 +1590 3 222.8066 173.9052 64.4 0.1271 1589 +1591 3 222.1671 172.9762 64.4 0.1144 1590 +1592 3 221.6225 171.9718 64.4 0.1144 1591 +1593 3 220.832 171.1664 64.4 0.1144 1592 +1594 3 220.5655 170.0842 64.4 0.1144 1593 +1595 3 220.1285 169.0775 64.4 0.1144 1594 +1596 3 219.7464 168.192 64.8844 0.1144 1595 +1597 3 219.076 167.6818 66.4132 0.1144 1596 +1598 3 218.7328 166.9885 68.04 0.1144 1597 +1599 3 218.5623 165.8651 68.04 0.1144 1598 +1600 3 218.2946 164.7577 68.04 0.1144 1599 +1601 3 218.1608 163.624 68.04 0.1144 1600 +1602 3 218.0533 162.4892 68.04 0.1144 1601 +1603 3 217.8542 161.3704 68.2312 0.1271 1602 +1604 3 217.8176 160.3545 69.3342 0.1398 1603 +1605 3 217.8176 159.3237 70.3875 0.1525 1604 +1606 3 217.8176 158.1866 70.56 0.1398 1605 +1607 3 217.8942 157.054 70.56 0.1271 1606 +1608 3 218.1391 155.9695 70.761 0.1144 1607 +1609 3 218.4193 154.9491 71.4 0.1144 1608 +1610 3 218.7328 153.8714 71.6783 0.1144 1609 +1611 3 219.0497 152.7892 71.96 0.1144 1610 +1612 3 219.3162 151.7138 72.5049 0.1144 1611 +1613 3 219.5954 150.6259 72.8 0.1144 1612 +1614 3 219.9306 149.5437 72.8 0.1144 1613 +1615 3 219.9912 148.4043 72.8 0.1144 1614 +1616 3 220.1056 147.2671 72.8 0.1144 1615 +1617 3 220.252 146.3107 73.6221 0.1144 1616 +1618 3 220.8572 145.5992 73.9007 0.1144 1617 +1619 3 220.9808 144.5295 74.8434 0.1144 1618 +1620 3 221.1055 143.4599 75.7859 0.1144 1619 +1621 3 221.229 142.3891 76.7284 0.1144 1620 +1622 3 221.3526 141.3195 77.6709 0.1144 1621 +1623 3 221.5608 140.2395 78.416 0.1144 1622 +1624 3 221.8102 139.155 79.0622 0.1144 1623 +1625 3 222.0607 138.0694 79.7084 0.1144 1624 +1626 3 222.3101 136.9848 80.3547 0.1144 1625 +1627 3 222.5606 135.9003 81.0009 0.1144 1626 +1628 3 222.81 134.8158 81.6472 0.1144 1627 +1629 3 222.9473 133.7096 82.2273 0.1144 1628 +1630 3 222.9976 132.5873 82.7568 0.1144 1629 +1631 3 223.048 131.465 83.2863 0.1144 1630 +1632 3 223.0994 130.3428 83.8158 0.1144 1631 +1633 3 223.1498 129.2205 84.3452 0.1144 1632 +1634 3 223.2001 128.0983 84.8747 0.1144 1633 +1635 3 223.0125 126.9897 85.26 0.1144 1634 +1636 3 222.754 125.8835 85.6027 0.1144 1635 +1637 3 222.4966 124.7784 85.9454 0.1144 1636 +1638 3 222.2392 123.6721 86.2884 0.1144 1637 +1639 3 221.9806 122.5659 86.6312 0.1144 1638 +1640 3 221.7232 121.4608 86.9739 0.1144 1639 +1641 3 221.4658 120.3545 87.3169 0.1144 1640 +1642 3 221.2073 119.2494 87.6596 0.1144 1641 +1643 3 220.9499 118.1432 88.0023 0.1144 1642 +1644 3 221.2233 117.0609 88.0617 0.1144 1643 +1645 3 221.6088 115.9844 88.0617 0.1144 1644 +1646 3 221.9932 114.9068 88.0617 0.1144 1645 +1647 3 222.3787 113.8295 88.0617 0.1144 1646 +1648 3 222.7631 112.7522 88.0617 0.1271 1647 +1649 3 223.1486 111.6749 88.0617 0.1398 1648 +1650 3 223.4186 110.5707 88.2725 0.1525 1649 +1651 3 223.6383 109.4548 88.5749 0.1398 1650 +1652 3 223.8579 108.339 88.8773 0.1271 1651 +1653 3 224.0776 107.2231 89.18 0.1144 1652 +1654 3 224.2972 106.1071 89.4824 0.1144 1653 +1655 3 224.5169 104.9913 89.7848 0.1144 1654 +1656 3 224.7365 103.8754 90.0875 0.1144 1655 +1657 3 224.9562 102.7596 90.3899 0.1144 1656 +1658 3 225.1758 101.6437 90.6903 0.1144 1657 +1659 3 225.4378 100.5298 90.6903 0.1144 1658 +1660 3 225.6986 99.416 90.6903 0.1144 1659 +1661 3 226.2615 98.491 91.4805 0.1144 1660 +1662 3 226.8666 97.5917 92.3782 0.1144 1661 +1663 3 227.4707 96.6925 93.2758 0.1144 1662 +1664 3 228.0758 95.7932 94.1738 0.1144 1663 +1665 3 228.6799 94.8939 95.0715 0.1398 1664 +1666 3 237.65 203.7464 53.2 0.178 1558 +1667 3 238.7722 203.6686 53.4531 0.1907 1666 +1668 3 239.763 203.6045 54.32 0.1652 1667 +1669 3 240.4242 202.8529 54.32 0.1398 1668 +1670 3 241.2616 202.1128 54.5784 0.1144 1669 +1671 3 242.0521 201.2914 54.6 0.1144 1670 +1672 3 242.5177 200.3281 54.6 0.1144 1671 +1673 3 243.2407 199.7573 55.3714 0.1144 1672 +1674 3 243.8287 198.9748 56.7398 0.1144 1673 +1675 3 244.4785 198.2849 58.0633 0.1144 1674 +1676 3 245.3411 197.5928 58.329 0.1144 1675 +1677 3 245.865 196.6639 58.5239 0.1398 1676 +1678 3 246.5938 196.2189 60.0678 0.1652 1677 +1679 3 247.5204 195.8528 60.7866 0.1907 1678 +1680 3 248.4356 195.8528 62.3742 0.1652 1679 +1681 3 249.4309 195.7384 63.1907 0.1398 1680 +1682 3 250.512 195.7384 63.84 0.1271 1681 +1683 3 251.5313 195.7384 64.7592 0.1525 1682 +1684 3 252.6684 195.7384 64.9883 0.178 1683 +1685 3 253.5298 195.2442 66.103 0.178 1684 +1686 3 254.492 194.7523 66.36 0.178 1685 +1687 3 255.0537 194.3656 67.6404 0.178 1686 +1688 3 255.6176 194.3015 70.0711 0.2034 1687 +1689 3 256.1816 194.2363 72.5021 0.1907 1688 +1690 3 256.8886 194.0338 74.5766 0.178 1689 +1691 3 257.7123 193.717 76.356 0.1398 1690 +1692 3 258.5371 193.3989 78.1351 0.1271 1691 +1693 3 259.3608 193.0809 79.9145 0.1144 1692 +1694 3 260.1834 192.7388 81.6693 0.1144 1693 +1695 3 261.0025 192.3522 83.3806 0.1144 1694 +1696 3 261.8216 191.9655 85.0917 0.1144 1695 +1697 3 262.6418 191.5697 86.767 0.1144 1696 +1698 3 263.5318 190.8936 87.3712 0.1144 1697 +1699 3 264.4207 190.2175 87.9754 0.1144 1698 +1700 3 265.3096 189.5414 88.5797 0.1144 1699 +1701 3 266.1996 188.8652 89.1839 0.1144 1700 +1702 3 267.0885 188.1891 89.7882 0.1144 1701 +1703 3 267.9774 187.513 90.3921 0.1144 1702 +1704 3 268.8503 186.8918 91.2559 0.1144 1703 +1705 3 269.7277 186.3198 92.3835 0.1144 1704 +1706 3 270.6052 185.7478 93.5113 0.1144 1705 +1707 3 271.4163 185.2205 94.9892 0.1144 1706 +1708 3 272.2091 184.7057 96.565 0.1144 1707 +1709 3 273.003 184.1897 98.1406 0.1144 1708 +1710 3 273.7958 183.6749 99.7164 0.1144 1709 +1711 3 274.6847 183.2059 100.767 0.1144 1710 +1712 3 275.6697 183.0423 101.6364 0.1398 1711 +1713 3 276.5574 183.0995 103.3959 0.178 1712 +1714 2 243.2087 232.2354 37.4839 0.4068 1 +1715 2 243.767 231.2379 37.52 0.4068 1714 +1716 2 244.4007 230.2861 37.52 0.4068 1715 +1717 2 245.2942 229.5848 37.5194 0.4068 1716 +1718 2 246.2563 228.967 37.5175 0.394 1717 +1719 2 247.3053 228.514 37.5049 0.3432 1718 +1720 2 248.3269 228.0003 37.4402 0.2796 1719 +1721 2 249.4343 227.8551 36.955 0.2542 1720 +1722 2 250.4296 227.6754 35.6776 0.2669 1721 +1723 2 251.4798 227.3197 35.0406 0.2924 1722 +1724 2 252.4053 226.7545 34.167 0.3051 1723 +1725 2 253.4029 226.3312 33.3416 0.2796 1724 +1726 2 254.2757 225.7684 32.2375 0.2542 1725 +1727 2 255.1337 225.0282 31.9421 0.2288 1726 +1728 2 256.0558 224.351 31.92 0.2542 1727 +1729 2 257.0076 223.7172 31.92 0.2796 1728 +1730 2 257.9686 223.0972 31.92 0.2924 1729 +1731 2 258.9158 222.4554 31.92 0.2542 1730 +1732 2 259.7669 221.7152 32.1191 0.2034 1731 +1733 2 260.6226 220.9968 32.2 0.1652 1732 +1734 2 261.6808 220.5769 32.1538 0.1525 1733 +1735 2 262.5766 219.8985 31.7307 0.1525 1734 +1736 2 263.4643 219.1893 31.57 0.1398 1735 +1737 2 264.2983 218.4376 31.36 0.1398 1736 +1738 2 265.2238 217.8119 30.8918 0.1398 1737 +1739 2 266.1813 217.2021 30.7936 0.1525 1738 +1740 2 267.1995 216.7079 30.52 0.1398 1739 +1741 2 268.1204 216.033 30.5155 0.1271 1740 +1742 2 268.9281 215.2367 30.24 0.1144 1741 +1743 2 269.6191 214.3261 30.24 0.1144 1742 +1744 2 270.4416 213.5436 30.24 0.1271 1743 +1745 2 271.2252 212.7428 29.9785 0.1652 1744 +1746 2 272.177 212.2921 29.136 0.2161 1745 +1747 2 273.265 212.021 29.12 0.2415 1746 +1748 2 274.3026 211.5588 29.12 0.2415 1747 +1749 2 275.4409 211.4387 29.12 0.2288 1748 +1750 2 276.5826 211.4238 29.12 0.2288 1749 +1751 2 277.7152 211.5805 29.12 0.2161 1750 +1752 2 278.85 211.6892 29.12 0.2034 1751 +1753 2 279.6588 212.3001 28.2528 0.1907 1752 +1754 2 280.4493 212.8252 27.0959 0.1907 1753 +1755 2 281.5338 213.1215 26.8976 0.1907 1754 +1756 2 282.6058 213.4693 27.16 0.1907 1755 +1757 2 283.6651 213.8868 27.16 0.1907 1756 +1758 2 284.7794 214.0424 27.16 0.1907 1757 +1759 2 285.7735 214.1568 25.9151 0.2034 1758 +1760 2 286.8855 214.2106 25.48 0.2034 1759 +1761 2 287.7686 214.8226 24.9452 0.1907 1760 +1762 2 288.8451 214.8432 24.2466 0.178 1761 +1763 2 289.7226 214.5046 23.2562 0.1907 1762 +1764 2 290.7522 214.2815 22.8841 0.2161 1763 +1765 2 291.8573 214.508 22.68 0.2034 1764 +1766 2 292.9544 214.8169 22.68 0.1652 1765 +1767 2 294.0961 214.8432 22.68 0.1398 1766 +1768 2 295.2321 214.754 22.68 0.1398 1767 +1769 2 296.3601 214.8009 22.68 0.1652 1768 +1770 2 297.4743 214.9576 22.68 0.178 1769 +1771 2 298.5909 214.7757 22.4 0.1907 1770 +1772 2 299.7108 214.8432 22.1388 0.1907 1771 +1773 2 300.8548 214.8432 22.12 0.178 1772 +1774 2 301.9988 214.8432 22.12 0.1652 1773 +1775 2 303.1291 214.8432 21.8492 0.1525 1774 +1776 2 303.9139 214.0561 21.84 0.1525 1775 +1777 2 304.6564 213.2553 21.84 0.1525 1776 +1778 2 305.7912 213.1272 21.84 0.1652 1777 +1779 3 240.9744 238.9724 35.8481 0.1907 1 +1780 3 241.8393 239.3534 34.4294 0.2288 1779 +1781 3 242.6127 239.6783 32.5332 0.3305 1780 +1782 3 243.4649 240.3967 31.9152 0.3813 1781 +1783 3 244.3939 241.0648 31.8844 0.3813 1782 +1784 3 245.2622 241.7936 31.7251 0.3051 1783 +1785 3 245.9314 242.7065 31.5266 0.2796 1784 +1786 3 246.5137 243.6457 32.0214 0.2924 1785 +1787 3 247.2344 244.4511 32.8115 0.3178 1786 +1788 3 248.105 245.1821 32.8485 0.3178 1787 +1789 3 248.9596 245.8227 32.0754 0.2924 1788 +1790 3 249.7638 246.3535 30.6043 0.3051 1789 +1791 3 250.6801 246.8683 29.7587 0.3305 1790 +1792 3 251.5267 247.6177 29.6792 0.3813 1791 +1793 3 252.1502 248.5763 29.675 0.394 1792 +1794 3 252.6856 249.583 29.652 0.394 1793 +1795 3 253.1294 250.6332 29.5142 0.394 1794 +1796 3 253.6648 251.6251 29.0752 0.4195 1795 +1797 3 254.2609 252.5712 28.5202 0.4322 1796 +1798 3 254.9175 253.4829 28.0885 0.4195 1797 +1799 3 255.652 254.3123 27.4582 0.3813 1798 +1800 3 256.4162 255.1589 27.2401 0.3305 1799 +1801 3 256.9573 256.129 26.747 0.2796 1800 +1802 3 257.5567 257.0808 26.8142 0.2415 1801 +1803 3 258.4319 257.5945 26.4874 0.2796 1802 +1804 3 259.4752 257.6917 25.3949 0.3432 1803 +1805 3 260.8526 258.0429 26.038 0.1144 1804 +1806 3 261.992 258.0933 26.2035 0.1144 1805 +1807 3 263.1314 258.1299 26.297 0.1271 1806 +1808 3 264.256 258.3198 26.341 0.1398 1807 +1809 3 265.3119 258.7476 26.4592 0.178 1808 +1810 3 266.409 258.9009 26.8358 0.2161 1809 +1811 3 267.4958 258.6298 26.4174 0.2669 1810 +1812 3 268.6341 258.6584 26.4706 0.2669 1811 +1813 3 269.7438 258.8666 26.6 0.2415 1812 +1814 3 270.8637 259.0943 26.6 0.2034 1813 +1815 3 271.9997 259.1549 26.542 0.1907 1814 +1816 3 273.0785 259.5095 26.32 0.178 1815 +1817 3 274.1859 259.7955 26.32 0.1652 1816 +1818 3 275.1755 260.3458 26.32 0.1652 1817 +1819 3 276.2302 260.7233 26.255 0.178 1818 +1820 3 277.1615 261.3651 25.8807 0.2034 1819 +1821 3 278.2631 261.65 25.76 0.2161 1820 +1822 3 279.4003 261.7701 25.7351 0.2415 1821 +1823 3 280.4665 262.1144 25.48 0.2288 1822 +1824 3 281.5292 262.5057 25.48 0.2034 1823 +1825 3 282.5508 262.9987 25.366 0.1525 1824 +1826 3 283.6697 263.12 24.9897 0.1271 1825 +1827 3 284.7942 263.12 24.64 0.1144 1826 +1828 3 285.9359 263.1589 24.64 0.1144 1827 +1829 3 287.0662 263.2344 24.3919 0.1398 1828 +1830 3 288.1953 263.2882 24.08 0.178 1829 +1831 3 289.289 263.6062 24.071 0.2288 1830 +1832 3 290.2294 264.1485 23.4178 0.2415 1831 +1833 3 291.1457 264.7067 22.5285 0.2288 1832 +1834 3 292.0746 265.2284 21.5891 0.1907 1833 +1835 3 293.1832 265.4995 21.56 0.1525 1834 +1836 3 294.2013 265.8553 20.7606 0.1271 1835 +1837 3 295.2241 266.2809 20.5058 0.1144 1836 +1838 3 296.3143 266.5817 20.44 0.1144 1837 +1839 3 297.2741 267.1423 20.2667 0.1144 1838 +1840 3 298.3575 267.4672 20.16 0.1144 1839 +1841 3 298.8128 267.8127 18.4341 0.1144 1840 +1842 3 299.3413 268.1765 17.0419 0.1144 1841 +1843 3 300.4144 268.538 16.8 0.1144 1842 +1844 3 301.4932 268.6936 17.1382 0.1144 1843 +1845 3 302.1167 268.7496 19.276 0.1144 1844 +1846 3 303.2115 269.0608 19.3351 0.1144 1845 +1847 3 304.2262 269.4063 20.0796 0.1144 1846 +1848 3 305.3496 269.5424 20.2199 0.1144 1847 +1849 3 306.4787 269.6408 20.4386 0.1144 1848 +1850 3 307.482 269.7415 19.6 0.1398 1849 +1851 3 308.5276 270.1567 19.7602 0.1652 1850 +1852 3 309.6488 270.3604 19.88 0.1907 1851 +1853 3 310.7779 270.548 19.88 0.178 1852 +1854 3 311.891 270.3318 20.1359 0.1907 1853 +1855 3 312.9732 269.9634 20.16 0.2415 1854 +1856 3 314.0989 269.8582 20.16 0.2924 1855 +1857 3 315.2349 269.7552 20.16 0.2924 1856 +1858 3 316.3492 269.9611 20.16 0.2542 1857 +1859 3 317.4589 270.1956 20.16 0.2542 1858 +1860 3 318.5239 270.5606 20.16 0.2796 1859 +1861 3 319.51 271.1188 19.934 0.2669 1860 +1862 3 320.5465 271.573 19.88 0.2288 1861 +1863 3 321.5258 272.1462 19.88 0.2034 1862 +1864 3 322.5428 272.6518 19.88 0.2161 1863 +1865 3 323.625 272.9618 19.88 0.2288 1864 +1866 3 324.7564 273.0888 19.88 0.2161 1865 +1867 3 325.8798 273.3039 19.88 0.2034 1866 +1868 3 326.9769 273.6276 19.88 0.1652 1867 +1869 3 328.0706 273.9617 19.88 0.1398 1868 +1870 3 329.1974 274.1024 19.88 0.1144 1869 +1871 3 330.3243 274.1745 20.1183 0.1144 1870 +1872 3 331.4019 274.3026 20.72 0.1144 1871 +1873 3 332.5276 274.1848 20.4565 0.1398 1872 +1874 3 333.5938 273.9891 19.88 0.1907 1873 +1875 3 334.7264 273.8736 19.7537 0.2669 1874 +1876 3 335.8452 273.9811 19.2934 0.2924 1875 +1877 3 336.9217 274.258 18.8513 0.2924 1876 +1878 3 338.0326 274.528 18.76 0.2542 1877 +1879 3 339.0576 274.981 18.5517 0.2415 1878 +1880 3 340.0574 275.5061 18.3386 0.2034 1879 +1881 3 341.0813 275.9923 18.2 0.178 1880 +1882 3 342.2127 276.0106 18.2 0.1652 1881 +1883 3 343.3384 275.8241 18.114 0.178 1882 +1884 3 344.4607 275.966 17.92 0.1907 1883 +1885 3 345.5486 276.3183 17.9068 0.1907 1884 +1886 3 346.5862 276.7565 17.64 0.1907 1885 +1887 3 347.5278 277.3994 17.5619 0.178 1886 +1888 3 348.5882 277.7632 17.36 0.1652 1887 +1889 3 349.7322 277.7632 17.36 0.1525 1888 +1890 3 350.8202 277.8902 16.8622 0.1525 1889 +1891 3 351.8967 278.2448 16.8 0.1525 1890 +1892 3 353.0373 278.3295 16.8 0.1525 1891 +1893 3 354.1721 278.3352 16.52 0.1525 1892 +1894 3 355.3058 278.2219 16.5508 0.1398 1893 +1895 3 356.4429 278.2208 16.8 0.1271 1894 +1896 3 357.5618 278.0675 17.057 0.1144 1895 +1897 3 358.7001 277.992 17.08 0.1144 1896 +1898 3 359.8383 277.9451 17.08 0.1271 1897 +1899 3 360.8233 277.5596 16.8179 0.1525 1898 +1900 3 361.5452 277.3056 18.5954 0.178 1899 +1901 3 362.6183 277.42 19.0509 0.178 1900 +1902 3 363.5998 277.3502 19.8408 0.1652 1901 +1903 3 364.7415 277.3056 19.88 0.1525 1902 +1904 3 365.8626 277.3056 20.2392 0.1525 1903 +1905 3 366.9826 277.3056 20.72 0.1398 1904 +1906 3 368.1266 277.3056 20.72 0.1271 1905 +1907 3 369.2706 277.309 20.72 0.1271 1906 +1908 3 370.402 277.436 20.72 0.1652 1907 +1909 3 371.5117 277.6911 20.72 0.2034 1908 +1910 3 372.4967 278.1728 20.72 0.2161 1909 +1911 3 373.4805 278.6304 20.72 0.178 1910 +1912 3 374.5262 278.9552 20.72 0.1398 1911 +1913 3 375.494 279.4563 20.72 0.1398 1912 +1914 3 376.622 279.5398 20.72 0.1652 1913 +1915 3 377.6905 279.9151 20.72 0.1907 1914 +1916 3 378.4524 280.6232 20.72 0.1652 1915 +1917 3 379.4385 281.1128 20.5556 0.1398 1916 +1918 3 380.5527 281.1952 20.6713 0.1144 1917 +1919 3 381.6956 281.2021 20.7138 0.1144 1918 +1920 3 382.62 281.5098 19.4432 0.1271 1919 +1921 3 383.661 281.8072 19.32 0.1398 1920 +1922 3 384.6689 282.2603 19.32 0.1652 1921 +1923 3 385.663 282.7568 19.32 0.178 1922 +1924 3 386.7978 282.8094 19.1024 0.1907 1923 +1925 3 387.5403 283.5198 18.7415 0.178 1924 +1926 3 388.428 283.823 17.6638 0.1652 1925 +1927 3 389.4988 283.5759 17.9186 0.1525 1926 +1928 3 390.5765 283.3688 18.3478 0.1652 1927 +1929 3 391.7022 283.3688 18.76 0.2034 1928 +1930 3 392.4103 283.3802 17.1839 0.2669 1929 +1931 3 393.5268 283.4832 17.0579 0.3051 1930 +1932 3 394.6262 283.6926 16.8 0.2796 1931 +1933 3 395.7691 283.712 16.8 0.2161 1932 +1934 3 396.9039 283.617 16.7838 0.1652 1933 +1935 3 398.0376 283.712 16.6628 0.1525 1934 +1936 3 399.1588 283.5976 17.0492 0.1398 1935 +1937 3 400.265 283.4363 17.08 0.1271 1936 +1938 3 401.3793 283.2361 17.08 0.1271 1937 +1939 3 402.5187 283.1377 17.08 0.1398 1938 +1940 3 403.6432 283.0256 17.3687 0.1652 1939 +1941 3 404.7472 283.14 17.92 0.1652 1940 +1942 3 259.243 257.5876 23.8 0.2288 1804 +1943 3 259.3448 258.7236 23.8 0.2796 1942 +1944 3 259.3654 259.8619 23.5942 0.2669 1943 +1945 3 259.4569 260.999 23.52 0.2415 1944 +1946 3 259.7509 261.8959 22.96 0.2542 1945 +1947 3 260.5552 262.5572 22.12 0.2924 1946 +1948 3 261.2496 263.4655 22.12 0.3432 1947 +1949 3 261.936 264.3807 22.12 0.3432 1948 +1950 3 262.5549 265.3005 21.5533 0.3178 1949 +1951 3 263.0056 266.1894 20.4375 0.2669 1950 +1952 3 263.2207 267.1457 19.1559 0.2542 1951 +1953 3 264.0009 267.9591 19.04 0.2415 1952 +1954 3 264.7136 268.8354 18.7194 0.2288 1953 +1955 3 265.3405 269.5264 18.2 0.2161 1954 +1956 3 266.0498 270.2174 17.8942 0.2288 1955 +1957 3 266.7007 271.0113 17.36 0.2542 1956 +1958 3 267.4924 271.8258 17.36 0.2415 1957 +1959 3 268.1273 272.749 17.36 0.2034 1958 +1960 3 268.1536 273.8461 16.7597 0.1525 1959 +1961 3 268.1536 274.9741 16.2963 0.1271 1960 +1962 3 268.1925 276.0037 15.2967 0.1144 1961 +1963 3 269.2976 276.0472 15.12 0.1144 1962 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc new file mode 100644 index 0000000..cd1d585 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Rorb-IRES2-Cre-D_Ai14_IVSCC_-168053.05.01.01_325404214_m.swc @@ -0,0 +1,2194 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/neuron tracing and reconstruction/vaa3d/vaa3d_bin_msvc_64bit_v2921_a/vaa3d_bin_msvc_64bit_v2921_a/new 168053.04.01.01.swc +# id,type,x,y,z,r,pid +1 1 415.6095 417.7339 47.8951 6.2366 -1 +2 4 413.4633 416.9525 48.2236 0.1144 1 +3 4 412.3903 416.5624 48.3879 0.1652 2 +4 4 411.3172 416.1712 48.552 0.2542 3 +5 4 410.2441 415.7811 48.7166 0.3813 4 +6 4 409.1001 415.7559 48.72 0.4576 5 +7 4 409.1871 414.7286 47.5728 0.2587 6 +8 4 408.9468 413.7368 46.8028 0.2501 7 +9 4 408.4984 412.7644 46.6435 0.2908 8 +10 4 408.6242 411.7382 45.6862 0.3458 9 +11 4 409.0727 410.9088 44.2305 0.3686 10 +12 4 409.8048 410.1068 43.4174 0.3514 11 +13 4 410.4535 409.2797 43.8572 0.3085 12 +14 4 411.0884 408.408 44.1526 0.2746 13 +15 4 411.6181 407.415 43.7422 0.2852 14 +16 4 412.0162 406.3522 43.4109 0.3197 15 +17 4 412.4715 405.3181 43.0052 0.3672 16 +18 4 413.0721 404.4749 41.925 0.4006 17 +19 4 413.5045 403.538 40.7725 0.3955 18 +20 4 413.9804 402.5095 40.8229 0.3338 19 +21 4 414.533 401.5509 40.1475 0.2932 20 +22 4 415.3326 400.9068 38.9242 0.3176 21 +23 4 416.3394 400.972 37.6132 0.572 22 +24 4 416.9869 400.3554 39.8726 0.3938 23 +25 4 417.7831 400.1895 41.337 0.3185 24 +26 4 418.8962 400.0431 41.5464 0.2855 25 +27 4 419.9006 399.5306 41.4324 0.2954 26 +28 4 420.7186 398.787 40.8402 0.3374 27 +29 4 420.6717 397.6967 40.549 0.3432 28 +30 4 420.6763 396.5539 40.5409 0.3432 29 +31 4 420.4795 395.4293 40.5177 0.3432 30 +32 4 420.2175 394.3322 40.0576 0.3926 31 +33 4 420.1672 393.2317 39.3039 0.4188 32 +34 4 420.0779 392.1106 38.7923 0.4195 33 +35 4 420.1958 390.9849 39.1642 0.3822 34 +36 4 420.1546 389.8455 39.3565 0.3316 35 +37 4 420.0539 388.7209 39.8135 0.2806 36 +38 4 419.8549 387.6101 40.2632 0.2297 37 +39 4 419.848 386.4718 40.5278 0.2545 38 +40 4 420.2507 385.4136 40.178 0.3079 39 +41 4 420.4795 384.4206 38.9511 0.3813 40 +42 4 420.9943 383.4002 38.9544 0.3824 41 +43 4 421.4084 382.366 39.0348 0.394 42 +44 4 421.8683 381.5972 37.5304 0.3957 43 +45 4 422.6108 380.7655 38.134 0.3996 44 +46 4 423.2708 379.856 38.1679 0.3475 45 +47 4 423.6724 378.8081 37.8428 0.3077 46 +48 4 424.2261 377.8289 38.281 0.283 47 +49 4 424.6448 376.8485 38.7008 0.2885 48 +50 4 424.6322 375.7262 38.1615 0.2701 49 +51 4 424.7672 374.6154 37.7213 0.259 50 +52 4 425.3072 373.6853 37.2333 0.2619 51 +53 4 426.116 372.9177 36.7326 0.2598 52 +54 4 426.8939 372.0929 36.4652 0.2607 53 +55 4 427.6169 371.2269 36.2782 0.2477 54 +56 4 428.1729 370.2499 36.568 0.2482 55 +57 4 428.301 369.1997 37.119 0.268 56 +58 4 428.3296 368.0866 37.1496 0.2796 57 +59 4 428.476 366.9975 37.5558 0.2646 58 +60 4 428.4921 365.9404 38.614 0.2382 59 +61 4 428.6797 364.9795 38.04 0.2378 60 +62 4 428.9897 363.9556 38.1763 0.2415 61 +63 4 429.5823 362.9992 38.2914 0.2415 62 +64 4 430.096 362.2213 36.759 0.2418 63 +65 4 430.3202 361.1105 36.3874 0.2551 64 +66 4 430.7183 360.0397 36.2569 0.2796 65 +67 4 430.8579 358.9197 36.0772 0.2811 66 +68 4 430.525 357.8295 35.9792 0.2924 67 +69 4 430.2115 356.7541 35.4085 0.2942 68 +70 4 429.9884 355.6582 35.2243 0.3032 69 +71 4 429.9575 354.592 35.8677 0.2844 70 +72 4 429.6738 353.5406 35.5443 0.2442 71 +73 4 429.8992 352.4286 35.8708 0.2127 72 +74 4 430.1532 351.327 36.101 0.2107 73 +75 4 430.3842 350.2345 35.5944 0.2401 74 +76 4 430.6085 349.1705 34.858 0.271 75 +77 4 430.5833 348.0357 34.8202 0.2796 76 +78 4 430.4552 346.91 34.9826 0.2749 77 +79 4 430.1429 345.8644 35.2422 0.2669 78 +80 4 429.6887 344.8828 35.9436 0.2669 79 +81 4 429.4027 343.7823 35.9912 0.2617 80 +82 4 429.3283 342.644 35.9752 0.2488 81 +83 4 429.2654 341.5092 35.7739 0.2415 82 +84 4 428.9542 340.4315 35.8243 0.2476 83 +85 4 428.5435 339.3756 35.9411 0.2542 84 +86 4 428.2964 338.2659 35.7216 0.241 85 +87 4 428.253 337.1345 35.7787 0.2155 86 +88 4 428.1935 336.002 35.887 0.2034 87 +89 4 428.047 334.8694 35.7493 0.2102 88 +90 4 428.1168 333.7654 35.2537 0.223 89 +91 4 428.6431 332.8171 34.7704 0.2288 90 +92 4 429.3054 331.8961 34.8337 0.2288 91 +93 4 429.9449 330.9512 34.9664 0.2207 92 +94 4 430.3202 329.8987 34.8869 0.1989 93 +95 4 430.4174 328.7684 34.5817 0.1731 94 +96 4 430.6279 327.6588 34.2415 0.1564 95 +97 4 430.7926 326.5354 33.9646 0.1525 96 +98 4 430.9494 325.4142 33.5664 0.1436 97 +99 4 431.0912 324.2851 33.5502 0.1398 98 +100 4 431.0478 323.1537 33.8419 0.1398 99 +101 4 431.0958 322.02 33.7761 0.1683 100 +102 4 431.3578 320.9114 33.7848 0.2067 101 +103 4 431.8943 319.9127 33.9287 0.2647 102 +104 4 432.4148 318.9209 33.4818 0.3095 103 +105 4 432.9239 317.9176 33.7086 0.3281 104 +106 4 433.3358 316.8571 33.9564 0.3305 105 +107 4 433.4238 315.7566 34.571 0.32 106 +108 4 433.3461 314.6229 34.6052 0.3283 107 +109 4 433.2431 313.488 34.3664 0.3305 108 +110 4 433.0887 312.3589 34.5268 0.3517 109 +111 4 432.8175 311.2549 34.7973 0.3453 110 +112 4 432.5212 310.1636 35.2173 0.3218 111 +113 4 432.3656 309.0573 35.8081 0.2853 112 +114 4 432.0648 308.1101 34.6562 0.3042 113 +115 4 431.8589 307.0118 35.1266 0.3426 114 +116 4 431.6495 305.8873 35.1862 0.3808 115 +117 4 431.0535 304.9126 35.303 0.3813 116 +118 4 430.7801 303.8086 35.5578 0.3683 117 +119 4 430.2939 302.7882 35.1344 0.3556 118 +120 4 430.0639 301.6831 34.7032 0.3443 119 +121 4 430.0937 300.5505 34.3185 0.3686 120 +122 4 430.1097 299.4168 34.0116 0.3661 121 +123 4 430.2573 298.3014 34.214 0.3355 122 +124 4 430.7995 297.3164 33.9262 0.2754 123 +125 4 430.8773 296.1953 33.906 0.2567 124 +126 4 430.5833 295.1051 34.3484 0.2754 125 +127 4 430.3225 294.0137 34.8872 0.3123 126 +128 4 430.0273 292.9304 35.1792 0.3354 127 +129 4 429.8694 291.8069 35.0829 0.3377 128 +130 4 429.8408 290.6652 35.1207 0.3305 129 +131 4 429.7127 289.5327 35.0314 0.3249 130 +132 4 429.5125 288.4241 35.3021 0.3178 131 +133 4 429.3077 287.3534 36.1228 0.312 132 +134 4 429.3672 286.3329 36.2785 0.3111 133 +135 4 429.8305 285.3182 35.6964 0.3178 134 +136 4 430.2378 284.2783 35.8817 0.324 135 +137 4 430.5764 283.2144 36.4549 0.3305 136 +138 4 430.9356 282.29 35.7034 0.3378 137 +139 4 431.4768 281.4068 34.9874 0.3272 138 +140 4 432.1952 280.534 35.2635 0.2932 139 +141 4 432.9113 279.6497 35.4343 0.2627 140 +142 4 433.6607 278.7928 35.6118 0.2629 141 +143 4 434.4203 278.0069 36.3698 0.2845 142 +144 4 435.3046 277.3308 36.4988 0.2924 143 +145 4 436.1237 276.7164 35.4046 0.2924 144 +146 4 436.9531 276.1078 34.1916 0.2924 145 +147 4 437.683 275.4283 35.1582 0.2924 146 +148 4 437.8969 274.3449 35.6446 0.2439 147 +149 4 438.4952 273.416 35.0 0.1144 148 +150 4 415.304 399.582 36.0962 0.321 23 +151 4 414.6165 398.7 35.6356 0.286 150 +152 4 414.1074 397.7013 35.1806 0.2956 151 +153 4 413.6109 396.7049 34.594 0.3312 152 +154 4 413.1922 396.0082 32.8079 0.3432 153 +155 4 412.9577 395.0278 32.405 0.3337 154 +156 4 413.1442 393.9204 32.4181 0.3113 155 +157 4 413.6361 392.9057 32.7368 0.3051 156 +158 4 414.4129 392.3119 34.0194 0.3051 157 +159 4 415.3143 391.8303 33.3642 0.3199 158 +160 4 415.7754 390.9952 32.1745 0.3332 159 +161 4 415.4756 389.9232 31.5952 0.3367 160 +162 4 414.9837 388.9348 31.0271 0.3075 161 +163 4 414.3968 388.0551 30.0538 0.2597 162 +164 4 414.0822 387.061 29.3129 0.2108 163 +165 4 414.4048 386.1812 27.8964 0.2034 164 +166 4 414.4449 385.3106 26.6983 0.2496 165 +167 4 413.7802 384.6139 25.3638 0.3076 166 +168 4 413.6818 383.6255 25.338 0.3634 167 +169 4 414.3305 382.7652 26.1512 0.3324 168 +170 4 414.3568 381.6384 26.04 0.2288 169 +171 4 408.0202 415.4951 48.7203 0.483 6 +172 4 406.8808 415.3944 48.722 0.5084 171 +173 4 405.8214 414.9608 48.7309 0.5212 172 +174 4 404.8971 414.287 48.771 0.5466 173 +175 4 404.0402 413.532 48.9317 0.5212 174 +176 4 403.0941 412.952 49.6079 0.4576 175 +177 4 402.1812 412.4841 49.8131 0.4069 176 +178 4 401.1688 411.951 49.812 0.4195 177 +179 4 400.2009 411.3435 49.6801 0.394 178 +180 4 399.3876 410.5873 49.0104 0.3686 179 +181 4 398.5925 409.7682 48.8412 0.3559 180 +182 4 397.8649 408.8988 49.2358 0.3432 181 +183 4 397.111 408.0671 49.7594 0.3051 182 +184 4 396.0185 407.7273 49.6936 0.3178 183 +185 4 394.9077 407.7296 49.0249 0.3686 184 +186 4 393.7648 407.7754 48.9742 0.4449 185 +187 4 392.67 407.9813 49.4808 0.4299 186 +188 4 391.5832 407.9538 49.0952 0.3868 187 +189 4 390.6016 407.518 48.193 0.3358 188 +190 4 389.7093 406.8533 47.6756 0.3001 189 +191 4 388.8616 406.0868 47.6003 0.3025 190 +192 4 387.9613 405.3878 47.5933 0.343 191 +193 4 386.9763 404.8055 47.5619 0.4065 192 +194 4 385.9593 404.2965 47.3673 0.455 193 +195 4 384.9697 403.7679 46.8983 0.4703 194 +196 4 384.0911 403.0632 46.5136 0.4602 195 +197 4 383.2732 402.2636 46.4439 0.4399 196 +198 4 382.4655 401.4559 46.3336 0.4272 197 +199 4 381.6578 400.6494 46.2862 0.4303 198 +200 4 380.8502 399.844 46.48 0.4576 199 +201 4 380.4235 399.3956 45.3678 0.3814 200 +202 4 379.6467 398.557 45.3474 0.2288 201 +203 4 379.236 398.287 46.4797 0.3432 202 +204 4 379.2497 398.8911 48.2451 0.2529 203 +205 4 378.5096 398.4632 50.0976 0.2446 204 +206 4 377.7866 397.8855 51.7076 0.2687 205 +207 4 376.8061 397.4702 52.6896 0.2796 206 +208 4 375.7102 397.2128 53.1577 0.2775 207 +209 4 374.6154 396.8982 53.312 0.269 208 +210 4 373.5995 396.3868 53.606 0.282 209 +211 4 372.5733 395.9018 53.8331 0.295 210 +212 4 371.482 395.5998 54.1478 0.3051 211 +213 4 370.4398 395.228 54.8498 0.2992 212 +214 4 369.3827 394.8676 55.4196 0.2796 213 +215 4 368.2753 394.7292 55.923 0.2764 214 +216 4 367.1897 394.9546 56.4553 0.2706 215 +217 4 366.1647 395.4236 56.9215 0.2648 216 +218 4 365.1099 395.7737 57.5506 0.1946 217 +219 4 364.0437 396.0436 58.2845 0.1608 218 +220 4 363.0118 396.4841 58.7518 0.275 219 +221 4 362.0474 397.0835 59.0744 0.2843 220 +222 4 361.1105 397.6887 59.6562 0.2503 221 +223 4 360.1312 397.9393 60.5413 0.2065 222 +224 4 359.2755 397.3627 61.3416 0.1965 223 +225 4 358.7241 396.404 62.0234 0.2094 224 +226 4 358.1853 395.4282 62.5694 0.2282 225 +227 4 357.3948 394.6754 63.0974 0.2542 226 +228 4 356.4326 394.1595 63.922 0.2801 227 +229 4 355.6673 393.4136 64.3871 0.2924 228 +230 4 355.1685 392.3954 64.1855 0.2718 229 +231 4 354.8127 391.3796 64.6596 0.2182 230 +232 4 354.3185 390.4632 65.721 0.1674 231 +233 4 353.5864 390.0582 67.3389 0.1441 232 +234 4 352.7455 390.4621 68.5376 0.1753 233 +235 4 351.8395 391.1027 69.2101 0.2267 234 +236 4 350.9838 391.8257 69.7435 0.2783 235 +237 4 350.1475 392.5945 69.6993 0.2718 236 +238 4 349.8341 393.655 69.8524 0.2115 237 +239 4 348.8834 394.1778 69.7253 0.1414 238 +240 4 347.8744 394.7063 69.4823 0.1273 239 +241 4 346.8848 395.2806 69.5565 0.1522 240 +242 4 345.7717 395.3756 70.1296 0.1906 241 +243 4 344.6597 395.5838 70.5502 0.216 242 +244 4 343.5352 395.5014 71.0214 0.2161 243 +245 4 342.4358 395.3481 71.6937 0.2034 244 +246 4 341.3467 395.0301 72.065 0.1907 245 +247 4 340.34 394.68 73.08 0.2288 246 +248 4 378.3826 397.5995 46.4792 0.3676 203 +249 4 377.4983 396.8742 46.4766 0.3807 248 +250 4 376.678 396.0768 46.4666 0.3692 249 +251 4 375.9321 395.2097 46.4117 0.3686 250 +252 4 375.1107 394.4249 46.0888 0.3686 251 +253 4 374.0949 393.9444 45.5946 0.3933 252 +254 4 373.0355 393.5349 45.2698 0.394 253 +255 4 372.0299 393.0212 44.8274 0.394 254 +256 4 371.0793 392.3989 44.4973 0.3816 255 +257 4 370.0588 391.8909 44.7177 0.3688 256 +258 4 368.9377 391.6793 44.5665 0.3812 257 +259 4 367.8246 391.4413 44.2938 0.3939 258 +260 4 366.8328 390.8716 44.2406 0.457 259 +261 4 365.8924 390.2195 44.2322 0.4828 260 +262 4 364.9394 389.5881 44.2014 0.5082 261 +263 4 363.9865 388.9577 44.0605 0.4832 262 +264 4 362.9832 388.4544 43.5207 0.4704 263 +265 4 361.9891 387.9018 43.2281 0.4577 264 +266 4 360.9938 387.3424 43.4375 0.4576 265 +267 4 359.9871 386.839 43.937 0.445 266 +268 4 358.9494 386.3597 44.0152 0.4196 267 +269 4 357.9336 385.9009 43.3874 0.3941 268 +270 4 356.8044 385.7499 43.1214 0.3813 269 +271 4 355.6616 385.6973 43.1144 0.394 270 +272 4 354.5588 385.3953 43.0825 0.394 271 +273 4 353.488 384.9983 42.901 0.394 272 +274 4 352.5522 384.408 42.1901 0.3686 273 +275 4 351.8544 383.5054 42.0039 0.3686 274 +276 4 351.0364 382.7046 41.9941 0.3686 275 +277 4 350.0514 382.1235 41.9692 0.3813 276 +278 4 348.9372 381.8729 41.7981 0.3686 277 +279 4 347.8915 381.5148 41.0754 0.3432 278 +280 4 346.8608 381.0264 40.8797 0.3051 279 +281 4 345.9639 380.3239 40.8766 0.2648 280 +282 4 345.0224 379.6764 40.8626 0.25 281 +283 4 344.0122 379.1399 40.7929 0.2245 282 +284 4 343.0581 378.5313 40.5518 0.2034 283 +285 4 342.2688 377.7213 40.1178 0.2104 284 +286 4 341.4279 376.9674 39.8028 0.2513 285 +287 4 340.4212 376.4286 39.76 0.2949 286 +288 4 339.3562 376.0111 39.76 0.3001 287 +289 4 338.2854 375.6107 39.76 0.2722 288 +290 4 337.2489 375.137 39.76 0.2466 289 +291 4 336.3589 374.4289 39.76 0.2749 290 +292 4 335.637 373.5412 39.76 0.3105 291 +293 4 334.9495 372.6283 39.76 0.3278 292 +294 4 334.183 371.7806 39.7594 0.3178 293 +295 4 333.3158 371.0381 39.7572 0.3288 294 +296 4 332.3549 370.4192 39.7446 0.3769 295 +297 4 331.331 369.9113 39.6673 0.4124 296 +298 4 330.3048 369.4239 39.3896 0.4237 297 +299 4 329.329 368.8553 38.9385 0.3883 298 +300 4 328.3875 368.2181 38.6702 0.36 299 +301 4 327.4757 367.5283 38.64 0.3247 300 +302 4 326.6154 366.7756 38.6406 0.2964 301 +303 4 325.7117 366.08 38.6445 0.2639 302 +304 4 324.6924 365.5663 38.6669 0.2572 303 +305 4 323.6216 365.1682 38.7755 0.276 304 +306 4 322.5565 364.7713 39.088 0.3112 305 +307 4 321.5006 364.3663 39.5066 0.3397 306 +308 4 320.4561 363.9178 39.7051 0.3811 307 +309 4 319.51 363.2875 39.6326 0.4356 308 +310 4 318.7321 362.4615 39.3523 0.4863 309 +311 4 318.0572 361.5498 38.985 0.4924 310 +312 4 317.3879 360.6266 38.8388 0.4764 311 +313 4 316.6947 359.7171 38.9099 0.4609 312 +314 4 315.9762 358.8305 39.0729 0.4736 313 +315 4 315.212 357.9919 39.4201 0.4864 314 +316 4 314.417 357.1785 39.6676 0.4957 315 +317 4 313.6425 356.34 39.5324 0.4921 316 +318 4 312.9046 355.4786 39.1768 0.4725 317 +319 4 312.1381 354.6469 38.8032 0.4343 318 +320 4 311.2538 353.9307 38.6481 0.3995 319 +321 4 310.2517 353.3919 38.6378 0.3887 320 +322 4 309.1534 353.0899 38.6254 0.4144 321 +323 4 308.0186 352.9492 38.5529 0.436 322 +324 4 306.91 352.7192 38.3054 0.441 323 +325 4 305.8781 352.2662 37.8907 0.4282 324 +326 4 304.9424 351.6267 37.5911 0.4276 325 +327 4 304.1255 350.8328 37.5203 0.449 326 +328 4 303.4185 349.9336 37.5214 0.4617 327 +329 4 302.7722 348.9909 37.527 0.4662 328 +330 4 302.2025 348.0002 37.5575 0.4617 329 +331 4 301.6842 346.9821 37.6844 0.4745 330 +332 4 301.1019 346.0085 38.0041 0.483 331 +333 4 300.4453 345.0876 38.4062 0.4745 332 +334 4 299.76 344.1758 38.6131 0.4404 333 +335 4 299.0702 343.2641 38.631 0.3896 334 +336 4 298.3644 342.3637 38.598 0.3473 335 +337 4 297.6002 341.5183 38.463 0.3435 336 +338 4 296.7124 340.8228 38.1265 0.3953 337 +339 4 295.7171 340.2851 37.7236 0.4673 338 +340 4 294.6933 339.784 37.5374 0.513 339 +341 4 293.6694 339.2738 37.52 0.5166 340 +342 4 292.681 338.7006 37.52 0.5084 341 +343 4 291.752 338.0348 37.52 0.513 342 +344 4 290.8826 337.2924 37.52 0.5212 343 +345 4 290.0601 336.4973 37.52 0.5074 344 +346 4 289.265 335.6748 37.52 0.4646 345 +347 4 288.5134 334.8133 37.5194 0.4138 346 +348 4 287.8498 333.8833 37.5166 0.372 347 +349 4 287.2206 332.9292 37.5049 0.3559 348 +350 4 286.5079 332.0368 37.4452 0.3606 349 +351 4 285.7312 331.204 37.2263 0.3733 350 +352 4 284.9201 330.4204 36.7702 0.3766 351 +353 4 284.046 329.726 36.1777 0.3734 352 +354 4 283.1034 329.1368 35.5334 0.3909 353 +355 4 282.1161 328.63 34.86 0.4308 354 +356 4 281.1277 328.0981 34.3644 0.4703 355 +357 4 280.169 327.4803 34.1827 0.4703 356 +358 4 279.2367 326.8191 34.16 0.4606 357 +359 4 278.3226 326.1304 34.16 0.4693 358 +360 4 277.4177 325.4302 34.16 0.5182 359 +361 4 276.4808 324.7759 34.16 0.5436 360 +362 4 275.5072 324.1753 34.16 0.5347 361 +363 4 274.5737 323.5221 34.16 0.4859 362 +364 4 273.7786 322.7075 34.16 0.4552 363 +365 4 273.1003 321.7855 34.16 0.4322 364 +366 4 272.4528 320.8428 34.1592 0.4272 365 +367 4 271.7881 319.9127 34.1555 0.4245 366 +368 4 271.0456 319.0456 34.1379 0.4372 367 +369 4 270.1819 318.302 34.0435 0.4398 368 +370 4 269.2244 317.6911 33.7641 0.4219 369 +371 4 268.1856 317.269 33.3589 0.391 370 +372 4 267.0645 317.1317 33.0954 0.3794 371 +373 4 265.9331 317.0367 33.0324 0.3829 372 +374 4 264.9195 316.5745 32.9958 0.3802 373 +375 4 264.0466 315.8412 32.8037 0.388 374 +376 4 263.112 315.2223 32.4044 0.3994 375 +377 4 262.0618 314.7991 32.058 0.4073 376 +378 4 261.0208 314.3415 31.9348 0.3695 377 +379 4 260.1204 313.6562 31.92 0.3432 378 +380 4 259.4283 312.7547 31.92 0.3683 379 +381 4 258.925 311.732 31.92 0.4319 380 +382 4 258.576 310.644 31.92 0.4703 381 +383 4 258.2397 309.5527 31.92 0.4449 382 +384 4 257.7192 308.5437 31.92 0.4003 383 +385 4 256.9813 307.6777 31.9203 0.3749 384 +386 4 256.0901 306.9684 31.9208 0.375 385 +387 4 255.0994 306.3998 31.9236 0.3878 386 +388 4 254.0698 305.9022 31.9413 0.407 387 +389 4 253.062 305.3668 32.048 0.4324 388 +390 4 252.1319 304.7216 32.373 0.4384 389 +391 4 251.2499 304.0134 32.7981 0.4192 390 +392 4 250.3518 303.3144 33.0142 0.3871 391 +393 4 249.432 302.6349 33.0403 0.3686 392 +394 4 248.4917 301.984 33.0408 0.3621 393 +395 4 247.5948 301.2793 33.045 0.3691 394 +396 4 246.913 300.3812 33.073 0.3813 395 +397 4 246.5412 299.3162 33.2626 0.3813 396 +398 4 246.3959 298.1962 33.6736 0.3745 397 +399 4 246.2277 297.0785 34.0158 0.3821 398 +400 4 245.8296 296.018 34.0626 0.4279 399 +401 4 245.2439 295.0468 33.7896 0.478 400 +402 4 244.5723 294.1384 33.353 0.5024 401 +403 4 243.8116 293.2964 33.0775 0.4948 402 +404 4 242.9513 292.5471 32.9596 0.4694 403 +405 4 242.0189 291.8996 32.6813 0.4303 404 +406 4 241.0934 291.2532 32.2445 0.3931 405 +407 4 240.2594 290.4868 31.9768 0.3744 406 +408 4 239.5227 289.6139 31.922 0.3823 407 +409 4 238.8249 288.7078 31.92 0.4077 408 +410 4 238.0904 287.8315 31.92 0.4401 409 +411 4 237.2805 287.0262 31.9197 0.4782 410 +412 4 236.4305 286.2608 31.9192 0.4957 411 +413 4 235.5988 285.4749 31.9164 0.4888 412 +414 4 234.7854 284.6707 31.906 0.4693 413 +415 4 233.9663 283.8722 31.8637 0.4645 414 +416 4 233.114 283.1171 31.6534 0.484 415 +417 4 232.2091 282.4399 31.2385 0.4957 416 +418 4 231.2299 281.8747 30.903 0.4888 417 +419 4 230.1797 281.4274 30.8031 0.4555 418 +420 4 229.134 280.9675 30.7997 0.4253 419 +421 4 228.1502 280.3887 30.7994 0.4057 420 +422 4 227.2796 279.6542 30.7975 0.3871 421 +423 4 226.5726 278.7631 30.7852 0.3607 422 +424 4 225.9 277.8387 30.7269 0.3432 423 +425 4 225.0648 277.0894 30.4416 0.3708 424 +426 4 224.0375 276.6547 30.0476 0.4285 425 +427 4 222.9462 276.3401 30.0675 0.4576 426 +428 4 221.9028 275.9088 30.4612 0.4299 427 +429 4 220.9075 275.3619 30.7292 0.386 428 +430 4 219.9935 274.6836 30.7406 0.3756 429 +431 4 219.3174 273.7912 30.5004 0.3954 430 +432 4 218.9639 272.7319 30.0583 0.3926 431 +433 4 218.6756 271.6359 29.7497 0.3742 432 +434 4 218.1597 270.6292 29.68 0.3615 433 +435 4 217.3692 269.8204 29.68 0.3993 434 +436 4 216.375 269.2782 29.6797 0.4395 435 +437 4 215.358 268.7622 29.6786 0.4595 436 +438 4 214.4645 268.0586 29.6713 0.4555 437 +439 4 213.7633 267.1652 29.6344 0.4671 438 +440 4 213.102 266.2363 29.4742 0.4904 439 +441 4 212.363 265.3851 29.05 0.4957 440 +442 4 211.5565 264.5912 28.6854 0.4658 441 +443 4 210.7317 263.8007 28.5928 0.4149 442 +444 4 209.9251 262.9907 28.6689 0.3566 443 +445 4 209.1186 262.1876 28.9489 0.3154 444 +446 4 208.208 261.5184 29.2177 0.3051 445 +447 4 207.2264 260.9624 28.954 0.3281 446 +448 4 206.2678 260.3938 28.3296 0.3662 447 +449 4 205.316 259.8035 27.764 0.389 448 +450 4 204.387 259.1515 27.4935 0.4018 449 +451 4 203.5393 258.3873 27.4383 0.399 450 +452 4 202.7751 257.5373 27.4187 0.394 451 +453 4 202.0567 256.6484 27.3255 0.3784 452 +454 4 201.3028 255.8007 27.0217 0.3686 453 +455 4 200.4666 255.0342 26.6798 0.3686 454 +456 4 199.5388 254.3856 26.7848 0.3686 455 +457 4 198.6018 253.7381 27.0346 0.3445 456 +458 4 197.7427 253.007 26.7708 0.3062 457 +459 4 196.8904 252.2692 26.2962 0.276 458 +460 4 195.9317 251.6834 25.8591 0.2834 459 +461 4 194.9387 251.148 25.4038 0.3091 460 +462 4 194.099 250.3987 25.2151 0.3433 461 +463 4 193.4184 249.4824 25.1972 0.3559 462 +464 4 192.7949 248.5237 25.1854 0.3644 463 +465 4 192.1577 247.5742 25.1272 0.3772 464 +466 4 191.4129 246.715 24.9248 0.3986 465 +467 4 190.5675 245.9634 24.5428 0.4068 466 +468 4 189.7267 245.2015 24.2012 0.3981 467 +469 4 189.0025 244.3241 24.0878 0.3766 468 +470 4 188.4191 243.3425 24.0755 0.3599 469 +471 4 187.8334 242.361 24.0565 0.3383 470 +472 4 187.06 241.5304 23.9554 0.3305 471 +473 4 186.1368 240.8784 23.6239 0.3394 472 +474 4 185.1907 240.2823 23.0392 0.3521 473 +475 4 184.2687 239.6577 22.4062 0.347 474 +476 4 183.3454 239.0182 21.8744 0.3163 475 +477 4 182.3982 238.4016 21.4458 0.2961 476 +478 4 181.459 237.7621 21.1324 0.3016 477 +479 4 180.625 236.9922 21.2453 0.3327 478 +480 4 179.8185 236.1971 21.6258 0.3525 479 +481 4 178.941 235.4741 21.9047 0.3652 480 +482 4 177.9709 234.8872 22.2057 0.3592 481 +483 4 176.8818 234.6493 22.636 0.3463 482 +484 4 175.7459 234.6138 22.9093 0.3139 483 +485 4 174.6408 234.3587 22.972 0.2851 484 +486 4 173.6649 233.7787 23.0171 0.2898 485 +487 4 172.7863 233.0522 23.2008 0.3227 486 +488 4 171.9089 232.3372 23.5858 0.3709 487 +489 4 171.0383 231.6097 23.9509 0.4117 488 +490 4 170.2055 230.8306 24.1494 0.4297 489 +491 4 169.3967 230.0298 24.4166 0.422 490 +492 4 168.5947 229.2336 24.8441 0.3991 491 +493 4 167.7779 228.4408 25.132 0.3838 492 +494 4 166.9119 227.696 25.1961 0.3813 493 +495 4 165.9486 227.0829 25.2 0.3504 494 +496 4 164.9179 226.5886 25.1997 0.3226 495 +497 4 163.9386 226.0006 25.1994 0.2865 496 +498 4 163.1699 225.1644 25.1975 0.2902 497 +499 4 162.5075 224.2332 25.1877 0.2924 498 +500 4 161.7662 223.3637 25.1462 0.3137 499 +501 4 160.9551 222.5629 24.92 0.3391 500 +502 4 160.1474 221.7724 24.4986 0.3645 501 +503 4 159.3226 220.9899 24.1842 0.3792 502 +504 4 158.4005 220.3184 24.089 0.3813 503 +505 4 157.4052 219.7544 24.08 0.3813 504 +506 4 156.4763 219.0897 24.08 0.3704 505 +507 4 155.6309 218.321 24.08 0.3577 506 +508 4 154.7397 217.6048 24.08 0.3342 507 +509 4 153.7753 216.9905 24.08 0.3087 508 +510 4 152.7686 216.4482 24.0803 0.2831 509 +511 4 151.8202 215.811 24.0811 0.2796 510 +512 4 151.0194 214.9976 24.0853 0.3129 511 +513 4 150.2587 214.1431 24.1032 0.362 512 +514 4 149.4544 213.3308 24.1749 0.4019 513 +515 4 148.5964 212.5838 24.4712 0.4179 514 +516 4 147.727 211.8619 24.8931 0.4084 515 +517 4 146.9365 211.0428 25.1381 0.3621 516 +518 4 146.2307 210.1448 25.0807 0.2887 517 +519 4 145.4665 209.3154 24.6375 0.2345 518 +520 4 144.525 208.7308 23.9929 0.2288 519 +521 4 143.4782 208.2812 23.8067 0.2863 520 +522 4 142.4955 207.7001 23.9106 0.3387 521 +523 4 141.6775 206.9118 23.6776 0.3899 522 +524 4 140.9751 206.0264 23.2506 0.394 523 +525 4 140.3082 205.102 23.0317 0.3823 524 +526 4 139.6904 204.1399 23.0759 0.3578 525 +527 4 139.028 203.2236 23.4875 0.3441 526 +528 4 138.2261 202.4285 23.9173 0.3195 527 +529 4 137.2686 201.8085 24.0394 0.3059 528 +530 4 136.279 201.2365 23.9515 0.2932 529 +531 4 135.3638 200.5729 23.5306 0.3282 530 +532 4 134.5401 199.7859 23.3173 0.3305 531 +533 4 133.8194 198.8981 23.2876 0.3305 532 +534 4 133.1467 197.9898 22.8595 0.2823 533 +535 4 132.5736 197.0346 22.2306 0.2556 534 +536 4 131.8849 196.1308 21.9187 0.2058 535 +537 4 130.9319 195.505 21.9433 0.2034 536 +538 4 130.0019 194.8747 22.4608 0.2034 537 +539 4 129.3052 193.9835 22.8472 0.2651 538 +540 4 128.6371 193.0546 22.8894 0.2793 539 +541 4 128.2092 192.0021 22.5851 0.3169 540 +542 4 127.9427 190.9691 23.571 0.3178 541 +543 4 127.0492 190.309 24.2091 0.4576 542 +544 4 126.3559 189.8857 23.1672 0.3814 543 +545 4 125.5185 189.1124 22.9373 0.3559 544 +546 4 124.7212 188.2932 22.8298 0.3559 545 +547 4 123.9936 187.4318 22.3429 0.3559 546 +548 4 123.2568 186.6573 21.3503 0.3559 547 +549 4 122.3794 185.9606 20.7827 0.3559 548 +550 4 121.5603 185.1633 20.7211 0.394 549 +551 4 120.7561 184.3499 20.72 0.4449 550 +552 4 119.9678 183.5193 20.72 0.4322 551 +553 4 119.2826 182.6041 20.72 0.394 552 +554 4 118.5481 181.7267 20.72 0.3432 553 +555 4 117.7073 180.9511 20.72 0.3686 554 +556 4 116.7715 180.2933 20.72 0.3686 555 +557 4 115.9558 179.4913 20.72 0.3559 556 +558 4 115.3026 178.5521 20.72 0.3178 557 +559 4 114.7718 177.5385 20.72 0.3178 558 +560 4 113.9426 176.7503 20.7206 0.3305 559 +561 4 113.1704 176.2057 20.7239 0.3827 560 +562 4 112.2468 175.5308 20.7393 0.3836 561 +563 4 111.3422 174.8318 20.8261 0.3501 562 +564 4 110.4583 174.1122 21.063 0.312 563 +565 4 109.5664 173.4007 21.2691 0.2632 564 +566 4 108.6763 172.6857 21.4334 0.2017 565 +567 4 107.8196 171.9283 21.4046 0.1586 566 +568 4 106.9002 171.3209 20.7239 0.1416 567 +569 4 105.8424 170.9228 20.4058 0.1622 568 +570 4 104.7627 170.5464 20.3899 0.1765 569 +571 4 103.6407 170.3313 20.4075 0.2009 570 +572 4 102.516 170.194 20.7738 0.2264 571 +573 4 101.4505 169.8257 21.2038 0.2752 572 +574 4 100.4498 169.2754 21.1982 0.303 573 +575 4 99.4651 168.7068 20.8967 0.2934 574 +576 4 98.4155 168.2595 20.7446 0.2453 575 +577 4 97.289 168.0753 20.7354 0.2059 576 +578 4 96.1939 167.7482 20.8124 0.2034 577 +579 4 95.1674 167.2585 21.0865 0.1914 578 +580 4 94.0562 166.9988 20.9818 0.1786 579 +581 4 92.9713 166.6465 20.7757 0.1535 580 +582 4 92.0816 165.9326 20.778 0.1773 581 +583 4 91.1472 165.2863 21.0918 0.2274 582 +584 4 90.2014 164.6433 21.1851 0.2908 583 +585 4 89.3954 163.846 21.5404 0.3172 584 +586 4 88.3424 163.4101 21.7148 0.3178 585 +587 4 87.227 163.2374 21.2702 0.3052 586 +588 4 86.1868 162.7981 20.8211 0.3303 587 +589 4 85.2756 162.1082 20.7228 0.3557 588 +590 4 84.4582 161.3086 20.7175 0.3559 589 +591 4 83.696 160.4552 20.7091 0.2929 590 +592 4 83.4217 159.3455 20.6192 0.2035 591 +593 4 83.7408 158.3296 19.6 0.1144 592 +594 4 112.9716 175.9987 21.6857 0.3463 560 +595 4 112.3254 175.0755 21.84 0.294 594 +596 4 112.0351 173.9818 21.8406 0.2397 595 +597 4 111.7511 172.8744 21.8431 0.2185 596 +598 4 111.0932 171.9581 21.8627 0.2582 597 +599 4 110.3967 171.0532 22.0038 0.3204 598 +600 4 109.939 170.0224 22.3846 0.3521 599 +601 4 109.4909 168.9837 22.787 0.3559 600 +602 4 108.7492 168.1268 22.9446 0.3559 601 +603 4 107.7769 167.5342 22.9639 0.3783 602 +604 4 106.7066 167.1361 22.9849 0.3925 603 +605 4 105.6133 166.8055 23.1213 0.4053 604 +606 4 104.5667 166.3731 23.5024 0.3954 605 +607 4 103.6127 165.7645 23.8829 0.3827 606 +608 4 102.7241 165.0472 23.9728 0.3358 607 +609 4 101.7701 164.418 23.9137 0.2962 608 +610 4 100.76 163.8826 23.9557 0.2694 609 +611 4 99.829 163.2213 24.0495 0.2555 610 +612 4 98.9531 162.4858 24.0951 0.2312 611 +613 4 97.9642 161.916 24.1878 0.2172 612 +614 4 96.8823 161.5969 24.6061 0.2044 613 +615 4 95.7951 161.2857 25.0331 0.2034 614 +616 4 94.9175 160.5684 25.1849 0.1914 615 +617 4 94.1179 159.7504 25.1994 0.2027 616 +618 4 93.2906 158.9599 25.2 0.2154 617 +619 4 92.5872 158.0585 25.2 0.2161 618 +620 4 92.0293 157.0609 25.2006 0.204 619 +621 4 91.4189 156.0931 25.2025 0.1793 620 +622 4 90.652 155.2454 25.2106 0.1658 621 +623 4 89.7715 154.5166 25.2552 0.1409 622 +624 4 88.9659 153.733 25.7701 0.1277 623 +625 4 87.8592 153.7536 26.32 0.1144 624 +626 4 127.3878 189.7118 21.6006 0.2342 543 +627 4 127.7791 188.9911 20.5702 0.1568 626 +628 4 127.977 187.9134 21.2559 0.1217 627 +629 4 128.1051 186.8083 21.7804 0.1144 628 +630 4 128.6794 185.9137 21.8638 0.121 629 +631 4 129.6392 185.8794 21.0445 0.1349 630 +632 4 130.5315 186.4777 20.2124 0.1478 631 +633 4 131.4742 187.0943 19.9343 0.144 632 +634 4 132.4946 187.1309 20.6651 0.1303 633 +635 4 133.2954 186.512 21.8061 0.1173 634 +636 4 133.9818 185.6346 21.8011 0.1144 635 +637 4 134.8513 185.0283 20.8659 0.1144 636 +638 4 135.9129 184.6473 20.5862 0.1144 637 +639 4 136.6863 183.8316 20.683 0.1144 638 +640 4 137.145 182.7883 20.7085 0.1144 639 +641 4 137.2182 181.6523 20.6573 0.1144 640 +642 4 136.3385 180.9911 20.3974 0.1144 641 +643 4 135.4496 181.6672 20.72 0.1144 642 +644 4 346.4764 380.3869 43.5758 0.1526 280 +645 4 346.1401 379.5426 45.2712 0.1271 644 +646 4 345.5555 378.561 45.418 0.1145 645 +647 4 344.6986 377.8209 45.7789 0.1273 646 +648 4 343.6267 377.6069 46.5976 0.1401 647 +649 4 342.5639 377.3553 47.4032 0.1652 648 +650 4 341.7563 376.6631 48.4263 0.1657 649 +651 4 340.8926 375.9401 48.9006 0.1775 650 +652 4 339.8858 375.4539 49.4724 0.1652 651 +653 4 338.8448 375.2549 50.521 0.1646 652 +654 4 337.7809 375.2446 51.5494 0.1538 653 +655 4 336.7067 375.3018 52.498 0.1798 654 +656 4 335.6164 375.5054 53.1698 0.2175 655 +657 4 334.5182 375.82 53.2846 0.2408 656 +658 4 333.3879 375.971 53.3708 0.2259 657 +659 4 332.2542 375.8841 53.5382 0.1885 658 +660 4 331.1445 376.1586 53.6413 0.164 659 +661 4 330.0486 376.4652 53.7569 0.1525 660 +662 4 328.94 376.511 54.3987 0.1525 661 +663 4 327.8418 376.3199 55.0214 0.1506 662 +664 4 326.7184 376.2273 55.4316 0.1374 663 +665 4 325.5847 376.2078 55.2255 0.1246 664 +666 4 324.4853 376.3691 54.565 0.1144 665 +667 4 323.3916 376.6151 54.0952 0.1144 666 +668 4 322.3426 377.059 54.04 0.1178 667 +669 4 321.3324 377.5703 54.0921 0.1376 668 +670 4 320.3829 378.0165 54.5496 0.1834 669 +671 4 319.6828 378.7521 55.2241 0.2432 670 +672 4 318.5948 379.0701 55.1312 0.2669 671 +673 4 317.5755 379.5655 55.1396 0.2571 672 +674 4 316.7004 380.0677 53.9636 0.2542 673 +675 4 315.8458 380.7266 54.3424 0.2757 674 +676 4 315.1228 381.5995 54.5124 0.268 675 +677 4 314.2248 382.1658 53.5601 0.2551 676 +678 4 313.4377 382.9483 52.9217 0.2063 677 +679 4 312.4813 383.5695 52.8906 0.1668 678 +680 4 311.8544 384.0408 54.88 0.1144 679 +681 4 379.3618 398.12 45.3169 0.2171 202 +682 4 379.0438 397.0847 45.0506 0.2155 681 +683 4 379.204 396.0288 44.1857 0.2288 682 +684 4 379.7725 395.1582 43.4168 0.242 683 +685 4 380.5825 394.6011 42.2982 0.2474 684 +686 4 381.3993 394.1721 40.6588 0.2415 685 +687 4 382.3545 393.7099 39.8367 0.2347 686 +688 4 383.431 393.3495 39.5895 0.2219 687 +689 4 384.4595 392.9491 39.004 0.2092 688 +690 4 385.3999 392.4458 37.9982 0.2034 689 +691 4 386.3791 391.9493 37.3512 0.2242 690 +692 4 387.4007 391.4436 37.1232 0.2623 691 +693 4 388.3937 390.9014 36.7441 0.2796 692 +694 4 389.294 390.2344 36.2533 0.2655 693 +695 4 389.9873 389.3638 35.758 0.24 694 +696 4 390.5776 388.4029 35.299 0.2288 695 +697 4 391.3613 387.6158 34.8804 0.2288 696 +698 4 392.3371 387.0564 34.433 0.2215 697 +699 4 393.345 386.5301 34.1835 0.2161 698 +700 4 394.3299 385.9501 34.088 0.2087 699 +701 4 395.3492 385.4616 33.7744 0.2186 700 +702 4 396.3216 384.964 33.0114 0.2441 701 +703 4 397.2483 384.3794 32.2218 0.2931 702 +704 4 398.1486 383.6987 31.9332 0.3256 703 +705 4 399.0215 382.9597 31.9052 0.3227 704 +706 4 399.8188 382.144 31.8102 0.2858 705 +707 4 400.2341 381.1465 31.2612 0.2669 706 +708 4 400.3554 380.1272 30.0684 0.2669 707 +709 4 400.8393 379.1811 29.3429 0.2572 708 +710 4 401.5474 378.2911 29.3877 0.2345 709 +711 4 402.4878 377.6767 29.2006 0.2184 710 +712 4 403.5574 377.8335 28.6961 0.2384 711 +713 4 404.5756 378.3048 28.1753 0.2415 712 +714 4 405.6704 378.2339 27.5688 0.2534 713 +715 4 406.6325 377.6756 26.9805 0.2662 714 +716 4 407.5752 377.0532 26.5255 0.2909 715 +717 4 408.3783 376.2444 26.3754 0.3044 716 +718 4 409.0132 375.2972 26.5356 0.2809 717 +719 4 409.6881 374.3877 26.9416 0.2555 718 +720 4 410.3642 373.4702 26.7484 0.2421 719 +721 4 411.0804 372.5882 26.4272 0.278 720 +722 4 411.8411 371.7348 26.3301 0.3283 721 +723 4 412.5241 370.8173 26.3203 0.3792 722 +724 4 413.151 369.8609 26.3197 0.3934 723 +725 4 413.9667 369.0601 26.3189 0.3818 724 +726 4 414.9768 368.5259 26.3144 0.3445 725 +727 4 416.0591 368.1586 26.2828 0.3186 726 +728 4 417.0738 367.6358 26.1223 0.3302 727 +729 4 417.9432 366.9574 25.3898 0.3305 728 +730 4 418.3802 365.9656 24.5244 0.3305 729 +731 4 418.4272 364.9268 23.3587 0.293 730 +732 4 418.2281 363.8114 22.9908 0.2924 731 +733 4 418.3208 362.672 22.9393 0.2924 732 +734 4 418.7623 361.6184 22.8326 0.267 733 +735 4 419.2154 360.5934 22.265 0.229 734 +736 4 420.0676 359.8315 22.2432 0.1781 735 +737 4 421.1956 359.6782 22.4848 0.1652 736 +738 4 422.136 359.6736 24.08 0.1144 737 +739 4 380.0368 399.0386 46.48 0.4576 200 +740 4 392.4503 408.7638 48.701 0.4322 186 +741 4 391.5546 409.4754 48.6262 0.4068 740 +742 4 390.7446 410.2704 48.274 0.394 741 +743 4 390.1292 410.815 46.3336 0.2555 742 +744 4 389.5457 411.5094 44.688 0.1694 743 +745 4 389.1991 412.4726 43.5781 0.1525 744 +746 4 388.92 413.5411 42.8999 0.1674 745 +747 4 388.6465 414.6211 42.2834 0.178 746 +748 4 388.7552 415.669 41.421 0.1615 747 +749 4 389.3947 416.5498 40.8906 0.144 748 +750 4 390.0983 417.4364 40.5482 0.1578 749 +751 4 390.295 418.4924 39.94 0.2126 750 +752 4 390.0617 419.562 39.2101 0.2958 751 +753 4 389.8558 420.6591 38.6232 0.3664 752 +754 4 389.9679 421.7596 38.0198 0.4112 753 +755 4 390.3271 422.7846 37.1792 0.3796 754 +756 4 390.835 423.7765 36.5828 0.3281 755 +757 4 391.3246 424.8061 36.5327 0.2767 756 +758 4 391.3761 425.9284 36.4353 0.2669 757 +759 4 391.089 426.879 35.1607 0.2556 758 +760 4 390.7996 427.7336 33.4407 0.2428 759 +761 4 390.4518 428.7083 32.2736 0.2299 760 +762 4 390.3591 429.834 31.983 0.2407 761 +763 4 390.5433 430.9608 32.0734 0.2534 762 +764 4 390.8053 432.0739 32.0765 0.2781 763 +765 4 391.1645 433.1562 31.8752 0.2796 764 +766 4 391.4116 434.2601 31.4672 0.2676 765 +767 4 391.4871 435.3835 30.9809 0.2549 766 +768 4 391.5843 436.5172 30.686 0.2662 767 +769 4 391.7548 437.6212 30.091 0.3033 768 +770 4 391.7399 438.7492 29.636 0.3051 769 +771 4 391.5168 439.8463 30.1574 0.2683 770 +772 4 391.3052 440.9617 30.4965 0.2178 771 +773 4 391.3796 442.0736 29.8945 0.2161 772 +774 4 391.3166 443.1547 28.9971 0.2409 773 +775 4 390.8613 444.2003 28.8926 0.2541 774 +776 4 390.5994 445.302 29.2936 0.2416 775 +777 4 390.5319 446.4071 28.6017 0.2415 776 +778 4 390.342 447.5305 28.3536 0.2668 777 +779 4 389.8374 448.5544 28.5309 0.2924 778 +780 4 389.6132 449.6767 28.5538 0.3051 779 +781 4 389.3478 450.7886 28.5211 0.3051 780 +782 4 389.2586 451.9269 28.3212 0.3051 781 +783 4 389.5331 452.9931 27.5587 0.3051 782 +784 4 389.953 454.041 27.1152 0.2924 783 +785 4 390.096 455.1747 26.9539 0.2669 784 +786 4 390.0708 456.3096 27.2908 0.2288 785 +787 4 389.8741 457.4147 26.7512 0.2034 786 +788 4 389.6098 458.5152 27.1622 0.1907 787 +789 4 389.2243 459.8663 26.3494 0.2465 788 +790 4 388.8685 460.9096 25.5976 0.2748 789 +791 4 388.8856 462.0227 25.1664 0.3004 790 +792 4 389.2254 463.0981 24.7836 0.2947 791 +793 4 389.6384 464.1162 24.0285 0.2715 792 +794 4 389.9141 465.1859 23.315 0.235 793 +795 4 389.7768 466.3036 23.1669 0.218 794 +796 4 389.8386 467.4327 23.4486 0.238 795 +797 4 389.969 468.5584 23.1613 0.2747 796 +798 4 389.81 469.6806 22.9076 0.2796 797 +799 4 389.7688 470.8166 22.6212 0.235 798 +800 4 390.0033 471.9183 22.1945 0.1951 799 +801 4 390.0697 473.0406 22.58 0.1786 800 +802 4 389.3741 473.8711 23.3666 0.1902 801 +803 4 388.658 474.7497 23.5922 0.191 802 +804 4 388.5836 475.8834 23.7726 0.2034 803 +805 4 388.1775 476.9119 24.4751 0.2034 804 +806 4 387.6696 477.9106 24.9782 0.2034 805 +807 4 387.3881 479.0145 25.1429 0.2099 806 +808 4 387.2623 480.1482 25.0096 0.2481 807 +809 4 387.2749 481.2831 24.8349 0.2796 808 +810 4 387.5826 482.3813 24.9421 0.2699 809 +811 4 388.0459 483.4224 25.1451 0.2166 810 +812 4 388.6225 484.4096 25.2109 0.1578 811 +813 4 389.1659 485.4038 25.279 0.1246 812 +814 4 389.4187 486.5169 25.4892 0.1144 813 +815 4 389.7448 487.5957 25.5598 0.1199 814 +816 4 390.3786 488.5441 25.3453 0.1486 815 +817 4 390.9254 489.5405 25.2392 0.1957 816 +818 4 391.2434 490.6364 25.3142 0.2662 817 +819 4 391.4104 491.7621 25.5388 0.3112 818 +820 4 391.4002 492.8935 25.8821 0.3184 819 +821 4 391.1816 494.0067 26.1274 0.2674 820 +822 4 390.8876 495.1026 26.0982 0.2194 821 +823 4 390.8705 496.2375 26.2539 0.197 822 +824 4 390.835 497.3426 26.7949 0.2225 823 +825 4 390.4472 498.4065 26.7924 0.2512 824 +826 4 389.8489 499.3709 26.4802 0.2796 825 +827 4 389.2208 500.3204 26.5854 0.2764 826 +828 4 388.6099 501.2642 27.0738 0.2604 827 +829 4 388.0928 502.2675 27.1432 0.235 828 +830 4 387.8446 503.3657 26.7176 0.2161 829 +831 4 387.7405 504.4948 26.6395 0.2194 830 +832 4 387.5998 505.6125 26.9097 0.2422 831 +833 4 387.6753 506.7371 26.5818 0.2898 832 +834 4 388.0002 507.8273 26.3141 0.3212 833 +835 4 388.3914 508.8992 26.1254 0.3271 834 +836 4 388.8033 509.9517 25.7118 0.3076 835 +837 4 389.2174 511.0008 25.289 0.2727 836 +838 4 389.5755 512.0864 25.2039 0.2439 837 +839 4 389.9953 513.1401 25.2 0.2195 838 +840 4 390.6291 514.0919 25.2 0.2322 839 +841 4 391.2114 515.0757 25.2003 0.2521 840 +842 4 391.86 515.9852 25.2011 0.2869 841 +843 4 392.7775 516.667 25.2056 0.3199 842 +844 4 393.6058 517.4518 25.2263 0.3744 843 +845 4 394.3837 518.2846 25.3154 0.4307 844 +846 4 395.2978 518.9481 25.5948 0.4576 845 +847 4 396.3285 519.408 25.8216 0.4459 846 +848 4 397.3924 519.7981 25.4624 0.4156 847 +849 4 398.4952 520.0372 25.2025 0.4068 848 +850 4 399.6392 520.0544 25.2126 0.4028 849 +851 4 400.781 520.0178 25.2834 0.3781 850 +852 4 401.9101 519.9171 25.5906 0.3271 851 +853 4 403.0175 519.9057 26.1069 0.2841 852 +854 4 404.1317 520.1345 26.3208 0.2669 853 +855 4 405.2231 520.417 26.3948 0.2617 854 +856 4 406.1841 520.9913 26.9097 0.2446 855 +857 4 407.1096 521.537 26.199 0.219 856 +858 4 407.8612 522.0827 24.5846 0.2043 857 +859 4 408.4103 523.0139 25.1924 0.1914 858 +860 4 408.9136 524.0378 25.2115 0.1907 859 +861 4 409.147 525.1555 25.2067 0.1781 860 +862 4 408.8656 526.24 25.76 0.1144 861 +863 4 390.6039 411.3389 48.1779 0.3566 742 +864 4 390.5547 412.46 47.6462 0.3559 863 +865 4 390.4952 413.5674 46.9557 0.331 864 +866 4 390.231 414.6691 46.571 0.293 865 +867 4 389.9942 415.7879 46.548 0.2672 866 +868 4 390.0457 416.9194 46.9353 0.2921 867 +869 4 390.0331 418.0462 47.4169 0.3176 868 +870 4 389.7322 419.1456 47.2021 0.3556 869 +871 4 389.2723 420.1649 46.6166 0.3685 870 +872 4 388.8056 421.2025 46.3445 0.3686 871 +873 4 388.3777 422.1829 45.3513 0.356 872 +874 4 388.0368 423.2731 45.2281 0.3432 873 +875 4 387.387 424.2146 45.192 0.3305 874 +876 4 386.7326 425.1253 44.6359 0.3178 875 +877 4 386.0245 426.0107 44.268 0.3178 876 +878 4 385.282 426.8813 44.2333 0.3432 877 +879 4 384.7741 427.9063 44.1997 0.3559 878 +880 4 384.567 429.0275 43.9858 0.3432 879 +881 4 384.265 430.0685 43.0884 0.3051 880 +882 4 383.685 430.9299 41.916 0.2669 881 +883 4 382.7515 431.4745 40.9998 0.2288 882 +884 4 381.8031 432.1128 40.873 0.2161 883 +885 4 381.047 432.9708 40.8422 0.2415 884 +886 4 380.4887 433.2786 40.5574 0.2247 885 +887 4 379.4671 433.7396 40.2447 0.1924 886 +888 4 378.402 434.1034 40.4729 0.1614 887 +889 4 377.5211 434.8024 40.7344 0.1486 888 +890 4 376.8496 435.7096 40.4844 0.1398 889 +891 4 376.2479 436.6213 39.6752 0.1438 890 +892 4 375.5924 437.4942 38.8623 0.1644 891 +893 4 375.065 438.4689 38.2553 0.1947 892 +894 4 374.6657 439.5111 37.7121 0.2034 893 +895 4 374.0686 440.472 37.5424 0.2034 894 +896 4 373.2918 441.3117 37.5435 0.2115 895 +897 4 372.5974 442.2052 37.7194 0.2369 896 +898 4 372.0585 443.2028 38.0089 0.2542 897 +899 4 371.4808 444.182 37.8302 0.2501 898 +900 4 370.8345 445.1132 37.4766 0.2374 899 +901 4 370.2762 446.0959 37.1406 0.2247 900 +902 4 369.8495 447.1324 36.6148 0.2161 901 +903 4 369.4273 448.1872 36.4098 0.2161 902 +904 4 368.9263 449.2133 36.37 0.2245 903 +905 4 368.471 450.2578 36.2093 0.2457 904 +906 4 367.9035 451.2405 35.999 0.2625 905 +907 4 367.1817 452.1168 36.1917 0.2796 906 +908 4 366.3363 452.8753 36.4896 0.2754 907 +909 4 365.516 453.6452 36.8309 0.2543 908 +910 4 364.8674 454.5581 37.3397 0.2246 909 +911 4 364.3045 455.5477 37.403 0.2119 910 +912 4 363.8412 456.591 37.2375 0.1992 911 +913 4 363.3882 457.6389 37.2792 0.1821 912 +914 4 362.974 458.6948 37.3859 0.1652 913 +915 4 362.4306 459.6134 37.0185 0.1794 914 +916 4 361.4697 460.2083 36.5907 0.2238 915 +917 4 360.5144 460.8261 36.4112 0.2768 916 +918 4 359.6862 461.58 36.0898 0.3051 917 +919 4 359.4162 462.5512 35.3545 0.2844 918 +920 4 359.4093 463.6552 35.3354 0.2298 919 +921 4 358.906 464.6047 35.8495 0.1869 920 +922 4 357.9954 465.2659 35.9901 0.1952 921 +923 4 357.1156 465.9798 35.791 0.2298 922 +924 4 356.4361 466.8836 35.9243 0.2505 923 +925 4 355.7062 467.7438 36.318 0.2359 924 +926 4 354.8608 468.4932 36.1474 0.2102 925 +927 4 353.8198 468.9164 36.0522 0.2131 926 +928 4 352.8805 469.5228 36.4081 0.2476 927 +929 4 351.9184 470.0822 35.9341 0.2866 928 +930 4 351.0536 470.8121 35.6325 0.3035 929 +931 4 350.1933 471.511 34.9625 0.2822 930 +932 4 349.3902 472.3187 34.9149 0.2453 931 +933 4 348.8262 473.3094 34.869 0.1949 932 +934 4 347.9053 473.9523 34.5229 0.1781 933 +935 4 347.1743 474.7257 33.5504 0.193 934 +936 4 346.465 475.6066 33.8506 0.2298 935 +937 4 345.496 476.1866 34.2919 0.2415 936 +938 4 344.5614 476.8341 34.4655 0.2369 937 +939 4 343.5009 477.2448 34.5794 0.2034 938 +940 4 342.4747 477.6623 34.8953 0.2034 939 +941 4 341.6087 478.3098 34.3902 0.2224 940 +942 4 340.8926 479.1964 34.4232 0.2482 941 +943 4 340.1581 480.0602 34.3064 0.2614 942 +944 4 339.2726 480.7511 34.1312 0.2669 943 +945 4 338.3163 481.3357 33.71 0.2595 944 +946 4 337.297 481.7956 33.3239 0.2384 945 +947 4 336.209 481.9844 33.8027 0.2114 946 +948 4 335.1874 482.4111 34.0138 0.1943 947 +949 4 334.2242 483.022 34.2079 0.2001 948 +950 4 333.2014 483.4475 33.7554 0.2134 949 +951 4 332.1387 483.8331 33.3715 0.2264 950 +952 4 331.0908 484.2072 33.8948 0.2392 951 +953 4 329.9891 484.3696 34.4868 0.2523 952 +954 4 328.8668 484.5652 34.51 0.2542 953 +955 4 327.9139 485.1326 33.9032 0.2186 954 +956 4 327.5272 486.0856 32.76 0.1144 955 +957 4 380.7495 433.8506 41.6178 0.2988 885 +958 4 380.7552 434.9763 41.2754 0.2784 957 +959 4 380.6797 436.0939 41.1158 0.2525 958 +960 4 380.3136 437.159 40.8867 0.2341 959 +961 4 380.0105 438.2161 40.213 0.2288 960 +962 4 379.816 439.3166 40.1349 0.2211 961 +963 4 379.5643 440.4263 40.311 0.208 962 +964 4 378.9569 441.3609 40.2483 0.1866 963 +965 4 378.2693 442.267 40.0428 0.178 964 +966 4 377.6744 443.2382 39.8028 0.1865 965 +967 4 377.1631 444.2552 39.5368 0.2079 966 +968 4 376.8256 445.3306 39.1524 0.2161 967 +969 4 376.4607 446.406 38.8755 0.2073 968 +970 4 375.9516 447.4138 39.1499 0.2034 969 +971 4 375.4528 448.4205 39.6634 0.2123 970 +972 4 374.9449 449.4021 40.3735 0.2344 971 +973 4 374.4003 450.3676 41.0598 0.2601 972 +974 4 373.85 451.3526 41.5148 0.2858 973 +975 4 373.492 452.4017 41.1093 0.2924 974 +976 4 373.4782 453.5182 41.3106 0.2714 975 +977 4 373.1808 454.6073 41.3417 0.2456 976 +978 4 372.9509 455.7067 40.8579 0.2309 977 +979 4 373.0653 456.8049 40.2142 0.2177 978 +980 4 373.079 457.9409 40.3046 0.2048 979 +981 4 372.7861 459.0392 40.1565 0.2034 980 +982 4 372.6546 460.1637 40.4922 0.2272 981 +983 4 372.9131 461.2196 39.7057 0.2534 982 +984 4 373.1064 462.3453 39.7205 0.2542 983 +985 4 372.7941 463.3966 40.4712 0.2542 984 +986 4 372.5413 464.5075 40.7011 0.2559 985 +987 4 372.3102 465.608 40.5672 0.2669 986 +988 4 371.8492 466.5655 39.6864 0.2693 987 +989 4 371.5357 467.6626 39.7804 0.2854 988 +990 4 371.3115 468.7792 39.674 0.3083 989 +991 4 371.2783 469.9072 39.9708 0.3143 990 +992 4 371.387 471.0168 40.5241 0.294 991 +993 4 371.2692 472.1311 40.9777 0.2591 992 +994 4 371.0793 473.2202 41.3644 0.2331 993 +995 4 370.9798 474.2772 42.3032 0.2115 994 +996 4 370.99 475.4018 42.3368 0.1987 995 +997 4 370.9683 476.5046 42.1912 0.1907 996 +998 4 370.648 477.5903 42.5166 0.1961 997 +999 4 370.5107 478.6004 41.8214 0.2096 998 +1000 4 370.9226 479.5248 41.256 0.2306 999 +1001 4 371.0953 480.5772 41.4971 0.2415 1000 +1002 4 371.0907 481.7121 41.3619 0.2415 1001 +1003 4 371.244 482.8286 40.922 0.2415 1002 +1004 4 371.4705 483.9417 40.7557 0.2495 1003 +1005 4 371.6147 485.0606 40.4323 0.2542 1004 +1006 4 371.9899 486.1119 40.2699 0.2372 1005 +1007 4 372.2793 487.1873 40.6913 0.201 1006 +1008 4 371.9464 488.2295 41.0458 0.1713 1007 +1009 4 371.3115 489.1149 40.4113 0.1549 1008 +1010 4 370.6034 489.9775 39.8076 0.1635 1009 +1011 4 370.0451 490.887 38.8237 0.177 1010 +1012 4 369.3004 491.7164 39.2557 0.1902 1011 +1013 4 369.4308 492.8123 39.6791 0.1907 1012 +1014 4 369.7911 493.8408 39.0852 0.1931 1013 +1015 4 369.615 494.9276 38.3692 0.2061 1014 +1016 4 369.4617 495.9366 37.2761 0.2233 1015 +1017 4 369.8884 496.8953 36.4006 0.2368 1016 +1018 4 370.4844 497.8539 36.489 0.2179 1017 +1019 4 370.7933 498.9236 36.5674 0.1803 1018 +1020 4 370.4615 499.8022 35.32 0.1652 1019 +1021 4 369.7957 500.6567 34.9129 0.1746 1020 +1022 4 369.2729 501.6246 34.328 0.178 1021 +1023 4 369.1985 502.7216 33.7725 0.158 1022 +1024 4 369.3907 503.8165 33.1489 0.1311 1023 +1025 4 369.4914 504.9456 33.266 0.1271 1024 +1026 4 368.9652 505.9294 33.0036 0.1507 1025 +1027 4 368.0694 506.5838 32.3845 0.2002 1026 +1028 4 367.6633 507.5802 31.6674 0.2426 1027 +1029 4 368.384 508.4508 31.274 0.2796 1028 +1030 4 368.8839 509.4747 31.211 0.2811 1029 +1031 4 369.1951 510.5478 30.6636 0.2924 1030 +1032 4 369.2843 511.686 30.5648 0.294 1031 +1033 4 369.2123 512.8197 30.3052 0.3032 1032 +1034 4 369.2088 513.9294 29.6915 0.2903 1033 +1035 4 369.1985 515.0608 29.673 0.2796 1034 +1036 4 369.0006 516.1328 29.4476 0.2866 1035 +1037 4 369.6184 517.0274 29.2524 0.3152 1036 +1038 4 370.3105 517.8533 29.4585 0.336 1037 +1039 4 370.7178 518.8612 29.0654 0.331 1038 +1040 4 371.093 519.8176 27.8762 0.3044 1039 +1041 4 371.3275 520.8666 26.9713 0.281 1040 +1042 4 371.6147 521.8036 28.31 0.3162 1041 +1043 4 371.7794 522.8595 27.4417 0.3559 1042 +1044 4 372.372 523.8376 27.44 0.3432 1043 +1045 4 402.998 411.7439 49.9117 0.2104 176 +1046 4 402.9065 410.6091 50.197 0.1334 1045 +1047 4 402.8161 409.4754 50.4823 0.1176 1046 +1048 4 402.7246 408.3405 50.7676 0.1335 1047 +1049 4 402.6308 407.2068 51.0546 0.1589 1048 +1050 4 402.4054 406.0903 51.214 0.1845 1049 +1051 4 402.0943 404.9897 51.2406 0.1713 1050 +1052 4 401.981 403.8583 51.24 0.1554 1051 +1053 4 402.2384 402.7658 51.5623 0.1424 1052 +1054 4 402.4626 401.6561 51.3694 0.1502 1053 +1055 4 402.7795 400.6231 52.1175 0.1632 1054 +1056 4 403.2817 399.6118 52.1296 0.1868 1055 +1057 4 403.8675 398.6337 51.919 0.2346 1056 +1058 4 404.1363 397.5549 51.3584 0.2746 1057 +1059 4 404.3868 396.4498 50.983 0.3128 1058 +1060 4 404.698 395.3595 50.6094 0.3066 1059 +1061 4 405.2826 394.3951 50.9068 0.2706 1060 +1062 4 405.9152 393.4971 50.2082 0.196 1061 +1063 4 406.6909 392.8359 48.9544 0.1549 1062 +1064 4 407.4379 391.9859 49.0941 0.1644 1063 +1065 4 408.0625 391.0295 49.1697 0.2277 1064 +1066 4 408.1277 389.9347 49.9411 0.2667 1065 +1067 4 408.1586 388.7918 50.0346 0.2542 1066 +1068 4 408.8107 387.9315 49.1851 0.2116 1067 +1069 4 409.6401 387.1925 48.8877 0.1985 1068 +1070 4 410.2453 386.251 49.469 0.2374 1069 +1071 4 410.9111 385.3518 49.9341 0.2757 1070 +1072 4 411.7439 384.6071 50.4924 0.302 1071 +1073 4 412.6259 383.9001 50.6702 0.2893 1072 +1074 4 413.6498 383.4082 50.9382 0.2764 1073 +1075 4 414.5936 382.8064 50.8567 0.2595 1074 +1076 4 415.3452 381.9793 51.1249 0.2269 1075 +1077 4 416.098 381.1945 51.3178 0.1977 1076 +1078 4 416.8095 380.3285 50.8486 0.2147 1077 +1079 4 417.6801 379.6078 50.8813 0.279 1078 +1080 4 418.6948 379.1811 51.4172 0.3439 1079 +1081 4 419.7942 379.125 52.0374 0.3753 1080 +1082 4 420.873 378.9168 52.334 0.374 1081 +1083 4 421.9438 378.5679 52.7072 0.3606 1082 +1084 4 422.97 378.1618 53.3828 0.3393 1083 +1085 4 424.0144 377.7499 53.8605 0.3137 1084 +1086 4 425.099 377.4067 53.7905 0.2882 1085 +1087 4 426.1652 377.0018 53.6452 0.2534 1086 +1088 4 427.1479 376.4389 53.3512 0.2234 1087 +1089 4 428.1306 375.8658 53.4097 0.1876 1088 +1090 4 428.8559 375.0124 53.5718 0.178 1089 +1091 4 429.5903 374.1383 53.7032 0.1886 1090 +1092 4 430.1692 373.1945 53.1191 0.2128 1091 +1093 4 431.0592 372.5024 53.1194 0.2161 1092 +1094 4 432.0122 371.8709 53.1762 0.2161 1093 +1095 4 432.7283 371.0472 52.4185 0.2279 1094 +1096 4 433.8094 370.7384 52.2696 0.2641 1095 +1097 4 434.911 370.5061 51.7843 0.2787 1096 +1098 4 436.0322 370.2899 51.6858 0.2676 1097 +1099 4 437.1132 369.9399 51.9935 0.2429 1098 +1100 4 438.0822 369.4868 51.0555 0.2291 1099 +1101 4 439.1461 369.0716 50.9247 0.2288 1100 +1102 4 440.146 368.7249 49.8683 0.2289 1101 +1103 4 441.2683 368.535 49.6283 0.2418 1102 +1104 4 442.2212 367.9973 50.4 0.2676 1103 +1105 4 443.2554 367.629 49.6602 0.2918 1104 +1106 4 444.2896 367.1943 50.1892 0.2772 1105 +1107 4 445.1956 366.5021 50.2799 0.2233 1106 +1108 4 445.9861 365.7093 50.1698 0.1602 1107 +1109 4 447.0992 365.4828 50.26 0.1271 1108 +1110 4 448.2352 365.5503 50.3171 0.1334 1109 +1111 4 449.3392 365.7025 49.7078 0.1683 1110 +1112 4 450.4408 365.8558 49.4334 0.1968 1111 +1113 4 451.5711 365.8855 49.7924 0.2034 1112 +1114 4 452.7014 365.7929 49.819 0.1971 1113 +1115 4 453.7973 365.5503 49.3906 0.1907 1114 +1116 4 454.835 365.1019 49.0605 0.1907 1115 +1117 4 455.8737 364.6283 49.075 0.1973 1116 +1118 4 456.8656 364.1821 48.5528 0.217 1117 +1119 4 457.7716 363.5815 47.8545 0.2357 1118 +1120 4 458.6525 362.8574 47.7058 0.2344 1119 +1121 4 459.6329 362.3002 47.5488 0.2143 1120 +1122 4 460.6751 361.838 47.3273 0.2106 1121 +1123 4 461.715 361.3736 47.0806 0.2307 1122 +1124 4 462.7926 361.0121 46.8252 0.249 1123 +1125 4 463.8954 360.8336 47.161 0.2309 1124 +1126 4 465.0108 360.7432 47.7226 0.1842 1125 +1127 4 466.1182 360.5144 48.0301 0.1489 1126 +1128 4 467.1718 360.1392 48.552 0.1398 1127 +1129 4 468.2037 359.6759 48.7998 0.1485 1128 +1130 4 469.1418 359.033 48.8186 0.1432 1129 +1131 4 470.0158 358.3019 49.0566 0.1398 1130 +1132 4 471.0145 357.7677 49.0748 0.1494 1131 +1133 4 472.0579 357.2998 49.0056 0.1718 1132 +1134 4 473.1367 356.9337 48.8079 0.178 1133 +1135 4 474.2635 356.928 48.8564 0.1582 1134 +1136 4 475.3492 356.6409 48.7452 0.1326 1135 +1137 4 476.4154 356.2736 49.1112 0.1169 1136 +1138 4 477.5205 356.1055 49.6658 0.1144 1137 +1139 4 478.6404 356.0242 49.3231 0.1144 1138 +1140 4 479.7307 356.1672 49.8988 0.1144 1139 +1141 4 480.8655 356.2439 50.08 0.1262 1140 +1142 4 481.8574 356.7919 49.8798 0.1519 1141 +1143 4 482.7417 357.516 49.7862 0.1774 1142 +1144 4 483.8251 357.8226 49.3335 0.178 1143 +1145 4 484.9416 358.072 49.28 0.1144 1144 +1146 3 413.7985 419.0724 49.0834 0.1403 1 +1147 3 412.8765 419.705 49.6672 0.2042 1146 +1148 3 411.9533 420.3376 50.2502 0.3064 1147 +1149 3 411.1925 421.1522 50.7282 0.3777 1148 +1150 3 410.5404 422.0845 50.9564 0.394 1149 +1151 3 409.7591 422.8979 51.282 0.3422 1150 +1152 3 408.7157 423.2217 51.5021 0.2744 1151 +1153 3 407.8349 423.8165 51.1176 0.1144 1152 +1154 3 407.4482 423.1198 51.0563 0.2532 1153 +1155 3 406.3316 422.8785 50.9877 0.2542 1154 +1156 3 405.1911 422.9345 51.1361 0.2795 1155 +1157 3 404.086 422.9208 51.8602 0.2669 1156 +1158 3 403.0907 422.3968 52.3648 0.2924 1157 +1159 3 402.1068 421.9873 53.3845 0.2924 1158 +1160 3 401.0235 421.8672 54.2279 0.3051 1159 +1161 3 399.9252 421.5754 54.5625 0.3305 1160 +1162 3 399.0432 420.9279 55.3748 0.3686 1161 +1163 3 397.969 420.5413 55.5677 0.4322 1162 +1164 3 396.42 420.4772 56.3914 0.3943 1163 +1165 3 395.3195 420.253 56.9254 0.3814 1164 +1166 3 394.2579 419.8777 57.4258 0.3939 1165 +1167 3 393.2386 419.3687 57.6514 0.4067 1166 +1168 3 392.2696 418.7612 57.6797 0.4194 1167 +1169 3 391.3475 418.084 57.6803 0.4195 1168 +1170 3 390.4335 417.3953 57.6808 0.4069 1169 +1171 3 389.54 416.6803 57.6859 0.4068 1170 +1172 3 388.5859 416.0499 57.7181 0.4068 1171 +1173 3 387.5437 415.5889 57.9684 0.4068 1172 +1174 3 386.545 415.1576 58.8311 0.3686 1173 +1175 3 385.1162 414.3316 58.6634 0.178 1174 +1176 3 384.106 413.8775 59.2701 0.178 1175 +1177 3 383.1164 413.3295 59.4549 0.1866 1176 +1178 3 382.1852 412.6888 59.6361 0.2122 1177 +1179 3 381.2163 412.1111 59.584 0.2377 1178 +1180 3 380.3754 411.3378 59.463 0.2542 1179 +1181 3 379.498 410.6045 59.4073 0.2497 1180 +1182 3 378.6434 409.8517 59.5076 0.2369 1181 +1183 3 377.9158 408.9743 59.64 0.2382 1182 +1184 3 377.2786 408.0248 59.64 0.2636 1183 +1185 3 376.7203 407.0341 59.7982 0.2939 1184 +1186 3 376.1666 406.0697 60.3562 0.3228 1185 +1187 3 375.3613 405.3444 60.555 0.3417 1186 +1188 3 374.4735 404.6706 60.2512 0.3559 1187 +1189 3 373.7608 403.7908 60.0065 0.349 1188 +1190 3 373.0458 402.9214 59.5426 0.3156 1189 +1191 3 372.197 402.1755 59.2262 0.2645 1190 +1192 3 371.2909 401.4799 59.1959 0.2202 1191 +1193 3 370.4398 400.734 59.5395 0.2034 1192 +1194 3 369.536 400.1186 60.2538 0.2262 1193 +1195 3 368.6426 399.4734 60.9207 0.2646 1194 +1196 3 367.8967 398.6291 60.9636 0.2796 1195 +1197 3 367.3258 397.651 61.0551 0.2474 1196 +1198 3 366.6337 396.8296 60.5262 0.2032 1197 +1199 3 366.0251 396.094 59.0492 0.2003 1198 +1200 3 365.0172 395.8881 58.7073 0.3143 1199 +1201 3 363.8927 395.6959 58.7916 0.2633 1200 +1202 3 362.8928 395.1593 58.592 0.2032 1201 +1203 3 362.3025 394.3402 59.8951 0.152 1202 +1204 3 361.8083 393.7168 61.871 0.1398 1203 +1205 3 360.837 393.2237 62.6128 0.1409 1204 +1206 3 360.0557 392.4492 62.0533 0.1539 1205 +1207 3 359.6667 391.5386 60.9599 0.1692 1206 +1208 3 358.7904 390.8465 61.4989 0.1948 1207 +1209 3 357.746 390.4335 61.9097 0.2138 1208 +1210 3 356.6248 390.2276 61.9982 0.1961 1209 +1211 3 355.5792 389.8054 62.3386 0.1598 1210 +1212 3 354.6606 389.1808 62.7626 0.1432 1211 +1213 3 353.7248 388.5607 62.3428 0.1697 1212 +1214 3 352.6963 388.0826 62.253 0.2212 1213 +1215 3 351.7182 387.5094 62.5044 0.2677 1214 +1216 3 350.8133 386.8139 62.4047 0.2878 1215 +1217 3 349.9713 386.0577 62.3095 0.2613 1216 +1218 3 349.1305 385.3038 62.5954 0.2058 1217 +1219 3 348.1375 384.7455 62.7312 0.1559 1218 +1220 3 347.1376 384.2044 62.8468 0.1398 1219 +1221 3 346.3906 383.4162 63.3203 0.1491 1220 +1222 3 345.8198 382.4964 64.0797 0.17 1221 +1223 3 344.9526 381.7986 64.2592 0.1829 1222 +1224 3 343.9104 381.389 64.0032 0.1907 1223 +1225 3 342.787 381.2986 64.2958 0.1972 1224 +1226 3 341.6705 381.3673 64.8726 0.228 1225 +1227 3 340.5562 381.2769 65.3859 0.2607 1226 +1228 3 339.5712 381.508 64.4731 0.2563 1227 +1229 3 338.4741 381.6739 64.6344 0.1999 1228 +1230 3 337.3324 381.7002 64.6775 0.1579 1229 +1231 3 336.2124 381.4885 64.6453 0.1415 1230 +1232 3 335.1165 381.1659 64.51 0.1508 1231 +1233 3 333.9942 380.952 64.4932 0.1413 1232 +1234 3 332.8994 380.6546 64.8133 0.1284 1233 +1235 3 331.9579 380.0391 65.2582 0.1271 1234 +1236 3 330.9867 379.562 64.4403 0.1398 1235 +1237 3 330.0783 378.8653 64.4129 0.1525 1236 +1238 3 329.2432 378.092 64.68 0.1144 1237 +1239 3 385.4948 415.3578 58.7045 0.1481 1174 +1240 3 384.4595 415.7227 58.4716 0.1492 1239 +1241 3 383.3338 415.6758 58.1134 0.1897 1240 +1242 3 382.2848 415.6678 57.0819 0.2636 1241 +1243 3 381.2369 415.86 56.4827 0.3314 1242 +1244 3 380.1295 416.1414 56.4925 0.3692 1243 +1245 3 379.0495 416.4469 56.0501 0.361 1244 +1246 3 377.9719 416.6871 55.3241 0.3154 1245 +1247 3 376.8599 416.8644 54.934 0.2501 1246 +1248 3 375.8829 417.3632 54.88 0.208 1247 +1249 3 375.2492 418.2933 55.008 0.2034 1248 +1250 3 374.8179 419.3481 55.1818 0.2388 1249 +1251 3 374.0926 420.1397 55.7715 0.2636 1250 +1252 3 373.3215 420.9222 55.4061 0.2861 1251 +1253 3 372.491 421.6784 54.9175 0.2728 1252 +1254 3 371.8641 422.6085 54.5443 0.2471 1253 +1255 3 371.1422 423.4813 54.2531 0.1909 1254 +1256 3 370.2922 424.2444 54.2357 0.1462 1255 +1257 3 369.2912 424.7741 53.9927 0.129 1256 +1258 3 368.2856 425.3175 53.9137 0.138 1257 +1259 3 367.3006 425.8986 53.9972 0.1508 1258 +1260 3 366.3282 426.4981 54.1321 0.1414 1259 +1261 3 365.4165 427.1742 54.453 0.1285 1260 +1262 3 364.3651 427.5814 54.8495 0.115 1261 +1263 3 363.2486 427.7999 55.137 0.1144 1262 +1264 3 362.1492 428.0974 55.389 0.1144 1263 +1265 3 361.1036 428.5195 55.8516 0.1144 1264 +1266 3 360.0809 429.0297 55.776 0.1144 1265 +1267 3 358.978 429.3032 56.096 0.1144 1266 +1268 3 357.8478 429.469 56.2078 0.1144 1267 +1269 3 356.8136 429.9152 55.72 0.1144 1268 +1270 3 356.5207 429.7505 56.84 0.1144 1269 +1271 3 356.3434 429.5846 56.84 0.1144 1270 +1272 3 356.0128 429.572 56.84 0.1144 1271 +1273 3 355.6696 429.572 56.84 0.1144 1272 +1274 3 355.4408 429.572 56.84 0.1144 1273 +1275 3 354.831 429.381 56.84 0.1144 1274 +1276 3 354.5759 429.2929 56.84 0.1144 1275 +1277 3 354.4753 429.0503 56.84 0.1144 1276 +1278 3 354.1824 429.0 56.84 0.1144 1277 +1279 3 353.8392 429.0 56.84 0.1144 1278 +1280 3 353.6104 429.0 56.84 0.1144 1279 +1281 3 352.8096 429.0 56.84 0.1144 1280 +1282 3 352.4664 429.0 56.84 0.1144 1281 +1283 3 352.1232 429.0 56.84 0.1144 1282 +1284 3 351.8178 428.9622 56.84 0.1144 1283 +1285 3 351.6782 428.7586 56.84 0.1144 1284 +1286 3 351.4368 428.428 56.84 0.1144 1285 +1287 3 351.1062 428.4154 56.84 0.1144 1286 +1288 3 351.017 428.3902 56.84 0.1144 1287 +1289 3 350.2928 428.3136 56.84 0.1144 1288 +1290 3 349.492 428.3136 56.84 0.1144 1289 +1291 3 348.6912 428.3136 56.84 0.1144 1290 +1292 3 347.8904 428.3136 56.84 0.1144 1291 +1293 3 347.5472 428.3136 56.84 0.1144 1292 +1294 3 347.2166 428.301 56.84 0.1144 1293 +1295 3 346.9752 428.1992 56.84 0.1144 1294 +1296 3 346.8482 427.983 56.84 0.1144 1295 +1297 3 346.4032 427.856 56.84 0.1144 1296 +1298 3 346.0978 427.8182 56.84 0.1144 1297 +1299 3 346.0222 427.7794 56.84 0.1144 1298 +1300 3 345.2592 427.7416 56.84 0.1144 1299 +1301 3 344.4584 427.7416 56.84 0.1144 1300 +1302 3 343.6576 427.7416 56.84 0.1144 1301 +1303 3 343.3144 427.7416 56.84 0.1144 1302 +1304 3 342.9838 427.729 56.84 0.1144 1303 +1305 3 342.7676 427.602 56.84 0.1144 1304 +1306 3 342.5639 427.4625 56.84 0.1144 1305 +1307 3 342.501 427.2966 56.84 0.1144 1306 +1308 3 342.2082 426.7886 56.84 0.1144 1307 +1309 3 341.7254 426.4706 56.84 0.1144 1308 +1310 3 341.5858 426.267 56.84 0.1144 1309 +1311 3 341.3696 426.14 56.84 0.1144 1310 +1312 3 341.0264 426.14 56.84 0.1144 1311 +1313 3 340.6832 426.14 56.84 0.1144 1312 +1314 3 340.4544 426.14 56.84 0.1144 1313 +1315 3 339.7806 426.013 56.84 0.1144 1314 +1316 3 339.196 425.7968 56.84 0.1144 1315 +1317 3 338.3952 425.7968 56.84 0.1144 1316 +1318 3 337.5944 425.7968 56.84 0.1144 1317 +1319 3 337.1368 425.568 56.84 0.1144 1318 +1320 3 397.3341 420.8925 57.2345 0.4499 1163 +1321 3 396.3422 421.4279 57.0119 0.3835 1320 +1322 3 395.5952 422.2275 56.8467 0.3027 1321 +1323 3 394.6846 422.6451 58.1101 0.2214 1322 +1324 3 393.6104 422.7583 58.9109 0.1907 1323 +1325 3 392.6505 422.8361 60.1087 0.1986 1324 +1326 3 391.7079 423.4459 60.5024 0.2207 1325 +1327 3 390.8453 424.0842 60.9826 0.2388 1326 +1328 3 390.0331 424.7169 61.6874 0.2766 1327 +1329 3 389.1053 425.3506 61.7044 0.3342 1328 +1330 3 388.2999 426.1549 61.9564 0.3804 1329 +1331 3 387.5678 427.0277 62.097 0.4001 1330 +1332 3 386.847 427.8869 62.5388 0.3945 1331 +1333 3 386.0542 428.6797 63.047 0.3626 1332 +1334 3 385.1722 429.3947 63.2475 0.2982 1333 +1335 3 384.1575 429.8969 63.4385 0.2145 1334 +1336 3 383.0467 430.0788 63.5606 0.1508 1335 +1337 3 381.9393 430.1234 64.0676 0.1271 1336 +1338 3 381.0229 430.2813 65.5752 0.1345 1337 +1339 3 380.0231 430.279 66.3659 0.1476 1338 +1340 3 378.9809 430.0754 67.1787 0.1446 1339 +1341 3 377.9147 429.9976 68.0638 0.1317 1340 +1342 3 376.8153 430.2218 68.3189 0.1187 1341 +1343 3 375.9024 430.7824 69.0183 0.1144 1342 +1344 3 375.3647 431.6163 70.3041 0.1144 1343 +1345 3 374.6325 432.4057 70.9971 0.1144 1344 +1346 3 373.5812 432.7798 71.1942 0.1144 1345 +1347 3 372.5161 433.1161 71.7517 0.1144 1346 +1348 3 371.4751 433.4891 72.4752 0.1144 1347 +1349 3 370.4924 434.0553 72.7913 0.1144 1348 +1350 3 369.5269 434.5999 73.4689 0.1144 1349 +1351 3 368.7604 435.2794 74.7141 0.1144 1350 +1352 3 368.4881 436.3479 75.4586 0.1144 1351 +1353 3 368.2536 437.4656 75.6 0.1144 1352 +1354 3 368.0248 437.58 74.48 0.1144 1353 +1355 3 367.7194 437.6178 74.48 0.1144 1354 +1356 3 367.4528 437.6944 74.48 0.1144 1355 +1357 3 367.1222 437.707 74.48 0.1144 1356 +1358 3 366.9574 437.771 74.48 0.1144 1357 +1359 3 366.4106 438.025 74.48 0.1144 1358 +1360 3 366.0674 438.4826 74.48 0.1144 1359 +1361 3 365.7242 438.9402 74.48 0.1144 1360 +1362 3 365.1648 439.1816 74.48 0.1144 1361 +1363 3 364.6694 439.487 74.48 0.1144 1362 +1364 3 364.4143 439.5751 74.48 0.1144 1363 +1365 3 364.3514 439.8554 74.48 0.1144 1364 +1366 3 364.1352 439.9824 74.48 0.1144 1365 +1367 3 363.792 439.9824 74.48 0.1144 1366 +1368 3 363.601 440.0202 74.48 0.1144 1367 +1369 3 362.8768 440.0968 74.48 0.1144 1368 +1370 3 362.2796 440.3004 74.48 0.1144 1369 +1371 3 361.695 440.5166 74.48 0.1144 1370 +1372 3 360.932 440.5544 74.48 0.1144 1371 +1373 3 360.1312 440.5544 74.48 0.1144 1372 +1374 3 359.4448 440.44 74.48 0.1144 1373 +1375 3 359.1016 440.44 74.48 0.1144 1374 +1376 3 358.7584 440.44 74.48 0.1144 1375 +1377 3 358.453 440.4022 74.48 0.1144 1376 +1378 3 358.3008 440.2112 74.48 0.1144 1377 +1379 3 358.2116 440.0716 74.48 0.1144 1378 +1380 3 357.9702 439.9698 74.48 0.1144 1379 +1381 3 357.7666 439.8302 74.48 0.1144 1380 +1382 3 357.6522 439.6014 74.48 0.1144 1381 +1383 3 357.5378 439.3726 74.48 0.1144 1382 +1384 3 357.5 439.1816 74.48 0.1144 1383 +1385 3 357.3856 438.9528 74.48 0.1144 1384 +1386 3 407.8188 424.019 51.3064 0.122 1153 +1387 3 407.8097 425.0978 52.0808 0.1615 1386 +1388 3 408.0568 426.1835 52.4297 0.1975 1387 +1389 3 408.4904 427.0804 53.6399 0.2161 1388 +1390 3 409.3518 427.6466 54.7467 0.2122 1389 +1391 3 410.4214 427.8743 55.3812 0.1993 1390 +1392 3 411.562 427.8526 55.3689 0.1907 1391 +1393 3 412.6602 427.8045 55.6587 0.1953 1392 +1394 3 413.6086 427.7576 57.1595 0.2034 1393 +1395 3 414.4632 427.4304 58.7538 0.2034 1394 +1396 3 415.3978 427.03 59.9561 0.1844 1395 +1397 3 415.9321 426.4489 61.4566 0.1503 1396 +1398 3 416.4492 425.6664 62.8432 0.1236 1397 +1399 3 417.258 425.0292 64.0455 0.1144 1398 +1400 3 417.8735 424.2089 65.1949 0.1239 1399 +1401 3 418.6331 423.4333 64.965 0.1381 1400 +1402 3 419.3263 422.5318 64.8533 0.1639 1401 +1403 3 419.5117 421.6727 66.5792 0.1652 1402 +1404 3 419.6192 420.5722 67.2932 0.1652 1403 +1405 3 419.5929 420.0745 68.7666 0.1343 1404 +1406 3 419.7187 419.1353 69.4949 0.1144 1405 +1407 3 419.8194 418.0199 69.6805 0.1144 1406 +1408 3 419.6741 417.163 71.239 0.1144 1407 +1409 3 419.1044 416.567 73.0705 0.1144 1408 +1410 3 418.601 415.6713 73.3211 0.1144 1409 +1411 3 418.45 414.5524 73.2245 0.1144 1410 +1412 3 418.736 413.5194 73.9502 0.1144 1411 +1413 3 418.9328 412.412 74.2 0.1144 1412 +1414 3 419.7439 420.4612 67.9395 0.1144 1404 +1415 3 420.5916 420.436 69.7956 0.1144 1414 +1416 3 421.2791 419.6787 70.8226 0.1144 1415 +1417 3 421.667 418.6251 70.6947 0.1144 1416 +1418 3 422.5776 417.9856 70.56 0.1144 1417 +1419 3 423.6289 417.5646 70.56 0.1144 1418 +1420 3 424.5659 416.9114 70.5124 0.1144 1419 +1421 3 425.457 416.1975 70.49 0.1144 1420 +1422 3 426.2853 415.4356 70.8652 0.1144 1421 +1423 3 427.0403 414.6382 71.6148 0.1144 1422 +1424 3 427.9544 414.033 72.0703 0.1144 1423 +1425 3 429.0275 413.6441 71.9662 0.1144 1424 +1426 3 430.1303 413.3501 71.8528 0.1144 1425 +1427 3 431.248 413.1224 71.685 0.1144 1426 +1428 3 432.3805 412.9932 71.68 0.1144 1427 +1429 3 433.5142 412.8868 71.6808 0.1144 1428 +1430 3 434.5324 412.4406 71.7391 0.1144 1429 +1431 3 435.4945 412.0139 72.2338 0.1144 1430 +1432 3 436.4383 412.3068 73.3625 0.1144 1431 +1433 3 437.3352 412.9142 74.0751 0.1144 1432 +1434 3 438.0868 413.7356 74.1944 0.1144 1433 +1435 3 438.5982 414.7114 74.797 0.1144 1434 +1436 3 439.3829 415.3898 74.4419 0.1144 1435 +1437 3 440.1963 416.1552 74.4554 0.1144 1436 +1438 3 441.0623 416.8942 74.6698 0.1144 1437 +1439 3 442.0222 417.5062 74.5402 0.1144 1438 +1440 3 443.0632 417.9673 74.6544 0.1144 1439 +1441 3 444.1694 418.0451 75.1596 0.1144 1440 +1442 3 445.1304 417.568 75.994 0.126 1441 +1443 3 445.914 416.8358 76.9563 0.1517 1442 +1444 3 445.9312 415.7296 77.56 0.2288 1443 +1445 3 415.9687 415.4985 47.9427 0.1671 1 +1446 3 416.1037 414.3625 47.9735 0.2466 1445 +1447 3 416.2627 413.23 47.9956 0.3358 1446 +1448 3 416.6173 412.1523 48.0917 0.4021 1447 +1449 3 417.5257 411.7576 48.4282 0.4744 1448 +1450 3 418.2544 412.5676 48.2748 0.5529 1449 +1451 3 418.8527 413.5388 48.4341 0.5944 1450 +1452 3 419.4453 414.517 48.4744 0.5504 1451 +1453 3 420.0116 415.5065 48.2524 0.4289 1452 +1454 3 420.7529 416.2009 49.4525 0.3193 1453 +1455 3 421.5617 415.6632 50.8864 0.2924 1454 +1456 3 422.557 415.0993 50.9564 0.3305 1455 +1457 3 423.3978 414.3236 50.9384 0.3432 1456 +1458 3 423.7513 412.8044 50.5532 0.3082 1457 +1459 3 423.9939 411.713 50.036 0.3252 1458 +1460 3 424.2078 410.5988 49.8425 0.3283 1459 +1461 3 424.5018 409.4948 49.84 0.3432 1460 +1462 3 424.7386 408.376 49.84 0.3485 1461 +1463 3 424.8805 407.2468 49.8394 0.3401 1462 +1464 3 424.8747 406.1028 49.8369 0.302 1463 +1465 3 425.2728 405.1968 50.0189 0.1144 1464 +1466 3 424.8336 404.6328 49.8145 0.3305 1465 +1467 3 424.7878 403.4911 49.6647 0.3813 1466 +1468 3 424.8827 402.3894 48.9418 0.3686 1467 +1469 3 424.8976 401.25 48.7206 0.3432 1468 +1470 3 424.9914 400.1094 48.7138 0.3178 1469 +1471 3 425.3907 399.0375 48.6842 0.3178 1470 +1472 3 425.8815 398.3339 48.4154 0.2373 1471 +1473 3 426.6033 397.4954 47.8341 0.1723 1472 +1474 3 427.4018 396.7586 46.9574 0.1538 1473 +1475 3 428.2209 396.1283 45.8382 0.1461 1474 +1476 3 428.7415 395.8732 43.713 0.1748 1475 +1477 3 428.5332 395.5998 41.2194 0.2314 1476 +1478 3 428.0287 394.9877 39.2526 0.2627 1477 +1479 3 427.5242 394.1572 37.8067 0.2496 1478 +1480 3 426.6388 393.7431 36.7808 0.22 1479 +1481 3 426.0691 394.4478 35.3665 0.2161 1480 +1482 3 426.2327 395.371 33.8271 0.2161 1481 +1483 3 426.839 396.2862 33.0991 0.1917 1482 +1484 3 427.173 397.3043 32.1255 0.1785 1483 +1485 3 426.2086 397.6613 31.0895 0.178 1484 +1486 3 425.147 397.8088 30.1087 0.178 1485 +1487 3 424.0751 398.207 30.1328 0.1525 1486 +1488 3 423.8772 398.4907 30.9498 0.1898 1487 +1489 3 423.7982 399.1622 32.9034 0.2577 1488 +1490 3 424.5281 399.7136 34.0721 0.2852 1489 +1491 3 425.3941 400.3668 34.1239 0.2867 1490 +1492 3 425.7385 401.4079 33.9018 0.2796 1491 +1493 3 425.6504 402.418 32.8714 0.2915 1492 +1494 3 425.4753 403.276 31.0761 0.3177 1493 +1495 3 425.8197 404.0276 29.5274 0.3238 1494 +1496 3 426.6148 404.7655 28.8075 0.3109 1495 +1497 3 427.5117 405.4576 28.8081 0.2981 1496 +1498 3 428.5538 405.8912 28.8044 0.2996 1497 +1499 3 429.6075 406.1406 28.054 0.2903 1498 +1500 3 430.6885 406.3259 27.4165 0.272 1499 +1501 3 431.8085 406.5318 27.4624 0.2749 1500 +1502 3 432.7249 407.0993 27.0698 0.3056 1501 +1503 3 433.1848 408.0488 26.1993 0.3267 1502 +1504 3 433.266 409.115 25.2784 0.2941 1503 +1505 3 432.9948 410.1881 24.7352 0.2516 1504 +1506 3 432.7489 411.2943 24.8735 0.2318 1505 +1507 3 433.195 412.2839 24.9749 0.2612 1506 +1508 3 434.1846 412.8113 24.8755 0.2892 1507 +1509 3 435.1948 413.3386 24.6268 0.2924 1508 +1510 3 436.1569 413.9255 24.1576 0.3037 1509 +1511 3 437.1785 414.3374 23.429 0.3051 1510 +1512 3 438.2435 414.5158 22.5224 0.3279 1511 +1513 3 439.3738 414.6279 22.3012 0.3189 1512 +1514 3 440.3187 415.2217 22.7391 0.3416 1513 +1515 3 441.2111 415.9298 22.9718 0.3313 1514 +1516 3 442.1869 416.5201 23.1594 0.3305 1515 +1517 3 443.0872 417.1493 23.9243 0.2946 1516 +1518 3 443.9807 417.3266 25.5822 0.268 1517 +1519 3 444.4417 416.424 24.5874 0.2161 1518 +1520 3 444.5584 415.5008 22.96 0.1144 1519 +1521 3 423.1473 398.2115 29.5196 0.1764 1487 +1522 3 422.1554 398.6291 28.6143 0.1909 1521 +1523 3 421.3043 398.2916 27.027 0.2297 1522 +1524 3 421.27 397.8958 24.5543 0.2458 1523 +1525 3 422.1966 398.0422 23.5777 0.2616 1524 +1526 3 423.2411 398.3831 23.3551 0.2433 1525 +1527 3 424.3199 398.5845 22.7268 0.2288 1526 +1528 3 425.3152 399.0272 22.9102 0.2407 1527 +1529 3 426.2716 399.5672 22.9631 0.2741 1528 +1530 3 427.2977 399.3967 22.4496 0.2996 1529 +1531 3 428.3182 398.9128 22.0772 0.2902 1530 +1532 3 429.3604 398.4518 22.1413 0.2555 1531 +1533 3 430.3396 397.8832 22.4949 0.2078 1532 +1534 3 431.3475 397.3661 22.4442 0.1993 1533 +1535 3 432.3622 396.9852 23.0745 0.2398 1534 +1536 3 433.2202 396.4978 24.4423 0.3104 1535 +1537 3 433.4685 395.514 24.9379 0.3305 1536 +1538 3 433.0829 394.5084 25.6004 0.3004 1537 +1539 3 432.9502 393.4056 25.9913 0.2458 1538 +1540 3 433.4433 392.3897 26.2363 0.2415 1539 +1541 3 433.4708 391.3052 27.0808 0.2541 1540 +1542 3 432.8896 390.3328 27.44 0.2288 1541 +1543 3 425.4307 398.1578 48.7099 0.2815 1471 +1544 3 425.6229 397.0366 48.4338 0.2796 1543 +1545 3 425.9558 395.9453 48.6228 0.2545 1544 +1546 3 426.426 394.9248 49.14 0.2542 1545 +1547 3 427.0083 393.941 49.2153 0.2416 1546 +1548 3 427.7164 393.0532 49.56 0.2288 1547 +1549 3 426.9488 392.1163 51.1277 0.1346 1548 +1550 3 426.307 391.3349 52.4367 0.1271 1549 +1551 3 425.6652 390.5524 53.7452 0.1449 1550 +1552 3 425.0154 389.7116 54.7599 0.1884 1551 +1553 3 424.2181 388.9245 55.1205 0.2397 1552 +1554 3 423.4505 388.0803 55.16 0.2908 1553 +1555 3 422.7011 387.2417 55.5904 0.3051 1554 +1556 3 422.2252 386.2304 55.732 0.2958 1555 +1557 3 421.5068 385.3861 55.979 0.2736 1556 +1558 3 420.7254 384.5567 56.1674 0.2952 1557 +1559 3 419.9613 383.7068 56.2148 0.3338 1558 +1560 3 419.3321 382.7687 56.5547 0.3724 1559 +1561 3 418.9031 381.7162 56.6857 0.3715 1560 +1562 3 418.4969 380.6694 57.1701 0.3582 1561 +1563 3 417.8403 379.7863 57.8648 0.3451 1562 +1564 3 417.0475 378.9717 57.8752 0.3212 1563 +1565 3 416.4824 377.9868 57.696 0.2829 1564 +1566 3 415.8749 377.043 58.1832 0.2441 1565 +1567 3 415.0043 376.3405 58.7278 0.2534 1566 +1568 3 414.1108 375.6381 59.0425 0.2781 1567 +1569 3 413.1956 374.962 59.3289 0.2916 1568 +1570 3 412.2404 374.3408 59.593 0.2684 1569 +1571 3 411.3435 373.6327 59.5781 0.231 1570 +1572 3 410.4718 373.0401 60.3968 0.2161 1571 +1573 3 409.6447 372.3377 61.04 0.2255 1572 +1574 3 408.9846 371.4145 61.2567 0.2094 1573 +1575 3 408.813 370.3139 61.364 0.1835 1574 +1576 3 408.7661 369.1825 61.7462 0.1579 1575 +1577 3 408.1964 368.2444 62.092 0.1627 1576 +1578 3 407.3063 367.5683 62.5792 0.1652 1577 +1579 3 406.3271 367.0879 63.3909 0.1652 1578 +1580 3 405.6647 366.1955 63.31 0.1431 1579 +1581 3 405.1956 365.1545 63.2565 0.1398 1580 +1582 3 404.666 364.1546 63.6177 0.1511 1581 +1583 3 403.983 363.2406 63.7305 0.1867 1582 +1584 3 403.1776 362.4409 64.0674 0.2021 1583 +1585 3 402.3311 361.6779 64.2919 0.192 1584 +1586 3 401.512 360.9034 64.7595 0.156 1585 +1587 3 400.7981 360.0294 65.2 0.1289 1586 +1588 3 400.2318 359.049 65.5956 0.1271 1587 +1589 3 399.5203 358.1567 65.6393 0.1511 1588 +1590 3 398.8762 357.4474 67.1286 0.1906 1589 +1591 3 398.3408 356.4704 67.76 0.2288 1590 +1592 3 428.0951 392.5636 48.6256 0.2608 1548 +1593 3 428.7334 391.7296 47.5773 0.2968 1592 +1594 3 429.3226 390.9002 46.3352 0.3146 1593 +1595 3 429.7642 390.5753 44.0191 0.2977 1594 +1596 3 430.0239 389.6544 43.1749 0.2805 1595 +1597 3 430.1966 389.0321 45.3636 0.267 1596 +1598 3 430.875 388.1134 45.5417 0.2799 1597 +1599 3 431.5099 387.1811 45.0993 0.3058 1598 +1600 3 431.8657 386.0943 45.1108 0.3308 1599 +1601 3 432.2387 385.0155 45.2413 0.3432 1600 +1602 3 432.4331 383.9195 45.8749 0.3441 1601 +1603 3 432.5864 382.8876 46.9652 0.357 1602 +1604 3 432.4892 381.7505 47.0392 0.3686 1603 +1605 3 432.2821 380.6557 46.8821 0.3644 1604 +1606 3 432.392 379.6307 45.7741 0.3331 1605 +1607 3 432.6196 378.5485 45.8368 0.3013 1606 +1608 3 433.0806 377.5543 46.4176 0.2924 1607 +1609 3 433.5417 376.519 46.1412 0.2966 1608 +1610 3 434.1331 375.5546 45.724 0.3051 1609 +1611 3 434.6765 374.6074 44.9694 0.3108 1610 +1612 3 435.2943 373.7288 44.5362 0.3236 1611 +1613 3 436.1191 372.9715 45.0556 0.3425 1612 +1614 3 436.9199 372.1878 45.4236 0.3495 1613 +1615 3 437.3569 371.1891 45.0943 0.3363 1614 +1616 3 437.3134 370.1069 44.3663 0.3025 1615 +1617 3 437.2322 368.9983 43.8348 0.2725 1616 +1618 3 437.6875 368.1472 42.9114 0.2587 1617 +1619 3 437.8546 367.1691 42.7252 0.263 1618 +1620 3 437.723 366.0365 42.7711 0.2669 1619 +1621 3 437.5194 364.912 42.8254 0.2573 1620 +1622 3 437.8214 363.8744 42.3604 0.2542 1621 +1623 3 438.2447 362.8368 41.8051 0.2542 1622 +1624 3 438.6737 361.8266 41.0164 0.2876 1623 +1625 3 439.2766 360.8897 41.4098 0.3151 1624 +1626 3 439.8337 359.8967 41.2846 0.3292 1625 +1627 3 439.9664 358.7698 41.2902 0.3062 1626 +1628 3 440.2993 357.8329 39.9602 0.2532 1627 +1629 3 441.052 357.0252 39.3431 0.202 1628 +1630 3 441.3541 356.0048 40.2144 0.1643 1629 +1631 3 441.3209 354.9294 39.3439 0.1525 1630 +1632 3 441.1607 353.8198 39.6567 0.1525 1631 +1633 3 441.4593 352.7215 39.7398 0.1525 1632 +1634 3 441.4936 351.5867 39.597 0.1567 1633 +1635 3 441.6046 350.4701 39.1633 0.1706 1634 +1636 3 441.7167 349.3387 39.0303 0.1891 1635 +1637 3 441.6961 348.197 38.9049 0.2089 1636 +1638 3 441.6469 347.0576 38.6932 0.2161 1637 +1639 3 441.5531 345.9273 38.3387 0.2105 1638 +1640 3 441.6103 344.8165 37.861 0.1978 1639 +1641 3 441.9741 343.7537 37.5169 0.1963 1640 +1642 3 442.3448 342.6829 37.4209 0.2091 1641 +1643 3 442.3859 341.5618 37.5418 0.2275 1642 +1644 3 442.2258 340.4372 37.7535 0.2472 1643 +1645 3 442.0691 339.3047 37.6796 0.26 1644 +1646 3 441.9432 338.1813 37.9327 0.2549 1645 +1647 3 441.8814 337.0556 38.337 0.2293 1646 +1648 3 441.9203 335.9162 38.386 0.197 1647 +1649 3 442.0759 334.7973 38.0394 0.1713 1648 +1650 3 442.3436 333.7002 37.7381 0.1652 1649 +1651 3 442.7051 332.6203 37.9025 0.1789 1650 +1652 3 443.1284 331.5667 38.2306 0.2045 1651 +1653 3 443.6524 330.5782 38.7545 0.2161 1652 +1654 3 444.2541 329.6253 38.988 0.2019 1653 +1655 3 444.8547 328.6529 38.9189 0.1765 1654 +1656 3 445.3535 327.629 38.7934 0.151 1655 +1657 3 445.9198 326.6486 38.8388 0.1398 1656 +1658 3 446.5318 325.6957 39.1969 0.1469 1657 +1659 3 447.121 324.7233 39.3092 0.1741 1658 +1660 3 447.6289 323.7085 39.4386 0.2051 1659 +1661 3 448.0762 322.6663 39.8 0.2161 1660 +1662 3 448.6276 321.6734 39.9552 0.2161 1661 +1663 3 449.3014 320.7536 40.0988 0.2238 1662 +1664 3 449.9993 319.8498 40.1106 0.2677 1663 +1665 3 450.6079 318.8866 40.1705 0.3319 1664 +1666 3 451.0334 317.8364 40.4202 0.3958 1665 +1667 3 451.2977 316.7278 40.6174 0.4195 1666 +1668 3 451.4807 315.601 40.7784 0.4035 1667 +1669 3 451.2451 314.5394 41.169 0.3686 1668 +1670 3 450.7989 313.4949 41.2482 0.3384 1669 +1671 3 450.2395 312.5053 41.3784 0.3032 1670 +1672 3 450.2223 311.4529 41.9695 0.231 1671 +1673 3 450.434 310.4908 43.3527 0.1578 1672 +1674 3 450.5678 309.3765 43.344 0.1278 1673 +1675 3 450.6754 308.3824 42.0333 0.1424 1674 +1676 3 450.2715 307.5289 40.5927 0.1836 1675 +1677 3 450.2326 306.4021 41.0698 0.2706 1676 +1678 3 450.1834 305.2672 41.2404 0.3562 1677 +1679 3 450.2578 304.1301 41.2196 0.397 1678 +1680 3 450.3653 303.0021 41.5167 0.3911 1679 +1681 3 450.2933 301.8741 41.797 0.3656 1680 +1682 3 449.9363 300.8526 41.2317 0.348 1681 +1683 3 449.6183 299.7966 41.032 0.3117 1682 +1684 3 449.5199 298.7064 41.6198 0.2748 1683 +1685 3 449.5462 297.6345 42.0174 0.2669 1684 +1686 3 449.417 296.5465 42.0927 0.2669 1685 +1687 3 449.2294 295.4735 42.9265 0.2612 1686 +1688 3 448.9228 294.5034 44.0342 0.2405 1687 +1689 3 448.4366 293.571 44.4884 0.2135 1688 +1690 3 447.916 292.5563 44.338 0.2034 1689 +1691 3 447.288 291.6411 43.8612 0.2272 1690 +1692 3 446.716 290.6858 43.3367 0.2801 1691 +1693 3 446.0456 289.8896 42.28 0.3432 1692 +1694 3 426.1617 404.5767 50.5719 0.1883 1465 +1695 3 427.117 403.9613 50.904 0.2277 1694 +1696 3 428.1042 403.3847 50.9527 0.2658 1695 +1697 3 429.0606 402.7566 50.9345 0.2916 1696 +1698 3 430.1177 402.3288 50.7637 0.2924 1697 +1699 3 431.2411 402.1126 50.7987 0.2675 1698 +1700 3 432.289 401.6733 51.1 0.2296 1699 +1701 3 433.2591 401.0795 51.3962 0.2039 1700 +1702 3 434.2681 400.5567 51.7244 0.2034 1701 +1703 3 435.3263 400.3394 52.6333 0.241 1702 +1704 3 436.4074 400.019 52.1956 0.2795 1703 +1705 3 437.5091 399.8829 51.515 0.3177 1704 +1706 3 438.5902 399.5077 51.5284 0.3305 1705 +1707 3 439.6335 399.0592 51.858 0.3559 1706 +1708 3 440.7191 398.8178 51.203 0.3432 1707 +1709 3 441.8574 398.7343 51.0051 0.3305 1708 +1710 3 442.9831 398.5467 51.2 0.2924 1709 +1711 3 444.0402 398.2825 52.0472 0.3051 1710 +1712 3 445.1087 398.0376 52.8514 0.3178 1711 +1713 3 446.192 397.699 53.1938 0.3559 1712 +1714 3 447.2662 397.3043 53.1815 0.3432 1713 +1715 3 448.289 396.7941 53.0788 0.3178 1714 +1716 3 449.0738 396.221 53.1731 0.2584 1715 +1717 3 450.1423 395.8629 53.1829 0.2511 1716 +1718 3 451.2428 395.5552 53.1174 0.2542 1717 +1719 3 452.2129 394.9694 53.0362 0.2247 1718 +1720 3 453.0354 394.2441 52.3359 0.1762 1719 +1721 3 454.0353 393.8128 51.6242 0.1432 1720 +1722 3 454.9985 393.4937 52.7271 0.1652 1721 +1723 3 455.8829 393.3324 54.4393 0.2303 1722 +1724 3 456.9902 393.56 54.8691 0.2938 1723 +1725 3 458.053 393.9742 54.9452 0.3312 1724 +1726 3 459.0323 394.4832 55.6693 0.3425 1725 +1727 3 460.0848 394.7246 56.4029 0.3292 1726 +1728 3 461.0881 394.1972 56.5079 0.3153 1727 +1729 3 461.9781 393.528 56.4245 0.308 1728 +1730 3 463.1004 393.433 56.3203 0.3216 1729 +1731 3 464.2146 393.6447 56.3604 0.3267 1730 +1732 3 465.2602 393.9181 57.1967 0.3098 1731 +1733 3 466.2189 394.3402 58.1756 0.2798 1732 +1734 3 467.2485 394.6903 58.133 0.2588 1733 +1735 3 468.3616 394.6617 58.0006 0.2718 1734 +1736 3 469.4644 394.6583 58.7345 0.2898 1735 +1737 3 470.5421 394.7864 59.383 0.2998 1736 +1738 3 471.6186 395.0667 59.9124 0.2762 1737 +1739 3 472.7294 395.125 60.4206 0.2431 1738 +1740 3 473.8654 395.0392 60.335 0.2231 1739 +1741 3 474.998 394.9752 60.2686 0.2221 1740 +1742 3 476.1385 394.9957 60.3142 0.2288 1741 +1743 3 477.2791 395.0415 60.3151 0.2288 1742 +1744 3 478.4185 395.0369 60.4898 0.2413 1743 +1745 3 479.5568 395.0529 60.5497 0.2542 1744 +1746 3 480.6813 395.2451 60.615 0.2478 1745 +1747 3 481.8013 395.3561 60.9255 0.2216 1746 +1748 3 482.9236 395.2165 61.2637 0.2102 1747 +1749 3 484.0539 395.0987 61.3718 0.2298 1748 +1750 3 485.1395 395.3012 61.7487 0.2415 1749 +1751 3 486.0719 395.0575 62.5257 0.2061 1750 +1752 3 486.6027 394.2167 63.7731 0.1526 1751 +1753 3 486.5775 393.1585 64.533 0.1206 1752 +1754 3 486.1908 392.1094 65.0336 0.1144 1753 +1755 3 485.9735 390.9998 65.219 0.1144 1754 +1756 3 485.5857 389.9335 65.329 0.1144 1755 +1757 3 485.2242 388.865 65.7591 0.1144 1756 +1758 3 484.9599 387.7782 66.3373 0.1144 1757 +1759 3 484.9347 386.6697 66.9606 0.1144 1758 +1760 3 484.873 385.5383 67.2946 0.1246 1759 +1761 3 484.5938 384.4538 67.804 0.1374 1760 +1762 3 484.1797 383.4173 68.4135 0.1501 1761 +1763 3 483.8193 382.3626 69.0365 0.1421 1762 +1764 3 483.9154 381.2574 69.4938 0.1398 1763 +1765 3 484.0996 380.142 69.923 0.1398 1764 +1766 3 483.888 379.1136 70.9411 0.1512 1765 +1767 3 484.1408 378.092 71.96 0.1144 1766 +1768 3 449.6904 396.6889 51.8938 0.2217 1715 +1769 3 450.7738 396.4006 51.6163 0.2476 1768 +1770 3 451.753 395.9167 50.9172 0.2638 1769 +1771 3 452.6636 395.2589 50.5061 0.2766 1770 +1772 3 453.5422 394.5313 50.3096 0.2895 1771 +1773 3 454.2561 393.647 50.3843 0.3127 1772 +1774 3 454.8315 392.6677 50.1469 0.328 1773 +1775 3 455.3692 391.6621 49.924 0.3408 1774 +1776 3 456.0602 390.7584 50.0422 0.312 1775 +1777 3 456.5693 389.7928 49.3618 0.2727 1776 +1778 3 457.0028 388.7472 49.0378 0.2233 1777 +1779 3 457.7956 387.9464 49.1862 0.2051 1778 +1780 3 458.6971 387.2497 49.005 0.1808 1779 +1781 3 459.6992 386.7029 49.0893 0.1663 1780 +1782 3 460.7208 386.2258 48.6517 0.1769 1781 +1783 3 461.8065 385.8804 48.7542 0.202 1782 +1784 3 462.8601 385.4411 48.573 0.2283 1783 +1785 3 463.9217 385.0704 48.0679 0.2163 1784 +1786 3 465.0063 384.7867 47.5121 0.2035 1785 +1787 3 466.0656 384.384 47.88 0.2288 1786 +1788 3 424.5304 414.5181 48.6119 0.4049 1457 +1789 3 425.6149 414.3488 48.4985 0.3843 1788 +1790 3 426.7326 414.3511 47.9606 0.3226 1789 +1791 3 427.8629 414.4518 48.193 0.293 1790 +1792 3 428.9222 414.4197 49.2402 0.3297 1791 +1793 3 430.0628 414.3614 49.1826 0.3939 1792 +1794 3 431.161 414.1658 48.5643 0.4576 1793 +1795 3 432.2512 413.365 49.2086 0.2714 1794 +1796 3 433.2728 412.8753 49.0532 0.2178 1795 +1797 3 434.3871 412.674 48.8684 0.1954 1796 +1798 3 435.5208 412.5367 48.7368 0.2072 1797 +1799 3 436.5996 412.1901 48.5598 0.2509 1798 +1800 3 437.6761 411.8228 48.7026 0.318 1799 +1801 3 438.6462 411.2348 48.648 0.3665 1800 +1802 3 439.7719 411.0918 48.4428 0.3813 1801 +1803 3 440.9102 411.0392 48.6889 0.3813 1802 +1804 3 441.4364 410.8836 48.9308 0.2766 1803 +1805 3 442.4832 410.5747 49.7518 0.2086 1804 +1806 3 443.4899 410.0565 49.77 0.2034 1805 +1807 3 444.4795 409.6218 50.6562 0.24 1806 +1808 3 445.4221 409.004 51.1188 0.2782 1807 +1809 3 446.255 408.2204 51.1778 0.2921 1808 +1810 3 447.264 407.7022 50.8547 0.2401 1809 +1811 3 448.2798 407.1988 50.5025 0.1775 1810 +1812 3 449.2545 406.6016 50.5646 0.1667 1811 +1813 3 450.2967 406.1703 50.9656 0.2067 1812 +1814 3 451.292 406.0022 52.2808 0.2805 1813 +1815 3 452.3296 405.7425 53.0818 0.2936 1814 +1816 3 453.2048 405.0698 52.4322 0.3051 1815 +1817 3 454.2504 404.6179 52.4031 0.3133 1816 +1818 3 455.2376 404.0986 52.9556 0.3625 1817 +1819 3 456.1048 403.3721 53.3652 0.3963 1818 +1820 3 456.9628 402.6388 53.6164 0.3994 1819 +1821 3 457.8139 401.9021 53.1835 0.3564 1820 +1822 3 458.6193 401.1001 53.3268 0.3014 1821 +1823 3 459.4636 400.3863 53.9221 0.2476 1822 +1824 3 460.4646 399.8623 54.2038 0.2254 1823 +1825 3 461.4816 399.399 54.014 0.2199 1824 +1826 3 462.6142 399.288 54.1321 0.2208 1825 +1827 3 463.7296 399.3178 54.595 0.1905 1826 +1828 3 464.798 399.6484 55.1062 0.1517 1827 +1829 3 465.7796 400.1723 55.7052 0.1225 1828 +1830 3 466.6811 400.6963 55.3316 0.1195 1829 +1831 3 467.5631 400.948 55.1653 0.1335 1830 +1832 3 468.5916 401.0075 55.5932 0.1613 1831 +1833 3 469.6109 401.2912 54.8041 0.2016 1832 +1834 3 470.5444 401.8025 55.1516 0.251 1833 +1835 3 471.6094 402.0108 55.8155 0.2759 1834 +1836 3 472.6859 401.7545 56.294 0.2701 1835 +1837 3 473.4066 400.9274 56.4973 0.2559 1836 +1838 3 473.8334 399.9664 57.5322 0.2542 1837 +1839 3 474.6033 399.2537 58.6062 0.2542 1838 +1840 3 475.578 398.6691 58.5956 0.2168 1839 +1841 3 476.4074 397.9095 58.0905 0.1781 1840 +1842 3 477.1212 397.0218 57.8435 0.1653 1841 +1843 3 478.0776 396.396 57.96 0.2288 1842 +1844 3 441.9592 411.1788 47.9024 0.2339 1803 +1845 3 443.0174 411.594 47.614 0.2042 1844 +1846 3 444.0047 412.1626 47.3729 0.2158 1845 +1847 3 444.8753 412.8913 47.6826 0.2659 1846 +1848 3 445.7138 413.6681 47.8036 0.2794 1847 +1849 3 446.684 414.2504 47.4074 0.2923 1848 +1850 3 447.5694 414.668 45.9637 0.2796 1849 +1851 3 448.6276 415.0009 45.2833 0.2794 1850 +1852 3 449.759 415.1599 45.2497 0.2675 1851 +1853 3 450.8973 415.0546 45.2012 0.2803 1852 +1854 3 452.039 415.0169 45.1576 0.2916 1853 +1855 3 453.143 414.8876 44.5024 0.278 1854 +1856 3 454.2366 414.668 43.9062 0.2525 1855 +1857 3 455.36 414.4655 44.0765 0.2297 1856 +1858 3 456.48 414.2424 44.0681 0.2424 1857 +1859 3 457.6034 414.2161 44.4212 0.2542 1858 +1860 3 458.6719 414.5753 43.967 0.2531 1859 +1861 3 459.7404 414.9666 44.1129 0.2402 1860 +1862 3 460.7849 415.2869 44.9056 0.2288 1861 +1863 3 461.8248 415.7571 45.0542 0.2307 1862 +1864 3 462.8384 416.265 44.9873 0.2415 1863 +1865 3 463.9263 416.5235 45.0318 0.247 1864 +1866 3 465.0349 416.6425 45.5333 0.2481 1865 +1867 3 466.1606 416.5258 45.7836 0.2536 1866 +1868 3 467.2645 416.2387 45.9052 0.2669 1867 +1869 3 468.3753 415.9813 45.8287 0.2731 1868 +1870 3 469.3889 416.2147 46.1552 0.2666 1869 +1871 3 470.2126 416.9605 46.7292 0.2542 1870 +1872 3 471.1427 417.5463 46.6371 0.2616 1871 +1873 3 472.1757 418.0084 46.2529 0.2746 1872 +1874 3 473.0749 418.6834 45.9264 0.264 1873 +1875 3 473.9443 419.4098 45.5661 0.2305 1874 +1876 3 474.9785 419.7599 45.1105 0.208 1875 +1877 3 476.0985 419.6947 45.1522 0.2202 1876 +1878 3 477.1944 419.7748 45.7542 0.2288 1877 +1879 3 478.16 420.3022 46.256 0.2113 1878 +1880 3 479.0626 420.9977 46.2997 0.1764 1879 +1881 3 479.9652 421.5983 45.5269 0.1557 1880 +1882 3 480.7717 422.1909 44.1888 0.1725 1881 +1883 3 481.8082 422.5467 43.7469 0.2106 1882 +1884 3 482.8664 422.1978 43.6276 0.2601 1883 +1885 3 483.9498 421.8546 43.3303 0.2782 1884 +1886 3 485.0686 421.8157 42.7994 0.2564 1885 +1887 3 486.2011 421.8958 42.4908 0.2075 1886 +1888 3 487.328 421.7299 42.3035 0.1555 1887 +1889 3 488.3313 421.1888 42.2232 0.1282 1888 +1890 3 489.3689 420.7071 42.3013 0.1149 1889 +1891 3 490.4911 420.4921 42.2878 0.1144 1890 +1892 3 491.626 420.3742 42.4637 0.1144 1891 +1893 3 492.7574 420.4738 42.1546 0.1144 1892 +1894 3 493.8316 420.7174 41.3963 0.1144 1893 +1895 3 494.9436 420.952 41.0617 0.1144 1894 +1896 3 496.0418 420.849 40.3217 0.1144 1895 +1897 3 497.1824 420.7632 40.32 0.1144 1896 +1898 3 431.9813 414.4735 48.5276 0.2727 1794 +1899 3 433.0852 414.7229 48.5624 0.1397 1898 +1900 3 434.1228 415.0558 48.2068 0.1335 1899 +1901 3 435.1467 415.4791 47.8579 0.1528 1900 +1902 3 436.142 415.9881 47.9632 0.1787 1901 +1903 3 437.0263 416.7089 47.8884 0.212 1902 +1904 3 437.8214 417.5074 48.0894 0.2361 1903 +1905 3 438.6451 418.283 48.309 0.2263 1904 +1906 3 439.5317 418.9957 48.0931 0.1929 1905 +1907 3 440.5647 419.3893 47.8862 0.1613 1906 +1908 3 441.6915 419.4842 47.5415 0.1525 1907 +1909 3 442.8241 419.5906 47.5138 0.17 1908 +1910 3 443.9338 419.4144 47.5745 0.2146 1909 +1911 3 445.0137 419.5506 47.1187 0.2662 1910 +1912 3 446.1142 419.7107 46.4971 0.2701 1911 +1913 3 447.2102 419.7954 45.7265 0.2183 1912 +1914 3 448.329 419.967 45.5661 0.1738 1913 +1915 3 449.4307 420.269 45.5927 0.1955 1914 +1916 3 450.466 420.746 45.7178 0.2747 1915 +1917 3 451.5231 421.1773 45.857 0.3439 1916 +1918 3 452.5138 421.7413 45.9774 0.3665 1917 +1919 3 453.4576 422.319 45.3432 0.3469 1918 +1920 3 454.327 423.0478 45.3242 0.2988 1919 +1921 3 455.3875 423.3898 44.8854 0.2584 1920 +1922 3 456.4068 423.8863 45.0526 0.2315 1921 +1923 3 457.4845 424.2364 44.7535 0.2402 1922 +1924 3 458.5884 424.1334 44.1521 0.2298 1923 +1925 3 459.721 424.1483 43.7928 0.2288 1924 +1926 3 460.7483 423.7342 44.4744 0.2298 1925 +1927 3 461.8465 423.455 44.5329 0.2818 1926 +1928 3 462.8704 423.6712 45.5062 0.3226 1927 +1929 3 463.8989 424.1346 45.194 0.3559 1928 +1930 3 464.8369 424.7375 45.6792 0.3536 1929 +1931 3 465.5394 425.6206 46.1068 0.3302 1930 +1932 3 466.2669 426.4878 46.2493 0.271 1931 +1933 3 467.1684 427.1364 46.8289 0.2345 1932 +1934 3 467.8868 427.8835 47.7462 0.2211 1933 +1935 3 468.3342 428.9234 48.1043 0.2229 1934 +1936 3 469.0297 429.715 48.5316 0.2161 1935 +1937 3 470.0604 430.1566 48.704 0.223 1936 +1938 3 470.9104 430.8361 48.7707 0.2426 1937 +1939 3 471.4561 431.82 49.1826 0.2612 1938 +1940 3 471.9652 432.8107 49.7748 0.2669 1939 +1941 3 472.798 433.5074 50.15 0.2747 1940 +1942 3 473.7636 434.0061 50.8878 0.2715 1941 +1943 3 474.6342 434.6651 51.5922 0.2669 1942 +1944 3 475.4739 435.427 51.9677 0.2406 1943 +1945 3 476.4543 435.9864 51.9652 0.2288 1944 +1946 3 477.4427 436.5447 52.19 0.2012 1945 +1947 3 478.1291 437.3912 52.8091 0.1811 1946 +1948 3 478.7102 438.3636 52.8021 0.1487 1947 +1949 3 479.4664 439.2113 52.8032 0.13 1948 +1950 3 480.2638 439.7845 54.0548 0.1168 1949 +1951 3 480.7671 440.7374 54.4897 0.1248 1950 +1952 3 481.2213 441.767 54.0837 0.1375 1951 +1953 3 481.7864 442.7543 53.8362 0.1504 1952 +1954 3 482.0622 443.8526 53.93 0.1417 1953 +1955 3 482.1422 444.9874 53.72 0.129 1954 +1956 3 482.323 446.1108 53.4498 0.1162 1955 +1957 3 482.5072 447.2388 53.3221 0.1144 1956 +1958 3 482.5449 448.3794 53.3607 0.1364 1957 +1959 3 482.1411 449.433 53.1852 0.1637 1958 +1960 3 481.2682 450.1617 53.1401 0.1893 1959 +1961 3 480.3427 450.8207 53.4517 0.1661 1960 +1962 3 479.4355 451.4693 54.084 0.1528 1961 +1963 3 478.5375 452.1317 54.6974 0.1525 1962 +1964 3 477.8488 453.024 55.16 0.2288 1963 +1965 2 416.948 419.5403 47.6647 0.1144 1 +1966 2 417.6046 420.4761 47.5507 0.1144 1965 +1967 2 418.2624 421.4107 47.4365 0.1144 1966 +1968 2 419.0827 422.1554 47.2511 0.1206 1967 +1969 2 419.8949 422.899 46.9409 0.1417 1968 +1970 2 420.3376 423.9332 46.9924 0.1684 1969 +1971 2 421.1339 424.5533 46.8101 0.1864 1970 +1972 2 422.2024 424.7397 47.327 0.1819 1971 +1973 2 423.0375 425.2854 48.4434 0.1678 1972 +1974 2 423.4688 426.3036 48.8449 0.1441 1973 +1975 2 423.9092 427.3504 49.1618 0.129 1974 +1976 2 424.4663 428.3456 49.1 0.1271 1975 +1977 2 425.044 429.326 48.8174 0.138 1976 +1978 2 425.6584 430.2641 49.264 0.1626 1977 +1979 2 426.5004 431.0043 49.7773 0.1652 1978 +1980 2 427.2176 431.86 49.2498 0.1652 1979 +1981 2 427.856 432.7752 49.84 0.1144 1980 +1982 3 416.8999 419.236 45.1746 0.1144 1 +1983 3 417.5245 420.0013 43.7637 0.1144 1982 +1984 3 418.1492 420.7666 42.3525 0.1256 1983 +1985 3 418.8058 421.5446 41.0732 0.161 1984 +1986 3 419.6936 422.2138 40.4936 0.2238 1985 +1987 3 420.7815 422.5284 40.2144 0.2883 1986 +1988 3 421.8306 422.136 39.8532 0.3432 1987 +1989 3 420.9016 421.6544 39.0558 0.2669 1988 +1990 3 420.6728 420.8055 37.8036 0.2669 1989 +1991 3 420.8696 419.7256 37.0546 0.2669 1990 +1992 3 420.8616 418.6216 36.7489 0.2838 1991 +1993 3 420.4063 418.0027 35.1926 0.3144 1992 +1994 3 419.3424 417.8208 34.6254 0.3178 1993 +1995 3 418.2556 417.4776 34.386 0.267 1994 +1996 3 417.2934 416.8988 33.8489 0.1144 1995 +1997 3 416.6826 416.4526 32.8378 0.1949 1996 +1998 3 415.7937 416.0373 31.4345 0.2569 1997 +1999 3 415.0318 415.725 32.6483 0.3018 1998 +2000 3 414.104 415.828 34.2311 0.3424 1999 +2001 3 412.9829 415.9492 34.6629 0.3807 2000 +2002 3 412.0562 416.0728 33.0711 0.4195 2001 +2003 3 411.3218 415.9836 33.0798 0.3811 2002 +2004 3 410.4649 416.0259 32.1793 0.3432 2003 +2005 3 409.989 416.7146 31.2967 0.3363 2004 +2006 3 409.3449 417.6046 32.006 0.3305 2005 +2007 3 408.5727 418.3928 32.0331 0.2806 2006 +2008 3 407.8738 419.2588 31.4084 0.244 2007 +2009 3 407.0947 420.0699 31.8041 0.2183 2008 +2010 3 406.311 420.8993 31.9318 0.2278 2009 +2011 3 405.6212 421.7699 31.2973 0.2288 2010 +2012 3 405.3478 422.6062 29.5565 0.2044 2011 +2013 3 404.7907 423.304 29.9611 0.1631 2012 +2014 3 404.9302 424.1872 30.3162 0.1398 2013 +2015 3 404.7712 424.8667 28.285 0.1398 2014 +2016 3 404.2461 425.6138 28.126 0.1658 2015 +2017 3 403.6993 426.402 29.6089 0.1991 2016 +2018 3 402.8768 427.1307 29.5758 0.2367 2017 +2019 3 402.267 427.5025 27.5783 0.2549 2018 +2020 3 401.1699 427.7748 27.2474 0.2669 2019 +2021 3 400.0488 427.8732 27.0144 0.2613 2020 +2022 3 398.9952 427.7954 26.4026 0.2345 2021 +2023 3 397.9335 427.5185 27.0337 0.2076 2022 +2024 3 396.8422 427.5437 26.9671 0.2073 2023 +2025 3 395.7943 427.379 26.068 0.2526 2024 +2026 3 394.7109 427.1284 25.6917 0.3043 2025 +2027 3 393.5886 426.9419 25.5492 0.3178 2026 +2028 3 392.4744 426.7749 25.6449 0.2911 2027 +2029 3 391.3658 426.744 26.3105 0.2574 2028 +2030 3 390.2584 426.831 26.364 0.2415 2029 +2031 3 389.151 426.9934 26.5317 0.2185 2030 +2032 3 388.1089 427.149 25.9809 0.1956 2031 +2033 3 387.0221 427.2783 25.5049 0.1907 2032 +2034 3 385.909 427.2119 25.9552 0.2287 2033 +2035 3 384.8565 427.4327 26.761 0.2852 2034 +2036 3 383.8051 427.4453 25.9179 0.3172 2035 +2037 3 383.0238 428.2347 25.3394 0.3042 2036 +2038 3 381.9896 428.563 25.1919 0.2841 2037 +2039 3 380.8696 428.5813 25.3266 0.2978 2038 +2040 3 379.76 428.7449 25.5338 0.3111 2039 +2041 3 378.791 429.1556 25.9759 0.2974 2040 +2042 3 378.4009 430.0102 25.0701 0.2707 2041 +2043 3 378.386 431.0169 25.5394 0.2563 2042 +2044 3 377.8826 431.9664 25.104 0.2881 2043 +2045 3 376.9228 432.4537 24.2948 0.3161 2044 +2046 3 376.1472 433.2328 24.92 0.3432 2045 +2047 3 411.3046 415.129 32.1364 0.3456 2002 +2048 3 410.4855 414.4174 31.99 0.3138 2047 +2049 3 409.4227 414.2413 32.5049 0.3226 2048 +2050 3 408.3096 414.2378 32.2269 0.3486 2049 +2051 3 407.248 413.9507 31.5722 0.3753 2050 +2052 3 406.215 414.1028 30.6886 0.3707 2051 +2053 3 405.2071 413.7654 29.8875 0.3457 2052 +2054 3 404.0848 413.6018 29.9158 0.3192 2053 +2055 3 402.9706 413.3466 29.8385 0.3052 2054 +2056 3 401.8872 412.984 29.68 0.3432 2055 +2057 3 417.5211 416.6917 30.9996 0.2585 1996 +2058 3 418.5049 416.2192 30.2204 0.3615 2057 +2059 3 419.6066 416.1208 29.965 0.4149 2058 +2060 3 420.3937 416.7192 28.9204 0.3664 2059 +2061 3 420.6831 417.3095 26.759 0.2968 2060 +2062 3 421.0195 418.2567 25.6124 0.2542 2061 +2063 3 421.6704 419.181 25.3901 0.2486 2062 +2064 3 422.5719 419.6444 25.4464 0.2545 2063 +2065 3 423.6827 419.578 25.9115 0.2744 2064 +2066 3 424.7775 419.3984 25.9818 0.2952 2065 +2067 3 425.8357 419.459 25.1835 0.3051 2066 +2068 3 426.3047 420.1786 23.7658 0.3155 2067 +2069 3 425.8849 421.1579 23.9176 0.3302 2068 +2070 3 425.4879 422.2287 24.0481 0.343 2069 +2071 3 424.4492 422.6954 23.9868 0.3432 2070 +2072 3 423.5317 423.1782 23.6723 0.3241 2071 +2073 3 422.6508 423.8188 22.8981 0.2773 2072 +2074 3 422.1371 424.6837 22.227 0.2488 2073 +2075 3 421.7939 425.6492 21.5152 0.2415 2074 +2076 3 421.2311 426.5965 21.0017 0.2415 2075 +2077 3 420.8536 427.6455 21.0126 0.2336 2076 +2078 3 420.0791 428.2141 21.9215 0.2466 2077 +2079 3 419.0518 428.3708 23.0787 0.2635 2078 +2080 3 418.3963 428.6717 25.0925 0.2669 2079 +2081 3 418.1103 429.6772 25.9507 0.2305 2080 +2082 3 417.3312 430.3728 24.92 0.2288 2081 +2083 3 425.8231 423.153 22.3068 0.225 2071 +2084 3 426.6731 423.7868 21.3234 0.193 2083 +2085 3 427.0072 424.8576 21.2206 0.1907 2084 +2086 3 426.9568 425.9581 21.9419 0.2278 2085 +2087 3 426.7417 427.0598 21.4424 0.254 2086 +2088 3 426.8264 428.1992 21.56 0.2288 2087 +2089 3 422.7709 421.3661 39.0477 0.256 1988 +2090 3 423.7387 420.7975 38.6831 0.2288 2089 +2091 3 424.8244 420.7964 38.0369 0.3008 2090 +2092 3 425.9409 420.5722 38.0584 0.3926 2091 +2093 3 426.9911 420.9794 37.6132 0.4957 2092 +2094 3 428.0928 420.8135 36.906 0.3934 2093 +2095 3 429.2185 420.754 36.7021 0.3232 2094 +2096 3 430.0113 420.9874 35.294 0.2963 2095 +2097 3 430.9928 421.167 34.3991 0.3017 2096 +2098 3 432.1128 421.024 34.188 0.3051 2097 +2099 3 433.147 421.0355 33.1618 0.3051 2098 +2100 3 434.1514 421.3283 32.0667 0.3051 2099 +2101 3 435.2623 421.3958 31.5487 0.3051 2100 +2102 3 436.3628 421.6681 31.2911 0.2933 2101 +2103 3 437.302 422.2996 31.586 0.2924 2102 +2104 3 438.3465 422.7526 31.3732 0.2924 2103 +2105 3 439.4276 422.43 31.2452 0.3296 2104 +2106 3 440.4652 421.9827 30.8042 0.3305 2105 +2107 3 441.5291 421.739 29.9782 0.318 2106 +2108 3 442.6719 421.7745 29.9541 0.3053 2107 +2109 3 443.7908 421.5468 29.8609 0.33 2108 +2110 3 444.913 421.3375 29.664 0.3806 2109 +2111 3 445.9724 421.6406 29.5322 0.3792 2110 +2112 3 446.3499 422.716 29.3829 0.3488 2111 +2113 3 446.5924 423.8211 29.6139 0.2828 2112 +2114 3 447.1942 424.7626 29.8824 0.2202 2113 +2115 3 448.0579 425.3552 29.1102 0.1725 2114 +2116 3 448.8324 425.3701 27.58 0.1525 2115 +2117 3 449.6435 424.5922 27.442 0.1699 2116 +2118 3 450.1102 424.0568 25.632 0.2161 2117 +2119 3 451.0197 423.7525 25.5559 0.2907 2118 +2120 3 452.1477 423.7731 25.5676 0.3373 2119 +2121 3 453.2574 423.6838 24.9785 0.3432 2120 +2122 3 454.2309 423.6461 23.5528 0.3104 2121 +2123 3 455.3143 423.7124 22.7273 0.2941 2122 +2124 3 456.2684 423.1793 23.1028 0.3036 2123 +2125 3 457.211 422.5536 23.506 0.3394 2124 +2126 3 458.3184 422.3076 23.6379 0.3549 2125 +2127 3 459.4315 422.3648 23.0686 0.3559 2126 +2128 3 460.2655 423.0398 22.1992 0.3311 2127 +2129 3 461.1453 423.7342 21.6303 0.3052 2128 +2130 3 461.8591 424.6265 21.5228 0.2288 2129 +2131 3 428.142 422.1623 36.9488 0.3607 2093 +2132 3 428.9966 422.7778 35.9517 0.2996 2131 +2133 3 429.9747 423.0112 34.9129 0.2597 2132 +2134 3 431.0935 423.0146 34.3395 0.2209 2133 +2135 3 432.114 423.2937 33.504 0.1746 2134 +2136 3 433.1333 423.7079 32.9602 0.1448 2135 +2137 3 434.2407 423.9081 33.2004 0.1398 2136 +2138 3 435.3721 424.0328 33.3992 0.1686 2137 +2139 3 436.3857 424.4549 32.7984 0.1993 2138 +2140 3 437.0629 425.3415 32.5702 0.2481 2139 +2141 3 437.2551 426.4557 32.7029 0.277 2140 +2142 3 437.9815 427.2829 33.231 0.3157 2141 +2143 3 439.0077 427.7553 32.933 0.33 2142 +2144 3 439.7078 428.6271 32.4288 0.3431 2143 +2145 3 440.1746 429.5926 33.3942 0.3299 2144 +2146 3 440.7397 430.5822 33.29 0.3034 2145 +2147 3 441.1195 431.598 32.408 0.2663 2146 +2148 3 441.7018 432.5636 32.0118 0.2535 2147 +2149 3 442.3756 433.4536 32.6225 0.2415 2148 +2150 3 443.0186 434.3162 33.5608 0.2406 2149 +2151 3 443.4876 435.3217 34.1928 0.2317 2150 +2152 3 443.8674 436.3948 33.9511 0.2688 2151 +2153 3 444.4028 437.3901 33.5524 0.2924 2152 +2154 3 445.1167 438.2572 33.2749 0.2855 2153 +2155 3 445.6395 439.1965 33.9478 0.2247 2154 +2156 3 446.2538 440.0819 33.4356 0.2071 2155 +2157 3 446.891 440.9411 33.9592 0.2369 2156 +2158 3 447.8337 441.5703 34.071 0.2931 2157 +2159 3 448.694 442.2979 33.7565 0.3296 2158 +2160 3 449.632 442.9225 33.3264 0.3358 2159 +2161 3 450.5438 443.6089 33.1962 0.3305 2160 +2162 3 451.2199 444.5069 33.1201 0.3305 2161 +2163 3 451.554 445.5846 33.2228 0.3305 2162 +2164 3 452.0791 446.5673 33.3119 0.314 2163 +2165 3 452.8856 447.3578 33.0484 0.2799 2164 +2166 3 453.7893 448.0282 32.5578 0.2582 2165 +2167 3 454.6828 448.6528 33.061 0.2542 2166 +2168 3 455.5854 449.2488 33.9704 0.282 2167 +2169 3 456.4835 449.8277 33.4496 0.312 2168 +2170 3 457.1699 450.6982 33.0798 0.3381 2169 +2171 3 457.9855 451.4888 32.951 0.333 2170 +2172 3 458.744 452.3307 32.625 0.3203 2171 +2173 3 459.5723 453.0652 33.1416 0.3075 2172 +2174 3 460.6591 453.1533 33.3698 0.3155 2173 +2175 3 461.7802 453.0446 33.8352 0.3286 2174 +2176 3 462.9127 453.1281 34.0298 0.3421 2175 +2177 3 464.0087 453.4393 34.2294 0.3305 2176 +2178 3 465.1115 453.3798 33.5093 0.303 2177 +2179 3 466.2132 453.2597 33.0711 0.277 2178 +2180 3 467.0472 453.3397 31.9206 0.2518 2179 +2181 3 467.9086 453.2551 33.5829 0.2336 2180 +2182 3 469.048 453.2757 33.8136 0.2161 2181 +2183 3 470.1257 453.0904 33.2979 0.2254 2182 +2184 3 471.0157 453.6006 32.881 0.258 2183 +2185 3 471.9263 454.2778 32.5486 0.2984 2184 +2186 3 472.9879 454.6725 32.6374 0.3161 2185 +2187 3 474.0622 455.0523 32.8947 0.3178 2186 +2188 3 475.1158 455.4378 32.408 0.2942 2187 +2189 3 476.2323 455.6552 32.1608 0.2675 2188 +2190 3 477.3477 455.7868 31.6327 0.2163 2189 +2191 3 478.4208 456.1128 31.08 0.1144 2190 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Rorb_325404214_m.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Rorb_325404214_m.swc new file mode 100644 index 0000000..cd1d585 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Rorb_325404214_m.swc @@ -0,0 +1,2194 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/neuron tracing and reconstruction/vaa3d/vaa3d_bin_msvc_64bit_v2921_a/vaa3d_bin_msvc_64bit_v2921_a/new 168053.04.01.01.swc +# id,type,x,y,z,r,pid +1 1 415.6095 417.7339 47.8951 6.2366 -1 +2 4 413.4633 416.9525 48.2236 0.1144 1 +3 4 412.3903 416.5624 48.3879 0.1652 2 +4 4 411.3172 416.1712 48.552 0.2542 3 +5 4 410.2441 415.7811 48.7166 0.3813 4 +6 4 409.1001 415.7559 48.72 0.4576 5 +7 4 409.1871 414.7286 47.5728 0.2587 6 +8 4 408.9468 413.7368 46.8028 0.2501 7 +9 4 408.4984 412.7644 46.6435 0.2908 8 +10 4 408.6242 411.7382 45.6862 0.3458 9 +11 4 409.0727 410.9088 44.2305 0.3686 10 +12 4 409.8048 410.1068 43.4174 0.3514 11 +13 4 410.4535 409.2797 43.8572 0.3085 12 +14 4 411.0884 408.408 44.1526 0.2746 13 +15 4 411.6181 407.415 43.7422 0.2852 14 +16 4 412.0162 406.3522 43.4109 0.3197 15 +17 4 412.4715 405.3181 43.0052 0.3672 16 +18 4 413.0721 404.4749 41.925 0.4006 17 +19 4 413.5045 403.538 40.7725 0.3955 18 +20 4 413.9804 402.5095 40.8229 0.3338 19 +21 4 414.533 401.5509 40.1475 0.2932 20 +22 4 415.3326 400.9068 38.9242 0.3176 21 +23 4 416.3394 400.972 37.6132 0.572 22 +24 4 416.9869 400.3554 39.8726 0.3938 23 +25 4 417.7831 400.1895 41.337 0.3185 24 +26 4 418.8962 400.0431 41.5464 0.2855 25 +27 4 419.9006 399.5306 41.4324 0.2954 26 +28 4 420.7186 398.787 40.8402 0.3374 27 +29 4 420.6717 397.6967 40.549 0.3432 28 +30 4 420.6763 396.5539 40.5409 0.3432 29 +31 4 420.4795 395.4293 40.5177 0.3432 30 +32 4 420.2175 394.3322 40.0576 0.3926 31 +33 4 420.1672 393.2317 39.3039 0.4188 32 +34 4 420.0779 392.1106 38.7923 0.4195 33 +35 4 420.1958 390.9849 39.1642 0.3822 34 +36 4 420.1546 389.8455 39.3565 0.3316 35 +37 4 420.0539 388.7209 39.8135 0.2806 36 +38 4 419.8549 387.6101 40.2632 0.2297 37 +39 4 419.848 386.4718 40.5278 0.2545 38 +40 4 420.2507 385.4136 40.178 0.3079 39 +41 4 420.4795 384.4206 38.9511 0.3813 40 +42 4 420.9943 383.4002 38.9544 0.3824 41 +43 4 421.4084 382.366 39.0348 0.394 42 +44 4 421.8683 381.5972 37.5304 0.3957 43 +45 4 422.6108 380.7655 38.134 0.3996 44 +46 4 423.2708 379.856 38.1679 0.3475 45 +47 4 423.6724 378.8081 37.8428 0.3077 46 +48 4 424.2261 377.8289 38.281 0.283 47 +49 4 424.6448 376.8485 38.7008 0.2885 48 +50 4 424.6322 375.7262 38.1615 0.2701 49 +51 4 424.7672 374.6154 37.7213 0.259 50 +52 4 425.3072 373.6853 37.2333 0.2619 51 +53 4 426.116 372.9177 36.7326 0.2598 52 +54 4 426.8939 372.0929 36.4652 0.2607 53 +55 4 427.6169 371.2269 36.2782 0.2477 54 +56 4 428.1729 370.2499 36.568 0.2482 55 +57 4 428.301 369.1997 37.119 0.268 56 +58 4 428.3296 368.0866 37.1496 0.2796 57 +59 4 428.476 366.9975 37.5558 0.2646 58 +60 4 428.4921 365.9404 38.614 0.2382 59 +61 4 428.6797 364.9795 38.04 0.2378 60 +62 4 428.9897 363.9556 38.1763 0.2415 61 +63 4 429.5823 362.9992 38.2914 0.2415 62 +64 4 430.096 362.2213 36.759 0.2418 63 +65 4 430.3202 361.1105 36.3874 0.2551 64 +66 4 430.7183 360.0397 36.2569 0.2796 65 +67 4 430.8579 358.9197 36.0772 0.2811 66 +68 4 430.525 357.8295 35.9792 0.2924 67 +69 4 430.2115 356.7541 35.4085 0.2942 68 +70 4 429.9884 355.6582 35.2243 0.3032 69 +71 4 429.9575 354.592 35.8677 0.2844 70 +72 4 429.6738 353.5406 35.5443 0.2442 71 +73 4 429.8992 352.4286 35.8708 0.2127 72 +74 4 430.1532 351.327 36.101 0.2107 73 +75 4 430.3842 350.2345 35.5944 0.2401 74 +76 4 430.6085 349.1705 34.858 0.271 75 +77 4 430.5833 348.0357 34.8202 0.2796 76 +78 4 430.4552 346.91 34.9826 0.2749 77 +79 4 430.1429 345.8644 35.2422 0.2669 78 +80 4 429.6887 344.8828 35.9436 0.2669 79 +81 4 429.4027 343.7823 35.9912 0.2617 80 +82 4 429.3283 342.644 35.9752 0.2488 81 +83 4 429.2654 341.5092 35.7739 0.2415 82 +84 4 428.9542 340.4315 35.8243 0.2476 83 +85 4 428.5435 339.3756 35.9411 0.2542 84 +86 4 428.2964 338.2659 35.7216 0.241 85 +87 4 428.253 337.1345 35.7787 0.2155 86 +88 4 428.1935 336.002 35.887 0.2034 87 +89 4 428.047 334.8694 35.7493 0.2102 88 +90 4 428.1168 333.7654 35.2537 0.223 89 +91 4 428.6431 332.8171 34.7704 0.2288 90 +92 4 429.3054 331.8961 34.8337 0.2288 91 +93 4 429.9449 330.9512 34.9664 0.2207 92 +94 4 430.3202 329.8987 34.8869 0.1989 93 +95 4 430.4174 328.7684 34.5817 0.1731 94 +96 4 430.6279 327.6588 34.2415 0.1564 95 +97 4 430.7926 326.5354 33.9646 0.1525 96 +98 4 430.9494 325.4142 33.5664 0.1436 97 +99 4 431.0912 324.2851 33.5502 0.1398 98 +100 4 431.0478 323.1537 33.8419 0.1398 99 +101 4 431.0958 322.02 33.7761 0.1683 100 +102 4 431.3578 320.9114 33.7848 0.2067 101 +103 4 431.8943 319.9127 33.9287 0.2647 102 +104 4 432.4148 318.9209 33.4818 0.3095 103 +105 4 432.9239 317.9176 33.7086 0.3281 104 +106 4 433.3358 316.8571 33.9564 0.3305 105 +107 4 433.4238 315.7566 34.571 0.32 106 +108 4 433.3461 314.6229 34.6052 0.3283 107 +109 4 433.2431 313.488 34.3664 0.3305 108 +110 4 433.0887 312.3589 34.5268 0.3517 109 +111 4 432.8175 311.2549 34.7973 0.3453 110 +112 4 432.5212 310.1636 35.2173 0.3218 111 +113 4 432.3656 309.0573 35.8081 0.2853 112 +114 4 432.0648 308.1101 34.6562 0.3042 113 +115 4 431.8589 307.0118 35.1266 0.3426 114 +116 4 431.6495 305.8873 35.1862 0.3808 115 +117 4 431.0535 304.9126 35.303 0.3813 116 +118 4 430.7801 303.8086 35.5578 0.3683 117 +119 4 430.2939 302.7882 35.1344 0.3556 118 +120 4 430.0639 301.6831 34.7032 0.3443 119 +121 4 430.0937 300.5505 34.3185 0.3686 120 +122 4 430.1097 299.4168 34.0116 0.3661 121 +123 4 430.2573 298.3014 34.214 0.3355 122 +124 4 430.7995 297.3164 33.9262 0.2754 123 +125 4 430.8773 296.1953 33.906 0.2567 124 +126 4 430.5833 295.1051 34.3484 0.2754 125 +127 4 430.3225 294.0137 34.8872 0.3123 126 +128 4 430.0273 292.9304 35.1792 0.3354 127 +129 4 429.8694 291.8069 35.0829 0.3377 128 +130 4 429.8408 290.6652 35.1207 0.3305 129 +131 4 429.7127 289.5327 35.0314 0.3249 130 +132 4 429.5125 288.4241 35.3021 0.3178 131 +133 4 429.3077 287.3534 36.1228 0.312 132 +134 4 429.3672 286.3329 36.2785 0.3111 133 +135 4 429.8305 285.3182 35.6964 0.3178 134 +136 4 430.2378 284.2783 35.8817 0.324 135 +137 4 430.5764 283.2144 36.4549 0.3305 136 +138 4 430.9356 282.29 35.7034 0.3378 137 +139 4 431.4768 281.4068 34.9874 0.3272 138 +140 4 432.1952 280.534 35.2635 0.2932 139 +141 4 432.9113 279.6497 35.4343 0.2627 140 +142 4 433.6607 278.7928 35.6118 0.2629 141 +143 4 434.4203 278.0069 36.3698 0.2845 142 +144 4 435.3046 277.3308 36.4988 0.2924 143 +145 4 436.1237 276.7164 35.4046 0.2924 144 +146 4 436.9531 276.1078 34.1916 0.2924 145 +147 4 437.683 275.4283 35.1582 0.2924 146 +148 4 437.8969 274.3449 35.6446 0.2439 147 +149 4 438.4952 273.416 35.0 0.1144 148 +150 4 415.304 399.582 36.0962 0.321 23 +151 4 414.6165 398.7 35.6356 0.286 150 +152 4 414.1074 397.7013 35.1806 0.2956 151 +153 4 413.6109 396.7049 34.594 0.3312 152 +154 4 413.1922 396.0082 32.8079 0.3432 153 +155 4 412.9577 395.0278 32.405 0.3337 154 +156 4 413.1442 393.9204 32.4181 0.3113 155 +157 4 413.6361 392.9057 32.7368 0.3051 156 +158 4 414.4129 392.3119 34.0194 0.3051 157 +159 4 415.3143 391.8303 33.3642 0.3199 158 +160 4 415.7754 390.9952 32.1745 0.3332 159 +161 4 415.4756 389.9232 31.5952 0.3367 160 +162 4 414.9837 388.9348 31.0271 0.3075 161 +163 4 414.3968 388.0551 30.0538 0.2597 162 +164 4 414.0822 387.061 29.3129 0.2108 163 +165 4 414.4048 386.1812 27.8964 0.2034 164 +166 4 414.4449 385.3106 26.6983 0.2496 165 +167 4 413.7802 384.6139 25.3638 0.3076 166 +168 4 413.6818 383.6255 25.338 0.3634 167 +169 4 414.3305 382.7652 26.1512 0.3324 168 +170 4 414.3568 381.6384 26.04 0.2288 169 +171 4 408.0202 415.4951 48.7203 0.483 6 +172 4 406.8808 415.3944 48.722 0.5084 171 +173 4 405.8214 414.9608 48.7309 0.5212 172 +174 4 404.8971 414.287 48.771 0.5466 173 +175 4 404.0402 413.532 48.9317 0.5212 174 +176 4 403.0941 412.952 49.6079 0.4576 175 +177 4 402.1812 412.4841 49.8131 0.4069 176 +178 4 401.1688 411.951 49.812 0.4195 177 +179 4 400.2009 411.3435 49.6801 0.394 178 +180 4 399.3876 410.5873 49.0104 0.3686 179 +181 4 398.5925 409.7682 48.8412 0.3559 180 +182 4 397.8649 408.8988 49.2358 0.3432 181 +183 4 397.111 408.0671 49.7594 0.3051 182 +184 4 396.0185 407.7273 49.6936 0.3178 183 +185 4 394.9077 407.7296 49.0249 0.3686 184 +186 4 393.7648 407.7754 48.9742 0.4449 185 +187 4 392.67 407.9813 49.4808 0.4299 186 +188 4 391.5832 407.9538 49.0952 0.3868 187 +189 4 390.6016 407.518 48.193 0.3358 188 +190 4 389.7093 406.8533 47.6756 0.3001 189 +191 4 388.8616 406.0868 47.6003 0.3025 190 +192 4 387.9613 405.3878 47.5933 0.343 191 +193 4 386.9763 404.8055 47.5619 0.4065 192 +194 4 385.9593 404.2965 47.3673 0.455 193 +195 4 384.9697 403.7679 46.8983 0.4703 194 +196 4 384.0911 403.0632 46.5136 0.4602 195 +197 4 383.2732 402.2636 46.4439 0.4399 196 +198 4 382.4655 401.4559 46.3336 0.4272 197 +199 4 381.6578 400.6494 46.2862 0.4303 198 +200 4 380.8502 399.844 46.48 0.4576 199 +201 4 380.4235 399.3956 45.3678 0.3814 200 +202 4 379.6467 398.557 45.3474 0.2288 201 +203 4 379.236 398.287 46.4797 0.3432 202 +204 4 379.2497 398.8911 48.2451 0.2529 203 +205 4 378.5096 398.4632 50.0976 0.2446 204 +206 4 377.7866 397.8855 51.7076 0.2687 205 +207 4 376.8061 397.4702 52.6896 0.2796 206 +208 4 375.7102 397.2128 53.1577 0.2775 207 +209 4 374.6154 396.8982 53.312 0.269 208 +210 4 373.5995 396.3868 53.606 0.282 209 +211 4 372.5733 395.9018 53.8331 0.295 210 +212 4 371.482 395.5998 54.1478 0.3051 211 +213 4 370.4398 395.228 54.8498 0.2992 212 +214 4 369.3827 394.8676 55.4196 0.2796 213 +215 4 368.2753 394.7292 55.923 0.2764 214 +216 4 367.1897 394.9546 56.4553 0.2706 215 +217 4 366.1647 395.4236 56.9215 0.2648 216 +218 4 365.1099 395.7737 57.5506 0.1946 217 +219 4 364.0437 396.0436 58.2845 0.1608 218 +220 4 363.0118 396.4841 58.7518 0.275 219 +221 4 362.0474 397.0835 59.0744 0.2843 220 +222 4 361.1105 397.6887 59.6562 0.2503 221 +223 4 360.1312 397.9393 60.5413 0.2065 222 +224 4 359.2755 397.3627 61.3416 0.1965 223 +225 4 358.7241 396.404 62.0234 0.2094 224 +226 4 358.1853 395.4282 62.5694 0.2282 225 +227 4 357.3948 394.6754 63.0974 0.2542 226 +228 4 356.4326 394.1595 63.922 0.2801 227 +229 4 355.6673 393.4136 64.3871 0.2924 228 +230 4 355.1685 392.3954 64.1855 0.2718 229 +231 4 354.8127 391.3796 64.6596 0.2182 230 +232 4 354.3185 390.4632 65.721 0.1674 231 +233 4 353.5864 390.0582 67.3389 0.1441 232 +234 4 352.7455 390.4621 68.5376 0.1753 233 +235 4 351.8395 391.1027 69.2101 0.2267 234 +236 4 350.9838 391.8257 69.7435 0.2783 235 +237 4 350.1475 392.5945 69.6993 0.2718 236 +238 4 349.8341 393.655 69.8524 0.2115 237 +239 4 348.8834 394.1778 69.7253 0.1414 238 +240 4 347.8744 394.7063 69.4823 0.1273 239 +241 4 346.8848 395.2806 69.5565 0.1522 240 +242 4 345.7717 395.3756 70.1296 0.1906 241 +243 4 344.6597 395.5838 70.5502 0.216 242 +244 4 343.5352 395.5014 71.0214 0.2161 243 +245 4 342.4358 395.3481 71.6937 0.2034 244 +246 4 341.3467 395.0301 72.065 0.1907 245 +247 4 340.34 394.68 73.08 0.2288 246 +248 4 378.3826 397.5995 46.4792 0.3676 203 +249 4 377.4983 396.8742 46.4766 0.3807 248 +250 4 376.678 396.0768 46.4666 0.3692 249 +251 4 375.9321 395.2097 46.4117 0.3686 250 +252 4 375.1107 394.4249 46.0888 0.3686 251 +253 4 374.0949 393.9444 45.5946 0.3933 252 +254 4 373.0355 393.5349 45.2698 0.394 253 +255 4 372.0299 393.0212 44.8274 0.394 254 +256 4 371.0793 392.3989 44.4973 0.3816 255 +257 4 370.0588 391.8909 44.7177 0.3688 256 +258 4 368.9377 391.6793 44.5665 0.3812 257 +259 4 367.8246 391.4413 44.2938 0.3939 258 +260 4 366.8328 390.8716 44.2406 0.457 259 +261 4 365.8924 390.2195 44.2322 0.4828 260 +262 4 364.9394 389.5881 44.2014 0.5082 261 +263 4 363.9865 388.9577 44.0605 0.4832 262 +264 4 362.9832 388.4544 43.5207 0.4704 263 +265 4 361.9891 387.9018 43.2281 0.4577 264 +266 4 360.9938 387.3424 43.4375 0.4576 265 +267 4 359.9871 386.839 43.937 0.445 266 +268 4 358.9494 386.3597 44.0152 0.4196 267 +269 4 357.9336 385.9009 43.3874 0.3941 268 +270 4 356.8044 385.7499 43.1214 0.3813 269 +271 4 355.6616 385.6973 43.1144 0.394 270 +272 4 354.5588 385.3953 43.0825 0.394 271 +273 4 353.488 384.9983 42.901 0.394 272 +274 4 352.5522 384.408 42.1901 0.3686 273 +275 4 351.8544 383.5054 42.0039 0.3686 274 +276 4 351.0364 382.7046 41.9941 0.3686 275 +277 4 350.0514 382.1235 41.9692 0.3813 276 +278 4 348.9372 381.8729 41.7981 0.3686 277 +279 4 347.8915 381.5148 41.0754 0.3432 278 +280 4 346.8608 381.0264 40.8797 0.3051 279 +281 4 345.9639 380.3239 40.8766 0.2648 280 +282 4 345.0224 379.6764 40.8626 0.25 281 +283 4 344.0122 379.1399 40.7929 0.2245 282 +284 4 343.0581 378.5313 40.5518 0.2034 283 +285 4 342.2688 377.7213 40.1178 0.2104 284 +286 4 341.4279 376.9674 39.8028 0.2513 285 +287 4 340.4212 376.4286 39.76 0.2949 286 +288 4 339.3562 376.0111 39.76 0.3001 287 +289 4 338.2854 375.6107 39.76 0.2722 288 +290 4 337.2489 375.137 39.76 0.2466 289 +291 4 336.3589 374.4289 39.76 0.2749 290 +292 4 335.637 373.5412 39.76 0.3105 291 +293 4 334.9495 372.6283 39.76 0.3278 292 +294 4 334.183 371.7806 39.7594 0.3178 293 +295 4 333.3158 371.0381 39.7572 0.3288 294 +296 4 332.3549 370.4192 39.7446 0.3769 295 +297 4 331.331 369.9113 39.6673 0.4124 296 +298 4 330.3048 369.4239 39.3896 0.4237 297 +299 4 329.329 368.8553 38.9385 0.3883 298 +300 4 328.3875 368.2181 38.6702 0.36 299 +301 4 327.4757 367.5283 38.64 0.3247 300 +302 4 326.6154 366.7756 38.6406 0.2964 301 +303 4 325.7117 366.08 38.6445 0.2639 302 +304 4 324.6924 365.5663 38.6669 0.2572 303 +305 4 323.6216 365.1682 38.7755 0.276 304 +306 4 322.5565 364.7713 39.088 0.3112 305 +307 4 321.5006 364.3663 39.5066 0.3397 306 +308 4 320.4561 363.9178 39.7051 0.3811 307 +309 4 319.51 363.2875 39.6326 0.4356 308 +310 4 318.7321 362.4615 39.3523 0.4863 309 +311 4 318.0572 361.5498 38.985 0.4924 310 +312 4 317.3879 360.6266 38.8388 0.4764 311 +313 4 316.6947 359.7171 38.9099 0.4609 312 +314 4 315.9762 358.8305 39.0729 0.4736 313 +315 4 315.212 357.9919 39.4201 0.4864 314 +316 4 314.417 357.1785 39.6676 0.4957 315 +317 4 313.6425 356.34 39.5324 0.4921 316 +318 4 312.9046 355.4786 39.1768 0.4725 317 +319 4 312.1381 354.6469 38.8032 0.4343 318 +320 4 311.2538 353.9307 38.6481 0.3995 319 +321 4 310.2517 353.3919 38.6378 0.3887 320 +322 4 309.1534 353.0899 38.6254 0.4144 321 +323 4 308.0186 352.9492 38.5529 0.436 322 +324 4 306.91 352.7192 38.3054 0.441 323 +325 4 305.8781 352.2662 37.8907 0.4282 324 +326 4 304.9424 351.6267 37.5911 0.4276 325 +327 4 304.1255 350.8328 37.5203 0.449 326 +328 4 303.4185 349.9336 37.5214 0.4617 327 +329 4 302.7722 348.9909 37.527 0.4662 328 +330 4 302.2025 348.0002 37.5575 0.4617 329 +331 4 301.6842 346.9821 37.6844 0.4745 330 +332 4 301.1019 346.0085 38.0041 0.483 331 +333 4 300.4453 345.0876 38.4062 0.4745 332 +334 4 299.76 344.1758 38.6131 0.4404 333 +335 4 299.0702 343.2641 38.631 0.3896 334 +336 4 298.3644 342.3637 38.598 0.3473 335 +337 4 297.6002 341.5183 38.463 0.3435 336 +338 4 296.7124 340.8228 38.1265 0.3953 337 +339 4 295.7171 340.2851 37.7236 0.4673 338 +340 4 294.6933 339.784 37.5374 0.513 339 +341 4 293.6694 339.2738 37.52 0.5166 340 +342 4 292.681 338.7006 37.52 0.5084 341 +343 4 291.752 338.0348 37.52 0.513 342 +344 4 290.8826 337.2924 37.52 0.5212 343 +345 4 290.0601 336.4973 37.52 0.5074 344 +346 4 289.265 335.6748 37.52 0.4646 345 +347 4 288.5134 334.8133 37.5194 0.4138 346 +348 4 287.8498 333.8833 37.5166 0.372 347 +349 4 287.2206 332.9292 37.5049 0.3559 348 +350 4 286.5079 332.0368 37.4452 0.3606 349 +351 4 285.7312 331.204 37.2263 0.3733 350 +352 4 284.9201 330.4204 36.7702 0.3766 351 +353 4 284.046 329.726 36.1777 0.3734 352 +354 4 283.1034 329.1368 35.5334 0.3909 353 +355 4 282.1161 328.63 34.86 0.4308 354 +356 4 281.1277 328.0981 34.3644 0.4703 355 +357 4 280.169 327.4803 34.1827 0.4703 356 +358 4 279.2367 326.8191 34.16 0.4606 357 +359 4 278.3226 326.1304 34.16 0.4693 358 +360 4 277.4177 325.4302 34.16 0.5182 359 +361 4 276.4808 324.7759 34.16 0.5436 360 +362 4 275.5072 324.1753 34.16 0.5347 361 +363 4 274.5737 323.5221 34.16 0.4859 362 +364 4 273.7786 322.7075 34.16 0.4552 363 +365 4 273.1003 321.7855 34.16 0.4322 364 +366 4 272.4528 320.8428 34.1592 0.4272 365 +367 4 271.7881 319.9127 34.1555 0.4245 366 +368 4 271.0456 319.0456 34.1379 0.4372 367 +369 4 270.1819 318.302 34.0435 0.4398 368 +370 4 269.2244 317.6911 33.7641 0.4219 369 +371 4 268.1856 317.269 33.3589 0.391 370 +372 4 267.0645 317.1317 33.0954 0.3794 371 +373 4 265.9331 317.0367 33.0324 0.3829 372 +374 4 264.9195 316.5745 32.9958 0.3802 373 +375 4 264.0466 315.8412 32.8037 0.388 374 +376 4 263.112 315.2223 32.4044 0.3994 375 +377 4 262.0618 314.7991 32.058 0.4073 376 +378 4 261.0208 314.3415 31.9348 0.3695 377 +379 4 260.1204 313.6562 31.92 0.3432 378 +380 4 259.4283 312.7547 31.92 0.3683 379 +381 4 258.925 311.732 31.92 0.4319 380 +382 4 258.576 310.644 31.92 0.4703 381 +383 4 258.2397 309.5527 31.92 0.4449 382 +384 4 257.7192 308.5437 31.92 0.4003 383 +385 4 256.9813 307.6777 31.9203 0.3749 384 +386 4 256.0901 306.9684 31.9208 0.375 385 +387 4 255.0994 306.3998 31.9236 0.3878 386 +388 4 254.0698 305.9022 31.9413 0.407 387 +389 4 253.062 305.3668 32.048 0.4324 388 +390 4 252.1319 304.7216 32.373 0.4384 389 +391 4 251.2499 304.0134 32.7981 0.4192 390 +392 4 250.3518 303.3144 33.0142 0.3871 391 +393 4 249.432 302.6349 33.0403 0.3686 392 +394 4 248.4917 301.984 33.0408 0.3621 393 +395 4 247.5948 301.2793 33.045 0.3691 394 +396 4 246.913 300.3812 33.073 0.3813 395 +397 4 246.5412 299.3162 33.2626 0.3813 396 +398 4 246.3959 298.1962 33.6736 0.3745 397 +399 4 246.2277 297.0785 34.0158 0.3821 398 +400 4 245.8296 296.018 34.0626 0.4279 399 +401 4 245.2439 295.0468 33.7896 0.478 400 +402 4 244.5723 294.1384 33.353 0.5024 401 +403 4 243.8116 293.2964 33.0775 0.4948 402 +404 4 242.9513 292.5471 32.9596 0.4694 403 +405 4 242.0189 291.8996 32.6813 0.4303 404 +406 4 241.0934 291.2532 32.2445 0.3931 405 +407 4 240.2594 290.4868 31.9768 0.3744 406 +408 4 239.5227 289.6139 31.922 0.3823 407 +409 4 238.8249 288.7078 31.92 0.4077 408 +410 4 238.0904 287.8315 31.92 0.4401 409 +411 4 237.2805 287.0262 31.9197 0.4782 410 +412 4 236.4305 286.2608 31.9192 0.4957 411 +413 4 235.5988 285.4749 31.9164 0.4888 412 +414 4 234.7854 284.6707 31.906 0.4693 413 +415 4 233.9663 283.8722 31.8637 0.4645 414 +416 4 233.114 283.1171 31.6534 0.484 415 +417 4 232.2091 282.4399 31.2385 0.4957 416 +418 4 231.2299 281.8747 30.903 0.4888 417 +419 4 230.1797 281.4274 30.8031 0.4555 418 +420 4 229.134 280.9675 30.7997 0.4253 419 +421 4 228.1502 280.3887 30.7994 0.4057 420 +422 4 227.2796 279.6542 30.7975 0.3871 421 +423 4 226.5726 278.7631 30.7852 0.3607 422 +424 4 225.9 277.8387 30.7269 0.3432 423 +425 4 225.0648 277.0894 30.4416 0.3708 424 +426 4 224.0375 276.6547 30.0476 0.4285 425 +427 4 222.9462 276.3401 30.0675 0.4576 426 +428 4 221.9028 275.9088 30.4612 0.4299 427 +429 4 220.9075 275.3619 30.7292 0.386 428 +430 4 219.9935 274.6836 30.7406 0.3756 429 +431 4 219.3174 273.7912 30.5004 0.3954 430 +432 4 218.9639 272.7319 30.0583 0.3926 431 +433 4 218.6756 271.6359 29.7497 0.3742 432 +434 4 218.1597 270.6292 29.68 0.3615 433 +435 4 217.3692 269.8204 29.68 0.3993 434 +436 4 216.375 269.2782 29.6797 0.4395 435 +437 4 215.358 268.7622 29.6786 0.4595 436 +438 4 214.4645 268.0586 29.6713 0.4555 437 +439 4 213.7633 267.1652 29.6344 0.4671 438 +440 4 213.102 266.2363 29.4742 0.4904 439 +441 4 212.363 265.3851 29.05 0.4957 440 +442 4 211.5565 264.5912 28.6854 0.4658 441 +443 4 210.7317 263.8007 28.5928 0.4149 442 +444 4 209.9251 262.9907 28.6689 0.3566 443 +445 4 209.1186 262.1876 28.9489 0.3154 444 +446 4 208.208 261.5184 29.2177 0.3051 445 +447 4 207.2264 260.9624 28.954 0.3281 446 +448 4 206.2678 260.3938 28.3296 0.3662 447 +449 4 205.316 259.8035 27.764 0.389 448 +450 4 204.387 259.1515 27.4935 0.4018 449 +451 4 203.5393 258.3873 27.4383 0.399 450 +452 4 202.7751 257.5373 27.4187 0.394 451 +453 4 202.0567 256.6484 27.3255 0.3784 452 +454 4 201.3028 255.8007 27.0217 0.3686 453 +455 4 200.4666 255.0342 26.6798 0.3686 454 +456 4 199.5388 254.3856 26.7848 0.3686 455 +457 4 198.6018 253.7381 27.0346 0.3445 456 +458 4 197.7427 253.007 26.7708 0.3062 457 +459 4 196.8904 252.2692 26.2962 0.276 458 +460 4 195.9317 251.6834 25.8591 0.2834 459 +461 4 194.9387 251.148 25.4038 0.3091 460 +462 4 194.099 250.3987 25.2151 0.3433 461 +463 4 193.4184 249.4824 25.1972 0.3559 462 +464 4 192.7949 248.5237 25.1854 0.3644 463 +465 4 192.1577 247.5742 25.1272 0.3772 464 +466 4 191.4129 246.715 24.9248 0.3986 465 +467 4 190.5675 245.9634 24.5428 0.4068 466 +468 4 189.7267 245.2015 24.2012 0.3981 467 +469 4 189.0025 244.3241 24.0878 0.3766 468 +470 4 188.4191 243.3425 24.0755 0.3599 469 +471 4 187.8334 242.361 24.0565 0.3383 470 +472 4 187.06 241.5304 23.9554 0.3305 471 +473 4 186.1368 240.8784 23.6239 0.3394 472 +474 4 185.1907 240.2823 23.0392 0.3521 473 +475 4 184.2687 239.6577 22.4062 0.347 474 +476 4 183.3454 239.0182 21.8744 0.3163 475 +477 4 182.3982 238.4016 21.4458 0.2961 476 +478 4 181.459 237.7621 21.1324 0.3016 477 +479 4 180.625 236.9922 21.2453 0.3327 478 +480 4 179.8185 236.1971 21.6258 0.3525 479 +481 4 178.941 235.4741 21.9047 0.3652 480 +482 4 177.9709 234.8872 22.2057 0.3592 481 +483 4 176.8818 234.6493 22.636 0.3463 482 +484 4 175.7459 234.6138 22.9093 0.3139 483 +485 4 174.6408 234.3587 22.972 0.2851 484 +486 4 173.6649 233.7787 23.0171 0.2898 485 +487 4 172.7863 233.0522 23.2008 0.3227 486 +488 4 171.9089 232.3372 23.5858 0.3709 487 +489 4 171.0383 231.6097 23.9509 0.4117 488 +490 4 170.2055 230.8306 24.1494 0.4297 489 +491 4 169.3967 230.0298 24.4166 0.422 490 +492 4 168.5947 229.2336 24.8441 0.3991 491 +493 4 167.7779 228.4408 25.132 0.3838 492 +494 4 166.9119 227.696 25.1961 0.3813 493 +495 4 165.9486 227.0829 25.2 0.3504 494 +496 4 164.9179 226.5886 25.1997 0.3226 495 +497 4 163.9386 226.0006 25.1994 0.2865 496 +498 4 163.1699 225.1644 25.1975 0.2902 497 +499 4 162.5075 224.2332 25.1877 0.2924 498 +500 4 161.7662 223.3637 25.1462 0.3137 499 +501 4 160.9551 222.5629 24.92 0.3391 500 +502 4 160.1474 221.7724 24.4986 0.3645 501 +503 4 159.3226 220.9899 24.1842 0.3792 502 +504 4 158.4005 220.3184 24.089 0.3813 503 +505 4 157.4052 219.7544 24.08 0.3813 504 +506 4 156.4763 219.0897 24.08 0.3704 505 +507 4 155.6309 218.321 24.08 0.3577 506 +508 4 154.7397 217.6048 24.08 0.3342 507 +509 4 153.7753 216.9905 24.08 0.3087 508 +510 4 152.7686 216.4482 24.0803 0.2831 509 +511 4 151.8202 215.811 24.0811 0.2796 510 +512 4 151.0194 214.9976 24.0853 0.3129 511 +513 4 150.2587 214.1431 24.1032 0.362 512 +514 4 149.4544 213.3308 24.1749 0.4019 513 +515 4 148.5964 212.5838 24.4712 0.4179 514 +516 4 147.727 211.8619 24.8931 0.4084 515 +517 4 146.9365 211.0428 25.1381 0.3621 516 +518 4 146.2307 210.1448 25.0807 0.2887 517 +519 4 145.4665 209.3154 24.6375 0.2345 518 +520 4 144.525 208.7308 23.9929 0.2288 519 +521 4 143.4782 208.2812 23.8067 0.2863 520 +522 4 142.4955 207.7001 23.9106 0.3387 521 +523 4 141.6775 206.9118 23.6776 0.3899 522 +524 4 140.9751 206.0264 23.2506 0.394 523 +525 4 140.3082 205.102 23.0317 0.3823 524 +526 4 139.6904 204.1399 23.0759 0.3578 525 +527 4 139.028 203.2236 23.4875 0.3441 526 +528 4 138.2261 202.4285 23.9173 0.3195 527 +529 4 137.2686 201.8085 24.0394 0.3059 528 +530 4 136.279 201.2365 23.9515 0.2932 529 +531 4 135.3638 200.5729 23.5306 0.3282 530 +532 4 134.5401 199.7859 23.3173 0.3305 531 +533 4 133.8194 198.8981 23.2876 0.3305 532 +534 4 133.1467 197.9898 22.8595 0.2823 533 +535 4 132.5736 197.0346 22.2306 0.2556 534 +536 4 131.8849 196.1308 21.9187 0.2058 535 +537 4 130.9319 195.505 21.9433 0.2034 536 +538 4 130.0019 194.8747 22.4608 0.2034 537 +539 4 129.3052 193.9835 22.8472 0.2651 538 +540 4 128.6371 193.0546 22.8894 0.2793 539 +541 4 128.2092 192.0021 22.5851 0.3169 540 +542 4 127.9427 190.9691 23.571 0.3178 541 +543 4 127.0492 190.309 24.2091 0.4576 542 +544 4 126.3559 189.8857 23.1672 0.3814 543 +545 4 125.5185 189.1124 22.9373 0.3559 544 +546 4 124.7212 188.2932 22.8298 0.3559 545 +547 4 123.9936 187.4318 22.3429 0.3559 546 +548 4 123.2568 186.6573 21.3503 0.3559 547 +549 4 122.3794 185.9606 20.7827 0.3559 548 +550 4 121.5603 185.1633 20.7211 0.394 549 +551 4 120.7561 184.3499 20.72 0.4449 550 +552 4 119.9678 183.5193 20.72 0.4322 551 +553 4 119.2826 182.6041 20.72 0.394 552 +554 4 118.5481 181.7267 20.72 0.3432 553 +555 4 117.7073 180.9511 20.72 0.3686 554 +556 4 116.7715 180.2933 20.72 0.3686 555 +557 4 115.9558 179.4913 20.72 0.3559 556 +558 4 115.3026 178.5521 20.72 0.3178 557 +559 4 114.7718 177.5385 20.72 0.3178 558 +560 4 113.9426 176.7503 20.7206 0.3305 559 +561 4 113.1704 176.2057 20.7239 0.3827 560 +562 4 112.2468 175.5308 20.7393 0.3836 561 +563 4 111.3422 174.8318 20.8261 0.3501 562 +564 4 110.4583 174.1122 21.063 0.312 563 +565 4 109.5664 173.4007 21.2691 0.2632 564 +566 4 108.6763 172.6857 21.4334 0.2017 565 +567 4 107.8196 171.9283 21.4046 0.1586 566 +568 4 106.9002 171.3209 20.7239 0.1416 567 +569 4 105.8424 170.9228 20.4058 0.1622 568 +570 4 104.7627 170.5464 20.3899 0.1765 569 +571 4 103.6407 170.3313 20.4075 0.2009 570 +572 4 102.516 170.194 20.7738 0.2264 571 +573 4 101.4505 169.8257 21.2038 0.2752 572 +574 4 100.4498 169.2754 21.1982 0.303 573 +575 4 99.4651 168.7068 20.8967 0.2934 574 +576 4 98.4155 168.2595 20.7446 0.2453 575 +577 4 97.289 168.0753 20.7354 0.2059 576 +578 4 96.1939 167.7482 20.8124 0.2034 577 +579 4 95.1674 167.2585 21.0865 0.1914 578 +580 4 94.0562 166.9988 20.9818 0.1786 579 +581 4 92.9713 166.6465 20.7757 0.1535 580 +582 4 92.0816 165.9326 20.778 0.1773 581 +583 4 91.1472 165.2863 21.0918 0.2274 582 +584 4 90.2014 164.6433 21.1851 0.2908 583 +585 4 89.3954 163.846 21.5404 0.3172 584 +586 4 88.3424 163.4101 21.7148 0.3178 585 +587 4 87.227 163.2374 21.2702 0.3052 586 +588 4 86.1868 162.7981 20.8211 0.3303 587 +589 4 85.2756 162.1082 20.7228 0.3557 588 +590 4 84.4582 161.3086 20.7175 0.3559 589 +591 4 83.696 160.4552 20.7091 0.2929 590 +592 4 83.4217 159.3455 20.6192 0.2035 591 +593 4 83.7408 158.3296 19.6 0.1144 592 +594 4 112.9716 175.9987 21.6857 0.3463 560 +595 4 112.3254 175.0755 21.84 0.294 594 +596 4 112.0351 173.9818 21.8406 0.2397 595 +597 4 111.7511 172.8744 21.8431 0.2185 596 +598 4 111.0932 171.9581 21.8627 0.2582 597 +599 4 110.3967 171.0532 22.0038 0.3204 598 +600 4 109.939 170.0224 22.3846 0.3521 599 +601 4 109.4909 168.9837 22.787 0.3559 600 +602 4 108.7492 168.1268 22.9446 0.3559 601 +603 4 107.7769 167.5342 22.9639 0.3783 602 +604 4 106.7066 167.1361 22.9849 0.3925 603 +605 4 105.6133 166.8055 23.1213 0.4053 604 +606 4 104.5667 166.3731 23.5024 0.3954 605 +607 4 103.6127 165.7645 23.8829 0.3827 606 +608 4 102.7241 165.0472 23.9728 0.3358 607 +609 4 101.7701 164.418 23.9137 0.2962 608 +610 4 100.76 163.8826 23.9557 0.2694 609 +611 4 99.829 163.2213 24.0495 0.2555 610 +612 4 98.9531 162.4858 24.0951 0.2312 611 +613 4 97.9642 161.916 24.1878 0.2172 612 +614 4 96.8823 161.5969 24.6061 0.2044 613 +615 4 95.7951 161.2857 25.0331 0.2034 614 +616 4 94.9175 160.5684 25.1849 0.1914 615 +617 4 94.1179 159.7504 25.1994 0.2027 616 +618 4 93.2906 158.9599 25.2 0.2154 617 +619 4 92.5872 158.0585 25.2 0.2161 618 +620 4 92.0293 157.0609 25.2006 0.204 619 +621 4 91.4189 156.0931 25.2025 0.1793 620 +622 4 90.652 155.2454 25.2106 0.1658 621 +623 4 89.7715 154.5166 25.2552 0.1409 622 +624 4 88.9659 153.733 25.7701 0.1277 623 +625 4 87.8592 153.7536 26.32 0.1144 624 +626 4 127.3878 189.7118 21.6006 0.2342 543 +627 4 127.7791 188.9911 20.5702 0.1568 626 +628 4 127.977 187.9134 21.2559 0.1217 627 +629 4 128.1051 186.8083 21.7804 0.1144 628 +630 4 128.6794 185.9137 21.8638 0.121 629 +631 4 129.6392 185.8794 21.0445 0.1349 630 +632 4 130.5315 186.4777 20.2124 0.1478 631 +633 4 131.4742 187.0943 19.9343 0.144 632 +634 4 132.4946 187.1309 20.6651 0.1303 633 +635 4 133.2954 186.512 21.8061 0.1173 634 +636 4 133.9818 185.6346 21.8011 0.1144 635 +637 4 134.8513 185.0283 20.8659 0.1144 636 +638 4 135.9129 184.6473 20.5862 0.1144 637 +639 4 136.6863 183.8316 20.683 0.1144 638 +640 4 137.145 182.7883 20.7085 0.1144 639 +641 4 137.2182 181.6523 20.6573 0.1144 640 +642 4 136.3385 180.9911 20.3974 0.1144 641 +643 4 135.4496 181.6672 20.72 0.1144 642 +644 4 346.4764 380.3869 43.5758 0.1526 280 +645 4 346.1401 379.5426 45.2712 0.1271 644 +646 4 345.5555 378.561 45.418 0.1145 645 +647 4 344.6986 377.8209 45.7789 0.1273 646 +648 4 343.6267 377.6069 46.5976 0.1401 647 +649 4 342.5639 377.3553 47.4032 0.1652 648 +650 4 341.7563 376.6631 48.4263 0.1657 649 +651 4 340.8926 375.9401 48.9006 0.1775 650 +652 4 339.8858 375.4539 49.4724 0.1652 651 +653 4 338.8448 375.2549 50.521 0.1646 652 +654 4 337.7809 375.2446 51.5494 0.1538 653 +655 4 336.7067 375.3018 52.498 0.1798 654 +656 4 335.6164 375.5054 53.1698 0.2175 655 +657 4 334.5182 375.82 53.2846 0.2408 656 +658 4 333.3879 375.971 53.3708 0.2259 657 +659 4 332.2542 375.8841 53.5382 0.1885 658 +660 4 331.1445 376.1586 53.6413 0.164 659 +661 4 330.0486 376.4652 53.7569 0.1525 660 +662 4 328.94 376.511 54.3987 0.1525 661 +663 4 327.8418 376.3199 55.0214 0.1506 662 +664 4 326.7184 376.2273 55.4316 0.1374 663 +665 4 325.5847 376.2078 55.2255 0.1246 664 +666 4 324.4853 376.3691 54.565 0.1144 665 +667 4 323.3916 376.6151 54.0952 0.1144 666 +668 4 322.3426 377.059 54.04 0.1178 667 +669 4 321.3324 377.5703 54.0921 0.1376 668 +670 4 320.3829 378.0165 54.5496 0.1834 669 +671 4 319.6828 378.7521 55.2241 0.2432 670 +672 4 318.5948 379.0701 55.1312 0.2669 671 +673 4 317.5755 379.5655 55.1396 0.2571 672 +674 4 316.7004 380.0677 53.9636 0.2542 673 +675 4 315.8458 380.7266 54.3424 0.2757 674 +676 4 315.1228 381.5995 54.5124 0.268 675 +677 4 314.2248 382.1658 53.5601 0.2551 676 +678 4 313.4377 382.9483 52.9217 0.2063 677 +679 4 312.4813 383.5695 52.8906 0.1668 678 +680 4 311.8544 384.0408 54.88 0.1144 679 +681 4 379.3618 398.12 45.3169 0.2171 202 +682 4 379.0438 397.0847 45.0506 0.2155 681 +683 4 379.204 396.0288 44.1857 0.2288 682 +684 4 379.7725 395.1582 43.4168 0.242 683 +685 4 380.5825 394.6011 42.2982 0.2474 684 +686 4 381.3993 394.1721 40.6588 0.2415 685 +687 4 382.3545 393.7099 39.8367 0.2347 686 +688 4 383.431 393.3495 39.5895 0.2219 687 +689 4 384.4595 392.9491 39.004 0.2092 688 +690 4 385.3999 392.4458 37.9982 0.2034 689 +691 4 386.3791 391.9493 37.3512 0.2242 690 +692 4 387.4007 391.4436 37.1232 0.2623 691 +693 4 388.3937 390.9014 36.7441 0.2796 692 +694 4 389.294 390.2344 36.2533 0.2655 693 +695 4 389.9873 389.3638 35.758 0.24 694 +696 4 390.5776 388.4029 35.299 0.2288 695 +697 4 391.3613 387.6158 34.8804 0.2288 696 +698 4 392.3371 387.0564 34.433 0.2215 697 +699 4 393.345 386.5301 34.1835 0.2161 698 +700 4 394.3299 385.9501 34.088 0.2087 699 +701 4 395.3492 385.4616 33.7744 0.2186 700 +702 4 396.3216 384.964 33.0114 0.2441 701 +703 4 397.2483 384.3794 32.2218 0.2931 702 +704 4 398.1486 383.6987 31.9332 0.3256 703 +705 4 399.0215 382.9597 31.9052 0.3227 704 +706 4 399.8188 382.144 31.8102 0.2858 705 +707 4 400.2341 381.1465 31.2612 0.2669 706 +708 4 400.3554 380.1272 30.0684 0.2669 707 +709 4 400.8393 379.1811 29.3429 0.2572 708 +710 4 401.5474 378.2911 29.3877 0.2345 709 +711 4 402.4878 377.6767 29.2006 0.2184 710 +712 4 403.5574 377.8335 28.6961 0.2384 711 +713 4 404.5756 378.3048 28.1753 0.2415 712 +714 4 405.6704 378.2339 27.5688 0.2534 713 +715 4 406.6325 377.6756 26.9805 0.2662 714 +716 4 407.5752 377.0532 26.5255 0.2909 715 +717 4 408.3783 376.2444 26.3754 0.3044 716 +718 4 409.0132 375.2972 26.5356 0.2809 717 +719 4 409.6881 374.3877 26.9416 0.2555 718 +720 4 410.3642 373.4702 26.7484 0.2421 719 +721 4 411.0804 372.5882 26.4272 0.278 720 +722 4 411.8411 371.7348 26.3301 0.3283 721 +723 4 412.5241 370.8173 26.3203 0.3792 722 +724 4 413.151 369.8609 26.3197 0.3934 723 +725 4 413.9667 369.0601 26.3189 0.3818 724 +726 4 414.9768 368.5259 26.3144 0.3445 725 +727 4 416.0591 368.1586 26.2828 0.3186 726 +728 4 417.0738 367.6358 26.1223 0.3302 727 +729 4 417.9432 366.9574 25.3898 0.3305 728 +730 4 418.3802 365.9656 24.5244 0.3305 729 +731 4 418.4272 364.9268 23.3587 0.293 730 +732 4 418.2281 363.8114 22.9908 0.2924 731 +733 4 418.3208 362.672 22.9393 0.2924 732 +734 4 418.7623 361.6184 22.8326 0.267 733 +735 4 419.2154 360.5934 22.265 0.229 734 +736 4 420.0676 359.8315 22.2432 0.1781 735 +737 4 421.1956 359.6782 22.4848 0.1652 736 +738 4 422.136 359.6736 24.08 0.1144 737 +739 4 380.0368 399.0386 46.48 0.4576 200 +740 4 392.4503 408.7638 48.701 0.4322 186 +741 4 391.5546 409.4754 48.6262 0.4068 740 +742 4 390.7446 410.2704 48.274 0.394 741 +743 4 390.1292 410.815 46.3336 0.2555 742 +744 4 389.5457 411.5094 44.688 0.1694 743 +745 4 389.1991 412.4726 43.5781 0.1525 744 +746 4 388.92 413.5411 42.8999 0.1674 745 +747 4 388.6465 414.6211 42.2834 0.178 746 +748 4 388.7552 415.669 41.421 0.1615 747 +749 4 389.3947 416.5498 40.8906 0.144 748 +750 4 390.0983 417.4364 40.5482 0.1578 749 +751 4 390.295 418.4924 39.94 0.2126 750 +752 4 390.0617 419.562 39.2101 0.2958 751 +753 4 389.8558 420.6591 38.6232 0.3664 752 +754 4 389.9679 421.7596 38.0198 0.4112 753 +755 4 390.3271 422.7846 37.1792 0.3796 754 +756 4 390.835 423.7765 36.5828 0.3281 755 +757 4 391.3246 424.8061 36.5327 0.2767 756 +758 4 391.3761 425.9284 36.4353 0.2669 757 +759 4 391.089 426.879 35.1607 0.2556 758 +760 4 390.7996 427.7336 33.4407 0.2428 759 +761 4 390.4518 428.7083 32.2736 0.2299 760 +762 4 390.3591 429.834 31.983 0.2407 761 +763 4 390.5433 430.9608 32.0734 0.2534 762 +764 4 390.8053 432.0739 32.0765 0.2781 763 +765 4 391.1645 433.1562 31.8752 0.2796 764 +766 4 391.4116 434.2601 31.4672 0.2676 765 +767 4 391.4871 435.3835 30.9809 0.2549 766 +768 4 391.5843 436.5172 30.686 0.2662 767 +769 4 391.7548 437.6212 30.091 0.3033 768 +770 4 391.7399 438.7492 29.636 0.3051 769 +771 4 391.5168 439.8463 30.1574 0.2683 770 +772 4 391.3052 440.9617 30.4965 0.2178 771 +773 4 391.3796 442.0736 29.8945 0.2161 772 +774 4 391.3166 443.1547 28.9971 0.2409 773 +775 4 390.8613 444.2003 28.8926 0.2541 774 +776 4 390.5994 445.302 29.2936 0.2416 775 +777 4 390.5319 446.4071 28.6017 0.2415 776 +778 4 390.342 447.5305 28.3536 0.2668 777 +779 4 389.8374 448.5544 28.5309 0.2924 778 +780 4 389.6132 449.6767 28.5538 0.3051 779 +781 4 389.3478 450.7886 28.5211 0.3051 780 +782 4 389.2586 451.9269 28.3212 0.3051 781 +783 4 389.5331 452.9931 27.5587 0.3051 782 +784 4 389.953 454.041 27.1152 0.2924 783 +785 4 390.096 455.1747 26.9539 0.2669 784 +786 4 390.0708 456.3096 27.2908 0.2288 785 +787 4 389.8741 457.4147 26.7512 0.2034 786 +788 4 389.6098 458.5152 27.1622 0.1907 787 +789 4 389.2243 459.8663 26.3494 0.2465 788 +790 4 388.8685 460.9096 25.5976 0.2748 789 +791 4 388.8856 462.0227 25.1664 0.3004 790 +792 4 389.2254 463.0981 24.7836 0.2947 791 +793 4 389.6384 464.1162 24.0285 0.2715 792 +794 4 389.9141 465.1859 23.315 0.235 793 +795 4 389.7768 466.3036 23.1669 0.218 794 +796 4 389.8386 467.4327 23.4486 0.238 795 +797 4 389.969 468.5584 23.1613 0.2747 796 +798 4 389.81 469.6806 22.9076 0.2796 797 +799 4 389.7688 470.8166 22.6212 0.235 798 +800 4 390.0033 471.9183 22.1945 0.1951 799 +801 4 390.0697 473.0406 22.58 0.1786 800 +802 4 389.3741 473.8711 23.3666 0.1902 801 +803 4 388.658 474.7497 23.5922 0.191 802 +804 4 388.5836 475.8834 23.7726 0.2034 803 +805 4 388.1775 476.9119 24.4751 0.2034 804 +806 4 387.6696 477.9106 24.9782 0.2034 805 +807 4 387.3881 479.0145 25.1429 0.2099 806 +808 4 387.2623 480.1482 25.0096 0.2481 807 +809 4 387.2749 481.2831 24.8349 0.2796 808 +810 4 387.5826 482.3813 24.9421 0.2699 809 +811 4 388.0459 483.4224 25.1451 0.2166 810 +812 4 388.6225 484.4096 25.2109 0.1578 811 +813 4 389.1659 485.4038 25.279 0.1246 812 +814 4 389.4187 486.5169 25.4892 0.1144 813 +815 4 389.7448 487.5957 25.5598 0.1199 814 +816 4 390.3786 488.5441 25.3453 0.1486 815 +817 4 390.9254 489.5405 25.2392 0.1957 816 +818 4 391.2434 490.6364 25.3142 0.2662 817 +819 4 391.4104 491.7621 25.5388 0.3112 818 +820 4 391.4002 492.8935 25.8821 0.3184 819 +821 4 391.1816 494.0067 26.1274 0.2674 820 +822 4 390.8876 495.1026 26.0982 0.2194 821 +823 4 390.8705 496.2375 26.2539 0.197 822 +824 4 390.835 497.3426 26.7949 0.2225 823 +825 4 390.4472 498.4065 26.7924 0.2512 824 +826 4 389.8489 499.3709 26.4802 0.2796 825 +827 4 389.2208 500.3204 26.5854 0.2764 826 +828 4 388.6099 501.2642 27.0738 0.2604 827 +829 4 388.0928 502.2675 27.1432 0.235 828 +830 4 387.8446 503.3657 26.7176 0.2161 829 +831 4 387.7405 504.4948 26.6395 0.2194 830 +832 4 387.5998 505.6125 26.9097 0.2422 831 +833 4 387.6753 506.7371 26.5818 0.2898 832 +834 4 388.0002 507.8273 26.3141 0.3212 833 +835 4 388.3914 508.8992 26.1254 0.3271 834 +836 4 388.8033 509.9517 25.7118 0.3076 835 +837 4 389.2174 511.0008 25.289 0.2727 836 +838 4 389.5755 512.0864 25.2039 0.2439 837 +839 4 389.9953 513.1401 25.2 0.2195 838 +840 4 390.6291 514.0919 25.2 0.2322 839 +841 4 391.2114 515.0757 25.2003 0.2521 840 +842 4 391.86 515.9852 25.2011 0.2869 841 +843 4 392.7775 516.667 25.2056 0.3199 842 +844 4 393.6058 517.4518 25.2263 0.3744 843 +845 4 394.3837 518.2846 25.3154 0.4307 844 +846 4 395.2978 518.9481 25.5948 0.4576 845 +847 4 396.3285 519.408 25.8216 0.4459 846 +848 4 397.3924 519.7981 25.4624 0.4156 847 +849 4 398.4952 520.0372 25.2025 0.4068 848 +850 4 399.6392 520.0544 25.2126 0.4028 849 +851 4 400.781 520.0178 25.2834 0.3781 850 +852 4 401.9101 519.9171 25.5906 0.3271 851 +853 4 403.0175 519.9057 26.1069 0.2841 852 +854 4 404.1317 520.1345 26.3208 0.2669 853 +855 4 405.2231 520.417 26.3948 0.2617 854 +856 4 406.1841 520.9913 26.9097 0.2446 855 +857 4 407.1096 521.537 26.199 0.219 856 +858 4 407.8612 522.0827 24.5846 0.2043 857 +859 4 408.4103 523.0139 25.1924 0.1914 858 +860 4 408.9136 524.0378 25.2115 0.1907 859 +861 4 409.147 525.1555 25.2067 0.1781 860 +862 4 408.8656 526.24 25.76 0.1144 861 +863 4 390.6039 411.3389 48.1779 0.3566 742 +864 4 390.5547 412.46 47.6462 0.3559 863 +865 4 390.4952 413.5674 46.9557 0.331 864 +866 4 390.231 414.6691 46.571 0.293 865 +867 4 389.9942 415.7879 46.548 0.2672 866 +868 4 390.0457 416.9194 46.9353 0.2921 867 +869 4 390.0331 418.0462 47.4169 0.3176 868 +870 4 389.7322 419.1456 47.2021 0.3556 869 +871 4 389.2723 420.1649 46.6166 0.3685 870 +872 4 388.8056 421.2025 46.3445 0.3686 871 +873 4 388.3777 422.1829 45.3513 0.356 872 +874 4 388.0368 423.2731 45.2281 0.3432 873 +875 4 387.387 424.2146 45.192 0.3305 874 +876 4 386.7326 425.1253 44.6359 0.3178 875 +877 4 386.0245 426.0107 44.268 0.3178 876 +878 4 385.282 426.8813 44.2333 0.3432 877 +879 4 384.7741 427.9063 44.1997 0.3559 878 +880 4 384.567 429.0275 43.9858 0.3432 879 +881 4 384.265 430.0685 43.0884 0.3051 880 +882 4 383.685 430.9299 41.916 0.2669 881 +883 4 382.7515 431.4745 40.9998 0.2288 882 +884 4 381.8031 432.1128 40.873 0.2161 883 +885 4 381.047 432.9708 40.8422 0.2415 884 +886 4 380.4887 433.2786 40.5574 0.2247 885 +887 4 379.4671 433.7396 40.2447 0.1924 886 +888 4 378.402 434.1034 40.4729 0.1614 887 +889 4 377.5211 434.8024 40.7344 0.1486 888 +890 4 376.8496 435.7096 40.4844 0.1398 889 +891 4 376.2479 436.6213 39.6752 0.1438 890 +892 4 375.5924 437.4942 38.8623 0.1644 891 +893 4 375.065 438.4689 38.2553 0.1947 892 +894 4 374.6657 439.5111 37.7121 0.2034 893 +895 4 374.0686 440.472 37.5424 0.2034 894 +896 4 373.2918 441.3117 37.5435 0.2115 895 +897 4 372.5974 442.2052 37.7194 0.2369 896 +898 4 372.0585 443.2028 38.0089 0.2542 897 +899 4 371.4808 444.182 37.8302 0.2501 898 +900 4 370.8345 445.1132 37.4766 0.2374 899 +901 4 370.2762 446.0959 37.1406 0.2247 900 +902 4 369.8495 447.1324 36.6148 0.2161 901 +903 4 369.4273 448.1872 36.4098 0.2161 902 +904 4 368.9263 449.2133 36.37 0.2245 903 +905 4 368.471 450.2578 36.2093 0.2457 904 +906 4 367.9035 451.2405 35.999 0.2625 905 +907 4 367.1817 452.1168 36.1917 0.2796 906 +908 4 366.3363 452.8753 36.4896 0.2754 907 +909 4 365.516 453.6452 36.8309 0.2543 908 +910 4 364.8674 454.5581 37.3397 0.2246 909 +911 4 364.3045 455.5477 37.403 0.2119 910 +912 4 363.8412 456.591 37.2375 0.1992 911 +913 4 363.3882 457.6389 37.2792 0.1821 912 +914 4 362.974 458.6948 37.3859 0.1652 913 +915 4 362.4306 459.6134 37.0185 0.1794 914 +916 4 361.4697 460.2083 36.5907 0.2238 915 +917 4 360.5144 460.8261 36.4112 0.2768 916 +918 4 359.6862 461.58 36.0898 0.3051 917 +919 4 359.4162 462.5512 35.3545 0.2844 918 +920 4 359.4093 463.6552 35.3354 0.2298 919 +921 4 358.906 464.6047 35.8495 0.1869 920 +922 4 357.9954 465.2659 35.9901 0.1952 921 +923 4 357.1156 465.9798 35.791 0.2298 922 +924 4 356.4361 466.8836 35.9243 0.2505 923 +925 4 355.7062 467.7438 36.318 0.2359 924 +926 4 354.8608 468.4932 36.1474 0.2102 925 +927 4 353.8198 468.9164 36.0522 0.2131 926 +928 4 352.8805 469.5228 36.4081 0.2476 927 +929 4 351.9184 470.0822 35.9341 0.2866 928 +930 4 351.0536 470.8121 35.6325 0.3035 929 +931 4 350.1933 471.511 34.9625 0.2822 930 +932 4 349.3902 472.3187 34.9149 0.2453 931 +933 4 348.8262 473.3094 34.869 0.1949 932 +934 4 347.9053 473.9523 34.5229 0.1781 933 +935 4 347.1743 474.7257 33.5504 0.193 934 +936 4 346.465 475.6066 33.8506 0.2298 935 +937 4 345.496 476.1866 34.2919 0.2415 936 +938 4 344.5614 476.8341 34.4655 0.2369 937 +939 4 343.5009 477.2448 34.5794 0.2034 938 +940 4 342.4747 477.6623 34.8953 0.2034 939 +941 4 341.6087 478.3098 34.3902 0.2224 940 +942 4 340.8926 479.1964 34.4232 0.2482 941 +943 4 340.1581 480.0602 34.3064 0.2614 942 +944 4 339.2726 480.7511 34.1312 0.2669 943 +945 4 338.3163 481.3357 33.71 0.2595 944 +946 4 337.297 481.7956 33.3239 0.2384 945 +947 4 336.209 481.9844 33.8027 0.2114 946 +948 4 335.1874 482.4111 34.0138 0.1943 947 +949 4 334.2242 483.022 34.2079 0.2001 948 +950 4 333.2014 483.4475 33.7554 0.2134 949 +951 4 332.1387 483.8331 33.3715 0.2264 950 +952 4 331.0908 484.2072 33.8948 0.2392 951 +953 4 329.9891 484.3696 34.4868 0.2523 952 +954 4 328.8668 484.5652 34.51 0.2542 953 +955 4 327.9139 485.1326 33.9032 0.2186 954 +956 4 327.5272 486.0856 32.76 0.1144 955 +957 4 380.7495 433.8506 41.6178 0.2988 885 +958 4 380.7552 434.9763 41.2754 0.2784 957 +959 4 380.6797 436.0939 41.1158 0.2525 958 +960 4 380.3136 437.159 40.8867 0.2341 959 +961 4 380.0105 438.2161 40.213 0.2288 960 +962 4 379.816 439.3166 40.1349 0.2211 961 +963 4 379.5643 440.4263 40.311 0.208 962 +964 4 378.9569 441.3609 40.2483 0.1866 963 +965 4 378.2693 442.267 40.0428 0.178 964 +966 4 377.6744 443.2382 39.8028 0.1865 965 +967 4 377.1631 444.2552 39.5368 0.2079 966 +968 4 376.8256 445.3306 39.1524 0.2161 967 +969 4 376.4607 446.406 38.8755 0.2073 968 +970 4 375.9516 447.4138 39.1499 0.2034 969 +971 4 375.4528 448.4205 39.6634 0.2123 970 +972 4 374.9449 449.4021 40.3735 0.2344 971 +973 4 374.4003 450.3676 41.0598 0.2601 972 +974 4 373.85 451.3526 41.5148 0.2858 973 +975 4 373.492 452.4017 41.1093 0.2924 974 +976 4 373.4782 453.5182 41.3106 0.2714 975 +977 4 373.1808 454.6073 41.3417 0.2456 976 +978 4 372.9509 455.7067 40.8579 0.2309 977 +979 4 373.0653 456.8049 40.2142 0.2177 978 +980 4 373.079 457.9409 40.3046 0.2048 979 +981 4 372.7861 459.0392 40.1565 0.2034 980 +982 4 372.6546 460.1637 40.4922 0.2272 981 +983 4 372.9131 461.2196 39.7057 0.2534 982 +984 4 373.1064 462.3453 39.7205 0.2542 983 +985 4 372.7941 463.3966 40.4712 0.2542 984 +986 4 372.5413 464.5075 40.7011 0.2559 985 +987 4 372.3102 465.608 40.5672 0.2669 986 +988 4 371.8492 466.5655 39.6864 0.2693 987 +989 4 371.5357 467.6626 39.7804 0.2854 988 +990 4 371.3115 468.7792 39.674 0.3083 989 +991 4 371.2783 469.9072 39.9708 0.3143 990 +992 4 371.387 471.0168 40.5241 0.294 991 +993 4 371.2692 472.1311 40.9777 0.2591 992 +994 4 371.0793 473.2202 41.3644 0.2331 993 +995 4 370.9798 474.2772 42.3032 0.2115 994 +996 4 370.99 475.4018 42.3368 0.1987 995 +997 4 370.9683 476.5046 42.1912 0.1907 996 +998 4 370.648 477.5903 42.5166 0.1961 997 +999 4 370.5107 478.6004 41.8214 0.2096 998 +1000 4 370.9226 479.5248 41.256 0.2306 999 +1001 4 371.0953 480.5772 41.4971 0.2415 1000 +1002 4 371.0907 481.7121 41.3619 0.2415 1001 +1003 4 371.244 482.8286 40.922 0.2415 1002 +1004 4 371.4705 483.9417 40.7557 0.2495 1003 +1005 4 371.6147 485.0606 40.4323 0.2542 1004 +1006 4 371.9899 486.1119 40.2699 0.2372 1005 +1007 4 372.2793 487.1873 40.6913 0.201 1006 +1008 4 371.9464 488.2295 41.0458 0.1713 1007 +1009 4 371.3115 489.1149 40.4113 0.1549 1008 +1010 4 370.6034 489.9775 39.8076 0.1635 1009 +1011 4 370.0451 490.887 38.8237 0.177 1010 +1012 4 369.3004 491.7164 39.2557 0.1902 1011 +1013 4 369.4308 492.8123 39.6791 0.1907 1012 +1014 4 369.7911 493.8408 39.0852 0.1931 1013 +1015 4 369.615 494.9276 38.3692 0.2061 1014 +1016 4 369.4617 495.9366 37.2761 0.2233 1015 +1017 4 369.8884 496.8953 36.4006 0.2368 1016 +1018 4 370.4844 497.8539 36.489 0.2179 1017 +1019 4 370.7933 498.9236 36.5674 0.1803 1018 +1020 4 370.4615 499.8022 35.32 0.1652 1019 +1021 4 369.7957 500.6567 34.9129 0.1746 1020 +1022 4 369.2729 501.6246 34.328 0.178 1021 +1023 4 369.1985 502.7216 33.7725 0.158 1022 +1024 4 369.3907 503.8165 33.1489 0.1311 1023 +1025 4 369.4914 504.9456 33.266 0.1271 1024 +1026 4 368.9652 505.9294 33.0036 0.1507 1025 +1027 4 368.0694 506.5838 32.3845 0.2002 1026 +1028 4 367.6633 507.5802 31.6674 0.2426 1027 +1029 4 368.384 508.4508 31.274 0.2796 1028 +1030 4 368.8839 509.4747 31.211 0.2811 1029 +1031 4 369.1951 510.5478 30.6636 0.2924 1030 +1032 4 369.2843 511.686 30.5648 0.294 1031 +1033 4 369.2123 512.8197 30.3052 0.3032 1032 +1034 4 369.2088 513.9294 29.6915 0.2903 1033 +1035 4 369.1985 515.0608 29.673 0.2796 1034 +1036 4 369.0006 516.1328 29.4476 0.2866 1035 +1037 4 369.6184 517.0274 29.2524 0.3152 1036 +1038 4 370.3105 517.8533 29.4585 0.336 1037 +1039 4 370.7178 518.8612 29.0654 0.331 1038 +1040 4 371.093 519.8176 27.8762 0.3044 1039 +1041 4 371.3275 520.8666 26.9713 0.281 1040 +1042 4 371.6147 521.8036 28.31 0.3162 1041 +1043 4 371.7794 522.8595 27.4417 0.3559 1042 +1044 4 372.372 523.8376 27.44 0.3432 1043 +1045 4 402.998 411.7439 49.9117 0.2104 176 +1046 4 402.9065 410.6091 50.197 0.1334 1045 +1047 4 402.8161 409.4754 50.4823 0.1176 1046 +1048 4 402.7246 408.3405 50.7676 0.1335 1047 +1049 4 402.6308 407.2068 51.0546 0.1589 1048 +1050 4 402.4054 406.0903 51.214 0.1845 1049 +1051 4 402.0943 404.9897 51.2406 0.1713 1050 +1052 4 401.981 403.8583 51.24 0.1554 1051 +1053 4 402.2384 402.7658 51.5623 0.1424 1052 +1054 4 402.4626 401.6561 51.3694 0.1502 1053 +1055 4 402.7795 400.6231 52.1175 0.1632 1054 +1056 4 403.2817 399.6118 52.1296 0.1868 1055 +1057 4 403.8675 398.6337 51.919 0.2346 1056 +1058 4 404.1363 397.5549 51.3584 0.2746 1057 +1059 4 404.3868 396.4498 50.983 0.3128 1058 +1060 4 404.698 395.3595 50.6094 0.3066 1059 +1061 4 405.2826 394.3951 50.9068 0.2706 1060 +1062 4 405.9152 393.4971 50.2082 0.196 1061 +1063 4 406.6909 392.8359 48.9544 0.1549 1062 +1064 4 407.4379 391.9859 49.0941 0.1644 1063 +1065 4 408.0625 391.0295 49.1697 0.2277 1064 +1066 4 408.1277 389.9347 49.9411 0.2667 1065 +1067 4 408.1586 388.7918 50.0346 0.2542 1066 +1068 4 408.8107 387.9315 49.1851 0.2116 1067 +1069 4 409.6401 387.1925 48.8877 0.1985 1068 +1070 4 410.2453 386.251 49.469 0.2374 1069 +1071 4 410.9111 385.3518 49.9341 0.2757 1070 +1072 4 411.7439 384.6071 50.4924 0.302 1071 +1073 4 412.6259 383.9001 50.6702 0.2893 1072 +1074 4 413.6498 383.4082 50.9382 0.2764 1073 +1075 4 414.5936 382.8064 50.8567 0.2595 1074 +1076 4 415.3452 381.9793 51.1249 0.2269 1075 +1077 4 416.098 381.1945 51.3178 0.1977 1076 +1078 4 416.8095 380.3285 50.8486 0.2147 1077 +1079 4 417.6801 379.6078 50.8813 0.279 1078 +1080 4 418.6948 379.1811 51.4172 0.3439 1079 +1081 4 419.7942 379.125 52.0374 0.3753 1080 +1082 4 420.873 378.9168 52.334 0.374 1081 +1083 4 421.9438 378.5679 52.7072 0.3606 1082 +1084 4 422.97 378.1618 53.3828 0.3393 1083 +1085 4 424.0144 377.7499 53.8605 0.3137 1084 +1086 4 425.099 377.4067 53.7905 0.2882 1085 +1087 4 426.1652 377.0018 53.6452 0.2534 1086 +1088 4 427.1479 376.4389 53.3512 0.2234 1087 +1089 4 428.1306 375.8658 53.4097 0.1876 1088 +1090 4 428.8559 375.0124 53.5718 0.178 1089 +1091 4 429.5903 374.1383 53.7032 0.1886 1090 +1092 4 430.1692 373.1945 53.1191 0.2128 1091 +1093 4 431.0592 372.5024 53.1194 0.2161 1092 +1094 4 432.0122 371.8709 53.1762 0.2161 1093 +1095 4 432.7283 371.0472 52.4185 0.2279 1094 +1096 4 433.8094 370.7384 52.2696 0.2641 1095 +1097 4 434.911 370.5061 51.7843 0.2787 1096 +1098 4 436.0322 370.2899 51.6858 0.2676 1097 +1099 4 437.1132 369.9399 51.9935 0.2429 1098 +1100 4 438.0822 369.4868 51.0555 0.2291 1099 +1101 4 439.1461 369.0716 50.9247 0.2288 1100 +1102 4 440.146 368.7249 49.8683 0.2289 1101 +1103 4 441.2683 368.535 49.6283 0.2418 1102 +1104 4 442.2212 367.9973 50.4 0.2676 1103 +1105 4 443.2554 367.629 49.6602 0.2918 1104 +1106 4 444.2896 367.1943 50.1892 0.2772 1105 +1107 4 445.1956 366.5021 50.2799 0.2233 1106 +1108 4 445.9861 365.7093 50.1698 0.1602 1107 +1109 4 447.0992 365.4828 50.26 0.1271 1108 +1110 4 448.2352 365.5503 50.3171 0.1334 1109 +1111 4 449.3392 365.7025 49.7078 0.1683 1110 +1112 4 450.4408 365.8558 49.4334 0.1968 1111 +1113 4 451.5711 365.8855 49.7924 0.2034 1112 +1114 4 452.7014 365.7929 49.819 0.1971 1113 +1115 4 453.7973 365.5503 49.3906 0.1907 1114 +1116 4 454.835 365.1019 49.0605 0.1907 1115 +1117 4 455.8737 364.6283 49.075 0.1973 1116 +1118 4 456.8656 364.1821 48.5528 0.217 1117 +1119 4 457.7716 363.5815 47.8545 0.2357 1118 +1120 4 458.6525 362.8574 47.7058 0.2344 1119 +1121 4 459.6329 362.3002 47.5488 0.2143 1120 +1122 4 460.6751 361.838 47.3273 0.2106 1121 +1123 4 461.715 361.3736 47.0806 0.2307 1122 +1124 4 462.7926 361.0121 46.8252 0.249 1123 +1125 4 463.8954 360.8336 47.161 0.2309 1124 +1126 4 465.0108 360.7432 47.7226 0.1842 1125 +1127 4 466.1182 360.5144 48.0301 0.1489 1126 +1128 4 467.1718 360.1392 48.552 0.1398 1127 +1129 4 468.2037 359.6759 48.7998 0.1485 1128 +1130 4 469.1418 359.033 48.8186 0.1432 1129 +1131 4 470.0158 358.3019 49.0566 0.1398 1130 +1132 4 471.0145 357.7677 49.0748 0.1494 1131 +1133 4 472.0579 357.2998 49.0056 0.1718 1132 +1134 4 473.1367 356.9337 48.8079 0.178 1133 +1135 4 474.2635 356.928 48.8564 0.1582 1134 +1136 4 475.3492 356.6409 48.7452 0.1326 1135 +1137 4 476.4154 356.2736 49.1112 0.1169 1136 +1138 4 477.5205 356.1055 49.6658 0.1144 1137 +1139 4 478.6404 356.0242 49.3231 0.1144 1138 +1140 4 479.7307 356.1672 49.8988 0.1144 1139 +1141 4 480.8655 356.2439 50.08 0.1262 1140 +1142 4 481.8574 356.7919 49.8798 0.1519 1141 +1143 4 482.7417 357.516 49.7862 0.1774 1142 +1144 4 483.8251 357.8226 49.3335 0.178 1143 +1145 4 484.9416 358.072 49.28 0.1144 1144 +1146 3 413.7985 419.0724 49.0834 0.1403 1 +1147 3 412.8765 419.705 49.6672 0.2042 1146 +1148 3 411.9533 420.3376 50.2502 0.3064 1147 +1149 3 411.1925 421.1522 50.7282 0.3777 1148 +1150 3 410.5404 422.0845 50.9564 0.394 1149 +1151 3 409.7591 422.8979 51.282 0.3422 1150 +1152 3 408.7157 423.2217 51.5021 0.2744 1151 +1153 3 407.8349 423.8165 51.1176 0.1144 1152 +1154 3 407.4482 423.1198 51.0563 0.2532 1153 +1155 3 406.3316 422.8785 50.9877 0.2542 1154 +1156 3 405.1911 422.9345 51.1361 0.2795 1155 +1157 3 404.086 422.9208 51.8602 0.2669 1156 +1158 3 403.0907 422.3968 52.3648 0.2924 1157 +1159 3 402.1068 421.9873 53.3845 0.2924 1158 +1160 3 401.0235 421.8672 54.2279 0.3051 1159 +1161 3 399.9252 421.5754 54.5625 0.3305 1160 +1162 3 399.0432 420.9279 55.3748 0.3686 1161 +1163 3 397.969 420.5413 55.5677 0.4322 1162 +1164 3 396.42 420.4772 56.3914 0.3943 1163 +1165 3 395.3195 420.253 56.9254 0.3814 1164 +1166 3 394.2579 419.8777 57.4258 0.3939 1165 +1167 3 393.2386 419.3687 57.6514 0.4067 1166 +1168 3 392.2696 418.7612 57.6797 0.4194 1167 +1169 3 391.3475 418.084 57.6803 0.4195 1168 +1170 3 390.4335 417.3953 57.6808 0.4069 1169 +1171 3 389.54 416.6803 57.6859 0.4068 1170 +1172 3 388.5859 416.0499 57.7181 0.4068 1171 +1173 3 387.5437 415.5889 57.9684 0.4068 1172 +1174 3 386.545 415.1576 58.8311 0.3686 1173 +1175 3 385.1162 414.3316 58.6634 0.178 1174 +1176 3 384.106 413.8775 59.2701 0.178 1175 +1177 3 383.1164 413.3295 59.4549 0.1866 1176 +1178 3 382.1852 412.6888 59.6361 0.2122 1177 +1179 3 381.2163 412.1111 59.584 0.2377 1178 +1180 3 380.3754 411.3378 59.463 0.2542 1179 +1181 3 379.498 410.6045 59.4073 0.2497 1180 +1182 3 378.6434 409.8517 59.5076 0.2369 1181 +1183 3 377.9158 408.9743 59.64 0.2382 1182 +1184 3 377.2786 408.0248 59.64 0.2636 1183 +1185 3 376.7203 407.0341 59.7982 0.2939 1184 +1186 3 376.1666 406.0697 60.3562 0.3228 1185 +1187 3 375.3613 405.3444 60.555 0.3417 1186 +1188 3 374.4735 404.6706 60.2512 0.3559 1187 +1189 3 373.7608 403.7908 60.0065 0.349 1188 +1190 3 373.0458 402.9214 59.5426 0.3156 1189 +1191 3 372.197 402.1755 59.2262 0.2645 1190 +1192 3 371.2909 401.4799 59.1959 0.2202 1191 +1193 3 370.4398 400.734 59.5395 0.2034 1192 +1194 3 369.536 400.1186 60.2538 0.2262 1193 +1195 3 368.6426 399.4734 60.9207 0.2646 1194 +1196 3 367.8967 398.6291 60.9636 0.2796 1195 +1197 3 367.3258 397.651 61.0551 0.2474 1196 +1198 3 366.6337 396.8296 60.5262 0.2032 1197 +1199 3 366.0251 396.094 59.0492 0.2003 1198 +1200 3 365.0172 395.8881 58.7073 0.3143 1199 +1201 3 363.8927 395.6959 58.7916 0.2633 1200 +1202 3 362.8928 395.1593 58.592 0.2032 1201 +1203 3 362.3025 394.3402 59.8951 0.152 1202 +1204 3 361.8083 393.7168 61.871 0.1398 1203 +1205 3 360.837 393.2237 62.6128 0.1409 1204 +1206 3 360.0557 392.4492 62.0533 0.1539 1205 +1207 3 359.6667 391.5386 60.9599 0.1692 1206 +1208 3 358.7904 390.8465 61.4989 0.1948 1207 +1209 3 357.746 390.4335 61.9097 0.2138 1208 +1210 3 356.6248 390.2276 61.9982 0.1961 1209 +1211 3 355.5792 389.8054 62.3386 0.1598 1210 +1212 3 354.6606 389.1808 62.7626 0.1432 1211 +1213 3 353.7248 388.5607 62.3428 0.1697 1212 +1214 3 352.6963 388.0826 62.253 0.2212 1213 +1215 3 351.7182 387.5094 62.5044 0.2677 1214 +1216 3 350.8133 386.8139 62.4047 0.2878 1215 +1217 3 349.9713 386.0577 62.3095 0.2613 1216 +1218 3 349.1305 385.3038 62.5954 0.2058 1217 +1219 3 348.1375 384.7455 62.7312 0.1559 1218 +1220 3 347.1376 384.2044 62.8468 0.1398 1219 +1221 3 346.3906 383.4162 63.3203 0.1491 1220 +1222 3 345.8198 382.4964 64.0797 0.17 1221 +1223 3 344.9526 381.7986 64.2592 0.1829 1222 +1224 3 343.9104 381.389 64.0032 0.1907 1223 +1225 3 342.787 381.2986 64.2958 0.1972 1224 +1226 3 341.6705 381.3673 64.8726 0.228 1225 +1227 3 340.5562 381.2769 65.3859 0.2607 1226 +1228 3 339.5712 381.508 64.4731 0.2563 1227 +1229 3 338.4741 381.6739 64.6344 0.1999 1228 +1230 3 337.3324 381.7002 64.6775 0.1579 1229 +1231 3 336.2124 381.4885 64.6453 0.1415 1230 +1232 3 335.1165 381.1659 64.51 0.1508 1231 +1233 3 333.9942 380.952 64.4932 0.1413 1232 +1234 3 332.8994 380.6546 64.8133 0.1284 1233 +1235 3 331.9579 380.0391 65.2582 0.1271 1234 +1236 3 330.9867 379.562 64.4403 0.1398 1235 +1237 3 330.0783 378.8653 64.4129 0.1525 1236 +1238 3 329.2432 378.092 64.68 0.1144 1237 +1239 3 385.4948 415.3578 58.7045 0.1481 1174 +1240 3 384.4595 415.7227 58.4716 0.1492 1239 +1241 3 383.3338 415.6758 58.1134 0.1897 1240 +1242 3 382.2848 415.6678 57.0819 0.2636 1241 +1243 3 381.2369 415.86 56.4827 0.3314 1242 +1244 3 380.1295 416.1414 56.4925 0.3692 1243 +1245 3 379.0495 416.4469 56.0501 0.361 1244 +1246 3 377.9719 416.6871 55.3241 0.3154 1245 +1247 3 376.8599 416.8644 54.934 0.2501 1246 +1248 3 375.8829 417.3632 54.88 0.208 1247 +1249 3 375.2492 418.2933 55.008 0.2034 1248 +1250 3 374.8179 419.3481 55.1818 0.2388 1249 +1251 3 374.0926 420.1397 55.7715 0.2636 1250 +1252 3 373.3215 420.9222 55.4061 0.2861 1251 +1253 3 372.491 421.6784 54.9175 0.2728 1252 +1254 3 371.8641 422.6085 54.5443 0.2471 1253 +1255 3 371.1422 423.4813 54.2531 0.1909 1254 +1256 3 370.2922 424.2444 54.2357 0.1462 1255 +1257 3 369.2912 424.7741 53.9927 0.129 1256 +1258 3 368.2856 425.3175 53.9137 0.138 1257 +1259 3 367.3006 425.8986 53.9972 0.1508 1258 +1260 3 366.3282 426.4981 54.1321 0.1414 1259 +1261 3 365.4165 427.1742 54.453 0.1285 1260 +1262 3 364.3651 427.5814 54.8495 0.115 1261 +1263 3 363.2486 427.7999 55.137 0.1144 1262 +1264 3 362.1492 428.0974 55.389 0.1144 1263 +1265 3 361.1036 428.5195 55.8516 0.1144 1264 +1266 3 360.0809 429.0297 55.776 0.1144 1265 +1267 3 358.978 429.3032 56.096 0.1144 1266 +1268 3 357.8478 429.469 56.2078 0.1144 1267 +1269 3 356.8136 429.9152 55.72 0.1144 1268 +1270 3 356.5207 429.7505 56.84 0.1144 1269 +1271 3 356.3434 429.5846 56.84 0.1144 1270 +1272 3 356.0128 429.572 56.84 0.1144 1271 +1273 3 355.6696 429.572 56.84 0.1144 1272 +1274 3 355.4408 429.572 56.84 0.1144 1273 +1275 3 354.831 429.381 56.84 0.1144 1274 +1276 3 354.5759 429.2929 56.84 0.1144 1275 +1277 3 354.4753 429.0503 56.84 0.1144 1276 +1278 3 354.1824 429.0 56.84 0.1144 1277 +1279 3 353.8392 429.0 56.84 0.1144 1278 +1280 3 353.6104 429.0 56.84 0.1144 1279 +1281 3 352.8096 429.0 56.84 0.1144 1280 +1282 3 352.4664 429.0 56.84 0.1144 1281 +1283 3 352.1232 429.0 56.84 0.1144 1282 +1284 3 351.8178 428.9622 56.84 0.1144 1283 +1285 3 351.6782 428.7586 56.84 0.1144 1284 +1286 3 351.4368 428.428 56.84 0.1144 1285 +1287 3 351.1062 428.4154 56.84 0.1144 1286 +1288 3 351.017 428.3902 56.84 0.1144 1287 +1289 3 350.2928 428.3136 56.84 0.1144 1288 +1290 3 349.492 428.3136 56.84 0.1144 1289 +1291 3 348.6912 428.3136 56.84 0.1144 1290 +1292 3 347.8904 428.3136 56.84 0.1144 1291 +1293 3 347.5472 428.3136 56.84 0.1144 1292 +1294 3 347.2166 428.301 56.84 0.1144 1293 +1295 3 346.9752 428.1992 56.84 0.1144 1294 +1296 3 346.8482 427.983 56.84 0.1144 1295 +1297 3 346.4032 427.856 56.84 0.1144 1296 +1298 3 346.0978 427.8182 56.84 0.1144 1297 +1299 3 346.0222 427.7794 56.84 0.1144 1298 +1300 3 345.2592 427.7416 56.84 0.1144 1299 +1301 3 344.4584 427.7416 56.84 0.1144 1300 +1302 3 343.6576 427.7416 56.84 0.1144 1301 +1303 3 343.3144 427.7416 56.84 0.1144 1302 +1304 3 342.9838 427.729 56.84 0.1144 1303 +1305 3 342.7676 427.602 56.84 0.1144 1304 +1306 3 342.5639 427.4625 56.84 0.1144 1305 +1307 3 342.501 427.2966 56.84 0.1144 1306 +1308 3 342.2082 426.7886 56.84 0.1144 1307 +1309 3 341.7254 426.4706 56.84 0.1144 1308 +1310 3 341.5858 426.267 56.84 0.1144 1309 +1311 3 341.3696 426.14 56.84 0.1144 1310 +1312 3 341.0264 426.14 56.84 0.1144 1311 +1313 3 340.6832 426.14 56.84 0.1144 1312 +1314 3 340.4544 426.14 56.84 0.1144 1313 +1315 3 339.7806 426.013 56.84 0.1144 1314 +1316 3 339.196 425.7968 56.84 0.1144 1315 +1317 3 338.3952 425.7968 56.84 0.1144 1316 +1318 3 337.5944 425.7968 56.84 0.1144 1317 +1319 3 337.1368 425.568 56.84 0.1144 1318 +1320 3 397.3341 420.8925 57.2345 0.4499 1163 +1321 3 396.3422 421.4279 57.0119 0.3835 1320 +1322 3 395.5952 422.2275 56.8467 0.3027 1321 +1323 3 394.6846 422.6451 58.1101 0.2214 1322 +1324 3 393.6104 422.7583 58.9109 0.1907 1323 +1325 3 392.6505 422.8361 60.1087 0.1986 1324 +1326 3 391.7079 423.4459 60.5024 0.2207 1325 +1327 3 390.8453 424.0842 60.9826 0.2388 1326 +1328 3 390.0331 424.7169 61.6874 0.2766 1327 +1329 3 389.1053 425.3506 61.7044 0.3342 1328 +1330 3 388.2999 426.1549 61.9564 0.3804 1329 +1331 3 387.5678 427.0277 62.097 0.4001 1330 +1332 3 386.847 427.8869 62.5388 0.3945 1331 +1333 3 386.0542 428.6797 63.047 0.3626 1332 +1334 3 385.1722 429.3947 63.2475 0.2982 1333 +1335 3 384.1575 429.8969 63.4385 0.2145 1334 +1336 3 383.0467 430.0788 63.5606 0.1508 1335 +1337 3 381.9393 430.1234 64.0676 0.1271 1336 +1338 3 381.0229 430.2813 65.5752 0.1345 1337 +1339 3 380.0231 430.279 66.3659 0.1476 1338 +1340 3 378.9809 430.0754 67.1787 0.1446 1339 +1341 3 377.9147 429.9976 68.0638 0.1317 1340 +1342 3 376.8153 430.2218 68.3189 0.1187 1341 +1343 3 375.9024 430.7824 69.0183 0.1144 1342 +1344 3 375.3647 431.6163 70.3041 0.1144 1343 +1345 3 374.6325 432.4057 70.9971 0.1144 1344 +1346 3 373.5812 432.7798 71.1942 0.1144 1345 +1347 3 372.5161 433.1161 71.7517 0.1144 1346 +1348 3 371.4751 433.4891 72.4752 0.1144 1347 +1349 3 370.4924 434.0553 72.7913 0.1144 1348 +1350 3 369.5269 434.5999 73.4689 0.1144 1349 +1351 3 368.7604 435.2794 74.7141 0.1144 1350 +1352 3 368.4881 436.3479 75.4586 0.1144 1351 +1353 3 368.2536 437.4656 75.6 0.1144 1352 +1354 3 368.0248 437.58 74.48 0.1144 1353 +1355 3 367.7194 437.6178 74.48 0.1144 1354 +1356 3 367.4528 437.6944 74.48 0.1144 1355 +1357 3 367.1222 437.707 74.48 0.1144 1356 +1358 3 366.9574 437.771 74.48 0.1144 1357 +1359 3 366.4106 438.025 74.48 0.1144 1358 +1360 3 366.0674 438.4826 74.48 0.1144 1359 +1361 3 365.7242 438.9402 74.48 0.1144 1360 +1362 3 365.1648 439.1816 74.48 0.1144 1361 +1363 3 364.6694 439.487 74.48 0.1144 1362 +1364 3 364.4143 439.5751 74.48 0.1144 1363 +1365 3 364.3514 439.8554 74.48 0.1144 1364 +1366 3 364.1352 439.9824 74.48 0.1144 1365 +1367 3 363.792 439.9824 74.48 0.1144 1366 +1368 3 363.601 440.0202 74.48 0.1144 1367 +1369 3 362.8768 440.0968 74.48 0.1144 1368 +1370 3 362.2796 440.3004 74.48 0.1144 1369 +1371 3 361.695 440.5166 74.48 0.1144 1370 +1372 3 360.932 440.5544 74.48 0.1144 1371 +1373 3 360.1312 440.5544 74.48 0.1144 1372 +1374 3 359.4448 440.44 74.48 0.1144 1373 +1375 3 359.1016 440.44 74.48 0.1144 1374 +1376 3 358.7584 440.44 74.48 0.1144 1375 +1377 3 358.453 440.4022 74.48 0.1144 1376 +1378 3 358.3008 440.2112 74.48 0.1144 1377 +1379 3 358.2116 440.0716 74.48 0.1144 1378 +1380 3 357.9702 439.9698 74.48 0.1144 1379 +1381 3 357.7666 439.8302 74.48 0.1144 1380 +1382 3 357.6522 439.6014 74.48 0.1144 1381 +1383 3 357.5378 439.3726 74.48 0.1144 1382 +1384 3 357.5 439.1816 74.48 0.1144 1383 +1385 3 357.3856 438.9528 74.48 0.1144 1384 +1386 3 407.8188 424.019 51.3064 0.122 1153 +1387 3 407.8097 425.0978 52.0808 0.1615 1386 +1388 3 408.0568 426.1835 52.4297 0.1975 1387 +1389 3 408.4904 427.0804 53.6399 0.2161 1388 +1390 3 409.3518 427.6466 54.7467 0.2122 1389 +1391 3 410.4214 427.8743 55.3812 0.1993 1390 +1392 3 411.562 427.8526 55.3689 0.1907 1391 +1393 3 412.6602 427.8045 55.6587 0.1953 1392 +1394 3 413.6086 427.7576 57.1595 0.2034 1393 +1395 3 414.4632 427.4304 58.7538 0.2034 1394 +1396 3 415.3978 427.03 59.9561 0.1844 1395 +1397 3 415.9321 426.4489 61.4566 0.1503 1396 +1398 3 416.4492 425.6664 62.8432 0.1236 1397 +1399 3 417.258 425.0292 64.0455 0.1144 1398 +1400 3 417.8735 424.2089 65.1949 0.1239 1399 +1401 3 418.6331 423.4333 64.965 0.1381 1400 +1402 3 419.3263 422.5318 64.8533 0.1639 1401 +1403 3 419.5117 421.6727 66.5792 0.1652 1402 +1404 3 419.6192 420.5722 67.2932 0.1652 1403 +1405 3 419.5929 420.0745 68.7666 0.1343 1404 +1406 3 419.7187 419.1353 69.4949 0.1144 1405 +1407 3 419.8194 418.0199 69.6805 0.1144 1406 +1408 3 419.6741 417.163 71.239 0.1144 1407 +1409 3 419.1044 416.567 73.0705 0.1144 1408 +1410 3 418.601 415.6713 73.3211 0.1144 1409 +1411 3 418.45 414.5524 73.2245 0.1144 1410 +1412 3 418.736 413.5194 73.9502 0.1144 1411 +1413 3 418.9328 412.412 74.2 0.1144 1412 +1414 3 419.7439 420.4612 67.9395 0.1144 1404 +1415 3 420.5916 420.436 69.7956 0.1144 1414 +1416 3 421.2791 419.6787 70.8226 0.1144 1415 +1417 3 421.667 418.6251 70.6947 0.1144 1416 +1418 3 422.5776 417.9856 70.56 0.1144 1417 +1419 3 423.6289 417.5646 70.56 0.1144 1418 +1420 3 424.5659 416.9114 70.5124 0.1144 1419 +1421 3 425.457 416.1975 70.49 0.1144 1420 +1422 3 426.2853 415.4356 70.8652 0.1144 1421 +1423 3 427.0403 414.6382 71.6148 0.1144 1422 +1424 3 427.9544 414.033 72.0703 0.1144 1423 +1425 3 429.0275 413.6441 71.9662 0.1144 1424 +1426 3 430.1303 413.3501 71.8528 0.1144 1425 +1427 3 431.248 413.1224 71.685 0.1144 1426 +1428 3 432.3805 412.9932 71.68 0.1144 1427 +1429 3 433.5142 412.8868 71.6808 0.1144 1428 +1430 3 434.5324 412.4406 71.7391 0.1144 1429 +1431 3 435.4945 412.0139 72.2338 0.1144 1430 +1432 3 436.4383 412.3068 73.3625 0.1144 1431 +1433 3 437.3352 412.9142 74.0751 0.1144 1432 +1434 3 438.0868 413.7356 74.1944 0.1144 1433 +1435 3 438.5982 414.7114 74.797 0.1144 1434 +1436 3 439.3829 415.3898 74.4419 0.1144 1435 +1437 3 440.1963 416.1552 74.4554 0.1144 1436 +1438 3 441.0623 416.8942 74.6698 0.1144 1437 +1439 3 442.0222 417.5062 74.5402 0.1144 1438 +1440 3 443.0632 417.9673 74.6544 0.1144 1439 +1441 3 444.1694 418.0451 75.1596 0.1144 1440 +1442 3 445.1304 417.568 75.994 0.126 1441 +1443 3 445.914 416.8358 76.9563 0.1517 1442 +1444 3 445.9312 415.7296 77.56 0.2288 1443 +1445 3 415.9687 415.4985 47.9427 0.1671 1 +1446 3 416.1037 414.3625 47.9735 0.2466 1445 +1447 3 416.2627 413.23 47.9956 0.3358 1446 +1448 3 416.6173 412.1523 48.0917 0.4021 1447 +1449 3 417.5257 411.7576 48.4282 0.4744 1448 +1450 3 418.2544 412.5676 48.2748 0.5529 1449 +1451 3 418.8527 413.5388 48.4341 0.5944 1450 +1452 3 419.4453 414.517 48.4744 0.5504 1451 +1453 3 420.0116 415.5065 48.2524 0.4289 1452 +1454 3 420.7529 416.2009 49.4525 0.3193 1453 +1455 3 421.5617 415.6632 50.8864 0.2924 1454 +1456 3 422.557 415.0993 50.9564 0.3305 1455 +1457 3 423.3978 414.3236 50.9384 0.3432 1456 +1458 3 423.7513 412.8044 50.5532 0.3082 1457 +1459 3 423.9939 411.713 50.036 0.3252 1458 +1460 3 424.2078 410.5988 49.8425 0.3283 1459 +1461 3 424.5018 409.4948 49.84 0.3432 1460 +1462 3 424.7386 408.376 49.84 0.3485 1461 +1463 3 424.8805 407.2468 49.8394 0.3401 1462 +1464 3 424.8747 406.1028 49.8369 0.302 1463 +1465 3 425.2728 405.1968 50.0189 0.1144 1464 +1466 3 424.8336 404.6328 49.8145 0.3305 1465 +1467 3 424.7878 403.4911 49.6647 0.3813 1466 +1468 3 424.8827 402.3894 48.9418 0.3686 1467 +1469 3 424.8976 401.25 48.7206 0.3432 1468 +1470 3 424.9914 400.1094 48.7138 0.3178 1469 +1471 3 425.3907 399.0375 48.6842 0.3178 1470 +1472 3 425.8815 398.3339 48.4154 0.2373 1471 +1473 3 426.6033 397.4954 47.8341 0.1723 1472 +1474 3 427.4018 396.7586 46.9574 0.1538 1473 +1475 3 428.2209 396.1283 45.8382 0.1461 1474 +1476 3 428.7415 395.8732 43.713 0.1748 1475 +1477 3 428.5332 395.5998 41.2194 0.2314 1476 +1478 3 428.0287 394.9877 39.2526 0.2627 1477 +1479 3 427.5242 394.1572 37.8067 0.2496 1478 +1480 3 426.6388 393.7431 36.7808 0.22 1479 +1481 3 426.0691 394.4478 35.3665 0.2161 1480 +1482 3 426.2327 395.371 33.8271 0.2161 1481 +1483 3 426.839 396.2862 33.0991 0.1917 1482 +1484 3 427.173 397.3043 32.1255 0.1785 1483 +1485 3 426.2086 397.6613 31.0895 0.178 1484 +1486 3 425.147 397.8088 30.1087 0.178 1485 +1487 3 424.0751 398.207 30.1328 0.1525 1486 +1488 3 423.8772 398.4907 30.9498 0.1898 1487 +1489 3 423.7982 399.1622 32.9034 0.2577 1488 +1490 3 424.5281 399.7136 34.0721 0.2852 1489 +1491 3 425.3941 400.3668 34.1239 0.2867 1490 +1492 3 425.7385 401.4079 33.9018 0.2796 1491 +1493 3 425.6504 402.418 32.8714 0.2915 1492 +1494 3 425.4753 403.276 31.0761 0.3177 1493 +1495 3 425.8197 404.0276 29.5274 0.3238 1494 +1496 3 426.6148 404.7655 28.8075 0.3109 1495 +1497 3 427.5117 405.4576 28.8081 0.2981 1496 +1498 3 428.5538 405.8912 28.8044 0.2996 1497 +1499 3 429.6075 406.1406 28.054 0.2903 1498 +1500 3 430.6885 406.3259 27.4165 0.272 1499 +1501 3 431.8085 406.5318 27.4624 0.2749 1500 +1502 3 432.7249 407.0993 27.0698 0.3056 1501 +1503 3 433.1848 408.0488 26.1993 0.3267 1502 +1504 3 433.266 409.115 25.2784 0.2941 1503 +1505 3 432.9948 410.1881 24.7352 0.2516 1504 +1506 3 432.7489 411.2943 24.8735 0.2318 1505 +1507 3 433.195 412.2839 24.9749 0.2612 1506 +1508 3 434.1846 412.8113 24.8755 0.2892 1507 +1509 3 435.1948 413.3386 24.6268 0.2924 1508 +1510 3 436.1569 413.9255 24.1576 0.3037 1509 +1511 3 437.1785 414.3374 23.429 0.3051 1510 +1512 3 438.2435 414.5158 22.5224 0.3279 1511 +1513 3 439.3738 414.6279 22.3012 0.3189 1512 +1514 3 440.3187 415.2217 22.7391 0.3416 1513 +1515 3 441.2111 415.9298 22.9718 0.3313 1514 +1516 3 442.1869 416.5201 23.1594 0.3305 1515 +1517 3 443.0872 417.1493 23.9243 0.2946 1516 +1518 3 443.9807 417.3266 25.5822 0.268 1517 +1519 3 444.4417 416.424 24.5874 0.2161 1518 +1520 3 444.5584 415.5008 22.96 0.1144 1519 +1521 3 423.1473 398.2115 29.5196 0.1764 1487 +1522 3 422.1554 398.6291 28.6143 0.1909 1521 +1523 3 421.3043 398.2916 27.027 0.2297 1522 +1524 3 421.27 397.8958 24.5543 0.2458 1523 +1525 3 422.1966 398.0422 23.5777 0.2616 1524 +1526 3 423.2411 398.3831 23.3551 0.2433 1525 +1527 3 424.3199 398.5845 22.7268 0.2288 1526 +1528 3 425.3152 399.0272 22.9102 0.2407 1527 +1529 3 426.2716 399.5672 22.9631 0.2741 1528 +1530 3 427.2977 399.3967 22.4496 0.2996 1529 +1531 3 428.3182 398.9128 22.0772 0.2902 1530 +1532 3 429.3604 398.4518 22.1413 0.2555 1531 +1533 3 430.3396 397.8832 22.4949 0.2078 1532 +1534 3 431.3475 397.3661 22.4442 0.1993 1533 +1535 3 432.3622 396.9852 23.0745 0.2398 1534 +1536 3 433.2202 396.4978 24.4423 0.3104 1535 +1537 3 433.4685 395.514 24.9379 0.3305 1536 +1538 3 433.0829 394.5084 25.6004 0.3004 1537 +1539 3 432.9502 393.4056 25.9913 0.2458 1538 +1540 3 433.4433 392.3897 26.2363 0.2415 1539 +1541 3 433.4708 391.3052 27.0808 0.2541 1540 +1542 3 432.8896 390.3328 27.44 0.2288 1541 +1543 3 425.4307 398.1578 48.7099 0.2815 1471 +1544 3 425.6229 397.0366 48.4338 0.2796 1543 +1545 3 425.9558 395.9453 48.6228 0.2545 1544 +1546 3 426.426 394.9248 49.14 0.2542 1545 +1547 3 427.0083 393.941 49.2153 0.2416 1546 +1548 3 427.7164 393.0532 49.56 0.2288 1547 +1549 3 426.9488 392.1163 51.1277 0.1346 1548 +1550 3 426.307 391.3349 52.4367 0.1271 1549 +1551 3 425.6652 390.5524 53.7452 0.1449 1550 +1552 3 425.0154 389.7116 54.7599 0.1884 1551 +1553 3 424.2181 388.9245 55.1205 0.2397 1552 +1554 3 423.4505 388.0803 55.16 0.2908 1553 +1555 3 422.7011 387.2417 55.5904 0.3051 1554 +1556 3 422.2252 386.2304 55.732 0.2958 1555 +1557 3 421.5068 385.3861 55.979 0.2736 1556 +1558 3 420.7254 384.5567 56.1674 0.2952 1557 +1559 3 419.9613 383.7068 56.2148 0.3338 1558 +1560 3 419.3321 382.7687 56.5547 0.3724 1559 +1561 3 418.9031 381.7162 56.6857 0.3715 1560 +1562 3 418.4969 380.6694 57.1701 0.3582 1561 +1563 3 417.8403 379.7863 57.8648 0.3451 1562 +1564 3 417.0475 378.9717 57.8752 0.3212 1563 +1565 3 416.4824 377.9868 57.696 0.2829 1564 +1566 3 415.8749 377.043 58.1832 0.2441 1565 +1567 3 415.0043 376.3405 58.7278 0.2534 1566 +1568 3 414.1108 375.6381 59.0425 0.2781 1567 +1569 3 413.1956 374.962 59.3289 0.2916 1568 +1570 3 412.2404 374.3408 59.593 0.2684 1569 +1571 3 411.3435 373.6327 59.5781 0.231 1570 +1572 3 410.4718 373.0401 60.3968 0.2161 1571 +1573 3 409.6447 372.3377 61.04 0.2255 1572 +1574 3 408.9846 371.4145 61.2567 0.2094 1573 +1575 3 408.813 370.3139 61.364 0.1835 1574 +1576 3 408.7661 369.1825 61.7462 0.1579 1575 +1577 3 408.1964 368.2444 62.092 0.1627 1576 +1578 3 407.3063 367.5683 62.5792 0.1652 1577 +1579 3 406.3271 367.0879 63.3909 0.1652 1578 +1580 3 405.6647 366.1955 63.31 0.1431 1579 +1581 3 405.1956 365.1545 63.2565 0.1398 1580 +1582 3 404.666 364.1546 63.6177 0.1511 1581 +1583 3 403.983 363.2406 63.7305 0.1867 1582 +1584 3 403.1776 362.4409 64.0674 0.2021 1583 +1585 3 402.3311 361.6779 64.2919 0.192 1584 +1586 3 401.512 360.9034 64.7595 0.156 1585 +1587 3 400.7981 360.0294 65.2 0.1289 1586 +1588 3 400.2318 359.049 65.5956 0.1271 1587 +1589 3 399.5203 358.1567 65.6393 0.1511 1588 +1590 3 398.8762 357.4474 67.1286 0.1906 1589 +1591 3 398.3408 356.4704 67.76 0.2288 1590 +1592 3 428.0951 392.5636 48.6256 0.2608 1548 +1593 3 428.7334 391.7296 47.5773 0.2968 1592 +1594 3 429.3226 390.9002 46.3352 0.3146 1593 +1595 3 429.7642 390.5753 44.0191 0.2977 1594 +1596 3 430.0239 389.6544 43.1749 0.2805 1595 +1597 3 430.1966 389.0321 45.3636 0.267 1596 +1598 3 430.875 388.1134 45.5417 0.2799 1597 +1599 3 431.5099 387.1811 45.0993 0.3058 1598 +1600 3 431.8657 386.0943 45.1108 0.3308 1599 +1601 3 432.2387 385.0155 45.2413 0.3432 1600 +1602 3 432.4331 383.9195 45.8749 0.3441 1601 +1603 3 432.5864 382.8876 46.9652 0.357 1602 +1604 3 432.4892 381.7505 47.0392 0.3686 1603 +1605 3 432.2821 380.6557 46.8821 0.3644 1604 +1606 3 432.392 379.6307 45.7741 0.3331 1605 +1607 3 432.6196 378.5485 45.8368 0.3013 1606 +1608 3 433.0806 377.5543 46.4176 0.2924 1607 +1609 3 433.5417 376.519 46.1412 0.2966 1608 +1610 3 434.1331 375.5546 45.724 0.3051 1609 +1611 3 434.6765 374.6074 44.9694 0.3108 1610 +1612 3 435.2943 373.7288 44.5362 0.3236 1611 +1613 3 436.1191 372.9715 45.0556 0.3425 1612 +1614 3 436.9199 372.1878 45.4236 0.3495 1613 +1615 3 437.3569 371.1891 45.0943 0.3363 1614 +1616 3 437.3134 370.1069 44.3663 0.3025 1615 +1617 3 437.2322 368.9983 43.8348 0.2725 1616 +1618 3 437.6875 368.1472 42.9114 0.2587 1617 +1619 3 437.8546 367.1691 42.7252 0.263 1618 +1620 3 437.723 366.0365 42.7711 0.2669 1619 +1621 3 437.5194 364.912 42.8254 0.2573 1620 +1622 3 437.8214 363.8744 42.3604 0.2542 1621 +1623 3 438.2447 362.8368 41.8051 0.2542 1622 +1624 3 438.6737 361.8266 41.0164 0.2876 1623 +1625 3 439.2766 360.8897 41.4098 0.3151 1624 +1626 3 439.8337 359.8967 41.2846 0.3292 1625 +1627 3 439.9664 358.7698 41.2902 0.3062 1626 +1628 3 440.2993 357.8329 39.9602 0.2532 1627 +1629 3 441.052 357.0252 39.3431 0.202 1628 +1630 3 441.3541 356.0048 40.2144 0.1643 1629 +1631 3 441.3209 354.9294 39.3439 0.1525 1630 +1632 3 441.1607 353.8198 39.6567 0.1525 1631 +1633 3 441.4593 352.7215 39.7398 0.1525 1632 +1634 3 441.4936 351.5867 39.597 0.1567 1633 +1635 3 441.6046 350.4701 39.1633 0.1706 1634 +1636 3 441.7167 349.3387 39.0303 0.1891 1635 +1637 3 441.6961 348.197 38.9049 0.2089 1636 +1638 3 441.6469 347.0576 38.6932 0.2161 1637 +1639 3 441.5531 345.9273 38.3387 0.2105 1638 +1640 3 441.6103 344.8165 37.861 0.1978 1639 +1641 3 441.9741 343.7537 37.5169 0.1963 1640 +1642 3 442.3448 342.6829 37.4209 0.2091 1641 +1643 3 442.3859 341.5618 37.5418 0.2275 1642 +1644 3 442.2258 340.4372 37.7535 0.2472 1643 +1645 3 442.0691 339.3047 37.6796 0.26 1644 +1646 3 441.9432 338.1813 37.9327 0.2549 1645 +1647 3 441.8814 337.0556 38.337 0.2293 1646 +1648 3 441.9203 335.9162 38.386 0.197 1647 +1649 3 442.0759 334.7973 38.0394 0.1713 1648 +1650 3 442.3436 333.7002 37.7381 0.1652 1649 +1651 3 442.7051 332.6203 37.9025 0.1789 1650 +1652 3 443.1284 331.5667 38.2306 0.2045 1651 +1653 3 443.6524 330.5782 38.7545 0.2161 1652 +1654 3 444.2541 329.6253 38.988 0.2019 1653 +1655 3 444.8547 328.6529 38.9189 0.1765 1654 +1656 3 445.3535 327.629 38.7934 0.151 1655 +1657 3 445.9198 326.6486 38.8388 0.1398 1656 +1658 3 446.5318 325.6957 39.1969 0.1469 1657 +1659 3 447.121 324.7233 39.3092 0.1741 1658 +1660 3 447.6289 323.7085 39.4386 0.2051 1659 +1661 3 448.0762 322.6663 39.8 0.2161 1660 +1662 3 448.6276 321.6734 39.9552 0.2161 1661 +1663 3 449.3014 320.7536 40.0988 0.2238 1662 +1664 3 449.9993 319.8498 40.1106 0.2677 1663 +1665 3 450.6079 318.8866 40.1705 0.3319 1664 +1666 3 451.0334 317.8364 40.4202 0.3958 1665 +1667 3 451.2977 316.7278 40.6174 0.4195 1666 +1668 3 451.4807 315.601 40.7784 0.4035 1667 +1669 3 451.2451 314.5394 41.169 0.3686 1668 +1670 3 450.7989 313.4949 41.2482 0.3384 1669 +1671 3 450.2395 312.5053 41.3784 0.3032 1670 +1672 3 450.2223 311.4529 41.9695 0.231 1671 +1673 3 450.434 310.4908 43.3527 0.1578 1672 +1674 3 450.5678 309.3765 43.344 0.1278 1673 +1675 3 450.6754 308.3824 42.0333 0.1424 1674 +1676 3 450.2715 307.5289 40.5927 0.1836 1675 +1677 3 450.2326 306.4021 41.0698 0.2706 1676 +1678 3 450.1834 305.2672 41.2404 0.3562 1677 +1679 3 450.2578 304.1301 41.2196 0.397 1678 +1680 3 450.3653 303.0021 41.5167 0.3911 1679 +1681 3 450.2933 301.8741 41.797 0.3656 1680 +1682 3 449.9363 300.8526 41.2317 0.348 1681 +1683 3 449.6183 299.7966 41.032 0.3117 1682 +1684 3 449.5199 298.7064 41.6198 0.2748 1683 +1685 3 449.5462 297.6345 42.0174 0.2669 1684 +1686 3 449.417 296.5465 42.0927 0.2669 1685 +1687 3 449.2294 295.4735 42.9265 0.2612 1686 +1688 3 448.9228 294.5034 44.0342 0.2405 1687 +1689 3 448.4366 293.571 44.4884 0.2135 1688 +1690 3 447.916 292.5563 44.338 0.2034 1689 +1691 3 447.288 291.6411 43.8612 0.2272 1690 +1692 3 446.716 290.6858 43.3367 0.2801 1691 +1693 3 446.0456 289.8896 42.28 0.3432 1692 +1694 3 426.1617 404.5767 50.5719 0.1883 1465 +1695 3 427.117 403.9613 50.904 0.2277 1694 +1696 3 428.1042 403.3847 50.9527 0.2658 1695 +1697 3 429.0606 402.7566 50.9345 0.2916 1696 +1698 3 430.1177 402.3288 50.7637 0.2924 1697 +1699 3 431.2411 402.1126 50.7987 0.2675 1698 +1700 3 432.289 401.6733 51.1 0.2296 1699 +1701 3 433.2591 401.0795 51.3962 0.2039 1700 +1702 3 434.2681 400.5567 51.7244 0.2034 1701 +1703 3 435.3263 400.3394 52.6333 0.241 1702 +1704 3 436.4074 400.019 52.1956 0.2795 1703 +1705 3 437.5091 399.8829 51.515 0.3177 1704 +1706 3 438.5902 399.5077 51.5284 0.3305 1705 +1707 3 439.6335 399.0592 51.858 0.3559 1706 +1708 3 440.7191 398.8178 51.203 0.3432 1707 +1709 3 441.8574 398.7343 51.0051 0.3305 1708 +1710 3 442.9831 398.5467 51.2 0.2924 1709 +1711 3 444.0402 398.2825 52.0472 0.3051 1710 +1712 3 445.1087 398.0376 52.8514 0.3178 1711 +1713 3 446.192 397.699 53.1938 0.3559 1712 +1714 3 447.2662 397.3043 53.1815 0.3432 1713 +1715 3 448.289 396.7941 53.0788 0.3178 1714 +1716 3 449.0738 396.221 53.1731 0.2584 1715 +1717 3 450.1423 395.8629 53.1829 0.2511 1716 +1718 3 451.2428 395.5552 53.1174 0.2542 1717 +1719 3 452.2129 394.9694 53.0362 0.2247 1718 +1720 3 453.0354 394.2441 52.3359 0.1762 1719 +1721 3 454.0353 393.8128 51.6242 0.1432 1720 +1722 3 454.9985 393.4937 52.7271 0.1652 1721 +1723 3 455.8829 393.3324 54.4393 0.2303 1722 +1724 3 456.9902 393.56 54.8691 0.2938 1723 +1725 3 458.053 393.9742 54.9452 0.3312 1724 +1726 3 459.0323 394.4832 55.6693 0.3425 1725 +1727 3 460.0848 394.7246 56.4029 0.3292 1726 +1728 3 461.0881 394.1972 56.5079 0.3153 1727 +1729 3 461.9781 393.528 56.4245 0.308 1728 +1730 3 463.1004 393.433 56.3203 0.3216 1729 +1731 3 464.2146 393.6447 56.3604 0.3267 1730 +1732 3 465.2602 393.9181 57.1967 0.3098 1731 +1733 3 466.2189 394.3402 58.1756 0.2798 1732 +1734 3 467.2485 394.6903 58.133 0.2588 1733 +1735 3 468.3616 394.6617 58.0006 0.2718 1734 +1736 3 469.4644 394.6583 58.7345 0.2898 1735 +1737 3 470.5421 394.7864 59.383 0.2998 1736 +1738 3 471.6186 395.0667 59.9124 0.2762 1737 +1739 3 472.7294 395.125 60.4206 0.2431 1738 +1740 3 473.8654 395.0392 60.335 0.2231 1739 +1741 3 474.998 394.9752 60.2686 0.2221 1740 +1742 3 476.1385 394.9957 60.3142 0.2288 1741 +1743 3 477.2791 395.0415 60.3151 0.2288 1742 +1744 3 478.4185 395.0369 60.4898 0.2413 1743 +1745 3 479.5568 395.0529 60.5497 0.2542 1744 +1746 3 480.6813 395.2451 60.615 0.2478 1745 +1747 3 481.8013 395.3561 60.9255 0.2216 1746 +1748 3 482.9236 395.2165 61.2637 0.2102 1747 +1749 3 484.0539 395.0987 61.3718 0.2298 1748 +1750 3 485.1395 395.3012 61.7487 0.2415 1749 +1751 3 486.0719 395.0575 62.5257 0.2061 1750 +1752 3 486.6027 394.2167 63.7731 0.1526 1751 +1753 3 486.5775 393.1585 64.533 0.1206 1752 +1754 3 486.1908 392.1094 65.0336 0.1144 1753 +1755 3 485.9735 390.9998 65.219 0.1144 1754 +1756 3 485.5857 389.9335 65.329 0.1144 1755 +1757 3 485.2242 388.865 65.7591 0.1144 1756 +1758 3 484.9599 387.7782 66.3373 0.1144 1757 +1759 3 484.9347 386.6697 66.9606 0.1144 1758 +1760 3 484.873 385.5383 67.2946 0.1246 1759 +1761 3 484.5938 384.4538 67.804 0.1374 1760 +1762 3 484.1797 383.4173 68.4135 0.1501 1761 +1763 3 483.8193 382.3626 69.0365 0.1421 1762 +1764 3 483.9154 381.2574 69.4938 0.1398 1763 +1765 3 484.0996 380.142 69.923 0.1398 1764 +1766 3 483.888 379.1136 70.9411 0.1512 1765 +1767 3 484.1408 378.092 71.96 0.1144 1766 +1768 3 449.6904 396.6889 51.8938 0.2217 1715 +1769 3 450.7738 396.4006 51.6163 0.2476 1768 +1770 3 451.753 395.9167 50.9172 0.2638 1769 +1771 3 452.6636 395.2589 50.5061 0.2766 1770 +1772 3 453.5422 394.5313 50.3096 0.2895 1771 +1773 3 454.2561 393.647 50.3843 0.3127 1772 +1774 3 454.8315 392.6677 50.1469 0.328 1773 +1775 3 455.3692 391.6621 49.924 0.3408 1774 +1776 3 456.0602 390.7584 50.0422 0.312 1775 +1777 3 456.5693 389.7928 49.3618 0.2727 1776 +1778 3 457.0028 388.7472 49.0378 0.2233 1777 +1779 3 457.7956 387.9464 49.1862 0.2051 1778 +1780 3 458.6971 387.2497 49.005 0.1808 1779 +1781 3 459.6992 386.7029 49.0893 0.1663 1780 +1782 3 460.7208 386.2258 48.6517 0.1769 1781 +1783 3 461.8065 385.8804 48.7542 0.202 1782 +1784 3 462.8601 385.4411 48.573 0.2283 1783 +1785 3 463.9217 385.0704 48.0679 0.2163 1784 +1786 3 465.0063 384.7867 47.5121 0.2035 1785 +1787 3 466.0656 384.384 47.88 0.2288 1786 +1788 3 424.5304 414.5181 48.6119 0.4049 1457 +1789 3 425.6149 414.3488 48.4985 0.3843 1788 +1790 3 426.7326 414.3511 47.9606 0.3226 1789 +1791 3 427.8629 414.4518 48.193 0.293 1790 +1792 3 428.9222 414.4197 49.2402 0.3297 1791 +1793 3 430.0628 414.3614 49.1826 0.3939 1792 +1794 3 431.161 414.1658 48.5643 0.4576 1793 +1795 3 432.2512 413.365 49.2086 0.2714 1794 +1796 3 433.2728 412.8753 49.0532 0.2178 1795 +1797 3 434.3871 412.674 48.8684 0.1954 1796 +1798 3 435.5208 412.5367 48.7368 0.2072 1797 +1799 3 436.5996 412.1901 48.5598 0.2509 1798 +1800 3 437.6761 411.8228 48.7026 0.318 1799 +1801 3 438.6462 411.2348 48.648 0.3665 1800 +1802 3 439.7719 411.0918 48.4428 0.3813 1801 +1803 3 440.9102 411.0392 48.6889 0.3813 1802 +1804 3 441.4364 410.8836 48.9308 0.2766 1803 +1805 3 442.4832 410.5747 49.7518 0.2086 1804 +1806 3 443.4899 410.0565 49.77 0.2034 1805 +1807 3 444.4795 409.6218 50.6562 0.24 1806 +1808 3 445.4221 409.004 51.1188 0.2782 1807 +1809 3 446.255 408.2204 51.1778 0.2921 1808 +1810 3 447.264 407.7022 50.8547 0.2401 1809 +1811 3 448.2798 407.1988 50.5025 0.1775 1810 +1812 3 449.2545 406.6016 50.5646 0.1667 1811 +1813 3 450.2967 406.1703 50.9656 0.2067 1812 +1814 3 451.292 406.0022 52.2808 0.2805 1813 +1815 3 452.3296 405.7425 53.0818 0.2936 1814 +1816 3 453.2048 405.0698 52.4322 0.3051 1815 +1817 3 454.2504 404.6179 52.4031 0.3133 1816 +1818 3 455.2376 404.0986 52.9556 0.3625 1817 +1819 3 456.1048 403.3721 53.3652 0.3963 1818 +1820 3 456.9628 402.6388 53.6164 0.3994 1819 +1821 3 457.8139 401.9021 53.1835 0.3564 1820 +1822 3 458.6193 401.1001 53.3268 0.3014 1821 +1823 3 459.4636 400.3863 53.9221 0.2476 1822 +1824 3 460.4646 399.8623 54.2038 0.2254 1823 +1825 3 461.4816 399.399 54.014 0.2199 1824 +1826 3 462.6142 399.288 54.1321 0.2208 1825 +1827 3 463.7296 399.3178 54.595 0.1905 1826 +1828 3 464.798 399.6484 55.1062 0.1517 1827 +1829 3 465.7796 400.1723 55.7052 0.1225 1828 +1830 3 466.6811 400.6963 55.3316 0.1195 1829 +1831 3 467.5631 400.948 55.1653 0.1335 1830 +1832 3 468.5916 401.0075 55.5932 0.1613 1831 +1833 3 469.6109 401.2912 54.8041 0.2016 1832 +1834 3 470.5444 401.8025 55.1516 0.251 1833 +1835 3 471.6094 402.0108 55.8155 0.2759 1834 +1836 3 472.6859 401.7545 56.294 0.2701 1835 +1837 3 473.4066 400.9274 56.4973 0.2559 1836 +1838 3 473.8334 399.9664 57.5322 0.2542 1837 +1839 3 474.6033 399.2537 58.6062 0.2542 1838 +1840 3 475.578 398.6691 58.5956 0.2168 1839 +1841 3 476.4074 397.9095 58.0905 0.1781 1840 +1842 3 477.1212 397.0218 57.8435 0.1653 1841 +1843 3 478.0776 396.396 57.96 0.2288 1842 +1844 3 441.9592 411.1788 47.9024 0.2339 1803 +1845 3 443.0174 411.594 47.614 0.2042 1844 +1846 3 444.0047 412.1626 47.3729 0.2158 1845 +1847 3 444.8753 412.8913 47.6826 0.2659 1846 +1848 3 445.7138 413.6681 47.8036 0.2794 1847 +1849 3 446.684 414.2504 47.4074 0.2923 1848 +1850 3 447.5694 414.668 45.9637 0.2796 1849 +1851 3 448.6276 415.0009 45.2833 0.2794 1850 +1852 3 449.759 415.1599 45.2497 0.2675 1851 +1853 3 450.8973 415.0546 45.2012 0.2803 1852 +1854 3 452.039 415.0169 45.1576 0.2916 1853 +1855 3 453.143 414.8876 44.5024 0.278 1854 +1856 3 454.2366 414.668 43.9062 0.2525 1855 +1857 3 455.36 414.4655 44.0765 0.2297 1856 +1858 3 456.48 414.2424 44.0681 0.2424 1857 +1859 3 457.6034 414.2161 44.4212 0.2542 1858 +1860 3 458.6719 414.5753 43.967 0.2531 1859 +1861 3 459.7404 414.9666 44.1129 0.2402 1860 +1862 3 460.7849 415.2869 44.9056 0.2288 1861 +1863 3 461.8248 415.7571 45.0542 0.2307 1862 +1864 3 462.8384 416.265 44.9873 0.2415 1863 +1865 3 463.9263 416.5235 45.0318 0.247 1864 +1866 3 465.0349 416.6425 45.5333 0.2481 1865 +1867 3 466.1606 416.5258 45.7836 0.2536 1866 +1868 3 467.2645 416.2387 45.9052 0.2669 1867 +1869 3 468.3753 415.9813 45.8287 0.2731 1868 +1870 3 469.3889 416.2147 46.1552 0.2666 1869 +1871 3 470.2126 416.9605 46.7292 0.2542 1870 +1872 3 471.1427 417.5463 46.6371 0.2616 1871 +1873 3 472.1757 418.0084 46.2529 0.2746 1872 +1874 3 473.0749 418.6834 45.9264 0.264 1873 +1875 3 473.9443 419.4098 45.5661 0.2305 1874 +1876 3 474.9785 419.7599 45.1105 0.208 1875 +1877 3 476.0985 419.6947 45.1522 0.2202 1876 +1878 3 477.1944 419.7748 45.7542 0.2288 1877 +1879 3 478.16 420.3022 46.256 0.2113 1878 +1880 3 479.0626 420.9977 46.2997 0.1764 1879 +1881 3 479.9652 421.5983 45.5269 0.1557 1880 +1882 3 480.7717 422.1909 44.1888 0.1725 1881 +1883 3 481.8082 422.5467 43.7469 0.2106 1882 +1884 3 482.8664 422.1978 43.6276 0.2601 1883 +1885 3 483.9498 421.8546 43.3303 0.2782 1884 +1886 3 485.0686 421.8157 42.7994 0.2564 1885 +1887 3 486.2011 421.8958 42.4908 0.2075 1886 +1888 3 487.328 421.7299 42.3035 0.1555 1887 +1889 3 488.3313 421.1888 42.2232 0.1282 1888 +1890 3 489.3689 420.7071 42.3013 0.1149 1889 +1891 3 490.4911 420.4921 42.2878 0.1144 1890 +1892 3 491.626 420.3742 42.4637 0.1144 1891 +1893 3 492.7574 420.4738 42.1546 0.1144 1892 +1894 3 493.8316 420.7174 41.3963 0.1144 1893 +1895 3 494.9436 420.952 41.0617 0.1144 1894 +1896 3 496.0418 420.849 40.3217 0.1144 1895 +1897 3 497.1824 420.7632 40.32 0.1144 1896 +1898 3 431.9813 414.4735 48.5276 0.2727 1794 +1899 3 433.0852 414.7229 48.5624 0.1397 1898 +1900 3 434.1228 415.0558 48.2068 0.1335 1899 +1901 3 435.1467 415.4791 47.8579 0.1528 1900 +1902 3 436.142 415.9881 47.9632 0.1787 1901 +1903 3 437.0263 416.7089 47.8884 0.212 1902 +1904 3 437.8214 417.5074 48.0894 0.2361 1903 +1905 3 438.6451 418.283 48.309 0.2263 1904 +1906 3 439.5317 418.9957 48.0931 0.1929 1905 +1907 3 440.5647 419.3893 47.8862 0.1613 1906 +1908 3 441.6915 419.4842 47.5415 0.1525 1907 +1909 3 442.8241 419.5906 47.5138 0.17 1908 +1910 3 443.9338 419.4144 47.5745 0.2146 1909 +1911 3 445.0137 419.5506 47.1187 0.2662 1910 +1912 3 446.1142 419.7107 46.4971 0.2701 1911 +1913 3 447.2102 419.7954 45.7265 0.2183 1912 +1914 3 448.329 419.967 45.5661 0.1738 1913 +1915 3 449.4307 420.269 45.5927 0.1955 1914 +1916 3 450.466 420.746 45.7178 0.2747 1915 +1917 3 451.5231 421.1773 45.857 0.3439 1916 +1918 3 452.5138 421.7413 45.9774 0.3665 1917 +1919 3 453.4576 422.319 45.3432 0.3469 1918 +1920 3 454.327 423.0478 45.3242 0.2988 1919 +1921 3 455.3875 423.3898 44.8854 0.2584 1920 +1922 3 456.4068 423.8863 45.0526 0.2315 1921 +1923 3 457.4845 424.2364 44.7535 0.2402 1922 +1924 3 458.5884 424.1334 44.1521 0.2298 1923 +1925 3 459.721 424.1483 43.7928 0.2288 1924 +1926 3 460.7483 423.7342 44.4744 0.2298 1925 +1927 3 461.8465 423.455 44.5329 0.2818 1926 +1928 3 462.8704 423.6712 45.5062 0.3226 1927 +1929 3 463.8989 424.1346 45.194 0.3559 1928 +1930 3 464.8369 424.7375 45.6792 0.3536 1929 +1931 3 465.5394 425.6206 46.1068 0.3302 1930 +1932 3 466.2669 426.4878 46.2493 0.271 1931 +1933 3 467.1684 427.1364 46.8289 0.2345 1932 +1934 3 467.8868 427.8835 47.7462 0.2211 1933 +1935 3 468.3342 428.9234 48.1043 0.2229 1934 +1936 3 469.0297 429.715 48.5316 0.2161 1935 +1937 3 470.0604 430.1566 48.704 0.223 1936 +1938 3 470.9104 430.8361 48.7707 0.2426 1937 +1939 3 471.4561 431.82 49.1826 0.2612 1938 +1940 3 471.9652 432.8107 49.7748 0.2669 1939 +1941 3 472.798 433.5074 50.15 0.2747 1940 +1942 3 473.7636 434.0061 50.8878 0.2715 1941 +1943 3 474.6342 434.6651 51.5922 0.2669 1942 +1944 3 475.4739 435.427 51.9677 0.2406 1943 +1945 3 476.4543 435.9864 51.9652 0.2288 1944 +1946 3 477.4427 436.5447 52.19 0.2012 1945 +1947 3 478.1291 437.3912 52.8091 0.1811 1946 +1948 3 478.7102 438.3636 52.8021 0.1487 1947 +1949 3 479.4664 439.2113 52.8032 0.13 1948 +1950 3 480.2638 439.7845 54.0548 0.1168 1949 +1951 3 480.7671 440.7374 54.4897 0.1248 1950 +1952 3 481.2213 441.767 54.0837 0.1375 1951 +1953 3 481.7864 442.7543 53.8362 0.1504 1952 +1954 3 482.0622 443.8526 53.93 0.1417 1953 +1955 3 482.1422 444.9874 53.72 0.129 1954 +1956 3 482.323 446.1108 53.4498 0.1162 1955 +1957 3 482.5072 447.2388 53.3221 0.1144 1956 +1958 3 482.5449 448.3794 53.3607 0.1364 1957 +1959 3 482.1411 449.433 53.1852 0.1637 1958 +1960 3 481.2682 450.1617 53.1401 0.1893 1959 +1961 3 480.3427 450.8207 53.4517 0.1661 1960 +1962 3 479.4355 451.4693 54.084 0.1528 1961 +1963 3 478.5375 452.1317 54.6974 0.1525 1962 +1964 3 477.8488 453.024 55.16 0.2288 1963 +1965 2 416.948 419.5403 47.6647 0.1144 1 +1966 2 417.6046 420.4761 47.5507 0.1144 1965 +1967 2 418.2624 421.4107 47.4365 0.1144 1966 +1968 2 419.0827 422.1554 47.2511 0.1206 1967 +1969 2 419.8949 422.899 46.9409 0.1417 1968 +1970 2 420.3376 423.9332 46.9924 0.1684 1969 +1971 2 421.1339 424.5533 46.8101 0.1864 1970 +1972 2 422.2024 424.7397 47.327 0.1819 1971 +1973 2 423.0375 425.2854 48.4434 0.1678 1972 +1974 2 423.4688 426.3036 48.8449 0.1441 1973 +1975 2 423.9092 427.3504 49.1618 0.129 1974 +1976 2 424.4663 428.3456 49.1 0.1271 1975 +1977 2 425.044 429.326 48.8174 0.138 1976 +1978 2 425.6584 430.2641 49.264 0.1626 1977 +1979 2 426.5004 431.0043 49.7773 0.1652 1978 +1980 2 427.2176 431.86 49.2498 0.1652 1979 +1981 2 427.856 432.7752 49.84 0.1144 1980 +1982 3 416.8999 419.236 45.1746 0.1144 1 +1983 3 417.5245 420.0013 43.7637 0.1144 1982 +1984 3 418.1492 420.7666 42.3525 0.1256 1983 +1985 3 418.8058 421.5446 41.0732 0.161 1984 +1986 3 419.6936 422.2138 40.4936 0.2238 1985 +1987 3 420.7815 422.5284 40.2144 0.2883 1986 +1988 3 421.8306 422.136 39.8532 0.3432 1987 +1989 3 420.9016 421.6544 39.0558 0.2669 1988 +1990 3 420.6728 420.8055 37.8036 0.2669 1989 +1991 3 420.8696 419.7256 37.0546 0.2669 1990 +1992 3 420.8616 418.6216 36.7489 0.2838 1991 +1993 3 420.4063 418.0027 35.1926 0.3144 1992 +1994 3 419.3424 417.8208 34.6254 0.3178 1993 +1995 3 418.2556 417.4776 34.386 0.267 1994 +1996 3 417.2934 416.8988 33.8489 0.1144 1995 +1997 3 416.6826 416.4526 32.8378 0.1949 1996 +1998 3 415.7937 416.0373 31.4345 0.2569 1997 +1999 3 415.0318 415.725 32.6483 0.3018 1998 +2000 3 414.104 415.828 34.2311 0.3424 1999 +2001 3 412.9829 415.9492 34.6629 0.3807 2000 +2002 3 412.0562 416.0728 33.0711 0.4195 2001 +2003 3 411.3218 415.9836 33.0798 0.3811 2002 +2004 3 410.4649 416.0259 32.1793 0.3432 2003 +2005 3 409.989 416.7146 31.2967 0.3363 2004 +2006 3 409.3449 417.6046 32.006 0.3305 2005 +2007 3 408.5727 418.3928 32.0331 0.2806 2006 +2008 3 407.8738 419.2588 31.4084 0.244 2007 +2009 3 407.0947 420.0699 31.8041 0.2183 2008 +2010 3 406.311 420.8993 31.9318 0.2278 2009 +2011 3 405.6212 421.7699 31.2973 0.2288 2010 +2012 3 405.3478 422.6062 29.5565 0.2044 2011 +2013 3 404.7907 423.304 29.9611 0.1631 2012 +2014 3 404.9302 424.1872 30.3162 0.1398 2013 +2015 3 404.7712 424.8667 28.285 0.1398 2014 +2016 3 404.2461 425.6138 28.126 0.1658 2015 +2017 3 403.6993 426.402 29.6089 0.1991 2016 +2018 3 402.8768 427.1307 29.5758 0.2367 2017 +2019 3 402.267 427.5025 27.5783 0.2549 2018 +2020 3 401.1699 427.7748 27.2474 0.2669 2019 +2021 3 400.0488 427.8732 27.0144 0.2613 2020 +2022 3 398.9952 427.7954 26.4026 0.2345 2021 +2023 3 397.9335 427.5185 27.0337 0.2076 2022 +2024 3 396.8422 427.5437 26.9671 0.2073 2023 +2025 3 395.7943 427.379 26.068 0.2526 2024 +2026 3 394.7109 427.1284 25.6917 0.3043 2025 +2027 3 393.5886 426.9419 25.5492 0.3178 2026 +2028 3 392.4744 426.7749 25.6449 0.2911 2027 +2029 3 391.3658 426.744 26.3105 0.2574 2028 +2030 3 390.2584 426.831 26.364 0.2415 2029 +2031 3 389.151 426.9934 26.5317 0.2185 2030 +2032 3 388.1089 427.149 25.9809 0.1956 2031 +2033 3 387.0221 427.2783 25.5049 0.1907 2032 +2034 3 385.909 427.2119 25.9552 0.2287 2033 +2035 3 384.8565 427.4327 26.761 0.2852 2034 +2036 3 383.8051 427.4453 25.9179 0.3172 2035 +2037 3 383.0238 428.2347 25.3394 0.3042 2036 +2038 3 381.9896 428.563 25.1919 0.2841 2037 +2039 3 380.8696 428.5813 25.3266 0.2978 2038 +2040 3 379.76 428.7449 25.5338 0.3111 2039 +2041 3 378.791 429.1556 25.9759 0.2974 2040 +2042 3 378.4009 430.0102 25.0701 0.2707 2041 +2043 3 378.386 431.0169 25.5394 0.2563 2042 +2044 3 377.8826 431.9664 25.104 0.2881 2043 +2045 3 376.9228 432.4537 24.2948 0.3161 2044 +2046 3 376.1472 433.2328 24.92 0.3432 2045 +2047 3 411.3046 415.129 32.1364 0.3456 2002 +2048 3 410.4855 414.4174 31.99 0.3138 2047 +2049 3 409.4227 414.2413 32.5049 0.3226 2048 +2050 3 408.3096 414.2378 32.2269 0.3486 2049 +2051 3 407.248 413.9507 31.5722 0.3753 2050 +2052 3 406.215 414.1028 30.6886 0.3707 2051 +2053 3 405.2071 413.7654 29.8875 0.3457 2052 +2054 3 404.0848 413.6018 29.9158 0.3192 2053 +2055 3 402.9706 413.3466 29.8385 0.3052 2054 +2056 3 401.8872 412.984 29.68 0.3432 2055 +2057 3 417.5211 416.6917 30.9996 0.2585 1996 +2058 3 418.5049 416.2192 30.2204 0.3615 2057 +2059 3 419.6066 416.1208 29.965 0.4149 2058 +2060 3 420.3937 416.7192 28.9204 0.3664 2059 +2061 3 420.6831 417.3095 26.759 0.2968 2060 +2062 3 421.0195 418.2567 25.6124 0.2542 2061 +2063 3 421.6704 419.181 25.3901 0.2486 2062 +2064 3 422.5719 419.6444 25.4464 0.2545 2063 +2065 3 423.6827 419.578 25.9115 0.2744 2064 +2066 3 424.7775 419.3984 25.9818 0.2952 2065 +2067 3 425.8357 419.459 25.1835 0.3051 2066 +2068 3 426.3047 420.1786 23.7658 0.3155 2067 +2069 3 425.8849 421.1579 23.9176 0.3302 2068 +2070 3 425.4879 422.2287 24.0481 0.343 2069 +2071 3 424.4492 422.6954 23.9868 0.3432 2070 +2072 3 423.5317 423.1782 23.6723 0.3241 2071 +2073 3 422.6508 423.8188 22.8981 0.2773 2072 +2074 3 422.1371 424.6837 22.227 0.2488 2073 +2075 3 421.7939 425.6492 21.5152 0.2415 2074 +2076 3 421.2311 426.5965 21.0017 0.2415 2075 +2077 3 420.8536 427.6455 21.0126 0.2336 2076 +2078 3 420.0791 428.2141 21.9215 0.2466 2077 +2079 3 419.0518 428.3708 23.0787 0.2635 2078 +2080 3 418.3963 428.6717 25.0925 0.2669 2079 +2081 3 418.1103 429.6772 25.9507 0.2305 2080 +2082 3 417.3312 430.3728 24.92 0.2288 2081 +2083 3 425.8231 423.153 22.3068 0.225 2071 +2084 3 426.6731 423.7868 21.3234 0.193 2083 +2085 3 427.0072 424.8576 21.2206 0.1907 2084 +2086 3 426.9568 425.9581 21.9419 0.2278 2085 +2087 3 426.7417 427.0598 21.4424 0.254 2086 +2088 3 426.8264 428.1992 21.56 0.2288 2087 +2089 3 422.7709 421.3661 39.0477 0.256 1988 +2090 3 423.7387 420.7975 38.6831 0.2288 2089 +2091 3 424.8244 420.7964 38.0369 0.3008 2090 +2092 3 425.9409 420.5722 38.0584 0.3926 2091 +2093 3 426.9911 420.9794 37.6132 0.4957 2092 +2094 3 428.0928 420.8135 36.906 0.3934 2093 +2095 3 429.2185 420.754 36.7021 0.3232 2094 +2096 3 430.0113 420.9874 35.294 0.2963 2095 +2097 3 430.9928 421.167 34.3991 0.3017 2096 +2098 3 432.1128 421.024 34.188 0.3051 2097 +2099 3 433.147 421.0355 33.1618 0.3051 2098 +2100 3 434.1514 421.3283 32.0667 0.3051 2099 +2101 3 435.2623 421.3958 31.5487 0.3051 2100 +2102 3 436.3628 421.6681 31.2911 0.2933 2101 +2103 3 437.302 422.2996 31.586 0.2924 2102 +2104 3 438.3465 422.7526 31.3732 0.2924 2103 +2105 3 439.4276 422.43 31.2452 0.3296 2104 +2106 3 440.4652 421.9827 30.8042 0.3305 2105 +2107 3 441.5291 421.739 29.9782 0.318 2106 +2108 3 442.6719 421.7745 29.9541 0.3053 2107 +2109 3 443.7908 421.5468 29.8609 0.33 2108 +2110 3 444.913 421.3375 29.664 0.3806 2109 +2111 3 445.9724 421.6406 29.5322 0.3792 2110 +2112 3 446.3499 422.716 29.3829 0.3488 2111 +2113 3 446.5924 423.8211 29.6139 0.2828 2112 +2114 3 447.1942 424.7626 29.8824 0.2202 2113 +2115 3 448.0579 425.3552 29.1102 0.1725 2114 +2116 3 448.8324 425.3701 27.58 0.1525 2115 +2117 3 449.6435 424.5922 27.442 0.1699 2116 +2118 3 450.1102 424.0568 25.632 0.2161 2117 +2119 3 451.0197 423.7525 25.5559 0.2907 2118 +2120 3 452.1477 423.7731 25.5676 0.3373 2119 +2121 3 453.2574 423.6838 24.9785 0.3432 2120 +2122 3 454.2309 423.6461 23.5528 0.3104 2121 +2123 3 455.3143 423.7124 22.7273 0.2941 2122 +2124 3 456.2684 423.1793 23.1028 0.3036 2123 +2125 3 457.211 422.5536 23.506 0.3394 2124 +2126 3 458.3184 422.3076 23.6379 0.3549 2125 +2127 3 459.4315 422.3648 23.0686 0.3559 2126 +2128 3 460.2655 423.0398 22.1992 0.3311 2127 +2129 3 461.1453 423.7342 21.6303 0.3052 2128 +2130 3 461.8591 424.6265 21.5228 0.2288 2129 +2131 3 428.142 422.1623 36.9488 0.3607 2093 +2132 3 428.9966 422.7778 35.9517 0.2996 2131 +2133 3 429.9747 423.0112 34.9129 0.2597 2132 +2134 3 431.0935 423.0146 34.3395 0.2209 2133 +2135 3 432.114 423.2937 33.504 0.1746 2134 +2136 3 433.1333 423.7079 32.9602 0.1448 2135 +2137 3 434.2407 423.9081 33.2004 0.1398 2136 +2138 3 435.3721 424.0328 33.3992 0.1686 2137 +2139 3 436.3857 424.4549 32.7984 0.1993 2138 +2140 3 437.0629 425.3415 32.5702 0.2481 2139 +2141 3 437.2551 426.4557 32.7029 0.277 2140 +2142 3 437.9815 427.2829 33.231 0.3157 2141 +2143 3 439.0077 427.7553 32.933 0.33 2142 +2144 3 439.7078 428.6271 32.4288 0.3431 2143 +2145 3 440.1746 429.5926 33.3942 0.3299 2144 +2146 3 440.7397 430.5822 33.29 0.3034 2145 +2147 3 441.1195 431.598 32.408 0.2663 2146 +2148 3 441.7018 432.5636 32.0118 0.2535 2147 +2149 3 442.3756 433.4536 32.6225 0.2415 2148 +2150 3 443.0186 434.3162 33.5608 0.2406 2149 +2151 3 443.4876 435.3217 34.1928 0.2317 2150 +2152 3 443.8674 436.3948 33.9511 0.2688 2151 +2153 3 444.4028 437.3901 33.5524 0.2924 2152 +2154 3 445.1167 438.2572 33.2749 0.2855 2153 +2155 3 445.6395 439.1965 33.9478 0.2247 2154 +2156 3 446.2538 440.0819 33.4356 0.2071 2155 +2157 3 446.891 440.9411 33.9592 0.2369 2156 +2158 3 447.8337 441.5703 34.071 0.2931 2157 +2159 3 448.694 442.2979 33.7565 0.3296 2158 +2160 3 449.632 442.9225 33.3264 0.3358 2159 +2161 3 450.5438 443.6089 33.1962 0.3305 2160 +2162 3 451.2199 444.5069 33.1201 0.3305 2161 +2163 3 451.554 445.5846 33.2228 0.3305 2162 +2164 3 452.0791 446.5673 33.3119 0.314 2163 +2165 3 452.8856 447.3578 33.0484 0.2799 2164 +2166 3 453.7893 448.0282 32.5578 0.2582 2165 +2167 3 454.6828 448.6528 33.061 0.2542 2166 +2168 3 455.5854 449.2488 33.9704 0.282 2167 +2169 3 456.4835 449.8277 33.4496 0.312 2168 +2170 3 457.1699 450.6982 33.0798 0.3381 2169 +2171 3 457.9855 451.4888 32.951 0.333 2170 +2172 3 458.744 452.3307 32.625 0.3203 2171 +2173 3 459.5723 453.0652 33.1416 0.3075 2172 +2174 3 460.6591 453.1533 33.3698 0.3155 2173 +2175 3 461.7802 453.0446 33.8352 0.3286 2174 +2176 3 462.9127 453.1281 34.0298 0.3421 2175 +2177 3 464.0087 453.4393 34.2294 0.3305 2176 +2178 3 465.1115 453.3798 33.5093 0.303 2177 +2179 3 466.2132 453.2597 33.0711 0.277 2178 +2180 3 467.0472 453.3397 31.9206 0.2518 2179 +2181 3 467.9086 453.2551 33.5829 0.2336 2180 +2182 3 469.048 453.2757 33.8136 0.2161 2181 +2183 3 470.1257 453.0904 33.2979 0.2254 2182 +2184 3 471.0157 453.6006 32.881 0.258 2183 +2185 3 471.9263 454.2778 32.5486 0.2984 2184 +2186 3 472.9879 454.6725 32.6374 0.3161 2185 +2187 3 474.0622 455.0523 32.8947 0.3178 2186 +2188 3 475.1158 455.4378 32.408 0.2942 2187 +2189 3 476.2323 455.6552 32.1608 0.2675 2188 +2190 3 477.3477 455.7868 31.6327 0.2163 2189 +2191 3 478.4208 456.1128 31.08 0.1144 2190 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc new file mode 100644 index 0000000..84e566f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01_473845048_m.swc @@ -0,0 +1,3786 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/177300.01.02.01/reconstruction/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01___DS.swc +# id,type,x,y,z,r,pid +1 1 303.16 379.4648 28.56 5.4428 -1 +2 3 302.6646 375.232 23.2562 0.2524 1 +3 3 302.469 374.2356 21.9996 0.2615 2 +4 3 302.0057 373.2918 21.0081 0.3026 3 +5 3 301.2358 372.4956 20.7318 0.36 4 +6 3 300.3366 371.832 20.7847 0.3728 5 +7 3 299.7177 370.8768 20.9602 0.3575 6 +8 3 299.5049 369.798 21.7249 0.3935 7 +9 3 299.5198 368.6563 21.8372 0.4067 8 +10 3 299.6319 367.518 21.8288 0.432 9 +11 3 299.9305 366.414 21.7669 0.3941 10 +12 3 299.9534 365.2803 21.3934 0.3432 11 +13 3 299.2818 364.1844 21.835 0.3426 12 +14 3 298.4113 363.4442 21.8336 0.3307 13 +15 3 297.5372 362.7052 21.8064 0.2929 14 +16 3 297.0465 361.6756 21.639 0.2796 15 +17 3 296.5568 360.9103 20.5181 0.1964 16 +18 3 296.4024 359.8749 19.7562 0.1915 17 +19 3 296.2342 358.7584 19.6034 0.2477 18 +20 3 295.8212 357.6968 19.6199 0.3025 19 +21 3 295.3156 356.6717 19.7109 0.3267 20 +22 3 294.8111 355.6582 20.0852 0.3125 21 +23 3 294.0824 354.8276 20.6212 0.2917 22 +24 3 293.1958 354.116 20.4296 0.2796 23 +25 3 292.2016 353.6642 19.6 0.2759 24 +26 3 291.2704 353.0922 18.898 0.2278 25 +27 3 290.7682 352.0832 18.6127 0.2161 26 +28 3 290.5108 351.0433 17.754 0.2229 27 +29 3 289.7706 350.1956 17.3659 0.2669 28 +30 3 288.9069 349.46 17.3953 0.2585 29 +31 3 288.2308 348.5425 17.535 0.2245 30 +32 3 287.7171 347.5724 18.1266 0.1808 31 +33 3 287.8121 346.4821 18.8541 0.178 32 +34 3 288.0684 345.5772 17.267 0.1907 33 +35 3 288.1038 344.6838 15.5235 0.1907 34 +36 3 288.3566 343.6084 14.8921 0.1932 35 +37 3 289.0007 342.6692 15.113 0.2306 36 +38 3 289.4698 341.6281 15.0758 0.2553 37 +39 3 289.7329 340.523 14.8417 0.2621 38 +40 3 289.9468 339.4706 13.8762 0.2132 39 +41 3 289.9823 338.4535 12.9086 0.1907 40 +42 3 289.2009 337.6253 12.7764 0.193 41 +43 3 288.28 336.9618 12.5132 0.2034 42 +44 3 287.3865 336.447 12.6182 0.1978 43 +45 3 286.7791 336.0088 14.0918 0.1738 44 +46 3 285.6522 336.058 14.2492 0.1515 45 +47 3 284.6936 335.8498 15.4532 0.129 46 +48 3 284.0746 334.9357 15.6929 0.1155 47 +49 3 283.2212 334.4781 14.3422 0.1503 48 +50 3 282.1104 334.62 14.0 0.2288 49 +51 3 297.5086 361.2443 21.7473 0.2584 16 +52 3 298.2465 360.3806 21.812 0.2203 51 +53 3 299.0313 359.5729 21.5678 0.189 52 +54 3 299.8252 358.9929 20.3588 0.1631 53 +55 3 300.6764 358.4941 19.0198 0.1603 54 +56 3 301.6076 357.905 18.9526 0.1896 55 +57 3 302.6681 357.5847 19.1615 0.2288 56 +58 3 303.6462 357.6579 18.0536 0.259 57 +59 3 304.3143 358.2859 16.6068 0.2577 58 +60 3 305.273 358.7092 15.9995 0.2542 59 +61 3 306.3003 358.3855 15.4902 0.2746 60 +62 3 307.2201 357.7723 15.972 0.3216 61 +63 3 308.3194 357.5938 16.03 0.3518 62 +64 3 309.3719 357.9027 15.4003 0.3559 63 +65 3 310.27 358.5879 15.2365 0.3559 64 +66 3 311.2241 359.1908 15.6405 0.4007 65 +67 3 312.3452 359.3235 15.6626 0.4529 66 +68 3 313.3633 359.3281 14.45 0.4576 67 +69 3 314.4902 359.3155 14.0638 0.3872 68 +70 3 315.6227 359.2183 14.3315 0.275 69 +71 3 316.6146 358.6772 14.0784 0.1907 70 +72 3 297.6768 360.9823 21.0529 0.2519 16 +73 3 298.1767 360.1484 21.8341 0.2161 72 +74 3 298.8471 359.2503 21.56 0.2814 73 +75 3 299.5621 358.6211 20.615 0.3759 74 +76 3 300.0815 357.8238 20.72 0.2132 75 +77 3 300.292 357.1762 22.12 0.2339 76 +78 3 299.9568 356.1272 21.84 0.2542 77 +79 3 299.4386 355.2051 21.56 0.1682 78 +80 3 298.7739 355.0896 20.44 0.134 79 +81 3 298.0166 354.9249 20.144 0.1525 80 +82 3 297.3714 353.9856 20.16 0.1773 81 +83 3 296.8543 353.0487 20.16 0.2539 82 +84 3 296.296 352.6552 21.1915 0.2161 83 +85 3 295.9803 351.7892 22.2888 0.1689 84 +86 3 294.9953 351.6496 21.9878 0.2941 85 +87 3 294.31 350.8808 21.5746 0.2539 86 +88 3 294.0755 349.905 21.553 0.306 87 +89 3 294.1178 348.8777 21.5995 0.19 88 +90 3 293.8044 347.8172 21.9859 0.1909 89 +91 3 293.3216 347.2166 20.7444 0.2288 90 +92 3 292.88 346.2968 21.0288 0.2919 91 +93 3 292.0643 345.7408 21.4584 0.287 92 +94 3 291.5095 344.9286 21.9114 0.3051 93 +95 3 291.1274 344.3028 23.312 0.3181 94 +96 3 290.7224 343.3213 24.0131 0.2851 95 +97 3 290.0349 342.9987 22.4826 0.2796 96 +98 3 289.6368 342.072 22.5103 0.1907 97 +99 3 288.7639 341.8547 23.6482 0.1478 98 +100 3 288.5134 341.1408 22.7452 0.1144 99 +101 3 287.9894 340.7335 21.0946 0.1782 100 +102 3 287.5444 339.8401 21.1212 0.3741 101 +103 3 286.763 339.4969 22.6559 0.2734 102 +104 3 286.1144 338.7647 22.4328 0.2962 103 +105 3 285.1912 338.4993 21.5729 0.2551 104 +106 3 284.4579 337.6836 22.12 0.2834 105 +107 3 283.7726 337.0407 22.7903 0.2726 106 +108 3 283.029 336.4676 24.0041 0.3535 107 +109 3 282.2408 335.7526 23.9999 0.3137 108 +110 3 281.6459 335.0204 23.2201 0.2542 109 +111 3 281.1758 334.6051 21.6723 0.3279 110 +112 3 280.7239 333.8936 21.908 0.2878 111 +113 3 280.7204 333.2483 22.5652 0.178 112 +114 3 280.6106 331.9625 21.9254 0.2238 113 +115 3 280.2777 330.8974 21.8338 0.1859 114 +116 3 279.6336 329.9525 21.7932 0.1725 115 +117 3 279.4929 328.9766 21.4362 0.1713 116 +118 3 279.8762 327.9219 20.9927 0.178 117 +119 3 279.557 326.9964 20.8474 0.2002 118 +120 3 278.9838 326.04 20.7374 0.2394 119 +121 3 278.6063 324.9612 20.6027 0.2699 120 +122 3 278.318 323.8927 20.0052 0.2716 121 +123 3 277.9256 322.894 19.0859 0.242 122 +124 3 277.4726 321.933 19.4888 0.2288 123 +125 3 277.1031 320.9 19.395 0.2381 124 +126 3 276.8137 319.8567 18.5102 0.2604 125 +127 3 276.6444 318.7459 18.1843 0.2669 126 +128 3 276.6066 317.6705 18.996 0.2669 127 +129 3 276.5494 316.5757 18.625 0.2793 128 +130 3 276.2028 315.4889 18.4803 0.3048 129 +131 3 275.728 314.449 18.4696 0.3303 130 +132 3 275.259 313.4057 18.4229 0.3305 131 +133 3 274.528 312.5294 18.2322 0.3052 132 +134 3 273.9045 311.621 17.484 0.2668 133 +135 3 273.2902 310.691 17.3606 0.2264 134 +136 3 273.098 309.5881 17.365 0.2087 135 +137 3 272.6953 308.5791 17.3846 0.2034 136 +138 3 271.9505 307.7131 17.4605 0.2263 137 +139 3 271.2458 306.8345 17.8511 0.2724 138 +140 3 270.5903 305.9182 18.3238 0.3157 139 +141 3 269.9634 304.9675 18.482 0.3223 140 +142 3 269.3033 304.034 18.4895 0.2879 141 +143 3 268.6341 303.1097 18.5256 0.2646 142 +144 3 267.8436 302.2906 18.7183 0.2519 143 +145 3 267.0313 301.5218 19.1531 0.2441 144 +146 3 266.2122 300.737 18.8048 0.2542 145 +147 3 265.4572 299.8882 18.48 0.2542 146 +148 3 264.6541 299.0725 18.4803 0.2796 147 +149 3 263.8693 298.2408 18.4806 0.2669 148 +150 3 262.9278 296.9069 18.4859 0.3559 149 +151 3 262.2906 295.9562 18.5091 0.3559 150 +152 3 261.6111 295.0376 18.62 0.3305 151 +153 3 261.3651 294.6338 18.8754 0.3025 152 +154 3 260.9304 293.619 19.4855 0.3546 153 +155 3 260.6215 292.5185 19.6 0.394 154 +156 3 260.5586 291.3768 19.6 0.3813 155 +157 3 260.014 289.9205 19.6003 0.3112 156 +158 3 259.3448 288.995 19.6011 0.339 157 +159 3 258.7293 288.0317 19.605 0.3326 158 +160 3 258.369 286.9518 19.6297 0.309 159 +161 3 258.3507 285.8192 19.8562 0.2725 160 +162 3 258.5589 284.6993 19.7708 0.2447 161 +163 3 258.7442 283.5713 19.696 0.2191 162 +164 3 258.7316 282.4479 20.1611 0.2048 163 +165 3 258.6893 281.3245 20.678 0.1917 164 +166 3 258.8563 280.1953 20.722 0.214 165 +167 3 259.1972 279.1051 20.7326 0.2629 166 +168 3 259.4718 277.9954 20.8085 0.314 167 +169 3 259.3139 276.8892 21.3156 0.3418 168 +170 3 259.2235 275.7669 21.8182 0.3189 169 +171 3 259.1629 274.6252 21.845 0.3057 170 +172 3 258.814 273.5384 21.8708 0.2682 171 +173 3 258.3335 272.5019 22.0217 0.2544 172 +174 3 258.1482 271.4209 22.8038 0.2166 173 +175 3 257.4046 270.5606 23.0583 0.2161 174 +176 3 257.376 269.4589 23.7723 0.2169 175 +177 3 257.3989 268.3172 23.6776 0.2288 176 +178 3 257.3874 267.2041 23.1045 0.2288 177 +179 3 257.3188 266.0727 23.4097 0.2301 178 +180 3 257.0968 264.9618 23.3033 0.2442 179 +181 3 257.1723 263.8533 23.949 0.2722 180 +182 3 257.1106 262.7333 24.2225 0.3092 181 +183 3 256.7182 261.7003 24.6588 0.3283 182 +184 3 256.7685 260.5906 25.1857 0.3077 183 +185 3 256.5054 259.4786 25.2347 0.2504 184 +186 3 256.0947 258.4227 25.4514 0.1821 185 +187 3 255.6668 257.4057 25.9174 0.1493 186 +188 3 255.6074 256.2777 25.9837 0.1433 187 +189 3 255.7744 255.1967 26.7282 0.1525 188 +190 3 256.1485 254.1602 27.2308 0.1567 189 +191 3 256.4379 253.0734 27.1474 0.174 190 +192 3 256.4665 251.9363 27.3862 0.1996 191 +193 3 256.4493 250.7923 27.4484 0.2161 192 +194 3 256.6015 249.6746 27.4938 0.2113 193 +195 3 256.868 248.5843 27.7956 0.1936 194 +196 3 256.836 247.4758 28.4071 0.1882 195 +197 3 256.5386 246.4107 29.0318 0.2138 196 +198 3 256.1176 245.372 29.5506 0.2607 197 +199 3 255.7149 244.3058 29.766 0.3051 198 +200 3 255.303 243.2567 30.1381 0.3051 199 +201 3 254.9782 242.1848 30.6589 0.2826 200 +202 3 254.6853 241.0843 30.8904 0.2599 201 +203 3 254.397 239.9952 31.2897 0.2786 202 +204 3 254.365 238.8992 31.7878 0.3105 203 +205 3 254.564 237.7758 31.9194 0.3367 204 +206 3 254.6452 236.6387 31.9155 0.3308 205 +207 3 254.5835 235.497 31.885 0.293 206 +208 3 254.2243 234.4582 31.5837 0.2349 207 +209 3 254.1087 233.4812 30.8118 0.178 208 +210 3 254.5537 232.7788 32.1006 0.1652 209 +211 3 254.6944 231.755 32.4584 0.1652 210 +212 3 254.9107 230.651 32.0104 0.1652 211 +213 3 255.0411 229.5196 31.9483 0.1438 212 +214 3 255.0559 228.3859 32.2728 0.1281 213 +215 3 256.0421 227.9226 32.51 0.1271 214 +216 3 256.9424 227.7704 34.16 0.178 215 +217 3 261.2107 291.1674 23.0731 0.132 156 +218 3 261.3319 291.7349 25.429 0.1507 217 +219 3 261.3399 292.5185 27.4683 0.1652 218 +220 3 261.0516 292.6535 29.4815 0.1652 219 +221 3 260.2325 292.1364 30.6804 0.1578 220 +222 3 259.1698 291.9866 31.3396 0.1525 221 +223 3 258.0532 292.1456 31.5524 0.1525 222 +224 3 256.9538 292.0003 31.2376 0.1438 223 +225 3 255.8831 291.7978 31.7621 0.1309 224 +226 3 254.9965 292.1799 32.9613 0.1179 225 +227 3 254.2071 292.9223 33.7809 0.1144 226 +228 3 253.8307 293.8776 33.0526 0.1245 227 +229 3 253.9074 294.7356 31.2824 0.1478 228 +230 3 253.2175 295.3328 29.9491 0.1743 229 +231 3 252.1136 295.4414 29.9594 0.2016 230 +232 3 251.4512 295.0376 31.92 0.2288 231 +233 3 261.5584 294.532 16.9543 0.1308 152 +234 3 260.9761 294.4908 15.1875 0.1611 233 +235 3 259.9019 294.8809 15.218 0.178 234 +236 3 258.8769 295.271 15.7959 0.1683 235 +237 3 258.012 295.7366 17.2021 0.1421 236 +238 3 257.2696 296.4184 18.1712 0.1215 237 +239 3 256.3887 296.908 17.7859 0.1144 238 +240 3 256.0638 296.3543 16.7219 0.1144 239 +241 3 256.0901 295.2961 15.757 0.1144 240 +242 3 255.8979 294.2139 16.0994 0.1144 241 +243 3 255.6131 293.1431 16.7947 0.1144 242 +244 3 255.382 292.1215 17.8914 0.1244 243 +245 3 254.6132 291.434 18.7561 0.1374 244 +246 3 253.5539 291.0588 19.1251 0.1503 245 +247 3 252.6421 291.1388 17.7044 0.1415 246 +248 3 251.8459 291.5301 15.9541 0.1284 247 +249 3 251.5736 291.0393 13.6618 0.1147 248 +250 3 251.9088 290.004 12.88 0.1144 249 +251 3 263.0365 298.3815 16.9333 0.1207 149 +252 3 262.135 299.0222 16.2985 0.1144 251 +253 3 261.3262 299.8298 16.282 0.1144 252 +254 3 260.5757 300.6912 16.4343 0.1269 253 +255 3 259.7498 301.4371 17.0794 0.1398 254 +256 3 258.7431 301.778 16.214 0.1652 255 +257 3 257.8336 301.2198 15.2989 0.1652 256 +258 3 257.2444 300.5654 13.564 0.1619 257 +259 3 256.3578 300.4087 12.8741 0.1365 258 +260 3 255.5135 300.5757 14.7162 0.1233 259 +261 3 254.6041 300.7793 16.1795 0.1144 260 +262 3 253.7415 301.3616 17.075 0.1144 261 +263 3 253.2095 302.1521 17.3463 0.1144 262 +264 3 252.9842 302.2036 15.5907 0.1144 263 +265 3 252.7634 301.7597 13.638 0.1205 264 +266 3 251.8688 301.7849 12.1612 0.1337 265 +267 3 251.1 301.2369 12.2864 0.1483 266 +268 3 251.4089 300.9029 14.238 0.142 267 +269 3 251.9157 301.2003 16.6026 0.1286 268 +270 3 251.8173 302.2414 17.01 0.115 269 +271 3 251.4512 303.2744 16.24 0.1144 270 +272 3 279.9357 332.9074 22.2953 0.1951 113 +273 3 279.0079 333.3696 21.2652 0.1359 272 +274 3 278.5423 334.1624 19.686 0.1144 273 +275 3 278.3695 334.811 17.4812 0.1144 274 +276 3 278.2219 335.8178 16.4077 0.1144 275 +277 3 278.2757 336.9412 16.6925 0.1173 276 +278 3 278.1281 337.9959 17.7047 0.1303 277 +279 3 277.9691 339.0152 18.8966 0.1433 278 +280 3 277.7884 340.0757 19.5807 0.1525 279 +281 3 277.0997 340.7496 19.434 0.1525 280 +282 3 276.1044 340.8571 18.5035 0.1525 281 +283 3 275.4924 341.2426 16.3864 0.1462 282 +284 3 274.7716 341.3582 14.527 0.1326 283 +285 3 273.9663 341.8375 13.839 0.1189 284 +286 3 273.7077 342.8522 13.092 0.1144 285 +287 3 274.1756 343.7766 12.2651 0.1363 286 +288 3 274.7888 344.6872 12.88 0.1652 287 +289 3 299.9259 364.1718 19.7714 0.3256 12 +290 3 299.8024 363.1857 18.3994 0.2615 289 +291 3 300.1867 362.3208 17.1349 0.223 290 +292 3 300.7084 361.5806 15.4552 0.2161 291 +293 3 300.5585 360.5739 14.7638 0.2275 292 +294 3 299.617 360.0042 14.3074 0.2288 293 +295 3 298.7053 360.4664 13.1547 0.2163 294 +296 3 297.6917 360.9846 12.9111 0.2035 295 +297 3 296.5614 361.1459 13.0838 0.1907 296 +298 3 295.5204 360.9926 12.2881 0.2142 297 +299 3 294.7459 360.2159 12.3057 0.2714 298 +300 3 295.2927 359.4734 12.292 0.2542 299 +301 3 296.4047 359.4482 12.1187 0.2542 300 +302 3 296.8497 358.4003 12.1646 0.2669 301 +303 2 305.1826 383.232 22.9978 0.3252 1 +304 2 305.4286 384.3028 22.8676 0.3594 303 +305 2 305.3542 385.3575 23.898 0.3686 304 +306 2 305.0865 386.362 24.9337 0.3648 305 +307 2 304.6735 387.419 25.1149 0.3559 306 +308 2 304.3704 388.4772 24.5893 0.3398 307 +309 2 304.1621 389.5011 23.7555 0.2837 308 +310 2 304.6094 390.5399 23.4931 0.2424 309 +311 2 305.2958 391.4505 23.2809 0.2542 310 +312 2 305.6551 392.5178 23.7577 0.2288 311 +313 2 305.8598 393.5657 22.776 0.2282 312 +314 2 305.8427 394.5965 21.9346 0.2222 313 +315 2 306.258 395.6478 21.849 0.2288 314 +316 2 306.7121 396.69 21.8974 0.2352 315 +317 2 307.0999 397.7528 22.2233 0.2615 316 +318 2 307.5667 398.6863 21.7031 0.2938 317 +319 2 308.0163 399.2663 21.0885 0.3298 318 +320 2 308.4384 400.2009 21.0042 0.1924 319 +321 2 308.7679 400.9251 22.3936 0.2136 320 +322 2 309.1717 401.5989 23.984 0.2232 321 +323 2 309.6728 402.3082 25.5769 0.2074 322 +324 2 309.6808 403.0312 24.9942 0.1177 323 +325 2 310.1144 403.5437 24.855 0.2288 324 +326 2 309.7963 404.5504 24.4471 0.2628 325 +327 2 309.8501 405.4039 23.1179 0.1962 326 +328 2 309.9302 406.1703 22.1449 0.3121 327 +329 2 310.4336 407.081 22.12 0.2756 328 +330 2 310.7401 408.1186 22.3076 0.2059 329 +331 2 311.2298 409.0143 22.5123 0.2855 330 +332 2 311.8533 409.4422 20.8029 0.2437 331 +333 2 311.8407 410.2384 20.524 0.2288 332 +334 2 312.7639 410.3803 20.547 0.1144 333 +335 2 312.7696 410.8756 22.7214 0.1416 334 +336 2 313.0373 411.8514 23.52 0.206 335 +337 2 313.2924 412.9314 23.52 0.2539 336 +338 2 313.79 413.2586 22.4 0.178 337 +339 2 314.2271 414.0044 23.3374 0.1955 338 +340 2 314.1607 414.8888 22.4 0.2111 339 +341 2 314.7453 415.7754 21.8711 0.2939 340 +342 2 315.3928 416.4961 21.9904 0.3108 341 +343 2 315.744 417.3472 22.09 0.1484 342 +344 2 316.3869 418.2064 22.3728 0.2844 343 +345 2 316.8743 418.9957 21.7048 0.1824 344 +346 2 316.6947 419.7496 20.4067 0.1816 345 +347 2 317.0596 420.5802 19.1148 0.1398 346 +348 2 317.9874 420.8868 19.88 0.2893 347 +349 2 318.5262 421.5972 19.068 0.2288 348 +350 2 318.8683 422.5444 20.1505 0.3794 349 +351 2 319.2687 423.2548 18.6455 0.2754 350 +352 2 319.7526 423.8806 16.8291 0.1406 351 +353 2 320.0031 424.9411 17.1741 0.2503 352 +354 2 320.6335 425.4628 18.6519 0.15 353 +355 2 320.9995 426.2521 19.6 0.1205 354 +356 2 321.4102 427.0266 20.8057 0.2266 355 +357 2 321.8072 427.7016 20.4691 0.376 356 +358 2 321.845 428.6694 19.7954 0.3971 357 +359 2 322.1767 429.4576 20.5691 0.1525 358 +360 2 322.9512 430.0307 21.2783 0.1781 359 +361 2 323.18 431.1027 20.7068 0.2507 360 +362 2 322.9523 431.7204 19.0282 0.1899 361 +363 2 323.1125 432.7283 18.6379 0.1828 362 +364 2 323.752 433.3346 18.7911 0.4068 363 +365 2 323.752 433.759 19.32 0.2355 364 +366 2 324.2096 434.72 19.32 0.2669 365 +367 2 324.1295 433.8048 17.1441 0.3559 364 +368 2 324.5334 434.7658 17.36 0.3465 367 +369 2 325.1111 435.6466 17.3594 0.1908 368 +370 2 325.2209 436.7346 16.7524 0.1622 369 +371 2 325.6053 437.7996 16.6782 0.2207 370 +372 2 325.992 438.5078 15.96 0.2009 371 +373 2 326.6189 439.2754 16.5161 0.2028 372 +374 2 327.5283 439.4527 16.1672 0.3288 373 +375 2 328.4756 439.7456 16.5374 0.1663 374 +376 2 329.1231 440.4949 17.0103 0.3163 375 +377 2 329.7191 440.9354 17.5314 0.3373 376 +378 2 330.5496 441.3266 17.5174 0.2636 377 +379 2 331.4797 441.0189 17.08 0.3369 378 +380 2 332.4178 441.0738 17.1259 0.2575 379 +381 2 332.9132 441.3861 16.7807 0.3335 380 +382 2 333.8512 441.7934 17.2357 0.2132 381 +383 2 334.6864 442.4042 17.4264 0.1817 382 +384 2 335.5913 442.7383 16.8221 0.2989 383 +385 2 336.1953 442.8802 15.059 0.2078 384 +386 2 336.9778 443.5299 14.3959 0.2288 385 +387 2 337.8026 443.6249 15.3437 0.3432 386 +388 2 338.4776 444.4509 15.9034 0.2161 387 +389 2 338.624 445.3478 15.9034 0.1144 388 +390 2 338.8528 446.0456 14.84 0.2161 389 +391 2 339.2498 447.0306 15.54 0.1461 390 +392 2 339.5312 447.5557 13.3473 0.211 391 +393 2 340.0002 448.2169 13.9244 0.1421 392 +394 2 339.9728 449.1927 14.051 0.1424 393 +395 2 339.6628 450.0656 12.934 0.3336 394 +396 2 340.3892 450.6822 13.7334 0.2288 395 +397 2 341.023 451.5231 13.4697 0.1271 396 +398 2 341.7117 451.9967 13.4613 0.174 397 +399 2 342.485 452.5481 13.5663 0.169 398 +400 2 342.6486 453.1201 12.1834 0.1732 399 +401 2 343.3247 453.7104 12.0081 0.1841 400 +402 2 343.8567 454.3922 13.0046 0.1865 401 +403 2 344.4229 454.6256 14.1635 0.1285 402 +404 2 344.94 455.0546 12.7854 0.247 403 +405 2 345.6024 455.4264 11.76 0.2924 404 +406 3 301.5847 384.1975 25.1188 0.266 1 +407 3 300.9715 385.1219 24.5062 0.2776 406 +408 3 300.0792 385.7717 24.9561 0.2796 407 +409 3 299.601 385.8712 24.8889 0.3178 408 +410 3 299.1022 386.0954 26.0089 0.2034 409 +411 3 298.4959 386.4432 28.1512 0.2161 410 +412 3 297.8358 387.1536 28.3161 0.2895 411 +413 3 297.1563 387.7554 26.7473 0.1968 412 +414 3 296.2708 388.054 26.32 0.3147 413 +415 3 295.4426 388.1192 27.5495 0.3085 414 +416 3 294.6624 388.2358 28.6437 0.1937 415 +417 3 293.6396 388.65 28.9167 0.1824 416 +418 3 292.5494 388.9325 28.5172 0.2393 417 +419 3 291.45 389.071 27.832 0.1925 418 +420 3 290.3094 389.079 27.9558 0.1907 419 +421 3 289.2867 389.1007 26.7179 0.2156 420 +422 3 288.1667 389.238 26.2828 0.279 421 +423 3 287.2012 389.8466 26.124 0.3178 422 +424 3 285.9725 390.6634 26.2811 0.252 423 +425 3 285.0001 391.1222 27.2227 0.3034 424 +426 3 283.8813 391.3269 27.4739 0.3299 425 +427 3 282.7579 391.1416 27.6842 0.3305 426 +428 3 281.6963 390.9128 28.5636 0.3178 427 +429 3 280.6163 390.9254 29.4868 0.2796 428 +430 3 279.597 391.0398 30.196 0.3037 429 +431 3 278.9129 391.6392 28.6348 0.2957 430 +432 3 278.0858 392.2936 27.7707 0.2836 431 +433 3 277.1981 392.9571 28.1789 0.2615 432 +434 3 276.3172 393.6641 28.5155 0.2633 433 +435 3 275.4191 394.3723 28.5597 0.2577 434 +436 3 274.4902 395.0381 28.5578 0.2542 435 +437 3 273.5396 395.6753 28.5491 0.2635 436 +438 3 272.5157 396.1786 28.4962 0.2669 437 +439 3 271.4151 396.3663 28.0876 0.2479 438 +440 3 270.6224 396.3525 26.2741 0.2122 439 +441 3 269.6477 396.0951 25.2118 0.2034 440 +442 3 268.5243 396.0036 24.8928 0.2034 441 +443 3 267.4134 396.2233 24.6056 0.225 442 +444 3 266.417 396.1512 23.3486 0.2515 443 +445 3 266.2786 395.2142 22.104 0.3019 444 +446 3 265.5167 394.5473 20.9006 0.3051 445 +447 3 264.7662 393.6939 20.7833 0.2663 446 +448 3 263.9723 392.8851 21.0798 0.2611 447 +449 3 263.0525 392.4366 20.6038 0.2818 448 +450 3 262.0183 392.543 20.5906 0.2924 449 +451 3 260.9647 392.4046 21.2766 0.267 450 +452 3 260.0506 391.8475 20.7978 0.2365 451 +453 3 259.4089 391.2011 19.1794 0.2195 452 +454 3 258.5863 390.5296 18.559 0.2256 453 +455 3 257.7066 389.8066 18.7202 0.219 454 +456 3 256.645 389.6384 18.3042 0.2059 455 +457 3 255.6668 390.0216 17.3244 0.1929 456 +458 3 255.0079 390.7035 15.8211 0.1907 457 +459 3 254.0561 391.0901 14.7022 0.1907 458 +460 3 252.9807 391.3727 14.478 0.1907 459 +461 3 251.9111 391.7022 14.1028 0.1821 460 +462 3 250.9181 392.1678 13.3364 0.1691 461 +463 3 249.9766 392.7787 12.8573 0.1563 462 +464 3 248.971 393.3072 12.6571 0.1525 463 +465 3 248.0707 393.9902 12.8103 0.1525 464 +466 3 247.5399 394.974 12.8797 0.1718 465 +467 3 247.652 396.0734 12.8789 0.2074 466 +468 3 247.7172 397.2094 12.8719 0.2458 467 +469 3 247.9586 398.3202 12.8086 0.2437 468 +470 3 248.9413 398.6977 12.6235 0.2086 469 +471 3 250.0704 398.7469 12.9685 0.1694 470 +472 3 251.1606 398.4941 13.4901 0.1538 471 +473 3 252.2577 398.263 13.0374 0.1525 472 +474 3 253.3868 398.3522 12.7434 0.1408 473 +475 3 254.4977 398.2241 12.185 0.1398 474 +476 3 255.112 397.3112 12.88 0.1525 475 +477 3 279.4495 390.8934 30.7238 0.2453 429 +478 3 278.5423 390.9094 30.9336 0.2048 477 +479 3 277.7758 391.1279 31.9984 0.1731 478 +480 3 276.7862 390.7996 31.8228 0.2484 479 +481 3 276.0014 390.4975 30.2618 0.1945 480 +482 3 275.4054 390.2493 28.856 0.2183 481 +483 3 274.7327 389.7528 27.2588 0.1832 482 +484 3 273.8416 389.4496 27.2994 0.2605 483 +485 3 273.9308 389.1671 29.3796 0.2519 484 +486 3 273.8862 389.1682 31.8548 0.3621 485 +487 3 272.9996 389.0744 32.9714 0.2619 486 +488 3 272.1942 389.532 32.3515 0.1144 487 +489 3 271.5925 390.056 31.2754 0.2542 488 +490 3 270.6658 390.0571 32.4526 0.2258 489 +491 3 269.7438 390.2356 33.3948 0.13 490 +492 3 268.7794 390.5765 34.44 0.264 491 +493 3 268.0106 390.2115 33.6622 0.2739 492 +494 3 267.2922 389.4576 34.1312 0.1271 493 +495 3 266.3518 389.0675 33.5334 0.2814 494 +496 3 265.368 388.6134 34.3104 0.2591 495 +497 3 264.5237 388.1603 33.99 0.2398 496 +498 3 263.6245 388.1661 35.3114 0.2223 497 +499 3 262.7654 387.9098 35.56 0.1689 498 +500 3 262.2048 387.816 36.0805 0.3432 499 +501 3 261.6031 388.3194 35.567 0.2444 500 +502 3 260.6593 388.8033 36.3129 0.2542 501 +503 3 259.6308 388.8559 36.7486 0.2696 502 +504 3 258.7453 388.7049 37.9579 0.2078 503 +505 3 257.8519 388.3297 37.3388 0.2045 504 +506 3 256.8028 388.1626 37.2663 0.1459 505 +507 3 255.8888 388.1214 38.355 0.125 506 +508 3 254.9164 387.5586 38.3541 0.2542 507 +509 3 253.8158 387.3309 38.5255 0.2542 508 +510 3 252.9373 386.9992 38.5213 0.2415 509 +511 3 252.3858 386.553 39.2498 0.1945 510 +512 3 251.839 385.7476 38.9091 0.2392 511 +513 3 250.989 385.3587 39.2 0.2725 512 +514 3 250.0029 385.5131 39.508 0.2288 513 +515 3 249.2639 385.2557 38.6526 0.2875 514 +516 3 248.1805 385.0784 39.1978 0.1816 515 +517 3 247.1132 384.8565 39.4895 0.1269 516 +518 3 246.1877 385.2168 39.7379 0.1789 517 +519 3 245.2336 384.9285 40.0249 0.235 518 +520 3 244.1765 384.7661 40.1657 0.1906 519 +521 3 243.0748 384.6208 39.7701 0.202 520 +522 3 242.004 384.6837 40.1551 0.2161 521 +523 3 240.9378 384.3474 40.46 0.1808 522 +524 3 239.9826 384.0545 40.2576 0.2161 523 +525 3 239.0079 383.5981 40.6 0.1604 524 +526 3 238.0595 382.9883 40.9763 0.1652 525 +527 3 237.1638 382.2951 41.2821 0.1568 526 +528 3 236.1628 381.7883 41.2378 0.1525 527 +529 3 235.4649 380.9348 41.4308 0.1645 528 +530 3 234.79 380.3674 41.44 0.2415 529 +531 3 234.0349 379.5941 41.8566 0.1415 530 +532 3 233.1529 378.9248 41.7665 0.2098 531 +533 3 232.137 378.4455 41.72 0.2134 532 +534 3 231.0972 378.0359 41.4546 0.2728 533 +535 3 230.087 377.5486 41.274 0.2541 534 +536 3 229.0997 377.0773 41.72 0.2034 535 +537 3 228.3195 376.3302 41.804 0.1144 536 +538 3 227.2865 375.8887 41.8964 0.1144 537 +539 3 226.1562 375.804 42.0006 0.1146 538 +540 3 225.0545 375.7319 42.408 0.1452 539 +541 3 223.9998 375.6896 42.0014 0.3295 540 +542 3 223.088 375.6747 42.2831 0.2534 541 +543 3 222.0412 375.28 42.8243 0.1151 542 +544 3 220.9922 374.8259 42.84 0.1144 543 +545 3 219.8562 374.7744 42.84 0.1144 544 +546 3 218.7122 374.7744 42.84 0.1144 545 +547 3 217.6014 374.676 42.84 0.1144 546 +548 3 217.1472 373.8157 43.2247 0.2288 547 +549 3 216.788 373.5103 44.518 0.2288 548 +550 3 216.0021 373.1945 43.96 0.2309 549 +551 3 215.2928 372.4235 43.1281 0.2147 550 +552 3 214.4531 371.6833 42.8305 0.2083 551 +553 3 213.396 371.4637 43.3462 0.3256 552 +554 3 212.3722 371.1228 44.032 0.3686 553 +555 3 211.4444 371.379 44.1913 0.4129 554 +556 3 210.3862 371.1662 43.4162 0.1591 555 +557 3 209.3612 370.7635 43.4 0.1144 556 +558 3 208.7674 370.0977 44.52 0.178 557 +559 3 208.4368 369.2249 43.7898 0.2497 558 +560 3 207.6829 368.7798 43.5193 0.3636 559 +561 3 206.6396 368.622 43.3784 0.3898 560 +562 3 205.5871 368.4641 42.9618 0.3296 561 +563 3 204.6639 368.2387 42.0204 0.3217 562 +564 3 203.7944 367.9298 41.72 0.3305 563 +565 3 202.734 367.9104 42.142 0.384 564 +566 3 201.6586 367.8269 41.4999 0.2598 565 +567 3 200.7846 368.193 40.88 0.2663 566 +568 3 199.9415 367.7949 41.6248 0.2775 567 +569 3 199.1704 367.224 41.16 0.2669 568 +570 3 287.2115 390.1829 25.6178 0.2688 423 +571 3 287.2481 391.1565 24.1534 0.1433 570 +572 3 287.3385 392.1186 22.6792 0.1828 571 +573 3 287.1875 393.0075 20.9756 0.2215 572 +574 3 287.3877 393.8197 19.1523 0.2448 573 +575 3 287.978 394.203 17.3737 0.188 574 +576 3 287.9013 393.5371 15.2382 0.1738 575 +577 3 287.4414 392.6288 14.187 0.1697 576 +578 3 286.7058 391.7571 13.9997 0.1735 577 +579 3 285.8135 391.1931 13.9983 0.1699 578 +580 3 284.6867 391.0547 13.9882 0.1727 579 +581 3 283.815 390.4472 13.9205 0.1652 580 +582 3 283.4146 389.4016 14.0134 0.1531 581 +583 3 282.9638 388.5413 14.996 0.1398 582 +584 3 282.3609 387.8046 16.483 0.1465 583 +585 3 281.6688 386.9992 17.1492 0.1663 584 +586 3 280.7376 386.6194 16.4133 0.178 585 +587 3 280.2411 385.9044 15.8567 0.1697 586 +588 3 279.5925 385.0681 15.4342 0.1652 587 +589 3 278.6738 384.6563 16.4245 0.1763 588 +590 3 278.8031 384.1209 18.6477 0.178 589 +591 3 278.9198 383.0901 19.6624 0.1544 590 +592 3 279.033 382.0022 20.477 0.1286 591 +593 3 279.5536 381.1865 21.9338 0.1149 592 +594 3 280.248 380.3972 23.0336 0.1144 593 +595 3 281.1952 379.9224 24.08 0.1271 594 +596 3 299.696 386.1835 25.3509 0.3103 409 +597 3 299.9831 387.1319 26.752 0.2875 596 +598 3 300.2714 388.0791 28.1529 0.2647 597 +599 3 300.5425 388.6054 27.4324 0.1144 598 +600 3 300.9624 389.524 27.6203 0.3407 599 +601 3 301.6087 390.1395 28.4374 0.1485 600 +602 3 301.3285 390.8613 27.0418 0.223 601 +603 3 301.0585 391.7571 27.5248 0.268 602 +604 3 300.848 392.8645 27.8715 0.1875 603 +605 3 300.594 393.925 28.289 0.1234 604 +606 3 300.3023 394.6823 29.4 0.1972 605 +607 3 300.3057 395.7085 28.5732 0.2433 606 +608 3 300.1856 396.8376 28.5625 0.2789 607 +609 3 299.9808 397.9335 28.1716 0.2464 608 +610 3 299.704 398.5971 26.88 0.1144 609 +611 3 299.9991 399.5134 27.5587 0.1808 610 +612 3 300.2417 400.4343 28.6289 0.1144 611 +613 3 299.6422 401.1836 29.6425 0.2635 612 +614 3 299.5118 402.0256 31.2648 0.3303 613 +615 3 299.855 402.99 30.5864 0.2415 614 +616 3 299.9728 403.9144 30.87 0.307 615 +617 3 299.9568 404.6522 32.48 0.1268 616 +618 3 299.9362 405.7768 32.3028 0.1144 617 +619 3 299.3688 406.263 30.5458 0.1144 618 +620 3 299.0016 406.9208 31.5487 0.24 619 +621 3 298.0989 406.9757 31.8665 0.236 620 +622 3 297.2993 407.1645 32.6116 0.2123 621 +623 3 296.868 407.6873 32.9731 0.3432 622 +624 3 296.2994 407.9115 32.0695 0.3178 623 +625 3 295.4849 408.5018 31.3928 0.3167 624 +626 3 295.0971 408.8656 33.0562 0.2288 625 +627 3 295.3042 408.7009 35.5289 0.3051 626 +628 3 295.1463 407.4013 34.72 0.2931 627 +629 3 295.0365 406.4392 34.2241 0.2539 628 +630 3 295.6004 406.2573 36.6134 0.2542 629 +631 3 296.1255 406.112 38.8612 0.2488 630 +632 3 295.1863 406.4117 38.332 0.2931 631 +633 3 294.564 407.0958 37.6662 0.3342 632 +634 3 293.6865 407.7205 37.828 0.4068 633 +635 3 293.6648 407.9024 40.3287 0.2653 634 +636 3 293.0493 408.4412 41.097 0.2386 635 +637 3 292.7874 409.4296 41.44 0.1907 636 +638 3 293.2324 410.1869 41.6993 0.305 637 +639 3 293.4646 410.8447 42.0742 0.3589 638 +640 3 293.5687 411.8457 42.7207 0.2804 639 +641 3 293.436 412.7987 42.9685 0.2103 640 +642 3 293.9016 413.3135 44.8232 0.36 641 +643 3 293.889 414.0228 45.7422 0.293 642 +644 3 293.8501 415.0604 45.6753 0.4261 643 +645 3 293.3937 416.0602 46.1387 0.4676 644 +646 3 293.0242 417.1299 46.2 0.3605 645 +647 3 292.9784 418.1228 45.9802 0.5101 646 +648 3 293.2072 418.9866 46.1664 0.2702 647 +649 3 293.0287 419.9624 46.2552 0.2288 648 +650 3 292.3721 420.094 48.16 0.4438 649 +651 3 291.6056 419.8652 49.0 0.3704 650 +652 3 291.3265 418.9683 49.628 0.4449 651 +653 3 290.6904 418.9763 51.2089 0.178 652 +654 3 290.8117 419.8549 50.4851 0.2786 653 +655 3 290.7476 420.571 51.7454 0.3892 654 +656 3 290.2408 421.4061 52.8763 0.2644 655 +657 3 290.3426 422.446 52.8864 0.3456 656 +658 3 290.576 423.5042 53.48 0.3228 657 +659 3 290.3278 424.3474 53.9879 0.2611 658 +660 3 290.528 425.2168 52.9836 0.2034 659 +661 3 290.9192 425.3907 54.985 0.237 660 +662 3 291.0919 425.8162 56.3242 0.3432 661 +663 3 291.8699 426.3208 56.3749 0.1574 662 +664 3 292.0449 427.2565 57.4 0.2137 663 +665 3 292.5116 427.1993 58.3377 0.1731 664 +666 3 292.737 427.967 59.7498 0.2415 665 +667 3 293.6431 428.476 60.6522 0.366 666 +668 3 293.6923 429.4736 60.5377 0.2927 667 +669 3 294.1201 430.2916 61.9864 0.2131 668 +670 3 294.4988 431.2686 62.72 0.2034 669 +671 3 294.8809 432.2913 63.212 0.1734 670 +672 3 294.9232 433.3781 63.84 0.1144 671 +673 3 295.4609 434.2292 63.5986 0.1255 672 +674 3 295.2206 435.1936 62.9821 0.2897 673 +675 3 294.8637 436.2106 63.56 0.3375 674 +676 3 294.2608 436.6648 64.0494 0.2347 675 +677 3 294.3581 437.0172 66.1256 0.2266 676 +678 3 293.6431 437.7219 66.6543 0.1398 677 +679 3 293.0939 437.8088 64.5411 0.2034 678 +680 3 292.5208 438.2538 65.8417 0.1875 679 +681 3 291.9488 438.5112 66.915 0.2115 680 +682 3 291.6033 438.9082 68.3133 0.1952 681 +683 3 290.8345 439.4802 68.3544 0.1257 682 +684 3 290.0109 440.1311 68.32 0.2802 683 +685 3 289.7752 441.1744 68.7425 0.275 684 +686 3 289.5235 442.1926 69.6147 0.1144 685 +687 3 289.1815 442.9785 67.9496 0.1144 686 +688 3 288.5912 443.8056 67.0709 0.1144 687 +689 3 288.0638 444.706 67.405 0.1144 688 +690 3 287.565 445.6463 67.8146 0.1731 689 +691 3 287.3476 446.6942 68.1652 0.2118 690 +692 3 286.4507 446.748 69.6704 0.1948 691 +693 3 286.2883 447.6358 69.991 0.2389 692 +694 3 286.0 448.3302 68.5292 0.1271 693 +695 3 285.9851 449.0463 66.6526 0.1473 694 +696 3 285.5424 448.9216 68.5896 0.3173 695 +697 3 285.3113 449.314 70.56 0.3201 696 +698 3 284.7416 450.2784 70.28 0.3305 697 +699 3 294.1464 409.4937 35.1772 0.2682 627 +700 3 293.2072 410.1354 34.8916 0.2382 699 +701 3 292.268 410.7784 34.6063 0.2082 700 +702 3 291.6571 410.7235 34.7637 0.2034 701 +703 3 290.8162 410.5816 35.9296 0.2966 702 +704 3 290.6298 410.2384 37.602 0.3097 703 +705 3 289.7821 410.8287 38.08 0.3302 704 +706 3 288.892 411.4968 37.9756 0.1663 705 +707 3 288.0867 411.1891 37.0972 0.139 706 +708 3 287.033 411.4373 37.5164 0.1403 707 +709 3 286.2997 411.165 38.871 0.3051 708 +710 3 285.4177 411.1536 38.4384 0.1144 709 +711 3 284.7851 411.7302 38.2794 0.1939 710 +712 3 284.0289 412.1924 38.9096 0.2076 711 +713 3 283.3905 412.9348 38.0534 0.2924 712 +714 3 282.8323 413.4256 37.52 0.2537 713 +715 3 282.5188 414.366 36.9275 0.2004 714 +716 3 282.576 415.3624 37.2686 0.1548 715 +717 3 281.9949 415.9584 38.9211 0.1144 716 +718 3 280.8966 416.0728 39.2 0.1144 717 +719 3 279.7526 416.0728 39.2 0.1322 718 +720 3 278.8214 416.0728 40.3066 0.2614 719 +721 3 277.8913 416.3405 39.485 0.299 720 +722 3 277.11 415.7296 39.6396 0.3594 721 +723 3 276.0197 415.5111 40.2094 0.3213 722 +724 3 274.9673 415.8348 40.171 0.2834 723 +725 3 274.2271 415.836 38.8486 0.3212 724 +726 3 273.4995 416.297 38.08 0.1902 725 +727 3 272.4116 416.6219 38.08 0.1576 726 +728 3 271.3465 416.8736 38.187 0.1144 727 +729 3 270.4874 416.8736 39.9459 0.1155 728 +730 3 269.8341 417.3312 41.16 0.1144 729 +731 3 268.7107 417.3312 41.5554 0.1515 730 +732 3 267.736 417.4078 42.8954 0.1773 731 +733 3 267.0279 416.8644 43.1659 0.2288 732 +734 3 266.2706 416.8725 41.7393 0.1938 733 +735 3 265.8359 417.4124 40.4373 0.4306 734 +736 3 264.8005 417.7625 40.6266 0.2631 735 +737 3 263.986 418.084 40.0389 0.2288 736 +738 3 263.0685 418.2807 38.9225 0.1271 737 +739 3 262.6944 418.942 40.5563 0.24 738 +740 3 262.5423 419.8789 41.3003 0.2861 739 +741 3 262.0973 420.706 41.44 0.2558 740 +742 3 262.2883 421.5388 42.0403 0.2691 741 +743 3 262.0435 422.2447 40.3976 0.1467 742 +744 3 261.9794 422.9196 38.64 0.1144 743 +745 3 261.7461 423.8303 37.7292 0.133 744 +746 3 261.1054 424.6162 36.7794 0.1772 745 +747 3 260.9052 425.6607 36.7069 0.3132 746 +748 3 260.5929 426.5965 36.1645 0.2106 747 +749 3 260.1456 427.6135 36.12 0.1445 748 +750 3 259.8516 428.5733 35.7227 0.1722 749 +751 3 259.3677 429.2139 35.7098 0.2847 750 +752 3 259.2327 430.3133 36.12 0.3411 751 +753 3 259.8459 431.0649 36.6016 0.2375 752 +754 3 260.0712 431.9138 38.2928 0.1518 753 +755 3 260.1387 431.6941 40.329 0.1144 754 +756 3 260.26 432.0739 42.3195 0.1907 755 +757 3 260.7256 433.0292 42.2408 0.1907 756 +758 3 261.38 433.9009 42.28 0.2241 757 +759 3 261.0688 434.6022 42.8389 0.3056 758 +760 3 260.8892 435.5219 43.7461 0.2771 759 +761 3 260.8457 436.4577 44.1017 0.1178 760 +762 3 261.6328 437.0469 44.1913 0.2542 761 +763 3 261.6408 438.0101 42.7336 0.2433 762 +764 3 262.2048 438.724 41.44 0.178 763 +765 3 304.9355 375.1977 30.2879 0.3278 1 +766 3 304.9984 374.1532 31.3407 0.3083 765 +767 3 305.0442 373.047 32.018 0.294 766 +768 3 305.3347 371.9785 32.6869 0.2924 767 +769 3 306.0303 371.0861 32.753 0.2693 768 +770 3 306.6778 370.2556 31.7075 0.2552 769 +771 3 307.116 369.2821 30.7244 0.3017 770 +772 3 307.9945 368.5922 30.2492 0.368 771 +773 3 309.1088 368.4847 30.8 0.394 772 +774 3 309.9565 368.4916 30.8 0.3645 773 +775 3 311.0982 368.5499 30.8006 0.3567 774 +776 3 312.1839 368.9022 30.8025 0.3197 775 +777 3 313.0785 369.6104 30.8106 0.3299 776 +778 3 314.0738 370.1721 30.856 0.3797 777 +779 3 315.18 369.9536 31.1878 0.4066 778 +780 3 316.2451 369.6275 31.8214 0.394 779 +781 3 317.1706 369.3896 31.6772 0.3726 780 +782 3 318.2482 369.1345 31.0097 0.3686 781 +783 3 319.3785 369.1299 30.8162 0.326 782 +784 3 320.3292 369.7145 30.8193 0.2639 783 +785 3 321.0693 370.5794 30.9002 0.2001 784 +786 3 321.9239 371.3081 31.362 0.1685 785 +787 3 322.9432 371.7176 30.7787 0.1882 786 +788 3 323.903 371.903 29.349 0.2542 787 +789 3 325.1671 371.7211 28.2125 0.2892 788 +790 3 326.2722 371.8469 27.8522 0.2696 789 +791 3 327.3705 371.9613 28.2954 0.2415 790 +792 3 328.4859 371.7474 28.4099 0.2529 791 +793 3 329.5933 371.6536 27.8642 0.2989 792 +794 3 330.6503 371.514 26.9097 0.3472 793 +795 3 331.7348 371.2646 26.6641 0.3518 794 +796 3 332.8434 371.0884 27.1762 0.3345 795 +797 3 333.9599 370.9626 27.3795 0.3178 796 +798 3 335.0822 371.0953 27.0542 0.3226 797 +799 3 336.1861 371.1216 26.4715 0.3355 798 +800 3 337.3038 370.9226 26.1551 0.3328 799 +801 3 338.4192 370.9054 26.2452 0.3123 800 +802 3 339.4683 371.2978 26.5978 0.2876 801 +803 3 340.4578 371.7348 26.1926 0.2607 802 +804 3 341.3559 372.2713 25.8188 0.2353 803 +805 3 342.1555 373.0538 25.6956 0.2096 804 +806 3 342.9163 373.8672 25.0858 0.21 805 +807 3 343.6198 374.652 24.1058 0.2366 806 +808 3 344.4893 375.2503 23.2224 0.286 807 +809 3 345.5441 375.6461 22.9561 0.3352 808 +810 3 346.6709 375.7548 22.932 0.3735 809 +811 3 347.7863 375.5546 22.7942 0.3999 810 +812 3 348.8411 375.216 22.2068 0.3948 811 +813 3 349.8764 374.9357 21.2456 0.3482 812 +814 3 350.9678 374.7103 20.7687 0.2889 813 +815 3 352.0797 374.7813 20.7197 0.2744 814 +816 3 353.0281 375.3636 20.7183 0.3106 815 +817 3 353.8552 376.1529 20.7136 0.3305 816 +818 3 354.68 376.9457 20.694 0.2994 817 +819 3 355.5609 377.6722 20.601 0.2406 818 +820 3 356.5791 378.0748 20.1124 0.2082 819 +821 3 357.6258 378.4672 20.0402 0.2288 820 +822 3 358.4747 379.188 20.4714 0.2768 821 +823 3 359.2778 379.9796 20.3031 0.3104 822 +824 3 360.1815 380.3674 19.1052 0.3087 823 +825 3 361.2523 380.3285 18.4184 0.2636 824 +826 3 362.3734 380.1718 18.1129 0.2508 825 +827 3 363.4671 380.0654 17.5246 0.238 826 +828 3 364.5825 380.1146 17.3424 0.2177 827 +829 3 365.6727 379.7771 17.2281 0.183 828 +830 3 366.6142 379.2314 16.7706 0.1611 829 +831 3 367.4105 378.4993 16.2392 0.1614 830 +832 3 368.4767 378.3174 16.235 0.1924 831 +833 3 369.5829 378.6114 16.2044 0.2259 832 +834 3 370.6171 379.0324 15.9354 0.2313 833 +835 3 371.6318 379.4007 15.6229 0.1997 834 +836 3 372.7289 379.2337 15.9883 0.1722 835 +837 3 373.683 378.7109 16.7238 0.1713 836 +838 3 374.652 378.1904 17.2309 0.1905 837 +839 3 375.7685 378.0337 17.3594 0.2102 838 +840 3 376.7764 378.4386 17.3552 0.2306 839 +841 3 377.7168 379.0873 17.3337 0.2488 840 +842 3 378.7727 379.4705 17.1931 0.2542 841 +843 3 379.8618 379.4133 16.6001 0.2624 842 +844 3 380.9749 379.3996 16.5245 0.2843 843 +845 3 382.08 379.2246 16.3531 0.328 844 +846 3 383.2091 379.1205 16.24 0.3522 845 +847 3 384.3497 379.1971 16.24 0.3653 846 +848 3 385.3861 379.0781 15.2995 0.2233 847 +849 3 386.3425 378.7784 15.12 0.1146 848 +850 3 387.4842 378.759 15.2163 0.1403 849 +851 3 388.4612 378.8276 15.68 0.1859 850 +852 3 389.5858 378.8928 16.0115 0.1328 851 +853 3 390.4758 378.7509 15.4241 0.1438 852 +854 3 391.3292 378.8505 15.4104 0.2302 853 +855 3 391.8314 378.4421 14.0403 0.2428 854 +856 3 392.7421 378.092 14.7252 0.1468 855 +857 3 393.4491 378.6125 13.72 0.1144 856 +858 3 394.5667 378.7406 13.72 0.1144 857 +859 3 395.5963 379.0072 13.8774 0.1144 858 +860 3 396.7049 378.918 13.44 0.1144 859 +861 3 397.8374 378.7921 13.44 0.1481 860 +862 3 398.8327 378.4798 13.9776 0.1455 861 +863 3 399.5695 377.6619 13.9605 0.1497 862 +864 3 400.3234 377.1894 13.4246 0.2267 863 +865 3 401.083 376.7741 13.7911 0.2342 864 +866 3 401.9753 376.2639 13.7155 0.2288 865 +867 3 402.863 376.0271 13.7511 0.1944 866 +868 3 403.6432 375.6095 14.0017 0.1144 867 +869 3 404.4063 375.3567 13.9342 0.1708 868 +870 3 405.2803 375.693 13.16 0.1564 869 +871 3 406.1486 376.2261 12.5938 0.1296 870 +872 3 407.0123 375.6473 12.3544 0.1773 871 +873 3 407.8406 375.0879 12.7042 0.1951 872 +874 3 408.6162 375.5088 13.0488 0.131 873 +875 3 409.5108 376.2055 12.8391 0.157 874 +876 3 410.5347 376.5442 12.8391 0.1849 875 +877 3 411.4716 375.9504 12.8391 0.1556 876 +878 3 412.118 375.0089 12.8391 0.1467 877 +879 3 412.746 374.0525 12.8391 0.1398 878 +880 3 323.609 371.6993 28.1929 0.2288 788 +881 3 324.4384 371.8618 28.9036 0.2288 880 +882 3 324.5608 372.7186 30.4763 0.1271 881 +883 3 324.896 373.7048 31.451 0.2412 882 +884 3 325.7151 374.1795 31.2404 0.2091 883 +885 3 326.4107 375.0261 30.8311 0.2653 884 +886 3 327.3281 375.5088 30.9173 0.3157 885 +887 3 328.0191 376.2913 30.5701 0.3187 886 +888 3 328.5557 377.0887 31.3734 0.1945 887 +889 3 328.5568 378.0783 32.4615 0.3077 888 +890 3 328.4813 379.1468 31.9816 0.2754 889 +891 3 329.1185 379.8915 32.804 0.1423 890 +892 3 329.329 380.714 33.9329 0.1597 891 +893 3 329.5143 381.699 34.0948 0.2161 892 +894 3 329.8415 382.5422 35.278 0.1144 893 +895 3 330.4993 383.2652 35.0767 0.2071 894 +896 3 330.7361 384.1506 34.8345 0.1726 895 +897 3 331.6868 384.5888 34.9706 0.1667 896 +898 3 332.2268 385.3839 35.1459 0.1993 897 +899 3 332.7896 386.1698 35.6972 0.2049 898 +900 3 332.888 387.0747 35.8142 0.148 899 +901 3 333.1385 387.8789 34.7026 0.3956 900 +902 3 333.5183 388.801 34.16 0.3534 901 +903 3 333.6716 389.7459 35.1375 0.308 902 +904 3 333.8192 390.644 35.8789 0.2182 903 +905 3 334.0102 391.5912 34.7861 0.2208 904 +906 3 334.1498 392.1815 33.6048 0.2671 905 +907 3 334.4747 392.6151 35.5673 0.3305 906 +908 3 334.7344 393.663 35.4668 0.2394 907 +909 3 334.866 394.6869 36.2284 0.212 908 +910 3 334.9209 395.7954 35.915 0.1603 909 +911 3 335.1325 396.6511 35.0773 0.1804 910 +912 3 335.1119 397.6281 33.9312 0.1144 911 +913 3 335.1783 398.1383 36.0595 0.1367 912 +914 3 335.192 399.1256 36.955 0.2542 913 +915 3 335.192 399.9046 35.9332 0.3051 914 +916 3 335.3808 400.9903 36.3689 0.3168 915 +917 3 335.8326 401.878 36.3334 0.2397 916 +918 3 335.7537 402.2064 37.52 0.1144 917 +919 3 336.2937 403.0255 37.24 0.2108 918 +920 3 337.0933 403.1273 35.588 0.1504 919 +921 3 337.075 404.1969 36.197 0.2231 920 +922 3 337.2581 405.2689 36.7077 0.2669 921 +923 3 337.663 405.9804 37.5264 0.3305 922 +924 3 337.48 406.7503 39.1902 0.1431 923 +925 3 337.3656 407.7982 39.9468 0.1398 924 +926 3 337.4811 408.6402 38.409 0.1937 925 +927 3 337.2718 409.4982 37.1927 0.1271 926 +928 3 337.3336 410.4066 36.47 0.1462 927 +929 3 337.242 411.2691 37.3898 0.219 928 +930 3 337.3622 412.0757 38.8119 0.3075 929 +931 3 337.4491 412.8433 37.7871 0.3358 930 +932 3 337.5944 413.739 38.8321 0.1144 931 +933 3 337.194 414.6211 38.08 0.1201 932 +934 3 336.7387 415.5008 38.5437 0.136 933 +935 3 336.1381 416.1655 37.413 0.2754 934 +936 3 335.7766 416.8095 38.7058 0.2453 935 +937 3 336.1518 417.4479 40.2559 0.2288 936 +938 3 336.5293 418.251 39.3781 0.1652 937 +939 3 336.5591 419.2771 39.4108 0.1382 938 +940 3 335.9928 420.0928 38.92 0.3147 939 +941 3 335.9928 421.0114 39.7541 0.2977 940 +942 3 336.0546 422.0719 39.0631 0.2762 941 +943 3 336.2365 422.9528 38.2088 0.2184 942 +944 3 336.7501 423.4779 36.2264 0.2245 943 +945 3 337.1002 424.0762 37.91 0.1907 944 +946 3 337.2249 424.6574 39.9143 0.1144 945 +947 3 337.2523 425.6126 41.3504 0.1147 946 +948 3 337.48 426.4935 42.6188 0.1384 947 +949 3 338.2042 426.966 43.6439 0.262 948 +950 3 339.0358 427.4041 42.84 0.2079 949 +951 3 339.4889 428.0082 43.3224 0.2733 950 +952 3 340.0334 428.6591 43.96 0.1313 951 +953 3 340.3606 429.3329 42.7087 0.1759 952 +954 3 341.1294 430.1177 43.0422 0.2394 953 +955 3 341.9393 430.8865 42.56 0.267 954 +956 3 342.5136 431.7845 42.233 0.3305 955 +957 3 343.1794 432.5247 41.4946 0.21 956 +958 3 343.6576 433.4433 41.16 0.1144 957 +959 3 344.3509 433.5897 42.3948 0.2219 958 +960 3 345.1517 434.2487 42.9887 0.2206 959 +961 3 345.742 435.0575 43.2373 0.2828 960 +962 3 346.4329 435.8846 42.56 0.3178 961 +963 3 346.8768 436.7895 41.8286 0.1218 962 +964 3 347.204 437.5056 40.166 0.1368 963 +965 3 347.5495 438.1703 39.8614 0.1803 964 +966 3 348.2336 438.4632 41.5862 0.2351 965 +967 3 348.8479 439.3555 41.5716 0.2235 966 +968 3 349.0653 440.2101 41.2084 0.3065 967 +969 3 349.2152 440.8633 42.8428 0.1676 968 +970 3 349.1488 441.862 42.9296 0.3061 969 +971 3 349.1236 442.9236 43.265 0.3051 970 +972 3 349.5023 443.0632 45.7447 0.1983 971 +973 3 349.8352 443.5528 45.7615 0.1862 972 +974 3 350.2047 444.0093 44.4489 0.1878 973 +975 3 350.5067 444.6671 43.1172 0.1514 974 +976 3 350.2928 445.5136 42.0227 0.1941 975 +977 3 350.8648 445.9312 42.56 0.1144 976 +978 3 317.1191 369.2214 30.52 0.2756 780 +979 3 318.0652 368.5865 30.5348 0.1519 978 +980 3 318.8168 368.3829 32.2255 0.3121 979 +981 3 319.5169 367.6404 32.965 0.2059 980 +982 3 320.3486 366.9906 32.6228 0.2736 981 +983 3 321.0133 366.4186 31.8998 0.2895 982 +984 3 321.5212 365.9198 31.0766 0.3079 983 +985 3 322.1893 365.2792 31.9074 0.1996 984 +986 3 322.8951 364.8124 31.6546 0.3265 985 +987 3 323.7245 364.6008 32.9871 0.3567 986 +988 3 324.2794 364.5779 32.3036 0.2655 987 +989 3 325.2827 364.8777 32.851 0.2449 988 +990 3 326.1452 365.2598 32.6794 0.2666 989 +991 3 327.2126 365.2552 32.7712 0.2288 990 +992 3 327.9082 365.5675 34.3888 0.2456 991 +993 3 328.8542 365.8844 33.6389 0.233 992 +994 3 329.9079 366.1029 33.9643 0.1639 993 +995 3 330.7727 366.5902 33.5709 0.1525 994 +996 3 331.6422 366.8774 34.4884 0.1144 995 +997 3 332.7187 366.9998 34.9499 0.1202 996 +998 3 333.6854 367.3384 35.8439 0.1943 997 +999 3 334.5353 367.1096 35.138 0.175 998 +1000 3 335.4814 366.835 34.1099 0.2092 999 +1001 3 336.3623 367.1611 33.5208 0.2518 1000 +1002 3 337.1276 367.6816 32.3882 0.2734 1001 +1003 3 337.8712 367.7628 32.2591 0.1427 1002 +1004 3 338.6778 367.6622 33.4734 0.2347 1003 +1005 3 339.4145 367.3247 32.1992 0.3308 1004 +1006 3 339.6307 366.4232 32.4215 0.2011 1005 +1007 3 340.2931 366.5376 32.6239 0.1506 1006 +1008 3 341.3421 366.5422 31.8206 0.2058 1007 +1009 3 342.1075 366.7161 31.92 0.3307 1008 +1010 3 342.9334 367.224 32.7771 0.3351 1009 +1011 3 343.8281 367.748 32.6852 0.1729 1010 +1012 3 344.7364 367.645 34.0544 0.1652 1011 +1013 3 345.7351 367.3384 34.7774 0.4209 1012 +1014 3 346.4455 366.9014 33.9522 0.3178 1013 +1015 3 347.101 366.5639 35.4668 0.3222 1014 +1016 3 347.8835 365.8695 34.7645 0.3305 1015 +1017 3 348.9074 365.6224 34.4946 0.2994 1016 +1018 3 349.6201 365.3192 34.3185 0.2294 1017 +1019 3 350.4175 365.0824 33.0529 0.2258 1018 +1020 3 350.8637 364.3732 32.97 0.178 1019 +1021 3 351.3224 363.4888 32.6749 0.2429 1020 +1022 3 352.2296 363.4694 31.8889 0.2924 1021 +1023 3 353.1391 363.4019 31.1097 0.4057 1022 +1024 3 354.0097 363.1914 31.5011 0.1938 1023 +1025 3 354.9386 363.1056 30.3108 0.1745 1024 +1026 3 355.8355 363.1056 30.6432 0.178 1025 +1027 3 356.5024 363.2932 31.3572 0.2818 1026 +1028 3 357.5057 363.5518 31.0402 0.1804 1027 +1029 3 358.2825 363.5472 31.64 0.2034 1028 +1030 3 359.0044 362.8173 31.5025 0.2579 1029 +1031 3 359.6484 361.9708 31.36 0.1411 1030 +1032 3 360.4366 361.3004 31.8268 0.2161 1031 +1033 3 361.0716 360.9343 32.1446 0.2061 1032 +1034 3 361.8358 360.3394 32.1476 0.1907 1033 +1035 3 362.696 359.9733 31.3158 0.1786 1034 +1036 3 363.5563 359.4826 30.8 0.2948 1035 +1037 3 364.2153 358.8728 30.9005 0.2549 1036 +1038 3 364.761 358.3534 30.0868 0.1652 1037 +1039 3 365.4737 357.7231 30.2728 0.2321 1038 +1040 3 365.9793 356.8422 30.6594 0.1891 1039 +1041 3 366.8716 356.3091 30.6664 0.1875 1040 +1042 3 367.9367 356.3034 29.96 0.2484 1041 +1043 3 368.9995 356.2519 29.4608 0.1271 1042 +1044 3 369.9296 355.7623 29.6708 0.2231 1043 +1045 3 370.9706 355.4271 28.8912 0.2203 1044 +1046 3 371.7897 355.2097 29.1948 0.1144 1045 +1047 3 372.1146 354.5176 29.0657 0.2002 1046 +1048 3 372.9246 353.8346 29.4 0.1144 1047 +1049 3 373.7276 353.2214 29.2788 0.1144 1048 +1050 3 374.2173 352.2662 29.6145 0.178 1049 +1051 3 374.4758 351.3476 29.7707 0.2257 1050 +1052 3 374.8041 350.4667 29.6677 0.1757 1051 +1053 3 375.5535 349.6728 29.3412 0.1374 1052 +1054 3 376.2204 349.0824 28.7042 0.1973 1053 +1055 3 377.1779 348.6283 28.9979 0.1144 1054 +1056 3 377.9948 347.9545 28.56 0.1475 1055 +1057 3 379.0793 347.824 28.3665 0.1995 1056 +1058 3 380.1043 347.9064 28.2044 0.1707 1057 +1059 3 380.8319 347.3802 27.4327 0.1144 1058 +1060 3 381.4885 346.5119 27.9989 0.1144 1059 +1061 3 382.2756 345.7237 28.1588 0.148 1060 +1062 3 383.2537 345.2855 28.1644 0.1144 1061 +1063 3 384.1586 344.8371 28.3847 0.1649 1062 +1064 3 384.8633 344.3486 28.1022 0.1652 1063 +1065 3 385.8609 344.2319 28.5589 0.2288 1064 +1066 3 386.847 344.1152 29.3882 0.1669 1065 +1067 3 387.8595 343.8578 28.84 0.1144 1066 +1068 3 388.7301 343.756 29.8402 0.2288 1067 +1069 3 389.723 343.6622 29.0175 0.1144 1068 +1070 3 390.6783 343.772 29.6909 0.1271 1069 +1071 3 391.693 343.6599 29.2886 0.1893 1070 +1072 3 392.5464 343.0055 28.3965 0.1271 1071 +1073 3 393.3919 342.3855 27.8029 0.2227 1072 +1074 3 394.2327 341.8409 27.4509 0.136 1073 +1075 3 395.3641 341.7082 27.3224 0.1144 1074 +1076 3 396.4807 341.7471 27.5232 0.1144 1075 +1077 3 397.5411 341.9896 27.7264 0.1306 1076 +1078 3 398.5399 342.2711 27.4305 0.2408 1077 +1079 3 399.5786 342.2631 27.0824 0.1652 1078 +1080 3 400.6357 342.3683 26.8537 0.1579 1079 +1081 3 401.4994 342.0457 26.0968 0.1866 1080 +1082 3 402.5233 341.6579 26.1246 0.1144 1081 +1083 3 403.4671 341.2541 26.4256 0.178 1082 +1084 3 404.42 340.809 26.1114 0.1907 1083 +1085 3 405.3089 340.4395 26.7702 0.1837 1084 +1086 3 406.0685 339.7794 26.7064 0.1661 1085 +1087 3 407.073 339.4111 26.88 0.1882 1086 +1088 3 408.0614 339.0519 27.4232 0.1144 1087 +1089 3 409.02 338.9294 26.8265 0.2616 1088 +1090 3 410.0016 339.0233 26.0212 0.157 1089 +1091 3 411.1044 339.1731 25.6119 0.1554 1090 +1092 3 412.2015 338.9672 25.2 0.2803 1091 +1093 3 413.1453 338.6583 24.9427 0.178 1092 +1094 3 414.0628 338.4272 25.4892 0.2029 1093 +1095 3 415.1313 338.4215 25.8672 0.2249 1094 +1096 3 416.0991 338.1664 25.9473 0.215 1095 +1097 3 416.702 338.8848 26.0316 0.2151 1096 +1098 3 417.5165 339.4088 25.5066 0.3141 1097 +1099 3 418.5221 339.5438 26.1649 0.2796 1098 +1100 3 419.5803 339.6124 26.04 0.3072 1099 +1101 3 420.6705 339.4545 25.583 0.339 1100 +1102 3 421.6452 339.9099 25.8838 0.3156 1101 +1103 3 422.6336 339.9533 24.8178 0.3971 1102 +1104 3 423.5088 340.4544 25.2 0.2161 1103 +1105 3 360.9457 361.504 31.36 0.2034 1032 +1106 3 361.8369 361.6905 32.3196 0.1504 1105 +1107 3 362.5748 362.3323 31.374 0.1309 1106 +1108 3 363.5849 362.7521 31.7204 0.1169 1107 +1109 3 364.7061 362.9088 31.92 0.1499 1108 +1110 3 365.7585 363.3458 31.92 0.178 1109 +1111 3 366.8671 363.5987 31.92 0.1467 1110 +1112 3 367.8921 364.0402 31.948 0.1475 1111 +1113 3 368.8553 364.6088 31.8046 0.1877 1112 +1114 3 369.8575 365.1145 31.8534 0.1579 1113 +1115 3 370.7761 365.0847 31.4709 0.1289 1114 +1116 3 371.5197 365.1408 31.843 0.2288 1115 +1117 3 372.4098 365.3879 31.4978 0.2321 1116 +1118 3 373.1877 365.556 32.48 0.2159 1117 +1119 3 374.2207 365.8226 32.9132 0.1421 1118 +1120 3 375.1256 366.1681 31.92 0.1687 1119 +1121 3 376.1792 366.207 32.3148 0.2288 1120 +1122 3 377.0956 366.1944 33.4337 0.1382 1121 +1123 3 377.8792 366.6531 32.76 0.2536 1122 +1124 3 378.7326 367.1199 32.8205 0.2007 1123 +1125 3 379.7325 367.2343 33.551 0.2264 1124 +1126 3 380.6019 367.1611 33.4841 0.1197 1125 +1127 3 381.7162 366.9952 33.4622 0.1428 1126 +1128 3 382.8385 367.0078 33.6888 0.1399 1127 +1129 3 383.8715 367.2148 34.3179 0.1818 1128 +1130 3 384.9194 367.383 34.2345 0.1759 1129 +1131 3 385.8529 367.6816 35.0 0.1144 1130 +1132 3 386.9923 367.7399 35.0 0.1144 1131 +1133 3 387.9922 368.1392 35.2248 0.1144 1132 +1134 3 389.119 368.1392 34.9247 0.1144 1133 +1135 3 390.1852 368.2456 34.9238 0.1595 1134 +1136 3 391.2606 368.5579 35.453 0.2262 1135 +1137 3 392.3028 368.9732 35.3298 0.2005 1136 +1138 3 393.2889 369.2603 35.9719 0.2288 1137 +1139 3 394.0428 369.8895 36.7556 0.154 1138 +1140 3 394.9237 370.4764 36.1953 0.2071 1139 +1141 3 394.9305 371.1502 37.6628 0.1954 1140 +1142 3 395.0232 371.4934 36.36 0.1502 1141 +1143 3 394.7441 371.5334 34.4089 0.178 1142 +1144 3 395.3286 372.0963 33.88 0.2224 1143 +1145 3 396.1672 372.5505 33.1643 0.2288 1144 +1146 3 396.2816 373.1728 34.72 0.2161 1145 +1147 3 396.5916 372.9486 33.2268 0.1915 1145 +1148 3 397.3272 373.7151 33.1453 0.2709 1147 +1149 3 397.6944 374.5925 32.8703 0.1193 1148 +1150 3 398.3831 375.3567 32.76 0.1144 1149 +1151 3 399.3166 375.9985 32.7578 0.1144 1150 +1152 3 400.1094 376.6448 32.76 0.1144 1151 +1153 3 400.9606 377.3839 32.76 0.1144 1152 +1154 3 401.6641 378.2544 32.76 0.1334 1153 +1155 3 402.3345 379.1422 32.76 0.1469 1154 +1156 3 403.284 379.5609 33.2833 0.1244 1155 +1157 3 404.2942 380.0402 32.9918 0.2815 1156 +1158 3 405.3078 380.3445 33.0333 0.1448 1157 +1159 3 406.422 380.4063 32.6018 0.1144 1158 +1160 3 407.4802 380.7495 32.1376 0.1144 1159 +1161 3 408.4343 381.3158 31.64 0.156 1160 +1162 3 409.3163 382.0171 31.2348 0.216 1161 +1163 3 410.2075 382.7229 31.08 0.1336 1162 +1164 3 410.7818 383.6736 31.08 0.1144 1163 +1165 3 411.7382 384.201 31.1044 0.1169 1164 +1166 3 412.2496 384.7569 32.608 0.274 1165 +1167 3 413.2677 384.3977 32.226 0.1806 1166 +1168 3 414.0868 384.6128 32.1314 0.1924 1167 +1169 3 414.9929 385.0361 31.92 0.2288 1168 +1170 3 415.9607 385.5383 31.7419 0.2027 1169 +1171 3 416.6139 386.1103 31.309 0.1987 1170 +1172 3 417.4456 386.4832 32.4512 0.1793 1171 +1173 3 418.0359 386.958 31.4381 0.2283 1172 +1174 3 418.1469 387.9727 32.0832 0.3284 1173 +1175 3 419.0392 388.1592 32.8843 0.143 1174 +1176 3 419.6856 388.6168 33.6 0.1673 1175 +1177 3 420.7152 388.8044 34.4226 0.1342 1176 +1178 3 421.826 388.6248 34.72 0.1144 1177 +1179 3 422.6886 388.6168 33.3572 0.286 1178 +1180 3 423.614 388.968 33.88 0.2457 1179 +1181 3 424.4766 389.4485 33.8828 0.1628 1180 +1182 3 425.5268 389.6144 34.5685 0.2336 1181 +1183 3 426.6354 389.659 34.7354 0.3305 1182 +1184 3 427.1765 390.3351 34.694 0.4237 1183 +1185 3 427.8125 390.9689 34.9034 0.2349 1184 +1186 3 427.9933 391.9436 34.1468 0.1232 1185 +1187 3 428.5081 392.8759 34.7071 0.2105 1186 +1188 3 429.1865 393.6801 34.16 0.2678 1187 +1189 3 429.9404 394.426 34.16 0.1907 1188 +1190 3 430.5764 395.2394 33.833 0.1885 1189 +1191 3 431.1667 395.9762 33.4718 0.1941 1190 +1192 3 431.9733 396.5047 34.2622 0.2078 1191 +1193 3 432.6597 397.1808 34.72 0.115 1192 +1194 3 433.3712 397.7208 33.922 0.1566 1193 +1195 3 434.2018 398.2458 33.6748 0.2355 1194 +1196 3 434.6868 398.5673 33.6417 0.2075 1195 +1197 3 435.5837 398.4552 33.796 0.249 1196 +1198 3 436.6785 398.557 33.88 0.2418 1197 +1199 3 437.4713 398.716 33.2741 0.3112 1198 +1200 3 438.2115 398.7401 33.4642 0.1845 1199 +1201 3 439.026 398.6142 33.6924 0.2507 1200 +1202 3 439.9824 398.9128 32.76 0.1907 1201 +1203 3 394.132 370.9992 33.8898 0.2025 1143 +1204 3 393.2946 370.3071 33.4527 0.1679 1203 +1205 3 392.1941 370.0954 33.8008 0.1914 1204 +1206 3 391.0878 369.9696 33.9741 0.2203 1205 +1207 3 390.1406 370.362 34.3882 0.2174 1206 +1208 3 389.1945 370.9054 34.72 0.1649 1207 +1209 3 388.3663 371.6753 34.72 0.1873 1208 +1210 3 387.355 371.8904 35.4945 0.2288 1209 +1211 3 386.251 371.9144 35.2262 0.2288 1210 +1212 3 385.2042 372.0654 35.1434 0.2064 1211 +1213 3 384.0797 372.2507 35.0 0.2281 1212 +1214 3 382.9734 372.4864 35.373 0.1907 1213 +1215 3 381.9004 372.547 34.7393 0.2691 1214 +1216 3 380.9806 372.769 35.5846 0.2596 1215 +1217 3 380.1512 373.0206 36.0769 0.1588 1216 +1218 3 379.363 373.3341 36.8822 0.178 1217 +1219 3 378.4386 372.944 36.4 0.2543 1218 +1220 3 377.6344 373.381 35.4897 0.1287 1219 +1221 3 377.0407 374.0091 36.3947 0.2714 1220 +1222 3 376.3325 374.7252 37.2814 0.2796 1221 +1223 3 375.2995 374.954 37.5794 0.1749 1222 +1224 3 374.3969 375.4608 38.08 0.1144 1223 +1225 3 373.8329 375.9092 38.2687 0.1719 1224 +1226 3 373.6784 376.8233 37.6214 0.193 1225 +1227 3 372.8845 377.6264 37.8 0.2144 1226 +1228 3 372.07 377.9776 38.3062 0.3046 1227 +1229 3 371.2131 377.8632 39.3232 0.1144 1228 +1230 3 370.3151 377.3781 38.92 0.1846 1229 +1231 3 369.4491 377.0109 39.6841 0.1733 1230 +1232 3 368.3348 377.0624 39.76 0.2743 1231 +1233 3 367.3029 377.1768 39.3705 0.1907 1232 +1234 3 366.4209 376.8553 39.7869 0.1788 1233 +1235 3 365.5995 377.0841 41.1348 0.1374 1234 +1236 3 364.7038 377.6127 40.5958 0.1343 1235 +1237 3 364.0586 378.3185 40.0674 0.3033 1236 +1238 3 363.3344 378.537 39.44 0.3527 1237 +1239 3 362.7521 379.3069 40.2749 0.1455 1238 +1240 3 361.6195 379.3161 40.32 0.1499 1239 +1241 3 360.5247 379.2715 40.8702 0.2168 1240 +1242 3 360.1781 379.6135 39.503 0.2542 1241 +1243 3 359.7811 379.2921 37.5351 0.1652 1242 +1244 3 359.3178 379.3504 40.0089 0.2288 1243 +1245 3 359.1828 380.0013 40.04 0.2585 1244 +1246 3 358.5239 380.8422 39.949 0.2069 1245 +1247 3 358.0217 381.0389 37.8619 0.2143 1246 +1248 3 357.5927 381.484 39.968 0.2759 1247 +1249 3 356.8616 381.5537 41.3596 0.3305 1248 +1250 3 355.9293 382.048 41.1018 0.2415 1249 +1251 3 355.6639 382.3648 40.2892 0.2106 1250 +1252 3 354.9798 382.533 40.5706 0.3017 1251 +1253 3 354.0554 382.7298 40.6 0.274 1252 +1254 3 353.5658 383.4974 41.1533 0.2288 1253 +1255 3 353.0887 384.3966 40.9732 0.3051 1254 +1256 3 352.2468 385.1265 41.44 0.2288 1255 +1257 3 351.6988 385.9307 40.5871 0.3141 1256 +1258 3 351.4814 386.9065 39.76 0.3065 1257 +1259 3 350.6509 387.4511 40.0075 0.2613 1258 +1260 3 349.7666 387.784 39.7818 0.2746 1259 +1261 3 349.0744 388.4589 39.6984 0.4533 1260 +1262 3 348.2084 388.96 40.0128 0.2987 1261 +1263 3 347.6204 389.6372 39.76 0.2577 1262 +1264 3 346.5233 389.7059 40.0711 0.2288 1263 +1265 3 345.6253 389.993 40.6137 0.2288 1264 +1266 3 344.9503 390.5616 39.76 0.2415 1265 +1267 3 344.4916 390.3328 38.08 0.37 1266 +1268 3 343.5512 390.5319 37.9854 0.1907 1267 +1269 3 343.0273 391.1222 38.722 0.2019 1268 +1270 3 342.0583 391.5912 38.36 0.2664 1269 +1271 3 341.2666 391.4768 38.7943 0.2454 1270 +1272 3 340.5093 391.8966 39.6838 0.4021 1271 +1273 3 339.9213 392.2776 39.3649 0.2433 1272 +1274 3 338.9054 392.5293 40.0218 0.2702 1273 +1275 3 338.195 393.2637 40.4678 0.2825 1274 +1276 3 337.5155 393.9925 39.7645 0.2204 1275 +1277 3 337.2924 394.4844 37.5225 0.2278 1276 +1278 3 336.5351 395.1296 37.7451 0.259 1277 +1279 3 335.8326 395.8023 37.2537 0.3665 1278 +1280 3 334.8751 396.0917 37.7474 0.2337 1279 +1281 3 334.2745 396.7975 38.36 0.4065 1280 +1282 3 333.476 397.3112 37.6709 0.2161 1281 +1283 3 332.5379 397.0183 37.0154 0.2988 1282 +1284 3 331.7314 396.7392 35.84 0.232 1283 +1285 3 330.8608 397.1922 35.434 0.3559 1284 +1286 3 330.0898 397.0492 35.5359 0.3281 1285 +1287 3 329.2958 396.8639 36.2076 0.3536 1286 +1288 3 328.5259 397.1842 37.6566 0.3402 1287 +1289 3 327.6187 396.833 36.9667 0.2134 1288 +1290 3 327.1337 396.6328 35.5225 0.2619 1289 +1291 3 326.2173 396.523 34.2513 0.1913 1290 +1292 3 325.5355 396.968 34.9423 0.3365 1291 +1293 3 324.4636 397.1968 35.2884 0.3051 1292 +1294 3 323.6365 396.968 35.5902 0.2592 1293 +1295 3 322.656 396.7392 35.0154 0.1717 1294 +1296 3 321.7271 397.1968 35.2876 0.2858 1295 +1297 3 320.7879 396.8593 36.12 0.3522 1296 +1298 3 319.748 396.5104 35.84 0.2415 1297 +1299 3 318.8362 396.5504 36.9866 0.2505 1298 +1300 3 318.7207 395.9384 36.1304 0.2288 1299 +1301 3 317.9782 395.2566 35.8204 0.1753 1300 +1302 3 317.174 394.6811 35.7185 0.1697 1301 +1303 3 316.2416 394.2316 36.6596 0.1907 1302 +1304 3 315.2864 393.8792 35.84 0.2415 1303 +1305 3 319.9871 397.2597 36.0366 0.3413 1298 +1306 3 320.471 397.9987 35.2884 0.2277 1305 +1307 3 321.4262 397.9084 36.2471 0.212 1306 +1308 3 321.4423 398.5204 38.3443 0.1724 1307 +1309 3 321.6356 399.4596 38.5795 0.1209 1308 +1310 3 322.0623 400.0248 37.24 0.1983 1309 +1311 3 322.5256 400.9331 36.9874 0.2146 1310 +1312 3 322.7727 401.997 36.9496 0.1566 1311 +1313 3 323.1789 402.6788 35.3444 0.1285 1312 +1314 3 323.6033 403.26 33.8366 0.1271 1313 +1315 3 323.8675 404.1763 33.8803 0.1272 1314 +1316 3 324.6649 404.5733 34.5604 0.1206 1315 +1317 3 325.2392 404.9028 35.331 0.2477 1316 +1318 3 325.2552 406.0296 35.6014 0.2155 1317 +1319 3 325.2564 407.153 35.84 0.1928 1318 +1320 3 325.4348 408.1437 36.6506 0.1907 1319 +1321 3 325.4714 409.147 35.6468 0.1907 1320 +1322 3 325.7357 409.8769 37.1683 0.1359 1321 +1323 3 325.6968 410.8882 36.8656 0.2764 1322 +1324 3 325.8101 411.8983 35.8918 0.1894 1323 +1325 3 325.6831 413.0103 36.0612 0.3272 1324 +1326 3 325.6888 414.0902 36.251 0.4226 1325 +1327 3 325.357 415.0432 36.3311 0.3079 1326 +1328 3 325.6087 415.9595 37.6037 0.3432 1327 +1329 3 325.8043 416.8633 37.3937 0.2569 1328 +1330 3 326.0434 417.7122 37.8328 0.1174 1329 +1331 3 326.2997 418.7772 37.2907 0.1711 1330 +1332 3 326.5765 419.8526 36.6489 0.2691 1331 +1333 3 326.9563 420.666 37.4965 0.2921 1332 +1334 3 327.1211 421.5045 38.5434 0.2702 1333 +1335 3 326.7264 422.3373 37.5738 0.2895 1334 +1336 3 326.7264 423.4104 38.1671 0.3133 1335 +1337 3 326.4404 424.44 38.4423 0.3006 1336 +1338 3 326.3706 425.4158 38.7649 0.2542 1337 +1339 3 326.2791 426.4203 39.2269 0.2779 1338 +1340 3 326.4072 426.887 41.2261 0.2455 1339 +1341 3 326.6017 427.681 40.0582 0.3077 1340 +1342 3 326.6109 428.531 39.8115 0.2185 1341 +1343 3 326.6909 429.0103 40.4762 0.1832 1342 +1344 3 327.1806 429.8191 40.2114 0.1897 1343 +1345 3 327.629 430.7389 40.88 0.3048 1344 +1346 3 327.645 431.8806 40.9004 0.276 1345 +1347 3 327.756 432.758 42.0 0.1368 1346 +1348 3 327.4242 433.6904 41.7236 0.3432 1347 +1349 3 327.0296 434.3207 41.8681 0.2595 1348 +1350 3 327.0696 435.149 40.6 0.3082 1349 +1351 3 327.1771 436.0848 41.8146 0.1703 1350 +1352 3 326.8454 436.6614 42.8425 0.19 1351 +1353 3 326.5731 437.6029 43.4308 0.3303 1352 +1354 3 326.8957 438.5089 44.7199 0.1598 1353 +1355 3 327.192 439.4573 43.692 0.2063 1354 +1356 3 327.5295 440.5407 43.8869 0.3079 1355 +1357 3 328.2616 441.282 44.4058 0.2218 1356 +1358 3 328.749 442.2475 44.3265 0.1771 1357 +1359 3 328.8783 442.9568 43.5341 0.1216 1358 +1360 3 328.9458 444.0001 43.3107 0.1616 1359 +1361 3 329.7511 444.595 42.574 0.1144 1360 +1362 3 330.0772 445.6772 42.56 0.1144 1361 +1363 3 330.3758 446.7526 42.7403 0.217 1362 +1364 3 330.4055 447.1793 44.6519 0.1592 1363 +1365 3 330.7327 447.741 46.5478 0.178 1364 +1366 3 330.9569 448.6059 45.9763 0.2391 1365 +1367 3 331.1571 449.6103 45.92 0.1271 1366 +1368 3 331.3722 450.6136 46.879 0.2415 1367 +1369 3 331.4671 451.7393 47.2268 0.1965 1368 +1370 3 331.6822 452.841 47.4578 0.1586 1369 +1371 3 331.76 453.5262 47.6854 0.2073 1370 +1372 3 332.1032 454.0914 48.4089 0.3432 1371 +1373 3 332.4613 454.8636 47.88 0.3202 1372 +1374 3 332.904 455.5408 46.76 0.1907 1373 +1375 3 359.4448 378.6503 40.8708 0.1767 1244 +1376 3 359.4917 377.5406 40.3816 0.1612 1375 +1377 3 360.1918 376.7535 40.3472 0.2128 1376 +1378 3 361.2546 376.9411 40.2298 0.2358 1377 +1379 3 361.9044 376.2627 41.1191 0.2614 1378 +1380 3 362.4467 375.9642 41.515 0.2464 1379 +1381 3 363.1056 375.3796 42.1775 0.1612 1380 +1382 3 363.5632 374.485 42.2528 0.2796 1381 +1383 3 364.1832 373.7906 42.0 0.1608 1382 +1384 3 365.2426 373.4153 41.7004 0.1679 1383 +1385 3 366.1566 373.0435 42.5138 0.2146 1384 +1386 3 367.1862 372.8754 43.1015 0.249 1385 +1387 3 368.0488 372.4155 42.5309 0.2232 1386 +1388 3 368.5648 371.8675 41.9955 0.1875 1387 +1389 3 368.9114 370.9557 41.9356 0.2334 1388 +1390 3 369.695 370.966 42.2554 0.3255 1389 +1391 3 370.3025 370.1046 42.84 0.2819 1390 +1392 3 371.2715 369.6539 43.2916 0.2079 1391 +1393 3 372.3537 369.4045 43.4361 0.1677 1392 +1394 3 373.4851 369.4319 43.2706 0.2232 1393 +1395 3 374.2321 369.3976 43.7108 0.3407 1394 +1396 3 375.1336 369.1688 44.3694 0.3432 1395 +1397 3 376.0179 368.6826 44.8 0.2607 1396 +1398 3 376.376 367.8726 43.7732 0.1525 1397 +1399 3 375.9184 367.6816 43.68 0.1525 1398 +1400 3 377.1173 367.1565 44.8291 0.2423 1398 +1401 3 378.0096 366.8064 45.0825 0.1522 1400 +1402 3 378.6846 366.0949 45.1637 0.1618 1401 +1403 3 379.1685 365.3375 45.9732 0.2034 1402 +1404 3 380.0196 364.793 46.6575 0.2447 1403 +1405 3 380.6088 364.2416 47.6966 0.2091 1404 +1406 3 380.936 363.3161 47.1383 0.214 1405 +1407 3 381.4668 362.402 47.3833 0.1173 1406 +1408 3 382.2161 361.5543 47.32 0.1144 1407 +1409 3 382.9368 360.8176 47.32 0.1144 1408 +1410 3 383.9493 360.4927 47.3088 0.119 1409 +1411 3 384.7306 359.7869 47.0977 0.1446 1410 +1412 3 385.4914 359.0524 47.6 0.153 1411 +1413 3 385.8106 357.9954 47.8464 0.2034 1412 +1414 3 386.3917 357.031 47.5714 0.1292 1413 +1415 3 387.435 356.92 47.2458 0.1407 1414 +1416 3 388.5196 356.7564 47.8979 0.1375 1415 +1417 3 389.4027 356.0963 47.978 0.1217 1416 +1418 3 390.0605 355.1605 47.978 0.1144 1417 +1419 3 390.7057 354.2202 48.1034 0.1144 1418 +1420 3 391.375 353.3107 48.5416 0.1144 1419 +1421 3 392.0442 352.4 48.9796 0.1144 1420 +1422 3 392.7135 351.4894 49.4178 0.1144 1421 +1423 3 393.3827 350.5799 49.856 0.1144 1422 +1424 3 393.8918 349.5686 50.0055 0.1144 1423 +1425 3 394.3162 348.507 50.0055 0.1144 1424 +1426 3 308.8262 367.7846 31.4258 0.344 773 +1427 3 308.6134 367.0066 33.3189 0.2659 1426 +1428 3 308.2771 365.9793 33.3928 0.1979 1427 +1429 3 307.5587 365.1351 33.9052 0.1555 1428 +1430 3 307.5015 364.1112 35.028 0.1647 1429 +1431 3 307.7063 362.9958 35.3438 0.1652 1430 +1432 3 307.5209 361.901 36.0018 0.1907 1431 +1433 3 306.7819 362.076 36.2443 0.3024 1432 +1434 3 305.6722 362.3242 36.54 0.3998 1433 +1435 3 304.5923 362.2876 37.0306 0.3947 1434 +1436 3 303.5604 361.8735 37.613 0.344 1435 +1437 3 302.5445 361.536 38.4048 0.2859 1436 +1438 3 301.6888 361.0247 39.4593 0.2601 1437 +1439 3 300.9956 360.1747 40.2433 0.2542 1438 +1440 3 300.0952 359.6919 41.1124 0.2542 1439 +1441 3 299.2052 359.1279 41.8561 0.2463 1440 +1442 3 298.5771 358.215 42.4536 0.2497 1441 +1443 3 297.8004 357.4256 42.905 0.2373 1442 +1444 3 296.9698 356.6614 42.7372 0.2462 1443 +1445 3 296.1747 355.8664 42.2282 0.263 1444 +1446 3 295.5066 354.9569 42.2663 0.3212 1445 +1447 3 295.0193 353.9593 42.875 0.3524 1446 +1448 3 294.3832 353.0338 43.2312 0.3466 1447 +1449 3 293.4852 352.5762 44.2467 0.2927 1448 +1450 3 292.4567 352.5167 45.4297 0.2567 1449 +1451 3 291.7131 351.7663 46.3053 0.29 1450 +1452 3 290.9032 351.1988 47.696 0.3305 1451 +1453 3 289.861 351.2721 48.3708 0.306 1452 +1454 3 288.8497 351.7606 48.8673 0.3297 1453 +1455 3 287.8819 352.3383 49.3408 0.2924 1454 +1456 3 286.7733 352.4675 48.7295 0.2791 1455 +1457 3 285.6316 352.4801 48.5968 0.2289 1456 +1458 3 284.6569 352.654 49.8602 0.2428 1457 +1459 3 284.0792 353.2535 51.3724 0.2641 1458 +1460 3 283.1343 352.7993 51.1025 0.3226 1459 +1461 3 282.6858 352.3932 51.2627 0.3432 1460 +1462 3 282.3953 351.5112 51.8311 0.2684 1461 +1463 3 282.0818 350.7207 53.4391 0.1967 1462 +1464 3 281.0991 350.3569 52.9659 0.2988 1463 +1465 3 279.9677 350.4049 52.9491 0.2685 1464 +1466 3 279.0056 350.4335 52.08 0.2757 1465 +1467 3 278.0721 350.2493 52.7481 0.1453 1466 +1468 3 277.1397 350.4484 52.1564 0.1769 1467 +1469 3 276.1696 350.6829 51.5343 0.1329 1468 +1470 3 275.5965 351.1073 52.92 0.1549 1469 +1471 3 274.7922 351.5867 53.6547 0.1144 1470 +1472 3 273.7958 351.2881 53.333 0.3505 1471 +1473 3 272.7319 350.9414 53.1544 0.3499 1472 +1474 3 271.9929 350.2928 53.636 0.2415 1473 +1475 3 270.9141 350.1601 54.1618 0.2102 1474 +1476 3 270.1213 349.468 54.0184 0.1917 1475 +1477 3 269.3674 348.92 53.1742 0.3327 1476 +1478 3 268.7164 348.8697 51.9848 0.3432 1477 +1479 3 267.7692 348.5676 52.9592 0.2129 1478 +1480 3 266.7808 348.3663 53.8432 0.1763 1479 +1481 3 266.5051 347.4362 54.8932 0.1217 1480 +1482 3 266.2191 346.8322 54.2982 0.1535 1481 +1483 3 265.686 345.8987 53.6281 0.277 1482 +1484 3 265.3016 344.8954 53.8294 0.2388 1483 +1485 3 264.685 344.447 55.1692 0.1209 1484 +1486 3 264.566 343.6118 56.28 0.1301 1485 +1487 3 263.5193 343.653 56.2257 0.1751 1486 +1488 3 262.8935 343.3933 54.654 0.1918 1487 +1489 3 261.9051 342.9266 54.5208 0.2142 1488 +1490 3 261.1191 342.9712 54.4513 0.3135 1489 +1491 3 260.2417 342.5628 54.0876 0.2982 1490 +1492 3 259.164 342.2242 53.8779 0.2081 1491 +1493 3 258.1287 341.8055 53.6679 0.1238 1492 +1494 3 257.0065 341.7128 53.76 0.1144 1493 +1495 3 256.0409 341.5698 54.4544 0.148 1494 +1496 3 255.533 340.817 55.2919 0.1854 1495 +1497 3 255.0354 339.9716 54.5689 0.2415 1496 +1498 3 254.7928 339.6959 55.4229 0.1144 1497 +1499 3 253.7918 339.3356 56.0 0.1144 1498 +1500 3 252.7817 338.9718 56.0 0.1144 1499 +1501 3 251.9477 338.5096 55.347 0.1525 1500 +1502 3 251.0851 337.9376 55.0889 0.1144 1501 +1503 3 250.1608 337.3885 54.6378 0.1195 1502 +1504 3 249.1609 337.0224 55.4408 0.1268 1503 +1505 3 248.82 336.1701 55.72 0.1144 1504 +1506 3 248.5935 335.1359 55.72 0.1144 1505 +1507 3 247.6474 334.5765 55.72 0.1144 1506 +1508 3 246.5412 334.3912 55.72 0.1144 1507 +1509 3 245.4052 334.3363 55.72 0.1144 1508 +1510 3 244.4648 333.7448 55.72 0.1144 1509 +1511 3 243.5782 333.0424 55.6349 0.1341 1510 +1512 3 242.7202 332.3389 55.592 0.2161 1511 +1513 3 242.1493 331.5632 54.6 0.1775 1512 +1514 3 241.1975 331.1834 55.3101 0.1144 1513 +1515 3 240.2526 330.7178 55.44 0.1144 1514 +1516 3 239.7035 329.9239 55.44 0.1144 1515 +1517 3 238.6098 329.7305 55.44 0.1144 1516 +1518 3 237.6557 329.1894 55.44 0.1144 1517 +1519 3 236.7668 328.479 55.44 0.1144 1518 +1520 3 235.7658 327.9974 55.16 0.1525 1519 +1521 3 235.4352 328.5568 55.16 0.1144 1520 +1522 3 234.8609 327.6027 55.4764 0.1612 1520 +1523 3 233.821 327.1497 55.8398 0.1713 1522 +1524 3 232.7743 326.7047 56.0871 0.1722 1523 +1525 3 231.7126 326.2802 56.0871 0.1538 1524 +1526 3 230.6315 325.9794 56.0871 0.1328 1525 +1527 3 229.5367 325.8478 56.0871 0.1144 1526 +1528 3 228.514 325.3364 56.0871 0.1144 1527 +1529 3 227.5141 324.7805 56.0871 0.1144 1528 +1530 3 226.5314 324.1959 56.0871 0.1144 1529 +1531 3 225.5739 323.5701 56.0871 0.1144 1530 +1532 3 224.6152 322.9455 56.0871 0.1144 1531 +1533 3 290.3278 351.1165 47.679 0.2708 1452 +1534 3 289.4446 351.3213 48.44 0.4465 1533 +1535 3 288.8692 350.8808 48.9726 0.3231 1534 +1536 3 288.9378 349.8627 49.6104 0.1838 1535 +1537 3 288.5168 348.8182 49.84 0.1158 1536 +1538 3 288.0615 348.2233 50.6125 0.2119 1537 +1539 3 287.5124 347.8069 52.6414 0.3371 1538 +1540 3 287.4666 346.8814 54.061 0.2598 1539 +1541 3 287.0342 346.2533 55.2619 0.2531 1540 +1542 3 286.7402 345.2592 55.1911 0.3012 1541 +1543 3 286.3981 344.5934 56.4668 0.3432 1542 +1544 3 286.8008 344.3703 58.2319 0.3305 1543 +1545 3 287.1383 343.772 56.8837 0.2669 1544 +1546 3 287.9448 343.7068 58.1101 0.1539 1545 +1547 3 288.3841 343.963 59.8041 0.1144 1546 +1548 3 288.852 342.938 59.92 0.2255 1547 +1549 3 289.4228 342.239 61.0697 0.178 1548 +1550 3 290.0132 341.5412 61.0467 0.218 1549 +1551 3 290.2191 340.4636 60.7583 0.2682 1550 +1552 3 289.6608 339.7794 61.2724 0.1457 1551 +1553 3 289.1117 338.8459 61.2363 0.1701 1552 +1554 3 288.4676 338.0875 61.0095 0.15 1553 +1555 3 288.0272 337.2821 62.0203 0.3305 1554 +1556 3 288.3658 336.9663 63.5295 0.1396 1555 +1557 3 288.6667 336.0328 63.8448 0.19 1556 +1558 3 288.9744 335.2858 62.4943 0.2224 1557 +1559 3 289.4423 334.5525 63.56 0.1329 1558 +1560 3 289.5487 333.6098 63.4805 0.2288 1559 +1561 3 289.6528 332.5837 64.0836 0.2262 1560 +1562 3 290.3804 332.1032 65.2215 0.1144 1561 +1563 3 291.4477 331.863 65.5102 0.1412 1562 +1564 3 292.1479 331.0919 65.52 0.1457 1563 +1565 3 293.2896 331.045 65.52 0.1144 1564 +1566 3 294.2894 330.5691 65.52 0.1195 1565 +1567 3 295.1028 329.8632 65.4682 0.2259 1566 +1568 3 295.4975 329.1288 65.5682 0.1247 1567 +1569 3 295.621 328.7078 67.7009 0.1144 1568 +1570 3 296.4264 328.3543 66.901 0.1905 1569 +1571 3 297.0739 327.5981 66.64 0.2635 1570 +1572 3 297.4446 326.5994 67.2532 0.1256 1571 +1573 3 298.1527 325.8638 67.76 0.1144 1572 +1574 3 298.9135 325.1191 67.0289 0.1957 1573 +1575 3 299.156 324.205 67.4909 0.3051 1574 +1576 3 299.4786 323.2441 68.3516 0.3178 1575 +1577 3 299.728 322.2671 68.5404 0.1988 1576 +1578 3 300.0346 321.2238 68.3284 0.178 1577 +1579 3 299.9568 320.2342 69.3118 0.326 1578 +1580 3 299.8516 319.4025 67.8031 0.2669 1579 +1581 3 300.332 319.3625 66.0887 0.2341 1580 +1582 3 300.0712 319.9768 64.1455 0.1147 1581 +1583 3 300.0712 319.9768 61.3455 0.1144 1582 +1584 3 300.5265 319.8372 59.1923 0.1854 1583 +1585 3 300.7496 318.7344 59.08 0.2262 1584 +1586 3 300.2165 318.3489 57.801 0.2102 1585 +1587 3 300.5059 317.6213 56.56 0.2163 1586 +1588 3 300.5288 316.7519 56.3066 0.1144 1587 +1589 3 300.7954 316.2908 58.0303 0.3378 1588 +1590 3 300.5265 315.5186 59.4642 0.2684 1589 +1591 3 300.5803 314.4273 59.619 0.2201 1590 +1592 3 300.3 313.4823 58.8 0.3589 1591 +1593 3 300.872 312.6552 59.36 0.2415 1592 +1594 3 307.5392 361.6859 36.8749 0.278 1432 +1595 3 307.6594 360.7101 37.3873 0.2759 1594 +1596 3 307.6216 359.7079 36.5616 0.2277 1595 +1597 3 307.5072 358.7939 36.2776 0.2034 1596 +1598 3 307.9511 358.0342 35.0669 0.1342 1597 +1599 3 308.4224 357.1316 35.2184 0.1144 1598 +1600 3 308.2645 356.5882 37.3752 0.2288 1599 +1601 3 308.6089 355.7005 37.8725 0.3276 1600 +1602 3 308.427 354.7544 38.5445 0.2064 1601 +1603 3 308.1982 354.3014 40.2822 0.1681 1602 +1604 3 308.4144 353.2031 40.32 0.1144 1603 +1605 3 308.1833 352.352 39.5142 0.3432 1604 +1606 3 307.998 351.4665 39.6662 0.22 1605 +1607 3 307.4111 351.1279 41.1289 0.1463 1606 +1608 3 307.617 350.5308 39.4271 0.1731 1607 +1609 3 306.9043 350.1635 38.3037 0.1423 1608 +1610 3 306.4776 349.2312 38.1595 0.1488 1609 +1611 3 306.9112 348.9944 40.159 0.2481 1610 +1612 3 306.4696 348.4773 40.3231 0.2918 1611 +1613 3 305.8644 348.1352 40.7154 0.1411 1612 +1614 3 306.0394 347.5872 42.56 0.1205 1613 +1615 3 305.7912 346.8619 41.2264 0.2934 1614 +1616 3 305.8656 345.9113 40.3262 0.1279 1615 +1617 3 305.5532 345.1036 41.2087 0.126 1616 +1618 3 305.4125 344.1141 42.5216 0.1194 1617 +1619 3 305.2261 343.1165 42.9176 0.2288 1618 +1620 3 305.1197 342.1933 42.0095 0.1907 1619 +1621 3 305.2958 341.2644 43.1805 0.2871 1620 +1622 3 305.5418 340.221 42.9741 0.3178 1621 +1623 3 305.2524 339.2646 43.2849 0.1691 1622 +1624 3 305.0579 338.1607 43.12 0.2235 1623 +1625 3 305.0407 337.3278 42.7781 0.2287 1624 +1626 3 304.5236 336.4241 42.1725 0.1144 1625 +1627 3 303.9768 335.8212 43.12 0.3 1626 +1628 3 303.629 335.2618 43.68 0.1816 1627 +1629 3 303.4586 334.5228 43.0181 0.2392 1628 +1630 3 303.3144 333.8055 43.0004 0.2295 1629 +1631 3 303.732 333.1328 42.5919 0.2527 1630 +1632 3 303.7549 332.2496 42.3956 0.2529 1631 +1633 3 303.9128 331.2921 42.2422 0.2899 1632 +1634 3 304.1518 330.616 42.9332 0.2796 1633 +1635 3 303.6176 330.8448 43.4 0.1271 1634 +1636 3 304.0752 329.3656 42.9649 0.1971 1634 +1637 3 303.9379 328.4813 43.7172 0.2211 1636 +1638 3 304.0237 327.4826 43.7984 0.2288 1637 +1639 3 303.7366 326.5834 44.0798 0.2152 1638 +1640 3 303.263 326.2871 45.64 0.1391 1639 +1641 3 303.2103 325.5183 44.0255 0.2034 1640 +1642 3 303.168 324.5494 44.4763 0.2535 1641 +1643 3 303.7446 323.9934 45.6145 0.171 1642 +1644 3 304.2891 323.0736 45.472 0.1144 1643 +1645 3 304.4756 322.2202 45.36 0.1922 1644 +1646 3 303.9516 321.4102 44.5449 0.1594 1645 +1647 3 303.7583 321.035 46.7432 0.1144 1646 +1648 3 302.7836 320.6884 46.9501 0.1271 1647 +1649 3 301.7483 320.2502 46.9535 0.1866 1648 +1650 3 301.0242 319.9699 47.9032 0.2034 1649 +1651 3 300.3721 319.2355 48.314 0.414 1650 +1652 3 300.0769 318.2345 48.0668 0.3417 1651 +1653 3 300.1284 317.1614 48.44 0.3773 1652 +1654 3 300.1387 316.1215 47.8092 0.2415 1653 +1655 3 300.7576 315.5278 48.7463 0.3264 1654 +1656 3 301.3113 314.9123 50.029 0.3082 1655 +1657 3 301.9016 314.8288 50.68 0.2161 1656 +1658 4 299.8081 376.1609 30.4601 0.3051 1 +1659 4 299.3013 375.1451 30.7992 0.3564 1658 +1660 4 298.8506 374.0937 30.7941 0.4198 1659 +1661 4 298.0509 373.2769 30.7602 0.4587 1660 +1662 4 297.2352 372.4795 30.5836 0.4971 1661 +1663 4 296.5694 371.6067 29.8116 0.5346 1662 +1664 4 295.8361 370.7304 29.6834 0.5439 1663 +1665 4 295.0902 369.8655 29.6951 0.4923 1664 +1666 4 294.5285 368.8702 29.7615 0.43 1665 +1667 4 294.0446 367.8429 30.109 0.3964 1666 +1668 4 293.6465 366.8076 30.7479 0.434 1667 +1669 4 293.5138 365.6727 30.8496 0.4585 1668 +1670 4 293.3433 364.5493 31.1094 0.4703 1669 +1671 4 293.1065 363.4968 32.027 0.4692 1670 +1672 4 293.0836 362.4203 32.928 0.453 1671 +1673 4 293.0436 361.2775 33.0453 0.4068 1672 +1674 4 292.7954 360.2307 33.073 0.3705 1673 +1675 4 292.6398 359.1005 33.2525 0.3928 1674 +1676 4 292.6226 357.9999 34.0102 0.4062 1675 +1677 4 292.5528 356.8628 34.1984 0.4312 1676 +1678 4 292.2382 355.7668 34.4064 0.4322 1677 +1679 4 292.0746 354.6789 35.1644 0.4198 1678 +1680 4 291.609 353.6379 35.2895 0.3568 1679 +1681 4 291.1148 352.606 35.3405 0.3054 1680 +1682 4 290.4753 351.6633 35.5897 0.2669 1681 +1683 4 289.8759 350.9495 36.5243 0.2694 1682 +1684 4 289.3016 350.0526 37.5057 0.2357 1683 +1685 4 288.6369 349.2335 37.863 0.2288 1684 +1686 4 287.7503 348.5574 37.2428 0.254 1685 +1687 4 286.9621 347.7703 36.9382 0.2927 1686 +1688 4 286.3077 346.8471 37.2775 0.312 1687 +1689 4 285.6614 345.9147 37.5234 0.3108 1688 +1690 4 284.9979 344.9835 37.5365 0.3121 1689 +1691 4 284.2691 344.106 37.5906 0.3389 1690 +1692 4 283.4946 343.2744 37.8624 0.3701 1691 +1693 4 282.8895 342.4335 38.8769 0.3885 1692 +1694 4 282.3609 341.5046 39.6357 0.3792 1693 +1695 4 281.9056 340.4624 39.6536 0.3612 1694 +1696 4 281.5373 339.4008 39.2008 0.3559 1695 +1697 4 281.0682 338.378 38.8234 0.3636 1696 +1698 4 280.4699 337.4171 39.0328 0.3764 1697 +1699 4 279.8247 336.4939 39.5248 0.3734 1698 +1700 4 279.1943 335.5489 39.7446 0.3607 1699 +1701 4 278.7859 334.4942 39.7603 0.3479 1700 +1702 4 278.2929 333.4771 39.7625 0.3512 1701 +1703 4 277.7197 332.4876 39.7743 0.364 1702 +1704 4 277.1443 331.4992 39.8362 0.3848 1703 +1705 4 276.6535 330.4844 40.2108 0.394 1704 +1706 4 276.2188 329.4468 40.7154 0.4025 1705 +1707 4 275.7921 328.3909 40.88 0.3814 1706 +1708 4 275.4134 327.3133 40.8806 0.3346 1707 +1709 4 275.132 326.2047 40.8836 0.2579 1708 +1710 4 275.0668 325.0699 40.9055 0.2029 1709 +1711 4 274.6664 324.0426 41.0228 0.1995 1710 +1712 4 273.9697 323.2418 41.8933 0.2402 1711 +1713 4 273.4377 322.314 42.7798 0.2954 1712 +1714 4 273.0614 321.2993 42.1565 0.3375 1713 +1715 4 272.6152 320.7524 41.9695 0.2288 1714 +1716 4 272.2548 319.6954 41.6987 0.3461 1715 +1717 4 271.6851 318.8751 41.6464 0.3855 1716 +1718 4 270.9999 318.175 42.4326 0.4599 1717 +1719 4 270.4393 317.2552 43.2054 0.3625 1718 +1720 4 270.0961 316.2336 43.7791 0.3183 1719 +1721 4 269.3662 315.5095 44.4444 0.2868 1720 +1722 4 269.2621 314.6458 43.127 0.3296 1721 +1723 4 268.4659 314.0692 42.4511 0.309 1722 +1724 4 267.863 313.1952 42.014 0.4068 1723 +1725 4 267.0188 312.5099 41.5904 0.3432 1724 +1726 4 266.4113 311.7343 42.0263 0.3988 1725 +1727 4 265.9251 310.9815 41.9614 0.3432 1726 +1728 4 265.7512 310.286 43.4372 0.3489 1727 +1729 4 265.3439 309.2873 43.12 0.3051 1728 +1730 4 265.2478 308.7073 42.3116 0.2998 1729 +1731 4 264.836 308.3892 41.0894 0.3316 1730 +1732 4 265.3748 307.5633 40.9175 0.2034 1731 +1733 4 265.1792 306.6675 40.1321 0.1144 1732 +1734 4 264.8474 306.258 40.0011 0.1652 1733 +1735 4 265.2501 305.4755 41.498 0.1813 1734 +1736 4 265.702 304.6049 42.56 0.317 1735 +1737 4 265.6505 303.7446 41.993 0.1675 1736 +1738 4 266.4708 303.343 41.6858 0.2187 1737 +1739 4 267.0519 302.6258 40.7162 0.2177 1738 +1740 4 267.8413 301.9966 41.0822 0.2161 1739 +1741 4 268.5288 301.3776 41.6612 0.2288 1740 +1742 4 268.5849 300.4373 41.6147 0.2875 1741 +1743 4 269.0631 299.5736 41.7836 0.4758 1742 +1744 4 269.3914 298.9936 40.8884 0.3212 1743 +1745 4 269.8318 298.3255 41.2056 0.4036 1744 +1746 4 270.2368 297.3084 40.6137 0.2486 1745 +1747 4 270.6246 296.3692 41.0295 0.3533 1746 +1748 4 270.858 295.3854 41.8037 0.2288 1747 +1749 4 271.4449 294.6418 42.6056 0.2717 1748 +1750 4 272.3452 294.1018 42.814 0.1144 1749 +1751 4 272.4539 293.6087 40.8814 0.1646 1750 +1752 4 272.7204 292.8034 41.979 0.2878 1751 +1753 4 272.8143 291.9248 40.7901 0.3051 1752 +1754 4 273.2318 291.2544 41.5232 0.2044 1753 +1755 4 273.416 290.282 42.1518 0.1271 1754 +1756 4 272.7925 289.8461 40.8962 0.198 1755 +1757 4 272.6209 288.9836 40.3808 0.2981 1756 +1758 4 272.5752 288.4493 39.2081 0.2321 1757 +1759 4 272.6678 287.5341 40.2833 0.1348 1758 +1760 4 272.7662 286.7596 38.92 0.2034 1759 +1761 4 273.0488 286.1064 40.0319 0.1923 1760 +1762 4 272.8818 285.1271 40.3096 0.2076 1761 +1763 4 272.9584 284.2691 39.5111 0.1652 1762 +1764 4 273.5498 283.6811 40.6347 0.1144 1763 +1765 4 274.1333 282.9146 39.6525 0.135 1764 +1766 4 274.2477 281.8381 39.0757 0.2477 1765 +1767 4 274.2385 280.9481 38.3975 0.2257 1766 +1768 4 273.8381 279.9242 38.4 0.1608 1767 +1769 4 273.3542 278.9278 38.1562 0.1745 1768 +1770 4 272.8348 278.0824 38.2018 0.1922 1769 +1771 4 272.3864 277.1775 38.519 0.2669 1770 +1772 4 272.1553 276.2691 37.8008 0.1528 1771 +1773 4 271.9288 275.1984 38.4185 0.1891 1772 +1774 4 272.3086 274.4124 38.0405 0.2547 1773 +1775 4 272.5752 273.4354 38.3214 0.2034 1774 +1776 4 272.3281 272.7582 38.0467 0.2834 1775 +1777 4 271.5982 272.2411 36.9163 0.2465 1776 +1778 4 271.1303 271.5684 38.2782 0.1144 1777 +1779 4 271.6863 270.8077 37.8616 0.2034 1778 +1780 4 271.875 269.9565 36.8329 0.2258 1779 +1781 4 271.6314 269.0722 37.3332 0.1783 1780 +1782 4 271.2413 268.3206 36.2782 0.2715 1781 +1783 4 271.2104 267.5198 36.0186 0.1965 1782 +1784 4 271.128 266.7373 36.9883 0.2924 1783 +1785 4 270.9244 265.726 36.4 0.2034 1784 +1786 4 270.8992 265.8656 37.24 0.2288 1785 +1787 4 271.1166 265.1277 36.12 0.1314 1785 +1788 4 271.2378 264.2434 36.2631 0.1144 1787 +1789 4 271.1177 263.1715 36.0511 0.1252 1788 +1790 4 270.9793 262.2403 37.1862 0.1181 1789 +1791 4 271.3225 261.2484 37.2089 0.1631 1790 +1792 4 271.2424 260.5483 36.1147 0.17 1791 +1793 4 271.128 259.8768 35.3027 0.2322 1792 +1794 4 271.1841 258.9398 36.1043 0.1841 1793 +1795 4 271.4712 257.9926 35.8907 0.1635 1794 +1796 4 271.5856 257.0682 35.5264 0.1904 1795 +1797 4 271.3831 256.065 34.7922 0.1447 1796 +1798 4 271.1406 254.9987 34.7516 0.2287 1797 +1799 4 271.128 254.0572 35.4824 0.2669 1798 +1800 4 271.0216 253.4772 34.2278 0.1983 1799 +1801 4 271.0948 252.5517 34.9602 0.1636 1800 +1802 4 271.3568 251.6811 35.3447 0.178 1801 +1803 4 271.8007 250.7545 35.2814 0.216 1802 +1804 4 271.9528 249.9285 34.2157 0.1446 1803 +1805 4 272.0306 249.0728 33.32 0.2889 1804 +1806 4 272.5408 248.5855 35.0 0.2669 1805 +1807 4 272.7296 247.5856 34.1986 0.1677 1806 +1808 4 272.518 246.564 34.7589 0.2193 1807 +1809 4 272.1233 245.4978 35.0 0.269 1808 +1810 4 271.8144 244.4476 35.0297 0.2444 1809 +1811 4 271.7023 243.338 35.3186 0.1659 1810 +1812 4 271.8888 242.5291 35.0 0.247 1811 +1813 4 272.5008 241.8313 35.5236 0.2798 1812 +1814 4 273.2558 241.1815 35.6112 0.2288 1813 +1815 4 273.8278 240.2755 36.2239 0.202 1814 +1816 4 274.1264 239.2516 36.0335 0.1725 1815 +1817 4 274.3266 238.1819 36.2085 0.1144 1816 +1818 4 274.6469 237.2564 35.1226 0.1695 1817 +1819 4 275.1514 236.4614 35.7316 0.1652 1818 +1820 4 275.704 235.7212 35.5776 0.1955 1819 +1821 4 275.7646 234.6676 35.6908 0.1967 1820 +1822 4 276.1353 233.7489 36.0923 0.2556 1821 +1823 4 276.276 232.7903 35.2531 0.2288 1822 +1824 4 276.7004 231.9666 34.5369 0.3238 1823 +1825 4 276.7462 230.9644 33.6 0.2204 1824 +1826 4 276.9933 230.2346 33.8254 0.2288 1825 +1827 4 277.857 229.7072 34.16 0.1144 1826 +1828 4 277.9989 228.6215 33.8125 0.2052 1827 +1829 4 278.6956 227.8299 33.6129 0.1306 1828 +1830 4 279.3431 227.1023 33.0711 0.1512 1829 +1831 4 279.2001 226.2066 33.8484 0.2924 1830 +1832 4 279.4792 225.8256 35.0 0.2415 1831 +1833 4 264.6175 308.5723 44.3792 0.3432 1729 +1834 4 264.0352 308.1101 43.7251 0.3051 1833 +1835 4 263.4106 307.3013 43.7478 0.4046 1834 +1836 4 263.0548 306.4787 43.4862 0.2063 1835 +1837 4 262.397 305.8793 43.9267 0.1913 1836 +1838 4 261.8593 305.4263 44.24 0.3159 1837 +1839 4 261.2919 304.5145 43.7203 0.405 1838 +1840 4 261.0288 303.5158 43.5868 0.3016 1839 +1841 4 261.0768 302.5445 43.787 0.2613 1840 +1842 4 260.7874 301.8112 42.4673 0.3777 1841 +1843 4 260.705 300.8548 41.2639 0.243 1842 +1844 4 260.2474 300.0071 41.8135 0.3305 1843 +1845 4 259.8985 299.3619 43.3874 0.3813 1844 +1846 4 259.1286 298.624 42.8565 0.2601 1845 +1847 4 258.655 298.0578 43.2172 0.2669 1846 +1848 4 258.1413 297.1712 43.1343 0.3247 1847 +1849 4 257.6288 296.6392 43.96 0.3686 1848 +1850 4 257.0648 295.7469 44.8678 0.276 1849 +1851 4 256.7239 294.8706 46.3028 0.1907 1850 +1852 4 256.2205 294.4965 45.6817 0.3671 1851 +1853 4 255.8956 293.5252 45.9388 0.3934 1852 +1854 4 255.7881 292.4098 45.4096 0.3386 1853 +1855 4 255.1692 291.7989 45.0251 0.486 1854 +1856 4 254.6544 291.2521 46.5273 0.3553 1855 +1857 4 254.3512 290.576 46.132 0.2844 1856 +1858 4 253.7392 289.9376 46.058 0.1661 1857 +1859 4 253.4326 289.2673 47.7621 0.275 1858 +1860 4 253.078 288.383 47.1654 0.2204 1859 +1861 4 252.7737 287.311 46.8532 0.2094 1860 +1862 4 252.3492 286.4862 47.0719 0.3208 1861 +1863 4 252.0426 285.7254 48.1449 0.2672 1862 +1864 4 251.9752 284.9143 49.3147 0.2288 1863 +1865 4 251.2064 284.2794 50.3468 0.2288 1864 +1866 4 250.5543 283.4043 50.0458 0.3202 1865 +1867 4 249.9937 282.997 48.16 0.2812 1866 +1868 4 249.4229 282.4628 49.287 0.3432 1867 +1869 4 249.1254 281.551 49.9022 0.2796 1868 +1870 4 248.5626 281.6242 48.8846 0.1683 1869 +1871 4 247.4918 281.4274 49.5628 0.2463 1870 +1872 4 246.7505 280.7982 49.3511 0.2515 1871 +1873 4 245.8525 280.3807 50.1315 0.281 1872 +1874 4 245.2816 279.8853 50.1273 0.2169 1873 +1875 4 244.5666 279.454 49.28 0.3051 1874 +1876 4 243.6812 278.7917 49.6138 0.2918 1875 +1877 4 243.0119 278.1613 50.6066 0.3382 1876 +1878 4 242.3106 277.4028 51.2865 0.2942 1877 +1879 4 241.9754 276.657 50.4053 0.2393 1878 +1880 4 241.4755 275.7978 50.8094 0.2587 1879 +1881 4 240.7239 275.1034 51.8507 0.178 1880 +1882 4 240.2343 274.2065 52.0618 0.2288 1881 +1883 4 239.7103 273.3828 52.1007 0.2203 1882 +1884 4 239.5833 272.4505 53.1185 0.3305 1883 +1885 4 238.9473 271.9196 52.7853 0.2432 1884 +1886 4 238.5938 271.1852 53.6505 0.1971 1885 +1887 4 237.8342 270.421 53.9773 0.1652 1886 +1888 4 237.0288 270.3855 54.3074 0.2339 1887 +1889 4 236.3229 269.7529 53.5836 0.2843 1888 +1890 4 235.672 269.0185 54.2688 0.2011 1889 +1891 4 235.0623 268.2451 53.7323 0.2161 1890 +1892 4 234.568 267.3791 53.5648 0.2474 1891 +1893 4 234.1368 266.6767 54.0492 0.211 1892 +1894 4 234.0464 266.4273 56.2489 0.229 1893 +1895 4 233.7192 265.3314 56.2489 0.2516 1894 +1896 4 232.8463 264.6518 56.0311 0.2193 1895 +1897 4 232.2423 264.0752 54.9332 0.217 1896 +1898 4 231.7206 263.2699 54.9489 0.2288 1897 +1899 4 231.0102 262.9015 55.5892 0.2543 1898 +1900 4 230.794 262.2483 55.9908 0.2587 1899 +1901 4 230.6007 261.3857 56.5454 0.3432 1900 +1902 4 230.0641 260.4819 55.5845 0.2424 1901 +1903 4 229.8296 259.6251 54.5714 0.4277 1902 +1904 4 229.5962 258.7854 54.6501 0.2934 1903 +1905 4 228.8092 258.3598 55.8144 0.3215 1904 +1906 4 228.5026 257.4057 56.4029 0.2382 1905 +1907 4 228.5884 256.5981 56.84 0.1876 1906 +1908 4 228.2589 255.5055 56.8851 0.1709 1907 +1909 4 227.5942 254.7322 57.3448 0.1963 1908 +1910 4 226.8598 254.1671 56.6222 0.2669 1909 +1911 4 226.1665 253.3377 56.9898 0.1986 1910 +1912 4 225.9045 252.379 57.12 0.1984 1911 +1913 4 225.3989 251.3608 57.3017 0.2666 1912 +1914 4 225.1449 250.7328 58.3472 0.2994 1913 +1915 4 224.6438 250.1505 59.6285 0.2255 1914 +1916 4 224.621 249.2078 59.0848 0.3197 1915 +1917 4 223.9094 248.5718 59.64 0.2767 1916 +1918 4 223.8808 247.9574 59.8441 0.3122 1917 +1919 4 223.0125 247.5994 59.3158 0.2549 1918 +1920 4 222.9656 246.6464 60.48 0.3051 1919 +1921 4 222.2849 246.1327 61.6753 0.1889 1920 +1922 4 221.4841 245.5882 61.88 0.1873 1921 +1923 4 221.0059 245.0402 60.1888 0.2364 1922 +1924 4 220.4705 244.8057 60.76 0.1271 1923 +1925 4 219.6491 244.1296 60.48 0.2288 1924 +1926 4 219.2224 243.7635 62.5162 0.2321 1925 +1927 4 218.6321 243.1309 63.4094 0.2669 1926 +1928 4 218.3736 242.3232 64.4028 0.3264 1927 +1929 4 217.5625 241.7592 64.3283 0.309 1928 +1930 4 216.8155 240.9344 64.12 0.3726 1929 +1931 4 216.0696 240.0947 64.3737 0.5053 1930 +1932 4 215.4655 239.3626 65.2288 0.5131 1931 +1933 4 215.0182 238.5366 66.0988 0.4272 1932 +1934 4 214.1248 237.9451 66.5414 0.3382 1933 +1935 4 213.3743 237.1054 66.6534 0.3432 1934 +1936 4 213.4693 236.236 66.9186 0.2671 1935 +1937 4 212.6204 235.6663 65.8 0.3358 1936 +1938 4 212.4374 234.7751 66.642 0.1922 1937 +1939 4 211.7498 234.3141 67.0466 0.3437 1938 +1940 4 211.2522 233.6048 67.7359 0.482 1939 +1941 4 210.5726 232.78 67.7757 0.3434 1940 +1942 4 209.9023 232.041 67.1216 0.3281 1941 +1943 4 209.4515 231.1921 66.9393 0.3765 1942 +1944 4 208.9951 230.3776 67.6855 0.353 1943 +1945 4 208.4814 229.69 68.88 0.4491 1944 +1946 4 207.9792 228.7222 68.698 0.2569 1945 +1947 4 207.5113 228.228 69.953 0.3875 1946 +1948 4 207.0137 227.4913 70.5186 0.2924 1947 +1949 4 206.3925 226.6939 70.74 0.4721 1948 +1950 4 205.5768 225.7146 68.9307 0.2469 1949 +1951 4 205.0071 225.0488 69.7799 0.3204 1950 +1952 4 204.355 224.2858 69.19 0.2288 1951 +1953 4 203.8883 223.7607 70.6776 0.3775 1952 +1954 4 203.6961 223.0514 70.6726 0.3268 1953 +1955 4 202.9788 222.6521 71.4692 0.472 1954 +1956 4 202.6138 221.6969 71.6864 0.3536 1955 +1957 4 201.9743 221.0116 72.142 0.3725 1956 +1958 4 201.36 220.1559 71.2379 0.2436 1957 +1959 4 201.1838 219.9088 72.266 0.1144 1958 +1960 4 200.812 219.171 73.67 0.1657 1959 +1961 4 200.2892 218.226 74.403 0.1977 1960 +1962 4 199.8465 217.2227 73.7769 0.2776 1961 +1963 4 199.5228 216.3704 72.6037 0.2765 1962 +1964 4 198.8009 215.5696 72.4802 0.394 1963 +1965 4 198.2403 214.6624 72.0619 0.2288 1964 +1966 4 198.0161 214.0893 74.1482 0.2818 1965 +1967 4 197.5082 213.3343 75.0126 0.4173 1966 +1968 4 196.9167 212.538 74.6911 0.2423 1967 +1969 4 196.5472 211.7372 75.3514 0.3432 1968 +1970 4 195.9706 211.0211 75.7884 0.4558 1969 +1971 4 195.6549 210.1459 75.7711 0.3156 1970 +1972 4 194.9628 209.7684 74.2092 0.4919 1971 +1973 4 194.5944 208.8052 75.0795 0.395 1972 +1974 4 194.2237 207.9346 75.8545 0.4263 1973 +1975 4 192.9001 206.7242 77.1 0.4235 1974 +1976 4 192.4151 206.031 77.5869 0.3298 1975 +1977 4 191.8946 205.3903 77.3111 0.2567 1976 +1978 4 191.5708 204.6536 77.28 0.2584 1977 +1979 4 190.8604 203.9763 77.9212 0.5339 1978 +1980 4 190.7689 203.4467 79.8238 0.3861 1979 +1981 4 190.2472 202.7317 80.0873 0.4454 1980 +1982 4 190.0276 201.7055 80.2984 0.3557 1981 +1983 4 189.2473 201.1518 80.0103 0.3756 1982 +1984 4 189.0071 200.3945 78.5932 0.3821 1983 +1985 4 188.7646 199.9083 80.1206 0.2245 1984 +1986 4 188.2612 199.2287 79.6816 0.3159 1985 +1987 4 187.3437 198.7471 79.002 0.4299 1986 +1988 4 186.6425 197.9566 79.469 0.3586 1987 +1989 4 185.9526 197.4601 80.3799 0.4454 1988 +1990 4 185.5728 197.1981 82.04 0.4195 1989 +1991 4 185.1312 196.1903 82.2343 0.3686 1990 +1992 4 184.3464 195.4181 82.7114 0.3313 1991 +1993 4 183.6074 194.623 83.4165 0.3811 1992 +1994 4 183.3294 193.5476 83.72 0.4602 1993 +1995 4 182.7197 192.732 83.5853 0.3615 1994 +1996 4 182.1214 191.8294 83.8956 0.353 1995 +1997 4 181.4773 191.1384 82.88 0.3813 1996 +1998 4 180.9716 190.2094 82.9116 0.3038 1997 +1999 4 180.315 189.4178 82.88 0.3704 1998 +2000 4 179.608 189.0014 83.54 0.2319 1999 +2001 4 179.3998 188.1811 84.5513 0.3051 2000 +2002 4 178.9124 187.33 84.6866 0.3691 2001 +2003 4 178.0201 186.758 84.9971 0.3392 2002 +2004 4 177.5728 185.8245 84.84 0.2953 2003 +2005 4 177.0923 184.8773 84.0062 0.4058 2004 +2006 4 176.6096 184.0833 84.0118 0.321 2005 +2007 4 175.8397 183.4953 84.5995 0.4174 2006 +2008 4 175.4873 182.9439 85.8561 0.3348 2007 +2009 4 174.9336 182.158 86.6746 0.2415 2008 +2010 4 174.6774 181.324 85.9636 0.4307 2009 +2011 4 174.3399 180.5953 87.08 0.3747 2010 +2012 4 173.6386 179.934 86.8935 0.4109 2011 +2013 4 173.3812 178.9754 86.8045 0.3424 2012 +2014 4 173.0769 178.3324 87.3152 0.2388 2013 +2015 4 172.8287 177.423 86.133 0.3051 2014 +2016 4 172.0576 176.6977 86.5354 0.4068 2015 +2017 4 171.6938 176.128 88.2837 0.3386 2016 +2018 4 171.1985 175.2608 89.0798 0.2352 2017 +2019 4 170.6619 174.6831 89.7005 0.3368 2018 +2020 4 170.1563 173.745 88.7788 0.2916 2019 +2021 4 169.5076 173.054 89.32 0.3295 2020 +2022 4 169.0729 172.3802 88.2059 0.3099 2021 +2023 4 168.3373 171.695 88.4366 0.1781 2022 +2024 4 167.5834 171.2614 89.6221 0.3887 2023 +2025 4 167.0675 170.5761 90.72 0.3487 2024 +2026 4 166.6922 169.5774 90.9504 0.2736 2025 +2027 4 166.0104 168.6805 90.8214 0.3615 2026 +2028 4 165.5334 167.8648 89.4449 0.4909 2027 +2029 4 164.776 167.2093 89.5843 0.4261 2028 +2030 4 164.2018 166.2575 89.6132 0.3665 2029 +2031 4 163.8826 165.6604 91.0482 0.337 2030 +2032 4 163.7007 164.641 90.5915 0.3375 2031 +2033 4 163.3964 163.616 91.0115 0.2341 2032 +2034 4 163.3312 162.7351 91.56 0.2229 2033 +2035 4 162.8347 161.9069 91.9881 0.3491 2034 +2036 4 162.0785 161.137 92.694 0.2981 2035 +2037 4 161.1759 160.5066 93.1837 0.2377 2036 +2038 4 160.7595 159.5045 93.2467 0.2034 2037 +2039 4 160.2561 158.5721 93.7045 0.2094 2038 +2040 4 159.7493 157.9235 93.0404 0.2898 2039 +2041 4 159.461 156.9625 93.5558 0.2677 2040 +2042 4 159.135 156.029 94.5098 0.2206 2041 +2043 4 158.6042 155.1664 95.1686 0.1738 2042 +2044 4 158.2884 154.0888 94.92 0.1192 2043 +2045 4 157.753 153.2171 95.2812 0.3227 2044 +2046 4 157.4236 152.1291 95.2 0.3284 2045 +2047 4 157.0575 151.0549 95.4198 0.2915 2046 +2048 4 156.6616 150.198 96.8103 0.2605 2047 +2049 4 156.2304 149.3995 97.7693 0.2601 2048 +2050 4 155.7579 148.5976 97.071 0.3911 2049 +2051 4 155.3323 147.7636 96.9422 0.3122 2050 +2052 4 154.8976 146.9548 98.4326 0.1401 2051 +2053 4 154.3245 146.0613 98.84 0.1144 2052 +2054 4 153.6049 145.3143 98.8308 0.1182 2053 +2055 4 152.8155 144.5398 98.4931 0.1898 2054 +2056 4 152.2458 143.5926 98.7792 0.1846 2055 +2057 4 151.5537 142.8616 99.12 0.3122 2056 +2058 4 150.7563 142.2644 98.7109 0.2288 2057 +2059 4 149.9933 141.8331 99.6128 0.2669 2058 +2060 4 149.7004 140.9419 100.6138 0.3392 2059 +2061 4 149.3698 139.9329 101.39 0.2084 2060 +2062 4 149.1593 138.8553 102.0124 0.124 2061 +2063 4 148.5187 137.9264 102.2 0.1144 2062 +2064 4 147.6549 137.3143 102.4666 0.1144 2063 +2065 4 146.9937 136.4243 102.48 0.1336 2064 +2066 4 146.4755 135.4599 102.7869 0.1725 2065 +2067 4 146.2146 134.4349 103.1414 0.1635 2066 +2068 4 145.7559 133.5448 103.9004 0.1144 2067 +2069 4 145.3418 132.5198 104.16 0.1144 2068 +2070 4 144.4769 131.8952 104.2272 0.1225 2069 +2071 4 143.7081 131.1173 104.4291 0.2116 2070 +2072 4 143.5617 130.5693 106.3866 0.167 2071 +2073 4 143.1201 129.7182 106.6985 0.1939 2072 +2074 4 142.7815 128.7927 106.2384 0.2288 2073 +2075 4 142.4257 127.8614 106.7878 0.1907 2074 +2076 4 142.0779 127.0458 107.8 0.1714 2075 +2077 4 141.7038 125.9922 107.7997 0.1907 2076 +2078 4 141.0678 125.109 107.8246 0.1325 2077 +2079 4 140.2292 124.5278 108.5468 0.1144 2078 +2080 4 139.4547 123.7064 108.64 0.1144 2079 +2081 4 138.8587 122.9651 109.482 0.1144 2080 +2082 4 138.5338 122.0202 109.9134 0.1312 2081 +2083 4 137.9515 121.089 110.2469 0.1191 2082 +2084 4 137.1919 120.3133 111.0547 0.1514 2083 +2085 4 136.7034 119.3112 111.517 0.2034 2084 +2086 4 136.16 118.3376 112.0 0.162 2085 +2087 4 136.033 117.3241 112.572 0.116 2086 +2088 4 136.2298 116.2876 113.3457 0.1341 2087 +2089 4 136.0857 115.1791 113.68 0.1487 2088 +2090 4 135.7676 114.0822 113.68 0.2288 2089 +2091 4 135.3981 113.5568 113.96 0.3382 2090 +2092 4 134.8776 112.7799 114.7471 0.3216 2091 +2093 4 134.8421 111.7206 115.0932 0.265 2092 +2094 4 135.4416 110.8978 115.4829 0.2255 2093 +2095 4 135.6933 110.0838 114.0 0.2614 2094 +2096 4 135.6784 109.1147 114.408 0.2728 2095 +2097 4 135.9644 108.3403 116.1345 0.2731 2096 +2098 4 135.7734 107.3832 116.247 0.2754 2097 +2099 4 135.8157 106.3778 116.713 0.1801 2098 +2100 4 135.7562 105.2764 117.2979 0.2305 2099 +2101 4 135.4313 104.1866 117.4362 0.2765 2100 +2102 4 135.1762 103.141 118.1471 0.2258 2101 +2103 4 134.6808 102.7232 116.5688 0.1973 2102 +2104 4 134.6305 101.8254 115.64 0.2256 2103 +2105 4 134.6488 100.7918 116.0944 0.1144 2104 +2106 4 134.6911 100.0884 117.6512 0.148 2105 +2107 4 134.7815 99.3526 118.72 0.3813 2106 +2108 4 135.2116 98.4157 118.2686 0.3241 2107 +2109 4 135.2437 97.7976 116.3408 0.2519 2108 +2110 4 135.54 96.8788 117.32 0.1947 2109 +2111 4 135.6384 96.0939 116.9518 0.2655 2110 +2112 4 135.5686 95.3231 116.0323 0.2111 2111 +2113 4 135.961 94.9299 114.4307 0.2341 2112 +2114 4 136.247 93.8935 113.96 0.2448 2113 +2115 4 136.3568 92.8218 114.1753 0.2625 2114 +2116 4 136.4529 91.8987 115.36 0.1849 2115 +2117 4 137.0512 91.0443 115.5636 0.2385 2116 +2118 4 136.9402 90.948 118.258 0.1332 2117 +2119 4 136.9368 90.9226 121.0527 0.1144 2118 +2120 4 137.0512 90.5832 123.489 0.1144 2119 +2121 4 137.0638 89.7208 125.1228 0.1144 2120 +2122 4 137.0215 89.0255 127.1393 0.1349 2121 +2123 4 137.0592 88.0054 127.9911 0.2262 2122 +2124 4 137.1805 86.96 128.7784 0.1232 2123 +2125 4 137.8566 86.1886 129.0635 0.1719 2124 +2126 4 138.0808 85.5975 129.8321 0.2235 2125 +2127 4 138.6082 84.7646 130.188 0.1144 2126 +2128 4 139.2008 83.8653 130.76 0.2266 2127 +2129 4 139.465 83.1791 129.3804 0.1773 2128 +2130 4 140.2121 82.5405 129.2609 0.1562 2129 +2131 4 140.8264 81.6683 129.08 0.1182 2130 +2132 4 141.6215 80.9534 129.0187 0.1144 2131 +2133 4 142.5664 80.3992 128.5889 0.1144 2132 +2134 4 143.1178 79.4848 128.3582 0.1144 2133 +2135 4 143.2288 78.4465 128.4875 0.1144 2134 +2136 4 143.0149 77.6787 129.3454 0.1675 2135 +2137 4 143.1522 77.233 131.0431 0.2472 2136 +2138 4 143.4702 76.4309 132.16 0.2478 2137 +2139 4 143.8706 75.5771 132.6601 0.2069 2138 +2140 4 143.7962 74.8564 134.1166 0.1254 2139 +2141 4 143.3032 74.0542 135.2425 0.1144 2140 +2142 4 143.0801 73.2361 136.2155 0.1468 2141 +2143 4 143.2174 72.1136 136.08 0.2382 2142 +2144 4 143.4576 71.3856 136.64 0.1398 2143 +2145 4 135.3993 113.6063 114.2098 0.3051 2090 +2146 4 134.6705 113.0582 113.1259 0.2772 2145 +2147 4 134.2839 112.9949 114.6107 0.3276 2146 +2148 4 133.7771 112.7324 116.48 0.2415 2147 +2149 4 133.0724 112.0937 117.7081 0.2775 2148 +2150 4 132.9751 111.1348 118.6234 0.2504 2149 +2151 4 132.3414 110.3951 118.454 0.1563 2150 +2152 4 131.56 110.0009 119.576 0.273 2151 +2153 4 131.2111 109.3296 121.2224 0.1453 2152 +2154 4 130.6368 108.7944 122.2931 0.2055 2153 +2155 4 129.9607 108.2954 121.2926 0.265 2154 +2156 4 129.5225 107.9852 122.703 0.1314 2155 +2157 4 129.725 107.3733 124.2497 0.1478 2156 +2158 4 129.2892 106.8544 123.7054 0.2288 2157 +2159 4 128.5948 106.3221 124.88 0.2314 2158 +2160 4 128.3431 105.2986 125.5346 0.1652 2159 +2161 4 127.4553 104.8079 126.28 0.1144 2160 +2162 4 126.8971 104.0031 127.073 0.2605 2161 +2163 4 125.9418 103.4019 127.12 0.2765 2162 +2164 4 125.1742 102.8517 127.9116 0.1907 2163 +2165 4 124.4523 102.6348 129.64 0.1271 2164 +2166 4 123.5692 101.9666 129.92 0.1333 2165 +2167 4 122.8233 101.3039 130.7348 0.1265 2166 +2168 4 121.8028 100.8097 130.76 0.131 2167 +2169 4 120.9437 100.4054 131.224 0.2008 2168 +2170 4 120.0754 99.7797 130.6836 0.1849 2169 +2171 4 119.4061 99.3095 129.1987 0.1302 2170 +2172 4 118.515 99.143 128.6659 0.1144 2171 +2173 4 117.6696 98.5148 128.24 0.1144 2172 +2174 4 116.5496 98.384 128.4363 0.1144 2173 +2175 4 115.409 98.384 128.52 0.1194 2174 +2176 4 114.5167 98.384 129.7778 0.1619 2175 +2177 4 113.8957 98.4984 132.0063 0.2288 2176 +2178 4 113.0108 98.9001 132.0852 0.2868 2177 +2179 4 112.0936 99.2735 131.3301 0.2418 2178 +2180 4 111.1802 99.3057 131.068 0.2135 2179 +2181 4 110.123 99.362 131.0397 0.2287 2180 +2182 4 109.268 99.4342 132.02 0.2431 2181 +2183 4 108.3749 99.0196 131.6311 0.3178 2182 +2184 4 107.9407 98.8416 132.7418 0.3199 2183 +2185 4 107.5813 98.384 132.7782 0.1477 2184 +2186 4 107.269 98.023 131.2394 0.2898 2185 +2187 4 106.4616 97.3663 131.6078 0.1263 2186 +2188 4 105.8261 97.391 133.2612 0.1144 2187 +2189 4 105.6227 96.6324 133.56 0.1271 2188 +2190 4 105.4783 95.6784 132.9051 0.1907 2189 +2191 4 104.7904 95.5017 131.4712 0.1504 2190 +2192 4 104.719 94.465 130.975 0.2004 2191 +2193 4 104.7546 93.4246 131.0512 0.1788 2192 +2194 4 104.9176 92.3282 131.0501 0.1566 2193 +2195 4 105.1714 91.5068 129.8564 0.1522 2194 +2196 4 104.9646 90.7354 129.5868 0.2288 2195 +2197 4 105.1305 90.376 131.8929 0.1715 2196 +2198 4 105.0192 89.9533 133.387 0.313 2197 +2199 4 104.676 89.1177 132.6399 0.1953 2198 +2200 4 104.4472 88.307 133.5298 0.2743 2199 +2201 4 104.3328 87.3038 132.4621 0.2692 2200 +2202 4 104.0619 86.414 130.9991 0.1921 2201 +2203 4 103.2351 85.8715 130.3224 0.2015 2202 +2204 4 103.0362 85.1773 128.8319 0.1907 2203 +2205 4 103.293 84.8392 127.1651 0.155 2204 +2206 4 103.6284 83.8574 126.84 0.1981 2205 +2207 4 102.9944 83.0582 127.132 0.1682 2206 +2208 4 102.325 82.3305 126.9036 0.3387 2207 +2209 4 102.1894 81.4099 126.5561 0.1382 2208 +2210 4 101.5258 80.9671 124.6666 0.2407 2209 +2211 4 101.2654 80.3004 123.9762 0.1228 2210 +2212 4 101.538 79.6142 124.1198 0.2542 2211 +2213 4 101.5872 78.8216 124.04 0.2542 2212 +2214 4 107.6236 98.956 132.314 0.249 2183 +2215 4 107.0173 99.6743 131.8738 0.2094 2214 +2216 4 106.4612 100.224 130.5581 0.1718 2215 +2217 4 105.7241 100.6961 131.5591 0.1652 2216 +2218 4 105.3258 101.2052 133.0 0.2547 2217 +2219 4 104.5105 101.914 132.7306 0.2672 2218 +2220 4 103.7482 102.3552 133.7563 0.1605 2219 +2221 4 103.0297 102.8874 134.3734 0.1922 2220 +2222 4 102.4516 103.6337 134.0268 0.2288 2221 +2223 4 101.816 103.9133 134.2132 0.2288 2222 +2224 4 101.6215 104.0517 134.9334 0.1416 2222 +2225 4 100.8323 104.4483 134.7819 0.2519 2224 +2226 4 100.2006 104.9818 135.4564 0.1777 2225 +2227 4 99.5304 105.5897 134.6374 0.1144 2226 +2228 4 99.1649 106.396 135.5973 0.142 2227 +2229 4 98.4944 106.9781 136.8906 0.1144 2228 +2230 4 97.8302 107.3853 138.1134 0.2188 2229 +2231 4 97.2462 107.7832 139.806 0.1657 2230 +2232 4 97.0504 108.4184 139.7536 0.2012 2231 +2233 4 96.6121 109.1376 140.4455 0.2718 2232 +2234 4 96.2954 109.7806 141.9558 0.2051 2233 +2235 4 95.3715 109.824 143.2668 0.2034 2234 +2236 4 94.4802 110.2816 143.5031 0.2134 2235 +2237 4 93.6863 110.4196 144.8868 0.1568 2236 +2238 4 93.1176 111.073 144.9384 0.1398 2237 +2239 4 92.3406 110.968 143.7419 0.2631 2238 +2240 4 91.5187 110.8489 145.4379 0.1954 2239 +2241 4 90.5336 110.5398 146.5738 0.1652 2240 +2242 4 89.9027 110.7393 148.6492 0.178 2241 +2243 4 88.9348 111.0824 147.9848 0.2539 2242 +2244 4 87.9145 110.9666 146.886 0.1586 2243 +2245 4 86.8543 111.2734 146.7357 0.1652 2244 +2246 4 85.9644 111.8899 147.499 0.1652 2245 +2247 4 85.1134 112.2264 148.4115 0.1905 2246 +2248 4 84.7254 112.2592 150.6086 0.1499 2247 +2249 4 83.9685 112.6759 151.5816 0.2261 2248 +2250 4 83.2832 112.4552 149.8 0.1525 2249 +2251 4 223.8064 247.0079 61.161 0.2799 1920 +2252 4 224.224 247.9048 59.92 0.2796 2251 +2253 4 248.3876 280.598 49.28 0.3178 1869 +2254 4 248.5306 279.4792 50.3552 0.2932 2253 +2255 4 249.3497 278.9861 51.3752 0.2613 2254 +2256 4 249.1907 278.0355 50.5926 0.1907 2255 +2257 4 249.5064 277.1512 51.711 0.242 2256 +2258 4 249.527 276.2806 52.5893 0.2756 2257 +2259 4 250.3232 275.6662 51.8263 0.138 2258 +2260 4 250.5463 274.6538 52.3508 0.2656 2259 +2261 4 250.9032 273.8999 52.4465 0.1332 2260 +2262 4 250.8792 272.812 52.92 0.1707 2261 +2263 4 251.227 271.8853 53.2734 0.2374 2262 +2264 4 251.6583 271.239 53.7068 0.2372 2263 +2265 4 251.7944 270.4576 54.2497 0.2288 2264 +2266 4 251.7944 269.5447 55.0642 0.2288 2265 +2267 4 251.68 268.8469 54.962 0.3373 2266 +2268 4 252.1902 268.165 55.5307 0.115 2267 +2269 4 252.7222 267.3551 54.7929 0.2075 2268 +2270 4 253.1478 266.5394 56.1554 0.2224 2269 +2271 4 253.7323 265.6059 56.203 0.2669 2270 +2272 4 253.396 264.725 56.5452 0.2542 2271 +2273 4 253.1066 263.7778 56.3046 0.2288 2272 +2274 4 253.6751 262.8489 56.3634 0.2504 2273 +2275 4 254.3112 262.2197 56.6989 0.3893 2274 +2276 4 254.6544 261.404 58.002 0.2911 2275 +2277 4 254.5812 260.3504 57.6265 0.1184 2276 +2278 4 253.9188 259.9088 56.7602 0.1326 2277 +2279 4 253.7312 259.3448 57.5523 0.3715 2278 +2280 4 253.865 258.5577 57.1096 0.178 2279 +2281 4 254.8043 258.417 57.148 0.323 2280 +2282 4 255.6325 258.0944 58.0398 0.2039 2281 +2283 4 256.3315 257.4389 58.3862 0.1652 2282 +2284 4 257.3451 257.154 58.7997 0.2627 2283 +2285 4 258.147 256.8612 60.1888 0.1785 2284 +2286 4 259.1412 256.4848 60.2 0.243 2285 +2287 4 259.8859 256.8989 61.3021 0.3069 2286 +2288 4 260.641 257.5144 62.6268 0.1907 2287 +2289 4 261.4395 258.1802 63.7185 0.2503 2288 +2290 4 261.9463 257.8656 65.1568 0.1144 2289 +2291 4 262.4691 258.3827 66.36 0.1144 2290 +2292 4 263.1543 258.7579 64.6996 0.1968 2291 +2293 4 264.0146 259.0165 63.9954 0.2161 2292 +2294 4 265.0065 259.4295 63.84 0.2722 2293 +2295 4 265.6746 259.5976 65.3114 0.269 2294 +2296 4 266.5074 259.4558 65.9789 0.2196 2295 +2297 4 267.0714 258.6778 66.6439 0.2637 2296 +2298 4 268.0232 258.6275 67.4579 0.1433 2297 +2299 4 268.6318 257.9663 67.7295 0.2168 2298 +2300 4 269.5687 257.376 68.2223 0.2438 2299 +2301 4 270.3261 256.8337 68.8433 0.1525 2300 +2302 4 270.1476 256.6084 66.3426 0.1834 2301 +2303 4 270.7871 256.5981 65.24 0.1525 2302 +2304 4 271.128 256.4699 66.9774 0.2399 2303 +2305 4 271.5822 256.3326 69.3199 0.3499 2304 +2306 4 272.4619 255.9757 69.1911 0.233 2305 +2307 4 272.9447 255.3934 70.7585 0.1144 2306 +2308 4 273.416 254.8409 70.0694 0.2082 2307 +2309 4 274.0704 254.2048 70.6558 0.2043 2308 +2310 4 275.0691 253.8067 70.5488 0.2692 2309 +2311 4 275.7189 252.951 70.8397 0.2028 2310 +2312 4 276.7176 252.7004 70.4701 0.1144 2311 +2313 4 277.2701 252.4808 72.3192 0.1144 2312 +2314 4 278.2803 252.1765 73.1259 0.1223 2313 +2315 4 279.311 251.7361 73.36 0.1673 2314 +2316 4 280.0798 250.9456 73.8038 0.1907 2315 +2317 4 280.5786 250.0315 74.1401 0.2049 2316 +2318 4 281.4801 249.6208 73.64 0.1314 2317 +2319 4 282.1104 248.9722 74.7093 0.2135 2318 +2320 4 282.1928 247.9677 74.8362 0.2397 2319 +2321 4 282.7385 247.255 75.9433 0.2288 2320 +2322 4 283.4706 246.8672 76.979 0.1185 2321 +2323 4 283.7028 245.7884 76.72 0.1144 2322 +2324 4 283.9294 244.6913 76.72 0.1144 2323 +2325 4 284.8308 244.0381 76.7138 0.1144 2324 +2326 4 285.3056 243.1229 76.44 0.1144 2325 +2327 4 285.4886 242.4159 77.8445 0.1507 2326 +2328 4 285.476 241.6082 78.1063 0.2577 2327 +2329 4 286.1659 240.7708 78.4 0.2346 2328 +2330 4 286.4793 239.8339 79.2714 0.1907 2329 +2331 4 287.4254 239.2973 79.3766 0.2703 2330 +2332 4 288.4093 238.9187 80.0892 0.1144 2331 +2333 4 288.6552 238.2758 82.0187 0.1994 2332 +2334 4 289.3336 238.1808 80.421 0.1743 2333 +2335 4 289.7626 237.6145 78.797 0.3321 2334 +2336 4 290.2408 237.7918 79.8389 0.1907 2335 +2337 4 290.8208 237.0265 81.3596 0.1907 2336 +2338 4 291.402 236.2612 82.88 0.1907 2337 +2339 4 291.768 235.8928 83.5344 0.1144 2338 +2340 4 292.2703 235.7292 85.9606 0.1144 2339 +2341 4 292.5723 234.9776 87.0643 0.1144 2340 +2342 4 292.6352 233.853 86.8 0.1144 2341 +2343 4 292.6352 232.709 86.8 0.1144 2342 +2344 4 292.6283 231.5868 87.0794 0.1405 2343 +2345 4 292.7496 230.7448 87.92 0.178 2344 +2346 4 291.1549 236.3698 82.885 0.1265 2338 +2347 4 290.7076 237.1066 84.3951 0.2151 2346 +2348 4 290.2328 237.7232 85.68 0.1525 2347 +2349 4 260.3744 257.5144 63.0 0.1652 2288 +2350 4 247.8796 280.4196 48.72 0.2415 2253 +2351 4 256.0112 296.6975 44.9501 0.3236 1849 +2352 4 254.9015 296.7364 45.6288 0.2929 2351 +2353 4 253.9497 296.8577 44.9366 0.3467 2352 +2354 4 253.0974 296.7479 45.8354 0.1963 2353 +2355 4 252.562 297.4995 45.8088 0.2974 2354 +2356 4 252.061 298.2625 46.1437 0.1754 2355 +2357 4 251.7178 298.9272 45.7472 0.281 2356 +2358 4 251.0188 299.7028 46.1378 0.2444 2357 +2359 4 250.8792 300.5288 45.9091 0.1265 2358 +2360 4 250.3484 300.9715 45.1931 0.1144 2359 +2361 4 249.4892 301.0676 46.3456 0.1811 2360 +2362 4 248.4951 300.9864 46.9482 0.1591 2361 +2363 4 247.5307 301.1443 46.9288 0.2089 2362 +2364 4 246.5 301.2198 46.762 0.178 2363 +2365 4 245.4887 301.6248 47.0109 0.1915 2364 +2366 4 244.6021 302.0492 46.2 0.1165 2365 +2367 4 244.3801 302.9049 46.5077 0.2556 2366 +2368 4 243.863 303.8075 47.2077 0.1602 2367 +2369 4 243.4729 304.5568 46.9384 0.1739 2368 +2370 4 243.4672 305.6127 46.7082 0.2855 2369 +2371 4 243.5542 306.4707 47.4116 0.3405 2370 +2372 4 243.577 307.3951 48.5206 0.3191 2371 +2373 4 243.9992 308.1318 48.7589 0.2129 2372 +2374 4 243.5576 308.8972 48.5593 0.1179 2373 +2375 4 243.5576 309.6362 46.7286 0.2052 2374 +2376 4 243.2144 310.4267 45.4168 0.1329 2375 +2377 4 243.434 311.3648 45.8693 0.2063 2376 +2378 4 243.4066 312.0512 47.6 0.2262 2377 +2379 4 243.0108 313.0728 47.1414 0.1305 2378 +2380 4 242.5349 313.9571 46.5548 0.2086 2379 +2381 4 242.1676 315.0187 46.4145 0.2542 2380 +2382 4 241.8256 315.99 45.876 0.1723 2381 +2383 4 241.1884 316.8388 45.64 0.2481 2382 +2384 4 240.1233 317.1145 45.6218 0.1734 2383 +2385 4 239.3202 317.3811 45.1825 0.1563 2384 +2386 4 238.349 317.6934 45.1732 0.1953 2385 +2387 4 237.7953 318.612 45.5972 0.1612 2386 +2388 4 237.2816 319.5112 44.8636 0.1991 2387 +2389 4 236.4648 320.185 44.8146 0.1443 2388 +2390 4 235.7201 320.6666 44.24 0.1144 2389 +2391 4 235.1606 321.6642 44.24 0.1144 2390 +2392 4 234.544 322.5565 43.701 0.1144 2391 +2393 4 234.099 323.5735 43.96 0.1144 2392 +2394 4 233.9354 324.6786 43.7427 0.1144 2393 +2395 4 233.1426 325.2792 43.68 0.1144 2394 +2396 4 232.7811 326.3386 43.615 0.1144 2395 +2397 4 232.0032 326.9792 43.4 0.1144 2396 +2398 4 231.6714 328.002 43.4 0.1144 2397 +2399 4 231.3637 329.0762 43.4 0.1144 2398 +2400 4 231.1429 330.1264 43.209 0.1144 2399 +2401 4 230.7723 330.7579 42.6717 0.2008 2400 +2402 4 230.6304 331.7543 43.4437 0.1678 2401 +2403 4 230.5961 332.8846 43.12 0.1398 2402 +2404 4 230.341 333.9828 43.4 0.1489 2403 +2405 4 229.9543 335.0318 43.12 0.1244 2404 +2406 4 229.7484 336.1381 43.12 0.1144 2405 +2407 4 229.5711 337.2649 43.12 0.1144 2406 +2408 4 229.4864 338.346 42.5877 0.1144 2407 +2409 4 229.0723 339.3539 43.12 0.1144 2408 +2410 4 229.0288 340.4544 43.12 0.1144 2409 +2411 4 290.1184 350.8454 35.0 0.3686 1682 +2412 4 290.4113 349.9439 34.1653 0.2466 2411 +2413 4 289.8027 349.4085 33.7159 0.1479 2412 +2414 4 290.2328 348.7106 35.1868 0.3321 2413 +2415 4 290.4948 347.7119 35.56 0.2963 2414 +2416 4 290.0166 346.8482 34.7208 0.3306 2415 +2417 4 289.8267 345.9353 35.4668 0.2613 2416 +2418 4 289.7752 345.0373 33.8705 0.1435 2417 +2419 4 289.6608 343.9882 33.1139 0.2542 2418 +2420 4 289.7798 343.0753 33.6806 0.208 2419 +2421 4 289.7752 342.175 34.5044 0.2156 2420 +2422 4 290.1378 341.1282 34.44 0.1179 2421 +2423 4 290.1184 340.6603 32.5077 0.3472 2422 +2424 4 290.1184 339.768 33.32 0.2415 2423 +2425 4 290.29 339.4065 32.8076 0.2082 2424 +2426 4 290.6492 339.196 30.3363 0.2288 2425 +2427 4 291.299 339.5323 31.306 0.2288 2426 +2428 4 291.8321 339.871 30.9137 0.3713 2427 +2429 4 292.7748 339.9911 31.1419 0.2288 2428 +2430 4 293.3308 340.0151 32.2 0.2321 2429 +2431 4 293.7872 340.7679 30.8314 0.2122 2430 +2432 4 294.5869 340.8296 30.081 0.3149 2431 +2433 4 295.3888 341.2632 30.7476 0.2161 2432 +2434 4 296.3132 341.1397 29.7128 0.2791 2433 +2435 4 297.4194 340.9131 29.96 0.1788 2434 +2436 4 298.1447 340.9989 28.5631 0.2661 2435 +2437 4 298.9192 341.6213 29.1942 0.2849 2436 +2438 4 299.9053 342.0423 29.986 0.2629 2437 +2439 4 300.6821 341.3993 29.7195 0.3051 2438 +2440 4 301.6614 341.2186 29.3048 0.1683 2439 +2441 4 302.6864 340.912 29.68 0.3548 2440 +2442 4 303.303 340.2199 28.4917 0.341 2441 +2443 4 304.2662 339.8172 27.7732 0.2851 2442 +2444 4 305.067 339.3642 28.3984 0.171 2443 +2445 4 305.6002 338.5794 28.94 0.1444 2444 +2446 4 306.1344 337.9147 29.6363 0.2804 2445 +2447 4 306.3655 337.8003 27.72 0.2755 2446 +2448 4 307.2006 337.4262 27.7794 0.3077 2447 +2449 4 307.8435 336.8886 28.7468 0.2211 2448 +2450 4 308.6501 336.241 28.2559 0.3305 2449 +2451 4 309.4074 335.9928 27.9028 0.2812 2450 +2452 4 310.1933 335.4505 27.5775 0.3529 2451 +2453 4 310.834 334.668 27.1043 0.37 2452 +2454 4 311.7549 334.1075 26.6213 0.2924 2453 +2455 4 312.8096 333.8615 27.1384 0.309 2454 +2456 4 313.5578 333.1957 27.6273 0.3557 2455 +2457 4 314.0566 332.5448 26.9713 0.3299 2456 +2458 4 314.8929 332.0815 26.5826 0.2924 2457 +2459 4 315.6536 331.3688 26.8442 0.2492 2458 +2460 4 316.4762 330.7453 26.6924 0.1984 2459 +2461 4 317.1694 330.2854 27.4565 0.3131 2460 +2462 4 317.9165 330.6046 27.3935 0.316 2461 +2463 4 318.4656 329.8575 27.4991 0.2241 2462 +2464 4 318.604 328.8657 27.5164 0.3144 2463 +2465 4 318.572 327.8006 28.3119 0.2524 2464 +2466 4 318.9483 326.9609 29.3812 0.2161 2465 +2467 4 319.7629 326.4473 28.5135 0.3273 2466 +2468 4 320.5202 325.9096 28.6572 0.3073 2467 +2469 4 321.297 325.206 28.6513 0.1497 2468 +2470 4 321.996 324.634 27.8844 0.2924 2469 +2471 4 322.7602 323.8618 28.1249 0.2669 2470 +2472 4 323.2864 323.2658 28.84 0.1757 2471 +2473 4 323.887 322.6057 28.1473 0.1496 2472 +2474 4 324.3984 321.9102 27.9451 0.1803 2473 +2475 4 324.9738 321.337 27.5022 0.1526 2474 +2476 4 326.0148 320.9034 27.48 0.2161 2475 +2477 4 326.7527 320.0763 27.3938 0.2034 2476 +2478 4 326.8111 318.9666 26.9954 0.256 2477 +2479 4 326.7264 317.8512 26.5798 0.2669 2478 +2480 4 327.2412 317.3708 25.2857 0.2952 2479 +2481 4 328.3406 317.2198 25.3772 0.3064 2480 +2482 4 328.9995 316.7267 25.9823 0.22 2481 +2483 4 329.7088 315.9579 25.947 0.3516 2482 +2484 4 330.2511 315.1022 26.04 0.2509 2483 +2485 4 330.6103 314.0795 25.6869 0.3305 2484 +2486 4 330.5771 313.3096 24.4042 0.2615 2485 +2487 4 331.2807 312.5614 23.4982 0.2221 2486 +2488 4 332.2885 312.185 22.6657 0.2995 2487 +2489 4 333.2312 311.6062 22.5624 0.2161 2488 +2490 4 334.1624 311.2355 22.414 0.2334 2489 +2491 4 335.152 311.3224 21.9624 0.3368 2490 +2492 4 336.1552 311.7743 21.3206 0.2343 2491 +2493 4 336.8519 311.6348 22.0352 0.2195 2492 +2494 4 337.5967 310.9827 21.1904 0.2548 2493 +2495 4 338.4181 310.7218 21.2789 0.2592 2494 +2496 4 339.4648 310.596 21.4693 0.3053 2495 +2497 4 340.2256 310.1407 21.5516 0.3298 2496 +2498 4 340.9555 309.5687 22.526 0.2209 2497 +2499 4 341.6053 309.3342 21.0 0.1652 2498 +2500 4 342.628 308.9178 20.6268 0.2288 2499 +2501 4 343.4196 309.7483 21.2587 0.1592 2500 +2502 4 344.0706 310.6463 21.7641 0.1398 2501 +2503 4 344.7581 311.4712 22.0494 0.1639 2502 +2504 4 345.8461 311.1543 22.1822 0.1652 2503 +2505 4 346.9741 311.1394 21.947 0.152 2504 +2506 4 347.9247 310.8591 21.7479 0.1373 2505 +2507 4 348.5448 309.8982 21.7862 0.1301 2506 +2508 4 348.7884 308.832 21.6224 0.1271 2507 +2509 4 348.8273 307.7017 21.5869 0.1334 2508 +2510 4 348.7621 306.5794 21.5572 0.1464 2509 +2511 4 348.2588 305.6951 21.3786 0.1525 2510 +2512 4 348.0597 303.6634 19.4102 0.3116 2511 +2513 4 348.8971 302.9335 19.32 0.3178 2512 +2514 4 349.7963 302.27 19.465 0.287 2513 +2515 4 350.6921 301.7231 19.7728 0.2712 2514 +2516 4 351.3052 301.6842 19.8923 0.2148 2515 +2517 4 352.0157 300.9338 19.5054 0.2796 2516 +2518 4 352.4344 300.0163 20.16 0.1814 2517 +2519 4 352.6792 299.1194 19.88 0.1584 2518 +2520 4 353.2786 298.7041 19.0756 0.1398 2519 +2521 4 353.6035 297.6985 19.3934 0.2977 2520 +2522 4 353.5692 296.6289 18.7415 0.3153 2521 +2523 4 353.4285 295.7526 18.6782 0.1255 2522 +2524 4 353.48 294.8912 19.4062 0.3417 2523 +2525 4 353.1528 293.8947 19.206 0.2313 2524 +2526 4 353.2306 292.9178 18.76 0.3296 2525 +2527 4 353.178 291.8561 19.32 0.1861 2526 +2528 4 353.7442 290.8929 19.6078 0.1939 2527 +2529 4 353.9399 289.8061 20.0869 0.2208 2528 +2530 4 354.0783 288.7307 20.72 0.2025 2529 +2531 4 354.64 288.288 19.32 0.1525 2530 +2532 4 343.1371 308.4258 20.5128 0.2366 2500 +2533 4 290.0921 338.4604 34.3658 0.1388 2424 +2534 4 290.0681 337.6962 32.3868 0.2924 2533 +2535 4 290.1047 337.4777 31.3883 0.1519 2534 +2536 4 289.4103 336.7959 30.8266 0.2706 2535 +2537 4 289.3588 335.8052 31.08 0.2542 2536 +2538 4 289.3176 334.8888 29.9827 0.2542 2537 +2539 4 289.5372 334.2219 28.9201 0.3969 2538 +2540 4 289.3142 333.4131 29.8189 0.2867 2539 +2541 4 289.0122 332.5722 30.6541 0.2061 2540 +2542 4 288.2491 331.9064 30.4088 0.131 2541 +2543 4 288.0958 331.1594 29.0746 0.1525 2542 +2544 4 287.9448 330.5405 29.972 0.2796 2543 +2545 4 287.819 329.7534 28.651 0.2039 2544 +2546 4 287.6222 328.9275 28.2212 0.2415 2545 +2547 4 287.2344 327.9974 28.0 0.2619 2546 +2548 4 286.4061 327.43 28.5463 0.1818 2547 +2549 4 285.3788 327.1485 27.9919 0.2734 2548 +2550 4 284.8766 326.3946 26.9802 0.3022 2549 +2551 4 284.0049 325.8123 26.8688 0.2417 2550 +2552 4 283.4809 325.0962 26.9111 0.2415 2551 +2553 4 283.1148 324.2988 27.1603 0.1528 2552 +2554 4 282.2671 324.0929 26.476 0.117 2553 +2555 4 281.2982 323.752 26.6874 0.1669 2554 +2556 4 280.4196 323.8161 26.63 0.1611 2555 +2557 4 279.5787 323.3745 26.857 0.2408 2556 +2558 4 278.4976 323.0702 26.6916 0.2163 2557 +2559 4 277.6259 322.9489 25.76 0.2853 2558 +2560 4 276.9498 322.2396 26.3388 0.2186 2559 +2561 4 275.9774 322.0703 25.7673 0.2288 2560 +2562 4 274.981 321.9559 24.6616 0.3012 2561 +2563 4 274.2431 321.8312 25.9028 0.2474 2562 +2564 4 273.1449 321.9216 25.716 0.3025 2563 +2565 4 272.4242 322.5028 24.638 0.2892 2564 +2566 4 271.748 322.5508 22.7035 0.2638 2565 +2567 4 270.8477 322.6892 23.0023 0.2004 2566 +2568 4 269.857 322.862 22.4932 0.1907 2567 +2569 4 269.412 322.8162 22.7172 0.2383 2568 +2570 4 268.9544 322.4936 23.8 0.1398 2569 +2571 4 269.2713 322.9512 22.4319 0.24 2568 +2572 4 268.284 323.2006 22.0886 0.2415 2571 +2573 4 267.3356 323.1892 21.7022 0.2669 2572 +2574 4 266.3507 322.989 21.1994 0.2325 2573 +2575 4 265.8301 323.4969 22.8928 0.1907 2574 +2576 4 265.2982 323.9888 21.6639 0.2246 2575 +2577 4 265.1872 324.7564 21.0683 0.1221 2576 +2578 4 264.6083 325.3536 21.2783 0.2289 2577 +2579 4 263.8007 325.6396 21.0157 0.1779 2578 +2580 4 262.6956 325.5515 21.0356 0.3021 2579 +2581 4 261.7072 325.5927 21.4749 0.1282 2580 +2582 4 260.9281 325.7517 21.7305 0.2034 2581 +2583 4 260.0575 325.7746 21.0339 0.1907 2582 +2584 4 259.3448 325.905 21.3052 0.1456 2583 +2585 4 258.7797 326.2139 19.3486 0.1671 2584 +2586 4 257.7661 326.1498 19.1464 0.2288 2585 +2587 4 257.4 326.3821 20.4674 0.1144 2586 +2588 4 256.8108 325.7929 20.6774 0.2033 2587 +2589 4 256.1473 325.2403 19.0994 0.2658 2588 +2590 4 255.0914 325.1648 19.0725 0.2533 2589 +2591 4 254.7345 324.6089 18.1877 0.2615 2590 +2592 4 253.7872 324.1959 17.8245 0.2412 2591 +2593 4 252.9567 323.5198 17.92 0.1234 2592 +2594 4 252.0461 323.0873 17.5305 0.1429 2593 +2595 4 251.1046 323.6079 17.3564 0.2542 2594 +2596 4 250.3266 323.172 16.3918 0.2288 2595 +2597 4 249.3028 322.8757 17.2875 0.1718 2596 +2598 4 248.3166 322.9523 16.9501 0.2277 2597 +2599 4 247.7904 322.9512 15.68 0.2669 2598 +2600 4 289.4446 338.2614 32.2 0.2674 2534 +2601 4 289.7752 339.3104 31.92 0.2669 2600 +2602 4 293.2598 361.4102 35.4603 0.3043 1673 +2603 4 293.5035 361.5601 38.1721 0.1891 2602 +2604 4 294.1533 361.7282 39.6091 0.1271 2603 +2605 4 294.9987 362.4787 39.6463 0.138 2604 +2606 4 295.1612 363.4911 39.6082 0.1811 2605 +2607 4 294.4782 364.3514 39.48 0.2161 2606 +2608 4 293.9394 364.8811 39.8709 0.1565 2607 +2609 4 293.4234 364.4143 42.0932 0.2669 2608 +2610 4 293.436 364.7861 41.6783 0.1652 2609 +2611 4 293.7609 365.6224 41.16 0.1485 2610 +2612 4 294.572 366.2596 41.461 0.1923 2611 +2613 4 295.1589 367.2274 41.7816 0.3514 2612 +2614 4 295.4952 368.2708 42.1366 0.3822 2613 +2615 4 295.6096 369.385 42.5919 0.2795 2614 +2616 4 296.2331 370.0588 43.7928 0.185 2615 +2617 4 296.5317 371.0942 43.7464 0.1497 2616 +2618 4 297.3256 371.8 43.4 0.2288 2617 +2619 4 292.4053 364.936 41.7189 0.3181 2609 +2620 4 291.8802 365.0504 43.143 0.3432 2619 +2621 4 290.7728 365.0321 43.5554 0.286 2620 +2622 4 289.8976 364.7072 42.7706 0.2392 2621 +2623 4 289.1368 364.7358 42.8515 0.2048 2622 +2624 4 288.24 364.1386 43.5266 0.3156 2623 +2625 4 287.3602 363.4614 43.68 0.4449 2624 +2626 4 286.3112 363.5632 44.5917 0.3148 2625 +2627 4 285.3834 363.832 45.808 0.1718 2626 +2628 4 284.3172 363.6776 45.6646 0.2382 2627 +2629 4 283.4443 363.0793 45.7114 0.272 2628 +2630 4 282.5383 362.9866 46.6374 0.194 2629 +2631 4 281.6173 362.6926 46.7496 0.1398 2630 +2632 4 280.8188 363.403 46.6312 0.3362 2631 +2633 4 279.7824 363.5174 47.031 0.3419 2632 +2634 4 279.1463 362.9912 48.0472 0.3432 2633 +2635 4 278.3947 362.4501 48.5447 0.2644 2634 +2636 4 277.5367 362.4192 50.2354 0.1211 2635 +2637 4 276.411 362.4718 50.4969 0.1662 2636 +2638 4 275.3379 362.6789 49.9425 0.2415 2637 +2639 4 274.4902 363.1399 49.84 0.2924 2638 +2640 4 273.877 363.1319 51.6174 0.3344 2639 +2641 4 273.0522 362.5588 51.9669 0.2843 2640 +2642 4 272.2491 362.5588 50.4311 0.2571 2641 +2643 4 271.3774 362.6308 51.52 0.1708 2642 +2644 4 270.2677 362.4215 51.52 0.1165 2643 +2645 4 269.2999 362.1618 50.7111 0.2004 2644 +2646 4 268.7084 362.1801 52.0719 0.2321 2645 +2647 4 267.7589 361.7454 51.333 0.2797 2646 +2648 4 266.7808 361.5418 51.7672 0.2789 2647 +2649 4 266.3209 361.6882 53.6942 0.3985 2648 +2650 4 265.4057 362.0474 53.4526 0.2439 2649 +2651 4 264.574 362.489 53.4411 0.2783 2650 +2652 4 263.954 362.7624 55.3714 0.1711 2651 +2653 4 263.1749 362.3746 55.6721 0.2334 2652 +2654 4 262.5286 362.8642 54.3262 0.2913 2653 +2655 4 261.6545 362.9866 55.9026 0.1447 2654 +2656 4 260.84 363.6559 56.5356 0.1864 2655 +2657 4 260.0243 364.1466 55.44 0.2384 2656 +2658 4 259.3494 364.7072 56.467 0.1685 2657 +2659 4 258.9787 365.532 57.4 0.1652 2658 +2660 4 258.989 366.4575 57.4445 0.323 2659 +2661 4 258.6332 367.1954 58.905 0.2582 2660 +2662 4 258.7213 367.6599 60.2 0.2539 2661 +2663 4 258.2591 368.4241 60.944 0.3108 2662 +2664 4 257.567 367.9161 59.5952 0.1271 2663 +2665 4 257.019 368.1117 58.0854 0.1233 2664 +2666 4 256.3876 368.9011 58.2106 0.1144 2665 +2667 4 256.256 370.0314 58.24 0.1144 2666 +2668 4 255.6863 370.4364 59.7954 0.1144 2667 +2669 4 254.9312 370.5988 61.8593 0.1144 2668 +2670 4 254.1751 370.7624 63.9234 0.1144 2669 +2671 4 253.976 371.7714 64.1962 0.1144 2670 +2672 4 253.7495 372.8788 64.1962 0.1144 2671 +2673 4 253.2553 373.897 64.1962 0.1144 2672 +2674 4 252.1387 373.6487 64.1962 0.1144 2673 +2675 4 251.203 373.3684 65.2669 0.1144 2674 +2676 4 250.401 373.063 67.118 0.1144 2675 +2677 4 249.5041 373.055 68.2506 0.1144 2676 +2678 4 248.4562 373.516 68.2506 0.1144 2677 +2679 4 247.4701 373.6533 68.2506 0.1144 2678 +2680 4 246.6922 372.9715 68.9321 0.1144 2679 +2681 4 245.9669 372.5036 70.7717 0.1144 2680 +2682 4 245.1981 372.0196 72.305 0.1144 2681 +2683 4 244.2074 371.4476 72.305 0.1144 2682 +2684 4 243.2167 370.8745 72.305 0.1144 2683 +2685 4 242.226 370.3025 72.305 0.1144 2684 +2686 4 241.2273 369.8209 72.305 0.1144 2685 +2687 4 240.1439 370.1915 72.305 0.1144 2686 +2688 4 239.0617 370.5622 72.305 0.1144 2687 +2689 4 237.9692 370.8379 72.305 0.1144 2688 +2690 4 237.0174 370.4558 72.8028 0.1144 2689 +2691 4 236.3367 369.6825 74.0242 0.1144 2690 +2692 4 235.6571 368.9091 75.2455 0.1144 2691 +2693 4 234.9925 368.114 76.3596 0.1144 2692 +2694 4 234.4811 367.0913 76.3596 0.1144 2693 +2695 4 233.9709 366.0674 76.3596 0.1144 2694 +2696 4 233.5018 365.0252 76.3596 0.1144 2695 +2697 4 233.0854 363.9602 76.3596 0.1144 2696 +2698 4 232.6679 362.894 76.3596 0.1144 2697 +2699 4 232.2503 361.8289 76.3596 0.1144 2698 +2700 4 231.8694 360.7547 76.3596 0.1144 2699 +2701 4 231.4953 359.8132 76.3596 0.117 2700 +2702 4 230.3661 359.6256 76.3596 0.1303 2701 +2703 4 229.3628 359.2309 76.3596 0.1511 2702 +2704 4 228.665 358.3237 76.3596 0.1907 2703 +2705 4 295.0822 364.602 38.6672 0.3194 2607 +2706 4 295.9951 364.7495 37.52 0.2414 2705 +2707 4 296.1976 363.7828 36.4311 0.2886 2706 +2708 4 296.5717 363.3996 38.5311 0.1894 2707 +2709 4 297.3828 363.1056 39.76 0.1186 2708 +2710 4 298.3975 362.7624 39.5097 0.2107 2709 +2711 4 299.0691 363.3275 38.36 0.1144 2710 +2712 4 300.165 363.4488 38.36 0.157 2711 +2713 4 301.2747 363.2978 38.5571 0.2108 2712 +2714 4 302.3146 363.1159 39.48 0.2691 2713 +2715 4 303.1978 362.608 39.0286 0.2902 2714 +2716 4 303.9963 362.2682 38.0766 0.4112 2715 +2717 4 304.5751 361.7923 37.8834 0.2246 2716 +2718 4 304.8188 362.076 35.9254 0.3115 2717 +2719 4 305.7146 361.9616 35.9327 0.127 2718 +2720 4 306.4856 361.6996 35.9904 0.2119 2719 +2721 4 307.172 361.4891 37.3514 0.1144 2720 +2722 4 307.8264 360.8576 37.52 0.2955 2721 +2723 4 308.0769 359.8395 37.0423 0.3545 2722 +2724 4 308.7427 359.5375 38.6562 0.1591 2723 +2725 4 309.3445 359.0455 40.241 0.2827 2724 +2726 4 309.9233 358.7515 41.9989 0.1276 2725 +2727 4 310.8511 358.6932 41.1401 0.1282 2726 +2728 4 311.716 359.0913 40.4001 0.3788 2727 +2729 4 312.8074 359.1016 41.0239 0.3432 2728 +2730 4 313.8267 359.0536 41.44 0.2796 2729 +2731 4 314.8162 358.9872 41.8132 0.2796 2730 +2732 4 315.8939 358.9174 42.6574 0.2288 2731 +2733 4 317.0104 358.9849 42.84 0.2804 2732 +2734 4 318.1109 358.8522 42.707 0.3885 2733 +2735 4 319.1028 359.1794 41.7267 0.3426 2734 +2736 4 319.8269 359.47 43.0469 0.2311 2735 +2737 4 320.7684 359.7708 43.5072 0.2161 2736 +2738 4 321.5509 359.4642 44.3794 0.1729 2737 +2739 4 322.5142 359.1725 44.3442 0.2288 2738 +2740 4 323.1869 358.4186 43.4 0.1993 2739 +2741 4 323.9019 357.7288 42.9044 0.3753 2740 +2742 4 324.8422 357.8672 43.6657 0.3258 2741 +2743 4 325.5321 357.9931 42.383 0.3363 2742 +2744 4 326.358 358.3466 43.6738 0.2719 2743 +2745 4 326.8648 358.6749 42.84 0.2354 2744 +2746 4 327.9356 358.811 42.56 0.2541 2745 +2747 4 328.7467 359.2938 41.8317 0.2001 2746 +2748 4 329.8358 359.3304 42.0885 0.3305 2747 +2749 4 330.6274 359.3579 43.6836 0.237 2748 +2750 4 331.2578 360.0225 44.8 0.2979 2749 +2751 4 332.2325 360.4744 44.8 0.3162 2750 +2752 4 333.2895 360.8084 44.564 0.2288 2751 +2753 4 334.1121 361.3221 44.5886 0.2891 2752 +2754 4 334.7241 362.0302 44.24 0.2583 2753 +2755 4 335.0776 362.5336 45.6095 0.3418 2754 +2756 4 335.9356 362.9317 45.92 0.2924 2755 +2757 4 336.9389 363.4156 45.9584 0.3442 2756 +2758 4 337.7546 364.1386 46.1555 0.4909 2757 +2759 4 338.6114 364.6889 46.0813 0.2382 2758 +2760 4 339.156 365.1534 46.8138 0.3051 2759 +2761 4 340.0975 365.4634 47.2567 0.2929 2760 +2762 4 340.8823 365.6075 45.7307 0.3305 2761 +2763 4 341.5 366.0823 47.2892 0.3561 2762 +2764 4 342.4553 366.6566 47.1313 0.3167 2763 +2765 4 343.4551 367.1256 47.3796 0.2679 2764 +2766 4 344.447 367.5089 47.971 0.3038 2765 +2767 4 345.3828 367.8212 47.9027 0.2796 2766 +2768 4 346.4501 368.1129 47.6 0.2129 2767 +2769 4 347.5575 368.2467 47.2335 0.1539 2768 +2770 4 348.4521 368.638 47.5264 0.2593 2769 +2771 4 349.3341 369.1688 47.9419 0.2287 2770 +2772 4 350.4106 369.1688 48.16 0.2039 2771 +2773 4 351.0616 369.3232 46.76 0.3025 2772 +2774 4 352.098 369.7271 47.0159 0.1907 2773 +2775 4 353.1471 370.1481 46.9907 0.1837 2774 +2776 4 354.0611 370.5405 45.92 0.128 2775 +2777 4 354.8596 370.5416 47.1531 0.1481 2776 +2778 4 355.3264 371.0964 47.3718 0.144 2777 +2779 4 355.8366 371.7908 46.3669 0.1679 2778 +2780 4 356.3411 372.5676 47.7907 0.1644 2779 +2781 4 356.9246 373.4702 48.5654 0.1993 2780 +2782 4 357.5812 374.088 48.6797 0.2343 2781 +2783 4 357.8569 374.9792 49.4337 0.2916 2782 +2784 4 358.3054 375.7891 48.1631 0.2389 2783 +2785 4 358.8282 376.3302 49.5362 0.2258 2784 +2786 4 359.3647 377.0532 50.267 0.1917 2785 +2787 4 360.0534 377.8197 50.7931 0.1591 2786 +2788 4 360.6643 378.5462 51.2117 0.2669 2787 +2789 4 361.3564 379.3996 50.96 0.2916 2788 +2790 4 361.8575 380.3217 51.1081 0.2303 2789 +2791 4 362.195 381.0584 50.2555 0.1271 2790 +2792 4 362.8825 381.5869 49.28 0.1832 2791 +2793 4 363.6696 382.1029 50.2001 0.1144 2792 +2794 4 364.348 382.2607 52.3382 0.1552 2793 +2795 4 364.9852 383.1164 52.7881 0.2288 2794 +2796 4 365.9839 383.5386 53.0956 0.2622 2795 +2797 4 366.906 384.1403 53.503 0.2134 2796 +2798 4 367.7788 384.6265 53.2258 0.1316 2797 +2799 4 368.479 385.2763 54.4043 0.2344 2798 +2800 4 369.1002 386.0943 55.295 0.1384 2799 +2801 4 370.0108 386.6137 54.6507 0.2095 2800 +2802 4 371.0678 386.7624 54.7016 0.1652 2801 +2803 4 372.0277 387.1262 55.3468 0.2288 2802 +2804 4 372.833 387.061 56.0515 0.1559 2803 +2805 4 373.6945 387.1662 56.84 0.1255 2804 +2806 4 374.4701 387.9933 56.84 0.1144 2805 +2807 4 375.542 388.2358 57.12 0.1287 2806 +2808 4 376.2124 389.119 56.6913 0.1245 2807 +2809 4 376.8599 390.0136 57.1463 0.1144 2808 +2810 4 377.5566 390.8545 57.4 0.1682 2809 +2811 4 378.3906 391.5855 57.4781 0.1454 2810 +2812 4 379.4717 391.7502 57.96 0.1144 2811 +2813 4 380.5848 391.947 57.96 0.1144 2812 +2814 4 381.3501 392.6757 58.655 0.2223 2813 +2815 4 382.1635 393.2889 59.1808 0.1556 2814 +2816 4 382.4346 393.9936 60.5164 0.1144 2815 +2817 4 383.5615 393.9936 60.76 0.1144 2816 +2818 4 384.4984 394.251 61.0137 0.1144 2817 +2819 4 384.4984 395.3939 61.04 0.1144 2818 +2820 4 384.5545 396.5093 61.3186 0.1144 2819 +2821 4 385.5612 396.7392 61.768 0.1144 2820 +2822 4 386.2796 397.381 62.344 0.1721 2821 +2823 4 387.339 397.7253 62.16 0.1398 2822 +2824 4 387.8412 398.1944 62.72 0.1144 2823 +2825 4 388.2313 399.1336 63.4063 0.1313 2824 +2826 4 389.0607 399.256 64.6979 0.1144 2825 +2827 4 389.9496 399.3944 65.9674 0.1652 2826 +2828 4 390.4232 400.1712 66.0232 0.1144 2827 +2829 4 391.0146 400.2524 67.2 0.1353 2828 +2830 4 391.8989 400.559 68.278 0.1144 2829 +2831 4 392.9091 400.7421 69.5159 0.1144 2830 +2832 4 393.782 401.2145 70.2778 0.1144 2831 +2833 4 394.4386 402.1515 70.2778 0.1144 2832 +2834 4 395.0941 403.0884 70.2778 0.1144 2833 +2835 4 395.8297 403.959 70.2778 0.1144 2834 +2836 4 396.6385 404.7678 70.2778 0.1144 2835 +2837 4 397.4977 405.4828 70.835 0.1144 2836 +2838 4 398.3637 406.1818 71.4823 0.1144 2837 +2839 4 399.2297 406.8808 72.1297 0.1144 2838 +2840 4 400.0545 407.6598 72.305 0.1144 2839 +2841 4 400.8633 408.4686 72.305 0.1144 2840 +2842 4 401.6733 409.2443 71.9141 0.1144 2841 +2843 4 402.4844 409.9879 71.1505 0.1144 2842 +2844 4 403.2943 410.7326 70.3867 0.1144 2843 +2845 4 404.1054 411.4762 69.6231 0.1144 2844 +2846 4 404.8616 412.1798 69.099 0.1144 2845 +2847 4 405.23 412.3399 71.3798 0.125 2846 +2848 4 405.6384 412.7632 73.3477 0.2874 2847 +2849 4 406.4438 413.2139 74.3761 0.3003 2848 +2850 4 407.5317 413.4233 74.76 0.1546 2849 +2851 4 408.6448 413.4439 75.04 0.1528 2850 +2852 4 409.7293 413.548 75.5255 0.2313 2851 +2853 4 410.7761 413.3901 76.2818 0.2598 2852 +2854 4 411.4076 413.874 77.84 0.2288 2853 +2855 4 412.0173 414.5913 78.8379 0.2595 2854 +2856 4 412.9199 414.9517 77.7151 0.352 2855 +2857 4 413.3409 415.6255 76.2947 0.3201 2856 +2858 4 413.8317 416.1872 77.2131 0.3327 2857 +2859 4 414.3568 416.0728 77.0 0.1525 2858 +2860 3 302.6715 383.7216 32.6642 0.3043 1 +2861 3 302.453 384.821 33.2063 0.2806 2860 +2862 3 302.3157 385.8575 34.3378 0.2415 2861 +2863 3 302.7402 386.5896 35.1868 0.1983 2862 +2864 3 303.7206 387.0827 35.6171 0.2476 2863 +2865 3 304.8131 386.8367 35.7064 0.3018 2864 +2866 3 305.8759 386.5141 35.0546 0.317 2865 +2867 3 306.9901 386.4066 34.4957 0.3299 2866 +2868 3 308.0026 386.775 35.352 0.3179 2867 +2869 3 308.6615 387.6307 36.2673 0.3178 2868 +2870 3 309.3959 388.3148 36.3852 0.2726 2869 +2871 3 310.0446 389.254 36.4014 0.2669 2870 +2872 3 310.7642 390.1418 36.4059 0.2782 2871 +2873 3 311.6862 390.811 36.4297 0.2568 2872 +2874 3 312.5694 391.5363 36.5445 0.2542 2873 +2875 3 313.4583 392.1415 37.4556 0.2542 2874 +2876 3 314.1893 392.9457 38.3135 0.242 2875 +2877 3 315.132 393.4513 37.4072 0.1916 2876 +2878 3 315.9728 394.108 36.4 0.1652 2877 +2879 3 308.9109 388.2667 36.2933 0.3758 2869 +2880 3 308.2519 388.841 37.5782 0.2585 2879 +2881 3 307.3516 389.3867 37.8 0.1144 2880 +2882 3 306.6446 390.1017 37.8 0.2186 2881 +2883 3 306.1813 391.0581 37.5416 0.2239 2882 +2884 3 305.5601 391.8223 37.6449 0.3075 2883 +2885 3 304.6358 392.3771 37.8 0.2925 2884 +2886 3 303.8636 393.1768 37.5522 0.2709 2885 +2887 3 303.0056 393.6916 38.5846 0.3178 2886 +2888 3 302.477 394.0085 40.32 0.2429 2887 +2889 3 301.5984 394.5347 40.5866 0.1743 2888 +2890 3 300.8731 394.9649 41.5528 0.2241 2889 +2891 3 301.3193 394.8665 43.8623 0.2755 2890 +2892 3 300.9109 393.9433 44.52 0.2965 2891 +2893 3 300.2062 393.4216 43.2432 0.3432 2892 +2894 3 300.1856 392.7169 41.7766 0.3432 2893 +2895 3 299.7246 391.7639 42.0 0.2415 2894 +2896 3 299.7257 390.6943 41.72 0.388 2895 +2897 3 299.0851 390.2184 43.1973 0.2161 2896 +2898 3 298.9249 389.8535 45.395 0.1907 2897 +2899 3 298.9855 388.7701 45.64 0.2601 2898 +2900 3 299.0874 387.9716 44.5883 0.2619 2899 +2901 3 299.156 387.1593 45.3986 0.3046 2900 +2902 3 298.4925 386.4535 46.422 0.2034 2901 +2903 3 297.7397 385.8689 47.04 0.2873 2902 +2904 3 297.0545 385.3255 46.494 0.3146 2903 +2905 3 296.6609 384.8427 47.248 0.1926 2904 +2906 3 296.5374 384.2627 48.6836 0.1447 2905 +2907 3 296.2971 383.804 46.7191 0.1365 2906 +2908 3 295.6222 383.1256 46.5027 0.2288 2907 +2909 3 294.9507 382.5147 46.6771 0.4243 2908 +2910 3 294.2093 381.7013 47.2125 0.4117 2909 +2911 3 293.817 380.9142 48.72 0.2415 2910 +2912 3 293.0104 379.9007 48.72 0.2432 2911 +2913 3 292.3812 378.9855 48.974 0.2648 2912 +2914 3 292.0907 377.9684 48.841 0.2299 2913 +2915 3 291.9488 377.3358 50.96 0.312 2914 +2916 3 291.9614 376.2467 51.2392 0.3431 2915 +2917 3 291.3779 375.4047 50.68 0.2985 2916 +2918 3 290.6023 374.7206 50.9846 0.278 2917 +2919 3 290.7144 374.1681 52.9108 0.2835 2918 +2920 3 290.8048 373.2792 54.1652 0.1481 2919 +2921 3 290.385 372.6008 53.3868 0.2161 2920 +2922 3 290.3472 372.0299 52.64 0.2583 2921 +2923 3 290.1184 371.085 53.436 0.3193 2922 +2924 3 289.9422 370.124 54.4421 0.2892 2923 +2925 3 289.7535 369.2477 55.1698 0.3225 2924 +2926 3 289.98 368.5728 57.2592 0.2831 2925 +2927 3 290.4238 367.987 58.52 0.2161 2926 +2928 3 290.6446 367.7274 58.688 0.3051 2927 +2929 3 291.6262 367.3212 59.36 0.3384 2928 +2930 3 292.4968 366.6154 59.4339 0.2977 2929 +2931 3 292.872 365.6533 59.9701 0.1612 2930 +2932 3 293.6648 365.1648 61.04 0.1652 2931 +2933 3 290.5611 367.8749 59.4359 0.1503 2927 +2934 3 290.393 367.0638 60.5357 0.1144 2933 +2935 3 289.7272 366.5376 61.3404 0.2034 2934 +2936 3 289.3679 365.8306 61.8419 0.2182 2935 +2937 3 289.9411 365.254 62.519 0.2288 2936 +2938 3 290.536 364.9017 64.3983 0.2041 2937 +2939 3 290.1745 363.9339 63.84 0.1714 2938 +2940 3 289.6574 363.0793 64.2852 0.1447 2939 +2941 3 289.3176 362.2076 64.68 0.1253 2940 +2942 3 289.3325 361.639 63.1912 0.1261 2941 +2943 3 289.1494 361.4674 60.4593 0.1241 2942 +2944 3 288.9675 361.2958 57.7273 0.1222 2943 +2945 3 288.7845 361.123 54.9956 0.1202 2944 +2946 3 288.6015 360.9514 52.2637 0.1183 2945 +2947 3 288.4184 360.7798 49.5317 0.1163 2946 +2948 3 288.2365 360.6082 46.8 0.1144 2947 +2949 3 287.5444 359.7159 46.7289 0.1144 2948 +2950 3 286.8019 358.8591 46.7149 0.1144 2949 +2951 3 285.8307 358.2539 46.7561 0.1144 2950 +2952 3 284.9487 357.5858 46.8082 0.1144 2951 +2953 3 284.332 356.7312 46.858 0.1144 2952 +2954 3 283.2922 356.2919 46.6906 0.1391 2953 +2955 3 282.7934 355.2703 46.809 0.1907 2954 +2956 3 289.9296 372.4864 52.08 0.1144 2921 +2957 3 288.8714 372.5619 51.6617 0.2465 2956 +2958 3 287.8865 372.944 51.52 0.2099 2957 +2959 3 287.144 373.0584 52.561 0.2852 2958 +2960 3 286.4599 372.944 54.04 0.3556 2959 +2961 3 285.3445 372.9818 53.7656 0.2773 2960 +2962 3 284.7416 372.9314 55.4616 0.2169 2961 +2963 3 284.1078 372.6008 56.56 0.1401 2962 +2964 3 283.6399 373.0584 57.862 0.3485 2963 +2965 3 282.5966 373.2163 57.9992 0.5607 2964 +2966 3 282.1001 374.0686 58.8 0.3448 2965 +2967 3 281.2547 373.9816 60.0006 0.1652 2966 +2968 3 281.1449 374.2024 61.9125 0.2333 2967 +2969 3 281.0591 374.6577 63.9733 0.2866 2968 +2970 3 280.9344 375.7651 64.3952 0.1858 2969 +2971 3 280.4367 376.5899 65.0448 0.125 2970 +2972 3 280.3944 377.6733 65.52 0.1158 2971 +2973 3 280.7788 378.6297 65.728 0.13 2972 +2974 3 280.6209 379.6959 65.7233 0.2258 2973 +2975 3 279.8933 380.3114 66.6324 0.2405 2974 +2976 3 279.7641 381.2083 65.8182 0.3782 2975 +2977 3 279.9276 381.9633 67.1437 0.3173 2976 +2978 3 279.8773 382.6302 68.7977 0.2118 2977 +2979 3 279.5032 383.5775 69.1964 0.1144 2978 +2980 3 279.2527 384.5945 68.7786 0.1861 2979 +2981 3 279.4106 384.9766 71.2944 0.1321 2980 +2982 3 278.7642 385.7099 71.12 0.2981 2981 +2983 3 277.6488 385.8712 70.84 0.3305 2982 +2984 3 293.0894 380.5894 46.76 0.1271 2911 +2985 3 291.9614 380.7232 46.76 0.1538 2984 +2986 3 290.8586 380.8193 46.1504 0.2162 2985 +2987 3 289.7718 380.5916 46.0222 0.2161 2986 +2988 3 288.6781 380.6454 46.569 0.2034 2987 +2989 3 287.843 381.0698 47.3659 0.2164 2988 +2990 3 287.4689 381.2952 49.56 0.1144 2989 +2991 3 286.4198 381.2895 49.474 0.3917 2990 +2992 3 285.7987 381.1362 47.6291 0.2502 2991 +2993 3 285.1889 381.2609 49.3774 0.3268 2992 +2994 3 284.2382 381.2849 50.0567 0.1769 2993 +2995 3 283.5496 381.4531 50.9362 0.1191 2994 +2996 3 282.5783 381.7116 51.0138 0.2955 2995 +2997 3 281.5544 381.7048 50.3496 0.2034 2996 +2998 3 281.3508 382.525 50.9832 0.2532 2997 +2999 3 280.6404 383.2022 51.52 0.1144 2998 +3000 3 279.7583 383.4688 52.2348 0.1399 2999 +3001 3 278.7493 383.3075 51.8476 0.1907 3000 +3002 3 278.111 383.0226 49.8753 0.1152 3001 +3003 3 277.6488 383.4665 51.2845 0.1317 3002 +3004 3 277.269 383.2354 52.92 0.119 3003 +3005 3 276.6078 383.4059 54.0921 0.1398 3004 +3006 3 275.6674 383.4791 53.4988 0.2567 3005 +3007 3 274.9432 383.0512 52.4569 0.241 3006 +3008 3 274.1871 383.0192 52.7344 0.3432 3007 +3009 3 273.9171 383.5775 54.32 0.2651 3008 +3010 3 272.8348 383.5695 54.6 0.1894 3009 +3011 3 272.2182 382.9254 53.3431 0.2984 3010 +3012 3 271.2584 382.7824 53.4733 0.3298 3011 +3013 3 270.858 382.668 55.1729 0.3138 3012 +3014 3 270.3764 382.3179 53.3095 0.329 3013 +3015 3 269.4852 381.9164 53.8037 0.2201 3014 +3016 3 268.8514 381.1797 54.6538 0.1144 3015 +3017 3 268.3366 380.6866 56.0804 0.2325 3016 +3018 3 267.4592 380.0471 55.8768 0.2652 3017 +3019 3 266.7042 379.999 54.04 0.1525 3018 +3020 3 266.0303 379.4648 53.48 0.3377 3019 +3021 3 265.17 379.1811 53.004 0.2123 3020 +3022 3 264.407 378.7555 54.061 0.2164 3021 +3023 3 263.5181 378.3059 54.628 0.3394 3022 +3024 3 262.9816 377.3209 55.0556 0.3694 3023 +3025 3 262.4405 376.4321 54.5476 0.3101 3024 +3026 3 261.9737 375.55 54.36 0.3044 3025 +3027 3 261.1878 375.0798 55.421 0.1761 3026 +3028 3 260.8126 374.1749 54.5619 0.1209 3027 +3029 3 260.1662 373.3764 54.5667 0.2115 3028 +3030 3 259.3368 372.8193 53.76 0.2829 3029 +3031 3 258.6927 371.9464 54.1013 0.3026 3030 +3032 3 257.9125 371.228 53.5413 0.1691 3031 +3033 3 257.0351 370.7372 52.9477 0.3278 3032 +3034 3 256.3155 370.259 53.7499 0.2712 3033 +3035 3 255.5444 369.5978 53.1342 0.2398 3034 +3036 3 254.8832 368.9434 53.3448 0.3489 3035 +3037 3 254.3673 368.2639 52.169 0.2641 3036 +3038 3 253.7838 367.6164 53.48 0.1221 3037 +3039 3 252.9087 366.9288 53.48 0.2652 3038 +3040 3 252.0873 366.1498 53.1748 0.2877 3039 +3041 3 251.2556 365.3719 53.2 0.3013 3040 +3042 3 250.4868 364.5802 53.7205 0.2342 3041 +3043 3 249.5899 363.9316 53.739 0.1439 3042 +3044 3 248.6724 363.5632 53.872 0.2132 3043 +3045 3 247.9162 363.0621 53.8311 0.3348 3044 +3046 3 247.2264 362.3254 53.9406 0.2788 3045 +3047 3 246.4405 361.6115 54.3077 0.1448 3046 +3048 3 245.6786 360.813 54.04 0.1398 3047 +3049 3 245.2095 359.7937 54.243 0.1503 3048 +3050 3 244.53 358.9243 54.6 0.1445 3049 +3051 3 243.9477 358.0251 54.642 0.2542 3050 +3052 3 243.5576 357.3318 53.5553 0.1221 3051 +3053 3 243.275 356.6042 53.3238 0.1588 3052 +3054 3 242.8289 356.0322 54.6244 0.2288 3053 +3055 3 242.2992 355.1502 54.899 0.2669 3054 +3056 3 242.1207 354.2751 56.28 0.3432 3055 +3057 3 241.6357 353.3679 56.0123 0.2643 3056 +3058 3 240.8269 352.6094 56.089 0.1144 3057 +3059 3 240.645 351.7148 57.12 0.1144 3058 +3060 3 239.8922 351.2366 57.68 0.1144 3059 +3061 3 239.0422 350.5399 57.9356 0.1144 3060 +3062 3 238.8214 349.4417 57.68 0.1144 3061 +3063 3 238.7517 348.3057 57.68 0.1144 3062 +3064 3 238.0492 347.5529 57.68 0.1144 3063 +3065 3 237.1283 346.9249 57.68 0.1144 3064 +3066 3 236.2383 346.4226 57.68 0.1246 3065 +3067 3 236.4648 345.488 58.24 0.1652 3066 +3068 3 301.8021 385.9673 32.2 0.2793 2862 +3069 3 300.9864 386.2281 32.3224 0.2621 3068 +3070 3 301.0562 386.5576 34.214 0.285 3069 +3071 3 300.3 386.4604 35.5289 0.2288 3070 +3072 3 299.9568 386.4512 33.717 0.1441 3071 +3073 3 299.5209 387.3081 32.7891 0.1158 3072 +3074 3 299.2372 388.3583 33.0509 0.1652 3073 +3075 3 298.5074 388.6809 34.4084 0.2413 3074 +3076 3 297.5086 388.6202 34.2768 0.2446 3075 +3077 3 296.7708 389.1202 34.5391 0.2262 3076 +3078 3 296.2903 389.8203 35.3847 0.2984 3077 +3079 3 295.8018 390.6794 35.3133 0.2512 3078 +3080 3 295.0307 391.0524 35.399 0.1151 3079 +3081 3 294.5022 391.6598 36.2202 0.1943 3080 +3082 3 293.8536 392.4606 35.6334 0.2314 3081 +3083 3 293.0345 392.9308 35.6964 0.1635 3082 +3084 3 292.705 393.4067 37.413 0.1756 3083 +3085 3 291.8115 393.536 36.2429 0.2452 3084 +3086 3 291.0908 394.0451 36.7394 0.2924 3085 +3087 3 290.3232 394.8676 36.6402 0.3487 3086 +3088 3 289.7969 395.8206 37.4128 0.3686 3087 +3089 3 289.337 396.7335 38.3197 0.3618 3088 +3090 3 288.8749 397.7528 37.8179 0.3355 3089 +3091 3 288.1816 398.6394 37.6398 0.3178 3090 +3092 3 287.2538 399.1999 38.1455 0.329 3091 +3093 3 286.1991 399.5843 38.6672 0.3305 3092 +3094 3 285.3765 400.3703 38.8872 0.3178 3093 +3095 3 285.1351 401.0841 39.4862 0.309 3094 +3096 3 284.8903 402.1469 40.3077 0.2871 3095 +3097 3 284.7382 403.2623 40.7478 0.2887 3096 +3098 3 284.2932 404.2907 40.6952 0.3016 3097 +3099 3 283.7429 405.2654 40.1495 0.3235 3098 +3100 3 283.259 406.287 40.1386 0.3119 3099 +3101 3 282.9501 407.3212 40.9646 0.3051 3100 +3102 3 282.3644 408.019 42.4886 0.2759 3101 +3103 3 281.4675 408.6105 43.2656 0.2569 3102 +3104 3 280.4505 409.0326 43.9835 0.2241 3103 +3105 3 279.3854 409.4147 44.3092 0.2161 3104 +3106 3 278.373 409.1344 45.0106 0.2385 3105 +3107 3 277.6271 408.3325 45.7288 0.2879 3106 +3108 3 276.9624 407.6324 46.8222 0.3305 3107 +3109 3 277.0768 407.1382 48.0374 0.2994 3108 +3110 3 276.6089 406.4815 48.4624 0.2034 3109 +3111 3 276.4545 405.9964 46.727 0.3432 3110 +3112 3 276.5071 405.3627 48.1037 0.2949 3111 +3113 3 276.7267 405.0218 50.1592 0.166 3112 +3114 3 276.562 404.6271 52.624 0.2542 3113 +3115 3 276.5208 403.6043 52.08 0.2632 3114 +3116 3 277.0173 402.9168 51.5032 0.1965 3115 +3117 3 277.42 402.0508 50.9886 0.1631 3116 +3118 3 277.5344 401.7122 53.496 0.2886 3117 +3119 3 277.4978 400.7695 54.4981 0.3625 3118 +3120 3 277.42 399.9573 56.3069 0.191 3119 +3121 3 277.4852 399.2457 55.7511 0.2288 3120 +3122 3 276.8572 398.4483 55.5302 0.2458 3121 +3123 3 277.2415 398.112 56.7157 0.1652 3122 +3124 3 277.0082 397.6201 57.134 0.2924 3123 +3125 3 276.1616 397.4256 56.0 0.1398 3124 +3126 3 277.3559 397.9896 57.1217 0.1461 3123 +3127 3 277.0711 397.4256 58.8 0.3184 3126 +3128 3 275.9694 397.3112 58.4248 0.3432 3127 +3129 3 275.4638 398.0354 59.08 0.1289 3128 +3130 3 274.8105 398.1566 60.4094 0.1674 3129 +3131 3 274.258 398.4769 61.0156 0.4399 3130 +3132 3 273.2593 398.9368 60.727 0.314 3131 +3133 3 272.7307 399.6736 59.5501 0.2247 3132 +3134 3 272.2377 399.9321 60.3288 0.1488 3133 +3135 3 272.272 399.828 62.9796 0.2043 3134 +3136 3 271.4003 399.566 63.1621 0.4282 3135 +3137 3 270.3455 399.4711 63.7241 0.1451 3136 +3138 3 269.3342 399.256 64.12 0.1144 3137 +3139 3 268.1902 399.256 64.12 0.121 3138 +3140 3 267.0474 399.2182 64.12 0.1525 3139 +3141 3 266.0852 398.6337 64.12 0.2262 3140 +3142 3 265.1517 398.7206 63.56 0.1864 3141 +3143 3 264.4699 399.0581 64.496 0.1398 3142 +3144 3 263.4094 399.129 65.2028 0.1169 3143 +3145 3 262.4061 398.7984 65.0188 0.2034 3144 +3146 3 261.3903 398.9437 65.6172 0.2879 3145 +3147 3 260.4888 399.5065 65.8 0.2272 3146 +3148 3 260.2108 400.2673 66.743 0.2918 3147 +3149 3 259.4592 399.8532 67.3868 0.178 3148 +3150 3 276.9075 407.3876 49.266 0.3917 3108 +3151 3 277.1637 408.122 50.85 0.2542 3150 +3152 3 277.4795 409.1161 51.45 0.2924 3151 +3153 3 278.1819 409.8506 51.254 0.3254 3152 +3154 3 278.8443 409.6069 51.2011 0.2288 3153 +3155 3 279.819 409.6046 51.8115 0.3988 3154 +3156 3 280.4825 409.7259 53.2549 0.3432 3155 +3157 3 280.6324 410.4203 54.3906 0.1144 3156 +3158 3 279.9036 411.1708 55.16 0.2471 3157 +3159 3 279.708 412.1638 55.4663 0.394 3158 +3160 3 279.4838 413.1682 56.0899 0.3137 3159 +3161 3 279.8121 413.9804 56.9985 0.475 3160 +3162 3 279.7103 414.5719 58.175 0.2853 3161 +3163 3 280.2239 415.518 58.5108 0.1996 3162 +3164 3 280.6724 416.5327 58.0042 0.1301 3163 +3165 3 281.5716 417.1562 57.96 0.1144 3164 +3166 3 281.7466 418.2567 58.1955 0.2175 3165 +3167 3 281.6825 419.3309 59.005 0.3222 3166 +3168 3 281.686 420.3639 59.36 0.3051 3167 +3169 3 281.7832 421.2116 59.0996 0.286 3168 +3170 3 282.1424 422.1749 59.36 0.4296 3169 +3171 3 282.8403 422.9746 59.64 0.3432 3170 +3172 3 282.7247 423.9229 58.3181 0.287 3171 +3173 3 282.3518 424.8027 57.3266 0.1763 3172 +3174 3 282.1207 425.7625 56.2884 0.2231 3173 +3175 3 282.1196 426.4935 57.9961 0.1258 3174 +3176 3 282.6103 426.8573 60.1488 0.3085 3175 +3177 3 282.9272 427.4522 61.8425 0.3381 3176 +3178 3 282.568 428.3594 63.1408 0.3267 3177 +3179 3 282.7888 429.2791 63.936 0.1522 3178 +3180 3 282.6881 430.3293 64.412 0.1867 3179 +3181 3 282.3598 431.185 64.4232 0.2946 3180 +3182 3 282.1104 431.852 62.7718 0.2859 3181 +3183 3 281.6963 432.432 63.6236 0.1947 3182 +3184 3 281.4068 433.0601 65.4696 0.3099 3183 +3185 3 281.1952 433.9158 64.9006 0.2322 3184 +3186 3 280.7845 434.2887 65.6645 0.1525 3185 +3187 3 280.8543 435.0907 66.6658 0.1271 3186 +3188 3 280.8383 436.0711 66.1097 0.1867 3187 +3189 3 280.9767 436.9233 66.64 0.1802 3188 +3190 3 281.122 437.7951 68.0103 0.1265 3189 +3191 3 281.3199 438.8395 67.345 0.1144 3190 +3192 3 281.6528 439.3624 65.5085 0.1144 3191 +3193 3 281.0808 439.9138 64.328 0.2288 3192 +3194 3 281.7786 440.5864 64.6702 0.2454 3193 +3195 3 281.9834 441.6767 64.43 0.3173 3194 +3196 3 282.4616 442.6914 64.4221 0.3432 3195 +3197 3 283.1858 443.5208 64.96 0.3432 3196 +3198 3 283.7417 444.4703 64.757 0.2963 3197 +3199 3 284.316 445.4084 64.2502 0.208 3198 +3200 3 284.5185 446.4357 63.28 0.2288 3199 +3201 3 285.3079 446.8796 64.045 0.2924 3200 +3202 3 285.825 447.836 63.9262 0.2924 3201 +3203 3 286.3661 448.7523 63.635 0.2796 3202 +3204 3 286.8008 449.7064 64.12 0.1652 3203 +3205 3 284.7508 401.0761 36.9678 0.2938 3094 +3206 3 283.8539 401.417 37.3548 0.1907 3205 +3207 3 282.9249 402.005 37.24 0.2796 3206 +3208 3 282.1081 402.5358 36.5078 0.2034 3207 +3209 3 281.2879 403.117 36.12 0.1657 3208 +3210 3 280.328 403.1456 37.1675 0.1398 3209 +3211 3 279.6714 403.1124 35.2377 0.196 3210 +3212 3 278.7356 402.9168 34.7536 0.1956 3211 +3213 3 278.0069 403.26 35.84 0.3232 3212 +3214 3 276.9635 403.4888 36.5394 0.178 3213 +3215 3 275.887 403.7531 36.68 0.1144 3214 +3216 3 275.3539 404.404 36.1544 0.1248 3215 +3217 3 274.9066 404.9199 37.7216 0.1525 3216 +3218 3 274.4673 405.4004 35.84 0.2354 3217 +3219 3 273.7363 406.1074 36.1598 0.2691 3218 +3220 3 272.9321 406.1234 35.84 0.2034 3219 +3221 3 272.089 406.644 35.0672 0.2637 3220 +3222 3 271.1715 407.2182 35.6367 0.1726 3221 +3223 3 270.4164 407.8349 35.6793 0.236 3222 +3224 3 269.6637 407.979 33.9052 0.3051 3223 +3225 3 268.9029 408.2593 32.48 0.179 3224 +3226 3 268.0472 408.8576 32.7146 0.1629 3225 +3227 3 266.9375 408.7512 33.04 0.3062 3226 +3228 3 265.9365 408.6139 32.0146 0.2568 3227 +3229 3 264.9527 408.6974 31.5182 0.2667 3228 +3230 3 263.9059 408.7318 31.4266 0.2288 3229 +3231 3 262.8088 408.8656 31.7685 0.2007 3230 +3232 3 261.6831 408.8141 31.92 0.1652 3231 +3233 3 260.5597 408.932 31.619 0.1693 3232 +3234 3 259.4352 409.075 31.2483 0.14 3233 +3235 3 258.6001 409.679 31.0845 0.1171 3234 +3236 3 257.5968 410.1572 31.0845 0.1144 3235 +3237 3 256.5248 410.5576 31.0845 0.1144 3236 +3238 3 255.4552 410.9614 31.0845 0.1144 3237 +3239 3 254.3135 411.0255 31.0845 0.1144 3238 +3240 3 253.1866 411.2074 31.0845 0.1144 3239 +3241 3 252.0953 411.522 31.0845 0.1173 3240 +3242 3 251.0794 412.0505 31.0845 0.1292 3241 +3243 3 250.075 412.5893 31.019 0.1411 3242 +3244 3 249.1632 413.2254 30.3652 0.1534 3243 +3245 3 248.2503 413.8626 29.7111 0.1657 3244 +3246 3 247.3385 414.4987 29.0573 0.178 3245 +3247 3 304.8096 381.4679 38.6523 0.2153 1 +3248 3 305.1963 381.9381 41.022 0.2092 3247 +3249 3 305.5841 382.4083 43.3919 0.2031 3248 +3250 3 305.9708 382.8785 45.7618 0.1969 3249 +3251 3 306.3586 383.3487 48.1317 0.1908 3250 +3252 3 306.878 384.2765 47.9699 0.3432 3251 +3253 3 307.2967 385.1882 48.9698 0.3432 3252 +3254 3 307.6376 386.0714 49.2293 0.2466 3253 +3255 3 307.6445 387.0918 50.104 0.2488 3254 +3256 3 307.9511 388.0597 49.7342 0.1685 3255 +3257 3 308.2005 389.1419 49.3119 0.146 3256 +3258 3 308.4304 389.9198 50.4 0.1144 3257 +3259 3 308.4807 390.9414 49.8677 0.1616 3258 +3260 3 308.6878 391.8246 49.1817 0.3371 3259 +3261 3 308.7656 392.8633 49.5001 0.2322 3260 +3262 3 308.5368 393.5738 50.2107 0.3432 3261 +3263 3 308.7656 394.2567 49.6667 0.3432 3262 +3264 3 308.4773 394.9214 51.142 0.2143 3263 +3265 3 308.6512 395.8938 50.0354 0.2518 3264 +3266 3 308.6157 396.7998 49.7227 0.3896 3265 +3267 3 308.5368 397.9381 49.7487 0.2531 3266 +3268 3 308.5585 399.0775 49.733 0.2107 3267 +3269 3 308.6787 400.2021 49.8408 0.2771 3268 +3270 3 308.9132 401.2557 49.8532 0.3632 3269 +3271 3 309.1088 402.3185 49.5729 0.2924 3270 +3272 3 309.2232 403.4041 49.8308 0.2644 3271 +3273 3 309.452 404.1512 48.095 0.178 3272 +3274 3 309.4428 404.9737 46.2944 0.1302 3273 +3275 3 309.1088 405.675 44.8711 0.2415 3274 +3276 3 309.325 406.5398 46.0443 0.2161 3275 +3277 3 309.4017 406.6931 46.3918 0.2221 3276 +3278 3 309.5664 407.5592 47.8649 0.1144 3277 +3279 3 309.5664 408.7032 47.88 0.1144 3278 +3280 3 309.7483 409.552 49.1047 0.2597 3279 +3281 3 310.0446 410.0565 51.1157 0.4068 3280 +3282 3 309.9096 411.0564 51.5217 0.3044 3281 +3283 3 309.5721 411.8194 52.8315 0.1191 3282 +3284 3 309.1546 412.6545 51.7496 0.2576 3283 +3285 3 308.3984 413.0755 50.2944 0.3067 3284 +3286 3 307.919 413.9118 49.0896 0.3686 3285 +3287 3 307.5221 414.9505 49.28 0.3257 3286 +3288 3 307.0507 415.6072 49.5709 0.1159 3287 +3289 3 307.2361 416.6459 49.0 0.1242 3288 +3290 3 306.592 417.4696 48.7676 0.2855 3289 +3291 3 306.0841 417.9066 50.0948 0.1811 3290 +3292 3 305.575 418.6903 48.9404 0.2918 3291 +3293 3 305.448 419.5048 49.2313 0.1337 3292 +3294 3 304.8577 419.8869 49.84 0.1407 3293 +3295 3 304.542 420.9691 50.0088 0.1985 3294 +3296 3 304.304 421.588 51.7129 0.3954 3295 +3297 3 303.8922 422.3648 51.938 0.1304 3296 +3298 3 303.0433 422.7137 52.0425 0.31 3297 +3299 3 302.5102 423.6163 51.3766 0.2288 3298 +3300 3 302.421 424.5144 50.7396 0.1495 3299 +3301 3 301.8661 425.3014 50.7237 0.1144 3300 +3302 3 301.2976 425.8071 49.2954 0.2227 3301 +3303 3 300.8526 426.6045 48.4319 0.1968 3302 +3304 3 300.3194 427.284 48.972 0.2669 3303 +3305 3 300.2016 427.6272 50.9886 0.2304 3304 +3306 3 299.5255 428.2095 50.2354 0.3051 3305 +3307 3 298.7979 428.873 49.0008 0.3052 3306 +3308 3 298.3907 429.5102 49.9215 0.1997 3307 +3309 3 298.6275 430.3739 50.9821 0.1925 3308 +3310 3 298.8128 431.3727 50.65 0.1525 3309 +3311 3 298.2957 432.0053 49.2226 0.1199 3310 +3312 3 297.4526 432.4881 48.2731 0.1584 3311 +3313 3 296.7147 432.9617 48.8113 0.2259 3312 +3314 3 296.137 433.8929 49.2744 0.3432 3313 +3315 3 295.621 434.6216 49.8859 0.2779 3314 +3316 3 295.0754 434.9488 48.627 0.1653 3315 +3317 3 294.58 435.4373 49.6874 0.2065 3316 +3318 3 294.1327 435.7679 51.52 0.3305 3317 +3319 3 293.5721 436.7414 51.7588 0.3424 3318 +3320 3 293.0059 437.3512 53.1894 0.3406 3319 +3321 3 292.1078 437.4656 54.5742 0.1614 3320 +3322 3 291.1308 437.9449 54.6 0.2161 3321 +3323 3 290.7876 438.2687 56.558 0.1144 3322 +3324 3 290.4055 439.0203 57.9569 0.1144 3323 +3325 3 290.1218 439.6907 56.2906 0.2096 3324 +3326 3 289.6597 440.329 54.6 0.254 3325 +3327 3 289.2295 441.2316 54.2987 0.2845 3326 +3328 3 289.0179 441.9135 55.8494 0.2187 3327 +3329 3 288.5191 442.7841 55.44 0.3979 3328 +3330 3 288.3955 443.8217 55.9689 0.3409 3329 +3331 3 287.6737 444.4463 56.1383 0.2359 3330 +3332 3 287.3728 445.016 56.1686 0.2592 3331 +3333 3 286.961 444.5904 57.904 0.1165 3332 +3334 3 286.3432 445.2723 57.0769 0.1703 3333 +3335 3 285.476 445.5617 56.8282 0.3426 3334 +3336 3 284.586 445.9953 58.0994 0.3135 3335 +3337 3 283.5839 446.0456 59.0573 0.3711 3336 +3338 3 282.5508 446.0467 58.9596 0.2833 3337 +3339 3 281.948 446.6462 59.3718 0.2876 3338 +3340 3 281.1254 446.7366 58.1423 0.3386 3339 +3341 3 280.2239 446.6702 57.3493 0.2585 3340 +3342 3 279.3728 446.3888 56.7204 0.1144 3341 +3343 3 278.7928 446.16 54.88 0.2288 3342 +3344 3 309.9748 406.8121 46.0188 0.2369 3276 +3345 3 311.0296 407.2548 45.9777 0.2707 3344 +3346 3 312.0843 407.6976 45.9365 0.3044 3345 +3347 3 312.7696 408.2341 44.8417 0.1737 3346 +3348 3 313.178 408.9514 44.1854 0.2288 3347 +3349 3 313.2203 408.7512 46.6082 0.1522 3348 +3350 3 313.7786 408.9571 47.6132 0.1687 3349 +3351 3 314.028 409.671 48.5948 0.2263 3350 +3352 3 314.4044 410.0119 50.4431 0.1761 3351 +3353 3 314.6 410.7978 49.5886 0.3051 3352 +3354 3 315.148 411.1673 50.0436 0.2299 3353 +3355 3 316.0071 411.7256 50.3829 0.2605 3354 +3356 3 316.5414 411.4041 52.6288 0.2288 3355 +3357 3 317.2598 411.3355 53.503 0.2257 3356 +3358 3 317.4806 412.2187 54.0238 0.247 3357 +3359 3 318.5216 412.412 53.5049 0.3432 3358 +3360 3 319.2446 412.0814 55.0458 0.2796 3359 +3361 3 320.3154 412.3491 55.1342 0.2669 3360 +3362 3 321.0236 412.722 56.0829 0.2682 3361 +3363 3 321.6493 413.4153 56.84 0.2924 3362 +3364 3 322.1412 414.3454 57.0713 0.3033 3363 +3365 3 322.608 414.9871 58.52 0.2162 3364 +3366 3 323.0656 415.6381 57.636 0.433 3365 +3367 3 323.935 416.0362 57.12 0.4287 3366 +3368 3 324.2096 417.1127 57.391 0.4539 3367 +3369 3 324.0529 417.949 58.7891 0.3985 3368 +3370 3 324.3126 418.7223 60.2 0.3432 3369 +3371 3 324.8823 419.5231 60.3691 0.2942 3370 +3372 3 325.0459 420.5218 60.6472 0.1473 3371 +3373 3 325.4165 421.4416 60.48 0.3432 3372 +3374 3 325.2667 422.4312 60.6889 0.3119 3373 +3375 3 325.7082 423.2972 60.226 0.38 3374 +3376 3 325.8661 424.0865 61.2926 0.2585 3375 +3377 3 325.9199 425.0177 60.2588 0.2841 3376 +3378 3 325.7071 425.862 61.6358 0.2314 3377 +3379 3 326.0972 426.1366 63.3153 0.2695 3378 +3380 3 326.4507 426.6262 65.0787 0.2192 3379 +3381 3 326.7264 427.419 66.561 0.2398 3380 +3382 3 326.8763 428.3742 66.6456 0.3059 3381 +3383 3 326.8442 429.3947 67.4338 0.3148 3382 +3384 3 327.1096 430.3419 67.7748 0.2868 3383 +3385 3 327.5078 431.161 67.8936 0.1971 3384 +3386 3 328.1713 431.5626 66.7019 0.144 3385 +3387 3 329.0213 431.5454 67.2294 0.1544 3386 +3388 3 329.798 432.1872 66.64 0.2924 3387 +3389 3 329.9948 432.9662 67.7648 0.2911 3388 +3390 3 330.1801 433.004 70.4287 0.3371 3389 +3391 3 330.5645 433.6298 72.228 0.1314 3390 +3392 3 331.2875 434.1526 73.4877 0.1144 3391 +3393 3 331.8538 434.7303 72.4069 0.1975 3392 +3394 3 332.8823 435.0609 72.5502 0.2422 3393 +3395 3 333.5252 435.2909 74.4629 0.3375 3394 +3396 3 334.4678 435.6306 75.5014 0.2812 3395 +3397 3 335.2378 435.7496 74.8157 0.333 3396 +3398 3 335.0776 436.436 73.64 0.3305 3397 +3399 3 305.1414 375.2514 27.8631 0.2871 1 +3400 3 305.353 374.191 28.0683 0.4743 3399 +3401 3 305.4926 373.3318 29.0111 0.2337 3400 +3402 3 306.2442 372.8079 28.9262 0.2288 3401 +3403 3 306.7636 371.8332 28.6373 0.2288 3402 +3404 3 307.4077 371.4568 27.7245 0.2288 3403 +3405 3 308.1215 371.228 29.3124 0.2796 3404 +3406 3 308.8056 370.4718 29.5221 0.2708 3405 +3407 3 309.3708 370.2293 27.7206 0.2075 3406 +3408 3 309.2507 369.3244 27.6763 0.3161 3407 +3409 3 309.4165 368.3817 27.9832 0.2611 3408 +3410 3 310.0515 367.7708 27.1438 0.3432 3409 +3411 3 310.4942 367.113 27.6755 0.2672 3410 +3412 3 310.6818 366.1898 28.5524 0.3049 3411 +3413 3 311.0078 365.2986 28.0162 0.3257 3412 +3414 3 311.9413 364.936 27.2852 0.2056 3413 +3415 3 312.8703 365.2792 28.1708 0.3685 3414 +3416 3 313.8942 365.2598 28.4698 0.394 3415 +3417 3 314.8231 364.8777 27.1281 0.394 3416 +3418 3 315.6307 364.5756 26.8223 0.44 3417 +3419 3 315.9877 363.5438 26.3511 0.425 3418 +3420 3 316.6009 362.8356 27.16 0.1892 3419 +3421 3 316.888 361.8529 27.6231 0.178 3420 +3422 3 317.3445 361.4697 29.5854 0.1598 3421 +3423 3 318.2711 360.94 30.24 0.1525 3422 +3424 3 318.4999 360.1438 28.8812 0.2013 3423 +3425 3 319.5284 359.9882 28.5519 0.1409 3424 +3426 3 320.3394 359.6072 27.2507 0.2127 3425 +3427 3 320.9092 358.914 27.0637 0.4514 3426 +3428 3 321.6127 358.1933 27.6587 0.3943 3427 +3429 3 322.2774 357.3044 27.711 0.3632 3428 +3430 3 322.894 356.451 27.44 0.339 3429 +3431 3 323.784 355.8435 26.861 0.4089 3430 +3432 3 324.3629 354.9649 26.6406 0.1952 3431 +3433 3 325.1225 354.3437 26.88 0.1253 3432 +3434 3 325.7048 353.8392 27.3073 0.1195 3433 +3435 3 326.6944 353.7248 28.238 0.165 3434 +3436 3 327.6416 353.3953 28.1812 0.2288 3435 +3437 3 328.0031 352.8016 26.7358 0.2907 3436 +3438 3 328.7845 352.4664 25.4806 0.2282 3437 +3439 3 329.3999 352.5545 27.3697 0.1705 3438 +3440 3 330.028 352.3955 28.5852 0.1246 3439 +3441 3 330.3872 351.5237 28.9528 0.2258 3440 +3442 3 331.0942 351.3224 29.223 0.2415 3441 +3443 3 331.8161 350.7996 29.2172 0.2773 3442 +3444 3 332.6832 350.1601 28.5925 0.2279 3443 +3445 3 333.5103 349.4268 28.091 0.1652 3444 +3446 3 334.2116 348.5688 27.72 0.2152 3445 +3447 3 334.9003 347.7588 27.6786 0.283 3446 +3448 3 335.5432 346.902 27.7186 0.2272 3447 +3449 3 336.2628 346.3872 28.4866 0.3051 3448 +3450 3 337.011 345.8712 28.056 0.3432 3449 +3451 3 337.5624 345.2741 27.2275 0.1636 3450 +3452 3 338.3426 344.8016 26.5073 0.1194 3451 +3453 3 339.1983 344.8931 28.2192 0.2161 3452 +3454 3 339.9396 344.4401 27.7794 0.2288 3453 +3455 3 340.9086 344.3657 27.9644 0.2288 3454 +3456 3 341.7414 344.3486 28.1212 0.1825 3455 +3457 3 342.5994 344.1358 28.6051 0.3243 3456 +3458 3 343.4437 343.5329 28.6345 0.2217 3457 +3459 3 344.0488 343.2 28.4976 0.2465 3458 +3460 3 344.8565 342.7355 28.4343 0.2288 3459 +3461 3 345.7202 342.3271 28.3228 0.2407 3460 +3462 3 346.6766 341.9096 28.0468 0.2351 3461 +3463 3 346.6503 341.015 27.2863 0.217 3462 +3464 3 347.0416 340.0037 27.141 0.1415 3463 +3465 3 347.6902 339.2898 27.72 0.2476 3464 +3466 3 348.1684 338.6183 27.7253 0.2346 3465 +3467 3 348.7335 337.7294 27.6156 0.3036 3466 +3468 3 349.3902 337.1894 26.9461 0.1828 3467 +3469 3 350.0411 336.7719 28.0 0.2034 3468 +3470 3 351.0959 336.3852 27.7343 0.2493 3469 +3471 3 351.4368 335.8384 26.129 0.1145 3470 +3472 3 351.9928 335.2652 26.6 0.2288 3471 +3473 3 352.4367 334.4427 27.2292 0.2288 3472 +3474 3 352.5957 333.587 27.5131 0.1948 3473 +3475 3 353.1551 332.7965 27.9443 0.1271 3474 +3476 3 354.0165 332.1444 28.5541 0.1765 3475 +3477 3 354.5519 331.156 28.3772 0.1907 3476 +3478 3 355.3424 330.3792 28.6532 0.1843 3477 +3479 3 356.3102 330.1927 28.7787 0.1737 3478 +3480 3 357.4119 330.0978 29.342 0.1626 3479 +3481 3 358.4827 329.8095 29.1673 0.1526 3480 +3482 3 359.2354 329.1585 28.448 0.1755 3481 +3483 3 360.0523 328.4996 28.8271 0.1907 3482 +3484 3 360.9663 328.2525 28.6294 0.2162 3483 +3485 3 361.6287 327.6977 29.7223 0.2288 3484 +3486 3 362.2556 326.9952 29.2754 0.1483 3485 +3487 3 363.347 326.8122 29.3927 0.1144 3486 +3488 3 364.4715 326.6337 29.4 0.1144 3487 +3489 3 365.5949 326.4976 29.4 0.1144 3488 +3490 3 366.7275 326.4461 29.4622 0.1653 3489 +3491 3 367.8486 326.3306 29.0433 0.2346 3490 +3492 3 368.9446 326.2688 28.317 0.2288 3491 +3493 3 369.6802 325.9325 28.1002 0.1144 3492 +3494 3 370.5199 325.9062 29.0976 0.1631 3493 +3495 3 371.2555 326.4953 28.6373 0.2288 3494 +3496 3 372.1695 326.6257 29.0492 0.2115 3495 +3497 3 373.1797 326.8065 28.7468 0.1163 3496 +3498 3 374.279 326.9792 29.12 0.135 3497 +3499 3 375.1862 327.4082 28.2562 0.2131 3498 +3500 3 376.1724 327.7503 28.3825 0.1658 3499 +3501 3 376.9903 327.7182 28.0104 0.1822 3500 +3502 3 377.8335 327.4059 28.7106 0.2647 3501 +3503 3 378.664 326.9563 28.7249 0.2273 3502 +3504 3 379.6913 326.5514 28.2971 0.1318 3503 +3505 3 380.7083 326.2963 28.901 0.1481 3504 +3506 3 381.6601 325.865 29.1032 0.1676 3505 +3507 3 382.676 325.5778 28.28 0.2716 3506 +3508 3 383.6782 325.15 28.4581 0.1782 3507 +3509 3 384.7867 324.9578 28.0563 0.1144 3508 +3510 3 385.8906 324.6752 28.0 0.1144 3509 +3511 3 387.0072 324.451 28.0 0.1144 3510 +3512 3 388.1054 324.1398 28.0 0.1144 3511 +3513 3 389.1591 323.7005 27.9555 0.1265 3512 +3514 3 390.1292 323.5163 28.2047 0.1829 3513 +3515 3 391.1096 323.1159 28.6532 0.201 3514 +3516 3 392.0923 322.608 28.84 0.1493 3515 +3517 3 393.1722 322.6194 29.3171 0.1493 3516 +3518 3 394.2167 322.608 30.2089 0.1441 3517 +3519 3 395.2509 322.7224 29.9594 0.1272 3518 +3520 3 396.158 322.5039 30.3419 0.1591 3519 +3521 3 397.2586 322.608 29.96 0.1144 3520 +3522 3 398.1578 323.1789 29.6918 0.1144 3521 +3523 3 399.1233 323.5232 29.12 0.1144 3522 +3524 3 400.2673 323.5232 29.12 0.1144 3523 +3525 3 401.1951 323.9808 28.8417 0.1144 3524 +3526 3 401.8906 324.6741 28.6916 0.1144 3525 +3527 3 402.9832 324.7816 29.1292 0.1336 3526 +3528 3 404.0482 324.7816 29.9499 0.1652 3527 +3529 3 405.1087 324.8708 30.52 0.1151 3528 +3530 3 406.1646 324.4327 30.52 0.1622 3529 +3531 3 407.0295 323.7211 30.6186 0.2789 3530 +3532 3 407.4608 322.8608 31.08 0.1361 3531 +3533 3 407.9836 322.0246 31.08 0.1144 3532 +3534 3 408.9937 321.5864 30.7045 0.1144 3533 +3535 3 410.1309 321.5784 30.52 0.1144 3534 +3536 3 411.2405 321.6711 30.464 0.2066 3535 +3537 3 411.84 322.0806 30.3604 0.178 3536 +3538 3 412.6751 322.4936 30.4774 0.2913 3537 +3539 3 413.7745 322.5394 30.4746 0.304 3538 +3540 3 414.795 322.8425 30.0507 0.2482 3539 +3541 3 415.876 322.5588 29.68 0.2719 3540 +3542 3 416.5544 323.0393 28.5222 0.1959 3541 +3543 3 417.5474 322.9592 27.7612 0.3079 3542 +3544 3 418.267 322.6183 28.0319 0.1144 3543 +3545 3 419.1353 322.6286 27.2532 0.1941 3544 +3546 3 419.8057 323.22 27.6651 0.1652 3545 +3547 3 420.5367 323.6353 26.8402 0.3432 3546 +3548 3 421.4427 324.0918 27.0337 0.4014 3547 +3549 3 422.4449 323.9282 27.5979 0.3683 3548 +3550 3 423.455 323.8378 28.6516 0.3178 3549 +3551 3 424.424 323.4877 28.5051 0.3051 3550 +3552 3 425.1127 322.8608 27.9359 0.3116 3551 +3553 3 425.7979 322.4284 27.4254 0.3222 3552 +3554 3 426.7166 322.0337 27.6298 0.3972 3553 +3555 3 427.5231 322.2213 28.6698 0.3926 3554 +3556 3 428.2312 322.3849 29.5736 0.1254 3555 +3557 3 429.0092 321.6917 29.5806 0.2151 3556 +3558 3 429.4576 320.892 29.12 0.3051 3557 +3559 3 315.7131 364.7266 26.4046 0.3717 3417 +3560 3 315.9762 365.2712 24.6618 0.3089 3559 +3561 3 316.7393 365.8032 24.2222 0.2924 3560 +3562 3 317.7254 366.1544 24.4348 0.2619 3561 +3563 3 318.6303 365.6716 24.719 0.3421 3562 +3564 3 319.5913 365.8512 24.5347 0.2795 3563 +3565 3 319.9768 365.0058 23.9781 0.1185 3564 +3566 3 320.7147 364.3972 24.059 0.2767 3565 +3567 3 321.7111 364.6214 24.1024 0.1928 3566 +3568 3 322.5314 364.1592 23.52 0.3241 3567 +3569 3 323.6021 364.1146 23.5771 0.1878 3568 +3570 3 324.0506 363.5129 22.7035 0.2669 3569 +3571 3 324.0288 363.236 20.267 0.3432 3570 +3572 3 324.4453 362.2716 20.1659 0.355 3571 +3573 3 325.3387 361.8106 20.8544 0.1997 3572 +3574 3 326.0995 361.0395 21.0 0.2049 3573 +3575 3 326.1189 359.9665 20.4154 0.3065 3574 +3576 3 325.492 359.1863 20.0883 0.1682 3575 +3577 3 325.7014 358.628 19.2147 0.1636 3576 +3578 3 325.9256 357.8215 20.4336 0.2971 3577 +3579 3 325.9496 356.9314 19.4387 0.2669 3578 +3580 3 325.6339 356.5425 16.921 0.2669 3579 +3581 3 325.2575 355.8995 16.4909 0.3288 3580 +3582 3 324.7816 355.5197 15.745 0.3432 3581 +3583 3 324.8514 354.9832 14.5737 0.2288 3582 +3584 3 325.9062 355.0598 14.1168 0.3205 3583 +3585 3 326.6886 354.7029 15.057 0.1568 3584 +3586 3 327.1783 354.537 13.1452 0.198 3585 +3587 3 327.51 353.734 12.0532 0.178 3586 +3588 3 327.9608 352.8405 12.6 0.2601 3587 +3589 3 328.8908 353.2569 12.731 0.188 3588 +3590 3 329.5418 353.6356 13.7203 0.2987 3589 +3591 3 330.457 353.8014 14.5656 0.2418 3590 +3592 3 331.3356 353.5681 13.5542 0.2161 3591 +3593 3 331.6239 354.1366 12.2844 0.2034 3592 +3594 3 332.3995 354.5164 12.087 0.2011 3593 +3595 3 333.5218 354.6503 12.04 0.1314 3594 +3596 3 334.1693 355.4957 11.7888 0.1144 3595 +3597 3 334.7344 355.5632 12.9968 0.3216 3596 +3598 3 335.5352 355.212 13.44 0.2542 3597 +3599 3 301.5344 375.9367 23.3178 0.2033 1 +3600 3 301.1157 375.0272 21.966 0.1935 3599 +3601 3 300.5563 374.2321 22.4974 0.2398 3600 +3602 3 299.8756 373.6796 23.6998 0.1444 3601 +3603 3 298.87 373.6682 23.7132 0.167 3602 +3604 3 297.7626 373.5286 23.3369 0.2288 3603 +3605 3 296.7914 373.3055 22.68 0.1289 3604 +3606 3 296.0008 373.3776 24.0027 0.1762 3605 +3607 3 295.1772 373.0126 24.92 0.2138 3606 +3608 3 294.7665 372.8468 22.7923 0.1303 3607 +3609 3 293.8936 372.9028 22.9284 0.1813 3608 +3610 3 293.4177 372.515 24.3314 0.3422 3609 +3611 3 292.3744 372.1432 24.1287 0.2909 3610 +3612 3 291.3288 371.967 23.9428 0.1969 3611 +3613 3 290.4776 371.6581 22.6307 0.2609 3612 +3614 3 290.0864 371.7371 24.2155 0.2004 3613 +3615 3 289.3073 371.5941 25.2608 0.1628 3614 +3616 3 288.5168 371.4065 25.1384 0.1481 3615 +3617 3 287.8853 370.9866 23.9887 0.3051 3616 +3618 3 286.9999 370.5302 24.2298 0.2929 3617 +3619 3 285.9199 370.3872 24.362 0.2661 3618 +3620 3 285.293 369.5726 24.92 0.1543 3619 +3621 3 284.435 369.2832 24.2001 0.178 3620 +3622 3 283.6582 368.7146 22.902 0.1144 3621 +3623 3 283.3494 368.2536 21.7669 0.1144 3622 +3624 3 283.0256 367.8303 21.9876 0.2088 3623 +3625 3 282.2843 367.6953 23.4424 0.1961 3624 +3626 3 281.6425 367.264 21.9478 0.2569 3625 +3627 3 280.9618 367.1782 20.4596 0.1766 3626 +3628 3 280.2217 366.5376 21.0484 0.178 3627 +3629 3 279.3099 366.1647 21.9526 0.3272 3628 +3630 3 278.516 365.5995 21.5424 0.2307 3629 +3631 3 277.666 365.2826 22.0234 0.4256 3630 +3632 3 276.7645 364.8296 21.5838 0.1968 3631 +3633 3 275.9591 364.0288 21.2383 0.2074 3632 +3634 3 275.1549 363.228 20.893 0.2182 3633 +3635 3 274.3495 362.4272 20.5475 0.2288 3634 +3636 3 274.0086 362.2007 20.417 0.1834 3635 +3637 3 273.1517 361.5669 19.4051 0.178 3636 +3638 3 272.7342 360.5991 18.3408 0.1654 3637 +3639 3 272.1324 359.7468 17.1959 0.178 3638 +3640 3 271.9803 359.1645 16.1445 0.1508 3639 +3641 3 272.3715 358.199 15.171 0.1822 3640 +3642 3 272.1542 357.2151 14.5897 0.2049 3641 +3643 3 271.4209 356.3869 14.5961 0.2288 3642 +3644 3 270.9816 355.5369 13.6086 0.2401 3643 +3645 3 271.0216 354.457 12.964 0.2413 3644 +3646 3 270.4885 353.631 13.2376 0.2288 3645 +3647 3 269.4875 353.3221 14.1644 0.2142 3646 +3648 3 268.451 353.0178 14.4956 0.2111 3647 +3649 3 267.5164 352.4756 13.7063 0.2081 3648 +3650 3 267.0748 351.5409 13.4476 0.2202 3649 +3651 3 267.0119 350.4152 13.8457 0.2375 3650 +3652 3 267.0279 349.2769 13.9997 0.2502 3651 +3653 3 267.1389 348.1398 13.9989 0.2455 3652 +3654 3 267.4718 347.053 13.9941 0.2328 3653 +3655 3 267.5484 345.9353 13.9616 0.238 3654 +3656 3 266.9959 344.9881 13.7052 0.2511 3655 +3657 3 266.0601 344.36 13.6181 0.2746 3656 +3658 3 265.1414 343.6828 13.704 0.2796 3657 +3659 3 264.3864 342.9575 12.7128 0.2583 3658 +3660 3 263.6783 342.1121 12.0123 0.1991 3659 +3661 3 262.7047 341.6579 12.7042 0.1435 3660 +3662 3 261.8227 342.2528 13.4966 0.1274 3661 +3663 3 261.5184 343.3144 12.88 0.1525 3662 +3664 3 270.9919 360.2204 17.9925 0.1387 3639 +3665 3 269.8719 360.249 17.6128 0.1518 3664 +3666 3 268.8034 360.265 16.6219 0.1403 3665 +3667 3 267.8047 360.5842 15.6657 0.1252 3666 +3668 3 267.0828 361.2409 14.6471 0.1144 3667 +3669 3 266.1184 361.5806 15.5982 0.1144 3668 +3670 3 265.2227 361.3873 16.9036 0.1144 3669 +3671 3 264.701 360.6552 16.0037 0.1144 3670 +3672 3 264.4665 359.8097 14.2313 0.1144 3671 +3673 3 264.0878 358.8945 14.0526 0.1217 3672 +3674 3 263.6817 358.2722 15.9303 0.1351 3673 +3675 3 263.3225 358.6898 17.901 0.1484 3674 +3676 3 262.7116 359.3887 19.4491 0.1433 3675 +3677 3 262.0195 360.2342 19.9346 0.1297 3676 +3678 3 261.3628 361.17 20.0416 0.1163 3677 +3679 3 261.0608 360.7032 21.84 0.1271 3678 +3680 3 274.2042 361.7683 21.7151 0.2669 3635 +3681 3 273.7958 360.7021 21.8392 0.2477 3680 +3682 3 273.2158 359.7365 21.835 0.2064 3681 +3683 3 272.3338 359.0341 21.8131 0.1907 3682 +3684 3 271.3351 358.4838 21.6882 0.2009 3683 +3685 3 270.3844 357.8878 21.212 0.2265 3684 +3686 3 269.4475 357.2838 20.7281 0.2415 3685 +3687 3 268.5483 356.5814 20.6886 0.2469 3686 +3688 3 267.8047 355.7337 20.4834 0.2542 3687 +3689 3 267.1949 354.7761 20.1608 0.26 3688 +3690 3 266.4765 353.8998 20.1967 0.2669 3689 +3691 3 265.6414 353.218 19.7008 0.2669 3690 +3692 3 265.1323 352.3417 19.2217 0.2669 3691 +3693 3 264.6838 351.3132 19.4253 0.2592 3692 +3694 3 263.8693 350.5525 19.3225 0.2306 3693 +3695 3 263.0525 349.937 18.2426 0.1836 3694 +3696 3 262.4061 349.2392 16.7065 0.1403 3695 +3697 3 261.5115 348.8525 15.5254 0.1271 3696 +3698 3 260.7073 348.793 16.9098 0.1469 3697 +3699 3 260.0987 348.729 19.2685 0.1931 3698 +3700 3 259.2064 348.3594 20.5587 0.2461 3699 +3701 3 258.1608 347.9247 20.6758 0.2758 3700 +3702 3 257.1346 347.4362 20.396 0.2577 3701 +3703 3 256.2102 346.815 19.7862 0.1985 3702 +3704 3 255.1429 346.4936 20.1709 0.1443 3703 +3705 3 254.2151 346.0783 19.0078 0.1153 3704 +3706 3 253.6122 346.2739 19.6 0.1899 3705 +3707 3 252.8103 346.1824 20.5422 0.1144 3706 +3708 3 251.7692 346.2591 19.88 0.1345 3707 +3709 3 250.7934 345.9959 19.9576 0.1239 3708 +3710 3 250.242 345.4045 21.0 0.2288 3709 +3711 3 249.5258 344.7055 20.2765 0.1935 3710 +3712 3 248.6907 344.2788 21.0423 0.159 3711 +3713 3 247.9037 344.0477 20.0236 0.2161 3712 +3714 3 247.2378 343.4688 19.6 0.178 3713 +3715 3 246.3959 342.8568 20.1303 0.2159 3714 +3716 3 245.2725 342.9197 20.4089 0.1182 3715 +3717 3 244.2188 342.9586 20.3468 0.1652 3716 +3718 3 244.1296 342.4964 20.519 0.1144 3717 +3719 3 244.5872 341.7128 19.32 0.1398 3718 +3720 3 244.1651 343.1943 20.1984 0.1719 3717 +3721 3 243.4123 343.8795 19.88 0.1215 3720 +3722 3 242.2683 343.8864 19.88 0.1144 3721 +3723 3 241.1243 343.8864 19.88 0.1144 3722 +3724 3 240.0375 343.8864 20.5313 0.1191 3723 +3725 3 239.0994 343.4002 20.9782 0.224 3724 +3726 3 238.4885 343.0856 20.9353 0.1674 3725 +3727 3 237.4303 342.9735 20.72 0.1163 3726 +3728 3 236.3596 343.0993 21.28 0.1541 3727 +3729 3 235.6022 342.5685 21.84 0.2862 3728 +3730 3 234.6333 342.342 21.4194 0.1462 3729 +3731 3 233.686 342.4621 21.6006 0.1891 3730 +3732 3 232.8909 342.8339 22.6789 0.1666 3731 +3733 3 232.2709 343.0192 21.1238 0.1185 3732 +3734 3 231.2196 343.0398 21.8156 0.1271 3733 +3735 3 230.2529 342.5571 22.4 0.2012 3734 +3736 3 229.2073 342.3878 21.7767 0.2171 3735 +3737 3 228.7085 341.5252 20.8393 0.167 3736 +3738 3 227.8745 340.7953 20.7152 0.1144 3737 +3739 3 226.7934 340.475 20.44 0.1144 3738 +3740 3 225.7467 340.0151 20.44 0.1372 3739 +3741 3 224.8543 339.3276 20.0712 0.1652 3740 +3742 3 224.1908 338.5554 20.6422 0.1306 3741 +3743 3 223.2996 337.917 20.44 0.1144 3742 +3744 3 222.5663 337.1368 20.16 0.1317 3743 +3745 3 221.7026 336.4161 20.3157 0.1652 3744 +3746 3 220.6787 336.1312 20.7642 0.1497 3745 +3747 3 219.656 335.9814 21.8025 0.1257 3746 +3748 3 218.9044 335.8441 20.5265 0.1925 3747 +3749 3 217.8382 335.6496 20.9936 0.2805 3748 +3750 3 217.0877 335.5421 19.462 0.3127 3749 +3751 3 216.6713 334.9117 20.1984 0.2539 3750 +3752 3 216.4654 334.0549 19.6381 0.2232 3751 +3753 3 216.0776 334.3489 18.5623 0.2557 3752 +3754 3 215.1578 334.0469 18.0796 0.3205 3753 +3755 3 214.5366 333.182 17.6159 0.1936 3754 +3756 3 213.7701 332.7541 16.3534 0.2366 3755 +3757 3 212.9442 332.1696 17.0458 0.2865 3756 +3758 3 211.8951 332.2416 17.36 0.3432 3757 +3759 3 211.8596 333.2186 17.0727 0.3432 3758 +3760 3 211.3723 333.9325 16.1269 0.2819 3759 +3761 3 211.0508 333.333 15.5893 0.3432 3760 +3762 3 210.0784 332.9749 15.1718 0.3009 3761 +3763 3 209.0077 332.8434 14.6695 0.2384 3762 +3764 3 207.9712 332.5928 15.12 0.4115 3763 +3765 3 206.9084 332.2256 14.7008 0.302 3764 +3766 3 205.9177 331.7657 14.6818 0.2727 3765 +3767 3 204.9453 332.157 14.6793 0.2608 3766 +3768 3 204.3607 332.6935 13.1911 0.3037 3767 +3769 3 203.4043 332.7175 12.3166 0.3312 3768 +3770 3 202.5727 332.904 12.0851 0.1533 3769 +3771 3 201.5362 332.8411 12.7812 0.2616 3770 +3772 3 200.6748 332.5608 13.1897 0.1541 3771 +3773 3 199.7824 332.801 14.1159 0.142 3772 +3774 3 198.7483 333.0424 13.8667 0.3057 3773 +3775 3 198.5481 333.484 12.868 0.3686 3774 +3776 3 198.1717 333.7345 11.3226 0.3026 3775 +3777 3 197.7427 334.5102 12.3385 0.2186 3776 +3778 3 196.7028 334.8694 12.9396 0.2089 3777 +3779 3 195.7636 334.8191 12.9847 0.1992 3778 +3780 3 195.5027 334.8431 11.3277 0.1794 3779 +3781 3 194.8655 334.2619 10.9175 0.1261 3780 +3782 3 194.1711 333.5263 11.3341 0.2603 3781 +3783 3 194.1368 332.904 12.04 0.1144 3782 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Scnn1a.swc b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Scnn1a.swc new file mode 100644 index 0000000..84e566f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/biophysical/morphology/Scnn1a.swc @@ -0,0 +1,3786 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): K:/t301/production data/177300.01.02.01/reconstruction/Scnn1a-Tg3-Cre_Ai14_IVSCC_-177300.01.02.01___DS.swc +# id,type,x,y,z,r,pid +1 1 303.16 379.4648 28.56 5.4428 -1 +2 3 302.6646 375.232 23.2562 0.2524 1 +3 3 302.469 374.2356 21.9996 0.2615 2 +4 3 302.0057 373.2918 21.0081 0.3026 3 +5 3 301.2358 372.4956 20.7318 0.36 4 +6 3 300.3366 371.832 20.7847 0.3728 5 +7 3 299.7177 370.8768 20.9602 0.3575 6 +8 3 299.5049 369.798 21.7249 0.3935 7 +9 3 299.5198 368.6563 21.8372 0.4067 8 +10 3 299.6319 367.518 21.8288 0.432 9 +11 3 299.9305 366.414 21.7669 0.3941 10 +12 3 299.9534 365.2803 21.3934 0.3432 11 +13 3 299.2818 364.1844 21.835 0.3426 12 +14 3 298.4113 363.4442 21.8336 0.3307 13 +15 3 297.5372 362.7052 21.8064 0.2929 14 +16 3 297.0465 361.6756 21.639 0.2796 15 +17 3 296.5568 360.9103 20.5181 0.1964 16 +18 3 296.4024 359.8749 19.7562 0.1915 17 +19 3 296.2342 358.7584 19.6034 0.2477 18 +20 3 295.8212 357.6968 19.6199 0.3025 19 +21 3 295.3156 356.6717 19.7109 0.3267 20 +22 3 294.8111 355.6582 20.0852 0.3125 21 +23 3 294.0824 354.8276 20.6212 0.2917 22 +24 3 293.1958 354.116 20.4296 0.2796 23 +25 3 292.2016 353.6642 19.6 0.2759 24 +26 3 291.2704 353.0922 18.898 0.2278 25 +27 3 290.7682 352.0832 18.6127 0.2161 26 +28 3 290.5108 351.0433 17.754 0.2229 27 +29 3 289.7706 350.1956 17.3659 0.2669 28 +30 3 288.9069 349.46 17.3953 0.2585 29 +31 3 288.2308 348.5425 17.535 0.2245 30 +32 3 287.7171 347.5724 18.1266 0.1808 31 +33 3 287.8121 346.4821 18.8541 0.178 32 +34 3 288.0684 345.5772 17.267 0.1907 33 +35 3 288.1038 344.6838 15.5235 0.1907 34 +36 3 288.3566 343.6084 14.8921 0.1932 35 +37 3 289.0007 342.6692 15.113 0.2306 36 +38 3 289.4698 341.6281 15.0758 0.2553 37 +39 3 289.7329 340.523 14.8417 0.2621 38 +40 3 289.9468 339.4706 13.8762 0.2132 39 +41 3 289.9823 338.4535 12.9086 0.1907 40 +42 3 289.2009 337.6253 12.7764 0.193 41 +43 3 288.28 336.9618 12.5132 0.2034 42 +44 3 287.3865 336.447 12.6182 0.1978 43 +45 3 286.7791 336.0088 14.0918 0.1738 44 +46 3 285.6522 336.058 14.2492 0.1515 45 +47 3 284.6936 335.8498 15.4532 0.129 46 +48 3 284.0746 334.9357 15.6929 0.1155 47 +49 3 283.2212 334.4781 14.3422 0.1503 48 +50 3 282.1104 334.62 14.0 0.2288 49 +51 3 297.5086 361.2443 21.7473 0.2584 16 +52 3 298.2465 360.3806 21.812 0.2203 51 +53 3 299.0313 359.5729 21.5678 0.189 52 +54 3 299.8252 358.9929 20.3588 0.1631 53 +55 3 300.6764 358.4941 19.0198 0.1603 54 +56 3 301.6076 357.905 18.9526 0.1896 55 +57 3 302.6681 357.5847 19.1615 0.2288 56 +58 3 303.6462 357.6579 18.0536 0.259 57 +59 3 304.3143 358.2859 16.6068 0.2577 58 +60 3 305.273 358.7092 15.9995 0.2542 59 +61 3 306.3003 358.3855 15.4902 0.2746 60 +62 3 307.2201 357.7723 15.972 0.3216 61 +63 3 308.3194 357.5938 16.03 0.3518 62 +64 3 309.3719 357.9027 15.4003 0.3559 63 +65 3 310.27 358.5879 15.2365 0.3559 64 +66 3 311.2241 359.1908 15.6405 0.4007 65 +67 3 312.3452 359.3235 15.6626 0.4529 66 +68 3 313.3633 359.3281 14.45 0.4576 67 +69 3 314.4902 359.3155 14.0638 0.3872 68 +70 3 315.6227 359.2183 14.3315 0.275 69 +71 3 316.6146 358.6772 14.0784 0.1907 70 +72 3 297.6768 360.9823 21.0529 0.2519 16 +73 3 298.1767 360.1484 21.8341 0.2161 72 +74 3 298.8471 359.2503 21.56 0.2814 73 +75 3 299.5621 358.6211 20.615 0.3759 74 +76 3 300.0815 357.8238 20.72 0.2132 75 +77 3 300.292 357.1762 22.12 0.2339 76 +78 3 299.9568 356.1272 21.84 0.2542 77 +79 3 299.4386 355.2051 21.56 0.1682 78 +80 3 298.7739 355.0896 20.44 0.134 79 +81 3 298.0166 354.9249 20.144 0.1525 80 +82 3 297.3714 353.9856 20.16 0.1773 81 +83 3 296.8543 353.0487 20.16 0.2539 82 +84 3 296.296 352.6552 21.1915 0.2161 83 +85 3 295.9803 351.7892 22.2888 0.1689 84 +86 3 294.9953 351.6496 21.9878 0.2941 85 +87 3 294.31 350.8808 21.5746 0.2539 86 +88 3 294.0755 349.905 21.553 0.306 87 +89 3 294.1178 348.8777 21.5995 0.19 88 +90 3 293.8044 347.8172 21.9859 0.1909 89 +91 3 293.3216 347.2166 20.7444 0.2288 90 +92 3 292.88 346.2968 21.0288 0.2919 91 +93 3 292.0643 345.7408 21.4584 0.287 92 +94 3 291.5095 344.9286 21.9114 0.3051 93 +95 3 291.1274 344.3028 23.312 0.3181 94 +96 3 290.7224 343.3213 24.0131 0.2851 95 +97 3 290.0349 342.9987 22.4826 0.2796 96 +98 3 289.6368 342.072 22.5103 0.1907 97 +99 3 288.7639 341.8547 23.6482 0.1478 98 +100 3 288.5134 341.1408 22.7452 0.1144 99 +101 3 287.9894 340.7335 21.0946 0.1782 100 +102 3 287.5444 339.8401 21.1212 0.3741 101 +103 3 286.763 339.4969 22.6559 0.2734 102 +104 3 286.1144 338.7647 22.4328 0.2962 103 +105 3 285.1912 338.4993 21.5729 0.2551 104 +106 3 284.4579 337.6836 22.12 0.2834 105 +107 3 283.7726 337.0407 22.7903 0.2726 106 +108 3 283.029 336.4676 24.0041 0.3535 107 +109 3 282.2408 335.7526 23.9999 0.3137 108 +110 3 281.6459 335.0204 23.2201 0.2542 109 +111 3 281.1758 334.6051 21.6723 0.3279 110 +112 3 280.7239 333.8936 21.908 0.2878 111 +113 3 280.7204 333.2483 22.5652 0.178 112 +114 3 280.6106 331.9625 21.9254 0.2238 113 +115 3 280.2777 330.8974 21.8338 0.1859 114 +116 3 279.6336 329.9525 21.7932 0.1725 115 +117 3 279.4929 328.9766 21.4362 0.1713 116 +118 3 279.8762 327.9219 20.9927 0.178 117 +119 3 279.557 326.9964 20.8474 0.2002 118 +120 3 278.9838 326.04 20.7374 0.2394 119 +121 3 278.6063 324.9612 20.6027 0.2699 120 +122 3 278.318 323.8927 20.0052 0.2716 121 +123 3 277.9256 322.894 19.0859 0.242 122 +124 3 277.4726 321.933 19.4888 0.2288 123 +125 3 277.1031 320.9 19.395 0.2381 124 +126 3 276.8137 319.8567 18.5102 0.2604 125 +127 3 276.6444 318.7459 18.1843 0.2669 126 +128 3 276.6066 317.6705 18.996 0.2669 127 +129 3 276.5494 316.5757 18.625 0.2793 128 +130 3 276.2028 315.4889 18.4803 0.3048 129 +131 3 275.728 314.449 18.4696 0.3303 130 +132 3 275.259 313.4057 18.4229 0.3305 131 +133 3 274.528 312.5294 18.2322 0.3052 132 +134 3 273.9045 311.621 17.484 0.2668 133 +135 3 273.2902 310.691 17.3606 0.2264 134 +136 3 273.098 309.5881 17.365 0.2087 135 +137 3 272.6953 308.5791 17.3846 0.2034 136 +138 3 271.9505 307.7131 17.4605 0.2263 137 +139 3 271.2458 306.8345 17.8511 0.2724 138 +140 3 270.5903 305.9182 18.3238 0.3157 139 +141 3 269.9634 304.9675 18.482 0.3223 140 +142 3 269.3033 304.034 18.4895 0.2879 141 +143 3 268.6341 303.1097 18.5256 0.2646 142 +144 3 267.8436 302.2906 18.7183 0.2519 143 +145 3 267.0313 301.5218 19.1531 0.2441 144 +146 3 266.2122 300.737 18.8048 0.2542 145 +147 3 265.4572 299.8882 18.48 0.2542 146 +148 3 264.6541 299.0725 18.4803 0.2796 147 +149 3 263.8693 298.2408 18.4806 0.2669 148 +150 3 262.9278 296.9069 18.4859 0.3559 149 +151 3 262.2906 295.9562 18.5091 0.3559 150 +152 3 261.6111 295.0376 18.62 0.3305 151 +153 3 261.3651 294.6338 18.8754 0.3025 152 +154 3 260.9304 293.619 19.4855 0.3546 153 +155 3 260.6215 292.5185 19.6 0.394 154 +156 3 260.5586 291.3768 19.6 0.3813 155 +157 3 260.014 289.9205 19.6003 0.3112 156 +158 3 259.3448 288.995 19.6011 0.339 157 +159 3 258.7293 288.0317 19.605 0.3326 158 +160 3 258.369 286.9518 19.6297 0.309 159 +161 3 258.3507 285.8192 19.8562 0.2725 160 +162 3 258.5589 284.6993 19.7708 0.2447 161 +163 3 258.7442 283.5713 19.696 0.2191 162 +164 3 258.7316 282.4479 20.1611 0.2048 163 +165 3 258.6893 281.3245 20.678 0.1917 164 +166 3 258.8563 280.1953 20.722 0.214 165 +167 3 259.1972 279.1051 20.7326 0.2629 166 +168 3 259.4718 277.9954 20.8085 0.314 167 +169 3 259.3139 276.8892 21.3156 0.3418 168 +170 3 259.2235 275.7669 21.8182 0.3189 169 +171 3 259.1629 274.6252 21.845 0.3057 170 +172 3 258.814 273.5384 21.8708 0.2682 171 +173 3 258.3335 272.5019 22.0217 0.2544 172 +174 3 258.1482 271.4209 22.8038 0.2166 173 +175 3 257.4046 270.5606 23.0583 0.2161 174 +176 3 257.376 269.4589 23.7723 0.2169 175 +177 3 257.3989 268.3172 23.6776 0.2288 176 +178 3 257.3874 267.2041 23.1045 0.2288 177 +179 3 257.3188 266.0727 23.4097 0.2301 178 +180 3 257.0968 264.9618 23.3033 0.2442 179 +181 3 257.1723 263.8533 23.949 0.2722 180 +182 3 257.1106 262.7333 24.2225 0.3092 181 +183 3 256.7182 261.7003 24.6588 0.3283 182 +184 3 256.7685 260.5906 25.1857 0.3077 183 +185 3 256.5054 259.4786 25.2347 0.2504 184 +186 3 256.0947 258.4227 25.4514 0.1821 185 +187 3 255.6668 257.4057 25.9174 0.1493 186 +188 3 255.6074 256.2777 25.9837 0.1433 187 +189 3 255.7744 255.1967 26.7282 0.1525 188 +190 3 256.1485 254.1602 27.2308 0.1567 189 +191 3 256.4379 253.0734 27.1474 0.174 190 +192 3 256.4665 251.9363 27.3862 0.1996 191 +193 3 256.4493 250.7923 27.4484 0.2161 192 +194 3 256.6015 249.6746 27.4938 0.2113 193 +195 3 256.868 248.5843 27.7956 0.1936 194 +196 3 256.836 247.4758 28.4071 0.1882 195 +197 3 256.5386 246.4107 29.0318 0.2138 196 +198 3 256.1176 245.372 29.5506 0.2607 197 +199 3 255.7149 244.3058 29.766 0.3051 198 +200 3 255.303 243.2567 30.1381 0.3051 199 +201 3 254.9782 242.1848 30.6589 0.2826 200 +202 3 254.6853 241.0843 30.8904 0.2599 201 +203 3 254.397 239.9952 31.2897 0.2786 202 +204 3 254.365 238.8992 31.7878 0.3105 203 +205 3 254.564 237.7758 31.9194 0.3367 204 +206 3 254.6452 236.6387 31.9155 0.3308 205 +207 3 254.5835 235.497 31.885 0.293 206 +208 3 254.2243 234.4582 31.5837 0.2349 207 +209 3 254.1087 233.4812 30.8118 0.178 208 +210 3 254.5537 232.7788 32.1006 0.1652 209 +211 3 254.6944 231.755 32.4584 0.1652 210 +212 3 254.9107 230.651 32.0104 0.1652 211 +213 3 255.0411 229.5196 31.9483 0.1438 212 +214 3 255.0559 228.3859 32.2728 0.1281 213 +215 3 256.0421 227.9226 32.51 0.1271 214 +216 3 256.9424 227.7704 34.16 0.178 215 +217 3 261.2107 291.1674 23.0731 0.132 156 +218 3 261.3319 291.7349 25.429 0.1507 217 +219 3 261.3399 292.5185 27.4683 0.1652 218 +220 3 261.0516 292.6535 29.4815 0.1652 219 +221 3 260.2325 292.1364 30.6804 0.1578 220 +222 3 259.1698 291.9866 31.3396 0.1525 221 +223 3 258.0532 292.1456 31.5524 0.1525 222 +224 3 256.9538 292.0003 31.2376 0.1438 223 +225 3 255.8831 291.7978 31.7621 0.1309 224 +226 3 254.9965 292.1799 32.9613 0.1179 225 +227 3 254.2071 292.9223 33.7809 0.1144 226 +228 3 253.8307 293.8776 33.0526 0.1245 227 +229 3 253.9074 294.7356 31.2824 0.1478 228 +230 3 253.2175 295.3328 29.9491 0.1743 229 +231 3 252.1136 295.4414 29.9594 0.2016 230 +232 3 251.4512 295.0376 31.92 0.2288 231 +233 3 261.5584 294.532 16.9543 0.1308 152 +234 3 260.9761 294.4908 15.1875 0.1611 233 +235 3 259.9019 294.8809 15.218 0.178 234 +236 3 258.8769 295.271 15.7959 0.1683 235 +237 3 258.012 295.7366 17.2021 0.1421 236 +238 3 257.2696 296.4184 18.1712 0.1215 237 +239 3 256.3887 296.908 17.7859 0.1144 238 +240 3 256.0638 296.3543 16.7219 0.1144 239 +241 3 256.0901 295.2961 15.757 0.1144 240 +242 3 255.8979 294.2139 16.0994 0.1144 241 +243 3 255.6131 293.1431 16.7947 0.1144 242 +244 3 255.382 292.1215 17.8914 0.1244 243 +245 3 254.6132 291.434 18.7561 0.1374 244 +246 3 253.5539 291.0588 19.1251 0.1503 245 +247 3 252.6421 291.1388 17.7044 0.1415 246 +248 3 251.8459 291.5301 15.9541 0.1284 247 +249 3 251.5736 291.0393 13.6618 0.1147 248 +250 3 251.9088 290.004 12.88 0.1144 249 +251 3 263.0365 298.3815 16.9333 0.1207 149 +252 3 262.135 299.0222 16.2985 0.1144 251 +253 3 261.3262 299.8298 16.282 0.1144 252 +254 3 260.5757 300.6912 16.4343 0.1269 253 +255 3 259.7498 301.4371 17.0794 0.1398 254 +256 3 258.7431 301.778 16.214 0.1652 255 +257 3 257.8336 301.2198 15.2989 0.1652 256 +258 3 257.2444 300.5654 13.564 0.1619 257 +259 3 256.3578 300.4087 12.8741 0.1365 258 +260 3 255.5135 300.5757 14.7162 0.1233 259 +261 3 254.6041 300.7793 16.1795 0.1144 260 +262 3 253.7415 301.3616 17.075 0.1144 261 +263 3 253.2095 302.1521 17.3463 0.1144 262 +264 3 252.9842 302.2036 15.5907 0.1144 263 +265 3 252.7634 301.7597 13.638 0.1205 264 +266 3 251.8688 301.7849 12.1612 0.1337 265 +267 3 251.1 301.2369 12.2864 0.1483 266 +268 3 251.4089 300.9029 14.238 0.142 267 +269 3 251.9157 301.2003 16.6026 0.1286 268 +270 3 251.8173 302.2414 17.01 0.115 269 +271 3 251.4512 303.2744 16.24 0.1144 270 +272 3 279.9357 332.9074 22.2953 0.1951 113 +273 3 279.0079 333.3696 21.2652 0.1359 272 +274 3 278.5423 334.1624 19.686 0.1144 273 +275 3 278.3695 334.811 17.4812 0.1144 274 +276 3 278.2219 335.8178 16.4077 0.1144 275 +277 3 278.2757 336.9412 16.6925 0.1173 276 +278 3 278.1281 337.9959 17.7047 0.1303 277 +279 3 277.9691 339.0152 18.8966 0.1433 278 +280 3 277.7884 340.0757 19.5807 0.1525 279 +281 3 277.0997 340.7496 19.434 0.1525 280 +282 3 276.1044 340.8571 18.5035 0.1525 281 +283 3 275.4924 341.2426 16.3864 0.1462 282 +284 3 274.7716 341.3582 14.527 0.1326 283 +285 3 273.9663 341.8375 13.839 0.1189 284 +286 3 273.7077 342.8522 13.092 0.1144 285 +287 3 274.1756 343.7766 12.2651 0.1363 286 +288 3 274.7888 344.6872 12.88 0.1652 287 +289 3 299.9259 364.1718 19.7714 0.3256 12 +290 3 299.8024 363.1857 18.3994 0.2615 289 +291 3 300.1867 362.3208 17.1349 0.223 290 +292 3 300.7084 361.5806 15.4552 0.2161 291 +293 3 300.5585 360.5739 14.7638 0.2275 292 +294 3 299.617 360.0042 14.3074 0.2288 293 +295 3 298.7053 360.4664 13.1547 0.2163 294 +296 3 297.6917 360.9846 12.9111 0.2035 295 +297 3 296.5614 361.1459 13.0838 0.1907 296 +298 3 295.5204 360.9926 12.2881 0.2142 297 +299 3 294.7459 360.2159 12.3057 0.2714 298 +300 3 295.2927 359.4734 12.292 0.2542 299 +301 3 296.4047 359.4482 12.1187 0.2542 300 +302 3 296.8497 358.4003 12.1646 0.2669 301 +303 2 305.1826 383.232 22.9978 0.3252 1 +304 2 305.4286 384.3028 22.8676 0.3594 303 +305 2 305.3542 385.3575 23.898 0.3686 304 +306 2 305.0865 386.362 24.9337 0.3648 305 +307 2 304.6735 387.419 25.1149 0.3559 306 +308 2 304.3704 388.4772 24.5893 0.3398 307 +309 2 304.1621 389.5011 23.7555 0.2837 308 +310 2 304.6094 390.5399 23.4931 0.2424 309 +311 2 305.2958 391.4505 23.2809 0.2542 310 +312 2 305.6551 392.5178 23.7577 0.2288 311 +313 2 305.8598 393.5657 22.776 0.2282 312 +314 2 305.8427 394.5965 21.9346 0.2222 313 +315 2 306.258 395.6478 21.849 0.2288 314 +316 2 306.7121 396.69 21.8974 0.2352 315 +317 2 307.0999 397.7528 22.2233 0.2615 316 +318 2 307.5667 398.6863 21.7031 0.2938 317 +319 2 308.0163 399.2663 21.0885 0.3298 318 +320 2 308.4384 400.2009 21.0042 0.1924 319 +321 2 308.7679 400.9251 22.3936 0.2136 320 +322 2 309.1717 401.5989 23.984 0.2232 321 +323 2 309.6728 402.3082 25.5769 0.2074 322 +324 2 309.6808 403.0312 24.9942 0.1177 323 +325 2 310.1144 403.5437 24.855 0.2288 324 +326 2 309.7963 404.5504 24.4471 0.2628 325 +327 2 309.8501 405.4039 23.1179 0.1962 326 +328 2 309.9302 406.1703 22.1449 0.3121 327 +329 2 310.4336 407.081 22.12 0.2756 328 +330 2 310.7401 408.1186 22.3076 0.2059 329 +331 2 311.2298 409.0143 22.5123 0.2855 330 +332 2 311.8533 409.4422 20.8029 0.2437 331 +333 2 311.8407 410.2384 20.524 0.2288 332 +334 2 312.7639 410.3803 20.547 0.1144 333 +335 2 312.7696 410.8756 22.7214 0.1416 334 +336 2 313.0373 411.8514 23.52 0.206 335 +337 2 313.2924 412.9314 23.52 0.2539 336 +338 2 313.79 413.2586 22.4 0.178 337 +339 2 314.2271 414.0044 23.3374 0.1955 338 +340 2 314.1607 414.8888 22.4 0.2111 339 +341 2 314.7453 415.7754 21.8711 0.2939 340 +342 2 315.3928 416.4961 21.9904 0.3108 341 +343 2 315.744 417.3472 22.09 0.1484 342 +344 2 316.3869 418.2064 22.3728 0.2844 343 +345 2 316.8743 418.9957 21.7048 0.1824 344 +346 2 316.6947 419.7496 20.4067 0.1816 345 +347 2 317.0596 420.5802 19.1148 0.1398 346 +348 2 317.9874 420.8868 19.88 0.2893 347 +349 2 318.5262 421.5972 19.068 0.2288 348 +350 2 318.8683 422.5444 20.1505 0.3794 349 +351 2 319.2687 423.2548 18.6455 0.2754 350 +352 2 319.7526 423.8806 16.8291 0.1406 351 +353 2 320.0031 424.9411 17.1741 0.2503 352 +354 2 320.6335 425.4628 18.6519 0.15 353 +355 2 320.9995 426.2521 19.6 0.1205 354 +356 2 321.4102 427.0266 20.8057 0.2266 355 +357 2 321.8072 427.7016 20.4691 0.376 356 +358 2 321.845 428.6694 19.7954 0.3971 357 +359 2 322.1767 429.4576 20.5691 0.1525 358 +360 2 322.9512 430.0307 21.2783 0.1781 359 +361 2 323.18 431.1027 20.7068 0.2507 360 +362 2 322.9523 431.7204 19.0282 0.1899 361 +363 2 323.1125 432.7283 18.6379 0.1828 362 +364 2 323.752 433.3346 18.7911 0.4068 363 +365 2 323.752 433.759 19.32 0.2355 364 +366 2 324.2096 434.72 19.32 0.2669 365 +367 2 324.1295 433.8048 17.1441 0.3559 364 +368 2 324.5334 434.7658 17.36 0.3465 367 +369 2 325.1111 435.6466 17.3594 0.1908 368 +370 2 325.2209 436.7346 16.7524 0.1622 369 +371 2 325.6053 437.7996 16.6782 0.2207 370 +372 2 325.992 438.5078 15.96 0.2009 371 +373 2 326.6189 439.2754 16.5161 0.2028 372 +374 2 327.5283 439.4527 16.1672 0.3288 373 +375 2 328.4756 439.7456 16.5374 0.1663 374 +376 2 329.1231 440.4949 17.0103 0.3163 375 +377 2 329.7191 440.9354 17.5314 0.3373 376 +378 2 330.5496 441.3266 17.5174 0.2636 377 +379 2 331.4797 441.0189 17.08 0.3369 378 +380 2 332.4178 441.0738 17.1259 0.2575 379 +381 2 332.9132 441.3861 16.7807 0.3335 380 +382 2 333.8512 441.7934 17.2357 0.2132 381 +383 2 334.6864 442.4042 17.4264 0.1817 382 +384 2 335.5913 442.7383 16.8221 0.2989 383 +385 2 336.1953 442.8802 15.059 0.2078 384 +386 2 336.9778 443.5299 14.3959 0.2288 385 +387 2 337.8026 443.6249 15.3437 0.3432 386 +388 2 338.4776 444.4509 15.9034 0.2161 387 +389 2 338.624 445.3478 15.9034 0.1144 388 +390 2 338.8528 446.0456 14.84 0.2161 389 +391 2 339.2498 447.0306 15.54 0.1461 390 +392 2 339.5312 447.5557 13.3473 0.211 391 +393 2 340.0002 448.2169 13.9244 0.1421 392 +394 2 339.9728 449.1927 14.051 0.1424 393 +395 2 339.6628 450.0656 12.934 0.3336 394 +396 2 340.3892 450.6822 13.7334 0.2288 395 +397 2 341.023 451.5231 13.4697 0.1271 396 +398 2 341.7117 451.9967 13.4613 0.174 397 +399 2 342.485 452.5481 13.5663 0.169 398 +400 2 342.6486 453.1201 12.1834 0.1732 399 +401 2 343.3247 453.7104 12.0081 0.1841 400 +402 2 343.8567 454.3922 13.0046 0.1865 401 +403 2 344.4229 454.6256 14.1635 0.1285 402 +404 2 344.94 455.0546 12.7854 0.247 403 +405 2 345.6024 455.4264 11.76 0.2924 404 +406 3 301.5847 384.1975 25.1188 0.266 1 +407 3 300.9715 385.1219 24.5062 0.2776 406 +408 3 300.0792 385.7717 24.9561 0.2796 407 +409 3 299.601 385.8712 24.8889 0.3178 408 +410 3 299.1022 386.0954 26.0089 0.2034 409 +411 3 298.4959 386.4432 28.1512 0.2161 410 +412 3 297.8358 387.1536 28.3161 0.2895 411 +413 3 297.1563 387.7554 26.7473 0.1968 412 +414 3 296.2708 388.054 26.32 0.3147 413 +415 3 295.4426 388.1192 27.5495 0.3085 414 +416 3 294.6624 388.2358 28.6437 0.1937 415 +417 3 293.6396 388.65 28.9167 0.1824 416 +418 3 292.5494 388.9325 28.5172 0.2393 417 +419 3 291.45 389.071 27.832 0.1925 418 +420 3 290.3094 389.079 27.9558 0.1907 419 +421 3 289.2867 389.1007 26.7179 0.2156 420 +422 3 288.1667 389.238 26.2828 0.279 421 +423 3 287.2012 389.8466 26.124 0.3178 422 +424 3 285.9725 390.6634 26.2811 0.252 423 +425 3 285.0001 391.1222 27.2227 0.3034 424 +426 3 283.8813 391.3269 27.4739 0.3299 425 +427 3 282.7579 391.1416 27.6842 0.3305 426 +428 3 281.6963 390.9128 28.5636 0.3178 427 +429 3 280.6163 390.9254 29.4868 0.2796 428 +430 3 279.597 391.0398 30.196 0.3037 429 +431 3 278.9129 391.6392 28.6348 0.2957 430 +432 3 278.0858 392.2936 27.7707 0.2836 431 +433 3 277.1981 392.9571 28.1789 0.2615 432 +434 3 276.3172 393.6641 28.5155 0.2633 433 +435 3 275.4191 394.3723 28.5597 0.2577 434 +436 3 274.4902 395.0381 28.5578 0.2542 435 +437 3 273.5396 395.6753 28.5491 0.2635 436 +438 3 272.5157 396.1786 28.4962 0.2669 437 +439 3 271.4151 396.3663 28.0876 0.2479 438 +440 3 270.6224 396.3525 26.2741 0.2122 439 +441 3 269.6477 396.0951 25.2118 0.2034 440 +442 3 268.5243 396.0036 24.8928 0.2034 441 +443 3 267.4134 396.2233 24.6056 0.225 442 +444 3 266.417 396.1512 23.3486 0.2515 443 +445 3 266.2786 395.2142 22.104 0.3019 444 +446 3 265.5167 394.5473 20.9006 0.3051 445 +447 3 264.7662 393.6939 20.7833 0.2663 446 +448 3 263.9723 392.8851 21.0798 0.2611 447 +449 3 263.0525 392.4366 20.6038 0.2818 448 +450 3 262.0183 392.543 20.5906 0.2924 449 +451 3 260.9647 392.4046 21.2766 0.267 450 +452 3 260.0506 391.8475 20.7978 0.2365 451 +453 3 259.4089 391.2011 19.1794 0.2195 452 +454 3 258.5863 390.5296 18.559 0.2256 453 +455 3 257.7066 389.8066 18.7202 0.219 454 +456 3 256.645 389.6384 18.3042 0.2059 455 +457 3 255.6668 390.0216 17.3244 0.1929 456 +458 3 255.0079 390.7035 15.8211 0.1907 457 +459 3 254.0561 391.0901 14.7022 0.1907 458 +460 3 252.9807 391.3727 14.478 0.1907 459 +461 3 251.9111 391.7022 14.1028 0.1821 460 +462 3 250.9181 392.1678 13.3364 0.1691 461 +463 3 249.9766 392.7787 12.8573 0.1563 462 +464 3 248.971 393.3072 12.6571 0.1525 463 +465 3 248.0707 393.9902 12.8103 0.1525 464 +466 3 247.5399 394.974 12.8797 0.1718 465 +467 3 247.652 396.0734 12.8789 0.2074 466 +468 3 247.7172 397.2094 12.8719 0.2458 467 +469 3 247.9586 398.3202 12.8086 0.2437 468 +470 3 248.9413 398.6977 12.6235 0.2086 469 +471 3 250.0704 398.7469 12.9685 0.1694 470 +472 3 251.1606 398.4941 13.4901 0.1538 471 +473 3 252.2577 398.263 13.0374 0.1525 472 +474 3 253.3868 398.3522 12.7434 0.1408 473 +475 3 254.4977 398.2241 12.185 0.1398 474 +476 3 255.112 397.3112 12.88 0.1525 475 +477 3 279.4495 390.8934 30.7238 0.2453 429 +478 3 278.5423 390.9094 30.9336 0.2048 477 +479 3 277.7758 391.1279 31.9984 0.1731 478 +480 3 276.7862 390.7996 31.8228 0.2484 479 +481 3 276.0014 390.4975 30.2618 0.1945 480 +482 3 275.4054 390.2493 28.856 0.2183 481 +483 3 274.7327 389.7528 27.2588 0.1832 482 +484 3 273.8416 389.4496 27.2994 0.2605 483 +485 3 273.9308 389.1671 29.3796 0.2519 484 +486 3 273.8862 389.1682 31.8548 0.3621 485 +487 3 272.9996 389.0744 32.9714 0.2619 486 +488 3 272.1942 389.532 32.3515 0.1144 487 +489 3 271.5925 390.056 31.2754 0.2542 488 +490 3 270.6658 390.0571 32.4526 0.2258 489 +491 3 269.7438 390.2356 33.3948 0.13 490 +492 3 268.7794 390.5765 34.44 0.264 491 +493 3 268.0106 390.2115 33.6622 0.2739 492 +494 3 267.2922 389.4576 34.1312 0.1271 493 +495 3 266.3518 389.0675 33.5334 0.2814 494 +496 3 265.368 388.6134 34.3104 0.2591 495 +497 3 264.5237 388.1603 33.99 0.2398 496 +498 3 263.6245 388.1661 35.3114 0.2223 497 +499 3 262.7654 387.9098 35.56 0.1689 498 +500 3 262.2048 387.816 36.0805 0.3432 499 +501 3 261.6031 388.3194 35.567 0.2444 500 +502 3 260.6593 388.8033 36.3129 0.2542 501 +503 3 259.6308 388.8559 36.7486 0.2696 502 +504 3 258.7453 388.7049 37.9579 0.2078 503 +505 3 257.8519 388.3297 37.3388 0.2045 504 +506 3 256.8028 388.1626 37.2663 0.1459 505 +507 3 255.8888 388.1214 38.355 0.125 506 +508 3 254.9164 387.5586 38.3541 0.2542 507 +509 3 253.8158 387.3309 38.5255 0.2542 508 +510 3 252.9373 386.9992 38.5213 0.2415 509 +511 3 252.3858 386.553 39.2498 0.1945 510 +512 3 251.839 385.7476 38.9091 0.2392 511 +513 3 250.989 385.3587 39.2 0.2725 512 +514 3 250.0029 385.5131 39.508 0.2288 513 +515 3 249.2639 385.2557 38.6526 0.2875 514 +516 3 248.1805 385.0784 39.1978 0.1816 515 +517 3 247.1132 384.8565 39.4895 0.1269 516 +518 3 246.1877 385.2168 39.7379 0.1789 517 +519 3 245.2336 384.9285 40.0249 0.235 518 +520 3 244.1765 384.7661 40.1657 0.1906 519 +521 3 243.0748 384.6208 39.7701 0.202 520 +522 3 242.004 384.6837 40.1551 0.2161 521 +523 3 240.9378 384.3474 40.46 0.1808 522 +524 3 239.9826 384.0545 40.2576 0.2161 523 +525 3 239.0079 383.5981 40.6 0.1604 524 +526 3 238.0595 382.9883 40.9763 0.1652 525 +527 3 237.1638 382.2951 41.2821 0.1568 526 +528 3 236.1628 381.7883 41.2378 0.1525 527 +529 3 235.4649 380.9348 41.4308 0.1645 528 +530 3 234.79 380.3674 41.44 0.2415 529 +531 3 234.0349 379.5941 41.8566 0.1415 530 +532 3 233.1529 378.9248 41.7665 0.2098 531 +533 3 232.137 378.4455 41.72 0.2134 532 +534 3 231.0972 378.0359 41.4546 0.2728 533 +535 3 230.087 377.5486 41.274 0.2541 534 +536 3 229.0997 377.0773 41.72 0.2034 535 +537 3 228.3195 376.3302 41.804 0.1144 536 +538 3 227.2865 375.8887 41.8964 0.1144 537 +539 3 226.1562 375.804 42.0006 0.1146 538 +540 3 225.0545 375.7319 42.408 0.1452 539 +541 3 223.9998 375.6896 42.0014 0.3295 540 +542 3 223.088 375.6747 42.2831 0.2534 541 +543 3 222.0412 375.28 42.8243 0.1151 542 +544 3 220.9922 374.8259 42.84 0.1144 543 +545 3 219.8562 374.7744 42.84 0.1144 544 +546 3 218.7122 374.7744 42.84 0.1144 545 +547 3 217.6014 374.676 42.84 0.1144 546 +548 3 217.1472 373.8157 43.2247 0.2288 547 +549 3 216.788 373.5103 44.518 0.2288 548 +550 3 216.0021 373.1945 43.96 0.2309 549 +551 3 215.2928 372.4235 43.1281 0.2147 550 +552 3 214.4531 371.6833 42.8305 0.2083 551 +553 3 213.396 371.4637 43.3462 0.3256 552 +554 3 212.3722 371.1228 44.032 0.3686 553 +555 3 211.4444 371.379 44.1913 0.4129 554 +556 3 210.3862 371.1662 43.4162 0.1591 555 +557 3 209.3612 370.7635 43.4 0.1144 556 +558 3 208.7674 370.0977 44.52 0.178 557 +559 3 208.4368 369.2249 43.7898 0.2497 558 +560 3 207.6829 368.7798 43.5193 0.3636 559 +561 3 206.6396 368.622 43.3784 0.3898 560 +562 3 205.5871 368.4641 42.9618 0.3296 561 +563 3 204.6639 368.2387 42.0204 0.3217 562 +564 3 203.7944 367.9298 41.72 0.3305 563 +565 3 202.734 367.9104 42.142 0.384 564 +566 3 201.6586 367.8269 41.4999 0.2598 565 +567 3 200.7846 368.193 40.88 0.2663 566 +568 3 199.9415 367.7949 41.6248 0.2775 567 +569 3 199.1704 367.224 41.16 0.2669 568 +570 3 287.2115 390.1829 25.6178 0.2688 423 +571 3 287.2481 391.1565 24.1534 0.1433 570 +572 3 287.3385 392.1186 22.6792 0.1828 571 +573 3 287.1875 393.0075 20.9756 0.2215 572 +574 3 287.3877 393.8197 19.1523 0.2448 573 +575 3 287.978 394.203 17.3737 0.188 574 +576 3 287.9013 393.5371 15.2382 0.1738 575 +577 3 287.4414 392.6288 14.187 0.1697 576 +578 3 286.7058 391.7571 13.9997 0.1735 577 +579 3 285.8135 391.1931 13.9983 0.1699 578 +580 3 284.6867 391.0547 13.9882 0.1727 579 +581 3 283.815 390.4472 13.9205 0.1652 580 +582 3 283.4146 389.4016 14.0134 0.1531 581 +583 3 282.9638 388.5413 14.996 0.1398 582 +584 3 282.3609 387.8046 16.483 0.1465 583 +585 3 281.6688 386.9992 17.1492 0.1663 584 +586 3 280.7376 386.6194 16.4133 0.178 585 +587 3 280.2411 385.9044 15.8567 0.1697 586 +588 3 279.5925 385.0681 15.4342 0.1652 587 +589 3 278.6738 384.6563 16.4245 0.1763 588 +590 3 278.8031 384.1209 18.6477 0.178 589 +591 3 278.9198 383.0901 19.6624 0.1544 590 +592 3 279.033 382.0022 20.477 0.1286 591 +593 3 279.5536 381.1865 21.9338 0.1149 592 +594 3 280.248 380.3972 23.0336 0.1144 593 +595 3 281.1952 379.9224 24.08 0.1271 594 +596 3 299.696 386.1835 25.3509 0.3103 409 +597 3 299.9831 387.1319 26.752 0.2875 596 +598 3 300.2714 388.0791 28.1529 0.2647 597 +599 3 300.5425 388.6054 27.4324 0.1144 598 +600 3 300.9624 389.524 27.6203 0.3407 599 +601 3 301.6087 390.1395 28.4374 0.1485 600 +602 3 301.3285 390.8613 27.0418 0.223 601 +603 3 301.0585 391.7571 27.5248 0.268 602 +604 3 300.848 392.8645 27.8715 0.1875 603 +605 3 300.594 393.925 28.289 0.1234 604 +606 3 300.3023 394.6823 29.4 0.1972 605 +607 3 300.3057 395.7085 28.5732 0.2433 606 +608 3 300.1856 396.8376 28.5625 0.2789 607 +609 3 299.9808 397.9335 28.1716 0.2464 608 +610 3 299.704 398.5971 26.88 0.1144 609 +611 3 299.9991 399.5134 27.5587 0.1808 610 +612 3 300.2417 400.4343 28.6289 0.1144 611 +613 3 299.6422 401.1836 29.6425 0.2635 612 +614 3 299.5118 402.0256 31.2648 0.3303 613 +615 3 299.855 402.99 30.5864 0.2415 614 +616 3 299.9728 403.9144 30.87 0.307 615 +617 3 299.9568 404.6522 32.48 0.1268 616 +618 3 299.9362 405.7768 32.3028 0.1144 617 +619 3 299.3688 406.263 30.5458 0.1144 618 +620 3 299.0016 406.9208 31.5487 0.24 619 +621 3 298.0989 406.9757 31.8665 0.236 620 +622 3 297.2993 407.1645 32.6116 0.2123 621 +623 3 296.868 407.6873 32.9731 0.3432 622 +624 3 296.2994 407.9115 32.0695 0.3178 623 +625 3 295.4849 408.5018 31.3928 0.3167 624 +626 3 295.0971 408.8656 33.0562 0.2288 625 +627 3 295.3042 408.7009 35.5289 0.3051 626 +628 3 295.1463 407.4013 34.72 0.2931 627 +629 3 295.0365 406.4392 34.2241 0.2539 628 +630 3 295.6004 406.2573 36.6134 0.2542 629 +631 3 296.1255 406.112 38.8612 0.2488 630 +632 3 295.1863 406.4117 38.332 0.2931 631 +633 3 294.564 407.0958 37.6662 0.3342 632 +634 3 293.6865 407.7205 37.828 0.4068 633 +635 3 293.6648 407.9024 40.3287 0.2653 634 +636 3 293.0493 408.4412 41.097 0.2386 635 +637 3 292.7874 409.4296 41.44 0.1907 636 +638 3 293.2324 410.1869 41.6993 0.305 637 +639 3 293.4646 410.8447 42.0742 0.3589 638 +640 3 293.5687 411.8457 42.7207 0.2804 639 +641 3 293.436 412.7987 42.9685 0.2103 640 +642 3 293.9016 413.3135 44.8232 0.36 641 +643 3 293.889 414.0228 45.7422 0.293 642 +644 3 293.8501 415.0604 45.6753 0.4261 643 +645 3 293.3937 416.0602 46.1387 0.4676 644 +646 3 293.0242 417.1299 46.2 0.3605 645 +647 3 292.9784 418.1228 45.9802 0.5101 646 +648 3 293.2072 418.9866 46.1664 0.2702 647 +649 3 293.0287 419.9624 46.2552 0.2288 648 +650 3 292.3721 420.094 48.16 0.4438 649 +651 3 291.6056 419.8652 49.0 0.3704 650 +652 3 291.3265 418.9683 49.628 0.4449 651 +653 3 290.6904 418.9763 51.2089 0.178 652 +654 3 290.8117 419.8549 50.4851 0.2786 653 +655 3 290.7476 420.571 51.7454 0.3892 654 +656 3 290.2408 421.4061 52.8763 0.2644 655 +657 3 290.3426 422.446 52.8864 0.3456 656 +658 3 290.576 423.5042 53.48 0.3228 657 +659 3 290.3278 424.3474 53.9879 0.2611 658 +660 3 290.528 425.2168 52.9836 0.2034 659 +661 3 290.9192 425.3907 54.985 0.237 660 +662 3 291.0919 425.8162 56.3242 0.3432 661 +663 3 291.8699 426.3208 56.3749 0.1574 662 +664 3 292.0449 427.2565 57.4 0.2137 663 +665 3 292.5116 427.1993 58.3377 0.1731 664 +666 3 292.737 427.967 59.7498 0.2415 665 +667 3 293.6431 428.476 60.6522 0.366 666 +668 3 293.6923 429.4736 60.5377 0.2927 667 +669 3 294.1201 430.2916 61.9864 0.2131 668 +670 3 294.4988 431.2686 62.72 0.2034 669 +671 3 294.8809 432.2913 63.212 0.1734 670 +672 3 294.9232 433.3781 63.84 0.1144 671 +673 3 295.4609 434.2292 63.5986 0.1255 672 +674 3 295.2206 435.1936 62.9821 0.2897 673 +675 3 294.8637 436.2106 63.56 0.3375 674 +676 3 294.2608 436.6648 64.0494 0.2347 675 +677 3 294.3581 437.0172 66.1256 0.2266 676 +678 3 293.6431 437.7219 66.6543 0.1398 677 +679 3 293.0939 437.8088 64.5411 0.2034 678 +680 3 292.5208 438.2538 65.8417 0.1875 679 +681 3 291.9488 438.5112 66.915 0.2115 680 +682 3 291.6033 438.9082 68.3133 0.1952 681 +683 3 290.8345 439.4802 68.3544 0.1257 682 +684 3 290.0109 440.1311 68.32 0.2802 683 +685 3 289.7752 441.1744 68.7425 0.275 684 +686 3 289.5235 442.1926 69.6147 0.1144 685 +687 3 289.1815 442.9785 67.9496 0.1144 686 +688 3 288.5912 443.8056 67.0709 0.1144 687 +689 3 288.0638 444.706 67.405 0.1144 688 +690 3 287.565 445.6463 67.8146 0.1731 689 +691 3 287.3476 446.6942 68.1652 0.2118 690 +692 3 286.4507 446.748 69.6704 0.1948 691 +693 3 286.2883 447.6358 69.991 0.2389 692 +694 3 286.0 448.3302 68.5292 0.1271 693 +695 3 285.9851 449.0463 66.6526 0.1473 694 +696 3 285.5424 448.9216 68.5896 0.3173 695 +697 3 285.3113 449.314 70.56 0.3201 696 +698 3 284.7416 450.2784 70.28 0.3305 697 +699 3 294.1464 409.4937 35.1772 0.2682 627 +700 3 293.2072 410.1354 34.8916 0.2382 699 +701 3 292.268 410.7784 34.6063 0.2082 700 +702 3 291.6571 410.7235 34.7637 0.2034 701 +703 3 290.8162 410.5816 35.9296 0.2966 702 +704 3 290.6298 410.2384 37.602 0.3097 703 +705 3 289.7821 410.8287 38.08 0.3302 704 +706 3 288.892 411.4968 37.9756 0.1663 705 +707 3 288.0867 411.1891 37.0972 0.139 706 +708 3 287.033 411.4373 37.5164 0.1403 707 +709 3 286.2997 411.165 38.871 0.3051 708 +710 3 285.4177 411.1536 38.4384 0.1144 709 +711 3 284.7851 411.7302 38.2794 0.1939 710 +712 3 284.0289 412.1924 38.9096 0.2076 711 +713 3 283.3905 412.9348 38.0534 0.2924 712 +714 3 282.8323 413.4256 37.52 0.2537 713 +715 3 282.5188 414.366 36.9275 0.2004 714 +716 3 282.576 415.3624 37.2686 0.1548 715 +717 3 281.9949 415.9584 38.9211 0.1144 716 +718 3 280.8966 416.0728 39.2 0.1144 717 +719 3 279.7526 416.0728 39.2 0.1322 718 +720 3 278.8214 416.0728 40.3066 0.2614 719 +721 3 277.8913 416.3405 39.485 0.299 720 +722 3 277.11 415.7296 39.6396 0.3594 721 +723 3 276.0197 415.5111 40.2094 0.3213 722 +724 3 274.9673 415.8348 40.171 0.2834 723 +725 3 274.2271 415.836 38.8486 0.3212 724 +726 3 273.4995 416.297 38.08 0.1902 725 +727 3 272.4116 416.6219 38.08 0.1576 726 +728 3 271.3465 416.8736 38.187 0.1144 727 +729 3 270.4874 416.8736 39.9459 0.1155 728 +730 3 269.8341 417.3312 41.16 0.1144 729 +731 3 268.7107 417.3312 41.5554 0.1515 730 +732 3 267.736 417.4078 42.8954 0.1773 731 +733 3 267.0279 416.8644 43.1659 0.2288 732 +734 3 266.2706 416.8725 41.7393 0.1938 733 +735 3 265.8359 417.4124 40.4373 0.4306 734 +736 3 264.8005 417.7625 40.6266 0.2631 735 +737 3 263.986 418.084 40.0389 0.2288 736 +738 3 263.0685 418.2807 38.9225 0.1271 737 +739 3 262.6944 418.942 40.5563 0.24 738 +740 3 262.5423 419.8789 41.3003 0.2861 739 +741 3 262.0973 420.706 41.44 0.2558 740 +742 3 262.2883 421.5388 42.0403 0.2691 741 +743 3 262.0435 422.2447 40.3976 0.1467 742 +744 3 261.9794 422.9196 38.64 0.1144 743 +745 3 261.7461 423.8303 37.7292 0.133 744 +746 3 261.1054 424.6162 36.7794 0.1772 745 +747 3 260.9052 425.6607 36.7069 0.3132 746 +748 3 260.5929 426.5965 36.1645 0.2106 747 +749 3 260.1456 427.6135 36.12 0.1445 748 +750 3 259.8516 428.5733 35.7227 0.1722 749 +751 3 259.3677 429.2139 35.7098 0.2847 750 +752 3 259.2327 430.3133 36.12 0.3411 751 +753 3 259.8459 431.0649 36.6016 0.2375 752 +754 3 260.0712 431.9138 38.2928 0.1518 753 +755 3 260.1387 431.6941 40.329 0.1144 754 +756 3 260.26 432.0739 42.3195 0.1907 755 +757 3 260.7256 433.0292 42.2408 0.1907 756 +758 3 261.38 433.9009 42.28 0.2241 757 +759 3 261.0688 434.6022 42.8389 0.3056 758 +760 3 260.8892 435.5219 43.7461 0.2771 759 +761 3 260.8457 436.4577 44.1017 0.1178 760 +762 3 261.6328 437.0469 44.1913 0.2542 761 +763 3 261.6408 438.0101 42.7336 0.2433 762 +764 3 262.2048 438.724 41.44 0.178 763 +765 3 304.9355 375.1977 30.2879 0.3278 1 +766 3 304.9984 374.1532 31.3407 0.3083 765 +767 3 305.0442 373.047 32.018 0.294 766 +768 3 305.3347 371.9785 32.6869 0.2924 767 +769 3 306.0303 371.0861 32.753 0.2693 768 +770 3 306.6778 370.2556 31.7075 0.2552 769 +771 3 307.116 369.2821 30.7244 0.3017 770 +772 3 307.9945 368.5922 30.2492 0.368 771 +773 3 309.1088 368.4847 30.8 0.394 772 +774 3 309.9565 368.4916 30.8 0.3645 773 +775 3 311.0982 368.5499 30.8006 0.3567 774 +776 3 312.1839 368.9022 30.8025 0.3197 775 +777 3 313.0785 369.6104 30.8106 0.3299 776 +778 3 314.0738 370.1721 30.856 0.3797 777 +779 3 315.18 369.9536 31.1878 0.4066 778 +780 3 316.2451 369.6275 31.8214 0.394 779 +781 3 317.1706 369.3896 31.6772 0.3726 780 +782 3 318.2482 369.1345 31.0097 0.3686 781 +783 3 319.3785 369.1299 30.8162 0.326 782 +784 3 320.3292 369.7145 30.8193 0.2639 783 +785 3 321.0693 370.5794 30.9002 0.2001 784 +786 3 321.9239 371.3081 31.362 0.1685 785 +787 3 322.9432 371.7176 30.7787 0.1882 786 +788 3 323.903 371.903 29.349 0.2542 787 +789 3 325.1671 371.7211 28.2125 0.2892 788 +790 3 326.2722 371.8469 27.8522 0.2696 789 +791 3 327.3705 371.9613 28.2954 0.2415 790 +792 3 328.4859 371.7474 28.4099 0.2529 791 +793 3 329.5933 371.6536 27.8642 0.2989 792 +794 3 330.6503 371.514 26.9097 0.3472 793 +795 3 331.7348 371.2646 26.6641 0.3518 794 +796 3 332.8434 371.0884 27.1762 0.3345 795 +797 3 333.9599 370.9626 27.3795 0.3178 796 +798 3 335.0822 371.0953 27.0542 0.3226 797 +799 3 336.1861 371.1216 26.4715 0.3355 798 +800 3 337.3038 370.9226 26.1551 0.3328 799 +801 3 338.4192 370.9054 26.2452 0.3123 800 +802 3 339.4683 371.2978 26.5978 0.2876 801 +803 3 340.4578 371.7348 26.1926 0.2607 802 +804 3 341.3559 372.2713 25.8188 0.2353 803 +805 3 342.1555 373.0538 25.6956 0.2096 804 +806 3 342.9163 373.8672 25.0858 0.21 805 +807 3 343.6198 374.652 24.1058 0.2366 806 +808 3 344.4893 375.2503 23.2224 0.286 807 +809 3 345.5441 375.6461 22.9561 0.3352 808 +810 3 346.6709 375.7548 22.932 0.3735 809 +811 3 347.7863 375.5546 22.7942 0.3999 810 +812 3 348.8411 375.216 22.2068 0.3948 811 +813 3 349.8764 374.9357 21.2456 0.3482 812 +814 3 350.9678 374.7103 20.7687 0.2889 813 +815 3 352.0797 374.7813 20.7197 0.2744 814 +816 3 353.0281 375.3636 20.7183 0.3106 815 +817 3 353.8552 376.1529 20.7136 0.3305 816 +818 3 354.68 376.9457 20.694 0.2994 817 +819 3 355.5609 377.6722 20.601 0.2406 818 +820 3 356.5791 378.0748 20.1124 0.2082 819 +821 3 357.6258 378.4672 20.0402 0.2288 820 +822 3 358.4747 379.188 20.4714 0.2768 821 +823 3 359.2778 379.9796 20.3031 0.3104 822 +824 3 360.1815 380.3674 19.1052 0.3087 823 +825 3 361.2523 380.3285 18.4184 0.2636 824 +826 3 362.3734 380.1718 18.1129 0.2508 825 +827 3 363.4671 380.0654 17.5246 0.238 826 +828 3 364.5825 380.1146 17.3424 0.2177 827 +829 3 365.6727 379.7771 17.2281 0.183 828 +830 3 366.6142 379.2314 16.7706 0.1611 829 +831 3 367.4105 378.4993 16.2392 0.1614 830 +832 3 368.4767 378.3174 16.235 0.1924 831 +833 3 369.5829 378.6114 16.2044 0.2259 832 +834 3 370.6171 379.0324 15.9354 0.2313 833 +835 3 371.6318 379.4007 15.6229 0.1997 834 +836 3 372.7289 379.2337 15.9883 0.1722 835 +837 3 373.683 378.7109 16.7238 0.1713 836 +838 3 374.652 378.1904 17.2309 0.1905 837 +839 3 375.7685 378.0337 17.3594 0.2102 838 +840 3 376.7764 378.4386 17.3552 0.2306 839 +841 3 377.7168 379.0873 17.3337 0.2488 840 +842 3 378.7727 379.4705 17.1931 0.2542 841 +843 3 379.8618 379.4133 16.6001 0.2624 842 +844 3 380.9749 379.3996 16.5245 0.2843 843 +845 3 382.08 379.2246 16.3531 0.328 844 +846 3 383.2091 379.1205 16.24 0.3522 845 +847 3 384.3497 379.1971 16.24 0.3653 846 +848 3 385.3861 379.0781 15.2995 0.2233 847 +849 3 386.3425 378.7784 15.12 0.1146 848 +850 3 387.4842 378.759 15.2163 0.1403 849 +851 3 388.4612 378.8276 15.68 0.1859 850 +852 3 389.5858 378.8928 16.0115 0.1328 851 +853 3 390.4758 378.7509 15.4241 0.1438 852 +854 3 391.3292 378.8505 15.4104 0.2302 853 +855 3 391.8314 378.4421 14.0403 0.2428 854 +856 3 392.7421 378.092 14.7252 0.1468 855 +857 3 393.4491 378.6125 13.72 0.1144 856 +858 3 394.5667 378.7406 13.72 0.1144 857 +859 3 395.5963 379.0072 13.8774 0.1144 858 +860 3 396.7049 378.918 13.44 0.1144 859 +861 3 397.8374 378.7921 13.44 0.1481 860 +862 3 398.8327 378.4798 13.9776 0.1455 861 +863 3 399.5695 377.6619 13.9605 0.1497 862 +864 3 400.3234 377.1894 13.4246 0.2267 863 +865 3 401.083 376.7741 13.7911 0.2342 864 +866 3 401.9753 376.2639 13.7155 0.2288 865 +867 3 402.863 376.0271 13.7511 0.1944 866 +868 3 403.6432 375.6095 14.0017 0.1144 867 +869 3 404.4063 375.3567 13.9342 0.1708 868 +870 3 405.2803 375.693 13.16 0.1564 869 +871 3 406.1486 376.2261 12.5938 0.1296 870 +872 3 407.0123 375.6473 12.3544 0.1773 871 +873 3 407.8406 375.0879 12.7042 0.1951 872 +874 3 408.6162 375.5088 13.0488 0.131 873 +875 3 409.5108 376.2055 12.8391 0.157 874 +876 3 410.5347 376.5442 12.8391 0.1849 875 +877 3 411.4716 375.9504 12.8391 0.1556 876 +878 3 412.118 375.0089 12.8391 0.1467 877 +879 3 412.746 374.0525 12.8391 0.1398 878 +880 3 323.609 371.6993 28.1929 0.2288 788 +881 3 324.4384 371.8618 28.9036 0.2288 880 +882 3 324.5608 372.7186 30.4763 0.1271 881 +883 3 324.896 373.7048 31.451 0.2412 882 +884 3 325.7151 374.1795 31.2404 0.2091 883 +885 3 326.4107 375.0261 30.8311 0.2653 884 +886 3 327.3281 375.5088 30.9173 0.3157 885 +887 3 328.0191 376.2913 30.5701 0.3187 886 +888 3 328.5557 377.0887 31.3734 0.1945 887 +889 3 328.5568 378.0783 32.4615 0.3077 888 +890 3 328.4813 379.1468 31.9816 0.2754 889 +891 3 329.1185 379.8915 32.804 0.1423 890 +892 3 329.329 380.714 33.9329 0.1597 891 +893 3 329.5143 381.699 34.0948 0.2161 892 +894 3 329.8415 382.5422 35.278 0.1144 893 +895 3 330.4993 383.2652 35.0767 0.2071 894 +896 3 330.7361 384.1506 34.8345 0.1726 895 +897 3 331.6868 384.5888 34.9706 0.1667 896 +898 3 332.2268 385.3839 35.1459 0.1993 897 +899 3 332.7896 386.1698 35.6972 0.2049 898 +900 3 332.888 387.0747 35.8142 0.148 899 +901 3 333.1385 387.8789 34.7026 0.3956 900 +902 3 333.5183 388.801 34.16 0.3534 901 +903 3 333.6716 389.7459 35.1375 0.308 902 +904 3 333.8192 390.644 35.8789 0.2182 903 +905 3 334.0102 391.5912 34.7861 0.2208 904 +906 3 334.1498 392.1815 33.6048 0.2671 905 +907 3 334.4747 392.6151 35.5673 0.3305 906 +908 3 334.7344 393.663 35.4668 0.2394 907 +909 3 334.866 394.6869 36.2284 0.212 908 +910 3 334.9209 395.7954 35.915 0.1603 909 +911 3 335.1325 396.6511 35.0773 0.1804 910 +912 3 335.1119 397.6281 33.9312 0.1144 911 +913 3 335.1783 398.1383 36.0595 0.1367 912 +914 3 335.192 399.1256 36.955 0.2542 913 +915 3 335.192 399.9046 35.9332 0.3051 914 +916 3 335.3808 400.9903 36.3689 0.3168 915 +917 3 335.8326 401.878 36.3334 0.2397 916 +918 3 335.7537 402.2064 37.52 0.1144 917 +919 3 336.2937 403.0255 37.24 0.2108 918 +920 3 337.0933 403.1273 35.588 0.1504 919 +921 3 337.075 404.1969 36.197 0.2231 920 +922 3 337.2581 405.2689 36.7077 0.2669 921 +923 3 337.663 405.9804 37.5264 0.3305 922 +924 3 337.48 406.7503 39.1902 0.1431 923 +925 3 337.3656 407.7982 39.9468 0.1398 924 +926 3 337.4811 408.6402 38.409 0.1937 925 +927 3 337.2718 409.4982 37.1927 0.1271 926 +928 3 337.3336 410.4066 36.47 0.1462 927 +929 3 337.242 411.2691 37.3898 0.219 928 +930 3 337.3622 412.0757 38.8119 0.3075 929 +931 3 337.4491 412.8433 37.7871 0.3358 930 +932 3 337.5944 413.739 38.8321 0.1144 931 +933 3 337.194 414.6211 38.08 0.1201 932 +934 3 336.7387 415.5008 38.5437 0.136 933 +935 3 336.1381 416.1655 37.413 0.2754 934 +936 3 335.7766 416.8095 38.7058 0.2453 935 +937 3 336.1518 417.4479 40.2559 0.2288 936 +938 3 336.5293 418.251 39.3781 0.1652 937 +939 3 336.5591 419.2771 39.4108 0.1382 938 +940 3 335.9928 420.0928 38.92 0.3147 939 +941 3 335.9928 421.0114 39.7541 0.2977 940 +942 3 336.0546 422.0719 39.0631 0.2762 941 +943 3 336.2365 422.9528 38.2088 0.2184 942 +944 3 336.7501 423.4779 36.2264 0.2245 943 +945 3 337.1002 424.0762 37.91 0.1907 944 +946 3 337.2249 424.6574 39.9143 0.1144 945 +947 3 337.2523 425.6126 41.3504 0.1147 946 +948 3 337.48 426.4935 42.6188 0.1384 947 +949 3 338.2042 426.966 43.6439 0.262 948 +950 3 339.0358 427.4041 42.84 0.2079 949 +951 3 339.4889 428.0082 43.3224 0.2733 950 +952 3 340.0334 428.6591 43.96 0.1313 951 +953 3 340.3606 429.3329 42.7087 0.1759 952 +954 3 341.1294 430.1177 43.0422 0.2394 953 +955 3 341.9393 430.8865 42.56 0.267 954 +956 3 342.5136 431.7845 42.233 0.3305 955 +957 3 343.1794 432.5247 41.4946 0.21 956 +958 3 343.6576 433.4433 41.16 0.1144 957 +959 3 344.3509 433.5897 42.3948 0.2219 958 +960 3 345.1517 434.2487 42.9887 0.2206 959 +961 3 345.742 435.0575 43.2373 0.2828 960 +962 3 346.4329 435.8846 42.56 0.3178 961 +963 3 346.8768 436.7895 41.8286 0.1218 962 +964 3 347.204 437.5056 40.166 0.1368 963 +965 3 347.5495 438.1703 39.8614 0.1803 964 +966 3 348.2336 438.4632 41.5862 0.2351 965 +967 3 348.8479 439.3555 41.5716 0.2235 966 +968 3 349.0653 440.2101 41.2084 0.3065 967 +969 3 349.2152 440.8633 42.8428 0.1676 968 +970 3 349.1488 441.862 42.9296 0.3061 969 +971 3 349.1236 442.9236 43.265 0.3051 970 +972 3 349.5023 443.0632 45.7447 0.1983 971 +973 3 349.8352 443.5528 45.7615 0.1862 972 +974 3 350.2047 444.0093 44.4489 0.1878 973 +975 3 350.5067 444.6671 43.1172 0.1514 974 +976 3 350.2928 445.5136 42.0227 0.1941 975 +977 3 350.8648 445.9312 42.56 0.1144 976 +978 3 317.1191 369.2214 30.52 0.2756 780 +979 3 318.0652 368.5865 30.5348 0.1519 978 +980 3 318.8168 368.3829 32.2255 0.3121 979 +981 3 319.5169 367.6404 32.965 0.2059 980 +982 3 320.3486 366.9906 32.6228 0.2736 981 +983 3 321.0133 366.4186 31.8998 0.2895 982 +984 3 321.5212 365.9198 31.0766 0.3079 983 +985 3 322.1893 365.2792 31.9074 0.1996 984 +986 3 322.8951 364.8124 31.6546 0.3265 985 +987 3 323.7245 364.6008 32.9871 0.3567 986 +988 3 324.2794 364.5779 32.3036 0.2655 987 +989 3 325.2827 364.8777 32.851 0.2449 988 +990 3 326.1452 365.2598 32.6794 0.2666 989 +991 3 327.2126 365.2552 32.7712 0.2288 990 +992 3 327.9082 365.5675 34.3888 0.2456 991 +993 3 328.8542 365.8844 33.6389 0.233 992 +994 3 329.9079 366.1029 33.9643 0.1639 993 +995 3 330.7727 366.5902 33.5709 0.1525 994 +996 3 331.6422 366.8774 34.4884 0.1144 995 +997 3 332.7187 366.9998 34.9499 0.1202 996 +998 3 333.6854 367.3384 35.8439 0.1943 997 +999 3 334.5353 367.1096 35.138 0.175 998 +1000 3 335.4814 366.835 34.1099 0.2092 999 +1001 3 336.3623 367.1611 33.5208 0.2518 1000 +1002 3 337.1276 367.6816 32.3882 0.2734 1001 +1003 3 337.8712 367.7628 32.2591 0.1427 1002 +1004 3 338.6778 367.6622 33.4734 0.2347 1003 +1005 3 339.4145 367.3247 32.1992 0.3308 1004 +1006 3 339.6307 366.4232 32.4215 0.2011 1005 +1007 3 340.2931 366.5376 32.6239 0.1506 1006 +1008 3 341.3421 366.5422 31.8206 0.2058 1007 +1009 3 342.1075 366.7161 31.92 0.3307 1008 +1010 3 342.9334 367.224 32.7771 0.3351 1009 +1011 3 343.8281 367.748 32.6852 0.1729 1010 +1012 3 344.7364 367.645 34.0544 0.1652 1011 +1013 3 345.7351 367.3384 34.7774 0.4209 1012 +1014 3 346.4455 366.9014 33.9522 0.3178 1013 +1015 3 347.101 366.5639 35.4668 0.3222 1014 +1016 3 347.8835 365.8695 34.7645 0.3305 1015 +1017 3 348.9074 365.6224 34.4946 0.2994 1016 +1018 3 349.6201 365.3192 34.3185 0.2294 1017 +1019 3 350.4175 365.0824 33.0529 0.2258 1018 +1020 3 350.8637 364.3732 32.97 0.178 1019 +1021 3 351.3224 363.4888 32.6749 0.2429 1020 +1022 3 352.2296 363.4694 31.8889 0.2924 1021 +1023 3 353.1391 363.4019 31.1097 0.4057 1022 +1024 3 354.0097 363.1914 31.5011 0.1938 1023 +1025 3 354.9386 363.1056 30.3108 0.1745 1024 +1026 3 355.8355 363.1056 30.6432 0.178 1025 +1027 3 356.5024 363.2932 31.3572 0.2818 1026 +1028 3 357.5057 363.5518 31.0402 0.1804 1027 +1029 3 358.2825 363.5472 31.64 0.2034 1028 +1030 3 359.0044 362.8173 31.5025 0.2579 1029 +1031 3 359.6484 361.9708 31.36 0.1411 1030 +1032 3 360.4366 361.3004 31.8268 0.2161 1031 +1033 3 361.0716 360.9343 32.1446 0.2061 1032 +1034 3 361.8358 360.3394 32.1476 0.1907 1033 +1035 3 362.696 359.9733 31.3158 0.1786 1034 +1036 3 363.5563 359.4826 30.8 0.2948 1035 +1037 3 364.2153 358.8728 30.9005 0.2549 1036 +1038 3 364.761 358.3534 30.0868 0.1652 1037 +1039 3 365.4737 357.7231 30.2728 0.2321 1038 +1040 3 365.9793 356.8422 30.6594 0.1891 1039 +1041 3 366.8716 356.3091 30.6664 0.1875 1040 +1042 3 367.9367 356.3034 29.96 0.2484 1041 +1043 3 368.9995 356.2519 29.4608 0.1271 1042 +1044 3 369.9296 355.7623 29.6708 0.2231 1043 +1045 3 370.9706 355.4271 28.8912 0.2203 1044 +1046 3 371.7897 355.2097 29.1948 0.1144 1045 +1047 3 372.1146 354.5176 29.0657 0.2002 1046 +1048 3 372.9246 353.8346 29.4 0.1144 1047 +1049 3 373.7276 353.2214 29.2788 0.1144 1048 +1050 3 374.2173 352.2662 29.6145 0.178 1049 +1051 3 374.4758 351.3476 29.7707 0.2257 1050 +1052 3 374.8041 350.4667 29.6677 0.1757 1051 +1053 3 375.5535 349.6728 29.3412 0.1374 1052 +1054 3 376.2204 349.0824 28.7042 0.1973 1053 +1055 3 377.1779 348.6283 28.9979 0.1144 1054 +1056 3 377.9948 347.9545 28.56 0.1475 1055 +1057 3 379.0793 347.824 28.3665 0.1995 1056 +1058 3 380.1043 347.9064 28.2044 0.1707 1057 +1059 3 380.8319 347.3802 27.4327 0.1144 1058 +1060 3 381.4885 346.5119 27.9989 0.1144 1059 +1061 3 382.2756 345.7237 28.1588 0.148 1060 +1062 3 383.2537 345.2855 28.1644 0.1144 1061 +1063 3 384.1586 344.8371 28.3847 0.1649 1062 +1064 3 384.8633 344.3486 28.1022 0.1652 1063 +1065 3 385.8609 344.2319 28.5589 0.2288 1064 +1066 3 386.847 344.1152 29.3882 0.1669 1065 +1067 3 387.8595 343.8578 28.84 0.1144 1066 +1068 3 388.7301 343.756 29.8402 0.2288 1067 +1069 3 389.723 343.6622 29.0175 0.1144 1068 +1070 3 390.6783 343.772 29.6909 0.1271 1069 +1071 3 391.693 343.6599 29.2886 0.1893 1070 +1072 3 392.5464 343.0055 28.3965 0.1271 1071 +1073 3 393.3919 342.3855 27.8029 0.2227 1072 +1074 3 394.2327 341.8409 27.4509 0.136 1073 +1075 3 395.3641 341.7082 27.3224 0.1144 1074 +1076 3 396.4807 341.7471 27.5232 0.1144 1075 +1077 3 397.5411 341.9896 27.7264 0.1306 1076 +1078 3 398.5399 342.2711 27.4305 0.2408 1077 +1079 3 399.5786 342.2631 27.0824 0.1652 1078 +1080 3 400.6357 342.3683 26.8537 0.1579 1079 +1081 3 401.4994 342.0457 26.0968 0.1866 1080 +1082 3 402.5233 341.6579 26.1246 0.1144 1081 +1083 3 403.4671 341.2541 26.4256 0.178 1082 +1084 3 404.42 340.809 26.1114 0.1907 1083 +1085 3 405.3089 340.4395 26.7702 0.1837 1084 +1086 3 406.0685 339.7794 26.7064 0.1661 1085 +1087 3 407.073 339.4111 26.88 0.1882 1086 +1088 3 408.0614 339.0519 27.4232 0.1144 1087 +1089 3 409.02 338.9294 26.8265 0.2616 1088 +1090 3 410.0016 339.0233 26.0212 0.157 1089 +1091 3 411.1044 339.1731 25.6119 0.1554 1090 +1092 3 412.2015 338.9672 25.2 0.2803 1091 +1093 3 413.1453 338.6583 24.9427 0.178 1092 +1094 3 414.0628 338.4272 25.4892 0.2029 1093 +1095 3 415.1313 338.4215 25.8672 0.2249 1094 +1096 3 416.0991 338.1664 25.9473 0.215 1095 +1097 3 416.702 338.8848 26.0316 0.2151 1096 +1098 3 417.5165 339.4088 25.5066 0.3141 1097 +1099 3 418.5221 339.5438 26.1649 0.2796 1098 +1100 3 419.5803 339.6124 26.04 0.3072 1099 +1101 3 420.6705 339.4545 25.583 0.339 1100 +1102 3 421.6452 339.9099 25.8838 0.3156 1101 +1103 3 422.6336 339.9533 24.8178 0.3971 1102 +1104 3 423.5088 340.4544 25.2 0.2161 1103 +1105 3 360.9457 361.504 31.36 0.2034 1032 +1106 3 361.8369 361.6905 32.3196 0.1504 1105 +1107 3 362.5748 362.3323 31.374 0.1309 1106 +1108 3 363.5849 362.7521 31.7204 0.1169 1107 +1109 3 364.7061 362.9088 31.92 0.1499 1108 +1110 3 365.7585 363.3458 31.92 0.178 1109 +1111 3 366.8671 363.5987 31.92 0.1467 1110 +1112 3 367.8921 364.0402 31.948 0.1475 1111 +1113 3 368.8553 364.6088 31.8046 0.1877 1112 +1114 3 369.8575 365.1145 31.8534 0.1579 1113 +1115 3 370.7761 365.0847 31.4709 0.1289 1114 +1116 3 371.5197 365.1408 31.843 0.2288 1115 +1117 3 372.4098 365.3879 31.4978 0.2321 1116 +1118 3 373.1877 365.556 32.48 0.2159 1117 +1119 3 374.2207 365.8226 32.9132 0.1421 1118 +1120 3 375.1256 366.1681 31.92 0.1687 1119 +1121 3 376.1792 366.207 32.3148 0.2288 1120 +1122 3 377.0956 366.1944 33.4337 0.1382 1121 +1123 3 377.8792 366.6531 32.76 0.2536 1122 +1124 3 378.7326 367.1199 32.8205 0.2007 1123 +1125 3 379.7325 367.2343 33.551 0.2264 1124 +1126 3 380.6019 367.1611 33.4841 0.1197 1125 +1127 3 381.7162 366.9952 33.4622 0.1428 1126 +1128 3 382.8385 367.0078 33.6888 0.1399 1127 +1129 3 383.8715 367.2148 34.3179 0.1818 1128 +1130 3 384.9194 367.383 34.2345 0.1759 1129 +1131 3 385.8529 367.6816 35.0 0.1144 1130 +1132 3 386.9923 367.7399 35.0 0.1144 1131 +1133 3 387.9922 368.1392 35.2248 0.1144 1132 +1134 3 389.119 368.1392 34.9247 0.1144 1133 +1135 3 390.1852 368.2456 34.9238 0.1595 1134 +1136 3 391.2606 368.5579 35.453 0.2262 1135 +1137 3 392.3028 368.9732 35.3298 0.2005 1136 +1138 3 393.2889 369.2603 35.9719 0.2288 1137 +1139 3 394.0428 369.8895 36.7556 0.154 1138 +1140 3 394.9237 370.4764 36.1953 0.2071 1139 +1141 3 394.9305 371.1502 37.6628 0.1954 1140 +1142 3 395.0232 371.4934 36.36 0.1502 1141 +1143 3 394.7441 371.5334 34.4089 0.178 1142 +1144 3 395.3286 372.0963 33.88 0.2224 1143 +1145 3 396.1672 372.5505 33.1643 0.2288 1144 +1146 3 396.2816 373.1728 34.72 0.2161 1145 +1147 3 396.5916 372.9486 33.2268 0.1915 1145 +1148 3 397.3272 373.7151 33.1453 0.2709 1147 +1149 3 397.6944 374.5925 32.8703 0.1193 1148 +1150 3 398.3831 375.3567 32.76 0.1144 1149 +1151 3 399.3166 375.9985 32.7578 0.1144 1150 +1152 3 400.1094 376.6448 32.76 0.1144 1151 +1153 3 400.9606 377.3839 32.76 0.1144 1152 +1154 3 401.6641 378.2544 32.76 0.1334 1153 +1155 3 402.3345 379.1422 32.76 0.1469 1154 +1156 3 403.284 379.5609 33.2833 0.1244 1155 +1157 3 404.2942 380.0402 32.9918 0.2815 1156 +1158 3 405.3078 380.3445 33.0333 0.1448 1157 +1159 3 406.422 380.4063 32.6018 0.1144 1158 +1160 3 407.4802 380.7495 32.1376 0.1144 1159 +1161 3 408.4343 381.3158 31.64 0.156 1160 +1162 3 409.3163 382.0171 31.2348 0.216 1161 +1163 3 410.2075 382.7229 31.08 0.1336 1162 +1164 3 410.7818 383.6736 31.08 0.1144 1163 +1165 3 411.7382 384.201 31.1044 0.1169 1164 +1166 3 412.2496 384.7569 32.608 0.274 1165 +1167 3 413.2677 384.3977 32.226 0.1806 1166 +1168 3 414.0868 384.6128 32.1314 0.1924 1167 +1169 3 414.9929 385.0361 31.92 0.2288 1168 +1170 3 415.9607 385.5383 31.7419 0.2027 1169 +1171 3 416.6139 386.1103 31.309 0.1987 1170 +1172 3 417.4456 386.4832 32.4512 0.1793 1171 +1173 3 418.0359 386.958 31.4381 0.2283 1172 +1174 3 418.1469 387.9727 32.0832 0.3284 1173 +1175 3 419.0392 388.1592 32.8843 0.143 1174 +1176 3 419.6856 388.6168 33.6 0.1673 1175 +1177 3 420.7152 388.8044 34.4226 0.1342 1176 +1178 3 421.826 388.6248 34.72 0.1144 1177 +1179 3 422.6886 388.6168 33.3572 0.286 1178 +1180 3 423.614 388.968 33.88 0.2457 1179 +1181 3 424.4766 389.4485 33.8828 0.1628 1180 +1182 3 425.5268 389.6144 34.5685 0.2336 1181 +1183 3 426.6354 389.659 34.7354 0.3305 1182 +1184 3 427.1765 390.3351 34.694 0.4237 1183 +1185 3 427.8125 390.9689 34.9034 0.2349 1184 +1186 3 427.9933 391.9436 34.1468 0.1232 1185 +1187 3 428.5081 392.8759 34.7071 0.2105 1186 +1188 3 429.1865 393.6801 34.16 0.2678 1187 +1189 3 429.9404 394.426 34.16 0.1907 1188 +1190 3 430.5764 395.2394 33.833 0.1885 1189 +1191 3 431.1667 395.9762 33.4718 0.1941 1190 +1192 3 431.9733 396.5047 34.2622 0.2078 1191 +1193 3 432.6597 397.1808 34.72 0.115 1192 +1194 3 433.3712 397.7208 33.922 0.1566 1193 +1195 3 434.2018 398.2458 33.6748 0.2355 1194 +1196 3 434.6868 398.5673 33.6417 0.2075 1195 +1197 3 435.5837 398.4552 33.796 0.249 1196 +1198 3 436.6785 398.557 33.88 0.2418 1197 +1199 3 437.4713 398.716 33.2741 0.3112 1198 +1200 3 438.2115 398.7401 33.4642 0.1845 1199 +1201 3 439.026 398.6142 33.6924 0.2507 1200 +1202 3 439.9824 398.9128 32.76 0.1907 1201 +1203 3 394.132 370.9992 33.8898 0.2025 1143 +1204 3 393.2946 370.3071 33.4527 0.1679 1203 +1205 3 392.1941 370.0954 33.8008 0.1914 1204 +1206 3 391.0878 369.9696 33.9741 0.2203 1205 +1207 3 390.1406 370.362 34.3882 0.2174 1206 +1208 3 389.1945 370.9054 34.72 0.1649 1207 +1209 3 388.3663 371.6753 34.72 0.1873 1208 +1210 3 387.355 371.8904 35.4945 0.2288 1209 +1211 3 386.251 371.9144 35.2262 0.2288 1210 +1212 3 385.2042 372.0654 35.1434 0.2064 1211 +1213 3 384.0797 372.2507 35.0 0.2281 1212 +1214 3 382.9734 372.4864 35.373 0.1907 1213 +1215 3 381.9004 372.547 34.7393 0.2691 1214 +1216 3 380.9806 372.769 35.5846 0.2596 1215 +1217 3 380.1512 373.0206 36.0769 0.1588 1216 +1218 3 379.363 373.3341 36.8822 0.178 1217 +1219 3 378.4386 372.944 36.4 0.2543 1218 +1220 3 377.6344 373.381 35.4897 0.1287 1219 +1221 3 377.0407 374.0091 36.3947 0.2714 1220 +1222 3 376.3325 374.7252 37.2814 0.2796 1221 +1223 3 375.2995 374.954 37.5794 0.1749 1222 +1224 3 374.3969 375.4608 38.08 0.1144 1223 +1225 3 373.8329 375.9092 38.2687 0.1719 1224 +1226 3 373.6784 376.8233 37.6214 0.193 1225 +1227 3 372.8845 377.6264 37.8 0.2144 1226 +1228 3 372.07 377.9776 38.3062 0.3046 1227 +1229 3 371.2131 377.8632 39.3232 0.1144 1228 +1230 3 370.3151 377.3781 38.92 0.1846 1229 +1231 3 369.4491 377.0109 39.6841 0.1733 1230 +1232 3 368.3348 377.0624 39.76 0.2743 1231 +1233 3 367.3029 377.1768 39.3705 0.1907 1232 +1234 3 366.4209 376.8553 39.7869 0.1788 1233 +1235 3 365.5995 377.0841 41.1348 0.1374 1234 +1236 3 364.7038 377.6127 40.5958 0.1343 1235 +1237 3 364.0586 378.3185 40.0674 0.3033 1236 +1238 3 363.3344 378.537 39.44 0.3527 1237 +1239 3 362.7521 379.3069 40.2749 0.1455 1238 +1240 3 361.6195 379.3161 40.32 0.1499 1239 +1241 3 360.5247 379.2715 40.8702 0.2168 1240 +1242 3 360.1781 379.6135 39.503 0.2542 1241 +1243 3 359.7811 379.2921 37.5351 0.1652 1242 +1244 3 359.3178 379.3504 40.0089 0.2288 1243 +1245 3 359.1828 380.0013 40.04 0.2585 1244 +1246 3 358.5239 380.8422 39.949 0.2069 1245 +1247 3 358.0217 381.0389 37.8619 0.2143 1246 +1248 3 357.5927 381.484 39.968 0.2759 1247 +1249 3 356.8616 381.5537 41.3596 0.3305 1248 +1250 3 355.9293 382.048 41.1018 0.2415 1249 +1251 3 355.6639 382.3648 40.2892 0.2106 1250 +1252 3 354.9798 382.533 40.5706 0.3017 1251 +1253 3 354.0554 382.7298 40.6 0.274 1252 +1254 3 353.5658 383.4974 41.1533 0.2288 1253 +1255 3 353.0887 384.3966 40.9732 0.3051 1254 +1256 3 352.2468 385.1265 41.44 0.2288 1255 +1257 3 351.6988 385.9307 40.5871 0.3141 1256 +1258 3 351.4814 386.9065 39.76 0.3065 1257 +1259 3 350.6509 387.4511 40.0075 0.2613 1258 +1260 3 349.7666 387.784 39.7818 0.2746 1259 +1261 3 349.0744 388.4589 39.6984 0.4533 1260 +1262 3 348.2084 388.96 40.0128 0.2987 1261 +1263 3 347.6204 389.6372 39.76 0.2577 1262 +1264 3 346.5233 389.7059 40.0711 0.2288 1263 +1265 3 345.6253 389.993 40.6137 0.2288 1264 +1266 3 344.9503 390.5616 39.76 0.2415 1265 +1267 3 344.4916 390.3328 38.08 0.37 1266 +1268 3 343.5512 390.5319 37.9854 0.1907 1267 +1269 3 343.0273 391.1222 38.722 0.2019 1268 +1270 3 342.0583 391.5912 38.36 0.2664 1269 +1271 3 341.2666 391.4768 38.7943 0.2454 1270 +1272 3 340.5093 391.8966 39.6838 0.4021 1271 +1273 3 339.9213 392.2776 39.3649 0.2433 1272 +1274 3 338.9054 392.5293 40.0218 0.2702 1273 +1275 3 338.195 393.2637 40.4678 0.2825 1274 +1276 3 337.5155 393.9925 39.7645 0.2204 1275 +1277 3 337.2924 394.4844 37.5225 0.2278 1276 +1278 3 336.5351 395.1296 37.7451 0.259 1277 +1279 3 335.8326 395.8023 37.2537 0.3665 1278 +1280 3 334.8751 396.0917 37.7474 0.2337 1279 +1281 3 334.2745 396.7975 38.36 0.4065 1280 +1282 3 333.476 397.3112 37.6709 0.2161 1281 +1283 3 332.5379 397.0183 37.0154 0.2988 1282 +1284 3 331.7314 396.7392 35.84 0.232 1283 +1285 3 330.8608 397.1922 35.434 0.3559 1284 +1286 3 330.0898 397.0492 35.5359 0.3281 1285 +1287 3 329.2958 396.8639 36.2076 0.3536 1286 +1288 3 328.5259 397.1842 37.6566 0.3402 1287 +1289 3 327.6187 396.833 36.9667 0.2134 1288 +1290 3 327.1337 396.6328 35.5225 0.2619 1289 +1291 3 326.2173 396.523 34.2513 0.1913 1290 +1292 3 325.5355 396.968 34.9423 0.3365 1291 +1293 3 324.4636 397.1968 35.2884 0.3051 1292 +1294 3 323.6365 396.968 35.5902 0.2592 1293 +1295 3 322.656 396.7392 35.0154 0.1717 1294 +1296 3 321.7271 397.1968 35.2876 0.2858 1295 +1297 3 320.7879 396.8593 36.12 0.3522 1296 +1298 3 319.748 396.5104 35.84 0.2415 1297 +1299 3 318.8362 396.5504 36.9866 0.2505 1298 +1300 3 318.7207 395.9384 36.1304 0.2288 1299 +1301 3 317.9782 395.2566 35.8204 0.1753 1300 +1302 3 317.174 394.6811 35.7185 0.1697 1301 +1303 3 316.2416 394.2316 36.6596 0.1907 1302 +1304 3 315.2864 393.8792 35.84 0.2415 1303 +1305 3 319.9871 397.2597 36.0366 0.3413 1298 +1306 3 320.471 397.9987 35.2884 0.2277 1305 +1307 3 321.4262 397.9084 36.2471 0.212 1306 +1308 3 321.4423 398.5204 38.3443 0.1724 1307 +1309 3 321.6356 399.4596 38.5795 0.1209 1308 +1310 3 322.0623 400.0248 37.24 0.1983 1309 +1311 3 322.5256 400.9331 36.9874 0.2146 1310 +1312 3 322.7727 401.997 36.9496 0.1566 1311 +1313 3 323.1789 402.6788 35.3444 0.1285 1312 +1314 3 323.6033 403.26 33.8366 0.1271 1313 +1315 3 323.8675 404.1763 33.8803 0.1272 1314 +1316 3 324.6649 404.5733 34.5604 0.1206 1315 +1317 3 325.2392 404.9028 35.331 0.2477 1316 +1318 3 325.2552 406.0296 35.6014 0.2155 1317 +1319 3 325.2564 407.153 35.84 0.1928 1318 +1320 3 325.4348 408.1437 36.6506 0.1907 1319 +1321 3 325.4714 409.147 35.6468 0.1907 1320 +1322 3 325.7357 409.8769 37.1683 0.1359 1321 +1323 3 325.6968 410.8882 36.8656 0.2764 1322 +1324 3 325.8101 411.8983 35.8918 0.1894 1323 +1325 3 325.6831 413.0103 36.0612 0.3272 1324 +1326 3 325.6888 414.0902 36.251 0.4226 1325 +1327 3 325.357 415.0432 36.3311 0.3079 1326 +1328 3 325.6087 415.9595 37.6037 0.3432 1327 +1329 3 325.8043 416.8633 37.3937 0.2569 1328 +1330 3 326.0434 417.7122 37.8328 0.1174 1329 +1331 3 326.2997 418.7772 37.2907 0.1711 1330 +1332 3 326.5765 419.8526 36.6489 0.2691 1331 +1333 3 326.9563 420.666 37.4965 0.2921 1332 +1334 3 327.1211 421.5045 38.5434 0.2702 1333 +1335 3 326.7264 422.3373 37.5738 0.2895 1334 +1336 3 326.7264 423.4104 38.1671 0.3133 1335 +1337 3 326.4404 424.44 38.4423 0.3006 1336 +1338 3 326.3706 425.4158 38.7649 0.2542 1337 +1339 3 326.2791 426.4203 39.2269 0.2779 1338 +1340 3 326.4072 426.887 41.2261 0.2455 1339 +1341 3 326.6017 427.681 40.0582 0.3077 1340 +1342 3 326.6109 428.531 39.8115 0.2185 1341 +1343 3 326.6909 429.0103 40.4762 0.1832 1342 +1344 3 327.1806 429.8191 40.2114 0.1897 1343 +1345 3 327.629 430.7389 40.88 0.3048 1344 +1346 3 327.645 431.8806 40.9004 0.276 1345 +1347 3 327.756 432.758 42.0 0.1368 1346 +1348 3 327.4242 433.6904 41.7236 0.3432 1347 +1349 3 327.0296 434.3207 41.8681 0.2595 1348 +1350 3 327.0696 435.149 40.6 0.3082 1349 +1351 3 327.1771 436.0848 41.8146 0.1703 1350 +1352 3 326.8454 436.6614 42.8425 0.19 1351 +1353 3 326.5731 437.6029 43.4308 0.3303 1352 +1354 3 326.8957 438.5089 44.7199 0.1598 1353 +1355 3 327.192 439.4573 43.692 0.2063 1354 +1356 3 327.5295 440.5407 43.8869 0.3079 1355 +1357 3 328.2616 441.282 44.4058 0.2218 1356 +1358 3 328.749 442.2475 44.3265 0.1771 1357 +1359 3 328.8783 442.9568 43.5341 0.1216 1358 +1360 3 328.9458 444.0001 43.3107 0.1616 1359 +1361 3 329.7511 444.595 42.574 0.1144 1360 +1362 3 330.0772 445.6772 42.56 0.1144 1361 +1363 3 330.3758 446.7526 42.7403 0.217 1362 +1364 3 330.4055 447.1793 44.6519 0.1592 1363 +1365 3 330.7327 447.741 46.5478 0.178 1364 +1366 3 330.9569 448.6059 45.9763 0.2391 1365 +1367 3 331.1571 449.6103 45.92 0.1271 1366 +1368 3 331.3722 450.6136 46.879 0.2415 1367 +1369 3 331.4671 451.7393 47.2268 0.1965 1368 +1370 3 331.6822 452.841 47.4578 0.1586 1369 +1371 3 331.76 453.5262 47.6854 0.2073 1370 +1372 3 332.1032 454.0914 48.4089 0.3432 1371 +1373 3 332.4613 454.8636 47.88 0.3202 1372 +1374 3 332.904 455.5408 46.76 0.1907 1373 +1375 3 359.4448 378.6503 40.8708 0.1767 1244 +1376 3 359.4917 377.5406 40.3816 0.1612 1375 +1377 3 360.1918 376.7535 40.3472 0.2128 1376 +1378 3 361.2546 376.9411 40.2298 0.2358 1377 +1379 3 361.9044 376.2627 41.1191 0.2614 1378 +1380 3 362.4467 375.9642 41.515 0.2464 1379 +1381 3 363.1056 375.3796 42.1775 0.1612 1380 +1382 3 363.5632 374.485 42.2528 0.2796 1381 +1383 3 364.1832 373.7906 42.0 0.1608 1382 +1384 3 365.2426 373.4153 41.7004 0.1679 1383 +1385 3 366.1566 373.0435 42.5138 0.2146 1384 +1386 3 367.1862 372.8754 43.1015 0.249 1385 +1387 3 368.0488 372.4155 42.5309 0.2232 1386 +1388 3 368.5648 371.8675 41.9955 0.1875 1387 +1389 3 368.9114 370.9557 41.9356 0.2334 1388 +1390 3 369.695 370.966 42.2554 0.3255 1389 +1391 3 370.3025 370.1046 42.84 0.2819 1390 +1392 3 371.2715 369.6539 43.2916 0.2079 1391 +1393 3 372.3537 369.4045 43.4361 0.1677 1392 +1394 3 373.4851 369.4319 43.2706 0.2232 1393 +1395 3 374.2321 369.3976 43.7108 0.3407 1394 +1396 3 375.1336 369.1688 44.3694 0.3432 1395 +1397 3 376.0179 368.6826 44.8 0.2607 1396 +1398 3 376.376 367.8726 43.7732 0.1525 1397 +1399 3 375.9184 367.6816 43.68 0.1525 1398 +1400 3 377.1173 367.1565 44.8291 0.2423 1398 +1401 3 378.0096 366.8064 45.0825 0.1522 1400 +1402 3 378.6846 366.0949 45.1637 0.1618 1401 +1403 3 379.1685 365.3375 45.9732 0.2034 1402 +1404 3 380.0196 364.793 46.6575 0.2447 1403 +1405 3 380.6088 364.2416 47.6966 0.2091 1404 +1406 3 380.936 363.3161 47.1383 0.214 1405 +1407 3 381.4668 362.402 47.3833 0.1173 1406 +1408 3 382.2161 361.5543 47.32 0.1144 1407 +1409 3 382.9368 360.8176 47.32 0.1144 1408 +1410 3 383.9493 360.4927 47.3088 0.119 1409 +1411 3 384.7306 359.7869 47.0977 0.1446 1410 +1412 3 385.4914 359.0524 47.6 0.153 1411 +1413 3 385.8106 357.9954 47.8464 0.2034 1412 +1414 3 386.3917 357.031 47.5714 0.1292 1413 +1415 3 387.435 356.92 47.2458 0.1407 1414 +1416 3 388.5196 356.7564 47.8979 0.1375 1415 +1417 3 389.4027 356.0963 47.978 0.1217 1416 +1418 3 390.0605 355.1605 47.978 0.1144 1417 +1419 3 390.7057 354.2202 48.1034 0.1144 1418 +1420 3 391.375 353.3107 48.5416 0.1144 1419 +1421 3 392.0442 352.4 48.9796 0.1144 1420 +1422 3 392.7135 351.4894 49.4178 0.1144 1421 +1423 3 393.3827 350.5799 49.856 0.1144 1422 +1424 3 393.8918 349.5686 50.0055 0.1144 1423 +1425 3 394.3162 348.507 50.0055 0.1144 1424 +1426 3 308.8262 367.7846 31.4258 0.344 773 +1427 3 308.6134 367.0066 33.3189 0.2659 1426 +1428 3 308.2771 365.9793 33.3928 0.1979 1427 +1429 3 307.5587 365.1351 33.9052 0.1555 1428 +1430 3 307.5015 364.1112 35.028 0.1647 1429 +1431 3 307.7063 362.9958 35.3438 0.1652 1430 +1432 3 307.5209 361.901 36.0018 0.1907 1431 +1433 3 306.7819 362.076 36.2443 0.3024 1432 +1434 3 305.6722 362.3242 36.54 0.3998 1433 +1435 3 304.5923 362.2876 37.0306 0.3947 1434 +1436 3 303.5604 361.8735 37.613 0.344 1435 +1437 3 302.5445 361.536 38.4048 0.2859 1436 +1438 3 301.6888 361.0247 39.4593 0.2601 1437 +1439 3 300.9956 360.1747 40.2433 0.2542 1438 +1440 3 300.0952 359.6919 41.1124 0.2542 1439 +1441 3 299.2052 359.1279 41.8561 0.2463 1440 +1442 3 298.5771 358.215 42.4536 0.2497 1441 +1443 3 297.8004 357.4256 42.905 0.2373 1442 +1444 3 296.9698 356.6614 42.7372 0.2462 1443 +1445 3 296.1747 355.8664 42.2282 0.263 1444 +1446 3 295.5066 354.9569 42.2663 0.3212 1445 +1447 3 295.0193 353.9593 42.875 0.3524 1446 +1448 3 294.3832 353.0338 43.2312 0.3466 1447 +1449 3 293.4852 352.5762 44.2467 0.2927 1448 +1450 3 292.4567 352.5167 45.4297 0.2567 1449 +1451 3 291.7131 351.7663 46.3053 0.29 1450 +1452 3 290.9032 351.1988 47.696 0.3305 1451 +1453 3 289.861 351.2721 48.3708 0.306 1452 +1454 3 288.8497 351.7606 48.8673 0.3297 1453 +1455 3 287.8819 352.3383 49.3408 0.2924 1454 +1456 3 286.7733 352.4675 48.7295 0.2791 1455 +1457 3 285.6316 352.4801 48.5968 0.2289 1456 +1458 3 284.6569 352.654 49.8602 0.2428 1457 +1459 3 284.0792 353.2535 51.3724 0.2641 1458 +1460 3 283.1343 352.7993 51.1025 0.3226 1459 +1461 3 282.6858 352.3932 51.2627 0.3432 1460 +1462 3 282.3953 351.5112 51.8311 0.2684 1461 +1463 3 282.0818 350.7207 53.4391 0.1967 1462 +1464 3 281.0991 350.3569 52.9659 0.2988 1463 +1465 3 279.9677 350.4049 52.9491 0.2685 1464 +1466 3 279.0056 350.4335 52.08 0.2757 1465 +1467 3 278.0721 350.2493 52.7481 0.1453 1466 +1468 3 277.1397 350.4484 52.1564 0.1769 1467 +1469 3 276.1696 350.6829 51.5343 0.1329 1468 +1470 3 275.5965 351.1073 52.92 0.1549 1469 +1471 3 274.7922 351.5867 53.6547 0.1144 1470 +1472 3 273.7958 351.2881 53.333 0.3505 1471 +1473 3 272.7319 350.9414 53.1544 0.3499 1472 +1474 3 271.9929 350.2928 53.636 0.2415 1473 +1475 3 270.9141 350.1601 54.1618 0.2102 1474 +1476 3 270.1213 349.468 54.0184 0.1917 1475 +1477 3 269.3674 348.92 53.1742 0.3327 1476 +1478 3 268.7164 348.8697 51.9848 0.3432 1477 +1479 3 267.7692 348.5676 52.9592 0.2129 1478 +1480 3 266.7808 348.3663 53.8432 0.1763 1479 +1481 3 266.5051 347.4362 54.8932 0.1217 1480 +1482 3 266.2191 346.8322 54.2982 0.1535 1481 +1483 3 265.686 345.8987 53.6281 0.277 1482 +1484 3 265.3016 344.8954 53.8294 0.2388 1483 +1485 3 264.685 344.447 55.1692 0.1209 1484 +1486 3 264.566 343.6118 56.28 0.1301 1485 +1487 3 263.5193 343.653 56.2257 0.1751 1486 +1488 3 262.8935 343.3933 54.654 0.1918 1487 +1489 3 261.9051 342.9266 54.5208 0.2142 1488 +1490 3 261.1191 342.9712 54.4513 0.3135 1489 +1491 3 260.2417 342.5628 54.0876 0.2982 1490 +1492 3 259.164 342.2242 53.8779 0.2081 1491 +1493 3 258.1287 341.8055 53.6679 0.1238 1492 +1494 3 257.0065 341.7128 53.76 0.1144 1493 +1495 3 256.0409 341.5698 54.4544 0.148 1494 +1496 3 255.533 340.817 55.2919 0.1854 1495 +1497 3 255.0354 339.9716 54.5689 0.2415 1496 +1498 3 254.7928 339.6959 55.4229 0.1144 1497 +1499 3 253.7918 339.3356 56.0 0.1144 1498 +1500 3 252.7817 338.9718 56.0 0.1144 1499 +1501 3 251.9477 338.5096 55.347 0.1525 1500 +1502 3 251.0851 337.9376 55.0889 0.1144 1501 +1503 3 250.1608 337.3885 54.6378 0.1195 1502 +1504 3 249.1609 337.0224 55.4408 0.1268 1503 +1505 3 248.82 336.1701 55.72 0.1144 1504 +1506 3 248.5935 335.1359 55.72 0.1144 1505 +1507 3 247.6474 334.5765 55.72 0.1144 1506 +1508 3 246.5412 334.3912 55.72 0.1144 1507 +1509 3 245.4052 334.3363 55.72 0.1144 1508 +1510 3 244.4648 333.7448 55.72 0.1144 1509 +1511 3 243.5782 333.0424 55.6349 0.1341 1510 +1512 3 242.7202 332.3389 55.592 0.2161 1511 +1513 3 242.1493 331.5632 54.6 0.1775 1512 +1514 3 241.1975 331.1834 55.3101 0.1144 1513 +1515 3 240.2526 330.7178 55.44 0.1144 1514 +1516 3 239.7035 329.9239 55.44 0.1144 1515 +1517 3 238.6098 329.7305 55.44 0.1144 1516 +1518 3 237.6557 329.1894 55.44 0.1144 1517 +1519 3 236.7668 328.479 55.44 0.1144 1518 +1520 3 235.7658 327.9974 55.16 0.1525 1519 +1521 3 235.4352 328.5568 55.16 0.1144 1520 +1522 3 234.8609 327.6027 55.4764 0.1612 1520 +1523 3 233.821 327.1497 55.8398 0.1713 1522 +1524 3 232.7743 326.7047 56.0871 0.1722 1523 +1525 3 231.7126 326.2802 56.0871 0.1538 1524 +1526 3 230.6315 325.9794 56.0871 0.1328 1525 +1527 3 229.5367 325.8478 56.0871 0.1144 1526 +1528 3 228.514 325.3364 56.0871 0.1144 1527 +1529 3 227.5141 324.7805 56.0871 0.1144 1528 +1530 3 226.5314 324.1959 56.0871 0.1144 1529 +1531 3 225.5739 323.5701 56.0871 0.1144 1530 +1532 3 224.6152 322.9455 56.0871 0.1144 1531 +1533 3 290.3278 351.1165 47.679 0.2708 1452 +1534 3 289.4446 351.3213 48.44 0.4465 1533 +1535 3 288.8692 350.8808 48.9726 0.3231 1534 +1536 3 288.9378 349.8627 49.6104 0.1838 1535 +1537 3 288.5168 348.8182 49.84 0.1158 1536 +1538 3 288.0615 348.2233 50.6125 0.2119 1537 +1539 3 287.5124 347.8069 52.6414 0.3371 1538 +1540 3 287.4666 346.8814 54.061 0.2598 1539 +1541 3 287.0342 346.2533 55.2619 0.2531 1540 +1542 3 286.7402 345.2592 55.1911 0.3012 1541 +1543 3 286.3981 344.5934 56.4668 0.3432 1542 +1544 3 286.8008 344.3703 58.2319 0.3305 1543 +1545 3 287.1383 343.772 56.8837 0.2669 1544 +1546 3 287.9448 343.7068 58.1101 0.1539 1545 +1547 3 288.3841 343.963 59.8041 0.1144 1546 +1548 3 288.852 342.938 59.92 0.2255 1547 +1549 3 289.4228 342.239 61.0697 0.178 1548 +1550 3 290.0132 341.5412 61.0467 0.218 1549 +1551 3 290.2191 340.4636 60.7583 0.2682 1550 +1552 3 289.6608 339.7794 61.2724 0.1457 1551 +1553 3 289.1117 338.8459 61.2363 0.1701 1552 +1554 3 288.4676 338.0875 61.0095 0.15 1553 +1555 3 288.0272 337.2821 62.0203 0.3305 1554 +1556 3 288.3658 336.9663 63.5295 0.1396 1555 +1557 3 288.6667 336.0328 63.8448 0.19 1556 +1558 3 288.9744 335.2858 62.4943 0.2224 1557 +1559 3 289.4423 334.5525 63.56 0.1329 1558 +1560 3 289.5487 333.6098 63.4805 0.2288 1559 +1561 3 289.6528 332.5837 64.0836 0.2262 1560 +1562 3 290.3804 332.1032 65.2215 0.1144 1561 +1563 3 291.4477 331.863 65.5102 0.1412 1562 +1564 3 292.1479 331.0919 65.52 0.1457 1563 +1565 3 293.2896 331.045 65.52 0.1144 1564 +1566 3 294.2894 330.5691 65.52 0.1195 1565 +1567 3 295.1028 329.8632 65.4682 0.2259 1566 +1568 3 295.4975 329.1288 65.5682 0.1247 1567 +1569 3 295.621 328.7078 67.7009 0.1144 1568 +1570 3 296.4264 328.3543 66.901 0.1905 1569 +1571 3 297.0739 327.5981 66.64 0.2635 1570 +1572 3 297.4446 326.5994 67.2532 0.1256 1571 +1573 3 298.1527 325.8638 67.76 0.1144 1572 +1574 3 298.9135 325.1191 67.0289 0.1957 1573 +1575 3 299.156 324.205 67.4909 0.3051 1574 +1576 3 299.4786 323.2441 68.3516 0.3178 1575 +1577 3 299.728 322.2671 68.5404 0.1988 1576 +1578 3 300.0346 321.2238 68.3284 0.178 1577 +1579 3 299.9568 320.2342 69.3118 0.326 1578 +1580 3 299.8516 319.4025 67.8031 0.2669 1579 +1581 3 300.332 319.3625 66.0887 0.2341 1580 +1582 3 300.0712 319.9768 64.1455 0.1147 1581 +1583 3 300.0712 319.9768 61.3455 0.1144 1582 +1584 3 300.5265 319.8372 59.1923 0.1854 1583 +1585 3 300.7496 318.7344 59.08 0.2262 1584 +1586 3 300.2165 318.3489 57.801 0.2102 1585 +1587 3 300.5059 317.6213 56.56 0.2163 1586 +1588 3 300.5288 316.7519 56.3066 0.1144 1587 +1589 3 300.7954 316.2908 58.0303 0.3378 1588 +1590 3 300.5265 315.5186 59.4642 0.2684 1589 +1591 3 300.5803 314.4273 59.619 0.2201 1590 +1592 3 300.3 313.4823 58.8 0.3589 1591 +1593 3 300.872 312.6552 59.36 0.2415 1592 +1594 3 307.5392 361.6859 36.8749 0.278 1432 +1595 3 307.6594 360.7101 37.3873 0.2759 1594 +1596 3 307.6216 359.7079 36.5616 0.2277 1595 +1597 3 307.5072 358.7939 36.2776 0.2034 1596 +1598 3 307.9511 358.0342 35.0669 0.1342 1597 +1599 3 308.4224 357.1316 35.2184 0.1144 1598 +1600 3 308.2645 356.5882 37.3752 0.2288 1599 +1601 3 308.6089 355.7005 37.8725 0.3276 1600 +1602 3 308.427 354.7544 38.5445 0.2064 1601 +1603 3 308.1982 354.3014 40.2822 0.1681 1602 +1604 3 308.4144 353.2031 40.32 0.1144 1603 +1605 3 308.1833 352.352 39.5142 0.3432 1604 +1606 3 307.998 351.4665 39.6662 0.22 1605 +1607 3 307.4111 351.1279 41.1289 0.1463 1606 +1608 3 307.617 350.5308 39.4271 0.1731 1607 +1609 3 306.9043 350.1635 38.3037 0.1423 1608 +1610 3 306.4776 349.2312 38.1595 0.1488 1609 +1611 3 306.9112 348.9944 40.159 0.2481 1610 +1612 3 306.4696 348.4773 40.3231 0.2918 1611 +1613 3 305.8644 348.1352 40.7154 0.1411 1612 +1614 3 306.0394 347.5872 42.56 0.1205 1613 +1615 3 305.7912 346.8619 41.2264 0.2934 1614 +1616 3 305.8656 345.9113 40.3262 0.1279 1615 +1617 3 305.5532 345.1036 41.2087 0.126 1616 +1618 3 305.4125 344.1141 42.5216 0.1194 1617 +1619 3 305.2261 343.1165 42.9176 0.2288 1618 +1620 3 305.1197 342.1933 42.0095 0.1907 1619 +1621 3 305.2958 341.2644 43.1805 0.2871 1620 +1622 3 305.5418 340.221 42.9741 0.3178 1621 +1623 3 305.2524 339.2646 43.2849 0.1691 1622 +1624 3 305.0579 338.1607 43.12 0.2235 1623 +1625 3 305.0407 337.3278 42.7781 0.2287 1624 +1626 3 304.5236 336.4241 42.1725 0.1144 1625 +1627 3 303.9768 335.8212 43.12 0.3 1626 +1628 3 303.629 335.2618 43.68 0.1816 1627 +1629 3 303.4586 334.5228 43.0181 0.2392 1628 +1630 3 303.3144 333.8055 43.0004 0.2295 1629 +1631 3 303.732 333.1328 42.5919 0.2527 1630 +1632 3 303.7549 332.2496 42.3956 0.2529 1631 +1633 3 303.9128 331.2921 42.2422 0.2899 1632 +1634 3 304.1518 330.616 42.9332 0.2796 1633 +1635 3 303.6176 330.8448 43.4 0.1271 1634 +1636 3 304.0752 329.3656 42.9649 0.1971 1634 +1637 3 303.9379 328.4813 43.7172 0.2211 1636 +1638 3 304.0237 327.4826 43.7984 0.2288 1637 +1639 3 303.7366 326.5834 44.0798 0.2152 1638 +1640 3 303.263 326.2871 45.64 0.1391 1639 +1641 3 303.2103 325.5183 44.0255 0.2034 1640 +1642 3 303.168 324.5494 44.4763 0.2535 1641 +1643 3 303.7446 323.9934 45.6145 0.171 1642 +1644 3 304.2891 323.0736 45.472 0.1144 1643 +1645 3 304.4756 322.2202 45.36 0.1922 1644 +1646 3 303.9516 321.4102 44.5449 0.1594 1645 +1647 3 303.7583 321.035 46.7432 0.1144 1646 +1648 3 302.7836 320.6884 46.9501 0.1271 1647 +1649 3 301.7483 320.2502 46.9535 0.1866 1648 +1650 3 301.0242 319.9699 47.9032 0.2034 1649 +1651 3 300.3721 319.2355 48.314 0.414 1650 +1652 3 300.0769 318.2345 48.0668 0.3417 1651 +1653 3 300.1284 317.1614 48.44 0.3773 1652 +1654 3 300.1387 316.1215 47.8092 0.2415 1653 +1655 3 300.7576 315.5278 48.7463 0.3264 1654 +1656 3 301.3113 314.9123 50.029 0.3082 1655 +1657 3 301.9016 314.8288 50.68 0.2161 1656 +1658 4 299.8081 376.1609 30.4601 0.3051 1 +1659 4 299.3013 375.1451 30.7992 0.3564 1658 +1660 4 298.8506 374.0937 30.7941 0.4198 1659 +1661 4 298.0509 373.2769 30.7602 0.4587 1660 +1662 4 297.2352 372.4795 30.5836 0.4971 1661 +1663 4 296.5694 371.6067 29.8116 0.5346 1662 +1664 4 295.8361 370.7304 29.6834 0.5439 1663 +1665 4 295.0902 369.8655 29.6951 0.4923 1664 +1666 4 294.5285 368.8702 29.7615 0.43 1665 +1667 4 294.0446 367.8429 30.109 0.3964 1666 +1668 4 293.6465 366.8076 30.7479 0.434 1667 +1669 4 293.5138 365.6727 30.8496 0.4585 1668 +1670 4 293.3433 364.5493 31.1094 0.4703 1669 +1671 4 293.1065 363.4968 32.027 0.4692 1670 +1672 4 293.0836 362.4203 32.928 0.453 1671 +1673 4 293.0436 361.2775 33.0453 0.4068 1672 +1674 4 292.7954 360.2307 33.073 0.3705 1673 +1675 4 292.6398 359.1005 33.2525 0.3928 1674 +1676 4 292.6226 357.9999 34.0102 0.4062 1675 +1677 4 292.5528 356.8628 34.1984 0.4312 1676 +1678 4 292.2382 355.7668 34.4064 0.4322 1677 +1679 4 292.0746 354.6789 35.1644 0.4198 1678 +1680 4 291.609 353.6379 35.2895 0.3568 1679 +1681 4 291.1148 352.606 35.3405 0.3054 1680 +1682 4 290.4753 351.6633 35.5897 0.2669 1681 +1683 4 289.8759 350.9495 36.5243 0.2694 1682 +1684 4 289.3016 350.0526 37.5057 0.2357 1683 +1685 4 288.6369 349.2335 37.863 0.2288 1684 +1686 4 287.7503 348.5574 37.2428 0.254 1685 +1687 4 286.9621 347.7703 36.9382 0.2927 1686 +1688 4 286.3077 346.8471 37.2775 0.312 1687 +1689 4 285.6614 345.9147 37.5234 0.3108 1688 +1690 4 284.9979 344.9835 37.5365 0.3121 1689 +1691 4 284.2691 344.106 37.5906 0.3389 1690 +1692 4 283.4946 343.2744 37.8624 0.3701 1691 +1693 4 282.8895 342.4335 38.8769 0.3885 1692 +1694 4 282.3609 341.5046 39.6357 0.3792 1693 +1695 4 281.9056 340.4624 39.6536 0.3612 1694 +1696 4 281.5373 339.4008 39.2008 0.3559 1695 +1697 4 281.0682 338.378 38.8234 0.3636 1696 +1698 4 280.4699 337.4171 39.0328 0.3764 1697 +1699 4 279.8247 336.4939 39.5248 0.3734 1698 +1700 4 279.1943 335.5489 39.7446 0.3607 1699 +1701 4 278.7859 334.4942 39.7603 0.3479 1700 +1702 4 278.2929 333.4771 39.7625 0.3512 1701 +1703 4 277.7197 332.4876 39.7743 0.364 1702 +1704 4 277.1443 331.4992 39.8362 0.3848 1703 +1705 4 276.6535 330.4844 40.2108 0.394 1704 +1706 4 276.2188 329.4468 40.7154 0.4025 1705 +1707 4 275.7921 328.3909 40.88 0.3814 1706 +1708 4 275.4134 327.3133 40.8806 0.3346 1707 +1709 4 275.132 326.2047 40.8836 0.2579 1708 +1710 4 275.0668 325.0699 40.9055 0.2029 1709 +1711 4 274.6664 324.0426 41.0228 0.1995 1710 +1712 4 273.9697 323.2418 41.8933 0.2402 1711 +1713 4 273.4377 322.314 42.7798 0.2954 1712 +1714 4 273.0614 321.2993 42.1565 0.3375 1713 +1715 4 272.6152 320.7524 41.9695 0.2288 1714 +1716 4 272.2548 319.6954 41.6987 0.3461 1715 +1717 4 271.6851 318.8751 41.6464 0.3855 1716 +1718 4 270.9999 318.175 42.4326 0.4599 1717 +1719 4 270.4393 317.2552 43.2054 0.3625 1718 +1720 4 270.0961 316.2336 43.7791 0.3183 1719 +1721 4 269.3662 315.5095 44.4444 0.2868 1720 +1722 4 269.2621 314.6458 43.127 0.3296 1721 +1723 4 268.4659 314.0692 42.4511 0.309 1722 +1724 4 267.863 313.1952 42.014 0.4068 1723 +1725 4 267.0188 312.5099 41.5904 0.3432 1724 +1726 4 266.4113 311.7343 42.0263 0.3988 1725 +1727 4 265.9251 310.9815 41.9614 0.3432 1726 +1728 4 265.7512 310.286 43.4372 0.3489 1727 +1729 4 265.3439 309.2873 43.12 0.3051 1728 +1730 4 265.2478 308.7073 42.3116 0.2998 1729 +1731 4 264.836 308.3892 41.0894 0.3316 1730 +1732 4 265.3748 307.5633 40.9175 0.2034 1731 +1733 4 265.1792 306.6675 40.1321 0.1144 1732 +1734 4 264.8474 306.258 40.0011 0.1652 1733 +1735 4 265.2501 305.4755 41.498 0.1813 1734 +1736 4 265.702 304.6049 42.56 0.317 1735 +1737 4 265.6505 303.7446 41.993 0.1675 1736 +1738 4 266.4708 303.343 41.6858 0.2187 1737 +1739 4 267.0519 302.6258 40.7162 0.2177 1738 +1740 4 267.8413 301.9966 41.0822 0.2161 1739 +1741 4 268.5288 301.3776 41.6612 0.2288 1740 +1742 4 268.5849 300.4373 41.6147 0.2875 1741 +1743 4 269.0631 299.5736 41.7836 0.4758 1742 +1744 4 269.3914 298.9936 40.8884 0.3212 1743 +1745 4 269.8318 298.3255 41.2056 0.4036 1744 +1746 4 270.2368 297.3084 40.6137 0.2486 1745 +1747 4 270.6246 296.3692 41.0295 0.3533 1746 +1748 4 270.858 295.3854 41.8037 0.2288 1747 +1749 4 271.4449 294.6418 42.6056 0.2717 1748 +1750 4 272.3452 294.1018 42.814 0.1144 1749 +1751 4 272.4539 293.6087 40.8814 0.1646 1750 +1752 4 272.7204 292.8034 41.979 0.2878 1751 +1753 4 272.8143 291.9248 40.7901 0.3051 1752 +1754 4 273.2318 291.2544 41.5232 0.2044 1753 +1755 4 273.416 290.282 42.1518 0.1271 1754 +1756 4 272.7925 289.8461 40.8962 0.198 1755 +1757 4 272.6209 288.9836 40.3808 0.2981 1756 +1758 4 272.5752 288.4493 39.2081 0.2321 1757 +1759 4 272.6678 287.5341 40.2833 0.1348 1758 +1760 4 272.7662 286.7596 38.92 0.2034 1759 +1761 4 273.0488 286.1064 40.0319 0.1923 1760 +1762 4 272.8818 285.1271 40.3096 0.2076 1761 +1763 4 272.9584 284.2691 39.5111 0.1652 1762 +1764 4 273.5498 283.6811 40.6347 0.1144 1763 +1765 4 274.1333 282.9146 39.6525 0.135 1764 +1766 4 274.2477 281.8381 39.0757 0.2477 1765 +1767 4 274.2385 280.9481 38.3975 0.2257 1766 +1768 4 273.8381 279.9242 38.4 0.1608 1767 +1769 4 273.3542 278.9278 38.1562 0.1745 1768 +1770 4 272.8348 278.0824 38.2018 0.1922 1769 +1771 4 272.3864 277.1775 38.519 0.2669 1770 +1772 4 272.1553 276.2691 37.8008 0.1528 1771 +1773 4 271.9288 275.1984 38.4185 0.1891 1772 +1774 4 272.3086 274.4124 38.0405 0.2547 1773 +1775 4 272.5752 273.4354 38.3214 0.2034 1774 +1776 4 272.3281 272.7582 38.0467 0.2834 1775 +1777 4 271.5982 272.2411 36.9163 0.2465 1776 +1778 4 271.1303 271.5684 38.2782 0.1144 1777 +1779 4 271.6863 270.8077 37.8616 0.2034 1778 +1780 4 271.875 269.9565 36.8329 0.2258 1779 +1781 4 271.6314 269.0722 37.3332 0.1783 1780 +1782 4 271.2413 268.3206 36.2782 0.2715 1781 +1783 4 271.2104 267.5198 36.0186 0.1965 1782 +1784 4 271.128 266.7373 36.9883 0.2924 1783 +1785 4 270.9244 265.726 36.4 0.2034 1784 +1786 4 270.8992 265.8656 37.24 0.2288 1785 +1787 4 271.1166 265.1277 36.12 0.1314 1785 +1788 4 271.2378 264.2434 36.2631 0.1144 1787 +1789 4 271.1177 263.1715 36.0511 0.1252 1788 +1790 4 270.9793 262.2403 37.1862 0.1181 1789 +1791 4 271.3225 261.2484 37.2089 0.1631 1790 +1792 4 271.2424 260.5483 36.1147 0.17 1791 +1793 4 271.128 259.8768 35.3027 0.2322 1792 +1794 4 271.1841 258.9398 36.1043 0.1841 1793 +1795 4 271.4712 257.9926 35.8907 0.1635 1794 +1796 4 271.5856 257.0682 35.5264 0.1904 1795 +1797 4 271.3831 256.065 34.7922 0.1447 1796 +1798 4 271.1406 254.9987 34.7516 0.2287 1797 +1799 4 271.128 254.0572 35.4824 0.2669 1798 +1800 4 271.0216 253.4772 34.2278 0.1983 1799 +1801 4 271.0948 252.5517 34.9602 0.1636 1800 +1802 4 271.3568 251.6811 35.3447 0.178 1801 +1803 4 271.8007 250.7545 35.2814 0.216 1802 +1804 4 271.9528 249.9285 34.2157 0.1446 1803 +1805 4 272.0306 249.0728 33.32 0.2889 1804 +1806 4 272.5408 248.5855 35.0 0.2669 1805 +1807 4 272.7296 247.5856 34.1986 0.1677 1806 +1808 4 272.518 246.564 34.7589 0.2193 1807 +1809 4 272.1233 245.4978 35.0 0.269 1808 +1810 4 271.8144 244.4476 35.0297 0.2444 1809 +1811 4 271.7023 243.338 35.3186 0.1659 1810 +1812 4 271.8888 242.5291 35.0 0.247 1811 +1813 4 272.5008 241.8313 35.5236 0.2798 1812 +1814 4 273.2558 241.1815 35.6112 0.2288 1813 +1815 4 273.8278 240.2755 36.2239 0.202 1814 +1816 4 274.1264 239.2516 36.0335 0.1725 1815 +1817 4 274.3266 238.1819 36.2085 0.1144 1816 +1818 4 274.6469 237.2564 35.1226 0.1695 1817 +1819 4 275.1514 236.4614 35.7316 0.1652 1818 +1820 4 275.704 235.7212 35.5776 0.1955 1819 +1821 4 275.7646 234.6676 35.6908 0.1967 1820 +1822 4 276.1353 233.7489 36.0923 0.2556 1821 +1823 4 276.276 232.7903 35.2531 0.2288 1822 +1824 4 276.7004 231.9666 34.5369 0.3238 1823 +1825 4 276.7462 230.9644 33.6 0.2204 1824 +1826 4 276.9933 230.2346 33.8254 0.2288 1825 +1827 4 277.857 229.7072 34.16 0.1144 1826 +1828 4 277.9989 228.6215 33.8125 0.2052 1827 +1829 4 278.6956 227.8299 33.6129 0.1306 1828 +1830 4 279.3431 227.1023 33.0711 0.1512 1829 +1831 4 279.2001 226.2066 33.8484 0.2924 1830 +1832 4 279.4792 225.8256 35.0 0.2415 1831 +1833 4 264.6175 308.5723 44.3792 0.3432 1729 +1834 4 264.0352 308.1101 43.7251 0.3051 1833 +1835 4 263.4106 307.3013 43.7478 0.4046 1834 +1836 4 263.0548 306.4787 43.4862 0.2063 1835 +1837 4 262.397 305.8793 43.9267 0.1913 1836 +1838 4 261.8593 305.4263 44.24 0.3159 1837 +1839 4 261.2919 304.5145 43.7203 0.405 1838 +1840 4 261.0288 303.5158 43.5868 0.3016 1839 +1841 4 261.0768 302.5445 43.787 0.2613 1840 +1842 4 260.7874 301.8112 42.4673 0.3777 1841 +1843 4 260.705 300.8548 41.2639 0.243 1842 +1844 4 260.2474 300.0071 41.8135 0.3305 1843 +1845 4 259.8985 299.3619 43.3874 0.3813 1844 +1846 4 259.1286 298.624 42.8565 0.2601 1845 +1847 4 258.655 298.0578 43.2172 0.2669 1846 +1848 4 258.1413 297.1712 43.1343 0.3247 1847 +1849 4 257.6288 296.6392 43.96 0.3686 1848 +1850 4 257.0648 295.7469 44.8678 0.276 1849 +1851 4 256.7239 294.8706 46.3028 0.1907 1850 +1852 4 256.2205 294.4965 45.6817 0.3671 1851 +1853 4 255.8956 293.5252 45.9388 0.3934 1852 +1854 4 255.7881 292.4098 45.4096 0.3386 1853 +1855 4 255.1692 291.7989 45.0251 0.486 1854 +1856 4 254.6544 291.2521 46.5273 0.3553 1855 +1857 4 254.3512 290.576 46.132 0.2844 1856 +1858 4 253.7392 289.9376 46.058 0.1661 1857 +1859 4 253.4326 289.2673 47.7621 0.275 1858 +1860 4 253.078 288.383 47.1654 0.2204 1859 +1861 4 252.7737 287.311 46.8532 0.2094 1860 +1862 4 252.3492 286.4862 47.0719 0.3208 1861 +1863 4 252.0426 285.7254 48.1449 0.2672 1862 +1864 4 251.9752 284.9143 49.3147 0.2288 1863 +1865 4 251.2064 284.2794 50.3468 0.2288 1864 +1866 4 250.5543 283.4043 50.0458 0.3202 1865 +1867 4 249.9937 282.997 48.16 0.2812 1866 +1868 4 249.4229 282.4628 49.287 0.3432 1867 +1869 4 249.1254 281.551 49.9022 0.2796 1868 +1870 4 248.5626 281.6242 48.8846 0.1683 1869 +1871 4 247.4918 281.4274 49.5628 0.2463 1870 +1872 4 246.7505 280.7982 49.3511 0.2515 1871 +1873 4 245.8525 280.3807 50.1315 0.281 1872 +1874 4 245.2816 279.8853 50.1273 0.2169 1873 +1875 4 244.5666 279.454 49.28 0.3051 1874 +1876 4 243.6812 278.7917 49.6138 0.2918 1875 +1877 4 243.0119 278.1613 50.6066 0.3382 1876 +1878 4 242.3106 277.4028 51.2865 0.2942 1877 +1879 4 241.9754 276.657 50.4053 0.2393 1878 +1880 4 241.4755 275.7978 50.8094 0.2587 1879 +1881 4 240.7239 275.1034 51.8507 0.178 1880 +1882 4 240.2343 274.2065 52.0618 0.2288 1881 +1883 4 239.7103 273.3828 52.1007 0.2203 1882 +1884 4 239.5833 272.4505 53.1185 0.3305 1883 +1885 4 238.9473 271.9196 52.7853 0.2432 1884 +1886 4 238.5938 271.1852 53.6505 0.1971 1885 +1887 4 237.8342 270.421 53.9773 0.1652 1886 +1888 4 237.0288 270.3855 54.3074 0.2339 1887 +1889 4 236.3229 269.7529 53.5836 0.2843 1888 +1890 4 235.672 269.0185 54.2688 0.2011 1889 +1891 4 235.0623 268.2451 53.7323 0.2161 1890 +1892 4 234.568 267.3791 53.5648 0.2474 1891 +1893 4 234.1368 266.6767 54.0492 0.211 1892 +1894 4 234.0464 266.4273 56.2489 0.229 1893 +1895 4 233.7192 265.3314 56.2489 0.2516 1894 +1896 4 232.8463 264.6518 56.0311 0.2193 1895 +1897 4 232.2423 264.0752 54.9332 0.217 1896 +1898 4 231.7206 263.2699 54.9489 0.2288 1897 +1899 4 231.0102 262.9015 55.5892 0.2543 1898 +1900 4 230.794 262.2483 55.9908 0.2587 1899 +1901 4 230.6007 261.3857 56.5454 0.3432 1900 +1902 4 230.0641 260.4819 55.5845 0.2424 1901 +1903 4 229.8296 259.6251 54.5714 0.4277 1902 +1904 4 229.5962 258.7854 54.6501 0.2934 1903 +1905 4 228.8092 258.3598 55.8144 0.3215 1904 +1906 4 228.5026 257.4057 56.4029 0.2382 1905 +1907 4 228.5884 256.5981 56.84 0.1876 1906 +1908 4 228.2589 255.5055 56.8851 0.1709 1907 +1909 4 227.5942 254.7322 57.3448 0.1963 1908 +1910 4 226.8598 254.1671 56.6222 0.2669 1909 +1911 4 226.1665 253.3377 56.9898 0.1986 1910 +1912 4 225.9045 252.379 57.12 0.1984 1911 +1913 4 225.3989 251.3608 57.3017 0.2666 1912 +1914 4 225.1449 250.7328 58.3472 0.2994 1913 +1915 4 224.6438 250.1505 59.6285 0.2255 1914 +1916 4 224.621 249.2078 59.0848 0.3197 1915 +1917 4 223.9094 248.5718 59.64 0.2767 1916 +1918 4 223.8808 247.9574 59.8441 0.3122 1917 +1919 4 223.0125 247.5994 59.3158 0.2549 1918 +1920 4 222.9656 246.6464 60.48 0.3051 1919 +1921 4 222.2849 246.1327 61.6753 0.1889 1920 +1922 4 221.4841 245.5882 61.88 0.1873 1921 +1923 4 221.0059 245.0402 60.1888 0.2364 1922 +1924 4 220.4705 244.8057 60.76 0.1271 1923 +1925 4 219.6491 244.1296 60.48 0.2288 1924 +1926 4 219.2224 243.7635 62.5162 0.2321 1925 +1927 4 218.6321 243.1309 63.4094 0.2669 1926 +1928 4 218.3736 242.3232 64.4028 0.3264 1927 +1929 4 217.5625 241.7592 64.3283 0.309 1928 +1930 4 216.8155 240.9344 64.12 0.3726 1929 +1931 4 216.0696 240.0947 64.3737 0.5053 1930 +1932 4 215.4655 239.3626 65.2288 0.5131 1931 +1933 4 215.0182 238.5366 66.0988 0.4272 1932 +1934 4 214.1248 237.9451 66.5414 0.3382 1933 +1935 4 213.3743 237.1054 66.6534 0.3432 1934 +1936 4 213.4693 236.236 66.9186 0.2671 1935 +1937 4 212.6204 235.6663 65.8 0.3358 1936 +1938 4 212.4374 234.7751 66.642 0.1922 1937 +1939 4 211.7498 234.3141 67.0466 0.3437 1938 +1940 4 211.2522 233.6048 67.7359 0.482 1939 +1941 4 210.5726 232.78 67.7757 0.3434 1940 +1942 4 209.9023 232.041 67.1216 0.3281 1941 +1943 4 209.4515 231.1921 66.9393 0.3765 1942 +1944 4 208.9951 230.3776 67.6855 0.353 1943 +1945 4 208.4814 229.69 68.88 0.4491 1944 +1946 4 207.9792 228.7222 68.698 0.2569 1945 +1947 4 207.5113 228.228 69.953 0.3875 1946 +1948 4 207.0137 227.4913 70.5186 0.2924 1947 +1949 4 206.3925 226.6939 70.74 0.4721 1948 +1950 4 205.5768 225.7146 68.9307 0.2469 1949 +1951 4 205.0071 225.0488 69.7799 0.3204 1950 +1952 4 204.355 224.2858 69.19 0.2288 1951 +1953 4 203.8883 223.7607 70.6776 0.3775 1952 +1954 4 203.6961 223.0514 70.6726 0.3268 1953 +1955 4 202.9788 222.6521 71.4692 0.472 1954 +1956 4 202.6138 221.6969 71.6864 0.3536 1955 +1957 4 201.9743 221.0116 72.142 0.3725 1956 +1958 4 201.36 220.1559 71.2379 0.2436 1957 +1959 4 201.1838 219.9088 72.266 0.1144 1958 +1960 4 200.812 219.171 73.67 0.1657 1959 +1961 4 200.2892 218.226 74.403 0.1977 1960 +1962 4 199.8465 217.2227 73.7769 0.2776 1961 +1963 4 199.5228 216.3704 72.6037 0.2765 1962 +1964 4 198.8009 215.5696 72.4802 0.394 1963 +1965 4 198.2403 214.6624 72.0619 0.2288 1964 +1966 4 198.0161 214.0893 74.1482 0.2818 1965 +1967 4 197.5082 213.3343 75.0126 0.4173 1966 +1968 4 196.9167 212.538 74.6911 0.2423 1967 +1969 4 196.5472 211.7372 75.3514 0.3432 1968 +1970 4 195.9706 211.0211 75.7884 0.4558 1969 +1971 4 195.6549 210.1459 75.7711 0.3156 1970 +1972 4 194.9628 209.7684 74.2092 0.4919 1971 +1973 4 194.5944 208.8052 75.0795 0.395 1972 +1974 4 194.2237 207.9346 75.8545 0.4263 1973 +1975 4 192.9001 206.7242 77.1 0.4235 1974 +1976 4 192.4151 206.031 77.5869 0.3298 1975 +1977 4 191.8946 205.3903 77.3111 0.2567 1976 +1978 4 191.5708 204.6536 77.28 0.2584 1977 +1979 4 190.8604 203.9763 77.9212 0.5339 1978 +1980 4 190.7689 203.4467 79.8238 0.3861 1979 +1981 4 190.2472 202.7317 80.0873 0.4454 1980 +1982 4 190.0276 201.7055 80.2984 0.3557 1981 +1983 4 189.2473 201.1518 80.0103 0.3756 1982 +1984 4 189.0071 200.3945 78.5932 0.3821 1983 +1985 4 188.7646 199.9083 80.1206 0.2245 1984 +1986 4 188.2612 199.2287 79.6816 0.3159 1985 +1987 4 187.3437 198.7471 79.002 0.4299 1986 +1988 4 186.6425 197.9566 79.469 0.3586 1987 +1989 4 185.9526 197.4601 80.3799 0.4454 1988 +1990 4 185.5728 197.1981 82.04 0.4195 1989 +1991 4 185.1312 196.1903 82.2343 0.3686 1990 +1992 4 184.3464 195.4181 82.7114 0.3313 1991 +1993 4 183.6074 194.623 83.4165 0.3811 1992 +1994 4 183.3294 193.5476 83.72 0.4602 1993 +1995 4 182.7197 192.732 83.5853 0.3615 1994 +1996 4 182.1214 191.8294 83.8956 0.353 1995 +1997 4 181.4773 191.1384 82.88 0.3813 1996 +1998 4 180.9716 190.2094 82.9116 0.3038 1997 +1999 4 180.315 189.4178 82.88 0.3704 1998 +2000 4 179.608 189.0014 83.54 0.2319 1999 +2001 4 179.3998 188.1811 84.5513 0.3051 2000 +2002 4 178.9124 187.33 84.6866 0.3691 2001 +2003 4 178.0201 186.758 84.9971 0.3392 2002 +2004 4 177.5728 185.8245 84.84 0.2953 2003 +2005 4 177.0923 184.8773 84.0062 0.4058 2004 +2006 4 176.6096 184.0833 84.0118 0.321 2005 +2007 4 175.8397 183.4953 84.5995 0.4174 2006 +2008 4 175.4873 182.9439 85.8561 0.3348 2007 +2009 4 174.9336 182.158 86.6746 0.2415 2008 +2010 4 174.6774 181.324 85.9636 0.4307 2009 +2011 4 174.3399 180.5953 87.08 0.3747 2010 +2012 4 173.6386 179.934 86.8935 0.4109 2011 +2013 4 173.3812 178.9754 86.8045 0.3424 2012 +2014 4 173.0769 178.3324 87.3152 0.2388 2013 +2015 4 172.8287 177.423 86.133 0.3051 2014 +2016 4 172.0576 176.6977 86.5354 0.4068 2015 +2017 4 171.6938 176.128 88.2837 0.3386 2016 +2018 4 171.1985 175.2608 89.0798 0.2352 2017 +2019 4 170.6619 174.6831 89.7005 0.3368 2018 +2020 4 170.1563 173.745 88.7788 0.2916 2019 +2021 4 169.5076 173.054 89.32 0.3295 2020 +2022 4 169.0729 172.3802 88.2059 0.3099 2021 +2023 4 168.3373 171.695 88.4366 0.1781 2022 +2024 4 167.5834 171.2614 89.6221 0.3887 2023 +2025 4 167.0675 170.5761 90.72 0.3487 2024 +2026 4 166.6922 169.5774 90.9504 0.2736 2025 +2027 4 166.0104 168.6805 90.8214 0.3615 2026 +2028 4 165.5334 167.8648 89.4449 0.4909 2027 +2029 4 164.776 167.2093 89.5843 0.4261 2028 +2030 4 164.2018 166.2575 89.6132 0.3665 2029 +2031 4 163.8826 165.6604 91.0482 0.337 2030 +2032 4 163.7007 164.641 90.5915 0.3375 2031 +2033 4 163.3964 163.616 91.0115 0.2341 2032 +2034 4 163.3312 162.7351 91.56 0.2229 2033 +2035 4 162.8347 161.9069 91.9881 0.3491 2034 +2036 4 162.0785 161.137 92.694 0.2981 2035 +2037 4 161.1759 160.5066 93.1837 0.2377 2036 +2038 4 160.7595 159.5045 93.2467 0.2034 2037 +2039 4 160.2561 158.5721 93.7045 0.2094 2038 +2040 4 159.7493 157.9235 93.0404 0.2898 2039 +2041 4 159.461 156.9625 93.5558 0.2677 2040 +2042 4 159.135 156.029 94.5098 0.2206 2041 +2043 4 158.6042 155.1664 95.1686 0.1738 2042 +2044 4 158.2884 154.0888 94.92 0.1192 2043 +2045 4 157.753 153.2171 95.2812 0.3227 2044 +2046 4 157.4236 152.1291 95.2 0.3284 2045 +2047 4 157.0575 151.0549 95.4198 0.2915 2046 +2048 4 156.6616 150.198 96.8103 0.2605 2047 +2049 4 156.2304 149.3995 97.7693 0.2601 2048 +2050 4 155.7579 148.5976 97.071 0.3911 2049 +2051 4 155.3323 147.7636 96.9422 0.3122 2050 +2052 4 154.8976 146.9548 98.4326 0.1401 2051 +2053 4 154.3245 146.0613 98.84 0.1144 2052 +2054 4 153.6049 145.3143 98.8308 0.1182 2053 +2055 4 152.8155 144.5398 98.4931 0.1898 2054 +2056 4 152.2458 143.5926 98.7792 0.1846 2055 +2057 4 151.5537 142.8616 99.12 0.3122 2056 +2058 4 150.7563 142.2644 98.7109 0.2288 2057 +2059 4 149.9933 141.8331 99.6128 0.2669 2058 +2060 4 149.7004 140.9419 100.6138 0.3392 2059 +2061 4 149.3698 139.9329 101.39 0.2084 2060 +2062 4 149.1593 138.8553 102.0124 0.124 2061 +2063 4 148.5187 137.9264 102.2 0.1144 2062 +2064 4 147.6549 137.3143 102.4666 0.1144 2063 +2065 4 146.9937 136.4243 102.48 0.1336 2064 +2066 4 146.4755 135.4599 102.7869 0.1725 2065 +2067 4 146.2146 134.4349 103.1414 0.1635 2066 +2068 4 145.7559 133.5448 103.9004 0.1144 2067 +2069 4 145.3418 132.5198 104.16 0.1144 2068 +2070 4 144.4769 131.8952 104.2272 0.1225 2069 +2071 4 143.7081 131.1173 104.4291 0.2116 2070 +2072 4 143.5617 130.5693 106.3866 0.167 2071 +2073 4 143.1201 129.7182 106.6985 0.1939 2072 +2074 4 142.7815 128.7927 106.2384 0.2288 2073 +2075 4 142.4257 127.8614 106.7878 0.1907 2074 +2076 4 142.0779 127.0458 107.8 0.1714 2075 +2077 4 141.7038 125.9922 107.7997 0.1907 2076 +2078 4 141.0678 125.109 107.8246 0.1325 2077 +2079 4 140.2292 124.5278 108.5468 0.1144 2078 +2080 4 139.4547 123.7064 108.64 0.1144 2079 +2081 4 138.8587 122.9651 109.482 0.1144 2080 +2082 4 138.5338 122.0202 109.9134 0.1312 2081 +2083 4 137.9515 121.089 110.2469 0.1191 2082 +2084 4 137.1919 120.3133 111.0547 0.1514 2083 +2085 4 136.7034 119.3112 111.517 0.2034 2084 +2086 4 136.16 118.3376 112.0 0.162 2085 +2087 4 136.033 117.3241 112.572 0.116 2086 +2088 4 136.2298 116.2876 113.3457 0.1341 2087 +2089 4 136.0857 115.1791 113.68 0.1487 2088 +2090 4 135.7676 114.0822 113.68 0.2288 2089 +2091 4 135.3981 113.5568 113.96 0.3382 2090 +2092 4 134.8776 112.7799 114.7471 0.3216 2091 +2093 4 134.8421 111.7206 115.0932 0.265 2092 +2094 4 135.4416 110.8978 115.4829 0.2255 2093 +2095 4 135.6933 110.0838 114.0 0.2614 2094 +2096 4 135.6784 109.1147 114.408 0.2728 2095 +2097 4 135.9644 108.3403 116.1345 0.2731 2096 +2098 4 135.7734 107.3832 116.247 0.2754 2097 +2099 4 135.8157 106.3778 116.713 0.1801 2098 +2100 4 135.7562 105.2764 117.2979 0.2305 2099 +2101 4 135.4313 104.1866 117.4362 0.2765 2100 +2102 4 135.1762 103.141 118.1471 0.2258 2101 +2103 4 134.6808 102.7232 116.5688 0.1973 2102 +2104 4 134.6305 101.8254 115.64 0.2256 2103 +2105 4 134.6488 100.7918 116.0944 0.1144 2104 +2106 4 134.6911 100.0884 117.6512 0.148 2105 +2107 4 134.7815 99.3526 118.72 0.3813 2106 +2108 4 135.2116 98.4157 118.2686 0.3241 2107 +2109 4 135.2437 97.7976 116.3408 0.2519 2108 +2110 4 135.54 96.8788 117.32 0.1947 2109 +2111 4 135.6384 96.0939 116.9518 0.2655 2110 +2112 4 135.5686 95.3231 116.0323 0.2111 2111 +2113 4 135.961 94.9299 114.4307 0.2341 2112 +2114 4 136.247 93.8935 113.96 0.2448 2113 +2115 4 136.3568 92.8218 114.1753 0.2625 2114 +2116 4 136.4529 91.8987 115.36 0.1849 2115 +2117 4 137.0512 91.0443 115.5636 0.2385 2116 +2118 4 136.9402 90.948 118.258 0.1332 2117 +2119 4 136.9368 90.9226 121.0527 0.1144 2118 +2120 4 137.0512 90.5832 123.489 0.1144 2119 +2121 4 137.0638 89.7208 125.1228 0.1144 2120 +2122 4 137.0215 89.0255 127.1393 0.1349 2121 +2123 4 137.0592 88.0054 127.9911 0.2262 2122 +2124 4 137.1805 86.96 128.7784 0.1232 2123 +2125 4 137.8566 86.1886 129.0635 0.1719 2124 +2126 4 138.0808 85.5975 129.8321 0.2235 2125 +2127 4 138.6082 84.7646 130.188 0.1144 2126 +2128 4 139.2008 83.8653 130.76 0.2266 2127 +2129 4 139.465 83.1791 129.3804 0.1773 2128 +2130 4 140.2121 82.5405 129.2609 0.1562 2129 +2131 4 140.8264 81.6683 129.08 0.1182 2130 +2132 4 141.6215 80.9534 129.0187 0.1144 2131 +2133 4 142.5664 80.3992 128.5889 0.1144 2132 +2134 4 143.1178 79.4848 128.3582 0.1144 2133 +2135 4 143.2288 78.4465 128.4875 0.1144 2134 +2136 4 143.0149 77.6787 129.3454 0.1675 2135 +2137 4 143.1522 77.233 131.0431 0.2472 2136 +2138 4 143.4702 76.4309 132.16 0.2478 2137 +2139 4 143.8706 75.5771 132.6601 0.2069 2138 +2140 4 143.7962 74.8564 134.1166 0.1254 2139 +2141 4 143.3032 74.0542 135.2425 0.1144 2140 +2142 4 143.0801 73.2361 136.2155 0.1468 2141 +2143 4 143.2174 72.1136 136.08 0.2382 2142 +2144 4 143.4576 71.3856 136.64 0.1398 2143 +2145 4 135.3993 113.6063 114.2098 0.3051 2090 +2146 4 134.6705 113.0582 113.1259 0.2772 2145 +2147 4 134.2839 112.9949 114.6107 0.3276 2146 +2148 4 133.7771 112.7324 116.48 0.2415 2147 +2149 4 133.0724 112.0937 117.7081 0.2775 2148 +2150 4 132.9751 111.1348 118.6234 0.2504 2149 +2151 4 132.3414 110.3951 118.454 0.1563 2150 +2152 4 131.56 110.0009 119.576 0.273 2151 +2153 4 131.2111 109.3296 121.2224 0.1453 2152 +2154 4 130.6368 108.7944 122.2931 0.2055 2153 +2155 4 129.9607 108.2954 121.2926 0.265 2154 +2156 4 129.5225 107.9852 122.703 0.1314 2155 +2157 4 129.725 107.3733 124.2497 0.1478 2156 +2158 4 129.2892 106.8544 123.7054 0.2288 2157 +2159 4 128.5948 106.3221 124.88 0.2314 2158 +2160 4 128.3431 105.2986 125.5346 0.1652 2159 +2161 4 127.4553 104.8079 126.28 0.1144 2160 +2162 4 126.8971 104.0031 127.073 0.2605 2161 +2163 4 125.9418 103.4019 127.12 0.2765 2162 +2164 4 125.1742 102.8517 127.9116 0.1907 2163 +2165 4 124.4523 102.6348 129.64 0.1271 2164 +2166 4 123.5692 101.9666 129.92 0.1333 2165 +2167 4 122.8233 101.3039 130.7348 0.1265 2166 +2168 4 121.8028 100.8097 130.76 0.131 2167 +2169 4 120.9437 100.4054 131.224 0.2008 2168 +2170 4 120.0754 99.7797 130.6836 0.1849 2169 +2171 4 119.4061 99.3095 129.1987 0.1302 2170 +2172 4 118.515 99.143 128.6659 0.1144 2171 +2173 4 117.6696 98.5148 128.24 0.1144 2172 +2174 4 116.5496 98.384 128.4363 0.1144 2173 +2175 4 115.409 98.384 128.52 0.1194 2174 +2176 4 114.5167 98.384 129.7778 0.1619 2175 +2177 4 113.8957 98.4984 132.0063 0.2288 2176 +2178 4 113.0108 98.9001 132.0852 0.2868 2177 +2179 4 112.0936 99.2735 131.3301 0.2418 2178 +2180 4 111.1802 99.3057 131.068 0.2135 2179 +2181 4 110.123 99.362 131.0397 0.2287 2180 +2182 4 109.268 99.4342 132.02 0.2431 2181 +2183 4 108.3749 99.0196 131.6311 0.3178 2182 +2184 4 107.9407 98.8416 132.7418 0.3199 2183 +2185 4 107.5813 98.384 132.7782 0.1477 2184 +2186 4 107.269 98.023 131.2394 0.2898 2185 +2187 4 106.4616 97.3663 131.6078 0.1263 2186 +2188 4 105.8261 97.391 133.2612 0.1144 2187 +2189 4 105.6227 96.6324 133.56 0.1271 2188 +2190 4 105.4783 95.6784 132.9051 0.1907 2189 +2191 4 104.7904 95.5017 131.4712 0.1504 2190 +2192 4 104.719 94.465 130.975 0.2004 2191 +2193 4 104.7546 93.4246 131.0512 0.1788 2192 +2194 4 104.9176 92.3282 131.0501 0.1566 2193 +2195 4 105.1714 91.5068 129.8564 0.1522 2194 +2196 4 104.9646 90.7354 129.5868 0.2288 2195 +2197 4 105.1305 90.376 131.8929 0.1715 2196 +2198 4 105.0192 89.9533 133.387 0.313 2197 +2199 4 104.676 89.1177 132.6399 0.1953 2198 +2200 4 104.4472 88.307 133.5298 0.2743 2199 +2201 4 104.3328 87.3038 132.4621 0.2692 2200 +2202 4 104.0619 86.414 130.9991 0.1921 2201 +2203 4 103.2351 85.8715 130.3224 0.2015 2202 +2204 4 103.0362 85.1773 128.8319 0.1907 2203 +2205 4 103.293 84.8392 127.1651 0.155 2204 +2206 4 103.6284 83.8574 126.84 0.1981 2205 +2207 4 102.9944 83.0582 127.132 0.1682 2206 +2208 4 102.325 82.3305 126.9036 0.3387 2207 +2209 4 102.1894 81.4099 126.5561 0.1382 2208 +2210 4 101.5258 80.9671 124.6666 0.2407 2209 +2211 4 101.2654 80.3004 123.9762 0.1228 2210 +2212 4 101.538 79.6142 124.1198 0.2542 2211 +2213 4 101.5872 78.8216 124.04 0.2542 2212 +2214 4 107.6236 98.956 132.314 0.249 2183 +2215 4 107.0173 99.6743 131.8738 0.2094 2214 +2216 4 106.4612 100.224 130.5581 0.1718 2215 +2217 4 105.7241 100.6961 131.5591 0.1652 2216 +2218 4 105.3258 101.2052 133.0 0.2547 2217 +2219 4 104.5105 101.914 132.7306 0.2672 2218 +2220 4 103.7482 102.3552 133.7563 0.1605 2219 +2221 4 103.0297 102.8874 134.3734 0.1922 2220 +2222 4 102.4516 103.6337 134.0268 0.2288 2221 +2223 4 101.816 103.9133 134.2132 0.2288 2222 +2224 4 101.6215 104.0517 134.9334 0.1416 2222 +2225 4 100.8323 104.4483 134.7819 0.2519 2224 +2226 4 100.2006 104.9818 135.4564 0.1777 2225 +2227 4 99.5304 105.5897 134.6374 0.1144 2226 +2228 4 99.1649 106.396 135.5973 0.142 2227 +2229 4 98.4944 106.9781 136.8906 0.1144 2228 +2230 4 97.8302 107.3853 138.1134 0.2188 2229 +2231 4 97.2462 107.7832 139.806 0.1657 2230 +2232 4 97.0504 108.4184 139.7536 0.2012 2231 +2233 4 96.6121 109.1376 140.4455 0.2718 2232 +2234 4 96.2954 109.7806 141.9558 0.2051 2233 +2235 4 95.3715 109.824 143.2668 0.2034 2234 +2236 4 94.4802 110.2816 143.5031 0.2134 2235 +2237 4 93.6863 110.4196 144.8868 0.1568 2236 +2238 4 93.1176 111.073 144.9384 0.1398 2237 +2239 4 92.3406 110.968 143.7419 0.2631 2238 +2240 4 91.5187 110.8489 145.4379 0.1954 2239 +2241 4 90.5336 110.5398 146.5738 0.1652 2240 +2242 4 89.9027 110.7393 148.6492 0.178 2241 +2243 4 88.9348 111.0824 147.9848 0.2539 2242 +2244 4 87.9145 110.9666 146.886 0.1586 2243 +2245 4 86.8543 111.2734 146.7357 0.1652 2244 +2246 4 85.9644 111.8899 147.499 0.1652 2245 +2247 4 85.1134 112.2264 148.4115 0.1905 2246 +2248 4 84.7254 112.2592 150.6086 0.1499 2247 +2249 4 83.9685 112.6759 151.5816 0.2261 2248 +2250 4 83.2832 112.4552 149.8 0.1525 2249 +2251 4 223.8064 247.0079 61.161 0.2799 1920 +2252 4 224.224 247.9048 59.92 0.2796 2251 +2253 4 248.3876 280.598 49.28 0.3178 1869 +2254 4 248.5306 279.4792 50.3552 0.2932 2253 +2255 4 249.3497 278.9861 51.3752 0.2613 2254 +2256 4 249.1907 278.0355 50.5926 0.1907 2255 +2257 4 249.5064 277.1512 51.711 0.242 2256 +2258 4 249.527 276.2806 52.5893 0.2756 2257 +2259 4 250.3232 275.6662 51.8263 0.138 2258 +2260 4 250.5463 274.6538 52.3508 0.2656 2259 +2261 4 250.9032 273.8999 52.4465 0.1332 2260 +2262 4 250.8792 272.812 52.92 0.1707 2261 +2263 4 251.227 271.8853 53.2734 0.2374 2262 +2264 4 251.6583 271.239 53.7068 0.2372 2263 +2265 4 251.7944 270.4576 54.2497 0.2288 2264 +2266 4 251.7944 269.5447 55.0642 0.2288 2265 +2267 4 251.68 268.8469 54.962 0.3373 2266 +2268 4 252.1902 268.165 55.5307 0.115 2267 +2269 4 252.7222 267.3551 54.7929 0.2075 2268 +2270 4 253.1478 266.5394 56.1554 0.2224 2269 +2271 4 253.7323 265.6059 56.203 0.2669 2270 +2272 4 253.396 264.725 56.5452 0.2542 2271 +2273 4 253.1066 263.7778 56.3046 0.2288 2272 +2274 4 253.6751 262.8489 56.3634 0.2504 2273 +2275 4 254.3112 262.2197 56.6989 0.3893 2274 +2276 4 254.6544 261.404 58.002 0.2911 2275 +2277 4 254.5812 260.3504 57.6265 0.1184 2276 +2278 4 253.9188 259.9088 56.7602 0.1326 2277 +2279 4 253.7312 259.3448 57.5523 0.3715 2278 +2280 4 253.865 258.5577 57.1096 0.178 2279 +2281 4 254.8043 258.417 57.148 0.323 2280 +2282 4 255.6325 258.0944 58.0398 0.2039 2281 +2283 4 256.3315 257.4389 58.3862 0.1652 2282 +2284 4 257.3451 257.154 58.7997 0.2627 2283 +2285 4 258.147 256.8612 60.1888 0.1785 2284 +2286 4 259.1412 256.4848 60.2 0.243 2285 +2287 4 259.8859 256.8989 61.3021 0.3069 2286 +2288 4 260.641 257.5144 62.6268 0.1907 2287 +2289 4 261.4395 258.1802 63.7185 0.2503 2288 +2290 4 261.9463 257.8656 65.1568 0.1144 2289 +2291 4 262.4691 258.3827 66.36 0.1144 2290 +2292 4 263.1543 258.7579 64.6996 0.1968 2291 +2293 4 264.0146 259.0165 63.9954 0.2161 2292 +2294 4 265.0065 259.4295 63.84 0.2722 2293 +2295 4 265.6746 259.5976 65.3114 0.269 2294 +2296 4 266.5074 259.4558 65.9789 0.2196 2295 +2297 4 267.0714 258.6778 66.6439 0.2637 2296 +2298 4 268.0232 258.6275 67.4579 0.1433 2297 +2299 4 268.6318 257.9663 67.7295 0.2168 2298 +2300 4 269.5687 257.376 68.2223 0.2438 2299 +2301 4 270.3261 256.8337 68.8433 0.1525 2300 +2302 4 270.1476 256.6084 66.3426 0.1834 2301 +2303 4 270.7871 256.5981 65.24 0.1525 2302 +2304 4 271.128 256.4699 66.9774 0.2399 2303 +2305 4 271.5822 256.3326 69.3199 0.3499 2304 +2306 4 272.4619 255.9757 69.1911 0.233 2305 +2307 4 272.9447 255.3934 70.7585 0.1144 2306 +2308 4 273.416 254.8409 70.0694 0.2082 2307 +2309 4 274.0704 254.2048 70.6558 0.2043 2308 +2310 4 275.0691 253.8067 70.5488 0.2692 2309 +2311 4 275.7189 252.951 70.8397 0.2028 2310 +2312 4 276.7176 252.7004 70.4701 0.1144 2311 +2313 4 277.2701 252.4808 72.3192 0.1144 2312 +2314 4 278.2803 252.1765 73.1259 0.1223 2313 +2315 4 279.311 251.7361 73.36 0.1673 2314 +2316 4 280.0798 250.9456 73.8038 0.1907 2315 +2317 4 280.5786 250.0315 74.1401 0.2049 2316 +2318 4 281.4801 249.6208 73.64 0.1314 2317 +2319 4 282.1104 248.9722 74.7093 0.2135 2318 +2320 4 282.1928 247.9677 74.8362 0.2397 2319 +2321 4 282.7385 247.255 75.9433 0.2288 2320 +2322 4 283.4706 246.8672 76.979 0.1185 2321 +2323 4 283.7028 245.7884 76.72 0.1144 2322 +2324 4 283.9294 244.6913 76.72 0.1144 2323 +2325 4 284.8308 244.0381 76.7138 0.1144 2324 +2326 4 285.3056 243.1229 76.44 0.1144 2325 +2327 4 285.4886 242.4159 77.8445 0.1507 2326 +2328 4 285.476 241.6082 78.1063 0.2577 2327 +2329 4 286.1659 240.7708 78.4 0.2346 2328 +2330 4 286.4793 239.8339 79.2714 0.1907 2329 +2331 4 287.4254 239.2973 79.3766 0.2703 2330 +2332 4 288.4093 238.9187 80.0892 0.1144 2331 +2333 4 288.6552 238.2758 82.0187 0.1994 2332 +2334 4 289.3336 238.1808 80.421 0.1743 2333 +2335 4 289.7626 237.6145 78.797 0.3321 2334 +2336 4 290.2408 237.7918 79.8389 0.1907 2335 +2337 4 290.8208 237.0265 81.3596 0.1907 2336 +2338 4 291.402 236.2612 82.88 0.1907 2337 +2339 4 291.768 235.8928 83.5344 0.1144 2338 +2340 4 292.2703 235.7292 85.9606 0.1144 2339 +2341 4 292.5723 234.9776 87.0643 0.1144 2340 +2342 4 292.6352 233.853 86.8 0.1144 2341 +2343 4 292.6352 232.709 86.8 0.1144 2342 +2344 4 292.6283 231.5868 87.0794 0.1405 2343 +2345 4 292.7496 230.7448 87.92 0.178 2344 +2346 4 291.1549 236.3698 82.885 0.1265 2338 +2347 4 290.7076 237.1066 84.3951 0.2151 2346 +2348 4 290.2328 237.7232 85.68 0.1525 2347 +2349 4 260.3744 257.5144 63.0 0.1652 2288 +2350 4 247.8796 280.4196 48.72 0.2415 2253 +2351 4 256.0112 296.6975 44.9501 0.3236 1849 +2352 4 254.9015 296.7364 45.6288 0.2929 2351 +2353 4 253.9497 296.8577 44.9366 0.3467 2352 +2354 4 253.0974 296.7479 45.8354 0.1963 2353 +2355 4 252.562 297.4995 45.8088 0.2974 2354 +2356 4 252.061 298.2625 46.1437 0.1754 2355 +2357 4 251.7178 298.9272 45.7472 0.281 2356 +2358 4 251.0188 299.7028 46.1378 0.2444 2357 +2359 4 250.8792 300.5288 45.9091 0.1265 2358 +2360 4 250.3484 300.9715 45.1931 0.1144 2359 +2361 4 249.4892 301.0676 46.3456 0.1811 2360 +2362 4 248.4951 300.9864 46.9482 0.1591 2361 +2363 4 247.5307 301.1443 46.9288 0.2089 2362 +2364 4 246.5 301.2198 46.762 0.178 2363 +2365 4 245.4887 301.6248 47.0109 0.1915 2364 +2366 4 244.6021 302.0492 46.2 0.1165 2365 +2367 4 244.3801 302.9049 46.5077 0.2556 2366 +2368 4 243.863 303.8075 47.2077 0.1602 2367 +2369 4 243.4729 304.5568 46.9384 0.1739 2368 +2370 4 243.4672 305.6127 46.7082 0.2855 2369 +2371 4 243.5542 306.4707 47.4116 0.3405 2370 +2372 4 243.577 307.3951 48.5206 0.3191 2371 +2373 4 243.9992 308.1318 48.7589 0.2129 2372 +2374 4 243.5576 308.8972 48.5593 0.1179 2373 +2375 4 243.5576 309.6362 46.7286 0.2052 2374 +2376 4 243.2144 310.4267 45.4168 0.1329 2375 +2377 4 243.434 311.3648 45.8693 0.2063 2376 +2378 4 243.4066 312.0512 47.6 0.2262 2377 +2379 4 243.0108 313.0728 47.1414 0.1305 2378 +2380 4 242.5349 313.9571 46.5548 0.2086 2379 +2381 4 242.1676 315.0187 46.4145 0.2542 2380 +2382 4 241.8256 315.99 45.876 0.1723 2381 +2383 4 241.1884 316.8388 45.64 0.2481 2382 +2384 4 240.1233 317.1145 45.6218 0.1734 2383 +2385 4 239.3202 317.3811 45.1825 0.1563 2384 +2386 4 238.349 317.6934 45.1732 0.1953 2385 +2387 4 237.7953 318.612 45.5972 0.1612 2386 +2388 4 237.2816 319.5112 44.8636 0.1991 2387 +2389 4 236.4648 320.185 44.8146 0.1443 2388 +2390 4 235.7201 320.6666 44.24 0.1144 2389 +2391 4 235.1606 321.6642 44.24 0.1144 2390 +2392 4 234.544 322.5565 43.701 0.1144 2391 +2393 4 234.099 323.5735 43.96 0.1144 2392 +2394 4 233.9354 324.6786 43.7427 0.1144 2393 +2395 4 233.1426 325.2792 43.68 0.1144 2394 +2396 4 232.7811 326.3386 43.615 0.1144 2395 +2397 4 232.0032 326.9792 43.4 0.1144 2396 +2398 4 231.6714 328.002 43.4 0.1144 2397 +2399 4 231.3637 329.0762 43.4 0.1144 2398 +2400 4 231.1429 330.1264 43.209 0.1144 2399 +2401 4 230.7723 330.7579 42.6717 0.2008 2400 +2402 4 230.6304 331.7543 43.4437 0.1678 2401 +2403 4 230.5961 332.8846 43.12 0.1398 2402 +2404 4 230.341 333.9828 43.4 0.1489 2403 +2405 4 229.9543 335.0318 43.12 0.1244 2404 +2406 4 229.7484 336.1381 43.12 0.1144 2405 +2407 4 229.5711 337.2649 43.12 0.1144 2406 +2408 4 229.4864 338.346 42.5877 0.1144 2407 +2409 4 229.0723 339.3539 43.12 0.1144 2408 +2410 4 229.0288 340.4544 43.12 0.1144 2409 +2411 4 290.1184 350.8454 35.0 0.3686 1682 +2412 4 290.4113 349.9439 34.1653 0.2466 2411 +2413 4 289.8027 349.4085 33.7159 0.1479 2412 +2414 4 290.2328 348.7106 35.1868 0.3321 2413 +2415 4 290.4948 347.7119 35.56 0.2963 2414 +2416 4 290.0166 346.8482 34.7208 0.3306 2415 +2417 4 289.8267 345.9353 35.4668 0.2613 2416 +2418 4 289.7752 345.0373 33.8705 0.1435 2417 +2419 4 289.6608 343.9882 33.1139 0.2542 2418 +2420 4 289.7798 343.0753 33.6806 0.208 2419 +2421 4 289.7752 342.175 34.5044 0.2156 2420 +2422 4 290.1378 341.1282 34.44 0.1179 2421 +2423 4 290.1184 340.6603 32.5077 0.3472 2422 +2424 4 290.1184 339.768 33.32 0.2415 2423 +2425 4 290.29 339.4065 32.8076 0.2082 2424 +2426 4 290.6492 339.196 30.3363 0.2288 2425 +2427 4 291.299 339.5323 31.306 0.2288 2426 +2428 4 291.8321 339.871 30.9137 0.3713 2427 +2429 4 292.7748 339.9911 31.1419 0.2288 2428 +2430 4 293.3308 340.0151 32.2 0.2321 2429 +2431 4 293.7872 340.7679 30.8314 0.2122 2430 +2432 4 294.5869 340.8296 30.081 0.3149 2431 +2433 4 295.3888 341.2632 30.7476 0.2161 2432 +2434 4 296.3132 341.1397 29.7128 0.2791 2433 +2435 4 297.4194 340.9131 29.96 0.1788 2434 +2436 4 298.1447 340.9989 28.5631 0.2661 2435 +2437 4 298.9192 341.6213 29.1942 0.2849 2436 +2438 4 299.9053 342.0423 29.986 0.2629 2437 +2439 4 300.6821 341.3993 29.7195 0.3051 2438 +2440 4 301.6614 341.2186 29.3048 0.1683 2439 +2441 4 302.6864 340.912 29.68 0.3548 2440 +2442 4 303.303 340.2199 28.4917 0.341 2441 +2443 4 304.2662 339.8172 27.7732 0.2851 2442 +2444 4 305.067 339.3642 28.3984 0.171 2443 +2445 4 305.6002 338.5794 28.94 0.1444 2444 +2446 4 306.1344 337.9147 29.6363 0.2804 2445 +2447 4 306.3655 337.8003 27.72 0.2755 2446 +2448 4 307.2006 337.4262 27.7794 0.3077 2447 +2449 4 307.8435 336.8886 28.7468 0.2211 2448 +2450 4 308.6501 336.241 28.2559 0.3305 2449 +2451 4 309.4074 335.9928 27.9028 0.2812 2450 +2452 4 310.1933 335.4505 27.5775 0.3529 2451 +2453 4 310.834 334.668 27.1043 0.37 2452 +2454 4 311.7549 334.1075 26.6213 0.2924 2453 +2455 4 312.8096 333.8615 27.1384 0.309 2454 +2456 4 313.5578 333.1957 27.6273 0.3557 2455 +2457 4 314.0566 332.5448 26.9713 0.3299 2456 +2458 4 314.8929 332.0815 26.5826 0.2924 2457 +2459 4 315.6536 331.3688 26.8442 0.2492 2458 +2460 4 316.4762 330.7453 26.6924 0.1984 2459 +2461 4 317.1694 330.2854 27.4565 0.3131 2460 +2462 4 317.9165 330.6046 27.3935 0.316 2461 +2463 4 318.4656 329.8575 27.4991 0.2241 2462 +2464 4 318.604 328.8657 27.5164 0.3144 2463 +2465 4 318.572 327.8006 28.3119 0.2524 2464 +2466 4 318.9483 326.9609 29.3812 0.2161 2465 +2467 4 319.7629 326.4473 28.5135 0.3273 2466 +2468 4 320.5202 325.9096 28.6572 0.3073 2467 +2469 4 321.297 325.206 28.6513 0.1497 2468 +2470 4 321.996 324.634 27.8844 0.2924 2469 +2471 4 322.7602 323.8618 28.1249 0.2669 2470 +2472 4 323.2864 323.2658 28.84 0.1757 2471 +2473 4 323.887 322.6057 28.1473 0.1496 2472 +2474 4 324.3984 321.9102 27.9451 0.1803 2473 +2475 4 324.9738 321.337 27.5022 0.1526 2474 +2476 4 326.0148 320.9034 27.48 0.2161 2475 +2477 4 326.7527 320.0763 27.3938 0.2034 2476 +2478 4 326.8111 318.9666 26.9954 0.256 2477 +2479 4 326.7264 317.8512 26.5798 0.2669 2478 +2480 4 327.2412 317.3708 25.2857 0.2952 2479 +2481 4 328.3406 317.2198 25.3772 0.3064 2480 +2482 4 328.9995 316.7267 25.9823 0.22 2481 +2483 4 329.7088 315.9579 25.947 0.3516 2482 +2484 4 330.2511 315.1022 26.04 0.2509 2483 +2485 4 330.6103 314.0795 25.6869 0.3305 2484 +2486 4 330.5771 313.3096 24.4042 0.2615 2485 +2487 4 331.2807 312.5614 23.4982 0.2221 2486 +2488 4 332.2885 312.185 22.6657 0.2995 2487 +2489 4 333.2312 311.6062 22.5624 0.2161 2488 +2490 4 334.1624 311.2355 22.414 0.2334 2489 +2491 4 335.152 311.3224 21.9624 0.3368 2490 +2492 4 336.1552 311.7743 21.3206 0.2343 2491 +2493 4 336.8519 311.6348 22.0352 0.2195 2492 +2494 4 337.5967 310.9827 21.1904 0.2548 2493 +2495 4 338.4181 310.7218 21.2789 0.2592 2494 +2496 4 339.4648 310.596 21.4693 0.3053 2495 +2497 4 340.2256 310.1407 21.5516 0.3298 2496 +2498 4 340.9555 309.5687 22.526 0.2209 2497 +2499 4 341.6053 309.3342 21.0 0.1652 2498 +2500 4 342.628 308.9178 20.6268 0.2288 2499 +2501 4 343.4196 309.7483 21.2587 0.1592 2500 +2502 4 344.0706 310.6463 21.7641 0.1398 2501 +2503 4 344.7581 311.4712 22.0494 0.1639 2502 +2504 4 345.8461 311.1543 22.1822 0.1652 2503 +2505 4 346.9741 311.1394 21.947 0.152 2504 +2506 4 347.9247 310.8591 21.7479 0.1373 2505 +2507 4 348.5448 309.8982 21.7862 0.1301 2506 +2508 4 348.7884 308.832 21.6224 0.1271 2507 +2509 4 348.8273 307.7017 21.5869 0.1334 2508 +2510 4 348.7621 306.5794 21.5572 0.1464 2509 +2511 4 348.2588 305.6951 21.3786 0.1525 2510 +2512 4 348.0597 303.6634 19.4102 0.3116 2511 +2513 4 348.8971 302.9335 19.32 0.3178 2512 +2514 4 349.7963 302.27 19.465 0.287 2513 +2515 4 350.6921 301.7231 19.7728 0.2712 2514 +2516 4 351.3052 301.6842 19.8923 0.2148 2515 +2517 4 352.0157 300.9338 19.5054 0.2796 2516 +2518 4 352.4344 300.0163 20.16 0.1814 2517 +2519 4 352.6792 299.1194 19.88 0.1584 2518 +2520 4 353.2786 298.7041 19.0756 0.1398 2519 +2521 4 353.6035 297.6985 19.3934 0.2977 2520 +2522 4 353.5692 296.6289 18.7415 0.3153 2521 +2523 4 353.4285 295.7526 18.6782 0.1255 2522 +2524 4 353.48 294.8912 19.4062 0.3417 2523 +2525 4 353.1528 293.8947 19.206 0.2313 2524 +2526 4 353.2306 292.9178 18.76 0.3296 2525 +2527 4 353.178 291.8561 19.32 0.1861 2526 +2528 4 353.7442 290.8929 19.6078 0.1939 2527 +2529 4 353.9399 289.8061 20.0869 0.2208 2528 +2530 4 354.0783 288.7307 20.72 0.2025 2529 +2531 4 354.64 288.288 19.32 0.1525 2530 +2532 4 343.1371 308.4258 20.5128 0.2366 2500 +2533 4 290.0921 338.4604 34.3658 0.1388 2424 +2534 4 290.0681 337.6962 32.3868 0.2924 2533 +2535 4 290.1047 337.4777 31.3883 0.1519 2534 +2536 4 289.4103 336.7959 30.8266 0.2706 2535 +2537 4 289.3588 335.8052 31.08 0.2542 2536 +2538 4 289.3176 334.8888 29.9827 0.2542 2537 +2539 4 289.5372 334.2219 28.9201 0.3969 2538 +2540 4 289.3142 333.4131 29.8189 0.2867 2539 +2541 4 289.0122 332.5722 30.6541 0.2061 2540 +2542 4 288.2491 331.9064 30.4088 0.131 2541 +2543 4 288.0958 331.1594 29.0746 0.1525 2542 +2544 4 287.9448 330.5405 29.972 0.2796 2543 +2545 4 287.819 329.7534 28.651 0.2039 2544 +2546 4 287.6222 328.9275 28.2212 0.2415 2545 +2547 4 287.2344 327.9974 28.0 0.2619 2546 +2548 4 286.4061 327.43 28.5463 0.1818 2547 +2549 4 285.3788 327.1485 27.9919 0.2734 2548 +2550 4 284.8766 326.3946 26.9802 0.3022 2549 +2551 4 284.0049 325.8123 26.8688 0.2417 2550 +2552 4 283.4809 325.0962 26.9111 0.2415 2551 +2553 4 283.1148 324.2988 27.1603 0.1528 2552 +2554 4 282.2671 324.0929 26.476 0.117 2553 +2555 4 281.2982 323.752 26.6874 0.1669 2554 +2556 4 280.4196 323.8161 26.63 0.1611 2555 +2557 4 279.5787 323.3745 26.857 0.2408 2556 +2558 4 278.4976 323.0702 26.6916 0.2163 2557 +2559 4 277.6259 322.9489 25.76 0.2853 2558 +2560 4 276.9498 322.2396 26.3388 0.2186 2559 +2561 4 275.9774 322.0703 25.7673 0.2288 2560 +2562 4 274.981 321.9559 24.6616 0.3012 2561 +2563 4 274.2431 321.8312 25.9028 0.2474 2562 +2564 4 273.1449 321.9216 25.716 0.3025 2563 +2565 4 272.4242 322.5028 24.638 0.2892 2564 +2566 4 271.748 322.5508 22.7035 0.2638 2565 +2567 4 270.8477 322.6892 23.0023 0.2004 2566 +2568 4 269.857 322.862 22.4932 0.1907 2567 +2569 4 269.412 322.8162 22.7172 0.2383 2568 +2570 4 268.9544 322.4936 23.8 0.1398 2569 +2571 4 269.2713 322.9512 22.4319 0.24 2568 +2572 4 268.284 323.2006 22.0886 0.2415 2571 +2573 4 267.3356 323.1892 21.7022 0.2669 2572 +2574 4 266.3507 322.989 21.1994 0.2325 2573 +2575 4 265.8301 323.4969 22.8928 0.1907 2574 +2576 4 265.2982 323.9888 21.6639 0.2246 2575 +2577 4 265.1872 324.7564 21.0683 0.1221 2576 +2578 4 264.6083 325.3536 21.2783 0.2289 2577 +2579 4 263.8007 325.6396 21.0157 0.1779 2578 +2580 4 262.6956 325.5515 21.0356 0.3021 2579 +2581 4 261.7072 325.5927 21.4749 0.1282 2580 +2582 4 260.9281 325.7517 21.7305 0.2034 2581 +2583 4 260.0575 325.7746 21.0339 0.1907 2582 +2584 4 259.3448 325.905 21.3052 0.1456 2583 +2585 4 258.7797 326.2139 19.3486 0.1671 2584 +2586 4 257.7661 326.1498 19.1464 0.2288 2585 +2587 4 257.4 326.3821 20.4674 0.1144 2586 +2588 4 256.8108 325.7929 20.6774 0.2033 2587 +2589 4 256.1473 325.2403 19.0994 0.2658 2588 +2590 4 255.0914 325.1648 19.0725 0.2533 2589 +2591 4 254.7345 324.6089 18.1877 0.2615 2590 +2592 4 253.7872 324.1959 17.8245 0.2412 2591 +2593 4 252.9567 323.5198 17.92 0.1234 2592 +2594 4 252.0461 323.0873 17.5305 0.1429 2593 +2595 4 251.1046 323.6079 17.3564 0.2542 2594 +2596 4 250.3266 323.172 16.3918 0.2288 2595 +2597 4 249.3028 322.8757 17.2875 0.1718 2596 +2598 4 248.3166 322.9523 16.9501 0.2277 2597 +2599 4 247.7904 322.9512 15.68 0.2669 2598 +2600 4 289.4446 338.2614 32.2 0.2674 2534 +2601 4 289.7752 339.3104 31.92 0.2669 2600 +2602 4 293.2598 361.4102 35.4603 0.3043 1673 +2603 4 293.5035 361.5601 38.1721 0.1891 2602 +2604 4 294.1533 361.7282 39.6091 0.1271 2603 +2605 4 294.9987 362.4787 39.6463 0.138 2604 +2606 4 295.1612 363.4911 39.6082 0.1811 2605 +2607 4 294.4782 364.3514 39.48 0.2161 2606 +2608 4 293.9394 364.8811 39.8709 0.1565 2607 +2609 4 293.4234 364.4143 42.0932 0.2669 2608 +2610 4 293.436 364.7861 41.6783 0.1652 2609 +2611 4 293.7609 365.6224 41.16 0.1485 2610 +2612 4 294.572 366.2596 41.461 0.1923 2611 +2613 4 295.1589 367.2274 41.7816 0.3514 2612 +2614 4 295.4952 368.2708 42.1366 0.3822 2613 +2615 4 295.6096 369.385 42.5919 0.2795 2614 +2616 4 296.2331 370.0588 43.7928 0.185 2615 +2617 4 296.5317 371.0942 43.7464 0.1497 2616 +2618 4 297.3256 371.8 43.4 0.2288 2617 +2619 4 292.4053 364.936 41.7189 0.3181 2609 +2620 4 291.8802 365.0504 43.143 0.3432 2619 +2621 4 290.7728 365.0321 43.5554 0.286 2620 +2622 4 289.8976 364.7072 42.7706 0.2392 2621 +2623 4 289.1368 364.7358 42.8515 0.2048 2622 +2624 4 288.24 364.1386 43.5266 0.3156 2623 +2625 4 287.3602 363.4614 43.68 0.4449 2624 +2626 4 286.3112 363.5632 44.5917 0.3148 2625 +2627 4 285.3834 363.832 45.808 0.1718 2626 +2628 4 284.3172 363.6776 45.6646 0.2382 2627 +2629 4 283.4443 363.0793 45.7114 0.272 2628 +2630 4 282.5383 362.9866 46.6374 0.194 2629 +2631 4 281.6173 362.6926 46.7496 0.1398 2630 +2632 4 280.8188 363.403 46.6312 0.3362 2631 +2633 4 279.7824 363.5174 47.031 0.3419 2632 +2634 4 279.1463 362.9912 48.0472 0.3432 2633 +2635 4 278.3947 362.4501 48.5447 0.2644 2634 +2636 4 277.5367 362.4192 50.2354 0.1211 2635 +2637 4 276.411 362.4718 50.4969 0.1662 2636 +2638 4 275.3379 362.6789 49.9425 0.2415 2637 +2639 4 274.4902 363.1399 49.84 0.2924 2638 +2640 4 273.877 363.1319 51.6174 0.3344 2639 +2641 4 273.0522 362.5588 51.9669 0.2843 2640 +2642 4 272.2491 362.5588 50.4311 0.2571 2641 +2643 4 271.3774 362.6308 51.52 0.1708 2642 +2644 4 270.2677 362.4215 51.52 0.1165 2643 +2645 4 269.2999 362.1618 50.7111 0.2004 2644 +2646 4 268.7084 362.1801 52.0719 0.2321 2645 +2647 4 267.7589 361.7454 51.333 0.2797 2646 +2648 4 266.7808 361.5418 51.7672 0.2789 2647 +2649 4 266.3209 361.6882 53.6942 0.3985 2648 +2650 4 265.4057 362.0474 53.4526 0.2439 2649 +2651 4 264.574 362.489 53.4411 0.2783 2650 +2652 4 263.954 362.7624 55.3714 0.1711 2651 +2653 4 263.1749 362.3746 55.6721 0.2334 2652 +2654 4 262.5286 362.8642 54.3262 0.2913 2653 +2655 4 261.6545 362.9866 55.9026 0.1447 2654 +2656 4 260.84 363.6559 56.5356 0.1864 2655 +2657 4 260.0243 364.1466 55.44 0.2384 2656 +2658 4 259.3494 364.7072 56.467 0.1685 2657 +2659 4 258.9787 365.532 57.4 0.1652 2658 +2660 4 258.989 366.4575 57.4445 0.323 2659 +2661 4 258.6332 367.1954 58.905 0.2582 2660 +2662 4 258.7213 367.6599 60.2 0.2539 2661 +2663 4 258.2591 368.4241 60.944 0.3108 2662 +2664 4 257.567 367.9161 59.5952 0.1271 2663 +2665 4 257.019 368.1117 58.0854 0.1233 2664 +2666 4 256.3876 368.9011 58.2106 0.1144 2665 +2667 4 256.256 370.0314 58.24 0.1144 2666 +2668 4 255.6863 370.4364 59.7954 0.1144 2667 +2669 4 254.9312 370.5988 61.8593 0.1144 2668 +2670 4 254.1751 370.7624 63.9234 0.1144 2669 +2671 4 253.976 371.7714 64.1962 0.1144 2670 +2672 4 253.7495 372.8788 64.1962 0.1144 2671 +2673 4 253.2553 373.897 64.1962 0.1144 2672 +2674 4 252.1387 373.6487 64.1962 0.1144 2673 +2675 4 251.203 373.3684 65.2669 0.1144 2674 +2676 4 250.401 373.063 67.118 0.1144 2675 +2677 4 249.5041 373.055 68.2506 0.1144 2676 +2678 4 248.4562 373.516 68.2506 0.1144 2677 +2679 4 247.4701 373.6533 68.2506 0.1144 2678 +2680 4 246.6922 372.9715 68.9321 0.1144 2679 +2681 4 245.9669 372.5036 70.7717 0.1144 2680 +2682 4 245.1981 372.0196 72.305 0.1144 2681 +2683 4 244.2074 371.4476 72.305 0.1144 2682 +2684 4 243.2167 370.8745 72.305 0.1144 2683 +2685 4 242.226 370.3025 72.305 0.1144 2684 +2686 4 241.2273 369.8209 72.305 0.1144 2685 +2687 4 240.1439 370.1915 72.305 0.1144 2686 +2688 4 239.0617 370.5622 72.305 0.1144 2687 +2689 4 237.9692 370.8379 72.305 0.1144 2688 +2690 4 237.0174 370.4558 72.8028 0.1144 2689 +2691 4 236.3367 369.6825 74.0242 0.1144 2690 +2692 4 235.6571 368.9091 75.2455 0.1144 2691 +2693 4 234.9925 368.114 76.3596 0.1144 2692 +2694 4 234.4811 367.0913 76.3596 0.1144 2693 +2695 4 233.9709 366.0674 76.3596 0.1144 2694 +2696 4 233.5018 365.0252 76.3596 0.1144 2695 +2697 4 233.0854 363.9602 76.3596 0.1144 2696 +2698 4 232.6679 362.894 76.3596 0.1144 2697 +2699 4 232.2503 361.8289 76.3596 0.1144 2698 +2700 4 231.8694 360.7547 76.3596 0.1144 2699 +2701 4 231.4953 359.8132 76.3596 0.117 2700 +2702 4 230.3661 359.6256 76.3596 0.1303 2701 +2703 4 229.3628 359.2309 76.3596 0.1511 2702 +2704 4 228.665 358.3237 76.3596 0.1907 2703 +2705 4 295.0822 364.602 38.6672 0.3194 2607 +2706 4 295.9951 364.7495 37.52 0.2414 2705 +2707 4 296.1976 363.7828 36.4311 0.2886 2706 +2708 4 296.5717 363.3996 38.5311 0.1894 2707 +2709 4 297.3828 363.1056 39.76 0.1186 2708 +2710 4 298.3975 362.7624 39.5097 0.2107 2709 +2711 4 299.0691 363.3275 38.36 0.1144 2710 +2712 4 300.165 363.4488 38.36 0.157 2711 +2713 4 301.2747 363.2978 38.5571 0.2108 2712 +2714 4 302.3146 363.1159 39.48 0.2691 2713 +2715 4 303.1978 362.608 39.0286 0.2902 2714 +2716 4 303.9963 362.2682 38.0766 0.4112 2715 +2717 4 304.5751 361.7923 37.8834 0.2246 2716 +2718 4 304.8188 362.076 35.9254 0.3115 2717 +2719 4 305.7146 361.9616 35.9327 0.127 2718 +2720 4 306.4856 361.6996 35.9904 0.2119 2719 +2721 4 307.172 361.4891 37.3514 0.1144 2720 +2722 4 307.8264 360.8576 37.52 0.2955 2721 +2723 4 308.0769 359.8395 37.0423 0.3545 2722 +2724 4 308.7427 359.5375 38.6562 0.1591 2723 +2725 4 309.3445 359.0455 40.241 0.2827 2724 +2726 4 309.9233 358.7515 41.9989 0.1276 2725 +2727 4 310.8511 358.6932 41.1401 0.1282 2726 +2728 4 311.716 359.0913 40.4001 0.3788 2727 +2729 4 312.8074 359.1016 41.0239 0.3432 2728 +2730 4 313.8267 359.0536 41.44 0.2796 2729 +2731 4 314.8162 358.9872 41.8132 0.2796 2730 +2732 4 315.8939 358.9174 42.6574 0.2288 2731 +2733 4 317.0104 358.9849 42.84 0.2804 2732 +2734 4 318.1109 358.8522 42.707 0.3885 2733 +2735 4 319.1028 359.1794 41.7267 0.3426 2734 +2736 4 319.8269 359.47 43.0469 0.2311 2735 +2737 4 320.7684 359.7708 43.5072 0.2161 2736 +2738 4 321.5509 359.4642 44.3794 0.1729 2737 +2739 4 322.5142 359.1725 44.3442 0.2288 2738 +2740 4 323.1869 358.4186 43.4 0.1993 2739 +2741 4 323.9019 357.7288 42.9044 0.3753 2740 +2742 4 324.8422 357.8672 43.6657 0.3258 2741 +2743 4 325.5321 357.9931 42.383 0.3363 2742 +2744 4 326.358 358.3466 43.6738 0.2719 2743 +2745 4 326.8648 358.6749 42.84 0.2354 2744 +2746 4 327.9356 358.811 42.56 0.2541 2745 +2747 4 328.7467 359.2938 41.8317 0.2001 2746 +2748 4 329.8358 359.3304 42.0885 0.3305 2747 +2749 4 330.6274 359.3579 43.6836 0.237 2748 +2750 4 331.2578 360.0225 44.8 0.2979 2749 +2751 4 332.2325 360.4744 44.8 0.3162 2750 +2752 4 333.2895 360.8084 44.564 0.2288 2751 +2753 4 334.1121 361.3221 44.5886 0.2891 2752 +2754 4 334.7241 362.0302 44.24 0.2583 2753 +2755 4 335.0776 362.5336 45.6095 0.3418 2754 +2756 4 335.9356 362.9317 45.92 0.2924 2755 +2757 4 336.9389 363.4156 45.9584 0.3442 2756 +2758 4 337.7546 364.1386 46.1555 0.4909 2757 +2759 4 338.6114 364.6889 46.0813 0.2382 2758 +2760 4 339.156 365.1534 46.8138 0.3051 2759 +2761 4 340.0975 365.4634 47.2567 0.2929 2760 +2762 4 340.8823 365.6075 45.7307 0.3305 2761 +2763 4 341.5 366.0823 47.2892 0.3561 2762 +2764 4 342.4553 366.6566 47.1313 0.3167 2763 +2765 4 343.4551 367.1256 47.3796 0.2679 2764 +2766 4 344.447 367.5089 47.971 0.3038 2765 +2767 4 345.3828 367.8212 47.9027 0.2796 2766 +2768 4 346.4501 368.1129 47.6 0.2129 2767 +2769 4 347.5575 368.2467 47.2335 0.1539 2768 +2770 4 348.4521 368.638 47.5264 0.2593 2769 +2771 4 349.3341 369.1688 47.9419 0.2287 2770 +2772 4 350.4106 369.1688 48.16 0.2039 2771 +2773 4 351.0616 369.3232 46.76 0.3025 2772 +2774 4 352.098 369.7271 47.0159 0.1907 2773 +2775 4 353.1471 370.1481 46.9907 0.1837 2774 +2776 4 354.0611 370.5405 45.92 0.128 2775 +2777 4 354.8596 370.5416 47.1531 0.1481 2776 +2778 4 355.3264 371.0964 47.3718 0.144 2777 +2779 4 355.8366 371.7908 46.3669 0.1679 2778 +2780 4 356.3411 372.5676 47.7907 0.1644 2779 +2781 4 356.9246 373.4702 48.5654 0.1993 2780 +2782 4 357.5812 374.088 48.6797 0.2343 2781 +2783 4 357.8569 374.9792 49.4337 0.2916 2782 +2784 4 358.3054 375.7891 48.1631 0.2389 2783 +2785 4 358.8282 376.3302 49.5362 0.2258 2784 +2786 4 359.3647 377.0532 50.267 0.1917 2785 +2787 4 360.0534 377.8197 50.7931 0.1591 2786 +2788 4 360.6643 378.5462 51.2117 0.2669 2787 +2789 4 361.3564 379.3996 50.96 0.2916 2788 +2790 4 361.8575 380.3217 51.1081 0.2303 2789 +2791 4 362.195 381.0584 50.2555 0.1271 2790 +2792 4 362.8825 381.5869 49.28 0.1832 2791 +2793 4 363.6696 382.1029 50.2001 0.1144 2792 +2794 4 364.348 382.2607 52.3382 0.1552 2793 +2795 4 364.9852 383.1164 52.7881 0.2288 2794 +2796 4 365.9839 383.5386 53.0956 0.2622 2795 +2797 4 366.906 384.1403 53.503 0.2134 2796 +2798 4 367.7788 384.6265 53.2258 0.1316 2797 +2799 4 368.479 385.2763 54.4043 0.2344 2798 +2800 4 369.1002 386.0943 55.295 0.1384 2799 +2801 4 370.0108 386.6137 54.6507 0.2095 2800 +2802 4 371.0678 386.7624 54.7016 0.1652 2801 +2803 4 372.0277 387.1262 55.3468 0.2288 2802 +2804 4 372.833 387.061 56.0515 0.1559 2803 +2805 4 373.6945 387.1662 56.84 0.1255 2804 +2806 4 374.4701 387.9933 56.84 0.1144 2805 +2807 4 375.542 388.2358 57.12 0.1287 2806 +2808 4 376.2124 389.119 56.6913 0.1245 2807 +2809 4 376.8599 390.0136 57.1463 0.1144 2808 +2810 4 377.5566 390.8545 57.4 0.1682 2809 +2811 4 378.3906 391.5855 57.4781 0.1454 2810 +2812 4 379.4717 391.7502 57.96 0.1144 2811 +2813 4 380.5848 391.947 57.96 0.1144 2812 +2814 4 381.3501 392.6757 58.655 0.2223 2813 +2815 4 382.1635 393.2889 59.1808 0.1556 2814 +2816 4 382.4346 393.9936 60.5164 0.1144 2815 +2817 4 383.5615 393.9936 60.76 0.1144 2816 +2818 4 384.4984 394.251 61.0137 0.1144 2817 +2819 4 384.4984 395.3939 61.04 0.1144 2818 +2820 4 384.5545 396.5093 61.3186 0.1144 2819 +2821 4 385.5612 396.7392 61.768 0.1144 2820 +2822 4 386.2796 397.381 62.344 0.1721 2821 +2823 4 387.339 397.7253 62.16 0.1398 2822 +2824 4 387.8412 398.1944 62.72 0.1144 2823 +2825 4 388.2313 399.1336 63.4063 0.1313 2824 +2826 4 389.0607 399.256 64.6979 0.1144 2825 +2827 4 389.9496 399.3944 65.9674 0.1652 2826 +2828 4 390.4232 400.1712 66.0232 0.1144 2827 +2829 4 391.0146 400.2524 67.2 0.1353 2828 +2830 4 391.8989 400.559 68.278 0.1144 2829 +2831 4 392.9091 400.7421 69.5159 0.1144 2830 +2832 4 393.782 401.2145 70.2778 0.1144 2831 +2833 4 394.4386 402.1515 70.2778 0.1144 2832 +2834 4 395.0941 403.0884 70.2778 0.1144 2833 +2835 4 395.8297 403.959 70.2778 0.1144 2834 +2836 4 396.6385 404.7678 70.2778 0.1144 2835 +2837 4 397.4977 405.4828 70.835 0.1144 2836 +2838 4 398.3637 406.1818 71.4823 0.1144 2837 +2839 4 399.2297 406.8808 72.1297 0.1144 2838 +2840 4 400.0545 407.6598 72.305 0.1144 2839 +2841 4 400.8633 408.4686 72.305 0.1144 2840 +2842 4 401.6733 409.2443 71.9141 0.1144 2841 +2843 4 402.4844 409.9879 71.1505 0.1144 2842 +2844 4 403.2943 410.7326 70.3867 0.1144 2843 +2845 4 404.1054 411.4762 69.6231 0.1144 2844 +2846 4 404.8616 412.1798 69.099 0.1144 2845 +2847 4 405.23 412.3399 71.3798 0.125 2846 +2848 4 405.6384 412.7632 73.3477 0.2874 2847 +2849 4 406.4438 413.2139 74.3761 0.3003 2848 +2850 4 407.5317 413.4233 74.76 0.1546 2849 +2851 4 408.6448 413.4439 75.04 0.1528 2850 +2852 4 409.7293 413.548 75.5255 0.2313 2851 +2853 4 410.7761 413.3901 76.2818 0.2598 2852 +2854 4 411.4076 413.874 77.84 0.2288 2853 +2855 4 412.0173 414.5913 78.8379 0.2595 2854 +2856 4 412.9199 414.9517 77.7151 0.352 2855 +2857 4 413.3409 415.6255 76.2947 0.3201 2856 +2858 4 413.8317 416.1872 77.2131 0.3327 2857 +2859 4 414.3568 416.0728 77.0 0.1525 2858 +2860 3 302.6715 383.7216 32.6642 0.3043 1 +2861 3 302.453 384.821 33.2063 0.2806 2860 +2862 3 302.3157 385.8575 34.3378 0.2415 2861 +2863 3 302.7402 386.5896 35.1868 0.1983 2862 +2864 3 303.7206 387.0827 35.6171 0.2476 2863 +2865 3 304.8131 386.8367 35.7064 0.3018 2864 +2866 3 305.8759 386.5141 35.0546 0.317 2865 +2867 3 306.9901 386.4066 34.4957 0.3299 2866 +2868 3 308.0026 386.775 35.352 0.3179 2867 +2869 3 308.6615 387.6307 36.2673 0.3178 2868 +2870 3 309.3959 388.3148 36.3852 0.2726 2869 +2871 3 310.0446 389.254 36.4014 0.2669 2870 +2872 3 310.7642 390.1418 36.4059 0.2782 2871 +2873 3 311.6862 390.811 36.4297 0.2568 2872 +2874 3 312.5694 391.5363 36.5445 0.2542 2873 +2875 3 313.4583 392.1415 37.4556 0.2542 2874 +2876 3 314.1893 392.9457 38.3135 0.242 2875 +2877 3 315.132 393.4513 37.4072 0.1916 2876 +2878 3 315.9728 394.108 36.4 0.1652 2877 +2879 3 308.9109 388.2667 36.2933 0.3758 2869 +2880 3 308.2519 388.841 37.5782 0.2585 2879 +2881 3 307.3516 389.3867 37.8 0.1144 2880 +2882 3 306.6446 390.1017 37.8 0.2186 2881 +2883 3 306.1813 391.0581 37.5416 0.2239 2882 +2884 3 305.5601 391.8223 37.6449 0.3075 2883 +2885 3 304.6358 392.3771 37.8 0.2925 2884 +2886 3 303.8636 393.1768 37.5522 0.2709 2885 +2887 3 303.0056 393.6916 38.5846 0.3178 2886 +2888 3 302.477 394.0085 40.32 0.2429 2887 +2889 3 301.5984 394.5347 40.5866 0.1743 2888 +2890 3 300.8731 394.9649 41.5528 0.2241 2889 +2891 3 301.3193 394.8665 43.8623 0.2755 2890 +2892 3 300.9109 393.9433 44.52 0.2965 2891 +2893 3 300.2062 393.4216 43.2432 0.3432 2892 +2894 3 300.1856 392.7169 41.7766 0.3432 2893 +2895 3 299.7246 391.7639 42.0 0.2415 2894 +2896 3 299.7257 390.6943 41.72 0.388 2895 +2897 3 299.0851 390.2184 43.1973 0.2161 2896 +2898 3 298.9249 389.8535 45.395 0.1907 2897 +2899 3 298.9855 388.7701 45.64 0.2601 2898 +2900 3 299.0874 387.9716 44.5883 0.2619 2899 +2901 3 299.156 387.1593 45.3986 0.3046 2900 +2902 3 298.4925 386.4535 46.422 0.2034 2901 +2903 3 297.7397 385.8689 47.04 0.2873 2902 +2904 3 297.0545 385.3255 46.494 0.3146 2903 +2905 3 296.6609 384.8427 47.248 0.1926 2904 +2906 3 296.5374 384.2627 48.6836 0.1447 2905 +2907 3 296.2971 383.804 46.7191 0.1365 2906 +2908 3 295.6222 383.1256 46.5027 0.2288 2907 +2909 3 294.9507 382.5147 46.6771 0.4243 2908 +2910 3 294.2093 381.7013 47.2125 0.4117 2909 +2911 3 293.817 380.9142 48.72 0.2415 2910 +2912 3 293.0104 379.9007 48.72 0.2432 2911 +2913 3 292.3812 378.9855 48.974 0.2648 2912 +2914 3 292.0907 377.9684 48.841 0.2299 2913 +2915 3 291.9488 377.3358 50.96 0.312 2914 +2916 3 291.9614 376.2467 51.2392 0.3431 2915 +2917 3 291.3779 375.4047 50.68 0.2985 2916 +2918 3 290.6023 374.7206 50.9846 0.278 2917 +2919 3 290.7144 374.1681 52.9108 0.2835 2918 +2920 3 290.8048 373.2792 54.1652 0.1481 2919 +2921 3 290.385 372.6008 53.3868 0.2161 2920 +2922 3 290.3472 372.0299 52.64 0.2583 2921 +2923 3 290.1184 371.085 53.436 0.3193 2922 +2924 3 289.9422 370.124 54.4421 0.2892 2923 +2925 3 289.7535 369.2477 55.1698 0.3225 2924 +2926 3 289.98 368.5728 57.2592 0.2831 2925 +2927 3 290.4238 367.987 58.52 0.2161 2926 +2928 3 290.6446 367.7274 58.688 0.3051 2927 +2929 3 291.6262 367.3212 59.36 0.3384 2928 +2930 3 292.4968 366.6154 59.4339 0.2977 2929 +2931 3 292.872 365.6533 59.9701 0.1612 2930 +2932 3 293.6648 365.1648 61.04 0.1652 2931 +2933 3 290.5611 367.8749 59.4359 0.1503 2927 +2934 3 290.393 367.0638 60.5357 0.1144 2933 +2935 3 289.7272 366.5376 61.3404 0.2034 2934 +2936 3 289.3679 365.8306 61.8419 0.2182 2935 +2937 3 289.9411 365.254 62.519 0.2288 2936 +2938 3 290.536 364.9017 64.3983 0.2041 2937 +2939 3 290.1745 363.9339 63.84 0.1714 2938 +2940 3 289.6574 363.0793 64.2852 0.1447 2939 +2941 3 289.3176 362.2076 64.68 0.1253 2940 +2942 3 289.3325 361.639 63.1912 0.1261 2941 +2943 3 289.1494 361.4674 60.4593 0.1241 2942 +2944 3 288.9675 361.2958 57.7273 0.1222 2943 +2945 3 288.7845 361.123 54.9956 0.1202 2944 +2946 3 288.6015 360.9514 52.2637 0.1183 2945 +2947 3 288.4184 360.7798 49.5317 0.1163 2946 +2948 3 288.2365 360.6082 46.8 0.1144 2947 +2949 3 287.5444 359.7159 46.7289 0.1144 2948 +2950 3 286.8019 358.8591 46.7149 0.1144 2949 +2951 3 285.8307 358.2539 46.7561 0.1144 2950 +2952 3 284.9487 357.5858 46.8082 0.1144 2951 +2953 3 284.332 356.7312 46.858 0.1144 2952 +2954 3 283.2922 356.2919 46.6906 0.1391 2953 +2955 3 282.7934 355.2703 46.809 0.1907 2954 +2956 3 289.9296 372.4864 52.08 0.1144 2921 +2957 3 288.8714 372.5619 51.6617 0.2465 2956 +2958 3 287.8865 372.944 51.52 0.2099 2957 +2959 3 287.144 373.0584 52.561 0.2852 2958 +2960 3 286.4599 372.944 54.04 0.3556 2959 +2961 3 285.3445 372.9818 53.7656 0.2773 2960 +2962 3 284.7416 372.9314 55.4616 0.2169 2961 +2963 3 284.1078 372.6008 56.56 0.1401 2962 +2964 3 283.6399 373.0584 57.862 0.3485 2963 +2965 3 282.5966 373.2163 57.9992 0.5607 2964 +2966 3 282.1001 374.0686 58.8 0.3448 2965 +2967 3 281.2547 373.9816 60.0006 0.1652 2966 +2968 3 281.1449 374.2024 61.9125 0.2333 2967 +2969 3 281.0591 374.6577 63.9733 0.2866 2968 +2970 3 280.9344 375.7651 64.3952 0.1858 2969 +2971 3 280.4367 376.5899 65.0448 0.125 2970 +2972 3 280.3944 377.6733 65.52 0.1158 2971 +2973 3 280.7788 378.6297 65.728 0.13 2972 +2974 3 280.6209 379.6959 65.7233 0.2258 2973 +2975 3 279.8933 380.3114 66.6324 0.2405 2974 +2976 3 279.7641 381.2083 65.8182 0.3782 2975 +2977 3 279.9276 381.9633 67.1437 0.3173 2976 +2978 3 279.8773 382.6302 68.7977 0.2118 2977 +2979 3 279.5032 383.5775 69.1964 0.1144 2978 +2980 3 279.2527 384.5945 68.7786 0.1861 2979 +2981 3 279.4106 384.9766 71.2944 0.1321 2980 +2982 3 278.7642 385.7099 71.12 0.2981 2981 +2983 3 277.6488 385.8712 70.84 0.3305 2982 +2984 3 293.0894 380.5894 46.76 0.1271 2911 +2985 3 291.9614 380.7232 46.76 0.1538 2984 +2986 3 290.8586 380.8193 46.1504 0.2162 2985 +2987 3 289.7718 380.5916 46.0222 0.2161 2986 +2988 3 288.6781 380.6454 46.569 0.2034 2987 +2989 3 287.843 381.0698 47.3659 0.2164 2988 +2990 3 287.4689 381.2952 49.56 0.1144 2989 +2991 3 286.4198 381.2895 49.474 0.3917 2990 +2992 3 285.7987 381.1362 47.6291 0.2502 2991 +2993 3 285.1889 381.2609 49.3774 0.3268 2992 +2994 3 284.2382 381.2849 50.0567 0.1769 2993 +2995 3 283.5496 381.4531 50.9362 0.1191 2994 +2996 3 282.5783 381.7116 51.0138 0.2955 2995 +2997 3 281.5544 381.7048 50.3496 0.2034 2996 +2998 3 281.3508 382.525 50.9832 0.2532 2997 +2999 3 280.6404 383.2022 51.52 0.1144 2998 +3000 3 279.7583 383.4688 52.2348 0.1399 2999 +3001 3 278.7493 383.3075 51.8476 0.1907 3000 +3002 3 278.111 383.0226 49.8753 0.1152 3001 +3003 3 277.6488 383.4665 51.2845 0.1317 3002 +3004 3 277.269 383.2354 52.92 0.119 3003 +3005 3 276.6078 383.4059 54.0921 0.1398 3004 +3006 3 275.6674 383.4791 53.4988 0.2567 3005 +3007 3 274.9432 383.0512 52.4569 0.241 3006 +3008 3 274.1871 383.0192 52.7344 0.3432 3007 +3009 3 273.9171 383.5775 54.32 0.2651 3008 +3010 3 272.8348 383.5695 54.6 0.1894 3009 +3011 3 272.2182 382.9254 53.3431 0.2984 3010 +3012 3 271.2584 382.7824 53.4733 0.3298 3011 +3013 3 270.858 382.668 55.1729 0.3138 3012 +3014 3 270.3764 382.3179 53.3095 0.329 3013 +3015 3 269.4852 381.9164 53.8037 0.2201 3014 +3016 3 268.8514 381.1797 54.6538 0.1144 3015 +3017 3 268.3366 380.6866 56.0804 0.2325 3016 +3018 3 267.4592 380.0471 55.8768 0.2652 3017 +3019 3 266.7042 379.999 54.04 0.1525 3018 +3020 3 266.0303 379.4648 53.48 0.3377 3019 +3021 3 265.17 379.1811 53.004 0.2123 3020 +3022 3 264.407 378.7555 54.061 0.2164 3021 +3023 3 263.5181 378.3059 54.628 0.3394 3022 +3024 3 262.9816 377.3209 55.0556 0.3694 3023 +3025 3 262.4405 376.4321 54.5476 0.3101 3024 +3026 3 261.9737 375.55 54.36 0.3044 3025 +3027 3 261.1878 375.0798 55.421 0.1761 3026 +3028 3 260.8126 374.1749 54.5619 0.1209 3027 +3029 3 260.1662 373.3764 54.5667 0.2115 3028 +3030 3 259.3368 372.8193 53.76 0.2829 3029 +3031 3 258.6927 371.9464 54.1013 0.3026 3030 +3032 3 257.9125 371.228 53.5413 0.1691 3031 +3033 3 257.0351 370.7372 52.9477 0.3278 3032 +3034 3 256.3155 370.259 53.7499 0.2712 3033 +3035 3 255.5444 369.5978 53.1342 0.2398 3034 +3036 3 254.8832 368.9434 53.3448 0.3489 3035 +3037 3 254.3673 368.2639 52.169 0.2641 3036 +3038 3 253.7838 367.6164 53.48 0.1221 3037 +3039 3 252.9087 366.9288 53.48 0.2652 3038 +3040 3 252.0873 366.1498 53.1748 0.2877 3039 +3041 3 251.2556 365.3719 53.2 0.3013 3040 +3042 3 250.4868 364.5802 53.7205 0.2342 3041 +3043 3 249.5899 363.9316 53.739 0.1439 3042 +3044 3 248.6724 363.5632 53.872 0.2132 3043 +3045 3 247.9162 363.0621 53.8311 0.3348 3044 +3046 3 247.2264 362.3254 53.9406 0.2788 3045 +3047 3 246.4405 361.6115 54.3077 0.1448 3046 +3048 3 245.6786 360.813 54.04 0.1398 3047 +3049 3 245.2095 359.7937 54.243 0.1503 3048 +3050 3 244.53 358.9243 54.6 0.1445 3049 +3051 3 243.9477 358.0251 54.642 0.2542 3050 +3052 3 243.5576 357.3318 53.5553 0.1221 3051 +3053 3 243.275 356.6042 53.3238 0.1588 3052 +3054 3 242.8289 356.0322 54.6244 0.2288 3053 +3055 3 242.2992 355.1502 54.899 0.2669 3054 +3056 3 242.1207 354.2751 56.28 0.3432 3055 +3057 3 241.6357 353.3679 56.0123 0.2643 3056 +3058 3 240.8269 352.6094 56.089 0.1144 3057 +3059 3 240.645 351.7148 57.12 0.1144 3058 +3060 3 239.8922 351.2366 57.68 0.1144 3059 +3061 3 239.0422 350.5399 57.9356 0.1144 3060 +3062 3 238.8214 349.4417 57.68 0.1144 3061 +3063 3 238.7517 348.3057 57.68 0.1144 3062 +3064 3 238.0492 347.5529 57.68 0.1144 3063 +3065 3 237.1283 346.9249 57.68 0.1144 3064 +3066 3 236.2383 346.4226 57.68 0.1246 3065 +3067 3 236.4648 345.488 58.24 0.1652 3066 +3068 3 301.8021 385.9673 32.2 0.2793 2862 +3069 3 300.9864 386.2281 32.3224 0.2621 3068 +3070 3 301.0562 386.5576 34.214 0.285 3069 +3071 3 300.3 386.4604 35.5289 0.2288 3070 +3072 3 299.9568 386.4512 33.717 0.1441 3071 +3073 3 299.5209 387.3081 32.7891 0.1158 3072 +3074 3 299.2372 388.3583 33.0509 0.1652 3073 +3075 3 298.5074 388.6809 34.4084 0.2413 3074 +3076 3 297.5086 388.6202 34.2768 0.2446 3075 +3077 3 296.7708 389.1202 34.5391 0.2262 3076 +3078 3 296.2903 389.8203 35.3847 0.2984 3077 +3079 3 295.8018 390.6794 35.3133 0.2512 3078 +3080 3 295.0307 391.0524 35.399 0.1151 3079 +3081 3 294.5022 391.6598 36.2202 0.1943 3080 +3082 3 293.8536 392.4606 35.6334 0.2314 3081 +3083 3 293.0345 392.9308 35.6964 0.1635 3082 +3084 3 292.705 393.4067 37.413 0.1756 3083 +3085 3 291.8115 393.536 36.2429 0.2452 3084 +3086 3 291.0908 394.0451 36.7394 0.2924 3085 +3087 3 290.3232 394.8676 36.6402 0.3487 3086 +3088 3 289.7969 395.8206 37.4128 0.3686 3087 +3089 3 289.337 396.7335 38.3197 0.3618 3088 +3090 3 288.8749 397.7528 37.8179 0.3355 3089 +3091 3 288.1816 398.6394 37.6398 0.3178 3090 +3092 3 287.2538 399.1999 38.1455 0.329 3091 +3093 3 286.1991 399.5843 38.6672 0.3305 3092 +3094 3 285.3765 400.3703 38.8872 0.3178 3093 +3095 3 285.1351 401.0841 39.4862 0.309 3094 +3096 3 284.8903 402.1469 40.3077 0.2871 3095 +3097 3 284.7382 403.2623 40.7478 0.2887 3096 +3098 3 284.2932 404.2907 40.6952 0.3016 3097 +3099 3 283.7429 405.2654 40.1495 0.3235 3098 +3100 3 283.259 406.287 40.1386 0.3119 3099 +3101 3 282.9501 407.3212 40.9646 0.3051 3100 +3102 3 282.3644 408.019 42.4886 0.2759 3101 +3103 3 281.4675 408.6105 43.2656 0.2569 3102 +3104 3 280.4505 409.0326 43.9835 0.2241 3103 +3105 3 279.3854 409.4147 44.3092 0.2161 3104 +3106 3 278.373 409.1344 45.0106 0.2385 3105 +3107 3 277.6271 408.3325 45.7288 0.2879 3106 +3108 3 276.9624 407.6324 46.8222 0.3305 3107 +3109 3 277.0768 407.1382 48.0374 0.2994 3108 +3110 3 276.6089 406.4815 48.4624 0.2034 3109 +3111 3 276.4545 405.9964 46.727 0.3432 3110 +3112 3 276.5071 405.3627 48.1037 0.2949 3111 +3113 3 276.7267 405.0218 50.1592 0.166 3112 +3114 3 276.562 404.6271 52.624 0.2542 3113 +3115 3 276.5208 403.6043 52.08 0.2632 3114 +3116 3 277.0173 402.9168 51.5032 0.1965 3115 +3117 3 277.42 402.0508 50.9886 0.1631 3116 +3118 3 277.5344 401.7122 53.496 0.2886 3117 +3119 3 277.4978 400.7695 54.4981 0.3625 3118 +3120 3 277.42 399.9573 56.3069 0.191 3119 +3121 3 277.4852 399.2457 55.7511 0.2288 3120 +3122 3 276.8572 398.4483 55.5302 0.2458 3121 +3123 3 277.2415 398.112 56.7157 0.1652 3122 +3124 3 277.0082 397.6201 57.134 0.2924 3123 +3125 3 276.1616 397.4256 56.0 0.1398 3124 +3126 3 277.3559 397.9896 57.1217 0.1461 3123 +3127 3 277.0711 397.4256 58.8 0.3184 3126 +3128 3 275.9694 397.3112 58.4248 0.3432 3127 +3129 3 275.4638 398.0354 59.08 0.1289 3128 +3130 3 274.8105 398.1566 60.4094 0.1674 3129 +3131 3 274.258 398.4769 61.0156 0.4399 3130 +3132 3 273.2593 398.9368 60.727 0.314 3131 +3133 3 272.7307 399.6736 59.5501 0.2247 3132 +3134 3 272.2377 399.9321 60.3288 0.1488 3133 +3135 3 272.272 399.828 62.9796 0.2043 3134 +3136 3 271.4003 399.566 63.1621 0.4282 3135 +3137 3 270.3455 399.4711 63.7241 0.1451 3136 +3138 3 269.3342 399.256 64.12 0.1144 3137 +3139 3 268.1902 399.256 64.12 0.121 3138 +3140 3 267.0474 399.2182 64.12 0.1525 3139 +3141 3 266.0852 398.6337 64.12 0.2262 3140 +3142 3 265.1517 398.7206 63.56 0.1864 3141 +3143 3 264.4699 399.0581 64.496 0.1398 3142 +3144 3 263.4094 399.129 65.2028 0.1169 3143 +3145 3 262.4061 398.7984 65.0188 0.2034 3144 +3146 3 261.3903 398.9437 65.6172 0.2879 3145 +3147 3 260.4888 399.5065 65.8 0.2272 3146 +3148 3 260.2108 400.2673 66.743 0.2918 3147 +3149 3 259.4592 399.8532 67.3868 0.178 3148 +3150 3 276.9075 407.3876 49.266 0.3917 3108 +3151 3 277.1637 408.122 50.85 0.2542 3150 +3152 3 277.4795 409.1161 51.45 0.2924 3151 +3153 3 278.1819 409.8506 51.254 0.3254 3152 +3154 3 278.8443 409.6069 51.2011 0.2288 3153 +3155 3 279.819 409.6046 51.8115 0.3988 3154 +3156 3 280.4825 409.7259 53.2549 0.3432 3155 +3157 3 280.6324 410.4203 54.3906 0.1144 3156 +3158 3 279.9036 411.1708 55.16 0.2471 3157 +3159 3 279.708 412.1638 55.4663 0.394 3158 +3160 3 279.4838 413.1682 56.0899 0.3137 3159 +3161 3 279.8121 413.9804 56.9985 0.475 3160 +3162 3 279.7103 414.5719 58.175 0.2853 3161 +3163 3 280.2239 415.518 58.5108 0.1996 3162 +3164 3 280.6724 416.5327 58.0042 0.1301 3163 +3165 3 281.5716 417.1562 57.96 0.1144 3164 +3166 3 281.7466 418.2567 58.1955 0.2175 3165 +3167 3 281.6825 419.3309 59.005 0.3222 3166 +3168 3 281.686 420.3639 59.36 0.3051 3167 +3169 3 281.7832 421.2116 59.0996 0.286 3168 +3170 3 282.1424 422.1749 59.36 0.4296 3169 +3171 3 282.8403 422.9746 59.64 0.3432 3170 +3172 3 282.7247 423.9229 58.3181 0.287 3171 +3173 3 282.3518 424.8027 57.3266 0.1763 3172 +3174 3 282.1207 425.7625 56.2884 0.2231 3173 +3175 3 282.1196 426.4935 57.9961 0.1258 3174 +3176 3 282.6103 426.8573 60.1488 0.3085 3175 +3177 3 282.9272 427.4522 61.8425 0.3381 3176 +3178 3 282.568 428.3594 63.1408 0.3267 3177 +3179 3 282.7888 429.2791 63.936 0.1522 3178 +3180 3 282.6881 430.3293 64.412 0.1867 3179 +3181 3 282.3598 431.185 64.4232 0.2946 3180 +3182 3 282.1104 431.852 62.7718 0.2859 3181 +3183 3 281.6963 432.432 63.6236 0.1947 3182 +3184 3 281.4068 433.0601 65.4696 0.3099 3183 +3185 3 281.1952 433.9158 64.9006 0.2322 3184 +3186 3 280.7845 434.2887 65.6645 0.1525 3185 +3187 3 280.8543 435.0907 66.6658 0.1271 3186 +3188 3 280.8383 436.0711 66.1097 0.1867 3187 +3189 3 280.9767 436.9233 66.64 0.1802 3188 +3190 3 281.122 437.7951 68.0103 0.1265 3189 +3191 3 281.3199 438.8395 67.345 0.1144 3190 +3192 3 281.6528 439.3624 65.5085 0.1144 3191 +3193 3 281.0808 439.9138 64.328 0.2288 3192 +3194 3 281.7786 440.5864 64.6702 0.2454 3193 +3195 3 281.9834 441.6767 64.43 0.3173 3194 +3196 3 282.4616 442.6914 64.4221 0.3432 3195 +3197 3 283.1858 443.5208 64.96 0.3432 3196 +3198 3 283.7417 444.4703 64.757 0.2963 3197 +3199 3 284.316 445.4084 64.2502 0.208 3198 +3200 3 284.5185 446.4357 63.28 0.2288 3199 +3201 3 285.3079 446.8796 64.045 0.2924 3200 +3202 3 285.825 447.836 63.9262 0.2924 3201 +3203 3 286.3661 448.7523 63.635 0.2796 3202 +3204 3 286.8008 449.7064 64.12 0.1652 3203 +3205 3 284.7508 401.0761 36.9678 0.2938 3094 +3206 3 283.8539 401.417 37.3548 0.1907 3205 +3207 3 282.9249 402.005 37.24 0.2796 3206 +3208 3 282.1081 402.5358 36.5078 0.2034 3207 +3209 3 281.2879 403.117 36.12 0.1657 3208 +3210 3 280.328 403.1456 37.1675 0.1398 3209 +3211 3 279.6714 403.1124 35.2377 0.196 3210 +3212 3 278.7356 402.9168 34.7536 0.1956 3211 +3213 3 278.0069 403.26 35.84 0.3232 3212 +3214 3 276.9635 403.4888 36.5394 0.178 3213 +3215 3 275.887 403.7531 36.68 0.1144 3214 +3216 3 275.3539 404.404 36.1544 0.1248 3215 +3217 3 274.9066 404.9199 37.7216 0.1525 3216 +3218 3 274.4673 405.4004 35.84 0.2354 3217 +3219 3 273.7363 406.1074 36.1598 0.2691 3218 +3220 3 272.9321 406.1234 35.84 0.2034 3219 +3221 3 272.089 406.644 35.0672 0.2637 3220 +3222 3 271.1715 407.2182 35.6367 0.1726 3221 +3223 3 270.4164 407.8349 35.6793 0.236 3222 +3224 3 269.6637 407.979 33.9052 0.3051 3223 +3225 3 268.9029 408.2593 32.48 0.179 3224 +3226 3 268.0472 408.8576 32.7146 0.1629 3225 +3227 3 266.9375 408.7512 33.04 0.3062 3226 +3228 3 265.9365 408.6139 32.0146 0.2568 3227 +3229 3 264.9527 408.6974 31.5182 0.2667 3228 +3230 3 263.9059 408.7318 31.4266 0.2288 3229 +3231 3 262.8088 408.8656 31.7685 0.2007 3230 +3232 3 261.6831 408.8141 31.92 0.1652 3231 +3233 3 260.5597 408.932 31.619 0.1693 3232 +3234 3 259.4352 409.075 31.2483 0.14 3233 +3235 3 258.6001 409.679 31.0845 0.1171 3234 +3236 3 257.5968 410.1572 31.0845 0.1144 3235 +3237 3 256.5248 410.5576 31.0845 0.1144 3236 +3238 3 255.4552 410.9614 31.0845 0.1144 3237 +3239 3 254.3135 411.0255 31.0845 0.1144 3238 +3240 3 253.1866 411.2074 31.0845 0.1144 3239 +3241 3 252.0953 411.522 31.0845 0.1173 3240 +3242 3 251.0794 412.0505 31.0845 0.1292 3241 +3243 3 250.075 412.5893 31.019 0.1411 3242 +3244 3 249.1632 413.2254 30.3652 0.1534 3243 +3245 3 248.2503 413.8626 29.7111 0.1657 3244 +3246 3 247.3385 414.4987 29.0573 0.178 3245 +3247 3 304.8096 381.4679 38.6523 0.2153 1 +3248 3 305.1963 381.9381 41.022 0.2092 3247 +3249 3 305.5841 382.4083 43.3919 0.2031 3248 +3250 3 305.9708 382.8785 45.7618 0.1969 3249 +3251 3 306.3586 383.3487 48.1317 0.1908 3250 +3252 3 306.878 384.2765 47.9699 0.3432 3251 +3253 3 307.2967 385.1882 48.9698 0.3432 3252 +3254 3 307.6376 386.0714 49.2293 0.2466 3253 +3255 3 307.6445 387.0918 50.104 0.2488 3254 +3256 3 307.9511 388.0597 49.7342 0.1685 3255 +3257 3 308.2005 389.1419 49.3119 0.146 3256 +3258 3 308.4304 389.9198 50.4 0.1144 3257 +3259 3 308.4807 390.9414 49.8677 0.1616 3258 +3260 3 308.6878 391.8246 49.1817 0.3371 3259 +3261 3 308.7656 392.8633 49.5001 0.2322 3260 +3262 3 308.5368 393.5738 50.2107 0.3432 3261 +3263 3 308.7656 394.2567 49.6667 0.3432 3262 +3264 3 308.4773 394.9214 51.142 0.2143 3263 +3265 3 308.6512 395.8938 50.0354 0.2518 3264 +3266 3 308.6157 396.7998 49.7227 0.3896 3265 +3267 3 308.5368 397.9381 49.7487 0.2531 3266 +3268 3 308.5585 399.0775 49.733 0.2107 3267 +3269 3 308.6787 400.2021 49.8408 0.2771 3268 +3270 3 308.9132 401.2557 49.8532 0.3632 3269 +3271 3 309.1088 402.3185 49.5729 0.2924 3270 +3272 3 309.2232 403.4041 49.8308 0.2644 3271 +3273 3 309.452 404.1512 48.095 0.178 3272 +3274 3 309.4428 404.9737 46.2944 0.1302 3273 +3275 3 309.1088 405.675 44.8711 0.2415 3274 +3276 3 309.325 406.5398 46.0443 0.2161 3275 +3277 3 309.4017 406.6931 46.3918 0.2221 3276 +3278 3 309.5664 407.5592 47.8649 0.1144 3277 +3279 3 309.5664 408.7032 47.88 0.1144 3278 +3280 3 309.7483 409.552 49.1047 0.2597 3279 +3281 3 310.0446 410.0565 51.1157 0.4068 3280 +3282 3 309.9096 411.0564 51.5217 0.3044 3281 +3283 3 309.5721 411.8194 52.8315 0.1191 3282 +3284 3 309.1546 412.6545 51.7496 0.2576 3283 +3285 3 308.3984 413.0755 50.2944 0.3067 3284 +3286 3 307.919 413.9118 49.0896 0.3686 3285 +3287 3 307.5221 414.9505 49.28 0.3257 3286 +3288 3 307.0507 415.6072 49.5709 0.1159 3287 +3289 3 307.2361 416.6459 49.0 0.1242 3288 +3290 3 306.592 417.4696 48.7676 0.2855 3289 +3291 3 306.0841 417.9066 50.0948 0.1811 3290 +3292 3 305.575 418.6903 48.9404 0.2918 3291 +3293 3 305.448 419.5048 49.2313 0.1337 3292 +3294 3 304.8577 419.8869 49.84 0.1407 3293 +3295 3 304.542 420.9691 50.0088 0.1985 3294 +3296 3 304.304 421.588 51.7129 0.3954 3295 +3297 3 303.8922 422.3648 51.938 0.1304 3296 +3298 3 303.0433 422.7137 52.0425 0.31 3297 +3299 3 302.5102 423.6163 51.3766 0.2288 3298 +3300 3 302.421 424.5144 50.7396 0.1495 3299 +3301 3 301.8661 425.3014 50.7237 0.1144 3300 +3302 3 301.2976 425.8071 49.2954 0.2227 3301 +3303 3 300.8526 426.6045 48.4319 0.1968 3302 +3304 3 300.3194 427.284 48.972 0.2669 3303 +3305 3 300.2016 427.6272 50.9886 0.2304 3304 +3306 3 299.5255 428.2095 50.2354 0.3051 3305 +3307 3 298.7979 428.873 49.0008 0.3052 3306 +3308 3 298.3907 429.5102 49.9215 0.1997 3307 +3309 3 298.6275 430.3739 50.9821 0.1925 3308 +3310 3 298.8128 431.3727 50.65 0.1525 3309 +3311 3 298.2957 432.0053 49.2226 0.1199 3310 +3312 3 297.4526 432.4881 48.2731 0.1584 3311 +3313 3 296.7147 432.9617 48.8113 0.2259 3312 +3314 3 296.137 433.8929 49.2744 0.3432 3313 +3315 3 295.621 434.6216 49.8859 0.2779 3314 +3316 3 295.0754 434.9488 48.627 0.1653 3315 +3317 3 294.58 435.4373 49.6874 0.2065 3316 +3318 3 294.1327 435.7679 51.52 0.3305 3317 +3319 3 293.5721 436.7414 51.7588 0.3424 3318 +3320 3 293.0059 437.3512 53.1894 0.3406 3319 +3321 3 292.1078 437.4656 54.5742 0.1614 3320 +3322 3 291.1308 437.9449 54.6 0.2161 3321 +3323 3 290.7876 438.2687 56.558 0.1144 3322 +3324 3 290.4055 439.0203 57.9569 0.1144 3323 +3325 3 290.1218 439.6907 56.2906 0.2096 3324 +3326 3 289.6597 440.329 54.6 0.254 3325 +3327 3 289.2295 441.2316 54.2987 0.2845 3326 +3328 3 289.0179 441.9135 55.8494 0.2187 3327 +3329 3 288.5191 442.7841 55.44 0.3979 3328 +3330 3 288.3955 443.8217 55.9689 0.3409 3329 +3331 3 287.6737 444.4463 56.1383 0.2359 3330 +3332 3 287.3728 445.016 56.1686 0.2592 3331 +3333 3 286.961 444.5904 57.904 0.1165 3332 +3334 3 286.3432 445.2723 57.0769 0.1703 3333 +3335 3 285.476 445.5617 56.8282 0.3426 3334 +3336 3 284.586 445.9953 58.0994 0.3135 3335 +3337 3 283.5839 446.0456 59.0573 0.3711 3336 +3338 3 282.5508 446.0467 58.9596 0.2833 3337 +3339 3 281.948 446.6462 59.3718 0.2876 3338 +3340 3 281.1254 446.7366 58.1423 0.3386 3339 +3341 3 280.2239 446.6702 57.3493 0.2585 3340 +3342 3 279.3728 446.3888 56.7204 0.1144 3341 +3343 3 278.7928 446.16 54.88 0.2288 3342 +3344 3 309.9748 406.8121 46.0188 0.2369 3276 +3345 3 311.0296 407.2548 45.9777 0.2707 3344 +3346 3 312.0843 407.6976 45.9365 0.3044 3345 +3347 3 312.7696 408.2341 44.8417 0.1737 3346 +3348 3 313.178 408.9514 44.1854 0.2288 3347 +3349 3 313.2203 408.7512 46.6082 0.1522 3348 +3350 3 313.7786 408.9571 47.6132 0.1687 3349 +3351 3 314.028 409.671 48.5948 0.2263 3350 +3352 3 314.4044 410.0119 50.4431 0.1761 3351 +3353 3 314.6 410.7978 49.5886 0.3051 3352 +3354 3 315.148 411.1673 50.0436 0.2299 3353 +3355 3 316.0071 411.7256 50.3829 0.2605 3354 +3356 3 316.5414 411.4041 52.6288 0.2288 3355 +3357 3 317.2598 411.3355 53.503 0.2257 3356 +3358 3 317.4806 412.2187 54.0238 0.247 3357 +3359 3 318.5216 412.412 53.5049 0.3432 3358 +3360 3 319.2446 412.0814 55.0458 0.2796 3359 +3361 3 320.3154 412.3491 55.1342 0.2669 3360 +3362 3 321.0236 412.722 56.0829 0.2682 3361 +3363 3 321.6493 413.4153 56.84 0.2924 3362 +3364 3 322.1412 414.3454 57.0713 0.3033 3363 +3365 3 322.608 414.9871 58.52 0.2162 3364 +3366 3 323.0656 415.6381 57.636 0.433 3365 +3367 3 323.935 416.0362 57.12 0.4287 3366 +3368 3 324.2096 417.1127 57.391 0.4539 3367 +3369 3 324.0529 417.949 58.7891 0.3985 3368 +3370 3 324.3126 418.7223 60.2 0.3432 3369 +3371 3 324.8823 419.5231 60.3691 0.2942 3370 +3372 3 325.0459 420.5218 60.6472 0.1473 3371 +3373 3 325.4165 421.4416 60.48 0.3432 3372 +3374 3 325.2667 422.4312 60.6889 0.3119 3373 +3375 3 325.7082 423.2972 60.226 0.38 3374 +3376 3 325.8661 424.0865 61.2926 0.2585 3375 +3377 3 325.9199 425.0177 60.2588 0.2841 3376 +3378 3 325.7071 425.862 61.6358 0.2314 3377 +3379 3 326.0972 426.1366 63.3153 0.2695 3378 +3380 3 326.4507 426.6262 65.0787 0.2192 3379 +3381 3 326.7264 427.419 66.561 0.2398 3380 +3382 3 326.8763 428.3742 66.6456 0.3059 3381 +3383 3 326.8442 429.3947 67.4338 0.3148 3382 +3384 3 327.1096 430.3419 67.7748 0.2868 3383 +3385 3 327.5078 431.161 67.8936 0.1971 3384 +3386 3 328.1713 431.5626 66.7019 0.144 3385 +3387 3 329.0213 431.5454 67.2294 0.1544 3386 +3388 3 329.798 432.1872 66.64 0.2924 3387 +3389 3 329.9948 432.9662 67.7648 0.2911 3388 +3390 3 330.1801 433.004 70.4287 0.3371 3389 +3391 3 330.5645 433.6298 72.228 0.1314 3390 +3392 3 331.2875 434.1526 73.4877 0.1144 3391 +3393 3 331.8538 434.7303 72.4069 0.1975 3392 +3394 3 332.8823 435.0609 72.5502 0.2422 3393 +3395 3 333.5252 435.2909 74.4629 0.3375 3394 +3396 3 334.4678 435.6306 75.5014 0.2812 3395 +3397 3 335.2378 435.7496 74.8157 0.333 3396 +3398 3 335.0776 436.436 73.64 0.3305 3397 +3399 3 305.1414 375.2514 27.8631 0.2871 1 +3400 3 305.353 374.191 28.0683 0.4743 3399 +3401 3 305.4926 373.3318 29.0111 0.2337 3400 +3402 3 306.2442 372.8079 28.9262 0.2288 3401 +3403 3 306.7636 371.8332 28.6373 0.2288 3402 +3404 3 307.4077 371.4568 27.7245 0.2288 3403 +3405 3 308.1215 371.228 29.3124 0.2796 3404 +3406 3 308.8056 370.4718 29.5221 0.2708 3405 +3407 3 309.3708 370.2293 27.7206 0.2075 3406 +3408 3 309.2507 369.3244 27.6763 0.3161 3407 +3409 3 309.4165 368.3817 27.9832 0.2611 3408 +3410 3 310.0515 367.7708 27.1438 0.3432 3409 +3411 3 310.4942 367.113 27.6755 0.2672 3410 +3412 3 310.6818 366.1898 28.5524 0.3049 3411 +3413 3 311.0078 365.2986 28.0162 0.3257 3412 +3414 3 311.9413 364.936 27.2852 0.2056 3413 +3415 3 312.8703 365.2792 28.1708 0.3685 3414 +3416 3 313.8942 365.2598 28.4698 0.394 3415 +3417 3 314.8231 364.8777 27.1281 0.394 3416 +3418 3 315.6307 364.5756 26.8223 0.44 3417 +3419 3 315.9877 363.5438 26.3511 0.425 3418 +3420 3 316.6009 362.8356 27.16 0.1892 3419 +3421 3 316.888 361.8529 27.6231 0.178 3420 +3422 3 317.3445 361.4697 29.5854 0.1598 3421 +3423 3 318.2711 360.94 30.24 0.1525 3422 +3424 3 318.4999 360.1438 28.8812 0.2013 3423 +3425 3 319.5284 359.9882 28.5519 0.1409 3424 +3426 3 320.3394 359.6072 27.2507 0.2127 3425 +3427 3 320.9092 358.914 27.0637 0.4514 3426 +3428 3 321.6127 358.1933 27.6587 0.3943 3427 +3429 3 322.2774 357.3044 27.711 0.3632 3428 +3430 3 322.894 356.451 27.44 0.339 3429 +3431 3 323.784 355.8435 26.861 0.4089 3430 +3432 3 324.3629 354.9649 26.6406 0.1952 3431 +3433 3 325.1225 354.3437 26.88 0.1253 3432 +3434 3 325.7048 353.8392 27.3073 0.1195 3433 +3435 3 326.6944 353.7248 28.238 0.165 3434 +3436 3 327.6416 353.3953 28.1812 0.2288 3435 +3437 3 328.0031 352.8016 26.7358 0.2907 3436 +3438 3 328.7845 352.4664 25.4806 0.2282 3437 +3439 3 329.3999 352.5545 27.3697 0.1705 3438 +3440 3 330.028 352.3955 28.5852 0.1246 3439 +3441 3 330.3872 351.5237 28.9528 0.2258 3440 +3442 3 331.0942 351.3224 29.223 0.2415 3441 +3443 3 331.8161 350.7996 29.2172 0.2773 3442 +3444 3 332.6832 350.1601 28.5925 0.2279 3443 +3445 3 333.5103 349.4268 28.091 0.1652 3444 +3446 3 334.2116 348.5688 27.72 0.2152 3445 +3447 3 334.9003 347.7588 27.6786 0.283 3446 +3448 3 335.5432 346.902 27.7186 0.2272 3447 +3449 3 336.2628 346.3872 28.4866 0.3051 3448 +3450 3 337.011 345.8712 28.056 0.3432 3449 +3451 3 337.5624 345.2741 27.2275 0.1636 3450 +3452 3 338.3426 344.8016 26.5073 0.1194 3451 +3453 3 339.1983 344.8931 28.2192 0.2161 3452 +3454 3 339.9396 344.4401 27.7794 0.2288 3453 +3455 3 340.9086 344.3657 27.9644 0.2288 3454 +3456 3 341.7414 344.3486 28.1212 0.1825 3455 +3457 3 342.5994 344.1358 28.6051 0.3243 3456 +3458 3 343.4437 343.5329 28.6345 0.2217 3457 +3459 3 344.0488 343.2 28.4976 0.2465 3458 +3460 3 344.8565 342.7355 28.4343 0.2288 3459 +3461 3 345.7202 342.3271 28.3228 0.2407 3460 +3462 3 346.6766 341.9096 28.0468 0.2351 3461 +3463 3 346.6503 341.015 27.2863 0.217 3462 +3464 3 347.0416 340.0037 27.141 0.1415 3463 +3465 3 347.6902 339.2898 27.72 0.2476 3464 +3466 3 348.1684 338.6183 27.7253 0.2346 3465 +3467 3 348.7335 337.7294 27.6156 0.3036 3466 +3468 3 349.3902 337.1894 26.9461 0.1828 3467 +3469 3 350.0411 336.7719 28.0 0.2034 3468 +3470 3 351.0959 336.3852 27.7343 0.2493 3469 +3471 3 351.4368 335.8384 26.129 0.1145 3470 +3472 3 351.9928 335.2652 26.6 0.2288 3471 +3473 3 352.4367 334.4427 27.2292 0.2288 3472 +3474 3 352.5957 333.587 27.5131 0.1948 3473 +3475 3 353.1551 332.7965 27.9443 0.1271 3474 +3476 3 354.0165 332.1444 28.5541 0.1765 3475 +3477 3 354.5519 331.156 28.3772 0.1907 3476 +3478 3 355.3424 330.3792 28.6532 0.1843 3477 +3479 3 356.3102 330.1927 28.7787 0.1737 3478 +3480 3 357.4119 330.0978 29.342 0.1626 3479 +3481 3 358.4827 329.8095 29.1673 0.1526 3480 +3482 3 359.2354 329.1585 28.448 0.1755 3481 +3483 3 360.0523 328.4996 28.8271 0.1907 3482 +3484 3 360.9663 328.2525 28.6294 0.2162 3483 +3485 3 361.6287 327.6977 29.7223 0.2288 3484 +3486 3 362.2556 326.9952 29.2754 0.1483 3485 +3487 3 363.347 326.8122 29.3927 0.1144 3486 +3488 3 364.4715 326.6337 29.4 0.1144 3487 +3489 3 365.5949 326.4976 29.4 0.1144 3488 +3490 3 366.7275 326.4461 29.4622 0.1653 3489 +3491 3 367.8486 326.3306 29.0433 0.2346 3490 +3492 3 368.9446 326.2688 28.317 0.2288 3491 +3493 3 369.6802 325.9325 28.1002 0.1144 3492 +3494 3 370.5199 325.9062 29.0976 0.1631 3493 +3495 3 371.2555 326.4953 28.6373 0.2288 3494 +3496 3 372.1695 326.6257 29.0492 0.2115 3495 +3497 3 373.1797 326.8065 28.7468 0.1163 3496 +3498 3 374.279 326.9792 29.12 0.135 3497 +3499 3 375.1862 327.4082 28.2562 0.2131 3498 +3500 3 376.1724 327.7503 28.3825 0.1658 3499 +3501 3 376.9903 327.7182 28.0104 0.1822 3500 +3502 3 377.8335 327.4059 28.7106 0.2647 3501 +3503 3 378.664 326.9563 28.7249 0.2273 3502 +3504 3 379.6913 326.5514 28.2971 0.1318 3503 +3505 3 380.7083 326.2963 28.901 0.1481 3504 +3506 3 381.6601 325.865 29.1032 0.1676 3505 +3507 3 382.676 325.5778 28.28 0.2716 3506 +3508 3 383.6782 325.15 28.4581 0.1782 3507 +3509 3 384.7867 324.9578 28.0563 0.1144 3508 +3510 3 385.8906 324.6752 28.0 0.1144 3509 +3511 3 387.0072 324.451 28.0 0.1144 3510 +3512 3 388.1054 324.1398 28.0 0.1144 3511 +3513 3 389.1591 323.7005 27.9555 0.1265 3512 +3514 3 390.1292 323.5163 28.2047 0.1829 3513 +3515 3 391.1096 323.1159 28.6532 0.201 3514 +3516 3 392.0923 322.608 28.84 0.1493 3515 +3517 3 393.1722 322.6194 29.3171 0.1493 3516 +3518 3 394.2167 322.608 30.2089 0.1441 3517 +3519 3 395.2509 322.7224 29.9594 0.1272 3518 +3520 3 396.158 322.5039 30.3419 0.1591 3519 +3521 3 397.2586 322.608 29.96 0.1144 3520 +3522 3 398.1578 323.1789 29.6918 0.1144 3521 +3523 3 399.1233 323.5232 29.12 0.1144 3522 +3524 3 400.2673 323.5232 29.12 0.1144 3523 +3525 3 401.1951 323.9808 28.8417 0.1144 3524 +3526 3 401.8906 324.6741 28.6916 0.1144 3525 +3527 3 402.9832 324.7816 29.1292 0.1336 3526 +3528 3 404.0482 324.7816 29.9499 0.1652 3527 +3529 3 405.1087 324.8708 30.52 0.1151 3528 +3530 3 406.1646 324.4327 30.52 0.1622 3529 +3531 3 407.0295 323.7211 30.6186 0.2789 3530 +3532 3 407.4608 322.8608 31.08 0.1361 3531 +3533 3 407.9836 322.0246 31.08 0.1144 3532 +3534 3 408.9937 321.5864 30.7045 0.1144 3533 +3535 3 410.1309 321.5784 30.52 0.1144 3534 +3536 3 411.2405 321.6711 30.464 0.2066 3535 +3537 3 411.84 322.0806 30.3604 0.178 3536 +3538 3 412.6751 322.4936 30.4774 0.2913 3537 +3539 3 413.7745 322.5394 30.4746 0.304 3538 +3540 3 414.795 322.8425 30.0507 0.2482 3539 +3541 3 415.876 322.5588 29.68 0.2719 3540 +3542 3 416.5544 323.0393 28.5222 0.1959 3541 +3543 3 417.5474 322.9592 27.7612 0.3079 3542 +3544 3 418.267 322.6183 28.0319 0.1144 3543 +3545 3 419.1353 322.6286 27.2532 0.1941 3544 +3546 3 419.8057 323.22 27.6651 0.1652 3545 +3547 3 420.5367 323.6353 26.8402 0.3432 3546 +3548 3 421.4427 324.0918 27.0337 0.4014 3547 +3549 3 422.4449 323.9282 27.5979 0.3683 3548 +3550 3 423.455 323.8378 28.6516 0.3178 3549 +3551 3 424.424 323.4877 28.5051 0.3051 3550 +3552 3 425.1127 322.8608 27.9359 0.3116 3551 +3553 3 425.7979 322.4284 27.4254 0.3222 3552 +3554 3 426.7166 322.0337 27.6298 0.3972 3553 +3555 3 427.5231 322.2213 28.6698 0.3926 3554 +3556 3 428.2312 322.3849 29.5736 0.1254 3555 +3557 3 429.0092 321.6917 29.5806 0.2151 3556 +3558 3 429.4576 320.892 29.12 0.3051 3557 +3559 3 315.7131 364.7266 26.4046 0.3717 3417 +3560 3 315.9762 365.2712 24.6618 0.3089 3559 +3561 3 316.7393 365.8032 24.2222 0.2924 3560 +3562 3 317.7254 366.1544 24.4348 0.2619 3561 +3563 3 318.6303 365.6716 24.719 0.3421 3562 +3564 3 319.5913 365.8512 24.5347 0.2795 3563 +3565 3 319.9768 365.0058 23.9781 0.1185 3564 +3566 3 320.7147 364.3972 24.059 0.2767 3565 +3567 3 321.7111 364.6214 24.1024 0.1928 3566 +3568 3 322.5314 364.1592 23.52 0.3241 3567 +3569 3 323.6021 364.1146 23.5771 0.1878 3568 +3570 3 324.0506 363.5129 22.7035 0.2669 3569 +3571 3 324.0288 363.236 20.267 0.3432 3570 +3572 3 324.4453 362.2716 20.1659 0.355 3571 +3573 3 325.3387 361.8106 20.8544 0.1997 3572 +3574 3 326.0995 361.0395 21.0 0.2049 3573 +3575 3 326.1189 359.9665 20.4154 0.3065 3574 +3576 3 325.492 359.1863 20.0883 0.1682 3575 +3577 3 325.7014 358.628 19.2147 0.1636 3576 +3578 3 325.9256 357.8215 20.4336 0.2971 3577 +3579 3 325.9496 356.9314 19.4387 0.2669 3578 +3580 3 325.6339 356.5425 16.921 0.2669 3579 +3581 3 325.2575 355.8995 16.4909 0.3288 3580 +3582 3 324.7816 355.5197 15.745 0.3432 3581 +3583 3 324.8514 354.9832 14.5737 0.2288 3582 +3584 3 325.9062 355.0598 14.1168 0.3205 3583 +3585 3 326.6886 354.7029 15.057 0.1568 3584 +3586 3 327.1783 354.537 13.1452 0.198 3585 +3587 3 327.51 353.734 12.0532 0.178 3586 +3588 3 327.9608 352.8405 12.6 0.2601 3587 +3589 3 328.8908 353.2569 12.731 0.188 3588 +3590 3 329.5418 353.6356 13.7203 0.2987 3589 +3591 3 330.457 353.8014 14.5656 0.2418 3590 +3592 3 331.3356 353.5681 13.5542 0.2161 3591 +3593 3 331.6239 354.1366 12.2844 0.2034 3592 +3594 3 332.3995 354.5164 12.087 0.2011 3593 +3595 3 333.5218 354.6503 12.04 0.1314 3594 +3596 3 334.1693 355.4957 11.7888 0.1144 3595 +3597 3 334.7344 355.5632 12.9968 0.3216 3596 +3598 3 335.5352 355.212 13.44 0.2542 3597 +3599 3 301.5344 375.9367 23.3178 0.2033 1 +3600 3 301.1157 375.0272 21.966 0.1935 3599 +3601 3 300.5563 374.2321 22.4974 0.2398 3600 +3602 3 299.8756 373.6796 23.6998 0.1444 3601 +3603 3 298.87 373.6682 23.7132 0.167 3602 +3604 3 297.7626 373.5286 23.3369 0.2288 3603 +3605 3 296.7914 373.3055 22.68 0.1289 3604 +3606 3 296.0008 373.3776 24.0027 0.1762 3605 +3607 3 295.1772 373.0126 24.92 0.2138 3606 +3608 3 294.7665 372.8468 22.7923 0.1303 3607 +3609 3 293.8936 372.9028 22.9284 0.1813 3608 +3610 3 293.4177 372.515 24.3314 0.3422 3609 +3611 3 292.3744 372.1432 24.1287 0.2909 3610 +3612 3 291.3288 371.967 23.9428 0.1969 3611 +3613 3 290.4776 371.6581 22.6307 0.2609 3612 +3614 3 290.0864 371.7371 24.2155 0.2004 3613 +3615 3 289.3073 371.5941 25.2608 0.1628 3614 +3616 3 288.5168 371.4065 25.1384 0.1481 3615 +3617 3 287.8853 370.9866 23.9887 0.3051 3616 +3618 3 286.9999 370.5302 24.2298 0.2929 3617 +3619 3 285.9199 370.3872 24.362 0.2661 3618 +3620 3 285.293 369.5726 24.92 0.1543 3619 +3621 3 284.435 369.2832 24.2001 0.178 3620 +3622 3 283.6582 368.7146 22.902 0.1144 3621 +3623 3 283.3494 368.2536 21.7669 0.1144 3622 +3624 3 283.0256 367.8303 21.9876 0.2088 3623 +3625 3 282.2843 367.6953 23.4424 0.1961 3624 +3626 3 281.6425 367.264 21.9478 0.2569 3625 +3627 3 280.9618 367.1782 20.4596 0.1766 3626 +3628 3 280.2217 366.5376 21.0484 0.178 3627 +3629 3 279.3099 366.1647 21.9526 0.3272 3628 +3630 3 278.516 365.5995 21.5424 0.2307 3629 +3631 3 277.666 365.2826 22.0234 0.4256 3630 +3632 3 276.7645 364.8296 21.5838 0.1968 3631 +3633 3 275.9591 364.0288 21.2383 0.2074 3632 +3634 3 275.1549 363.228 20.893 0.2182 3633 +3635 3 274.3495 362.4272 20.5475 0.2288 3634 +3636 3 274.0086 362.2007 20.417 0.1834 3635 +3637 3 273.1517 361.5669 19.4051 0.178 3636 +3638 3 272.7342 360.5991 18.3408 0.1654 3637 +3639 3 272.1324 359.7468 17.1959 0.178 3638 +3640 3 271.9803 359.1645 16.1445 0.1508 3639 +3641 3 272.3715 358.199 15.171 0.1822 3640 +3642 3 272.1542 357.2151 14.5897 0.2049 3641 +3643 3 271.4209 356.3869 14.5961 0.2288 3642 +3644 3 270.9816 355.5369 13.6086 0.2401 3643 +3645 3 271.0216 354.457 12.964 0.2413 3644 +3646 3 270.4885 353.631 13.2376 0.2288 3645 +3647 3 269.4875 353.3221 14.1644 0.2142 3646 +3648 3 268.451 353.0178 14.4956 0.2111 3647 +3649 3 267.5164 352.4756 13.7063 0.2081 3648 +3650 3 267.0748 351.5409 13.4476 0.2202 3649 +3651 3 267.0119 350.4152 13.8457 0.2375 3650 +3652 3 267.0279 349.2769 13.9997 0.2502 3651 +3653 3 267.1389 348.1398 13.9989 0.2455 3652 +3654 3 267.4718 347.053 13.9941 0.2328 3653 +3655 3 267.5484 345.9353 13.9616 0.238 3654 +3656 3 266.9959 344.9881 13.7052 0.2511 3655 +3657 3 266.0601 344.36 13.6181 0.2746 3656 +3658 3 265.1414 343.6828 13.704 0.2796 3657 +3659 3 264.3864 342.9575 12.7128 0.2583 3658 +3660 3 263.6783 342.1121 12.0123 0.1991 3659 +3661 3 262.7047 341.6579 12.7042 0.1435 3660 +3662 3 261.8227 342.2528 13.4966 0.1274 3661 +3663 3 261.5184 343.3144 12.88 0.1525 3662 +3664 3 270.9919 360.2204 17.9925 0.1387 3639 +3665 3 269.8719 360.249 17.6128 0.1518 3664 +3666 3 268.8034 360.265 16.6219 0.1403 3665 +3667 3 267.8047 360.5842 15.6657 0.1252 3666 +3668 3 267.0828 361.2409 14.6471 0.1144 3667 +3669 3 266.1184 361.5806 15.5982 0.1144 3668 +3670 3 265.2227 361.3873 16.9036 0.1144 3669 +3671 3 264.701 360.6552 16.0037 0.1144 3670 +3672 3 264.4665 359.8097 14.2313 0.1144 3671 +3673 3 264.0878 358.8945 14.0526 0.1217 3672 +3674 3 263.6817 358.2722 15.9303 0.1351 3673 +3675 3 263.3225 358.6898 17.901 0.1484 3674 +3676 3 262.7116 359.3887 19.4491 0.1433 3675 +3677 3 262.0195 360.2342 19.9346 0.1297 3676 +3678 3 261.3628 361.17 20.0416 0.1163 3677 +3679 3 261.0608 360.7032 21.84 0.1271 3678 +3680 3 274.2042 361.7683 21.7151 0.2669 3635 +3681 3 273.7958 360.7021 21.8392 0.2477 3680 +3682 3 273.2158 359.7365 21.835 0.2064 3681 +3683 3 272.3338 359.0341 21.8131 0.1907 3682 +3684 3 271.3351 358.4838 21.6882 0.2009 3683 +3685 3 270.3844 357.8878 21.212 0.2265 3684 +3686 3 269.4475 357.2838 20.7281 0.2415 3685 +3687 3 268.5483 356.5814 20.6886 0.2469 3686 +3688 3 267.8047 355.7337 20.4834 0.2542 3687 +3689 3 267.1949 354.7761 20.1608 0.26 3688 +3690 3 266.4765 353.8998 20.1967 0.2669 3689 +3691 3 265.6414 353.218 19.7008 0.2669 3690 +3692 3 265.1323 352.3417 19.2217 0.2669 3691 +3693 3 264.6838 351.3132 19.4253 0.2592 3692 +3694 3 263.8693 350.5525 19.3225 0.2306 3693 +3695 3 263.0525 349.937 18.2426 0.1836 3694 +3696 3 262.4061 349.2392 16.7065 0.1403 3695 +3697 3 261.5115 348.8525 15.5254 0.1271 3696 +3698 3 260.7073 348.793 16.9098 0.1469 3697 +3699 3 260.0987 348.729 19.2685 0.1931 3698 +3700 3 259.2064 348.3594 20.5587 0.2461 3699 +3701 3 258.1608 347.9247 20.6758 0.2758 3700 +3702 3 257.1346 347.4362 20.396 0.2577 3701 +3703 3 256.2102 346.815 19.7862 0.1985 3702 +3704 3 255.1429 346.4936 20.1709 0.1443 3703 +3705 3 254.2151 346.0783 19.0078 0.1153 3704 +3706 3 253.6122 346.2739 19.6 0.1899 3705 +3707 3 252.8103 346.1824 20.5422 0.1144 3706 +3708 3 251.7692 346.2591 19.88 0.1345 3707 +3709 3 250.7934 345.9959 19.9576 0.1239 3708 +3710 3 250.242 345.4045 21.0 0.2288 3709 +3711 3 249.5258 344.7055 20.2765 0.1935 3710 +3712 3 248.6907 344.2788 21.0423 0.159 3711 +3713 3 247.9037 344.0477 20.0236 0.2161 3712 +3714 3 247.2378 343.4688 19.6 0.178 3713 +3715 3 246.3959 342.8568 20.1303 0.2159 3714 +3716 3 245.2725 342.9197 20.4089 0.1182 3715 +3717 3 244.2188 342.9586 20.3468 0.1652 3716 +3718 3 244.1296 342.4964 20.519 0.1144 3717 +3719 3 244.5872 341.7128 19.32 0.1398 3718 +3720 3 244.1651 343.1943 20.1984 0.1719 3717 +3721 3 243.4123 343.8795 19.88 0.1215 3720 +3722 3 242.2683 343.8864 19.88 0.1144 3721 +3723 3 241.1243 343.8864 19.88 0.1144 3722 +3724 3 240.0375 343.8864 20.5313 0.1191 3723 +3725 3 239.0994 343.4002 20.9782 0.224 3724 +3726 3 238.4885 343.0856 20.9353 0.1674 3725 +3727 3 237.4303 342.9735 20.72 0.1163 3726 +3728 3 236.3596 343.0993 21.28 0.1541 3727 +3729 3 235.6022 342.5685 21.84 0.2862 3728 +3730 3 234.6333 342.342 21.4194 0.1462 3729 +3731 3 233.686 342.4621 21.6006 0.1891 3730 +3732 3 232.8909 342.8339 22.6789 0.1666 3731 +3733 3 232.2709 343.0192 21.1238 0.1185 3732 +3734 3 231.2196 343.0398 21.8156 0.1271 3733 +3735 3 230.2529 342.5571 22.4 0.2012 3734 +3736 3 229.2073 342.3878 21.7767 0.2171 3735 +3737 3 228.7085 341.5252 20.8393 0.167 3736 +3738 3 227.8745 340.7953 20.7152 0.1144 3737 +3739 3 226.7934 340.475 20.44 0.1144 3738 +3740 3 225.7467 340.0151 20.44 0.1372 3739 +3741 3 224.8543 339.3276 20.0712 0.1652 3740 +3742 3 224.1908 338.5554 20.6422 0.1306 3741 +3743 3 223.2996 337.917 20.44 0.1144 3742 +3744 3 222.5663 337.1368 20.16 0.1317 3743 +3745 3 221.7026 336.4161 20.3157 0.1652 3744 +3746 3 220.6787 336.1312 20.7642 0.1497 3745 +3747 3 219.656 335.9814 21.8025 0.1257 3746 +3748 3 218.9044 335.8441 20.5265 0.1925 3747 +3749 3 217.8382 335.6496 20.9936 0.2805 3748 +3750 3 217.0877 335.5421 19.462 0.3127 3749 +3751 3 216.6713 334.9117 20.1984 0.2539 3750 +3752 3 216.4654 334.0549 19.6381 0.2232 3751 +3753 3 216.0776 334.3489 18.5623 0.2557 3752 +3754 3 215.1578 334.0469 18.0796 0.3205 3753 +3755 3 214.5366 333.182 17.6159 0.1936 3754 +3756 3 213.7701 332.7541 16.3534 0.2366 3755 +3757 3 212.9442 332.1696 17.0458 0.2865 3756 +3758 3 211.8951 332.2416 17.36 0.3432 3757 +3759 3 211.8596 333.2186 17.0727 0.3432 3758 +3760 3 211.3723 333.9325 16.1269 0.2819 3759 +3761 3 211.0508 333.333 15.5893 0.3432 3760 +3762 3 210.0784 332.9749 15.1718 0.3009 3761 +3763 3 209.0077 332.8434 14.6695 0.2384 3762 +3764 3 207.9712 332.5928 15.12 0.4115 3763 +3765 3 206.9084 332.2256 14.7008 0.302 3764 +3766 3 205.9177 331.7657 14.6818 0.2727 3765 +3767 3 204.9453 332.157 14.6793 0.2608 3766 +3768 3 204.3607 332.6935 13.1911 0.3037 3767 +3769 3 203.4043 332.7175 12.3166 0.3312 3768 +3770 3 202.5727 332.904 12.0851 0.1533 3769 +3771 3 201.5362 332.8411 12.7812 0.2616 3770 +3772 3 200.6748 332.5608 13.1897 0.1541 3771 +3773 3 199.7824 332.801 14.1159 0.142 3772 +3774 3 198.7483 333.0424 13.8667 0.3057 3773 +3775 3 198.5481 333.484 12.868 0.3686 3774 +3776 3 198.1717 333.7345 11.3226 0.3026 3775 +3777 3 197.7427 334.5102 12.3385 0.2186 3776 +3778 3 196.7028 334.8694 12.9396 0.2089 3777 +3779 3 195.7636 334.8191 12.9847 0.1992 3778 +3780 3 195.5027 334.8431 11.3277 0.1794 3779 +3781 3 194.8655 334.2619 10.9175 0.1261 3780 +3782 3 194.1711 333.5263 11.3341 0.2603 3781 +3783 3 194.1368 332.904 12.04 0.1144 3782 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/hoc_templates/BioAllen_old.hoc b/bmtk-vb/docs/tutorial/sources/chapter01/components/hoc_templates/BioAllen_old.hoc new file mode 100644 index 0000000..fde930d --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/hoc_templates/BioAllen_old.hoc @@ -0,0 +1,21 @@ +begintemplate BioAllenOld + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal +objref all, somatic, basal, apical, axonal + +objref this + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() +} + +create soma[1], dend[1], apic[1], axon[1] + +endtemplate BioAllenOld diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/hoc_templates/BioAxonStub.hoc b/bmtk-vb/docs/tutorial/sources/chapter01/components/hoc_templates/BioAxonStub.hoc new file mode 100644 index 0000000..df8660d --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/hoc_templates/BioAxonStub.hoc @@ -0,0 +1,61 @@ +begintemplate BioAxonStub + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + + simplify_axon() +} + +proc simplify_axon() { + + forsec axonal { delete_section() } + create axon[2] + + axon[0] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + axon[1] { + L = 30 + diam = 1 + nseg = 1+2*int(L/40) + all.append() + axonal.append() + } + connect axon(0), soma(0.5) + connect axon[1](0), axon[0](1) + define_shape() + + +} + +endtemplate BioAxonStub \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/hoc_templates/Biophys1.hoc b/bmtk-vb/docs/tutorial/sources/chapter01/components/hoc_templates/Biophys1.hoc new file mode 100644 index 0000000..bac9b0f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/hoc_templates/Biophys1.hoc @@ -0,0 +1,34 @@ +begintemplate Biophys1 + +public init +public soma, dend, apic, axon +public all, somatic, basal, apical, axonal + +objref all, somatic, basal, apical, axonal +objref this + +create soma[1] +create dend[1] +create apic[1] +create axon[1] + + +proc init() {localobj nl, import + all = new SectionList() + somatic = new SectionList() + basal = new SectionList() + apical = new SectionList() + axonal = new SectionList() + forall delete_section() + +// nl = new Import3d_Neurolucida3() + nl = new Import3d_SWC_read() + nl.quiet = 1 + nl.input($s1) + import = new Import3d_GUI(nl, 0) +// import.quite = 1 + import.instantiate(this) + +} + +endtemplate Biophys1 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/intfire/IntFire1_exc_1.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/intfire/IntFire1_exc_1.json new file mode 100644 index 0000000..6a58d3b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/intfire/IntFire1_exc_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.024, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/intfire/IntFire1_inh_1.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/intfire/IntFire1_inh_1.json new file mode 100644 index 0000000..0da2f1f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/intfire/IntFire1_inh_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.007, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/CaDynamics.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/CaDynamics.mod new file mode 100644 index 0000000..12af065 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/CaDynamics.mod @@ -0,0 +1,40 @@ +: Dynamics that track inside calcium concentration +: modified from Destexhe et al. 1994 + +NEURON { + SUFFIX CaDynamics + USEION ca READ ica WRITE cai + RANGE decay, gamma, minCai, depth +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + FARADAY = (faraday) (coulombs) + (molar) = (1/liter) + (mM) = (millimolar) + (um) = (micron) +} + +PARAMETER { + gamma = 0.05 : percent of free calcium (not buffered) + decay = 80 (ms) : rate of removal of calcium + depth = 0.1 (um) : depth of shell + minCai = 1e-4 (mM) +} + +ASSIGNED {ica (mA/cm2)} + +INITIAL { + cai = minCai +} + +STATE { + cai (mM) +} + +BREAKPOINT { SOLVE states METHOD cnexp } + +DERIVATIVE states { + cai' = -(10000)*(ica*gamma/(2*FARADAY*depth)) - (cai - minCai)/decay +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Ca_HVA.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Ca_HVA.mod new file mode 100644 index 0000000..84db2d3 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Ca_HVA.mod @@ -0,0 +1,82 @@ +: Reference: Reuveni, Friedman, Amitai, and Gutnick, J.Neurosci. 1993 + +NEURON { + SUFFIX Ca_HVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + UNITSOFF + : if((v == -27) ){ + : v = v+0.0001 + : } + :mAlpha = (0.055*(-27-v))/(exp((-27-v)/3.8) - 1) + mAlpha = 0.055 * vtrap(-27 - v, 3.8) + mBeta = (0.94*exp((-75-v)/17)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + hAlpha = (0.000457*exp((-13-v)/50)) + hBeta = (0.0065/(exp((-v-15)/28)+1)) + hInf = hAlpha/(hAlpha + hBeta) + hTau = 1/(hAlpha + hBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Ca_LVA.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Ca_LVA.mod new file mode 100644 index 0000000..ab151d0 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Ca_LVA.mod @@ -0,0 +1,69 @@ +: Comment: LVA ca channel. Note: mtau is an approximation from the plots +: Reference: Avery and Johnston 1996, tau from Randall 1997 +: Comment: shifted by -10 mv to correct for junction potential +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Ca_LVA + USEION ca READ eca WRITE ica + RANGE gbar, g, ica +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + eca (mV) + ica (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ica = g*(v-eca) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + v = v + 10 + mInf = 1.0000/(1+ exp((v - -30.000)/-6)) + mTau = (5.0000 + 20.0000/(1+exp((v - -25.000)/5)))/qt + hInf = 1.0000/(1+ exp((v - -80.000)/6.4)) + hTau = (20.0000 + 50.0000/(1+exp((v - -40.000)/7)))/qt + v = v - 10 + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Ih.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Ih.mod new file mode 100644 index 0000000..73b97d8 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Ih.mod @@ -0,0 +1,71 @@ +: Reference: Kole,Hallermann,and Stuart, J. Neurosci. 2006 + +NEURON { + SUFFIX Ih + NONSPECIFIC_CURRENT ihcn + RANGE gbar, g, ihcn +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + ehcn = -45.0 (mV) +} + +ASSIGNED { + v (mV) + ihcn (mA/cm2) + g (S/cm2) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ihcn = g*(v-ehcn) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + : if(v == -154.9){ + : v = v + 0.0001 + : } + :mAlpha = 0.001*6.43*(v+154.9)/(exp((v+154.9)/11.9)-1) + mAlpha = 0.001 * 6.43 * vtrap(v + 154.9, 11.9) + mBeta = 0.001*193*exp(v/33.1) + mInf = mAlpha/(mAlpha + mBeta) + mTau = 1/(mAlpha + mBeta) + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Im.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Im.mod new file mode 100644 index 0000000..d6112d5 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Im.mod @@ -0,0 +1,62 @@ +: Reference: Adams et al. 1982 - M-currents and other potassium currents in bullfrog sympathetic neurones +: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Im + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mAlpha = 3.3e-3*exp(2.5*0.04*(v - -35)) + mBeta = 3.3e-3*exp(-2.5*0.04*(v - -35)) + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Im_v2.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Im_v2.mod new file mode 100644 index 0000000..fc219f7 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Im_v2.mod @@ -0,0 +1,59 @@ +: Based on Im model of Vervaeke et al. (2006) + +NEURON { + SUFFIX Im_v2 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-30)/10) + mAlpha = 0.007 * exp( (6 * 0.4 * (v - (-48))) / 26.12 ) + mBeta = 0.007 * exp( (-6 * (1 - 0.4) * (v - (-48))) / 26.12 ) + + mInf = mAlpha / (mAlpha + mBeta) + mTau = (15 + 1 / (mAlpha + mBeta)) / qt +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/K_P.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/K_P.mod new file mode 100644 index 0000000..0a1238f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/K_P.mod @@ -0,0 +1,71 @@ +: Comment: The persistent component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + + +NEURON { + SUFFIX K_P + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + tauF = 1 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mInf = 1 / (1 + exp(-(v - (-14.3 + vshift)) / 14.6)) + if (v < -50 + vshift){ + mTau = tauF * (1.25+175.03*exp(-(v - vshift) * -0.026))/qt + } else { + mTau = tauF * (1.25+13*exp(-(v - vshift) * 0.026))/qt + } + hInf = 1/(1 + exp(-(v - (-54 + vshift))/-11)) + hTau = (360+(1010+24*(v - (-55 + vshift)))*exp(-((v - (-75 + vshift))/48)^2))/qt + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/K_T.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/K_T.mod new file mode 100644 index 0000000..c31beaf --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/K_T.mod @@ -0,0 +1,68 @@ +: Comment: The transient component of the K current +: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 + +NEURON { + SUFFIX K_T + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) + mTauF = 1.0 + hTauF = 1.0 +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*m*h + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1/(1 + exp(-(v - (-47 + vshift)) / 29)) + mTau = (0.34 + mTauF * 0.92*exp(-((v+71-vshift)/59)^2))/qt + hInf = 1/(1 + exp(-(v+66-vshift)/-10)) + hTau = (8 + hTauF * 49*exp(-((v+73-vshift)/23)^2))/qt + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Kd.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Kd.mod new file mode 100644 index 0000000..82cbe59 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Kd.mod @@ -0,0 +1,62 @@ +: Based on Kd model of Foust et al. (2011) + + +NEURON { + SUFFIX Kd + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + hInf + hTau +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * h + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h' = (hInf - h) / hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-23)/10) + mInf = 1 - 1 / (1 + exp((v - (-43)) / 8)) + mTau = 1 + hInf = 1 / (1 + exp((v - (-67)) / 7.3)) + hTau = 1500 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Kv2like.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Kv2like.mod new file mode 100644 index 0000000..1cbdf84 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Kv2like.mod @@ -0,0 +1,86 @@ +: Kv2-like channel +: Adapted from model implemented in Keren et al. 2005 +: Adjusted parameters to be similar to guangxitoxin-sensitive current in mouse CA1 pyramids from Liu and Bean 2014 + + +NEURON { + SUFFIX Kv2like + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mAlpha + mBeta + mTau + hInf + h1Tau + h2Tau +} + +STATE { + m + h1 + h2 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * m * m * (0.5 * h1 + 0.5 * h2) + ik = g * (v - ek) +} + +DERIVATIVE states { + rates() + m' = (mInf - m) / mTau + h1' = (hInf - h1) / h1Tau + h2' = (hInf - h2) / h2Tau +} + +INITIAL{ + rates() + m = mInf + h1 = hInf + h2 = hInf +} + +PROCEDURE rates() { + LOCAL qt + qt = 2.3^((celsius-21)/10) + UNITSOFF + mAlpha = 0.12 * vtrap( -(v - 43), 11.0) + mBeta = 0.02 * exp(-(v + 1.27) / 120) + mInf = mAlpha / (mAlpha + mBeta) + mTau = 2.5 * (1 / (qt * (mAlpha + mBeta))) + + hInf = 1/(1 + exp((v + 58) / 11)) + h1Tau = (360 + (1010 + 23.7 * (v + 54)) * exp(-((v + 75) / 48)^2)) / qt + h2Tau = (2350 + 1380 * exp(-0.011 * v) - 210 * exp(-0.03 * v)) / qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Kv3_1.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Kv3_1.mod new file mode 100644 index 0000000..e244657 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Kv3_1.mod @@ -0,0 +1,54 @@ +: Comment: Kv3-like potassium current + +NEURON { + SUFFIX Kv3_1 + USEION k READ ek WRITE ik + RANGE gbar, g, ik +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + vshift = 0 (mV) +} + +ASSIGNED { + v (mV) + ek (mV) + ik (mA/cm2) + g (S/cm2) + mInf + mTau +} + +STATE { + m +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m + ik = g*(v-ek) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau +} + +INITIAL{ + rates() + m = mInf +} + +PROCEDURE rates(){ + UNITSOFF + mInf = 1/(1+exp(((v -(18.700 + vshift))/(-9.700)))) + mTau = 0.2*20.000/(1+exp(((v -(-46.560 + vshift))/(-44.140)))) + UNITSON +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/NaTa.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/NaTa.mod new file mode 100644 index 0000000..fcf7bd3 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/NaTa.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTa + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -48 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -69 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) : ng - adjusted this to match actual Colbert & Pan values for soma model + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/NaTs.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/NaTs.mod new file mode 100644 index 0000000..f753e71 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/NaTs.mod @@ -0,0 +1,95 @@ +: Reference: Colbert and Pan 2002 + +NEURON { + SUFFIX NaTs + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) + + malphaF = 0.182 + mbetaF = 0.124 + mvhalf = -40 (mV) + mk = 6 (mV) + + halphaF = 0.015 + hbetaF = 0.015 + hvhalf = -66 (mV) + hk = 6 (mV) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + mTau + mAlpha + mBeta + hInf + hTau + hAlpha + hBeta +} + +STATE { + m + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar*m*m*m*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + m' = (mInf-m)/mTau + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + m = mInf + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-23)/10) + + UNITSOFF + mAlpha = malphaF * vtrap(-(v - mvhalf), mk) + mBeta = mbetaF * vtrap((v - mvhalf), mk) + + mInf = mAlpha/(mAlpha + mBeta) + mTau = (1/(mAlpha + mBeta))/qt + + hAlpha = halphaF * vtrap(v - hvhalf, hk) + hBeta = hbetaF * vtrap(-(v - hvhalf), hk) + + hInf = hAlpha/(hAlpha + hBeta) + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/NaV.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/NaV.mod new file mode 100644 index 0000000..a702395 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/NaV.mod @@ -0,0 +1,186 @@ +TITLE Mouse sodium current +: Kinetics of Carter et al. (2012) +: Based on 37 degC recordings from mouse hippocampal CA1 pyramids + +NEURON { + SUFFIX NaV + USEION na READ ena WRITE ina + RANGE g, gbar +} + +UNITS { + (mV) = (millivolt) + (S) = (siemens) +} + +PARAMETER { + gbar = .015 (S/cm2) + + : kinetic parameters + Con = 0.01 (/ms) : closed -> inactivated transitions + Coff = 40 (/ms) : inactivated -> closed transitions + Oon = 8 (/ms) : open -> Ineg transition + Ooff = 0.05 (/ms) : Ineg -> open transition + alpha = 400 (/ms) + beta = 12 (/ms) + gamma = 250 (/ms) : opening + delta = 60 (/ms) : closing + + alfac = 2.51 + btfac = 5.32 + + : Vdep + x1 = 24 (mV) : Vdep of activation (alpha) + x2 = -24 (mV) : Vdep of deactivation (beta) +} + +ASSIGNED { + + : rates + f01 (/ms) + f02 (/ms) + f03 (/ms) + f04 (/ms) + f0O (/ms) + f11 (/ms) + f12 (/ms) + f13 (/ms) + f14 (/ms) + f1n (/ms) + fi1 (/ms) + fi2 (/ms) + fi3 (/ms) + fi4 (/ms) + fi5 (/ms) + fin (/ms) + + b01 (/ms) + b02 (/ms) + b03 (/ms) + b04 (/ms) + b0O (/ms) + b11 (/ms) + b12 (/ms) + b13 (/ms) + b14 (/ms) + b1n (/ms) + bi1 (/ms) + bi2 (/ms) + bi3 (/ms) + bi4 (/ms) + bi5 (/ms) + bin (/ms) + + v (mV) + ena (mV) + ina (milliamp/cm2) + g (S/cm2) + celsius (degC) +} + +STATE { + C1 FROM 0 TO 1 + C2 FROM 0 TO 1 + C3 FROM 0 TO 1 + C4 FROM 0 TO 1 + C5 FROM 0 TO 1 + I1 FROM 0 TO 1 + I2 FROM 0 TO 1 + I3 FROM 0 TO 1 + I4 FROM 0 TO 1 + I5 FROM 0 TO 1 + O FROM 0 TO 1 + I6 FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE activation METHOD sparse + g = gbar * O + ina = g * (v - ena) +} + +INITIAL { + rates(v) + SOLVE seqinitial +} + +KINETIC activation +{ + rates(v) + ~ C1 <-> C2 (f01,b01) + ~ C2 <-> C3 (f02,b02) + ~ C3 <-> C4 (f03,b03) + ~ C4 <-> C5 (f04,b04) + ~ C5 <-> O (f0O,b0O) + ~ O <-> I6 (fin,bin) + ~ I1 <-> I2 (f11,b11) + ~ I2 <-> I3 (f12,b12) + ~ I3 <-> I4 (f13,b13) + ~ I4 <-> I5 (f14,b14) + ~ I5 <-> I6 (f1n,b1n) + ~ C1 <-> I1 (fi1,bi1) + ~ C2 <-> I2 (fi2,bi2) + ~ C3 <-> I3 (fi3,bi3) + ~ C4 <-> I4 (fi4,bi4) + ~ C5 <-> I5 (fi5,bi5) + + CONSERVE C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +LINEAR seqinitial { : sets initial equilibrium + ~ I1*bi1 + C2*b01 - C1*( fi1+f01) = 0 + ~ C1*f01 + I2*bi2 + C3*b02 - C2*(b01+fi2+f02) = 0 + ~ C2*f02 + I3*bi3 + C4*b03 - C3*(b02+fi3+f03) = 0 + ~ C3*f03 + I4*bi4 + C5*b04 - C4*(b03+fi4+f04) = 0 + ~ C4*f04 + I5*bi5 + O*b0O - C5*(b04+fi5+f0O) = 0 + ~ C5*f0O + I6*bin - O*(b0O+fin) = 0 + + ~ C1*fi1 + I2*b11 - I1*( bi1+f11) = 0 + ~ I1*f11 + C2*fi2 + I3*b12 - I2*(b11+bi2+f12) = 0 + ~ I2*f12 + C3*fi3 + I4*bi3 - I3*(b12+bi3+f13) = 0 + ~ I3*f13 + C4*fi4 + I5*b14 - I4*(b13+bi4+f14) = 0 + ~ I4*f14 + C5*fi5 + I6*b1n - I5*(b14+bi5+f1n) = 0 + + ~ C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 +} + +PROCEDURE rates(v(mV) ) +{ + LOCAL qt + qt = 2.3^((celsius-37)/10) + + f01 = qt * 4 * alpha * exp(v/x1) + f02 = qt * 3 * alpha * exp(v/x1) + f03 = qt * 2 * alpha * exp(v/x1) + f04 = qt * 1 * alpha * exp(v/x1) + f0O = qt * gamma + f11 = qt * 4 * alpha * alfac * exp(v/x1) + f12 = qt * 3 * alpha * alfac * exp(v/x1) + f13 = qt * 2 * alpha * alfac * exp(v/x1) + f14 = qt * 1 * alpha * alfac * exp(v/x1) + f1n = qt * gamma + fi1 = qt * Con + fi2 = qt * Con * alfac + fi3 = qt * Con * alfac^2 + fi4 = qt * Con * alfac^3 + fi5 = qt * Con * alfac^4 + fin = qt * Oon + + b01 = qt * 1 * beta * exp(v/x2) + b02 = qt * 2 * beta * exp(v/x2) + b03 = qt * 3 * beta * exp(v/x2) + b04 = qt * 4 * beta * exp(v/x2) + b0O = qt * delta + b11 = qt * 1 * beta * exp(v/x2) / btfac + b12 = qt * 2 * beta * exp(v/x2) / btfac + b13 = qt * 3 * beta * exp(v/x2) / btfac + b14 = qt * 4 * beta * exp(v/x2) / btfac + b1n = qt * delta + bi1 = qt * Coff + bi2 = qt * Coff / (btfac) + bi3 = qt * Coff / (btfac^2) + bi4 = qt * Coff / (btfac^3) + bi5 = qt * Coff / (btfac^4) + bin = qt * Ooff +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Nap.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Nap.mod new file mode 100644 index 0000000..ef8021e --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/Nap.mod @@ -0,0 +1,77 @@ +:Reference : Modeled according to kinetics derived from Magistretti & Alonso 1999 +:Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 + +NEURON { + SUFFIX Nap + USEION na READ ena WRITE ina + RANGE gbar, g, ina +} + +UNITS { + (S) = (siemens) + (mV) = (millivolt) + (mA) = (milliamp) +} + +PARAMETER { + gbar = 0.00001 (S/cm2) +} + +ASSIGNED { + v (mV) + ena (mV) + ina (mA/cm2) + g (S/cm2) + celsius (degC) + mInf + hInf + hTau + hAlpha + hBeta +} + +STATE { + h +} + +BREAKPOINT { + SOLVE states METHOD cnexp + rates() + g = gbar*mInf*h + ina = g*(v-ena) +} + +DERIVATIVE states { + rates() + h' = (hInf-h)/hTau +} + +INITIAL{ + rates() + h = hInf +} + +PROCEDURE rates(){ + LOCAL qt + qt = 2.3^((celsius-21)/10) + + UNITSOFF + mInf = 1.0/(1+exp((v- -52.6)/-4.6)) : assuming instantaneous activation as modeled by Magistretti and Alonso + + hInf = 1.0/(1+exp((v- -48.8)/10)) + hAlpha = 2.88e-6 * vtrap(v + 17, 4.63) + hBeta = 6.94e-6 * vtrap(-(v + 64.4), 2.63) + + hTau = (1/(hAlpha + hBeta))/qt + UNITSON +} + +FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations + UNITSOFF + if (fabs(x / y) < 1e-6) { + vtrap = y * (1 - x / y / 2) + } else { + vtrap = x / (exp(x / y) - 1) + } + UNITSON +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/SK.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/SK.mod new file mode 100644 index 0000000..8bfa3b7 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/SK.mod @@ -0,0 +1,56 @@ +: SK-type calcium-activated potassium current +: Reference : Kohler et al. 1996 + +NEURON { + SUFFIX SK + USEION k READ ek WRITE ik + USEION ca READ cai + RANGE gbar, g, ik +} + +UNITS { + (mV) = (millivolt) + (mA) = (milliamp) + (mM) = (milli/liter) +} + +PARAMETER { + v (mV) + gbar = .000001 (mho/cm2) + zTau = 1 (ms) + ek (mV) + cai (mM) +} + +ASSIGNED { + zInf + ik (mA/cm2) + g (S/cm2) +} + +STATE { + z FROM 0 TO 1 +} + +BREAKPOINT { + SOLVE states METHOD cnexp + g = gbar * z + ik = g * (v - ek) +} + +DERIVATIVE states { + rates(cai) + z' = (zInf - z) / zTau +} + +PROCEDURE rates(ca(mM)) { + if(ca < 1e-7){ + ca = ca + 1e-07 + } + zInf = 1/(1 + (0.00043 / ca)^4.8) +} + +INITIAL { + rates(cai) + z = zInf +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/vecevent.mod b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/vecevent.mod new file mode 100644 index 0000000..503dfd2 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/mechanisms/modfiles/vecevent.mod @@ -0,0 +1,71 @@ +: Vector stream of events + +NEURON { + ARTIFICIAL_CELL VecStim +} + +ASSIGNED { + index + etime (ms) + space +} + +INITIAL { + index = 0 + element() + if (index > 0) { + net_send(etime - t, 1) + } +} + +NET_RECEIVE (w) { + if (flag == 1) { + net_event(t) + element() + if (index > 0) { + net_send(etime - t, 1) + } + } +} + +VERBATIM +extern double* vector_vec(); +extern int vector_capacity(); +extern void* vector_arg(); +ENDVERBATIM + +PROCEDURE element() { +VERBATIM + { void* vv; int i, size; double* px; + i = (int)index; + if (i >= 0) { + vv = *((void**)(&space)); + if (vv) { + size = vector_capacity(vv); + px = vector_vec(vv); + if (i < size) { + etime = px[i]; + index += 1.; + }else{ + index = -1.; + } + }else{ + index = -1.; + } + } + } +ENDVERBATIM +} + +PROCEDURE play() { +VERBATIM + void** vv; + vv = (void**)(&space); + *vv = (void*)0; + if (ifarg(1)) { + *vv = vector_arg(1); + } +ENDVERBATIM +} + + diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/recXelectrodes/linear_electrode.csv b/bmtk-vb/docs/tutorial/sources/chapter01/components/recXelectrodes/linear_electrode.csv new file mode 100644 index 0000000..d99c28f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/recXelectrodes/linear_electrode.csv @@ -0,0 +1,87 @@ +channel x_pos y_pos z_pos +0 10.0 0 5.0 +1 10.0 -10 5.0 +2 10.0 -20 5.0 +3 10.0 -30 5.0 +4 10.0 -40 5.0 +5 10.0 -50 5.0 +6 10.0 -60 5.0 +7 10.0 -70 5.0 +8 10.0 -80 5.0 +9 10.0 -90 5.0 +10 10.0 -100 5.0 +11 10.0 -110 5.0 +12 10.0 -120 5.0 +13 10.0 -130 5.0 +14 10.0 -140 5.0 +15 10.0 -150 5.0 +16 10.0 -160 5.0 +17 10.0 -170 5.0 +18 10.0 -180 5.0 +19 10.0 -190 5.0 +20 10.0 -200 5.0 +21 10.0 -210 5.0 +22 10.0 -220 5.0 +23 10.0 -230 5.0 +24 10.0 -240 5.0 +25 10.0 -250 5.0 +26 10.0 -260 5.0 +27 10.0 -270 5.0 +28 10.0 -280 5.0 +29 10.0 -290 5.0 +30 10.0 -300 5.0 +31 10.0 -310 5.0 +32 10.0 -320 5.0 +33 10.0 -330 5.0 +34 10.0 -340 5.0 +35 10.0 -350 5.0 +36 10.0 -360 5.0 +37 10.0 -370 5.0 +38 10.0 -380 5.0 +39 10.0 -390 5.0 +40 10.0 -400 5.0 +41 10.0 -410 5.0 +42 10.0 -420 5.0 +43 10.0 -430 5.0 +44 10.0 -440 5.0 +45 10.0 -450 5.0 +46 10.0 -460 5.0 +47 10.0 -470 5.0 +48 10.0 -480 5.0 +49 10.0 -490 5.0 +50 10.0 -500 5.0 +51 10.0 -510 5.0 +52 10.0 -520 5.0 +53 10.0 -530 5.0 +54 10.0 -540 5.0 +55 10.0 -550 5.0 +56 10.0 -560 5.0 +57 10.0 -570 5.0 +58 10.0 -580 5.0 +59 10.0 -590 5.0 +60 10.0 -600 5.0 +61 10.0 -610 5.0 +62 10.0 -620 5.0 +63 10.0 -630 5.0 +64 10.0 -640 5.0 +65 10.0 -650 5.0 +66 10.0 -660 5.0 +67 10.0 -670 5.0 +68 10.0 -680 5.0 +69 10.0 -690 5.0 +70 10.0 -700 5.0 +71 10.0 -710 5.0 +72 10.0 -720 5.0 +73 10.0 -730 5.0 +74 10.0 -740 5.0 +75 10.0 -750 5.0 +76 10.0 -760 5.0 +77 10.0 -770 5.0 +78 10.0 -780 5.0 +79 10.0 -790 5.0 +80 10.0 -800 5.0 +81 10.0 -810 5.0 +82 10.0 -820 5.0 +83 10.0 -830 5.0 +84 10.0 -840 5.0 +85 10.0 -850 5.0 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/recXelectrodes/mesh_electrode.csv b/bmtk-vb/docs/tutorial/sources/chapter01/components/recXelectrodes/mesh_electrode.csv new file mode 100644 index 0000000..6eb41f1 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/recXelectrodes/mesh_electrode.csv @@ -0,0 +1,388 @@ +channel x_pos y_pos z_pos +0 -80.0 0.0 10.0 +1 -80.0 -20.0 10.0 +2 -80.0 -40.0 10.0 +3 -80.0 -60.0 10.0 +4 -80.0 -80.0 10.0 +5 -80.0 -100.0 10.0 +6 -80.0 -120.0 10.0 +7 -80.0 -140.0 10.0 +8 -80.0 -160.0 10.0 +9 -80.0 -180.0 10.0 +10 -80.0 -200.0 10.0 +11 -80.0 -220.0 10.0 +12 -80.0 -240.0 10.0 +13 -80.0 -260.0 10.0 +14 -80.0 -280.0 10.0 +15 -80.0 -300.0 10.0 +16 -80.0 -320.0 10.0 +17 -80.0 -340.0 10.0 +18 -80.0 -360.0 10.0 +19 -80.0 -380.0 10.0 +20 -80.0 -400.0 10.0 +21 -80.0 -420.0 10.0 +22 -80.0 -440.0 10.0 +23 -80.0 -460.0 10.0 +24 -80.0 -480.0 10.0 +25 -80.0 -500.0 10.0 +26 -80.0 -520.0 10.0 +27 -80.0 -540.0 10.0 +28 -80.0 -560.0 10.0 +29 -80.0 -580.0 10.0 +30 -80.0 -600.0 10.0 +31 -80.0 -620.0 10.0 +32 -80.0 -640.0 10.0 +33 -80.0 -660.0 10.0 +34 -80.0 -680.0 10.0 +35 -80.0 -700.0 10.0 +36 -80.0 -720.0 10.0 +37 -80.0 -740.0 10.0 +38 -80.0 -760.0 10.0 +39 -80.0 -780.0 10.0 +40 -80.0 -800.0 10.0 +41 -80.0 -820.0 10.0 +42 -80.0 -840.0 10.0 +43 -60.0 0.0 10.0 +44 -60.0 -20.0 10.0 +45 -60.0 -40.0 10.0 +46 -60.0 -60.0 10.0 +47 -60.0 -80.0 10.0 +48 -60.0 -100.0 10.0 +49 -60.0 -120.0 10.0 +50 -60.0 -140.0 10.0 +51 -60.0 -160.0 10.0 +52 -60.0 -180.0 10.0 +53 -60.0 -200.0 10.0 +54 -60.0 -220.0 10.0 +55 -60.0 -240.0 10.0 +56 -60.0 -260.0 10.0 +57 -60.0 -280.0 10.0 +58 -60.0 -300.0 10.0 +59 -60.0 -320.0 10.0 +60 -60.0 -340.0 10.0 +61 -60.0 -360.0 10.0 +62 -60.0 -380.0 10.0 +63 -60.0 -400.0 10.0 +64 -60.0 -420.0 10.0 +65 -60.0 -440.0 10.0 +66 -60.0 -460.0 10.0 +67 -60.0 -480.0 10.0 +68 -60.0 -500.0 10.0 +69 -60.0 -520.0 10.0 +70 -60.0 -540.0 10.0 +71 -60.0 -560.0 10.0 +72 -60.0 -580.0 10.0 +73 -60.0 -600.0 10.0 +74 -60.0 -620.0 10.0 +75 -60.0 -640.0 10.0 +76 -60.0 -660.0 10.0 +77 -60.0 -680.0 10.0 +78 -60.0 -700.0 10.0 +79 -60.0 -720.0 10.0 +80 -60.0 -740.0 10.0 +81 -60.0 -760.0 10.0 +82 -60.0 -780.0 10.0 +83 -60.0 -800.0 10.0 +84 -60.0 -820.0 10.0 +85 -60.0 -840.0 10.0 +86 -40.0 0.0 10.0 +87 -40.0 -20.0 10.0 +88 -40.0 -40.0 10.0 +89 -40.0 -60.0 10.0 +90 -40.0 -80.0 10.0 +91 -40.0 -100.0 10.0 +92 -40.0 -120.0 10.0 +93 -40.0 -140.0 10.0 +94 -40.0 -160.0 10.0 +95 -40.0 -180.0 10.0 +96 -40.0 -200.0 10.0 +97 -40.0 -220.0 10.0 +98 -40.0 -240.0 10.0 +99 -40.0 -260.0 10.0 +100 -40.0 -280.0 10.0 +101 -40.0 -300.0 10.0 +102 -40.0 -320.0 10.0 +103 -40.0 -340.0 10.0 +104 -40.0 -360.0 10.0 +105 -40.0 -380.0 10.0 +106 -40.0 -400.0 10.0 +107 -40.0 -420.0 10.0 +108 -40.0 -440.0 10.0 +109 -40.0 -460.0 10.0 +110 -40.0 -480.0 10.0 +111 -40.0 -500.0 10.0 +112 -40.0 -520.0 10.0 +113 -40.0 -540.0 10.0 +114 -40.0 -560.0 10.0 +115 -40.0 -580.0 10.0 +116 -40.0 -600.0 10.0 +117 -40.0 -620.0 10.0 +118 -40.0 -640.0 10.0 +119 -40.0 -660.0 10.0 +120 -40.0 -680.0 10.0 +121 -40.0 -700.0 10.0 +122 -40.0 -720.0 10.0 +123 -40.0 -740.0 10.0 +124 -40.0 -760.0 10.0 +125 -40.0 -780.0 10.0 +126 -40.0 -800.0 10.0 +127 -40.0 -820.0 10.0 +128 -40.0 -840.0 10.0 +129 -20.0 0.0 10.0 +130 -20.0 -20.0 10.0 +131 -20.0 -40.0 10.0 +132 -20.0 -60.0 10.0 +133 -20.0 -80.0 10.0 +134 -20.0 -100.0 10.0 +135 -20.0 -120.0 10.0 +136 -20.0 -140.0 10.0 +137 -20.0 -160.0 10.0 +138 -20.0 -180.0 10.0 +139 -20.0 -200.0 10.0 +140 -20.0 -220.0 10.0 +141 -20.0 -240.0 10.0 +142 -20.0 -260.0 10.0 +143 -20.0 -280.0 10.0 +144 -20.0 -300.0 10.0 +145 -20.0 -320.0 10.0 +146 -20.0 -340.0 10.0 +147 -20.0 -360.0 10.0 +148 -20.0 -380.0 10.0 +149 -20.0 -400.0 10.0 +150 -20.0 -420.0 10.0 +151 -20.0 -440.0 10.0 +152 -20.0 -460.0 10.0 +153 -20.0 -480.0 10.0 +154 -20.0 -500.0 10.0 +155 -20.0 -520.0 10.0 +156 -20.0 -540.0 10.0 +157 -20.0 -560.0 10.0 +158 -20.0 -580.0 10.0 +159 -20.0 -600.0 10.0 +160 -20.0 -620.0 10.0 +161 -20.0 -640.0 10.0 +162 -20.0 -660.0 10.0 +163 -20.0 -680.0 10.0 +164 -20.0 -700.0 10.0 +165 -20.0 -720.0 10.0 +166 -20.0 -740.0 10.0 +167 -20.0 -760.0 10.0 +168 -20.0 -780.0 10.0 +169 -20.0 -800.0 10.0 +170 -20.0 -820.0 10.0 +171 -20.0 -840.0 10.0 +172 0.0 0.0 10.0 +173 0.0 -20.0 10.0 +174 0.0 -40.0 10.0 +175 0.0 -60.0 10.0 +176 0.0 -80.0 10.0 +177 0.0 -100.0 10.0 +178 0.0 -120.0 10.0 +179 0.0 -140.0 10.0 +180 0.0 -160.0 10.0 +181 0.0 -180.0 10.0 +182 0.0 -200.0 10.0 +183 0.0 -220.0 10.0 +184 0.0 -240.0 10.0 +185 0.0 -260.0 10.0 +186 0.0 -280.0 10.0 +187 0.0 -300.0 10.0 +188 0.0 -320.0 10.0 +189 0.0 -340.0 10.0 +190 0.0 -360.0 10.0 +191 0.0 -380.0 10.0 +192 0.0 -400.0 10.0 +193 0.0 -420.0 10.0 +194 0.0 -440.0 10.0 +195 0.0 -460.0 10.0 +196 0.0 -480.0 10.0 +197 0.0 -500.0 10.0 +198 0.0 -520.0 10.0 +199 0.0 -540.0 10.0 +200 0.0 -560.0 10.0 +201 0.0 -580.0 10.0 +202 0.0 -600.0 10.0 +203 0.0 -620.0 10.0 +204 0.0 -640.0 10.0 +205 0.0 -660.0 10.0 +206 0.0 -680.0 10.0 +207 0.0 -700.0 10.0 +208 0.0 -720.0 10.0 +209 0.0 -740.0 10.0 +210 0.0 -760.0 10.0 +211 0.0 -780.0 10.0 +212 0.0 -800.0 10.0 +213 0.0 -820.0 10.0 +214 0.0 -840.0 10.0 +215 20.0 0.0 10.0 +216 20.0 -20.0 10.0 +217 20.0 -40.0 10.0 +218 20.0 -60.0 10.0 +219 20.0 -80.0 10.0 +220 20.0 -100.0 10.0 +221 20.0 -120.0 10.0 +222 20.0 -140.0 10.0 +223 20.0 -160.0 10.0 +224 20.0 -180.0 10.0 +225 20.0 -200.0 10.0 +226 20.0 -220.0 10.0 +227 20.0 -240.0 10.0 +228 20.0 -260.0 10.0 +229 20.0 -280.0 10.0 +230 20.0 -300.0 10.0 +231 20.0 -320.0 10.0 +232 20.0 -340.0 10.0 +233 20.0 -360.0 10.0 +234 20.0 -380.0 10.0 +235 20.0 -400.0 10.0 +236 20.0 -420.0 10.0 +237 20.0 -440.0 10.0 +238 20.0 -460.0 10.0 +239 20.0 -480.0 10.0 +240 20.0 -500.0 10.0 +241 20.0 -520.0 10.0 +242 20.0 -540.0 10.0 +243 20.0 -560.0 10.0 +244 20.0 -580.0 10.0 +245 20.0 -600.0 10.0 +246 20.0 -620.0 10.0 +247 20.0 -640.0 10.0 +248 20.0 -660.0 10.0 +249 20.0 -680.0 10.0 +250 20.0 -700.0 10.0 +251 20.0 -720.0 10.0 +252 20.0 -740.0 10.0 +253 20.0 -760.0 10.0 +254 20.0 -780.0 10.0 +255 20.0 -800.0 10.0 +256 20.0 -820.0 10.0 +257 20.0 -840.0 10.0 +258 40.0 0.0 10.0 +259 40.0 -20.0 10.0 +260 40.0 -40.0 10.0 +261 40.0 -60.0 10.0 +262 40.0 -80.0 10.0 +263 40.0 -100.0 10.0 +264 40.0 -120.0 10.0 +265 40.0 -140.0 10.0 +266 40.0 -160.0 10.0 +267 40.0 -180.0 10.0 +268 40.0 -200.0 10.0 +269 40.0 -220.0 10.0 +270 40.0 -240.0 10.0 +271 40.0 -260.0 10.0 +272 40.0 -280.0 10.0 +273 40.0 -300.0 10.0 +274 40.0 -320.0 10.0 +275 40.0 -340.0 10.0 +276 40.0 -360.0 10.0 +277 40.0 -380.0 10.0 +278 40.0 -400.0 10.0 +279 40.0 -420.0 10.0 +280 40.0 -440.0 10.0 +281 40.0 -460.0 10.0 +282 40.0 -480.0 10.0 +283 40.0 -500.0 10.0 +284 40.0 -520.0 10.0 +285 40.0 -540.0 10.0 +286 40.0 -560.0 10.0 +287 40.0 -580.0 10.0 +288 40.0 -600.0 10.0 +289 40.0 -620.0 10.0 +290 40.0 -640.0 10.0 +291 40.0 -660.0 10.0 +292 40.0 -680.0 10.0 +293 40.0 -700.0 10.0 +294 40.0 -720.0 10.0 +295 40.0 -740.0 10.0 +296 40.0 -760.0 10.0 +297 40.0 -780.0 10.0 +298 40.0 -800.0 10.0 +299 40.0 -820.0 10.0 +300 40.0 -840.0 10.0 +301 60.0 0.0 10.0 +302 60.0 -20.0 10.0 +303 60.0 -40.0 10.0 +304 60.0 -60.0 10.0 +305 60.0 -80.0 10.0 +306 60.0 -100.0 10.0 +307 60.0 -120.0 10.0 +308 60.0 -140.0 10.0 +309 60.0 -160.0 10.0 +310 60.0 -180.0 10.0 +311 60.0 -200.0 10.0 +312 60.0 -220.0 10.0 +313 60.0 -240.0 10.0 +314 60.0 -260.0 10.0 +315 60.0 -280.0 10.0 +316 60.0 -300.0 10.0 +317 60.0 -320.0 10.0 +318 60.0 -340.0 10.0 +319 60.0 -360.0 10.0 +320 60.0 -380.0 10.0 +321 60.0 -400.0 10.0 +322 60.0 -420.0 10.0 +323 60.0 -440.0 10.0 +324 60.0 -460.0 10.0 +325 60.0 -480.0 10.0 +326 60.0 -500.0 10.0 +327 60.0 -520.0 10.0 +328 60.0 -540.0 10.0 +329 60.0 -560.0 10.0 +330 60.0 -580.0 10.0 +331 60.0 -600.0 10.0 +332 60.0 -620.0 10.0 +333 60.0 -640.0 10.0 +334 60.0 -660.0 10.0 +335 60.0 -680.0 10.0 +336 60.0 -700.0 10.0 +337 60.0 -720.0 10.0 +338 60.0 -740.0 10.0 +339 60.0 -760.0 10.0 +340 60.0 -780.0 10.0 +341 60.0 -800.0 10.0 +342 60.0 -820.0 10.0 +343 60.0 -840.0 10.0 +344 80.0 0.0 10.0 +345 80.0 -20.0 10.0 +346 80.0 -40.0 10.0 +347 80.0 -60.0 10.0 +348 80.0 -80.0 10.0 +349 80.0 -100.0 10.0 +350 80.0 -120.0 10.0 +351 80.0 -140.0 10.0 +352 80.0 -160.0 10.0 +353 80.0 -180.0 10.0 +354 80.0 -200.0 10.0 +355 80.0 -220.0 10.0 +356 80.0 -240.0 10.0 +357 80.0 -260.0 10.0 +358 80.0 -280.0 10.0 +359 80.0 -300.0 10.0 +360 80.0 -320.0 10.0 +361 80.0 -340.0 10.0 +362 80.0 -360.0 10.0 +363 80.0 -380.0 10.0 +364 80.0 -400.0 10.0 +365 80.0 -420.0 10.0 +366 80.0 -440.0 10.0 +367 80.0 -460.0 10.0 +368 80.0 -480.0 10.0 +369 80.0 -500.0 10.0 +370 80.0 -520.0 10.0 +371 80.0 -540.0 10.0 +372 80.0 -560.0 10.0 +373 80.0 -580.0 10.0 +374 80.0 -600.0 10.0 +375 80.0 -620.0 10.0 +376 80.0 -640.0 10.0 +377 80.0 -660.0 10.0 +378 80.0 -680.0 10.0 +379 80.0 -700.0 10.0 +380 80.0 -720.0 10.0 +381 80.0 -740.0 10.0 +382 80.0 -760.0 10.0 +383 80.0 -780.0 10.0 +384 80.0 -800.0 10.0 +385 80.0 -820.0 10.0 +386 80.0 -840.0 10.0 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/recXelectrodes/mesh_electrode_half.csv b/bmtk-vb/docs/tutorial/sources/chapter01/components/recXelectrodes/mesh_electrode_half.csv new file mode 100644 index 0000000..bf5373f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/recXelectrodes/mesh_electrode_half.csv @@ -0,0 +1,216 @@ +channel x_pos y_pos z_pos +0 -80.0 0.0 10.0 +1 -80.0 -20.0 10.0 +2 -80.0 -40.0 10.0 +3 -80.0 -60.0 10.0 +4 -80.0 -80.0 10.0 +5 -80.0 -100.0 10.0 +6 -80.0 -120.0 10.0 +7 -80.0 -140.0 10.0 +8 -80.0 -160.0 10.0 +9 -80.0 -180.0 10.0 +10 -80.0 -200.0 10.0 +11 -80.0 -220.0 10.0 +12 -80.0 -240.0 10.0 +13 -80.0 -260.0 10.0 +14 -80.0 -280.0 10.0 +15 -80.0 -300.0 10.0 +16 -80.0 -320.0 10.0 +17 -80.0 -340.0 10.0 +18 -80.0 -360.0 10.0 +19 -80.0 -380.0 10.0 +20 -80.0 -400.0 10.0 +21 -80.0 -420.0 10.0 +22 -80.0 -440.0 10.0 +23 -80.0 -460.0 10.0 +24 -80.0 -480.0 10.0 +25 -80.0 -500.0 10.0 +26 -80.0 -520.0 10.0 +27 -80.0 -540.0 10.0 +28 -80.0 -560.0 10.0 +29 -80.0 -580.0 10.0 +30 -80.0 -600.0 10.0 +31 -80.0 -620.0 10.0 +32 -80.0 -640.0 10.0 +33 -80.0 -660.0 10.0 +34 -80.0 -680.0 10.0 +35 -80.0 -700.0 10.0 +36 -80.0 -720.0 10.0 +37 -80.0 -740.0 10.0 +38 -80.0 -760.0 10.0 +39 -80.0 -780.0 10.0 +40 -80.0 -800.0 10.0 +41 -80.0 -820.0 10.0 +42 -80.0 -840.0 10.0 +43 -60.0 0.0 10.0 +44 -60.0 -20.0 10.0 +45 -60.0 -40.0 10.0 +46 -60.0 -60.0 10.0 +47 -60.0 -80.0 10.0 +48 -60.0 -100.0 10.0 +49 -60.0 -120.0 10.0 +50 -60.0 -140.0 10.0 +51 -60.0 -160.0 10.0 +52 -60.0 -180.0 10.0 +53 -60.0 -200.0 10.0 +54 -60.0 -220.0 10.0 +55 -60.0 -240.0 10.0 +56 -60.0 -260.0 10.0 +57 -60.0 -280.0 10.0 +58 -60.0 -300.0 10.0 +59 -60.0 -320.0 10.0 +60 -60.0 -340.0 10.0 +61 -60.0 -360.0 10.0 +62 -60.0 -380.0 10.0 +63 -60.0 -400.0 10.0 +64 -60.0 -420.0 10.0 +65 -60.0 -440.0 10.0 +66 -60.0 -460.0 10.0 +67 -60.0 -480.0 10.0 +68 -60.0 -500.0 10.0 +69 -60.0 -520.0 10.0 +70 -60.0 -540.0 10.0 +71 -60.0 -560.0 10.0 +72 -60.0 -580.0 10.0 +73 -60.0 -600.0 10.0 +74 -60.0 -620.0 10.0 +75 -60.0 -640.0 10.0 +76 -60.0 -660.0 10.0 +77 -60.0 -680.0 10.0 +78 -60.0 -700.0 10.0 +79 -60.0 -720.0 10.0 +80 -60.0 -740.0 10.0 +81 -60.0 -760.0 10.0 +82 -60.0 -780.0 10.0 +83 -60.0 -800.0 10.0 +84 -60.0 -820.0 10.0 +85 -60.0 -840.0 10.0 +86 -40.0 0.0 10.0 +87 -40.0 -20.0 10.0 +88 -40.0 -40.0 10.0 +89 -40.0 -60.0 10.0 +90 -40.0 -80.0 10.0 +91 -40.0 -100.0 10.0 +92 -40.0 -120.0 10.0 +93 -40.0 -140.0 10.0 +94 -40.0 -160.0 10.0 +95 -40.0 -180.0 10.0 +96 -40.0 -200.0 10.0 +97 -40.0 -220.0 10.0 +98 -40.0 -240.0 10.0 +99 -40.0 -260.0 10.0 +100 -40.0 -280.0 10.0 +101 -40.0 -300.0 10.0 +102 -40.0 -320.0 10.0 +103 -40.0 -340.0 10.0 +104 -40.0 -360.0 10.0 +105 -40.0 -380.0 10.0 +106 -40.0 -400.0 10.0 +107 -40.0 -420.0 10.0 +108 -40.0 -440.0 10.0 +109 -40.0 -460.0 10.0 +110 -40.0 -480.0 10.0 +111 -40.0 -500.0 10.0 +112 -40.0 -520.0 10.0 +113 -40.0 -540.0 10.0 +114 -40.0 -560.0 10.0 +115 -40.0 -580.0 10.0 +116 -40.0 -600.0 10.0 +117 -40.0 -620.0 10.0 +118 -40.0 -640.0 10.0 +119 -40.0 -660.0 10.0 +120 -40.0 -680.0 10.0 +121 -40.0 -700.0 10.0 +122 -40.0 -720.0 10.0 +123 -40.0 -740.0 10.0 +124 -40.0 -760.0 10.0 +125 -40.0 -780.0 10.0 +126 -40.0 -800.0 10.0 +127 -40.0 -820.0 10.0 +128 -40.0 -840.0 10.0 +129 -20.0 0.0 10.0 +130 -20.0 -20.0 10.0 +131 -20.0 -40.0 10.0 +132 -20.0 -60.0 10.0 +133 -20.0 -80.0 10.0 +134 -20.0 -100.0 10.0 +135 -20.0 -120.0 10.0 +136 -20.0 -140.0 10.0 +137 -20.0 -160.0 10.0 +138 -20.0 -180.0 10.0 +139 -20.0 -200.0 10.0 +140 -20.0 -220.0 10.0 +141 -20.0 -240.0 10.0 +142 -20.0 -260.0 10.0 +143 -20.0 -280.0 10.0 +144 -20.0 -300.0 10.0 +145 -20.0 -320.0 10.0 +146 -20.0 -340.0 10.0 +147 -20.0 -360.0 10.0 +148 -20.0 -380.0 10.0 +149 -20.0 -400.0 10.0 +150 -20.0 -420.0 10.0 +151 -20.0 -440.0 10.0 +152 -20.0 -460.0 10.0 +153 -20.0 -480.0 10.0 +154 -20.0 -500.0 10.0 +155 -20.0 -520.0 10.0 +156 -20.0 -540.0 10.0 +157 -20.0 -560.0 10.0 +158 -20.0 -580.0 10.0 +159 -20.0 -600.0 10.0 +160 -20.0 -620.0 10.0 +161 -20.0 -640.0 10.0 +162 -20.0 -660.0 10.0 +163 -20.0 -680.0 10.0 +164 -20.0 -700.0 10.0 +165 -20.0 -720.0 10.0 +166 -20.0 -740.0 10.0 +167 -20.0 -760.0 10.0 +168 -20.0 -780.0 10.0 +169 -20.0 -800.0 10.0 +170 -20.0 -820.0 10.0 +171 -20.0 -840.0 10.0 +172 0.0 0.0 10.0 +173 0.0 -20.0 10.0 +174 0.0 -40.0 10.0 +175 0.0 -60.0 10.0 +176 0.0 -80.0 10.0 +177 0.0 -100.0 10.0 +178 0.0 -120.0 10.0 +179 0.0 -140.0 10.0 +180 0.0 -160.0 10.0 +181 0.0 -180.0 10.0 +182 0.0 -200.0 10.0 +183 0.0 -220.0 10.0 +184 0.0 -240.0 10.0 +185 0.0 -260.0 10.0 +186 0.0 -280.0 10.0 +187 0.0 -300.0 10.0 +188 0.0 -320.0 10.0 +189 0.0 -340.0 10.0 +190 0.0 -360.0 10.0 +191 0.0 -380.0 10.0 +192 0.0 -400.0 10.0 +193 0.0 -420.0 10.0 +194 0.0 -440.0 10.0 +195 0.0 -460.0 10.0 +196 0.0 -480.0 10.0 +197 0.0 -500.0 10.0 +198 0.0 -520.0 10.0 +199 0.0 -540.0 10.0 +200 0.0 -560.0 10.0 +201 0.0 -580.0 10.0 +202 0.0 -600.0 10.0 +203 0.0 -620.0 10.0 +204 0.0 -640.0 10.0 +205 0.0 -660.0 10.0 +206 0.0 -680.0 10.0 +207 0.0 -700.0 10.0 +208 0.0 -720.0 10.0 +209 0.0 -740.0 10.0 +210 0.0 -760.0 10.0 +211 0.0 -780.0 10.0 +212 0.0 -800.0 10.0 +213 0.0 -820.0 10.0 +214 0.0 -840.0 10.0 diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/AMPA_ExcToExc.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/AMPA_ExcToExc.json new file mode 100644 index 0000000..c758540 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/AMPA_ExcToExc.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 1.0, + "tau2": 3.0, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/AMPA_ExcToInh.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/AMPA_ExcToInh.json new file mode 100644 index 0000000..4388799 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/AMPA_ExcToInh.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.1, + "tau2": 0.5, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/GABA_InhToExc.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/GABA_InhToExc.json new file mode 100644 index 0000000..702ce9b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/GABA_InhToExc.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 2.7, + "tau2": 15.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/GABA_InhToInh.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/GABA_InhToInh.json new file mode 100644 index 0000000..ed4130a --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/GABA_InhToInh.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.2, + "tau2": 8.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/instanteneousExc.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/instanteneousExc.json new file mode 100644 index 0000000..9a6d0a5 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/instanteneousExc.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": 1 +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/instanteneousInh.json b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/instanteneousInh.json new file mode 100644 index 0000000..3bac514 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/components/synaptic_models/instanteneousInh.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": -1 +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/run_bionet.py b/bmtk-vb/docs/tutorial/sources/chapter01/run_bionet.py new file mode 100644 index 0000000..ca8abeb --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/run_bionet.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +"""Simulates an example network of 14 cell receiving two kinds of exernal input as defined in configuration file""" + +import os, sys +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + graph = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=graph) + sim.run() + bionet.nrn.quit_execution() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/tutorial/sources/chapter01/simulation_config.json b/bmtk-vb/docs/tutorial/sources/chapter01/simulation_config.json new file mode 100644 index 0000000..04dd91f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter01/simulation_config.json @@ -0,0 +1,49 @@ +{ + "manifest": { + "$OUTPUT_DIR": "$BASE_DIR/output", + "$BASE_DIR": "." + }, + "target_simulator": "NEURON", + "run": { + "nsteps_block": 5000, + "tstop": 2000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15.0 + }, + "conditions": { + "celsius": 34.0, + "v_init": -80.0 + }, + "inputs": { + "current_clamp": { + "input_type": "current_clamp", + "module": "IClamp", + "node_set": "all", + "amp": 0.1200, + "delay": 500.0, + "duration": 1000.0 + } + + }, + "output": { + "spikes_file_csv": "spikes.csv", + "spikes_file": "spikes.h5", + "log_file": "log.txt", + "output_dir": "${OUTPUT_DIR}", + "overwrite_output_dir": true + }, + "reports": { + "membrane_report": { + "file_name": "cell_vars.h5", + "cells": "all", + "sections": "soma", + "module": "membrane_report", + "variable_name": [ + "cai", + "v" + ] + } + }, + "network": "./circuit_config.json" +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter02/biophys_components/biophysical_neuron_templates/472363762_fit.json b/bmtk-vb/docs/tutorial/sources/chapter02/biophys_components/biophysical_neuron_templates/472363762_fit.json new file mode 100644 index 0000000..9d72939 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter02/biophys_components/biophysical_neuron_templates/472363762_fit.json @@ -0,0 +1,145 @@ +{ + "passive": [ + { + "ra": 32.0772432623, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "dend", + "cm": 3.7002019468166822 + }, + { + "section": "apic", + "cm": 3.7002019468166822 + } + ], + "e_pas": -84.74527740478516 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 46 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -84.74527740478516 + } + ], + "genome": [ + { + "section": "soma", + "name": "gbar_Im", + "value": 0.00011215709095308002, + "mechanism": "Im" + }, + { + "section": "soma", + "name": "gbar_Ih", + "value": 0.00045041730360183556, + "mechanism": "Ih" + }, + { + "section": "soma", + "name": "gbar_NaTs", + "value": 1.1281486914123688, + "mechanism": "NaTs" + }, + { + "section": "soma", + "name": "gbar_Nap", + "value": 0.00095782168667023497, + "mechanism": "Nap" + }, + { + "section": "soma", + "name": "gbar_K_P", + "value": 0.096648124440568361, + "mechanism": "K_P" + }, + { + "section": "soma", + "name": "gbar_K_T", + "value": 2.2406204607139379e-05, + "mechanism": "K_T" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": 0.0068601737830082388, + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": 0.33043773066721083, + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": 0.00026836177945335608, + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": 0.0077938181828292709, + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": 0.00044743022380752001, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": 998.99266101400383, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "g_pas", + "value": 0.00091710033541291013, + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": 0.00074804303211946897, + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": 0.00016449702719528828, + "mechanism": "" + }, + { + "section": "apic", + "name": "g_pas", + "value": 4.4606771501076728e-05, + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter02/biophys_components/morphologies/Scnn1a_473845048_m.swc b/bmtk-vb/docs/tutorial/sources/chapter02/biophys_components/morphologies/Scnn1a_473845048_m.swc new file mode 100644 index 0000000..ab4001d --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter02/biophys_components/morphologies/Scnn1a_473845048_m.swc @@ -0,0 +1,2595 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/Users/alexh/Desktop/Check then delete/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_488448269_p.swc_Z_T10.swc +# id,type,x,y,z,r,pid +1 1 550.439 522.6341 38.7565 5.1205 -1 +2 3 546.4945 522.8435 34.8855 0.1144 1 +3 3 545.4306 522.8984 33.7747 0.1398 2 +4 3 544.3552 522.9499 33.2744 0.1907 3 +5 3 543.2273 523.0071 32.7732 0.2669 4 +6 3 542.105 523.2027 32.3246 0.3178 5 +7 3 541.0068 523.3034 31.8399 0.3178 6 +8 3 539.9863 523.5138 31.2732 0.2669 7 +9 3 538.9052 523.666 30.7922 0.2034 8 +10 3 537.7933 523.5516 30.4881 0.1907 9 +11 3 536.8048 523.3217 30.1924 0.2161 10 +12 3 535.9228 523.2301 29.7063 0.2415 11 +13 3 534.8921 523.4498 29.1575 0.2161 12 +14 3 533.7904 523.4738 28.73 0.1907 13 +15 3 532.9175 522.951 28.4908 0.1907 14 +16 3 532.7802 521.9694 28.2094 0.2415 15 +17 3 533.1452 521.3723 27.652 0.2542 16 +18 3 532.9827 520.2958 27.1077 0.2415 17 +19 3 531.7346 520.1654 26.5369 0.1907 18 +20 3 530.7725 520.0258 26.1911 0.1398 19 +21 3 529.998 519.233 25.843 0.1398 20 +22 3 529.0371 518.6816 25.5543 0.178 21 +23 3 528.067 518.1382 25.3801 0.2415 22 +24 3 527.193 517.422 25.3059 0.2924 23 +25 3 526.3247 516.7105 25.3418 0.3432 24 +26 3 525.4998 515.9291 25.4183 0.3432 25 +27 3 524.8775 515.0139 25.4821 0.3178 26 +28 3 524.5526 513.9271 25.5306 0.2669 27 +29 3 524.1911 512.8518 25.5433 0.2542 28 +30 3 523.5482 511.9286 25.5061 0.2415 29 +31 3 522.7805 511.1014 25.505 0.2415 30 +32 3 521.9351 510.462 25.6241 0.2288 31 +33 3 521.2121 509.6543 25.6083 0.2161 32 +34 3 520.3244 509.5147 25.357 0.1907 33 +35 3 519.4721 508.8363 25.1901 0.1525 34 +36 3 518.391 508.6178 24.9653 0.1398 35 +37 3 517.3809 508.341 24.7245 0.1652 36 +38 3 516.5709 507.5528 24.5916 0.2288 37 +39 3 515.8147 506.7142 24.5832 0.2796 38 +40 3 514.8492 506.1891 24.5692 0.2796 39 +41 3 513.8608 505.6343 24.5185 0.2415 40 +42 3 512.9536 504.9685 24.3906 0.2034 41 +43 3 512.2809 504.1139 24.345 0.1907 42 +44 3 511.2479 503.6666 24.2214 0.1907 43 +45 3 510.2675 503.0912 24.0083 0.178 44 +46 3 509.414 502.3487 23.7194 0.178 45 +47 3 508.5744 501.7733 23.2639 0.178 46 +48 3 507.9783 501.12 22.6445 0.2034 47 +49 3 507.0723 500.4462 22.1254 0.2161 48 +50 3 506.0507 499.9417 21.7989 0.2288 49 +51 3 505.1412 499.2954 21.6514 0.2288 50 +52 3 504.5395 498.3424 21.6626 0.2288 51 +53 3 503.9617 497.4204 21.7608 0.2161 52 +54 3 503.4046 496.5372 21.7688 0.1907 53 +55 3 503.1484 495.4298 21.765 0.1652 54 +56 3 502.7994 494.3487 21.8078 0.1525 55 +57 3 502.3716 493.3077 21.8473 0.1652 56 +58 3 501.7081 492.5446 21.9327 0.1652 57 +59 3 500.7311 492.1259 22.1296 0.178 58 +60 3 499.6168 491.9726 22.3045 0.178 59 +61 3 498.5152 491.9715 22.3302 0.2161 60 +62 3 497.4959 491.6775 22.197 0.2542 61 +63 3 496.5486 491.0746 22.0414 0.2924 62 +64 3 495.9595 490.1765 21.978 0.3051 63 +65 3 495.6391 489.0989 21.9925 0.2924 64 +66 3 495.0866 488.1254 22.0311 0.2924 65 +67 3 494.3052 487.3429 22.0039 0.2669 66 +68 3 493.3077 487.0397 21.8798 0.2415 67 +69 3 492.3559 486.6427 21.8648 0.2034 68 +70 3 491.5413 485.922 21.9735 0.2034 69 +71 3 490.8126 485.0732 22.1353 0.2288 70 +72 3 490.1159 484.2335 22.2187 0.2288 71 +73 3 489.4055 483.594 22.0897 0.2161 72 +74 3 488.6402 482.7794 22.0038 0.1907 73 +75 3 488.0029 481.8917 22.0453 0.2161 74 +76 3 487.4229 480.9616 22.1693 0.2288 75 +77 3 486.9825 479.9252 22.3233 0.2415 76 +78 3 486.5649 478.9219 22.3934 0.2288 77 +79 3 486.1531 477.9598 22.2626 0.2542 78 +80 3 485.644 476.9668 22.0479 0.2669 79 +81 3 484.9942 476.0253 21.831 0.2542 80 +82 3 484.3845 475.0574 21.6328 0.1907 81 +83 3 483.7827 474.0862 21.4692 0.1398 82 +84 3 483.0174 473.2602 21.3367 0.1271 83 +85 3 482.0873 472.607 21.2002 0.1398 84 +86 3 481.0863 472.1254 21.0176 0.1525 85 +87 3 479.9812 472.0945 20.8404 0.1398 86 +88 3 479.0134 472.575 20.7658 0.1271 87 +89 3 478.0524 473.0509 20.692 0.1271 88 +90 3 476.945 473.1023 20.5434 0.1398 89 +91 3 475.8113 473.1367 20.3846 0.1525 90 +92 3 474.7211 473.4547 20.228 0.1398 91 +93 3 473.6606 473.8791 20.0431 0.1271 92 +94 3 472.6173 474.2921 19.7791 0.1144 93 +95 3 471.5408 474.5552 19.4559 0.1144 94 +96 3 470.43 474.5072 19.1214 0.1398 95 +97 3 469.3203 474.2818 18.802 0.1652 96 +98 3 468.293 473.8116 18.5503 0.1907 97 +99 3 467.3091 473.2282 18.382 0.1652 98 +100 3 466.3733 472.5727 18.2868 0.1398 99 +101 3 465.4558 471.8886 18.2468 0.1144 100 +102 3 464.5258 471.2239 18.2493 0.1144 101 +103 3 463.598 470.5547 18.2661 0.1144 102 +104 3 462.6794 469.8751 18.2748 0.1271 103 +105 3 461.7333 469.2333 18.2842 0.1398 104 +106 3 460.7849 468.595 18.314 0.1525 105 +107 3 459.9246 467.8651 18.4019 0.1398 106 +108 3 459.0506 467.1421 18.523 0.1271 107 +109 3 458.1034 466.506 18.6267 0.1144 108 +110 3 457.1058 465.9535 18.6767 0.1144 109 +111 3 456.0831 465.4627 18.6557 0.1144 110 +112 3 455.1061 464.8781 18.6145 0.1144 111 +113 3 454.1863 464.2032 18.5967 0.1144 112 +114 3 453.2654 463.5351 18.6251 0.1271 113 +115 3 452.3365 462.883 18.7032 0.1525 114 +116 3 451.5734 462.0685 18.7291 0.178 115 +117 3 450.8596 461.1956 18.6917 0.178 116 +118 3 450.0485 460.3994 18.665 0.1525 117 +119 3 449.2294 459.6009 18.6749 0.1271 118 +120 3 448.5864 458.6639 18.7251 0.1144 119 +121 3 447.9378 457.7258 18.8422 0.1144 120 +122 3 447.0443 457.3277 19.1598 0.1271 121 +123 3 445.9976 457.0555 19.5718 0.1525 122 +124 3 445.2116 456.2638 19.9076 0.1907 123 +125 3 444.4188 455.439 20.1542 0.2034 124 +126 3 443.3206 455.1576 20.3189 0.1907 125 +127 3 442.5003 454.3728 20.4095 0.1525 126 +128 3 441.7911 453.4759 20.4381 0.1271 127 +129 3 441.6984 452.3376 20.4401 0.1144 128 +130 3 441.6984 451.1936 20.44 0.1144 129 +131 3 532.6739 519.2788 24.444 0.3432 18 +132 3 532.3272 518.5592 23.3628 0.3178 131 +133 3 531.8364 517.7332 23.0309 0.2796 132 +134 3 531.3697 516.7151 22.7869 0.2796 133 +135 3 530.8743 515.7667 22.4581 0.2924 134 +136 3 530.8721 514.6261 21.9058 0.2924 135 +137 2 548.9804 526.7983 37.3792 0.1144 1 +138 2 548.6132 527.8702 37.231 0.1271 137 +139 2 548.6555 528.9559 37.1815 0.1398 138 +140 2 549.2275 529.9397 37.1465 0.1652 139 +141 2 549.5524 531.0299 37.1204 0.178 140 +142 2 549.6268 532.1671 37.1017 0.2034 141 +143 2 549.4243 533.2699 37.112 0.2161 142 +144 2 548.8912 534.2606 37.1823 0.2415 143 +145 2 548.1991 535.0625 37.1927 0.2415 144 +146 2 547.4738 535.7649 37.0028 0.2415 145 +147 2 546.7096 536.496 36.836 0.2161 146 +148 2 545.8699 537.2213 36.7564 0.2034 147 +149 2 545.2304 538.157 36.6797 0.178 148 +150 2 544.7934 539.2072 36.5784 0.1652 149 +151 2 544.536 540.3043 36.4294 0.1652 150 +152 2 544.1367 541.3397 36.2236 0.1907 151 +153 2 543.6254 542.2571 35.8904 0.2288 152 +154 2 543.0305 543.0545 35.7199 0.2542 153 +155 2 542.8005 544.1562 35.6468 0.2542 154 +156 2 542.7708 545.2922 35.5634 0.2542 155 +157 2 542.7708 546.4316 35.3864 0.2796 156 +158 3 552.107 517.9449 38.7565 0.1271 1 +159 3 552.4731 516.8615 38.7229 0.1398 158 +160 3 552.8208 515.7713 38.7078 0.1525 159 +161 3 553.1686 514.6822 38.6873 0.1525 160 +162 3 553.6571 513.6549 38.6635 0.1525 161 +163 3 554.2291 512.6642 38.6327 0.1652 162 +164 3 554.9201 511.757 38.5944 0.1652 163 +165 3 555.5321 510.8841 38.4208 0.178 164 +166 3 556.3249 510.1668 38.3872 0.1652 165 +167 3 557.1108 509.3626 38.4205 0.1652 166 +168 3 557.7366 508.8672 38.2337 0.2542 167 +169 3 558.7616 508.4634 38.1276 0.2415 168 +170 3 559.7558 507.9131 38.0173 0.2415 169 +171 3 560.7911 507.4487 37.9016 0.2161 170 +172 3 561.8619 507.1535 37.7415 0.1907 171 +173 3 562.8617 507.1924 37.7311 0.178 172 +174 3 563.833 507.1501 37.9708 0.178 173 +175 3 564.9392 507.1192 38.2256 0.2034 174 +176 3 565.9746 507.3034 38.2519 0.2034 175 +177 3 567.0888 507.3011 38.3239 0.2034 176 +178 3 568.1687 507.0688 38.2175 0.1907 177 +179 3 569.2029 506.617 38.0598 0.1907 178 +180 3 570.1216 505.9637 37.8969 0.1907 179 +181 3 571.0997 505.4375 37.6477 0.1907 180 +182 3 572.1018 505.195 37.214 0.2034 181 +183 3 573.0616 504.8541 36.6831 0.2161 182 +184 3 573.9025 504.234 36.136 0.2161 183 +185 3 574.7513 503.9274 35.4497 0.1907 184 +186 3 575.1128 504.1608 34.956 0.1525 185 +187 3 576.1436 504.6173 34.6685 0.178 186 +188 3 577.2601 504.7763 34.5554 0.2161 187 +189 3 578.3641 504.6001 34.5033 0.2669 188 +190 3 579.412 504.1928 34.426 0.2796 189 +191 3 580.3798 503.797 34.491 0.2669 190 +192 3 581.4506 503.606 34.5783 0.2415 191 +193 3 582.55 503.821 34.5842 0.2161 192 +194 3 583.6036 504.1516 34.4484 0.2034 193 +195 3 584.6389 504.5841 34.258 0.2034 194 +196 3 585.6662 505.0886 34.0684 0.2288 195 +197 3 586.6192 505.7144 33.8702 0.2669 196 +198 3 587.6373 506.1308 33.6064 0.2796 197 +199 3 588.6749 505.8631 33.311 0.2669 198 +200 3 589.732 505.4352 33.0571 0.2288 199 +201 3 590.7479 504.9147 32.8434 0.2034 200 +202 3 591.742 504.4056 32.5828 0.2034 201 +203 3 592.854 504.3335 32.3394 0.2288 202 +204 3 593.0324 505.1767 32.368 0.178 203 +205 3 593.1629 506.2063 31.2774 0.1525 204 +206 3 593.0439 507.2382 30.7639 0.1398 205 +207 3 593.2018 508.3067 30.2341 0.1398 206 +208 3 593.7989 509.2161 29.8446 0.1652 207 +209 3 594.7256 509.7653 29.4913 0.1652 208 +210 3 595.8101 509.7161 29.0931 0.178 209 +211 3 596.8912 509.5445 28.6168 0.1652 210 +212 3 597.9882 509.6978 28.1215 0.1652 211 +213 3 599.0201 510.1702 27.626 0.1398 212 +214 3 599.3736 510.9482 26.9294 0.1271 213 +215 3 599.7203 511.7158 26.0427 0.1271 214 +216 3 600.7373 512.0441 25.2477 0.1398 215 +217 3 601.7017 511.5762 24.5451 0.1525 216 +218 3 602.3526 511.1792 23.6453 0.1398 217 +219 3 602.3995 511.8691 22.6032 0.1271 218 +220 3 601.704 511.9331 21.554 0.1271 219 +221 3 601.1468 511.042 20.6665 0.1398 220 +222 3 600.8551 510.1279 19.7738 0.1525 221 +223 3 601.6044 509.4701 18.1933 0.1525 222 +224 3 593.5141 503.7661 32.1107 0.2415 203 +225 3 594.5311 503.2868 31.9127 0.2415 224 +226 3 595.6556 503.225 31.7456 0.2415 225 +227 3 596.779 503.4275 31.6022 0.2415 226 +228 3 597.9093 503.5236 31.4462 0.2288 227 +229 3 599.0384 503.5488 31.2421 0.2288 228 +230 3 600.1676 503.638 31.0064 0.2034 229 +231 3 601.299 503.7856 30.788 0.178 230 +232 3 602.2748 503.2982 30.5978 0.1525 231 +233 3 602.8754 502.3418 30.4312 0.178 232 +234 3 603.7037 501.5822 30.2347 0.1907 233 +235 3 604.6692 501.0125 29.9855 0.2161 234 +236 3 605.5833 500.3341 29.734 0.1907 235 +237 3 606.5316 499.6958 29.5114 0.178 236 +238 3 607.647 499.4807 29.3129 0.1525 237 +239 3 608.7464 499.7267 29.0738 0.1652 238 +240 3 609.8458 499.8582 28.7756 0.178 239 +241 3 610.3412 499.92 28.5421 0.1271 240 +242 3 611.4588 500.1168 28.3248 0.1525 241 +243 3 612.5022 500.0367 28.0708 0.1907 242 +244 3 613.5192 499.6042 27.8741 0.2034 243 +245 3 614.5854 499.6363 27.8046 0.1907 244 +246 3 615.6951 499.7999 27.7604 0.1525 245 +247 3 616.7407 499.4876 27.6347 0.1525 246 +248 3 617.712 498.9384 27.403 0.1652 247 +249 3 618.7816 498.6021 27.134 0.2161 248 +250 3 619.8753 498.593 26.7795 0.2161 249 +251 3 620.9438 498.9007 26.3927 0.2415 250 +252 3 622.0191 499.2896 26.0399 0.2161 251 +253 3 623.1071 499.6443 25.719 0.2415 252 +254 3 624.2259 499.8262 25.393 0.2288 253 +255 3 625.2646 499.5745 24.9766 0.2542 254 +256 3 625.5735 498.6433 24.5461 0.2542 255 +257 3 625.8058 498.045 23.8746 0.2796 256 +258 3 626.7301 498.3973 23.1497 0.2796 257 +259 3 627.8032 498.7897 22.6195 0.2669 258 +260 3 628.4793 498.9201 22.4274 0.2034 259 +261 3 629.4952 498.53 21.603 0.1907 260 +262 3 629.9242 497.5954 21.1885 0.2034 261 +263 3 630.0877 496.5898 20.6347 0.2034 262 +264 3 630.7764 495.8348 20.1053 0.2415 263 +265 3 631.8404 495.4984 19.7111 0.2415 264 +266 3 632.8082 494.9436 19.3447 0.2288 265 +267 3 633.8263 494.5066 18.9905 0.2034 266 +268 3 634.888 494.1222 18.7224 0.1907 267 +269 3 635.9805 493.7801 18.5569 0.2034 268 +270 3 637.0536 493.4129 18.4902 0.2288 269 +271 3 638.1072 493.0171 18.5193 0.2542 270 +272 3 639.1734 492.6716 18.5318 0.2542 271 +273 3 640.2819 492.5343 18.5067 0.2288 272 +274 3 641.3985 492.6728 18.5063 0.2034 273 +275 3 642.2965 493.2779 18.4593 0.2034 274 +276 3 643.0744 493.6898 18.1726 0.2161 275 +277 3 643.627 492.9073 17.7735 0.2288 276 +278 3 644.4198 492.1099 17.4194 0.2288 277 +279 3 645.1851 491.2965 17.2443 0.2161 278 +280 3 645.7125 490.3607 17.2652 0.1907 279 +281 3 646.5076 489.5771 17.2319 0.1525 280 +282 3 647.3885 488.8712 17.0562 0.1271 281 +283 3 628.1635 498.8801 22.3104 0.2288 259 +284 3 629.1039 499.396 22.1775 0.2669 283 +285 3 629.6919 500.309 22.0513 0.2669 284 +286 3 630.0557 501.3614 22.0288 0.2415 285 +287 3 630.6117 502.3258 22.0231 0.1907 286 +288 3 631.3633 503.1724 21.9534 0.1907 287 +289 3 632.2716 503.8416 21.8464 0.2034 288 +290 3 633.1743 504.5097 21.8147 0.2161 289 +291 3 634.0208 505.251 21.8795 0.2034 290 +292 3 634.8148 506.0621 21.9253 0.1907 291 +293 3 635.6098 506.8812 21.9604 0.2034 292 +294 3 636.4209 507.6752 22.0233 0.2034 293 +295 3 636.8408 508.675 22.0006 0.2288 294 +296 3 637.5295 509.5136 21.8594 0.2288 295 +297 3 638.5293 510.0455 21.7031 0.2542 296 +298 3 639.6276 510.351 21.5681 0.2415 297 +299 3 640.7201 510.6404 21.4007 0.2542 298 +300 3 641.6273 511.2708 21.1864 0.2288 299 +301 3 642.674 511.7078 21.0354 0.2034 300 +302 3 643.7414 512.0567 21.0248 0.1525 301 +303 3 644.8602 512.091 21.1093 0.1271 302 +304 3 645.9974 511.988 21.1938 0.1144 303 +305 3 647.1402 511.9686 21.2602 0.1271 304 +306 3 648.2762 512.099 21.2866 0.1525 305 +307 3 649.4122 512.2397 21.2581 0.178 306 +308 3 650.4841 512.631 21.179 0.178 307 +309 3 651.484 513.0657 20.9507 0.1525 308 +310 3 652.604 512.9593 20.6832 0.1398 309 +311 3 653.5249 512.3633 20.3519 0.1398 310 +312 3 654.6323 512.1368 20.1638 0.1525 311 +313 3 655.7385 511.9091 20.0922 0.1525 312 +314 3 656.8184 511.6082 19.9716 0.1525 313 +315 3 657.9007 511.3119 19.8295 0.178 314 +316 3 659.0412 511.3016 19.762 0.1907 315 +317 3 660.183 511.3016 19.7497 0.2034 316 +318 3 661.3224 511.2319 19.7705 0.1652 317 +319 3 662.4389 511.0271 19.8383 0.1525 318 +320 3 663.5623 510.8452 19.9329 0.1525 319 +321 3 664.704 510.8154 19.9741 0.1907 320 +322 3 665.8469 510.8303 19.9437 0.2161 321 +323 3 666.9486 511.0694 19.8096 0.2288 322 +324 3 668.0491 511.3062 19.605 0.2161 323 +325 3 669.1679 511.4515 19.3649 0.1907 324 +326 3 670.2868 511.5934 19.1224 0.1525 325 +327 3 671.385 511.8576 19.0283 0.1271 326 +328 3 672.4775 512.131 19.0638 0.1144 327 +329 3 673.4064 512.7946 19.1335 0.1144 328 +330 3 674.2999 513.5084 19.209 0.1398 329 +331 3 674.8593 514.506 19.3304 0.1652 330 +332 3 610.0197 500.0115 28.8702 0.1652 240 +333 3 610.6947 500.6064 30.8081 0.1652 332 +334 3 611.3708 501.2013 31.6733 0.1652 333 +335 3 612.2528 501.6726 32.6222 0.1525 334 +336 3 613.2984 502.089 33.465 0.1525 335 +337 3 613.9722 502.9939 34.1729 0.1652 336 +338 3 614.4676 503.7455 34.8698 0.178 337 +339 3 615.5555 503.638 35.3816 0.1907 338 +340 3 616.5451 504.0121 35.716 0.178 339 +341 3 617.2509 504.8495 36.0332 0.1652 340 +342 3 617.8572 505.815 36.2869 0.178 341 +343 3 618.5597 506.7142 36.4826 0.2288 342 +344 3 619.3685 507.4967 36.6615 0.2796 343 +345 3 620.2162 508.2403 36.8399 0.2796 344 +346 3 620.9701 509.0937 36.9513 0.2415 345 +347 3 621.629 510.0169 36.9606 0.2161 346 +348 3 622.2262 510.979 36.9026 0.2288 347 +349 3 622.7753 511.9778 36.8376 0.2415 348 +350 3 623.2901 512.9982 36.8082 0.2415 349 +351 3 623.8186 514.0061 36.8497 0.2288 350 +352 3 624.3574 515.0048 36.9743 0.2415 351 +353 3 624.8986 516.0069 37.1468 0.2288 352 +354 3 625.4946 516.9782 37.3276 0.2288 353 +355 3 626.2325 517.8453 37.4867 0.2288 354 +356 3 627.0081 518.6816 37.6244 0.2669 355 +357 3 627.6579 519.6105 37.7717 0.2669 356 +358 3 628.2722 520.568 37.9092 0.2415 357 +359 3 628.9598 521.4707 37.9778 0.2034 358 +360 3 629.7743 522.2337 38.0461 0.1907 359 +361 3 630.6861 522.8892 38.1867 0.178 360 +362 3 631.5704 523.5939 38.3236 0.1525 361 +363 3 632.457 524.3112 38.4096 0.1525 362 +364 3 633.4442 524.8661 38.4689 0.1907 363 +365 3 634.4738 525.358 38.5398 0.2415 364 +366 3 635.4314 525.9654 38.6666 0.2542 365 +367 3 636.4164 526.4997 38.8699 0.2415 366 +368 3 637.4917 526.8074 39.1465 0.2542 367 +369 3 638.5957 527.0133 39.4724 0.2796 368 +370 3 639.7042 527.1907 39.8132 0.2924 369 +371 3 640.8242 527.3611 40.1181 0.2542 370 +372 3 641.9464 527.5396 40.3088 0.2034 371 +373 3 643.0687 527.7192 40.3752 0.1652 372 +374 3 644.199 527.8679 40.3768 0.1525 373 +375 3 645.335 527.996 40.3598 0.178 374 +376 3 646.4286 528.2981 40.3567 0.1907 375 +377 3 647.472 528.7648 40.4023 0.2034 376 +378 3 648.5313 529.1778 40.5367 0.1652 377 +379 3 649.6181 529.5118 40.7641 0.1398 378 +380 3 650.7369 529.7109 41.0567 0.1271 379 +381 3 651.8718 529.8367 41.4025 0.1525 380 +382 3 652.986 530.0346 41.8303 0.178 381 +383 3 654.0786 530.3001 42.3567 0.178 382 +384 3 655.1642 530.4694 42.992 0.1652 383 +385 3 656.1298 530.7325 43.7833 0.1652 384 +386 3 657.101 530.9464 44.6936 0.178 385 +387 3 658.1215 530.9796 45.6599 0.1907 386 +388 3 658.9394 530.4328 46.6262 0.178 387 +389 3 659.0859 529.3643 47.4337 0.1652 388 +390 3 658.8662 528.2489 48.0777 0.1525 389 +391 3 658.9692 527.1884 48.6766 0.1525 390 +392 3 659.7391 526.8795 49.3444 0.1652 391 +393 3 660.7366 526.8314 49.994 0.1652 392 +394 3 661.8143 526.4882 50.3972 0.178 393 +395 3 662.4973 525.9494 50.0312 0.1907 394 +396 3 575.6093 503.9297 34.72 0.1398 185 +397 3 576.3426 503.2548 34.5229 0.1271 396 +398 3 577.2224 502.5752 34.4585 0.1144 397 +399 3 577.4054 501.7092 34.2832 0.1398 398 +400 3 577.6365 500.5938 34.1449 0.178 399 +401 3 577.6845 499.4738 33.9948 0.2161 400 +402 3 577.2796 498.4214 33.8512 0.2034 401 +403 3 576.7899 497.4306 33.7053 0.1652 402 +404 3 576.4936 496.3999 33.3889 0.1398 403 +405 3 576.0864 495.463 32.8835 0.1525 404 +406 3 575.7157 494.4391 32.3649 0.178 405 +407 3 575.7203 493.3706 31.8797 0.178 406 +408 3 576.0315 492.317 31.3233 0.1652 407 +409 3 576.7076 491.5665 30.6718 0.1525 408 +410 3 576.6721 490.5014 30.0572 0.1525 409 +411 3 575.7157 489.9249 29.5557 0.1398 410 +412 3 574.5866 489.7922 29.1015 0.1271 411 +413 3 573.5158 489.6034 28.5908 0.1144 412 +414 3 573.1818 488.5338 28.1646 0.1271 413 +415 3 572.739 487.5522 27.6693 0.1398 414 +416 3 572.3135 486.5684 27.1038 0.1525 415 +417 3 571.8124 485.5674 26.6724 0.1398 416 +418 3 570.9429 484.8398 26.2966 0.1398 417 +419 3 569.9648 484.5984 25.8593 0.1398 418 +420 3 568.9524 484.9542 25.3269 0.1652 419 +421 3 568.2683 484.587 24.6823 0.1652 420 +422 3 567.9731 483.5333 24.0018 0.1652 421 +423 3 567.7455 482.4545 23.3127 0.1398 422 +424 3 567.7237 481.3288 22.671 0.1271 423 +425 3 567.7237 480.2157 22.0704 0.1144 424 +426 3 567.5979 479.1644 21.4256 0.1271 425 +427 3 566.7525 478.9619 20.8048 0.1398 426 +428 3 565.6222 479.098 20.2697 0.1525 427 +429 3 564.612 478.7114 19.8039 0.1398 428 +430 3 563.7895 478.3865 19.2093 0.1271 429 +431 3 563.0917 478.24 18.4252 0.1398 430 +432 3 562.3572 477.5617 17.8013 0.1652 431 +433 3 561.6182 476.754 17.4778 0.1907 432 +434 3 560.5863 476.3273 17.2886 0.178 433 +435 3 559.559 475.8399 17.1859 0.178 434 +436 3 558.5855 475.3789 17.0994 0.2034 435 +437 3 557.4632 475.3503 17.127 0.2288 436 +438 3 556.8168 476.2094 17.3242 0.2288 437 +439 3 556.5903 477.1853 17.7273 0.178 438 +440 3 556.2734 478.2492 18.1906 0.1525 439 +441 3 555.8204 479.2594 19.3304 0.1398 440 +442 3 557.5639 508.317 38.8091 0.178 167 +443 3 557.7526 507.1958 39.6158 0.1652 442 +444 3 557.986 506.1285 39.9734 0.2034 443 +445 3 557.9071 505.1973 40.5216 0.2288 444 +446 3 557.3682 504.321 41.1368 0.2415 445 +447 3 557.0811 503.2502 41.6046 0.2161 446 +448 3 557.4998 502.7422 42.1067 0.2034 447 +449 3 558.0707 501.9678 42.5121 0.1907 448 +450 3 557.954 500.8649 42.8672 0.178 449 +451 3 557.6451 499.8033 43.209 0.1652 450 +452 3 557.4804 498.8012 43.4087 0.1525 451 +453 3 557.0411 497.7807 43.4498 0.178 452 +454 3 556.9598 496.6607 43.4949 0.2034 453 +455 3 556.9587 495.5476 43.5887 0.2161 454 +456 3 557.1612 494.4894 43.745 0.2288 455 +457 3 556.9804 493.0754 43.6892 0.1652 456 +458 3 556.8397 491.9669 43.507 0.178 457 +459 3 556.6761 490.8618 43.2247 0.178 458 +460 3 556.4874 489.7613 42.8593 0.1907 459 +461 3 556.3512 488.6424 42.4732 0.1907 460 +462 3 556.2963 487.5042 42.1341 0.178 461 +463 3 556.2814 486.3613 41.9 0.178 462 +464 3 556.278 485.2184 41.7631 0.178 463 +465 3 556.2139 484.0893 41.641 0.1907 464 +466 3 555.9794 482.9945 41.4739 0.178 465 +467 3 555.833 481.8814 41.3314 0.1525 466 +468 3 555.9131 480.7877 41.3039 0.1271 467 +469 3 555.9726 479.6918 41.249 0.1271 468 +470 3 555.9726 478.5764 41.0827 0.1398 469 +471 3 555.889 477.4713 40.8475 0.1525 470 +472 3 555.5035 476.4108 40.5882 0.1398 471 +473 3 555.1146 475.3549 40.3334 0.1398 472 +474 3 554.9956 474.2189 40.1296 0.1398 473 +475 3 554.9475 473.076 39.9994 0.1652 474 +476 3 554.9933 471.9423 39.9529 0.1652 475 +477 3 555.2084 470.8349 39.9963 0.1652 476 +478 3 555.3628 469.7207 40.0498 0.1398 477 +479 3 555.3628 468.5904 40.0011 0.1398 478 +480 3 555.3742 467.4601 39.8656 0.1398 479 +481 3 555.4234 466.3344 39.6595 0.1652 480 +482 3 555.5024 465.2065 39.4162 0.178 481 +483 3 555.6511 464.0808 39.2196 0.2034 482 +484 3 555.8788 462.9791 39.1373 0.2161 483 +485 3 556.1224 461.8728 39.0908 0.2288 484 +486 3 556.2723 460.762 38.967 0.2161 485 +487 3 556.1979 459.6432 38.7778 0.2034 486 +488 3 555.8387 458.5873 38.5885 0.1907 487 +489 3 555.2152 457.6389 38.3729 0.1907 488 +490 3 554.7062 456.639 38.0878 0.178 489 +491 3 554.2749 455.6003 37.7902 0.1525 490 +492 3 553.9031 454.5181 37.5483 0.1525 491 +493 3 553.7177 453.4152 37.3425 0.1652 492 +494 3 553.8584 452.2793 37.1529 0.2034 493 +495 3 553.9134 451.1593 36.9326 0.1907 494 +496 3 553.6159 450.1091 36.64 0.178 495 +497 3 553.14 449.0875 36.3163 0.1525 496 +498 3 552.9432 447.987 35.9682 0.1525 497 +499 3 552.9021 446.8658 35.6006 0.1525 498 +500 3 552.8357 445.7459 35.2374 0.1398 499 +501 3 552.5989 444.6545 34.9194 0.1271 500 +502 3 552.0841 443.6421 34.6853 0.1271 501 +503 3 551.5087 442.6697 34.5778 0.1525 502 +504 3 551.0328 441.6572 34.6024 0.1907 503 +505 3 551.011 440.583 34.6648 0.2034 504 +506 3 551.4137 439.5237 34.6688 0.1907 505 +507 3 551.6665 438.4414 34.585 0.1525 506 +508 3 551.6997 437.3054 34.4501 0.1271 507 +509 3 551.6951 436.1626 34.2913 0.1144 508 +510 3 551.6208 435.0232 34.1312 0.1144 509 +511 3 551.5007 433.886 33.9886 0.1144 510 +512 3 551.3748 432.7489 33.8604 0.1271 511 +513 3 551.2627 431.6095 33.7336 0.1525 512 +514 3 551.1151 430.4769 33.5818 0.178 513 +515 3 550.645 429.4988 33.3393 0.178 514 +516 3 550.0066 428.6007 32.9963 0.1525 515 +517 3 549.4563 427.6261 32.62 0.1271 516 +518 3 549.0617 426.5633 32.2622 0.1144 517 +519 3 548.9381 425.4376 31.9659 0.1271 518 +520 3 548.8168 424.3016 31.7402 0.1652 519 +521 3 548.4187 423.264 31.5204 0.2288 520 +522 3 547.722 422.3968 31.2892 0.2669 521 +523 3 546.9155 421.5937 31.1058 0.2669 522 +524 3 546.3515 420.6396 31.0344 0.2288 523 +525 3 546.1994 419.5414 31.0436 0.2161 524 +526 3 546.0873 418.4134 31.0072 0.2034 525 +527 3 545.7727 417.4113 30.7992 0.2161 526 +528 3 545.5072 416.3325 30.6012 0.2161 527 +529 3 545.2682 415.2228 30.4349 0.2288 528 +530 3 544.8986 414.1577 30.1941 0.2161 529 +531 3 544.4536 413.1213 29.8609 0.2034 530 +532 3 543.9651 412.1066 29.465 0.2034 531 +533 3 543.1071 411.538 28.9722 0.2161 532 +534 3 542.0512 411.4202 28.3657 0.2161 533 +535 3 541.0731 410.9156 27.7629 0.1907 534 +536 3 540.1442 410.259 27.2133 0.1525 535 +537 3 539.6054 409.298 26.6565 0.1271 536 +538 3 538.6776 408.7352 26.106 0.1144 537 +539 3 537.5439 408.6963 25.6006 0.1144 538 +540 3 536.4113 408.6597 25.1358 0.1144 539 +541 3 535.344 408.654 24.611 0.1144 540 +542 3 534.296 408.654 23.31 0.1271 541 +543 3 557.4094 494.2595 45.4454 0.178 456 +544 3 558.1565 493.5491 46.8247 0.178 543 +545 3 558.9058 492.8295 47.4376 0.2034 544 +546 3 559.6379 492.0333 48.1138 0.2542 545 +547 3 560.2889 491.1078 48.7172 0.2796 546 +548 3 560.9776 490.1983 49.2492 0.2542 547 +549 3 561.7932 489.4375 49.7694 0.2161 548 +550 3 562.5792 488.6825 50.3012 0.178 549 +551 3 563.2095 487.773 50.8194 0.1652 550 +552 3 563.5538 486.7377 51.3467 0.1398 551 +553 3 563.603 485.6131 51.8176 0.1271 552 +554 3 563.531 484.4737 52.1987 0.1271 553 +555 3 563.3411 483.3549 52.5176 0.1525 554 +556 3 563.0894 482.2452 52.7794 0.178 555 +557 3 562.7874 481.1527 52.9178 0.178 556 +558 3 562.9784 480.0796 53.0947 0.1652 557 +559 3 562.8674 478.947 53.2409 0.1525 558 +560 3 562.7336 477.8122 53.3613 0.1652 559 +561 3 562.8686 476.6876 53.4584 0.1652 560 +562 3 563.1248 475.5734 53.5433 0.178 561 +563 3 563.4108 474.466 53.6278 0.178 562 +564 3 563.7186 473.3643 53.7062 0.1907 563 +565 3 563.9657 472.2489 53.814 0.178 564 +566 3 564.0572 471.1255 53.9907 0.1652 565 +567 3 564.1007 469.9987 54.2371 0.1652 566 +568 3 564.4141 468.9245 54.4477 0.178 567 +569 3 564.8294 467.8697 54.6084 0.1907 568 +570 3 565.3637 466.8767 54.831 0.2034 569 +571 3 565.9974 465.9546 55.1583 0.2161 570 +572 3 566.7468 465.1641 55.6074 0.2161 571 +573 3 567.3725 464.2558 56.131 0.178 572 +574 3 567.845 463.2319 56.6846 0.1398 573 +575 3 568.2008 462.1646 57.2625 0.1144 574 +576 3 568.4902 461.0812 57.8544 0.1144 575 +577 3 568.5749 459.9727 58.4623 0.1144 576 +578 3 568.5142 458.8607 59.0862 0.1271 577 +579 3 568.6446 457.7487 59.7055 0.1398 578 +580 3 568.7602 456.8095 60.4629 0.1525 579 +581 3 568.2866 455.844 61.2128 0.1398 580 +582 3 568.2294 454.7526 61.9382 0.1271 581 +583 3 568.9901 454.0822 62.5439 0.1144 582 +584 3 567.9525 453.8442 63.1308 0.1144 583 +585 3 567.3576 453.0046 63.6619 0.1144 584 +586 3 567.2844 451.8846 64.1348 0.1144 585 +587 3 567.472 450.7932 64.6274 0.1271 586 +588 3 567.8324 449.7121 65.1006 0.1398 587 +589 3 568.0669 448.6024 65.5628 0.1525 588 +590 3 568.0887 447.5454 66.1371 0.1398 589 +591 3 568.1802 446.4906 66.8248 0.1271 590 +592 3 568.155 445.4164 67.5797 0.1144 591 +593 3 567.8519 444.3651 68.348 0.1144 592 +594 3 567.5144 443.3172 69.1118 0.1144 593 +595 3 567.1769 442.2693 69.8527 0.1144 594 +596 3 566.8394 441.2214 70.5538 0.1144 595 +597 3 566.4974 440.1712 71.2166 0.1144 596 +598 3 566.0809 439.1095 71.7816 0.1144 597 +599 3 565.6554 438.0479 72.2579 0.1144 598 +600 3 565.6314 436.9336 72.7359 0.1144 599 +601 3 566.1702 436.0219 73.2906 0.1144 600 +602 3 566.7101 435.109 73.8912 0.1271 601 +603 3 567.249 434.1972 75.3234 0.1398 602 +604 3 556.8363 500.8203 44.7846 0.2161 451 +605 3 556.0481 501.6371 45.2312 0.178 604 +606 3 555.1638 502.3453 45.3611 0.1652 605 +607 3 554.8549 503.1587 45.5963 0.1652 606 +608 3 555.1546 504.1951 45.981 0.1907 607 +609 3 555.4452 505.2465 46.4778 0.1907 608 +610 3 554.9327 506.1788 46.8586 0.2161 609 +611 3 554.6764 507.2565 47.3334 0.2415 610 +612 3 554.1559 508.1888 47.9343 0.2415 611 +613 3 553.6102 509.1635 48.5094 0.1907 612 +614 3 553.7566 510.105 49.1456 0.1525 613 +615 3 554.5815 510.4883 49.9929 0.1398 614 +616 3 554.8983 511.3337 50.9891 0.1525 615 +617 3 554.8091 512.4285 51.9672 0.1525 616 +618 3 554.1719 513.0074 52.9211 0.1525 617 +619 3 553.148 512.9376 53.9129 0.1525 618 +620 3 552.2065 512.8277 54.9794 0.1652 619 +621 3 551.2215 513.0508 56.0045 0.178 620 +622 3 550.1485 513.3997 56.896 0.1907 621 +623 3 549.1555 513.6514 57.7948 0.1652 622 +624 3 548.1362 513.7155 58.7093 0.1398 623 +625 3 547.3697 514.1536 59.6702 0.1144 624 +626 3 546.7462 514.9968 60.5626 0.1271 625 +627 3 546.0621 515.9074 61.2629 0.1525 626 +628 3 545.4581 516.8626 61.8397 0.178 627 +629 3 544.5703 517.7447 62.235 0.1398 628 +630 3 543.7741 518.566 62.4949 0.1271 629 +631 3 542.9355 519.3222 62.6895 0.1144 630 +632 3 542.1485 520.0327 62.9633 0.1144 631 +633 3 541.2138 520.6813 63.1467 0.1144 632 +634 3 540.2632 521.2762 63.2954 0.1144 633 +635 3 539.3868 521.9283 63.5286 0.1144 634 +636 3 538.3584 522.4145 63.723 0.1271 635 +637 3 537.2945 522.8046 63.8288 0.1525 636 +638 3 536.1814 523.0471 63.9033 0.178 637 +639 3 535.0843 523.2873 64.041 0.178 638 +640 3 534.0512 523.6683 64.2561 0.1525 639 +641 3 533.1132 524.2597 64.468 0.1271 640 +642 3 532.4656 525.1601 64.5789 0.1144 641 +643 3 531.7575 525.9426 64.601 0.1144 642 +644 3 530.6787 526.2926 64.5837 0.1271 643 +645 3 529.5587 526.4928 64.5098 0.1525 644 +646 3 528.5658 526.9642 64.4305 0.178 645 +647 3 527.8176 527.7798 64.3286 0.178 646 +648 3 527.1804 528.6733 64.3182 0.1525 647 +649 3 526.7285 529.6869 64.4319 0.1271 648 +650 3 525.8202 530.141 64.6299 0.1144 649 +651 3 524.8626 530.6604 64.731 0.1271 650 +652 3 524.0286 531.4372 64.808 0.1398 651 +653 3 523.4223 532.3936 64.9284 0.1652 652 +654 3 522.8629 533.3889 65.1557 0.1907 653 +655 3 546.0232 517.2402 64.064 0.1525 628 +656 3 546.7405 517.6772 66.9514 0.1271 655 +657 3 547.4589 518.1153 68.182 0.1144 656 +658 3 548.1762 518.5523 69.6413 0.1144 657 +659 3 548.8935 518.9893 71.2522 0.1144 658 +660 3 549.4449 519.7547 72.8899 0.1144 659 +661 3 549.954 520.5989 74.4971 0.1144 660 +662 3 550.4642 521.4421 76.0399 0.1144 661 +663 3 550.9733 522.2863 77.5701 0.1144 662 +664 3 551.4835 523.1306 79.0642 0.1144 663 +665 3 552.1138 523.7152 80.5616 0.1144 664 +666 3 552.7556 524.2746 82.0341 0.1144 665 +667 3 553.3974 524.8352 83.4414 0.1271 666 +668 3 554.0392 525.3946 86.2926 0.1398 667 +669 3 553.0679 525.906 40.4029 0.1144 1 +670 3 553.7566 526.8006 40.9788 0.1144 669 +671 3 554.6226 527.5316 41.2023 0.1271 670 +672 3 555.7209 527.67 41.4268 0.1525 671 +673 3 556.826 527.6769 41.7424 0.1907 672 +674 3 557.7114 527.9182 42.2576 0.2161 673 +675 3 558.4722 528.7454 42.6135 0.2288 674 +676 3 559.4492 529.3196 42.9335 0.2161 675 +677 3 560.314 529.982 43.1043 0.1907 676 +678 3 561.1228 530.5163 43.3664 0.2161 677 +679 3 562.0003 530.9773 43.6428 0.178 678 +680 3 563.0711 531.1009 43.773 0.1652 679 +681 3 564.1258 531.2999 44.0331 0.178 680 +682 3 565.1783 531.6934 44.3646 0.178 681 +683 3 566.0466 532.4176 44.697 0.178 682 +684 3 566.5877 533.0594 45.2508 0.178 683 +685 3 567.607 532.9324 45.8436 0.1907 684 +686 3 567.9331 532.7345 46.3263 0.1652 685 +687 3 568.8529 532.1122 46.7107 0.1398 686 +688 3 569.8584 531.8067 46.8717 0.1398 687 +689 3 570.9464 531.7506 46.7956 0.1525 688 +690 3 572.0355 531.5768 46.5522 0.178 689 +691 3 573.0605 531.1855 46.2384 0.2034 690 +692 3 573.8201 530.6147 46.1294 0.2161 691 +693 3 574.7479 530.1147 46.1605 0.2288 692 +694 3 575.8473 529.8322 46.1972 0.2161 693 +695 3 576.973 529.7933 46.1768 0.1907 694 +696 3 578.0987 529.9214 46.1009 0.178 695 +697 3 579.1306 529.7338 45.8702 0.1907 696 +698 3 580.0858 529.1538 45.7472 0.2288 697 +699 3 580.9312 528.9101 45.6963 0.1525 698 +700 3 582.002 529.0474 45.7408 0.1652 699 +701 3 583.1082 529.1252 45.7027 0.178 700 +702 3 584.2442 529.0073 45.6674 0.1907 701 +703 3 585.3734 528.8369 45.656 0.178 702 +704 3 586.5071 528.6927 45.6151 0.1525 703 +705 3 587.6442 528.5749 45.5336 0.1271 704 +706 3 588.771 528.3896 45.432 0.1271 705 +707 3 589.8773 528.1036 45.3253 0.1652 706 +708 3 590.9618 527.7489 45.1772 0.2161 707 +709 3 592.0097 527.3245 44.9632 0.2542 708 +710 3 593.0164 526.8257 44.7009 0.2542 709 +711 3 594.0483 526.3441 44.4884 0.2415 710 +712 3 594.9292 525.8236 44.2005 0.2161 711 +713 3 595.8032 525.2447 43.8332 0.1907 712 +714 3 596.8912 525.0342 43.5274 0.1525 713 +715 3 597.9951 524.8192 43.272 0.1398 714 +716 3 598.9995 524.3307 43.0175 0.1525 715 +717 3 599.9628 523.7426 42.8425 0.178 716 +718 3 600.9123 523.1432 42.828 0.178 717 +719 3 601.8595 522.5357 42.8478 0.1652 718 +720 3 602.785 521.8745 42.842 0.178 719 +721 3 603.5927 521.0851 42.8879 0.2161 720 +722 3 604.3626 520.2477 42.9783 0.2669 721 +723 3 605.1531 519.4229 43.0542 0.2924 722 +724 3 605.9574 518.6084 43.1021 0.3178 723 +725 3 606.7753 517.8087 43.1371 0.3178 724 +726 3 607.6367 517.0571 43.155 0.3051 725 +727 3 608.5577 516.3822 43.1449 0.2542 726 +728 3 609.593 515.9177 43.127 0.2034 727 +729 3 610.6741 515.5425 43.115 0.1525 728 +730 3 611.7037 515.0517 43.1054 0.1271 729 +731 3 612.7001 514.49 43.0956 0.1398 730 +732 3 613.6359 513.8539 43.0422 0.1652 731 +733 3 614.5316 513.1709 42.9335 0.1907 732 +734 3 615.4526 512.5612 42.9156 0.1652 733 +735 3 616.5256 512.2821 42.9696 0.1525 734 +736 3 617.657 512.3576 43.0296 0.1652 735 +737 3 618.7965 512.4559 43.083 0.2288 736 +738 3 619.8913 512.1791 43.1276 0.2669 737 +739 3 620.8065 511.5156 43.1547 0.2669 738 +740 3 621.7972 510.9527 43.1561 0.2288 739 +741 3 622.8416 510.4871 43.1477 0.2034 740 +742 3 623.9273 510.1531 43.1102 0.178 741 +743 3 625.0324 509.9197 43.0326 0.1652 742 +744 3 626.1547 509.7206 42.989 0.1652 743 +745 3 627.2712 509.5468 43.0452 0.2034 744 +746 3 628.3512 509.247 43.1959 0.2415 745 +747 3 629.3464 508.7471 43.4216 0.2669 746 +748 3 630.3726 508.254 43.6218 0.2415 747 +749 3 631.4148 507.8056 43.727 0.2288 748 +750 3 632.4684 507.3743 43.7578 0.2161 749 +751 3 633.5289 506.9533 43.7436 0.2288 750 +752 3 634.5871 506.5243 43.7545 0.2161 751 +753 3 635.6327 506.0907 43.8371 0.2034 752 +754 3 636.6291 505.545 43.9723 0.1907 753 +755 3 637.6278 504.9925 44.1319 0.2034 754 +756 3 638.6712 504.5257 44.2736 0.2034 755 +757 3 639.7065 504.0395 44.3904 0.2034 756 +758 3 640.6228 503.3657 44.5026 0.178 757 +759 3 641.458 502.5912 44.6051 0.1907 758 +760 3 642.2405 501.7618 44.6958 0.2034 759 +761 3 642.8708 500.8112 44.7479 0.2161 760 +762 3 643.4199 499.8102 44.7353 0.178 761 +763 3 643.8981 498.7851 44.6365 0.1652 762 +764 3 644.5857 497.8791 44.5096 0.178 763 +765 3 645.3739 497.0497 44.3876 0.2288 764 +766 3 646.2662 496.3358 44.2739 0.2288 765 +767 3 647.1986 495.6735 44.1692 0.2161 766 +768 3 648.1218 494.9974 44.0698 0.178 767 +769 3 649.037 494.311 43.9662 0.178 768 +770 3 649.9419 493.636 43.7861 0.178 769 +771 3 650.8376 492.9736 43.5204 0.2034 770 +772 3 651.6316 492.1602 43.2541 0.2161 771 +773 3 652.4198 491.3377 43.0021 0.2288 772 +774 3 653.3899 490.8103 42.7221 0.2161 773 +775 3 654.4996 490.5426 42.5345 0.1907 774 +776 3 655.6367 490.4271 42.4388 0.1652 775 +777 3 656.5279 490.9648 42.3702 0.1525 776 +778 3 656.6526 490.0404 42.5253 0.1652 777 +779 3 657.4637 489.2899 42.7224 0.1652 778 +780 3 658.3205 488.536 42.8966 0.178 779 +781 3 659.1408 487.7444 43.0035 0.178 780 +782 3 659.8889 486.8978 43.0293 0.1907 781 +783 3 660.692 486.1062 43.0802 0.178 782 +784 3 661.5214 485.334 43.1771 0.1652 783 +785 3 662.2902 484.4909 43.2972 0.1525 784 +786 3 663.0224 483.6134 43.4403 0.1525 785 +787 3 663.7065 482.7074 43.6422 0.1398 786 +788 3 664.2888 481.7338 43.8808 0.1398 787 +789 3 664.6686 480.6619 44.0975 0.1398 788 +790 3 665.0244 479.5968 44.3456 0.1525 789 +791 3 665.4076 478.5661 44.6578 0.1398 790 +792 3 665.7474 477.4896 44.9296 0.1271 791 +793 3 666.3892 476.5687 45.1158 0.1144 792 +794 3 667.2826 475.864 45.2281 0.1271 793 +795 3 668.3751 475.6237 45.2743 0.1398 794 +796 3 669.5008 475.5093 45.225 0.1652 795 +797 3 670.6139 475.2988 45.1178 0.178 796 +798 3 671.7282 475.0506 45.0274 0.1907 797 +799 3 672.8253 474.784 45.0386 0.1907 798 +800 3 673.9304 474.5381 45.1335 0.178 799 +801 3 675.0595 474.3745 45.2522 0.178 800 +802 3 676.1944 474.2303 45.3757 0.178 801 +803 3 677.3086 473.9752 45.4835 0.2034 802 +804 3 678.4103 473.6675 45.5655 0.2161 803 +805 3 679.4616 473.2328 45.6509 0.2161 804 +806 3 680.4638 472.7855 45.8122 0.1907 805 +807 3 681.53 472.448 45.8553 0.1525 806 +808 3 682.65 472.3267 45.7755 0.1398 807 +809 3 683.5034 471.9057 45.8609 0.1525 808 +810 3 684.2653 471.09 45.8923 0.178 809 +811 3 684.9471 470.43 45.6182 0.1907 810 +812 3 685.8474 470.1039 44.3458 0.178 811 +813 3 581.3476 528.8735 46.6665 0.2669 698 +814 3 582.391 528.5978 47.5129 0.2034 813 +815 3 583.416 528.1951 47.8873 0.178 814 +816 3 584.4788 527.8222 48.2689 0.2034 815 +817 3 585.5919 527.575 48.5834 0.2288 816 +818 3 586.7141 527.3554 48.8233 0.2415 817 +819 3 587.8284 527.0969 49.0118 0.2161 818 +820 3 588.9404 526.8417 49.175 0.2034 819 +821 3 590.0477 526.6175 49.3674 0.178 820 +822 3 591.1609 526.4105 49.5855 0.1525 821 +823 3 592.2888 526.2343 49.7823 0.1398 822 +824 3 593.4203 526.0673 49.94 0.1652 823 +825 3 594.4739 525.684 50.104 0.2288 824 +826 3 595.4795 525.1967 50.2824 0.2669 825 +827 3 596.5651 524.9015 50.3521 0.2796 826 +828 3 597.6759 524.6647 50.3068 0.2415 827 +829 3 598.7822 524.5835 50.1371 0.2415 828 +830 3 599.79 524.1888 49.8585 0.2288 829 +831 3 600.4478 523.3388 49.7017 0.2542 830 +832 3 601.2784 522.5769 49.6034 0.2542 831 +833 3 602.2657 522.0061 49.5054 0.2796 832 +834 3 603.2827 521.5725 49.32 0.2924 833 +835 3 604.1018 520.7957 49.1218 0.2796 834 +836 3 604.7333 519.8439 48.9454 0.2288 835 +837 3 605.3064 518.8543 48.7724 0.178 836 +838 3 605.8727 517.8602 48.6102 0.178 837 +839 3 606.3692 516.8523 48.3969 0.2161 838 +840 3 606.8691 515.8376 48.1608 0.2415 839 +841 3 607.3908 514.8217 47.9718 0.2161 840 +842 3 608.0028 513.8562 47.784 0.178 841 +843 3 608.6629 512.9261 47.5776 0.1525 842 +844 3 609.0107 511.8393 47.376 0.1525 843 +845 3 609.5243 510.8646 47.08 0.1398 844 +846 3 610.4121 510.2892 46.676 0.1271 845 +847 3 611.1751 509.4655 46.3904 0.1144 846 +848 3 611.6465 508.4314 46.1376 0.1144 847 +849 3 612.0812 507.4338 45.8335 0.1144 848 +850 3 612.9129 506.7542 45.5112 0.1144 849 +851 3 613.8189 506.2166 45.274 0.1144 850 +852 3 614.4218 505.2682 45.2012 0.1144 851 +853 3 615.1528 504.4228 45.2029 0.1144 852 +854 3 616.0657 503.7329 45.2203 0.1271 853 +855 3 616.9523 503.0111 45.2424 0.1525 854 +856 3 617.8092 502.2549 45.243 0.178 855 +857 3 618.7496 501.6223 45.1965 0.178 856 +858 3 619.7986 501.1681 45.0932 0.178 857 +859 3 620.8145 500.6499 44.9425 0.178 858 +860 3 621.7915 500.0573 44.7429 0.1907 859 +861 3 622.6872 499.4475 44.4234 0.178 860 +862 3 623.289 498.5975 43.9348 0.178 861 +863 3 623.909 497.6926 43.3868 0.178 862 +864 3 624.8173 497.1458 42.8056 0.1907 863 +865 3 625.8607 496.782 42.2162 0.1907 864 +866 3 626.9269 496.401 41.6945 0.2034 865 +867 3 627.9416 495.9263 41.3375 0.2034 866 +868 3 628.6303 495.1106 41.0203 0.2034 867 +869 3 629.4242 494.4528 40.6118 0.1907 868 +870 3 630.1106 493.6566 40.1478 0.2034 869 +871 3 630.614 492.6762 39.6768 0.2161 870 +872 3 631.2649 491.7576 39.3086 0.2288 871 +873 3 632.0028 490.8858 39.0695 0.2288 872 +874 3 632.8997 490.196 38.9124 0.2288 873 +875 3 633.8412 489.5931 38.7705 0.2288 874 +876 3 634.737 488.9239 38.6316 0.2161 875 +877 3 635.5709 488.2867 38.687 0.2161 876 +878 3 636.239 487.4836 38.913 0.2034 877 +879 3 636.9117 486.5798 39.128 0.2288 878 +880 3 637.5947 485.6623 39.2899 0.2161 879 +881 3 638.2365 484.746 39.34 0.2415 880 +882 3 638.8931 483.8296 39.3064 0.2415 881 +883 3 639.5967 482.9316 39.263 0.2796 882 +884 3 640.2545 481.9958 39.2515 0.2669 883 +885 3 640.6961 480.9502 39.3252 0.2288 884 +886 3 641.5014 480.3324 39.5942 0.178 885 +887 3 641.8584 479.2799 39.9255 0.1652 886 +888 3 642.1993 478.2057 40.269 0.2034 887 +889 3 642.7049 477.1807 40.5185 0.2415 888 +890 3 643.2163 476.158 40.6686 0.2542 889 +891 3 643.7219 475.1455 40.7764 0.2288 890 +892 3 644.2836 474.1548 40.8092 0.1907 891 +893 3 645.0055 473.2842 40.6904 0.1652 892 +894 3 645.7537 472.4411 40.4463 0.1525 893 +895 3 646.5305 471.6334 40.103 0.1525 894 +896 3 647.4045 470.9493 39.6777 0.1525 895 +897 3 648.3288 470.3419 39.1975 0.1652 896 +898 3 649.061 469.4839 38.7433 0.178 897 +899 3 649.7577 468.5916 38.3457 0.1907 898 +900 3 650.4509 467.6855 38.0355 0.178 899 +901 3 651.1511 466.784 37.805 0.1652 900 +902 3 651.8935 465.9123 37.6625 0.178 901 +903 3 652.6692 465.0726 37.5838 0.2034 902 +904 3 653.605 464.4137 37.5441 0.2288 903 +905 3 654.5076 463.7112 37.5281 0.2034 904 +906 3 655.1722 462.78 37.5234 0.178 905 +907 3 567.9251 532.6693 48.9927 0.2034 685 +908 3 568.528 532.4165 51.5194 0.2161 907 +909 3 569.1297 532.1636 52.6394 0.2034 908 +910 3 569.7314 531.9108 53.9342 0.2161 909 +911 3 570.6718 531.8262 55.0164 0.2669 910 +912 3 571.3067 531.8948 58.0194 0.2034 911 +913 3 570.9407 531.857 60.5021 0.2034 912 +914 3 570.7919 530.9968 61.5336 0.178 913 +915 3 571.3491 530.252 62.6783 0.1525 914 +916 3 571.5721 530.5426 63.9587 0.1271 915 +917 3 572.4256 531.0219 65.0832 0.1144 916 +918 3 573.1955 531.8273 66.0402 0.1398 917 +919 3 573.6336 532.8546 66.836 0.178 918 +920 3 573.6851 533.9883 67.4943 0.2288 919 +921 3 573.8842 535.1037 68.0694 0.2288 920 +922 3 574.423 535.9857 68.6199 0.2034 921 +923 3 575.2924 536.083 69.2793 0.1652 922 +924 3 576.2362 536.4662 69.9093 0.1525 923 +925 3 577.2315 536.7842 70.6037 0.1525 924 +926 3 578.3309 536.9902 71.2956 0.1398 925 +927 3 579.4314 536.862 71.9785 0.1271 926 +928 3 580.4473 537.0302 72.7275 0.1144 927 +929 3 581.5421 537.1458 73.458 0.1144 928 +930 3 582.6415 537.2556 74.1754 0.1144 929 +931 3 583.742 537.3654 74.8726 0.1144 930 +932 3 584.8643 537.3906 75.5317 0.1144 931 +933 3 585.9957 537.2247 76.0967 0.1144 932 +934 3 587.126 537.0519 76.6226 0.1144 933 +935 3 588.2311 537.0497 77.224 0.1144 934 +936 3 589.2401 537.1995 77.9573 0.1144 935 +937 3 590.2491 537.3505 78.7727 0.1144 936 +938 3 591.257 537.5015 79.6264 0.1271 937 +939 3 592.266 537.6525 81.5186 0.1652 938 +940 3 571.8135 532.4885 55.8093 0.2034 911 +941 3 572.3501 533.4655 56.4564 0.2034 940 +942 3 572.4954 534.5672 57.008 0.2288 941 +943 3 572.4542 535.6757 57.5165 0.2161 942 +944 3 572.5503 536.7717 57.9858 0.2415 943 +945 3 572.8843 537.8047 58.5511 0.2288 944 +946 3 573.1783 538.8091 59.2312 0.2669 945 +947 3 573.7057 539.7552 59.8788 0.2669 946 +948 3 574.3544 540.659 60.4923 0.2669 947 +949 3 574.8714 541.6348 61.1237 0.2161 948 +950 3 575.4766 542.5683 61.7641 0.1652 949 +951 3 576.0772 543.5304 62.3633 0.1271 950 +952 3 576.2751 544.5474 62.9815 0.1144 951 +953 3 576.4216 545.585 63.7006 0.1144 952 +954 3 576.5691 546.6238 64.4809 0.1144 953 +955 3 576.7156 547.6614 65.2834 0.1144 954 +956 3 576.862 548.699 66.0786 0.1144 955 +957 3 577.2338 549.7034 66.7624 0.1144 956 +958 3 577.8436 550.6713 67.2521 0.1144 957 +959 3 578.4533 551.6391 67.5828 0.1144 958 +960 3 579.0631 552.6069 67.7998 0.1144 959 +961 3 579.6728 553.5747 67.9459 0.1144 960 +962 3 580.262 554.5208 68.1044 0.1271 961 +963 3 580.8397 555.4578 68.3525 0.1525 962 +964 3 581.4735 556.4027 68.581 0.178 963 +965 3 581.8601 557.4243 68.7406 0.178 964 +966 3 581.9173 558.51 68.9391 0.1525 965 +967 3 581.9173 559.5075 69.3739 0.1271 966 +968 3 581.9208 560.4307 70.0288 0.1144 967 +969 3 582.2651 561.3883 70.5944 0.1144 968 +970 3 582.852 562.2909 71.2135 0.1144 969 +971 3 583.4423 563.1923 71.8502 0.1144 970 +972 3 584.1012 564.0629 72.4346 0.1144 971 +973 3 585.1194 564.5766 72.8067 0.1144 972 +974 3 586.1421 565.088 73.022 0.1144 973 +975 3 587.166 565.5959 73.1444 0.1144 974 +976 3 588.1887 566.1061 73.1923 0.1144 975 +977 3 589.2126 566.614 73.2046 0.1144 976 +978 3 590.1988 567.1941 73.2365 0.1144 977 +979 3 590.9618 568.0338 73.3583 0.1144 978 +980 3 591.726 568.8734 73.5437 0.1144 979 +981 3 592.4902 569.7131 73.768 0.1144 980 +982 3 593.2544 570.5528 74.0093 0.1398 981 +983 3 594.0186 571.3925 74.5368 0.1652 982 +984 3 560.1676 531.2095 43.0066 0.2415 677 +985 3 560.5531 532.0275 44.1543 0.2288 984 +986 3 561.5759 532.4737 44.5936 0.2034 985 +987 3 562.7096 532.4931 45.0092 0.1652 986 +988 3 563.8193 532.5892 45.4194 0.1652 987 +989 3 564.9061 532.5835 45.808 0.1907 988 +990 3 565.9654 533.0022 46.0872 0.2161 989 +991 3 567.0305 533.3488 46.1952 0.2288 990 +992 3 568.0338 533.7115 46.1079 0.2161 991 +993 3 569.0714 534.0958 45.9855 0.2034 992 +994 3 569.6994 534.9001 45.953 0.178 993 +995 3 570.0277 535.9629 45.9836 0.178 994 +996 3 570.9029 536.5131 46.1594 0.178 995 +997 3 571.9817 536.8071 46.3966 0.1907 996 +998 3 573.0147 537.2785 46.6346 0.178 997 +999 3 573.7103 537.7921 47.0666 0.178 998 +1000 3 574.2708 538.5986 47.3984 0.2034 999 +1001 3 574.9012 539.4875 47.7582 0.2415 1000 +1002 3 575.718 540.2597 48.0091 0.2542 1001 +1003 3 576.838 540.4828 48.2387 0.2161 1002 +1004 3 577.9797 540.4862 48.466 0.178 1003 +1005 3 579.0859 540.5503 48.7869 0.1398 1004 +1006 3 580.1201 540.6761 49.2758 0.1271 1005 +1007 3 581.2115 540.961 49.7767 0.1271 1006 +1008 3 582.2971 541.3133 50.2317 0.1652 1007 +1009 3 583.3977 541.5124 50.7016 0.2034 1008 +1010 3 584.4616 541.525 51.2406 0.2288 1009 +1011 3 585.5495 541.6577 51.7656 0.2161 1010 +1012 3 586.6329 542.0283 52.18 0.2034 1011 +1013 3 587.7071 542.4173 52.5294 0.178 1012 +1014 3 588.7447 542.9001 52.8399 0.1652 1013 +1015 3 589.7823 543.3497 53.1454 0.1525 1014 +1016 3 590.8199 543.6425 53.5727 0.1652 1015 +1017 3 591.8026 544.0315 54.1036 0.1652 1016 +1018 3 592.6057 544.8106 54.6661 0.1652 1017 +1019 3 593.5358 545.386 55.2577 0.1525 1018 +1020 3 594.6489 545.6011 55.7973 0.1525 1019 +1021 3 595.7346 545.7715 56.3097 0.1525 1020 +1022 3 596.6818 546.3058 56.8313 0.1398 1021 +1023 3 597.6977 546.713 57.3409 0.1398 1022 +1024 3 598.7971 546.9395 57.8001 0.1398 1023 +1025 3 599.9056 547.2038 58.1434 0.1525 1024 +1026 3 601.0027 547.499 58.3464 0.1398 1025 +1027 3 602.0986 547.801 58.4962 0.1271 1026 +1028 3 603.1854 548.0858 58.6642 0.1144 1027 +1029 3 604.3054 548.262 58.8157 0.1271 1028 +1030 3 605.4483 548.3192 58.9215 0.1398 1029 +1031 3 606.59 548.3421 58.9966 0.1525 1030 +1032 3 607.7317 548.2631 59.043 0.1398 1031 +1033 3 608.87 548.159 59.0542 0.1271 1032 +1034 3 610.0014 548.1968 59.036 0.1144 1033 +1035 3 611.1076 548.4885 59.0041 0.1271 1034 +1036 3 612.223 548.7082 58.9537 0.1398 1035 +1037 3 613.3556 548.7791 58.8622 0.1525 1036 +1038 3 614.4882 548.874 58.7583 0.1398 1037 +1039 3 615.6184 549.0296 58.6757 0.1271 1038 +1040 3 616.7384 549.2298 58.6496 0.1271 1039 +1041 3 617.8344 549.5215 58.7345 0.1525 1040 +1042 3 618.8891 549.8968 58.9173 0.178 1041 +1043 3 619.8386 550.4848 59.1914 0.178 1042 +1044 3 620.7584 551.1323 59.4941 0.1525 1043 +1045 3 621.6496 551.845 59.7551 0.1271 1044 +1046 3 622.582 552.5028 59.953 0.1144 1045 +1047 3 623.5635 553.0885 60.0704 0.1144 1046 +1048 3 624.5245 553.6971 60.1073 0.1144 1047 +1049 3 625.4694 554.3172 60.0832 0.1144 1048 +1050 3 626.4624 554.8686 60.109 0.1144 1049 +1051 3 627.4748 555.3571 60.2367 0.1144 1050 +1052 3 628.4987 555.8364 60.4318 0.1144 1051 +1053 3 629.5546 556.2357 60.6584 0.1271 1052 +1054 3 630.6758 556.4393 60.8773 0.1525 1053 +1055 3 631.8118 556.5652 61.063 0.178 1054 +1056 3 632.9477 556.6887 61.192 0.2034 1055 +1057 3 634.086 556.8077 61.2584 0.2034 1056 +1058 3 635.214 556.9804 61.278 0.2161 1057 +1059 3 636.318 557.279 61.2646 0.1907 1058 +1060 3 637.3979 557.6531 61.2237 0.178 1059 +1061 3 638.4367 558.1256 61.1514 0.1525 1060 +1062 3 639.4617 558.6198 61.0464 0.1652 1061 +1063 3 640.5393 558.9778 60.9132 0.1907 1062 +1064 3 641.6513 559.2078 60.7684 0.2034 1063 +1065 3 642.785 559.3142 60.6533 0.2034 1064 +1066 3 643.929 559.3142 60.5962 0.178 1065 +1067 3 645.0684 559.2558 60.6015 0.1907 1066 +1068 3 646.1953 559.0659 60.6746 0.1907 1067 +1069 3 647.3175 558.9184 60.8149 0.2288 1068 +1070 3 648.4512 558.9355 61.0182 0.2161 1069 +1071 3 649.5815 558.9515 61.2654 0.2161 1070 +1072 3 650.7003 558.9573 61.5546 0.1652 1071 +1073 3 651.8215 558.9435 61.8195 0.1525 1072 +1074 3 652.9529 558.9035 61.9581 0.1652 1073 +1075 3 654.082 558.8143 62.0158 0.2161 1074 +1076 3 655.194 558.6026 62.0959 0.2415 1075 +1077 3 656.2796 558.296 62.2009 0.2288 1076 +1078 3 657.3893 558.0512 62.2874 0.1907 1077 +1079 3 658.5184 558.0661 62.4252 0.178 1078 +1080 3 659.6498 558.1015 62.6046 0.1652 1079 +1081 3 660.7893 558.002 62.776 0.1652 1080 +1082 3 661.8612 557.7458 62.9955 0.1398 1081 +1083 3 662.5144 556.9987 63.2862 0.1398 1082 +1084 3 663.3438 556.3329 63.5631 0.1398 1083 +1085 3 664.4512 556.1728 63.7241 0.1525 1084 +1086 3 665.5506 556.1602 63.6644 0.1398 1085 +1087 3 666.571 556.3078 63.3578 0.1271 1086 +1088 3 667.5892 556.7585 62.9812 0.1144 1087 +1089 3 668.6955 556.675 62.6175 0.1271 1088 +1090 3 669.7319 556.2014 62.2947 0.1398 1089 +1091 3 670.7192 555.6431 61.9758 0.1525 1090 +1092 3 671.695 555.1489 61.6084 0.1525 1091 +1093 3 672.6949 554.6478 61.2424 0.1525 1092 +1094 3 673.7073 554.1422 60.8952 0.1525 1093 +1095 3 674.7964 553.8024 60.6124 0.1398 1094 +1096 3 675.9084 553.5347 60.4069 0.1271 1095 +1097 3 676.9792 553.1354 60.2714 0.1271 1096 +1098 3 677.9607 552.5497 60.1905 0.1525 1097 +1099 3 678.8896 551.8828 60.1496 0.178 1098 +1100 3 679.6813 551.0659 60.0944 0.178 1099 +1101 3 680.7017 550.6896 59.9466 0.1652 1100 +1102 3 681.8332 550.5386 59.8399 0.1525 1101 +1103 3 682.9371 550.2514 59.8156 0.1652 1102 +1104 3 684.0159 550.2091 60.265 0.178 1103 +1105 3 546.7691 525.0811 43.0937 0.2034 1 +1106 3 545.6846 525.4266 43.3272 0.2034 1105 +1107 3 544.7602 526.097 43.4095 0.2034 1106 +1108 3 543.638 526.3212 43.4997 0.2034 1107 +1109 3 543.3062 526.1119 43.6803 0.2542 1108 +1110 3 542.3956 525.5227 43.899 0.2924 1109 +1111 3 541.4106 524.9919 44.0118 0.3051 1110 +1112 3 540.3741 524.6087 44.1294 0.3051 1111 +1113 3 539.5047 524.111 44.3946 0.2924 1112 +1114 3 538.5963 523.6466 44.7476 0.2542 1113 +1115 3 537.4787 523.6557 45.059 0.2034 1114 +1116 3 536.3552 523.8708 45.3124 0.1652 1115 +1117 3 535.2364 523.8159 45.5221 0.178 1116 +1118 3 534.1885 523.3857 45.6722 0.2288 1117 +1119 3 533.1726 522.8629 45.7794 0.2924 1118 +1120 3 532.1762 522.3687 45.9472 0.3178 1119 +1121 3 531.126 522.0301 46.1874 0.3051 1120 +1122 3 530.069 521.6365 46.3778 0.2669 1121 +1123 3 529.1275 521.0325 46.4551 0.2288 1122 +1124 3 528.1859 520.4262 46.5587 0.2161 1123 +1125 3 527.1689 519.9514 46.683 0.2288 1124 +1126 3 526.264 519.3382 46.8289 0.2796 1125 +1127 3 525.2447 519.0248 46.9899 0.3178 1126 +1128 3 524.1819 518.7674 46.9322 0.3178 1127 +1129 3 523.118 518.7445 46.6281 0.2669 1128 +1130 3 521.823 518.542 45.9365 0.3686 1129 +1131 3 520.8552 518.5157 45.1847 0.3051 1130 +1132 3 519.7821 518.4837 44.4909 0.2415 1131 +1133 3 518.7537 518.3167 44.0112 0.2288 1132 +1134 3 517.6703 518.0924 43.8421 0.2669 1133 +1135 3 516.7036 517.692 43.9636 0.3178 1134 +1136 3 515.7495 517.1441 44.1294 0.3178 1135 +1137 3 514.6707 516.7986 44.2781 0.2924 1136 +1138 3 513.6366 517.0125 44.2907 0.2669 1137 +1139 3 512.5978 517.4118 44.3808 0.2796 1138 +1140 3 511.4984 517.5902 44.5556 0.2924 1139 +1141 3 510.3762 517.7126 44.7779 0.3178 1140 +1142 3 509.6062 518.4185 45.1366 0.3432 1141 +1143 3 508.5881 518.8806 45.4874 0.3559 1142 +1144 3 507.5184 519.0488 45.6316 0.3559 1143 +1145 3 506.4065 519.1666 45.6506 0.3305 1144 +1146 3 505.3197 519.0877 45.6669 0.3305 1145 +1147 3 504.4113 519.559 45.8604 0.3178 1146 +1148 3 503.4206 520.1185 46.0463 0.2924 1147 +1149 3 502.391 520.5806 46.2927 0.2415 1148 +1150 3 501.4038 520.925 46.5041 0.2161 1149 +1151 3 500.4131 520.7248 46.65 0.2288 1150 +1152 3 499.4944 520.9936 46.9927 0.2542 1151 +1153 3 498.8606 521.656 47.2959 0.2669 1152 +1154 3 497.9237 521.9443 47.488 0.2796 1153 +1155 3 496.8014 521.9832 47.7218 0.2924 1154 +1156 3 495.8107 522.1594 48.1029 0.3178 1155 +1157 3 494.9527 522.7016 48.3412 0.3178 1156 +1158 3 493.8579 522.7439 48.5313 0.3305 1157 +1159 3 492.7734 522.84 48.5741 0.3178 1158 +1160 3 491.9017 523.1363 48.8144 0.3305 1159 +1161 3 490.9499 523.7426 48.9392 0.3178 1160 +1162 3 490.0278 524.4188 49.0412 0.3051 1161 +1163 3 489.2099 525.2035 49.1554 0.2669 1162 +1164 3 488.4983 526.0695 49.3027 0.2415 1163 +1165 3 487.5728 526.6427 49.5653 0.2288 1164 +1166 3 486.5935 527.0557 49.7972 0.2288 1165 +1167 3 485.6154 527.5785 49.9621 0.2415 1166 +1168 3 484.7551 528.2958 50.1813 0.2415 1167 +1169 3 484.19 529.2556 50.4619 0.2288 1168 +1170 3 483.3583 529.9088 50.7979 0.1907 1169 +1171 3 482.2898 530.117 51.1932 0.1652 1170 +1172 3 481.1836 530.2795 51.606 0.1525 1171 +1173 3 480.0704 530.5208 51.9509 0.1652 1172 +1174 3 478.9596 530.7966 52.2035 0.178 1173 +1175 3 477.954 531.3216 52.3821 0.1907 1174 +1176 3 476.9794 531.9188 52.507 0.178 1175 +1177 3 475.9326 532.3512 52.64 0.1652 1176 +1178 3 474.8641 532.7299 52.8007 0.1652 1177 +1179 3 473.7567 532.9896 52.9631 0.1652 1178 +1180 3 472.6367 533.2138 53.1126 0.1652 1179 +1181 3 471.5591 533.5856 53.2291 0.1525 1180 +1182 3 470.5158 534.0535 53.3016 0.1525 1181 +1183 3 469.4656 534.5088 53.3308 0.1652 1182 +1184 3 468.4062 534.9378 53.3254 0.1652 1183 +1185 3 467.3354 535.3417 53.2938 0.178 1184 +1186 3 466.2544 535.7169 53.237 0.1652 1185 +1187 3 465.1744 536.0921 53.1549 0.1652 1186 +1188 3 464.0991 536.4834 53.0457 0.1398 1187 +1189 3 463.0157 536.8517 52.897 0.1271 1188 +1190 3 461.9003 536.8781 52.6487 0.1271 1189 +1191 3 460.7757 536.8117 52.3006 0.1398 1190 +1192 3 459.6672 536.5669 51.919 0.1525 1191 +1193 3 458.5312 536.4834 51.5388 0.1398 1192 +1194 3 458.3447 537.0611 50.9236 0.1271 1193 +1195 3 458.0668 537.7063 50.1553 0.1144 1194 +1196 3 457.0211 538.0861 49.5071 0.1144 1195 +1197 3 455.9 538.3046 49.035 0.1144 1196 +1198 3 455.0397 538.9373 48.7133 0.1144 1197 +1199 3 454.0101 539.2805 48.5237 0.1144 1198 +1200 3 453.0309 539.8296 48.4512 0.1144 1199 +1201 3 452.2278 540.6384 48.44 0.1144 1200 +1202 3 451.6443 541.6154 48.44 0.1144 1201 +1203 3 451.3011 542.7022 48.44 0.1144 1202 +1204 3 451.0918 543.8256 48.44 0.1144 1203 +1205 3 450.4729 544.7625 48.44 0.1144 1204 +1206 3 449.9398 545.7692 48.44 0.1144 1205 +1207 3 449.1413 546.5746 48.44 0.1144 1206 +1208 3 448.5189 547.5321 48.44 0.1144 1207 +1209 3 448.2226 548.6338 48.44 0.1144 1208 +1210 3 447.8428 549.7126 48.44 0.1144 1209 +1211 3 447.1633 550.6324 48.44 0.1398 1210 +1212 3 446.6176 551.6368 48.44 0.1907 1211 +1213 3 522.6844 518.2972 47.2147 0.3178 1129 +1214 3 522.1788 517.5433 48.2154 0.3432 1213 +1215 3 521.6446 516.6853 48.6668 0.3559 1214 +1216 3 520.7454 516.0607 49.0087 0.3432 1215 +1217 3 519.7112 515.6397 49.3531 0.3305 1216 +1218 3 518.6061 515.5596 49.7162 0.3432 1217 +1219 3 517.5994 516.0035 49.9682 0.3305 1218 +1220 3 516.635 516.4199 50.2972 0.3178 1219 +1221 3 515.5127 516.4565 50.6316 0.2542 1220 +1222 3 514.395 516.2472 50.9068 0.2415 1221 +1223 3 513.275 516.0149 51.1487 0.2542 1222 +1224 3 512.1505 516.1808 51.4158 0.2924 1223 +1225 3 511.1495 516.5469 51.8426 0.3178 1224 +1226 3 510.0513 516.6029 52.3471 0.3432 1225 +1227 3 508.9301 516.4302 52.8609 0.3813 1226 +1228 3 507.8902 516.4496 53.4674 0.1525 1227 +1229 3 506.7771 516.4565 54.07 0.1398 1228 +1230 3 505.648 516.4565 54.626 0.1271 1229 +1231 3 504.5212 516.4222 55.1348 0.1144 1230 +1232 3 503.392 516.4222 55.61 0.1144 1231 +1233 3 502.2629 516.4474 56.061 0.1271 1232 +1234 3 501.1326 516.5354 56.478 0.1525 1233 +1235 3 500.0172 516.754 56.8593 0.1907 1234 +1236 3 498.9167 517.0262 57.2303 0.2288 1235 +1237 3 497.8963 517.4037 57.6559 0.2669 1236 +1238 3 496.8392 517.7332 58.093 0.2796 1237 +1239 3 495.7227 517.6943 58.4931 0.2542 1238 +1240 3 494.5947 517.811 58.8154 0.2034 1239 +1241 3 493.4724 517.9963 59.0388 0.178 1240 +1242 3 492.3787 518.2926 59.2693 0.2034 1241 +1243 3 491.2473 518.3201 59.4966 0.2542 1242 +1244 3 490.1274 518.1062 59.738 0.3178 1243 +1245 3 489.0737 518.0261 60.149 0.3432 1244 +1246 3 487.9881 517.8465 60.6659 0.3432 1245 +1247 3 486.907 517.5639 61.2357 0.2924 1246 +1248 3 485.8339 517.6406 61.8677 0.2415 1247 +1249 3 484.786 517.97 62.5198 0.2161 1248 +1250 3 483.7404 518.4013 63.1226 0.2034 1249 +1251 3 482.6914 518.8292 63.6675 0.2034 1250 +1252 3 481.6251 519.2319 64.1606 0.1652 1251 +1253 3 480.5921 519.7123 64.5954 0.1398 1252 +1254 3 479.725 520.3152 65.1109 0.1271 1253 +1255 3 478.7651 520.6847 65.7499 0.1525 1254 +1256 3 477.7344 520.3633 66.3743 0.2034 1255 +1257 3 476.7528 520.0224 67.0986 0.2288 1256 +1258 3 475.7541 519.6986 67.909 0.2288 1257 +1259 3 474.8138 519.7707 68.7924 0.178 1258 +1260 3 473.8768 520.0498 69.6654 0.1398 1259 +1261 3 472.7717 520.2866 70.3934 0.1144 1260 +1262 3 471.7112 520.6699 71.043 0.1144 1261 +1263 3 470.7057 521.0828 71.6887 0.1271 1262 +1264 3 469.66 521.3986 72.3159 0.1398 1263 +1265 3 468.651 521.8608 72.8773 0.1652 1264 +1266 3 467.65 522.0655 73.4546 0.1652 1265 +1267 3 466.585 521.9042 74.0782 0.1652 1266 +1268 3 465.4913 521.998 74.6508 0.1398 1267 +1269 3 464.3713 522.2188 75.1114 0.1271 1268 +1270 3 463.3463 522.2085 75.6064 0.1144 1269 +1271 3 462.287 522.1216 76.125 0.1144 1270 +1272 3 461.1453 522.0438 76.491 0.1144 1271 +1273 3 460.0024 522.0072 76.7346 0.1144 1272 +1274 3 458.8584 522.0072 76.8894 0.1652 1273 +1275 3 457.7144 522.0072 77.0 0.2288 1274 +1276 3 508.0355 515.896 54.9959 0.2288 1227 +1277 3 507.1707 515.4464 55.9359 0.2415 1276 +1278 3 506.1434 515.0151 56.2814 0.2161 1277 +1279 3 505.1835 514.4923 56.6748 0.2034 1278 +1280 3 504.4285 513.9134 56.8686 0.2034 1279 +1281 3 503.5648 513.3139 57.2258 0.2161 1280 +1282 3 502.4814 513.0932 57.6626 0.2288 1281 +1283 3 501.382 512.8117 58.0152 0.2288 1282 +1284 3 500.2495 512.7705 58.3954 0.2161 1283 +1285 3 499.3892 512.5612 59.0489 0.2034 1284 +1286 3 498.5609 512.3221 59.8536 0.1907 1285 +1287 3 497.8093 511.5076 60.5763 0.1907 1286 +1288 3 497.1481 510.7846 61.3544 0.1907 1287 +1289 3 496.2844 510.343 62.0166 0.178 1288 +1290 3 495.1758 510.1393 62.4621 0.1652 1289 +1291 3 494.0558 510.2332 62.811 0.1398 1290 +1292 3 493.0034 510.407 63.2464 0.1398 1291 +1293 3 491.9097 510.3258 63.742 0.1652 1292 +1294 3 490.927 509.8247 64.272 0.2034 1293 +1295 3 489.9214 509.3454 64.8553 0.2288 1294 +1296 3 489.0852 508.6258 65.3212 0.2034 1295 +1297 3 488.0018 508.4474 65.8717 0.1907 1296 +1298 3 487.0511 508.4451 66.5932 0.1907 1297 +1299 3 485.9506 508.325 67.2988 0.2161 1298 +1300 3 485.0377 507.7244 68.0546 0.2288 1299 +1301 3 484.0218 507.4944 68.8201 0.2034 1300 +1302 3 482.9076 507.6271 69.5752 0.178 1301 +1303 3 481.8162 507.4818 70.3391 0.1398 1302 +1304 3 480.9044 507.1077 71.2186 0.1271 1303 +1305 3 480.0132 506.6662 72.2033 0.1144 1304 +1306 3 479.0077 506.3561 73.2127 0.1144 1305 +1307 3 477.9724 506.2612 74.2353 0.1144 1306 +1308 3 476.9954 506.0038 75.2441 0.1144 1307 +1309 3 476.2678 505.7818 76.3017 0.1144 1308 +1310 3 475.443 505.9843 77.226 0.1144 1309 +1311 3 474.3344 506.2658 77.8705 0.1144 1310 +1312 3 473.5439 506.975 78.2916 0.1144 1311 +1313 3 472.7717 507.809 78.5361 0.1144 1312 +1314 3 471.6815 508.119 78.6509 0.1144 1313 +1315 3 470.5558 508.3227 78.68 0.1144 1314 +1316 3 469.493 508.7414 78.68 0.1144 1315 +1317 3 468.3536 508.8478 78.68 0.1144 1316 +1318 3 467.2096 508.8512 78.68 0.1144 1317 +1319 3 466.0656 508.8512 78.68 0.1144 1318 +1320 3 464.9216 508.8512 78.68 0.1271 1319 +1321 3 463.7776 508.8512 78.68 0.1398 1320 +1322 3 543.924 526.1325 43.3835 0.178 1108 +1323 3 544.7156 526.2766 44.2246 0.1652 1322 +1324 3 545.0005 527.3291 44.6102 0.178 1323 +1325 3 544.7648 528.4205 44.9473 0.2034 1324 +1326 3 545.0245 529.5198 45.2525 0.2415 1325 +1327 3 545.5233 530.4087 45.7355 0.2288 1326 +1328 3 546.2772 530.9098 46.4002 0.2161 1327 +1329 3 546.6627 531.9726 46.9678 0.178 1328 +1330 3 546.8103 533.0491 47.4446 0.1907 1329 +1331 3 547.69 533.6817 47.9847 0.2034 1330 +1332 3 548.4302 534.2617 48.5848 0.2288 1331 +1333 3 548.7265 535.3371 49.1761 0.2034 1332 +1334 3 549.2252 536.2546 49.8327 0.178 1333 +1335 3 550.0329 536.9547 50.5372 0.178 1334 +1336 3 551.0431 537.434 51.1896 0.2161 1335 +1337 3 552.0464 537.9271 51.7891 0.2415 1336 +1338 3 552.9101 538.5083 52.4356 0.2288 1337 +1339 3 553.7784 539.1558 53.0376 0.2161 1338 +1340 3 554.6318 539.8833 53.4668 0.2288 1339 +1341 3 555.4806 540.5389 53.9608 0.2542 1340 +1342 3 556.0218 541.4289 54.5241 0.2542 1341 +1343 3 557.0433 541.6932 55.1622 0.2288 1342 +1344 3 558.097 542.0787 55.7687 0.1907 1343 +1345 3 559.1014 542.4917 56.4007 0.1525 1344 +1346 3 559.9891 543.1735 56.9862 0.1271 1345 +1347 3 560.8346 543.8576 57.5089 0.1144 1346 +1348 3 561.5724 544.5577 58.0468 0.1144 1347 +1349 3 562.3446 545.1721 58.4892 0.1525 1348 +1350 3 563.4555 545.1412 58.7653 0.2034 1349 +1351 3 564.4668 545.3482 59.0276 0.2669 1350 +1352 3 565.5238 545.7246 59.2911 0.2669 1351 +1353 3 566.3292 546.1319 59.7484 0.2415 1352 +1354 3 567.3554 546.451 60.1247 0.2034 1353 +1355 3 568.4639 546.721 60.4668 0.1907 1354 +1356 3 569.529 547.094 60.8594 0.1907 1355 +1357 3 570.6055 547.2988 61.308 0.2034 1356 +1358 3 571.6236 547.5012 61.8195 0.2161 1357 +1359 3 572.6978 547.8788 62.2348 0.2415 1358 +1360 3 573.8007 548.135 62.6699 0.2288 1359 +1361 3 574.8749 548.4267 63.17 0.2288 1360 +1362 3 575.9411 548.7745 63.6574 0.2034 1361 +1363 3 576.989 548.9164 64.1508 0.2161 1362 +1364 3 577.9534 548.8237 64.836 0.2161 1363 +1365 3 578.9235 548.5022 65.6155 0.2288 1364 +1366 3 579.9005 548.0195 66.4045 0.2288 1365 +1367 3 581.0079 547.9211 67.111 0.2034 1366 +1368 3 582.1461 547.8994 67.744 0.178 1367 +1369 3 583.2409 547.7312 68.3707 0.1525 1368 +1370 3 584.3277 547.547 68.994 0.1652 1369 +1371 3 585.4283 547.4932 69.6256 0.178 1370 +1372 3 586.5334 547.4715 70.2663 0.178 1371 +1373 3 587.5515 547.4646 70.9836 0.1525 1372 +1374 3 588.6406 547.5642 71.6612 0.1271 1373 +1375 3 589.772 547.6889 72.2154 0.1144 1374 +1376 3 590.9046 547.8136 72.6611 0.1144 1375 +1377 3 592.0372 547.9394 73.0206 0.1144 1376 +1378 3 593.1709 548.0652 73.3135 0.1144 1377 +1379 3 594.3034 548.1899 73.5588 0.1144 1378 +1380 3 595.436 548.3146 73.7867 0.1144 1379 +1381 3 596.5697 548.4405 74.0127 0.1144 1380 +1382 3 597.6107 548.8981 74.228 0.1144 1381 +1383 3 598.3257 549.7881 74.4173 0.1271 1382 +1384 3 599.3633 550.2686 74.6077 0.1398 1383 +1385 3 600.4398 550.6404 74.8278 0.1525 1384 +1386 3 601.5381 550.8921 75.1041 0.1398 1385 +1387 3 602.6363 551.1437 75.4155 0.1271 1386 +1388 3 603.7334 551.3943 75.7436 0.1398 1387 +1389 3 604.8317 551.646 76.4733 0.1652 1388 +1390 3 554.5311 523.4155 33.8556 0.1907 1 +1391 3 555.5195 523.1821 33.2139 0.1907 1390 +1392 3 556.4816 522.5655 33.0028 0.2161 1391 +1393 3 557.2493 522.0804 32.6494 0.2415 1392 +1394 3 557.8487 521.2304 32.3232 0.2669 1393 +1395 3 558.3246 520.2008 32.051 0.2415 1394 +1396 3 558.2034 519.0751 31.9379 0.2161 1395 +1397 3 558.3029 518.3944 32.7558 0.178 1396 +1398 3 558.6221 517.3546 31.2326 0.2034 1397 +1399 3 558.4802 516.8523 30.4298 0.2288 1398 +1400 3 558.4836 515.7701 29.5968 0.2034 1399 +1401 3 559.1094 515.1238 28.4418 0.2288 1400 +1402 3 559.7695 514.6398 27.1417 0.2542 1401 +1403 3 560.5863 514.2795 25.8372 0.2542 1402 +1404 3 560.8666 513.8516 24.5535 0.2924 1403 +1405 3 560.1813 513.195 23.4935 0.3051 1404 +1406 3 559.1563 512.7191 22.7792 0.2924 1405 +1407 3 558.653 511.9938 22.5964 0.2161 1406 +1408 3 558.0684 511.0557 22.6043 0.1652 1407 +1409 3 556.9839 510.7354 22.6632 0.1398 1408 +1410 3 556.0229 510.4963 22.7421 0.178 1409 +1411 3 554.9269 510.1668 22.7757 0.1525 1410 +1412 3 553.7932 510.0558 22.7167 0.1652 1411 +1413 3 552.8163 509.9403 22.7671 0.1652 1412 +1414 3 551.7283 509.8007 22.6735 0.178 1413 +1415 3 551.1083 509.4598 22.2007 0.1652 1414 +1416 3 550.3189 508.6693 21.669 0.178 1415 +1417 3 549.6119 507.8353 21.1109 0.1652 1416 +1418 3 548.8763 507.3972 20.4708 0.178 1417 +1419 3 547.7449 507.5322 19.9428 0.1907 1418 +1420 3 546.6021 507.5322 19.5521 0.2288 1419 +1421 3 545.4661 507.5997 19.2757 0.2542 1420 +1422 3 544.369 507.8616 18.9882 0.2542 1421 +1423 3 543.3382 508.1442 18.5965 0.2415 1422 +1424 3 542.3292 508.3764 18.1 0.2415 1423 +1425 3 541.5845 509.0571 17.5422 0.2415 1424 +1426 3 540.969 509.9746 17.0044 0.2288 1425 +1427 3 540.0721 510.2606 16.7211 0.1907 1426 +1428 3 539.0288 509.9437 16.6231 0.1652 1427 +1429 3 537.958 509.5628 16.6096 0.178 1428 +1430 3 537.5084 509.1338 15.7273 0.1907 1429 +1431 3 557.7801 510.2972 21.6829 0.1652 1409 +1432 3 557.597 509.6165 20.1249 0.1652 1431 +1433 3 557.104 508.7196 19.5466 0.1652 1432 +1434 3 556.8454 508.3776 18.7427 0.1907 1433 +1435 3 556.1545 508.1236 17.9839 0.2161 1434 +1436 3 555.3559 507.5322 17.4124 0.2034 1435 +1437 3 558.4402 514.7863 31.5946 0.2669 1400 +1438 3 558.3772 513.6812 30.8031 0.2288 1437 +1439 3 558.8795 512.8735 30.4175 0.1652 1438 +1440 3 559.8542 512.4285 29.8816 0.1271 1439 +1441 3 560.4662 511.6162 29.2258 0.1144 1440 +1442 3 560.6664 510.693 28.4435 0.1144 1441 +1443 3 561.4111 510.1325 27.7303 0.1271 1442 +1444 3 562.26 510.661 27.2825 0.1398 1443 +1445 3 562.2211 511.6506 26.3992 0.1652 1444 +1446 3 559.2776 519.1403 32.1003 0.1907 1396 +1447 3 559.9983 518.4986 32.4302 0.1907 1446 +1448 3 560.7339 517.7504 32.5088 0.1907 1447 +1449 3 561.3757 517.0491 32.3456 0.2288 1448 +1450 3 561.839 516.0058 32.1504 0.2415 1449 +1451 3 562.4762 515.0723 31.9416 0.2288 1450 +1452 3 563.1878 514.2108 31.6932 0.2161 1451 +1453 3 563.9531 513.4844 31.3026 0.2288 1452 +1454 3 564.3752 512.5543 30.9064 0.2542 1453 +1455 3 564.9724 511.6517 30.5822 0.2542 1454 +1456 3 565.7663 510.836 30.2515 0.2415 1455 +1457 3 566.7319 510.5375 29.7447 0.2161 1456 +1458 3 567.6711 510.693 29.0142 0.2161 1457 +1459 3 568.7224 510.7274 28.1982 0.2288 1458 +1460 3 569.5438 510.1256 27.2978 0.2669 1459 +1461 3 569.1594 509.8694 27.9712 0.1907 1460 +1462 3 569.1686 508.9015 28.1492 0.2034 1461 +1463 3 569.7566 508.031 28.168 0.2415 1462 +1464 3 570.6272 507.3823 27.994 0.2542 1463 +1465 3 571.5081 506.7085 27.713 0.2415 1464 +1466 3 572.6406 506.6055 27.3894 0.2415 1465 +1467 3 573.7183 506.4133 26.9682 0.2542 1466 +1468 3 574.7479 506.093 26.6821 0.2415 1467 +1469 3 575.7844 505.974 26.5146 0.2034 1468 +1470 3 576.6366 506.0381 26.1963 0.1525 1469 +1471 3 576.7659 505.354 25.4658 0.1525 1470 +1472 3 576.894 504.671 24.4202 0.1652 1471 +1473 3 577.029 503.9606 23.1805 0.1907 1472 +1474 3 577.6491 503.1472 22.1266 0.1652 1473 +1475 3 578.6135 502.637 21.1768 0.1398 1474 +1476 3 579.5367 502.1165 20.313 0.1144 1475 +1477 3 580.4587 501.596 19.5544 0.1271 1476 +1478 3 581.2309 500.8546 18.9501 0.1525 1477 +1479 3 581.8578 499.8983 18.5251 0.178 1478 +1480 3 581.7171 498.9956 18.1056 0.178 1479 +1481 3 580.9404 498.1994 17.8605 0.1652 1480 +1482 3 580.4278 497.1961 17.6627 0.178 1481 +1483 3 580.1418 496.0922 17.555 0.2034 1482 +1484 3 579.7803 495.0088 17.4758 0.2288 1483 +1485 3 579.2301 494.0078 17.3999 0.2161 1484 +1486 3 578.7279 492.9805 17.2928 0.2034 1485 +1487 3 578.332 491.9292 17.0856 0.178 1486 +1488 3 578.0117 490.8618 16.7991 0.178 1487 +1489 3 577.7966 489.7876 15.9191 0.178 1488 +1490 3 570.459 510.2778 26.3477 0.2161 1460 +1491 3 570.4705 510.7617 26.1302 0.1907 1490 +1492 3 570.983 511.4172 26.4256 0.2161 1491 +1493 3 572.0686 511.6551 26.4796 0.2288 1492 +1494 3 573.1932 511.7776 26.4406 0.2161 1493 +1495 3 574.2766 512.115 26.3196 0.1907 1494 +1496 3 575.3679 512.3564 26.1365 0.1525 1495 +1497 3 575.9274 513.0131 25.9501 0.1271 1496 +1498 3 575.9823 514.0587 25.5577 0.1398 1497 +1499 3 576.2248 515.1077 25.0383 0.178 1498 +1500 3 577.0908 515.7369 24.5171 0.2288 1499 +1501 3 578.0929 516.0893 23.8838 0.2669 1500 +1502 3 579.0036 516.5435 23.1305 0.2796 1501 +1503 3 579.8456 517.2138 22.3609 0.2924 1502 +1504 3 580.8111 517.6772 21.6161 0.2669 1503 +1505 3 581.9208 517.4724 20.9959 0.2796 1504 +1506 3 582.9023 516.8878 20.5298 0.2669 1505 +1507 3 583.7489 516.1842 20.0882 0.2669 1506 +1508 3 584.5337 515.9898 19.7501 0.2415 1507 +1509 3 585.6628 515.896 19.5107 0.2415 1508 +1510 3 586.7999 515.976 19.3314 0.1907 1509 +1511 3 587.6145 516.5755 19.1427 0.1525 1510 +1512 3 588.0194 517.485 18.8361 0.1398 1511 +1513 3 588.6223 518.3121 18.5705 0.178 1512 +1514 3 589.3739 519.1552 18.4706 0.2161 1513 +1515 3 590.3029 519.7775 18.465 0.2669 1514 +1516 3 591.3428 520.234 18.5498 0.2669 1515 +1517 3 591.925 520.9856 18.831 0.2288 1516 +1518 3 592.3335 522.0118 19.1098 0.178 1517 +1519 3 593.0416 522.8652 19.2081 0.178 1518 +1520 3 593.8847 523.5905 19.2731 0.2034 1519 +1521 3 594.8503 524.1282 19.1541 0.2415 1520 +1522 3 595.8787 524.6121 18.9317 0.2288 1521 +1523 3 596.5136 525.5033 18.5796 0.2161 1522 +1524 3 596.993 526.4928 18.1582 0.1652 1523 +1525 3 597.8944 527.1735 17.7652 0.1525 1524 +1526 3 598.8577 527.7798 17.0562 0.1525 1525 +1527 3 583.9296 515.6992 19.6619 0.178 1507 +1528 3 584.2065 514.5975 19.6309 0.1525 1527 +1529 3 584.3689 513.4661 19.62 0.1271 1528 +1530 3 584.5646 512.3381 19.6116 0.1144 1529 +1531 3 584.9272 511.2708 19.6057 0.1271 1530 +1532 3 585.4042 510.2343 19.6019 0.1398 1531 +1533 3 585.8916 509.2058 19.6001 0.1525 1532 +1534 3 586.4178 508.1923 19.6 0.1398 1533 +1535 3 587.0379 507.2507 19.6 0.1271 1534 +1536 3 587.9863 506.6707 19.6 0.1398 1535 +1537 3 588.8019 505.9489 19.6 0.1652 1536 +1538 3 589.6542 505.2121 19.6 0.1907 1537 +1539 3 590.7296 504.8952 19.6 0.1652 1538 +1540 3 591.8553 504.695 19.6 0.1525 1539 +1541 3 592.4959 503.8473 19.6 0.1398 1540 +1542 3 593.1262 502.8932 19.6 0.1525 1541 +1543 3 593.6925 501.9003 19.6 0.1398 1542 +1544 3 594.6821 501.3363 19.6 0.1525 1543 +1545 3 595.7952 501.072 19.6 0.1907 1544 +1546 3 571.1981 509.2573 25.3975 0.2415 1490 +1547 3 572.0812 508.6544 24.6505 0.2161 1546 +1548 3 573.0674 508.1408 24.2391 0.2034 1547 +1549 3 574.1095 507.7335 24.0326 0.2034 1548 +1550 3 575.2307 507.5207 23.9246 0.2288 1549 +1551 3 576.1459 506.9442 23.859 0.2415 1550 +1552 3 576.7613 506.4225 23.5821 0.2161 1551 +1553 3 577.2761 505.5233 23.2401 0.178 1552 +1554 3 577.847 504.5692 23.0335 0.1525 1553 +1555 3 578.6329 503.908 23.0569 0.178 1554 +1556 3 579.452 503.2193 23.2073 0.2034 1555 +1557 3 580.3134 502.5672 23.2321 0.2415 1556 +1558 3 581.2138 502.0032 23.0722 0.2415 1557 +1559 3 582.1713 501.4369 22.7998 0.2415 1558 +1560 3 583.1471 500.8649 22.4538 0.2161 1559 +1561 3 584.1882 500.4085 22.0923 0.2034 1560 +1562 3 585.259 500.0138 21.762 0.1907 1561 +1563 3 586.3755 499.8582 21.4986 0.2034 1562 +1564 3 587.5172 499.7999 21.2872 0.2161 1563 +1565 3 588.4633 499.2828 21.0862 0.2161 1564 +1566 3 589.057 498.3447 20.8162 0.2034 1565 +1567 3 589.2183 497.2579 20.4586 0.178 1566 +1568 3 589.0822 496.1322 20.0717 0.1652 1567 +1569 3 588.922 495.0832 19.5759 0.1398 1568 +1570 3 589.0662 494.0982 18.9586 0.1271 1569 +1571 3 589.3099 493.0526 18.3427 0.1271 1570 +1572 3 589.9242 492.111 17.8577 0.1525 1571 +1573 3 590.6918 491.3366 17.4301 0.178 1572 +1574 3 591.1494 490.3562 17.2909 0.178 1573 +1575 3 591.774 489.4615 17.3888 0.1525 1574 +1576 3 592.6675 488.782 17.5993 0.1398 1575 +1577 3 593.7303 488.385 17.8328 0.1525 1576 +1578 3 594.769 487.9149 17.9709 0.178 1577 +1579 3 595.8707 487.6517 18.0013 0.1907 1578 +1580 3 596.9953 487.6529 17.9082 0.178 1579 +1581 3 598.129 487.7593 17.7848 0.1652 1580 +1582 3 599.2283 487.9526 17.7804 0.1398 1581 +1583 3 600.3529 487.8668 17.848 0.1398 1582 +1584 3 601.4202 487.4618 17.8911 0.1525 1583 +1585 3 602.5173 487.2456 17.9327 0.1907 1584 +1586 3 603.5836 487.6094 17.9858 0.2161 1585 +1587 3 604.4793 488.3175 18.0136 0.2161 1586 +1588 3 605.3156 489.0932 18.0058 0.2034 1587 +1589 3 606.2685 489.5016 17.9511 0.1907 1588 +1590 3 607.2695 489.0325 17.8152 0.2034 1589 +1591 3 608.1962 488.3908 17.7317 0.2034 1590 +1592 3 608.9832 487.6094 17.7191 0.1907 1591 +1593 3 609.7955 486.8464 17.6776 0.1525 1592 +1594 3 610.8468 486.4391 17.5762 0.1271 1593 +1595 3 611.9359 486.3739 17.3889 0.1144 1594 +1596 3 613.0307 486.4757 17.1487 0.1144 1595 +1597 3 614.1198 486.3361 16.8421 0.1144 1596 +1598 3 615.2375 486.0948 16.6173 0.1144 1597 +1599 3 616.354 485.8476 16.4862 0.1271 1598 +1600 3 617.4797 485.7275 16.4966 0.1525 1599 +1601 3 618.5951 485.668 16.9296 0.178 1600 +1602 4 549.3008 518.1714 38.7442 0.1525 1 +1603 4 549.0182 517.0628 38.7394 0.2034 1602 +1604 4 548.6018 516.0001 38.7327 0.2542 1603 +1605 4 548.1407 514.9522 38.7218 0.2415 1604 +1606 4 547.674 513.9077 38.7069 0.2288 1605 +1607 4 547.4566 512.7911 38.6918 0.2161 1606 +1608 4 547.2942 511.6586 38.6806 0.2288 1607 +1609 4 547.1592 510.5363 38.6212 0.2288 1608 +1610 4 547.1203 509.414 38.5106 0.2415 1609 +1611 4 546.7622 508.3456 38.4978 0.2542 1610 +1612 4 546.2749 508.7528 38.4804 0.178 1611 +1613 4 545.2144 508.4451 39.0102 0.178 1612 +1614 4 544.2649 508.182 39.3375 0.2034 1613 +1615 4 543.3245 507.6294 39.4876 0.2034 1614 +1616 4 542.296 507.1661 39.5654 0.2034 1615 +1617 4 541.2047 506.9098 39.6189 0.178 1616 +1618 4 540.1224 506.8835 39.7964 0.178 1617 +1619 4 539.0574 507.0059 40.0635 0.1652 1618 +1620 4 538.0003 507.3274 40.2478 0.1652 1619 +1621 4 537.0485 507.5345 40.5577 0.1398 1620 +1622 4 536.0166 507.6923 40.9984 0.1398 1621 +1623 4 534.8944 507.761 41.3837 0.1525 1622 +1624 4 533.7698 507.8193 41.6304 0.2034 1623 +1625 4 532.929 508.4142 41.9202 0.2415 1624 +1626 4 531.9623 508.7391 42.3231 0.2669 1625 +1627 4 530.8389 508.6876 42.6936 0.2415 1626 +1628 4 529.6983 508.6762 42.992 0.2161 1627 +1629 4 528.7065 509.0548 43.342 0.2034 1628 +1630 4 527.5831 509.1441 43.5117 0.2415 1629 +1631 4 526.4596 509.3202 43.5554 0.2669 1630 +1632 4 525.3591 509.5456 43.4795 0.2542 1631 +1633 4 524.2186 509.5284 43.3972 0.2161 1632 +1634 4 523.0951 509.4072 43.3882 0.2161 1633 +1635 4 521.9866 509.6085 43.4409 0.2796 1634 +1636 4 520.9524 510.0924 43.5226 0.3432 1635 +1637 4 519.8714 510.4574 43.5929 0.3813 1636 +1638 4 518.7468 510.6496 43.6246 0.3559 1637 +1639 4 517.6097 510.7262 43.6047 0.3432 1638 +1640 4 516.4691 510.7365 43.5621 0.3051 1639 +1641 4 515.364 510.8864 43.5632 0.2796 1640 +1642 4 514.4454 511.2513 43.7063 0.2288 1641 +1643 4 513.5565 511.9366 43.7296 0.2161 1642 +1644 4 512.5589 512.4823 43.6814 0.2288 1643 +1645 4 511.5991 513.0966 43.5988 0.2415 1644 +1646 4 510.6644 513.7098 43.4465 0.2542 1645 +1647 4 509.5891 513.8837 43.2172 0.2542 1646 +1648 4 508.4577 513.7521 43.0013 0.2669 1647 +1649 4 507.3514 513.704 42.8061 0.2542 1648 +1650 4 506.3767 514.0793 42.637 0.2669 1649 +1651 4 505.3826 514.5723 42.5986 0.2796 1650 +1652 4 504.4662 515.1077 42.7619 0.3305 1651 +1653 4 503.5957 515.6111 43.1715 0.3305 1652 +1654 4 502.5363 515.9246 43.6262 0.3559 1653 +1655 4 501.4129 515.9989 44.098 0.3305 1654 +1656 4 500.3547 515.6717 44.5785 0.3432 1655 +1657 4 499.3297 515.6672 45.1119 0.3305 1656 +1658 4 498.2509 515.9143 45.586 0.3686 1657 +1659 4 497.1527 516.2174 45.932 0.4195 1658 +1660 4 496.0292 516.4268 46.1614 0.4576 1659 +1661 4 494.9241 516.6887 46.247 0.4703 1660 +1662 4 493.8362 517.0068 46.2129 0.4322 1661 +1663 4 492.7002 517.0228 46.1574 0.394 1662 +1664 4 491.5619 516.9256 46.0981 0.3432 1663 +1665 4 490.4225 516.9141 46.0401 0.3051 1664 +1666 4 489.2945 516.9427 46.0967 0.2924 1665 +1667 4 488.2478 517.3362 46.128 0.2796 1666 +1668 4 487.336 517.9986 46.2678 0.3051 1667 +1669 4 486.2263 518.073 46.5136 0.2924 1668 +1670 4 485.2345 518.6427 46.7407 0.2796 1669 +1671 4 483.9566 518.0604 47.2928 0.3305 1670 +1672 4 482.9522 517.5399 47.5054 0.3432 1671 +1673 4 481.9809 516.9393 47.5955 0.3305 1672 +1674 4 480.9696 516.421 47.6588 0.3305 1673 +1675 4 479.8886 516.0824 47.6773 0.3178 1674 +1676 4 478.8452 515.6534 47.7036 0.2796 1675 +1677 4 477.8946 515.0345 47.7974 0.2669 1676 +1678 4 476.937 514.4522 47.973 0.2161 1677 +1679 4 475.9429 513.942 48.2272 0.2034 1678 +1680 4 475.0151 513.3094 48.4652 0.1652 1679 +1681 4 474.1251 512.5932 48.6354 0.178 1680 +1682 4 473.1813 511.9572 48.7782 0.178 1681 +1683 4 472.17 511.4412 48.9224 0.2034 1682 +1684 4 471.1141 511.034 49.0778 0.2034 1683 +1685 4 470.1314 510.4848 49.1938 0.2161 1684 +1686 4 469.2596 509.7607 49.2327 0.2034 1685 +1687 4 468.3136 509.1624 49.2831 0.2161 1686 +1688 4 467.2828 508.7025 49.3713 0.1907 1687 +1689 4 466.1834 508.5458 49.3892 0.178 1688 +1690 4 465.0806 508.389 49.4208 0.1525 1689 +1691 4 464.0613 507.9154 49.4449 0.1525 1690 +1692 4 463.2639 507.1569 49.3486 0.1525 1691 +1693 4 462.3327 506.5289 49.1868 0.1398 1692 +1694 4 461.2871 506.077 49.0028 0.1398 1693 +1695 4 460.1568 506.0061 48.837 0.1398 1694 +1696 4 459.1261 505.5656 48.6545 0.1652 1695 +1697 4 458.1995 504.9776 48.4067 0.1652 1696 +1698 4 457.1973 504.4399 48.2286 0.1652 1697 +1699 4 456.122 504.0544 48.1202 0.1398 1698 +1700 4 455.0901 503.5671 48.085 0.1271 1699 +1701 4 454.2092 502.8601 48.1426 0.1144 1700 +1702 4 453.2928 502.1851 48.2552 0.1144 1701 +1703 4 452.333 501.5651 48.3818 0.1271 1702 +1704 4 451.3469 500.9976 48.4411 0.1525 1703 +1705 4 450.355 500.4714 48.41 0.178 1704 +1706 4 449.338 499.9566 48.4123 0.2034 1705 +1707 4 448.3256 499.4498 48.4806 0.2161 1706 +1708 4 447.4344 498.7417 48.5862 0.2288 1707 +1709 4 446.5741 497.9924 48.7206 0.2034 1708 +1710 4 445.898 497.0714 48.8538 0.1907 1709 +1711 4 445.2402 496.1356 48.9782 0.178 1710 +1712 4 444.7094 495.1232 49.0818 0.2034 1711 +1713 4 444.0882 494.1634 49.1742 0.1907 1712 +1714 4 443.1764 493.5159 49.3326 0.1907 1713 +1715 4 442.1228 493.1441 49.5499 0.1652 1714 +1716 4 441.6115 492.8878 49.7162 0.1144 1715 +1717 4 440.5887 492.3765 49.8333 0.1144 1716 +1718 4 439.5648 491.8651 49.9038 0.1144 1717 +1719 4 438.5421 491.3537 49.9324 0.1144 1718 +1720 4 437.54 490.8046 49.9142 0.1144 1719 +1721 4 436.5653 490.2097 49.8588 0.1144 1720 +1722 4 435.53 489.7613 49.7904 0.1144 1721 +1723 4 434.4226 489.4867 49.7199 0.1144 1722 +1724 4 433.3506 489.1206 49.6913 0.1144 1723 +1725 4 432.3279 488.6287 49.74 0.1144 1724 +1726 4 431.3429 488.0624 49.8221 0.1144 1725 +1727 4 430.3854 487.4355 49.8968 0.1144 1726 +1728 4 429.4828 486.7388 49.9576 0.1144 1727 +1729 4 428.6316 485.9735 50.0004 0.1144 1728 +1730 4 427.8366 485.1544 50.0226 0.1144 1729 +1731 4 427.0918 484.2861 50.0273 0.1144 1730 +1732 4 426.4203 483.3629 50.0265 0.1144 1731 +1733 4 425.8185 482.3905 50.0254 0.1144 1732 +1734 4 425.2328 481.4078 50.0223 0.1144 1733 +1735 4 424.6608 480.4171 50.015 0.1144 1734 +1736 4 424.0533 479.4493 50.0021 0.1271 1735 +1737 4 423.3509 478.5718 50.0304 0.1525 1736 +1738 4 422.9391 477.572 50.0181 0.178 1737 +1739 4 422.5639 476.5057 49.9355 0.1907 1738 +1740 4 422.0696 475.4739 49.8243 0.1907 1739 +1741 4 421.5571 474.4511 49.6933 0.2034 1740 +1742 4 420.9485 473.5096 49.4816 0.2034 1741 +1743 4 420.2438 472.6402 49.1873 0.1907 1742 +1744 4 419.3835 471.9069 48.8947 0.1525 1743 +1745 4 418.4569 471.2388 48.6186 0.1271 1744 +1746 4 417.5417 470.5798 48.3098 0.1271 1745 +1747 4 416.6608 469.8717 47.9872 0.1525 1746 +1748 4 415.8417 469.0778 47.7089 0.2034 1747 +1749 4 414.97 468.3456 47.4583 0.2415 1748 +1750 4 413.9964 467.777 47.1915 0.2669 1749 +1751 4 413.111 467.2462 46.8188 0.2542 1750 +1752 4 412.2015 466.6182 46.4864 0.2415 1751 +1753 4 411.2154 466.1434 46.3529 0.2161 1752 +1754 4 410.3414 465.4192 46.2493 0.2288 1753 +1755 4 409.2088 465.2648 46.2 0.2542 1754 +1756 4 441.5451 492.8123 51.24 0.1144 1715 +1757 4 440.8393 491.92 51.3299 0.1144 1756 +1758 4 440.13 491.0654 51.3654 0.1144 1757 +1759 4 439.725 490.0027 51.4167 0.1144 1758 +1760 4 439.2159 488.9845 51.4884 0.1144 1759 +1761 4 438.7046 487.9938 51.585 0.1144 1760 +1762 4 437.9381 487.1484 51.711 0.1144 1761 +1763 4 437.2734 486.2332 51.9058 0.1144 1762 +1764 4 436.4966 485.4827 52.2301 0.1144 1763 +1765 4 435.737 484.6876 52.591 0.1144 1764 +1766 4 435.1387 483.7312 52.9659 0.1144 1765 +1767 4 434.6159 482.7646 53.3971 0.1144 1766 +1768 4 433.6835 482.3047 53.7818 0.1144 1767 +1769 4 432.9914 481.5542 54.1682 0.1144 1768 +1770 4 431.9721 481.1973 54.462 0.1144 1769 +1771 4 430.8533 480.9593 54.6616 0.1144 1770 +1772 4 429.7413 480.6916 54.7848 0.1144 1771 +1773 4 428.603 480.6024 54.8481 0.1144 1772 +1774 4 427.856 479.7936 54.88 0.1144 1773 +1775 4 484.3044 519.6105 47.0798 0.2161 1670 +1776 4 483.364 520.1757 47.4099 0.1907 1775 +1777 4 482.2303 520.2226 47.6694 0.178 1776 +1778 4 481.1103 520.0201 47.805 0.2161 1777 +1779 4 480.027 519.6689 47.8663 0.2415 1778 +1780 4 478.9859 519.1941 47.8993 0.2669 1779 +1781 4 477.93 518.7537 47.9125 0.2796 1780 +1782 4 476.8535 518.367 47.9363 0.2796 1781 +1783 4 475.7541 518.0718 47.9872 0.2796 1782 +1784 4 474.6159 517.9609 48.071 0.2288 1783 +1785 4 473.481 517.8613 48.1936 0.1907 1784 +1786 4 472.3565 517.8007 48.3916 0.1652 1785 +1787 4 471.2319 517.7996 48.6279 0.2034 1786 +1788 4 470.0971 517.9449 48.8261 0.2542 1787 +1789 4 468.9634 518.0844 48.9989 0.3051 1788 +1790 4 467.8342 518.192 49.1856 0.3178 1789 +1791 4 466.7074 518.2743 49.3861 0.2924 1790 +1792 4 465.5737 518.3201 49.525 0.2415 1791 +1793 4 464.4491 518.3121 49.5642 0.1907 1792 +1794 4 463.3131 518.2743 49.6138 0.178 1793 +1795 4 462.1874 518.2137 49.7395 0.178 1794 +1796 4 461.0583 518.2331 49.8974 0.1907 1795 +1797 4 459.9258 518.3979 50.0374 0.178 1796 +1798 4 458.792 518.5226 50.1836 0.1652 1797 +1799 4 457.6595 518.5317 50.3653 0.1525 1798 +1800 4 456.5315 518.4917 50.5618 0.1525 1799 +1801 4 455.3932 518.4722 50.7214 0.1398 1800 +1802 4 454.2492 518.4677 50.8175 0.1525 1801 +1803 4 453.1121 518.4116 50.8452 0.1652 1802 +1804 4 451.9875 518.2629 50.7858 0.1907 1803 +1805 4 450.8596 518.121 50.6792 0.1652 1804 +1806 4 449.7247 517.994 50.5778 0.1398 1805 +1807 4 448.5887 517.8659 50.5098 0.1271 1806 +1808 4 447.4516 517.7607 50.4988 0.1525 1807 +1809 4 446.3156 517.8099 50.5557 0.178 1808 +1810 4 445.2986 518.1759 50.7338 0.178 1809 +1811 4 444.3891 518.709 51.0521 0.1525 1810 +1812 4 443.3378 519.1014 51.38 0.1271 1811 +1813 4 442.2532 519.4538 51.6359 0.1144 1812 +1814 4 441.147 519.7352 51.7784 0.1144 1813 +1815 4 440.0293 519.956 51.8028 0.1271 1814 +1816 4 438.9128 520.1699 51.7194 0.1398 1815 +1817 4 437.7962 520.3781 51.5673 0.1525 1816 +1818 4 436.674 520.5886 51.4186 0.1398 1817 +1819 4 435.5494 520.7957 51.3097 0.1398 1818 +1820 4 434.4157 520.9135 51.2414 0.1398 1819 +1821 4 433.2717 520.9135 51.2075 0.1525 1820 +1822 4 432.1277 520.8884 51.1994 0.1398 1821 +1823 4 430.9951 520.7557 51.207 0.1398 1822 +1824 4 429.8763 520.5189 51.2218 0.1398 1823 +1825 4 428.7666 520.2432 51.2434 0.1525 1824 +1826 4 427.673 519.908 51.2747 0.1398 1825 +1827 4 426.5587 519.6906 51.3173 0.1271 1826 +1828 4 425.4181 519.7158 51.3699 0.1398 1827 +1829 4 424.2799 519.7421 51.4444 0.178 1828 +1830 4 423.1587 519.6231 51.585 0.2288 1829 +1831 4 422.0388 519.5407 51.786 0.2288 1830 +1832 4 420.9154 519.5407 51.9347 0.2161 1831 +1833 4 419.8183 519.6849 51.9893 0.2034 1832 +1834 4 418.7555 519.9835 52.1108 0.2161 1833 +1835 4 417.7202 520.3278 52.365 0.2161 1834 +1836 4 416.6551 520.6538 52.6834 0.178 1835 +1837 4 415.5386 520.8174 53.011 0.1652 1836 +1838 4 414.4014 520.7591 53.3123 0.1652 1837 +1839 4 413.2643 520.6447 53.5749 0.1907 1838 +1840 4 412.1214 520.6092 53.7986 0.1652 1839 +1841 4 410.9774 520.6092 54.0036 0.1652 1840 +1842 4 409.8655 520.7705 54.264 0.178 1841 +1843 4 408.7729 521.0417 54.6014 0.2415 1842 +1844 4 407.6999 521.3952 54.9906 0.2542 1843 +1845 4 406.6268 521.7075 55.4417 0.2415 1844 +1846 4 405.5503 521.9843 55.9434 0.1907 1845 +1847 4 404.4749 522.26 56.4707 0.1652 1846 +1848 4 403.3858 522.5037 56.9926 0.1525 1847 +1849 4 402.259 522.5769 57.4596 0.1398 1848 +1850 4 401.1173 522.5769 57.8659 0.1271 1849 +1851 4 399.9756 522.5769 58.228 0.1271 1850 +1852 4 398.8339 522.5769 58.5651 0.1398 1851 +1853 4 397.7242 522.7302 58.9366 0.1525 1852 +1854 4 396.6362 522.9739 59.3684 0.1525 1853 +1855 4 395.5506 523.2244 59.8522 0.1652 1854 +1856 4 394.4706 523.5001 60.3686 0.1907 1855 +1857 4 393.4182 523.8639 60.8916 0.2034 1856 +1858 4 392.376 524.2655 61.3992 0.1907 1857 +1859 4 391.3338 524.6659 61.8733 0.1652 1858 +1860 4 390.2642 525.0274 62.2782 0.1525 1859 +1861 4 389.1613 525.3156 62.573 0.1652 1860 +1862 4 388.0471 525.5776 62.7637 0.1652 1861 +1863 4 386.934 525.8396 62.876 0.178 1862 +1864 4 385.8197 526.1016 62.9331 0.178 1863 +1865 4 384.8565 525.6909 62.9633 0.1907 1864 +1866 4 383.8051 525.2665 62.9779 0.178 1865 +1867 4 382.8087 524.7139 62.9868 0.1525 1866 +1868 4 381.6967 524.5046 62.9933 0.1271 1867 +1869 4 380.6832 523.9989 62.9975 0.1144 1868 +1870 4 379.6295 523.5573 62.9997 0.1144 1869 +1871 4 378.6262 523.0093 63.0 0.1144 1870 +1872 4 377.8037 522.2223 63.0 0.1144 1871 +1873 4 377.5989 521.1103 63.0 0.1144 1872 +1874 4 376.4904 520.8632 63.0 0.1144 1873 +1875 4 546.5929 507.1444 38.6025 0.2288 1611 +1876 4 546.5357 506.0495 38.7671 0.2161 1875 +1877 4 546.2188 504.9582 38.8699 0.2161 1876 +1878 4 545.9717 503.8519 38.9178 0.1907 1877 +1879 4 545.9145 502.7148 38.9494 0.178 1878 +1880 4 546.0712 501.5914 38.9922 0.1525 1879 +1881 4 545.9122 500.5286 39.0547 0.1525 1880 +1882 4 545.5793 499.459 39.0785 0.178 1881 +1883 4 545.4192 498.3413 39.069 0.2161 1882 +1884 4 545.1743 497.2785 39.1636 0.2796 1883 +1885 4 545.1412 496.2695 39.433 0.3178 1884 +1886 4 545.275 495.1838 39.646 0.3432 1885 +1887 4 545.3276 494.0456 39.8124 0.3305 1886 +1888 4 545.4912 492.9164 39.9515 0.2924 1887 +1889 4 545.4626 491.777 40.0008 0.2415 1888 +1890 4 545.3562 490.641 39.9809 0.2034 1889 +1891 4 545.0943 489.5268 39.9434 0.2161 1890 +1892 4 544.8323 488.4136 39.9202 0.2415 1891 +1893 4 544.7694 488.9525 40.6241 0.2415 1892 +1894 4 544.536 489.7556 42.7512 0.2542 1893 +1895 4 543.9045 489.8894 43.741 0.2288 1894 +1896 4 543.098 490.3459 44.8126 0.2161 1895 +1897 4 542.0455 490.768 45.7159 0.2034 1896 +1898 4 540.9404 491.0231 46.424 0.1907 1897 +1899 4 539.8444 491.0563 47.0406 0.1652 1898 +1900 4 538.713 491.0094 47.4796 0.1525 1899 +1901 4 537.6731 490.6101 47.7898 0.1652 1900 +1902 4 536.933 489.7636 48.0231 0.178 1901 +1903 4 536.4113 488.8232 48.2269 0.2034 1902 +1904 4 535.837 487.892 48.3297 0.2161 1903 +1905 4 534.9241 487.3005 48.449 0.2161 1904 +1906 4 533.8282 487.1667 48.673 0.2034 1905 +1907 4 532.7791 486.9127 49.0358 0.178 1906 +1908 4 531.6877 486.6542 49.4539 0.178 1907 +1909 4 530.5655 486.6656 49.9248 0.178 1908 +1910 4 529.5427 486.2961 50.3642 0.1907 1909 +1911 4 528.8575 485.4964 50.913 0.178 1910 +1912 4 527.8565 485.1338 51.5236 0.178 1911 +1913 4 526.971 484.889 52.3292 0.1907 1912 +1914 4 525.8762 484.8878 53.1482 0.2161 1913 +1915 4 525.0205 485.5742 53.9554 0.2161 1914 +1916 4 524.4382 486.1428 54.9035 0.2161 1915 +1917 4 523.5196 486.6759 55.7673 0.2288 1916 +1918 4 522.5964 487.32 56.4558 0.2415 1917 +1919 4 521.5771 487.7147 56.9895 0.2161 1918 +1920 4 520.4868 487.7581 57.3566 0.1907 1919 +1921 4 519.5842 487.2605 57.7338 0.2161 1920 +1922 4 518.6988 486.8326 57.9751 0.2924 1921 +1923 4 517.827 487.241 58.2274 0.3559 1922 +1924 4 516.9198 487.8233 58.5864 0.3559 1923 +1925 4 515.8548 487.8531 58.7672 0.3178 1924 +1926 4 514.7634 487.821 59.0657 0.2669 1925 +1927 4 513.8082 487.328 59.4507 0.2288 1926 +1928 4 512.6722 487.3429 59.8175 0.2034 1927 +1929 4 511.5785 487.3337 60.1644 0.178 1928 +1930 4 510.6347 487.805 60.4629 0.1652 1929 +1931 4 509.5731 487.8485 60.6707 0.1525 1930 +1932 4 508.5114 488.1345 60.8684 0.1652 1931 +1933 4 507.4075 488.1848 60.9988 0.1907 1932 +1934 4 506.2761 488.0418 61.1148 0.2161 1933 +1935 4 505.1469 488.0018 61.2752 0.2415 1934 +1936 4 504.0224 487.9034 61.4908 0.2415 1935 +1937 4 502.9424 487.5854 61.7515 0.2415 1936 +1938 4 501.8854 487.4092 62.0992 0.2161 1937 +1939 4 500.7837 487.4698 62.5008 0.2034 1938 +1940 4 499.8422 487.1186 62.7514 0.1907 1939 +1941 4 498.7977 486.8406 62.8944 0.1907 1940 +1942 4 497.7738 486.7068 63.1834 0.2161 1941 +1943 4 496.8598 486.0936 63.4928 0.2415 1942 +1944 4 496.2947 485.1796 63.8826 0.2669 1943 +1945 4 495.5819 484.2975 64.2485 0.2542 1944 +1946 4 494.8315 483.4407 64.5882 0.2288 1945 +1947 4 494.1794 482.5152 64.8592 0.1907 1946 +1948 4 493.2196 482.0988 65.1146 0.178 1947 +1949 4 492.2815 482.5655 65.3918 0.1907 1948 +1950 4 491.4567 482.5426 65.5351 0.1144 1949 +1951 4 490.3436 482.4202 65.6001 0.1144 1950 +1952 4 489.2808 482.0175 65.6939 0.1144 1951 +1953 4 488.2306 481.5851 65.8095 0.1144 1952 +1954 4 487.1587 481.1858 65.9008 0.1271 1953 +1955 4 486.0764 480.8152 65.9781 0.1525 1954 +1956 4 484.9702 480.5246 66.0593 0.178 1955 +1957 4 483.864 480.2398 66.143 0.178 1956 +1958 4 482.792 479.8577 66.2497 0.1525 1957 +1959 4 481.7647 479.3738 66.3919 0.1271 1958 +1960 4 480.7454 478.8612 66.514 0.1144 1959 +1961 4 479.7387 478.3327 66.6058 0.1144 1960 +1962 4 478.7262 477.8099 66.745 0.1144 1961 +1963 4 477.7047 477.318 66.9477 0.1144 1962 +1964 4 476.6293 476.9897 67.1924 0.1144 1963 +1965 4 475.5871 476.6899 67.4419 0.1144 1964 +1966 4 474.9533 475.8079 67.7564 0.1144 1965 +1967 4 474.6124 474.7703 68.1514 0.1144 1966 +1968 4 474.045 473.8116 68.5524 0.1144 1967 +1969 4 473.3723 472.9102 68.9352 0.1144 1968 +1970 4 472.631 472.0647 69.2524 0.1144 1969 +1971 4 471.7112 471.3863 69.4756 0.1144 1970 +1972 4 471.0351 470.5272 69.6119 0.1144 1971 +1973 4 470.4242 469.58 69.6819 0.1144 1972 +1974 4 469.7092 468.6888 69.7119 0.1144 1973 +1975 4 468.9908 467.7999 69.7194 0.1144 1974 +1976 4 468.4268 466.8115 69.72 0.1144 1975 +1977 4 467.4773 466.2509 69.72 0.1144 1976 +1978 4 466.6056 465.5176 69.72 0.1398 1977 +1979 4 465.4936 465.2648 69.72 0.1907 1978 +1980 4 491.6489 482.8103 65.8801 0.1398 1949 +1981 4 490.8595 482.3241 65.333 0.1525 1980 +1982 4 490.8069 481.2087 65.1392 0.1907 1981 +1983 4 490.3745 480.1665 64.9544 0.2415 1982 +1984 4 489.727 479.2525 64.7651 0.2415 1983 +1985 4 489.02 478.3544 64.6755 0.2034 1984 +1986 4 488.2786 477.5079 64.7469 0.178 1985 +1987 4 487.5293 476.7906 65.0387 0.178 1986 +1988 4 486.5558 476.2014 65.3324 0.178 1987 +1989 4 485.5536 475.65 65.5827 0.1525 1988 +1990 4 484.5206 475.1593 65.7731 0.1271 1989 +1991 4 483.4807 474.6822 65.9504 0.1144 1990 +1992 4 544.679 487.4184 39.9297 0.1525 1892 +1993 4 544.5051 486.2892 39.9655 0.1398 1992 +1994 4 544.2774 485.1681 40.0092 0.1398 1993 +1995 4 544.0075 484.0573 40.0392 0.1398 1994 +1996 4 543.9159 482.9167 40.0389 0.1652 1995 +1997 4 543.9159 481.775 40.0089 0.1652 1996 +1998 4 543.9159 480.6322 39.9585 0.1652 1997 +1999 4 542.8291 481.5965 39.2384 0.1907 1998 +2000 4 542.0123 481.5096 38.817 0.178 1999 +2001 4 541.1612 480.7568 38.645 0.1652 2000 +2002 4 540.3272 479.9801 38.4796 0.178 2001 +2003 4 539.6385 479.0809 38.2824 0.1652 2002 +2004 4 538.9819 478.16 38.0369 0.1652 2003 +2005 4 538.1994 477.3409 37.774 0.1652 2004 +2006 4 537.3848 476.5401 37.529 0.178 2005 +2007 4 536.5715 475.7381 37.2949 0.1907 2006 +2008 4 535.7375 474.9613 37.0289 0.1652 2007 +2009 4 535.2879 474.0153 36.6621 0.1398 2008 +2010 4 535.217 473.012 36.1438 0.1271 2009 +2011 4 534.8795 471.9995 35.6174 0.1398 2010 +2012 4 534.1874 471.1049 35.1954 0.1525 2011 +2013 4 533.6909 470.0948 34.844 0.1525 2012 +2014 4 533.3042 469.0183 34.5587 0.1652 2013 +2015 4 532.9724 467.9395 34.2583 0.178 2014 +2016 4 532.6361 466.8675 33.9074 0.178 2015 +2017 4 532.1819 465.8437 33.488 0.1525 2016 +2018 4 531.7461 464.8118 33.0019 0.1271 2017 +2019 4 531.4761 463.7307 32.4657 0.1144 2018 +2020 4 531.3033 462.6279 31.8993 0.1144 2019 +2021 4 531.3239 461.5125 31.3309 0.1144 2020 +2022 4 531.404 460.3925 30.7737 0.1144 2021 +2023 4 531.3216 459.284 30.2179 0.1271 2022 +2024 4 530.8332 458.307 29.657 0.1525 2023 +2025 4 530.9155 457.2579 29.0802 0.1907 2024 +2026 4 531.3972 456.2306 28.6152 0.2288 2025 +2027 4 531.9074 455.2159 28.2111 0.2415 2026 +2028 4 531.4429 454.2732 27.785 0.2542 2027 +2029 4 530.3161 454.0788 27.467 0.2288 2028 +2030 4 529.1915 453.8671 27.2276 0.2161 2029 +2031 4 528.0818 453.5903 27.0374 0.178 2030 +2032 4 526.9733 453.3386 26.8599 0.1907 2031 +2033 4 526.1485 452.5778 26.6185 0.2034 2032 +2034 4 525.4701 451.6947 26.3113 0.2288 2033 +2035 4 524.5537 451.0106 26.02 0.2034 2034 +2036 4 523.6031 450.3917 25.7374 0.1907 2035 +2037 4 522.5964 450.0862 25.4466 0.1652 2036 +2038 4 522.681 449.0566 25.0296 0.1907 2037 +2039 4 522.5769 448.5018 24.4814 0.1907 2038 +2040 4 521.6194 448.7454 23.9956 0.2034 2039 +2041 4 520.8369 449.5394 23.5068 0.178 2040 +2042 4 519.8622 449.7053 23.0097 0.178 2041 +2043 4 518.8006 449.3254 22.5536 0.178 2042 +2044 4 517.7538 448.909 22.1317 0.178 2043 +2045 4 516.7883 448.3553 21.7209 0.1525 2044 +2046 4 515.9818 447.5957 21.3039 0.1398 2045 +2047 4 515.2439 446.7354 20.9499 0.1525 2046 +2048 4 514.5254 445.8465 20.6891 0.1907 2047 +2049 4 513.6812 445.0846 20.5045 0.2034 2048 +2050 4 512.9993 444.1855 20.3766 0.2034 2049 +2051 4 512.8335 443.0872 20.2799 0.2034 2050 +2052 4 513.2281 442.0439 20.1846 0.2415 2051 +2053 4 513.8368 441.0761 20.0684 0.2796 2052 +2054 4 514.5678 440.2009 19.9252 0.2796 2053 +2055 4 515.3709 439.3875 19.7489 0.2415 2054 +2056 4 516.1556 438.9402 19.3576 0.1907 2055 +2057 4 516.2071 438.1657 18.7802 0.1652 2056 +2058 4 515.6031 437.2425 18.3919 0.1525 2057 +2059 4 515.9875 436.2312 18.1933 0.1525 2058 +2060 4 543.996 480.1528 39.9204 0.2796 1998 +2061 4 544.1848 479.0248 39.9 0.3051 2060 +2062 4 544.3713 477.8957 39.8997 0.3051 2061 +2063 4 544.2111 476.7643 39.9218 0.3051 2062 +2064 4 544.0464 475.6317 39.9675 0.2924 2063 +2065 4 543.8565 474.5037 40.035 0.2924 2064 +2066 4 543.6448 473.3792 40.1223 0.2924 2065 +2067 4 543.4389 472.2546 40.2427 0.3051 2066 +2068 4 543.2799 471.1472 40.4662 0.2796 2067 +2069 4 543.1792 470.0273 40.7515 0.2542 2068 +2070 4 543.305 468.8913 41.0242 0.2161 2069 +2071 4 543.4309 467.7564 41.2768 0.2161 2070 +2072 4 543.5258 466.6376 41.5582 0.2161 2071 +2073 4 543.6116 465.5268 41.8603 0.2288 2072 +2074 4 544.6218 464.7992 41.3468 0.2034 2073 +2075 4 545.3219 463.9114 40.9335 0.2161 2074 +2076 4 546.2783 463.288 40.7792 0.2161 2075 +2077 4 547.4223 463.2445 40.616 0.2288 2076 +2078 4 548.5652 463.2353 40.423 0.2415 2077 +2079 4 549.6714 463.0523 40.1372 0.2415 2078 +2080 4 550.6392 462.5169 39.7872 0.2288 2079 +2081 4 551.1884 461.5148 39.459 0.2034 2080 +2082 4 551.6986 460.5138 39.0754 0.1907 2081 +2083 4 552.2935 459.7439 38.5563 0.2034 2082 +2084 4 553.3654 459.9692 38.0579 0.1907 2083 +2085 4 554.3069 460.5 37.7087 0.178 2084 +2086 4 554.9258 461.3134 37.2548 0.1525 2085 +2087 4 555.3903 461.9712 36.7094 0.178 2086 +2088 4 556.3043 461.5685 36.1827 0.2161 2087 +2089 4 556.9701 460.6808 35.7064 0.2415 2088 +2090 4 557.8441 460.1099 35.2685 0.2288 2089 +2091 4 558.8989 459.7496 34.858 0.2161 2090 +2092 4 559.9159 459.308 34.6223 0.2288 2091 +2093 4 560.9387 459.3114 34.5657 0.2542 2092 +2094 4 561.8607 459.7919 34.4154 0.2415 2093 +2095 4 562.7164 460.1523 34.0192 0.2161 2094 +2096 4 563.5893 460.7323 33.5689 0.1907 2095 +2097 4 564.6532 460.7712 33.1646 0.2034 2096 +2098 4 565.565 460.134 32.788 0.2161 2097 +2099 4 566.4848 459.4567 32.4402 0.2288 2098 +2100 4 567.5716 459.2199 32.0874 0.2161 2099 +2101 4 568.6298 459.4899 31.675 0.2161 2100 +2102 4 569.7314 459.5814 31.1942 0.2161 2101 +2103 4 570.157 460.3101 30.5046 0.2415 2102 +2104 4 570.4716 461.4095 29.9158 0.2542 2103 +2105 4 570.6009 462.5444 29.4157 0.2669 2104 +2106 4 570.9315 463.5774 29.0993 0.2669 2105 +2107 4 571.0448 464.4915 28.6415 0.2542 2106 +2108 4 571.6579 464.1654 27.932 0.2415 2107 +2109 4 572.5457 463.4905 27.2821 0.2161 2108 +2110 4 573.6291 463.3177 26.6268 0.1907 2109 +2111 4 574.6232 463.5717 25.8588 0.1652 2110 +2112 4 575.4961 464.0281 25.0109 0.1525 2111 +2113 4 576.3323 464.7672 24.2673 0.1525 2112 +2114 4 577.1514 465.5588 23.6494 0.1525 2113 +2115 4 578.0598 466.0702 23.038 0.1525 2114 +2116 4 578.8468 465.5199 22.4687 0.1525 2115 +2117 4 578.5197 464.782 21.9413 0.1398 2116 +2118 4 577.6262 464.6619 21.2945 0.1398 2117 +2119 4 577.7429 464.9937 20.4695 0.1525 2118 +2120 4 578.7393 464.7797 19.8071 0.1907 2119 +2121 4 579.8158 464.6264 19.4548 0.2034 2120 +2122 4 580.8923 464.8816 19.3115 0.2034 2121 +2123 4 581.9963 465.0829 19.3039 0.2034 2122 +2124 4 582.8325 465.8322 19.2672 0.2415 2123 +2125 4 583.6802 466.4031 18.8101 0.1525 2124 +2126 4 584.4696 467.0288 17.7782 0.178 2125 +2127 4 585.1457 467.9154 17.3778 0.178 2126 +2128 4 585.5095 468.992 17.0361 0.1525 2127 +2129 4 586.0163 469.9941 16.6928 0.1525 2128 +2130 4 586.9532 470.5615 15.9191 0.1652 2129 +2131 4 582.9515 465.3563 19.0995 0.1271 2124 +2132 4 583.0911 464.3313 18.7623 0.1398 2131 +2133 4 583.551 463.5248 18.3808 0.1525 2132 +2134 4 584.5462 463.5534 17.9294 0.1398 2133 +2135 4 585.5976 463.8314 17.5842 0.1271 2134 +2136 4 586.5608 463.4504 17.4769 0.1144 2135 +2137 4 587.4943 463.5831 17.6355 0.1144 2136 +2138 4 588.1807 462.9699 17.9929 0.1144 2137 +2139 4 588.4221 461.8671 18.2925 0.1144 2138 +2140 4 589.2309 461.0984 18.4455 0.1144 2139 +2141 4 590.1587 460.492 18.1933 0.1144 2140 +2142 4 543.3417 464.6207 42.0445 0.1144 2073 +2143 4 543.1415 463.5053 42.1478 0.1271 2142 +2144 4 543.1655 462.3648 42.2162 0.1525 2143 +2145 4 543.2547 461.2242 42.2688 0.1907 2144 +2146 4 543.265 460.0825 42.3186 0.2034 2145 +2147 4 543.2009 458.9396 42.385 0.2034 2146 +2148 4 543.1357 457.8025 42.5009 0.1907 2147 +2149 4 543.0705 456.6711 42.681 0.1907 2148 +2150 4 542.9836 455.5408 42.8943 0.1907 2149 +2151 4 542.8486 454.4071 43.0956 0.178 2150 +2152 4 542.6839 453.2745 43.2648 0.178 2151 +2153 4 542.5832 452.1408 43.4283 0.1652 2152 +2154 4 542.5603 451.006 43.6083 0.178 2153 +2155 4 542.7388 449.902 43.764 0.178 2154 +2156 4 543.1609 448.8576 43.9228 0.2034 2155 +2157 4 543.2959 447.7662 44.0877 0.2034 2156 +2158 4 543.1174 446.6382 44.214 0.1907 2157 +2159 4 543.082 445.5079 44.296 0.1652 2158 +2160 4 543.2273 444.3754 44.3346 0.1525 2159 +2161 4 543.3703 443.2417 44.3674 0.1652 2160 +2162 4 543.4343 442.1182 44.4559 0.1652 2161 +2163 4 543.4526 440.9868 44.5802 0.178 2162 +2164 4 543.4583 439.8463 44.6751 0.1652 2163 +2165 4 543.4583 438.7034 44.7224 0.1907 2164 +2166 4 543.4583 437.5606 44.7348 0.1907 2165 +2167 4 543.4583 436.4188 44.7213 0.2288 2166 +2168 4 543.4583 435.2748 44.7042 0.2415 2167 +2169 4 543.4583 434.132 44.7216 0.2796 2168 +2170 4 543.4583 432.9891 44.7871 0.2669 2169 +2171 4 543.4286 431.8497 44.9033 0.2415 2170 +2172 4 543.3725 430.7137 45.0663 0.1907 2171 +2173 4 543.2982 429.5777 45.2519 0.1652 2172 +2174 4 543.1929 428.4394 45.4205 0.1398 2173 +2175 4 543.0728 427.3012 45.5557 0.1271 2174 +2176 4 543.011 426.1663 45.694 0.1144 2175 +2177 4 543.0007 425.036 45.864 0.1144 2176 +2178 4 542.9893 423.8978 46.0242 0.1271 2177 +2179 4 542.844 422.7904 46.0886 0.1652 2178 +2180 4 542.7594 421.6658 46.0984 0.2161 2179 +2181 4 542.9779 420.555 46.1255 0.2415 2180 +2182 4 543.5133 419.8423 46.366 0.2161 2181 +2183 4 543.7615 418.8035 46.5836 0.1652 2182 +2184 4 543.9388 417.6744 46.7365 0.1525 2183 +2185 4 544.1173 416.5453 46.8404 0.1907 2184 +2186 4 544.2946 415.4161 46.8955 0.2542 2185 +2187 4 544.4948 414.2904 46.9092 0.2669 2186 +2188 4 544.8437 413.2036 46.9168 0.2288 2187 +2189 4 545.219 412.1237 46.9622 0.1652 2188 +2190 4 545.5953 411.0438 47.0492 0.1398 2189 +2191 4 545.9706 409.9627 47.1727 0.1398 2190 +2192 4 546.2406 408.8622 47.3654 0.1525 2191 +2193 4 546.4625 407.7571 47.623 0.1398 2192 +2194 4 546.6787 406.652 47.92 0.1398 2193 +2195 4 546.8949 405.5469 48.2334 0.1525 2194 +2196 4 547.0185 404.4154 48.5111 0.178 2195 +2197 4 547.0505 403.2726 48.7144 0.178 2196 +2198 4 547.0688 402.1286 48.8452 0.1525 2197 +2199 4 547.0871 400.9857 48.9199 0.1271 2198 +2200 4 547.1066 399.8417 48.9563 0.1271 2199 +2201 4 547.1329 398.6977 48.9714 0.1525 2200 +2202 4 547.3605 397.58 48.9807 0.178 2201 +2203 4 547.6225 396.4658 48.9927 0.1907 2202 +2204 4 547.8845 395.3527 49.0092 0.1907 2203 +2205 4 548.1465 394.2384 49.0316 0.2161 2204 +2206 4 548.3638 393.1162 49.0641 0.2542 2205 +2207 4 548.4988 391.9802 49.1123 0.2924 2206 +2208 4 548.6201 390.843 49.177 0.3051 2207 +2209 4 548.7425 389.7059 49.2584 0.2924 2208 +2210 4 548.8637 388.5688 49.3562 0.2669 2209 +2211 4 549.0113 387.4362 49.4813 0.2161 2210 +2212 4 549.2069 386.3151 49.6507 0.1652 2211 +2213 4 549.4106 385.1974 49.8534 0.1271 2212 +2214 4 549.6142 384.0797 50.0755 0.1144 2213 +2215 4 549.7629 382.9517 50.2956 0.1271 2214 +2216 4 549.803 381.8123 50.4896 0.1525 2215 +2217 4 549.827 380.6706 50.6484 0.178 2216 +2218 4 549.851 379.5289 50.7693 0.178 2217 +2219 4 549.8728 378.386 50.8452 0.1652 2218 +2220 4 549.875 377.25 50.8306 0.178 2219 +2221 4 549.875 376.114 50.7483 0.2161 2220 +2222 4 549.875 374.9792 50.6293 0.2669 2221 +2223 4 549.875 373.8432 50.4997 0.2669 2222 +2224 4 550.0272 372.7129 50.4333 0.2415 2223 +2225 4 550.3052 371.6135 50.475 0.178 2224 +2226 4 550.5969 370.5176 50.6108 0.1398 2225 +2227 4 550.8898 369.4216 50.8119 0.1144 2226 +2228 4 551.1723 368.3177 51.0322 0.1271 2227 +2229 4 551.4366 367.2057 51.2252 0.1525 2228 +2230 4 551.6986 366.0914 51.3845 0.178 2229 +2231 4 551.9606 364.9783 51.5197 0.1907 2230 +2232 4 552.2225 363.8641 51.6454 0.1907 2231 +2233 4 552.3129 362.7338 51.8199 0.1907 2232 +2234 4 552.3198 361.6058 52.0579 0.1907 2233 +2235 4 552.3198 360.4778 52.344 0.178 2234 +2236 4 552.3198 359.3498 52.6568 0.1652 2235 +2237 4 552.218 358.2196 52.9586 0.1398 2236 +2238 4 551.8931 357.1271 53.1989 0.1271 2237 +2239 4 551.5464 356.0368 53.3758 0.1144 2238 +2240 4 551.1986 354.9466 53.5027 0.1398 2239 +2241 4 550.8509 353.8575 53.5945 0.1652 2240 +2242 4 550.9344 352.7249 53.6606 0.1907 2241 +2243 4 551.0957 351.5924 53.718 0.1652 2242 +2244 4 551.2604 350.461 53.7807 0.1398 2243 +2245 4 551.4252 349.3284 53.8549 0.1144 2244 +2246 4 551.5899 348.197 53.9445 0.1271 2245 +2247 4 551.4114 347.0804 54.0994 0.1398 2246 +2248 4 551.1941 345.9673 54.3096 0.1525 2247 +2249 4 550.9767 344.8554 54.5574 0.1398 2248 +2250 4 550.7582 343.7423 54.826 0.1271 2249 +2251 4 550.5843 342.6154 55.0785 0.1271 2250 +2252 4 550.4276 341.484 55.2997 0.1398 2251 +2253 4 550.272 340.3537 55.4842 0.1652 2252 +2254 4 550.1164 339.2223 55.638 0.178 2253 +2255 4 549.9963 338.0863 55.7617 0.1907 2254 +2256 4 550.0283 336.9435 55.844 0.1907 2255 +2257 4 550.0752 335.8006 55.8958 0.2034 2256 +2258 4 550.121 334.6578 55.9258 0.2161 2257 +2259 4 550.1679 333.5138 55.9404 0.2288 2258 +2260 4 550.137 332.3709 55.9454 0.2161 2259 +2261 4 550.081 331.228 55.9465 0.2161 2260 +2262 4 550.0238 330.0852 55.9474 0.2161 2261 +2263 4 549.9666 328.9435 55.9488 0.2288 2262 +2264 4 549.9094 327.8006 55.9507 0.2415 2263 +2265 4 549.795 326.6623 55.9532 0.2415 2264 +2266 4 549.6131 325.5332 55.9572 0.2415 2265 +2267 4 549.4254 324.4052 55.9622 0.2034 2266 +2268 4 549.2367 323.2761 55.9695 0.1907 2267 +2269 4 549.0491 322.1481 55.9796 0.1907 2268 +2270 4 548.8603 321.019 55.9938 0.2542 2269 +2271 4 548.6727 319.891 56.014 0.2924 2270 +2272 4 548.4839 318.763 56.042 0.3178 2271 +2273 4 548.2963 317.6339 56.0804 0.2924 2272 +2274 4 548.1087 316.5059 56.131 0.2796 2273 +2275 4 547.9291 315.3768 56.212 0.2542 2274 +2276 4 547.7564 314.2476 56.3276 0.2415 2275 +2277 4 547.5825 313.1197 56.4721 0.2542 2276 +2278 4 547.4086 311.9905 56.6401 0.2924 2277 +2279 4 547.2358 310.8614 56.826 0.3051 2278 +2280 4 547.0768 309.7369 57.0441 0.2796 2279 +2281 4 546.9189 308.6123 57.2816 0.2161 2280 +2282 4 546.7622 307.4889 57.5249 0.178 2281 +2283 4 546.6043 306.3643 57.7643 0.1398 2282 +2284 4 546.4316 305.2352 57.9667 0.1271 2283 +2285 4 546.2451 304.1072 58.109 0.1144 2284 +2286 4 546.0564 302.9792 58.1977 0.1144 2285 +2287 4 545.8688 301.8501 58.2462 0.1144 2286 +2288 4 545.6811 300.7221 58.2672 0.1144 2287 +2289 4 545.5324 299.5873 58.2725 0.1144 2288 +2290 4 545.4112 298.4502 58.2719 0.1144 2289 +2291 4 545.2922 297.3119 58.2708 0.1144 2290 +2292 4 545.1721 296.1747 58.2691 0.1144 2291 +2293 4 545.0519 295.0365 58.2669 0.1271 2292 +2294 4 544.8197 293.9176 58.2638 0.1398 2293 +2295 4 544.4868 292.8228 58.259 0.1525 2294 +2296 4 544.1459 291.7314 58.2526 0.1398 2295 +2297 4 543.805 290.6389 58.2442 0.1271 2296 +2298 4 543.4675 289.5464 58.2338 0.1144 2297 +2299 4 543.1918 288.4367 58.2126 0.1144 2298 +2300 4 542.9218 287.3248 58.1846 0.1144 2299 +2301 4 542.6518 286.2139 58.1538 0.1144 2300 +2302 4 542.4734 285.0837 58.1353 0.1144 2301 +2303 4 542.3487 283.9477 58.1347 0.1144 2302 +2304 4 542.2263 282.8105 58.1487 0.1144 2303 +2305 4 542.1038 281.6722 58.1742 0.1144 2304 +2306 4 541.9826 280.5351 58.2058 0.1144 2305 +2307 4 541.9357 279.3923 58.2344 0.1144 2306 +2308 4 541.9322 278.2483 58.2551 0.1144 2307 +2309 4 541.9322 277.1043 58.2683 0.1271 2308 +2310 4 541.9322 275.9603 58.2761 0.1398 2309 +2311 4 541.8842 274.8174 58.2806 0.1652 2310 +2312 4 541.8098 273.6757 58.2837 0.178 2311 +2313 4 541.732 272.5351 58.287 0.1907 2312 +2314 4 541.6554 271.3934 58.2921 0.178 2313 +2315 4 541.5788 270.2517 58.2988 0.1525 2314 +2316 4 541.4678 269.1134 58.308 0.1398 2315 +2317 4 541.3065 267.9809 58.3215 0.1525 2316 +2318 4 541.1417 266.8483 58.3402 0.178 2317 +2319 4 540.977 265.7169 58.3657 0.178 2318 +2320 4 540.8123 264.5843 58.3996 0.1525 2319 +2321 4 540.7162 263.4449 58.4514 0.1271 2320 +2322 4 540.7105 262.3032 58.5298 0.1271 2321 +2323 4 540.7105 261.1603 58.6289 0.1398 2322 +2324 4 540.7105 260.0175 58.7423 0.178 2323 +2325 4 540.7105 258.8758 58.8647 0.1907 2324 +2326 4 540.683 257.7329 58.9904 0.2034 2325 +2327 4 540.4222 256.6209 59.1002 0.1652 2326 +2328 4 540.1442 255.5113 59.1984 0.1398 2327 +2329 4 539.8673 254.4016 59.2931 0.1144 2328 +2330 4 539.7975 253.2644 59.4233 0.1271 2329 +2331 4 539.7941 252.1273 59.5913 0.1525 2330 +2332 4 539.7941 250.9902 59.787 0.178 2331 +2333 4 539.7941 249.853 59.999 0.178 2332 +2334 4 539.7941 248.7159 60.2134 0.1525 2333 +2335 4 539.6534 247.5822 60.3907 0.1271 2334 +2336 4 539.4452 246.4576 60.5161 0.1144 2335 +2337 4 539.2324 245.3331 60.6001 0.1271 2336 +2338 4 539.0208 244.2097 60.6561 0.1525 2337 +2339 4 538.808 243.0851 60.7009 0.178 2338 +2340 4 538.4614 241.996 60.7463 0.1907 2339 +2341 4 538.0804 240.9172 60.7981 0.1907 2340 +2342 4 538.0049 239.7778 60.8555 0.1907 2341 +2343 4 538.26 238.6693 60.9484 0.178 2342 +2344 4 539.0814 238.2288 61.2455 0.1525 2343 +2345 4 538.8309 237.1226 61.3928 0.1271 2344 +2346 4 538.5803 236.0164 61.4146 0.1144 2345 +2347 4 538.3309 234.9112 61.3351 0.1144 2346 +2348 4 538.0804 233.805 61.1783 0.1144 2347 +2349 4 537.8299 232.6965 60.9748 0.1144 2348 +2350 4 537.5885 231.5776 60.7919 0.1144 2349 +2351 4 537.346 230.4599 60.6687 0.1144 2350 +2352 4 537.1046 229.3423 60.5889 0.1271 2351 +2353 4 536.9959 228.2028 60.5357 0.1525 2352 +2354 4 536.9272 227.0611 60.4937 0.178 2353 +2355 4 536.8598 225.9194 60.4486 0.1907 2354 +2356 4 536.7923 224.7777 60.3901 0.178 2355 +2357 4 536.7065 223.6371 60.3061 0.178 2356 +2358 4 536.5577 222.5137 60.1642 0.178 2357 +2359 4 536.4079 221.3903 59.9844 0.2161 2358 +2360 4 536.258 220.2669 59.7867 0.2415 2359 +2361 4 536.0978 219.1389 59.6019 0.2669 2360 +2362 4 535.8851 218.0224 59.5151 0.2669 2361 +2363 4 535.6711 216.9047 59.5045 0.2669 2362 +2364 4 535.4584 215.7881 59.5426 0.2542 2363 +2365 4 535.2433 214.6705 59.6005 0.2288 2364 +2366 4 534.9527 213.5779 59.5529 0.1907 2365 +2367 4 534.6495 212.4946 59.3984 0.1652 2366 +2368 4 534.3475 211.4112 59.1595 0.1398 2367 +2369 4 534.0455 210.3278 58.8728 0.1271 2368 +2370 4 534.0318 209.1861 58.6312 0.1144 2369 +2371 4 534.0787 208.0433 58.4564 0.1144 2370 +2372 4 534.1279 206.8993 58.3506 0.1144 2371 +2373 4 534.1759 205.7564 58.2968 0.1144 2372 +2374 4 534.0878 204.6158 58.277 0.1144 2373 +2375 4 533.9242 203.4844 58.2739 0.1144 2374 +2376 4 533.7595 202.3519 58.2733 0.1398 2375 +2377 4 533.5948 201.2204 58.2728 0.1652 2376 +2378 4 533.43 200.0879 58.2719 0.1907 2377 +2379 4 533.4644 198.945 58.2705 0.1652 2378 +2380 4 533.5833 197.8068 58.2688 0.1398 2379 +2381 4 533.7035 196.6696 58.2663 0.1144 2380 +2382 4 533.8224 195.5313 58.263 0.1398 2381 +2383 4 533.9426 194.3942 58.2582 0.1907 2382 +2384 4 534.1496 193.2685 58.2515 0.2542 2383 +2385 4 534.4116 192.1554 58.242 0.2924 2384 +2386 4 534.6736 191.0411 58.2288 0.2796 2385 +2387 4 534.9355 189.928 58.2103 0.2669 2386 +2388 4 535.1975 188.8138 58.1851 0.2415 2387 +2389 4 535.0568 187.6789 58.1493 0.2669 2388 +2390 4 534.8921 186.5475 58.098 0.2542 2389 +2391 4 534.7273 185.4149 58.0269 0.2415 2390 +2392 4 534.5626 184.2835 57.9314 0.178 2391 +2393 4 534.3979 183.151 57.8091 0.1398 2392 +2394 4 534.7113 181.8949 57.5848 0.1144 2393 +2395 4 534.9859 180.7989 57.293 0.1144 2394 +2396 4 535.2593 179.703 56.9545 0.1144 2395 +2397 4 535.5339 178.6081 56.588 0.1271 2396 +2398 4 535.8084 177.5088 56.2192 0.1398 2397 +2399 4 536.0853 176.4048 55.8779 0.1525 2398 +2400 4 536.3621 175.2963 55.5772 0.1525 2399 +2401 4 536.639 174.1889 55.3008 0.1525 2400 +2402 4 536.9147 173.0815 55.0351 0.1525 2401 +2403 4 537.1709 171.9729 54.754 0.1398 2402 +2404 4 537.4066 170.8633 54.4373 0.1271 2403 +2405 4 537.6434 169.7536 54.0848 0.1144 2404 +2406 4 537.8791 168.6439 53.6992 0.1271 2405 +2407 4 538.1639 167.5525 53.2745 0.1398 2406 +2408 4 538.5151 166.4898 52.8024 0.178 2407 +2409 4 538.8835 165.435 52.295 0.1907 2408 +2410 4 539.253 164.3802 51.7678 0.2034 2409 +2411 4 539.4646 163.2968 51.2341 0.1652 2410 +2412 4 539.4887 162.1814 50.7063 0.1525 2411 +2413 4 539.4887 161.0649 50.197 0.1525 2412 +2414 4 539.5756 159.9461 49.7316 0.178 2413 +2415 4 539.8399 158.841 49.3455 0.178 2414 +2416 4 540.1876 157.7507 49.0364 0.1652 2415 +2417 4 540.5354 156.6616 48.7774 0.1652 2416 +2418 4 540.8901 155.5748 48.5405 0.178 2417 +2419 4 541.3053 154.5269 48.265 0.178 2418 +2420 4 541.7709 153.5145 47.9147 0.1652 2419 +2421 4 542.2366 152.5009 47.5048 0.1652 2420 +2422 4 542.7376 151.4976 47.0686 0.178 2421 +2423 4 543.3222 150.5264 46.6544 0.178 2422 +2424 4 543.9548 149.5769 46.2862 0.1525 2423 +2425 4 544.5875 148.6273 45.9609 0.1271 2424 +2426 4 545.3196 147.7648 45.6593 0.1144 2425 +2427 4 546.2154 147.0784 45.3547 0.1144 2426 +2428 4 547.1729 146.4766 45.0358 0.1144 2427 +2429 4 548.1304 145.8749 44.7028 0.1144 2428 +2430 4 549.0136 145.1702 44.3752 0.1144 2429 +2431 4 549.8098 144.3545 44.07 0.1144 2430 +2432 4 550.59 143.5217 43.7884 0.1144 2431 +2433 4 551.3691 142.6888 43.5271 0.1144 2432 +2434 4 552.1356 141.8514 43.2645 0.1144 2433 +2435 4 552.8929 141.0117 42.9884 0.1144 2434 +2436 4 553.6491 140.1709 42.7062 0.1144 2435 +2437 4 554.3412 139.2751 42.4393 0.1144 2436 +2438 4 554.8606 138.2661 42.2257 0.1398 2437 +2439 4 555.285 137.2034 42.0767 0.1652 2438 +2440 4 555.7106 136.1417 41.9801 0.1907 2439 +2441 4 556.119 135.0732 41.9208 0.1652 2440 +2442 4 556.2906 133.9601 41.8816 0.1398 2441 +2443 4 556.2906 132.8161 41.8471 0.1144 2442 +2444 4 556.3444 131.6744 41.8023 0.1144 2443 +2445 4 556.4668 130.5361 41.7388 0.1144 2444 +2446 4 556.8088 129.4608 41.652 0.1144 2445 +2447 4 557.4781 128.5478 41.5405 0.1144 2446 +2448 4 558.1965 127.6693 41.37 0.1144 2447 +2449 4 558.8257 126.7483 41.1051 0.1144 2448 +2450 4 559.3405 125.7988 40.7369 0.1144 2449 +2451 4 559.8828 124.8218 40.3819 0.1271 2450 +2452 4 560.4639 123.8369 40.1008 0.1398 2451 +2453 4 561.0451 122.8519 39.8916 0.1652 2452 +2454 4 561.5484 121.8268 39.7513 0.1652 2453 +2455 4 561.7223 120.7137 39.6743 0.178 2454 +2456 4 561.7601 119.5709 39.641 0.1652 2455 +2457 4 561.7967 118.4269 39.6248 0.1652 2456 +2458 4 561.8344 117.284 39.6136 0.1398 2457 +2459 4 561.8722 116.1412 39.6046 0.1398 2458 +2460 4 562.1238 115.0349 39.5948 0.1398 2459 +2461 4 562.5265 113.9644 39.5819 0.178 2460 +2462 4 562.951 112.9022 39.5643 0.2034 2461 +2463 4 563.3765 111.8401 39.5394 0.2542 2462 +2464 4 563.8513 110.8001 39.5044 0.2669 2463 +2465 4 564.3993 109.7963 39.4545 0.2796 2464 +2466 4 564.969 108.8047 39.3862 0.2415 2465 +2467 4 565.5398 107.8127 39.2958 0.2161 2466 +2468 4 566.042 106.7886 39.163 0.1907 2467 +2469 4 566.3944 105.7185 38.9556 0.1907 2468 +2470 4 566.6976 104.6354 38.6823 0.178 2469 +2471 4 566.9996 103.5521 38.3698 0.1652 2470 +2472 4 567.3348 102.4715 38.0576 0.1525 2471 +2473 4 567.7432 101.4067 37.7986 0.1525 2472 +2474 4 568.1768 100.3481 37.6071 0.1398 2473 +2475 4 568.6103 99.2897 37.4763 0.1398 2474 +2476 4 569.0496 98.2337 37.3929 0.1652 2475 +2477 4 569.5404 97.2011 37.3472 0.2034 2476 +2478 4 570.0518 96.1781 37.3254 0.2161 2477 +2479 4 570.5643 95.1548 37.3153 0.178 2478 +2480 4 571.0756 94.132 37.3128 0.1525 2479 +2481 4 571.6843 93.1658 37.3159 0.1398 2480 +2482 4 572.3398 92.2279 37.3232 0.178 2481 +2483 4 572.9976 91.2919 37.3335 0.2034 2482 +2484 4 573.6554 90.356 37.3484 0.2288 2483 +2485 4 574.3029 89.413 37.3708 0.2161 2484 +2486 4 574.852 88.4121 37.4021 0.1907 2485 +2487 4 575.3645 87.389 37.4399 0.1652 2486 +2488 4 576.0532 86.4858 37.4833 0.1398 2487 +2489 4 576.5508 85.4777 37.581 0.1398 2488 +2490 4 576.8242 84.3827 37.7454 0.1398 2489 +2491 4 577.2475 83.3284 37.8952 0.1525 2490 +2492 4 578.133 82.8969 37.851 0.1398 2491 +2493 4 579.2392 82.7911 37.9047 0.1271 2492 +2494 4 579.6282 81.9364 38.6604 0.1144 2493 +2495 4 534.3818 182.2655 58.5164 0.1144 2393 +2496 4 534.3624 181.1295 58.7882 0.1525 2495 +2497 4 534.3418 179.9924 58.9095 0.1398 2496 +2498 4 534.3212 178.8552 59.0402 0.1525 2497 +2499 4 534.3029 177.717 59.1517 0.178 2498 +2500 4 534.296 176.5753 59.1895 0.2161 2499 +2501 4 534.296 175.4393 59.1287 0.2161 2500 +2502 4 534.296 174.3044 58.9915 0.1907 2501 +2503 4 534.296 173.1684 58.8073 0.1652 2502 +2504 4 534.2457 172.0347 58.6152 0.1525 2503 +2505 4 534.0707 170.9044 58.4662 0.1525 2504 +2506 4 533.8819 169.7753 58.3674 0.1525 2505 +2507 4 533.6943 168.6473 58.3111 0.1398 2506 +2508 4 533.5067 167.5182 58.2848 0.1398 2507 +2509 4 533.3179 166.3902 58.2767 0.1525 2508 +2510 4 533.1303 165.2622 58.2764 0.1907 2509 +2511 4 532.9416 164.1331 58.277 0.2161 2510 +2512 4 532.7539 163.0051 58.2778 0.2161 2511 +2513 4 532.5686 161.876 58.2789 0.1907 2512 +2514 4 532.4084 160.7434 58.2806 0.1525 2513 +2515 4 532.2883 159.6063 58.2828 0.1271 2514 +2516 4 532.1682 158.468 58.2862 0.1271 2515 +2517 4 532.0481 157.3309 58.2904 0.1398 2516 +2518 4 531.9268 156.1926 58.2966 0.1525 2517 +2519 4 531.785 155.0578 58.3052 0.1398 2518 +2520 4 531.5962 153.9298 58.3173 0.1271 2519 +2521 4 531.4086 152.8018 58.3344 0.1271 2520 +2522 4 531.2198 151.6727 58.3579 0.1398 2521 +2523 4 531.0276 150.5458 58.3901 0.1525 2522 +2524 4 530.8057 149.4236 58.4366 0.1398 2523 +2525 4 530.5392 148.3116 58.5043 0.1271 2524 +2526 4 530.2715 147.1996 58.5942 0.1144 2525 +2527 4 530.0049 146.0865 58.7062 0.1144 2526 +2528 4 529.7864 144.9688 58.8493 0.1144 2527 +2529 4 529.7132 143.8363 59.0464 0.1144 2528 +2530 4 529.7132 142.7048 59.2948 0.1144 2529 +2531 4 529.7132 141.5734 59.5745 0.1144 2530 +2532 4 529.7132 140.442 59.8671 0.1144 2531 +2533 4 529.7246 139.3083 60.1446 0.1144 2532 +2534 4 529.7692 138.1655 60.3638 0.1144 2533 +2535 4 529.8253 137.0237 60.5158 0.1144 2534 +2536 4 529.8825 135.8809 60.6169 0.1144 2535 +2537 4 529.9397 134.738 60.6855 0.1144 2536 +2538 4 530.0095 133.5963 60.739 0.1144 2537 +2539 4 530.1353 132.4603 60.797 0.1144 2538 +2540 4 530.1685 131.3392 60.8748 0.1144 2539 +2541 4 529.791 130.265 60.9787 0.1144 2540 +2542 4 529.3791 129.2079 61.117 0.1144 2541 +2543 4 529.3036 128.0983 61.3248 0.1144 2542 +2544 4 529.839 127.2757 61.6728 0.1144 2543 +2545 4 530.4053 126.436 62.0838 0.1144 2544 +2546 4 530.5895 125.3149 62.4392 0.1144 2545 +2547 4 530.6295 124.1732 62.7164 0.1144 2546 +2548 4 530.6295 123.0292 62.9194 0.1144 2547 +2549 4 530.6295 121.8852 63.061 0.1144 2548 +2550 4 530.6295 120.7412 63.1616 0.1144 2549 +2551 4 530.6295 119.5972 63.2556 0.1144 2550 +2552 4 530.6295 118.4566 63.392 0.1144 2551 +2553 4 530.6295 117.3195 63.5897 0.1144 2552 +2554 4 530.6295 116.1824 63.8378 0.1144 2553 +2555 4 530.6295 115.0452 64.1253 0.1271 2554 +2556 4 530.6295 113.9076 64.4434 0.1525 2555 +2557 4 530.8492 112.8153 64.792 0.178 2556 +2558 4 531.2999 111.7832 65.1636 0.178 2557 +2559 4 531.8834 110.8239 65.5427 0.1525 2558 +2560 4 532.5617 109.9588 65.9526 0.1271 2559 +2561 4 533.3339 109.1839 66.3816 0.1271 2560 +2562 4 534.2732 108.5891 66.6966 0.1525 2561 +2563 4 535.2536 108.1193 66.8105 0.2034 2562 +2564 4 536.1802 107.5147 66.8478 0.2288 2563 +2565 4 537.0165 106.7631 66.9662 0.2415 2564 +2566 4 537.8207 105.9886 67.191 0.2161 2565 +2567 4 538.6009 105.1889 67.5105 0.2161 2566 +2568 4 539.2896 104.3106 67.9098 0.2161 2567 +2569 4 539.944 103.4018 68.3553 0.2542 2568 +2570 4 540.5972 102.4929 68.7977 0.2796 2569 +2571 4 541.1143 101.4904 69.1704 0.2924 2570 +2572 4 541.4941 100.414 69.4431 0.2415 2571 +2573 4 541.8419 99.3245 69.6273 0.2034 2572 +2574 4 542.1896 98.2349 69.7432 0.2034 2573 +2575 4 542.5203 97.1401 69.8074 0.2542 2574 +2576 4 542.8005 96.0314 69.8312 0.2669 2575 +2577 4 543.0625 94.9178 69.8284 0.2288 2576 +2578 4 543.3256 93.8043 69.8076 0.1652 2577 +2579 4 543.5876 92.6909 69.7679 0.1271 2578 +2580 4 543.9571 91.6106 69.7046 0.1144 2579 +2581 4 544.3003 90.5203 69.6133 0.1144 2580 +2582 4 544.6367 89.4269 69.4915 0.1271 2581 +2583 4 545.2819 88.5072 69.34 0.1398 2582 +2584 4 545.7967 87.553 69.0645 0.1652 2583 +2585 4 546.2131 86.5581 68.6664 0.1652 2584 +2586 4 546.6307 85.5639 68.2016 0.178 2585 +2587 4 547.3525 84.7047 67.8031 0.1652 2586 +2588 4 548.1796 83.9195 67.5116 0.1652 2587 +2589 4 548.8523 83.0498 67.2487 0.1398 2588 +2590 4 549.5101 82.1395 67.1989 0.1271 2589 +2591 4 550.2354 81.5507 67.4775 0.1144 2590 +2592 4 551.2421 81.0208 68.2245 0.1144 2591 diff --git a/bmtk-vb/docs/tutorial/sources/chapter02/biophys_components/synaptic_models/AMPA_ExcToExc.json b/bmtk-vb/docs/tutorial/sources/chapter02/biophys_components/synaptic_models/AMPA_ExcToExc.json new file mode 100644 index 0000000..c758540 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter02/biophys_components/synaptic_models/AMPA_ExcToExc.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 1.0, + "tau2": 3.0, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter02/build_bionet.py b/bmtk-vb/docs/tutorial/sources/chapter02/build_bionet.py new file mode 100644 index 0000000..8b532d6 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter02/build_bionet.py @@ -0,0 +1,35 @@ +from bmtk.builder.networks import NetworkBuilder + + +cortex = NetworkBuilder('mcortex') +cortex.add_nodes(cell_name='Scnn1a_473845048', + potental='exc', + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic', + dynamics_params='472363762_fit.json', + morphology='Scnn1a_473845048_m.swc') + +cortex.build() +cortex.save_nodes(output_dir='network') + + +thalamus = NetworkBuilder('mthalamus') +thalamus.add_nodes(N=10, + pop_name='tON', + potential='exc', + level_of_detail='filter') + +thalamus.add_edges(source={'pop_name': 'tON'}, target=cortex.nodes(), + connection_rule=5, + syn_weight=0.001, + delay=2.0, + weight_function='wmax', + target_sections=['basal', 'apical'], + distance_range=[0.0, 150.0], + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +thalamus.build() +thalamus.save_nodes(output_dir='network') +thalamus.save_edges(output_dir='network') diff --git a/bmtk-vb/docs/tutorial/sources/chapter02/circuit_config.json b/bmtk-vb/docs/tutorial/sources/chapter02/circuit_config.json new file mode 100644 index 0000000..5ebbf36 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter02/circuit_config.json @@ -0,0 +1,32 @@ +{ + "manifest": { + "$BASE_DIR": ".", + "$COMPONENTS_DIR": "$BASE_DIR/biophys_components", + "$NETWORK_DIR": "$BASE_DIR/network" + }, + "components": { + "point_neuron_models_dir": "$COMPONENTS_DIR/point_neuron_templates", + "biophysical_neuron_models_dir": "$COMPONENTS_DIR/biophysical_neuron_templates", + "mechanisms_dir": "$COMPONENTS_DIR/mechanisms", + "morphologies_dir": "$COMPONENTS_DIR/morphologies", + "synaptic_models_dir": "$COMPONENTS_DIR/synaptic_models" + }, + "networks": { + "nodes": [ + { + "node_types_file": "$NETWORK_DIR/mcortex_node_types.csv", + "nodes_file": "$NETWORK_DIR/mcortex_nodes.h5" + }, + { + "node_types_file": "$NETWORK_DIR/mthalamus_node_types.csv", + "nodes_file": "$NETWORK_DIR/mthalamus_nodes.h5" + } + ], + "edges": [ + { + "edges_file": "$NETWORK_DIR/mthalamus_mcortex_edges.h5", + "edge_types_file": "$NETWORK_DIR/mthalamus_mcortex_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter02/create_spikes.py b/bmtk-vb/docs/tutorial/sources/chapter02/create_spikes.py new file mode 100644 index 0000000..26b4eef --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter02/create_spikes.py @@ -0,0 +1,5 @@ +from bmtk.utils.spike_trains import SpikesGenerator + +sg = SpikesGenerator(nodes='network/mthalamus_nodes.h5', t_max=3.0) +sg.set_rate(10.0) +sg.save_csv('thalamus_spikes.csv', in_ms=True) \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter02/run_bionet.py b/bmtk-vb/docs/tutorial/sources/chapter02/run_bionet.py new file mode 100644 index 0000000..ca8abeb --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter02/run_bionet.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +"""Simulates an example network of 14 cell receiving two kinds of exernal input as defined in configuration file""" + +import os, sys +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + graph = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=graph) + sim.run() + bionet.nrn.quit_execution() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/tutorial/sources/chapter02/simulation_config.json b/bmtk-vb/docs/tutorial/sources/chapter02/simulation_config.json new file mode 100644 index 0000000..d191eeb --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter02/simulation_config.json @@ -0,0 +1,46 @@ +{ + "manifest": { + "$OUTPUT_DIR": "$BASE_DIR/output", + "$BASE_DIR": "." + }, + "target_simulator": "NEURON", + "run": { + "nsteps_block": 5000, + "tstop": 2000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15.0 + }, + "conditions": { + "celsius": 34.0, + "v_init": -80.0 + }, + "inputs": { + "lgn_spikes": { + "input_type": "spikes", + "module": "csv", + "input_file": "${BASE_DIR}/thalamus_spikes.csv", + "node_set": "mthalamus" + } + + }, + "output": { + "spikes_file_csv": "spikes.csv", + "spikes_file": "spikes.h5", + "log_file": "log.txt", + "output_dir": "${OUTPUT_DIR}", + "overwrite_output_dir": true + }, + "reports": { + "membrane_report": { + "cells": "all", + "sections": "soma", + "module": "membrane_report", + "variable_name": [ + "v", + "cai" + ] + } + }, + "network": "./circuit_config.json" +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter02/thalamus_spikes.csv b/bmtk-vb/docs/tutorial/sources/chapter02/thalamus_spikes.csv new file mode 100644 index 0000000..5a78a7b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter02/thalamus_spikes.csv @@ -0,0 +1,11 @@ +gid spike-times +0 104.471674712,123.530266988,281.379818881,322.757120177,329.225649964,397.061790136,485.058536026,499.738178324,613.558235564,687.126133806,804.041759255,804.373905205,1000.11065232,1036.35870848,1142.92298762,1185.84515851,1274.24755745,1369.51852783,1415.59245853,1433.03407559,1521.57576051,1663.50819377,1735.63325307,1825.38254849,1973.71407951,1977.20631207,2148.30964832,2210.64905472,2323.85505546,2426.72251716,2536.20067968,2667.63944128,2740.65565989,2906.45503663 +1 59.8175930094,178.287560948,265.953009541,441.361121347,545.411116664,660.456769489,714.262871719,893.844991154,1035.68593303,1172.66871631,1331.32521273,1439.41680633,1559.42085887,1652.78349054,1721.18123698,1839.05849567,1995.9281141,2144.95626888,2301.74014268,2368.42799291,2522.71222459,2591.03096796,2623.32763154,2750.12599528,2866.40040742,2994.47952888 +2 175.650989965,359.213698905,497.79687958,529.03078107,671.839781946,994.112976352,1178.19692917,1203.79050126,1238.25629819,1324.55822388,1326.74147696,1405.66306632,1609.61872024,1766.72061999,1904.8551845,2055.77288791,2178.93556638,2252.06812732,2374.61336998,2390.282249,2465.25735597,2522.81955138,2604.40801573,2731.75496186,2860.68592907,2967.16156336 +3 209.396390524,324.313909412,457.628646597,468.616276303,518.513403244,547.598738113,627.8781845,793.71263058,853.407547968,908.337867202,1012.31259852,1193.48948443,1219.24170458,1393.72828094,1485.00403601,1603.69389089,1763.96429531,1862.89459761,1870.01854425,2043.64347683,2109.5963339,2225.42685445,2266.29438991,2284.1408502,2378.36578616,2455.55066673,2608.07955449,2616.23899922,2646.57177447,2835.09657036,2927.01285352 +4 98.7146974991,118.373581809,227.397322073,396.039223709,504.302589522,590.886976469,670.771248014,812.545823598,891.033221544,1070.57060258,1113.0930657,1240.60698687,1250.50070233,1428.99583596,1483.07178466,1659.33010361,1782.646053,1915.49376502,1985.61427489,2055.94335457,2258.91010499,2346.24698675,2454.25330735,2593.57317583,2640.43506776,2665.08254374,2702.54047248,2718.20694458,2950.44098978 +5 124.419340205,153.583008943,199.559743446,372.972729942,408.495203655,565.033807688,769.921732234,803.641181597,880.650319392,955.74592348,979.325424639,1048.52669906,1157.07355702,1186.22601644,1332.92087832,1374.39888354,1526.79047014,1642.40890727,1859.66974172,1963.18556888,1976.2086236,2059.04442261,2165.69216179,2321.78734936,2375.14390396,2401.82989629,2443.45201922,2530.57531865,2636.68689056,2723.4477134,2876.79001447 +6 141.926904598,332.575125173,486.691331845,533.916586711,682.458831757,691.131479419,801.763967043,951.918124112,1075.19805502,1139.60584441,1301.33802402,1437.90027577,1545.32270357,1645.08496652,1820.31404677,1902.51662955,1904.15380342,2172.07929222,2272.54636382,2302.52959454,2390.78200026,2407.71890332,2560.06002581,2756.90869242,2762.07981193,2873.89766579,2956.68768861 +7 93.9157212493,182.878882578,286.053763353,367.699682124,464.470776511,604.619434497,736.459001029,824.616975188,982.93341429,1137.54709933,1215.82328839,1341.47713186,1383.62727615,1505.32083587,1680.316599,1769.59255662,1814.56895844,2013.80043236,2066.21103132,2176.35946888,2345.76587526,2560.36113942,2779.07307094,2792.7027742,2929.89815144 +8 21.1710113021,179.18103093,266.364798383,282.514684361,312.161171415,346.667094094,443.766726285,554.71050204,698.416828831,730.142588763,848.561152669,851.40749571,926.964986102,1066.7853013,1241.45938859,1279.96180475,1391.89997677,1449.11824844,1621.36682819,1629.09489132,1640.78983473,1848.98189931,1930.23045202,1958.57369625,2122.27121362,2213.42484426,2293.93525986,2319.42239559,2496.92193065,2520.30612728,2557.28835317,2583.75219271,2677.86636649,2828.51597009,2980.77203943 +9 47.5286316692,156.495387205,182.536897678,378.247726007,487.702594885,537.33869494,620.443236356,670.170377031,754.010686273,905.468947949,1061.76676366,1091.57678288,1163.07772911,1259.70389719,1434.42390497,1561.6565062,1764.68979011,1824.14936071,1849.91481611,1959.92018837,2077.60239488,2391.91354581,2401.80843967,2605.34383366,2611.43907528,2676.94067517,2786.92333804,2842.97376994 diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/analyze_results.py b/bmtk-vb/docs/tutorial/sources/chapter03/analyze_results.py new file mode 100644 index 0000000..0df74c6 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/analyze_results.py @@ -0,0 +1,3 @@ +from bmtk.analyzer.visualization.spikes import plot_spikes + +plot_spikes('network/mcortex_nodes.h5', 'network/mcortex_node_types.csv', 'output/spikes.txt') \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/biophys_components/biophysical_neuron_templates/472363762_fit.json b/bmtk-vb/docs/tutorial/sources/chapter03/biophys_components/biophysical_neuron_templates/472363762_fit.json new file mode 100644 index 0000000..9d72939 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/biophys_components/biophysical_neuron_templates/472363762_fit.json @@ -0,0 +1,145 @@ +{ + "passive": [ + { + "ra": 32.0772432623, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "dend", + "cm": 3.7002019468166822 + }, + { + "section": "apic", + "cm": 3.7002019468166822 + } + ], + "e_pas": -84.74527740478516 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 46 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -84.74527740478516 + } + ], + "genome": [ + { + "section": "soma", + "name": "gbar_Im", + "value": 0.00011215709095308002, + "mechanism": "Im" + }, + { + "section": "soma", + "name": "gbar_Ih", + "value": 0.00045041730360183556, + "mechanism": "Ih" + }, + { + "section": "soma", + "name": "gbar_NaTs", + "value": 1.1281486914123688, + "mechanism": "NaTs" + }, + { + "section": "soma", + "name": "gbar_Nap", + "value": 0.00095782168667023497, + "mechanism": "Nap" + }, + { + "section": "soma", + "name": "gbar_K_P", + "value": 0.096648124440568361, + "mechanism": "K_P" + }, + { + "section": "soma", + "name": "gbar_K_T", + "value": 2.2406204607139379e-05, + "mechanism": "K_T" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": 0.0068601737830082388, + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": 0.33043773066721083, + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": 0.00026836177945335608, + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": 0.0077938181828292709, + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": 0.00044743022380752001, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": 998.99266101400383, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "g_pas", + "value": 0.00091710033541291013, + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": 0.00074804303211946897, + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": 0.00016449702719528828, + "mechanism": "" + }, + { + "section": "apic", + "name": "g_pas", + "value": 4.4606771501076728e-05, + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/biophys_components/morphologies/Scnn1a_473845048_m.swc b/bmtk-vb/docs/tutorial/sources/chapter03/biophys_components/morphologies/Scnn1a_473845048_m.swc new file mode 100644 index 0000000..ab4001d --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/biophys_components/morphologies/Scnn1a_473845048_m.swc @@ -0,0 +1,2595 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/Users/alexh/Desktop/Check then delete/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_488448269_p.swc_Z_T10.swc +# id,type,x,y,z,r,pid +1 1 550.439 522.6341 38.7565 5.1205 -1 +2 3 546.4945 522.8435 34.8855 0.1144 1 +3 3 545.4306 522.8984 33.7747 0.1398 2 +4 3 544.3552 522.9499 33.2744 0.1907 3 +5 3 543.2273 523.0071 32.7732 0.2669 4 +6 3 542.105 523.2027 32.3246 0.3178 5 +7 3 541.0068 523.3034 31.8399 0.3178 6 +8 3 539.9863 523.5138 31.2732 0.2669 7 +9 3 538.9052 523.666 30.7922 0.2034 8 +10 3 537.7933 523.5516 30.4881 0.1907 9 +11 3 536.8048 523.3217 30.1924 0.2161 10 +12 3 535.9228 523.2301 29.7063 0.2415 11 +13 3 534.8921 523.4498 29.1575 0.2161 12 +14 3 533.7904 523.4738 28.73 0.1907 13 +15 3 532.9175 522.951 28.4908 0.1907 14 +16 3 532.7802 521.9694 28.2094 0.2415 15 +17 3 533.1452 521.3723 27.652 0.2542 16 +18 3 532.9827 520.2958 27.1077 0.2415 17 +19 3 531.7346 520.1654 26.5369 0.1907 18 +20 3 530.7725 520.0258 26.1911 0.1398 19 +21 3 529.998 519.233 25.843 0.1398 20 +22 3 529.0371 518.6816 25.5543 0.178 21 +23 3 528.067 518.1382 25.3801 0.2415 22 +24 3 527.193 517.422 25.3059 0.2924 23 +25 3 526.3247 516.7105 25.3418 0.3432 24 +26 3 525.4998 515.9291 25.4183 0.3432 25 +27 3 524.8775 515.0139 25.4821 0.3178 26 +28 3 524.5526 513.9271 25.5306 0.2669 27 +29 3 524.1911 512.8518 25.5433 0.2542 28 +30 3 523.5482 511.9286 25.5061 0.2415 29 +31 3 522.7805 511.1014 25.505 0.2415 30 +32 3 521.9351 510.462 25.6241 0.2288 31 +33 3 521.2121 509.6543 25.6083 0.2161 32 +34 3 520.3244 509.5147 25.357 0.1907 33 +35 3 519.4721 508.8363 25.1901 0.1525 34 +36 3 518.391 508.6178 24.9653 0.1398 35 +37 3 517.3809 508.341 24.7245 0.1652 36 +38 3 516.5709 507.5528 24.5916 0.2288 37 +39 3 515.8147 506.7142 24.5832 0.2796 38 +40 3 514.8492 506.1891 24.5692 0.2796 39 +41 3 513.8608 505.6343 24.5185 0.2415 40 +42 3 512.9536 504.9685 24.3906 0.2034 41 +43 3 512.2809 504.1139 24.345 0.1907 42 +44 3 511.2479 503.6666 24.2214 0.1907 43 +45 3 510.2675 503.0912 24.0083 0.178 44 +46 3 509.414 502.3487 23.7194 0.178 45 +47 3 508.5744 501.7733 23.2639 0.178 46 +48 3 507.9783 501.12 22.6445 0.2034 47 +49 3 507.0723 500.4462 22.1254 0.2161 48 +50 3 506.0507 499.9417 21.7989 0.2288 49 +51 3 505.1412 499.2954 21.6514 0.2288 50 +52 3 504.5395 498.3424 21.6626 0.2288 51 +53 3 503.9617 497.4204 21.7608 0.2161 52 +54 3 503.4046 496.5372 21.7688 0.1907 53 +55 3 503.1484 495.4298 21.765 0.1652 54 +56 3 502.7994 494.3487 21.8078 0.1525 55 +57 3 502.3716 493.3077 21.8473 0.1652 56 +58 3 501.7081 492.5446 21.9327 0.1652 57 +59 3 500.7311 492.1259 22.1296 0.178 58 +60 3 499.6168 491.9726 22.3045 0.178 59 +61 3 498.5152 491.9715 22.3302 0.2161 60 +62 3 497.4959 491.6775 22.197 0.2542 61 +63 3 496.5486 491.0746 22.0414 0.2924 62 +64 3 495.9595 490.1765 21.978 0.3051 63 +65 3 495.6391 489.0989 21.9925 0.2924 64 +66 3 495.0866 488.1254 22.0311 0.2924 65 +67 3 494.3052 487.3429 22.0039 0.2669 66 +68 3 493.3077 487.0397 21.8798 0.2415 67 +69 3 492.3559 486.6427 21.8648 0.2034 68 +70 3 491.5413 485.922 21.9735 0.2034 69 +71 3 490.8126 485.0732 22.1353 0.2288 70 +72 3 490.1159 484.2335 22.2187 0.2288 71 +73 3 489.4055 483.594 22.0897 0.2161 72 +74 3 488.6402 482.7794 22.0038 0.1907 73 +75 3 488.0029 481.8917 22.0453 0.2161 74 +76 3 487.4229 480.9616 22.1693 0.2288 75 +77 3 486.9825 479.9252 22.3233 0.2415 76 +78 3 486.5649 478.9219 22.3934 0.2288 77 +79 3 486.1531 477.9598 22.2626 0.2542 78 +80 3 485.644 476.9668 22.0479 0.2669 79 +81 3 484.9942 476.0253 21.831 0.2542 80 +82 3 484.3845 475.0574 21.6328 0.1907 81 +83 3 483.7827 474.0862 21.4692 0.1398 82 +84 3 483.0174 473.2602 21.3367 0.1271 83 +85 3 482.0873 472.607 21.2002 0.1398 84 +86 3 481.0863 472.1254 21.0176 0.1525 85 +87 3 479.9812 472.0945 20.8404 0.1398 86 +88 3 479.0134 472.575 20.7658 0.1271 87 +89 3 478.0524 473.0509 20.692 0.1271 88 +90 3 476.945 473.1023 20.5434 0.1398 89 +91 3 475.8113 473.1367 20.3846 0.1525 90 +92 3 474.7211 473.4547 20.228 0.1398 91 +93 3 473.6606 473.8791 20.0431 0.1271 92 +94 3 472.6173 474.2921 19.7791 0.1144 93 +95 3 471.5408 474.5552 19.4559 0.1144 94 +96 3 470.43 474.5072 19.1214 0.1398 95 +97 3 469.3203 474.2818 18.802 0.1652 96 +98 3 468.293 473.8116 18.5503 0.1907 97 +99 3 467.3091 473.2282 18.382 0.1652 98 +100 3 466.3733 472.5727 18.2868 0.1398 99 +101 3 465.4558 471.8886 18.2468 0.1144 100 +102 3 464.5258 471.2239 18.2493 0.1144 101 +103 3 463.598 470.5547 18.2661 0.1144 102 +104 3 462.6794 469.8751 18.2748 0.1271 103 +105 3 461.7333 469.2333 18.2842 0.1398 104 +106 3 460.7849 468.595 18.314 0.1525 105 +107 3 459.9246 467.8651 18.4019 0.1398 106 +108 3 459.0506 467.1421 18.523 0.1271 107 +109 3 458.1034 466.506 18.6267 0.1144 108 +110 3 457.1058 465.9535 18.6767 0.1144 109 +111 3 456.0831 465.4627 18.6557 0.1144 110 +112 3 455.1061 464.8781 18.6145 0.1144 111 +113 3 454.1863 464.2032 18.5967 0.1144 112 +114 3 453.2654 463.5351 18.6251 0.1271 113 +115 3 452.3365 462.883 18.7032 0.1525 114 +116 3 451.5734 462.0685 18.7291 0.178 115 +117 3 450.8596 461.1956 18.6917 0.178 116 +118 3 450.0485 460.3994 18.665 0.1525 117 +119 3 449.2294 459.6009 18.6749 0.1271 118 +120 3 448.5864 458.6639 18.7251 0.1144 119 +121 3 447.9378 457.7258 18.8422 0.1144 120 +122 3 447.0443 457.3277 19.1598 0.1271 121 +123 3 445.9976 457.0555 19.5718 0.1525 122 +124 3 445.2116 456.2638 19.9076 0.1907 123 +125 3 444.4188 455.439 20.1542 0.2034 124 +126 3 443.3206 455.1576 20.3189 0.1907 125 +127 3 442.5003 454.3728 20.4095 0.1525 126 +128 3 441.7911 453.4759 20.4381 0.1271 127 +129 3 441.6984 452.3376 20.4401 0.1144 128 +130 3 441.6984 451.1936 20.44 0.1144 129 +131 3 532.6739 519.2788 24.444 0.3432 18 +132 3 532.3272 518.5592 23.3628 0.3178 131 +133 3 531.8364 517.7332 23.0309 0.2796 132 +134 3 531.3697 516.7151 22.7869 0.2796 133 +135 3 530.8743 515.7667 22.4581 0.2924 134 +136 3 530.8721 514.6261 21.9058 0.2924 135 +137 2 548.9804 526.7983 37.3792 0.1144 1 +138 2 548.6132 527.8702 37.231 0.1271 137 +139 2 548.6555 528.9559 37.1815 0.1398 138 +140 2 549.2275 529.9397 37.1465 0.1652 139 +141 2 549.5524 531.0299 37.1204 0.178 140 +142 2 549.6268 532.1671 37.1017 0.2034 141 +143 2 549.4243 533.2699 37.112 0.2161 142 +144 2 548.8912 534.2606 37.1823 0.2415 143 +145 2 548.1991 535.0625 37.1927 0.2415 144 +146 2 547.4738 535.7649 37.0028 0.2415 145 +147 2 546.7096 536.496 36.836 0.2161 146 +148 2 545.8699 537.2213 36.7564 0.2034 147 +149 2 545.2304 538.157 36.6797 0.178 148 +150 2 544.7934 539.2072 36.5784 0.1652 149 +151 2 544.536 540.3043 36.4294 0.1652 150 +152 2 544.1367 541.3397 36.2236 0.1907 151 +153 2 543.6254 542.2571 35.8904 0.2288 152 +154 2 543.0305 543.0545 35.7199 0.2542 153 +155 2 542.8005 544.1562 35.6468 0.2542 154 +156 2 542.7708 545.2922 35.5634 0.2542 155 +157 2 542.7708 546.4316 35.3864 0.2796 156 +158 3 552.107 517.9449 38.7565 0.1271 1 +159 3 552.4731 516.8615 38.7229 0.1398 158 +160 3 552.8208 515.7713 38.7078 0.1525 159 +161 3 553.1686 514.6822 38.6873 0.1525 160 +162 3 553.6571 513.6549 38.6635 0.1525 161 +163 3 554.2291 512.6642 38.6327 0.1652 162 +164 3 554.9201 511.757 38.5944 0.1652 163 +165 3 555.5321 510.8841 38.4208 0.178 164 +166 3 556.3249 510.1668 38.3872 0.1652 165 +167 3 557.1108 509.3626 38.4205 0.1652 166 +168 3 557.7366 508.8672 38.2337 0.2542 167 +169 3 558.7616 508.4634 38.1276 0.2415 168 +170 3 559.7558 507.9131 38.0173 0.2415 169 +171 3 560.7911 507.4487 37.9016 0.2161 170 +172 3 561.8619 507.1535 37.7415 0.1907 171 +173 3 562.8617 507.1924 37.7311 0.178 172 +174 3 563.833 507.1501 37.9708 0.178 173 +175 3 564.9392 507.1192 38.2256 0.2034 174 +176 3 565.9746 507.3034 38.2519 0.2034 175 +177 3 567.0888 507.3011 38.3239 0.2034 176 +178 3 568.1687 507.0688 38.2175 0.1907 177 +179 3 569.2029 506.617 38.0598 0.1907 178 +180 3 570.1216 505.9637 37.8969 0.1907 179 +181 3 571.0997 505.4375 37.6477 0.1907 180 +182 3 572.1018 505.195 37.214 0.2034 181 +183 3 573.0616 504.8541 36.6831 0.2161 182 +184 3 573.9025 504.234 36.136 0.2161 183 +185 3 574.7513 503.9274 35.4497 0.1907 184 +186 3 575.1128 504.1608 34.956 0.1525 185 +187 3 576.1436 504.6173 34.6685 0.178 186 +188 3 577.2601 504.7763 34.5554 0.2161 187 +189 3 578.3641 504.6001 34.5033 0.2669 188 +190 3 579.412 504.1928 34.426 0.2796 189 +191 3 580.3798 503.797 34.491 0.2669 190 +192 3 581.4506 503.606 34.5783 0.2415 191 +193 3 582.55 503.821 34.5842 0.2161 192 +194 3 583.6036 504.1516 34.4484 0.2034 193 +195 3 584.6389 504.5841 34.258 0.2034 194 +196 3 585.6662 505.0886 34.0684 0.2288 195 +197 3 586.6192 505.7144 33.8702 0.2669 196 +198 3 587.6373 506.1308 33.6064 0.2796 197 +199 3 588.6749 505.8631 33.311 0.2669 198 +200 3 589.732 505.4352 33.0571 0.2288 199 +201 3 590.7479 504.9147 32.8434 0.2034 200 +202 3 591.742 504.4056 32.5828 0.2034 201 +203 3 592.854 504.3335 32.3394 0.2288 202 +204 3 593.0324 505.1767 32.368 0.178 203 +205 3 593.1629 506.2063 31.2774 0.1525 204 +206 3 593.0439 507.2382 30.7639 0.1398 205 +207 3 593.2018 508.3067 30.2341 0.1398 206 +208 3 593.7989 509.2161 29.8446 0.1652 207 +209 3 594.7256 509.7653 29.4913 0.1652 208 +210 3 595.8101 509.7161 29.0931 0.178 209 +211 3 596.8912 509.5445 28.6168 0.1652 210 +212 3 597.9882 509.6978 28.1215 0.1652 211 +213 3 599.0201 510.1702 27.626 0.1398 212 +214 3 599.3736 510.9482 26.9294 0.1271 213 +215 3 599.7203 511.7158 26.0427 0.1271 214 +216 3 600.7373 512.0441 25.2477 0.1398 215 +217 3 601.7017 511.5762 24.5451 0.1525 216 +218 3 602.3526 511.1792 23.6453 0.1398 217 +219 3 602.3995 511.8691 22.6032 0.1271 218 +220 3 601.704 511.9331 21.554 0.1271 219 +221 3 601.1468 511.042 20.6665 0.1398 220 +222 3 600.8551 510.1279 19.7738 0.1525 221 +223 3 601.6044 509.4701 18.1933 0.1525 222 +224 3 593.5141 503.7661 32.1107 0.2415 203 +225 3 594.5311 503.2868 31.9127 0.2415 224 +226 3 595.6556 503.225 31.7456 0.2415 225 +227 3 596.779 503.4275 31.6022 0.2415 226 +228 3 597.9093 503.5236 31.4462 0.2288 227 +229 3 599.0384 503.5488 31.2421 0.2288 228 +230 3 600.1676 503.638 31.0064 0.2034 229 +231 3 601.299 503.7856 30.788 0.178 230 +232 3 602.2748 503.2982 30.5978 0.1525 231 +233 3 602.8754 502.3418 30.4312 0.178 232 +234 3 603.7037 501.5822 30.2347 0.1907 233 +235 3 604.6692 501.0125 29.9855 0.2161 234 +236 3 605.5833 500.3341 29.734 0.1907 235 +237 3 606.5316 499.6958 29.5114 0.178 236 +238 3 607.647 499.4807 29.3129 0.1525 237 +239 3 608.7464 499.7267 29.0738 0.1652 238 +240 3 609.8458 499.8582 28.7756 0.178 239 +241 3 610.3412 499.92 28.5421 0.1271 240 +242 3 611.4588 500.1168 28.3248 0.1525 241 +243 3 612.5022 500.0367 28.0708 0.1907 242 +244 3 613.5192 499.6042 27.8741 0.2034 243 +245 3 614.5854 499.6363 27.8046 0.1907 244 +246 3 615.6951 499.7999 27.7604 0.1525 245 +247 3 616.7407 499.4876 27.6347 0.1525 246 +248 3 617.712 498.9384 27.403 0.1652 247 +249 3 618.7816 498.6021 27.134 0.2161 248 +250 3 619.8753 498.593 26.7795 0.2161 249 +251 3 620.9438 498.9007 26.3927 0.2415 250 +252 3 622.0191 499.2896 26.0399 0.2161 251 +253 3 623.1071 499.6443 25.719 0.2415 252 +254 3 624.2259 499.8262 25.393 0.2288 253 +255 3 625.2646 499.5745 24.9766 0.2542 254 +256 3 625.5735 498.6433 24.5461 0.2542 255 +257 3 625.8058 498.045 23.8746 0.2796 256 +258 3 626.7301 498.3973 23.1497 0.2796 257 +259 3 627.8032 498.7897 22.6195 0.2669 258 +260 3 628.4793 498.9201 22.4274 0.2034 259 +261 3 629.4952 498.53 21.603 0.1907 260 +262 3 629.9242 497.5954 21.1885 0.2034 261 +263 3 630.0877 496.5898 20.6347 0.2034 262 +264 3 630.7764 495.8348 20.1053 0.2415 263 +265 3 631.8404 495.4984 19.7111 0.2415 264 +266 3 632.8082 494.9436 19.3447 0.2288 265 +267 3 633.8263 494.5066 18.9905 0.2034 266 +268 3 634.888 494.1222 18.7224 0.1907 267 +269 3 635.9805 493.7801 18.5569 0.2034 268 +270 3 637.0536 493.4129 18.4902 0.2288 269 +271 3 638.1072 493.0171 18.5193 0.2542 270 +272 3 639.1734 492.6716 18.5318 0.2542 271 +273 3 640.2819 492.5343 18.5067 0.2288 272 +274 3 641.3985 492.6728 18.5063 0.2034 273 +275 3 642.2965 493.2779 18.4593 0.2034 274 +276 3 643.0744 493.6898 18.1726 0.2161 275 +277 3 643.627 492.9073 17.7735 0.2288 276 +278 3 644.4198 492.1099 17.4194 0.2288 277 +279 3 645.1851 491.2965 17.2443 0.2161 278 +280 3 645.7125 490.3607 17.2652 0.1907 279 +281 3 646.5076 489.5771 17.2319 0.1525 280 +282 3 647.3885 488.8712 17.0562 0.1271 281 +283 3 628.1635 498.8801 22.3104 0.2288 259 +284 3 629.1039 499.396 22.1775 0.2669 283 +285 3 629.6919 500.309 22.0513 0.2669 284 +286 3 630.0557 501.3614 22.0288 0.2415 285 +287 3 630.6117 502.3258 22.0231 0.1907 286 +288 3 631.3633 503.1724 21.9534 0.1907 287 +289 3 632.2716 503.8416 21.8464 0.2034 288 +290 3 633.1743 504.5097 21.8147 0.2161 289 +291 3 634.0208 505.251 21.8795 0.2034 290 +292 3 634.8148 506.0621 21.9253 0.1907 291 +293 3 635.6098 506.8812 21.9604 0.2034 292 +294 3 636.4209 507.6752 22.0233 0.2034 293 +295 3 636.8408 508.675 22.0006 0.2288 294 +296 3 637.5295 509.5136 21.8594 0.2288 295 +297 3 638.5293 510.0455 21.7031 0.2542 296 +298 3 639.6276 510.351 21.5681 0.2415 297 +299 3 640.7201 510.6404 21.4007 0.2542 298 +300 3 641.6273 511.2708 21.1864 0.2288 299 +301 3 642.674 511.7078 21.0354 0.2034 300 +302 3 643.7414 512.0567 21.0248 0.1525 301 +303 3 644.8602 512.091 21.1093 0.1271 302 +304 3 645.9974 511.988 21.1938 0.1144 303 +305 3 647.1402 511.9686 21.2602 0.1271 304 +306 3 648.2762 512.099 21.2866 0.1525 305 +307 3 649.4122 512.2397 21.2581 0.178 306 +308 3 650.4841 512.631 21.179 0.178 307 +309 3 651.484 513.0657 20.9507 0.1525 308 +310 3 652.604 512.9593 20.6832 0.1398 309 +311 3 653.5249 512.3633 20.3519 0.1398 310 +312 3 654.6323 512.1368 20.1638 0.1525 311 +313 3 655.7385 511.9091 20.0922 0.1525 312 +314 3 656.8184 511.6082 19.9716 0.1525 313 +315 3 657.9007 511.3119 19.8295 0.178 314 +316 3 659.0412 511.3016 19.762 0.1907 315 +317 3 660.183 511.3016 19.7497 0.2034 316 +318 3 661.3224 511.2319 19.7705 0.1652 317 +319 3 662.4389 511.0271 19.8383 0.1525 318 +320 3 663.5623 510.8452 19.9329 0.1525 319 +321 3 664.704 510.8154 19.9741 0.1907 320 +322 3 665.8469 510.8303 19.9437 0.2161 321 +323 3 666.9486 511.0694 19.8096 0.2288 322 +324 3 668.0491 511.3062 19.605 0.2161 323 +325 3 669.1679 511.4515 19.3649 0.1907 324 +326 3 670.2868 511.5934 19.1224 0.1525 325 +327 3 671.385 511.8576 19.0283 0.1271 326 +328 3 672.4775 512.131 19.0638 0.1144 327 +329 3 673.4064 512.7946 19.1335 0.1144 328 +330 3 674.2999 513.5084 19.209 0.1398 329 +331 3 674.8593 514.506 19.3304 0.1652 330 +332 3 610.0197 500.0115 28.8702 0.1652 240 +333 3 610.6947 500.6064 30.8081 0.1652 332 +334 3 611.3708 501.2013 31.6733 0.1652 333 +335 3 612.2528 501.6726 32.6222 0.1525 334 +336 3 613.2984 502.089 33.465 0.1525 335 +337 3 613.9722 502.9939 34.1729 0.1652 336 +338 3 614.4676 503.7455 34.8698 0.178 337 +339 3 615.5555 503.638 35.3816 0.1907 338 +340 3 616.5451 504.0121 35.716 0.178 339 +341 3 617.2509 504.8495 36.0332 0.1652 340 +342 3 617.8572 505.815 36.2869 0.178 341 +343 3 618.5597 506.7142 36.4826 0.2288 342 +344 3 619.3685 507.4967 36.6615 0.2796 343 +345 3 620.2162 508.2403 36.8399 0.2796 344 +346 3 620.9701 509.0937 36.9513 0.2415 345 +347 3 621.629 510.0169 36.9606 0.2161 346 +348 3 622.2262 510.979 36.9026 0.2288 347 +349 3 622.7753 511.9778 36.8376 0.2415 348 +350 3 623.2901 512.9982 36.8082 0.2415 349 +351 3 623.8186 514.0061 36.8497 0.2288 350 +352 3 624.3574 515.0048 36.9743 0.2415 351 +353 3 624.8986 516.0069 37.1468 0.2288 352 +354 3 625.4946 516.9782 37.3276 0.2288 353 +355 3 626.2325 517.8453 37.4867 0.2288 354 +356 3 627.0081 518.6816 37.6244 0.2669 355 +357 3 627.6579 519.6105 37.7717 0.2669 356 +358 3 628.2722 520.568 37.9092 0.2415 357 +359 3 628.9598 521.4707 37.9778 0.2034 358 +360 3 629.7743 522.2337 38.0461 0.1907 359 +361 3 630.6861 522.8892 38.1867 0.178 360 +362 3 631.5704 523.5939 38.3236 0.1525 361 +363 3 632.457 524.3112 38.4096 0.1525 362 +364 3 633.4442 524.8661 38.4689 0.1907 363 +365 3 634.4738 525.358 38.5398 0.2415 364 +366 3 635.4314 525.9654 38.6666 0.2542 365 +367 3 636.4164 526.4997 38.8699 0.2415 366 +368 3 637.4917 526.8074 39.1465 0.2542 367 +369 3 638.5957 527.0133 39.4724 0.2796 368 +370 3 639.7042 527.1907 39.8132 0.2924 369 +371 3 640.8242 527.3611 40.1181 0.2542 370 +372 3 641.9464 527.5396 40.3088 0.2034 371 +373 3 643.0687 527.7192 40.3752 0.1652 372 +374 3 644.199 527.8679 40.3768 0.1525 373 +375 3 645.335 527.996 40.3598 0.178 374 +376 3 646.4286 528.2981 40.3567 0.1907 375 +377 3 647.472 528.7648 40.4023 0.2034 376 +378 3 648.5313 529.1778 40.5367 0.1652 377 +379 3 649.6181 529.5118 40.7641 0.1398 378 +380 3 650.7369 529.7109 41.0567 0.1271 379 +381 3 651.8718 529.8367 41.4025 0.1525 380 +382 3 652.986 530.0346 41.8303 0.178 381 +383 3 654.0786 530.3001 42.3567 0.178 382 +384 3 655.1642 530.4694 42.992 0.1652 383 +385 3 656.1298 530.7325 43.7833 0.1652 384 +386 3 657.101 530.9464 44.6936 0.178 385 +387 3 658.1215 530.9796 45.6599 0.1907 386 +388 3 658.9394 530.4328 46.6262 0.178 387 +389 3 659.0859 529.3643 47.4337 0.1652 388 +390 3 658.8662 528.2489 48.0777 0.1525 389 +391 3 658.9692 527.1884 48.6766 0.1525 390 +392 3 659.7391 526.8795 49.3444 0.1652 391 +393 3 660.7366 526.8314 49.994 0.1652 392 +394 3 661.8143 526.4882 50.3972 0.178 393 +395 3 662.4973 525.9494 50.0312 0.1907 394 +396 3 575.6093 503.9297 34.72 0.1398 185 +397 3 576.3426 503.2548 34.5229 0.1271 396 +398 3 577.2224 502.5752 34.4585 0.1144 397 +399 3 577.4054 501.7092 34.2832 0.1398 398 +400 3 577.6365 500.5938 34.1449 0.178 399 +401 3 577.6845 499.4738 33.9948 0.2161 400 +402 3 577.2796 498.4214 33.8512 0.2034 401 +403 3 576.7899 497.4306 33.7053 0.1652 402 +404 3 576.4936 496.3999 33.3889 0.1398 403 +405 3 576.0864 495.463 32.8835 0.1525 404 +406 3 575.7157 494.4391 32.3649 0.178 405 +407 3 575.7203 493.3706 31.8797 0.178 406 +408 3 576.0315 492.317 31.3233 0.1652 407 +409 3 576.7076 491.5665 30.6718 0.1525 408 +410 3 576.6721 490.5014 30.0572 0.1525 409 +411 3 575.7157 489.9249 29.5557 0.1398 410 +412 3 574.5866 489.7922 29.1015 0.1271 411 +413 3 573.5158 489.6034 28.5908 0.1144 412 +414 3 573.1818 488.5338 28.1646 0.1271 413 +415 3 572.739 487.5522 27.6693 0.1398 414 +416 3 572.3135 486.5684 27.1038 0.1525 415 +417 3 571.8124 485.5674 26.6724 0.1398 416 +418 3 570.9429 484.8398 26.2966 0.1398 417 +419 3 569.9648 484.5984 25.8593 0.1398 418 +420 3 568.9524 484.9542 25.3269 0.1652 419 +421 3 568.2683 484.587 24.6823 0.1652 420 +422 3 567.9731 483.5333 24.0018 0.1652 421 +423 3 567.7455 482.4545 23.3127 0.1398 422 +424 3 567.7237 481.3288 22.671 0.1271 423 +425 3 567.7237 480.2157 22.0704 0.1144 424 +426 3 567.5979 479.1644 21.4256 0.1271 425 +427 3 566.7525 478.9619 20.8048 0.1398 426 +428 3 565.6222 479.098 20.2697 0.1525 427 +429 3 564.612 478.7114 19.8039 0.1398 428 +430 3 563.7895 478.3865 19.2093 0.1271 429 +431 3 563.0917 478.24 18.4252 0.1398 430 +432 3 562.3572 477.5617 17.8013 0.1652 431 +433 3 561.6182 476.754 17.4778 0.1907 432 +434 3 560.5863 476.3273 17.2886 0.178 433 +435 3 559.559 475.8399 17.1859 0.178 434 +436 3 558.5855 475.3789 17.0994 0.2034 435 +437 3 557.4632 475.3503 17.127 0.2288 436 +438 3 556.8168 476.2094 17.3242 0.2288 437 +439 3 556.5903 477.1853 17.7273 0.178 438 +440 3 556.2734 478.2492 18.1906 0.1525 439 +441 3 555.8204 479.2594 19.3304 0.1398 440 +442 3 557.5639 508.317 38.8091 0.178 167 +443 3 557.7526 507.1958 39.6158 0.1652 442 +444 3 557.986 506.1285 39.9734 0.2034 443 +445 3 557.9071 505.1973 40.5216 0.2288 444 +446 3 557.3682 504.321 41.1368 0.2415 445 +447 3 557.0811 503.2502 41.6046 0.2161 446 +448 3 557.4998 502.7422 42.1067 0.2034 447 +449 3 558.0707 501.9678 42.5121 0.1907 448 +450 3 557.954 500.8649 42.8672 0.178 449 +451 3 557.6451 499.8033 43.209 0.1652 450 +452 3 557.4804 498.8012 43.4087 0.1525 451 +453 3 557.0411 497.7807 43.4498 0.178 452 +454 3 556.9598 496.6607 43.4949 0.2034 453 +455 3 556.9587 495.5476 43.5887 0.2161 454 +456 3 557.1612 494.4894 43.745 0.2288 455 +457 3 556.9804 493.0754 43.6892 0.1652 456 +458 3 556.8397 491.9669 43.507 0.178 457 +459 3 556.6761 490.8618 43.2247 0.178 458 +460 3 556.4874 489.7613 42.8593 0.1907 459 +461 3 556.3512 488.6424 42.4732 0.1907 460 +462 3 556.2963 487.5042 42.1341 0.178 461 +463 3 556.2814 486.3613 41.9 0.178 462 +464 3 556.278 485.2184 41.7631 0.178 463 +465 3 556.2139 484.0893 41.641 0.1907 464 +466 3 555.9794 482.9945 41.4739 0.178 465 +467 3 555.833 481.8814 41.3314 0.1525 466 +468 3 555.9131 480.7877 41.3039 0.1271 467 +469 3 555.9726 479.6918 41.249 0.1271 468 +470 3 555.9726 478.5764 41.0827 0.1398 469 +471 3 555.889 477.4713 40.8475 0.1525 470 +472 3 555.5035 476.4108 40.5882 0.1398 471 +473 3 555.1146 475.3549 40.3334 0.1398 472 +474 3 554.9956 474.2189 40.1296 0.1398 473 +475 3 554.9475 473.076 39.9994 0.1652 474 +476 3 554.9933 471.9423 39.9529 0.1652 475 +477 3 555.2084 470.8349 39.9963 0.1652 476 +478 3 555.3628 469.7207 40.0498 0.1398 477 +479 3 555.3628 468.5904 40.0011 0.1398 478 +480 3 555.3742 467.4601 39.8656 0.1398 479 +481 3 555.4234 466.3344 39.6595 0.1652 480 +482 3 555.5024 465.2065 39.4162 0.178 481 +483 3 555.6511 464.0808 39.2196 0.2034 482 +484 3 555.8788 462.9791 39.1373 0.2161 483 +485 3 556.1224 461.8728 39.0908 0.2288 484 +486 3 556.2723 460.762 38.967 0.2161 485 +487 3 556.1979 459.6432 38.7778 0.2034 486 +488 3 555.8387 458.5873 38.5885 0.1907 487 +489 3 555.2152 457.6389 38.3729 0.1907 488 +490 3 554.7062 456.639 38.0878 0.178 489 +491 3 554.2749 455.6003 37.7902 0.1525 490 +492 3 553.9031 454.5181 37.5483 0.1525 491 +493 3 553.7177 453.4152 37.3425 0.1652 492 +494 3 553.8584 452.2793 37.1529 0.2034 493 +495 3 553.9134 451.1593 36.9326 0.1907 494 +496 3 553.6159 450.1091 36.64 0.178 495 +497 3 553.14 449.0875 36.3163 0.1525 496 +498 3 552.9432 447.987 35.9682 0.1525 497 +499 3 552.9021 446.8658 35.6006 0.1525 498 +500 3 552.8357 445.7459 35.2374 0.1398 499 +501 3 552.5989 444.6545 34.9194 0.1271 500 +502 3 552.0841 443.6421 34.6853 0.1271 501 +503 3 551.5087 442.6697 34.5778 0.1525 502 +504 3 551.0328 441.6572 34.6024 0.1907 503 +505 3 551.011 440.583 34.6648 0.2034 504 +506 3 551.4137 439.5237 34.6688 0.1907 505 +507 3 551.6665 438.4414 34.585 0.1525 506 +508 3 551.6997 437.3054 34.4501 0.1271 507 +509 3 551.6951 436.1626 34.2913 0.1144 508 +510 3 551.6208 435.0232 34.1312 0.1144 509 +511 3 551.5007 433.886 33.9886 0.1144 510 +512 3 551.3748 432.7489 33.8604 0.1271 511 +513 3 551.2627 431.6095 33.7336 0.1525 512 +514 3 551.1151 430.4769 33.5818 0.178 513 +515 3 550.645 429.4988 33.3393 0.178 514 +516 3 550.0066 428.6007 32.9963 0.1525 515 +517 3 549.4563 427.6261 32.62 0.1271 516 +518 3 549.0617 426.5633 32.2622 0.1144 517 +519 3 548.9381 425.4376 31.9659 0.1271 518 +520 3 548.8168 424.3016 31.7402 0.1652 519 +521 3 548.4187 423.264 31.5204 0.2288 520 +522 3 547.722 422.3968 31.2892 0.2669 521 +523 3 546.9155 421.5937 31.1058 0.2669 522 +524 3 546.3515 420.6396 31.0344 0.2288 523 +525 3 546.1994 419.5414 31.0436 0.2161 524 +526 3 546.0873 418.4134 31.0072 0.2034 525 +527 3 545.7727 417.4113 30.7992 0.2161 526 +528 3 545.5072 416.3325 30.6012 0.2161 527 +529 3 545.2682 415.2228 30.4349 0.2288 528 +530 3 544.8986 414.1577 30.1941 0.2161 529 +531 3 544.4536 413.1213 29.8609 0.2034 530 +532 3 543.9651 412.1066 29.465 0.2034 531 +533 3 543.1071 411.538 28.9722 0.2161 532 +534 3 542.0512 411.4202 28.3657 0.2161 533 +535 3 541.0731 410.9156 27.7629 0.1907 534 +536 3 540.1442 410.259 27.2133 0.1525 535 +537 3 539.6054 409.298 26.6565 0.1271 536 +538 3 538.6776 408.7352 26.106 0.1144 537 +539 3 537.5439 408.6963 25.6006 0.1144 538 +540 3 536.4113 408.6597 25.1358 0.1144 539 +541 3 535.344 408.654 24.611 0.1144 540 +542 3 534.296 408.654 23.31 0.1271 541 +543 3 557.4094 494.2595 45.4454 0.178 456 +544 3 558.1565 493.5491 46.8247 0.178 543 +545 3 558.9058 492.8295 47.4376 0.2034 544 +546 3 559.6379 492.0333 48.1138 0.2542 545 +547 3 560.2889 491.1078 48.7172 0.2796 546 +548 3 560.9776 490.1983 49.2492 0.2542 547 +549 3 561.7932 489.4375 49.7694 0.2161 548 +550 3 562.5792 488.6825 50.3012 0.178 549 +551 3 563.2095 487.773 50.8194 0.1652 550 +552 3 563.5538 486.7377 51.3467 0.1398 551 +553 3 563.603 485.6131 51.8176 0.1271 552 +554 3 563.531 484.4737 52.1987 0.1271 553 +555 3 563.3411 483.3549 52.5176 0.1525 554 +556 3 563.0894 482.2452 52.7794 0.178 555 +557 3 562.7874 481.1527 52.9178 0.178 556 +558 3 562.9784 480.0796 53.0947 0.1652 557 +559 3 562.8674 478.947 53.2409 0.1525 558 +560 3 562.7336 477.8122 53.3613 0.1652 559 +561 3 562.8686 476.6876 53.4584 0.1652 560 +562 3 563.1248 475.5734 53.5433 0.178 561 +563 3 563.4108 474.466 53.6278 0.178 562 +564 3 563.7186 473.3643 53.7062 0.1907 563 +565 3 563.9657 472.2489 53.814 0.178 564 +566 3 564.0572 471.1255 53.9907 0.1652 565 +567 3 564.1007 469.9987 54.2371 0.1652 566 +568 3 564.4141 468.9245 54.4477 0.178 567 +569 3 564.8294 467.8697 54.6084 0.1907 568 +570 3 565.3637 466.8767 54.831 0.2034 569 +571 3 565.9974 465.9546 55.1583 0.2161 570 +572 3 566.7468 465.1641 55.6074 0.2161 571 +573 3 567.3725 464.2558 56.131 0.178 572 +574 3 567.845 463.2319 56.6846 0.1398 573 +575 3 568.2008 462.1646 57.2625 0.1144 574 +576 3 568.4902 461.0812 57.8544 0.1144 575 +577 3 568.5749 459.9727 58.4623 0.1144 576 +578 3 568.5142 458.8607 59.0862 0.1271 577 +579 3 568.6446 457.7487 59.7055 0.1398 578 +580 3 568.7602 456.8095 60.4629 0.1525 579 +581 3 568.2866 455.844 61.2128 0.1398 580 +582 3 568.2294 454.7526 61.9382 0.1271 581 +583 3 568.9901 454.0822 62.5439 0.1144 582 +584 3 567.9525 453.8442 63.1308 0.1144 583 +585 3 567.3576 453.0046 63.6619 0.1144 584 +586 3 567.2844 451.8846 64.1348 0.1144 585 +587 3 567.472 450.7932 64.6274 0.1271 586 +588 3 567.8324 449.7121 65.1006 0.1398 587 +589 3 568.0669 448.6024 65.5628 0.1525 588 +590 3 568.0887 447.5454 66.1371 0.1398 589 +591 3 568.1802 446.4906 66.8248 0.1271 590 +592 3 568.155 445.4164 67.5797 0.1144 591 +593 3 567.8519 444.3651 68.348 0.1144 592 +594 3 567.5144 443.3172 69.1118 0.1144 593 +595 3 567.1769 442.2693 69.8527 0.1144 594 +596 3 566.8394 441.2214 70.5538 0.1144 595 +597 3 566.4974 440.1712 71.2166 0.1144 596 +598 3 566.0809 439.1095 71.7816 0.1144 597 +599 3 565.6554 438.0479 72.2579 0.1144 598 +600 3 565.6314 436.9336 72.7359 0.1144 599 +601 3 566.1702 436.0219 73.2906 0.1144 600 +602 3 566.7101 435.109 73.8912 0.1271 601 +603 3 567.249 434.1972 75.3234 0.1398 602 +604 3 556.8363 500.8203 44.7846 0.2161 451 +605 3 556.0481 501.6371 45.2312 0.178 604 +606 3 555.1638 502.3453 45.3611 0.1652 605 +607 3 554.8549 503.1587 45.5963 0.1652 606 +608 3 555.1546 504.1951 45.981 0.1907 607 +609 3 555.4452 505.2465 46.4778 0.1907 608 +610 3 554.9327 506.1788 46.8586 0.2161 609 +611 3 554.6764 507.2565 47.3334 0.2415 610 +612 3 554.1559 508.1888 47.9343 0.2415 611 +613 3 553.6102 509.1635 48.5094 0.1907 612 +614 3 553.7566 510.105 49.1456 0.1525 613 +615 3 554.5815 510.4883 49.9929 0.1398 614 +616 3 554.8983 511.3337 50.9891 0.1525 615 +617 3 554.8091 512.4285 51.9672 0.1525 616 +618 3 554.1719 513.0074 52.9211 0.1525 617 +619 3 553.148 512.9376 53.9129 0.1525 618 +620 3 552.2065 512.8277 54.9794 0.1652 619 +621 3 551.2215 513.0508 56.0045 0.178 620 +622 3 550.1485 513.3997 56.896 0.1907 621 +623 3 549.1555 513.6514 57.7948 0.1652 622 +624 3 548.1362 513.7155 58.7093 0.1398 623 +625 3 547.3697 514.1536 59.6702 0.1144 624 +626 3 546.7462 514.9968 60.5626 0.1271 625 +627 3 546.0621 515.9074 61.2629 0.1525 626 +628 3 545.4581 516.8626 61.8397 0.178 627 +629 3 544.5703 517.7447 62.235 0.1398 628 +630 3 543.7741 518.566 62.4949 0.1271 629 +631 3 542.9355 519.3222 62.6895 0.1144 630 +632 3 542.1485 520.0327 62.9633 0.1144 631 +633 3 541.2138 520.6813 63.1467 0.1144 632 +634 3 540.2632 521.2762 63.2954 0.1144 633 +635 3 539.3868 521.9283 63.5286 0.1144 634 +636 3 538.3584 522.4145 63.723 0.1271 635 +637 3 537.2945 522.8046 63.8288 0.1525 636 +638 3 536.1814 523.0471 63.9033 0.178 637 +639 3 535.0843 523.2873 64.041 0.178 638 +640 3 534.0512 523.6683 64.2561 0.1525 639 +641 3 533.1132 524.2597 64.468 0.1271 640 +642 3 532.4656 525.1601 64.5789 0.1144 641 +643 3 531.7575 525.9426 64.601 0.1144 642 +644 3 530.6787 526.2926 64.5837 0.1271 643 +645 3 529.5587 526.4928 64.5098 0.1525 644 +646 3 528.5658 526.9642 64.4305 0.178 645 +647 3 527.8176 527.7798 64.3286 0.178 646 +648 3 527.1804 528.6733 64.3182 0.1525 647 +649 3 526.7285 529.6869 64.4319 0.1271 648 +650 3 525.8202 530.141 64.6299 0.1144 649 +651 3 524.8626 530.6604 64.731 0.1271 650 +652 3 524.0286 531.4372 64.808 0.1398 651 +653 3 523.4223 532.3936 64.9284 0.1652 652 +654 3 522.8629 533.3889 65.1557 0.1907 653 +655 3 546.0232 517.2402 64.064 0.1525 628 +656 3 546.7405 517.6772 66.9514 0.1271 655 +657 3 547.4589 518.1153 68.182 0.1144 656 +658 3 548.1762 518.5523 69.6413 0.1144 657 +659 3 548.8935 518.9893 71.2522 0.1144 658 +660 3 549.4449 519.7547 72.8899 0.1144 659 +661 3 549.954 520.5989 74.4971 0.1144 660 +662 3 550.4642 521.4421 76.0399 0.1144 661 +663 3 550.9733 522.2863 77.5701 0.1144 662 +664 3 551.4835 523.1306 79.0642 0.1144 663 +665 3 552.1138 523.7152 80.5616 0.1144 664 +666 3 552.7556 524.2746 82.0341 0.1144 665 +667 3 553.3974 524.8352 83.4414 0.1271 666 +668 3 554.0392 525.3946 86.2926 0.1398 667 +669 3 553.0679 525.906 40.4029 0.1144 1 +670 3 553.7566 526.8006 40.9788 0.1144 669 +671 3 554.6226 527.5316 41.2023 0.1271 670 +672 3 555.7209 527.67 41.4268 0.1525 671 +673 3 556.826 527.6769 41.7424 0.1907 672 +674 3 557.7114 527.9182 42.2576 0.2161 673 +675 3 558.4722 528.7454 42.6135 0.2288 674 +676 3 559.4492 529.3196 42.9335 0.2161 675 +677 3 560.314 529.982 43.1043 0.1907 676 +678 3 561.1228 530.5163 43.3664 0.2161 677 +679 3 562.0003 530.9773 43.6428 0.178 678 +680 3 563.0711 531.1009 43.773 0.1652 679 +681 3 564.1258 531.2999 44.0331 0.178 680 +682 3 565.1783 531.6934 44.3646 0.178 681 +683 3 566.0466 532.4176 44.697 0.178 682 +684 3 566.5877 533.0594 45.2508 0.178 683 +685 3 567.607 532.9324 45.8436 0.1907 684 +686 3 567.9331 532.7345 46.3263 0.1652 685 +687 3 568.8529 532.1122 46.7107 0.1398 686 +688 3 569.8584 531.8067 46.8717 0.1398 687 +689 3 570.9464 531.7506 46.7956 0.1525 688 +690 3 572.0355 531.5768 46.5522 0.178 689 +691 3 573.0605 531.1855 46.2384 0.2034 690 +692 3 573.8201 530.6147 46.1294 0.2161 691 +693 3 574.7479 530.1147 46.1605 0.2288 692 +694 3 575.8473 529.8322 46.1972 0.2161 693 +695 3 576.973 529.7933 46.1768 0.1907 694 +696 3 578.0987 529.9214 46.1009 0.178 695 +697 3 579.1306 529.7338 45.8702 0.1907 696 +698 3 580.0858 529.1538 45.7472 0.2288 697 +699 3 580.9312 528.9101 45.6963 0.1525 698 +700 3 582.002 529.0474 45.7408 0.1652 699 +701 3 583.1082 529.1252 45.7027 0.178 700 +702 3 584.2442 529.0073 45.6674 0.1907 701 +703 3 585.3734 528.8369 45.656 0.178 702 +704 3 586.5071 528.6927 45.6151 0.1525 703 +705 3 587.6442 528.5749 45.5336 0.1271 704 +706 3 588.771 528.3896 45.432 0.1271 705 +707 3 589.8773 528.1036 45.3253 0.1652 706 +708 3 590.9618 527.7489 45.1772 0.2161 707 +709 3 592.0097 527.3245 44.9632 0.2542 708 +710 3 593.0164 526.8257 44.7009 0.2542 709 +711 3 594.0483 526.3441 44.4884 0.2415 710 +712 3 594.9292 525.8236 44.2005 0.2161 711 +713 3 595.8032 525.2447 43.8332 0.1907 712 +714 3 596.8912 525.0342 43.5274 0.1525 713 +715 3 597.9951 524.8192 43.272 0.1398 714 +716 3 598.9995 524.3307 43.0175 0.1525 715 +717 3 599.9628 523.7426 42.8425 0.178 716 +718 3 600.9123 523.1432 42.828 0.178 717 +719 3 601.8595 522.5357 42.8478 0.1652 718 +720 3 602.785 521.8745 42.842 0.178 719 +721 3 603.5927 521.0851 42.8879 0.2161 720 +722 3 604.3626 520.2477 42.9783 0.2669 721 +723 3 605.1531 519.4229 43.0542 0.2924 722 +724 3 605.9574 518.6084 43.1021 0.3178 723 +725 3 606.7753 517.8087 43.1371 0.3178 724 +726 3 607.6367 517.0571 43.155 0.3051 725 +727 3 608.5577 516.3822 43.1449 0.2542 726 +728 3 609.593 515.9177 43.127 0.2034 727 +729 3 610.6741 515.5425 43.115 0.1525 728 +730 3 611.7037 515.0517 43.1054 0.1271 729 +731 3 612.7001 514.49 43.0956 0.1398 730 +732 3 613.6359 513.8539 43.0422 0.1652 731 +733 3 614.5316 513.1709 42.9335 0.1907 732 +734 3 615.4526 512.5612 42.9156 0.1652 733 +735 3 616.5256 512.2821 42.9696 0.1525 734 +736 3 617.657 512.3576 43.0296 0.1652 735 +737 3 618.7965 512.4559 43.083 0.2288 736 +738 3 619.8913 512.1791 43.1276 0.2669 737 +739 3 620.8065 511.5156 43.1547 0.2669 738 +740 3 621.7972 510.9527 43.1561 0.2288 739 +741 3 622.8416 510.4871 43.1477 0.2034 740 +742 3 623.9273 510.1531 43.1102 0.178 741 +743 3 625.0324 509.9197 43.0326 0.1652 742 +744 3 626.1547 509.7206 42.989 0.1652 743 +745 3 627.2712 509.5468 43.0452 0.2034 744 +746 3 628.3512 509.247 43.1959 0.2415 745 +747 3 629.3464 508.7471 43.4216 0.2669 746 +748 3 630.3726 508.254 43.6218 0.2415 747 +749 3 631.4148 507.8056 43.727 0.2288 748 +750 3 632.4684 507.3743 43.7578 0.2161 749 +751 3 633.5289 506.9533 43.7436 0.2288 750 +752 3 634.5871 506.5243 43.7545 0.2161 751 +753 3 635.6327 506.0907 43.8371 0.2034 752 +754 3 636.6291 505.545 43.9723 0.1907 753 +755 3 637.6278 504.9925 44.1319 0.2034 754 +756 3 638.6712 504.5257 44.2736 0.2034 755 +757 3 639.7065 504.0395 44.3904 0.2034 756 +758 3 640.6228 503.3657 44.5026 0.178 757 +759 3 641.458 502.5912 44.6051 0.1907 758 +760 3 642.2405 501.7618 44.6958 0.2034 759 +761 3 642.8708 500.8112 44.7479 0.2161 760 +762 3 643.4199 499.8102 44.7353 0.178 761 +763 3 643.8981 498.7851 44.6365 0.1652 762 +764 3 644.5857 497.8791 44.5096 0.178 763 +765 3 645.3739 497.0497 44.3876 0.2288 764 +766 3 646.2662 496.3358 44.2739 0.2288 765 +767 3 647.1986 495.6735 44.1692 0.2161 766 +768 3 648.1218 494.9974 44.0698 0.178 767 +769 3 649.037 494.311 43.9662 0.178 768 +770 3 649.9419 493.636 43.7861 0.178 769 +771 3 650.8376 492.9736 43.5204 0.2034 770 +772 3 651.6316 492.1602 43.2541 0.2161 771 +773 3 652.4198 491.3377 43.0021 0.2288 772 +774 3 653.3899 490.8103 42.7221 0.2161 773 +775 3 654.4996 490.5426 42.5345 0.1907 774 +776 3 655.6367 490.4271 42.4388 0.1652 775 +777 3 656.5279 490.9648 42.3702 0.1525 776 +778 3 656.6526 490.0404 42.5253 0.1652 777 +779 3 657.4637 489.2899 42.7224 0.1652 778 +780 3 658.3205 488.536 42.8966 0.178 779 +781 3 659.1408 487.7444 43.0035 0.178 780 +782 3 659.8889 486.8978 43.0293 0.1907 781 +783 3 660.692 486.1062 43.0802 0.178 782 +784 3 661.5214 485.334 43.1771 0.1652 783 +785 3 662.2902 484.4909 43.2972 0.1525 784 +786 3 663.0224 483.6134 43.4403 0.1525 785 +787 3 663.7065 482.7074 43.6422 0.1398 786 +788 3 664.2888 481.7338 43.8808 0.1398 787 +789 3 664.6686 480.6619 44.0975 0.1398 788 +790 3 665.0244 479.5968 44.3456 0.1525 789 +791 3 665.4076 478.5661 44.6578 0.1398 790 +792 3 665.7474 477.4896 44.9296 0.1271 791 +793 3 666.3892 476.5687 45.1158 0.1144 792 +794 3 667.2826 475.864 45.2281 0.1271 793 +795 3 668.3751 475.6237 45.2743 0.1398 794 +796 3 669.5008 475.5093 45.225 0.1652 795 +797 3 670.6139 475.2988 45.1178 0.178 796 +798 3 671.7282 475.0506 45.0274 0.1907 797 +799 3 672.8253 474.784 45.0386 0.1907 798 +800 3 673.9304 474.5381 45.1335 0.178 799 +801 3 675.0595 474.3745 45.2522 0.178 800 +802 3 676.1944 474.2303 45.3757 0.178 801 +803 3 677.3086 473.9752 45.4835 0.2034 802 +804 3 678.4103 473.6675 45.5655 0.2161 803 +805 3 679.4616 473.2328 45.6509 0.2161 804 +806 3 680.4638 472.7855 45.8122 0.1907 805 +807 3 681.53 472.448 45.8553 0.1525 806 +808 3 682.65 472.3267 45.7755 0.1398 807 +809 3 683.5034 471.9057 45.8609 0.1525 808 +810 3 684.2653 471.09 45.8923 0.178 809 +811 3 684.9471 470.43 45.6182 0.1907 810 +812 3 685.8474 470.1039 44.3458 0.178 811 +813 3 581.3476 528.8735 46.6665 0.2669 698 +814 3 582.391 528.5978 47.5129 0.2034 813 +815 3 583.416 528.1951 47.8873 0.178 814 +816 3 584.4788 527.8222 48.2689 0.2034 815 +817 3 585.5919 527.575 48.5834 0.2288 816 +818 3 586.7141 527.3554 48.8233 0.2415 817 +819 3 587.8284 527.0969 49.0118 0.2161 818 +820 3 588.9404 526.8417 49.175 0.2034 819 +821 3 590.0477 526.6175 49.3674 0.178 820 +822 3 591.1609 526.4105 49.5855 0.1525 821 +823 3 592.2888 526.2343 49.7823 0.1398 822 +824 3 593.4203 526.0673 49.94 0.1652 823 +825 3 594.4739 525.684 50.104 0.2288 824 +826 3 595.4795 525.1967 50.2824 0.2669 825 +827 3 596.5651 524.9015 50.3521 0.2796 826 +828 3 597.6759 524.6647 50.3068 0.2415 827 +829 3 598.7822 524.5835 50.1371 0.2415 828 +830 3 599.79 524.1888 49.8585 0.2288 829 +831 3 600.4478 523.3388 49.7017 0.2542 830 +832 3 601.2784 522.5769 49.6034 0.2542 831 +833 3 602.2657 522.0061 49.5054 0.2796 832 +834 3 603.2827 521.5725 49.32 0.2924 833 +835 3 604.1018 520.7957 49.1218 0.2796 834 +836 3 604.7333 519.8439 48.9454 0.2288 835 +837 3 605.3064 518.8543 48.7724 0.178 836 +838 3 605.8727 517.8602 48.6102 0.178 837 +839 3 606.3692 516.8523 48.3969 0.2161 838 +840 3 606.8691 515.8376 48.1608 0.2415 839 +841 3 607.3908 514.8217 47.9718 0.2161 840 +842 3 608.0028 513.8562 47.784 0.178 841 +843 3 608.6629 512.9261 47.5776 0.1525 842 +844 3 609.0107 511.8393 47.376 0.1525 843 +845 3 609.5243 510.8646 47.08 0.1398 844 +846 3 610.4121 510.2892 46.676 0.1271 845 +847 3 611.1751 509.4655 46.3904 0.1144 846 +848 3 611.6465 508.4314 46.1376 0.1144 847 +849 3 612.0812 507.4338 45.8335 0.1144 848 +850 3 612.9129 506.7542 45.5112 0.1144 849 +851 3 613.8189 506.2166 45.274 0.1144 850 +852 3 614.4218 505.2682 45.2012 0.1144 851 +853 3 615.1528 504.4228 45.2029 0.1144 852 +854 3 616.0657 503.7329 45.2203 0.1271 853 +855 3 616.9523 503.0111 45.2424 0.1525 854 +856 3 617.8092 502.2549 45.243 0.178 855 +857 3 618.7496 501.6223 45.1965 0.178 856 +858 3 619.7986 501.1681 45.0932 0.178 857 +859 3 620.8145 500.6499 44.9425 0.178 858 +860 3 621.7915 500.0573 44.7429 0.1907 859 +861 3 622.6872 499.4475 44.4234 0.178 860 +862 3 623.289 498.5975 43.9348 0.178 861 +863 3 623.909 497.6926 43.3868 0.178 862 +864 3 624.8173 497.1458 42.8056 0.1907 863 +865 3 625.8607 496.782 42.2162 0.1907 864 +866 3 626.9269 496.401 41.6945 0.2034 865 +867 3 627.9416 495.9263 41.3375 0.2034 866 +868 3 628.6303 495.1106 41.0203 0.2034 867 +869 3 629.4242 494.4528 40.6118 0.1907 868 +870 3 630.1106 493.6566 40.1478 0.2034 869 +871 3 630.614 492.6762 39.6768 0.2161 870 +872 3 631.2649 491.7576 39.3086 0.2288 871 +873 3 632.0028 490.8858 39.0695 0.2288 872 +874 3 632.8997 490.196 38.9124 0.2288 873 +875 3 633.8412 489.5931 38.7705 0.2288 874 +876 3 634.737 488.9239 38.6316 0.2161 875 +877 3 635.5709 488.2867 38.687 0.2161 876 +878 3 636.239 487.4836 38.913 0.2034 877 +879 3 636.9117 486.5798 39.128 0.2288 878 +880 3 637.5947 485.6623 39.2899 0.2161 879 +881 3 638.2365 484.746 39.34 0.2415 880 +882 3 638.8931 483.8296 39.3064 0.2415 881 +883 3 639.5967 482.9316 39.263 0.2796 882 +884 3 640.2545 481.9958 39.2515 0.2669 883 +885 3 640.6961 480.9502 39.3252 0.2288 884 +886 3 641.5014 480.3324 39.5942 0.178 885 +887 3 641.8584 479.2799 39.9255 0.1652 886 +888 3 642.1993 478.2057 40.269 0.2034 887 +889 3 642.7049 477.1807 40.5185 0.2415 888 +890 3 643.2163 476.158 40.6686 0.2542 889 +891 3 643.7219 475.1455 40.7764 0.2288 890 +892 3 644.2836 474.1548 40.8092 0.1907 891 +893 3 645.0055 473.2842 40.6904 0.1652 892 +894 3 645.7537 472.4411 40.4463 0.1525 893 +895 3 646.5305 471.6334 40.103 0.1525 894 +896 3 647.4045 470.9493 39.6777 0.1525 895 +897 3 648.3288 470.3419 39.1975 0.1652 896 +898 3 649.061 469.4839 38.7433 0.178 897 +899 3 649.7577 468.5916 38.3457 0.1907 898 +900 3 650.4509 467.6855 38.0355 0.178 899 +901 3 651.1511 466.784 37.805 0.1652 900 +902 3 651.8935 465.9123 37.6625 0.178 901 +903 3 652.6692 465.0726 37.5838 0.2034 902 +904 3 653.605 464.4137 37.5441 0.2288 903 +905 3 654.5076 463.7112 37.5281 0.2034 904 +906 3 655.1722 462.78 37.5234 0.178 905 +907 3 567.9251 532.6693 48.9927 0.2034 685 +908 3 568.528 532.4165 51.5194 0.2161 907 +909 3 569.1297 532.1636 52.6394 0.2034 908 +910 3 569.7314 531.9108 53.9342 0.2161 909 +911 3 570.6718 531.8262 55.0164 0.2669 910 +912 3 571.3067 531.8948 58.0194 0.2034 911 +913 3 570.9407 531.857 60.5021 0.2034 912 +914 3 570.7919 530.9968 61.5336 0.178 913 +915 3 571.3491 530.252 62.6783 0.1525 914 +916 3 571.5721 530.5426 63.9587 0.1271 915 +917 3 572.4256 531.0219 65.0832 0.1144 916 +918 3 573.1955 531.8273 66.0402 0.1398 917 +919 3 573.6336 532.8546 66.836 0.178 918 +920 3 573.6851 533.9883 67.4943 0.2288 919 +921 3 573.8842 535.1037 68.0694 0.2288 920 +922 3 574.423 535.9857 68.6199 0.2034 921 +923 3 575.2924 536.083 69.2793 0.1652 922 +924 3 576.2362 536.4662 69.9093 0.1525 923 +925 3 577.2315 536.7842 70.6037 0.1525 924 +926 3 578.3309 536.9902 71.2956 0.1398 925 +927 3 579.4314 536.862 71.9785 0.1271 926 +928 3 580.4473 537.0302 72.7275 0.1144 927 +929 3 581.5421 537.1458 73.458 0.1144 928 +930 3 582.6415 537.2556 74.1754 0.1144 929 +931 3 583.742 537.3654 74.8726 0.1144 930 +932 3 584.8643 537.3906 75.5317 0.1144 931 +933 3 585.9957 537.2247 76.0967 0.1144 932 +934 3 587.126 537.0519 76.6226 0.1144 933 +935 3 588.2311 537.0497 77.224 0.1144 934 +936 3 589.2401 537.1995 77.9573 0.1144 935 +937 3 590.2491 537.3505 78.7727 0.1144 936 +938 3 591.257 537.5015 79.6264 0.1271 937 +939 3 592.266 537.6525 81.5186 0.1652 938 +940 3 571.8135 532.4885 55.8093 0.2034 911 +941 3 572.3501 533.4655 56.4564 0.2034 940 +942 3 572.4954 534.5672 57.008 0.2288 941 +943 3 572.4542 535.6757 57.5165 0.2161 942 +944 3 572.5503 536.7717 57.9858 0.2415 943 +945 3 572.8843 537.8047 58.5511 0.2288 944 +946 3 573.1783 538.8091 59.2312 0.2669 945 +947 3 573.7057 539.7552 59.8788 0.2669 946 +948 3 574.3544 540.659 60.4923 0.2669 947 +949 3 574.8714 541.6348 61.1237 0.2161 948 +950 3 575.4766 542.5683 61.7641 0.1652 949 +951 3 576.0772 543.5304 62.3633 0.1271 950 +952 3 576.2751 544.5474 62.9815 0.1144 951 +953 3 576.4216 545.585 63.7006 0.1144 952 +954 3 576.5691 546.6238 64.4809 0.1144 953 +955 3 576.7156 547.6614 65.2834 0.1144 954 +956 3 576.862 548.699 66.0786 0.1144 955 +957 3 577.2338 549.7034 66.7624 0.1144 956 +958 3 577.8436 550.6713 67.2521 0.1144 957 +959 3 578.4533 551.6391 67.5828 0.1144 958 +960 3 579.0631 552.6069 67.7998 0.1144 959 +961 3 579.6728 553.5747 67.9459 0.1144 960 +962 3 580.262 554.5208 68.1044 0.1271 961 +963 3 580.8397 555.4578 68.3525 0.1525 962 +964 3 581.4735 556.4027 68.581 0.178 963 +965 3 581.8601 557.4243 68.7406 0.178 964 +966 3 581.9173 558.51 68.9391 0.1525 965 +967 3 581.9173 559.5075 69.3739 0.1271 966 +968 3 581.9208 560.4307 70.0288 0.1144 967 +969 3 582.2651 561.3883 70.5944 0.1144 968 +970 3 582.852 562.2909 71.2135 0.1144 969 +971 3 583.4423 563.1923 71.8502 0.1144 970 +972 3 584.1012 564.0629 72.4346 0.1144 971 +973 3 585.1194 564.5766 72.8067 0.1144 972 +974 3 586.1421 565.088 73.022 0.1144 973 +975 3 587.166 565.5959 73.1444 0.1144 974 +976 3 588.1887 566.1061 73.1923 0.1144 975 +977 3 589.2126 566.614 73.2046 0.1144 976 +978 3 590.1988 567.1941 73.2365 0.1144 977 +979 3 590.9618 568.0338 73.3583 0.1144 978 +980 3 591.726 568.8734 73.5437 0.1144 979 +981 3 592.4902 569.7131 73.768 0.1144 980 +982 3 593.2544 570.5528 74.0093 0.1398 981 +983 3 594.0186 571.3925 74.5368 0.1652 982 +984 3 560.1676 531.2095 43.0066 0.2415 677 +985 3 560.5531 532.0275 44.1543 0.2288 984 +986 3 561.5759 532.4737 44.5936 0.2034 985 +987 3 562.7096 532.4931 45.0092 0.1652 986 +988 3 563.8193 532.5892 45.4194 0.1652 987 +989 3 564.9061 532.5835 45.808 0.1907 988 +990 3 565.9654 533.0022 46.0872 0.2161 989 +991 3 567.0305 533.3488 46.1952 0.2288 990 +992 3 568.0338 533.7115 46.1079 0.2161 991 +993 3 569.0714 534.0958 45.9855 0.2034 992 +994 3 569.6994 534.9001 45.953 0.178 993 +995 3 570.0277 535.9629 45.9836 0.178 994 +996 3 570.9029 536.5131 46.1594 0.178 995 +997 3 571.9817 536.8071 46.3966 0.1907 996 +998 3 573.0147 537.2785 46.6346 0.178 997 +999 3 573.7103 537.7921 47.0666 0.178 998 +1000 3 574.2708 538.5986 47.3984 0.2034 999 +1001 3 574.9012 539.4875 47.7582 0.2415 1000 +1002 3 575.718 540.2597 48.0091 0.2542 1001 +1003 3 576.838 540.4828 48.2387 0.2161 1002 +1004 3 577.9797 540.4862 48.466 0.178 1003 +1005 3 579.0859 540.5503 48.7869 0.1398 1004 +1006 3 580.1201 540.6761 49.2758 0.1271 1005 +1007 3 581.2115 540.961 49.7767 0.1271 1006 +1008 3 582.2971 541.3133 50.2317 0.1652 1007 +1009 3 583.3977 541.5124 50.7016 0.2034 1008 +1010 3 584.4616 541.525 51.2406 0.2288 1009 +1011 3 585.5495 541.6577 51.7656 0.2161 1010 +1012 3 586.6329 542.0283 52.18 0.2034 1011 +1013 3 587.7071 542.4173 52.5294 0.178 1012 +1014 3 588.7447 542.9001 52.8399 0.1652 1013 +1015 3 589.7823 543.3497 53.1454 0.1525 1014 +1016 3 590.8199 543.6425 53.5727 0.1652 1015 +1017 3 591.8026 544.0315 54.1036 0.1652 1016 +1018 3 592.6057 544.8106 54.6661 0.1652 1017 +1019 3 593.5358 545.386 55.2577 0.1525 1018 +1020 3 594.6489 545.6011 55.7973 0.1525 1019 +1021 3 595.7346 545.7715 56.3097 0.1525 1020 +1022 3 596.6818 546.3058 56.8313 0.1398 1021 +1023 3 597.6977 546.713 57.3409 0.1398 1022 +1024 3 598.7971 546.9395 57.8001 0.1398 1023 +1025 3 599.9056 547.2038 58.1434 0.1525 1024 +1026 3 601.0027 547.499 58.3464 0.1398 1025 +1027 3 602.0986 547.801 58.4962 0.1271 1026 +1028 3 603.1854 548.0858 58.6642 0.1144 1027 +1029 3 604.3054 548.262 58.8157 0.1271 1028 +1030 3 605.4483 548.3192 58.9215 0.1398 1029 +1031 3 606.59 548.3421 58.9966 0.1525 1030 +1032 3 607.7317 548.2631 59.043 0.1398 1031 +1033 3 608.87 548.159 59.0542 0.1271 1032 +1034 3 610.0014 548.1968 59.036 0.1144 1033 +1035 3 611.1076 548.4885 59.0041 0.1271 1034 +1036 3 612.223 548.7082 58.9537 0.1398 1035 +1037 3 613.3556 548.7791 58.8622 0.1525 1036 +1038 3 614.4882 548.874 58.7583 0.1398 1037 +1039 3 615.6184 549.0296 58.6757 0.1271 1038 +1040 3 616.7384 549.2298 58.6496 0.1271 1039 +1041 3 617.8344 549.5215 58.7345 0.1525 1040 +1042 3 618.8891 549.8968 58.9173 0.178 1041 +1043 3 619.8386 550.4848 59.1914 0.178 1042 +1044 3 620.7584 551.1323 59.4941 0.1525 1043 +1045 3 621.6496 551.845 59.7551 0.1271 1044 +1046 3 622.582 552.5028 59.953 0.1144 1045 +1047 3 623.5635 553.0885 60.0704 0.1144 1046 +1048 3 624.5245 553.6971 60.1073 0.1144 1047 +1049 3 625.4694 554.3172 60.0832 0.1144 1048 +1050 3 626.4624 554.8686 60.109 0.1144 1049 +1051 3 627.4748 555.3571 60.2367 0.1144 1050 +1052 3 628.4987 555.8364 60.4318 0.1144 1051 +1053 3 629.5546 556.2357 60.6584 0.1271 1052 +1054 3 630.6758 556.4393 60.8773 0.1525 1053 +1055 3 631.8118 556.5652 61.063 0.178 1054 +1056 3 632.9477 556.6887 61.192 0.2034 1055 +1057 3 634.086 556.8077 61.2584 0.2034 1056 +1058 3 635.214 556.9804 61.278 0.2161 1057 +1059 3 636.318 557.279 61.2646 0.1907 1058 +1060 3 637.3979 557.6531 61.2237 0.178 1059 +1061 3 638.4367 558.1256 61.1514 0.1525 1060 +1062 3 639.4617 558.6198 61.0464 0.1652 1061 +1063 3 640.5393 558.9778 60.9132 0.1907 1062 +1064 3 641.6513 559.2078 60.7684 0.2034 1063 +1065 3 642.785 559.3142 60.6533 0.2034 1064 +1066 3 643.929 559.3142 60.5962 0.178 1065 +1067 3 645.0684 559.2558 60.6015 0.1907 1066 +1068 3 646.1953 559.0659 60.6746 0.1907 1067 +1069 3 647.3175 558.9184 60.8149 0.2288 1068 +1070 3 648.4512 558.9355 61.0182 0.2161 1069 +1071 3 649.5815 558.9515 61.2654 0.2161 1070 +1072 3 650.7003 558.9573 61.5546 0.1652 1071 +1073 3 651.8215 558.9435 61.8195 0.1525 1072 +1074 3 652.9529 558.9035 61.9581 0.1652 1073 +1075 3 654.082 558.8143 62.0158 0.2161 1074 +1076 3 655.194 558.6026 62.0959 0.2415 1075 +1077 3 656.2796 558.296 62.2009 0.2288 1076 +1078 3 657.3893 558.0512 62.2874 0.1907 1077 +1079 3 658.5184 558.0661 62.4252 0.178 1078 +1080 3 659.6498 558.1015 62.6046 0.1652 1079 +1081 3 660.7893 558.002 62.776 0.1652 1080 +1082 3 661.8612 557.7458 62.9955 0.1398 1081 +1083 3 662.5144 556.9987 63.2862 0.1398 1082 +1084 3 663.3438 556.3329 63.5631 0.1398 1083 +1085 3 664.4512 556.1728 63.7241 0.1525 1084 +1086 3 665.5506 556.1602 63.6644 0.1398 1085 +1087 3 666.571 556.3078 63.3578 0.1271 1086 +1088 3 667.5892 556.7585 62.9812 0.1144 1087 +1089 3 668.6955 556.675 62.6175 0.1271 1088 +1090 3 669.7319 556.2014 62.2947 0.1398 1089 +1091 3 670.7192 555.6431 61.9758 0.1525 1090 +1092 3 671.695 555.1489 61.6084 0.1525 1091 +1093 3 672.6949 554.6478 61.2424 0.1525 1092 +1094 3 673.7073 554.1422 60.8952 0.1525 1093 +1095 3 674.7964 553.8024 60.6124 0.1398 1094 +1096 3 675.9084 553.5347 60.4069 0.1271 1095 +1097 3 676.9792 553.1354 60.2714 0.1271 1096 +1098 3 677.9607 552.5497 60.1905 0.1525 1097 +1099 3 678.8896 551.8828 60.1496 0.178 1098 +1100 3 679.6813 551.0659 60.0944 0.178 1099 +1101 3 680.7017 550.6896 59.9466 0.1652 1100 +1102 3 681.8332 550.5386 59.8399 0.1525 1101 +1103 3 682.9371 550.2514 59.8156 0.1652 1102 +1104 3 684.0159 550.2091 60.265 0.178 1103 +1105 3 546.7691 525.0811 43.0937 0.2034 1 +1106 3 545.6846 525.4266 43.3272 0.2034 1105 +1107 3 544.7602 526.097 43.4095 0.2034 1106 +1108 3 543.638 526.3212 43.4997 0.2034 1107 +1109 3 543.3062 526.1119 43.6803 0.2542 1108 +1110 3 542.3956 525.5227 43.899 0.2924 1109 +1111 3 541.4106 524.9919 44.0118 0.3051 1110 +1112 3 540.3741 524.6087 44.1294 0.3051 1111 +1113 3 539.5047 524.111 44.3946 0.2924 1112 +1114 3 538.5963 523.6466 44.7476 0.2542 1113 +1115 3 537.4787 523.6557 45.059 0.2034 1114 +1116 3 536.3552 523.8708 45.3124 0.1652 1115 +1117 3 535.2364 523.8159 45.5221 0.178 1116 +1118 3 534.1885 523.3857 45.6722 0.2288 1117 +1119 3 533.1726 522.8629 45.7794 0.2924 1118 +1120 3 532.1762 522.3687 45.9472 0.3178 1119 +1121 3 531.126 522.0301 46.1874 0.3051 1120 +1122 3 530.069 521.6365 46.3778 0.2669 1121 +1123 3 529.1275 521.0325 46.4551 0.2288 1122 +1124 3 528.1859 520.4262 46.5587 0.2161 1123 +1125 3 527.1689 519.9514 46.683 0.2288 1124 +1126 3 526.264 519.3382 46.8289 0.2796 1125 +1127 3 525.2447 519.0248 46.9899 0.3178 1126 +1128 3 524.1819 518.7674 46.9322 0.3178 1127 +1129 3 523.118 518.7445 46.6281 0.2669 1128 +1130 3 521.823 518.542 45.9365 0.3686 1129 +1131 3 520.8552 518.5157 45.1847 0.3051 1130 +1132 3 519.7821 518.4837 44.4909 0.2415 1131 +1133 3 518.7537 518.3167 44.0112 0.2288 1132 +1134 3 517.6703 518.0924 43.8421 0.2669 1133 +1135 3 516.7036 517.692 43.9636 0.3178 1134 +1136 3 515.7495 517.1441 44.1294 0.3178 1135 +1137 3 514.6707 516.7986 44.2781 0.2924 1136 +1138 3 513.6366 517.0125 44.2907 0.2669 1137 +1139 3 512.5978 517.4118 44.3808 0.2796 1138 +1140 3 511.4984 517.5902 44.5556 0.2924 1139 +1141 3 510.3762 517.7126 44.7779 0.3178 1140 +1142 3 509.6062 518.4185 45.1366 0.3432 1141 +1143 3 508.5881 518.8806 45.4874 0.3559 1142 +1144 3 507.5184 519.0488 45.6316 0.3559 1143 +1145 3 506.4065 519.1666 45.6506 0.3305 1144 +1146 3 505.3197 519.0877 45.6669 0.3305 1145 +1147 3 504.4113 519.559 45.8604 0.3178 1146 +1148 3 503.4206 520.1185 46.0463 0.2924 1147 +1149 3 502.391 520.5806 46.2927 0.2415 1148 +1150 3 501.4038 520.925 46.5041 0.2161 1149 +1151 3 500.4131 520.7248 46.65 0.2288 1150 +1152 3 499.4944 520.9936 46.9927 0.2542 1151 +1153 3 498.8606 521.656 47.2959 0.2669 1152 +1154 3 497.9237 521.9443 47.488 0.2796 1153 +1155 3 496.8014 521.9832 47.7218 0.2924 1154 +1156 3 495.8107 522.1594 48.1029 0.3178 1155 +1157 3 494.9527 522.7016 48.3412 0.3178 1156 +1158 3 493.8579 522.7439 48.5313 0.3305 1157 +1159 3 492.7734 522.84 48.5741 0.3178 1158 +1160 3 491.9017 523.1363 48.8144 0.3305 1159 +1161 3 490.9499 523.7426 48.9392 0.3178 1160 +1162 3 490.0278 524.4188 49.0412 0.3051 1161 +1163 3 489.2099 525.2035 49.1554 0.2669 1162 +1164 3 488.4983 526.0695 49.3027 0.2415 1163 +1165 3 487.5728 526.6427 49.5653 0.2288 1164 +1166 3 486.5935 527.0557 49.7972 0.2288 1165 +1167 3 485.6154 527.5785 49.9621 0.2415 1166 +1168 3 484.7551 528.2958 50.1813 0.2415 1167 +1169 3 484.19 529.2556 50.4619 0.2288 1168 +1170 3 483.3583 529.9088 50.7979 0.1907 1169 +1171 3 482.2898 530.117 51.1932 0.1652 1170 +1172 3 481.1836 530.2795 51.606 0.1525 1171 +1173 3 480.0704 530.5208 51.9509 0.1652 1172 +1174 3 478.9596 530.7966 52.2035 0.178 1173 +1175 3 477.954 531.3216 52.3821 0.1907 1174 +1176 3 476.9794 531.9188 52.507 0.178 1175 +1177 3 475.9326 532.3512 52.64 0.1652 1176 +1178 3 474.8641 532.7299 52.8007 0.1652 1177 +1179 3 473.7567 532.9896 52.9631 0.1652 1178 +1180 3 472.6367 533.2138 53.1126 0.1652 1179 +1181 3 471.5591 533.5856 53.2291 0.1525 1180 +1182 3 470.5158 534.0535 53.3016 0.1525 1181 +1183 3 469.4656 534.5088 53.3308 0.1652 1182 +1184 3 468.4062 534.9378 53.3254 0.1652 1183 +1185 3 467.3354 535.3417 53.2938 0.178 1184 +1186 3 466.2544 535.7169 53.237 0.1652 1185 +1187 3 465.1744 536.0921 53.1549 0.1652 1186 +1188 3 464.0991 536.4834 53.0457 0.1398 1187 +1189 3 463.0157 536.8517 52.897 0.1271 1188 +1190 3 461.9003 536.8781 52.6487 0.1271 1189 +1191 3 460.7757 536.8117 52.3006 0.1398 1190 +1192 3 459.6672 536.5669 51.919 0.1525 1191 +1193 3 458.5312 536.4834 51.5388 0.1398 1192 +1194 3 458.3447 537.0611 50.9236 0.1271 1193 +1195 3 458.0668 537.7063 50.1553 0.1144 1194 +1196 3 457.0211 538.0861 49.5071 0.1144 1195 +1197 3 455.9 538.3046 49.035 0.1144 1196 +1198 3 455.0397 538.9373 48.7133 0.1144 1197 +1199 3 454.0101 539.2805 48.5237 0.1144 1198 +1200 3 453.0309 539.8296 48.4512 0.1144 1199 +1201 3 452.2278 540.6384 48.44 0.1144 1200 +1202 3 451.6443 541.6154 48.44 0.1144 1201 +1203 3 451.3011 542.7022 48.44 0.1144 1202 +1204 3 451.0918 543.8256 48.44 0.1144 1203 +1205 3 450.4729 544.7625 48.44 0.1144 1204 +1206 3 449.9398 545.7692 48.44 0.1144 1205 +1207 3 449.1413 546.5746 48.44 0.1144 1206 +1208 3 448.5189 547.5321 48.44 0.1144 1207 +1209 3 448.2226 548.6338 48.44 0.1144 1208 +1210 3 447.8428 549.7126 48.44 0.1144 1209 +1211 3 447.1633 550.6324 48.44 0.1398 1210 +1212 3 446.6176 551.6368 48.44 0.1907 1211 +1213 3 522.6844 518.2972 47.2147 0.3178 1129 +1214 3 522.1788 517.5433 48.2154 0.3432 1213 +1215 3 521.6446 516.6853 48.6668 0.3559 1214 +1216 3 520.7454 516.0607 49.0087 0.3432 1215 +1217 3 519.7112 515.6397 49.3531 0.3305 1216 +1218 3 518.6061 515.5596 49.7162 0.3432 1217 +1219 3 517.5994 516.0035 49.9682 0.3305 1218 +1220 3 516.635 516.4199 50.2972 0.3178 1219 +1221 3 515.5127 516.4565 50.6316 0.2542 1220 +1222 3 514.395 516.2472 50.9068 0.2415 1221 +1223 3 513.275 516.0149 51.1487 0.2542 1222 +1224 3 512.1505 516.1808 51.4158 0.2924 1223 +1225 3 511.1495 516.5469 51.8426 0.3178 1224 +1226 3 510.0513 516.6029 52.3471 0.3432 1225 +1227 3 508.9301 516.4302 52.8609 0.3813 1226 +1228 3 507.8902 516.4496 53.4674 0.1525 1227 +1229 3 506.7771 516.4565 54.07 0.1398 1228 +1230 3 505.648 516.4565 54.626 0.1271 1229 +1231 3 504.5212 516.4222 55.1348 0.1144 1230 +1232 3 503.392 516.4222 55.61 0.1144 1231 +1233 3 502.2629 516.4474 56.061 0.1271 1232 +1234 3 501.1326 516.5354 56.478 0.1525 1233 +1235 3 500.0172 516.754 56.8593 0.1907 1234 +1236 3 498.9167 517.0262 57.2303 0.2288 1235 +1237 3 497.8963 517.4037 57.6559 0.2669 1236 +1238 3 496.8392 517.7332 58.093 0.2796 1237 +1239 3 495.7227 517.6943 58.4931 0.2542 1238 +1240 3 494.5947 517.811 58.8154 0.2034 1239 +1241 3 493.4724 517.9963 59.0388 0.178 1240 +1242 3 492.3787 518.2926 59.2693 0.2034 1241 +1243 3 491.2473 518.3201 59.4966 0.2542 1242 +1244 3 490.1274 518.1062 59.738 0.3178 1243 +1245 3 489.0737 518.0261 60.149 0.3432 1244 +1246 3 487.9881 517.8465 60.6659 0.3432 1245 +1247 3 486.907 517.5639 61.2357 0.2924 1246 +1248 3 485.8339 517.6406 61.8677 0.2415 1247 +1249 3 484.786 517.97 62.5198 0.2161 1248 +1250 3 483.7404 518.4013 63.1226 0.2034 1249 +1251 3 482.6914 518.8292 63.6675 0.2034 1250 +1252 3 481.6251 519.2319 64.1606 0.1652 1251 +1253 3 480.5921 519.7123 64.5954 0.1398 1252 +1254 3 479.725 520.3152 65.1109 0.1271 1253 +1255 3 478.7651 520.6847 65.7499 0.1525 1254 +1256 3 477.7344 520.3633 66.3743 0.2034 1255 +1257 3 476.7528 520.0224 67.0986 0.2288 1256 +1258 3 475.7541 519.6986 67.909 0.2288 1257 +1259 3 474.8138 519.7707 68.7924 0.178 1258 +1260 3 473.8768 520.0498 69.6654 0.1398 1259 +1261 3 472.7717 520.2866 70.3934 0.1144 1260 +1262 3 471.7112 520.6699 71.043 0.1144 1261 +1263 3 470.7057 521.0828 71.6887 0.1271 1262 +1264 3 469.66 521.3986 72.3159 0.1398 1263 +1265 3 468.651 521.8608 72.8773 0.1652 1264 +1266 3 467.65 522.0655 73.4546 0.1652 1265 +1267 3 466.585 521.9042 74.0782 0.1652 1266 +1268 3 465.4913 521.998 74.6508 0.1398 1267 +1269 3 464.3713 522.2188 75.1114 0.1271 1268 +1270 3 463.3463 522.2085 75.6064 0.1144 1269 +1271 3 462.287 522.1216 76.125 0.1144 1270 +1272 3 461.1453 522.0438 76.491 0.1144 1271 +1273 3 460.0024 522.0072 76.7346 0.1144 1272 +1274 3 458.8584 522.0072 76.8894 0.1652 1273 +1275 3 457.7144 522.0072 77.0 0.2288 1274 +1276 3 508.0355 515.896 54.9959 0.2288 1227 +1277 3 507.1707 515.4464 55.9359 0.2415 1276 +1278 3 506.1434 515.0151 56.2814 0.2161 1277 +1279 3 505.1835 514.4923 56.6748 0.2034 1278 +1280 3 504.4285 513.9134 56.8686 0.2034 1279 +1281 3 503.5648 513.3139 57.2258 0.2161 1280 +1282 3 502.4814 513.0932 57.6626 0.2288 1281 +1283 3 501.382 512.8117 58.0152 0.2288 1282 +1284 3 500.2495 512.7705 58.3954 0.2161 1283 +1285 3 499.3892 512.5612 59.0489 0.2034 1284 +1286 3 498.5609 512.3221 59.8536 0.1907 1285 +1287 3 497.8093 511.5076 60.5763 0.1907 1286 +1288 3 497.1481 510.7846 61.3544 0.1907 1287 +1289 3 496.2844 510.343 62.0166 0.178 1288 +1290 3 495.1758 510.1393 62.4621 0.1652 1289 +1291 3 494.0558 510.2332 62.811 0.1398 1290 +1292 3 493.0034 510.407 63.2464 0.1398 1291 +1293 3 491.9097 510.3258 63.742 0.1652 1292 +1294 3 490.927 509.8247 64.272 0.2034 1293 +1295 3 489.9214 509.3454 64.8553 0.2288 1294 +1296 3 489.0852 508.6258 65.3212 0.2034 1295 +1297 3 488.0018 508.4474 65.8717 0.1907 1296 +1298 3 487.0511 508.4451 66.5932 0.1907 1297 +1299 3 485.9506 508.325 67.2988 0.2161 1298 +1300 3 485.0377 507.7244 68.0546 0.2288 1299 +1301 3 484.0218 507.4944 68.8201 0.2034 1300 +1302 3 482.9076 507.6271 69.5752 0.178 1301 +1303 3 481.8162 507.4818 70.3391 0.1398 1302 +1304 3 480.9044 507.1077 71.2186 0.1271 1303 +1305 3 480.0132 506.6662 72.2033 0.1144 1304 +1306 3 479.0077 506.3561 73.2127 0.1144 1305 +1307 3 477.9724 506.2612 74.2353 0.1144 1306 +1308 3 476.9954 506.0038 75.2441 0.1144 1307 +1309 3 476.2678 505.7818 76.3017 0.1144 1308 +1310 3 475.443 505.9843 77.226 0.1144 1309 +1311 3 474.3344 506.2658 77.8705 0.1144 1310 +1312 3 473.5439 506.975 78.2916 0.1144 1311 +1313 3 472.7717 507.809 78.5361 0.1144 1312 +1314 3 471.6815 508.119 78.6509 0.1144 1313 +1315 3 470.5558 508.3227 78.68 0.1144 1314 +1316 3 469.493 508.7414 78.68 0.1144 1315 +1317 3 468.3536 508.8478 78.68 0.1144 1316 +1318 3 467.2096 508.8512 78.68 0.1144 1317 +1319 3 466.0656 508.8512 78.68 0.1144 1318 +1320 3 464.9216 508.8512 78.68 0.1271 1319 +1321 3 463.7776 508.8512 78.68 0.1398 1320 +1322 3 543.924 526.1325 43.3835 0.178 1108 +1323 3 544.7156 526.2766 44.2246 0.1652 1322 +1324 3 545.0005 527.3291 44.6102 0.178 1323 +1325 3 544.7648 528.4205 44.9473 0.2034 1324 +1326 3 545.0245 529.5198 45.2525 0.2415 1325 +1327 3 545.5233 530.4087 45.7355 0.2288 1326 +1328 3 546.2772 530.9098 46.4002 0.2161 1327 +1329 3 546.6627 531.9726 46.9678 0.178 1328 +1330 3 546.8103 533.0491 47.4446 0.1907 1329 +1331 3 547.69 533.6817 47.9847 0.2034 1330 +1332 3 548.4302 534.2617 48.5848 0.2288 1331 +1333 3 548.7265 535.3371 49.1761 0.2034 1332 +1334 3 549.2252 536.2546 49.8327 0.178 1333 +1335 3 550.0329 536.9547 50.5372 0.178 1334 +1336 3 551.0431 537.434 51.1896 0.2161 1335 +1337 3 552.0464 537.9271 51.7891 0.2415 1336 +1338 3 552.9101 538.5083 52.4356 0.2288 1337 +1339 3 553.7784 539.1558 53.0376 0.2161 1338 +1340 3 554.6318 539.8833 53.4668 0.2288 1339 +1341 3 555.4806 540.5389 53.9608 0.2542 1340 +1342 3 556.0218 541.4289 54.5241 0.2542 1341 +1343 3 557.0433 541.6932 55.1622 0.2288 1342 +1344 3 558.097 542.0787 55.7687 0.1907 1343 +1345 3 559.1014 542.4917 56.4007 0.1525 1344 +1346 3 559.9891 543.1735 56.9862 0.1271 1345 +1347 3 560.8346 543.8576 57.5089 0.1144 1346 +1348 3 561.5724 544.5577 58.0468 0.1144 1347 +1349 3 562.3446 545.1721 58.4892 0.1525 1348 +1350 3 563.4555 545.1412 58.7653 0.2034 1349 +1351 3 564.4668 545.3482 59.0276 0.2669 1350 +1352 3 565.5238 545.7246 59.2911 0.2669 1351 +1353 3 566.3292 546.1319 59.7484 0.2415 1352 +1354 3 567.3554 546.451 60.1247 0.2034 1353 +1355 3 568.4639 546.721 60.4668 0.1907 1354 +1356 3 569.529 547.094 60.8594 0.1907 1355 +1357 3 570.6055 547.2988 61.308 0.2034 1356 +1358 3 571.6236 547.5012 61.8195 0.2161 1357 +1359 3 572.6978 547.8788 62.2348 0.2415 1358 +1360 3 573.8007 548.135 62.6699 0.2288 1359 +1361 3 574.8749 548.4267 63.17 0.2288 1360 +1362 3 575.9411 548.7745 63.6574 0.2034 1361 +1363 3 576.989 548.9164 64.1508 0.2161 1362 +1364 3 577.9534 548.8237 64.836 0.2161 1363 +1365 3 578.9235 548.5022 65.6155 0.2288 1364 +1366 3 579.9005 548.0195 66.4045 0.2288 1365 +1367 3 581.0079 547.9211 67.111 0.2034 1366 +1368 3 582.1461 547.8994 67.744 0.178 1367 +1369 3 583.2409 547.7312 68.3707 0.1525 1368 +1370 3 584.3277 547.547 68.994 0.1652 1369 +1371 3 585.4283 547.4932 69.6256 0.178 1370 +1372 3 586.5334 547.4715 70.2663 0.178 1371 +1373 3 587.5515 547.4646 70.9836 0.1525 1372 +1374 3 588.6406 547.5642 71.6612 0.1271 1373 +1375 3 589.772 547.6889 72.2154 0.1144 1374 +1376 3 590.9046 547.8136 72.6611 0.1144 1375 +1377 3 592.0372 547.9394 73.0206 0.1144 1376 +1378 3 593.1709 548.0652 73.3135 0.1144 1377 +1379 3 594.3034 548.1899 73.5588 0.1144 1378 +1380 3 595.436 548.3146 73.7867 0.1144 1379 +1381 3 596.5697 548.4405 74.0127 0.1144 1380 +1382 3 597.6107 548.8981 74.228 0.1144 1381 +1383 3 598.3257 549.7881 74.4173 0.1271 1382 +1384 3 599.3633 550.2686 74.6077 0.1398 1383 +1385 3 600.4398 550.6404 74.8278 0.1525 1384 +1386 3 601.5381 550.8921 75.1041 0.1398 1385 +1387 3 602.6363 551.1437 75.4155 0.1271 1386 +1388 3 603.7334 551.3943 75.7436 0.1398 1387 +1389 3 604.8317 551.646 76.4733 0.1652 1388 +1390 3 554.5311 523.4155 33.8556 0.1907 1 +1391 3 555.5195 523.1821 33.2139 0.1907 1390 +1392 3 556.4816 522.5655 33.0028 0.2161 1391 +1393 3 557.2493 522.0804 32.6494 0.2415 1392 +1394 3 557.8487 521.2304 32.3232 0.2669 1393 +1395 3 558.3246 520.2008 32.051 0.2415 1394 +1396 3 558.2034 519.0751 31.9379 0.2161 1395 +1397 3 558.3029 518.3944 32.7558 0.178 1396 +1398 3 558.6221 517.3546 31.2326 0.2034 1397 +1399 3 558.4802 516.8523 30.4298 0.2288 1398 +1400 3 558.4836 515.7701 29.5968 0.2034 1399 +1401 3 559.1094 515.1238 28.4418 0.2288 1400 +1402 3 559.7695 514.6398 27.1417 0.2542 1401 +1403 3 560.5863 514.2795 25.8372 0.2542 1402 +1404 3 560.8666 513.8516 24.5535 0.2924 1403 +1405 3 560.1813 513.195 23.4935 0.3051 1404 +1406 3 559.1563 512.7191 22.7792 0.2924 1405 +1407 3 558.653 511.9938 22.5964 0.2161 1406 +1408 3 558.0684 511.0557 22.6043 0.1652 1407 +1409 3 556.9839 510.7354 22.6632 0.1398 1408 +1410 3 556.0229 510.4963 22.7421 0.178 1409 +1411 3 554.9269 510.1668 22.7757 0.1525 1410 +1412 3 553.7932 510.0558 22.7167 0.1652 1411 +1413 3 552.8163 509.9403 22.7671 0.1652 1412 +1414 3 551.7283 509.8007 22.6735 0.178 1413 +1415 3 551.1083 509.4598 22.2007 0.1652 1414 +1416 3 550.3189 508.6693 21.669 0.178 1415 +1417 3 549.6119 507.8353 21.1109 0.1652 1416 +1418 3 548.8763 507.3972 20.4708 0.178 1417 +1419 3 547.7449 507.5322 19.9428 0.1907 1418 +1420 3 546.6021 507.5322 19.5521 0.2288 1419 +1421 3 545.4661 507.5997 19.2757 0.2542 1420 +1422 3 544.369 507.8616 18.9882 0.2542 1421 +1423 3 543.3382 508.1442 18.5965 0.2415 1422 +1424 3 542.3292 508.3764 18.1 0.2415 1423 +1425 3 541.5845 509.0571 17.5422 0.2415 1424 +1426 3 540.969 509.9746 17.0044 0.2288 1425 +1427 3 540.0721 510.2606 16.7211 0.1907 1426 +1428 3 539.0288 509.9437 16.6231 0.1652 1427 +1429 3 537.958 509.5628 16.6096 0.178 1428 +1430 3 537.5084 509.1338 15.7273 0.1907 1429 +1431 3 557.7801 510.2972 21.6829 0.1652 1409 +1432 3 557.597 509.6165 20.1249 0.1652 1431 +1433 3 557.104 508.7196 19.5466 0.1652 1432 +1434 3 556.8454 508.3776 18.7427 0.1907 1433 +1435 3 556.1545 508.1236 17.9839 0.2161 1434 +1436 3 555.3559 507.5322 17.4124 0.2034 1435 +1437 3 558.4402 514.7863 31.5946 0.2669 1400 +1438 3 558.3772 513.6812 30.8031 0.2288 1437 +1439 3 558.8795 512.8735 30.4175 0.1652 1438 +1440 3 559.8542 512.4285 29.8816 0.1271 1439 +1441 3 560.4662 511.6162 29.2258 0.1144 1440 +1442 3 560.6664 510.693 28.4435 0.1144 1441 +1443 3 561.4111 510.1325 27.7303 0.1271 1442 +1444 3 562.26 510.661 27.2825 0.1398 1443 +1445 3 562.2211 511.6506 26.3992 0.1652 1444 +1446 3 559.2776 519.1403 32.1003 0.1907 1396 +1447 3 559.9983 518.4986 32.4302 0.1907 1446 +1448 3 560.7339 517.7504 32.5088 0.1907 1447 +1449 3 561.3757 517.0491 32.3456 0.2288 1448 +1450 3 561.839 516.0058 32.1504 0.2415 1449 +1451 3 562.4762 515.0723 31.9416 0.2288 1450 +1452 3 563.1878 514.2108 31.6932 0.2161 1451 +1453 3 563.9531 513.4844 31.3026 0.2288 1452 +1454 3 564.3752 512.5543 30.9064 0.2542 1453 +1455 3 564.9724 511.6517 30.5822 0.2542 1454 +1456 3 565.7663 510.836 30.2515 0.2415 1455 +1457 3 566.7319 510.5375 29.7447 0.2161 1456 +1458 3 567.6711 510.693 29.0142 0.2161 1457 +1459 3 568.7224 510.7274 28.1982 0.2288 1458 +1460 3 569.5438 510.1256 27.2978 0.2669 1459 +1461 3 569.1594 509.8694 27.9712 0.1907 1460 +1462 3 569.1686 508.9015 28.1492 0.2034 1461 +1463 3 569.7566 508.031 28.168 0.2415 1462 +1464 3 570.6272 507.3823 27.994 0.2542 1463 +1465 3 571.5081 506.7085 27.713 0.2415 1464 +1466 3 572.6406 506.6055 27.3894 0.2415 1465 +1467 3 573.7183 506.4133 26.9682 0.2542 1466 +1468 3 574.7479 506.093 26.6821 0.2415 1467 +1469 3 575.7844 505.974 26.5146 0.2034 1468 +1470 3 576.6366 506.0381 26.1963 0.1525 1469 +1471 3 576.7659 505.354 25.4658 0.1525 1470 +1472 3 576.894 504.671 24.4202 0.1652 1471 +1473 3 577.029 503.9606 23.1805 0.1907 1472 +1474 3 577.6491 503.1472 22.1266 0.1652 1473 +1475 3 578.6135 502.637 21.1768 0.1398 1474 +1476 3 579.5367 502.1165 20.313 0.1144 1475 +1477 3 580.4587 501.596 19.5544 0.1271 1476 +1478 3 581.2309 500.8546 18.9501 0.1525 1477 +1479 3 581.8578 499.8983 18.5251 0.178 1478 +1480 3 581.7171 498.9956 18.1056 0.178 1479 +1481 3 580.9404 498.1994 17.8605 0.1652 1480 +1482 3 580.4278 497.1961 17.6627 0.178 1481 +1483 3 580.1418 496.0922 17.555 0.2034 1482 +1484 3 579.7803 495.0088 17.4758 0.2288 1483 +1485 3 579.2301 494.0078 17.3999 0.2161 1484 +1486 3 578.7279 492.9805 17.2928 0.2034 1485 +1487 3 578.332 491.9292 17.0856 0.178 1486 +1488 3 578.0117 490.8618 16.7991 0.178 1487 +1489 3 577.7966 489.7876 15.9191 0.178 1488 +1490 3 570.459 510.2778 26.3477 0.2161 1460 +1491 3 570.4705 510.7617 26.1302 0.1907 1490 +1492 3 570.983 511.4172 26.4256 0.2161 1491 +1493 3 572.0686 511.6551 26.4796 0.2288 1492 +1494 3 573.1932 511.7776 26.4406 0.2161 1493 +1495 3 574.2766 512.115 26.3196 0.1907 1494 +1496 3 575.3679 512.3564 26.1365 0.1525 1495 +1497 3 575.9274 513.0131 25.9501 0.1271 1496 +1498 3 575.9823 514.0587 25.5577 0.1398 1497 +1499 3 576.2248 515.1077 25.0383 0.178 1498 +1500 3 577.0908 515.7369 24.5171 0.2288 1499 +1501 3 578.0929 516.0893 23.8838 0.2669 1500 +1502 3 579.0036 516.5435 23.1305 0.2796 1501 +1503 3 579.8456 517.2138 22.3609 0.2924 1502 +1504 3 580.8111 517.6772 21.6161 0.2669 1503 +1505 3 581.9208 517.4724 20.9959 0.2796 1504 +1506 3 582.9023 516.8878 20.5298 0.2669 1505 +1507 3 583.7489 516.1842 20.0882 0.2669 1506 +1508 3 584.5337 515.9898 19.7501 0.2415 1507 +1509 3 585.6628 515.896 19.5107 0.2415 1508 +1510 3 586.7999 515.976 19.3314 0.1907 1509 +1511 3 587.6145 516.5755 19.1427 0.1525 1510 +1512 3 588.0194 517.485 18.8361 0.1398 1511 +1513 3 588.6223 518.3121 18.5705 0.178 1512 +1514 3 589.3739 519.1552 18.4706 0.2161 1513 +1515 3 590.3029 519.7775 18.465 0.2669 1514 +1516 3 591.3428 520.234 18.5498 0.2669 1515 +1517 3 591.925 520.9856 18.831 0.2288 1516 +1518 3 592.3335 522.0118 19.1098 0.178 1517 +1519 3 593.0416 522.8652 19.2081 0.178 1518 +1520 3 593.8847 523.5905 19.2731 0.2034 1519 +1521 3 594.8503 524.1282 19.1541 0.2415 1520 +1522 3 595.8787 524.6121 18.9317 0.2288 1521 +1523 3 596.5136 525.5033 18.5796 0.2161 1522 +1524 3 596.993 526.4928 18.1582 0.1652 1523 +1525 3 597.8944 527.1735 17.7652 0.1525 1524 +1526 3 598.8577 527.7798 17.0562 0.1525 1525 +1527 3 583.9296 515.6992 19.6619 0.178 1507 +1528 3 584.2065 514.5975 19.6309 0.1525 1527 +1529 3 584.3689 513.4661 19.62 0.1271 1528 +1530 3 584.5646 512.3381 19.6116 0.1144 1529 +1531 3 584.9272 511.2708 19.6057 0.1271 1530 +1532 3 585.4042 510.2343 19.6019 0.1398 1531 +1533 3 585.8916 509.2058 19.6001 0.1525 1532 +1534 3 586.4178 508.1923 19.6 0.1398 1533 +1535 3 587.0379 507.2507 19.6 0.1271 1534 +1536 3 587.9863 506.6707 19.6 0.1398 1535 +1537 3 588.8019 505.9489 19.6 0.1652 1536 +1538 3 589.6542 505.2121 19.6 0.1907 1537 +1539 3 590.7296 504.8952 19.6 0.1652 1538 +1540 3 591.8553 504.695 19.6 0.1525 1539 +1541 3 592.4959 503.8473 19.6 0.1398 1540 +1542 3 593.1262 502.8932 19.6 0.1525 1541 +1543 3 593.6925 501.9003 19.6 0.1398 1542 +1544 3 594.6821 501.3363 19.6 0.1525 1543 +1545 3 595.7952 501.072 19.6 0.1907 1544 +1546 3 571.1981 509.2573 25.3975 0.2415 1490 +1547 3 572.0812 508.6544 24.6505 0.2161 1546 +1548 3 573.0674 508.1408 24.2391 0.2034 1547 +1549 3 574.1095 507.7335 24.0326 0.2034 1548 +1550 3 575.2307 507.5207 23.9246 0.2288 1549 +1551 3 576.1459 506.9442 23.859 0.2415 1550 +1552 3 576.7613 506.4225 23.5821 0.2161 1551 +1553 3 577.2761 505.5233 23.2401 0.178 1552 +1554 3 577.847 504.5692 23.0335 0.1525 1553 +1555 3 578.6329 503.908 23.0569 0.178 1554 +1556 3 579.452 503.2193 23.2073 0.2034 1555 +1557 3 580.3134 502.5672 23.2321 0.2415 1556 +1558 3 581.2138 502.0032 23.0722 0.2415 1557 +1559 3 582.1713 501.4369 22.7998 0.2415 1558 +1560 3 583.1471 500.8649 22.4538 0.2161 1559 +1561 3 584.1882 500.4085 22.0923 0.2034 1560 +1562 3 585.259 500.0138 21.762 0.1907 1561 +1563 3 586.3755 499.8582 21.4986 0.2034 1562 +1564 3 587.5172 499.7999 21.2872 0.2161 1563 +1565 3 588.4633 499.2828 21.0862 0.2161 1564 +1566 3 589.057 498.3447 20.8162 0.2034 1565 +1567 3 589.2183 497.2579 20.4586 0.178 1566 +1568 3 589.0822 496.1322 20.0717 0.1652 1567 +1569 3 588.922 495.0832 19.5759 0.1398 1568 +1570 3 589.0662 494.0982 18.9586 0.1271 1569 +1571 3 589.3099 493.0526 18.3427 0.1271 1570 +1572 3 589.9242 492.111 17.8577 0.1525 1571 +1573 3 590.6918 491.3366 17.4301 0.178 1572 +1574 3 591.1494 490.3562 17.2909 0.178 1573 +1575 3 591.774 489.4615 17.3888 0.1525 1574 +1576 3 592.6675 488.782 17.5993 0.1398 1575 +1577 3 593.7303 488.385 17.8328 0.1525 1576 +1578 3 594.769 487.9149 17.9709 0.178 1577 +1579 3 595.8707 487.6517 18.0013 0.1907 1578 +1580 3 596.9953 487.6529 17.9082 0.178 1579 +1581 3 598.129 487.7593 17.7848 0.1652 1580 +1582 3 599.2283 487.9526 17.7804 0.1398 1581 +1583 3 600.3529 487.8668 17.848 0.1398 1582 +1584 3 601.4202 487.4618 17.8911 0.1525 1583 +1585 3 602.5173 487.2456 17.9327 0.1907 1584 +1586 3 603.5836 487.6094 17.9858 0.2161 1585 +1587 3 604.4793 488.3175 18.0136 0.2161 1586 +1588 3 605.3156 489.0932 18.0058 0.2034 1587 +1589 3 606.2685 489.5016 17.9511 0.1907 1588 +1590 3 607.2695 489.0325 17.8152 0.2034 1589 +1591 3 608.1962 488.3908 17.7317 0.2034 1590 +1592 3 608.9832 487.6094 17.7191 0.1907 1591 +1593 3 609.7955 486.8464 17.6776 0.1525 1592 +1594 3 610.8468 486.4391 17.5762 0.1271 1593 +1595 3 611.9359 486.3739 17.3889 0.1144 1594 +1596 3 613.0307 486.4757 17.1487 0.1144 1595 +1597 3 614.1198 486.3361 16.8421 0.1144 1596 +1598 3 615.2375 486.0948 16.6173 0.1144 1597 +1599 3 616.354 485.8476 16.4862 0.1271 1598 +1600 3 617.4797 485.7275 16.4966 0.1525 1599 +1601 3 618.5951 485.668 16.9296 0.178 1600 +1602 4 549.3008 518.1714 38.7442 0.1525 1 +1603 4 549.0182 517.0628 38.7394 0.2034 1602 +1604 4 548.6018 516.0001 38.7327 0.2542 1603 +1605 4 548.1407 514.9522 38.7218 0.2415 1604 +1606 4 547.674 513.9077 38.7069 0.2288 1605 +1607 4 547.4566 512.7911 38.6918 0.2161 1606 +1608 4 547.2942 511.6586 38.6806 0.2288 1607 +1609 4 547.1592 510.5363 38.6212 0.2288 1608 +1610 4 547.1203 509.414 38.5106 0.2415 1609 +1611 4 546.7622 508.3456 38.4978 0.2542 1610 +1612 4 546.2749 508.7528 38.4804 0.178 1611 +1613 4 545.2144 508.4451 39.0102 0.178 1612 +1614 4 544.2649 508.182 39.3375 0.2034 1613 +1615 4 543.3245 507.6294 39.4876 0.2034 1614 +1616 4 542.296 507.1661 39.5654 0.2034 1615 +1617 4 541.2047 506.9098 39.6189 0.178 1616 +1618 4 540.1224 506.8835 39.7964 0.178 1617 +1619 4 539.0574 507.0059 40.0635 0.1652 1618 +1620 4 538.0003 507.3274 40.2478 0.1652 1619 +1621 4 537.0485 507.5345 40.5577 0.1398 1620 +1622 4 536.0166 507.6923 40.9984 0.1398 1621 +1623 4 534.8944 507.761 41.3837 0.1525 1622 +1624 4 533.7698 507.8193 41.6304 0.2034 1623 +1625 4 532.929 508.4142 41.9202 0.2415 1624 +1626 4 531.9623 508.7391 42.3231 0.2669 1625 +1627 4 530.8389 508.6876 42.6936 0.2415 1626 +1628 4 529.6983 508.6762 42.992 0.2161 1627 +1629 4 528.7065 509.0548 43.342 0.2034 1628 +1630 4 527.5831 509.1441 43.5117 0.2415 1629 +1631 4 526.4596 509.3202 43.5554 0.2669 1630 +1632 4 525.3591 509.5456 43.4795 0.2542 1631 +1633 4 524.2186 509.5284 43.3972 0.2161 1632 +1634 4 523.0951 509.4072 43.3882 0.2161 1633 +1635 4 521.9866 509.6085 43.4409 0.2796 1634 +1636 4 520.9524 510.0924 43.5226 0.3432 1635 +1637 4 519.8714 510.4574 43.5929 0.3813 1636 +1638 4 518.7468 510.6496 43.6246 0.3559 1637 +1639 4 517.6097 510.7262 43.6047 0.3432 1638 +1640 4 516.4691 510.7365 43.5621 0.3051 1639 +1641 4 515.364 510.8864 43.5632 0.2796 1640 +1642 4 514.4454 511.2513 43.7063 0.2288 1641 +1643 4 513.5565 511.9366 43.7296 0.2161 1642 +1644 4 512.5589 512.4823 43.6814 0.2288 1643 +1645 4 511.5991 513.0966 43.5988 0.2415 1644 +1646 4 510.6644 513.7098 43.4465 0.2542 1645 +1647 4 509.5891 513.8837 43.2172 0.2542 1646 +1648 4 508.4577 513.7521 43.0013 0.2669 1647 +1649 4 507.3514 513.704 42.8061 0.2542 1648 +1650 4 506.3767 514.0793 42.637 0.2669 1649 +1651 4 505.3826 514.5723 42.5986 0.2796 1650 +1652 4 504.4662 515.1077 42.7619 0.3305 1651 +1653 4 503.5957 515.6111 43.1715 0.3305 1652 +1654 4 502.5363 515.9246 43.6262 0.3559 1653 +1655 4 501.4129 515.9989 44.098 0.3305 1654 +1656 4 500.3547 515.6717 44.5785 0.3432 1655 +1657 4 499.3297 515.6672 45.1119 0.3305 1656 +1658 4 498.2509 515.9143 45.586 0.3686 1657 +1659 4 497.1527 516.2174 45.932 0.4195 1658 +1660 4 496.0292 516.4268 46.1614 0.4576 1659 +1661 4 494.9241 516.6887 46.247 0.4703 1660 +1662 4 493.8362 517.0068 46.2129 0.4322 1661 +1663 4 492.7002 517.0228 46.1574 0.394 1662 +1664 4 491.5619 516.9256 46.0981 0.3432 1663 +1665 4 490.4225 516.9141 46.0401 0.3051 1664 +1666 4 489.2945 516.9427 46.0967 0.2924 1665 +1667 4 488.2478 517.3362 46.128 0.2796 1666 +1668 4 487.336 517.9986 46.2678 0.3051 1667 +1669 4 486.2263 518.073 46.5136 0.2924 1668 +1670 4 485.2345 518.6427 46.7407 0.2796 1669 +1671 4 483.9566 518.0604 47.2928 0.3305 1670 +1672 4 482.9522 517.5399 47.5054 0.3432 1671 +1673 4 481.9809 516.9393 47.5955 0.3305 1672 +1674 4 480.9696 516.421 47.6588 0.3305 1673 +1675 4 479.8886 516.0824 47.6773 0.3178 1674 +1676 4 478.8452 515.6534 47.7036 0.2796 1675 +1677 4 477.8946 515.0345 47.7974 0.2669 1676 +1678 4 476.937 514.4522 47.973 0.2161 1677 +1679 4 475.9429 513.942 48.2272 0.2034 1678 +1680 4 475.0151 513.3094 48.4652 0.1652 1679 +1681 4 474.1251 512.5932 48.6354 0.178 1680 +1682 4 473.1813 511.9572 48.7782 0.178 1681 +1683 4 472.17 511.4412 48.9224 0.2034 1682 +1684 4 471.1141 511.034 49.0778 0.2034 1683 +1685 4 470.1314 510.4848 49.1938 0.2161 1684 +1686 4 469.2596 509.7607 49.2327 0.2034 1685 +1687 4 468.3136 509.1624 49.2831 0.2161 1686 +1688 4 467.2828 508.7025 49.3713 0.1907 1687 +1689 4 466.1834 508.5458 49.3892 0.178 1688 +1690 4 465.0806 508.389 49.4208 0.1525 1689 +1691 4 464.0613 507.9154 49.4449 0.1525 1690 +1692 4 463.2639 507.1569 49.3486 0.1525 1691 +1693 4 462.3327 506.5289 49.1868 0.1398 1692 +1694 4 461.2871 506.077 49.0028 0.1398 1693 +1695 4 460.1568 506.0061 48.837 0.1398 1694 +1696 4 459.1261 505.5656 48.6545 0.1652 1695 +1697 4 458.1995 504.9776 48.4067 0.1652 1696 +1698 4 457.1973 504.4399 48.2286 0.1652 1697 +1699 4 456.122 504.0544 48.1202 0.1398 1698 +1700 4 455.0901 503.5671 48.085 0.1271 1699 +1701 4 454.2092 502.8601 48.1426 0.1144 1700 +1702 4 453.2928 502.1851 48.2552 0.1144 1701 +1703 4 452.333 501.5651 48.3818 0.1271 1702 +1704 4 451.3469 500.9976 48.4411 0.1525 1703 +1705 4 450.355 500.4714 48.41 0.178 1704 +1706 4 449.338 499.9566 48.4123 0.2034 1705 +1707 4 448.3256 499.4498 48.4806 0.2161 1706 +1708 4 447.4344 498.7417 48.5862 0.2288 1707 +1709 4 446.5741 497.9924 48.7206 0.2034 1708 +1710 4 445.898 497.0714 48.8538 0.1907 1709 +1711 4 445.2402 496.1356 48.9782 0.178 1710 +1712 4 444.7094 495.1232 49.0818 0.2034 1711 +1713 4 444.0882 494.1634 49.1742 0.1907 1712 +1714 4 443.1764 493.5159 49.3326 0.1907 1713 +1715 4 442.1228 493.1441 49.5499 0.1652 1714 +1716 4 441.6115 492.8878 49.7162 0.1144 1715 +1717 4 440.5887 492.3765 49.8333 0.1144 1716 +1718 4 439.5648 491.8651 49.9038 0.1144 1717 +1719 4 438.5421 491.3537 49.9324 0.1144 1718 +1720 4 437.54 490.8046 49.9142 0.1144 1719 +1721 4 436.5653 490.2097 49.8588 0.1144 1720 +1722 4 435.53 489.7613 49.7904 0.1144 1721 +1723 4 434.4226 489.4867 49.7199 0.1144 1722 +1724 4 433.3506 489.1206 49.6913 0.1144 1723 +1725 4 432.3279 488.6287 49.74 0.1144 1724 +1726 4 431.3429 488.0624 49.8221 0.1144 1725 +1727 4 430.3854 487.4355 49.8968 0.1144 1726 +1728 4 429.4828 486.7388 49.9576 0.1144 1727 +1729 4 428.6316 485.9735 50.0004 0.1144 1728 +1730 4 427.8366 485.1544 50.0226 0.1144 1729 +1731 4 427.0918 484.2861 50.0273 0.1144 1730 +1732 4 426.4203 483.3629 50.0265 0.1144 1731 +1733 4 425.8185 482.3905 50.0254 0.1144 1732 +1734 4 425.2328 481.4078 50.0223 0.1144 1733 +1735 4 424.6608 480.4171 50.015 0.1144 1734 +1736 4 424.0533 479.4493 50.0021 0.1271 1735 +1737 4 423.3509 478.5718 50.0304 0.1525 1736 +1738 4 422.9391 477.572 50.0181 0.178 1737 +1739 4 422.5639 476.5057 49.9355 0.1907 1738 +1740 4 422.0696 475.4739 49.8243 0.1907 1739 +1741 4 421.5571 474.4511 49.6933 0.2034 1740 +1742 4 420.9485 473.5096 49.4816 0.2034 1741 +1743 4 420.2438 472.6402 49.1873 0.1907 1742 +1744 4 419.3835 471.9069 48.8947 0.1525 1743 +1745 4 418.4569 471.2388 48.6186 0.1271 1744 +1746 4 417.5417 470.5798 48.3098 0.1271 1745 +1747 4 416.6608 469.8717 47.9872 0.1525 1746 +1748 4 415.8417 469.0778 47.7089 0.2034 1747 +1749 4 414.97 468.3456 47.4583 0.2415 1748 +1750 4 413.9964 467.777 47.1915 0.2669 1749 +1751 4 413.111 467.2462 46.8188 0.2542 1750 +1752 4 412.2015 466.6182 46.4864 0.2415 1751 +1753 4 411.2154 466.1434 46.3529 0.2161 1752 +1754 4 410.3414 465.4192 46.2493 0.2288 1753 +1755 4 409.2088 465.2648 46.2 0.2542 1754 +1756 4 441.5451 492.8123 51.24 0.1144 1715 +1757 4 440.8393 491.92 51.3299 0.1144 1756 +1758 4 440.13 491.0654 51.3654 0.1144 1757 +1759 4 439.725 490.0027 51.4167 0.1144 1758 +1760 4 439.2159 488.9845 51.4884 0.1144 1759 +1761 4 438.7046 487.9938 51.585 0.1144 1760 +1762 4 437.9381 487.1484 51.711 0.1144 1761 +1763 4 437.2734 486.2332 51.9058 0.1144 1762 +1764 4 436.4966 485.4827 52.2301 0.1144 1763 +1765 4 435.737 484.6876 52.591 0.1144 1764 +1766 4 435.1387 483.7312 52.9659 0.1144 1765 +1767 4 434.6159 482.7646 53.3971 0.1144 1766 +1768 4 433.6835 482.3047 53.7818 0.1144 1767 +1769 4 432.9914 481.5542 54.1682 0.1144 1768 +1770 4 431.9721 481.1973 54.462 0.1144 1769 +1771 4 430.8533 480.9593 54.6616 0.1144 1770 +1772 4 429.7413 480.6916 54.7848 0.1144 1771 +1773 4 428.603 480.6024 54.8481 0.1144 1772 +1774 4 427.856 479.7936 54.88 0.1144 1773 +1775 4 484.3044 519.6105 47.0798 0.2161 1670 +1776 4 483.364 520.1757 47.4099 0.1907 1775 +1777 4 482.2303 520.2226 47.6694 0.178 1776 +1778 4 481.1103 520.0201 47.805 0.2161 1777 +1779 4 480.027 519.6689 47.8663 0.2415 1778 +1780 4 478.9859 519.1941 47.8993 0.2669 1779 +1781 4 477.93 518.7537 47.9125 0.2796 1780 +1782 4 476.8535 518.367 47.9363 0.2796 1781 +1783 4 475.7541 518.0718 47.9872 0.2796 1782 +1784 4 474.6159 517.9609 48.071 0.2288 1783 +1785 4 473.481 517.8613 48.1936 0.1907 1784 +1786 4 472.3565 517.8007 48.3916 0.1652 1785 +1787 4 471.2319 517.7996 48.6279 0.2034 1786 +1788 4 470.0971 517.9449 48.8261 0.2542 1787 +1789 4 468.9634 518.0844 48.9989 0.3051 1788 +1790 4 467.8342 518.192 49.1856 0.3178 1789 +1791 4 466.7074 518.2743 49.3861 0.2924 1790 +1792 4 465.5737 518.3201 49.525 0.2415 1791 +1793 4 464.4491 518.3121 49.5642 0.1907 1792 +1794 4 463.3131 518.2743 49.6138 0.178 1793 +1795 4 462.1874 518.2137 49.7395 0.178 1794 +1796 4 461.0583 518.2331 49.8974 0.1907 1795 +1797 4 459.9258 518.3979 50.0374 0.178 1796 +1798 4 458.792 518.5226 50.1836 0.1652 1797 +1799 4 457.6595 518.5317 50.3653 0.1525 1798 +1800 4 456.5315 518.4917 50.5618 0.1525 1799 +1801 4 455.3932 518.4722 50.7214 0.1398 1800 +1802 4 454.2492 518.4677 50.8175 0.1525 1801 +1803 4 453.1121 518.4116 50.8452 0.1652 1802 +1804 4 451.9875 518.2629 50.7858 0.1907 1803 +1805 4 450.8596 518.121 50.6792 0.1652 1804 +1806 4 449.7247 517.994 50.5778 0.1398 1805 +1807 4 448.5887 517.8659 50.5098 0.1271 1806 +1808 4 447.4516 517.7607 50.4988 0.1525 1807 +1809 4 446.3156 517.8099 50.5557 0.178 1808 +1810 4 445.2986 518.1759 50.7338 0.178 1809 +1811 4 444.3891 518.709 51.0521 0.1525 1810 +1812 4 443.3378 519.1014 51.38 0.1271 1811 +1813 4 442.2532 519.4538 51.6359 0.1144 1812 +1814 4 441.147 519.7352 51.7784 0.1144 1813 +1815 4 440.0293 519.956 51.8028 0.1271 1814 +1816 4 438.9128 520.1699 51.7194 0.1398 1815 +1817 4 437.7962 520.3781 51.5673 0.1525 1816 +1818 4 436.674 520.5886 51.4186 0.1398 1817 +1819 4 435.5494 520.7957 51.3097 0.1398 1818 +1820 4 434.4157 520.9135 51.2414 0.1398 1819 +1821 4 433.2717 520.9135 51.2075 0.1525 1820 +1822 4 432.1277 520.8884 51.1994 0.1398 1821 +1823 4 430.9951 520.7557 51.207 0.1398 1822 +1824 4 429.8763 520.5189 51.2218 0.1398 1823 +1825 4 428.7666 520.2432 51.2434 0.1525 1824 +1826 4 427.673 519.908 51.2747 0.1398 1825 +1827 4 426.5587 519.6906 51.3173 0.1271 1826 +1828 4 425.4181 519.7158 51.3699 0.1398 1827 +1829 4 424.2799 519.7421 51.4444 0.178 1828 +1830 4 423.1587 519.6231 51.585 0.2288 1829 +1831 4 422.0388 519.5407 51.786 0.2288 1830 +1832 4 420.9154 519.5407 51.9347 0.2161 1831 +1833 4 419.8183 519.6849 51.9893 0.2034 1832 +1834 4 418.7555 519.9835 52.1108 0.2161 1833 +1835 4 417.7202 520.3278 52.365 0.2161 1834 +1836 4 416.6551 520.6538 52.6834 0.178 1835 +1837 4 415.5386 520.8174 53.011 0.1652 1836 +1838 4 414.4014 520.7591 53.3123 0.1652 1837 +1839 4 413.2643 520.6447 53.5749 0.1907 1838 +1840 4 412.1214 520.6092 53.7986 0.1652 1839 +1841 4 410.9774 520.6092 54.0036 0.1652 1840 +1842 4 409.8655 520.7705 54.264 0.178 1841 +1843 4 408.7729 521.0417 54.6014 0.2415 1842 +1844 4 407.6999 521.3952 54.9906 0.2542 1843 +1845 4 406.6268 521.7075 55.4417 0.2415 1844 +1846 4 405.5503 521.9843 55.9434 0.1907 1845 +1847 4 404.4749 522.26 56.4707 0.1652 1846 +1848 4 403.3858 522.5037 56.9926 0.1525 1847 +1849 4 402.259 522.5769 57.4596 0.1398 1848 +1850 4 401.1173 522.5769 57.8659 0.1271 1849 +1851 4 399.9756 522.5769 58.228 0.1271 1850 +1852 4 398.8339 522.5769 58.5651 0.1398 1851 +1853 4 397.7242 522.7302 58.9366 0.1525 1852 +1854 4 396.6362 522.9739 59.3684 0.1525 1853 +1855 4 395.5506 523.2244 59.8522 0.1652 1854 +1856 4 394.4706 523.5001 60.3686 0.1907 1855 +1857 4 393.4182 523.8639 60.8916 0.2034 1856 +1858 4 392.376 524.2655 61.3992 0.1907 1857 +1859 4 391.3338 524.6659 61.8733 0.1652 1858 +1860 4 390.2642 525.0274 62.2782 0.1525 1859 +1861 4 389.1613 525.3156 62.573 0.1652 1860 +1862 4 388.0471 525.5776 62.7637 0.1652 1861 +1863 4 386.934 525.8396 62.876 0.178 1862 +1864 4 385.8197 526.1016 62.9331 0.178 1863 +1865 4 384.8565 525.6909 62.9633 0.1907 1864 +1866 4 383.8051 525.2665 62.9779 0.178 1865 +1867 4 382.8087 524.7139 62.9868 0.1525 1866 +1868 4 381.6967 524.5046 62.9933 0.1271 1867 +1869 4 380.6832 523.9989 62.9975 0.1144 1868 +1870 4 379.6295 523.5573 62.9997 0.1144 1869 +1871 4 378.6262 523.0093 63.0 0.1144 1870 +1872 4 377.8037 522.2223 63.0 0.1144 1871 +1873 4 377.5989 521.1103 63.0 0.1144 1872 +1874 4 376.4904 520.8632 63.0 0.1144 1873 +1875 4 546.5929 507.1444 38.6025 0.2288 1611 +1876 4 546.5357 506.0495 38.7671 0.2161 1875 +1877 4 546.2188 504.9582 38.8699 0.2161 1876 +1878 4 545.9717 503.8519 38.9178 0.1907 1877 +1879 4 545.9145 502.7148 38.9494 0.178 1878 +1880 4 546.0712 501.5914 38.9922 0.1525 1879 +1881 4 545.9122 500.5286 39.0547 0.1525 1880 +1882 4 545.5793 499.459 39.0785 0.178 1881 +1883 4 545.4192 498.3413 39.069 0.2161 1882 +1884 4 545.1743 497.2785 39.1636 0.2796 1883 +1885 4 545.1412 496.2695 39.433 0.3178 1884 +1886 4 545.275 495.1838 39.646 0.3432 1885 +1887 4 545.3276 494.0456 39.8124 0.3305 1886 +1888 4 545.4912 492.9164 39.9515 0.2924 1887 +1889 4 545.4626 491.777 40.0008 0.2415 1888 +1890 4 545.3562 490.641 39.9809 0.2034 1889 +1891 4 545.0943 489.5268 39.9434 0.2161 1890 +1892 4 544.8323 488.4136 39.9202 0.2415 1891 +1893 4 544.7694 488.9525 40.6241 0.2415 1892 +1894 4 544.536 489.7556 42.7512 0.2542 1893 +1895 4 543.9045 489.8894 43.741 0.2288 1894 +1896 4 543.098 490.3459 44.8126 0.2161 1895 +1897 4 542.0455 490.768 45.7159 0.2034 1896 +1898 4 540.9404 491.0231 46.424 0.1907 1897 +1899 4 539.8444 491.0563 47.0406 0.1652 1898 +1900 4 538.713 491.0094 47.4796 0.1525 1899 +1901 4 537.6731 490.6101 47.7898 0.1652 1900 +1902 4 536.933 489.7636 48.0231 0.178 1901 +1903 4 536.4113 488.8232 48.2269 0.2034 1902 +1904 4 535.837 487.892 48.3297 0.2161 1903 +1905 4 534.9241 487.3005 48.449 0.2161 1904 +1906 4 533.8282 487.1667 48.673 0.2034 1905 +1907 4 532.7791 486.9127 49.0358 0.178 1906 +1908 4 531.6877 486.6542 49.4539 0.178 1907 +1909 4 530.5655 486.6656 49.9248 0.178 1908 +1910 4 529.5427 486.2961 50.3642 0.1907 1909 +1911 4 528.8575 485.4964 50.913 0.178 1910 +1912 4 527.8565 485.1338 51.5236 0.178 1911 +1913 4 526.971 484.889 52.3292 0.1907 1912 +1914 4 525.8762 484.8878 53.1482 0.2161 1913 +1915 4 525.0205 485.5742 53.9554 0.2161 1914 +1916 4 524.4382 486.1428 54.9035 0.2161 1915 +1917 4 523.5196 486.6759 55.7673 0.2288 1916 +1918 4 522.5964 487.32 56.4558 0.2415 1917 +1919 4 521.5771 487.7147 56.9895 0.2161 1918 +1920 4 520.4868 487.7581 57.3566 0.1907 1919 +1921 4 519.5842 487.2605 57.7338 0.2161 1920 +1922 4 518.6988 486.8326 57.9751 0.2924 1921 +1923 4 517.827 487.241 58.2274 0.3559 1922 +1924 4 516.9198 487.8233 58.5864 0.3559 1923 +1925 4 515.8548 487.8531 58.7672 0.3178 1924 +1926 4 514.7634 487.821 59.0657 0.2669 1925 +1927 4 513.8082 487.328 59.4507 0.2288 1926 +1928 4 512.6722 487.3429 59.8175 0.2034 1927 +1929 4 511.5785 487.3337 60.1644 0.178 1928 +1930 4 510.6347 487.805 60.4629 0.1652 1929 +1931 4 509.5731 487.8485 60.6707 0.1525 1930 +1932 4 508.5114 488.1345 60.8684 0.1652 1931 +1933 4 507.4075 488.1848 60.9988 0.1907 1932 +1934 4 506.2761 488.0418 61.1148 0.2161 1933 +1935 4 505.1469 488.0018 61.2752 0.2415 1934 +1936 4 504.0224 487.9034 61.4908 0.2415 1935 +1937 4 502.9424 487.5854 61.7515 0.2415 1936 +1938 4 501.8854 487.4092 62.0992 0.2161 1937 +1939 4 500.7837 487.4698 62.5008 0.2034 1938 +1940 4 499.8422 487.1186 62.7514 0.1907 1939 +1941 4 498.7977 486.8406 62.8944 0.1907 1940 +1942 4 497.7738 486.7068 63.1834 0.2161 1941 +1943 4 496.8598 486.0936 63.4928 0.2415 1942 +1944 4 496.2947 485.1796 63.8826 0.2669 1943 +1945 4 495.5819 484.2975 64.2485 0.2542 1944 +1946 4 494.8315 483.4407 64.5882 0.2288 1945 +1947 4 494.1794 482.5152 64.8592 0.1907 1946 +1948 4 493.2196 482.0988 65.1146 0.178 1947 +1949 4 492.2815 482.5655 65.3918 0.1907 1948 +1950 4 491.4567 482.5426 65.5351 0.1144 1949 +1951 4 490.3436 482.4202 65.6001 0.1144 1950 +1952 4 489.2808 482.0175 65.6939 0.1144 1951 +1953 4 488.2306 481.5851 65.8095 0.1144 1952 +1954 4 487.1587 481.1858 65.9008 0.1271 1953 +1955 4 486.0764 480.8152 65.9781 0.1525 1954 +1956 4 484.9702 480.5246 66.0593 0.178 1955 +1957 4 483.864 480.2398 66.143 0.178 1956 +1958 4 482.792 479.8577 66.2497 0.1525 1957 +1959 4 481.7647 479.3738 66.3919 0.1271 1958 +1960 4 480.7454 478.8612 66.514 0.1144 1959 +1961 4 479.7387 478.3327 66.6058 0.1144 1960 +1962 4 478.7262 477.8099 66.745 0.1144 1961 +1963 4 477.7047 477.318 66.9477 0.1144 1962 +1964 4 476.6293 476.9897 67.1924 0.1144 1963 +1965 4 475.5871 476.6899 67.4419 0.1144 1964 +1966 4 474.9533 475.8079 67.7564 0.1144 1965 +1967 4 474.6124 474.7703 68.1514 0.1144 1966 +1968 4 474.045 473.8116 68.5524 0.1144 1967 +1969 4 473.3723 472.9102 68.9352 0.1144 1968 +1970 4 472.631 472.0647 69.2524 0.1144 1969 +1971 4 471.7112 471.3863 69.4756 0.1144 1970 +1972 4 471.0351 470.5272 69.6119 0.1144 1971 +1973 4 470.4242 469.58 69.6819 0.1144 1972 +1974 4 469.7092 468.6888 69.7119 0.1144 1973 +1975 4 468.9908 467.7999 69.7194 0.1144 1974 +1976 4 468.4268 466.8115 69.72 0.1144 1975 +1977 4 467.4773 466.2509 69.72 0.1144 1976 +1978 4 466.6056 465.5176 69.72 0.1398 1977 +1979 4 465.4936 465.2648 69.72 0.1907 1978 +1980 4 491.6489 482.8103 65.8801 0.1398 1949 +1981 4 490.8595 482.3241 65.333 0.1525 1980 +1982 4 490.8069 481.2087 65.1392 0.1907 1981 +1983 4 490.3745 480.1665 64.9544 0.2415 1982 +1984 4 489.727 479.2525 64.7651 0.2415 1983 +1985 4 489.02 478.3544 64.6755 0.2034 1984 +1986 4 488.2786 477.5079 64.7469 0.178 1985 +1987 4 487.5293 476.7906 65.0387 0.178 1986 +1988 4 486.5558 476.2014 65.3324 0.178 1987 +1989 4 485.5536 475.65 65.5827 0.1525 1988 +1990 4 484.5206 475.1593 65.7731 0.1271 1989 +1991 4 483.4807 474.6822 65.9504 0.1144 1990 +1992 4 544.679 487.4184 39.9297 0.1525 1892 +1993 4 544.5051 486.2892 39.9655 0.1398 1992 +1994 4 544.2774 485.1681 40.0092 0.1398 1993 +1995 4 544.0075 484.0573 40.0392 0.1398 1994 +1996 4 543.9159 482.9167 40.0389 0.1652 1995 +1997 4 543.9159 481.775 40.0089 0.1652 1996 +1998 4 543.9159 480.6322 39.9585 0.1652 1997 +1999 4 542.8291 481.5965 39.2384 0.1907 1998 +2000 4 542.0123 481.5096 38.817 0.178 1999 +2001 4 541.1612 480.7568 38.645 0.1652 2000 +2002 4 540.3272 479.9801 38.4796 0.178 2001 +2003 4 539.6385 479.0809 38.2824 0.1652 2002 +2004 4 538.9819 478.16 38.0369 0.1652 2003 +2005 4 538.1994 477.3409 37.774 0.1652 2004 +2006 4 537.3848 476.5401 37.529 0.178 2005 +2007 4 536.5715 475.7381 37.2949 0.1907 2006 +2008 4 535.7375 474.9613 37.0289 0.1652 2007 +2009 4 535.2879 474.0153 36.6621 0.1398 2008 +2010 4 535.217 473.012 36.1438 0.1271 2009 +2011 4 534.8795 471.9995 35.6174 0.1398 2010 +2012 4 534.1874 471.1049 35.1954 0.1525 2011 +2013 4 533.6909 470.0948 34.844 0.1525 2012 +2014 4 533.3042 469.0183 34.5587 0.1652 2013 +2015 4 532.9724 467.9395 34.2583 0.178 2014 +2016 4 532.6361 466.8675 33.9074 0.178 2015 +2017 4 532.1819 465.8437 33.488 0.1525 2016 +2018 4 531.7461 464.8118 33.0019 0.1271 2017 +2019 4 531.4761 463.7307 32.4657 0.1144 2018 +2020 4 531.3033 462.6279 31.8993 0.1144 2019 +2021 4 531.3239 461.5125 31.3309 0.1144 2020 +2022 4 531.404 460.3925 30.7737 0.1144 2021 +2023 4 531.3216 459.284 30.2179 0.1271 2022 +2024 4 530.8332 458.307 29.657 0.1525 2023 +2025 4 530.9155 457.2579 29.0802 0.1907 2024 +2026 4 531.3972 456.2306 28.6152 0.2288 2025 +2027 4 531.9074 455.2159 28.2111 0.2415 2026 +2028 4 531.4429 454.2732 27.785 0.2542 2027 +2029 4 530.3161 454.0788 27.467 0.2288 2028 +2030 4 529.1915 453.8671 27.2276 0.2161 2029 +2031 4 528.0818 453.5903 27.0374 0.178 2030 +2032 4 526.9733 453.3386 26.8599 0.1907 2031 +2033 4 526.1485 452.5778 26.6185 0.2034 2032 +2034 4 525.4701 451.6947 26.3113 0.2288 2033 +2035 4 524.5537 451.0106 26.02 0.2034 2034 +2036 4 523.6031 450.3917 25.7374 0.1907 2035 +2037 4 522.5964 450.0862 25.4466 0.1652 2036 +2038 4 522.681 449.0566 25.0296 0.1907 2037 +2039 4 522.5769 448.5018 24.4814 0.1907 2038 +2040 4 521.6194 448.7454 23.9956 0.2034 2039 +2041 4 520.8369 449.5394 23.5068 0.178 2040 +2042 4 519.8622 449.7053 23.0097 0.178 2041 +2043 4 518.8006 449.3254 22.5536 0.178 2042 +2044 4 517.7538 448.909 22.1317 0.178 2043 +2045 4 516.7883 448.3553 21.7209 0.1525 2044 +2046 4 515.9818 447.5957 21.3039 0.1398 2045 +2047 4 515.2439 446.7354 20.9499 0.1525 2046 +2048 4 514.5254 445.8465 20.6891 0.1907 2047 +2049 4 513.6812 445.0846 20.5045 0.2034 2048 +2050 4 512.9993 444.1855 20.3766 0.2034 2049 +2051 4 512.8335 443.0872 20.2799 0.2034 2050 +2052 4 513.2281 442.0439 20.1846 0.2415 2051 +2053 4 513.8368 441.0761 20.0684 0.2796 2052 +2054 4 514.5678 440.2009 19.9252 0.2796 2053 +2055 4 515.3709 439.3875 19.7489 0.2415 2054 +2056 4 516.1556 438.9402 19.3576 0.1907 2055 +2057 4 516.2071 438.1657 18.7802 0.1652 2056 +2058 4 515.6031 437.2425 18.3919 0.1525 2057 +2059 4 515.9875 436.2312 18.1933 0.1525 2058 +2060 4 543.996 480.1528 39.9204 0.2796 1998 +2061 4 544.1848 479.0248 39.9 0.3051 2060 +2062 4 544.3713 477.8957 39.8997 0.3051 2061 +2063 4 544.2111 476.7643 39.9218 0.3051 2062 +2064 4 544.0464 475.6317 39.9675 0.2924 2063 +2065 4 543.8565 474.5037 40.035 0.2924 2064 +2066 4 543.6448 473.3792 40.1223 0.2924 2065 +2067 4 543.4389 472.2546 40.2427 0.3051 2066 +2068 4 543.2799 471.1472 40.4662 0.2796 2067 +2069 4 543.1792 470.0273 40.7515 0.2542 2068 +2070 4 543.305 468.8913 41.0242 0.2161 2069 +2071 4 543.4309 467.7564 41.2768 0.2161 2070 +2072 4 543.5258 466.6376 41.5582 0.2161 2071 +2073 4 543.6116 465.5268 41.8603 0.2288 2072 +2074 4 544.6218 464.7992 41.3468 0.2034 2073 +2075 4 545.3219 463.9114 40.9335 0.2161 2074 +2076 4 546.2783 463.288 40.7792 0.2161 2075 +2077 4 547.4223 463.2445 40.616 0.2288 2076 +2078 4 548.5652 463.2353 40.423 0.2415 2077 +2079 4 549.6714 463.0523 40.1372 0.2415 2078 +2080 4 550.6392 462.5169 39.7872 0.2288 2079 +2081 4 551.1884 461.5148 39.459 0.2034 2080 +2082 4 551.6986 460.5138 39.0754 0.1907 2081 +2083 4 552.2935 459.7439 38.5563 0.2034 2082 +2084 4 553.3654 459.9692 38.0579 0.1907 2083 +2085 4 554.3069 460.5 37.7087 0.178 2084 +2086 4 554.9258 461.3134 37.2548 0.1525 2085 +2087 4 555.3903 461.9712 36.7094 0.178 2086 +2088 4 556.3043 461.5685 36.1827 0.2161 2087 +2089 4 556.9701 460.6808 35.7064 0.2415 2088 +2090 4 557.8441 460.1099 35.2685 0.2288 2089 +2091 4 558.8989 459.7496 34.858 0.2161 2090 +2092 4 559.9159 459.308 34.6223 0.2288 2091 +2093 4 560.9387 459.3114 34.5657 0.2542 2092 +2094 4 561.8607 459.7919 34.4154 0.2415 2093 +2095 4 562.7164 460.1523 34.0192 0.2161 2094 +2096 4 563.5893 460.7323 33.5689 0.1907 2095 +2097 4 564.6532 460.7712 33.1646 0.2034 2096 +2098 4 565.565 460.134 32.788 0.2161 2097 +2099 4 566.4848 459.4567 32.4402 0.2288 2098 +2100 4 567.5716 459.2199 32.0874 0.2161 2099 +2101 4 568.6298 459.4899 31.675 0.2161 2100 +2102 4 569.7314 459.5814 31.1942 0.2161 2101 +2103 4 570.157 460.3101 30.5046 0.2415 2102 +2104 4 570.4716 461.4095 29.9158 0.2542 2103 +2105 4 570.6009 462.5444 29.4157 0.2669 2104 +2106 4 570.9315 463.5774 29.0993 0.2669 2105 +2107 4 571.0448 464.4915 28.6415 0.2542 2106 +2108 4 571.6579 464.1654 27.932 0.2415 2107 +2109 4 572.5457 463.4905 27.2821 0.2161 2108 +2110 4 573.6291 463.3177 26.6268 0.1907 2109 +2111 4 574.6232 463.5717 25.8588 0.1652 2110 +2112 4 575.4961 464.0281 25.0109 0.1525 2111 +2113 4 576.3323 464.7672 24.2673 0.1525 2112 +2114 4 577.1514 465.5588 23.6494 0.1525 2113 +2115 4 578.0598 466.0702 23.038 0.1525 2114 +2116 4 578.8468 465.5199 22.4687 0.1525 2115 +2117 4 578.5197 464.782 21.9413 0.1398 2116 +2118 4 577.6262 464.6619 21.2945 0.1398 2117 +2119 4 577.7429 464.9937 20.4695 0.1525 2118 +2120 4 578.7393 464.7797 19.8071 0.1907 2119 +2121 4 579.8158 464.6264 19.4548 0.2034 2120 +2122 4 580.8923 464.8816 19.3115 0.2034 2121 +2123 4 581.9963 465.0829 19.3039 0.2034 2122 +2124 4 582.8325 465.8322 19.2672 0.2415 2123 +2125 4 583.6802 466.4031 18.8101 0.1525 2124 +2126 4 584.4696 467.0288 17.7782 0.178 2125 +2127 4 585.1457 467.9154 17.3778 0.178 2126 +2128 4 585.5095 468.992 17.0361 0.1525 2127 +2129 4 586.0163 469.9941 16.6928 0.1525 2128 +2130 4 586.9532 470.5615 15.9191 0.1652 2129 +2131 4 582.9515 465.3563 19.0995 0.1271 2124 +2132 4 583.0911 464.3313 18.7623 0.1398 2131 +2133 4 583.551 463.5248 18.3808 0.1525 2132 +2134 4 584.5462 463.5534 17.9294 0.1398 2133 +2135 4 585.5976 463.8314 17.5842 0.1271 2134 +2136 4 586.5608 463.4504 17.4769 0.1144 2135 +2137 4 587.4943 463.5831 17.6355 0.1144 2136 +2138 4 588.1807 462.9699 17.9929 0.1144 2137 +2139 4 588.4221 461.8671 18.2925 0.1144 2138 +2140 4 589.2309 461.0984 18.4455 0.1144 2139 +2141 4 590.1587 460.492 18.1933 0.1144 2140 +2142 4 543.3417 464.6207 42.0445 0.1144 2073 +2143 4 543.1415 463.5053 42.1478 0.1271 2142 +2144 4 543.1655 462.3648 42.2162 0.1525 2143 +2145 4 543.2547 461.2242 42.2688 0.1907 2144 +2146 4 543.265 460.0825 42.3186 0.2034 2145 +2147 4 543.2009 458.9396 42.385 0.2034 2146 +2148 4 543.1357 457.8025 42.5009 0.1907 2147 +2149 4 543.0705 456.6711 42.681 0.1907 2148 +2150 4 542.9836 455.5408 42.8943 0.1907 2149 +2151 4 542.8486 454.4071 43.0956 0.178 2150 +2152 4 542.6839 453.2745 43.2648 0.178 2151 +2153 4 542.5832 452.1408 43.4283 0.1652 2152 +2154 4 542.5603 451.006 43.6083 0.178 2153 +2155 4 542.7388 449.902 43.764 0.178 2154 +2156 4 543.1609 448.8576 43.9228 0.2034 2155 +2157 4 543.2959 447.7662 44.0877 0.2034 2156 +2158 4 543.1174 446.6382 44.214 0.1907 2157 +2159 4 543.082 445.5079 44.296 0.1652 2158 +2160 4 543.2273 444.3754 44.3346 0.1525 2159 +2161 4 543.3703 443.2417 44.3674 0.1652 2160 +2162 4 543.4343 442.1182 44.4559 0.1652 2161 +2163 4 543.4526 440.9868 44.5802 0.178 2162 +2164 4 543.4583 439.8463 44.6751 0.1652 2163 +2165 4 543.4583 438.7034 44.7224 0.1907 2164 +2166 4 543.4583 437.5606 44.7348 0.1907 2165 +2167 4 543.4583 436.4188 44.7213 0.2288 2166 +2168 4 543.4583 435.2748 44.7042 0.2415 2167 +2169 4 543.4583 434.132 44.7216 0.2796 2168 +2170 4 543.4583 432.9891 44.7871 0.2669 2169 +2171 4 543.4286 431.8497 44.9033 0.2415 2170 +2172 4 543.3725 430.7137 45.0663 0.1907 2171 +2173 4 543.2982 429.5777 45.2519 0.1652 2172 +2174 4 543.1929 428.4394 45.4205 0.1398 2173 +2175 4 543.0728 427.3012 45.5557 0.1271 2174 +2176 4 543.011 426.1663 45.694 0.1144 2175 +2177 4 543.0007 425.036 45.864 0.1144 2176 +2178 4 542.9893 423.8978 46.0242 0.1271 2177 +2179 4 542.844 422.7904 46.0886 0.1652 2178 +2180 4 542.7594 421.6658 46.0984 0.2161 2179 +2181 4 542.9779 420.555 46.1255 0.2415 2180 +2182 4 543.5133 419.8423 46.366 0.2161 2181 +2183 4 543.7615 418.8035 46.5836 0.1652 2182 +2184 4 543.9388 417.6744 46.7365 0.1525 2183 +2185 4 544.1173 416.5453 46.8404 0.1907 2184 +2186 4 544.2946 415.4161 46.8955 0.2542 2185 +2187 4 544.4948 414.2904 46.9092 0.2669 2186 +2188 4 544.8437 413.2036 46.9168 0.2288 2187 +2189 4 545.219 412.1237 46.9622 0.1652 2188 +2190 4 545.5953 411.0438 47.0492 0.1398 2189 +2191 4 545.9706 409.9627 47.1727 0.1398 2190 +2192 4 546.2406 408.8622 47.3654 0.1525 2191 +2193 4 546.4625 407.7571 47.623 0.1398 2192 +2194 4 546.6787 406.652 47.92 0.1398 2193 +2195 4 546.8949 405.5469 48.2334 0.1525 2194 +2196 4 547.0185 404.4154 48.5111 0.178 2195 +2197 4 547.0505 403.2726 48.7144 0.178 2196 +2198 4 547.0688 402.1286 48.8452 0.1525 2197 +2199 4 547.0871 400.9857 48.9199 0.1271 2198 +2200 4 547.1066 399.8417 48.9563 0.1271 2199 +2201 4 547.1329 398.6977 48.9714 0.1525 2200 +2202 4 547.3605 397.58 48.9807 0.178 2201 +2203 4 547.6225 396.4658 48.9927 0.1907 2202 +2204 4 547.8845 395.3527 49.0092 0.1907 2203 +2205 4 548.1465 394.2384 49.0316 0.2161 2204 +2206 4 548.3638 393.1162 49.0641 0.2542 2205 +2207 4 548.4988 391.9802 49.1123 0.2924 2206 +2208 4 548.6201 390.843 49.177 0.3051 2207 +2209 4 548.7425 389.7059 49.2584 0.2924 2208 +2210 4 548.8637 388.5688 49.3562 0.2669 2209 +2211 4 549.0113 387.4362 49.4813 0.2161 2210 +2212 4 549.2069 386.3151 49.6507 0.1652 2211 +2213 4 549.4106 385.1974 49.8534 0.1271 2212 +2214 4 549.6142 384.0797 50.0755 0.1144 2213 +2215 4 549.7629 382.9517 50.2956 0.1271 2214 +2216 4 549.803 381.8123 50.4896 0.1525 2215 +2217 4 549.827 380.6706 50.6484 0.178 2216 +2218 4 549.851 379.5289 50.7693 0.178 2217 +2219 4 549.8728 378.386 50.8452 0.1652 2218 +2220 4 549.875 377.25 50.8306 0.178 2219 +2221 4 549.875 376.114 50.7483 0.2161 2220 +2222 4 549.875 374.9792 50.6293 0.2669 2221 +2223 4 549.875 373.8432 50.4997 0.2669 2222 +2224 4 550.0272 372.7129 50.4333 0.2415 2223 +2225 4 550.3052 371.6135 50.475 0.178 2224 +2226 4 550.5969 370.5176 50.6108 0.1398 2225 +2227 4 550.8898 369.4216 50.8119 0.1144 2226 +2228 4 551.1723 368.3177 51.0322 0.1271 2227 +2229 4 551.4366 367.2057 51.2252 0.1525 2228 +2230 4 551.6986 366.0914 51.3845 0.178 2229 +2231 4 551.9606 364.9783 51.5197 0.1907 2230 +2232 4 552.2225 363.8641 51.6454 0.1907 2231 +2233 4 552.3129 362.7338 51.8199 0.1907 2232 +2234 4 552.3198 361.6058 52.0579 0.1907 2233 +2235 4 552.3198 360.4778 52.344 0.178 2234 +2236 4 552.3198 359.3498 52.6568 0.1652 2235 +2237 4 552.218 358.2196 52.9586 0.1398 2236 +2238 4 551.8931 357.1271 53.1989 0.1271 2237 +2239 4 551.5464 356.0368 53.3758 0.1144 2238 +2240 4 551.1986 354.9466 53.5027 0.1398 2239 +2241 4 550.8509 353.8575 53.5945 0.1652 2240 +2242 4 550.9344 352.7249 53.6606 0.1907 2241 +2243 4 551.0957 351.5924 53.718 0.1652 2242 +2244 4 551.2604 350.461 53.7807 0.1398 2243 +2245 4 551.4252 349.3284 53.8549 0.1144 2244 +2246 4 551.5899 348.197 53.9445 0.1271 2245 +2247 4 551.4114 347.0804 54.0994 0.1398 2246 +2248 4 551.1941 345.9673 54.3096 0.1525 2247 +2249 4 550.9767 344.8554 54.5574 0.1398 2248 +2250 4 550.7582 343.7423 54.826 0.1271 2249 +2251 4 550.5843 342.6154 55.0785 0.1271 2250 +2252 4 550.4276 341.484 55.2997 0.1398 2251 +2253 4 550.272 340.3537 55.4842 0.1652 2252 +2254 4 550.1164 339.2223 55.638 0.178 2253 +2255 4 549.9963 338.0863 55.7617 0.1907 2254 +2256 4 550.0283 336.9435 55.844 0.1907 2255 +2257 4 550.0752 335.8006 55.8958 0.2034 2256 +2258 4 550.121 334.6578 55.9258 0.2161 2257 +2259 4 550.1679 333.5138 55.9404 0.2288 2258 +2260 4 550.137 332.3709 55.9454 0.2161 2259 +2261 4 550.081 331.228 55.9465 0.2161 2260 +2262 4 550.0238 330.0852 55.9474 0.2161 2261 +2263 4 549.9666 328.9435 55.9488 0.2288 2262 +2264 4 549.9094 327.8006 55.9507 0.2415 2263 +2265 4 549.795 326.6623 55.9532 0.2415 2264 +2266 4 549.6131 325.5332 55.9572 0.2415 2265 +2267 4 549.4254 324.4052 55.9622 0.2034 2266 +2268 4 549.2367 323.2761 55.9695 0.1907 2267 +2269 4 549.0491 322.1481 55.9796 0.1907 2268 +2270 4 548.8603 321.019 55.9938 0.2542 2269 +2271 4 548.6727 319.891 56.014 0.2924 2270 +2272 4 548.4839 318.763 56.042 0.3178 2271 +2273 4 548.2963 317.6339 56.0804 0.2924 2272 +2274 4 548.1087 316.5059 56.131 0.2796 2273 +2275 4 547.9291 315.3768 56.212 0.2542 2274 +2276 4 547.7564 314.2476 56.3276 0.2415 2275 +2277 4 547.5825 313.1197 56.4721 0.2542 2276 +2278 4 547.4086 311.9905 56.6401 0.2924 2277 +2279 4 547.2358 310.8614 56.826 0.3051 2278 +2280 4 547.0768 309.7369 57.0441 0.2796 2279 +2281 4 546.9189 308.6123 57.2816 0.2161 2280 +2282 4 546.7622 307.4889 57.5249 0.178 2281 +2283 4 546.6043 306.3643 57.7643 0.1398 2282 +2284 4 546.4316 305.2352 57.9667 0.1271 2283 +2285 4 546.2451 304.1072 58.109 0.1144 2284 +2286 4 546.0564 302.9792 58.1977 0.1144 2285 +2287 4 545.8688 301.8501 58.2462 0.1144 2286 +2288 4 545.6811 300.7221 58.2672 0.1144 2287 +2289 4 545.5324 299.5873 58.2725 0.1144 2288 +2290 4 545.4112 298.4502 58.2719 0.1144 2289 +2291 4 545.2922 297.3119 58.2708 0.1144 2290 +2292 4 545.1721 296.1747 58.2691 0.1144 2291 +2293 4 545.0519 295.0365 58.2669 0.1271 2292 +2294 4 544.8197 293.9176 58.2638 0.1398 2293 +2295 4 544.4868 292.8228 58.259 0.1525 2294 +2296 4 544.1459 291.7314 58.2526 0.1398 2295 +2297 4 543.805 290.6389 58.2442 0.1271 2296 +2298 4 543.4675 289.5464 58.2338 0.1144 2297 +2299 4 543.1918 288.4367 58.2126 0.1144 2298 +2300 4 542.9218 287.3248 58.1846 0.1144 2299 +2301 4 542.6518 286.2139 58.1538 0.1144 2300 +2302 4 542.4734 285.0837 58.1353 0.1144 2301 +2303 4 542.3487 283.9477 58.1347 0.1144 2302 +2304 4 542.2263 282.8105 58.1487 0.1144 2303 +2305 4 542.1038 281.6722 58.1742 0.1144 2304 +2306 4 541.9826 280.5351 58.2058 0.1144 2305 +2307 4 541.9357 279.3923 58.2344 0.1144 2306 +2308 4 541.9322 278.2483 58.2551 0.1144 2307 +2309 4 541.9322 277.1043 58.2683 0.1271 2308 +2310 4 541.9322 275.9603 58.2761 0.1398 2309 +2311 4 541.8842 274.8174 58.2806 0.1652 2310 +2312 4 541.8098 273.6757 58.2837 0.178 2311 +2313 4 541.732 272.5351 58.287 0.1907 2312 +2314 4 541.6554 271.3934 58.2921 0.178 2313 +2315 4 541.5788 270.2517 58.2988 0.1525 2314 +2316 4 541.4678 269.1134 58.308 0.1398 2315 +2317 4 541.3065 267.9809 58.3215 0.1525 2316 +2318 4 541.1417 266.8483 58.3402 0.178 2317 +2319 4 540.977 265.7169 58.3657 0.178 2318 +2320 4 540.8123 264.5843 58.3996 0.1525 2319 +2321 4 540.7162 263.4449 58.4514 0.1271 2320 +2322 4 540.7105 262.3032 58.5298 0.1271 2321 +2323 4 540.7105 261.1603 58.6289 0.1398 2322 +2324 4 540.7105 260.0175 58.7423 0.178 2323 +2325 4 540.7105 258.8758 58.8647 0.1907 2324 +2326 4 540.683 257.7329 58.9904 0.2034 2325 +2327 4 540.4222 256.6209 59.1002 0.1652 2326 +2328 4 540.1442 255.5113 59.1984 0.1398 2327 +2329 4 539.8673 254.4016 59.2931 0.1144 2328 +2330 4 539.7975 253.2644 59.4233 0.1271 2329 +2331 4 539.7941 252.1273 59.5913 0.1525 2330 +2332 4 539.7941 250.9902 59.787 0.178 2331 +2333 4 539.7941 249.853 59.999 0.178 2332 +2334 4 539.7941 248.7159 60.2134 0.1525 2333 +2335 4 539.6534 247.5822 60.3907 0.1271 2334 +2336 4 539.4452 246.4576 60.5161 0.1144 2335 +2337 4 539.2324 245.3331 60.6001 0.1271 2336 +2338 4 539.0208 244.2097 60.6561 0.1525 2337 +2339 4 538.808 243.0851 60.7009 0.178 2338 +2340 4 538.4614 241.996 60.7463 0.1907 2339 +2341 4 538.0804 240.9172 60.7981 0.1907 2340 +2342 4 538.0049 239.7778 60.8555 0.1907 2341 +2343 4 538.26 238.6693 60.9484 0.178 2342 +2344 4 539.0814 238.2288 61.2455 0.1525 2343 +2345 4 538.8309 237.1226 61.3928 0.1271 2344 +2346 4 538.5803 236.0164 61.4146 0.1144 2345 +2347 4 538.3309 234.9112 61.3351 0.1144 2346 +2348 4 538.0804 233.805 61.1783 0.1144 2347 +2349 4 537.8299 232.6965 60.9748 0.1144 2348 +2350 4 537.5885 231.5776 60.7919 0.1144 2349 +2351 4 537.346 230.4599 60.6687 0.1144 2350 +2352 4 537.1046 229.3423 60.5889 0.1271 2351 +2353 4 536.9959 228.2028 60.5357 0.1525 2352 +2354 4 536.9272 227.0611 60.4937 0.178 2353 +2355 4 536.8598 225.9194 60.4486 0.1907 2354 +2356 4 536.7923 224.7777 60.3901 0.178 2355 +2357 4 536.7065 223.6371 60.3061 0.178 2356 +2358 4 536.5577 222.5137 60.1642 0.178 2357 +2359 4 536.4079 221.3903 59.9844 0.2161 2358 +2360 4 536.258 220.2669 59.7867 0.2415 2359 +2361 4 536.0978 219.1389 59.6019 0.2669 2360 +2362 4 535.8851 218.0224 59.5151 0.2669 2361 +2363 4 535.6711 216.9047 59.5045 0.2669 2362 +2364 4 535.4584 215.7881 59.5426 0.2542 2363 +2365 4 535.2433 214.6705 59.6005 0.2288 2364 +2366 4 534.9527 213.5779 59.5529 0.1907 2365 +2367 4 534.6495 212.4946 59.3984 0.1652 2366 +2368 4 534.3475 211.4112 59.1595 0.1398 2367 +2369 4 534.0455 210.3278 58.8728 0.1271 2368 +2370 4 534.0318 209.1861 58.6312 0.1144 2369 +2371 4 534.0787 208.0433 58.4564 0.1144 2370 +2372 4 534.1279 206.8993 58.3506 0.1144 2371 +2373 4 534.1759 205.7564 58.2968 0.1144 2372 +2374 4 534.0878 204.6158 58.277 0.1144 2373 +2375 4 533.9242 203.4844 58.2739 0.1144 2374 +2376 4 533.7595 202.3519 58.2733 0.1398 2375 +2377 4 533.5948 201.2204 58.2728 0.1652 2376 +2378 4 533.43 200.0879 58.2719 0.1907 2377 +2379 4 533.4644 198.945 58.2705 0.1652 2378 +2380 4 533.5833 197.8068 58.2688 0.1398 2379 +2381 4 533.7035 196.6696 58.2663 0.1144 2380 +2382 4 533.8224 195.5313 58.263 0.1398 2381 +2383 4 533.9426 194.3942 58.2582 0.1907 2382 +2384 4 534.1496 193.2685 58.2515 0.2542 2383 +2385 4 534.4116 192.1554 58.242 0.2924 2384 +2386 4 534.6736 191.0411 58.2288 0.2796 2385 +2387 4 534.9355 189.928 58.2103 0.2669 2386 +2388 4 535.1975 188.8138 58.1851 0.2415 2387 +2389 4 535.0568 187.6789 58.1493 0.2669 2388 +2390 4 534.8921 186.5475 58.098 0.2542 2389 +2391 4 534.7273 185.4149 58.0269 0.2415 2390 +2392 4 534.5626 184.2835 57.9314 0.178 2391 +2393 4 534.3979 183.151 57.8091 0.1398 2392 +2394 4 534.7113 181.8949 57.5848 0.1144 2393 +2395 4 534.9859 180.7989 57.293 0.1144 2394 +2396 4 535.2593 179.703 56.9545 0.1144 2395 +2397 4 535.5339 178.6081 56.588 0.1271 2396 +2398 4 535.8084 177.5088 56.2192 0.1398 2397 +2399 4 536.0853 176.4048 55.8779 0.1525 2398 +2400 4 536.3621 175.2963 55.5772 0.1525 2399 +2401 4 536.639 174.1889 55.3008 0.1525 2400 +2402 4 536.9147 173.0815 55.0351 0.1525 2401 +2403 4 537.1709 171.9729 54.754 0.1398 2402 +2404 4 537.4066 170.8633 54.4373 0.1271 2403 +2405 4 537.6434 169.7536 54.0848 0.1144 2404 +2406 4 537.8791 168.6439 53.6992 0.1271 2405 +2407 4 538.1639 167.5525 53.2745 0.1398 2406 +2408 4 538.5151 166.4898 52.8024 0.178 2407 +2409 4 538.8835 165.435 52.295 0.1907 2408 +2410 4 539.253 164.3802 51.7678 0.2034 2409 +2411 4 539.4646 163.2968 51.2341 0.1652 2410 +2412 4 539.4887 162.1814 50.7063 0.1525 2411 +2413 4 539.4887 161.0649 50.197 0.1525 2412 +2414 4 539.5756 159.9461 49.7316 0.178 2413 +2415 4 539.8399 158.841 49.3455 0.178 2414 +2416 4 540.1876 157.7507 49.0364 0.1652 2415 +2417 4 540.5354 156.6616 48.7774 0.1652 2416 +2418 4 540.8901 155.5748 48.5405 0.178 2417 +2419 4 541.3053 154.5269 48.265 0.178 2418 +2420 4 541.7709 153.5145 47.9147 0.1652 2419 +2421 4 542.2366 152.5009 47.5048 0.1652 2420 +2422 4 542.7376 151.4976 47.0686 0.178 2421 +2423 4 543.3222 150.5264 46.6544 0.178 2422 +2424 4 543.9548 149.5769 46.2862 0.1525 2423 +2425 4 544.5875 148.6273 45.9609 0.1271 2424 +2426 4 545.3196 147.7648 45.6593 0.1144 2425 +2427 4 546.2154 147.0784 45.3547 0.1144 2426 +2428 4 547.1729 146.4766 45.0358 0.1144 2427 +2429 4 548.1304 145.8749 44.7028 0.1144 2428 +2430 4 549.0136 145.1702 44.3752 0.1144 2429 +2431 4 549.8098 144.3545 44.07 0.1144 2430 +2432 4 550.59 143.5217 43.7884 0.1144 2431 +2433 4 551.3691 142.6888 43.5271 0.1144 2432 +2434 4 552.1356 141.8514 43.2645 0.1144 2433 +2435 4 552.8929 141.0117 42.9884 0.1144 2434 +2436 4 553.6491 140.1709 42.7062 0.1144 2435 +2437 4 554.3412 139.2751 42.4393 0.1144 2436 +2438 4 554.8606 138.2661 42.2257 0.1398 2437 +2439 4 555.285 137.2034 42.0767 0.1652 2438 +2440 4 555.7106 136.1417 41.9801 0.1907 2439 +2441 4 556.119 135.0732 41.9208 0.1652 2440 +2442 4 556.2906 133.9601 41.8816 0.1398 2441 +2443 4 556.2906 132.8161 41.8471 0.1144 2442 +2444 4 556.3444 131.6744 41.8023 0.1144 2443 +2445 4 556.4668 130.5361 41.7388 0.1144 2444 +2446 4 556.8088 129.4608 41.652 0.1144 2445 +2447 4 557.4781 128.5478 41.5405 0.1144 2446 +2448 4 558.1965 127.6693 41.37 0.1144 2447 +2449 4 558.8257 126.7483 41.1051 0.1144 2448 +2450 4 559.3405 125.7988 40.7369 0.1144 2449 +2451 4 559.8828 124.8218 40.3819 0.1271 2450 +2452 4 560.4639 123.8369 40.1008 0.1398 2451 +2453 4 561.0451 122.8519 39.8916 0.1652 2452 +2454 4 561.5484 121.8268 39.7513 0.1652 2453 +2455 4 561.7223 120.7137 39.6743 0.178 2454 +2456 4 561.7601 119.5709 39.641 0.1652 2455 +2457 4 561.7967 118.4269 39.6248 0.1652 2456 +2458 4 561.8344 117.284 39.6136 0.1398 2457 +2459 4 561.8722 116.1412 39.6046 0.1398 2458 +2460 4 562.1238 115.0349 39.5948 0.1398 2459 +2461 4 562.5265 113.9644 39.5819 0.178 2460 +2462 4 562.951 112.9022 39.5643 0.2034 2461 +2463 4 563.3765 111.8401 39.5394 0.2542 2462 +2464 4 563.8513 110.8001 39.5044 0.2669 2463 +2465 4 564.3993 109.7963 39.4545 0.2796 2464 +2466 4 564.969 108.8047 39.3862 0.2415 2465 +2467 4 565.5398 107.8127 39.2958 0.2161 2466 +2468 4 566.042 106.7886 39.163 0.1907 2467 +2469 4 566.3944 105.7185 38.9556 0.1907 2468 +2470 4 566.6976 104.6354 38.6823 0.178 2469 +2471 4 566.9996 103.5521 38.3698 0.1652 2470 +2472 4 567.3348 102.4715 38.0576 0.1525 2471 +2473 4 567.7432 101.4067 37.7986 0.1525 2472 +2474 4 568.1768 100.3481 37.6071 0.1398 2473 +2475 4 568.6103 99.2897 37.4763 0.1398 2474 +2476 4 569.0496 98.2337 37.3929 0.1652 2475 +2477 4 569.5404 97.2011 37.3472 0.2034 2476 +2478 4 570.0518 96.1781 37.3254 0.2161 2477 +2479 4 570.5643 95.1548 37.3153 0.178 2478 +2480 4 571.0756 94.132 37.3128 0.1525 2479 +2481 4 571.6843 93.1658 37.3159 0.1398 2480 +2482 4 572.3398 92.2279 37.3232 0.178 2481 +2483 4 572.9976 91.2919 37.3335 0.2034 2482 +2484 4 573.6554 90.356 37.3484 0.2288 2483 +2485 4 574.3029 89.413 37.3708 0.2161 2484 +2486 4 574.852 88.4121 37.4021 0.1907 2485 +2487 4 575.3645 87.389 37.4399 0.1652 2486 +2488 4 576.0532 86.4858 37.4833 0.1398 2487 +2489 4 576.5508 85.4777 37.581 0.1398 2488 +2490 4 576.8242 84.3827 37.7454 0.1398 2489 +2491 4 577.2475 83.3284 37.8952 0.1525 2490 +2492 4 578.133 82.8969 37.851 0.1398 2491 +2493 4 579.2392 82.7911 37.9047 0.1271 2492 +2494 4 579.6282 81.9364 38.6604 0.1144 2493 +2495 4 534.3818 182.2655 58.5164 0.1144 2393 +2496 4 534.3624 181.1295 58.7882 0.1525 2495 +2497 4 534.3418 179.9924 58.9095 0.1398 2496 +2498 4 534.3212 178.8552 59.0402 0.1525 2497 +2499 4 534.3029 177.717 59.1517 0.178 2498 +2500 4 534.296 176.5753 59.1895 0.2161 2499 +2501 4 534.296 175.4393 59.1287 0.2161 2500 +2502 4 534.296 174.3044 58.9915 0.1907 2501 +2503 4 534.296 173.1684 58.8073 0.1652 2502 +2504 4 534.2457 172.0347 58.6152 0.1525 2503 +2505 4 534.0707 170.9044 58.4662 0.1525 2504 +2506 4 533.8819 169.7753 58.3674 0.1525 2505 +2507 4 533.6943 168.6473 58.3111 0.1398 2506 +2508 4 533.5067 167.5182 58.2848 0.1398 2507 +2509 4 533.3179 166.3902 58.2767 0.1525 2508 +2510 4 533.1303 165.2622 58.2764 0.1907 2509 +2511 4 532.9416 164.1331 58.277 0.2161 2510 +2512 4 532.7539 163.0051 58.2778 0.2161 2511 +2513 4 532.5686 161.876 58.2789 0.1907 2512 +2514 4 532.4084 160.7434 58.2806 0.1525 2513 +2515 4 532.2883 159.6063 58.2828 0.1271 2514 +2516 4 532.1682 158.468 58.2862 0.1271 2515 +2517 4 532.0481 157.3309 58.2904 0.1398 2516 +2518 4 531.9268 156.1926 58.2966 0.1525 2517 +2519 4 531.785 155.0578 58.3052 0.1398 2518 +2520 4 531.5962 153.9298 58.3173 0.1271 2519 +2521 4 531.4086 152.8018 58.3344 0.1271 2520 +2522 4 531.2198 151.6727 58.3579 0.1398 2521 +2523 4 531.0276 150.5458 58.3901 0.1525 2522 +2524 4 530.8057 149.4236 58.4366 0.1398 2523 +2525 4 530.5392 148.3116 58.5043 0.1271 2524 +2526 4 530.2715 147.1996 58.5942 0.1144 2525 +2527 4 530.0049 146.0865 58.7062 0.1144 2526 +2528 4 529.7864 144.9688 58.8493 0.1144 2527 +2529 4 529.7132 143.8363 59.0464 0.1144 2528 +2530 4 529.7132 142.7048 59.2948 0.1144 2529 +2531 4 529.7132 141.5734 59.5745 0.1144 2530 +2532 4 529.7132 140.442 59.8671 0.1144 2531 +2533 4 529.7246 139.3083 60.1446 0.1144 2532 +2534 4 529.7692 138.1655 60.3638 0.1144 2533 +2535 4 529.8253 137.0237 60.5158 0.1144 2534 +2536 4 529.8825 135.8809 60.6169 0.1144 2535 +2537 4 529.9397 134.738 60.6855 0.1144 2536 +2538 4 530.0095 133.5963 60.739 0.1144 2537 +2539 4 530.1353 132.4603 60.797 0.1144 2538 +2540 4 530.1685 131.3392 60.8748 0.1144 2539 +2541 4 529.791 130.265 60.9787 0.1144 2540 +2542 4 529.3791 129.2079 61.117 0.1144 2541 +2543 4 529.3036 128.0983 61.3248 0.1144 2542 +2544 4 529.839 127.2757 61.6728 0.1144 2543 +2545 4 530.4053 126.436 62.0838 0.1144 2544 +2546 4 530.5895 125.3149 62.4392 0.1144 2545 +2547 4 530.6295 124.1732 62.7164 0.1144 2546 +2548 4 530.6295 123.0292 62.9194 0.1144 2547 +2549 4 530.6295 121.8852 63.061 0.1144 2548 +2550 4 530.6295 120.7412 63.1616 0.1144 2549 +2551 4 530.6295 119.5972 63.2556 0.1144 2550 +2552 4 530.6295 118.4566 63.392 0.1144 2551 +2553 4 530.6295 117.3195 63.5897 0.1144 2552 +2554 4 530.6295 116.1824 63.8378 0.1144 2553 +2555 4 530.6295 115.0452 64.1253 0.1271 2554 +2556 4 530.6295 113.9076 64.4434 0.1525 2555 +2557 4 530.8492 112.8153 64.792 0.178 2556 +2558 4 531.2999 111.7832 65.1636 0.178 2557 +2559 4 531.8834 110.8239 65.5427 0.1525 2558 +2560 4 532.5617 109.9588 65.9526 0.1271 2559 +2561 4 533.3339 109.1839 66.3816 0.1271 2560 +2562 4 534.2732 108.5891 66.6966 0.1525 2561 +2563 4 535.2536 108.1193 66.8105 0.2034 2562 +2564 4 536.1802 107.5147 66.8478 0.2288 2563 +2565 4 537.0165 106.7631 66.9662 0.2415 2564 +2566 4 537.8207 105.9886 67.191 0.2161 2565 +2567 4 538.6009 105.1889 67.5105 0.2161 2566 +2568 4 539.2896 104.3106 67.9098 0.2161 2567 +2569 4 539.944 103.4018 68.3553 0.2542 2568 +2570 4 540.5972 102.4929 68.7977 0.2796 2569 +2571 4 541.1143 101.4904 69.1704 0.2924 2570 +2572 4 541.4941 100.414 69.4431 0.2415 2571 +2573 4 541.8419 99.3245 69.6273 0.2034 2572 +2574 4 542.1896 98.2349 69.7432 0.2034 2573 +2575 4 542.5203 97.1401 69.8074 0.2542 2574 +2576 4 542.8005 96.0314 69.8312 0.2669 2575 +2577 4 543.0625 94.9178 69.8284 0.2288 2576 +2578 4 543.3256 93.8043 69.8076 0.1652 2577 +2579 4 543.5876 92.6909 69.7679 0.1271 2578 +2580 4 543.9571 91.6106 69.7046 0.1144 2579 +2581 4 544.3003 90.5203 69.6133 0.1144 2580 +2582 4 544.6367 89.4269 69.4915 0.1271 2581 +2583 4 545.2819 88.5072 69.34 0.1398 2582 +2584 4 545.7967 87.553 69.0645 0.1652 2583 +2585 4 546.2131 86.5581 68.6664 0.1652 2584 +2586 4 546.6307 85.5639 68.2016 0.178 2585 +2587 4 547.3525 84.7047 67.8031 0.1652 2586 +2588 4 548.1796 83.9195 67.5116 0.1652 2587 +2589 4 548.8523 83.0498 67.2487 0.1398 2588 +2590 4 549.5101 82.1395 67.1989 0.1271 2589 +2591 4 550.2354 81.5507 67.4775 0.1144 2590 +2592 4 551.2421 81.0208 68.2245 0.1144 2591 diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/biophys_components/synaptic_models/AMPA_ExcToExc.json b/bmtk-vb/docs/tutorial/sources/chapter03/biophys_components/synaptic_models/AMPA_ExcToExc.json new file mode 100644 index 0000000..c758540 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/biophys_components/synaptic_models/AMPA_ExcToExc.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 1.0, + "tau2": 3.0, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/build_cortex.py b/bmtk-vb/docs/tutorial/sources/chapter03/build_cortex.py new file mode 100644 index 0000000..b779ac7 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/build_cortex.py @@ -0,0 +1,35 @@ +from bmtk.builder.networks import NetworkBuilder +from bmtk.builder.aux.node_params import positions_columinar, xiter_random +from bmtk.builder.aux.edge_connectors import distance_connector + +import math +import numpy as np +import random + + +cortex = NetworkBuilder('mcortex') +cortex.add_nodes(N=100, + pop_name='Scnn1a', + positions=positions_columinar(N=100, center=[0, 50.0, 0], max_radius=30.0, height=100.0), + rotation_angle_yaxis=xiter_random(N=100, min_x=0.0, max_x=2*np.pi), + rotation_angle_zaxis=3.646878266, + potental='exc', + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic', + dynamics_params='472363762_fit.json', + morphology='Scnn1a_473845048_m.swc') + +cortex.add_edges(source={'pop_name': 'Scnn1a'}, target={'pop_name': 'Scnn1a'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 50.0, 'nsyn_min': 0, 'nsyn_max': 10}, + syn_weight=2.0e-04, + distance_range=[30.0, 150.0], + target_sections=['basal', 'apical', 'soma'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +cortex.build() +cortex.save_nodes(output_dir='network') +cortex.save_edges(output_dir='network') diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/build_thalamus.py b/bmtk-vb/docs/tutorial/sources/chapter03/build_thalamus.py new file mode 100644 index 0000000..731e1bc --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/build_thalamus.py @@ -0,0 +1,36 @@ +import numpy as np + +from bmtk.builder.networks import NetworkBuilder +from bmtk.builder.aux.edge_connectors import connect_random + +#print np.random.geometric(p=0.5) +#print np.sqrt(1-0.005)/0.005 + +""" +def connect_random(source, target, nsyn_min=0, nsyn_max=10, distribution=None): + return np.random.randint(nsyn_min, nsyn_max) +""" + + +thalamus = NetworkBuilder('mthalamus') +thalamus.add_nodes(N=100, + pop_name='tON', + potential='exc', + level_of_detail='filter') + +cortex = NetworkBuilder('mcortex') +cortex.import_nodes(nodes_file_name='network/mcortex_nodes.h5', node_types_file_name='network/mcortex_node_types.csv') +thalamus.add_edges(source=thalamus.nodes(), target=cortex.nodes(), + connection_rule=connect_random, + connection_params={'nsyn_min': 0, 'nsyn_max': 12}, + syn_weight=1.0e-04, + distance_range=[0.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +thalamus.build() +thalamus.save_nodes(output_dir='network') +thalamus.save_edges(output_dir='network') + diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/circuit_config.json b/bmtk-vb/docs/tutorial/sources/chapter03/circuit_config.json new file mode 100644 index 0000000..fad5bf8 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/circuit_config.json @@ -0,0 +1,36 @@ +{ + "manifest": { + "$BASE_DIR": ".", + "$COMPONENTS_DIR": "$BASE_DIR/biophys_components", + "$NETWORK_DIR": "$BASE_DIR/network" + }, + "components": { + "point_neuron_models_dir": "$COMPONENTS_DIR/point_neuron_templates", + "biophysical_neuron_models_dir": "$COMPONENTS_DIR/biophysical_neuron_templates", + "mechanisms_dir": "$COMPONENTS_DIR/mechanisms", + "morphologies_dir": "$COMPONENTS_DIR/morphologies", + "synaptic_models_dir": "$COMPONENTS_DIR/synaptic_models" + }, + "networks": { + "nodes": [ + { + "node_types_file": "$NETWORK_DIR/mcortex_node_types.csv", + "nodes_file": "$NETWORK_DIR/mcortex_nodes.h5" + }, + { + "node_types_file": "$NETWORK_DIR/mthalamus_node_types.csv", + "nodes_file": "$NETWORK_DIR/mthalamus_nodes.h5" + } + ], + "edges": [ + { + "edges_file": "$NETWORK_DIR/mcortex_mcortex_edges.h5", + "edge_types_file": "$NETWORK_DIR/mcortex_mcortex_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/mthalamus_mcortex_edges.h5", + "edge_types_file": "$NETWORK_DIR/mthalamus_mcortex_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/create_spikes.py b/bmtk-vb/docs/tutorial/sources/chapter03/create_spikes.py new file mode 100644 index 0000000..26b4eef --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/create_spikes.py @@ -0,0 +1,5 @@ +from bmtk.utils.spike_trains import SpikesGenerator + +sg = SpikesGenerator(nodes='network/mthalamus_nodes.h5', t_max=3.0) +sg.set_rate(10.0) +sg.save_csv('thalamus_spikes.csv', in_ms=True) \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/run_bionet.py b/bmtk-vb/docs/tutorial/sources/chapter03/run_bionet.py new file mode 100644 index 0000000..ca8abeb --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/run_bionet.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +"""Simulates an example network of 14 cell receiving two kinds of exernal input as defined in configuration file""" + +import os, sys +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + graph = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=graph) + sim.run() + bionet.nrn.quit_execution() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/simulation_config.json b/bmtk-vb/docs/tutorial/sources/chapter03/simulation_config.json new file mode 100644 index 0000000..c1ec2aa --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/simulation_config.json @@ -0,0 +1,46 @@ +{ + "manifest": { + "$OUTPUT_DIR": "$BASE_DIR/output", + "$BASE_DIR": "." + }, + "target_simulator": "NEURON", + "run": { + "nsteps_block": 5000, + "tstop": 3000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15.0 + }, + "conditions": { + "celsius": 34.0, + "v_init": -80.0 + }, + "inputs": { + "tc_spikes": { + "input_type": "spikes", + "module": "csv", + "input_file": "${BASE_DIR}/thalamus_spikes.csv", + "node_set": "mthalamus" + } + + }, + "output": { + "spikes_file_csv": "spikes.csv", + "spikes_file": "spikes.h5", + "log_file": "log.txt", + "output_dir": "${OUTPUT_DIR}", + "overwrite_output_dir": true + }, + "reports": { + "membrane_report": { + "cells": "all", + "sections": "soma", + "module": "membrane_report", + "variable_name": [ + "v", + "cai" + ] + } + }, + "network": "./circuit_config.json" +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter03/thalamus_spikes.csv b/bmtk-vb/docs/tutorial/sources/chapter03/thalamus_spikes.csv new file mode 100644 index 0000000..dee0d6d --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter03/thalamus_spikes.csv @@ -0,0 +1,101 @@ +gid spike-times +0 12.5870160621,14.0233168231,117.545036947,185.946096313,312.557060127,330.742522172,503.22364352,620.884287475,673.213573647,755.496269337,888.370908478,1102.47029228,1204.9048199,1207.31715263,1439.41787561,1458.11940463,1507.34484862,1563.60244989,1790.43244456,1841.59806531,1849.12080351,1851.91570692,1868.47717791,1908.58354501,1967.60788802,2081.37580272,2279.55684621,2328.65417037,2389.45198774,2567.10808945,2690.39192616,2745.4234886,2891.22668804 +1 5.87722712246,176.963891713,305.418411081,480.225450128,560.161647168,566.691475096,701.785870594,763.182533663,777.433130051,898.826045999,923.564206489,979.91893288,1097.86502441,1279.26684629,1421.01723474,1547.4088954,1605.74581334,1627.70469707,1785.61272041,1923.06213896,2050.41114109,2074.30284258,2096.27536739,2160.29635317,2281.42080993,2450.10599402,2569.19929713,2619.01413814,2626.04776933,2745.36563066,2883.13679535,2884.87098873 +2 185.709550576,211.917168099,306.885542793,451.28077101,537.316929658,658.489818194,822.86970043,1033.35039736,1166.4660437,1218.16627437,1292.87301495,1446.12928755,1521.71022346,1683.79141248,1738.44067957,1790.6965082,1812.18105819,1892.31948303,1941.78562058,1981.22806395,2016.81139669,2133.83785641,2346.32947241,2348.11561758,2385.18024097,2489.88630918,2526.42570832,2634.81096806,2681.86769264,2770.81950377,2776.06168612,2978.72904335 +3 162.205143026,343.123317079,382.325066421,475.989448824,690.965046107,790.498583616,872.761025411,986.611270092,1096.35148208,1141.01254572,1208.33836694,1324.01158321,1453.95509346,1503.43254553,1612.95600536,1662.95659455,1806.40149663,1967.55238441,2097.25877732,2241.58546739,2322.34434689,2408.94513747,2513.77122177,2579.51440781,2647.58853252,2837.87779643,2944.62459835 +4 78.8008231283,122.359024188,199.275937744,292.270003362,428.726651215,568.003721752,647.969565,748.663617455,824.822523022,1017.95735173,1186.44117007,1458.68389474,1497.82440736,1625.92021991,1799.82191321,1855.93653796,1938.68865977,1945.722597,2021.29306976,2164.55489917,2265.39366866,2512.69482305,2790.35762402,2825.19930279,2878.4894317,2953.8826484 +5 42.1573428011,98.331273265,279.875094007,530.396150508,570.255234004,725.887799002,793.912918978,922.243723881,1041.46621811,1210.23560363,1215.65206177,1316.68425168,1386.52436413,1624.02379947,1767.40774418,1818.08782301,1916.25844403,1934.96254082,2029.7856551,2200.62384475,2315.57199994,2380.70551109,2453.31982329,2598.04037221,2599.00164593,2739.20073304,2824.04685802,2886.5346692,2982.21800419 +6 229.262454259,361.273274653,407.566858128,539.645223666,549.519584399,620.887001319,661.967423329,734.404743752,814.067385182,911.390116742,1052.76544168,1089.65720226,1232.05698052,1301.79454283,1349.8336555,1438.49756462,1558.60804308,1678.08525408,1747.97823039,1889.6946279,2042.60938081,2112.70186951,2245.9724068,2525.21310043,2693.05020758,2842.47879016 +7 53.0890298207,220.714973581,285.283460179,439.820582615,473.93929168,502.27035447,533.70330238,652.841804892,826.447138005,954.437187361,1069.06161988,1134.86229086,1326.31358414,1356.69283871,1464.46149701,1631.22844376,1696.38430811,1782.46619906,1879.18964447,2120.64715737,2307.26773104,2445.06089591,2584.01567547,2699.20523392,2808.44340529,2963.07068315 +8 78.7620104217,182.748871869,250.378169165,330.439451031,345.16044433,462.975582722,649.091605593,756.581868953,989.213814948,1079.03295594,1138.44059928,1205.03904959,1246.5409979,1357.53337106,1420.35299935,1501.11441853,1543.65061713,1691.6847547,1888.58447905,1964.77191968,2025.7995924,2032.54706501,2152.16973275,2405.63186993,2544.09883103,2660.32350379,2775.4116986,2904.77858133,2967.52323225 +9 72.9909716276,189.157438013,394.974065476,618.488920137,860.894026408,1003.49928483,1168.58579127,1264.72065379,1352.24992028,1356.46706832,1436.53933566,1479.95949111,1576.01986211,1720.61863099,1971.62782159,2163.76857902,2234.99665983,2313.05786891,2519.51163563,2732.63898411,2924.90564456 +10 2.57648094943,86.695770584,311.178071725,361.637124701,404.59198886,500.084068099,661.89660217,703.867395737,746.436225647,851.261097525,933.485014819,988.559200139,1142.45722946,1306.53073273,1386.0521854,1518.19743959,1607.38630019,1674.56563495,1754.1152049,1991.1665074,2118.24095209,2187.04119855,2287.09486679,2323.34175573,2373.39179296,2385.03350473,2493.16197926,2569.14645927,2703.40793102,2828.0173186,2896.32253263,2962.27636674 +11 132.267905824,314.143770848,320.95977524,398.58162767,412.997992805,491.851745392,529.104806004,632.017340004,678.189232688,809.365665162,892.948873888,985.016014734,1063.15073292,1182.90931938,1228.90835562,1461.55873923,1533.01633884,1639.20368041,1645.87237778,1797.67480071,1969.92635227,2111.14297548,2227.3698685,2377.90489871,2511.58130399,2777.12515106,2878.77063603 +12 61.7295588145,224.729671664,283.380224879,321.614140768,454.09748477,617.97112082,789.759165177,822.083115029,890.594810336,914.463247513,1067.84365702,1169.36342019,1305.1254637,1424.51730043,1459.36679372,1559.14977815,1561.8272048,1606.35062789,1682.67166074,1762.53141849,1911.64578243,1978.44447446,2072.72279495,2164.77742382,2290.9907872,2350.51597366,2402.01257022,2561.55816363,2626.4448338,2695.84842451,2744.82357044,2910.50829775 +13 84.7472531775,93.104008445,153.3744779,260.118524789,309.052542225,365.313959765,561.139466206,691.294342277,746.475712674,903.53476503,1014.29751831,1083.90518528,1258.94194976,1348.97864877,1402.64756699,1502.0256694,1639.39729802,1775.20703993,1860.13111537,1889.5690935,1983.08954455,2192.5249509,2284.74017941,2333.33393535,2506.05846765,2634.0086347,2784.12916571,2805.81685938,2860.36745829,2877.11394223 +14 173.560010915,239.416108067,269.191028096,271.697464053,445.5550855,483.024329582,524.978655284,694.336643268,772.2287332,1039.65335073,1095.37873491,1212.0119161,1387.11860542,1395.26805073,1492.68821236,1538.56928661,1607.97085902,1663.46208146,1707.00828481,1925.88163927,1944.08609446,2056.51215033,2168.69369238,2215.62016619,2488.05752968,2527.53778732,2638.53083402,2874.27990443 +15 75.2107143531,110.246230372,316.100354032,376.887034734,579.205033463,652.230392696,691.357302512,878.422868406,924.116213342,1061.77385979,1079.38024406,1172.05667821,1210.92849541,1345.14164884,1486.89938774,1605.49420142,1813.53510922,2019.84534259,2191.17226555,2246.69440613,2323.61517628,2435.57018418,2476.50349163,2566.45252475,2680.60800392,2759.54276267,2772.71210685,2826.93747313,2901.18076833 +16 50.8542025252,64.6136483093,182.498020088,253.25168421,360.935083808,442.265900784,567.677012616,660.912839613,749.006801713,801.494274302,933.932588802,1018.07752876,1153.75589846,1153.89413654,1184.3321532,1224.65558871,1348.66892731,1451.68691853,1569.02612927,1763.61289465,1863.99222356,2046.36237325,2221.22489071,2273.83594373,2356.62454271,2402.55620894,2567.39969651,2791.86878103,2865.21876187,2894.76636455 +17 118.321282152,122.57568987,140.547362708,244.470015602,466.429611229,658.190818911,826.410460579,836.589250131,1032.42496629,1156.69624067,1218.49641596,1251.94377008,1282.3237954,1465.20327819,1640.90354123,1674.29933008,1778.24816744,1842.71170215,1984.00038418,1992.5631725,1993.08383784,2112.17242732,2290.86634226,2417.6565063,2427.68033916,2655.61634227,2812.01965001,2942.36655312 +18 91.9677139192,175.242409055,184.525168622,281.698179726,483.952939855,532.724868666,679.10703051,727.522843664,935.186895526,1004.61003945,1114.3025748,1246.05215257,1422.90545824,1538.69105278,1680.65203676,1880.6750121,2038.02857972,2166.43878401,2359.52371824,2409.16818256,2521.02398814,2642.10348525,2769.19801055,2958.8868559 +19 130.015134224,156.367314268,183.34111944,269.273486499,383.965567034,513.096785034,631.209653439,804.871970833,867.37369912,887.237391186,1006.69588757,1147.03209127,1286.957972,1398.35648399,1621.42589769,1726.64529021,1786.31784867,1871.79359075,1892.22637135,1973.83216148,2021.41502741,2127.17883905,2237.018757,2269.23129336,2574.20373049,2596.61328102,2672.31938452,2784.48551225,2791.23759456,2812.23804848,2931.24850585 +20 121.281787516,238.474751003,278.418927805,314.493938284,549.950901285,687.841625745,825.852278888,957.055124715,1024.77700991,1129.05313412,1237.39737323,1500.75580153,1555.25803137,1590.81133255,1670.30680657,1746.96721341,1833.49299016,1968.27027005,2093.48174843,2149.9942211,2258.59822942,2298.59502085,2359.58786176,2513.25604622,2596.33058809,2824.54196667 +21 136.848954135,237.210816963,461.389906024,508.550471844,547.582095439,711.577559125,871.469954989,1011.64427889,1096.39389274,1216.80136074,1354.68508766,1477.01279327,1548.73962948,1696.37201653,1722.78171634,1863.99761973,1975.63416111,2009.49552307,2113.46946145,2188.9095377,2193.68727004,2299.51730809,2426.84035225,2497.55967296,2532.29276592,2603.30799918,2679.71819225,2733.27972433,2837.63580012,2876.67671028,2984.32187293 +22 174.67027426,342.614805661,510.201068379,614.96673659,774.378628801,878.370321538,1065.74545324,1266.16991502,1420.27911037,1470.07801222,1562.19499673,1725.26684741,1843.63147913,2019.04164511,2041.30864384,2044.51401741,2170.6796325,2172.42982755,2285.12854542,2300.20756873,2335.32842512,2586.40466523,2700.44000097,2776.23369809,2915.02662014,2983.05116207 +23 81.5669887139,146.431167524,203.47667064,382.396566887,473.464956687,519.908187228,663.995964137,806.558792565,907.103905626,923.099753481,996.850156556,1183.46868367,1223.13455384,1223.42017422,1335.73042282,1383.93101055,1415.80172953,1519.91855535,1618.52205249,1660.965227,1696.38070853,1925.150652,1926.62960138,1979.60846603,2083.55066324,2197.61365863,2215.60794174,2269.9057754,2372.06011536,2474.78600261,2501.09329657,2720.88266686,2841.16850033,2856.44849924,2899.22480473,2944.95951995 +24 195.77687123,314.675592147,353.851431287,391.881523512,525.677422419,616.879935018,660.928544318,726.821777194,839.689943148,859.755771981,975.857202654,995.961774539,1068.51414935,1228.94048038,1241.43830907,1427.03820876,1573.48694152,1772.06987107,1778.54699939,1969.26531867,2051.65174608,2061.6460037,2286.34271684,2350.4859962,2469.31618566,2589.35143463,2655.53762167,2760.43576285,2871.48201843 +25 160.834209546,345.986640849,484.408616192,616.047980877,690.783166429,835.841541971,955.167638649,1066.54115421,1238.50408791,1365.22637062,1459.55044659,1498.43068439,1631.00959832,1781.66511158,1894.98889272,1948.06403644,2172.06857759,2288.99053543,2355.30697684,2393.43122534,2526.62186059,2527.80981578,2608.47687195,2658.84793637,2752.61337198,2902.35203317,2930.4115343 +26 115.940817665,157.663070687,180.401091807,211.320170857,276.409613102,282.740839352,321.268131715,488.073807139,556.493346319,746.765227655,961.763471859,1014.08732336,1141.07603631,1212.9886882,1351.01672776,1479.37251042,1489.06979565,1565.99119753,1607.90775908,1646.53166818,1749.53946555,1950.48852408,2015.25177299,2028.56352895,2137.79374801,2352.65841351,2363.27104315,2469.26042764,2476.20086036,2496.79711519,2534.05846289,2534.84757228,2651.26774271,2770.25777891,2873.75509549,2970.92337545 +27 125.000215494,131.173334365,316.928833405,444.345549079,688.262210073,713.198777661,779.751996804,877.966936065,963.618979954,1018.12084562,1122.34805299,1151.66364898,1246.78841111,1356.6264649,1515.20174279,1579.0394365,1645.38273136,1710.65481319,1732.20874624,1802.94405274,1905.25939291,2054.34335683,2153.08569634,2243.92501506,2349.44173685,2422.94079958,2564.8306702,2670.75653884,2857.14699655 +28 106.665699819,146.41989082,246.321934014,312.058791677,411.192931047,464.611426085,512.157168795,610.793230596,794.667436621,796.506015873,858.526932241,926.479818496,974.376966566,1056.61255737,1180.29813759,1202.66777668,1283.80883972,1307.04668513,1422.01036058,1533.44944718,1551.09315875,1610.08887854,1732.12564344,1817.91669151,1923.09284901,1966.12680339,2111.45632811,2135.80499653,2164.42298531,2402.7965781,2488.3778762,2600.48597829,2725.53115252,2806.77449522 +29 124.9959184,136.112707214,201.977863937,295.999241243,394.805951419,459.803657029,494.067983219,606.17804651,630.312380504,701.992736851,758.710658505,947.592568979,1119.23778771,1172.61643423,1199.02061419,1360.69790569,1505.95878474,1555.03158222,1575.39074458,1689.83444569,1782.13446581,1957.28297242,2022.77565431,2128.53330994,2157.63725127,2268.36747363,2377.60050915,2402.30123929,2559.05595229,2723.78025845,2806.86364594,2945.15236185 +30 36.8598200159,61.0052834633,89.8613310361,186.972770553,308.834264189,390.660291357,470.510212257,520.983258773,569.333838231,649.016685389,768.615120316,863.95347746,999.364812294,1131.61421363,1239.7024116,1351.30173614,1619.12223633,1739.64440275,1805.62217465,1906.16357922,1980.07759594,2033.30947697,2171.15718427,2343.6906323,2561.33497079,2572.93195983,2741.85355662,2775.33868629,2933.57758098 +31 66.7889461488,80.0164884768,229.389455526,292.654612213,439.816733496,612.687915378,698.698872412,846.93852963,1013.51375706,1034.38097738,1122.6915431,1223.59743605,1290.92452538,1460.54833024,1638.80606383,1730.66470353,1816.8757369,1943.84570056,2113.17049933,2163.24614464,2276.80055234,2317.59767814,2484.69609032,2495.20522903,2520.67333203,2569.7520044,2716.1798533,2908.07416033 +32 144.578598547,339.070849008,368.139145224,490.194504273,587.59754977,653.200626998,709.828281188,816.880682343,961.462775373,1027.84031709,1231.03159879,1352.54647005,1429.43455991,1438.6540693,1540.48428019,1663.97131804,1806.19681588,1948.2895948,2085.99957665,2261.80829092,2314.60402576,2423.61676606,2550.90557288,2725.54227258,2856.61646286,2995.25458458 +33 103.768729072,167.959440235,279.341419222,370.201376701,508.577944348,688.463625267,754.934818616,903.849726557,966.027739981,1027.48543278,1093.56326198,1136.68471969,1149.42208855,1335.48460585,1360.52914063,1484.28928231,1538.11117759,1618.75407801,1657.98695537,1771.5111512,1815.24226237,1879.71582975,1972.19508391,1989.5759316,2072.12100645,2137.29016913,2206.64121043,2279.37044803,2451.78106843,2589.60928781,2776.55633539,2890.86907517,2968.63860516 +34 129.302880732,262.912144929,358.85162163,446.386913672,578.093759287,677.845432367,743.487729092,906.800973567,1089.95971398,1142.68769564,1275.99992277,1361.10220203,1361.96456864,1442.57181688,1692.87149227,1881.88718842,1996.49512809,2088.25808342,2259.26410762,2353.39738704,2464.7509594,2657.59272091,2763.9451969,2894.17634771,2923.77802455 +35 70.6056249,132.613555287,323.169784962,498.037257341,579.37829463,716.827818358,819.478069454,853.668213147,936.113191976,1020.33663806,1229.4525484,1406.15895171,1475.36829759,1476.34975549,1613.96788085,1751.51135792,1944.88229797,2001.67135641,2131.78270035,2243.70453091,2265.78908185,2427.25923351,2462.54433046,2730.72766383,2830.18570351,2840.93606517,2943.73513584 +36 166.161754964,305.34312196,324.534723788,409.255522476,508.120291193,516.667709535,527.045452252,628.062164133,668.156349309,762.477022235,878.207963492,907.759941979,1030.07472481,1041.07398709,1243.28176062,1280.56029819,1360.07141955,1382.72447131,1476.05841958,1633.29725469,1655.37336185,1806.45692068,1895.04567802,1906.56926977,1944.07999527,2061.25283632,2146.91736542,2278.4998854,2360.87440569,2553.35859708,2738.00086643,2845.75299228,2912.24610333,2916.284927 +37 142.274755772,282.372741076,423.120140307,632.053342732,633.247258036,832.390807815,893.314233392,1023.1369851,1097.87450247,1113.06263666,1128.13380432,1228.18364915,1421.55681406,1460.3718534,1534.8279067,1694.42972965,1864.70371561,1897.25211894,1940.99418881,2024.8553273,2029.45500773,2110.78907272,2328.18015821,2351.34726254,2380.71856178,2501.07065115,2652.98457676,2802.56658523,2946.71351945 +38 148.97745592,186.934510842,192.059077735,250.773644148,272.765924446,335.611873612,571.055936839,628.551548324,658.828720079,815.877669805,1063.10806692,1101.37427811,1115.56613902,1194.18637095,1352.2259543,1370.77258623,1488.68584628,1501.10353424,1566.22471884,1570.01852415,1615.56736896,1793.58210388,1914.7997406,1979.51122353,2060.87443938,2188.23235498,2297.45908889,2405.25191588,2475.94742812,2505.82518557,2672.03241404,2752.88800927,2858.29450836 +39 170.212077768,317.080526903,351.065982504,546.451583601,665.552186363,756.269142897,919.770675209,997.576698624,1000.53009394,1103.27645835,1204.07307763,1297.28359392,1347.8020273,1515.6472598,1605.46568588,1776.42495182,1849.66050174,1967.80090252,2090.28139081,2168.65888335,2188.62144169,2355.66506795,2423.70552031,2547.16045648,2669.00583356,2736.81990907,2776.0379616,2917.09074691 +40 115.809221814,285.877033776,484.605778572,714.046613074,771.052960436,819.124883956,1025.20523644,1097.70776706,1195.48269914,1309.80271942,1413.60571367,1456.7447519,1593.06772539,1801.36996212,1977.63312452,2043.84887685,2165.20114786,2178.57745945,2253.42335277,2359.92413581,2371.47828675,2402.9462666,2502.62903245,2615.11631395,2703.49796947,2710.81751317,2925.73645537 +41 134.626966111,325.912064475,477.025689725,611.988739979,688.303828564,855.052832421,965.703457064,1114.42314171,1376.86588019,1464.65697829,1634.52695273,1761.27293573,1942.26804951,2088.01225101,2208.11982748,2238.51828758,2361.07508218,2548.03371806,2710.64818294,2743.55062975,2831.82765802,2843.2264621,2844.97712349,2899.25321469,2994.2133391 +42 92.3125087636,153.96372647,168.095835816,342.071912039,545.205884946,613.495985761,777.106729356,893.778431511,980.379956887,1136.27792442,1219.6163816,1293.72130483,1395.88618975,1563.89914204,1717.34560732,1770.14096486,1856.29642927,1930.31893742,2035.0830656,2046.90067919,2114.06451549,2135.83358522,2233.88247309,2324.13049241,2360.97300679,2495.17856205,2716.38522109,2878.3999868,2920.97672376 +43 72.8122313689,212.237892921,327.782635382,463.164101249,546.656924247,641.239536316,838.197616562,973.987928912,1112.48994429,1223.97143792,1265.50288525,1336.99018578,1456.72395406,1484.87221383,1488.1036283,1626.00693689,1740.50042343,1829.45690599,1990.55621556,2019.62496995,2184.71192668,2401.89024804,2461.35594717,2609.0524114,2668.06634582,2774.94857941,2831.51337502,2849.75218056,2876.10897595 +44 2.9389542266,120.435724413,232.54559454,238.642158385,321.81222073,366.756833777,536.224152677,662.064371797,744.140051881,842.349254338,939.668854148,1002.35125271,1010.65710708,1112.20164457,1253.28320698,1469.93422515,1507.77396421,1586.21789591,1694.22912358,1720.0542661,1799.33675821,1862.25287244,2046.32066168,2062.17037534,2298.31381362,2422.43413485,2570.82667025,2619.8423859,2802.69179039,2943.70592567,2965.82322136 +45 176.746132413,319.391847222,364.940927561,378.599597246,473.927128428,572.214432232,722.140125612,731.589578178,852.190349601,859.025677453,1088.68597453,1156.54808114,1245.73378979,1365.56932148,1407.54509017,1467.76044111,1593.39990036,1742.39024273,1747.70112175,1902.29515502,1974.74387802,2119.34187976,2273.82358591,2396.39701166,2490.44705867,2647.73785107,2791.97826486,2821.37084523,2892.95378354 +46 18.8511412055,167.767669386,221.443392386,334.356290335,420.425546518,546.072507555,599.214438498,660.557288016,748.882074453,751.284799172,878.469083603,1058.10172193,1123.03842896,1237.01471484,1279.30706141,1334.92727414,1488.34522851,1563.85374462,1618.12272607,1897.27341928,2077.35919641,2154.79889395,2354.09018442,2395.84421716,2438.73997515,2449.84856256,2516.32080622,2626.08274651,2731.56371638,2848.31162326,2920.07886049,2985.49626442 +47 190.798441554,250.92278206,317.093719288,403.81180968,528.181339102,541.095545839,587.40972462,729.465686819,838.413954365,906.310573921,1013.83048548,1130.38887863,1235.11326597,1373.63208371,1414.64370902,1557.19291969,1609.72790461,1708.44362112,1749.85726134,1763.75016857,1853.77929007,1900.03333247,2063.34640715,2154.84916143,2251.76418832,2417.0979142,2504.60666222,2527.8763622,2561.97499302,2665.30458929,2815.30825493,2960.55642547,2989.68177727 +48 69.5615671663,189.24284834,363.294910103,493.641509189,691.938067393,871.638670386,992.415442247,1068.4512493,1156.5192598,1304.95518086,1413.84495779,1430.86600947,1545.72279946,1658.66000769,1727.91817882,1889.6596302,2090.55164694,2304.78846222,2420.27246426,2485.29528716,2539.96552071,2577.28039357,2647.20244498,2652.71640105,2772.67006915,2817.8056126,2926.55869146 +49 127.079855168,225.67823936,249.645281124,350.4674267,364.998614912,393.433821804,420.30275003,440.586537768,539.729482327,637.907465187,724.219364375,743.275431242,879.861111615,976.986413823,1004.84691632,1204.64468806,1302.81219428,1421.1179657,1475.42333021,1615.54164924,1759.88372386,1945.26900194,2076.05438194,2169.75416823,2291.99486318,2310.2464876,2321.24108921,2383.52501265,2388.34061196,2433.02561245,2475.13730446,2622.6733172,2646.81451402,2833.51731206 +50 109.851843131,113.330588381,283.718484907,293.274990648,340.79034678,354.523770468,374.235308507,472.169766784,709.651221796,827.347143316,843.344308859,1019.31878023,1044.0897799,1225.03657985,1408.94364513,1461.16407301,1520.95891023,1710.20699408,1845.44077047,1939.36476928,2114.35890534,2257.09419448,2388.57175995,2466.73195733,2645.84696777,2812.6025023,2945.93282715 +51 76.2310493806,245.607964913,260.491392502,285.910000422,373.019269001,599.888452069,760.511905639,841.362159247,907.430884842,959.624858382,1086.32780225,1266.22064936,1402.24037494,1478.01000016,1599.61412474,1610.59116666,1695.73888324,1765.44293323,1845.27883845,2055.039418,2229.56026839,2302.68836745,2343.80703597,2431.95417965,2448.68134241,2549.85772481,2682.82914588,2764.17260223,2786.5515958,2855.06427037 +52 20.0762032858,169.197319322,218.020020226,308.434788707,437.992409126,446.86886376,598.994716956,701.931338957,794.645098946,968.855183669,1083.47988089,1198.85093005,1298.02886475,1325.98313768,1519.47557177,1667.99360337,1816.23608644,1821.54351427,1961.37452555,2039.58045113,2197.49977042,2286.88498439,2293.21918502,2306.6181628,2352.28449469,2370.0060463,2396.49535419,2453.25327517,2593.88571024,2723.3117386,2848.69151192,2948.44348569 +53 26.0307518989,115.377318896,294.419040146,455.650334158,533.6163913,599.324518764,713.990790868,905.652443224,1086.34177834,1323.12557528,1372.37679749,1509.70985465,1639.80633845,1654.06474588,1700.50831307,1707.60482109,1807.21817017,1925.53687587,1998.93718994,2053.31437778,2068.16177545,2183.11171475,2325.92935788,2338.45333262,2408.04339474,2508.52397818,2716.06681004,2832.91440364,2974.33058172 +54 94.8396185887,168.786444731,232.221071915,299.395620053,451.35639624,465.663732681,603.344791518,689.108720167,718.384718527,719.53223282,749.245428165,828.059591257,841.408334146,854.780726045,993.01496049,997.778411668,1129.67420989,1281.50880331,1292.88847794,1306.07889964,1425.64226626,1488.15736961,1566.84654971,1597.52081035,1738.62909608,1851.290596,1869.68537234,2025.0628359,2245.00772674,2375.03820391,2608.75427608,2715.24787678,2828.89451757,2915.88813909,2958.97022091 +55 52.5396136265,98.995486523,287.119538717,325.133556365,397.387313012,514.365070412,651.952310168,705.140284823,852.548332949,940.294739389,1030.10869414,1101.22043129,1181.97969129,1267.54046154,1353.23731201,1369.37431111,1568.52036016,1661.13869487,1714.57282441,1798.08586307,1898.5399851,1899.45000645,1931.70252892,2021.79105822,2163.02045108,2249.9301313,2438.75298894,2621.24176469,2761.09002433,2946.51779203 +56 54.7153009121,150.698595958,175.830364358,305.123814755,521.340995431,668.049265177,890.515082669,1050.14899721,1219.58333168,1325.18526909,1495.09440794,1573.33124342,1657.1201906,1717.37541658,1758.57558567,1888.03538331,2007.84498459,2159.56764811,2211.91136706,2229.90957821,2280.19508614,2292.60438835,2355.34730568,2538.58287021,2546.58437167,2635.6069205,2693.91233192,2768.654985,2897.0164108,2984.05989598,2989.48105862 +57 216.748546822,316.152771933,323.432992961,350.052182343,421.697383626,455.206663287,518.728452028,665.119264613,761.532076331,791.219594337,938.283899659,1025.44202188,1107.46210521,1108.7510247,1162.97118889,1268.98745976,1447.62456357,1607.90771538,1716.59736472,1873.60592056,1889.7180858,2055.94385574,2062.77799998,2129.75483101,2168.65079082,2207.55095911,2428.1359481,2449.50194338,2484.64013035,2553.94791078,2652.38656695,2688.59182511,2942.87113199 +58 71.4345273652,136.411892058,190.029281947,285.344344334,440.984559752,605.563915093,655.255736817,895.128897943,989.490598376,1134.31018152,1301.09356743,1343.24519599,1395.7185034,1628.97271537,1711.27103617,1735.38024414,1810.337355,1968.47373223,2018.82723243,2143.46781615,2319.75643219,2383.84354982,2432.20157478,2616.57882665,2633.37544143,2768.19302301,2919.98003103 +59 134.754471462,192.035435131,278.214442055,436.302089608,596.035944505,837.644587127,985.469919965,1012.50758898,1153.1966829,1243.5446976,1284.46200669,1396.31446077,1491.47287757,1569.8746788,1656.54289982,1763.68013207,1779.57564472,1858.29725509,2036.51023645,2097.93474714,2292.33524968,2295.00433358,2378.85550926,2578.00395178,2747.04968869,2825.76012254 +60 34.7188783505,179.704300815,309.592982941,468.784556879,497.437394203,725.793585603,813.924231162,818.8723124,984.478990285,1061.58715403,1181.58422755,1192.11530309,1379.37776089,1585.7601324,1683.60652528,1690.2178832,1844.25598963,1944.94618235,2128.97826754,2161.64802535,2179.86985412,2212.38169637,2348.07940535,2475.37069805,2579.79365186,2718.225457,2978.98302359 +61 103.635678227,122.128670194,303.444282145,425.440178168,463.521567695,628.277795378,640.85742068,790.548053488,956.257093429,1011.96363669,1107.8303302,1125.61434707,1308.47000388,1525.49230533,1596.10443096,1631.38548685,1661.62741039,1706.97417396,1751.08533512,1828.8944879,1901.7865367,1990.93281334,2167.18048683,2232.60423302,2338.9950069,2381.11238428,2464.61235954,2601.33021752,2669.61424646,2846.73789244 +62 68.6541227093,134.219515698,288.060219668,369.902853645,569.455908286,754.444154981,756.408611023,938.098574934,938.886437487,1027.53791033,1126.92320193,1151.19475948,1247.37938013,1293.63319591,1493.73574332,1641.67354792,1754.19117743,1855.84417353,2072.64896741,2155.48400579,2354.52922092,2496.80460368,2598.98858888,2609.24678197,2765.65246035,2802.77225377,2869.91593446 +63 111.91507366,270.055918973,322.613087526,393.695226189,441.698729999,632.212075152,698.531557055,886.512362949,1001.93291942,1029.41015779,1205.92796044,1348.30059152,1424.51896235,1525.72945928,1599.6304855,1748.19895013,1756.92571454,1889.87222017,2019.7700749,2191.74098276,2323.02523056,2511.43597052,2638.50162393,2707.04369804,2801.15598353,2803.61162553,2836.07639527,2890.1571939,2942.72319895 +64 78.6410605271,273.835924297,386.924113059,476.644981419,549.581596707,582.349642836,665.094099222,749.625999618,779.809962582,939.118580735,953.475084593,1001.56120865,1116.32356184,1190.31967759,1293.63950126,1360.79805569,1370.76664215,1428.13504308,1482.26004878,1525.38637113,1529.46981601,1663.64749744,1798.41967394,1868.1262517,2003.69662461,2012.23286714,2071.1287982,2233.99648116,2343.43708308,2485.67366266,2611.52216371,2712.67588685,2768.79953544,2922.83718923,2948.48648844,2967.63542468 +65 7.26804741593,209.088792477,218.785242313,315.670614926,474.592865752,696.73989557,844.44663431,1039.93459583,1172.80802252,1239.19388677,1415.99607592,1555.41468036,1599.13910039,1691.78288351,1860.70547744,1900.3067198,1948.17330646,2031.93049807,2151.39330115,2272.52989336,2280.5841336,2392.9740298,2553.76783789,2688.84690936,2888.79509784,2946.67167663 +66 84.7830256131,124.788764896,164.928432046,192.264944512,385.584719119,455.298043175,584.453161486,706.89701462,735.90969295,960.384958149,1028.14361527,1044.2430295,1085.02036422,1301.17267343,1415.43149739,1523.32579781,1710.88791153,1806.4079988,1925.62281286,2066.45773365,2067.83478675,2203.00681934,2280.96566156,2328.50933698,2444.40986862,2520.47424885,2598.88253709,2693.75630488,2848.03457839,2854.52892594,2929.41698529 +67 240.743120564,285.707930593,452.146617101,646.763585122,777.028861877,913.602512784,1059.8036298,1085.58151369,1230.62299821,1382.54517076,1515.33829546,1646.41897836,1822.53705942,1843.99503065,2031.35983425,2053.71532976,2073.70806524,2371.27715451,2630.3193714,2764.71704856,2848.31576618,2902.55129221,2939.22212877 +68 134.139022048,206.635372839,247.326774684,413.683544305,438.461319403,472.697077929,565.125015008,793.053189567,963.788359971,1095.02883792,1191.24292089,1366.28673326,1409.80762667,1600.05395894,1623.97730886,1662.25749752,1695.49948273,1883.40807307,2033.43795509,2117.5894135,2239.79310669,2272.7604705,2276.73298484,2391.28506748,2394.50827904,2514.06347874,2624.50374217,2782.18533909,2998.09996443 +69 148.671433002,199.421218085,386.451745022,491.802970542,566.786215161,698.609994978,726.079231798,853.041130428,1092.55577499,1281.74424591,1350.05267793,1551.34626559,1603.75075876,1636.69059113,1773.00922846,1785.43639673,1847.83915947,1851.52947557,1916.52142422,1930.564462,2206.71252839,2275.3709793,2466.22879242,2543.09756325,2743.30465997,2750.24354491,2760.95865108,2771.80320956,2928.71290267,2987.40320152 +70 23.2462738849,47.3417125008,76.3450853887,139.893102511,211.421325536,319.728867885,479.254567594,642.725319693,691.253127474,776.625727928,883.170457768,893.121569483,1041.41317732,1121.20249502,1214.84256616,1275.55953967,1454.16447203,1478.73922615,1605.87360705,1623.508827,1783.53771343,1924.03195107,2039.47553176,2238.63213235,2269.47966575,2348.63360889,2403.9944658,2531.89867136,2586.38676404,2664.01614678,2783.58766866,2866.01675911 +71 4.32660034022,127.117741372,146.497169114,253.180982971,351.816037085,543.945434825,654.070090613,746.739981721,783.266748051,873.312560309,991.260359521,1005.0977598,1118.89858855,1185.55177399,1221.24245267,1268.07357662,1480.87147859,1681.30961423,1769.43567484,1775.05070211,1894.67372453,2053.69431367,2075.52960007,2152.35768274,2212.15213161,2296.00118436,2409.73436521,2556.11731015,2759.78343764,2818.98804835,2995.50280499 +72 150.589033476,231.226843886,419.244621585,467.939810544,583.746224506,679.645653836,723.073358266,813.828547287,1026.16097928,1081.9414563,1108.97840277,1163.08386565,1255.96235126,1348.36188278,1382.62067599,1582.60857346,1681.86417565,1761.12735529,1815.68520324,1830.00149526,1981.24607631,2108.8527374,2138.23623825,2221.13599746,2294.95500813,2322.11799034,2380.78142822,2507.59428012,2698.7493856,2778.76272962,2887.23815688,2964.19220978 +73 132.687767077,229.243433531,477.503069654,553.419502789,713.505440399,904.3663675,1189.05557745,1189.22211636,1295.15802962,1463.76372263,1560.66814787,1656.41817153,1736.65025477,1782.59544844,1840.35541154,1900.80085504,2029.75293356,2062.06380207,2099.88839741,2198.76394861,2231.1548326,2285.74285892,2305.78978194,2414.19364555,2565.75027858,2627.83425813,2750.45215702,2804.26349345 +74 239.693929214,348.549360138,423.779610146,516.275644431,656.412025477,661.658914552,700.69339324,829.1084499,874.136878206,998.773009669,1096.52331771,1239.01462596,1251.6523857,1378.52103808,1421.27588645,1484.84687264,1498.64197956,1610.87570776,1740.00996263,1902.17355457,2010.1621474,2048.76826269,2214.63970734,2304.46640124,2438.83195201,2516.20644094,2718.41732058,2836.47059751 +75 102.47542772,327.781118593,395.562529608,576.712320034,649.719959019,776.786196023,916.866430555,1023.98422365,1087.36753683,1239.59647476,1442.46977777,1600.61964981,1673.89936739,1767.99538619,1809.62064681,2021.83426445,2163.07931774,2262.51399115,2272.3437547,2338.77650846,2375.01723588,2552.28138411,2701.68765657,2726.71066033,2751.36586621,2905.18793953,2914.00842757 +76 90.6023444439,160.254112879,220.609849351,253.887469723,411.601496663,494.827863631,558.391259565,610.127200822,682.268710207,760.531842309,826.691010504,917.324512768,1129.28167638,1133.27846386,1224.47231256,1270.49030863,1328.15432833,1479.6910365,1636.87055375,1708.06337555,1896.41317016,1939.9874747,1963.24636213,2100.41038439,2288.11675583,2381.26393701,2397.42426359,2497.6970484,2675.96701422,2753.34248437,2956.44979126,2959.13254067 +77 36.9545975716,71.6157579016,207.750990932,276.674830906,388.905545467,513.701763253,526.67109384,595.464700237,745.454741501,860.119783527,987.274104097,1035.96300283,1103.90441631,1215.2305009,1390.86420436,1592.63648016,1661.48752464,1918.68389058,1997.06107984,2100.49145885,2166.20526735,2324.68881169,2578.37621363,2720.75971138,2838.8183704 +78 70.6099463122,128.495180538,175.819660286,278.1301795,440.193133381,604.543534354,727.599596259,866.941648921,903.129890272,1014.33460182,1202.92840243,1318.35476334,1405.66087605,1618.77087921,1676.87830608,1681.39656288,1735.08492973,1843.80421926,2021.74988664,2133.33857207,2356.91791051,2466.76781704,2541.42056479,2684.27847068,2727.12359894,2825.63968053 +79 21.6700434902,88.4476178604,198.957133842,271.711411508,273.68951263,446.565149749,631.108866847,777.485781469,1028.93970395,1047.34580079,1200.68125369,1245.72585224,1337.49934438,1476.26957144,1511.40487808,1694.9845959,1791.22730524,1795.48219219,1882.18619962,2008.4395379,2150.2298954,2155.72027744,2296.76358725,2372.92213577,2602.95917227,2760.88958791,2848.24429558,2934.43167473 +80 18.8871495506,32.7939123157,201.427973522,284.037864361,368.612644991,522.199679385,652.30280775,766.310180972,899.838950957,937.888689565,977.588155843,1060.49046459,1070.99043401,1181.8096073,1300.42850847,1417.62894719,1704.10990633,1762.24188484,1837.74710879,1895.21785926,2009.03573833,2090.94577067,2134.69833498,2239.73263474,2346.85144826,2378.62049951,2492.18430932,2599.00000644,2746.51192073,2768.97529856,2950.35363697,2958.55538785 +81 3.93539857488,74.033195764,146.711585238,254.532794914,295.435067465,327.715397057,449.629508636,593.328928074,647.560001945,785.083865124,835.750365175,869.420774435,909.348715017,992.714366233,1054.26240774,1077.57701619,1134.44408159,1311.96053938,1409.80920153,1535.62313337,1607.12717576,1678.25554243,1780.49449669,1816.30997255,1852.98964638,2097.53862518,2282.79974949,2449.51601397,2636.58668371,2705.56402983,2856.33132219,2875.18960021 +82 107.549344584,129.111769669,299.703949395,346.647996313,511.072647583,669.111435827,701.204994736,763.472450075,915.51456448,953.465438127,1097.77016397,1192.27801018,1309.99593592,1489.86691245,1592.07020205,1701.92176393,1754.92796225,1865.48513493,1978.50490926,2125.42614521,2226.90589129,2305.27044539,2336.01493431,2486.17965826,2640.50208919,2758.22730781,2970.90291194 +83 69.3189267951,353.875997941,482.455410012,518.921674237,668.021124559,777.135824402,957.61202939,1120.97168977,1264.59628279,1363.06756097,1411.9643096,1522.16449471,1684.36694539,1787.0854296,1971.54008672,2130.22725094,2232.17932521,2384.80463005,2387.33987863,2495.86662754,2631.7195494,2761.96623162,2793.82089755,2918.46816037,2988.46213776 +84 150.92730904,328.748256673,398.091318374,419.457628737,577.599924699,707.024306402,720.639270809,763.954913971,806.199281755,894.811923685,1007.53850241,1071.83495501,1160.54541825,1249.58830278,1278.21296509,1457.25092779,1524.66057706,1623.85962009,1653.91661313,1781.6832874,1788.97949531,1861.80124947,1972.57842752,2013.34225124,2122.15668648,2140.24217202,2281.99397987,2348.52432205,2401.3696935,2656.32705912,2856.73715131 +85 21.9665506899,100.206614765,316.403771498,358.091531374,382.024387533,557.177891555,657.004989014,723.772129119,904.361600188,992.215589242,1073.36835624,1111.9617495,1299.12177811,1410.25131955,1501.05933357,1718.86810748,1894.60835078,2113.39088325,2288.80024308,2297.08643211,2325.54920447,2331.24167931,2382.01423779,2480.29133004,2497.20176666,2618.96387568,2685.98228393,2890.17597637 +86 163.908573234,202.483089132,289.729241882,484.294953132,696.461939715,869.347989967,944.302160509,1060.73523466,1156.9422888,1305.11809193,1371.30568779,1526.25531213,1599.14167346,1693.90273631,1850.74593831,2044.08806494,2135.28415476,2247.12742214,2317.71251258,2455.45609389,2649.78103617,2797.87496618,2818.10780012,2905.7773635,2935.26973582 +87 203.76894565,339.226829199,584.851399464,630.366458878,764.08474229,870.934141688,1051.83117763,1141.81909716,1162.51363726,1295.5377215,1302.60787358,1344.22259019,1418.62180529,1453.8813084,1509.45771667,1559.82374984,1701.89376465,1723.37002019,1849.82382483,2044.98762614,2093.56894389,2112.64965265,2198.03083663,2340.65902174,2509.71052459,2561.86432971,2591.62970972,2674.75583852,2779.77154062,2911.23709872 +88 2.03767446618,39.4949158194,140.526033413,142.107326919,214.78873852,357.628333525,557.438829524,681.768824248,817.968292419,902.78541865,1086.43399915,1326.94698798,1374.194797,1468.3160924,1556.39070689,1735.00689885,1772.68361141,1847.40005087,1971.50071952,2120.18131268,2274.59426103,2296.73134948,2414.11589678,2551.49906211,2665.6685978,2856.8434342,2881.93393584 +89 113.832799777,268.942030963,325.193287701,410.206348292,575.78250394,819.934336744,939.257069413,1105.01201078,1223.6879168,1239.03949025,1416.90413571,1562.62844652,1592.84484657,1660.511933,1861.61960261,1881.69287845,1910.71250602,1973.01859059,1973.96465668,2090.98069604,2185.58067063,2374.68337982,2505.39591006,2565.76072618,2747.51445491,2841.52093423,2897.58561575 +90 176.035808693,177.742200731,187.024667881,354.613005192,542.538164183,545.703803247,654.712595454,712.535731774,906.645600876,960.661108127,1010.12190278,1113.38164485,1203.21800906,1221.36339609,1234.63827946,1323.85185465,1491.6672537,1498.44524989,1580.27771864,1757.85837642,1890.39123007,2077.96499402,2170.29591316,2372.75666741,2496.3898918,2554.40203176,2697.34633219,2866.45233006,2973.4710255 +91 118.728326982,148.277980351,172.272510131,233.816464527,326.343612287,506.938978565,644.384594132,916.54321994,941.362062472,1002.37273285,1003.99462651,1057.03452734,1113.90894448,1124.56833741,1265.17847179,1532.24280138,1686.9779507,1765.41204606,1918.7903115,2041.26005975,2156.46080358,2235.57667064,2297.37477779,2433.7892526,2492.44474808,2527.69971933,2583.44977472,2651.53470887,2857.54944865,2870.96343813 +92 36.783037748,166.14872437,275.726359561,513.98090579,642.082575383,707.291864092,785.302938735,923.200877426,1088.5352753,1299.41567501,1434.62637923,1533.86564509,1612.20056248,1651.3402012,1803.38680262,1821.11301729,1945.44424722,2008.64746713,2016.99100306,2099.63590678,2226.62385436,2343.57801247,2461.80005826,2575.24744245,2710.21453314,2831.18854378,2869.86006824,2986.52739021 +93 126.898684486,222.772006465,358.286856283,459.660277173,602.797710882,754.561770174,875.547613914,1065.25853933,1207.78939939,1329.25147182,1437.65899809,1631.64215623,1824.23294174,1979.28325091,2087.46799271,2207.10328285,2251.91155495,2318.41266603,2429.548238,2557.78727812,2610.02765792,2770.02298662,2791.1432586,2811.66750839 +94 154.953559681,356.117529845,361.206914528,459.749444997,526.404314346,749.675858933,873.818300879,1063.04526858,1167.78365921,1353.01680235,1447.94686741,1545.90065388,1696.08670572,1728.62329144,1734.60457146,1898.42430147,2006.24385902,2062.39043771,2240.15317945,2304.46939304,2332.17578061,2379.57882727,2536.95924201,2716.06583493,2868.10798291,2948.93843502 +95 13.4212183206,91.3292777818,104.774673716,271.046500692,275.375964671,459.977151481,576.534873661,692.714841228,824.787861013,903.114807924,962.040250975,977.00187075,1036.16101461,1050.13023844,1101.38305008,1227.21212509,1267.12392197,1368.05874102,1449.67055637,1635.19383341,1786.38816741,1929.92550892,2071.97659253,2115.89126004,2235.40593304,2380.84956764,2462.20593733,2567.6242852,2685.59021269,2754.62976497,2778.2991728,2863.95968318,2995.70822373 +96 116.93699603,253.672712175,423.51822628,432.895936089,546.612295259,614.330942596,817.233443316,1016.55729581,1127.33054304,1259.65045472,1333.21283681,1355.53662085,1481.58943155,1502.30912771,1710.80529676,1861.06153422,1945.03288186,2060.13564084,2113.04159094,2281.38378924,2393.33509108,2436.66243944,2531.07087976,2643.31997208,2770.11616323,2829.54929159,2952.50743017 +97 218.625280321,281.112753065,307.994754301,436.627168165,565.010684552,693.347425212,746.062024919,828.092919264,936.939712181,1043.64981021,1202.86933355,1275.38849777,1322.1329902,1416.42090159,1484.75860853,1593.52333347,1735.21656925,1782.18210723,1973.63696586,2068.02938596,2153.46236875,2320.91255947,2418.67304155,2461.32975529,2574.2882677,2607.85127128,2810.93162822,2817.71675649 +98 20.9823024317,177.539504719,245.024455831,320.568358447,418.062765489,471.31278567,494.50212707,511.59086574,627.073234852,774.784074039,841.379894765,953.399317371,1138.47141278,1221.07118881,1404.31773486,1464.09371109,1596.77701822,1700.10807635,1853.7399333,1922.30762351,2008.98122915,2128.5831686,2295.05166185,2461.30630566,2568.98954815,2696.64432685,2808.90032828,2920.90852503 +99 129.581223915,140.983702446,317.557409975,337.630138803,361.337648529,504.948417433,552.607790016,636.015213358,720.585642134,936.269183017,1037.07885978,1061.56915511,1205.81763797,1268.11538692,1418.50448012,1451.29554935,1511.42980087,1633.5951949,1768.58020132,1907.73055948,2020.4720066,2150.85931084,2245.01323716,2351.16899105,2531.39863372,2640.49637462,2781.14472315,2932.58037837 diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/analyze_results.py b/bmtk-vb/docs/tutorial/sources/chapter04/analyze_results.py new file mode 100644 index 0000000..81e4122 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/analyze_results.py @@ -0,0 +1,5 @@ +from bmtk.analyzer.visualization.spikes import plot_spikes, plot_rates + +#plot_spikes('network/V1_nodes.h5', 'network/V1_node_types.csv', 'output/spikes.txt', group_key='pop_name') + +plot_rates('network/V1_nodes.h5', 'network/V1_node_types.csv', 'output/spikes.txt', group_key='pop_name', smoothed=True) \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/biophysical_neuron_templates/472363762_fit.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/biophysical_neuron_templates/472363762_fit.json new file mode 100644 index 0000000..9d72939 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/biophysical_neuron_templates/472363762_fit.json @@ -0,0 +1,145 @@ +{ + "passive": [ + { + "ra": 32.0772432623, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "dend", + "cm": 3.7002019468166822 + }, + { + "section": "apic", + "cm": 3.7002019468166822 + } + ], + "e_pas": -84.74527740478516 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 46 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -84.74527740478516 + } + ], + "genome": [ + { + "section": "soma", + "name": "gbar_Im", + "value": 0.00011215709095308002, + "mechanism": "Im" + }, + { + "section": "soma", + "name": "gbar_Ih", + "value": 0.00045041730360183556, + "mechanism": "Ih" + }, + { + "section": "soma", + "name": "gbar_NaTs", + "value": 1.1281486914123688, + "mechanism": "NaTs" + }, + { + "section": "soma", + "name": "gbar_Nap", + "value": 0.00095782168667023497, + "mechanism": "Nap" + }, + { + "section": "soma", + "name": "gbar_K_P", + "value": 0.096648124440568361, + "mechanism": "K_P" + }, + { + "section": "soma", + "name": "gbar_K_T", + "value": 2.2406204607139379e-05, + "mechanism": "K_T" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": 0.0068601737830082388, + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": 0.33043773066721083, + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": 0.00026836177945335608, + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": 0.0077938181828292709, + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": 0.00044743022380752001, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": 998.99266101400383, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "g_pas", + "value": 0.00091710033541291013, + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": 0.00074804303211946897, + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": 0.00016449702719528828, + "mechanism": "" + }, + { + "section": "apic", + "name": "g_pas", + "value": 4.4606771501076728e-05, + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/biophysical_neuron_templates/472912177_fit.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/biophysical_neuron_templates/472912177_fit.json new file mode 100644 index 0000000..fc720a0 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/biophysical_neuron_templates/472912177_fit.json @@ -0,0 +1,137 @@ +{ + "passive": [ + { + "ra": 82.4689062963, + "cm": [ + { + "section": "soma", + "cm": 2.44588884818 + }, + { + "section": "axon", + "cm": 2.44588884818 + }, + { + "section": "dend", + "cm": 2.44588884818 + } + ], + "e_pas": -81.38301849365234 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 68, + 70, + 71 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -81.38301849365234 + } + ], + "genome": [ + { + "section": "soma", + "name": "gbar_Ih", + "value": 0.0035046923894438732, + "mechanism": "Ih" + }, + { + "section": "soma", + "name": "gbar_NaV", + "value": 0.080650649722282169, + "mechanism": "NaV" + }, + { + "section": "soma", + "name": "gbar_Kd", + "value": 2.9730840921116108e-08, + "mechanism": "Kd" + }, + { + "section": "soma", + "name": "gbar_Kv2like", + "value": 0.031286981563460388, + "mechanism": "Kv2like" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": 0.33791155676909035, + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_K_T", + "value": 0.060152750529076392, + "mechanism": "K_T" + }, + { + "section": "soma", + "name": "gbar_Im_v2", + "value": 0.0004472489637646503, + "mechanism": "Im_v2" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": 0.11884294933058412, + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": 1.7155644219948863e-06, + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": 0.0013142129706747733, + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": 0.012138290318503447, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": 20.818925809598934, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "g_pas", + "value": 0.00035140098296466391, + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": 8.8180967667289725e-06, + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": 7.0434834613833277e-06, + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/morphologies/Pvalb.swc b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/morphologies/Pvalb.swc new file mode 100644 index 0000000..5439245 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/morphologies/Pvalb.swc @@ -0,0 +1,1645 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/Users/alexh/Desktop/Check then delete/Pvalb-IRES-Cre_Ai14-187029.03.02.01_485995840_p.swc_Z_T10.swc +# id,type,x,y,z,r,pid +1 1 317.8032 311.9391 24.0786 6.7382 -1 +2 3 314.648 314.0772 25.9014 0.1144 1 +3 3 313.877 314.7213 26.0924 0.1512 2 +4 3 312.8028 315.0851 26.1727 0.163 3 +5 3 312.074 315.927 26.2825 0.1857 4 +6 3 311.1772 316.5185 26.421 0.2234 5 +7 3 310.0354 316.5414 26.5841 0.3146 6 +8 3 309.1935 316.5974 26.9709 0.3803 7 +9 3 308.3297 316.6283 27.4977 0.318 8 +10 3 307.204 316.4796 27.8928 0.2951 9 +11 3 306.0818 316.3183 28.1445 0.375 10 +12 3 304.9572 316.4498 28.2848 0.5012 11 +13 3 303.8372 316.6134 28.3203 0.4986 12 +14 3 302.7081 316.4807 28.2576 0.4982 13 +15 3 301.587 316.2702 28.1268 0.4758 14 +16 3 300.4705 316.1936 27.9161 0.4257 15 +17 3 299.3516 316.1513 27.6449 0.3734 16 +18 3 298.2316 315.9568 27.3928 0.309 17 +19 3 297.1162 315.7474 27.1751 0.2601 18 +20 3 296.0478 315.6136 26.8785 0.2848 19 +21 3 294.9953 315.4054 26.4831 0.3427 20 +22 3 293.9108 315.3814 26.0527 0.3914 21 +23 3 292.8434 315.5118 25.5876 0.309 22 +24 3 291.9419 314.8116 25.2557 0.3077 23 +25 3 291.0393 314.1104 25.0396 0.256 24 +26 3 290.02 313.6402 24.9105 0.2851 25 +27 3 288.9321 313.2855 24.83 0.3045 26 +28 3 287.9162 312.7696 24.7651 0.394 27 +29 3 287.2035 311.8979 24.6909 0.3004 28 +30 3 286.1396 311.5501 24.5332 0.2423 29 +31 3 285.0493 311.2389 24.3141 0.2607 30 +32 3 283.9602 310.9278 24.0608 0.2549 31 +33 3 283.9602 310.0583 23.7752 0.2093 32 +34 3 283.9351 308.9464 23.4776 0.1787 33 +35 3 283.7475 307.8184 23.2805 0.2031 34 +36 3 283.5587 306.6904 23.178 0.1985 35 +37 3 283.3562 305.5704 23.1878 0.203 36 +38 3 283.1469 304.455 23.2958 0.2621 37 +39 3 282.6916 303.4449 23.4593 0.2395 38 +40 3 281.9983 302.5388 23.6387 0.2679 39 +41 3 281.448 301.547 23.794 0.2082 40 +42 3 280.995 300.4968 23.9155 0.1847 41 +43 3 280.6312 299.4168 24.0099 0.1759 42 +44 3 280.3692 298.3026 24.0908 0.2196 43 +45 3 280.0844 297.1963 24.1762 0.238 44 +46 3 279.6588 296.1347 24.2872 0.2325 45 +47 3 279.2344 295.0719 24.4421 0.1859 46 +48 3 278.445 294.246 24.648 0.1621 47 +49 3 277.6488 293.4246 24.9038 0.1571 48 +50 3 276.3584 292.9601 23.7763 0.1144 49 +51 3 275.315 292.5425 23.3696 0.1373 50 +52 3 274.2648 292.1524 23.1737 0.1373 51 +53 3 273.1208 292.1524 23.0201 0.1373 52 +54 3 271.9768 292.1524 22.9065 0.1373 53 +55 3 270.8328 292.1524 22.8299 0.1373 54 +56 3 269.6888 292.1524 22.7867 0.1373 55 +57 3 268.5448 292.1524 22.7732 0.1373 56 +58 3 267.4031 292.0975 22.7732 0.1373 57 +59 3 266.266 291.9774 22.7732 0.1373 58 +60 3 265.1277 291.8573 22.7732 0.1374 59 +61 3 264.0592 291.4592 22.7732 0.1375 60 +62 3 262.9976 291.0347 22.7732 0.1376 61 +63 3 261.8856 290.7831 22.7732 0.1379 62 +64 3 260.8903 290.2625 22.7732 0.1384 63 +65 3 260.6329 289.1986 22.7732 0.1393 64 +66 3 260.6021 288.0558 22.7732 0.1411 65 +67 3 260.5632 286.9129 22.7732 0.1442 66 +68 3 260.0747 285.8993 22.7732 0.1507 67 +69 3 259.6228 284.8491 22.7732 0.1595 68 +70 3 259.116 283.8539 22.7732 0.1913 69 +71 3 258.067 283.4523 22.7732 0.1753 70 +72 3 256.923 283.4523 22.7732 0.166 71 +73 3 255.7801 283.4226 22.7732 0.1643 72 +74 3 254.6864 283.1938 22.7732 0.2007 73 +75 3 253.8479 282.4147 22.7732 0.1903 74 +76 3 253.0219 281.6231 22.7732 0.2059 75 +77 3 252.0026 281.1243 22.7732 0.1795 76 +78 3 250.9524 280.6712 22.7732 0.1707 77 +79 3 249.9228 280.1736 22.7732 0.1885 78 +80 3 248.8497 279.8041 22.7732 0.1703 79 +81 3 247.8396 279.4392 22.7732 0.1561 80 +82 3 246.9816 278.6818 22.7732 0.1491 81 +83 3 246.1247 277.9245 22.7732 0.1566 82 +84 3 245.2347 277.2061 22.7732 0.1858 83 +85 3 244.3424 276.4911 22.7732 0.1652 84 +86 3 243.7178 275.5381 22.7732 0.1469 85 +87 3 243.1172 274.5646 22.7732 0.1313 86 +88 3 242.3003 273.7706 22.7732 0.1271 87 +89 3 241.4538 273.0007 22.7732 0.1144 88 +90 3 240.4494 272.4619 22.7732 0.1144 89 +91 3 277.4692 293.2964 25.3131 0.1868 49 +92 3 276.9315 292.912 26.0467 0.1671 91 +93 3 276.2074 292.5311 26.8749 0.1502 92 +94 3 275.1091 292.2268 27.5145 0.1377 93 +95 3 274.0875 291.8184 27.9776 0.1381 94 +96 3 273.3119 290.981 28.2783 0.1387 95 +97 3 272.6335 290.0692 28.4334 0.14 96 +98 3 272.296 288.9778 28.4782 0.1423 97 +99 3 271.8087 287.9437 28.4827 0.1466 98 +100 3 271.3259 286.906 28.4892 0.1543 99 +101 3 270.8637 285.8593 28.4981 0.1698 100 +102 3 270.4096 284.8091 28.5104 0.1928 101 +103 3 269.7895 283.863 28.5278 0.2631 102 +104 3 269.0471 282.9936 28.5522 0.2592 103 +105 3 268.2726 282.1516 28.5863 0.2172 104 +106 3 267.4764 281.3302 28.6339 0.1945 105 +107 3 266.5955 280.6083 28.6986 0.2272 106 +108 3 265.6585 279.9505 28.7913 0.2676 107 +109 3 264.7479 279.2596 28.9271 0.2127 108 +110 3 263.8556 278.5446 29.1138 0.1689 109 +111 3 263.1303 277.6785 29.3518 0.1494 110 +112 3 262.516 276.713 29.6366 0.1571 111 +113 3 262.2208 276.157 30.2632 0.1867 112 +114 3 261.9657 275.6674 31.1629 0.167 113 +115 3 260.8217 275.6674 31.8699 0.1501 114 +116 3 259.6777 275.6674 32.3949 0.1374 115 +117 3 258.5337 275.6674 32.7513 0.1376 116 +118 3 257.3897 275.6674 32.9554 0.1378 117 +119 3 256.2457 275.6674 33.0235 0.1383 118 +120 3 255.1017 275.6674 33.0243 0.1391 119 +121 3 253.9577 275.6674 33.0257 0.1407 120 +122 3 252.8137 275.6674 33.0277 0.1435 121 +123 3 251.6697 275.6674 33.0302 0.1494 122 +124 3 250.5257 275.6674 33.0336 0.1571 123 +125 3 249.9571 275.1 33.0386 0.1867 124 +126 3 249.2021 274.2431 33.0453 0.1669 125 +127 3 248.1931 273.8484 33.0551 0.15 126 +128 3 247.0983 273.5293 33.0686 0.1373 127 +129 3 245.9726 273.3794 33.0873 0.1373 128 +130 3 244.8286 273.3782 33.1139 0.1373 129 +131 3 243.6846 273.3782 33.1509 0.1373 130 +132 3 242.5406 273.3782 33.2013 0.1373 131 +133 3 241.3966 273.3782 33.273 0.1373 132 +134 3 240.2526 273.3782 33.378 0.1373 133 +135 3 239.1086 273.3782 33.5233 0.1373 134 +136 3 237.9646 273.3782 33.7106 0.1373 135 +137 3 236.8206 273.3782 33.9382 0.1373 136 +138 3 235.9569 273.3588 34.3893 0.1372 137 +139 3 235.2773 273.376 35.1089 0.1372 138 +140 3 234.3221 273.9972 35.6966 0.1371 139 +141 3 233.4835 274.7751 36.1662 0.137 140 +142 3 232.4905 275.1926 36.5322 0.1368 141 +143 3 231.3488 275.2533 36.8152 0.1364 142 +144 3 230.206 275.3116 37.0549 0.1356 143 +145 3 229.0871 275.4123 37.3013 0.1342 144 +146 3 228.0633 275.6674 37.6788 0.1313 145 +147 3 226.9307 275.7383 38.0453 0.1271 146 +148 3 226.0075 276.2177 38.4465 0.1144 147 +149 3 225.7936 277.0413 39.8532 0.1144 148 +150 3 283.3482 310.9278 23.912 0.1144 32 +151 3 282.2042 310.9278 24.1216 0.2908 150 +152 3 281.0602 310.9278 24.2072 0.3238 151 +153 3 279.9162 310.9278 24.3206 0.2731 152 +154 3 278.7722 310.9278 24.4624 0.2648 153 +155 3 277.6911 311.1314 24.7174 0.2905 154 +156 3 276.6352 311.4094 25.0861 0.2535 155 +157 3 275.5782 311.6874 25.5287 0.2522 156 +158 3 274.5406 312.1656 25.8933 0.2667 157 +159 3 273.5029 312.6483 26.1895 0.211 158 +160 3 272.4047 312.9606 26.4346 0.1659 159 +161 3 271.2973 313.2489 26.6481 0.1432 160 +162 3 270.2162 313.6162 26.861 0.1481 161 +163 3 269.1535 314.0406 27.1036 0.1577 162 +164 3 268.2005 314.5428 27.4856 0.1732 163 +165 3 267.3951 315.1514 28.093 0.2138 164 +166 3 266.5898 315.76 28.8618 0.2305 165 +167 3 265.6345 316.3446 29.5728 0.2032 166 +168 3 264.5923 316.7461 30.2229 0.2065 167 +169 3 264.0295 317.1168 31.0929 0.18 168 +170 3 263.1566 317.42 31.8917 0.1745 169 +171 3 262.0218 317.5607 32.4769 0.1812 170 +172 3 260.9475 317.8833 32.9059 0.2263 171 +173 3 259.9557 318.4541 33.231 0.2659 172 +174 3 258.9272 318.9266 33.4905 0.2095 173 +175 3 257.8359 319.2332 33.7294 0.163 174 +176 3 256.7445 319.5386 33.9923 0.1379 175 +177 3 255.7309 319.6279 34.391 0.1384 176 +178 3 254.6601 319.9196 34.7446 0.1393 177 +179 3 253.6317 320.3738 35.0118 0.141 178 +180 3 252.7245 321.0544 35.2005 0.1442 179 +181 3 251.7326 321.6242 35.3228 0.15 180 +182 3 250.7396 322.1904 35.3996 0.1619 181 +183 3 249.702 322.6732 35.4508 0.1776 182 +184 3 248.6644 323.156 35.5121 0.2377 183 +185 3 247.9277 324.0197 35.5914 0.1994 184 +186 3 247.2127 324.9132 35.6905 0.168 185 +187 3 246.3295 325.5916 35.8957 0.1469 186 +188 3 245.4532 326.2814 36.169 0.1556 187 +189 3 244.657 327.1028 36.4146 0.1691 188 +190 3 243.8379 327.899 36.6486 0.2065 189 +191 3 242.9227 328.5854 36.8838 0.2164 190 +192 3 242.0121 329.2775 37.1286 0.1797 191 +193 3 240.9802 329.6928 37.3876 0.15 192 +194 3 240.0318 330.028 37.77 0.1373 193 +195 3 239.9918 330.1595 38.5484 0.1373 194 +196 3 238.8569 330.1595 39.2417 0.1373 195 +197 3 237.7221 330.1595 39.8381 0.1373 196 +198 3 236.5872 330.1595 40.3287 0.1373 197 +199 3 235.4455 330.1595 40.67 0.1373 198 +200 3 234.3015 330.1595 40.8618 0.1373 199 +201 3 233.1621 330.2167 40.9368 0.1373 200 +202 3 232.4448 331.0553 40.9752 0.1373 201 +203 3 232.184 332.1604 40.9898 0.1373 202 +204 3 231.4918 333.0138 40.992 0.1373 203 +205 3 230.4073 333.3559 40.992 0.1373 204 +206 3 229.2656 333.365 40.992 0.1373 205 +207 3 228.1445 333.5046 40.992 0.1373 206 +208 3 227.2487 334.1224 40.992 0.1373 207 +209 3 226.4342 334.8991 40.992 0.1373 208 +210 3 225.5716 335.6439 40.992 0.1373 209 +211 3 224.6564 336.3303 40.992 0.1373 210 +212 3 223.7252 336.9904 40.992 0.1373 211 +213 3 222.6876 337.472 40.992 0.1372 212 +214 3 221.6489 337.9502 40.992 0.1372 213 +215 3 220.5346 338.2122 40.992 0.1371 214 +216 3 219.4215 338.4741 40.992 0.137 215 +217 3 218.4045 338.9695 40.992 0.1368 216 +218 3 217.4298 339.5689 40.992 0.1364 217 +219 3 216.494 340.2245 40.992 0.1356 218 +220 3 215.5788 340.9109 40.992 0.1342 219 +221 3 214.8123 341.746 40.992 0.1313 220 +222 3 214.1259 342.6612 40.992 0.1271 221 +223 3 213.7049 343.7034 40.992 0.1144 222 +224 3 213.4281 344.813 40.992 0.1144 223 +225 3 320.463 309.7037 19.2823 0.1144 1 +226 3 321.1219 309.031 18.5989 0.1425 225 +227 3 321.0625 307.8973 18.3625 0.1469 226 +228 3 321.0625 306.7533 18.1952 0.155 227 +229 3 321.0819 305.6276 18.0492 0.1709 228 +230 3 321.1391 304.5374 17.8548 0.1963 229 +231 3 320.9995 304.0729 17.7624 0.2627 230 +232 3 320.145 303.4952 17.7601 0.2924 231 +233 3 319.2321 303.4952 18.5816 0.4576 232 +234 2 318.2059 313.2466 31.2976 0.1144 1 +235 2 318.2036 313.7512 33.4502 0.1381 234 +236 2 318.1361 314.5817 34.3983 0.1387 235 +237 2 318.0629 315.3882 35.4402 0.14 236 +238 2 318.604 315.9179 36.206 0.1422 237 +239 2 318.8362 317.0218 36.78 0.1465 238 +240 2 319.1966 318.0869 37.1896 0.1542 239 +241 2 320.2811 318.4061 37.4618 0.1697 240 +242 2 321.4022 318.604 37.683 0.1926 241 +243 2 321.9216 319.2515 38.0318 0.2628 242 +244 2 322.2442 320.2045 38.4062 0.2585 243 +245 2 322.8551 320.6666 38.9808 0.2166 244 +246 2 323.9682 320.7902 39.5315 0.1896 245 +247 2 323.0187 321.631 40.1419 0.1144 246 +248 2 322.2648 322.1813 41.3392 0.2363 247 +249 2 321.3725 322.6549 41.8648 0.1969 248 +250 2 320.3074 323.0725 42.3102 0.1633 249 +251 2 319.2435 323.49 42.6852 0.1383 250 +252 2 318.5983 324.4235 42.9965 0.1392 251 +253 2 317.7334 325.0802 43.3378 0.1408 252 +254 2 316.793 325.6419 43.7119 0.1437 253 +255 2 315.8527 326.2047 44.123 0.1497 254 +256 2 314.9077 326.8294 44.4702 0.1582 255 +257 2 313.9628 327.4734 44.7236 0.1864 256 +258 2 313.1174 328.2262 44.8899 0.178 257 +259 2 312.3921 329.1116 45.0108 0.1144 258 +260 2 324.2885 321.0327 40.3133 0.2363 246 +261 2 325.4131 320.86 40.9223 0.1969 260 +262 2 326.469 320.4527 41.3666 0.1633 261 +263 2 327.4048 319.8041 41.6996 0.1384 262 +264 2 328.4035 319.2744 41.9835 0.1394 263 +265 2 329.432 318.8236 42.2321 0.1412 264 +266 2 330.5599 318.6292 42.4021 0.1446 265 +267 2 331.6868 318.4324 42.5594 0.1506 266 +268 2 332.8136 318.2333 42.7112 0.163 267 +269 2 333.9325 318.024 42.8711 0.1797 268 +270 2 334.9895 317.7323 43.1449 0.2415 269 +271 2 336.0145 317.3147 43.4431 0.2066 270 +272 2 337.154 317.2209 43.7164 0.1809 271 +273 2 338.2865 317.0619 43.9712 0.1726 272 +274 2 339.4191 316.9017 44.2106 0.1949 273 +275 2 340.3652 317.0299 44.6485 0.2825 274 +276 2 341.3936 317.126 45.1181 0.2203 275 +277 2 342.5353 317.1957 45.4748 0.1652 276 +278 2 343.6713 317.3319 45.7391 0.1144 277 +279 2 344.797 317.5344 46.0138 0.1144 278 +280 3 321.1368 309.5824 19.239 0.1144 1 +281 3 321.9777 308.9875 18.2858 0.1545 280 +282 3 323.1217 308.9875 17.8278 0.1698 281 +283 3 323.2772 308.5734 16.5097 0.1144 282 +284 3 323.6559 307.5633 15.7844 0.1665 283 +285 3 323.855 306.4742 15.4821 0.2047 284 +286 3 324.0712 305.3748 15.2132 0.1977 285 +287 3 324.4956 304.3452 14.9739 0.2201 286 +288 3 324.9532 303.4952 14.7611 0.2033 287 +289 3 325.4108 303.4952 15.2032 0.1144 288 +290 3 326.5548 303.4952 14.7073 0.1447 289 +291 3 327.1211 302.302 14.3863 0.1507 290 +292 3 327.6508 301.3593 14.0588 0.1633 291 +293 3 327.9631 300.3641 13.7993 0.1803 292 +294 3 329.1002 300.2908 13.606 0.2426 293 +295 3 329.9204 299.5976 13.4178 0.209 294 +296 3 330.608 298.6938 13.2859 0.1831 295 +297 3 331.3287 297.8633 13.2319 0.1878 296 +298 3 332.4361 297.7729 13.2606 0.1695 297 +299 3 333.5641 297.7672 13.3319 0.1525 298 +300 3 334.4667 297.2627 13.3974 0.1525 299 +301 3 335.4791 296.8577 13.5139 0.1144 300 +302 3 324.1181 302.826 14.4217 0.2274 288 +303 3 323.6582 301.8204 14.0618 0.2322 302 +304 3 323.5598 300.6821 13.7706 0.2062 303 +305 3 322.8162 299.9088 13.5332 0.2126 304 +306 3 322.6389 298.5302 13.3449 0.1887 305 +307 3 322.6641 297.3874 13.2018 0.203 306 +308 3 322.4353 296.399 12.939 0.1736 307 +309 3 321.8713 296.1862 10.6985 0.1144 308 +310 3 321.5578 295.1028 10.6985 0.1686 309 +311 3 321.1048 294.0526 10.6985 0.2092 310 +312 3 320.8337 292.9647 10.6985 0.2034 311 +313 3 320.8337 291.8207 10.6985 0.2429 312 +314 3 320.8337 290.6767 10.6985 0.1864 313 +315 3 320.8337 289.5327 10.6985 0.1398 314 +316 3 320.8337 288.3887 10.6985 0.1144 315 +317 3 322.7064 296.399 12.7425 0.1622 308 +318 3 323.7028 295.9917 12.5926 0.161 317 +319 3 324.3869 295.0811 12.486 0.1759 318 +320 3 324.9543 294.0915 12.4191 0.2344 319 +321 3 325.2323 293.0173 12.3878 0.1935 320 +322 3 325.9988 292.2131 12.3878 0.1568 321 +323 3 326.0972 291.0977 12.3878 0.1271 322 +324 3 326.0972 289.9537 12.3878 0.1144 323 +325 3 326.326 288.8463 12.3878 0.1144 324 +326 3 323.72 308.9875 17.4687 0.1952 282 +327 3 324.8617 309.0138 17.203 0.2562 326 +328 3 325.9862 309.2266 17.0236 0.3017 327 +329 3 326.8969 309.9027 16.9224 0.3709 328 +330 3 327.8475 310.5377 16.8907 0.3441 329 +331 3 328.948 310.8305 16.89 0.2464 330 +332 3 330.0463 311.152 16.889 0.1841 331 +333 3 331.1377 311.4929 16.8877 0.178 332 +334 3 332.2405 311.7938 16.8858 0.2078 333 +335 3 333.3605 312.0214 16.8832 0.292 334 +336 3 334.4839 312.2193 16.8796 0.3076 335 +337 3 335.5295 312.6804 16.8745 0.3323 336 +338 3 336.5065 313.2752 16.8673 0.2842 337 +339 3 337.5692 313.6997 16.8575 0.3076 338 +340 3 338.6309 314.1241 16.8435 0.3768 339 +341 3 339.7646 314.2259 16.8233 0.3795 340 +342 3 340.9074 314.2522 16.7956 0.3077 341 +343 3 342.0503 314.2762 16.7598 0.3188 342 +344 3 343.1817 314.441 16.7139 0.3256 343 +345 3 344.3188 314.4742 16.6193 0.2911 344 +346 3 345.4594 314.481 16.5016 0.2266 345 +347 3 346.5931 314.5657 16.3853 0.2237 346 +348 3 347.6925 314.8654 16.2886 0.2247 347 +349 3 348.4418 315.5095 16.1249 0.1949 348 +350 3 349.2781 316.2885 16.0264 0.1794 349 +351 3 350.1681 316.983 15.9793 0.1865 350 +352 3 351.2309 317.4074 15.9561 0.2545 351 +353 3 352.2982 317.8124 15.9497 0.2285 352 +354 3 353.4262 318.0 15.9568 0.232 353 +355 3 354.5553 318.1887 15.9765 0.2165 354 +356 3 355.6936 318.2539 15.9939 0.1798 355 +357 3 356.8376 318.2539 16.015 0.1503 356 +358 3 357.9816 318.2539 16.0453 0.1379 357 +359 3 359.1256 318.2539 16.0871 0.1384 358 +360 3 360.2696 318.2539 16.1421 0.1394 359 +361 3 361.4113 318.2677 16.213 0.1412 360 +362 3 362.5073 318.5594 16.3477 0.1446 361 +363 3 363.6032 318.8522 16.5278 0.1507 362 +364 3 364.6878 319.2103 16.711 0.1626 363 +365 3 365.77 319.5707 16.8895 0.182 364 +366 3 366.8614 319.915 17.0383 0.2313 365 +367 3 367.9527 320.2559 17.1591 0.2572 366 +368 3 369.075 320.4252 17.2603 0.2809 367 +369 3 370.2178 320.4824 17.3585 0.2137 368 +370 3 371.3607 320.5408 17.4678 0.1708 369 +371 3 372.4933 320.5442 17.65 0.1528 370 +372 3 373.6247 320.5442 17.8957 0.1633 371 +373 3 374.7561 320.574 18.184 0.1989 372 +374 3 375.8887 320.6369 18.4953 0.1869 373 +375 3 377.0144 320.7307 18.8135 0.1998 374 +376 3 378.0634 321.1803 19.1029 0.1676 375 +377 3 379.1147 321.6264 19.3627 0.1513 376 +378 3 380.197 321.988 19.6013 0.1397 377 +379 3 381.2803 322.3495 19.828 0.1417 378 +380 3 382.414 322.3758 20.0646 0.1454 379 +381 3 383.5512 322.3758 20.3107 0.153 380 +382 3 384.6689 322.2625 20.5736 0.1636 381 +383 3 385.7522 321.9594 20.8594 0.1995 382 +384 3 386.847 321.6699 21.1283 0.188 383 +385 3 387.959 321.4022 21.3314 0.2018 384 +386 3 389.071 321.1357 21.4758 0.1713 385 +387 3 390.1852 320.8748 21.5647 0.158 386 +388 3 391.2983 320.6129 21.6111 0.1528 387 +389 3 392.4229 320.4047 21.6288 0.1633 388 +390 3 393.552 320.217 21.6334 0.1988 389 +391 3 394.6846 320.0855 21.6348 0.1867 390 +392 3 395.8286 320.0855 21.6348 0.1994 391 +393 3 396.9726 320.0855 21.6348 0.1669 392 +394 3 398.1131 320.026 21.6348 0.15 393 +395 3 399.2514 319.9059 21.6348 0.1373 394 +396 3 400.3886 319.7858 21.6348 0.1373 395 +397 3 401.4914 319.4814 21.6348 0.1373 396 +398 3 402.5908 319.1657 21.6348 0.1374 397 +399 3 403.6295 318.6887 21.6348 0.1375 398 +400 3 404.69 318.302 21.6348 0.1376 399 +401 3 405.834 318.2825 21.6348 0.1379 400 +402 3 406.978 318.2642 21.6347 0.1385 401 +403 3 408.1151 318.1716 21.6347 0.1395 402 +404 3 409.2431 317.984 21.6347 0.1414 403 +405 3 410.3711 317.794 21.6346 0.145 404 +406 3 411.395 317.2827 21.6346 0.1515 405 +407 3 412.4177 316.7713 21.6345 0.1646 406 +408 3 413.5045 316.4155 21.6344 0.1828 407 +409 3 414.5959 316.0746 21.6342 0.2471 408 +410 3 415.7102 315.8206 21.634 0.2174 409 +411 3 416.8336 315.609 21.6336 0.1985 410 +412 3 417.9512 315.3676 21.6332 0.2173 411 +413 3 419.0518 315.0542 21.6326 0.219 412 +414 3 420.1523 314.7419 21.6317 0.2695 413 +415 3 421.294 314.6858 21.6304 0.2476 414 +416 3 422.4369 314.6286 21.6287 0.1952 415 +417 3 423.5774 314.632 21.6263 0.1553 416 +418 3 424.7157 314.751 21.6229 0.1471 417 +419 3 425.8529 314.8711 21.6182 0.1553 418 +420 3 426.9946 314.9409 21.6115 0.1717 419 +421 3 428.1374 314.9981 21.6023 0.1962 420 +422 3 429.278 315.0702 21.5898 0.27 421 +423 3 430.4071 315.2589 21.5716 0.2695 422 +424 3 431.5351 315.4477 21.5451 0.2486 423 +425 3 432.67 315.426 21.509 0.1928 424 +426 3 433.8071 315.3058 21.4646 0.1717 425 +427 3 434.9431 315.1926 21.406 0.1903 426 +428 3 436.0676 315.1262 21.2797 0.1735 427 +429 3 437.1922 315.0599 21.1121 0.1627 428 +430 3 438.2836 314.7499 20.9837 0.1582 429 +431 3 439.3852 314.4867 20.9423 0.1888 430 +432 3 440.4983 314.3026 20.9958 0.1708 431 +433 3 441.6137 314.1332 21.1076 0.1571 432 +434 3 442.7577 314.1332 21.1859 0.1505 433 +435 3 443.9017 314.1332 21.2205 0.1621 434 +436 3 445.0011 314.2957 21.181 0.1817 435 +437 3 446.0101 314.7865 21.0336 0.2271 436 +438 3 446.756 315.5392 20.8524 0.2673 437 +439 3 447.312 316.5322 20.7056 0.2122 438 +440 3 448.2993 316.8594 20.6018 0.168 439 +441 3 449.4433 316.88 20.5363 0.1471 440 +442 3 450.5873 316.88 20.5039 0.1553 441 +443 3 451.7313 316.88 20.4958 0.1717 442 +444 3 452.8753 316.88 20.4957 0.1962 443 +445 3 454.0193 316.88 20.4956 0.27 444 +446 3 455.1633 316.88 20.4954 0.2696 445 +447 3 456.3073 316.88 20.4952 0.2488 446 +448 3 457.4513 316.88 20.495 0.1925 447 +449 3 458.5896 316.9898 20.4945 0.1749 448 +450 3 459.7267 317.1099 20.4938 0.1781 449 +451 3 460.8638 317.2381 20.493 0.2385 450 +452 3 462.0021 317.3387 20.4922 0.201 451 +453 3 463.1415 317.309 20.4909 0.1708 452 +454 3 464.2272 316.9624 20.4875 0.1529 453 +455 3 465.2099 316.3755 20.4813 0.1635 454 +456 3 466.1823 315.7737 20.481 0.1993 455 +457 3 467.1547 315.1709 20.4929 0.1876 456 +458 3 468.1626 314.6744 20.4666 0.2011 457 +459 3 469.1922 314.2419 20.3896 0.1701 458 +460 3 470.3076 314.1332 20.3551 0.1558 459 +461 3 470.6519 313.5578 20.6896 0.1483 460 +462 3 471.6369 313.0499 20.9937 0.1568 461 +463 3 472.7397 312.7559 21.2426 0.178 462 +464 3 473.8837 312.7113 21.4381 0.1907 463 +465 3 474.9453 312.3017 21.6348 0.3432 464 +466 3 320.8966 309.2827 24.6196 0.1144 1 +467 3 321.7637 308.5379 25.1107 0.1757 466 +468 3 322.6297 307.7943 25.3082 0.2036 467 +469 3 323.4969 307.0496 25.5511 0.2843 468 +470 3 323.6719 306.5119 24.9391 0.2288 469 +471 3 324.1799 305.5132 24.7855 0.1797 470 +472 3 324.8766 304.6083 24.7292 0.1502 471 +473 3 325.5275 303.6679 24.6676 0.1376 472 +474 3 326.2024 302.7447 24.5963 0.1379 473 +475 3 326.8717 301.8169 24.5115 0.1384 474 +476 3 327.5352 300.8857 24.4096 0.1393 475 +477 3 328.1404 299.9282 24.2543 0.141 476 +478 3 328.8211 299.0542 24.0013 0.1441 477 +479 3 329.4056 298.1092 23.7276 0.1504 478 +480 3 329.6802 297.0202 23.4391 0.1591 479 +481 3 329.758 295.899 23.1208 0.1904 480 +482 3 329.8415 294.7813 22.8101 0.1738 481 +483 3 330.2282 293.706 22.5665 0.1626 482 +484 3 330.7579 292.6947 22.3702 0.1617 483 +485 3 331.466 291.8047 22.1903 0.1773 484 +486 3 331.8069 290.7133 22.0025 0.237 485 +487 3 331.8412 289.5727 21.7841 0.1982 486 +488 3 332.7335 289.0751 21.5118 0.1657 487 +489 3 332.7736 288.7513 21.0756 0.1428 488 +490 3 333.3273 288.1759 20.462 0.1475 489 +491 3 333.8775 287.9311 19.627 0.1567 490 +492 3 333.8775 287.3545 18.7409 0.1706 491 +493 3 333.8867 286.318 17.8479 0.2123 492 +494 3 333.9027 285.2095 17.0383 0.2121 493 +495 3 334.159 284.7931 16.4259 0.2444 494 +496 3 334.7882 283.8584 15.9317 0.2607 495 +497 3 335.3636 282.9101 15.4788 0.2731 496 +498 3 335.8544 281.8999 15.0519 0.2689 497 +499 3 336.3509 280.8978 14.6322 0.2789 498 +500 3 336.6735 279.8132 14.2713 0.2101 499 +501 3 337.0533 278.7402 13.9625 0.1641 500 +502 3 337.5223 277.7609 13.631 0.1399 501 +503 3 338.37 277.1008 13.3398 0.1422 502 +504 3 339.4397 276.7508 13.1303 0.1463 503 +505 3 340.2153 275.9408 12.9814 0.1545 504 +506 3 340.7335 274.9215 12.8726 0.1666 505 +507 3 341.5618 274.2179 12.7955 0.2048 506 +508 3 341.8169 273.2192 12.6634 0.1983 507 +509 3 342.6166 272.4242 12.5652 0.2183 508 +510 3 343.3224 271.5273 12.4902 0.2147 509 +511 3 343.9436 270.5709 12.4369 0.1765 510 +512 3 344.749 269.7884 12.4034 0.1441 511 +513 3 345.448 268.9064 12.3878 0.1271 512 +514 3 346.3357 268.2577 12.3878 0.1144 513 +515 3 347.379 267.7898 12.3878 0.1144 514 +516 3 323.4363 306.703 25.9192 0.2934 469 +517 3 323.8572 305.7855 26.3606 0.3062 516 +518 3 324.0975 304.7296 26.8408 0.2344 517 +519 3 323.8961 303.6336 27.3122 0.2221 518 +520 3 323.887 302.5319 27.7911 0.1852 519 +521 3 324.3686 301.5332 28.2327 0.1849 520 +522 3 325.1706 300.7313 28.5908 0.1972 521 +523 3 326.1979 300.2565 28.8826 0.2719 522 +524 3 327.3213 300.0895 29.1183 0.273 523 +525 3 328.1438 299.5198 29.5028 0.255 524 +526 3 328.495 298.5508 30.0082 0.2046 525 +527 3 329.1608 297.6471 30.4842 0.194 526 +528 3 330.1412 297.0842 30.9207 0.2295 527 +529 3 331.2624 297.0613 31.3328 0.257 528 +530 3 332.3675 297.3256 31.6859 0.265 529 +531 3 333.3913 297.1918 32.0961 0.2601 530 +532 3 334.2699 296.4653 32.3879 0.2316 531 +533 3 334.9438 295.541 32.5727 0.273 532 +534 3 335.6656 294.6532 32.6589 0.2361 533 +535 3 336.4321 293.8124 32.6351 0.2616 534 +536 3 336.6598 292.9795 32.5298 0.1966 535 +537 3 336.9846 291.8905 32.3778 0.1627 536 +538 3 337.4045 290.8311 32.2602 0.1373 537 +539 3 337.9742 289.8393 32.1782 0.1373 538 +540 3 338.521 288.836 32.128 0.1373 539 +541 3 339.0267 287.8201 32.1048 0.1374 540 +542 3 339.7806 286.9816 32.0986 0.1374 541 +543 3 340.1592 285.9039 32.0998 0.1376 542 +544 3 340.753 284.9269 32.1017 0.1378 543 +545 3 341.15 283.8539 32.1042 0.1383 544 +546 3 341.5732 282.7911 32.1073 0.1391 545 +547 3 342.0217 281.7386 32.1124 0.1407 546 +548 3 342.7046 280.8314 32.1199 0.1435 547 +549 3 343.3796 279.9082 32.13 0.1494 548 +550 3 343.9676 278.9278 32.1415 0.1571 549 +551 3 344.6277 277.9954 32.151 0.1868 550 +552 3 345.2249 277.031 32.1978 0.1671 551 +553 3 345.4846 275.9317 32.249 0.1503 552 +554 3 345.6596 274.8014 32.2728 0.1378 553 +555 3 345.7854 273.6677 32.2557 0.1383 554 +556 3 345.909 272.5569 32.1224 0.1391 555 +557 3 346.0062 271.4403 31.9234 0.1407 556 +558 3 346.0062 270.2963 31.7506 0.1435 557 +559 3 346.0062 269.1523 31.61 0.1494 558 +560 3 346.0062 268.0083 31.5045 0.1571 559 +561 3 346.0074 266.8643 31.4322 0.1867 560 +562 3 346.1103 265.7295 31.3544 0.1669 561 +563 3 346.2133 264.5946 31.2668 0.15 562 +564 3 346.235 263.4529 31.1987 0.1373 563 +565 3 346.235 262.3089 31.1618 0.1373 564 +566 3 346.235 261.1649 31.1598 0.1373 565 +567 3 346.235 260.0209 31.1945 0.1373 566 +568 3 346.235 258.8769 31.2662 0.1373 567 +569 3 346.2877 257.7398 31.3684 0.1373 568 +570 3 346.3986 256.6438 31.5403 0.1373 569 +571 3 346.2442 255.5662 31.8422 0.1373 570 +572 3 346.3643 254.429 32.1261 0.1373 571 +573 3 346.5393 253.2988 32.3994 0.1373 572 +574 3 346.6995 252.1708 32.6656 0.1373 573 +575 3 347.1285 251.2052 32.947 0.1373 574 +576 3 347.0141 251.0645 33.4916 0.1373 575 +577 3 347.5312 250.0898 34.0458 0.1373 576 +578 3 347.5575 249.5693 34.4996 0.1372 577 +579 3 347.6078 248.4265 34.8636 0.1372 578 +580 3 347.6078 247.2825 35.1478 0.1371 579 +581 3 348.0654 246.2563 35.3629 0.137 580 +582 3 348.0654 245.1615 35.6348 0.1368 581 +583 3 348.0654 244.0655 35.9789 0.1364 582 +584 3 348.2851 242.949 36.2715 0.1356 583 +585 3 348.8571 241.9812 36.5036 0.1342 584 +586 3 349.635 241.1449 36.6848 0.1313 585 +587 3 350.3489 240.2766 36.874 0.1271 586 +588 3 350.7069 239.2024 37.0009 0.1144 587 +589 3 351.4986 238.4931 37.163 0.1144 588 +590 3 337.4628 293.8215 34.4221 0.1144 535 +591 3 338.4913 294.1018 34.4868 0.1634 590 +592 3 339.5678 294.4278 34.4834 0.1836 591 +593 3 340.6111 294.1693 34.5086 0.2337 592 +594 3 341.5343 293.5012 34.5696 0.2645 593 +595 3 342.3386 292.713 34.711 0.28 594 +596 3 342.9254 291.7635 34.9261 0.2822 595 +597 3 343.4357 290.7453 35.1425 0.301 596 +598 3 343.9058 289.702 35.3424 0.2638 597 +599 3 344.5053 288.7342 35.5289 0.2016 598 +600 3 345.3484 287.978 35.7106 0.1677 599 +601 3 346.3277 287.3911 35.903 0.1675 600 +602 3 347.2452 286.7299 36.1561 0.2059 601 +603 3 348.0368 286.0847 36.5848 0.2036 602 +604 3 348.9429 285.4726 37.0656 0.2131 603 +605 3 349.8787 284.824 37.513 0.2776 604 +606 3 350.7996 284.292 38.017 0.2841 605 +607 3 351.661 283.5827 38.4306 0.2736 606 +608 3 352.5533 283.1503 38.5532 0.2489 607 +609 3 352.4321 282.6035 38.8987 0.2291 608 +610 3 353.3027 282.107 39.1938 0.1797 609 +611 3 354.4261 281.98 39.438 0.15 610 +612 3 355.5701 281.98 39.6449 0.1373 611 +613 3 356.658 281.7558 39.8908 0.1373 612 +614 3 357.611 281.1952 40.2077 0.1373 613 +615 3 358.5193 280.5145 40.4737 0.1373 614 +616 3 359.4185 279.8201 40.7498 0.1373 615 +617 3 360.4481 279.3488 41.0186 0.1373 616 +618 3 361.5429 279.0513 41.2877 0.1373 617 +619 3 362.6537 278.7974 41.5346 0.1373 618 +620 3 363.7131 278.389 41.7407 0.1374 619 +621 3 364.7667 277.992 41.9611 0.1375 620 +622 3 365.8352 277.6179 42.1775 0.1376 621 +623 3 366.8373 277.1077 42.399 0.1379 622 +624 3 367.7056 276.3893 42.6107 0.1385 623 +625 3 368.6506 275.7669 42.7756 0.1396 624 +626 3 369.5177 275.0725 42.9484 0.1414 625 +627 3 370.4146 274.3907 43.1032 0.1455 626 +628 3 371.3161 273.6906 43.213 0.1497 627 +629 3 372.3262 273.1872 43.2832 0.1737 628 +630 3 373.3227 272.6472 43.3261 0.1398 629 +631 3 374.382 272.367 43.3569 0.1144 630 +632 3 321.4468 312.5774 24.0949 0.1817 1 +633 3 322.5737 312.7742 24.1014 0.2141 632 +634 3 323.7005 312.9721 24.1104 0.3067 633 +635 3 324.8365 313.0396 24.1228 0.3209 634 +636 3 325.9565 313.2684 24.1396 0.4245 635 +637 3 327.0788 313.4869 24.1641 0.4706 636 +638 3 328.2022 313.7042 24.1989 0.464 637 +639 3 329.3233 313.9296 24.2457 0.4413 638 +640 3 330.4638 314.0291 24.3059 0.4495 639 +641 3 331.5312 314.4387 24.3849 0.4495 640 +642 3 332.7724 314.8494 24.0741 0.6864 641 +643 3 333.8878 314.9135 23.7039 0.4349 642 +644 3 334.9632 314.5703 23.5685 0.3997 643 +645 3 335.9974 314.3804 23.3076 0.3125 644 +646 3 337.0235 314.3575 22.9137 0.3714 645 +647 3 337.5326 313.9342 22.7556 0.3253 646 +648 3 338.5165 313.3622 22.6182 0.3076 647 +649 3 339.5827 313.0293 22.494 0.2892 648 +650 3 340.6924 312.9721 22.5014 0.2992 649 +651 3 341.8192 312.8325 22.5173 0.3328 650 +652 3 342.8843 312.415 22.502 0.3212 651 +653 3 343.9653 312.1015 22.3992 0.316 652 +654 3 345.0842 312.1095 22.1913 0.3411 653 +655 3 346.211 312.2182 21.9378 0.3331 654 +656 3 347.323 312.3452 21.6844 0.3548 655 +657 3 348.4155 312.018 21.4343 0.3318 656 +658 3 349.4714 311.6245 21.1487 0.3672 657 +659 3 350.5067 311.2767 20.7932 0.2829 658 +660 3 351.4448 310.6543 20.4232 0.2824 659 +661 3 352.2685 309.9313 20.0236 0.2121 660 +662 3 352.8748 308.9635 19.6633 0.1888 661 +663 3 353.5841 308.0895 19.3491 0.199 662 +664 3 354.4901 307.3917 19.0882 0.187 663 +665 3 355.4602 306.8322 18.8395 0.2 664 +666 3 356.5345 306.4993 18.5475 0.1679 665 +667 3 357.5766 306.0738 18.2447 0.1518 666 +668 3 358.5685 305.5041 17.9673 0.1407 667 +669 3 359.5626 304.9584 17.6739 0.1435 668 +670 3 360.5613 304.4596 17.3098 0.1494 669 +671 3 361.5589 303.9597 16.903 0.1571 670 +672 3 362.5565 303.4609 16.4769 0.1867 671 +673 3 363.5152 302.8957 16.0456 0.167 672 +674 3 364.4555 302.2986 15.63 0.15 673 +675 3 365.4256 301.6991 15.3383 0.1374 674 +676 3 366.4003 301.0997 15.1714 0.1374 675 +677 3 367.3247 300.427 15.1037 0.1376 676 +678 3 368.2399 299.7406 15.1094 0.1378 677 +679 3 369.2088 299.1835 15.2394 0.1383 678 +680 3 370.1881 298.6481 15.4568 0.1392 679 +681 3 371.1033 297.9617 15.6259 0.1408 680 +682 3 372.0162 297.273 15.7465 0.1437 681 +683 3 372.8376 296.4779 15.821 0.1497 682 +684 3 373.6693 295.6965 15.851 0.1576 683 +685 3 374.7195 295.2424 15.8378 0.1877 684 +686 3 375.7697 294.7894 15.7961 0.1688 685 +687 3 376.7512 294.2025 15.7411 0.1535 686 +688 3 377.7248 293.603 15.6727 0.1437 687 +689 3 378.5347 292.816 15.5396 0.1497 688 +690 3 379.3264 292.0083 15.3551 0.1577 689 +691 3 380.2095 291.2853 15.1679 0.1879 690 +692 3 381.0973 290.568 14.9898 0.1691 691 +693 3 382.0136 289.8827 14.8488 0.154 692 +694 3 382.9414 289.2146 14.7379 0.1446 693 +695 3 383.9321 288.6449 14.6483 0.1514 694 +696 3 384.9285 288.0832 14.562 0.1608 695 +697 3 385.9662 287.6005 14.4629 0.1935 696 +698 3 387.0038 287.1177 14.3445 0.18 697 +699 3 387.9579 286.5297 14.1254 0.1716 698 +700 3 388.8834 285.9085 13.8317 0.1901 699 +701 3 389.6784 285.1431 13.4744 0.1732 700 +702 3 390.4941 284.3721 13.1367 0.1621 701 +703 3 391.4436 283.7543 12.8921 0.1571 702 +704 3 392.5464 283.5049 12.7348 0.1868 703 +705 3 393.687 283.4523 12.6597 0.1671 704 +706 3 394.831 283.4523 12.6485 0.1503 705 +707 3 395.9704 283.3768 12.6824 0.1378 706 +708 3 397.1087 283.2567 12.7398 0.1383 707 +709 3 398.2447 283.1411 12.8142 0.1391 708 +710 3 399.3693 283.0759 12.9661 0.1407 709 +711 3 400.4938 283.0096 13.1692 0.1435 710 +712 3 401.5017 282.5314 13.3446 0.1494 711 +713 3 402.4764 281.9319 13.4726 0.1571 712 +714 3 403.3904 281.2478 13.5558 0.1867 713 +715 3 404.2839 280.5328 13.5971 0.167 714 +716 3 405.1247 279.7583 13.6004 0.15 715 +717 3 405.9461 278.9621 13.5794 0.1374 716 +718 3 406.8693 278.294 13.5449 0.1375 717 +719 3 407.8257 277.6648 13.4967 0.1376 718 +720 3 408.583 276.8251 13.4323 0.1379 719 +721 3 409.2694 275.9099 13.3501 0.1385 720 +722 3 410.0496 275.0897 13.2056 0.1396 721 +723 3 410.863 274.3049 12.9961 0.1415 722 +724 3 411.5105 273.368 12.7669 0.1452 723 +725 3 412.1443 272.4184 12.5245 0.1518 724 +726 3 412.5985 271.3694 12.2993 0.1652 725 +727 3 413.0526 270.3192 12.0854 0.1838 726 +728 3 413.2814 269.221 11.8129 0.2491 727 +729 3 413.4736 268.1147 11.4689 0.221 728 +730 3 413.7699 267.0313 11.0778 0.2062 729 +731 3 414.1028 265.9571 10.6638 0.226 730 +732 3 414.795 265.0842 10.2858 0.2627 731 +733 3 415.4447 264.1462 9.9812 0.2161 732 +734 3 415.8634 263.3042 9.1092 0.1144 733 +735 3 333.0035 315.0679 25.1376 0.3432 641 +736 3 333.9222 315.7394 25.3192 0.4998 735 +737 3 334.9392 316.2599 25.3838 0.5212 736 +738 3 335.9917 316.7061 25.4656 0.5322 737 +739 3 336.9904 317.2095 25.625 0.4627 738 +740 3 337.9719 317.7735 25.8067 0.3128 739 +741 3 338.8517 318.5033 25.9332 0.2518 740 +742 3 339.649 319.3167 25.9773 0.2294 741 +743 3 340.3354 320.2296 25.9561 0.2048 742 +744 3 341.0321 321.1197 25.9692 0.1915 743 +745 3 341.8249 321.9445 25.9458 0.2397 744 +746 3 342.5502 322.8174 25.8672 0.2032 745 +747 3 342.739 322.8746 25.7182 0.1748 746 +748 3 343.5352 322.4456 25.4198 0.1603 747 +749 3 344.4126 322.5336 25.393 0.1772 748 +750 3 344.9068 323.3287 25.6279 0.2249 749 +751 3 345.9959 323.5232 25.9155 0.2336 750 +752 3 347.1068 323.5243 26.0345 0.2939 751 +753 3 348.2496 323.5335 26.1082 0.3057 752 +754 3 349.3787 323.5907 26.067 0.2407 753 +755 3 350.4392 323.8206 25.8331 0.1985 754 +756 3 351.5752 323.8584 25.593 0.1982 755 +757 3 352.6769 323.5552 25.4074 0.2769 756 +758 3 353.8095 323.4099 25.2874 0.2666 757 +759 3 354.9157 323.1285 25.2111 0.3194 758 +760 3 356.0586 323.0713 25.1746 0.2969 759 +761 3 357.2014 323.1045 25.1619 0.3828 760 +762 3 358.3328 323.2601 25.1388 0.3795 761 +763 3 359.4414 323.4992 25.0979 0.3616 762 +764 3 360.5762 323.4683 25.1119 0.2717 763 +765 3 361.7031 323.2715 25.1234 0.266 764 +766 3 362.7086 322.902 25.1206 0.2748 765 +767 3 363.8046 322.8334 25.1208 0.3107 766 +768 3 364.9486 322.8334 25.1298 0.2829 767 +769 3 366.0926 322.8334 25.1468 0.2319 768 +770 3 367.2366 322.8334 25.1699 0.2489 769 +771 3 368.3806 322.8334 25.209 0.1966 770 +772 3 369.5189 322.8986 25.2718 0.1627 771 +773 3 370.6434 323.0976 25.3682 0.1373 772 +774 3 371.768 323.2955 25.4886 0.1373 773 +775 3 372.8834 323.5049 25.6495 0.1373 774 +776 3 373.9988 323.7142 25.8336 0.1373 775 +777 3 375.1382 323.7497 25.9843 0.1373 776 +778 3 376.2822 323.7497 26.094 0.1373 777 +779 3 377.4262 323.7497 26.1682 0.1373 778 +780 3 378.5702 323.7497 26.2156 0.1373 779 +781 3 379.7142 323.7497 26.2451 0.1373 780 +782 3 380.8399 323.6525 26.2696 0.1373 781 +783 3 381.9015 323.228 26.301 0.1373 782 +784 3 382.9632 322.8013 26.3455 0.1373 783 +785 3 384.0133 322.3472 26.4099 0.1373 784 +786 3 385.0635 321.8941 26.4994 0.1373 785 +787 3 386.1355 321.4937 26.6167 0.1374 786 +788 3 387.2085 321.0979 26.7624 0.1375 787 +789 3 388.2644 320.8428 27.0416 0.1376 788 +790 3 389.3158 320.6323 27.4499 0.1379 789 +791 3 390.4232 320.4104 27.8464 0.1384 790 +792 3 391.5432 320.1862 28.205 0.1394 791 +793 3 392.6723 320.0203 28.5174 0.1411 792 +794 3 393.8106 319.9002 28.7809 0.1444 793 +795 3 394.9477 319.78 29.0063 0.1503 794 +796 3 395.1365 319.7514 29.2505 0.1626 795 +797 3 396.1775 319.5958 29.6635 0.1789 796 +798 3 397.2403 319.4471 30.1703 0.2401 797 +799 3 398.3774 319.3259 30.6228 0.2038 798 +800 3 399.5145 319.2046 31.0299 0.1766 799 +801 3 400.559 318.8683 31.4787 0.1605 800 +802 3 401.5669 318.4484 31.9768 0.1929 801 +803 3 402.6537 318.143 32.4355 0.179 802 +804 3 403.7496 317.8512 32.8656 0.1698 803 +805 3 404.4864 317.1122 33.3519 0.1867 804 +806 3 405.3936 316.5288 33.7848 0.1669 805 +807 3 406.5284 316.3869 34.1127 0.15 806 +808 3 407.6495 316.1936 34.3689 0.1373 807 +809 3 408.7478 316.0025 34.6259 0.1373 808 +810 3 409.8792 315.982 34.897 0.1373 809 +811 3 411.0129 315.9648 35.1672 0.1373 810 +812 3 412.1569 315.9648 35.397 0.1373 811 +813 3 413.2849 315.9648 35.6622 0.1373 812 +814 3 414.4129 315.9648 35.9464 0.1373 813 +815 3 415.5408 315.8664 36.1992 0.1374 814 +816 3 416.67 315.6776 36.3969 0.1375 815 +817 3 417.7888 315.4603 36.559 0.1376 816 +818 3 418.8115 314.9489 36.7024 0.1379 817 +819 3 419.8343 314.4364 36.8357 0.1385 818 +820 3 420.8902 314.0257 37.0339 0.1395 819 +821 3 421.9461 313.6127 37.2943 0.1414 820 +822 3 423.0077 313.194 37.5785 0.1447 821 +823 3 424.0694 312.7742 37.8792 0.1517 822 +824 3 425.1584 312.7593 38.2794 0.1613 823 +825 3 426.2498 312.7593 38.7442 0.1946 824 +826 3 427.3778 312.7593 39.1647 0.1814 825 +827 3 428.5195 312.7593 39.5181 0.1778 826 +828 3 429.6624 312.7696 39.8185 0.1837 827 +829 3 430.7904 312.9572 40.0574 0.2486 828 +830 3 431.9183 313.1448 40.2511 0.2208 829 +831 3 433.036 313.3187 40.4748 0.2022 830 +832 3 434.148 313.4846 40.7663 0.2361 831 +833 3 435.2142 313.7889 41.1166 0.1966 832 +834 3 436.2278 314.2545 41.5122 0.1627 833 +835 3 437.3123 314.552 41.8782 0.1373 834 +836 3 438.4403 314.7407 42.1758 0.1373 835 +837 3 439.5557 314.9649 42.4267 0.1373 836 +838 3 440.6082 315.3585 42.7059 0.1374 837 +839 3 441.6744 315.7234 42.9937 0.1374 838 +840 3 442.7863 315.99 43.2432 0.1375 839 +841 3 443.8995 316.2565 43.475 0.1378 840 +842 3 445.0309 316.3515 43.7371 0.1382 841 +843 3 446.1646 316.4373 44.023 0.139 842 +844 3 447.1988 316.8239 44.3215 0.1404 843 +845 3 448.1586 317.436 44.6379 0.1431 844 +846 3 449.1802 317.905 45.0044 0.1479 845 +847 3 450.2326 318.2997 45.425 0.1574 846 +848 3 451.2634 318.779 45.834 0.1726 847 +849 3 452.2873 319.2904 46.2216 0.2127 848 +850 3 453.1476 319.9265 46.704 0.2285 849 +851 3 453.9163 320.6335 47.3122 0.1994 850 +852 3 454.5009 321.472 48.0035 0.1994 851 +853 3 455.3223 322.0291 48.7497 0.1669 852 +854 3 456.1826 322.7499 49.3542 0.15 853 +855 3 457.1321 323.2784 49.7977 0.1373 854 +856 3 457.7796 324.221 50.099 0.1373 855 +857 3 458.7165 324.6397 50.2989 0.1373 856 +858 3 459.8594 324.6844 50.4487 0.1374 857 +859 3 460.8524 324.9807 50.5957 0.1375 858 +860 3 461.2059 326.0274 50.7844 0.1376 859 +861 3 461.2059 327.1703 51.0311 0.1379 860 +862 3 461.4324 328.1129 51.4746 0.1384 861 +863 3 462.2424 328.7467 52.0615 0.1394 862 +864 3 462.8933 329.5624 52.7262 0.1412 863 +865 3 463.3589 330.4844 53.4198 0.1441 864 +866 3 463.4985 331.6193 53.954 0.1525 865 +867 3 463.5431 332.7621 54.3203 0.1525 866 +868 3 463.9538 333.8238 54.656 0.2288 867 +869 3 395.6352 320.0546 26.4169 0.1144 795 +870 3 396.6214 320.0855 25.7222 0.1374 869 +871 3 397.7642 320.0855 25.4841 0.1374 870 +872 3 398.9082 320.0855 25.3026 0.1376 871 +873 3 400.0385 320.2182 25.174 0.1378 872 +874 3 401.0269 320.7845 25.0933 0.1383 873 +875 3 402.0005 321.3839 25.0568 0.1391 874 +876 3 402.9751 321.9845 25.0608 0.1408 875 +877 3 403.9498 322.584 25.0661 0.1436 876 +878 3 404.8742 323.2555 25.0664 0.1496 877 +879 3 405.7905 323.9419 25.0535 0.1575 878 +880 3 406.7744 324.4716 25.0952 0.1875 879 +881 3 407.7719 324.9704 25.177 0.1685 880 +882 3 408.2238 324.9704 25.1266 0.1528 881 +883 3 409.3072 324.9704 24.8907 0.1425 882 +884 3 410.3917 324.9704 24.5152 0.1469 883 +885 3 411.5014 325.2014 24.1557 0.1556 884 +886 3 412.6145 325.4634 23.8286 0.1692 885 +887 3 413.7368 325.5813 23.5062 0.2066 886 +888 3 414.8647 325.5813 23.1819 0.2165 887 +889 3 415.9927 325.5813 22.8629 0.18 888 +890 3 417.1207 325.5813 22.5436 0.1506 889 +891 3 418.2487 325.5813 22.2198 0.1384 890 +892 3 419.387 325.5813 21.9522 0.1393 891 +893 3 420.531 325.5813 21.7621 0.141 892 +894 3 421.675 325.5813 21.6336 0.1441 893 +895 3 422.7927 325.3513 21.545 0.1506 894 +896 3 423.9058 325.0893 21.4773 0.1593 895 +897 3 424.8679 324.5436 21.4097 0.1908 896 +898 3 425.7018 323.7623 21.3271 0.1746 897 +899 3 426.6193 323.1136 21.1889 0.164 898 +900 3 427.5929 322.5577 20.9858 0.1643 899 +901 3 428.6248 322.0795 20.8054 0.1821 900 +902 3 429.675 321.6264 20.6705 0.2458 901 +903 3 430.7835 321.424 20.5779 0.2149 902 +904 3 431.9264 321.3668 20.5228 0.1946 903 +905 3 433.0692 321.3096 20.4996 0.2065 904 +906 3 434.0496 320.7318 20.496 0.2165 905 +907 3 435.0243 320.1324 20.496 0.1798 906 +908 3 436.1271 319.8441 20.496 0.1503 907 +909 3 437.2402 319.581 20.496 0.1379 908 +910 3 438.1955 319.0193 20.496 0.1384 909 +911 3 439.0432 318.2494 20.496 0.1398 910 +912 3 439.8486 317.4383 20.496 0.1398 911 +913 3 440.5281 316.5208 20.496 0.1525 912 +914 3 441.5119 315.9648 20.496 0.1144 913 +915 3 342.7115 324.0254 25.994 0.1144 746 +916 3 342.8625 325.158 26.0809 0.1947 915 +917 3 343.0135 326.2917 26.1216 0.1815 916 +918 3 343.5569 327.279 26.1589 0.1782 917 +919 3 344.1861 328.2342 26.191 0.1842 918 +920 3 345.075 328.9297 26.2193 0.2503 919 +921 3 346.0303 329.5589 26.2456 0.2203 920 +922 3 346.9546 330.2328 26.2729 0.2194 921 +923 3 347.8698 330.9192 26.308 0.1802 922 +924 3 348.8788 331.4477 26.3566 0.1751 923 +925 3 349.9164 331.9305 26.4202 0.1817 924 +926 3 350.8591 332.5665 26.4991 0.2301 925 +927 3 351.7262 333.2872 26.6409 0.2581 926 +928 3 352.5682 334.0137 26.8733 0.2671 927 +929 3 353.3953 334.7939 27.0957 0.2634 928 +930 3 354.2167 335.5901 27.2842 0.2414 929 +931 3 355.2189 336.1152 27.4426 0.2731 930 +932 3 356.2691 336.5682 27.5743 0.3242 931 +933 3 357.3364 336.9263 27.7354 0.341 932 +934 3 358.4141 337.234 27.9463 0.2931 933 +935 3 359.4723 337.639 28.1422 0.2453 934 +936 3 360.5224 338.0932 28.294 0.1861 935 +937 3 361.4582 338.7224 28.4052 0.1624 936 +938 3 362.2556 339.5415 28.4805 0.1577 937 +939 3 362.8676 340.5036 28.5258 0.1879 938 +940 3 363.1914 341.5995 28.5572 0.1692 939 +941 3 363.2749 342.7275 28.5933 0.1541 940 +942 3 363.7005 343.7903 28.6426 0.1449 941 +943 3 364.126 344.8519 28.7081 0.1519 942 +944 3 364.5756 345.901 28.8165 0.1617 943 +945 3 365.0252 346.95 28.959 0.1953 944 +946 3 365.198 347.871 29.1418 0.1834 945 +947 3 365.4073 348.9864 29.3611 0.1778 946 +948 3 365.484 350.1189 29.5831 0.2022 947 +949 3 365.484 351.2618 29.7892 0.1929 948 +950 3 365.484 352.4046 29.9737 0.2115 949 +951 3 365.6602 353.5257 30.1655 0.1867 950 +952 3 365.842 354.6469 30.3576 0.1994 951 +953 3 366.1223 355.752 30.5108 0.1669 952 +954 3 366.3957 356.8559 30.6158 0.15 953 +955 3 366.3706 357.9851 30.6356 0.1373 954 +956 3 366.2848 359.1165 30.6928 0.1373 955 +957 3 366.2859 359.5112 30.7644 0.1373 956 +958 3 366.2871 360.6506 30.851 0.1373 957 +959 3 366.3202 361.7877 31.0016 0.1373 958 +960 3 366.3328 362.8951 31.3214 0.1373 959 +961 3 366.2939 363.927 31.8262 0.1373 960 +962 3 365.9839 364.4086 32.5657 0.1373 961 +963 3 365.4954 365.4394 33.2189 0.1373 962 +964 3 365.0069 366.4701 33.7809 0.1373 963 +965 3 364.4841 367.4768 34.2569 0.1373 964 +966 3 363.8778 368.4252 34.6732 0.1373 965 +967 3 363.2715 369.3747 35.037 0.1373 966 +968 3 362.6983 370.3597 35.3083 0.1373 967 +969 3 362.1332 371.355 35.516 0.1373 968 +970 3 361.5875 372.3308 35.7319 0.1373 969 +971 3 361.0407 373.2666 36.0094 0.1373 970 +972 3 360.6643 374.1406 36.1704 0.1373 971 +973 3 360.5087 374.9735 36.0245 0.1373 972 +974 3 360.3943 375.8395 35.7773 0.1373 973 +975 3 360.4218 376.8073 35.8921 0.1373 974 +976 3 360.1083 377.7797 36.258 0.1373 975 +977 3 359.6519 378.7612 36.7674 0.1373 976 +978 3 359.2114 379.7348 37.3934 0.1373 977 +979 3 358.8042 380.7186 38.0601 0.1373 978 +980 3 358.517 381.7425 38.6674 0.1373 979 +981 3 358.2299 382.7675 39.1446 0.1373 980 +982 3 358.1544 382.9632 39.2692 0.1373 981 +983 3 357.8935 383.6427 38.9141 0.1373 982 +984 3 357.627 384.3565 38.2598 0.1373 983 +985 3 357.309 385.4548 37.7264 0.1373 984 +986 3 356.9623 386.545 37.3433 0.1373 985 +987 3 356.5734 387.6169 37.1462 0.1373 986 +988 3 356.1215 388.6443 37.1804 0.1373 987 +989 3 355.482 389.5732 37.3848 0.1373 988 +990 3 355.0621 390.5913 37.6295 0.1373 989 +991 3 355.2578 391.6667 37.9084 0.1373 990 +992 3 355.4911 392.7524 38.0724 0.1373 991 +993 3 355.3253 393.8735 38.2586 0.1373 992 +994 3 355.1319 394.9969 38.4933 0.1373 993 +995 3 354.9386 396.1203 38.7912 0.1373 994 +996 3 354.9958 397.2494 39.1821 0.1373 995 +997 3 354.8105 398.3625 39.6682 0.1373 996 +998 3 354.1721 399.2137 40.2937 0.1373 997 +999 3 353.4182 399.8303 41.1026 0.1373 998 +1000 3 352.5694 400.3966 42.0025 0.1373 999 +1001 3 352.6895 400.5956 42.889 0.1373 1000 +1002 3 353.0487 401.1916 43.9474 0.1373 1001 +1003 3 353.234 401.9696 44.9817 0.1373 1002 +1004 3 353.0704 403.101 45.7346 0.1373 1003 +1005 3 352.8782 404.229 46.244 0.1373 1004 +1006 3 352.7066 405.3592 46.585 0.1373 1005 +1007 3 352.4996 406.4815 46.8042 0.1372 1006 +1008 3 352.2513 407.5992 46.9311 0.1372 1007 +1009 3 351.9871 408.71 47.042 0.1371 1008 +1010 3 351.6301 409.79 47.2139 0.137 1009 +1011 3 351.2744 410.871 47.4342 0.1368 1010 +1012 3 350.7882 411.8892 47.693 0.1364 1011 +1013 3 350.1818 412.8513 47.9909 0.1356 1012 +1014 3 349.5938 413.8226 48.3087 0.1342 1013 +1015 3 349.087 414.8407 48.6259 0.1313 1014 +1016 3 348.5814 415.8589 48.9292 0.1271 1015 +1017 3 348.0014 416.8221 49.2388 0.1144 1016 +1018 3 347.3905 417.7602 49.9458 0.1144 1017 +1019 3 365.4359 347.2532 28.7655 0.2288 945 +1020 3 366.3557 347.9304 28.6387 0.2291 1019 +1021 3 367.232 348.6569 28.5816 0.1796 1020 +1022 3 368.0282 349.4783 28.5368 0.1499 1021 +1023 3 368.7432 350.3614 28.504 0.1372 1022 +1024 3 369.3129 351.3533 28.4822 0.1371 1023 +1025 3 369.8746 352.3497 28.4701 0.137 1024 +1026 3 370.4158 353.3576 28.4668 0.1368 1025 +1027 3 370.9637 354.362 28.4668 0.1364 1026 +1028 3 371.5334 355.3527 28.4668 0.1356 1027 +1029 3 372.0826 356.356 28.4668 0.1342 1028 +1030 3 372.5367 357.4062 28.4668 0.1313 1029 +1031 3 372.9932 358.4552 28.4668 0.1271 1030 +1032 3 373.5366 359.4574 28.4668 0.1144 1031 +1033 3 374.1852 360.3829 28.4668 0.1144 1032 +1034 3 332.0231 312.8451 24.5658 0.2943 641 +1035 3 332.4693 311.7961 24.7418 0.1885 1034 +1036 3 333.3216 311.1325 24.9148 0.138 1035 +1037 3 333.9977 310.215 25.0884 0.1386 1036 +1038 3 334.7401 309.3342 25.4632 0.1397 1037 +1039 3 335.6279 308.6215 25.7694 0.1419 1038 +1040 3 336.2982 307.6982 26.0078 0.1457 1039 +1041 3 336.5831 307.5335 26.2356 0.1534 1040 +1042 3 337.5132 306.997 26.535 0.1646 1041 +1043 3 338.3266 306.2053 26.7405 0.2006 1042 +1044 3 339.0553 305.3347 26.7925 0.1932 1043 +1045 3 339.7188 304.4344 26.7166 0.1966 1044 +1046 3 340.4224 303.5352 26.6058 0.2342 1045 +1047 3 341.0916 302.6074 26.4855 0.2656 1046 +1048 3 341.8672 301.7678 26.3703 0.2813 1047 +1049 3 342.6566 300.9395 26.2869 0.2882 1048 +1050 3 343.351 300.0312 26.237 0.2942 1049 +1051 3 344.0683 299.14 26.1996 0.3386 1050 +1052 3 344.8302 298.3358 26.0726 0.2591 1051 +1053 3 345.6241 297.5189 26.0098 0.2107 1052 +1054 3 346.2602 296.5877 26.0417 0.2129 1053 +1055 3 346.9981 295.7148 26.0903 0.2281 1054 +1056 3 347.49 294.9175 25.9948 0.2019 1055 +1057 3 348.221 294.1396 26.0272 0.1892 1056 +1058 3 348.8525 293.2072 26.102 0.22 1057 +1059 3 349.5172 292.2966 26.2623 0.2417 1058 +1060 3 350.2116 291.394 26.457 0.225 1059 +1061 3 350.6166 290.3895 26.7091 0.2416 1060 +1062 3 350.5353 289.2901 27.0135 0.2708 1061 +1063 3 350.5594 288.2102 27.316 0.2185 1062 +1064 3 350.7184 287.1223 27.5274 0.1797 1063 +1065 3 350.6703 285.9966 27.5991 0.1692 1064 +1066 3 350.453 284.8789 27.6177 0.1946 1065 +1067 3 350.3134 283.7589 27.6427 0.2522 1066 +1068 3 350.358 282.6275 27.6369 0.3087 1067 +1069 3 350.6326 281.5327 27.5997 0.3144 1068 +1070 3 351.1188 280.4996 27.583 0.2335 1069 +1071 3 351.7434 279.5456 27.5947 0.1844 1070 +1072 3 352.4046 278.612 27.6233 0.1754 1071 +1073 3 352.9652 277.6294 27.6333 0.2186 1072 +1074 3 353.4308 276.6066 27.7099 0.2361 1073 +1075 3 353.9696 275.6777 27.9456 0.2291 1074 +1076 3 354.7178 274.8643 28.2293 0.1797 1075 +1077 3 355.5792 274.2317 28.5886 0.15 1076 +1078 3 356.1958 273.3817 28.8075 0.1373 1077 +1079 3 356.9337 272.5431 28.936 0.1373 1078 +1080 3 357.8318 271.8464 29.0251 0.1373 1079 +1081 3 358.3637 270.9175 29.1382 0.1373 1080 +1082 3 358.9243 269.7575 29.2569 0.1373 1081 +1083 3 359.3327 268.6924 29.3633 0.1373 1082 +1084 3 359.9573 267.7704 29.5509 0.1373 1083 +1085 3 360.3875 266.711 29.7066 0.1373 1084 +1086 3 360.8679 265.6723 29.8284 0.1373 1085 +1087 3 361.2924 264.6106 29.92 0.1373 1086 +1088 3 361.9399 263.668 29.9961 0.1373 1087 +1089 3 362.6858 262.8054 30.0905 0.1373 1088 +1090 3 363.2017 262.2311 30.2098 0.1373 1089 +1091 3 364.1764 261.6683 30.3262 0.1373 1090 +1092 3 365.0676 260.9693 30.4268 0.1373 1091 +1093 3 365.8809 260.1902 30.5645 0.1373 1092 +1094 3 366.5845 259.2945 30.667 0.1373 1093 +1095 3 367.4402 258.5577 30.723 0.1373 1094 +1096 3 367.7342 257.3748 31.3272 0.1144 1095 +1097 3 367.9093 256.272 31.7187 0.1373 1096 +1098 3 368.7123 255.4792 31.8564 0.1373 1097 +1099 3 369.2649 254.4988 32.0452 0.1373 1098 +1100 3 369.8174 253.5665 32.3655 0.1373 1099 +1101 3 370.243 252.5048 32.65 0.1373 1100 +1102 3 370.4226 251.3768 32.9098 0.1373 1101 +1103 3 370.4833 250.2912 33.2478 0.1372 1102 +1104 3 370.7018 249.201 33.5787 0.1372 1103 +1105 3 371.1067 248.1347 33.8458 0.1371 1104 +1106 3 371.7211 247.2047 34.1062 0.137 1105 +1107 3 372.4349 246.3272 34.3622 0.1368 1106 +1108 3 373.063 245.4132 34.6427 0.1364 1107 +1109 3 373.6624 244.4659 34.9261 0.1356 1108 +1110 3 374.0731 243.4066 35.1462 0.1342 1109 +1111 3 374.7652 242.528 35.3024 0.1313 1110 +1112 3 375.3624 241.5682 35.4004 0.1271 1111 +1113 3 375.8784 240.5683 35.453 0.1144 1112 +1114 3 376.8988 240.0947 35.4738 0.1144 1113 +1115 3 367.5638 258.3781 30.7236 0.1373 1095 +1116 3 368.3039 257.5647 30.641 0.1373 1115 +1117 3 369.4273 257.4892 30.5648 0.1373 1116 +1118 3 370.5576 257.3966 30.4968 0.1373 1117 +1119 3 371.6456 257.0431 30.4478 0.1373 1118 +1120 3 372.706 256.6152 30.4184 0.1373 1119 +1121 3 373.7448 256.137 30.4063 0.1373 1120 +1122 3 374.8636 255.9002 30.4063 0.1373 1121 +1123 3 375.9138 255.4575 30.4066 0.1373 1122 +1124 3 376.9022 254.8832 30.4066 0.1373 1123 +1125 3 377.9135 254.3501 30.4069 0.1373 1124 +1126 3 378.926 253.8181 30.4072 0.1373 1125 +1127 3 379.7119 253.0185 30.4077 0.1373 1126 +1128 3 380.5253 252.2223 30.4086 0.1373 1127 +1129 3 381.4268 251.5187 30.4094 0.1373 1128 +1130 3 382.3374 250.8849 30.4108 0.1373 1129 +1131 3 382.9529 250.0304 30.4128 0.1373 1130 +1132 3 383.6129 249.1243 30.4156 0.1373 1131 +1133 3 384.5888 248.5294 30.4195 0.1373 1132 +1134 3 385.3747 247.7481 30.4248 0.1373 1133 +1135 3 386.06 246.8374 30.4324 0.1373 1134 +1136 3 386.9351 246.119 30.4427 0.1373 1135 +1137 3 387.9007 245.5047 30.4567 0.1373 1136 +1138 3 388.8364 244.848 30.4777 0.1373 1137 +1139 3 389.7516 244.1616 30.5082 0.1373 1138 +1140 3 390.7035 243.5313 30.5488 0.1373 1139 +1141 3 391.7411 243.0657 30.5978 0.1373 1140 +1142 3 392.8507 242.8415 30.6527 0.1373 1141 +1143 3 393.4376 242.3495 30.8372 0.1373 1142 +1144 3 394.2224 241.6174 31.0038 0.1373 1143 +1145 3 395.2623 241.1438 31.1094 0.1373 1144 +1146 3 396.2999 240.661 31.1536 0.1373 1145 +1147 3 397.3329 240.1714 31.1338 0.1373 1146 +1148 3 398.1463 239.4564 30.9792 0.1373 1147 +1149 3 398.4449 238.3718 30.7936 0.1373 1148 +1150 3 398.819 237.3228 30.5642 0.1373 1149 +1151 3 399.7708 236.7817 30.2946 0.1373 1150 +1152 3 400.7604 236.2589 29.9715 0.1373 1151 +1153 3 401.6939 235.6057 29.6786 0.1373 1152 +1154 3 402.6056 234.9524 29.36 0.1373 1153 +1155 3 403.4716 234.2191 29.0632 0.1373 1154 +1156 3 404.2999 233.4801 28.7244 0.1373 1155 +1157 3 405.294 232.9802 28.4094 0.1373 1156 +1158 3 406.374 232.6072 28.1529 0.1373 1157 +1159 3 407.399 232.1222 27.9094 0.1374 1158 +1160 3 408.3645 231.5216 27.6863 0.1375 1159 +1161 3 409.2649 230.8295 27.5073 0.1376 1160 +1162 3 410.1686 230.1636 27.358 0.1379 1161 +1163 3 411.2165 229.7289 27.1849 0.1384 1162 +1164 3 412.2152 229.2221 26.9655 0.1393 1163 +1165 3 413.1602 228.5769 26.7586 0.1411 1164 +1166 3 414.0754 227.918 26.5127 0.1444 1165 +1167 3 414.8739 227.1892 26.1594 0.1503 1166 +1168 3 415.8062 226.6195 25.8486 0.1624 1167 +1169 3 416.8061 226.1379 25.5387 0.1787 1168 +1170 3 417.5234 225.4801 25.1207 0.2396 1169 +1171 3 418.6514 225.4469 24.7748 0.2028 1170 +1172 3 419.7942 225.4298 24.534 0.1748 1171 +1173 3 420.9371 225.3726 24.3832 0.1571 1172 +1174 3 422.0754 225.2559 24.2952 0.1867 1173 +1175 3 423.2068 225.3463 24.2638 0.1669 1174 +1176 3 424.3416 225.4469 24.2764 0.15 1175 +1177 3 425.4833 225.4092 24.3018 0.1373 1176 +1178 3 426.3974 224.8006 24.3358 0.1373 1177 +1179 3 427.3892 224.2309 24.3867 0.1373 1178 +1180 3 428.4623 223.8328 24.4605 0.1373 1179 +1181 3 429.3729 223.1486 24.5585 0.1373 1180 +1182 3 429.9976 222.2323 24.679 0.1373 1181 +1183 3 430.899 221.785 24.8186 0.1373 1182 +1184 3 431.1313 221.3468 25.2506 0.1373 1183 +1185 3 432.0053 221.054 25.6504 0.1373 1184 +1186 3 433.1241 220.8355 25.9212 0.1373 1185 +1187 3 434.2475 220.6307 26.0951 0.1373 1186 +1188 3 435.3755 220.4419 26.2022 0.1373 1187 +1189 3 436.5046 220.2543 26.2505 0.1373 1188 +1190 3 437.6361 220.0896 26.2489 0.1373 1189 +1191 3 438.7686 219.926 26.2534 0.1373 1190 +1192 3 439.9069 219.8425 26.2745 0.1373 1191 +1193 3 441.0509 219.8242 26.3078 0.1373 1192 +1194 3 442.1949 219.8047 26.3522 0.1373 1193 +1195 3 443.3378 219.8013 26.4245 0.1373 1194 +1196 3 444.4806 219.8013 26.5224 0.1373 1195 +1197 3 445.62 219.775 26.6415 0.1374 1196 +1198 3 446.7354 219.5668 26.7979 0.1375 1197 +1199 3 447.8508 219.3574 26.9741 0.1377 1198 +1200 3 448.9742 219.1458 27.1079 0.138 1199 +1201 3 450.0988 218.933 27.1974 0.1387 1200 +1202 3 451.0998 218.4514 27.2481 0.1399 1201 +1203 3 451.9933 217.7375 27.2663 0.1421 1202 +1204 3 452.6636 216.8475 27.2578 0.1461 1203 +1205 3 453.1464 215.8099 27.2304 0.1541 1204 +1206 3 453.6795 214.8009 27.1897 0.166 1205 +1207 3 454.279 213.8262 27.1342 0.203 1206 +1208 3 454.8441 212.832 27.063 0.1982 1207 +1209 3 455.3898 211.8276 26.9763 0.2025 1208 +1210 3 456.0968 211.0131 26.7796 0.2613 1209 +1211 3 457.0577 210.4411 26.5315 0.238 1210 +1212 3 458.1171 210.0098 26.3211 0.265 1211 +1213 3 459.1673 209.5556 26.1445 0.2028 1212 +1214 3 460.2506 209.2696 25.9824 0.1748 1213 +1215 3 461.3878 209.2696 25.8106 0.157 1214 +1216 3 462.5249 209.2696 25.6404 0.1867 1215 +1217 3 463.6655 209.2204 25.4837 0.1669 1216 +1218 3 464.8061 209.1598 25.3389 0.15 1217 +1219 3 465.9054 208.9596 25.217 0.1372 1218 +1220 3 466.8973 208.3888 25.1356 0.1372 1219 +1221 3 467.9189 207.8991 25.0884 0.1371 1220 +1222 3 469.0434 207.6875 25.0644 0.137 1221 +1223 3 470.1668 207.4758 25.0538 0.1368 1222 +1224 3 471.3063 207.3912 25.0508 0.1364 1223 +1225 3 472.4491 207.334 25.0508 0.1356 1224 +1226 3 473.5908 207.2665 25.0508 0.1342 1225 +1227 3 474.7291 207.1464 25.0508 0.1313 1226 +1228 3 475.8662 207.0274 25.0508 0.1271 1227 +1229 3 477.008 206.9793 25.0508 0.1144 1228 +1230 3 478.152 206.9793 25.0508 0.1144 1229 +1231 3 314.2271 313.1517 24.2741 0.1144 1 +1232 3 313.1437 313.5189 24.4131 0.139 1231 +1233 3 312.5408 314.2671 24.495 0.1405 1232 +1234 3 312.5408 315.4111 24.5594 0.1432 1233 +1235 3 312.5408 316.5494 24.6356 0.1483 1234 +1236 3 312.074 317.5023 24.7004 0.1576 1235 +1237 3 311.9688 318.6051 24.7414 0.1754 1236 +1238 3 311.708 319.6714 24.648 0.2058 1237 +1239 3 311.5936 320.3989 24.593 0.2751 1238 +1240 3 311.3179 321.4754 24.6357 0.3403 1239 +1241 3 310.9438 322.5405 24.7031 0.4256 1240 +1242 3 310.4324 323.5598 24.7417 0.5272 1241 +1243 3 309.8879 324.5642 24.7329 0.5325 1242 +1244 3 309.5344 325.611 24.6248 0.5163 1243 +1245 3 309.1077 326.6532 24.4721 0.3839 1244 +1246 3 308.5551 327.653 24.3354 0.2916 1245 +1247 3 308.038 328.6735 24.2353 0.292 1246 +1248 3 307.6525 329.7477 24.178 0.3754 1247 +1249 3 307.2933 330.8334 24.161 0.3583 1248 +1250 3 306.8974 331.9064 24.1798 0.3586 1249 +1251 3 306.4273 332.9486 24.2193 0.3181 1250 +1252 3 305.8209 333.9153 24.2733 0.3284 1251 +1253 3 305.0945 334.7973 24.3454 0.2764 1252 +1254 3 304.2674 335.581 24.4509 0.2961 1253 +1255 3 303.3625 336.2308 24.6352 0.3409 1254 +1256 3 302.4759 336.9355 24.8252 0.3842 1255 +1257 3 301.5287 337.5715 24.9744 0.3138 1256 +1258 3 300.5974 338.2362 25.0797 0.229 1257 +1259 3 299.7383 338.9912 25.1456 0.1921 1258 +1260 3 299.1915 339.9957 25.1842 0.2259 1259 +1261 3 298.8231 340.8754 24.8543 0.1144 1260 +1262 3 298.3884 341.9141 24.171 0.1524 1261 +1263 3 297.9113 342.9266 23.8685 0.1656 1262 +1264 3 297.1151 343.748 23.5646 0.1882 1263 +1265 3 296.3246 344.5682 23.2375 0.239 1264 +1266 3 295.5673 345.3839 22.8071 0.2905 1265 +1267 3 294.8614 346.227 22.2917 0.2499 1266 +1268 3 294.2391 347.1171 21.7059 0.2634 1267 +1269 3 293.539 347.9041 21.0522 0.2 1268 +1270 3 292.8045 348.6466 20.3553 0.169 1269 +1271 3 292.2931 349.6705 19.8185 0.1495 1270 +1272 3 291.7818 350.6932 19.4205 0.1572 1271 +1273 3 291.4283 351.78 19.125 0.187 1272 +1274 3 291.0874 352.8725 18.896 0.1675 1273 +1275 3 290.7728 353.9582 18.6484 0.1511 1274 +1276 3 290.4696 355.0427 18.3441 0.1392 1275 +1277 3 290.0967 356.0917 17.9619 0.1409 1276 +1278 3 289.6894 357.1248 17.5257 0.1441 1277 +1279 3 289.1288 358.0834 17.0724 0.1497 1278 +1280 3 288.5282 359.0215 16.6324 0.1608 1279 +1281 3 287.7858 359.8921 16.3183 0.1788 1280 +1282 3 287.0536 360.7684 16.1107 0.2248 1281 +1283 3 286.6853 361.8518 15.9863 0.2482 1282 +1284 3 286.3169 362.934 15.92 0.2489 1283 +1285 3 286.095 364.054 15.8872 0.2291 1284 +1286 3 285.9073 365.1831 15.8661 0.1797 1285 +1287 3 285.7197 366.3111 15.8359 0.1501 1286 +1288 3 285.5321 367.4402 15.7924 0.1376 1287 +1289 3 285.3433 368.5682 15.7331 0.1378 1288 +1290 3 284.9715 369.6481 15.6569 0.1383 1289 +1291 3 284.2485 370.5199 15.5532 0.1391 1290 +1292 3 283.9602 371.5815 15.3551 0.1407 1291 +1293 3 283.9843 372.6958 15.0967 0.1436 1292 +1294 3 284.2314 373.802 14.8695 0.1495 1293 +1295 3 284.5997 374.8854 14.6664 0.1573 1294 +1296 3 285.0516 375.9298 14.4805 0.1872 1295 +1297 3 285.0368 376.9057 14.2721 0.1679 1296 +1298 3 284.4567 377.8724 14.0153 0.1518 1297 +1299 3 283.9397 378.8596 13.7167 0.1407 1298 +1300 3 283.8012 379.975 13.3816 0.1435 1299 +1301 3 283.6617 381.0904 13.0329 0.1494 1300 +1302 3 283.1938 382.1315 12.7602 0.157 1301 +1303 3 282.711 383.1691 12.5582 0.1867 1302 +1304 3 282.6206 384.2959 12.4102 0.1669 1303 +1305 3 282.6023 385.4399 12.2949 0.1498 1304 +1306 3 282.56 386.5793 12.1888 0.137 1305 +1307 3 282.2683 387.6753 12.0266 0.1368 1306 +1308 3 281.9754 388.7712 11.811 0.1364 1307 +1309 3 281.5853 389.8443 11.5811 0.1356 1308 +1310 3 281.1952 390.9174 11.3487 0.1342 1309 +1311 3 280.447 391.7525 11.1131 0.1313 1310 +1312 3 279.7869 392.5888 10.8051 0.1271 1311 +1313 3 279.4048 393.5829 10.5699 0.1144 1312 +1314 3 279.3797 394.7269 10.248 0.1144 1313 +1315 3 298.679 340.1558 25.1855 0.2503 1260 +1316 3 297.5876 340.4979 25.1624 0.2527 1315 +1317 3 296.4962 340.8388 25.1275 0.2361 1316 +1318 3 295.5032 341.4051 25.099 0.1933 1317 +1319 3 294.5114 341.9759 25.0771 0.1726 1318 +1320 3 293.611 342.6795 25.0616 0.192 1319 +1321 3 292.7176 343.3945 25.0535 0.1766 1320 +1322 3 291.8458 344.1358 25.0509 0.1683 1321 +1323 3 290.9753 344.8782 25.0508 0.1692 1322 +1324 3 290.0623 345.5669 25.0508 0.2067 1323 +1325 3 289.1471 346.2533 25.0509 0.2167 1324 +1326 3 288.3441 347.0679 25.0509 0.1802 1325 +1327 3 287.5478 347.8893 25.051 0.1511 1326 +1328 3 286.548 348.4395 25.051 0.1393 1327 +1329 3 285.5401 348.9806 25.0511 0.141 1328 +1330 3 284.721 349.7734 25.0513 0.1441 1329 +1331 3 283.9248 350.5948 25.0515 0.1504 1330 +1332 3 283.1057 351.3922 25.0517 0.159 1331 +1333 3 282.2843 352.1884 25.0521 0.1903 1332 +1334 3 281.5887 353.0956 25.0526 0.1735 1333 +1335 3 280.9023 354.0108 25.0533 0.1626 1334 +1336 3 280.0901 354.815 25.0544 0.1581 1335 +1337 3 279.2676 355.6113 25.0558 0.1886 1336 +1338 3 278.3569 356.3022 25.0578 0.1704 1337 +1339 3 277.4417 356.9886 25.0606 0.1564 1338 +1340 3 276.4545 357.5652 25.0645 0.149 1339 +1341 3 275.4626 358.1349 25.0699 0.1595 1340 +1342 3 274.6229 358.9083 25.0775 0.1764 1341 +1343 3 273.8015 359.7033 25.0882 0.2204 1342 +1344 3 272.9138 360.4252 25.1031 0.2396 1343 +1345 3 272.0203 361.1391 25.1234 0.2353 1344 +1346 3 271.1486 361.8792 25.1527 0.1918 1345 +1347 3 270.278 362.6228 25.1949 0.1698 1346 +1348 3 269.6602 363.5815 25.2526 0.1869 1347 +1349 3 269.0608 364.555 25.3268 0.1672 1348 +1350 3 268.3641 365.46 25.4212 0.1505 1349 +1351 3 267.799 366.4209 25.6209 0.1383 1350 +1352 3 267.172 367.3418 25.8752 0.1391 1351 +1353 3 266.3507 368.1381 26.0968 0.1407 1352 +1354 3 265.535 368.94 26.2906 0.1435 1353 +1355 3 264.7388 369.7614 26.4621 0.1494 1354 +1356 3 263.9791 370.6034 26.6425 0.1571 1355 +1357 3 263.3168 371.4968 26.8944 0.1867 1356 +1358 3 262.54 372.3056 27.1623 0.1669 1357 +1359 3 261.658 373.0321 27.4023 0.15 1358 +1360 3 260.8023 373.7711 27.6526 0.1373 1359 +1361 3 259.9683 374.5181 27.9304 0.1373 1360 +1362 3 259.0702 375.2183 28.1478 0.1373 1361 +1363 3 258.155 375.9035 28.2918 0.1373 1362 +1364 3 257.2078 376.5453 28.3847 0.1373 1363 +1365 3 256.2526 377.1734 28.4402 0.1373 1364 +1366 3 255.3797 377.909 28.4634 0.1373 1365 +1367 3 254.532 378.6789 28.4668 0.1373 1366 +1368 3 253.7884 379.5437 28.4668 0.1373 1367 +1369 3 253.0734 380.4372 28.4668 0.1374 1368 +1370 3 252.22 381.1911 28.4668 0.1375 1369 +1371 3 251.3265 381.9061 28.4668 0.1377 1370 +1372 3 250.5303 382.7241 28.4668 0.138 1371 +1373 3 249.7604 383.5706 28.4668 0.1386 1372 +1374 3 248.9104 384.3337 28.4668 0.1396 1373 +1375 3 248.0398 385.0761 28.4668 0.1417 1374 +1376 3 247.3431 385.9764 28.4668 0.1453 1375 +1377 3 246.6853 386.9122 28.4665 0.1528 1376 +1378 3 245.9371 387.776 28.4665 0.1633 1377 +1379 3 245.1672 388.6225 28.4665 0.1988 1378 +1380 3 244.3973 389.4691 28.4662 0.1867 1379 +1381 3 243.6285 390.3156 28.4662 0.1994 1380 +1382 3 243.0005 391.2686 28.4659 0.1669 1381 +1383 3 242.401 392.2433 28.4654 0.15 1382 +1384 3 241.7787 393.202 28.4648 0.1373 1383 +1385 3 241.1495 394.1583 28.4642 0.1373 1384 +1386 3 240.4024 395.014 28.4631 0.1373 1385 +1387 3 239.9918 396.0494 28.4617 0.1373 1386 +1388 3 239.9918 396.356 28.4598 0.1373 1387 +1389 3 239.8076 397.4817 28.457 0.1373 1388 +1390 3 239.5822 398.6028 28.453 0.1373 1389 +1391 3 239.3683 399.7262 28.4474 0.1373 1390 +1392 3 239.2493 400.8645 28.4396 0.1373 1391 +1393 3 239.1292 402.0016 28.429 0.1373 1392 +1394 3 238.9587 403.1319 28.4138 0.1373 1393 +1395 3 238.7459 404.2564 28.3928 0.1373 1394 +1396 3 238.5183 405.3764 28.3632 0.1373 1395 +1397 3 238.2037 406.4769 28.3212 0.1373 1396 +1398 3 237.8902 407.5763 28.264 0.1373 1397 +1399 3 237.4704 408.6402 28.1828 0.1373 1398 +1400 3 237.0368 409.6984 28.079 0.1373 1399 +1401 3 236.705 410.7772 27.9042 0.1373 1400 +1402 3 236.4019 411.8606 27.6632 0.1373 1401 +1403 3 236.1296 412.9668 27.4333 0.1373 1402 +1404 3 235.8676 414.0811 27.236 0.1373 1403 +1405 3 235.5473 415.1645 27.0337 0.1374 1404 +1406 3 235.1458 416.2078 26.7863 0.1374 1405 +1407 3 234.5955 417.1836 26.5633 0.1376 1406 +1408 3 233.9091 418.0988 26.4044 0.1378 1407 +1409 3 233.1152 418.9099 26.2921 0.1383 1408 +1410 3 232.3853 419.7759 26.2189 0.1392 1409 +1411 3 232.2217 420.8799 26.1805 0.1408 1410 +1412 3 232.2057 422.0227 26.1659 0.1437 1411 +1413 3 232.2057 423.1667 26.1566 0.1497 1412 +1414 3 232.2057 424.3107 26.1439 0.1576 1413 +1415 3 232.3727 425.4273 26.1258 0.1878 1414 +1416 3 232.9504 426.386 26.0997 0.1689 1415 +1417 3 233.6094 427.3137 26.0636 0.1537 1416 +1418 3 234.0338 428.3754 26.016 0.144 1417 +1419 3 234.4594 429.437 25.9567 0.1504 1418 +1420 3 234.687 430.549 25.8413 0.1589 1419 +1421 3 234.8964 431.6644 25.6825 0.1901 1420 +1422 3 234.9536 432.7992 25.5193 0.1732 1421 +1423 3 234.9536 433.9421 25.3685 0.1621 1422 +1424 3 234.9524 435.0849 25.2364 0.1571 1423 +1425 3 234.9341 436.2289 25.1459 0.1867 1424 +1426 3 234.9158 437.3718 25.0931 0.1669 1425 +1427 3 234.7866 438.4952 25.0664 0.15 1426 +1428 3 234.3896 439.5683 25.0545 0.1373 1427 +1429 3 234.0372 440.6494 25.0508 0.1373 1428 +1430 3 234.0372 441.7934 25.0508 0.1373 1429 +1431 3 234.0372 442.9374 25.0508 0.1373 1430 +1432 3 234.0372 444.0814 25.0508 0.1373 1431 +1433 3 234.0716 445.2208 25.0508 0.1374 1432 +1434 3 234.4239 446.3041 25.0508 0.1375 1433 +1435 3 235.1103 447.1839 25.0508 0.1376 1434 +1436 3 236.1285 447.6987 25.0508 0.1379 1435 +1437 3 237.11 448.2764 25.0508 0.1384 1436 +1438 3 238.0653 448.9045 25.0508 0.1398 1437 +1439 3 238.9759 449.5966 25.0508 0.1398 1438 +1440 3 239.7961 450.3814 25.0508 0.1525 1439 +1441 3 239.9918 451.5082 25.0508 0.1144 1440 +1442 3 239.0937 396.5173 29.3045 0.1144 1387 +1443 3 238.1316 397.0183 29.9202 0.1373 1442 +1444 3 237.1306 397.4885 30.1944 0.1373 1443 +1445 3 236.069 397.9141 30.4077 0.1373 1444 +1446 3 235.052 398.414 30.5642 0.1373 1445 +1447 3 234.1814 399.1565 30.6678 0.1373 1446 +1448 3 233.249 399.7719 30.7233 0.1373 1447 +1449 3 232.129 400.0088 30.7362 0.1373 1448 +1450 3 231.0102 400.2456 30.7331 0.1373 1449 +1451 3 229.9634 400.6997 30.7286 0.1373 1450 +1452 3 228.9258 401.1825 30.7227 0.1373 1451 +1453 3 227.9672 401.8003 30.714 0.1373 1452 +1454 3 227.0314 402.4581 30.7023 0.1373 1453 +1455 3 226.1116 403.1376 30.6858 0.1373 1454 +1456 3 225.1953 403.824 30.6628 0.1373 1455 +1457 3 224.1771 404.3331 30.6295 0.1373 1456 +1458 3 223.1269 404.7861 30.5827 0.1373 1457 +1459 3 222.0458 405.1522 30.5203 0.1373 1458 +1460 3 220.9453 405.4656 30.4416 0.1373 1459 +1461 3 219.8894 405.8592 30.3145 0.1373 1460 +1462 3 218.909 406.3923 30.0933 0.1373 1461 +1463 3 217.9331 406.9608 29.8544 0.1373 1462 +1464 3 216.9585 407.5603 29.6475 0.1373 1463 +1465 3 216.0753 408.273 29.4678 0.1373 1464 +1466 3 215.2791 409.0955 29.3096 0.1373 1465 +1467 3 214.4085 409.8083 29.1231 0.1373 1466 +1468 3 213.4715 410.4237 28.8775 0.1373 1467 +1469 3 212.4419 410.8196 28.6208 0.1373 1468 +1470 3 211.4226 411.2097 28.4038 0.1373 1469 +1471 3 210.5829 411.9452 28.1641 0.1373 1470 +1472 3 209.8862 412.5321 27.7716 0.1373 1471 +1473 3 209.2193 413.1018 27.638 0.1373 1472 +1474 3 208.2663 413.7356 27.587 0.1374 1473 +1475 3 207.2184 414.1623 27.5984 0.1375 1474 +1476 3 206.1808 414.6062 27.6921 0.1377 1475 +1477 3 205.1821 415.105 27.9062 0.1381 1476 +1478 3 204.1182 415.4608 28.147 0.1388 1477 +1479 3 202.9994 415.6987 28.324 0.14 1478 +1480 3 201.8863 415.9584 28.4659 0.1424 1479 +1481 3 200.804 416.3268 28.5818 0.1467 1480 +1482 3 199.7207 416.6951 28.6796 0.1551 1481 +1483 3 198.6213 417.0109 28.7708 0.1682 1482 +1484 3 197.523 417.3312 28.8893 0.2048 1483 +1485 3 196.5312 417.8689 29.055 0.2133 1484 +1486 3 196.0038 418.7429 29.36 0.1737 1485 +1487 3 195.4444 419.7153 29.6467 0.1398 1486 +1488 3 194.3336 419.9006 29.9082 0.1144 1487 +1489 3 193.2754 419.9121 30.744 0.1144 1488 +1490 3 315.037 314.7853 27.5906 0.1144 1 +1491 3 314.1287 315.3951 27.6622 0.1544 1490 +1492 3 313.7706 316.4796 27.6886 0.1689 1491 +1493 3 313.551 317.579 27.7169 0.1968 1492 +1494 3 313.4789 318.7127 27.7713 0.2436 1493 +1495 3 313.3725 319.8235 27.9025 0.3535 1494 +1496 3 313.71 320.908 28.0053 0.4455 1495 +1497 3 314.0337 321.9857 28.0011 0.4724 1496 +1498 3 314.0474 323.1079 27.9195 0.4189 1497 +1499 3 313.6436 324.1741 27.8639 0.364 1498 +1500 3 312.9721 325.0985 27.8403 0.276 1499 +1501 3 312.1404 325.8833 27.8548 0.2744 1500 +1502 3 311.1794 326.4965 27.9393 0.2878 1501 +1503 3 310.2208 327.0101 28.1733 0.3478 1502 +1504 3 309.3193 327.5924 28.5127 0.2886 1503 +1505 3 308.8148 328.3017 29.8477 0.2288 1504 +1506 3 308.4293 329.3267 30.744 0.2423 1505 +1507 3 308.3789 330.449 31.0971 0.2046 1506 +1508 3 308.3824 331.5644 31.5392 0.1941 1507 +1509 3 307.5129 332.1581 32.03 0.2296 1508 +1510 3 306.3815 332.2416 32.5128 0.2571 1509 +1511 3 305.2638 332.4693 33.0142 0.2652 1510 +1512 3 305.1712 333.4909 33.6428 0.2597 1511 +1513 3 305.8667 334.2985 34.3823 0.2348 1512 +1514 3 306.1138 334.8946 35.3816 0.2604 1513 +1515 3 305.7901 335.9013 36.3866 0.3026 1514 +1516 3 305.5269 336.9274 37.3573 0.2914 1515 +1517 3 305.6459 338.0589 38.1573 0.2481 1516 +1518 3 305.6162 339.1663 38.766 0.2763 1517 +1519 3 305.003 340.0712 39.3341 0.26 1518 +1520 3 304.4527 340.8845 39.9227 0.2194 1519 +1521 3 303.629 341.6236 40.3673 0.1948 1520 +1522 3 302.6521 342.183 40.8094 0.2458 1521 +1523 3 301.7883 342.9129 41.2684 0.2149 1522 +1524 3 300.9692 343.6942 41.7385 0.1946 1523 +1525 3 300.1055 344.4252 42.2069 0.2065 1524 +1526 3 299.1182 344.9698 42.6748 0.2165 1525 +1527 3 298.2168 345.2661 43.3222 0.1799 1526 +1528 3 297.3679 345.7729 44.0415 0.1504 1527 +1529 3 296.8211 346.6595 44.6527 0.138 1528 +1530 3 296.8051 347.8023 45.0946 0.1386 1529 +1531 3 296.7994 348.9463 45.3905 0.1398 1530 +1532 3 296.7811 350.0892 45.5652 0.1419 1531 +1533 3 296.4081 351.1668 45.642 0.1459 1532 +1534 3 296.3475 352.3005 45.6722 0.1531 1533 +1535 3 296.3475 353.4445 45.6971 0.1677 1534 +1536 3 296.3475 354.5885 45.731 0.1889 1535 +1537 3 296.3475 355.7325 45.7806 0.2559 1536 +1538 3 296.622 356.8239 45.8525 0.246 1537 +1539 3 296.9538 357.9153 45.9497 0.1923 1538 +1540 3 297.4 358.9392 46.0723 0.1499 1539 +1541 3 297.7466 360.0031 46.2174 0.1372 1540 +1542 3 297.9148 360.4401 46.5928 0.1371 1541 +1543 3 298.6778 360.9606 47.0187 0.137 1542 +1544 3 299.5129 361.631 47.35 0.1368 1543 +1545 3 300.5242 362.1549 47.5927 0.1364 1544 +1546 3 301.2575 362.982 47.7534 0.1356 1545 +1547 3 302.3958 363.0724 47.8402 0.1342 1546 +1548 3 303.438 363.4705 47.8615 0.1313 1547 +1549 3 304.352 363.9682 47.8615 0.1271 1548 +1550 3 305.2741 364.3548 47.8615 0.1144 1549 +1551 3 306.417 364.3766 47.8615 0.1144 1550 +1552 3 308.0826 327.3545 28.6656 0.2055 1504 +1553 3 306.9512 327.2984 28.7417 0.1507 1552 +1554 3 305.8072 327.2984 28.7762 0.1386 1553 +1555 3 304.6632 327.2984 28.7753 0.1397 1554 +1556 3 303.5192 327.2984 28.7487 0.1418 1555 +1557 3 302.3752 327.2984 28.7213 0.1455 1556 +1558 3 301.2312 327.2984 28.7171 0.1531 1557 +1559 3 300.0872 327.2984 28.7171 0.1639 1558 +1560 3 298.9432 327.2984 28.7174 0.1999 1559 +1561 3 297.7992 327.2984 28.7176 0.1888 1560 +1562 3 296.6552 327.2984 28.7179 0.2034 1561 +1563 3 295.5112 327.3156 28.7182 0.1742 1562 +1564 3 294.3752 327.4277 28.7188 0.164 1563 +1565 3 293.2781 327.7148 28.7196 0.1607 1564 +1566 3 292.2119 328.0946 28.7207 0.1933 1565 +1567 3 291.0748 328.2147 28.7221 0.1797 1566 +1568 3 289.9399 328.3566 28.7244 0.171 1567 +1569 3 288.9698 328.9103 28.7274 0.1889 1568 +1570 3 287.9162 329.3153 28.7314 0.171 1569 +1571 3 286.8935 329.8072 28.7372 0.1577 1570 +1572 3 285.8673 330.3014 28.7456 0.1513 1571 +1573 3 284.7622 330.5027 28.7571 0.1643 1572 +1574 3 283.6182 330.5027 28.7731 0.1821 1573 +1575 3 282.4742 330.5027 28.7952 0.2459 1574 +1576 3 281.3302 330.5027 28.8263 0.2151 1575 +1577 3 280.1862 330.5027 28.8705 0.1948 1576 +1578 3 279.0422 330.5027 28.9335 0.207 1577 +1579 3 277.8982 330.5027 29.0178 0.2174 1578 +1580 3 276.7656 330.6206 29.1245 0.1815 1579 +1581 3 275.6502 330.7121 29.3006 0.1534 1580 +1582 3 274.5428 330.6732 29.5753 0.1435 1581 +1583 3 273.4354 330.6343 29.9116 0.1494 1582 +1584 3 272.3063 330.6183 30.2196 0.1572 1583 +1585 3 271.1623 330.6183 30.4464 0.1869 1584 +1586 3 270.0183 330.6183 30.5978 0.1673 1585 +1587 3 268.9144 330.3529 30.6807 0.1506 1586 +1588 3 267.823 330.012 30.7098 0.1384 1587 +1589 3 266.7042 329.8232 30.7076 0.1394 1588 +1590 3 265.5613 329.766 30.6933 0.1412 1589 +1591 3 264.4184 329.71 30.6734 0.1445 1590 +1592 3 263.2744 329.7019 30.6446 0.1512 1591 +1593 3 262.1304 329.7019 30.6037 0.1605 1592 +1594 3 260.9864 329.7019 30.5497 0.193 1593 +1595 3 259.8424 329.7019 30.4833 0.179 1594 +1596 3 258.7305 329.8438 30.368 0.1698 1595 +1597 3 257.6528 330.1515 30.1745 0.1868 1596 +1598 3 256.5477 330.37 29.9712 0.1671 1597 +1599 3 255.4094 330.4902 29.8133 0.1503 1598 +1600 3 254.2723 330.6091 29.6976 0.1379 1599 +1601 3 253.1512 330.8379 29.6201 0.1384 1600 +1602 3 252.0324 331.0747 29.5758 0.1393 1601 +1603 3 250.9387 331.4008 29.5523 0.141 1602 +1604 3 249.8656 331.7978 29.5308 0.1443 1603 +1605 3 248.7708 332.1066 29.5002 0.15 1604 +1606 3 247.6382 332.2748 29.4596 0.162 1605 +1607 3 246.5068 332.4418 29.4104 0.1778 1606 +1608 3 245.4006 332.2679 29.3238 0.238 1607 +1609 3 244.3287 331.911 29.1841 0.2 1608 +1610 3 243.2579 331.5541 29.0172 0.1689 1609 +1611 3 242.1848 331.1594 28.9052 0.1494 1610 +1612 3 241.1117 330.7624 28.8509 0.1571 1611 +1613 3 240.0844 330.282 28.8926 0.1867 1612 +1614 3 239.0708 329.7763 29.0237 0.1669 1613 +1615 3 238.0515 329.2661 29.1894 0.15 1614 +1616 3 237.0311 328.7559 29.3636 0.1373 1615 +1617 3 235.9111 328.5625 29.5047 0.1373 1616 +1618 3 234.7763 328.4207 29.6089 0.1373 1617 +1619 3 233.6528 328.2182 29.6772 0.1373 1618 +1620 3 232.5409 327.9665 29.7251 0.1373 1619 +1621 3 231.4918 327.8704 29.8528 0.1374 1620 +1622 3 230.4165 327.8841 29.9474 0.1375 1621 +1623 3 229.2851 327.9036 29.9421 0.1377 1622 +1624 3 228.1525 327.9219 29.8612 0.1381 1623 +1625 3 227.0337 328.1541 29.7847 0.1388 1624 +1626 3 225.9137 328.3909 29.7147 0.1401 1625 +1627 3 224.8543 328.7982 29.6534 0.1425 1626 +1628 3 223.8316 329.3096 29.6173 0.1469 1627 +1629 3 222.7597 329.6882 29.6055 0.1556 1628 +1630 3 221.6466 329.9502 29.6052 0.1691 1629 +1631 3 220.5266 330.1595 29.6052 0.2064 1630 +1632 3 219.3826 330.1595 29.6052 0.2163 1631 +1633 3 218.3587 329.6482 29.6052 0.1795 1632 +1634 3 217.336 329.1368 29.6052 0.1497 1633 +1635 3 216.2606 328.7627 29.6052 0.1368 1634 +1636 3 215.1544 328.4744 29.6052 0.1364 1635 +1637 3 214.0424 328.2033 29.6052 0.1356 1636 +1638 3 212.9236 327.9665 29.6052 0.1342 1637 +1639 3 211.8047 327.7297 29.6052 0.1313 1638 +1640 3 210.6676 327.6027 29.6052 0.1271 1639 +1641 3 209.5305 327.4803 29.6052 0.1144 1640 +1642 3 208.3899 327.4128 29.6052 0.1144 1641 diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/morphologies/Scnn1a.swc b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/morphologies/Scnn1a.swc new file mode 100644 index 0000000..ab4001d --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/morphologies/Scnn1a.swc @@ -0,0 +1,2595 @@ +# generated by Vaa3D Plugin sort_neuron_swc +# source file(s): C:/Users/alexh/Desktop/Check then delete/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_488448269_p.swc_Z_T10.swc +# id,type,x,y,z,r,pid +1 1 550.439 522.6341 38.7565 5.1205 -1 +2 3 546.4945 522.8435 34.8855 0.1144 1 +3 3 545.4306 522.8984 33.7747 0.1398 2 +4 3 544.3552 522.9499 33.2744 0.1907 3 +5 3 543.2273 523.0071 32.7732 0.2669 4 +6 3 542.105 523.2027 32.3246 0.3178 5 +7 3 541.0068 523.3034 31.8399 0.3178 6 +8 3 539.9863 523.5138 31.2732 0.2669 7 +9 3 538.9052 523.666 30.7922 0.2034 8 +10 3 537.7933 523.5516 30.4881 0.1907 9 +11 3 536.8048 523.3217 30.1924 0.2161 10 +12 3 535.9228 523.2301 29.7063 0.2415 11 +13 3 534.8921 523.4498 29.1575 0.2161 12 +14 3 533.7904 523.4738 28.73 0.1907 13 +15 3 532.9175 522.951 28.4908 0.1907 14 +16 3 532.7802 521.9694 28.2094 0.2415 15 +17 3 533.1452 521.3723 27.652 0.2542 16 +18 3 532.9827 520.2958 27.1077 0.2415 17 +19 3 531.7346 520.1654 26.5369 0.1907 18 +20 3 530.7725 520.0258 26.1911 0.1398 19 +21 3 529.998 519.233 25.843 0.1398 20 +22 3 529.0371 518.6816 25.5543 0.178 21 +23 3 528.067 518.1382 25.3801 0.2415 22 +24 3 527.193 517.422 25.3059 0.2924 23 +25 3 526.3247 516.7105 25.3418 0.3432 24 +26 3 525.4998 515.9291 25.4183 0.3432 25 +27 3 524.8775 515.0139 25.4821 0.3178 26 +28 3 524.5526 513.9271 25.5306 0.2669 27 +29 3 524.1911 512.8518 25.5433 0.2542 28 +30 3 523.5482 511.9286 25.5061 0.2415 29 +31 3 522.7805 511.1014 25.505 0.2415 30 +32 3 521.9351 510.462 25.6241 0.2288 31 +33 3 521.2121 509.6543 25.6083 0.2161 32 +34 3 520.3244 509.5147 25.357 0.1907 33 +35 3 519.4721 508.8363 25.1901 0.1525 34 +36 3 518.391 508.6178 24.9653 0.1398 35 +37 3 517.3809 508.341 24.7245 0.1652 36 +38 3 516.5709 507.5528 24.5916 0.2288 37 +39 3 515.8147 506.7142 24.5832 0.2796 38 +40 3 514.8492 506.1891 24.5692 0.2796 39 +41 3 513.8608 505.6343 24.5185 0.2415 40 +42 3 512.9536 504.9685 24.3906 0.2034 41 +43 3 512.2809 504.1139 24.345 0.1907 42 +44 3 511.2479 503.6666 24.2214 0.1907 43 +45 3 510.2675 503.0912 24.0083 0.178 44 +46 3 509.414 502.3487 23.7194 0.178 45 +47 3 508.5744 501.7733 23.2639 0.178 46 +48 3 507.9783 501.12 22.6445 0.2034 47 +49 3 507.0723 500.4462 22.1254 0.2161 48 +50 3 506.0507 499.9417 21.7989 0.2288 49 +51 3 505.1412 499.2954 21.6514 0.2288 50 +52 3 504.5395 498.3424 21.6626 0.2288 51 +53 3 503.9617 497.4204 21.7608 0.2161 52 +54 3 503.4046 496.5372 21.7688 0.1907 53 +55 3 503.1484 495.4298 21.765 0.1652 54 +56 3 502.7994 494.3487 21.8078 0.1525 55 +57 3 502.3716 493.3077 21.8473 0.1652 56 +58 3 501.7081 492.5446 21.9327 0.1652 57 +59 3 500.7311 492.1259 22.1296 0.178 58 +60 3 499.6168 491.9726 22.3045 0.178 59 +61 3 498.5152 491.9715 22.3302 0.2161 60 +62 3 497.4959 491.6775 22.197 0.2542 61 +63 3 496.5486 491.0746 22.0414 0.2924 62 +64 3 495.9595 490.1765 21.978 0.3051 63 +65 3 495.6391 489.0989 21.9925 0.2924 64 +66 3 495.0866 488.1254 22.0311 0.2924 65 +67 3 494.3052 487.3429 22.0039 0.2669 66 +68 3 493.3077 487.0397 21.8798 0.2415 67 +69 3 492.3559 486.6427 21.8648 0.2034 68 +70 3 491.5413 485.922 21.9735 0.2034 69 +71 3 490.8126 485.0732 22.1353 0.2288 70 +72 3 490.1159 484.2335 22.2187 0.2288 71 +73 3 489.4055 483.594 22.0897 0.2161 72 +74 3 488.6402 482.7794 22.0038 0.1907 73 +75 3 488.0029 481.8917 22.0453 0.2161 74 +76 3 487.4229 480.9616 22.1693 0.2288 75 +77 3 486.9825 479.9252 22.3233 0.2415 76 +78 3 486.5649 478.9219 22.3934 0.2288 77 +79 3 486.1531 477.9598 22.2626 0.2542 78 +80 3 485.644 476.9668 22.0479 0.2669 79 +81 3 484.9942 476.0253 21.831 0.2542 80 +82 3 484.3845 475.0574 21.6328 0.1907 81 +83 3 483.7827 474.0862 21.4692 0.1398 82 +84 3 483.0174 473.2602 21.3367 0.1271 83 +85 3 482.0873 472.607 21.2002 0.1398 84 +86 3 481.0863 472.1254 21.0176 0.1525 85 +87 3 479.9812 472.0945 20.8404 0.1398 86 +88 3 479.0134 472.575 20.7658 0.1271 87 +89 3 478.0524 473.0509 20.692 0.1271 88 +90 3 476.945 473.1023 20.5434 0.1398 89 +91 3 475.8113 473.1367 20.3846 0.1525 90 +92 3 474.7211 473.4547 20.228 0.1398 91 +93 3 473.6606 473.8791 20.0431 0.1271 92 +94 3 472.6173 474.2921 19.7791 0.1144 93 +95 3 471.5408 474.5552 19.4559 0.1144 94 +96 3 470.43 474.5072 19.1214 0.1398 95 +97 3 469.3203 474.2818 18.802 0.1652 96 +98 3 468.293 473.8116 18.5503 0.1907 97 +99 3 467.3091 473.2282 18.382 0.1652 98 +100 3 466.3733 472.5727 18.2868 0.1398 99 +101 3 465.4558 471.8886 18.2468 0.1144 100 +102 3 464.5258 471.2239 18.2493 0.1144 101 +103 3 463.598 470.5547 18.2661 0.1144 102 +104 3 462.6794 469.8751 18.2748 0.1271 103 +105 3 461.7333 469.2333 18.2842 0.1398 104 +106 3 460.7849 468.595 18.314 0.1525 105 +107 3 459.9246 467.8651 18.4019 0.1398 106 +108 3 459.0506 467.1421 18.523 0.1271 107 +109 3 458.1034 466.506 18.6267 0.1144 108 +110 3 457.1058 465.9535 18.6767 0.1144 109 +111 3 456.0831 465.4627 18.6557 0.1144 110 +112 3 455.1061 464.8781 18.6145 0.1144 111 +113 3 454.1863 464.2032 18.5967 0.1144 112 +114 3 453.2654 463.5351 18.6251 0.1271 113 +115 3 452.3365 462.883 18.7032 0.1525 114 +116 3 451.5734 462.0685 18.7291 0.178 115 +117 3 450.8596 461.1956 18.6917 0.178 116 +118 3 450.0485 460.3994 18.665 0.1525 117 +119 3 449.2294 459.6009 18.6749 0.1271 118 +120 3 448.5864 458.6639 18.7251 0.1144 119 +121 3 447.9378 457.7258 18.8422 0.1144 120 +122 3 447.0443 457.3277 19.1598 0.1271 121 +123 3 445.9976 457.0555 19.5718 0.1525 122 +124 3 445.2116 456.2638 19.9076 0.1907 123 +125 3 444.4188 455.439 20.1542 0.2034 124 +126 3 443.3206 455.1576 20.3189 0.1907 125 +127 3 442.5003 454.3728 20.4095 0.1525 126 +128 3 441.7911 453.4759 20.4381 0.1271 127 +129 3 441.6984 452.3376 20.4401 0.1144 128 +130 3 441.6984 451.1936 20.44 0.1144 129 +131 3 532.6739 519.2788 24.444 0.3432 18 +132 3 532.3272 518.5592 23.3628 0.3178 131 +133 3 531.8364 517.7332 23.0309 0.2796 132 +134 3 531.3697 516.7151 22.7869 0.2796 133 +135 3 530.8743 515.7667 22.4581 0.2924 134 +136 3 530.8721 514.6261 21.9058 0.2924 135 +137 2 548.9804 526.7983 37.3792 0.1144 1 +138 2 548.6132 527.8702 37.231 0.1271 137 +139 2 548.6555 528.9559 37.1815 0.1398 138 +140 2 549.2275 529.9397 37.1465 0.1652 139 +141 2 549.5524 531.0299 37.1204 0.178 140 +142 2 549.6268 532.1671 37.1017 0.2034 141 +143 2 549.4243 533.2699 37.112 0.2161 142 +144 2 548.8912 534.2606 37.1823 0.2415 143 +145 2 548.1991 535.0625 37.1927 0.2415 144 +146 2 547.4738 535.7649 37.0028 0.2415 145 +147 2 546.7096 536.496 36.836 0.2161 146 +148 2 545.8699 537.2213 36.7564 0.2034 147 +149 2 545.2304 538.157 36.6797 0.178 148 +150 2 544.7934 539.2072 36.5784 0.1652 149 +151 2 544.536 540.3043 36.4294 0.1652 150 +152 2 544.1367 541.3397 36.2236 0.1907 151 +153 2 543.6254 542.2571 35.8904 0.2288 152 +154 2 543.0305 543.0545 35.7199 0.2542 153 +155 2 542.8005 544.1562 35.6468 0.2542 154 +156 2 542.7708 545.2922 35.5634 0.2542 155 +157 2 542.7708 546.4316 35.3864 0.2796 156 +158 3 552.107 517.9449 38.7565 0.1271 1 +159 3 552.4731 516.8615 38.7229 0.1398 158 +160 3 552.8208 515.7713 38.7078 0.1525 159 +161 3 553.1686 514.6822 38.6873 0.1525 160 +162 3 553.6571 513.6549 38.6635 0.1525 161 +163 3 554.2291 512.6642 38.6327 0.1652 162 +164 3 554.9201 511.757 38.5944 0.1652 163 +165 3 555.5321 510.8841 38.4208 0.178 164 +166 3 556.3249 510.1668 38.3872 0.1652 165 +167 3 557.1108 509.3626 38.4205 0.1652 166 +168 3 557.7366 508.8672 38.2337 0.2542 167 +169 3 558.7616 508.4634 38.1276 0.2415 168 +170 3 559.7558 507.9131 38.0173 0.2415 169 +171 3 560.7911 507.4487 37.9016 0.2161 170 +172 3 561.8619 507.1535 37.7415 0.1907 171 +173 3 562.8617 507.1924 37.7311 0.178 172 +174 3 563.833 507.1501 37.9708 0.178 173 +175 3 564.9392 507.1192 38.2256 0.2034 174 +176 3 565.9746 507.3034 38.2519 0.2034 175 +177 3 567.0888 507.3011 38.3239 0.2034 176 +178 3 568.1687 507.0688 38.2175 0.1907 177 +179 3 569.2029 506.617 38.0598 0.1907 178 +180 3 570.1216 505.9637 37.8969 0.1907 179 +181 3 571.0997 505.4375 37.6477 0.1907 180 +182 3 572.1018 505.195 37.214 0.2034 181 +183 3 573.0616 504.8541 36.6831 0.2161 182 +184 3 573.9025 504.234 36.136 0.2161 183 +185 3 574.7513 503.9274 35.4497 0.1907 184 +186 3 575.1128 504.1608 34.956 0.1525 185 +187 3 576.1436 504.6173 34.6685 0.178 186 +188 3 577.2601 504.7763 34.5554 0.2161 187 +189 3 578.3641 504.6001 34.5033 0.2669 188 +190 3 579.412 504.1928 34.426 0.2796 189 +191 3 580.3798 503.797 34.491 0.2669 190 +192 3 581.4506 503.606 34.5783 0.2415 191 +193 3 582.55 503.821 34.5842 0.2161 192 +194 3 583.6036 504.1516 34.4484 0.2034 193 +195 3 584.6389 504.5841 34.258 0.2034 194 +196 3 585.6662 505.0886 34.0684 0.2288 195 +197 3 586.6192 505.7144 33.8702 0.2669 196 +198 3 587.6373 506.1308 33.6064 0.2796 197 +199 3 588.6749 505.8631 33.311 0.2669 198 +200 3 589.732 505.4352 33.0571 0.2288 199 +201 3 590.7479 504.9147 32.8434 0.2034 200 +202 3 591.742 504.4056 32.5828 0.2034 201 +203 3 592.854 504.3335 32.3394 0.2288 202 +204 3 593.0324 505.1767 32.368 0.178 203 +205 3 593.1629 506.2063 31.2774 0.1525 204 +206 3 593.0439 507.2382 30.7639 0.1398 205 +207 3 593.2018 508.3067 30.2341 0.1398 206 +208 3 593.7989 509.2161 29.8446 0.1652 207 +209 3 594.7256 509.7653 29.4913 0.1652 208 +210 3 595.8101 509.7161 29.0931 0.178 209 +211 3 596.8912 509.5445 28.6168 0.1652 210 +212 3 597.9882 509.6978 28.1215 0.1652 211 +213 3 599.0201 510.1702 27.626 0.1398 212 +214 3 599.3736 510.9482 26.9294 0.1271 213 +215 3 599.7203 511.7158 26.0427 0.1271 214 +216 3 600.7373 512.0441 25.2477 0.1398 215 +217 3 601.7017 511.5762 24.5451 0.1525 216 +218 3 602.3526 511.1792 23.6453 0.1398 217 +219 3 602.3995 511.8691 22.6032 0.1271 218 +220 3 601.704 511.9331 21.554 0.1271 219 +221 3 601.1468 511.042 20.6665 0.1398 220 +222 3 600.8551 510.1279 19.7738 0.1525 221 +223 3 601.6044 509.4701 18.1933 0.1525 222 +224 3 593.5141 503.7661 32.1107 0.2415 203 +225 3 594.5311 503.2868 31.9127 0.2415 224 +226 3 595.6556 503.225 31.7456 0.2415 225 +227 3 596.779 503.4275 31.6022 0.2415 226 +228 3 597.9093 503.5236 31.4462 0.2288 227 +229 3 599.0384 503.5488 31.2421 0.2288 228 +230 3 600.1676 503.638 31.0064 0.2034 229 +231 3 601.299 503.7856 30.788 0.178 230 +232 3 602.2748 503.2982 30.5978 0.1525 231 +233 3 602.8754 502.3418 30.4312 0.178 232 +234 3 603.7037 501.5822 30.2347 0.1907 233 +235 3 604.6692 501.0125 29.9855 0.2161 234 +236 3 605.5833 500.3341 29.734 0.1907 235 +237 3 606.5316 499.6958 29.5114 0.178 236 +238 3 607.647 499.4807 29.3129 0.1525 237 +239 3 608.7464 499.7267 29.0738 0.1652 238 +240 3 609.8458 499.8582 28.7756 0.178 239 +241 3 610.3412 499.92 28.5421 0.1271 240 +242 3 611.4588 500.1168 28.3248 0.1525 241 +243 3 612.5022 500.0367 28.0708 0.1907 242 +244 3 613.5192 499.6042 27.8741 0.2034 243 +245 3 614.5854 499.6363 27.8046 0.1907 244 +246 3 615.6951 499.7999 27.7604 0.1525 245 +247 3 616.7407 499.4876 27.6347 0.1525 246 +248 3 617.712 498.9384 27.403 0.1652 247 +249 3 618.7816 498.6021 27.134 0.2161 248 +250 3 619.8753 498.593 26.7795 0.2161 249 +251 3 620.9438 498.9007 26.3927 0.2415 250 +252 3 622.0191 499.2896 26.0399 0.2161 251 +253 3 623.1071 499.6443 25.719 0.2415 252 +254 3 624.2259 499.8262 25.393 0.2288 253 +255 3 625.2646 499.5745 24.9766 0.2542 254 +256 3 625.5735 498.6433 24.5461 0.2542 255 +257 3 625.8058 498.045 23.8746 0.2796 256 +258 3 626.7301 498.3973 23.1497 0.2796 257 +259 3 627.8032 498.7897 22.6195 0.2669 258 +260 3 628.4793 498.9201 22.4274 0.2034 259 +261 3 629.4952 498.53 21.603 0.1907 260 +262 3 629.9242 497.5954 21.1885 0.2034 261 +263 3 630.0877 496.5898 20.6347 0.2034 262 +264 3 630.7764 495.8348 20.1053 0.2415 263 +265 3 631.8404 495.4984 19.7111 0.2415 264 +266 3 632.8082 494.9436 19.3447 0.2288 265 +267 3 633.8263 494.5066 18.9905 0.2034 266 +268 3 634.888 494.1222 18.7224 0.1907 267 +269 3 635.9805 493.7801 18.5569 0.2034 268 +270 3 637.0536 493.4129 18.4902 0.2288 269 +271 3 638.1072 493.0171 18.5193 0.2542 270 +272 3 639.1734 492.6716 18.5318 0.2542 271 +273 3 640.2819 492.5343 18.5067 0.2288 272 +274 3 641.3985 492.6728 18.5063 0.2034 273 +275 3 642.2965 493.2779 18.4593 0.2034 274 +276 3 643.0744 493.6898 18.1726 0.2161 275 +277 3 643.627 492.9073 17.7735 0.2288 276 +278 3 644.4198 492.1099 17.4194 0.2288 277 +279 3 645.1851 491.2965 17.2443 0.2161 278 +280 3 645.7125 490.3607 17.2652 0.1907 279 +281 3 646.5076 489.5771 17.2319 0.1525 280 +282 3 647.3885 488.8712 17.0562 0.1271 281 +283 3 628.1635 498.8801 22.3104 0.2288 259 +284 3 629.1039 499.396 22.1775 0.2669 283 +285 3 629.6919 500.309 22.0513 0.2669 284 +286 3 630.0557 501.3614 22.0288 0.2415 285 +287 3 630.6117 502.3258 22.0231 0.1907 286 +288 3 631.3633 503.1724 21.9534 0.1907 287 +289 3 632.2716 503.8416 21.8464 0.2034 288 +290 3 633.1743 504.5097 21.8147 0.2161 289 +291 3 634.0208 505.251 21.8795 0.2034 290 +292 3 634.8148 506.0621 21.9253 0.1907 291 +293 3 635.6098 506.8812 21.9604 0.2034 292 +294 3 636.4209 507.6752 22.0233 0.2034 293 +295 3 636.8408 508.675 22.0006 0.2288 294 +296 3 637.5295 509.5136 21.8594 0.2288 295 +297 3 638.5293 510.0455 21.7031 0.2542 296 +298 3 639.6276 510.351 21.5681 0.2415 297 +299 3 640.7201 510.6404 21.4007 0.2542 298 +300 3 641.6273 511.2708 21.1864 0.2288 299 +301 3 642.674 511.7078 21.0354 0.2034 300 +302 3 643.7414 512.0567 21.0248 0.1525 301 +303 3 644.8602 512.091 21.1093 0.1271 302 +304 3 645.9974 511.988 21.1938 0.1144 303 +305 3 647.1402 511.9686 21.2602 0.1271 304 +306 3 648.2762 512.099 21.2866 0.1525 305 +307 3 649.4122 512.2397 21.2581 0.178 306 +308 3 650.4841 512.631 21.179 0.178 307 +309 3 651.484 513.0657 20.9507 0.1525 308 +310 3 652.604 512.9593 20.6832 0.1398 309 +311 3 653.5249 512.3633 20.3519 0.1398 310 +312 3 654.6323 512.1368 20.1638 0.1525 311 +313 3 655.7385 511.9091 20.0922 0.1525 312 +314 3 656.8184 511.6082 19.9716 0.1525 313 +315 3 657.9007 511.3119 19.8295 0.178 314 +316 3 659.0412 511.3016 19.762 0.1907 315 +317 3 660.183 511.3016 19.7497 0.2034 316 +318 3 661.3224 511.2319 19.7705 0.1652 317 +319 3 662.4389 511.0271 19.8383 0.1525 318 +320 3 663.5623 510.8452 19.9329 0.1525 319 +321 3 664.704 510.8154 19.9741 0.1907 320 +322 3 665.8469 510.8303 19.9437 0.2161 321 +323 3 666.9486 511.0694 19.8096 0.2288 322 +324 3 668.0491 511.3062 19.605 0.2161 323 +325 3 669.1679 511.4515 19.3649 0.1907 324 +326 3 670.2868 511.5934 19.1224 0.1525 325 +327 3 671.385 511.8576 19.0283 0.1271 326 +328 3 672.4775 512.131 19.0638 0.1144 327 +329 3 673.4064 512.7946 19.1335 0.1144 328 +330 3 674.2999 513.5084 19.209 0.1398 329 +331 3 674.8593 514.506 19.3304 0.1652 330 +332 3 610.0197 500.0115 28.8702 0.1652 240 +333 3 610.6947 500.6064 30.8081 0.1652 332 +334 3 611.3708 501.2013 31.6733 0.1652 333 +335 3 612.2528 501.6726 32.6222 0.1525 334 +336 3 613.2984 502.089 33.465 0.1525 335 +337 3 613.9722 502.9939 34.1729 0.1652 336 +338 3 614.4676 503.7455 34.8698 0.178 337 +339 3 615.5555 503.638 35.3816 0.1907 338 +340 3 616.5451 504.0121 35.716 0.178 339 +341 3 617.2509 504.8495 36.0332 0.1652 340 +342 3 617.8572 505.815 36.2869 0.178 341 +343 3 618.5597 506.7142 36.4826 0.2288 342 +344 3 619.3685 507.4967 36.6615 0.2796 343 +345 3 620.2162 508.2403 36.8399 0.2796 344 +346 3 620.9701 509.0937 36.9513 0.2415 345 +347 3 621.629 510.0169 36.9606 0.2161 346 +348 3 622.2262 510.979 36.9026 0.2288 347 +349 3 622.7753 511.9778 36.8376 0.2415 348 +350 3 623.2901 512.9982 36.8082 0.2415 349 +351 3 623.8186 514.0061 36.8497 0.2288 350 +352 3 624.3574 515.0048 36.9743 0.2415 351 +353 3 624.8986 516.0069 37.1468 0.2288 352 +354 3 625.4946 516.9782 37.3276 0.2288 353 +355 3 626.2325 517.8453 37.4867 0.2288 354 +356 3 627.0081 518.6816 37.6244 0.2669 355 +357 3 627.6579 519.6105 37.7717 0.2669 356 +358 3 628.2722 520.568 37.9092 0.2415 357 +359 3 628.9598 521.4707 37.9778 0.2034 358 +360 3 629.7743 522.2337 38.0461 0.1907 359 +361 3 630.6861 522.8892 38.1867 0.178 360 +362 3 631.5704 523.5939 38.3236 0.1525 361 +363 3 632.457 524.3112 38.4096 0.1525 362 +364 3 633.4442 524.8661 38.4689 0.1907 363 +365 3 634.4738 525.358 38.5398 0.2415 364 +366 3 635.4314 525.9654 38.6666 0.2542 365 +367 3 636.4164 526.4997 38.8699 0.2415 366 +368 3 637.4917 526.8074 39.1465 0.2542 367 +369 3 638.5957 527.0133 39.4724 0.2796 368 +370 3 639.7042 527.1907 39.8132 0.2924 369 +371 3 640.8242 527.3611 40.1181 0.2542 370 +372 3 641.9464 527.5396 40.3088 0.2034 371 +373 3 643.0687 527.7192 40.3752 0.1652 372 +374 3 644.199 527.8679 40.3768 0.1525 373 +375 3 645.335 527.996 40.3598 0.178 374 +376 3 646.4286 528.2981 40.3567 0.1907 375 +377 3 647.472 528.7648 40.4023 0.2034 376 +378 3 648.5313 529.1778 40.5367 0.1652 377 +379 3 649.6181 529.5118 40.7641 0.1398 378 +380 3 650.7369 529.7109 41.0567 0.1271 379 +381 3 651.8718 529.8367 41.4025 0.1525 380 +382 3 652.986 530.0346 41.8303 0.178 381 +383 3 654.0786 530.3001 42.3567 0.178 382 +384 3 655.1642 530.4694 42.992 0.1652 383 +385 3 656.1298 530.7325 43.7833 0.1652 384 +386 3 657.101 530.9464 44.6936 0.178 385 +387 3 658.1215 530.9796 45.6599 0.1907 386 +388 3 658.9394 530.4328 46.6262 0.178 387 +389 3 659.0859 529.3643 47.4337 0.1652 388 +390 3 658.8662 528.2489 48.0777 0.1525 389 +391 3 658.9692 527.1884 48.6766 0.1525 390 +392 3 659.7391 526.8795 49.3444 0.1652 391 +393 3 660.7366 526.8314 49.994 0.1652 392 +394 3 661.8143 526.4882 50.3972 0.178 393 +395 3 662.4973 525.9494 50.0312 0.1907 394 +396 3 575.6093 503.9297 34.72 0.1398 185 +397 3 576.3426 503.2548 34.5229 0.1271 396 +398 3 577.2224 502.5752 34.4585 0.1144 397 +399 3 577.4054 501.7092 34.2832 0.1398 398 +400 3 577.6365 500.5938 34.1449 0.178 399 +401 3 577.6845 499.4738 33.9948 0.2161 400 +402 3 577.2796 498.4214 33.8512 0.2034 401 +403 3 576.7899 497.4306 33.7053 0.1652 402 +404 3 576.4936 496.3999 33.3889 0.1398 403 +405 3 576.0864 495.463 32.8835 0.1525 404 +406 3 575.7157 494.4391 32.3649 0.178 405 +407 3 575.7203 493.3706 31.8797 0.178 406 +408 3 576.0315 492.317 31.3233 0.1652 407 +409 3 576.7076 491.5665 30.6718 0.1525 408 +410 3 576.6721 490.5014 30.0572 0.1525 409 +411 3 575.7157 489.9249 29.5557 0.1398 410 +412 3 574.5866 489.7922 29.1015 0.1271 411 +413 3 573.5158 489.6034 28.5908 0.1144 412 +414 3 573.1818 488.5338 28.1646 0.1271 413 +415 3 572.739 487.5522 27.6693 0.1398 414 +416 3 572.3135 486.5684 27.1038 0.1525 415 +417 3 571.8124 485.5674 26.6724 0.1398 416 +418 3 570.9429 484.8398 26.2966 0.1398 417 +419 3 569.9648 484.5984 25.8593 0.1398 418 +420 3 568.9524 484.9542 25.3269 0.1652 419 +421 3 568.2683 484.587 24.6823 0.1652 420 +422 3 567.9731 483.5333 24.0018 0.1652 421 +423 3 567.7455 482.4545 23.3127 0.1398 422 +424 3 567.7237 481.3288 22.671 0.1271 423 +425 3 567.7237 480.2157 22.0704 0.1144 424 +426 3 567.5979 479.1644 21.4256 0.1271 425 +427 3 566.7525 478.9619 20.8048 0.1398 426 +428 3 565.6222 479.098 20.2697 0.1525 427 +429 3 564.612 478.7114 19.8039 0.1398 428 +430 3 563.7895 478.3865 19.2093 0.1271 429 +431 3 563.0917 478.24 18.4252 0.1398 430 +432 3 562.3572 477.5617 17.8013 0.1652 431 +433 3 561.6182 476.754 17.4778 0.1907 432 +434 3 560.5863 476.3273 17.2886 0.178 433 +435 3 559.559 475.8399 17.1859 0.178 434 +436 3 558.5855 475.3789 17.0994 0.2034 435 +437 3 557.4632 475.3503 17.127 0.2288 436 +438 3 556.8168 476.2094 17.3242 0.2288 437 +439 3 556.5903 477.1853 17.7273 0.178 438 +440 3 556.2734 478.2492 18.1906 0.1525 439 +441 3 555.8204 479.2594 19.3304 0.1398 440 +442 3 557.5639 508.317 38.8091 0.178 167 +443 3 557.7526 507.1958 39.6158 0.1652 442 +444 3 557.986 506.1285 39.9734 0.2034 443 +445 3 557.9071 505.1973 40.5216 0.2288 444 +446 3 557.3682 504.321 41.1368 0.2415 445 +447 3 557.0811 503.2502 41.6046 0.2161 446 +448 3 557.4998 502.7422 42.1067 0.2034 447 +449 3 558.0707 501.9678 42.5121 0.1907 448 +450 3 557.954 500.8649 42.8672 0.178 449 +451 3 557.6451 499.8033 43.209 0.1652 450 +452 3 557.4804 498.8012 43.4087 0.1525 451 +453 3 557.0411 497.7807 43.4498 0.178 452 +454 3 556.9598 496.6607 43.4949 0.2034 453 +455 3 556.9587 495.5476 43.5887 0.2161 454 +456 3 557.1612 494.4894 43.745 0.2288 455 +457 3 556.9804 493.0754 43.6892 0.1652 456 +458 3 556.8397 491.9669 43.507 0.178 457 +459 3 556.6761 490.8618 43.2247 0.178 458 +460 3 556.4874 489.7613 42.8593 0.1907 459 +461 3 556.3512 488.6424 42.4732 0.1907 460 +462 3 556.2963 487.5042 42.1341 0.178 461 +463 3 556.2814 486.3613 41.9 0.178 462 +464 3 556.278 485.2184 41.7631 0.178 463 +465 3 556.2139 484.0893 41.641 0.1907 464 +466 3 555.9794 482.9945 41.4739 0.178 465 +467 3 555.833 481.8814 41.3314 0.1525 466 +468 3 555.9131 480.7877 41.3039 0.1271 467 +469 3 555.9726 479.6918 41.249 0.1271 468 +470 3 555.9726 478.5764 41.0827 0.1398 469 +471 3 555.889 477.4713 40.8475 0.1525 470 +472 3 555.5035 476.4108 40.5882 0.1398 471 +473 3 555.1146 475.3549 40.3334 0.1398 472 +474 3 554.9956 474.2189 40.1296 0.1398 473 +475 3 554.9475 473.076 39.9994 0.1652 474 +476 3 554.9933 471.9423 39.9529 0.1652 475 +477 3 555.2084 470.8349 39.9963 0.1652 476 +478 3 555.3628 469.7207 40.0498 0.1398 477 +479 3 555.3628 468.5904 40.0011 0.1398 478 +480 3 555.3742 467.4601 39.8656 0.1398 479 +481 3 555.4234 466.3344 39.6595 0.1652 480 +482 3 555.5024 465.2065 39.4162 0.178 481 +483 3 555.6511 464.0808 39.2196 0.2034 482 +484 3 555.8788 462.9791 39.1373 0.2161 483 +485 3 556.1224 461.8728 39.0908 0.2288 484 +486 3 556.2723 460.762 38.967 0.2161 485 +487 3 556.1979 459.6432 38.7778 0.2034 486 +488 3 555.8387 458.5873 38.5885 0.1907 487 +489 3 555.2152 457.6389 38.3729 0.1907 488 +490 3 554.7062 456.639 38.0878 0.178 489 +491 3 554.2749 455.6003 37.7902 0.1525 490 +492 3 553.9031 454.5181 37.5483 0.1525 491 +493 3 553.7177 453.4152 37.3425 0.1652 492 +494 3 553.8584 452.2793 37.1529 0.2034 493 +495 3 553.9134 451.1593 36.9326 0.1907 494 +496 3 553.6159 450.1091 36.64 0.178 495 +497 3 553.14 449.0875 36.3163 0.1525 496 +498 3 552.9432 447.987 35.9682 0.1525 497 +499 3 552.9021 446.8658 35.6006 0.1525 498 +500 3 552.8357 445.7459 35.2374 0.1398 499 +501 3 552.5989 444.6545 34.9194 0.1271 500 +502 3 552.0841 443.6421 34.6853 0.1271 501 +503 3 551.5087 442.6697 34.5778 0.1525 502 +504 3 551.0328 441.6572 34.6024 0.1907 503 +505 3 551.011 440.583 34.6648 0.2034 504 +506 3 551.4137 439.5237 34.6688 0.1907 505 +507 3 551.6665 438.4414 34.585 0.1525 506 +508 3 551.6997 437.3054 34.4501 0.1271 507 +509 3 551.6951 436.1626 34.2913 0.1144 508 +510 3 551.6208 435.0232 34.1312 0.1144 509 +511 3 551.5007 433.886 33.9886 0.1144 510 +512 3 551.3748 432.7489 33.8604 0.1271 511 +513 3 551.2627 431.6095 33.7336 0.1525 512 +514 3 551.1151 430.4769 33.5818 0.178 513 +515 3 550.645 429.4988 33.3393 0.178 514 +516 3 550.0066 428.6007 32.9963 0.1525 515 +517 3 549.4563 427.6261 32.62 0.1271 516 +518 3 549.0617 426.5633 32.2622 0.1144 517 +519 3 548.9381 425.4376 31.9659 0.1271 518 +520 3 548.8168 424.3016 31.7402 0.1652 519 +521 3 548.4187 423.264 31.5204 0.2288 520 +522 3 547.722 422.3968 31.2892 0.2669 521 +523 3 546.9155 421.5937 31.1058 0.2669 522 +524 3 546.3515 420.6396 31.0344 0.2288 523 +525 3 546.1994 419.5414 31.0436 0.2161 524 +526 3 546.0873 418.4134 31.0072 0.2034 525 +527 3 545.7727 417.4113 30.7992 0.2161 526 +528 3 545.5072 416.3325 30.6012 0.2161 527 +529 3 545.2682 415.2228 30.4349 0.2288 528 +530 3 544.8986 414.1577 30.1941 0.2161 529 +531 3 544.4536 413.1213 29.8609 0.2034 530 +532 3 543.9651 412.1066 29.465 0.2034 531 +533 3 543.1071 411.538 28.9722 0.2161 532 +534 3 542.0512 411.4202 28.3657 0.2161 533 +535 3 541.0731 410.9156 27.7629 0.1907 534 +536 3 540.1442 410.259 27.2133 0.1525 535 +537 3 539.6054 409.298 26.6565 0.1271 536 +538 3 538.6776 408.7352 26.106 0.1144 537 +539 3 537.5439 408.6963 25.6006 0.1144 538 +540 3 536.4113 408.6597 25.1358 0.1144 539 +541 3 535.344 408.654 24.611 0.1144 540 +542 3 534.296 408.654 23.31 0.1271 541 +543 3 557.4094 494.2595 45.4454 0.178 456 +544 3 558.1565 493.5491 46.8247 0.178 543 +545 3 558.9058 492.8295 47.4376 0.2034 544 +546 3 559.6379 492.0333 48.1138 0.2542 545 +547 3 560.2889 491.1078 48.7172 0.2796 546 +548 3 560.9776 490.1983 49.2492 0.2542 547 +549 3 561.7932 489.4375 49.7694 0.2161 548 +550 3 562.5792 488.6825 50.3012 0.178 549 +551 3 563.2095 487.773 50.8194 0.1652 550 +552 3 563.5538 486.7377 51.3467 0.1398 551 +553 3 563.603 485.6131 51.8176 0.1271 552 +554 3 563.531 484.4737 52.1987 0.1271 553 +555 3 563.3411 483.3549 52.5176 0.1525 554 +556 3 563.0894 482.2452 52.7794 0.178 555 +557 3 562.7874 481.1527 52.9178 0.178 556 +558 3 562.9784 480.0796 53.0947 0.1652 557 +559 3 562.8674 478.947 53.2409 0.1525 558 +560 3 562.7336 477.8122 53.3613 0.1652 559 +561 3 562.8686 476.6876 53.4584 0.1652 560 +562 3 563.1248 475.5734 53.5433 0.178 561 +563 3 563.4108 474.466 53.6278 0.178 562 +564 3 563.7186 473.3643 53.7062 0.1907 563 +565 3 563.9657 472.2489 53.814 0.178 564 +566 3 564.0572 471.1255 53.9907 0.1652 565 +567 3 564.1007 469.9987 54.2371 0.1652 566 +568 3 564.4141 468.9245 54.4477 0.178 567 +569 3 564.8294 467.8697 54.6084 0.1907 568 +570 3 565.3637 466.8767 54.831 0.2034 569 +571 3 565.9974 465.9546 55.1583 0.2161 570 +572 3 566.7468 465.1641 55.6074 0.2161 571 +573 3 567.3725 464.2558 56.131 0.178 572 +574 3 567.845 463.2319 56.6846 0.1398 573 +575 3 568.2008 462.1646 57.2625 0.1144 574 +576 3 568.4902 461.0812 57.8544 0.1144 575 +577 3 568.5749 459.9727 58.4623 0.1144 576 +578 3 568.5142 458.8607 59.0862 0.1271 577 +579 3 568.6446 457.7487 59.7055 0.1398 578 +580 3 568.7602 456.8095 60.4629 0.1525 579 +581 3 568.2866 455.844 61.2128 0.1398 580 +582 3 568.2294 454.7526 61.9382 0.1271 581 +583 3 568.9901 454.0822 62.5439 0.1144 582 +584 3 567.9525 453.8442 63.1308 0.1144 583 +585 3 567.3576 453.0046 63.6619 0.1144 584 +586 3 567.2844 451.8846 64.1348 0.1144 585 +587 3 567.472 450.7932 64.6274 0.1271 586 +588 3 567.8324 449.7121 65.1006 0.1398 587 +589 3 568.0669 448.6024 65.5628 0.1525 588 +590 3 568.0887 447.5454 66.1371 0.1398 589 +591 3 568.1802 446.4906 66.8248 0.1271 590 +592 3 568.155 445.4164 67.5797 0.1144 591 +593 3 567.8519 444.3651 68.348 0.1144 592 +594 3 567.5144 443.3172 69.1118 0.1144 593 +595 3 567.1769 442.2693 69.8527 0.1144 594 +596 3 566.8394 441.2214 70.5538 0.1144 595 +597 3 566.4974 440.1712 71.2166 0.1144 596 +598 3 566.0809 439.1095 71.7816 0.1144 597 +599 3 565.6554 438.0479 72.2579 0.1144 598 +600 3 565.6314 436.9336 72.7359 0.1144 599 +601 3 566.1702 436.0219 73.2906 0.1144 600 +602 3 566.7101 435.109 73.8912 0.1271 601 +603 3 567.249 434.1972 75.3234 0.1398 602 +604 3 556.8363 500.8203 44.7846 0.2161 451 +605 3 556.0481 501.6371 45.2312 0.178 604 +606 3 555.1638 502.3453 45.3611 0.1652 605 +607 3 554.8549 503.1587 45.5963 0.1652 606 +608 3 555.1546 504.1951 45.981 0.1907 607 +609 3 555.4452 505.2465 46.4778 0.1907 608 +610 3 554.9327 506.1788 46.8586 0.2161 609 +611 3 554.6764 507.2565 47.3334 0.2415 610 +612 3 554.1559 508.1888 47.9343 0.2415 611 +613 3 553.6102 509.1635 48.5094 0.1907 612 +614 3 553.7566 510.105 49.1456 0.1525 613 +615 3 554.5815 510.4883 49.9929 0.1398 614 +616 3 554.8983 511.3337 50.9891 0.1525 615 +617 3 554.8091 512.4285 51.9672 0.1525 616 +618 3 554.1719 513.0074 52.9211 0.1525 617 +619 3 553.148 512.9376 53.9129 0.1525 618 +620 3 552.2065 512.8277 54.9794 0.1652 619 +621 3 551.2215 513.0508 56.0045 0.178 620 +622 3 550.1485 513.3997 56.896 0.1907 621 +623 3 549.1555 513.6514 57.7948 0.1652 622 +624 3 548.1362 513.7155 58.7093 0.1398 623 +625 3 547.3697 514.1536 59.6702 0.1144 624 +626 3 546.7462 514.9968 60.5626 0.1271 625 +627 3 546.0621 515.9074 61.2629 0.1525 626 +628 3 545.4581 516.8626 61.8397 0.178 627 +629 3 544.5703 517.7447 62.235 0.1398 628 +630 3 543.7741 518.566 62.4949 0.1271 629 +631 3 542.9355 519.3222 62.6895 0.1144 630 +632 3 542.1485 520.0327 62.9633 0.1144 631 +633 3 541.2138 520.6813 63.1467 0.1144 632 +634 3 540.2632 521.2762 63.2954 0.1144 633 +635 3 539.3868 521.9283 63.5286 0.1144 634 +636 3 538.3584 522.4145 63.723 0.1271 635 +637 3 537.2945 522.8046 63.8288 0.1525 636 +638 3 536.1814 523.0471 63.9033 0.178 637 +639 3 535.0843 523.2873 64.041 0.178 638 +640 3 534.0512 523.6683 64.2561 0.1525 639 +641 3 533.1132 524.2597 64.468 0.1271 640 +642 3 532.4656 525.1601 64.5789 0.1144 641 +643 3 531.7575 525.9426 64.601 0.1144 642 +644 3 530.6787 526.2926 64.5837 0.1271 643 +645 3 529.5587 526.4928 64.5098 0.1525 644 +646 3 528.5658 526.9642 64.4305 0.178 645 +647 3 527.8176 527.7798 64.3286 0.178 646 +648 3 527.1804 528.6733 64.3182 0.1525 647 +649 3 526.7285 529.6869 64.4319 0.1271 648 +650 3 525.8202 530.141 64.6299 0.1144 649 +651 3 524.8626 530.6604 64.731 0.1271 650 +652 3 524.0286 531.4372 64.808 0.1398 651 +653 3 523.4223 532.3936 64.9284 0.1652 652 +654 3 522.8629 533.3889 65.1557 0.1907 653 +655 3 546.0232 517.2402 64.064 0.1525 628 +656 3 546.7405 517.6772 66.9514 0.1271 655 +657 3 547.4589 518.1153 68.182 0.1144 656 +658 3 548.1762 518.5523 69.6413 0.1144 657 +659 3 548.8935 518.9893 71.2522 0.1144 658 +660 3 549.4449 519.7547 72.8899 0.1144 659 +661 3 549.954 520.5989 74.4971 0.1144 660 +662 3 550.4642 521.4421 76.0399 0.1144 661 +663 3 550.9733 522.2863 77.5701 0.1144 662 +664 3 551.4835 523.1306 79.0642 0.1144 663 +665 3 552.1138 523.7152 80.5616 0.1144 664 +666 3 552.7556 524.2746 82.0341 0.1144 665 +667 3 553.3974 524.8352 83.4414 0.1271 666 +668 3 554.0392 525.3946 86.2926 0.1398 667 +669 3 553.0679 525.906 40.4029 0.1144 1 +670 3 553.7566 526.8006 40.9788 0.1144 669 +671 3 554.6226 527.5316 41.2023 0.1271 670 +672 3 555.7209 527.67 41.4268 0.1525 671 +673 3 556.826 527.6769 41.7424 0.1907 672 +674 3 557.7114 527.9182 42.2576 0.2161 673 +675 3 558.4722 528.7454 42.6135 0.2288 674 +676 3 559.4492 529.3196 42.9335 0.2161 675 +677 3 560.314 529.982 43.1043 0.1907 676 +678 3 561.1228 530.5163 43.3664 0.2161 677 +679 3 562.0003 530.9773 43.6428 0.178 678 +680 3 563.0711 531.1009 43.773 0.1652 679 +681 3 564.1258 531.2999 44.0331 0.178 680 +682 3 565.1783 531.6934 44.3646 0.178 681 +683 3 566.0466 532.4176 44.697 0.178 682 +684 3 566.5877 533.0594 45.2508 0.178 683 +685 3 567.607 532.9324 45.8436 0.1907 684 +686 3 567.9331 532.7345 46.3263 0.1652 685 +687 3 568.8529 532.1122 46.7107 0.1398 686 +688 3 569.8584 531.8067 46.8717 0.1398 687 +689 3 570.9464 531.7506 46.7956 0.1525 688 +690 3 572.0355 531.5768 46.5522 0.178 689 +691 3 573.0605 531.1855 46.2384 0.2034 690 +692 3 573.8201 530.6147 46.1294 0.2161 691 +693 3 574.7479 530.1147 46.1605 0.2288 692 +694 3 575.8473 529.8322 46.1972 0.2161 693 +695 3 576.973 529.7933 46.1768 0.1907 694 +696 3 578.0987 529.9214 46.1009 0.178 695 +697 3 579.1306 529.7338 45.8702 0.1907 696 +698 3 580.0858 529.1538 45.7472 0.2288 697 +699 3 580.9312 528.9101 45.6963 0.1525 698 +700 3 582.002 529.0474 45.7408 0.1652 699 +701 3 583.1082 529.1252 45.7027 0.178 700 +702 3 584.2442 529.0073 45.6674 0.1907 701 +703 3 585.3734 528.8369 45.656 0.178 702 +704 3 586.5071 528.6927 45.6151 0.1525 703 +705 3 587.6442 528.5749 45.5336 0.1271 704 +706 3 588.771 528.3896 45.432 0.1271 705 +707 3 589.8773 528.1036 45.3253 0.1652 706 +708 3 590.9618 527.7489 45.1772 0.2161 707 +709 3 592.0097 527.3245 44.9632 0.2542 708 +710 3 593.0164 526.8257 44.7009 0.2542 709 +711 3 594.0483 526.3441 44.4884 0.2415 710 +712 3 594.9292 525.8236 44.2005 0.2161 711 +713 3 595.8032 525.2447 43.8332 0.1907 712 +714 3 596.8912 525.0342 43.5274 0.1525 713 +715 3 597.9951 524.8192 43.272 0.1398 714 +716 3 598.9995 524.3307 43.0175 0.1525 715 +717 3 599.9628 523.7426 42.8425 0.178 716 +718 3 600.9123 523.1432 42.828 0.178 717 +719 3 601.8595 522.5357 42.8478 0.1652 718 +720 3 602.785 521.8745 42.842 0.178 719 +721 3 603.5927 521.0851 42.8879 0.2161 720 +722 3 604.3626 520.2477 42.9783 0.2669 721 +723 3 605.1531 519.4229 43.0542 0.2924 722 +724 3 605.9574 518.6084 43.1021 0.3178 723 +725 3 606.7753 517.8087 43.1371 0.3178 724 +726 3 607.6367 517.0571 43.155 0.3051 725 +727 3 608.5577 516.3822 43.1449 0.2542 726 +728 3 609.593 515.9177 43.127 0.2034 727 +729 3 610.6741 515.5425 43.115 0.1525 728 +730 3 611.7037 515.0517 43.1054 0.1271 729 +731 3 612.7001 514.49 43.0956 0.1398 730 +732 3 613.6359 513.8539 43.0422 0.1652 731 +733 3 614.5316 513.1709 42.9335 0.1907 732 +734 3 615.4526 512.5612 42.9156 0.1652 733 +735 3 616.5256 512.2821 42.9696 0.1525 734 +736 3 617.657 512.3576 43.0296 0.1652 735 +737 3 618.7965 512.4559 43.083 0.2288 736 +738 3 619.8913 512.1791 43.1276 0.2669 737 +739 3 620.8065 511.5156 43.1547 0.2669 738 +740 3 621.7972 510.9527 43.1561 0.2288 739 +741 3 622.8416 510.4871 43.1477 0.2034 740 +742 3 623.9273 510.1531 43.1102 0.178 741 +743 3 625.0324 509.9197 43.0326 0.1652 742 +744 3 626.1547 509.7206 42.989 0.1652 743 +745 3 627.2712 509.5468 43.0452 0.2034 744 +746 3 628.3512 509.247 43.1959 0.2415 745 +747 3 629.3464 508.7471 43.4216 0.2669 746 +748 3 630.3726 508.254 43.6218 0.2415 747 +749 3 631.4148 507.8056 43.727 0.2288 748 +750 3 632.4684 507.3743 43.7578 0.2161 749 +751 3 633.5289 506.9533 43.7436 0.2288 750 +752 3 634.5871 506.5243 43.7545 0.2161 751 +753 3 635.6327 506.0907 43.8371 0.2034 752 +754 3 636.6291 505.545 43.9723 0.1907 753 +755 3 637.6278 504.9925 44.1319 0.2034 754 +756 3 638.6712 504.5257 44.2736 0.2034 755 +757 3 639.7065 504.0395 44.3904 0.2034 756 +758 3 640.6228 503.3657 44.5026 0.178 757 +759 3 641.458 502.5912 44.6051 0.1907 758 +760 3 642.2405 501.7618 44.6958 0.2034 759 +761 3 642.8708 500.8112 44.7479 0.2161 760 +762 3 643.4199 499.8102 44.7353 0.178 761 +763 3 643.8981 498.7851 44.6365 0.1652 762 +764 3 644.5857 497.8791 44.5096 0.178 763 +765 3 645.3739 497.0497 44.3876 0.2288 764 +766 3 646.2662 496.3358 44.2739 0.2288 765 +767 3 647.1986 495.6735 44.1692 0.2161 766 +768 3 648.1218 494.9974 44.0698 0.178 767 +769 3 649.037 494.311 43.9662 0.178 768 +770 3 649.9419 493.636 43.7861 0.178 769 +771 3 650.8376 492.9736 43.5204 0.2034 770 +772 3 651.6316 492.1602 43.2541 0.2161 771 +773 3 652.4198 491.3377 43.0021 0.2288 772 +774 3 653.3899 490.8103 42.7221 0.2161 773 +775 3 654.4996 490.5426 42.5345 0.1907 774 +776 3 655.6367 490.4271 42.4388 0.1652 775 +777 3 656.5279 490.9648 42.3702 0.1525 776 +778 3 656.6526 490.0404 42.5253 0.1652 777 +779 3 657.4637 489.2899 42.7224 0.1652 778 +780 3 658.3205 488.536 42.8966 0.178 779 +781 3 659.1408 487.7444 43.0035 0.178 780 +782 3 659.8889 486.8978 43.0293 0.1907 781 +783 3 660.692 486.1062 43.0802 0.178 782 +784 3 661.5214 485.334 43.1771 0.1652 783 +785 3 662.2902 484.4909 43.2972 0.1525 784 +786 3 663.0224 483.6134 43.4403 0.1525 785 +787 3 663.7065 482.7074 43.6422 0.1398 786 +788 3 664.2888 481.7338 43.8808 0.1398 787 +789 3 664.6686 480.6619 44.0975 0.1398 788 +790 3 665.0244 479.5968 44.3456 0.1525 789 +791 3 665.4076 478.5661 44.6578 0.1398 790 +792 3 665.7474 477.4896 44.9296 0.1271 791 +793 3 666.3892 476.5687 45.1158 0.1144 792 +794 3 667.2826 475.864 45.2281 0.1271 793 +795 3 668.3751 475.6237 45.2743 0.1398 794 +796 3 669.5008 475.5093 45.225 0.1652 795 +797 3 670.6139 475.2988 45.1178 0.178 796 +798 3 671.7282 475.0506 45.0274 0.1907 797 +799 3 672.8253 474.784 45.0386 0.1907 798 +800 3 673.9304 474.5381 45.1335 0.178 799 +801 3 675.0595 474.3745 45.2522 0.178 800 +802 3 676.1944 474.2303 45.3757 0.178 801 +803 3 677.3086 473.9752 45.4835 0.2034 802 +804 3 678.4103 473.6675 45.5655 0.2161 803 +805 3 679.4616 473.2328 45.6509 0.2161 804 +806 3 680.4638 472.7855 45.8122 0.1907 805 +807 3 681.53 472.448 45.8553 0.1525 806 +808 3 682.65 472.3267 45.7755 0.1398 807 +809 3 683.5034 471.9057 45.8609 0.1525 808 +810 3 684.2653 471.09 45.8923 0.178 809 +811 3 684.9471 470.43 45.6182 0.1907 810 +812 3 685.8474 470.1039 44.3458 0.178 811 +813 3 581.3476 528.8735 46.6665 0.2669 698 +814 3 582.391 528.5978 47.5129 0.2034 813 +815 3 583.416 528.1951 47.8873 0.178 814 +816 3 584.4788 527.8222 48.2689 0.2034 815 +817 3 585.5919 527.575 48.5834 0.2288 816 +818 3 586.7141 527.3554 48.8233 0.2415 817 +819 3 587.8284 527.0969 49.0118 0.2161 818 +820 3 588.9404 526.8417 49.175 0.2034 819 +821 3 590.0477 526.6175 49.3674 0.178 820 +822 3 591.1609 526.4105 49.5855 0.1525 821 +823 3 592.2888 526.2343 49.7823 0.1398 822 +824 3 593.4203 526.0673 49.94 0.1652 823 +825 3 594.4739 525.684 50.104 0.2288 824 +826 3 595.4795 525.1967 50.2824 0.2669 825 +827 3 596.5651 524.9015 50.3521 0.2796 826 +828 3 597.6759 524.6647 50.3068 0.2415 827 +829 3 598.7822 524.5835 50.1371 0.2415 828 +830 3 599.79 524.1888 49.8585 0.2288 829 +831 3 600.4478 523.3388 49.7017 0.2542 830 +832 3 601.2784 522.5769 49.6034 0.2542 831 +833 3 602.2657 522.0061 49.5054 0.2796 832 +834 3 603.2827 521.5725 49.32 0.2924 833 +835 3 604.1018 520.7957 49.1218 0.2796 834 +836 3 604.7333 519.8439 48.9454 0.2288 835 +837 3 605.3064 518.8543 48.7724 0.178 836 +838 3 605.8727 517.8602 48.6102 0.178 837 +839 3 606.3692 516.8523 48.3969 0.2161 838 +840 3 606.8691 515.8376 48.1608 0.2415 839 +841 3 607.3908 514.8217 47.9718 0.2161 840 +842 3 608.0028 513.8562 47.784 0.178 841 +843 3 608.6629 512.9261 47.5776 0.1525 842 +844 3 609.0107 511.8393 47.376 0.1525 843 +845 3 609.5243 510.8646 47.08 0.1398 844 +846 3 610.4121 510.2892 46.676 0.1271 845 +847 3 611.1751 509.4655 46.3904 0.1144 846 +848 3 611.6465 508.4314 46.1376 0.1144 847 +849 3 612.0812 507.4338 45.8335 0.1144 848 +850 3 612.9129 506.7542 45.5112 0.1144 849 +851 3 613.8189 506.2166 45.274 0.1144 850 +852 3 614.4218 505.2682 45.2012 0.1144 851 +853 3 615.1528 504.4228 45.2029 0.1144 852 +854 3 616.0657 503.7329 45.2203 0.1271 853 +855 3 616.9523 503.0111 45.2424 0.1525 854 +856 3 617.8092 502.2549 45.243 0.178 855 +857 3 618.7496 501.6223 45.1965 0.178 856 +858 3 619.7986 501.1681 45.0932 0.178 857 +859 3 620.8145 500.6499 44.9425 0.178 858 +860 3 621.7915 500.0573 44.7429 0.1907 859 +861 3 622.6872 499.4475 44.4234 0.178 860 +862 3 623.289 498.5975 43.9348 0.178 861 +863 3 623.909 497.6926 43.3868 0.178 862 +864 3 624.8173 497.1458 42.8056 0.1907 863 +865 3 625.8607 496.782 42.2162 0.1907 864 +866 3 626.9269 496.401 41.6945 0.2034 865 +867 3 627.9416 495.9263 41.3375 0.2034 866 +868 3 628.6303 495.1106 41.0203 0.2034 867 +869 3 629.4242 494.4528 40.6118 0.1907 868 +870 3 630.1106 493.6566 40.1478 0.2034 869 +871 3 630.614 492.6762 39.6768 0.2161 870 +872 3 631.2649 491.7576 39.3086 0.2288 871 +873 3 632.0028 490.8858 39.0695 0.2288 872 +874 3 632.8997 490.196 38.9124 0.2288 873 +875 3 633.8412 489.5931 38.7705 0.2288 874 +876 3 634.737 488.9239 38.6316 0.2161 875 +877 3 635.5709 488.2867 38.687 0.2161 876 +878 3 636.239 487.4836 38.913 0.2034 877 +879 3 636.9117 486.5798 39.128 0.2288 878 +880 3 637.5947 485.6623 39.2899 0.2161 879 +881 3 638.2365 484.746 39.34 0.2415 880 +882 3 638.8931 483.8296 39.3064 0.2415 881 +883 3 639.5967 482.9316 39.263 0.2796 882 +884 3 640.2545 481.9958 39.2515 0.2669 883 +885 3 640.6961 480.9502 39.3252 0.2288 884 +886 3 641.5014 480.3324 39.5942 0.178 885 +887 3 641.8584 479.2799 39.9255 0.1652 886 +888 3 642.1993 478.2057 40.269 0.2034 887 +889 3 642.7049 477.1807 40.5185 0.2415 888 +890 3 643.2163 476.158 40.6686 0.2542 889 +891 3 643.7219 475.1455 40.7764 0.2288 890 +892 3 644.2836 474.1548 40.8092 0.1907 891 +893 3 645.0055 473.2842 40.6904 0.1652 892 +894 3 645.7537 472.4411 40.4463 0.1525 893 +895 3 646.5305 471.6334 40.103 0.1525 894 +896 3 647.4045 470.9493 39.6777 0.1525 895 +897 3 648.3288 470.3419 39.1975 0.1652 896 +898 3 649.061 469.4839 38.7433 0.178 897 +899 3 649.7577 468.5916 38.3457 0.1907 898 +900 3 650.4509 467.6855 38.0355 0.178 899 +901 3 651.1511 466.784 37.805 0.1652 900 +902 3 651.8935 465.9123 37.6625 0.178 901 +903 3 652.6692 465.0726 37.5838 0.2034 902 +904 3 653.605 464.4137 37.5441 0.2288 903 +905 3 654.5076 463.7112 37.5281 0.2034 904 +906 3 655.1722 462.78 37.5234 0.178 905 +907 3 567.9251 532.6693 48.9927 0.2034 685 +908 3 568.528 532.4165 51.5194 0.2161 907 +909 3 569.1297 532.1636 52.6394 0.2034 908 +910 3 569.7314 531.9108 53.9342 0.2161 909 +911 3 570.6718 531.8262 55.0164 0.2669 910 +912 3 571.3067 531.8948 58.0194 0.2034 911 +913 3 570.9407 531.857 60.5021 0.2034 912 +914 3 570.7919 530.9968 61.5336 0.178 913 +915 3 571.3491 530.252 62.6783 0.1525 914 +916 3 571.5721 530.5426 63.9587 0.1271 915 +917 3 572.4256 531.0219 65.0832 0.1144 916 +918 3 573.1955 531.8273 66.0402 0.1398 917 +919 3 573.6336 532.8546 66.836 0.178 918 +920 3 573.6851 533.9883 67.4943 0.2288 919 +921 3 573.8842 535.1037 68.0694 0.2288 920 +922 3 574.423 535.9857 68.6199 0.2034 921 +923 3 575.2924 536.083 69.2793 0.1652 922 +924 3 576.2362 536.4662 69.9093 0.1525 923 +925 3 577.2315 536.7842 70.6037 0.1525 924 +926 3 578.3309 536.9902 71.2956 0.1398 925 +927 3 579.4314 536.862 71.9785 0.1271 926 +928 3 580.4473 537.0302 72.7275 0.1144 927 +929 3 581.5421 537.1458 73.458 0.1144 928 +930 3 582.6415 537.2556 74.1754 0.1144 929 +931 3 583.742 537.3654 74.8726 0.1144 930 +932 3 584.8643 537.3906 75.5317 0.1144 931 +933 3 585.9957 537.2247 76.0967 0.1144 932 +934 3 587.126 537.0519 76.6226 0.1144 933 +935 3 588.2311 537.0497 77.224 0.1144 934 +936 3 589.2401 537.1995 77.9573 0.1144 935 +937 3 590.2491 537.3505 78.7727 0.1144 936 +938 3 591.257 537.5015 79.6264 0.1271 937 +939 3 592.266 537.6525 81.5186 0.1652 938 +940 3 571.8135 532.4885 55.8093 0.2034 911 +941 3 572.3501 533.4655 56.4564 0.2034 940 +942 3 572.4954 534.5672 57.008 0.2288 941 +943 3 572.4542 535.6757 57.5165 0.2161 942 +944 3 572.5503 536.7717 57.9858 0.2415 943 +945 3 572.8843 537.8047 58.5511 0.2288 944 +946 3 573.1783 538.8091 59.2312 0.2669 945 +947 3 573.7057 539.7552 59.8788 0.2669 946 +948 3 574.3544 540.659 60.4923 0.2669 947 +949 3 574.8714 541.6348 61.1237 0.2161 948 +950 3 575.4766 542.5683 61.7641 0.1652 949 +951 3 576.0772 543.5304 62.3633 0.1271 950 +952 3 576.2751 544.5474 62.9815 0.1144 951 +953 3 576.4216 545.585 63.7006 0.1144 952 +954 3 576.5691 546.6238 64.4809 0.1144 953 +955 3 576.7156 547.6614 65.2834 0.1144 954 +956 3 576.862 548.699 66.0786 0.1144 955 +957 3 577.2338 549.7034 66.7624 0.1144 956 +958 3 577.8436 550.6713 67.2521 0.1144 957 +959 3 578.4533 551.6391 67.5828 0.1144 958 +960 3 579.0631 552.6069 67.7998 0.1144 959 +961 3 579.6728 553.5747 67.9459 0.1144 960 +962 3 580.262 554.5208 68.1044 0.1271 961 +963 3 580.8397 555.4578 68.3525 0.1525 962 +964 3 581.4735 556.4027 68.581 0.178 963 +965 3 581.8601 557.4243 68.7406 0.178 964 +966 3 581.9173 558.51 68.9391 0.1525 965 +967 3 581.9173 559.5075 69.3739 0.1271 966 +968 3 581.9208 560.4307 70.0288 0.1144 967 +969 3 582.2651 561.3883 70.5944 0.1144 968 +970 3 582.852 562.2909 71.2135 0.1144 969 +971 3 583.4423 563.1923 71.8502 0.1144 970 +972 3 584.1012 564.0629 72.4346 0.1144 971 +973 3 585.1194 564.5766 72.8067 0.1144 972 +974 3 586.1421 565.088 73.022 0.1144 973 +975 3 587.166 565.5959 73.1444 0.1144 974 +976 3 588.1887 566.1061 73.1923 0.1144 975 +977 3 589.2126 566.614 73.2046 0.1144 976 +978 3 590.1988 567.1941 73.2365 0.1144 977 +979 3 590.9618 568.0338 73.3583 0.1144 978 +980 3 591.726 568.8734 73.5437 0.1144 979 +981 3 592.4902 569.7131 73.768 0.1144 980 +982 3 593.2544 570.5528 74.0093 0.1398 981 +983 3 594.0186 571.3925 74.5368 0.1652 982 +984 3 560.1676 531.2095 43.0066 0.2415 677 +985 3 560.5531 532.0275 44.1543 0.2288 984 +986 3 561.5759 532.4737 44.5936 0.2034 985 +987 3 562.7096 532.4931 45.0092 0.1652 986 +988 3 563.8193 532.5892 45.4194 0.1652 987 +989 3 564.9061 532.5835 45.808 0.1907 988 +990 3 565.9654 533.0022 46.0872 0.2161 989 +991 3 567.0305 533.3488 46.1952 0.2288 990 +992 3 568.0338 533.7115 46.1079 0.2161 991 +993 3 569.0714 534.0958 45.9855 0.2034 992 +994 3 569.6994 534.9001 45.953 0.178 993 +995 3 570.0277 535.9629 45.9836 0.178 994 +996 3 570.9029 536.5131 46.1594 0.178 995 +997 3 571.9817 536.8071 46.3966 0.1907 996 +998 3 573.0147 537.2785 46.6346 0.178 997 +999 3 573.7103 537.7921 47.0666 0.178 998 +1000 3 574.2708 538.5986 47.3984 0.2034 999 +1001 3 574.9012 539.4875 47.7582 0.2415 1000 +1002 3 575.718 540.2597 48.0091 0.2542 1001 +1003 3 576.838 540.4828 48.2387 0.2161 1002 +1004 3 577.9797 540.4862 48.466 0.178 1003 +1005 3 579.0859 540.5503 48.7869 0.1398 1004 +1006 3 580.1201 540.6761 49.2758 0.1271 1005 +1007 3 581.2115 540.961 49.7767 0.1271 1006 +1008 3 582.2971 541.3133 50.2317 0.1652 1007 +1009 3 583.3977 541.5124 50.7016 0.2034 1008 +1010 3 584.4616 541.525 51.2406 0.2288 1009 +1011 3 585.5495 541.6577 51.7656 0.2161 1010 +1012 3 586.6329 542.0283 52.18 0.2034 1011 +1013 3 587.7071 542.4173 52.5294 0.178 1012 +1014 3 588.7447 542.9001 52.8399 0.1652 1013 +1015 3 589.7823 543.3497 53.1454 0.1525 1014 +1016 3 590.8199 543.6425 53.5727 0.1652 1015 +1017 3 591.8026 544.0315 54.1036 0.1652 1016 +1018 3 592.6057 544.8106 54.6661 0.1652 1017 +1019 3 593.5358 545.386 55.2577 0.1525 1018 +1020 3 594.6489 545.6011 55.7973 0.1525 1019 +1021 3 595.7346 545.7715 56.3097 0.1525 1020 +1022 3 596.6818 546.3058 56.8313 0.1398 1021 +1023 3 597.6977 546.713 57.3409 0.1398 1022 +1024 3 598.7971 546.9395 57.8001 0.1398 1023 +1025 3 599.9056 547.2038 58.1434 0.1525 1024 +1026 3 601.0027 547.499 58.3464 0.1398 1025 +1027 3 602.0986 547.801 58.4962 0.1271 1026 +1028 3 603.1854 548.0858 58.6642 0.1144 1027 +1029 3 604.3054 548.262 58.8157 0.1271 1028 +1030 3 605.4483 548.3192 58.9215 0.1398 1029 +1031 3 606.59 548.3421 58.9966 0.1525 1030 +1032 3 607.7317 548.2631 59.043 0.1398 1031 +1033 3 608.87 548.159 59.0542 0.1271 1032 +1034 3 610.0014 548.1968 59.036 0.1144 1033 +1035 3 611.1076 548.4885 59.0041 0.1271 1034 +1036 3 612.223 548.7082 58.9537 0.1398 1035 +1037 3 613.3556 548.7791 58.8622 0.1525 1036 +1038 3 614.4882 548.874 58.7583 0.1398 1037 +1039 3 615.6184 549.0296 58.6757 0.1271 1038 +1040 3 616.7384 549.2298 58.6496 0.1271 1039 +1041 3 617.8344 549.5215 58.7345 0.1525 1040 +1042 3 618.8891 549.8968 58.9173 0.178 1041 +1043 3 619.8386 550.4848 59.1914 0.178 1042 +1044 3 620.7584 551.1323 59.4941 0.1525 1043 +1045 3 621.6496 551.845 59.7551 0.1271 1044 +1046 3 622.582 552.5028 59.953 0.1144 1045 +1047 3 623.5635 553.0885 60.0704 0.1144 1046 +1048 3 624.5245 553.6971 60.1073 0.1144 1047 +1049 3 625.4694 554.3172 60.0832 0.1144 1048 +1050 3 626.4624 554.8686 60.109 0.1144 1049 +1051 3 627.4748 555.3571 60.2367 0.1144 1050 +1052 3 628.4987 555.8364 60.4318 0.1144 1051 +1053 3 629.5546 556.2357 60.6584 0.1271 1052 +1054 3 630.6758 556.4393 60.8773 0.1525 1053 +1055 3 631.8118 556.5652 61.063 0.178 1054 +1056 3 632.9477 556.6887 61.192 0.2034 1055 +1057 3 634.086 556.8077 61.2584 0.2034 1056 +1058 3 635.214 556.9804 61.278 0.2161 1057 +1059 3 636.318 557.279 61.2646 0.1907 1058 +1060 3 637.3979 557.6531 61.2237 0.178 1059 +1061 3 638.4367 558.1256 61.1514 0.1525 1060 +1062 3 639.4617 558.6198 61.0464 0.1652 1061 +1063 3 640.5393 558.9778 60.9132 0.1907 1062 +1064 3 641.6513 559.2078 60.7684 0.2034 1063 +1065 3 642.785 559.3142 60.6533 0.2034 1064 +1066 3 643.929 559.3142 60.5962 0.178 1065 +1067 3 645.0684 559.2558 60.6015 0.1907 1066 +1068 3 646.1953 559.0659 60.6746 0.1907 1067 +1069 3 647.3175 558.9184 60.8149 0.2288 1068 +1070 3 648.4512 558.9355 61.0182 0.2161 1069 +1071 3 649.5815 558.9515 61.2654 0.2161 1070 +1072 3 650.7003 558.9573 61.5546 0.1652 1071 +1073 3 651.8215 558.9435 61.8195 0.1525 1072 +1074 3 652.9529 558.9035 61.9581 0.1652 1073 +1075 3 654.082 558.8143 62.0158 0.2161 1074 +1076 3 655.194 558.6026 62.0959 0.2415 1075 +1077 3 656.2796 558.296 62.2009 0.2288 1076 +1078 3 657.3893 558.0512 62.2874 0.1907 1077 +1079 3 658.5184 558.0661 62.4252 0.178 1078 +1080 3 659.6498 558.1015 62.6046 0.1652 1079 +1081 3 660.7893 558.002 62.776 0.1652 1080 +1082 3 661.8612 557.7458 62.9955 0.1398 1081 +1083 3 662.5144 556.9987 63.2862 0.1398 1082 +1084 3 663.3438 556.3329 63.5631 0.1398 1083 +1085 3 664.4512 556.1728 63.7241 0.1525 1084 +1086 3 665.5506 556.1602 63.6644 0.1398 1085 +1087 3 666.571 556.3078 63.3578 0.1271 1086 +1088 3 667.5892 556.7585 62.9812 0.1144 1087 +1089 3 668.6955 556.675 62.6175 0.1271 1088 +1090 3 669.7319 556.2014 62.2947 0.1398 1089 +1091 3 670.7192 555.6431 61.9758 0.1525 1090 +1092 3 671.695 555.1489 61.6084 0.1525 1091 +1093 3 672.6949 554.6478 61.2424 0.1525 1092 +1094 3 673.7073 554.1422 60.8952 0.1525 1093 +1095 3 674.7964 553.8024 60.6124 0.1398 1094 +1096 3 675.9084 553.5347 60.4069 0.1271 1095 +1097 3 676.9792 553.1354 60.2714 0.1271 1096 +1098 3 677.9607 552.5497 60.1905 0.1525 1097 +1099 3 678.8896 551.8828 60.1496 0.178 1098 +1100 3 679.6813 551.0659 60.0944 0.178 1099 +1101 3 680.7017 550.6896 59.9466 0.1652 1100 +1102 3 681.8332 550.5386 59.8399 0.1525 1101 +1103 3 682.9371 550.2514 59.8156 0.1652 1102 +1104 3 684.0159 550.2091 60.265 0.178 1103 +1105 3 546.7691 525.0811 43.0937 0.2034 1 +1106 3 545.6846 525.4266 43.3272 0.2034 1105 +1107 3 544.7602 526.097 43.4095 0.2034 1106 +1108 3 543.638 526.3212 43.4997 0.2034 1107 +1109 3 543.3062 526.1119 43.6803 0.2542 1108 +1110 3 542.3956 525.5227 43.899 0.2924 1109 +1111 3 541.4106 524.9919 44.0118 0.3051 1110 +1112 3 540.3741 524.6087 44.1294 0.3051 1111 +1113 3 539.5047 524.111 44.3946 0.2924 1112 +1114 3 538.5963 523.6466 44.7476 0.2542 1113 +1115 3 537.4787 523.6557 45.059 0.2034 1114 +1116 3 536.3552 523.8708 45.3124 0.1652 1115 +1117 3 535.2364 523.8159 45.5221 0.178 1116 +1118 3 534.1885 523.3857 45.6722 0.2288 1117 +1119 3 533.1726 522.8629 45.7794 0.2924 1118 +1120 3 532.1762 522.3687 45.9472 0.3178 1119 +1121 3 531.126 522.0301 46.1874 0.3051 1120 +1122 3 530.069 521.6365 46.3778 0.2669 1121 +1123 3 529.1275 521.0325 46.4551 0.2288 1122 +1124 3 528.1859 520.4262 46.5587 0.2161 1123 +1125 3 527.1689 519.9514 46.683 0.2288 1124 +1126 3 526.264 519.3382 46.8289 0.2796 1125 +1127 3 525.2447 519.0248 46.9899 0.3178 1126 +1128 3 524.1819 518.7674 46.9322 0.3178 1127 +1129 3 523.118 518.7445 46.6281 0.2669 1128 +1130 3 521.823 518.542 45.9365 0.3686 1129 +1131 3 520.8552 518.5157 45.1847 0.3051 1130 +1132 3 519.7821 518.4837 44.4909 0.2415 1131 +1133 3 518.7537 518.3167 44.0112 0.2288 1132 +1134 3 517.6703 518.0924 43.8421 0.2669 1133 +1135 3 516.7036 517.692 43.9636 0.3178 1134 +1136 3 515.7495 517.1441 44.1294 0.3178 1135 +1137 3 514.6707 516.7986 44.2781 0.2924 1136 +1138 3 513.6366 517.0125 44.2907 0.2669 1137 +1139 3 512.5978 517.4118 44.3808 0.2796 1138 +1140 3 511.4984 517.5902 44.5556 0.2924 1139 +1141 3 510.3762 517.7126 44.7779 0.3178 1140 +1142 3 509.6062 518.4185 45.1366 0.3432 1141 +1143 3 508.5881 518.8806 45.4874 0.3559 1142 +1144 3 507.5184 519.0488 45.6316 0.3559 1143 +1145 3 506.4065 519.1666 45.6506 0.3305 1144 +1146 3 505.3197 519.0877 45.6669 0.3305 1145 +1147 3 504.4113 519.559 45.8604 0.3178 1146 +1148 3 503.4206 520.1185 46.0463 0.2924 1147 +1149 3 502.391 520.5806 46.2927 0.2415 1148 +1150 3 501.4038 520.925 46.5041 0.2161 1149 +1151 3 500.4131 520.7248 46.65 0.2288 1150 +1152 3 499.4944 520.9936 46.9927 0.2542 1151 +1153 3 498.8606 521.656 47.2959 0.2669 1152 +1154 3 497.9237 521.9443 47.488 0.2796 1153 +1155 3 496.8014 521.9832 47.7218 0.2924 1154 +1156 3 495.8107 522.1594 48.1029 0.3178 1155 +1157 3 494.9527 522.7016 48.3412 0.3178 1156 +1158 3 493.8579 522.7439 48.5313 0.3305 1157 +1159 3 492.7734 522.84 48.5741 0.3178 1158 +1160 3 491.9017 523.1363 48.8144 0.3305 1159 +1161 3 490.9499 523.7426 48.9392 0.3178 1160 +1162 3 490.0278 524.4188 49.0412 0.3051 1161 +1163 3 489.2099 525.2035 49.1554 0.2669 1162 +1164 3 488.4983 526.0695 49.3027 0.2415 1163 +1165 3 487.5728 526.6427 49.5653 0.2288 1164 +1166 3 486.5935 527.0557 49.7972 0.2288 1165 +1167 3 485.6154 527.5785 49.9621 0.2415 1166 +1168 3 484.7551 528.2958 50.1813 0.2415 1167 +1169 3 484.19 529.2556 50.4619 0.2288 1168 +1170 3 483.3583 529.9088 50.7979 0.1907 1169 +1171 3 482.2898 530.117 51.1932 0.1652 1170 +1172 3 481.1836 530.2795 51.606 0.1525 1171 +1173 3 480.0704 530.5208 51.9509 0.1652 1172 +1174 3 478.9596 530.7966 52.2035 0.178 1173 +1175 3 477.954 531.3216 52.3821 0.1907 1174 +1176 3 476.9794 531.9188 52.507 0.178 1175 +1177 3 475.9326 532.3512 52.64 0.1652 1176 +1178 3 474.8641 532.7299 52.8007 0.1652 1177 +1179 3 473.7567 532.9896 52.9631 0.1652 1178 +1180 3 472.6367 533.2138 53.1126 0.1652 1179 +1181 3 471.5591 533.5856 53.2291 0.1525 1180 +1182 3 470.5158 534.0535 53.3016 0.1525 1181 +1183 3 469.4656 534.5088 53.3308 0.1652 1182 +1184 3 468.4062 534.9378 53.3254 0.1652 1183 +1185 3 467.3354 535.3417 53.2938 0.178 1184 +1186 3 466.2544 535.7169 53.237 0.1652 1185 +1187 3 465.1744 536.0921 53.1549 0.1652 1186 +1188 3 464.0991 536.4834 53.0457 0.1398 1187 +1189 3 463.0157 536.8517 52.897 0.1271 1188 +1190 3 461.9003 536.8781 52.6487 0.1271 1189 +1191 3 460.7757 536.8117 52.3006 0.1398 1190 +1192 3 459.6672 536.5669 51.919 0.1525 1191 +1193 3 458.5312 536.4834 51.5388 0.1398 1192 +1194 3 458.3447 537.0611 50.9236 0.1271 1193 +1195 3 458.0668 537.7063 50.1553 0.1144 1194 +1196 3 457.0211 538.0861 49.5071 0.1144 1195 +1197 3 455.9 538.3046 49.035 0.1144 1196 +1198 3 455.0397 538.9373 48.7133 0.1144 1197 +1199 3 454.0101 539.2805 48.5237 0.1144 1198 +1200 3 453.0309 539.8296 48.4512 0.1144 1199 +1201 3 452.2278 540.6384 48.44 0.1144 1200 +1202 3 451.6443 541.6154 48.44 0.1144 1201 +1203 3 451.3011 542.7022 48.44 0.1144 1202 +1204 3 451.0918 543.8256 48.44 0.1144 1203 +1205 3 450.4729 544.7625 48.44 0.1144 1204 +1206 3 449.9398 545.7692 48.44 0.1144 1205 +1207 3 449.1413 546.5746 48.44 0.1144 1206 +1208 3 448.5189 547.5321 48.44 0.1144 1207 +1209 3 448.2226 548.6338 48.44 0.1144 1208 +1210 3 447.8428 549.7126 48.44 0.1144 1209 +1211 3 447.1633 550.6324 48.44 0.1398 1210 +1212 3 446.6176 551.6368 48.44 0.1907 1211 +1213 3 522.6844 518.2972 47.2147 0.3178 1129 +1214 3 522.1788 517.5433 48.2154 0.3432 1213 +1215 3 521.6446 516.6853 48.6668 0.3559 1214 +1216 3 520.7454 516.0607 49.0087 0.3432 1215 +1217 3 519.7112 515.6397 49.3531 0.3305 1216 +1218 3 518.6061 515.5596 49.7162 0.3432 1217 +1219 3 517.5994 516.0035 49.9682 0.3305 1218 +1220 3 516.635 516.4199 50.2972 0.3178 1219 +1221 3 515.5127 516.4565 50.6316 0.2542 1220 +1222 3 514.395 516.2472 50.9068 0.2415 1221 +1223 3 513.275 516.0149 51.1487 0.2542 1222 +1224 3 512.1505 516.1808 51.4158 0.2924 1223 +1225 3 511.1495 516.5469 51.8426 0.3178 1224 +1226 3 510.0513 516.6029 52.3471 0.3432 1225 +1227 3 508.9301 516.4302 52.8609 0.3813 1226 +1228 3 507.8902 516.4496 53.4674 0.1525 1227 +1229 3 506.7771 516.4565 54.07 0.1398 1228 +1230 3 505.648 516.4565 54.626 0.1271 1229 +1231 3 504.5212 516.4222 55.1348 0.1144 1230 +1232 3 503.392 516.4222 55.61 0.1144 1231 +1233 3 502.2629 516.4474 56.061 0.1271 1232 +1234 3 501.1326 516.5354 56.478 0.1525 1233 +1235 3 500.0172 516.754 56.8593 0.1907 1234 +1236 3 498.9167 517.0262 57.2303 0.2288 1235 +1237 3 497.8963 517.4037 57.6559 0.2669 1236 +1238 3 496.8392 517.7332 58.093 0.2796 1237 +1239 3 495.7227 517.6943 58.4931 0.2542 1238 +1240 3 494.5947 517.811 58.8154 0.2034 1239 +1241 3 493.4724 517.9963 59.0388 0.178 1240 +1242 3 492.3787 518.2926 59.2693 0.2034 1241 +1243 3 491.2473 518.3201 59.4966 0.2542 1242 +1244 3 490.1274 518.1062 59.738 0.3178 1243 +1245 3 489.0737 518.0261 60.149 0.3432 1244 +1246 3 487.9881 517.8465 60.6659 0.3432 1245 +1247 3 486.907 517.5639 61.2357 0.2924 1246 +1248 3 485.8339 517.6406 61.8677 0.2415 1247 +1249 3 484.786 517.97 62.5198 0.2161 1248 +1250 3 483.7404 518.4013 63.1226 0.2034 1249 +1251 3 482.6914 518.8292 63.6675 0.2034 1250 +1252 3 481.6251 519.2319 64.1606 0.1652 1251 +1253 3 480.5921 519.7123 64.5954 0.1398 1252 +1254 3 479.725 520.3152 65.1109 0.1271 1253 +1255 3 478.7651 520.6847 65.7499 0.1525 1254 +1256 3 477.7344 520.3633 66.3743 0.2034 1255 +1257 3 476.7528 520.0224 67.0986 0.2288 1256 +1258 3 475.7541 519.6986 67.909 0.2288 1257 +1259 3 474.8138 519.7707 68.7924 0.178 1258 +1260 3 473.8768 520.0498 69.6654 0.1398 1259 +1261 3 472.7717 520.2866 70.3934 0.1144 1260 +1262 3 471.7112 520.6699 71.043 0.1144 1261 +1263 3 470.7057 521.0828 71.6887 0.1271 1262 +1264 3 469.66 521.3986 72.3159 0.1398 1263 +1265 3 468.651 521.8608 72.8773 0.1652 1264 +1266 3 467.65 522.0655 73.4546 0.1652 1265 +1267 3 466.585 521.9042 74.0782 0.1652 1266 +1268 3 465.4913 521.998 74.6508 0.1398 1267 +1269 3 464.3713 522.2188 75.1114 0.1271 1268 +1270 3 463.3463 522.2085 75.6064 0.1144 1269 +1271 3 462.287 522.1216 76.125 0.1144 1270 +1272 3 461.1453 522.0438 76.491 0.1144 1271 +1273 3 460.0024 522.0072 76.7346 0.1144 1272 +1274 3 458.8584 522.0072 76.8894 0.1652 1273 +1275 3 457.7144 522.0072 77.0 0.2288 1274 +1276 3 508.0355 515.896 54.9959 0.2288 1227 +1277 3 507.1707 515.4464 55.9359 0.2415 1276 +1278 3 506.1434 515.0151 56.2814 0.2161 1277 +1279 3 505.1835 514.4923 56.6748 0.2034 1278 +1280 3 504.4285 513.9134 56.8686 0.2034 1279 +1281 3 503.5648 513.3139 57.2258 0.2161 1280 +1282 3 502.4814 513.0932 57.6626 0.2288 1281 +1283 3 501.382 512.8117 58.0152 0.2288 1282 +1284 3 500.2495 512.7705 58.3954 0.2161 1283 +1285 3 499.3892 512.5612 59.0489 0.2034 1284 +1286 3 498.5609 512.3221 59.8536 0.1907 1285 +1287 3 497.8093 511.5076 60.5763 0.1907 1286 +1288 3 497.1481 510.7846 61.3544 0.1907 1287 +1289 3 496.2844 510.343 62.0166 0.178 1288 +1290 3 495.1758 510.1393 62.4621 0.1652 1289 +1291 3 494.0558 510.2332 62.811 0.1398 1290 +1292 3 493.0034 510.407 63.2464 0.1398 1291 +1293 3 491.9097 510.3258 63.742 0.1652 1292 +1294 3 490.927 509.8247 64.272 0.2034 1293 +1295 3 489.9214 509.3454 64.8553 0.2288 1294 +1296 3 489.0852 508.6258 65.3212 0.2034 1295 +1297 3 488.0018 508.4474 65.8717 0.1907 1296 +1298 3 487.0511 508.4451 66.5932 0.1907 1297 +1299 3 485.9506 508.325 67.2988 0.2161 1298 +1300 3 485.0377 507.7244 68.0546 0.2288 1299 +1301 3 484.0218 507.4944 68.8201 0.2034 1300 +1302 3 482.9076 507.6271 69.5752 0.178 1301 +1303 3 481.8162 507.4818 70.3391 0.1398 1302 +1304 3 480.9044 507.1077 71.2186 0.1271 1303 +1305 3 480.0132 506.6662 72.2033 0.1144 1304 +1306 3 479.0077 506.3561 73.2127 0.1144 1305 +1307 3 477.9724 506.2612 74.2353 0.1144 1306 +1308 3 476.9954 506.0038 75.2441 0.1144 1307 +1309 3 476.2678 505.7818 76.3017 0.1144 1308 +1310 3 475.443 505.9843 77.226 0.1144 1309 +1311 3 474.3344 506.2658 77.8705 0.1144 1310 +1312 3 473.5439 506.975 78.2916 0.1144 1311 +1313 3 472.7717 507.809 78.5361 0.1144 1312 +1314 3 471.6815 508.119 78.6509 0.1144 1313 +1315 3 470.5558 508.3227 78.68 0.1144 1314 +1316 3 469.493 508.7414 78.68 0.1144 1315 +1317 3 468.3536 508.8478 78.68 0.1144 1316 +1318 3 467.2096 508.8512 78.68 0.1144 1317 +1319 3 466.0656 508.8512 78.68 0.1144 1318 +1320 3 464.9216 508.8512 78.68 0.1271 1319 +1321 3 463.7776 508.8512 78.68 0.1398 1320 +1322 3 543.924 526.1325 43.3835 0.178 1108 +1323 3 544.7156 526.2766 44.2246 0.1652 1322 +1324 3 545.0005 527.3291 44.6102 0.178 1323 +1325 3 544.7648 528.4205 44.9473 0.2034 1324 +1326 3 545.0245 529.5198 45.2525 0.2415 1325 +1327 3 545.5233 530.4087 45.7355 0.2288 1326 +1328 3 546.2772 530.9098 46.4002 0.2161 1327 +1329 3 546.6627 531.9726 46.9678 0.178 1328 +1330 3 546.8103 533.0491 47.4446 0.1907 1329 +1331 3 547.69 533.6817 47.9847 0.2034 1330 +1332 3 548.4302 534.2617 48.5848 0.2288 1331 +1333 3 548.7265 535.3371 49.1761 0.2034 1332 +1334 3 549.2252 536.2546 49.8327 0.178 1333 +1335 3 550.0329 536.9547 50.5372 0.178 1334 +1336 3 551.0431 537.434 51.1896 0.2161 1335 +1337 3 552.0464 537.9271 51.7891 0.2415 1336 +1338 3 552.9101 538.5083 52.4356 0.2288 1337 +1339 3 553.7784 539.1558 53.0376 0.2161 1338 +1340 3 554.6318 539.8833 53.4668 0.2288 1339 +1341 3 555.4806 540.5389 53.9608 0.2542 1340 +1342 3 556.0218 541.4289 54.5241 0.2542 1341 +1343 3 557.0433 541.6932 55.1622 0.2288 1342 +1344 3 558.097 542.0787 55.7687 0.1907 1343 +1345 3 559.1014 542.4917 56.4007 0.1525 1344 +1346 3 559.9891 543.1735 56.9862 0.1271 1345 +1347 3 560.8346 543.8576 57.5089 0.1144 1346 +1348 3 561.5724 544.5577 58.0468 0.1144 1347 +1349 3 562.3446 545.1721 58.4892 0.1525 1348 +1350 3 563.4555 545.1412 58.7653 0.2034 1349 +1351 3 564.4668 545.3482 59.0276 0.2669 1350 +1352 3 565.5238 545.7246 59.2911 0.2669 1351 +1353 3 566.3292 546.1319 59.7484 0.2415 1352 +1354 3 567.3554 546.451 60.1247 0.2034 1353 +1355 3 568.4639 546.721 60.4668 0.1907 1354 +1356 3 569.529 547.094 60.8594 0.1907 1355 +1357 3 570.6055 547.2988 61.308 0.2034 1356 +1358 3 571.6236 547.5012 61.8195 0.2161 1357 +1359 3 572.6978 547.8788 62.2348 0.2415 1358 +1360 3 573.8007 548.135 62.6699 0.2288 1359 +1361 3 574.8749 548.4267 63.17 0.2288 1360 +1362 3 575.9411 548.7745 63.6574 0.2034 1361 +1363 3 576.989 548.9164 64.1508 0.2161 1362 +1364 3 577.9534 548.8237 64.836 0.2161 1363 +1365 3 578.9235 548.5022 65.6155 0.2288 1364 +1366 3 579.9005 548.0195 66.4045 0.2288 1365 +1367 3 581.0079 547.9211 67.111 0.2034 1366 +1368 3 582.1461 547.8994 67.744 0.178 1367 +1369 3 583.2409 547.7312 68.3707 0.1525 1368 +1370 3 584.3277 547.547 68.994 0.1652 1369 +1371 3 585.4283 547.4932 69.6256 0.178 1370 +1372 3 586.5334 547.4715 70.2663 0.178 1371 +1373 3 587.5515 547.4646 70.9836 0.1525 1372 +1374 3 588.6406 547.5642 71.6612 0.1271 1373 +1375 3 589.772 547.6889 72.2154 0.1144 1374 +1376 3 590.9046 547.8136 72.6611 0.1144 1375 +1377 3 592.0372 547.9394 73.0206 0.1144 1376 +1378 3 593.1709 548.0652 73.3135 0.1144 1377 +1379 3 594.3034 548.1899 73.5588 0.1144 1378 +1380 3 595.436 548.3146 73.7867 0.1144 1379 +1381 3 596.5697 548.4405 74.0127 0.1144 1380 +1382 3 597.6107 548.8981 74.228 0.1144 1381 +1383 3 598.3257 549.7881 74.4173 0.1271 1382 +1384 3 599.3633 550.2686 74.6077 0.1398 1383 +1385 3 600.4398 550.6404 74.8278 0.1525 1384 +1386 3 601.5381 550.8921 75.1041 0.1398 1385 +1387 3 602.6363 551.1437 75.4155 0.1271 1386 +1388 3 603.7334 551.3943 75.7436 0.1398 1387 +1389 3 604.8317 551.646 76.4733 0.1652 1388 +1390 3 554.5311 523.4155 33.8556 0.1907 1 +1391 3 555.5195 523.1821 33.2139 0.1907 1390 +1392 3 556.4816 522.5655 33.0028 0.2161 1391 +1393 3 557.2493 522.0804 32.6494 0.2415 1392 +1394 3 557.8487 521.2304 32.3232 0.2669 1393 +1395 3 558.3246 520.2008 32.051 0.2415 1394 +1396 3 558.2034 519.0751 31.9379 0.2161 1395 +1397 3 558.3029 518.3944 32.7558 0.178 1396 +1398 3 558.6221 517.3546 31.2326 0.2034 1397 +1399 3 558.4802 516.8523 30.4298 0.2288 1398 +1400 3 558.4836 515.7701 29.5968 0.2034 1399 +1401 3 559.1094 515.1238 28.4418 0.2288 1400 +1402 3 559.7695 514.6398 27.1417 0.2542 1401 +1403 3 560.5863 514.2795 25.8372 0.2542 1402 +1404 3 560.8666 513.8516 24.5535 0.2924 1403 +1405 3 560.1813 513.195 23.4935 0.3051 1404 +1406 3 559.1563 512.7191 22.7792 0.2924 1405 +1407 3 558.653 511.9938 22.5964 0.2161 1406 +1408 3 558.0684 511.0557 22.6043 0.1652 1407 +1409 3 556.9839 510.7354 22.6632 0.1398 1408 +1410 3 556.0229 510.4963 22.7421 0.178 1409 +1411 3 554.9269 510.1668 22.7757 0.1525 1410 +1412 3 553.7932 510.0558 22.7167 0.1652 1411 +1413 3 552.8163 509.9403 22.7671 0.1652 1412 +1414 3 551.7283 509.8007 22.6735 0.178 1413 +1415 3 551.1083 509.4598 22.2007 0.1652 1414 +1416 3 550.3189 508.6693 21.669 0.178 1415 +1417 3 549.6119 507.8353 21.1109 0.1652 1416 +1418 3 548.8763 507.3972 20.4708 0.178 1417 +1419 3 547.7449 507.5322 19.9428 0.1907 1418 +1420 3 546.6021 507.5322 19.5521 0.2288 1419 +1421 3 545.4661 507.5997 19.2757 0.2542 1420 +1422 3 544.369 507.8616 18.9882 0.2542 1421 +1423 3 543.3382 508.1442 18.5965 0.2415 1422 +1424 3 542.3292 508.3764 18.1 0.2415 1423 +1425 3 541.5845 509.0571 17.5422 0.2415 1424 +1426 3 540.969 509.9746 17.0044 0.2288 1425 +1427 3 540.0721 510.2606 16.7211 0.1907 1426 +1428 3 539.0288 509.9437 16.6231 0.1652 1427 +1429 3 537.958 509.5628 16.6096 0.178 1428 +1430 3 537.5084 509.1338 15.7273 0.1907 1429 +1431 3 557.7801 510.2972 21.6829 0.1652 1409 +1432 3 557.597 509.6165 20.1249 0.1652 1431 +1433 3 557.104 508.7196 19.5466 0.1652 1432 +1434 3 556.8454 508.3776 18.7427 0.1907 1433 +1435 3 556.1545 508.1236 17.9839 0.2161 1434 +1436 3 555.3559 507.5322 17.4124 0.2034 1435 +1437 3 558.4402 514.7863 31.5946 0.2669 1400 +1438 3 558.3772 513.6812 30.8031 0.2288 1437 +1439 3 558.8795 512.8735 30.4175 0.1652 1438 +1440 3 559.8542 512.4285 29.8816 0.1271 1439 +1441 3 560.4662 511.6162 29.2258 0.1144 1440 +1442 3 560.6664 510.693 28.4435 0.1144 1441 +1443 3 561.4111 510.1325 27.7303 0.1271 1442 +1444 3 562.26 510.661 27.2825 0.1398 1443 +1445 3 562.2211 511.6506 26.3992 0.1652 1444 +1446 3 559.2776 519.1403 32.1003 0.1907 1396 +1447 3 559.9983 518.4986 32.4302 0.1907 1446 +1448 3 560.7339 517.7504 32.5088 0.1907 1447 +1449 3 561.3757 517.0491 32.3456 0.2288 1448 +1450 3 561.839 516.0058 32.1504 0.2415 1449 +1451 3 562.4762 515.0723 31.9416 0.2288 1450 +1452 3 563.1878 514.2108 31.6932 0.2161 1451 +1453 3 563.9531 513.4844 31.3026 0.2288 1452 +1454 3 564.3752 512.5543 30.9064 0.2542 1453 +1455 3 564.9724 511.6517 30.5822 0.2542 1454 +1456 3 565.7663 510.836 30.2515 0.2415 1455 +1457 3 566.7319 510.5375 29.7447 0.2161 1456 +1458 3 567.6711 510.693 29.0142 0.2161 1457 +1459 3 568.7224 510.7274 28.1982 0.2288 1458 +1460 3 569.5438 510.1256 27.2978 0.2669 1459 +1461 3 569.1594 509.8694 27.9712 0.1907 1460 +1462 3 569.1686 508.9015 28.1492 0.2034 1461 +1463 3 569.7566 508.031 28.168 0.2415 1462 +1464 3 570.6272 507.3823 27.994 0.2542 1463 +1465 3 571.5081 506.7085 27.713 0.2415 1464 +1466 3 572.6406 506.6055 27.3894 0.2415 1465 +1467 3 573.7183 506.4133 26.9682 0.2542 1466 +1468 3 574.7479 506.093 26.6821 0.2415 1467 +1469 3 575.7844 505.974 26.5146 0.2034 1468 +1470 3 576.6366 506.0381 26.1963 0.1525 1469 +1471 3 576.7659 505.354 25.4658 0.1525 1470 +1472 3 576.894 504.671 24.4202 0.1652 1471 +1473 3 577.029 503.9606 23.1805 0.1907 1472 +1474 3 577.6491 503.1472 22.1266 0.1652 1473 +1475 3 578.6135 502.637 21.1768 0.1398 1474 +1476 3 579.5367 502.1165 20.313 0.1144 1475 +1477 3 580.4587 501.596 19.5544 0.1271 1476 +1478 3 581.2309 500.8546 18.9501 0.1525 1477 +1479 3 581.8578 499.8983 18.5251 0.178 1478 +1480 3 581.7171 498.9956 18.1056 0.178 1479 +1481 3 580.9404 498.1994 17.8605 0.1652 1480 +1482 3 580.4278 497.1961 17.6627 0.178 1481 +1483 3 580.1418 496.0922 17.555 0.2034 1482 +1484 3 579.7803 495.0088 17.4758 0.2288 1483 +1485 3 579.2301 494.0078 17.3999 0.2161 1484 +1486 3 578.7279 492.9805 17.2928 0.2034 1485 +1487 3 578.332 491.9292 17.0856 0.178 1486 +1488 3 578.0117 490.8618 16.7991 0.178 1487 +1489 3 577.7966 489.7876 15.9191 0.178 1488 +1490 3 570.459 510.2778 26.3477 0.2161 1460 +1491 3 570.4705 510.7617 26.1302 0.1907 1490 +1492 3 570.983 511.4172 26.4256 0.2161 1491 +1493 3 572.0686 511.6551 26.4796 0.2288 1492 +1494 3 573.1932 511.7776 26.4406 0.2161 1493 +1495 3 574.2766 512.115 26.3196 0.1907 1494 +1496 3 575.3679 512.3564 26.1365 0.1525 1495 +1497 3 575.9274 513.0131 25.9501 0.1271 1496 +1498 3 575.9823 514.0587 25.5577 0.1398 1497 +1499 3 576.2248 515.1077 25.0383 0.178 1498 +1500 3 577.0908 515.7369 24.5171 0.2288 1499 +1501 3 578.0929 516.0893 23.8838 0.2669 1500 +1502 3 579.0036 516.5435 23.1305 0.2796 1501 +1503 3 579.8456 517.2138 22.3609 0.2924 1502 +1504 3 580.8111 517.6772 21.6161 0.2669 1503 +1505 3 581.9208 517.4724 20.9959 0.2796 1504 +1506 3 582.9023 516.8878 20.5298 0.2669 1505 +1507 3 583.7489 516.1842 20.0882 0.2669 1506 +1508 3 584.5337 515.9898 19.7501 0.2415 1507 +1509 3 585.6628 515.896 19.5107 0.2415 1508 +1510 3 586.7999 515.976 19.3314 0.1907 1509 +1511 3 587.6145 516.5755 19.1427 0.1525 1510 +1512 3 588.0194 517.485 18.8361 0.1398 1511 +1513 3 588.6223 518.3121 18.5705 0.178 1512 +1514 3 589.3739 519.1552 18.4706 0.2161 1513 +1515 3 590.3029 519.7775 18.465 0.2669 1514 +1516 3 591.3428 520.234 18.5498 0.2669 1515 +1517 3 591.925 520.9856 18.831 0.2288 1516 +1518 3 592.3335 522.0118 19.1098 0.178 1517 +1519 3 593.0416 522.8652 19.2081 0.178 1518 +1520 3 593.8847 523.5905 19.2731 0.2034 1519 +1521 3 594.8503 524.1282 19.1541 0.2415 1520 +1522 3 595.8787 524.6121 18.9317 0.2288 1521 +1523 3 596.5136 525.5033 18.5796 0.2161 1522 +1524 3 596.993 526.4928 18.1582 0.1652 1523 +1525 3 597.8944 527.1735 17.7652 0.1525 1524 +1526 3 598.8577 527.7798 17.0562 0.1525 1525 +1527 3 583.9296 515.6992 19.6619 0.178 1507 +1528 3 584.2065 514.5975 19.6309 0.1525 1527 +1529 3 584.3689 513.4661 19.62 0.1271 1528 +1530 3 584.5646 512.3381 19.6116 0.1144 1529 +1531 3 584.9272 511.2708 19.6057 0.1271 1530 +1532 3 585.4042 510.2343 19.6019 0.1398 1531 +1533 3 585.8916 509.2058 19.6001 0.1525 1532 +1534 3 586.4178 508.1923 19.6 0.1398 1533 +1535 3 587.0379 507.2507 19.6 0.1271 1534 +1536 3 587.9863 506.6707 19.6 0.1398 1535 +1537 3 588.8019 505.9489 19.6 0.1652 1536 +1538 3 589.6542 505.2121 19.6 0.1907 1537 +1539 3 590.7296 504.8952 19.6 0.1652 1538 +1540 3 591.8553 504.695 19.6 0.1525 1539 +1541 3 592.4959 503.8473 19.6 0.1398 1540 +1542 3 593.1262 502.8932 19.6 0.1525 1541 +1543 3 593.6925 501.9003 19.6 0.1398 1542 +1544 3 594.6821 501.3363 19.6 0.1525 1543 +1545 3 595.7952 501.072 19.6 0.1907 1544 +1546 3 571.1981 509.2573 25.3975 0.2415 1490 +1547 3 572.0812 508.6544 24.6505 0.2161 1546 +1548 3 573.0674 508.1408 24.2391 0.2034 1547 +1549 3 574.1095 507.7335 24.0326 0.2034 1548 +1550 3 575.2307 507.5207 23.9246 0.2288 1549 +1551 3 576.1459 506.9442 23.859 0.2415 1550 +1552 3 576.7613 506.4225 23.5821 0.2161 1551 +1553 3 577.2761 505.5233 23.2401 0.178 1552 +1554 3 577.847 504.5692 23.0335 0.1525 1553 +1555 3 578.6329 503.908 23.0569 0.178 1554 +1556 3 579.452 503.2193 23.2073 0.2034 1555 +1557 3 580.3134 502.5672 23.2321 0.2415 1556 +1558 3 581.2138 502.0032 23.0722 0.2415 1557 +1559 3 582.1713 501.4369 22.7998 0.2415 1558 +1560 3 583.1471 500.8649 22.4538 0.2161 1559 +1561 3 584.1882 500.4085 22.0923 0.2034 1560 +1562 3 585.259 500.0138 21.762 0.1907 1561 +1563 3 586.3755 499.8582 21.4986 0.2034 1562 +1564 3 587.5172 499.7999 21.2872 0.2161 1563 +1565 3 588.4633 499.2828 21.0862 0.2161 1564 +1566 3 589.057 498.3447 20.8162 0.2034 1565 +1567 3 589.2183 497.2579 20.4586 0.178 1566 +1568 3 589.0822 496.1322 20.0717 0.1652 1567 +1569 3 588.922 495.0832 19.5759 0.1398 1568 +1570 3 589.0662 494.0982 18.9586 0.1271 1569 +1571 3 589.3099 493.0526 18.3427 0.1271 1570 +1572 3 589.9242 492.111 17.8577 0.1525 1571 +1573 3 590.6918 491.3366 17.4301 0.178 1572 +1574 3 591.1494 490.3562 17.2909 0.178 1573 +1575 3 591.774 489.4615 17.3888 0.1525 1574 +1576 3 592.6675 488.782 17.5993 0.1398 1575 +1577 3 593.7303 488.385 17.8328 0.1525 1576 +1578 3 594.769 487.9149 17.9709 0.178 1577 +1579 3 595.8707 487.6517 18.0013 0.1907 1578 +1580 3 596.9953 487.6529 17.9082 0.178 1579 +1581 3 598.129 487.7593 17.7848 0.1652 1580 +1582 3 599.2283 487.9526 17.7804 0.1398 1581 +1583 3 600.3529 487.8668 17.848 0.1398 1582 +1584 3 601.4202 487.4618 17.8911 0.1525 1583 +1585 3 602.5173 487.2456 17.9327 0.1907 1584 +1586 3 603.5836 487.6094 17.9858 0.2161 1585 +1587 3 604.4793 488.3175 18.0136 0.2161 1586 +1588 3 605.3156 489.0932 18.0058 0.2034 1587 +1589 3 606.2685 489.5016 17.9511 0.1907 1588 +1590 3 607.2695 489.0325 17.8152 0.2034 1589 +1591 3 608.1962 488.3908 17.7317 0.2034 1590 +1592 3 608.9832 487.6094 17.7191 0.1907 1591 +1593 3 609.7955 486.8464 17.6776 0.1525 1592 +1594 3 610.8468 486.4391 17.5762 0.1271 1593 +1595 3 611.9359 486.3739 17.3889 0.1144 1594 +1596 3 613.0307 486.4757 17.1487 0.1144 1595 +1597 3 614.1198 486.3361 16.8421 0.1144 1596 +1598 3 615.2375 486.0948 16.6173 0.1144 1597 +1599 3 616.354 485.8476 16.4862 0.1271 1598 +1600 3 617.4797 485.7275 16.4966 0.1525 1599 +1601 3 618.5951 485.668 16.9296 0.178 1600 +1602 4 549.3008 518.1714 38.7442 0.1525 1 +1603 4 549.0182 517.0628 38.7394 0.2034 1602 +1604 4 548.6018 516.0001 38.7327 0.2542 1603 +1605 4 548.1407 514.9522 38.7218 0.2415 1604 +1606 4 547.674 513.9077 38.7069 0.2288 1605 +1607 4 547.4566 512.7911 38.6918 0.2161 1606 +1608 4 547.2942 511.6586 38.6806 0.2288 1607 +1609 4 547.1592 510.5363 38.6212 0.2288 1608 +1610 4 547.1203 509.414 38.5106 0.2415 1609 +1611 4 546.7622 508.3456 38.4978 0.2542 1610 +1612 4 546.2749 508.7528 38.4804 0.178 1611 +1613 4 545.2144 508.4451 39.0102 0.178 1612 +1614 4 544.2649 508.182 39.3375 0.2034 1613 +1615 4 543.3245 507.6294 39.4876 0.2034 1614 +1616 4 542.296 507.1661 39.5654 0.2034 1615 +1617 4 541.2047 506.9098 39.6189 0.178 1616 +1618 4 540.1224 506.8835 39.7964 0.178 1617 +1619 4 539.0574 507.0059 40.0635 0.1652 1618 +1620 4 538.0003 507.3274 40.2478 0.1652 1619 +1621 4 537.0485 507.5345 40.5577 0.1398 1620 +1622 4 536.0166 507.6923 40.9984 0.1398 1621 +1623 4 534.8944 507.761 41.3837 0.1525 1622 +1624 4 533.7698 507.8193 41.6304 0.2034 1623 +1625 4 532.929 508.4142 41.9202 0.2415 1624 +1626 4 531.9623 508.7391 42.3231 0.2669 1625 +1627 4 530.8389 508.6876 42.6936 0.2415 1626 +1628 4 529.6983 508.6762 42.992 0.2161 1627 +1629 4 528.7065 509.0548 43.342 0.2034 1628 +1630 4 527.5831 509.1441 43.5117 0.2415 1629 +1631 4 526.4596 509.3202 43.5554 0.2669 1630 +1632 4 525.3591 509.5456 43.4795 0.2542 1631 +1633 4 524.2186 509.5284 43.3972 0.2161 1632 +1634 4 523.0951 509.4072 43.3882 0.2161 1633 +1635 4 521.9866 509.6085 43.4409 0.2796 1634 +1636 4 520.9524 510.0924 43.5226 0.3432 1635 +1637 4 519.8714 510.4574 43.5929 0.3813 1636 +1638 4 518.7468 510.6496 43.6246 0.3559 1637 +1639 4 517.6097 510.7262 43.6047 0.3432 1638 +1640 4 516.4691 510.7365 43.5621 0.3051 1639 +1641 4 515.364 510.8864 43.5632 0.2796 1640 +1642 4 514.4454 511.2513 43.7063 0.2288 1641 +1643 4 513.5565 511.9366 43.7296 0.2161 1642 +1644 4 512.5589 512.4823 43.6814 0.2288 1643 +1645 4 511.5991 513.0966 43.5988 0.2415 1644 +1646 4 510.6644 513.7098 43.4465 0.2542 1645 +1647 4 509.5891 513.8837 43.2172 0.2542 1646 +1648 4 508.4577 513.7521 43.0013 0.2669 1647 +1649 4 507.3514 513.704 42.8061 0.2542 1648 +1650 4 506.3767 514.0793 42.637 0.2669 1649 +1651 4 505.3826 514.5723 42.5986 0.2796 1650 +1652 4 504.4662 515.1077 42.7619 0.3305 1651 +1653 4 503.5957 515.6111 43.1715 0.3305 1652 +1654 4 502.5363 515.9246 43.6262 0.3559 1653 +1655 4 501.4129 515.9989 44.098 0.3305 1654 +1656 4 500.3547 515.6717 44.5785 0.3432 1655 +1657 4 499.3297 515.6672 45.1119 0.3305 1656 +1658 4 498.2509 515.9143 45.586 0.3686 1657 +1659 4 497.1527 516.2174 45.932 0.4195 1658 +1660 4 496.0292 516.4268 46.1614 0.4576 1659 +1661 4 494.9241 516.6887 46.247 0.4703 1660 +1662 4 493.8362 517.0068 46.2129 0.4322 1661 +1663 4 492.7002 517.0228 46.1574 0.394 1662 +1664 4 491.5619 516.9256 46.0981 0.3432 1663 +1665 4 490.4225 516.9141 46.0401 0.3051 1664 +1666 4 489.2945 516.9427 46.0967 0.2924 1665 +1667 4 488.2478 517.3362 46.128 0.2796 1666 +1668 4 487.336 517.9986 46.2678 0.3051 1667 +1669 4 486.2263 518.073 46.5136 0.2924 1668 +1670 4 485.2345 518.6427 46.7407 0.2796 1669 +1671 4 483.9566 518.0604 47.2928 0.3305 1670 +1672 4 482.9522 517.5399 47.5054 0.3432 1671 +1673 4 481.9809 516.9393 47.5955 0.3305 1672 +1674 4 480.9696 516.421 47.6588 0.3305 1673 +1675 4 479.8886 516.0824 47.6773 0.3178 1674 +1676 4 478.8452 515.6534 47.7036 0.2796 1675 +1677 4 477.8946 515.0345 47.7974 0.2669 1676 +1678 4 476.937 514.4522 47.973 0.2161 1677 +1679 4 475.9429 513.942 48.2272 0.2034 1678 +1680 4 475.0151 513.3094 48.4652 0.1652 1679 +1681 4 474.1251 512.5932 48.6354 0.178 1680 +1682 4 473.1813 511.9572 48.7782 0.178 1681 +1683 4 472.17 511.4412 48.9224 0.2034 1682 +1684 4 471.1141 511.034 49.0778 0.2034 1683 +1685 4 470.1314 510.4848 49.1938 0.2161 1684 +1686 4 469.2596 509.7607 49.2327 0.2034 1685 +1687 4 468.3136 509.1624 49.2831 0.2161 1686 +1688 4 467.2828 508.7025 49.3713 0.1907 1687 +1689 4 466.1834 508.5458 49.3892 0.178 1688 +1690 4 465.0806 508.389 49.4208 0.1525 1689 +1691 4 464.0613 507.9154 49.4449 0.1525 1690 +1692 4 463.2639 507.1569 49.3486 0.1525 1691 +1693 4 462.3327 506.5289 49.1868 0.1398 1692 +1694 4 461.2871 506.077 49.0028 0.1398 1693 +1695 4 460.1568 506.0061 48.837 0.1398 1694 +1696 4 459.1261 505.5656 48.6545 0.1652 1695 +1697 4 458.1995 504.9776 48.4067 0.1652 1696 +1698 4 457.1973 504.4399 48.2286 0.1652 1697 +1699 4 456.122 504.0544 48.1202 0.1398 1698 +1700 4 455.0901 503.5671 48.085 0.1271 1699 +1701 4 454.2092 502.8601 48.1426 0.1144 1700 +1702 4 453.2928 502.1851 48.2552 0.1144 1701 +1703 4 452.333 501.5651 48.3818 0.1271 1702 +1704 4 451.3469 500.9976 48.4411 0.1525 1703 +1705 4 450.355 500.4714 48.41 0.178 1704 +1706 4 449.338 499.9566 48.4123 0.2034 1705 +1707 4 448.3256 499.4498 48.4806 0.2161 1706 +1708 4 447.4344 498.7417 48.5862 0.2288 1707 +1709 4 446.5741 497.9924 48.7206 0.2034 1708 +1710 4 445.898 497.0714 48.8538 0.1907 1709 +1711 4 445.2402 496.1356 48.9782 0.178 1710 +1712 4 444.7094 495.1232 49.0818 0.2034 1711 +1713 4 444.0882 494.1634 49.1742 0.1907 1712 +1714 4 443.1764 493.5159 49.3326 0.1907 1713 +1715 4 442.1228 493.1441 49.5499 0.1652 1714 +1716 4 441.6115 492.8878 49.7162 0.1144 1715 +1717 4 440.5887 492.3765 49.8333 0.1144 1716 +1718 4 439.5648 491.8651 49.9038 0.1144 1717 +1719 4 438.5421 491.3537 49.9324 0.1144 1718 +1720 4 437.54 490.8046 49.9142 0.1144 1719 +1721 4 436.5653 490.2097 49.8588 0.1144 1720 +1722 4 435.53 489.7613 49.7904 0.1144 1721 +1723 4 434.4226 489.4867 49.7199 0.1144 1722 +1724 4 433.3506 489.1206 49.6913 0.1144 1723 +1725 4 432.3279 488.6287 49.74 0.1144 1724 +1726 4 431.3429 488.0624 49.8221 0.1144 1725 +1727 4 430.3854 487.4355 49.8968 0.1144 1726 +1728 4 429.4828 486.7388 49.9576 0.1144 1727 +1729 4 428.6316 485.9735 50.0004 0.1144 1728 +1730 4 427.8366 485.1544 50.0226 0.1144 1729 +1731 4 427.0918 484.2861 50.0273 0.1144 1730 +1732 4 426.4203 483.3629 50.0265 0.1144 1731 +1733 4 425.8185 482.3905 50.0254 0.1144 1732 +1734 4 425.2328 481.4078 50.0223 0.1144 1733 +1735 4 424.6608 480.4171 50.015 0.1144 1734 +1736 4 424.0533 479.4493 50.0021 0.1271 1735 +1737 4 423.3509 478.5718 50.0304 0.1525 1736 +1738 4 422.9391 477.572 50.0181 0.178 1737 +1739 4 422.5639 476.5057 49.9355 0.1907 1738 +1740 4 422.0696 475.4739 49.8243 0.1907 1739 +1741 4 421.5571 474.4511 49.6933 0.2034 1740 +1742 4 420.9485 473.5096 49.4816 0.2034 1741 +1743 4 420.2438 472.6402 49.1873 0.1907 1742 +1744 4 419.3835 471.9069 48.8947 0.1525 1743 +1745 4 418.4569 471.2388 48.6186 0.1271 1744 +1746 4 417.5417 470.5798 48.3098 0.1271 1745 +1747 4 416.6608 469.8717 47.9872 0.1525 1746 +1748 4 415.8417 469.0778 47.7089 0.2034 1747 +1749 4 414.97 468.3456 47.4583 0.2415 1748 +1750 4 413.9964 467.777 47.1915 0.2669 1749 +1751 4 413.111 467.2462 46.8188 0.2542 1750 +1752 4 412.2015 466.6182 46.4864 0.2415 1751 +1753 4 411.2154 466.1434 46.3529 0.2161 1752 +1754 4 410.3414 465.4192 46.2493 0.2288 1753 +1755 4 409.2088 465.2648 46.2 0.2542 1754 +1756 4 441.5451 492.8123 51.24 0.1144 1715 +1757 4 440.8393 491.92 51.3299 0.1144 1756 +1758 4 440.13 491.0654 51.3654 0.1144 1757 +1759 4 439.725 490.0027 51.4167 0.1144 1758 +1760 4 439.2159 488.9845 51.4884 0.1144 1759 +1761 4 438.7046 487.9938 51.585 0.1144 1760 +1762 4 437.9381 487.1484 51.711 0.1144 1761 +1763 4 437.2734 486.2332 51.9058 0.1144 1762 +1764 4 436.4966 485.4827 52.2301 0.1144 1763 +1765 4 435.737 484.6876 52.591 0.1144 1764 +1766 4 435.1387 483.7312 52.9659 0.1144 1765 +1767 4 434.6159 482.7646 53.3971 0.1144 1766 +1768 4 433.6835 482.3047 53.7818 0.1144 1767 +1769 4 432.9914 481.5542 54.1682 0.1144 1768 +1770 4 431.9721 481.1973 54.462 0.1144 1769 +1771 4 430.8533 480.9593 54.6616 0.1144 1770 +1772 4 429.7413 480.6916 54.7848 0.1144 1771 +1773 4 428.603 480.6024 54.8481 0.1144 1772 +1774 4 427.856 479.7936 54.88 0.1144 1773 +1775 4 484.3044 519.6105 47.0798 0.2161 1670 +1776 4 483.364 520.1757 47.4099 0.1907 1775 +1777 4 482.2303 520.2226 47.6694 0.178 1776 +1778 4 481.1103 520.0201 47.805 0.2161 1777 +1779 4 480.027 519.6689 47.8663 0.2415 1778 +1780 4 478.9859 519.1941 47.8993 0.2669 1779 +1781 4 477.93 518.7537 47.9125 0.2796 1780 +1782 4 476.8535 518.367 47.9363 0.2796 1781 +1783 4 475.7541 518.0718 47.9872 0.2796 1782 +1784 4 474.6159 517.9609 48.071 0.2288 1783 +1785 4 473.481 517.8613 48.1936 0.1907 1784 +1786 4 472.3565 517.8007 48.3916 0.1652 1785 +1787 4 471.2319 517.7996 48.6279 0.2034 1786 +1788 4 470.0971 517.9449 48.8261 0.2542 1787 +1789 4 468.9634 518.0844 48.9989 0.3051 1788 +1790 4 467.8342 518.192 49.1856 0.3178 1789 +1791 4 466.7074 518.2743 49.3861 0.2924 1790 +1792 4 465.5737 518.3201 49.525 0.2415 1791 +1793 4 464.4491 518.3121 49.5642 0.1907 1792 +1794 4 463.3131 518.2743 49.6138 0.178 1793 +1795 4 462.1874 518.2137 49.7395 0.178 1794 +1796 4 461.0583 518.2331 49.8974 0.1907 1795 +1797 4 459.9258 518.3979 50.0374 0.178 1796 +1798 4 458.792 518.5226 50.1836 0.1652 1797 +1799 4 457.6595 518.5317 50.3653 0.1525 1798 +1800 4 456.5315 518.4917 50.5618 0.1525 1799 +1801 4 455.3932 518.4722 50.7214 0.1398 1800 +1802 4 454.2492 518.4677 50.8175 0.1525 1801 +1803 4 453.1121 518.4116 50.8452 0.1652 1802 +1804 4 451.9875 518.2629 50.7858 0.1907 1803 +1805 4 450.8596 518.121 50.6792 0.1652 1804 +1806 4 449.7247 517.994 50.5778 0.1398 1805 +1807 4 448.5887 517.8659 50.5098 0.1271 1806 +1808 4 447.4516 517.7607 50.4988 0.1525 1807 +1809 4 446.3156 517.8099 50.5557 0.178 1808 +1810 4 445.2986 518.1759 50.7338 0.178 1809 +1811 4 444.3891 518.709 51.0521 0.1525 1810 +1812 4 443.3378 519.1014 51.38 0.1271 1811 +1813 4 442.2532 519.4538 51.6359 0.1144 1812 +1814 4 441.147 519.7352 51.7784 0.1144 1813 +1815 4 440.0293 519.956 51.8028 0.1271 1814 +1816 4 438.9128 520.1699 51.7194 0.1398 1815 +1817 4 437.7962 520.3781 51.5673 0.1525 1816 +1818 4 436.674 520.5886 51.4186 0.1398 1817 +1819 4 435.5494 520.7957 51.3097 0.1398 1818 +1820 4 434.4157 520.9135 51.2414 0.1398 1819 +1821 4 433.2717 520.9135 51.2075 0.1525 1820 +1822 4 432.1277 520.8884 51.1994 0.1398 1821 +1823 4 430.9951 520.7557 51.207 0.1398 1822 +1824 4 429.8763 520.5189 51.2218 0.1398 1823 +1825 4 428.7666 520.2432 51.2434 0.1525 1824 +1826 4 427.673 519.908 51.2747 0.1398 1825 +1827 4 426.5587 519.6906 51.3173 0.1271 1826 +1828 4 425.4181 519.7158 51.3699 0.1398 1827 +1829 4 424.2799 519.7421 51.4444 0.178 1828 +1830 4 423.1587 519.6231 51.585 0.2288 1829 +1831 4 422.0388 519.5407 51.786 0.2288 1830 +1832 4 420.9154 519.5407 51.9347 0.2161 1831 +1833 4 419.8183 519.6849 51.9893 0.2034 1832 +1834 4 418.7555 519.9835 52.1108 0.2161 1833 +1835 4 417.7202 520.3278 52.365 0.2161 1834 +1836 4 416.6551 520.6538 52.6834 0.178 1835 +1837 4 415.5386 520.8174 53.011 0.1652 1836 +1838 4 414.4014 520.7591 53.3123 0.1652 1837 +1839 4 413.2643 520.6447 53.5749 0.1907 1838 +1840 4 412.1214 520.6092 53.7986 0.1652 1839 +1841 4 410.9774 520.6092 54.0036 0.1652 1840 +1842 4 409.8655 520.7705 54.264 0.178 1841 +1843 4 408.7729 521.0417 54.6014 0.2415 1842 +1844 4 407.6999 521.3952 54.9906 0.2542 1843 +1845 4 406.6268 521.7075 55.4417 0.2415 1844 +1846 4 405.5503 521.9843 55.9434 0.1907 1845 +1847 4 404.4749 522.26 56.4707 0.1652 1846 +1848 4 403.3858 522.5037 56.9926 0.1525 1847 +1849 4 402.259 522.5769 57.4596 0.1398 1848 +1850 4 401.1173 522.5769 57.8659 0.1271 1849 +1851 4 399.9756 522.5769 58.228 0.1271 1850 +1852 4 398.8339 522.5769 58.5651 0.1398 1851 +1853 4 397.7242 522.7302 58.9366 0.1525 1852 +1854 4 396.6362 522.9739 59.3684 0.1525 1853 +1855 4 395.5506 523.2244 59.8522 0.1652 1854 +1856 4 394.4706 523.5001 60.3686 0.1907 1855 +1857 4 393.4182 523.8639 60.8916 0.2034 1856 +1858 4 392.376 524.2655 61.3992 0.1907 1857 +1859 4 391.3338 524.6659 61.8733 0.1652 1858 +1860 4 390.2642 525.0274 62.2782 0.1525 1859 +1861 4 389.1613 525.3156 62.573 0.1652 1860 +1862 4 388.0471 525.5776 62.7637 0.1652 1861 +1863 4 386.934 525.8396 62.876 0.178 1862 +1864 4 385.8197 526.1016 62.9331 0.178 1863 +1865 4 384.8565 525.6909 62.9633 0.1907 1864 +1866 4 383.8051 525.2665 62.9779 0.178 1865 +1867 4 382.8087 524.7139 62.9868 0.1525 1866 +1868 4 381.6967 524.5046 62.9933 0.1271 1867 +1869 4 380.6832 523.9989 62.9975 0.1144 1868 +1870 4 379.6295 523.5573 62.9997 0.1144 1869 +1871 4 378.6262 523.0093 63.0 0.1144 1870 +1872 4 377.8037 522.2223 63.0 0.1144 1871 +1873 4 377.5989 521.1103 63.0 0.1144 1872 +1874 4 376.4904 520.8632 63.0 0.1144 1873 +1875 4 546.5929 507.1444 38.6025 0.2288 1611 +1876 4 546.5357 506.0495 38.7671 0.2161 1875 +1877 4 546.2188 504.9582 38.8699 0.2161 1876 +1878 4 545.9717 503.8519 38.9178 0.1907 1877 +1879 4 545.9145 502.7148 38.9494 0.178 1878 +1880 4 546.0712 501.5914 38.9922 0.1525 1879 +1881 4 545.9122 500.5286 39.0547 0.1525 1880 +1882 4 545.5793 499.459 39.0785 0.178 1881 +1883 4 545.4192 498.3413 39.069 0.2161 1882 +1884 4 545.1743 497.2785 39.1636 0.2796 1883 +1885 4 545.1412 496.2695 39.433 0.3178 1884 +1886 4 545.275 495.1838 39.646 0.3432 1885 +1887 4 545.3276 494.0456 39.8124 0.3305 1886 +1888 4 545.4912 492.9164 39.9515 0.2924 1887 +1889 4 545.4626 491.777 40.0008 0.2415 1888 +1890 4 545.3562 490.641 39.9809 0.2034 1889 +1891 4 545.0943 489.5268 39.9434 0.2161 1890 +1892 4 544.8323 488.4136 39.9202 0.2415 1891 +1893 4 544.7694 488.9525 40.6241 0.2415 1892 +1894 4 544.536 489.7556 42.7512 0.2542 1893 +1895 4 543.9045 489.8894 43.741 0.2288 1894 +1896 4 543.098 490.3459 44.8126 0.2161 1895 +1897 4 542.0455 490.768 45.7159 0.2034 1896 +1898 4 540.9404 491.0231 46.424 0.1907 1897 +1899 4 539.8444 491.0563 47.0406 0.1652 1898 +1900 4 538.713 491.0094 47.4796 0.1525 1899 +1901 4 537.6731 490.6101 47.7898 0.1652 1900 +1902 4 536.933 489.7636 48.0231 0.178 1901 +1903 4 536.4113 488.8232 48.2269 0.2034 1902 +1904 4 535.837 487.892 48.3297 0.2161 1903 +1905 4 534.9241 487.3005 48.449 0.2161 1904 +1906 4 533.8282 487.1667 48.673 0.2034 1905 +1907 4 532.7791 486.9127 49.0358 0.178 1906 +1908 4 531.6877 486.6542 49.4539 0.178 1907 +1909 4 530.5655 486.6656 49.9248 0.178 1908 +1910 4 529.5427 486.2961 50.3642 0.1907 1909 +1911 4 528.8575 485.4964 50.913 0.178 1910 +1912 4 527.8565 485.1338 51.5236 0.178 1911 +1913 4 526.971 484.889 52.3292 0.1907 1912 +1914 4 525.8762 484.8878 53.1482 0.2161 1913 +1915 4 525.0205 485.5742 53.9554 0.2161 1914 +1916 4 524.4382 486.1428 54.9035 0.2161 1915 +1917 4 523.5196 486.6759 55.7673 0.2288 1916 +1918 4 522.5964 487.32 56.4558 0.2415 1917 +1919 4 521.5771 487.7147 56.9895 0.2161 1918 +1920 4 520.4868 487.7581 57.3566 0.1907 1919 +1921 4 519.5842 487.2605 57.7338 0.2161 1920 +1922 4 518.6988 486.8326 57.9751 0.2924 1921 +1923 4 517.827 487.241 58.2274 0.3559 1922 +1924 4 516.9198 487.8233 58.5864 0.3559 1923 +1925 4 515.8548 487.8531 58.7672 0.3178 1924 +1926 4 514.7634 487.821 59.0657 0.2669 1925 +1927 4 513.8082 487.328 59.4507 0.2288 1926 +1928 4 512.6722 487.3429 59.8175 0.2034 1927 +1929 4 511.5785 487.3337 60.1644 0.178 1928 +1930 4 510.6347 487.805 60.4629 0.1652 1929 +1931 4 509.5731 487.8485 60.6707 0.1525 1930 +1932 4 508.5114 488.1345 60.8684 0.1652 1931 +1933 4 507.4075 488.1848 60.9988 0.1907 1932 +1934 4 506.2761 488.0418 61.1148 0.2161 1933 +1935 4 505.1469 488.0018 61.2752 0.2415 1934 +1936 4 504.0224 487.9034 61.4908 0.2415 1935 +1937 4 502.9424 487.5854 61.7515 0.2415 1936 +1938 4 501.8854 487.4092 62.0992 0.2161 1937 +1939 4 500.7837 487.4698 62.5008 0.2034 1938 +1940 4 499.8422 487.1186 62.7514 0.1907 1939 +1941 4 498.7977 486.8406 62.8944 0.1907 1940 +1942 4 497.7738 486.7068 63.1834 0.2161 1941 +1943 4 496.8598 486.0936 63.4928 0.2415 1942 +1944 4 496.2947 485.1796 63.8826 0.2669 1943 +1945 4 495.5819 484.2975 64.2485 0.2542 1944 +1946 4 494.8315 483.4407 64.5882 0.2288 1945 +1947 4 494.1794 482.5152 64.8592 0.1907 1946 +1948 4 493.2196 482.0988 65.1146 0.178 1947 +1949 4 492.2815 482.5655 65.3918 0.1907 1948 +1950 4 491.4567 482.5426 65.5351 0.1144 1949 +1951 4 490.3436 482.4202 65.6001 0.1144 1950 +1952 4 489.2808 482.0175 65.6939 0.1144 1951 +1953 4 488.2306 481.5851 65.8095 0.1144 1952 +1954 4 487.1587 481.1858 65.9008 0.1271 1953 +1955 4 486.0764 480.8152 65.9781 0.1525 1954 +1956 4 484.9702 480.5246 66.0593 0.178 1955 +1957 4 483.864 480.2398 66.143 0.178 1956 +1958 4 482.792 479.8577 66.2497 0.1525 1957 +1959 4 481.7647 479.3738 66.3919 0.1271 1958 +1960 4 480.7454 478.8612 66.514 0.1144 1959 +1961 4 479.7387 478.3327 66.6058 0.1144 1960 +1962 4 478.7262 477.8099 66.745 0.1144 1961 +1963 4 477.7047 477.318 66.9477 0.1144 1962 +1964 4 476.6293 476.9897 67.1924 0.1144 1963 +1965 4 475.5871 476.6899 67.4419 0.1144 1964 +1966 4 474.9533 475.8079 67.7564 0.1144 1965 +1967 4 474.6124 474.7703 68.1514 0.1144 1966 +1968 4 474.045 473.8116 68.5524 0.1144 1967 +1969 4 473.3723 472.9102 68.9352 0.1144 1968 +1970 4 472.631 472.0647 69.2524 0.1144 1969 +1971 4 471.7112 471.3863 69.4756 0.1144 1970 +1972 4 471.0351 470.5272 69.6119 0.1144 1971 +1973 4 470.4242 469.58 69.6819 0.1144 1972 +1974 4 469.7092 468.6888 69.7119 0.1144 1973 +1975 4 468.9908 467.7999 69.7194 0.1144 1974 +1976 4 468.4268 466.8115 69.72 0.1144 1975 +1977 4 467.4773 466.2509 69.72 0.1144 1976 +1978 4 466.6056 465.5176 69.72 0.1398 1977 +1979 4 465.4936 465.2648 69.72 0.1907 1978 +1980 4 491.6489 482.8103 65.8801 0.1398 1949 +1981 4 490.8595 482.3241 65.333 0.1525 1980 +1982 4 490.8069 481.2087 65.1392 0.1907 1981 +1983 4 490.3745 480.1665 64.9544 0.2415 1982 +1984 4 489.727 479.2525 64.7651 0.2415 1983 +1985 4 489.02 478.3544 64.6755 0.2034 1984 +1986 4 488.2786 477.5079 64.7469 0.178 1985 +1987 4 487.5293 476.7906 65.0387 0.178 1986 +1988 4 486.5558 476.2014 65.3324 0.178 1987 +1989 4 485.5536 475.65 65.5827 0.1525 1988 +1990 4 484.5206 475.1593 65.7731 0.1271 1989 +1991 4 483.4807 474.6822 65.9504 0.1144 1990 +1992 4 544.679 487.4184 39.9297 0.1525 1892 +1993 4 544.5051 486.2892 39.9655 0.1398 1992 +1994 4 544.2774 485.1681 40.0092 0.1398 1993 +1995 4 544.0075 484.0573 40.0392 0.1398 1994 +1996 4 543.9159 482.9167 40.0389 0.1652 1995 +1997 4 543.9159 481.775 40.0089 0.1652 1996 +1998 4 543.9159 480.6322 39.9585 0.1652 1997 +1999 4 542.8291 481.5965 39.2384 0.1907 1998 +2000 4 542.0123 481.5096 38.817 0.178 1999 +2001 4 541.1612 480.7568 38.645 0.1652 2000 +2002 4 540.3272 479.9801 38.4796 0.178 2001 +2003 4 539.6385 479.0809 38.2824 0.1652 2002 +2004 4 538.9819 478.16 38.0369 0.1652 2003 +2005 4 538.1994 477.3409 37.774 0.1652 2004 +2006 4 537.3848 476.5401 37.529 0.178 2005 +2007 4 536.5715 475.7381 37.2949 0.1907 2006 +2008 4 535.7375 474.9613 37.0289 0.1652 2007 +2009 4 535.2879 474.0153 36.6621 0.1398 2008 +2010 4 535.217 473.012 36.1438 0.1271 2009 +2011 4 534.8795 471.9995 35.6174 0.1398 2010 +2012 4 534.1874 471.1049 35.1954 0.1525 2011 +2013 4 533.6909 470.0948 34.844 0.1525 2012 +2014 4 533.3042 469.0183 34.5587 0.1652 2013 +2015 4 532.9724 467.9395 34.2583 0.178 2014 +2016 4 532.6361 466.8675 33.9074 0.178 2015 +2017 4 532.1819 465.8437 33.488 0.1525 2016 +2018 4 531.7461 464.8118 33.0019 0.1271 2017 +2019 4 531.4761 463.7307 32.4657 0.1144 2018 +2020 4 531.3033 462.6279 31.8993 0.1144 2019 +2021 4 531.3239 461.5125 31.3309 0.1144 2020 +2022 4 531.404 460.3925 30.7737 0.1144 2021 +2023 4 531.3216 459.284 30.2179 0.1271 2022 +2024 4 530.8332 458.307 29.657 0.1525 2023 +2025 4 530.9155 457.2579 29.0802 0.1907 2024 +2026 4 531.3972 456.2306 28.6152 0.2288 2025 +2027 4 531.9074 455.2159 28.2111 0.2415 2026 +2028 4 531.4429 454.2732 27.785 0.2542 2027 +2029 4 530.3161 454.0788 27.467 0.2288 2028 +2030 4 529.1915 453.8671 27.2276 0.2161 2029 +2031 4 528.0818 453.5903 27.0374 0.178 2030 +2032 4 526.9733 453.3386 26.8599 0.1907 2031 +2033 4 526.1485 452.5778 26.6185 0.2034 2032 +2034 4 525.4701 451.6947 26.3113 0.2288 2033 +2035 4 524.5537 451.0106 26.02 0.2034 2034 +2036 4 523.6031 450.3917 25.7374 0.1907 2035 +2037 4 522.5964 450.0862 25.4466 0.1652 2036 +2038 4 522.681 449.0566 25.0296 0.1907 2037 +2039 4 522.5769 448.5018 24.4814 0.1907 2038 +2040 4 521.6194 448.7454 23.9956 0.2034 2039 +2041 4 520.8369 449.5394 23.5068 0.178 2040 +2042 4 519.8622 449.7053 23.0097 0.178 2041 +2043 4 518.8006 449.3254 22.5536 0.178 2042 +2044 4 517.7538 448.909 22.1317 0.178 2043 +2045 4 516.7883 448.3553 21.7209 0.1525 2044 +2046 4 515.9818 447.5957 21.3039 0.1398 2045 +2047 4 515.2439 446.7354 20.9499 0.1525 2046 +2048 4 514.5254 445.8465 20.6891 0.1907 2047 +2049 4 513.6812 445.0846 20.5045 0.2034 2048 +2050 4 512.9993 444.1855 20.3766 0.2034 2049 +2051 4 512.8335 443.0872 20.2799 0.2034 2050 +2052 4 513.2281 442.0439 20.1846 0.2415 2051 +2053 4 513.8368 441.0761 20.0684 0.2796 2052 +2054 4 514.5678 440.2009 19.9252 0.2796 2053 +2055 4 515.3709 439.3875 19.7489 0.2415 2054 +2056 4 516.1556 438.9402 19.3576 0.1907 2055 +2057 4 516.2071 438.1657 18.7802 0.1652 2056 +2058 4 515.6031 437.2425 18.3919 0.1525 2057 +2059 4 515.9875 436.2312 18.1933 0.1525 2058 +2060 4 543.996 480.1528 39.9204 0.2796 1998 +2061 4 544.1848 479.0248 39.9 0.3051 2060 +2062 4 544.3713 477.8957 39.8997 0.3051 2061 +2063 4 544.2111 476.7643 39.9218 0.3051 2062 +2064 4 544.0464 475.6317 39.9675 0.2924 2063 +2065 4 543.8565 474.5037 40.035 0.2924 2064 +2066 4 543.6448 473.3792 40.1223 0.2924 2065 +2067 4 543.4389 472.2546 40.2427 0.3051 2066 +2068 4 543.2799 471.1472 40.4662 0.2796 2067 +2069 4 543.1792 470.0273 40.7515 0.2542 2068 +2070 4 543.305 468.8913 41.0242 0.2161 2069 +2071 4 543.4309 467.7564 41.2768 0.2161 2070 +2072 4 543.5258 466.6376 41.5582 0.2161 2071 +2073 4 543.6116 465.5268 41.8603 0.2288 2072 +2074 4 544.6218 464.7992 41.3468 0.2034 2073 +2075 4 545.3219 463.9114 40.9335 0.2161 2074 +2076 4 546.2783 463.288 40.7792 0.2161 2075 +2077 4 547.4223 463.2445 40.616 0.2288 2076 +2078 4 548.5652 463.2353 40.423 0.2415 2077 +2079 4 549.6714 463.0523 40.1372 0.2415 2078 +2080 4 550.6392 462.5169 39.7872 0.2288 2079 +2081 4 551.1884 461.5148 39.459 0.2034 2080 +2082 4 551.6986 460.5138 39.0754 0.1907 2081 +2083 4 552.2935 459.7439 38.5563 0.2034 2082 +2084 4 553.3654 459.9692 38.0579 0.1907 2083 +2085 4 554.3069 460.5 37.7087 0.178 2084 +2086 4 554.9258 461.3134 37.2548 0.1525 2085 +2087 4 555.3903 461.9712 36.7094 0.178 2086 +2088 4 556.3043 461.5685 36.1827 0.2161 2087 +2089 4 556.9701 460.6808 35.7064 0.2415 2088 +2090 4 557.8441 460.1099 35.2685 0.2288 2089 +2091 4 558.8989 459.7496 34.858 0.2161 2090 +2092 4 559.9159 459.308 34.6223 0.2288 2091 +2093 4 560.9387 459.3114 34.5657 0.2542 2092 +2094 4 561.8607 459.7919 34.4154 0.2415 2093 +2095 4 562.7164 460.1523 34.0192 0.2161 2094 +2096 4 563.5893 460.7323 33.5689 0.1907 2095 +2097 4 564.6532 460.7712 33.1646 0.2034 2096 +2098 4 565.565 460.134 32.788 0.2161 2097 +2099 4 566.4848 459.4567 32.4402 0.2288 2098 +2100 4 567.5716 459.2199 32.0874 0.2161 2099 +2101 4 568.6298 459.4899 31.675 0.2161 2100 +2102 4 569.7314 459.5814 31.1942 0.2161 2101 +2103 4 570.157 460.3101 30.5046 0.2415 2102 +2104 4 570.4716 461.4095 29.9158 0.2542 2103 +2105 4 570.6009 462.5444 29.4157 0.2669 2104 +2106 4 570.9315 463.5774 29.0993 0.2669 2105 +2107 4 571.0448 464.4915 28.6415 0.2542 2106 +2108 4 571.6579 464.1654 27.932 0.2415 2107 +2109 4 572.5457 463.4905 27.2821 0.2161 2108 +2110 4 573.6291 463.3177 26.6268 0.1907 2109 +2111 4 574.6232 463.5717 25.8588 0.1652 2110 +2112 4 575.4961 464.0281 25.0109 0.1525 2111 +2113 4 576.3323 464.7672 24.2673 0.1525 2112 +2114 4 577.1514 465.5588 23.6494 0.1525 2113 +2115 4 578.0598 466.0702 23.038 0.1525 2114 +2116 4 578.8468 465.5199 22.4687 0.1525 2115 +2117 4 578.5197 464.782 21.9413 0.1398 2116 +2118 4 577.6262 464.6619 21.2945 0.1398 2117 +2119 4 577.7429 464.9937 20.4695 0.1525 2118 +2120 4 578.7393 464.7797 19.8071 0.1907 2119 +2121 4 579.8158 464.6264 19.4548 0.2034 2120 +2122 4 580.8923 464.8816 19.3115 0.2034 2121 +2123 4 581.9963 465.0829 19.3039 0.2034 2122 +2124 4 582.8325 465.8322 19.2672 0.2415 2123 +2125 4 583.6802 466.4031 18.8101 0.1525 2124 +2126 4 584.4696 467.0288 17.7782 0.178 2125 +2127 4 585.1457 467.9154 17.3778 0.178 2126 +2128 4 585.5095 468.992 17.0361 0.1525 2127 +2129 4 586.0163 469.9941 16.6928 0.1525 2128 +2130 4 586.9532 470.5615 15.9191 0.1652 2129 +2131 4 582.9515 465.3563 19.0995 0.1271 2124 +2132 4 583.0911 464.3313 18.7623 0.1398 2131 +2133 4 583.551 463.5248 18.3808 0.1525 2132 +2134 4 584.5462 463.5534 17.9294 0.1398 2133 +2135 4 585.5976 463.8314 17.5842 0.1271 2134 +2136 4 586.5608 463.4504 17.4769 0.1144 2135 +2137 4 587.4943 463.5831 17.6355 0.1144 2136 +2138 4 588.1807 462.9699 17.9929 0.1144 2137 +2139 4 588.4221 461.8671 18.2925 0.1144 2138 +2140 4 589.2309 461.0984 18.4455 0.1144 2139 +2141 4 590.1587 460.492 18.1933 0.1144 2140 +2142 4 543.3417 464.6207 42.0445 0.1144 2073 +2143 4 543.1415 463.5053 42.1478 0.1271 2142 +2144 4 543.1655 462.3648 42.2162 0.1525 2143 +2145 4 543.2547 461.2242 42.2688 0.1907 2144 +2146 4 543.265 460.0825 42.3186 0.2034 2145 +2147 4 543.2009 458.9396 42.385 0.2034 2146 +2148 4 543.1357 457.8025 42.5009 0.1907 2147 +2149 4 543.0705 456.6711 42.681 0.1907 2148 +2150 4 542.9836 455.5408 42.8943 0.1907 2149 +2151 4 542.8486 454.4071 43.0956 0.178 2150 +2152 4 542.6839 453.2745 43.2648 0.178 2151 +2153 4 542.5832 452.1408 43.4283 0.1652 2152 +2154 4 542.5603 451.006 43.6083 0.178 2153 +2155 4 542.7388 449.902 43.764 0.178 2154 +2156 4 543.1609 448.8576 43.9228 0.2034 2155 +2157 4 543.2959 447.7662 44.0877 0.2034 2156 +2158 4 543.1174 446.6382 44.214 0.1907 2157 +2159 4 543.082 445.5079 44.296 0.1652 2158 +2160 4 543.2273 444.3754 44.3346 0.1525 2159 +2161 4 543.3703 443.2417 44.3674 0.1652 2160 +2162 4 543.4343 442.1182 44.4559 0.1652 2161 +2163 4 543.4526 440.9868 44.5802 0.178 2162 +2164 4 543.4583 439.8463 44.6751 0.1652 2163 +2165 4 543.4583 438.7034 44.7224 0.1907 2164 +2166 4 543.4583 437.5606 44.7348 0.1907 2165 +2167 4 543.4583 436.4188 44.7213 0.2288 2166 +2168 4 543.4583 435.2748 44.7042 0.2415 2167 +2169 4 543.4583 434.132 44.7216 0.2796 2168 +2170 4 543.4583 432.9891 44.7871 0.2669 2169 +2171 4 543.4286 431.8497 44.9033 0.2415 2170 +2172 4 543.3725 430.7137 45.0663 0.1907 2171 +2173 4 543.2982 429.5777 45.2519 0.1652 2172 +2174 4 543.1929 428.4394 45.4205 0.1398 2173 +2175 4 543.0728 427.3012 45.5557 0.1271 2174 +2176 4 543.011 426.1663 45.694 0.1144 2175 +2177 4 543.0007 425.036 45.864 0.1144 2176 +2178 4 542.9893 423.8978 46.0242 0.1271 2177 +2179 4 542.844 422.7904 46.0886 0.1652 2178 +2180 4 542.7594 421.6658 46.0984 0.2161 2179 +2181 4 542.9779 420.555 46.1255 0.2415 2180 +2182 4 543.5133 419.8423 46.366 0.2161 2181 +2183 4 543.7615 418.8035 46.5836 0.1652 2182 +2184 4 543.9388 417.6744 46.7365 0.1525 2183 +2185 4 544.1173 416.5453 46.8404 0.1907 2184 +2186 4 544.2946 415.4161 46.8955 0.2542 2185 +2187 4 544.4948 414.2904 46.9092 0.2669 2186 +2188 4 544.8437 413.2036 46.9168 0.2288 2187 +2189 4 545.219 412.1237 46.9622 0.1652 2188 +2190 4 545.5953 411.0438 47.0492 0.1398 2189 +2191 4 545.9706 409.9627 47.1727 0.1398 2190 +2192 4 546.2406 408.8622 47.3654 0.1525 2191 +2193 4 546.4625 407.7571 47.623 0.1398 2192 +2194 4 546.6787 406.652 47.92 0.1398 2193 +2195 4 546.8949 405.5469 48.2334 0.1525 2194 +2196 4 547.0185 404.4154 48.5111 0.178 2195 +2197 4 547.0505 403.2726 48.7144 0.178 2196 +2198 4 547.0688 402.1286 48.8452 0.1525 2197 +2199 4 547.0871 400.9857 48.9199 0.1271 2198 +2200 4 547.1066 399.8417 48.9563 0.1271 2199 +2201 4 547.1329 398.6977 48.9714 0.1525 2200 +2202 4 547.3605 397.58 48.9807 0.178 2201 +2203 4 547.6225 396.4658 48.9927 0.1907 2202 +2204 4 547.8845 395.3527 49.0092 0.1907 2203 +2205 4 548.1465 394.2384 49.0316 0.2161 2204 +2206 4 548.3638 393.1162 49.0641 0.2542 2205 +2207 4 548.4988 391.9802 49.1123 0.2924 2206 +2208 4 548.6201 390.843 49.177 0.3051 2207 +2209 4 548.7425 389.7059 49.2584 0.2924 2208 +2210 4 548.8637 388.5688 49.3562 0.2669 2209 +2211 4 549.0113 387.4362 49.4813 0.2161 2210 +2212 4 549.2069 386.3151 49.6507 0.1652 2211 +2213 4 549.4106 385.1974 49.8534 0.1271 2212 +2214 4 549.6142 384.0797 50.0755 0.1144 2213 +2215 4 549.7629 382.9517 50.2956 0.1271 2214 +2216 4 549.803 381.8123 50.4896 0.1525 2215 +2217 4 549.827 380.6706 50.6484 0.178 2216 +2218 4 549.851 379.5289 50.7693 0.178 2217 +2219 4 549.8728 378.386 50.8452 0.1652 2218 +2220 4 549.875 377.25 50.8306 0.178 2219 +2221 4 549.875 376.114 50.7483 0.2161 2220 +2222 4 549.875 374.9792 50.6293 0.2669 2221 +2223 4 549.875 373.8432 50.4997 0.2669 2222 +2224 4 550.0272 372.7129 50.4333 0.2415 2223 +2225 4 550.3052 371.6135 50.475 0.178 2224 +2226 4 550.5969 370.5176 50.6108 0.1398 2225 +2227 4 550.8898 369.4216 50.8119 0.1144 2226 +2228 4 551.1723 368.3177 51.0322 0.1271 2227 +2229 4 551.4366 367.2057 51.2252 0.1525 2228 +2230 4 551.6986 366.0914 51.3845 0.178 2229 +2231 4 551.9606 364.9783 51.5197 0.1907 2230 +2232 4 552.2225 363.8641 51.6454 0.1907 2231 +2233 4 552.3129 362.7338 51.8199 0.1907 2232 +2234 4 552.3198 361.6058 52.0579 0.1907 2233 +2235 4 552.3198 360.4778 52.344 0.178 2234 +2236 4 552.3198 359.3498 52.6568 0.1652 2235 +2237 4 552.218 358.2196 52.9586 0.1398 2236 +2238 4 551.8931 357.1271 53.1989 0.1271 2237 +2239 4 551.5464 356.0368 53.3758 0.1144 2238 +2240 4 551.1986 354.9466 53.5027 0.1398 2239 +2241 4 550.8509 353.8575 53.5945 0.1652 2240 +2242 4 550.9344 352.7249 53.6606 0.1907 2241 +2243 4 551.0957 351.5924 53.718 0.1652 2242 +2244 4 551.2604 350.461 53.7807 0.1398 2243 +2245 4 551.4252 349.3284 53.8549 0.1144 2244 +2246 4 551.5899 348.197 53.9445 0.1271 2245 +2247 4 551.4114 347.0804 54.0994 0.1398 2246 +2248 4 551.1941 345.9673 54.3096 0.1525 2247 +2249 4 550.9767 344.8554 54.5574 0.1398 2248 +2250 4 550.7582 343.7423 54.826 0.1271 2249 +2251 4 550.5843 342.6154 55.0785 0.1271 2250 +2252 4 550.4276 341.484 55.2997 0.1398 2251 +2253 4 550.272 340.3537 55.4842 0.1652 2252 +2254 4 550.1164 339.2223 55.638 0.178 2253 +2255 4 549.9963 338.0863 55.7617 0.1907 2254 +2256 4 550.0283 336.9435 55.844 0.1907 2255 +2257 4 550.0752 335.8006 55.8958 0.2034 2256 +2258 4 550.121 334.6578 55.9258 0.2161 2257 +2259 4 550.1679 333.5138 55.9404 0.2288 2258 +2260 4 550.137 332.3709 55.9454 0.2161 2259 +2261 4 550.081 331.228 55.9465 0.2161 2260 +2262 4 550.0238 330.0852 55.9474 0.2161 2261 +2263 4 549.9666 328.9435 55.9488 0.2288 2262 +2264 4 549.9094 327.8006 55.9507 0.2415 2263 +2265 4 549.795 326.6623 55.9532 0.2415 2264 +2266 4 549.6131 325.5332 55.9572 0.2415 2265 +2267 4 549.4254 324.4052 55.9622 0.2034 2266 +2268 4 549.2367 323.2761 55.9695 0.1907 2267 +2269 4 549.0491 322.1481 55.9796 0.1907 2268 +2270 4 548.8603 321.019 55.9938 0.2542 2269 +2271 4 548.6727 319.891 56.014 0.2924 2270 +2272 4 548.4839 318.763 56.042 0.3178 2271 +2273 4 548.2963 317.6339 56.0804 0.2924 2272 +2274 4 548.1087 316.5059 56.131 0.2796 2273 +2275 4 547.9291 315.3768 56.212 0.2542 2274 +2276 4 547.7564 314.2476 56.3276 0.2415 2275 +2277 4 547.5825 313.1197 56.4721 0.2542 2276 +2278 4 547.4086 311.9905 56.6401 0.2924 2277 +2279 4 547.2358 310.8614 56.826 0.3051 2278 +2280 4 547.0768 309.7369 57.0441 0.2796 2279 +2281 4 546.9189 308.6123 57.2816 0.2161 2280 +2282 4 546.7622 307.4889 57.5249 0.178 2281 +2283 4 546.6043 306.3643 57.7643 0.1398 2282 +2284 4 546.4316 305.2352 57.9667 0.1271 2283 +2285 4 546.2451 304.1072 58.109 0.1144 2284 +2286 4 546.0564 302.9792 58.1977 0.1144 2285 +2287 4 545.8688 301.8501 58.2462 0.1144 2286 +2288 4 545.6811 300.7221 58.2672 0.1144 2287 +2289 4 545.5324 299.5873 58.2725 0.1144 2288 +2290 4 545.4112 298.4502 58.2719 0.1144 2289 +2291 4 545.2922 297.3119 58.2708 0.1144 2290 +2292 4 545.1721 296.1747 58.2691 0.1144 2291 +2293 4 545.0519 295.0365 58.2669 0.1271 2292 +2294 4 544.8197 293.9176 58.2638 0.1398 2293 +2295 4 544.4868 292.8228 58.259 0.1525 2294 +2296 4 544.1459 291.7314 58.2526 0.1398 2295 +2297 4 543.805 290.6389 58.2442 0.1271 2296 +2298 4 543.4675 289.5464 58.2338 0.1144 2297 +2299 4 543.1918 288.4367 58.2126 0.1144 2298 +2300 4 542.9218 287.3248 58.1846 0.1144 2299 +2301 4 542.6518 286.2139 58.1538 0.1144 2300 +2302 4 542.4734 285.0837 58.1353 0.1144 2301 +2303 4 542.3487 283.9477 58.1347 0.1144 2302 +2304 4 542.2263 282.8105 58.1487 0.1144 2303 +2305 4 542.1038 281.6722 58.1742 0.1144 2304 +2306 4 541.9826 280.5351 58.2058 0.1144 2305 +2307 4 541.9357 279.3923 58.2344 0.1144 2306 +2308 4 541.9322 278.2483 58.2551 0.1144 2307 +2309 4 541.9322 277.1043 58.2683 0.1271 2308 +2310 4 541.9322 275.9603 58.2761 0.1398 2309 +2311 4 541.8842 274.8174 58.2806 0.1652 2310 +2312 4 541.8098 273.6757 58.2837 0.178 2311 +2313 4 541.732 272.5351 58.287 0.1907 2312 +2314 4 541.6554 271.3934 58.2921 0.178 2313 +2315 4 541.5788 270.2517 58.2988 0.1525 2314 +2316 4 541.4678 269.1134 58.308 0.1398 2315 +2317 4 541.3065 267.9809 58.3215 0.1525 2316 +2318 4 541.1417 266.8483 58.3402 0.178 2317 +2319 4 540.977 265.7169 58.3657 0.178 2318 +2320 4 540.8123 264.5843 58.3996 0.1525 2319 +2321 4 540.7162 263.4449 58.4514 0.1271 2320 +2322 4 540.7105 262.3032 58.5298 0.1271 2321 +2323 4 540.7105 261.1603 58.6289 0.1398 2322 +2324 4 540.7105 260.0175 58.7423 0.178 2323 +2325 4 540.7105 258.8758 58.8647 0.1907 2324 +2326 4 540.683 257.7329 58.9904 0.2034 2325 +2327 4 540.4222 256.6209 59.1002 0.1652 2326 +2328 4 540.1442 255.5113 59.1984 0.1398 2327 +2329 4 539.8673 254.4016 59.2931 0.1144 2328 +2330 4 539.7975 253.2644 59.4233 0.1271 2329 +2331 4 539.7941 252.1273 59.5913 0.1525 2330 +2332 4 539.7941 250.9902 59.787 0.178 2331 +2333 4 539.7941 249.853 59.999 0.178 2332 +2334 4 539.7941 248.7159 60.2134 0.1525 2333 +2335 4 539.6534 247.5822 60.3907 0.1271 2334 +2336 4 539.4452 246.4576 60.5161 0.1144 2335 +2337 4 539.2324 245.3331 60.6001 0.1271 2336 +2338 4 539.0208 244.2097 60.6561 0.1525 2337 +2339 4 538.808 243.0851 60.7009 0.178 2338 +2340 4 538.4614 241.996 60.7463 0.1907 2339 +2341 4 538.0804 240.9172 60.7981 0.1907 2340 +2342 4 538.0049 239.7778 60.8555 0.1907 2341 +2343 4 538.26 238.6693 60.9484 0.178 2342 +2344 4 539.0814 238.2288 61.2455 0.1525 2343 +2345 4 538.8309 237.1226 61.3928 0.1271 2344 +2346 4 538.5803 236.0164 61.4146 0.1144 2345 +2347 4 538.3309 234.9112 61.3351 0.1144 2346 +2348 4 538.0804 233.805 61.1783 0.1144 2347 +2349 4 537.8299 232.6965 60.9748 0.1144 2348 +2350 4 537.5885 231.5776 60.7919 0.1144 2349 +2351 4 537.346 230.4599 60.6687 0.1144 2350 +2352 4 537.1046 229.3423 60.5889 0.1271 2351 +2353 4 536.9959 228.2028 60.5357 0.1525 2352 +2354 4 536.9272 227.0611 60.4937 0.178 2353 +2355 4 536.8598 225.9194 60.4486 0.1907 2354 +2356 4 536.7923 224.7777 60.3901 0.178 2355 +2357 4 536.7065 223.6371 60.3061 0.178 2356 +2358 4 536.5577 222.5137 60.1642 0.178 2357 +2359 4 536.4079 221.3903 59.9844 0.2161 2358 +2360 4 536.258 220.2669 59.7867 0.2415 2359 +2361 4 536.0978 219.1389 59.6019 0.2669 2360 +2362 4 535.8851 218.0224 59.5151 0.2669 2361 +2363 4 535.6711 216.9047 59.5045 0.2669 2362 +2364 4 535.4584 215.7881 59.5426 0.2542 2363 +2365 4 535.2433 214.6705 59.6005 0.2288 2364 +2366 4 534.9527 213.5779 59.5529 0.1907 2365 +2367 4 534.6495 212.4946 59.3984 0.1652 2366 +2368 4 534.3475 211.4112 59.1595 0.1398 2367 +2369 4 534.0455 210.3278 58.8728 0.1271 2368 +2370 4 534.0318 209.1861 58.6312 0.1144 2369 +2371 4 534.0787 208.0433 58.4564 0.1144 2370 +2372 4 534.1279 206.8993 58.3506 0.1144 2371 +2373 4 534.1759 205.7564 58.2968 0.1144 2372 +2374 4 534.0878 204.6158 58.277 0.1144 2373 +2375 4 533.9242 203.4844 58.2739 0.1144 2374 +2376 4 533.7595 202.3519 58.2733 0.1398 2375 +2377 4 533.5948 201.2204 58.2728 0.1652 2376 +2378 4 533.43 200.0879 58.2719 0.1907 2377 +2379 4 533.4644 198.945 58.2705 0.1652 2378 +2380 4 533.5833 197.8068 58.2688 0.1398 2379 +2381 4 533.7035 196.6696 58.2663 0.1144 2380 +2382 4 533.8224 195.5313 58.263 0.1398 2381 +2383 4 533.9426 194.3942 58.2582 0.1907 2382 +2384 4 534.1496 193.2685 58.2515 0.2542 2383 +2385 4 534.4116 192.1554 58.242 0.2924 2384 +2386 4 534.6736 191.0411 58.2288 0.2796 2385 +2387 4 534.9355 189.928 58.2103 0.2669 2386 +2388 4 535.1975 188.8138 58.1851 0.2415 2387 +2389 4 535.0568 187.6789 58.1493 0.2669 2388 +2390 4 534.8921 186.5475 58.098 0.2542 2389 +2391 4 534.7273 185.4149 58.0269 0.2415 2390 +2392 4 534.5626 184.2835 57.9314 0.178 2391 +2393 4 534.3979 183.151 57.8091 0.1398 2392 +2394 4 534.7113 181.8949 57.5848 0.1144 2393 +2395 4 534.9859 180.7989 57.293 0.1144 2394 +2396 4 535.2593 179.703 56.9545 0.1144 2395 +2397 4 535.5339 178.6081 56.588 0.1271 2396 +2398 4 535.8084 177.5088 56.2192 0.1398 2397 +2399 4 536.0853 176.4048 55.8779 0.1525 2398 +2400 4 536.3621 175.2963 55.5772 0.1525 2399 +2401 4 536.639 174.1889 55.3008 0.1525 2400 +2402 4 536.9147 173.0815 55.0351 0.1525 2401 +2403 4 537.1709 171.9729 54.754 0.1398 2402 +2404 4 537.4066 170.8633 54.4373 0.1271 2403 +2405 4 537.6434 169.7536 54.0848 0.1144 2404 +2406 4 537.8791 168.6439 53.6992 0.1271 2405 +2407 4 538.1639 167.5525 53.2745 0.1398 2406 +2408 4 538.5151 166.4898 52.8024 0.178 2407 +2409 4 538.8835 165.435 52.295 0.1907 2408 +2410 4 539.253 164.3802 51.7678 0.2034 2409 +2411 4 539.4646 163.2968 51.2341 0.1652 2410 +2412 4 539.4887 162.1814 50.7063 0.1525 2411 +2413 4 539.4887 161.0649 50.197 0.1525 2412 +2414 4 539.5756 159.9461 49.7316 0.178 2413 +2415 4 539.8399 158.841 49.3455 0.178 2414 +2416 4 540.1876 157.7507 49.0364 0.1652 2415 +2417 4 540.5354 156.6616 48.7774 0.1652 2416 +2418 4 540.8901 155.5748 48.5405 0.178 2417 +2419 4 541.3053 154.5269 48.265 0.178 2418 +2420 4 541.7709 153.5145 47.9147 0.1652 2419 +2421 4 542.2366 152.5009 47.5048 0.1652 2420 +2422 4 542.7376 151.4976 47.0686 0.178 2421 +2423 4 543.3222 150.5264 46.6544 0.178 2422 +2424 4 543.9548 149.5769 46.2862 0.1525 2423 +2425 4 544.5875 148.6273 45.9609 0.1271 2424 +2426 4 545.3196 147.7648 45.6593 0.1144 2425 +2427 4 546.2154 147.0784 45.3547 0.1144 2426 +2428 4 547.1729 146.4766 45.0358 0.1144 2427 +2429 4 548.1304 145.8749 44.7028 0.1144 2428 +2430 4 549.0136 145.1702 44.3752 0.1144 2429 +2431 4 549.8098 144.3545 44.07 0.1144 2430 +2432 4 550.59 143.5217 43.7884 0.1144 2431 +2433 4 551.3691 142.6888 43.5271 0.1144 2432 +2434 4 552.1356 141.8514 43.2645 0.1144 2433 +2435 4 552.8929 141.0117 42.9884 0.1144 2434 +2436 4 553.6491 140.1709 42.7062 0.1144 2435 +2437 4 554.3412 139.2751 42.4393 0.1144 2436 +2438 4 554.8606 138.2661 42.2257 0.1398 2437 +2439 4 555.285 137.2034 42.0767 0.1652 2438 +2440 4 555.7106 136.1417 41.9801 0.1907 2439 +2441 4 556.119 135.0732 41.9208 0.1652 2440 +2442 4 556.2906 133.9601 41.8816 0.1398 2441 +2443 4 556.2906 132.8161 41.8471 0.1144 2442 +2444 4 556.3444 131.6744 41.8023 0.1144 2443 +2445 4 556.4668 130.5361 41.7388 0.1144 2444 +2446 4 556.8088 129.4608 41.652 0.1144 2445 +2447 4 557.4781 128.5478 41.5405 0.1144 2446 +2448 4 558.1965 127.6693 41.37 0.1144 2447 +2449 4 558.8257 126.7483 41.1051 0.1144 2448 +2450 4 559.3405 125.7988 40.7369 0.1144 2449 +2451 4 559.8828 124.8218 40.3819 0.1271 2450 +2452 4 560.4639 123.8369 40.1008 0.1398 2451 +2453 4 561.0451 122.8519 39.8916 0.1652 2452 +2454 4 561.5484 121.8268 39.7513 0.1652 2453 +2455 4 561.7223 120.7137 39.6743 0.178 2454 +2456 4 561.7601 119.5709 39.641 0.1652 2455 +2457 4 561.7967 118.4269 39.6248 0.1652 2456 +2458 4 561.8344 117.284 39.6136 0.1398 2457 +2459 4 561.8722 116.1412 39.6046 0.1398 2458 +2460 4 562.1238 115.0349 39.5948 0.1398 2459 +2461 4 562.5265 113.9644 39.5819 0.178 2460 +2462 4 562.951 112.9022 39.5643 0.2034 2461 +2463 4 563.3765 111.8401 39.5394 0.2542 2462 +2464 4 563.8513 110.8001 39.5044 0.2669 2463 +2465 4 564.3993 109.7963 39.4545 0.2796 2464 +2466 4 564.969 108.8047 39.3862 0.2415 2465 +2467 4 565.5398 107.8127 39.2958 0.2161 2466 +2468 4 566.042 106.7886 39.163 0.1907 2467 +2469 4 566.3944 105.7185 38.9556 0.1907 2468 +2470 4 566.6976 104.6354 38.6823 0.178 2469 +2471 4 566.9996 103.5521 38.3698 0.1652 2470 +2472 4 567.3348 102.4715 38.0576 0.1525 2471 +2473 4 567.7432 101.4067 37.7986 0.1525 2472 +2474 4 568.1768 100.3481 37.6071 0.1398 2473 +2475 4 568.6103 99.2897 37.4763 0.1398 2474 +2476 4 569.0496 98.2337 37.3929 0.1652 2475 +2477 4 569.5404 97.2011 37.3472 0.2034 2476 +2478 4 570.0518 96.1781 37.3254 0.2161 2477 +2479 4 570.5643 95.1548 37.3153 0.178 2478 +2480 4 571.0756 94.132 37.3128 0.1525 2479 +2481 4 571.6843 93.1658 37.3159 0.1398 2480 +2482 4 572.3398 92.2279 37.3232 0.178 2481 +2483 4 572.9976 91.2919 37.3335 0.2034 2482 +2484 4 573.6554 90.356 37.3484 0.2288 2483 +2485 4 574.3029 89.413 37.3708 0.2161 2484 +2486 4 574.852 88.4121 37.4021 0.1907 2485 +2487 4 575.3645 87.389 37.4399 0.1652 2486 +2488 4 576.0532 86.4858 37.4833 0.1398 2487 +2489 4 576.5508 85.4777 37.581 0.1398 2488 +2490 4 576.8242 84.3827 37.7454 0.1398 2489 +2491 4 577.2475 83.3284 37.8952 0.1525 2490 +2492 4 578.133 82.8969 37.851 0.1398 2491 +2493 4 579.2392 82.7911 37.9047 0.1271 2492 +2494 4 579.6282 81.9364 38.6604 0.1144 2493 +2495 4 534.3818 182.2655 58.5164 0.1144 2393 +2496 4 534.3624 181.1295 58.7882 0.1525 2495 +2497 4 534.3418 179.9924 58.9095 0.1398 2496 +2498 4 534.3212 178.8552 59.0402 0.1525 2497 +2499 4 534.3029 177.717 59.1517 0.178 2498 +2500 4 534.296 176.5753 59.1895 0.2161 2499 +2501 4 534.296 175.4393 59.1287 0.2161 2500 +2502 4 534.296 174.3044 58.9915 0.1907 2501 +2503 4 534.296 173.1684 58.8073 0.1652 2502 +2504 4 534.2457 172.0347 58.6152 0.1525 2503 +2505 4 534.0707 170.9044 58.4662 0.1525 2504 +2506 4 533.8819 169.7753 58.3674 0.1525 2505 +2507 4 533.6943 168.6473 58.3111 0.1398 2506 +2508 4 533.5067 167.5182 58.2848 0.1398 2507 +2509 4 533.3179 166.3902 58.2767 0.1525 2508 +2510 4 533.1303 165.2622 58.2764 0.1907 2509 +2511 4 532.9416 164.1331 58.277 0.2161 2510 +2512 4 532.7539 163.0051 58.2778 0.2161 2511 +2513 4 532.5686 161.876 58.2789 0.1907 2512 +2514 4 532.4084 160.7434 58.2806 0.1525 2513 +2515 4 532.2883 159.6063 58.2828 0.1271 2514 +2516 4 532.1682 158.468 58.2862 0.1271 2515 +2517 4 532.0481 157.3309 58.2904 0.1398 2516 +2518 4 531.9268 156.1926 58.2966 0.1525 2517 +2519 4 531.785 155.0578 58.3052 0.1398 2518 +2520 4 531.5962 153.9298 58.3173 0.1271 2519 +2521 4 531.4086 152.8018 58.3344 0.1271 2520 +2522 4 531.2198 151.6727 58.3579 0.1398 2521 +2523 4 531.0276 150.5458 58.3901 0.1525 2522 +2524 4 530.8057 149.4236 58.4366 0.1398 2523 +2525 4 530.5392 148.3116 58.5043 0.1271 2524 +2526 4 530.2715 147.1996 58.5942 0.1144 2525 +2527 4 530.0049 146.0865 58.7062 0.1144 2526 +2528 4 529.7864 144.9688 58.8493 0.1144 2527 +2529 4 529.7132 143.8363 59.0464 0.1144 2528 +2530 4 529.7132 142.7048 59.2948 0.1144 2529 +2531 4 529.7132 141.5734 59.5745 0.1144 2530 +2532 4 529.7132 140.442 59.8671 0.1144 2531 +2533 4 529.7246 139.3083 60.1446 0.1144 2532 +2534 4 529.7692 138.1655 60.3638 0.1144 2533 +2535 4 529.8253 137.0237 60.5158 0.1144 2534 +2536 4 529.8825 135.8809 60.6169 0.1144 2535 +2537 4 529.9397 134.738 60.6855 0.1144 2536 +2538 4 530.0095 133.5963 60.739 0.1144 2537 +2539 4 530.1353 132.4603 60.797 0.1144 2538 +2540 4 530.1685 131.3392 60.8748 0.1144 2539 +2541 4 529.791 130.265 60.9787 0.1144 2540 +2542 4 529.3791 129.2079 61.117 0.1144 2541 +2543 4 529.3036 128.0983 61.3248 0.1144 2542 +2544 4 529.839 127.2757 61.6728 0.1144 2543 +2545 4 530.4053 126.436 62.0838 0.1144 2544 +2546 4 530.5895 125.3149 62.4392 0.1144 2545 +2547 4 530.6295 124.1732 62.7164 0.1144 2546 +2548 4 530.6295 123.0292 62.9194 0.1144 2547 +2549 4 530.6295 121.8852 63.061 0.1144 2548 +2550 4 530.6295 120.7412 63.1616 0.1144 2549 +2551 4 530.6295 119.5972 63.2556 0.1144 2550 +2552 4 530.6295 118.4566 63.392 0.1144 2551 +2553 4 530.6295 117.3195 63.5897 0.1144 2552 +2554 4 530.6295 116.1824 63.8378 0.1144 2553 +2555 4 530.6295 115.0452 64.1253 0.1271 2554 +2556 4 530.6295 113.9076 64.4434 0.1525 2555 +2557 4 530.8492 112.8153 64.792 0.178 2556 +2558 4 531.2999 111.7832 65.1636 0.178 2557 +2559 4 531.8834 110.8239 65.5427 0.1525 2558 +2560 4 532.5617 109.9588 65.9526 0.1271 2559 +2561 4 533.3339 109.1839 66.3816 0.1271 2560 +2562 4 534.2732 108.5891 66.6966 0.1525 2561 +2563 4 535.2536 108.1193 66.8105 0.2034 2562 +2564 4 536.1802 107.5147 66.8478 0.2288 2563 +2565 4 537.0165 106.7631 66.9662 0.2415 2564 +2566 4 537.8207 105.9886 67.191 0.2161 2565 +2567 4 538.6009 105.1889 67.5105 0.2161 2566 +2568 4 539.2896 104.3106 67.9098 0.2161 2567 +2569 4 539.944 103.4018 68.3553 0.2542 2568 +2570 4 540.5972 102.4929 68.7977 0.2796 2569 +2571 4 541.1143 101.4904 69.1704 0.2924 2570 +2572 4 541.4941 100.414 69.4431 0.2415 2571 +2573 4 541.8419 99.3245 69.6273 0.2034 2572 +2574 4 542.1896 98.2349 69.7432 0.2034 2573 +2575 4 542.5203 97.1401 69.8074 0.2542 2574 +2576 4 542.8005 96.0314 69.8312 0.2669 2575 +2577 4 543.0625 94.9178 69.8284 0.2288 2576 +2578 4 543.3256 93.8043 69.8076 0.1652 2577 +2579 4 543.5876 92.6909 69.7679 0.1271 2578 +2580 4 543.9571 91.6106 69.7046 0.1144 2579 +2581 4 544.3003 90.5203 69.6133 0.1144 2580 +2582 4 544.6367 89.4269 69.4915 0.1271 2581 +2583 4 545.2819 88.5072 69.34 0.1398 2582 +2584 4 545.7967 87.553 69.0645 0.1652 2583 +2585 4 546.2131 86.5581 68.6664 0.1652 2584 +2586 4 546.6307 85.5639 68.2016 0.178 2585 +2587 4 547.3525 84.7047 67.8031 0.1652 2586 +2588 4 548.1796 83.9195 67.5116 0.1652 2587 +2589 4 548.8523 83.0498 67.2487 0.1398 2588 +2590 4 549.5101 82.1395 67.1989 0.1271 2589 +2591 4 550.2354 81.5507 67.4775 0.1144 2590 +2592 4 551.2421 81.0208 68.2245 0.1144 2591 diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/point_neuron_templates/IntFire1_exc_1.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/point_neuron_templates/IntFire1_exc_1.json new file mode 100644 index 0000000..6a58d3b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/point_neuron_templates/IntFire1_exc_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.024, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/point_neuron_templates/IntFire1_inh_1.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/point_neuron_templates/IntFire1_inh_1.json new file mode 100644 index 0000000..0da2f1f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/point_neuron_templates/IntFire1_inh_1.json @@ -0,0 +1,5 @@ +{ + "tau": 0.007, + "type": "NEURON_IntFire1", + "refrac": 0.003 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/AMPA_ExcToExc.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/AMPA_ExcToExc.json new file mode 100644 index 0000000..c758540 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/AMPA_ExcToExc.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 1.0, + "tau2": 3.0, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/AMPA_ExcToInh.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/AMPA_ExcToInh.json new file mode 100644 index 0000000..4388799 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/AMPA_ExcToInh.json @@ -0,0 +1,6 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.1, + "tau2": 0.5, + "erev": 0.0 +} diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/GABA_InhToExc.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/GABA_InhToExc.json new file mode 100644 index 0000000..702ce9b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/GABA_InhToExc.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 2.7, + "tau2": 15.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/GABA_InhToInh.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/GABA_InhToInh.json new file mode 100644 index 0000000..ed4130a --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/GABA_InhToInh.json @@ -0,0 +1,7 @@ +{ + "level_of_detail": "exp2syn", + "tau1": 0.2, + "tau2": 8.0, + "erev": -70.0 +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/instanteneousExc.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/instanteneousExc.json new file mode 100644 index 0000000..9a6d0a5 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/instanteneousExc.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": 1 +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/instanteneousInh.json b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/instanteneousInh.json new file mode 100644 index 0000000..3bac514 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/biophys_components/synaptic_models/instanteneousInh.json @@ -0,0 +1,5 @@ +{ + "level_of_detail": "instanteneous", + "sign": -1 +} + diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/build_cortex.py b/bmtk-vb/docs/tutorial/sources/chapter04/build_cortex.py new file mode 100644 index 0000000..1e2e87b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/build_cortex.py @@ -0,0 +1,189 @@ +import numpy as np +import math +import random + +from bmtk.builder.networks import NetworkBuilder +from bmtk.builder.aux.node_params import positions_columinar, xiter_random +from bmtk.builder.aux.edge_connectors import distance_connector + +net = NetworkBuilder("V1") +net.add_nodes(N=80, pop_name='Scnn1a', + positions=positions_columinar(N=80, center=[0, 50.0, 0], max_radius=30.0, height=100.0), + rotation_angle_yaxis=xiter_random(N=80, min_x=0.0, max_x=2*np.pi), + rotation_angle_zaxis=xiter_random(N=80, min_x=0.0, max_x=2*np.pi), + tuning_angle=np.linspace(start=0.0, stop=360.0, num=80, endpoint=False), + location='VisL4', + ei='e', + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic', + dynamics_params='472363762_fit.json', + morphology='Scnn1a.swc') + +net.add_nodes(N=20, pop_name='PV', + positions=positions_columinar(N=20, center=[0, 50.0, 0], max_radius=30.0, height=100.0), + rotation_angle_yaxis=xiter_random(N=20, min_x=0.0, max_x=2*np.pi), + rotation_angle_zaxis=xiter_random(N=20, min_x=0.0, max_x=2*np.pi), + location='VisL4', + ei='i', + model_type='biophysical', + model_template='ctdb:Biophys1.hoc', + model_processing='aibs_perisomatic', + dynamics_params='472912177_fit.json', + morphology='Pvalb.swc') + +net.add_nodes(N=200, pop_name='LIF_exc', + positions=positions_columinar(N=200, center=[0, 50.0, 0], min_radius=30.0, max_radius=60.0, height=100.0), + tuning_angle=np.linspace(start=0.0, stop=360.0, num=200, endpoint=False), + location='VisL4', + ei='e', + model_type='point_process', + model_template='nrn:IntFire1', + dynamics_params='IntFire1_exc_1.json') + +net.add_nodes(N=100, pop_name='LIF_inh', + positions=positions_columinar(N=100, center=[0, 50.0, 0], min_radius=30.0, max_radius=60.0, height=100.0), + location='VisL4', + ei='i', + model_type='point_process', + model_template='nrn:IntFire1', + dynamics_params='IntFire1_inh_1.json') + + +## Generating E-to-E connections +def dist_tuning_connector(source, target, d_weight_min, d_weight_max, d_max, t_weight_min, t_weight_max, nsyn_min, + nsyn_max): + if source['node_id'] == target['node_id']: + # Avoid self-connections.n_nodes + return None + + r = np.linalg.norm(np.array(source['positions']) - np.array(target['positions'])) + if r > d_max: + dw = 0.0 + else: + t = r / d_max + dw = d_weight_max * (1.0 - t) + d_weight_min * t + + if dw <= 0: + # drop the connection if the weight is too low + return None + + # next create weights by orientation tuning [ aligned, misaligned ] --> [ 1, 0 ], Check that the orientation + # tuning property exists for both cells; otherwise, ignore the orientation tuning. + if 'tuning_angel' in source and 'tuning_angle' in target: + + # 0-180 is the same as 180-360, so just modulo by 180 + delta_tuning = math.fmod(abs(source['tuning_angle'] - target['tuning_angle']), 180.0) + + # 90-180 needs to be flipped, then normalize to 0-1 + delta_tuning = delta_tuning if delta_tuning < 90.0 else 180.0 - delta_tuning + + t = delta_tuning / 90.0 + tw = t_weight_max * (1.0 - t) + t_weight_min * t + else: + tw = dw + + # drop the connection if the weight is too low + if tw <= 0: + return None + + # filter out nodes by treating the weight as a probability of connection + if random.random() > tw: + return None + + # Add the number of synapses for every connection. + # It is probably very useful to take this out into a separate function. + return random.randint(nsyn_min, nsyn_max) + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'Scnn1a'}, + connection_rule=dist_tuning_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 300.0, 't_weight_min': 0.5, + 't_weight_max': 1.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=6.4e-05, + weight_function='gaussianLL', + weight_sigma=50.0, + distance_range=[30.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_exc'}, + connection_rule=dist_tuning_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 300.0, 't_weight_min': 0.5, + 't_weight_max': 1.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=0.0019, + weight_function='gaussianLL', + weight_sigma=50.0, + delay=2.0, + dynamics_params='instanteneousExc.json', + model_template='exp2syn') + + +### Generating I-to-I connections +net.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'model_type': 'biophysical'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=0.0002, + weight_function='wmax', + distance_range=[0.0, 1e+20], + target_sections=['somatic', 'basal'], + delay=2.0, + dynamics_params='GABA_InhToInh.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'model_type': 'point_process'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=0.00225, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousInh.json', + model_template='exp2syn') + +### Generating I-to-E connections +net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'model_type': 'biophysical'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=0.00018, + weight_function='wmax', + distance_range=[0.0, 50.0], + target_sections=['somatic', 'basal', 'apical'], + delay=2.0, + dynamics_params='GABA_InhToExc.json', + model_template='exp2syn') + +net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'model_type': 'point_process'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=0.009, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousInh.json', + model_template='exp2syn') + +### Generating E-to-I connections +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'PV'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.26, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=0.00035, + weight_function='wmax', + distance_range=[0.0, 1e+20], + target_sections=['somatic', 'basal'], + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn') + + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_inh'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.26, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=0.0043, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousExc.json', + model_template='exp2syn') + +net.build() +net.save_nodes(output_dir='network') +net.save_edges(output_dir='network') \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/build_thalamus.py b/bmtk-vb/docs/tutorial/sources/chapter04/build_thalamus.py new file mode 100644 index 0000000..3f6cbfc --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/build_thalamus.py @@ -0,0 +1,69 @@ +import numpy as np + +from bmtk.builder.networks import NetworkBuilder + +lgn = NetworkBuilder('LGN') +lgn.add_nodes(N=500, + pop_name='tON', + potential='exc', + level_of_detail='filter') + +v1 = NetworkBuilder('V1') +v1.import_nodes(nodes_file_name='network/V1_nodes.h5', node_types_file_name='network/V1_node_types.csv') + + +def select_source_cells(sources, target, nsources_min=10, nsources_max=30, nsyns_min=3, nsyns_max=12): + total_sources = len(sources) + nsources = np.random.randint(nsources_min, nsources_max) + selected_sources = np.random.choice(total_sources, nsources, replace=False) + syns = np.zeros(total_sources) + syns[selected_sources] = np.random.randint(nsyns_min, nsyns_max, size=nsources) + return syns +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='Scnn1a'), + iterator='all_to_one', + connection_rule=select_source_cells, + connection_params={'nsources_min': 10, 'nsources_max': 25}, + syn_weight=4e-03, + weight_function='wmax', + distance_range=[0.0, 150.0], + target_sections=['basal', 'apical'], + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='PV1'), + connection_rule=select_source_cells, + connection_params={'nsources_min': 15, 'nsources_max': 30}, + iterator='all_to_one', + syn_weight=0.001, + weight_function='wmax', + distance_range=[0.0, 1.0e+20], + target_sections=['somatic', 'basal'], + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_exc'), + connection_rule=select_source_cells, + connection_params={'nsources_min': 10, 'nsources_max': 25}, + iterator='all_to_one', + syn_weight= 0.045, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousExc.json', + model_template='exp2syn') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_inh'), + connection_rule=select_source_cells, + connection_params={'nsources_min': 15, 'nsources_max': 30}, + iterator='all_to_one', + syn_weight=0.02, + weight_function='wmax', + delay=2.0, + dynamics_params='instanteneousExc.json', + model_template='exp2syn') + + +lgn.build() +lgn.save_nodes(output_dir='network') +lgn.save_edges(output_dir='network') \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/circuit_config.json b/bmtk-vb/docs/tutorial/sources/chapter04/circuit_config.json new file mode 100644 index 0000000..934a87b --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/circuit_config.json @@ -0,0 +1,36 @@ +{ + "manifest": { + "$BASE_DIR": ".", + "$COMPONENTS_DIR": "$BASE_DIR/biophys_components", + "$NETWORK_DIR": "$BASE_DIR/network" + }, + "components": { + "point_neuron_models_dir": "$COMPONENTS_DIR/point_neuron_templates", + "biophysical_neuron_models_dir": "$COMPONENTS_DIR/biophysical_neuron_templates", + "mechanisms_dir": "$COMPONENTS_DIR/mechanisms", + "morphologies_dir": "$COMPONENTS_DIR/morphologies", + "synaptic_models_dir": "$COMPONENTS_DIR/synaptic_models" + }, + "networks": { + "nodes": [ + { + "node_types_file": "$NETWORK_DIR/V1_node_types.csv", + "nodes_file": "$NETWORK_DIR/V1_nodes.h5" + }, + { + "node_types_file": "$NETWORK_DIR/LGN_node_types.csv", + "nodes_file": "$NETWORK_DIR/LGN_nodes.h5" + } + ], + "edges": [ + { + "edges_file": "$NETWORK_DIR/V1_V1_edges.h5", + "edge_types_file": "$NETWORK_DIR/V1_V1_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/LGN_V1_edges.h5", + "edge_types_file": "$NETWORK_DIR/LGN_V1_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/run_bionet.py b/bmtk-vb/docs/tutorial/sources/chapter04/run_bionet.py new file mode 100644 index 0000000..ca8abeb --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/run_bionet.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +"""Simulates an example network of 14 cell receiving two kinds of exernal input as defined in configuration file""" + +import os, sys +from bmtk.simulator import bionet + + +def run(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + graph = bionet.BioNetwork.from_config(conf) + sim = bionet.BioSimulator.from_config(conf, network=graph) + sim.run() + bionet.nrn.quit_execution() + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') diff --git a/bmtk-vb/docs/tutorial/sources/chapter04/simulation_config.json b/bmtk-vb/docs/tutorial/sources/chapter04/simulation_config.json new file mode 100644 index 0000000..5b4917e --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter04/simulation_config.json @@ -0,0 +1,50 @@ +{ + "manifest": { + "$OUTPUT_DIR": "$BASE_DIR/output", + "$BASE_DIR": "." + }, + "target_simulator": "NEURON", + "run": { + "nsteps_block": 5000, + "tstop": 3000.0, + "dt": 0.1, + "dL": 20.0, + "spike_threshold": -15.0 + }, + "conditions": { + "celsius": 34.0, + "v_init": -80.0 + }, + "inputs": { + "LGN_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$BASE_DIR/lgn_spikes.nwb", + "node_set": "LGN", + "trial": "trial_0" + } + + }, + "output": { + "spikes_file_csv": "spikes.csv", + "spikes_file": "spikes.h5", + "log_file": "log.txt", + "output_dir": "${OUTPUT_DIR}", + "overwrite_output_dir": true + }, + "reports": { + "membrane_report": { + "cells": [ + 10, + 80 + ], + "sections": "soma", + "module": "membrane_report", + "variable_name": [ + "v", + "cai" + ] + } + }, + "network": "./circuit_config.json" +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter05/build_network.py b/bmtk-vb/docs/tutorial/sources/chapter05/build_network.py new file mode 100644 index 0000000..bdfd01c --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter05/build_network.py @@ -0,0 +1,168 @@ +import numpy as np + +from bmtk.builder.networks import NetworkBuilder +from bmtk.builder.aux.node_params import positions_columinar +from bmtk.builder.aux.edge_connectors import distance_connector + +"""Create Nodes""" +net = NetworkBuilder("V1") +net.add_nodes(N=80, # Create a population of 80 neurons + positions=positions_columinar(N=80, center=[0, 50.0, 0], max_radius=30.0, height=100.0), + pop_name='Scnn1a', location='VisL4', ei='e', # optional parameters + model_type='point_process', # Tells the simulator to use point-based neurons + model_template='nest:iaf_psc_alpha', # tells the simulator to use NEST iaf_psc_alpha models + dynamics_params='472363762_point.json' # File containing iaf_psc_alpha mdoel parameters + ) + +net.add_nodes(N=20, pop_name='PV', location='VisL4', ei='i', + positions=positions_columinar(N=20, center=[0, 50.0, 0], max_radius=30.0, height=100.0), + model_type='point_process', + model_template='nest:iaf_psc_alpha', + dynamics_params='472912177_point.json') + +net.add_nodes(N=200, pop_name='LIF_exc', location='L4', ei='e', + positions=positions_columinar(N=200, center=[0, 50.0, 0], min_radius=30.0, max_radius=60.0, height=100.0), + model_type='point_process', + model_template='nest:iaf_psc_alpha', + dynamics_params='IntFire1_exc_point.json') + +net.add_nodes(N=100, pop_name='LIF_inh', location='L4', ei='i', + positions=positions_columinar(N=100, center=[0, 50.0, 0], min_radius=30.0, max_radius=60.0, height=100.0), + model_type='point_process', + model_template='nest:iaf_psc_alpha', + dynamics_params='IntFire1_inh_point.json') + + + +"""Create edges""" +## E-to-E connections +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'Scnn1a'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=5.0, + delay=2.0, + dynamics_params='ExcToExc.json', + model_template='static_synapse') + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_exc'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.34, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=10.0, + delay=2.0, + dynamics_params='instanteneousExc.json', + model_template='static_synapse') + + +### Generating I-to-I connections +net.add_edges(source={'ei': 'i'}, target={'pop_name': 'PV'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=-1.0, + delay=2.0, + dynamics_params='InhToInh.json', + model_template='static_synapse') + +net.add_edges(source={'ei': 'i'}, target={'ei': 'i', 'pop_name': 'LIF_inh'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=-1.0, + delay=2.0, + dynamics_params='instanteneousInh.json', + model_template='static_synapse') + +### Generating I-to-E connections +net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'pop_name': 'Scnn1a'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=-15.0, + delay=2.0, + dynamics_params='InhToExc.json', + model_template='static_synapse') + +net.add_edges(source={'ei': 'i'}, target={'ei': 'e', 'pop_name': 'LIF_exc'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 1.0, 'd_max': 160.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=-15.0, + delay=2.0, + dynamics_params='instanteneousInh.json', + model_template='static_synapse') + +### Generating E-to-I connections +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'PV'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.26, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=15.0, + delay=2.0, + dynamics_params='ExcToInh.json', + model_template='static_synapse') + + +net.add_edges(source={'ei': 'e'}, target={'pop_name': 'LIF_inh'}, + connection_rule=distance_connector, + connection_params={'d_weight_min': 0.0, 'd_weight_max': 0.26, 'd_max': 300.0, 'nsyn_min': 3, 'nsyn_max': 7}, + syn_weight=5.0, + delay=2.0, + dynamics_params='instanteneousExc.json', + model_template='static_synapse') + +net.build() +net.save_nodes(output_dir='network') +net.save_edges(output_dir='network') + + + +lgn = NetworkBuilder('LGN') +lgn.add_nodes(N=500, + pop_name='tON', + potential='exc', + model_type='virtual') + + +def select_source_cells(sources, target, nsources_min=10, nsources_max=30, nsyns_min=3, nsyns_max=12): + total_sources = len(sources) + nsources = np.random.randint(nsources_min, nsources_max) + selected_sources = np.random.choice(total_sources, nsources, replace=False) + syns = np.zeros(total_sources) + syns[selected_sources] = np.random.randint(nsyns_min, nsyns_max, size=nsources) + return syns + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='Scnn1a'), + iterator='all_to_one', + connection_rule=select_source_cells, + connection_params={'nsources_min': 10, 'nsources_max': 25}, + syn_weight=20.0, + delay=2.0, + dynamics_params='ExcToExc.json', + model_template='static_synapse') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='PV1'), + connection_rule=select_source_cells, + connection_params={'nsources_min': 15, 'nsources_max': 30}, + iterator='all_to_one', + syn_weight=20.0, + delay=2.0, + dynamics_params='ExcToInh.json', + model_template='static_synapse') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_exc'), + connection_rule=select_source_cells, + connection_params={'nsources_min': 10, 'nsources_max': 25}, + iterator='all_to_one', + syn_weight=10.0, + delay=2.0, + dynamics_params='instanteneousExc.json', + model_template='static_synapse') + +lgn.add_edges(source=lgn.nodes(), target=net.nodes(pop_name='LIF_inh'), + connection_rule=select_source_cells, + connection_params={'nsources_min': 15, 'nsources_max': 30}, + iterator='all_to_one', + syn_weight=10.0, + delay=2.0, + dynamics_params='instanteneousExc.json', + model_template='static_synapse') + + +lgn.build() +lgn.save_nodes(output_dir='network') +lgn.save_edges(output_dir='network') \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter05/config.json b/bmtk-vb/docs/tutorial/sources/chapter05/config.json new file mode 100644 index 0000000..649e19a --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter05/config.json @@ -0,0 +1,77 @@ +{ + "manifest": { + "$BASE_DIR": "${configdir}", + "$NETWORK_DIR": "$BASE_DIR/network", + "$MODELS_DIR": "$BASE_DIR/../pointnet_files/components", + "$OUTPUT_DIR": "$BASE_DIR/output", + "$INPUT_DIR": "$BASE_DIR/" + }, + + "run": { + "duration": 3000.0, + "dt": 0.001, + "block_run": false, + "block_size": 1000.0 + }, + + "inputs": { + "LGN_spikes": { + "input_type": "spikes", + "module": "nwb", + "input_file": "$INPUT_DIR/lgn_spikes.nwb", + "node_set": "LGN", + "trial": "trial_0" + } + }, + + "reports": { + "membrane_potential": { + "cells": [0, 20, 60, 80, 100], + "variable_name": "V_m", + "module": "multimeter_report", + "sections": "soma", + "enabled": true + } + }, + + "output": { + "log_file": "log.txt", + "spikes_file": "spikes.h5", + "spikes_file_csv": "spikes.csv", + "output_dir": "$OUTPUT_DIR", + "overwrite_output_dir": true + }, + + + "target_simulator":"NEST", + + "components": { + "point_neuron_models_dir": "$MODELS_DIR/cell_models", + "synaptic_models_dir": "$MODELS_DIR/synaptic_models", + "weight_functions": "$BASE_DIR/weight_funcs.py" + }, + + "networks": { + "nodes": [ + { + "nodes_file": "$NETWORK_DIR/V1_nodes.h5", + "node_types_file": "$NETWORK_DIR/V1_node_types.csv" + }, + { + "node_types_file": "${NETWORK_DIR}/LGN_node_types.csv", + "nodes_file": "${NETWORK_DIR}/LGN_nodes.h5" + } + ], + "edges": [ + { + "edges_file": "${NETWORK_DIR}/V1_V1_edges.h5", + "edge_types_file": "${NETWORK_DIR}/V1_V1_edge_types.csv", + "enabled": true + }, + { + "edges_file": "${NETWORK_DIR}/LGN_V1_edges.h5", + "edge_types_file": "${NETWORK_DIR}/LGN_V1_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter05/converted_network/V1_V1_edge_types.csv b/bmtk-vb/docs/tutorial/sources/chapter05/converted_network/V1_V1_edge_types.csv new file mode 100644 index 0000000..6bd2af1 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter05/converted_network/V1_V1_edge_types.csv @@ -0,0 +1,9 @@ +edge_type_id target_query source_query syn_weight dynamics_params distance_range delay target_sections weight_function model_template weight_sigma +100 pop_name=='Scnn1a' ei=='e' 50.0 ExcToExc.json NULL 2.0 NULL gaussianLL static_synapse 50.0 +101 pop_name=='LIF_exc' ei=='e' 50.0 instanteneousExc.json NULL 2.0 NULL gaussianLL static_synapse 50.0 +102 model_type=='biophysical'&ei=='i' ei=='i' 50.0 InhToInh.json NULL 2.0 NULL wmax static_synapse NULL +103 model_type=='point_process'&ei=='i' ei=='i' 50.0 instanteneousInh.json NULL 2.0 NULL wmax static_synapse NULL +104 model_type=='biophysical'&ei=='e' ei=='i' 50.0 InhToExc.json NULL 2.0 NULL wmax static_synapse NULL +105 model_type=='point_process'&ei=='e' ei=='i' 30.0 instanteneousInh.json NULL 2.0 NULL wmax static_synapse NULL +106 pop_name=='PV' ei=='e' 0.00035 ExcToInh.json NULL 2.0 NULL wmax static_synapse NULL +107 pop_name=='LIF_inh' ei=='e' 50.0 instanteneousExc.json NULL 2.0 NULL wmax static_synapse NULL diff --git a/bmtk-vb/docs/tutorial/sources/chapter05/converted_network/V1_node_types.csv b/bmtk-vb/docs/tutorial/sources/chapter05/converted_network/V1_node_types.csv new file mode 100644 index 0000000..32f692d --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter05/converted_network/V1_node_types.csv @@ -0,0 +1,5 @@ +node_type_id ei morphology_file model_processing pop_name location model_template model_type dynamics_params +100 e NULL NULL Scnn1a L4 nest:iaf_psc_alpha point_process 472363762_point.json +101 i NULL NULL PV L4 nest:iaf_psc_alpha point_process 472912177_point.json +102 e NULL NULL LIF_exc VisL4 nest:iaf_psc_alpha point_process IntFire1_exc_point.json +103 i NULL NULL LIF_inh VisL4 nest:iaf_psc_alpha point_process IntFire1_inh_point.json diff --git a/bmtk-vb/docs/tutorial/sources/chapter05/converted_network/V1_node_types_bionet.csv b/bmtk-vb/docs/tutorial/sources/chapter05/converted_network/V1_node_types_bionet.csv new file mode 100644 index 0000000..95729eb --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter05/converted_network/V1_node_types_bionet.csv @@ -0,0 +1,5 @@ +node_type_id ei morphology_file model_processing pop_name location model_template model_type dynamics_params +100 e Scnn1a.swc aibs_perisomatic Scnn1a L4 ctdb:Biophys1.hoc biophysical 472363762_fit.json +101 i Pvalb.swc aibs_perisomatic PV L4 ctdb:Biophys1.hoc biophysical 472912177_fit.json +102 e NULL NULL LIF_exc VisL4 nrn:IntFire1 point_process IntFire1_exc_1.json +103 i NULL NULL LIF_inh VisL4 nrn:IntFire1 point_process IntFire1_inh_1.json diff --git a/bmtk-vb/docs/tutorial/sources/chapter05/run_pointnet.py b/bmtk-vb/docs/tutorial/sources/chapter05/run_pointnet.py new file mode 100644 index 0000000..d2222f4 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter05/run_pointnet.py @@ -0,0 +1,20 @@ +import nest + +from bmtk.simulator import pointnet +from bmtk.analyzer.visualization.spikes import plot_spikes, plot_rates + + +def main(config_file): + configure = pointnet.Config.from_json(config_file) + configure.build_env() + + network = pointnet.PointNetwork.from_config(configure) + sim = pointnet.PointSimulator.from_config(configure, network) + sim.run() + + plot_spikes('network/V1_nodes.h5', 'network/V1_node_types.csv', 'output/spikes.h5') + # assert (spike_files_equal('output/spikes.csv', 'expected/spikes.csv')) + + +if __name__ == '__main__': + main('config.json') \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter06/circuit_config.json b/bmtk-vb/docs/tutorial/sources/chapter06/circuit_config.json new file mode 100644 index 0000000..fecc716 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter06/circuit_config.json @@ -0,0 +1,37 @@ +{ + "manifest": { + "$BASE_DIR": ".", + "$COMPONENTS_DIR": "$BASE_DIR/pop_components", + "$NETWORK_DIR": "$BASE_DIR/network" + }, + "components": { + "morphologies_dir": "$COMPONENTS_DIR/morphologies", + "point_neuron_models_dir": "$COMPONENTS_DIR/point_neuron_templates", + "population_models_dir": "$COMPONENTS_DIR/population_models", + "biophysical_neuron_models_dir": "$COMPONENTS_DIR/biophysical_neuron_templates", + "mechanisms_dir": "$COMPONENTS_DIR/mechanisms", + "synaptic_models_dir": "$COMPONENTS_DIR/synaptic_models" + }, + "networks": { + "nodes": [ + { + "node_types_file": "$NETWORK_DIR/V1_node_types.csv", + "nodes_file": "$NETWORK_DIR/V1_nodes.h5" + }, + { + "node_types_file": "$NETWORK_DIR/LGN_node_types.csv", + "nodes_file": "$NETWORK_DIR/LGN_nodes.h5" + } + ], + "edges": [ + { + "edges_file": "$NETWORK_DIR/V1_V1_edges.h5", + "edge_types_file": "$NETWORK_DIR/V1_V1_edge_types.csv" + }, + { + "edges_file": "$NETWORK_DIR/LGN_V1_edges.h5", + "edge_types_file": "$NETWORK_DIR/LGN_V1_edge_types.csv" + } + ] + } +} \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter06/converted_network/V1_node_types_bionet.csv b/bmtk-vb/docs/tutorial/sources/chapter06/converted_network/V1_node_types_bionet.csv new file mode 100644 index 0000000..95729eb --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter06/converted_network/V1_node_types_bionet.csv @@ -0,0 +1,5 @@ +node_type_id ei morphology_file model_processing pop_name location model_template model_type dynamics_params +100 e Scnn1a.swc aibs_perisomatic Scnn1a L4 ctdb:Biophys1.hoc biophysical 472363762_fit.json +101 i Pvalb.swc aibs_perisomatic PV L4 ctdb:Biophys1.hoc biophysical 472912177_fit.json +102 e NULL NULL LIF_exc VisL4 nrn:IntFire1 point_process IntFire1_exc_1.json +103 i NULL NULL LIF_inh VisL4 nrn:IntFire1 point_process IntFire1_inh_1.json diff --git a/bmtk-vb/docs/tutorial/sources/chapter06/converted_network/V1_node_types_popnet.csv b/bmtk-vb/docs/tutorial/sources/chapter06/converted_network/V1_node_types_popnet.csv new file mode 100644 index 0000000..475839f --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter06/converted_network/V1_node_types_popnet.csv @@ -0,0 +1,5 @@ +node_type_id ei morphology_file model_processing pop_name location model_template model_type dynamics_params +100 e NULL NULL Scnn1a L4 dipde:Internal population 472363762_pop.json +101 i NULL NULL PV L4 dipde:Internal population 472912177_pop.json +102 e NULL NULL LIF_exc VisL4 dipde:Internal population IntFire1_exc_pop.json +103 i NULL NULL LIF_inh VisL4 dipde:Internal population IntFire1_inh_pop.json diff --git a/bmtk-vb/docs/tutorial/sources/chapter06/lgn_rates.csv b/bmtk-vb/docs/tutorial/sources/chapter06/lgn_rates.csv new file mode 100644 index 0000000..e08d672 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter06/lgn_rates.csv @@ -0,0 +1,2 @@ +gid firing_rate +100 15.0 diff --git a/bmtk-vb/docs/tutorial/sources/chapter06/run_popnet.py b/bmtk-vb/docs/tutorial/sources/chapter06/run_popnet.py new file mode 100644 index 0000000..ea46b3e --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter06/run_popnet.py @@ -0,0 +1,24 @@ +import sys +import os + +from bmtk.simulator import popnet + +from bmtk.analyzer.visualization.spikes import plot_rates_popnet + +def main(config_file): + configure = popnet.config.from_json(config_file) + configure.build_env() + network = popnet.PopNetwork.from_config(configure) + sim = popnet.PopSimulator.from_config(configure, network) + sim.run() + + cells_file = 'network/brunel_node_types.csv' + rates_file = 'output/spike_rates.csv' + plot_rates_popnet(cells_file, rates_file, model_keys='pop_name') + + +if __name__ == '__main__': + if __file__ != sys.argv[-1]: + main(sys.argv[-1]) + else: + main('config.json') \ No newline at end of file diff --git a/bmtk-vb/docs/tutorial/sources/chapter06/simulation_config.json b/bmtk-vb/docs/tutorial/sources/chapter06/simulation_config.json new file mode 100644 index 0000000..67b7bd9 --- /dev/null +++ b/bmtk-vb/docs/tutorial/sources/chapter06/simulation_config.json @@ -0,0 +1,30 @@ +{ + "manifest": { + "$OUTPUT_DIR": "$BASE_DIR/output", + "$BASE_DIR": "." + }, + "target_simulator": "DiPDE", + "run": { + "tstop": 1500.0, + "dt": 0.001 + }, + "conditions": { + "celsius": 34.0 + }, + "inputs": { + "LGN_pop_rates": { + "input_type": "csv", + "module": "pop_rates", + "rates": "${BASE_DIR}/lgn_rates.csv", + "node_set": "LGN" + } + }, + "output": { + "rates_file": "firing_rates.csv", + "overwrite_output_dir": true, + "output_dir": "${OUTPUT_DIR}", + "log_file": "log.txt" + }, + "reports": {}, + "network": "./circuit_config.json" +} \ No newline at end of file diff --git a/bmtk-vb/requirements.txt b/bmtk-vb/requirements.txt new file mode 100644 index 0000000..8885603 --- /dev/null +++ b/bmtk-vb/requirements.txt @@ -0,0 +1 @@ +pandas>=0.14.3 \ No newline at end of file diff --git a/bmtk-vb/setup.py b/bmtk-vb/setup.py new file mode 100644 index 0000000..4c7d829 --- /dev/null +++ b/bmtk-vb/setup.py @@ -0,0 +1,95 @@ +from setuptools import setup, find_packages +from setuptools.command.test import test as TestCommand +import io +import os +import sys +import bmtk + +package_name = 'bmtk' +package_version = bmtk.__version__ + + +def read(*filenames, **kwargs): + encoding = kwargs.get('encoding', 'utf-8') + sep = kwargs.get('sep', '\n') + buf = [] + for filename in filenames: + with io.open(filename, encoding=encoding) as f: + buf.append(f.read()) + return sep.join(buf) + + +def prepend_find_packages(*roots): + """Recursively traverse nested packages under the root directories""" + packages = [] + + for root in roots: + packages += [root] + packages += [root + '.' + s for s in find_packages(root)] + + return packages + + +class PyTest(TestCommand): + def finalize_options(self): + TestCommand.finalize_options(self) + self.test_args = ['--ignore=examples', '--ignore=nicholasc', '--cov-report=html'] + self.test_args_cov = self.test_args + ['--cov=%s'.format(package_name), '--cov-report=term'] + self.test_suite = True + + def run_tests(self): + import pytest + + try: + errcode = pytest.main(self.test_args_cov) + except: + errcode = pytest.main(self.test_args) + sys.exit(errcode) + + +with open('README.md', 'r') as fhandle: + long_description = fhandle.read() + + +setup( + name=package_name, + version=package_version, + description='Brain Modeling Toolkit', + long_description=long_description, + long_description_content_type="text/markdown", + url='https://github.com/AllenInstitute/bmtk', + author='Kael Dai', + author_email='kaeld@alleninstitute.org', + package_data={'': ['*.md', '*.txt', '*.cfg', '**/*.json', '**/*.hoc']}, + tests_require=['pytest'], + install_requires=[ + 'jsonschema', + 'pandas', + 'numpy', + 'six', + 'h5py', + 'matplotlib' + ], + extras_require={ + 'bionet': ['NEURON'], + 'mintnet': ['tensorflow'], + 'pointnet': ['NEST'], + 'popnet': ['DiPDE'] + }, + cmdclass={'test': PyTest}, + packages=prepend_find_packages(package_name), + include_package_data=True, + platforms='any', + keywords=['neuroscience', 'scientific', 'modeling', 'simulation'], + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: BSD License', + 'Natural Language :: English', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Topic :: Scientific/Engineering :: Bio-Informatics' + ] +) diff --git a/bmtk-vb/test.h5 b/bmtk-vb/test.h5 new file mode 100644 index 0000000..cb583c3 Binary files /dev/null and b/bmtk-vb/test.h5 differ diff --git a/cortical-column/BBP_build_network.py b/cortical-column/BBP_build_network.py new file mode 100644 index 0000000..10723c4 --- /dev/null +++ b/cortical-column/BBP_build_network.py @@ -0,0 +1,571 @@ +import os +import itertools +import argparse +import json +import logging +from collections import OrderedDict + +import numpy as np +import h5py + +from bmtk.builder.networks import NetworkBuilder +from bmtk.builder.aux.node_params import xiter_random + +import utils +from layers import layer_depths +from build_network import generate_electrodes +from cells import cells, m_type_from_layer_m_type + +log = logging.getLogger('BBP_build_network') +log.setLevel(logging.DEBUG) +formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') +ch = logging.StreamHandler() +ch.setFormatter(formatter) +ch.setLevel(logging.DEBUG) +log.addHandler(ch) + + + +NUM_BBP_CELLS = 31346 +# NUM_BBP_L4_CELLS = 4656 # sum of m-type counts in layer_download.json +NUM_BBP_L4_CELLS = 6081 # sum of e-type counts in layer_download.json + +E_TYPE_KEY = "No. of neurons per electrical types" +connections_processed = 0 +BBP_conn_cache = {} + +def divide_choice(choice, categories, p=None): + """ + Divde a list into different categories according to some probability + """ + selected_categories = np.random.choice( + categories, replace=True, size=len(choice), p=p) + return {category: [choice[i] for i, _categ in enumerate(selected_categories) if _categ == category] + for category in categories} + +def get_e_type_fractions(popname, layers_json): + layer_name = popname.split('_')[0] + layer_etype_counts = layers_json[layer_name][E_TYPE_KEY] # etypes in this layer + these_etypes = cells[popname].keys() # etypes for this mtype + # e_type_counts = {k:v for k, v in layer_etype_counts.items() if k in these_etypes} + e_type_counts = {k:v for (k, v) in layer_etype_counts.items() if k in these_etypes} + return OrderedDict(( e_type, float(count) / sum(e_type_counts.values()) ) + for e_type, count in e_type_counts.items()) + +def iter_populations_split_23(circuitfile): + """ + circuitfile = open BBP circuit file (args.circuit_file) + + Iterate over each population, returning population name and all data, with + layers 2/3 separated out into separate return values + """ + for popname, popinfo in circuitfile['populations'].items(): + if popname[:3] == 'L23': + l23_cutoff = 2082 - (165+149) + l2_idx = (popinfo['locations'][:, 1] > l23_cutoff) + l3_idx = np.logical_not(l2_idx) + if np.any(l2_idx): + yield popname, {k: d[l2_idx, :] for k, d in popinfo.items()}, '2' + if np.any(l3_idx): + yield popname, {k: d[l3_idx, :] for k, d in popinfo.items()}, '3' + else: + yield popname, popinfo, popname[1] + + +def build_BBP_network(args): + log.info("Creating {} cells".format(int(NUM_BBP_CELLS * args.reduce))) + circuit_filename = os.path.basename(args.circuit_file)[:-3] + # net = NetworkBuilder('BBP_{}'.format(circuit_filename)) + net = NetworkBuilder('cortical_column') + with h5py.File(args.circuit_file, 'r') as circuitfile, \ + open(args.layers_file, 'r') as layersfile: + layers_json = json.load(layersfile) + # for popname, popinfo in circuitfile['populations'].items(): + for popname, popinfo, layer in iter_populations_split_23(circuitfile): + m_type = m_type_from_layer_m_type(popname) + ei = 'e' if m_type in utils.EXC_M_TYPES else 'i' + + # Randomly choose a subset of the cells of this population + num_total = len(popinfo['nCellAff']) # read any attribute to get total # cells + num_pop = int(args.reduce * num_total) + choice = sorted(np.random.choice(num_total, num_pop, replace=False)) + + if not choice: + continue + + # TODO: Store nCellAff, etc, on the cell object, then decrement it each time a connection is made? + + # Randomly choose e_types for these cells, according to their prevalence + e_type_fractions = get_e_type_fractions(popname, layers_json) + e_type_list = np.random.choice( + list(e_type_fractions.keys()), replace=True, size=num_pop, p=list(e_type_fractions.values())) + choice_by_e_type = {e_type: [choice[i] for i, _etype in enumerate(e_type_list) if _etype == e_type] + for e_type in e_type_fractions.keys()} + # for e_type, sub_choice in choice_by_e_type.items(): + for e_type, sub_choice in divide_choice(choice, list(e_type_fractions.keys()), p=list(e_type_fractions.values())).items(): + if not sub_choice: + continue + + celldata_list = cells[popname][e_type] + bad_morpho = ['C140201A1_-_Scale_x1.000_y0.975_z1.000_-_Clone_4.asc', + 'C140201A1_-_Scale_x1.000_y1.050_z1.000_-_Clone_6.asc', + 'rp110110_L5-3_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_9.asc', + 'C140201A1_-_Clone_6.asc', + 'C140201A1_-_Clone_1.asc', + ] + celldata_list = [x for x in celldata_list if x['morphology'] not in bad_morpho] + + for instance, final_choice in divide_choice(sub_choice, range(len(celldata_list))).items(): + if not final_choice: + continue + + net.add_nodes( + N=len(final_choice), + layer=layer, + m_type=m_type, + e_type=e_type, + ei=ei, + model_type='biophysical', + rotation_angle_yaxis=xiter_random(N=len(final_choice), min_x=0.0, max_x=2*np.pi), + positions=popinfo['locations'][final_choice, :], + BBP_population=popname, + population_idx=final_choice, + instance=instance, + **celldata_list[instance] + ) + log.debug("Created {} {} cells of e_type {}, instance {}".format( + len(sub_choice), popname, e_type, instance) + ) + + log.info("Created cells") + + def BBP_connector(source, target, nsyn_min=1, nsyn_max=10): + # TODO: Try loading the population->population connectivity matrix, then doing all those (would require BMTK to find all the nodes for a given population) + # TODO: Or buffer into Python dict + global connections_processed, BBP_conn_cache + src_pop, dst_pop = source['BBP_population'], target['BBP_population'] + src_idx, dst_idx = source['population_idx'], target['population_idx'] + + cache_key = (src_pop, dst_pop) + + if cache_key not in BBP_conn_cache: + try: + BBP_conn_cache[cache_key] = circuitfile['connectivity'][src_pop][dst_pop]['cMat'][:, :] + except: + # Account for silly BBP typo + BBP_conn_cache[cache_key] = circuitfile['connectivty'][src_pop][dst_pop]['cMat'][:, :] + + conn = BBP_conn_cache[cache_key][src_idx, dst_idx] + + connections_processed += 1 + if connections_processed % 10000000 == 0: + log.debug(connections_processed) + + return np.random.randint(nsyn_min, nsyn_max) if conn else None + + ei_map = {'e': 'Exc', 'i': 'Inh'} + def dynamics_params_for(pre_ei, post_ei): + receptor = 'AMPA' if pre_ei == 'e' else 'GABA' + return '{}_{}To{}.json'.format(receptor, ei_map[pre_ei], ei_map[post_ei]) + + for pre_ei, post_ei in itertools.product('ei', repeat=2): + net.add_edges( + source={'ei': pre_ei}, + target={'ei': post_ei}, + connection_rule=BBP_connector, + distance_range=[30.0, 150.0], + target_sections=['basal', 'apical'], + weight_function='distributed_weights', + syn_weight=args.ctx_ctx_weight, + weight_sigma=args.ctx_ctx_weight_std, + weight_distribution=args.weight_distn, + delay=2.0, # TODO: Get from pathways_physiology_factsheets_simplified.json + dynamics_params=dynamics_params_for(pre_ei, post_ei), + model_template='exp2syn', + ) + log.debug('cortical {}-{} connections'.format(pre_ei, post_ei)) + + log.info("Created ctx-ctx connections") + + log.info("Building cortical column...") + net.build() + net.save_nodes(output_dir=args.output) + net.save_edges(output_dir=args.output) + log.info("done") + + + #################### + ## THALAMIC INPUT ## + #################### + + nsyn_min = args.thal_ctx_nsyn[0] + nsyn_max = args.thal_ctx_nsyn[1] + + n_e = 900 * args.reduce # number of efferent cells per thalamic fiber + n_l = 350 # number of thalamic synapses per L4 cell + n_s = 12 # number of synapses per thalamocortical connection + # n_4 = n_cells_by_layer[4][0] # number of L4 excitatory cells + n_4 = NUM_BBP_L4_CELLS * args.reduce + + # num_thal = int(float(2*n_l*n_4) / float(n_e*n_s) * args.reduce) + num_thal = args.num_thal or int(float(2*n_l*n_4) / float(n_e*n_s)) + thal_l4_prob = float(n_e) / (2. * float(n_4)) + thal_l5_prob = thal_l4_prob / 1.5 + thal_l6_prob = thal_l4_prob / 2.0 + thal_ctx_prob = thal_l4_prob / 7.5 + + log.info("Creating {} virtual thalamic neurons".format(num_thal)) + log.info('thalamus -> L4 connection probability: {}'.format(thal_l4_prob)) + + # TODO: make these input arguments to the script + thal_prob_peaks = '-672.0,-1300.0' # depths where thalamic targets are most likely to end up + thal_prob_peak_std = '80.0,60.0' # spread around the peak + + def thalamocortical_connector(source, target, p, nsyn_min, nsyn_max): + if np.random.random() < p: + return np.random.randint(nsyn_min, nsyn_max) + else: + return 0 + + thalamus = NetworkBuilder(name='thalamus') + thalamus.add_nodes( + N=num_thal, + pop_name='spike_trains', + potential='exc', + model_type='virtual', + ) + + ## THALAMUS --> ALL LAYERS excitatory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='e', model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p':thal_ctx_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], + # prob_peaks=thal_prob_peaks, + # prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + ## THALAMUS --> ALL LAYERS inhibitory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='i', model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p':thal_ctx_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], + # prob_peaks=thal_prob_peaks, + # prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L4 excitatory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='e', layer=4, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l4_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + # target_sections=['basal', 'apical'], + # distance_range=[30.0, 150.0], + prob_peaks=thal_prob_peaks, + prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L4 inhibitory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='i', layer=4, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l4_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + # target_sections=['basal', 'apical'], + # distance_range=[30.0, 150.0], + prob_peaks=thal_prob_peaks, + prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L5 excitatory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='e', layer=5, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l5_prob, #args.thal_l5_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + # target_sections=['basal', 'apical'], + # distance_range=[30.0, 150.0], + prob_peaks=thal_prob_peaks, + prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L5 inhibitory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='i', layer=5, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l5_prob, #args.thal_l5_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + # target_sections=['basal', 'apical'], + # distance_range=[30.0, 150.0], + prob_peaks=thal_prob_peaks, + prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L6 excitatory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='e', layer=6, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l6_prob, #args.thal_l6_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + # target_sections=['basal', 'apical'], + # distance_range=[30.0, 150.0], + prob_peaks=thal_prob_peaks, + prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L6 inhibitory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='i', layer=6, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l6_prob, #args.thal_l6_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + # target_sections=['basal', 'apical'], + # distance_range=[30.0, 150.0], + prob_peaks=thal_prob_peaks, + prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + log.info("Building thalamus...") + thalamus.build() + thalamus.save_nodes(output_dir=args.output) + thalamus.save_edges(output_dir=args.output) + log.info("done") + + + ###################### + ## BACKGROUND INPUT ## + ###################### + + NUM_BKG = args.num_bkg + NUM_BKG_E = int(NUM_BKG * args.num_bkg_exc_frac) + NUM_BKG_I = int(NUM_BKG - NUM_BKG_E) + nsyn_min = args.bkg_nsyn[0] + nsyn_max = args.bkg_nsyn[1] + + log.info("Creating {} virtual background neurons ({} exc, {} inh)".format(NUM_BKG, NUM_BKG_E, NUM_BKG_I)) + log.info("Creating {} virtual background neurons".format(NUM_BKG)) + + bkg = NetworkBuilder(name='bkg') + + bkg.add_nodes( + N=NUM_BKG_E, + pop_name='bkg', + potential='exc', + ei='e', + model_type='virtual', + ) + + bkg.add_nodes( + N=NUM_BKG_I, + pop_name='bkg_i', + potential='inh', + ei='i', + model_type='virtual', + ) + + bkg_connector = thalamocortical_connector + + log.info("Creating connections from bkg into cortical column") + + log.debug("e-e bkg->cc connections") + bkg.add_edges( + source=bkg.nodes(ei='e'), + target=net.nodes(ei='e'), + connection_rule=bkg_connector, + connection_params={'p': args.bkg_exc_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.bkg_weight, + weight_function='distributed_weights', + weight_sigma=args.bkg_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], # TODO: What is this? + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + log.debug("e-i bkg->cc connections") + bkg.add_edges( + source=bkg.nodes(ei='e'), + target=net.nodes(ei='i'), + connection_rule=bkg_connector, + connection_params={'p': args.bkg_exc_prob/args.bkg_ei_ratio, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.bkg_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.bkg_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], # TODO: What is this? + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + log.debug("i-e bkg->cc connections") + bkg.add_edges( + source=bkg.nodes(ei='i'), + target=net.nodes(ei='e'), + connection_rule=bkg_connector, + connection_params={'p': args.bkg_exc_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.bkg_weight, + weight_function='distributed_weights', + weight_sigma=args.bkg_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], # TODO: What is this? + delay=2.0, + dynamics_params='GABA_InhToExc.json', + model_template='exp2syn', + ) + + log.debug("i-i bkg->cc connections") + bkg.add_edges( + source=bkg.nodes(ei='i'), + target=net.nodes(ei='i'), + connection_rule=bkg_connector, + connection_params={'p': args.bkg_exc_prob/args.bkg_ei_ratio, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.bkg_weight, + weight_function='distributed_weights', + weight_sigma=args.bkg_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], # TODO: What is this? + delay=2.0, + dynamics_params='GABA_InhToInh.json', + model_template='exp2syn', + ) + + log.info("building bkg...") + bkg.build() + bkg.save_nodes(output_dir=args.output) + bkg.save_edges(output_dir=args.output) + log.info("done") + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + + parser.add_argument('--output', '--network', type=str, default='BBP_network', + help='network output file directory') + + parser.add_argument('--layers-file', type=str, default='layer_download.json') + parser.add_argument('--circuit-file', '--circuit', type=str, default='average/cons_locs_pathways_mc0_Column/cons_locs_pathways_mc0_Column.h5', help='BBP circuit file to recreate') + + parser.add_argument('--reduce', '--scale', type=float, default=1.0) + + parser.add_argument('--ctx-ctx-weight', type=float, default=1e-4) + parser.add_argument('--ctx-ctx-weight-std', type=float, default=5e-5) + + # Thalamic population + parser.add_argument('--num-thal', type=int, required=False, default=None) + parser.add_argument('--thal-ctx-nsyn', type=int, nargs=2, default=[7, 17]) + parser.add_argument('--thal-ctx-weight', type=float, default=5e-5) + parser.add_argument('--thal-ctx-weight-std', type=float, default=1e-5) + + # Background population + parser.add_argument('--num-bkg', type=int, default=10000) + parser.add_argument('--num-bkg-exc-frac', type=float, default=0.5, + help="fraction of bkg neurons that are exc") + parser.add_argument('--bkg-nsyn', type=int, nargs=2, default=[1, 6]) + parser.add_argument('--bkg-exc-prob', type=float, default=0.025, + help="probability that a given bkg neuron connects to a given excitatory neuron") + parser.add_argument('--bkg-ei-ratio', type=float, default=1.3, + help="ratio of e-i connection probs") + parser.add_argument('--bkg-weight', type=float, default=1e-4) + parser.add_argument('--bkg-weight-std', type=float, default=5e-5) + + # General weight parameters + parser.add_argument('--ei-weight-ratio', type=float, default=2.0, + help="ratio of e to i weights for all populations") + parser.add_argument('--weight-distn', type=str, default='lognormal', + help="any member of np.random which takes mean, sigma") + + args = parser.parse_args() + + build_BBP_network(args) + generate_electrodes(args) diff --git a/cortical-column/_run.sh b/cortical-column/_run.sh new file mode 100644 index 0000000..80287fc --- /dev/null +++ b/cortical-column/_run.sh @@ -0,0 +1,98 @@ +#!/bin/bash -l +#SBATCH -q debug +#SBATCH --array 1-1 +#SBATCH -N 32 +#SBATCH -t 0:30:00 +#SBATCH -J cortical-column +#SBATCH -L SCRATCH,project +#SBATCH -C haswell +#SBATCH --mail-user mikelam.us@berkeley.edu +#SBATCH --mail-type BEGIN,END,FAIL +#SBATCH --output "/global/cfs/cdirs/m2043/mikelam/cortical-column/runs/slurm/%A_%a.out" +#SBATCH --error "/global/cfs/cdirs/m2043/mikelam/cortical-column/runs/slurm/%A_%a.err" + +###################### +## SETTINGS AND SHIT +###################### + +# for knl +module unload craype-hugepages2M + + +set -e + +echo +echo "Started at" `date` +echo + +# source /project/projectdirs/m2043/vbaratha/nrn-parallel/parallelnrn.env +cd $CCHOME + + +RUNDIR=$CCDATAROOT/${SLURM_ARRAY_JOB_ID}/${SLURM_ARRAY_TASK_ID} +mkdir -p $RUNDIR +# stripe_large $RUNDIR +lfs setstripe $RUNDIR --stripe-count 150 + +# OpenMP settings +export OMP_NUM_THREADS=1 +export OMP_PLACES=threads +export OMP_PROC_BIND=spread + + +TSTOP=100 + + +#################################### +## CHOOSE A NETWORK CREATION METHOD +#################################### + + +## COPY BBP +# srun --label -n 1 python BBP_build_network.py \ +# --network=$RUNDIR/network \ +# --reduce .1 \ +# --ctx-ctx-weight .6e-4 \ +# --ctx-ctx-weight-std 1e-5 \ +# --thal-ctx-weight 2.0e-4 \ +# --thal-ctx-weight-std 2e-5 \ +# --bkg-weight 2.0e-4 \ +# --num-bkg 5000 \ +# --num-thal 5000 \ +# --circuit-file individuals/pathways_P14-14/pathways_mc0_Column.h5 +# echo "Finished copying BBP network at" `date` + +## REUSE PREVIOUS RUN +RUN=40776658/1 +cp -r $CCDATAROOT/$RUN/network $RUNDIR/network +rm -f $RUNDIR/network/*_spikes.csv # use new spike trains +mkdir $RUNDIR/output +echo "reusing network from $RUN" + + +######################### +## RUN THE SIMULATION +######################### + + +srun -n 1 python configure.py \ + --base-config=base_config_ecp.json \ + --network-dir=$RUNDIR/network \ + --output-dir=$RUNDIR/output \ + --config-outfile=$RUNDIR/config.json \ + --stim wn_simulation_ampl_v1_05 \ + --timestep 0.1 \ + --tstop $TSTOP \ + --cells all \ + --nsteps-block 500 \ + --optocell '5e' + + +srun --label -n $((${SLURM_NNODES}*64)) -c 1 python run.py $RUNDIR/config.json + +#srun python count_layer_segments.py --jobnum ${SLURM_ARRAY_JOB_ID}/${SLURM_ARRAY_TASK_ID} --outfile $RUNDIR/output/layer_slice_counts.json + +echo +echo "Finished at" `date` +echo + diff --git a/cortical-column/_run_calc_ecp.sh b/cortical-column/_run_calc_ecp.sh new file mode 100644 index 0000000..8849599 --- /dev/null +++ b/cortical-column/_run_calc_ecp.sh @@ -0,0 +1,66 @@ +#!/bin/bash -l +#SBATCH -q debug +#SBATCH --array 1-1 +#SBATCH -N 10 +#SBATCH -t 00:30:00 +#SBATCH -J calc_ecp +#SBATCH -L SCRATCH +#SBATCH -C knl +#SBATCH --mail-user mikelam.us@berkeley.edu +#SBATCH --mail-type BEGIN,END,FAIL +#SBATCH --output "/global/cfs/cdirs/m2043/mikelam/cortical-column/runs/slurm/%A_%a.out" +#SBATCH --error "/global/cfs/cdirs/m2043/mikelam/cortical-column/runs/slurm/%A_%a.err" + +set -e + +echo +echo "Started at" `date` +echo + + +cd $CCHOME + +SIM_JOBID=40776658 + +SIM_ARRAY_TASK=1 +SIM_JOBNUM=${SIM_JOBID}/${SIM_ARRAY_TASK} +SIM_RUNDIR=$CCDATAROOT/${SIM_JOBNUM} +T_SIM=25000 # This is the # of simulation timesteps +TASKS_PER_NODE=2 +CHUNKSIZE=$(( ${T_SIM}/${SLURM_NNODES}/${TASKS_PER_NODE} )) +# GROUPBY=layer_ei # **currently commented out below** + +JOBNUM=${SLURM_ARRAY_JOB_ID}/${SLURM_ARRAY_TASK_ID} +RUNDIR=$CCDATAROOT/$JOBNUM +OUTDIR=${SIM_RUNDIR}/output +OUTFILE=$OUTDIR/ecp_${SIM_JOBID}_via_${SLURM_ARRAY_JOB_ID}.nwb +IM_FILE=$OUTDIR/im.h5 + +# We need to create the rundir for this slurm run b/c that's where we +# write temp output before creating the .nwb file +mkdir -p $RUNDIR/output + +echo $OUTFILE + +# OpenMP settings +export OMP_NUM_THREADS=1 +export OMP_PLACES=threads +export OMP_PROC_BIND=spread + +cmd="srun --label -N ${SLURM_NNODES} --ntasks-per-node ${TASKS_PER_NODE} python calc_ecp.py \ + --jobnum $JOBNUM \ + --sim-jobnum ${SIM_JOBNUM} \ + --block Simulation_25khz \ + --chunksize ${CHUNKSIZE} \ + --local-chunksize 50 \ + --outfile $OUTFILE \ + --im-file ${IM_FILE}" +echo $cmd +$cmd + + + +echo +echo "Finished at" `date` +echo + diff --git a/cortical-column/_run_calc_ecp_100um.sh b/cortical-column/_run_calc_ecp_100um.sh new file mode 100644 index 0000000..827dd5a --- /dev/null +++ b/cortical-column/_run_calc_ecp_100um.sh @@ -0,0 +1,69 @@ +#!/bin/bash -l +#SBATCH -q premium +#SBATCH --array 10-11 +#SBATCH -N 50 +#SBATCH -t 2:00:00 +#SBATCH -J calc_ecp_100um +#SBATCH -L SCRATCH +#SBATCH -C haswell +#SBATCH --mail-user vbaratham@berkeley.edu +#SBATCH --mail-type BEGIN,END,FAIL +#SBATCH --output "/global/cscratch1/sd/vbaratha/cortical-column/runs/slurm/%A_%a.out" +#SBATCH --error "/global/cscratch1/sd/vbaratha/cortical-column/runs/slurm/%A_%a.err" +# #DW persistentdw name=calc_ecp_100um +# mkdir $DW_JOB_STRIPED/output + +set -e + +echo +echo "Started at" `date` +echo + + +cd $SCRATCH/cortical-column + +SIM_JOBID=32529070 + +SIM_ARRAY_TASK=1 +SIM_JOBNUM=${SIM_JOBID}/${SIM_ARRAY_TASK} +SIM_RUNDIR=runs/${SIM_JOBNUM} +T_SIM=60000 # This is the simulation length in ms +TASKS_PER_NODE=2 +CHUNKSIZE=$(( ${T_SIM}/${SLURM_NNODES}/${TASKS_PER_NODE}*10 )) +echo "CHUNKSIZE" $CHUNKSIZE + + +JOBNUM=${SLURM_ARRAY_JOB_ID}/${SLURM_ARRAY_TASK_ID} +RUNDIR=runs/$JOBNUM +OUTDIR=${SIM_RUNDIR}/output +OUTFILE=$OUTDIR/ecp_200um_${SIM_JOBID}_via_${SLURM_ARRAY_JOB_ID}.nwb +# TMP_OUTPUT_DIR=$DW_JOB_STRIPED/output +TMP_OUTPUT_DIR=$OUTDIR # We are just taking the individual slice h5 files as the final output +IM_FILE=$DW_JOB_STRIPED/im.h5 +mkdir -p $RUNDIR/output # needed b/c we write temp files here + +echo $OUTFILE + +# OpenMP settings +export OMP_NUM_THREADS=1 +export OMP_PLACES=threads +export OMP_PROC_BIND=spread + +srun --label -N ${SLURM_NNODES} --ntasks-per-node ${TASKS_PER_NODE} python calc_ecp_100um.py \ + --jobnum $JOBNUM \ + --sim-jobnum ${SIM_JOBNUM} \ + --block Simulation_v1 \ + --chunksize ${CHUNKSIZE} \ + --local-chunksize 50 \ + --outfile $OUTFILE \ + --electrodes-file runs/32223414/1/network/electrodes.csv \ + --array-task ${SLURM_ARRAY_TASK_ID} \ + --tmp-output-dir ${TMP_OUTPUT_DIR} \ + # --im-file ${IM_FILE} + +# Run accumulate_ecp_groups.py separately when all finish + +echo +echo "Finished at" `date` +echo + diff --git a/cortical-column/base_config.json b/cortical-column/base_config.json new file mode 100644 index 0000000..ca99a02 --- /dev/null +++ b/cortical-column/base_config.json @@ -0,0 +1,103 @@ +{ + "__COMMENT__": "Base configuration options. Override with ./host_config.json and/or command line options to configure.py", + "manifest": { + "$NETWORK_DIR": "PLACEHOLDER (SEE configure.py)", + "$OUTPUT_DIR": "PLACEHOLDER (SEE configure.py)", + "$COMPONENTS_DIR": "components" + }, + "target_simulator": "BioNet", + "run": { + "dL": 20, + "nsteps_block": 1000, + "spike_threshold": -10, + "overwrite_output_dir": true, + "tstop": 2500.0, + "dt": 0.1, + "calc_ecp": true + }, + "conditions": { + "celsius": 34.0, + "v_init": -60, + "cao0": 2.0 + }, + "inputs": { + "ext_spikes": { + "input_type": "spikes", + "module": "csv", + "input_file": "${NETWORK_DIR}/thalamus_spikes.csv", + "node_set": "thalamus" + }, + "bkg_spikes": { + "input_type": "spikes", + "module": "csv", + "input_file": "${NETWORK_DIR}/bkg_spikes.csv", + "node_set": "bkg" + } + }, + "components": { + "morphologies_dir": "${COMPONENTS_DIR}/biophysical/morphology", + "point_neuron_models_dir": "${COMPONENTS_DIR}/intfire", + "templates_dir": "${COMPONENTS_DIR}/hoc_templates", + "biophysical_neuron_models_dir": "${COMPONENTS_DIR}/biophysical/electrophysiology", + "mechanisms_dir": "${COMPONENTS_DIR}/mechanisms", + "synaptic_models_dir": "${COMPONENTS_DIR}/synaptic_models" + }, + "output": { + "spikes_file_csv": "spikes.csv", + "spikes_file": "spikes.h5", + "log_file": "log.txt", + "output_dir": "${OUTPUT_DIR}" + }, + "reports": { + "membrane_current": { + "file_name": "im.h5", + "cells": "all", + "sections": "all", + "module": "section_report", + "variable_name": ["im"] + }, + "membrane_potential": { + "file_name": "cell_vars.h5", + "cells": "all", + "sections": "soma", + "module": "membrane_report", + "variable_name": ["v"] + } + }, + "networks": { + "nodes": [ + { + "node_types_file": "${NETWORK_DIR}/cortical_column_node_types.csv", + "nodes_file": "${NETWORK_DIR}/cortical_column_nodes.h5", + "name": "cortical_column" + }, + { + "node_types_file": "${NETWORK_DIR}/thalamus_node_types.csv", + "nodes_file": "${NETWORK_DIR}/thalamus_nodes.h5", + "name": "thalamus" + }, + { + "node_types_file": "${NETWORK_DIR}/bkg_node_types.csv", + "nodes_file": "${NETWORK_DIR}/bkg_nodes.h5", + "name": "bkg" + } + ], + "edges": [ + { + "edges_file": "${NETWORK_DIR}/cortical_column_cortical_column_edges.h5", + "name": "cortical_column_cortical_column", + "edge_types_file": "${NETWORK_DIR}/cortical_column_cortical_column_edge_types.csv" + }, + { + "edges_file": "${NETWORK_DIR}/thalamus_cortical_column_edges.h5", + "name": "thalamus_cortical_column", + "edge_types_file": "${NETWORK_DIR}/thalamus_cortical_column_edge_types.csv" + }, + { + "edges_file": "${NETWORK_DIR}/bkg_cortical_column_edges.h5", + "name": "bkg_cortical_column", + "edge_types_file": "${NETWORK_DIR}/bkg_cortical_column_edge_types.csv" + } + ] + } +} diff --git a/cortical-column/build_network.py b/cortical-column/build_network.py new file mode 100644 index 0000000..0800a7d --- /dev/null +++ b/cortical-column/build_network.py @@ -0,0 +1,666 @@ +from __future__ import print_function + +import os +import argparse +import json +import csv + +import numpy as np +import h5py + +from bmtk.builder.networks import NetworkBuilder +from bmtk.builder.aux.node_params import positions_columinar, xiter_random +from bmtk.builder.aux.edge_connectors import connect_random + +import utils +from cells import cells, m_type_from_layer_m_type +from layers import layer_depths, layer_thicknesses +from stimulus import stimulus, save_csv + +TOT_THICKNESS = sum(layer_thicknesses.values()) + +L2_DENSITY = 164600 * 1e-9 +L3_DENSITY = 83800 * 1e-9 + +L2_NUM = L2_DENSITY * layer_thicknesses[2] +L3_NUM = L3_DENSITY * layer_thicknesses[3] + +# Fraction of L23 neurons that are in layer 2 +L2_FRAC = L2_NUM / (L2_NUM + L3_NUM) + +NUM_BBP_CELLS = 31346 +BBP_RADIUS = 230.0 + +# Keys into layer_download.json: +M_TYPE_KEY = "No. of neurons per morphological types" +E_TYPE_KEY = "No. of neurons per electrical types" + +too_far = 0 # used to count neurons whose soma-soma distance went out of range + +def build_cortical_column(args): + + conn_prob_file = args.conn_probs + output = args.output + + COLUMN_RADIUS = args.column_radius + scale_factr = COLUMN_RADIUS**2 / BBP_RADIUS**2 * args.reduce + + ########### + ## CELLS ## + ########### + + net = NetworkBuilder("cortical_column") + + n_cells_by_layer = {} + with open(args.layers_file, 'r') as layersfile: + layers_json = json.load(layersfile) + # for layername, layerdata in json.load(layersfile).items(): + n_cells_tot, n_cells_tot_e, n_cells_tot_i = 0, 0, 0 + for layer, ei, layer_ei, layername in utils.iter_populations(): + if ei == 'e': + continue # We iterate over all m-types, which includes exc. and inh. + + L23_scale = L2_FRAC if layer == 2 else (1-L2_FRAC) if layer == 3 else 1 + + # Data from BBP layers_download.json + layerdata = layers_json['L'+layername[:-1]] + n_tot_layer = int(sum(layerdata[M_TYPE_KEY].values()) * L23_scale) + n_cells_layer, n_cells_layer_e, n_cells_layer_i = 0, 0, 0 + e_type_counts = layerdata[E_TYPE_KEY] + + for layer_m_type, num_tot_m in layerdata[M_TYPE_KEY].items(): + num_tot_m = num_tot_m * L23_scale + n_cells_m = 0 + + # layer_m_type = L4_LBC ---> m_type = LBC + m_type = m_type_from_layer_m_type(layer_m_type) + ei = 'e' if m_type in utils.EXC_M_TYPES else 'i' + + sum_e_type = sum(e_type_counts[e_type] for e_type in cells[layer_m_type].keys()) + for e_type, cell_list in cells[layer_m_type].items(): + # Fraction of cells of the current m_type which are also the current e_type + frac_this_e_type = e_type_counts[e_type]/float(sum_e_type) + n_pop = num_tot_m * frac_this_e_type * scale_factr / len(cell_list) + + # Nonzero chance of all cells being instantiated + if n_pop < 1: + n_pop = 1 if np.random.random() < n_pop else 0 + else: + n_pop = int(n_pop) + + for i, celldata in enumerate(cell_list): + net.add_nodes( + N=n_pop, + layer=layer, + m_type=m_type, + e_type=e_type, + instance=i, + ei=ei, + model_type='biophysical', + rotation_angle_yaxis=xiter_random(N=n_pop, min_x=0.0, max_x=2*np.pi), + positions=positions_columinar( + N=n_pop, + center=[0.0, layer_depths[int(layer)], 0.0], + height=layer_thicknesses[int(layer)], + max_radius=COLUMN_RADIUS, + ), + **celldata + ) + + n_cells_m += n_pop + n_cells_layer += n_pop + n_cells_tot += n_pop + if ei == 'e': + n_cells_layer_e += n_pop + n_cells_tot_e += n_pop + else: + n_cells_layer_i += n_pop + n_cells_tot_i += n_pop + + + print(" {} ({}): N={}".format(layer_m_type, ei, n_cells_m)) + + print("Created layer {} cells, N={} ({} exh, {} inh)".format(layer, n_cells_layer, n_cells_layer_e, n_cells_layer_i)) + n_cells_by_layer[layer] = (n_cells_layer_e, n_cells_layer_i) + print('') + print('-' * 80) + print('') + + print("Created {} total cells ({} exc, {} inh)".format(n_cells_tot, n_cells_tot_e, n_cells_tot_i)) + + + ########### + ## EDGES ## + ########### + + def custom_dist_connector(conn, bins): + def num_synapses(source, target, nsyn_min, nsyn_max): + global too_far + # distance between source and target + r = np.linalg.norm(np.array(source['positions']) + - np.array(target['positions'])) + + # If the distance is larger than the range of distances calculated, + # use the last bin + i = np.digitize(r, bins) + if i > len(conn): + too_far += 1 + # if too_far % 100 == 0: + # import ipdb; ipdb.set_trace() + # print(too_far) + connection_prob = conn[min(i, len(conn)-1)] / scale_factr + + if np.random.random() > connection_prob: + return None + + return np.random.randint(nsyn_min, nsyn_max) + + return num_synapses + + + ei_map = {'e': 'Exc', 'i': 'Inh'} + def dynamics_params_for(pre_ei, post_ei): + receptor = 'AMPA' if pre_ei == 'e' else 'GABA' + return '{}_{}To{}.json'.format(receptor, ei_map[pre_ei], ei_map[post_ei]) + + # Load connection probability file + print("Creating cortex-cortex connections") + with h5py.File(conn_prob_file, 'r') as f: + for pre_layer, pre_ei, _, pre_layer_key in utils.iter_populations(): + for post_layer, post_ei, _, post_layer_key in utils.iter_populations(): + # To biophysical neurons + weight_scale = args.ei_weight_ratio if pre_ei == 'e' and post_ei == 'i' else 1.0 + net.add_edges( + source={'layer': pre_layer, 'ei': pre_ei}, + target={'layer': post_layer, 'ei': post_ei, + 'model_type': 'biophysical'}, + connection_rule=custom_dist_connector( + f['conn'][pre_layer_key][post_layer_key][:], + f['bins'][pre_layer_key][post_layer_key][:] + ), + connection_params={'nsyn_min': 1, 'nsyn_max': 10}, + # TODO: read from params file (per layer pair): + distance_range=[30.0, 150.0], # TODO: What does this do? + target_sections=['basal', 'apical'], + weight_function='distributed_weights', + syn_weight=args.ctx_ctx_weight * weight_scale, + weight_sigma=args.ctx_ctx_weight_std, + weight_distribution=args.weight_distn, + delay=2.0, + dynamics_params=dynamics_params_for(pre_ei, post_ei), + model_template='exp2syn', + ) + + + #################### + ## THALAMIC INPUT ## + #################### + + nsyn_min = args.thal_ctx_nsyn[0] + nsyn_max = args.thal_ctx_nsyn[1] + + n_e = 900 * float(n_cells_tot) / float(NUM_BBP_CELLS) # number of efferent cells per thalamic fiber + n_l = 350 # number of thalamic synapses per L4 cell + n_s = 12 # number of synapses per thalamocortical connection + n_4 = n_cells_by_layer[4][0] # number of L4 excitatory cells + + num_thal = int(float(2*n_l*n_4) / float(n_e*n_s) * args.reduce) + thal_l4_prob = float(n_e) / (2. * float(n_4)) + thal_l5_prob = thal_l4_prob / 1.5 + thal_l6_prob = thal_l4_prob / 2.0 + thal_ctx_prob = thal_l4_prob / 7.5 + + # TODO: make these input arguments to the script + thal_prob_peaks = '-672.0,-1300.0' # depths where thalamic targets are most likely to end up + thal_prob_peak_std = '80.0,60.0' # spread around the peak + + def thalamocortical_connector(source, target, p, nsyn_min, nsyn_max): + if np.random.random() < p: + return np.random.randint(nsyn_min, nsyn_max) + else: + return 0 + + print("Creating {} virtual thalamic neurons".format(num_thal)) + thalamus = NetworkBuilder(name='thalamus') + thalamus.add_nodes( + N=num_thal, + pop_name='spike_trains', + potential='exc', + model_type='virtual', + ) + + print("Creating random thalamocortical connections to all layers") + ## THALAMUS --> ALL LAYERS excitatory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='e', model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p':thal_ctx_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], + # prob_peaks=thal_prob_peaks, + # prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + ## THALAMUS --> ALL LAYERS inhibitory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='i', model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p':thal_ctx_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], + # prob_peaks=thal_prob_peaks, + # prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L4 excitatory + print("Creating thalamus --> L4 excitatory connections") + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='e', layer=4, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l4_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + # target_sections=['basal', 'apical'], + # distance_range=[30.0, 150.0], + prob_peaks=thal_prob_peaks, + prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L4 inhibitory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='i', layer=4, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l4_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], + # prob_peaks=thal_prob_peaks, + # prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L5 excitatory + print("Creating thalamus --> L5 excitatory connections") + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='e', layer=5, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l5_prob, #args.thal_l5_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + # target_sections=['basal', 'apical'], + # distance_range=[30.0, 150.0], + prob_peaks=thal_prob_peaks, + prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L5 inhibitory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='i', layer=5, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l5_prob, #args.thal_l5_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], + # prob_peaks=thal_prob_peaks, + # prob_peak_std=thal_prob_peak1_std, + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L6 excitatory + print("Creating thalamus --> L6 excitatory connections") + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='e', layer=6, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l6_prob, #args.thal_l6_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + # target_sections=['basal', 'apical'], + # distance_range=[30.0, 150.0], + prob_peaks=thal_prob_peaks, + prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + ## THALAMUS --> L6 inhibitory + thalamus.add_edges( + source=thalamus.nodes(), + target=net.nodes(ei='i', layer=6, model_type='biophysical'), + connection_rule=thalamocortical_connector, + connection_params={'p': thal_l6_prob, #args.thal_l6_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.thal_ctx_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.thal_ctx_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], + # prob_peaks=thal_prob_peaks, + # prob_peak_std=thal_prob_peak_std, + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + + ###################### + ## BACKGROUND INPUT ## + ###################### + + NUM_BKG = args.num_bkg * args.reduce + NUM_BKG_E = int(NUM_BKG * args.num_bkg_exc_frac) + NUM_BKG_I = int(NUM_BKG - NUM_BKG_E) + nsyn_min = args.bkg_nsyn[0] + nsyn_max = args.bkg_nsyn[1] + + print("Creating {} virtual background neurons ({} exc, {} inh)".format(NUM_BKG, NUM_BKG_E, NUM_BKG_I)) + print("Creating {} virtual background neurons".format(NUM_BKG)) + + bkg = NetworkBuilder(name='bkg') + + bkg.add_nodes( + N=NUM_BKG_E, + pop_name='bkg', + potential='exc', + ei='e', + model_type='virtual', + ) + + bkg.add_nodes( + N=NUM_BKG_I, + pop_name='bkg_i', + potential='inh', + ei='i', + model_type='virtual', + ) + + bkg_connector = thalamocortical_connector + + print("Creating e-e connections from bkg into cortical column") + bkg.add_edges( + source=bkg.nodes(ei='e'), + target=net.nodes(ei='e'), + connection_rule=bkg_connector, + connection_params={'p': args.bkg_exc_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.bkg_weight, + weight_function='distributed_weights', + weight_sigma=args.bkg_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], # TODO: What is this? + delay=2.0, + dynamics_params='AMPA_ExcToExc.json', + model_template='exp2syn', + ) + + print("Creating e-i connections from bkg into cortical column") + bkg.add_edges( + source=bkg.nodes(ei='e'), + target=net.nodes(ei='i'), + connection_rule=bkg_connector, + connection_params={'p': args.bkg_exc_prob/args.bkg_ei_ratio, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.bkg_weight * args.ei_weight_ratio, + weight_function='distributed_weights', + weight_sigma=args.bkg_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], # TODO: What is this? + delay=2.0, + dynamics_params='AMPA_ExcToInh.json', + model_template='exp2syn', + ) + + print("Creating i-e connections from bkg into cortical column") + bkg.add_edges( + source=bkg.nodes(ei='i'), + target=net.nodes(ei='e'), + connection_rule=bkg_connector, + connection_params={'p': args.bkg_exc_prob, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.bkg_weight, + weight_function='distributed_weights', + weight_sigma=args.bkg_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], # TODO: What is this? + delay=2.0, + dynamics_params='GABA_InhToExc.json', + model_template='exp2syn', + ) + + print("Creating i-i connections from bkg into cortical column") + bkg.add_edges( + source=bkg.nodes(ei='i'), + target=net.nodes(ei='i'), + connection_rule=bkg_connector, + connection_params={'p': args.bkg_exc_prob/args.bkg_ei_ratio, + 'nsyn_min': nsyn_min, + 'nsyn_max': nsyn_max}, + syn_weight=args.bkg_weight, + weight_function='distributed_weights', + weight_sigma=args.bkg_weight_std, + weight_distribution=args.weight_distn, + target_sections=['basal', 'apical'], + distance_range=[30.0, 150.0], # TODO: What is this? + delay=2.0, + dynamics_params='GABA_InhToInh.json', + model_template='exp2syn', + ) + + ################## + ## SAVE NETWORK ## + ################## + + net.build() + net.save_nodes(output_dir=output) + net.save_edges(output_dir=output) + + thalamus.build() + thalamus.save_nodes(output_dir=output) + thalamus.save_edges(output_dir=output) + + bkg.build() + bkg.save_nodes(output_dir=output) + bkg.save_edges(output_dir=output) + + print("{} connections were beyond the max distance in the bluebrain model".format(too_far)) + + + +def generate_electrodes(args): + ELECTRODE_SPACING = 100.0 + ECOG_RAD = 25.0 + ECOG_N = 10 # number of points to average for ECoG + PIXEL_N = 32 + with open(os.path.join(args.output, 'electrodes.csv'), 'w') as f: + writer = csv.writer(f, delimiter=' ') + writer.writerow(["x_pos", "y_pos", "z_pos"]) + # The signal on these 4 electrodes will be averaged to compute the ECoG signal + # y is depth + # for i in range(ECOG_N): + # xz = np.random.random(2) * ECOG_RAD - ECOG_RAD/2.0 + # writer.writerow([xz[0], 2083, xz[1]]) + # writer.writerow([ ECOG_RAD/2, 2083, 0]) + # writer.writerow([-ECOG_RAD/2, 2083, 0]) + # writer.writerow([0, 2083, ECOG_RAD/2]) + # writer.writerow([0, 2083, -ECOG_RAD/2]) + # for y in np.arange(ELECTRODE_SPACING, TOT_THICKNESS, ELECTRODE_SPACING): + # writer.writerow([0, y, 0]) + + # for y in np.arange(ELECTRODE_SPACING, 2000.0, ELECTRODE_SPACING): + # for i in range(PIXEL_N): + # x, z = np.random.random(2) * 12 - 6 + # writer.writerow([x, y, z]) + + # Bottom of column is (0, 0, 0) + + # Location of bottom corner: + X, Y, Z = 0, 1000, 0 + # Pixels are in the X-Y plane (Z = 0 throughout) + VSPACE = 20 + HSPACE = 16 + + ROWS, COLS = 10, 4 + idx = 1 + for row in range(ROWS): + for col in range(COLS): + if (row + col) % 2 == 0: # checkerboard pattern + x = X + col * HSPACE + y = Y + row * VSPACE + z = Z + print(x, y, z) + + for i in range(PIXEL_N): + dx, dy = np.random.random(2) * 12 - 6 + writer.writerow([x+dx, y+dy, z]) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + + parser.add_argument('--output', '--network', type=str, default='network', + help='network output file directory') + parser.add_argument('--conn-probs', type=str, + default='connection/conn_probs_FINAL.h5') + parser.add_argument('--layers-file', type=str, default='layer_download.json') + parser.add_argument('--reduce', '--scale', type=float, default=1.0) + parser.add_argument('--column-radius', type=float, default=60.0) + parser.add_argument('--tstop', type=float, required=False, default=2500.0) + + # Thalamic population + # parser.add_argument('--num-thal', type=int, default=400) # This is now determined by formula + parser.add_argument('--thal-ctx-nsyn', type=int, nargs=2, default=[7, 17]) + # parser.add_argument('--thal-ctx-prob', type=float, default=0.0005) # This is now determined by formula + # parser.add_argument('--thal-l4-prob', type=float, default=0.005) # This is now determined by formula + # For now: just use L4/2 and L4/4 + # parser.add_argument('--thal-l5-prob', type=float, default=0.05) + # parser.add_argument('--thal-l6-prob', type=float, default=0.025) + parser.add_argument('--thal-ctx-weight', type=float, default=5e-5) + parser.add_argument('--thal-ctx-weight-std', type=float, default=1e-5) + + # Background population + parser.add_argument('--num-bkg', type=int, default=10000) + parser.add_argument('--num-bkg-exc-frac', type=float, default=0.5, + help="fraction of bkg neurons that are exc") + parser.add_argument('--bkg-nsyn', type=int, nargs=2, default=[1, 6]) + parser.add_argument('--bkg-exc-prob', type=float, default=0.025, + help="probability that a given bkg neuron connects to a given excitatory neuron") + parser.add_argument('--bkg-ei-ratio', type=float, default=1.3, + help="ratio of e-i connection probs") + parser.add_argument('--bkg-weight', type=float, default=1e-4) + parser.add_argument('--bkg-weight-std', type=float, default=5e-5) + + # Cortico-cortico weights + parser.add_argument('--ctx-ctx-weight', type=float, default=1e-4) + parser.add_argument('--ctx-ctx-weight-std', type=float, default=5e-5) + + # General weight parameters + parser.add_argument('--ei-weight-ratio', type=float, default=2.0, + help="ratio of e to i weights for all populations") + parser.add_argument('--weight-scale', type=float, default=1.0, + help="multiplier for all weights and weight std's. Usefor for param sweeps") + parser.add_argument('--weight-std-scale', type=float, default=1.0, + help="multiplier for weight std's. Total multiplier is --weight-scale * this") + parser.add_argument('--weight-distn', type=str, default='lognormal', + help="any member of np.random which takes mean, sigma") + parser.add_argument('--weight-std', type=float, required=False, default=None, + help='overrides --*-weight-std and --*-weight-scale') + + args = parser.parse_args() + + # multiply weights and stds by --weight-scale + args.bkg_weight = args.bkg_weight * args.weight_scale + args.thal_ctx_weight = args.thal_ctx_weight * args.weight_scale + args.ctx_ctx_weight = args.ctx_ctx_weight * args.weight_scale + args.bkg_weight_std = args.bkg_weight_std * args.weight_scale + args.thal_ctx_weight_std = args.thal_ctx_weight_std * args.weight_scale + args.ctx_ctx_weight_std = args.ctx_ctx_weight_std * args.weight_scale + args.weight_scale = "Already multiplied into weights" + + # then multiply only stds by --weight-std-scale + # taking args.weight_std (if present) as a final override + args.bkg_weight_std = args.weight_std or (args.bkg_weight_std * args.weight_std_scale) + args.thal_ctx_weight_std = args.weight_std or (args.thal_ctx_weight_std * args.weight_std_scale) + args.ctx_ctx_weight_std = args.weight_std or (args.ctx_ctx_weight_std * args.weight_std_scale) + args.weight_std_scale = "Irrelevent; --weight-std was passed" if args.weight_std else "Already multiplied into weights" + + # if any([args.bkg_weight_std > args.bkg_weight, + # args.ctx_ctx_weight_std > args.ctx_ctx_weight, + # args.thal_ctx_weight_std > args.thal_ctx_weight]): + # raise ValueError('weight std cannot be greater than weight mean') + + if not os.path.exists(args.output): + os.mkdir(args.output) + + print("Args to build_network:") + print(json.dumps(args.__dict__, indent=4, sort_keys=True)) + with open(os.path.join(args.output, 'build_network_params.json'), 'w') as outfile: + print(json.dumps(args.__dict__, indent=4, sort_keys=True), file=outfile) + + build_cortical_column(args) + generate_electrodes(args) + diff --git a/cortical-column/calc_ecp.py b/cortical-column/calc_ecp.py new file mode 100644 index 0000000..9fa559a --- /dev/null +++ b/cortical-column/calc_ecp.py @@ -0,0 +1,370 @@ +""" +Calculate ECP from im.h5, a file containing the membrane current for all sections at all timesteps +""" + +import math +import os +import argparse +import logging + +import pandas as pd +import numpy as np +import h5py + +import utils +from stimulus import mark +from mars.io import NSENWB + +log = logging.getLogger('calc_ecp') +log.setLevel(logging.DEBUG) +formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') +ch = logging.StreamHandler() +ch.setFormatter(formatter) +ch.setLevel(logging.DEBUG) +log.addHandler(ch) + +if h5py.get_config().mpi: + from mpi4py import MPI + comm = MPI.COMM_WORLD + rank = comm.Get_rank() + n_threads = comm.Get_size() + if n_threads > 1: + mpi_loaded = True + log.info("Using MPI") + else: + mpi_loaded = False + log.info("Not using MPI, only 1 thread") +else: + rank = 0 + comm = None + n_threads = 1 + mpi_loaded = False + log.info("Not using MPI") + +log.info('Rank = {}'.format(rank)) + +def _transfer_resistance(p0, p05, p1, nsites, pos): + sigma = 0.3 # mS/mm + + r05 = (p0 + p1) / 2 + dl = p1 - p0 + + nseg = r05.shape[1] + + tr = np.zeros((nsites, nseg), dtype=np.float32) + + for j in range(nsites): # calculate mapping for each site on the electrode + rel = np.expand_dims(pos[:, j], axis=1) # coordinates of a j-th site on the electrode + rel_05 = rel - r05 # distance between electrode and segment centers + + # compute dot product column-wise, the resulting array has as many columns as original + r2 = np.einsum('ij,ij->j', rel_05, rel_05) + + # compute dot product column-wise, the resulting array has as many columns as original + rlldl = np.einsum('ij,ij->j', rel_05, dl) + dlmag = np.linalg.norm(dl, axis=0) # length of each segment + rll = abs(rlldl / dlmag) # component of r parallel to the segment axis it must be always positive + rT2 = r2 - rll ** 2 # square of perpendicular component + up = rll + dlmag / 2 + low = rll - dlmag / 2 + num = up + np.sqrt(up ** 2 + rT2) + den = low + np.sqrt(low ** 2 + rT2) + tr[j, :] = np.log(num / den) / dlmag # units of (um) use with im_ (total seg current) + np.copyto(tr[j, :], 0, where=(dlmag == 0)) # zero out stub segments + + tr *= 1 / (4 * math.pi * sigma) + return tr + +def _transfer_resistance_for(gid, coords_dir, pos, filt=None): + """ + Return a matrix whose elements are the corresponding elements from the transfer resistance + for cells whose gid's are in `filt`, zero for other cells + + filt = set of contributing gids + """ + with h5py.File(os.path.join(coords_dir, '{}.h5'.format(gid)), 'r') as coordsfile: + nsites = pos.shape[1] + nseg = coordsfile['p0'].shape[1] + if (filt is None) or (gid in filt): + return _transfer_resistance( + coordsfile['p0'][:], coordsfile['p05'][:], coordsfile['p1'][:], + nsites=nsites, + pos=pos + ).T + else: + log.info('Found cell not in group, zeroing') + return np.zeros(shape=(nseg, nsites), dtype=np.float32) + +def get_pos(electrodes_file=None, new_electrodes_file=None): + if new_electrodes_file: + pos = None + else: + electrodes_file = electrodes_file or os.path.join(sim_network_dir, 'electrodes.csv') + el_df = pd.read_csv(electrodes_file, sep=' ') + pos = el_df[['x_pos', 'y_pos', 'z_pos']].T.values + + return pos + +def get_transfer_resistances_and_gids(sim_jobnum, ordering, electrodes_file=None, new_electrodes_file=None): + # Read electrode file + sim_network_dir = utils.get_network_dir(sim_jobnum) + pos = get_pos(electrodes_file, new_electrodes_file) + coords_dir = os.path.join(utils.get_output_dir(sim_jobnum), 'seg_coords') + + if mpi_loaded: + # Distributed load of cell coords/transfer matrix + n_cells = len(os.listdir(coords_dir)) + n_each = int(n_cells / n_threads) + 1 + log.info("Using MPI for tr calc, with n_cells = {}, n_each = {}".format(n_cells, n_each)) + start = n_each * rank + stop = min(n_each * (rank+1), len(ordering)) + cells = ordering[start:stop] + + log.info("This rank's {} cells: {}".format(len(cells), cells)) + else: + cells = ordering + log.info("Not using MPI for tr calc") + + # np array with all cells gid and transfer matrices + tr_by_cell = [(gid, _transfer_resistance_for(gid, coords_dir, pos)) for gid in cells] + gids = np.concatenate([[gid] * cell_tr.shape[0] for gid, cell_tr in tr_by_cell]) + this_tr = np.concatenate([cell_tr for gid, cell_tr in tr_by_cell]) + log.debug("calculated this rank's transfer matrix") + + # Replicate gids for each channel + gids = np.tile(gids, (this_tr.shape[1], 1)).T.astype('intc') + + if mpi_loaded: + log.debug("about to run AllGatherv") + log.debug("this_tr.shape = {}".format(this_tr.shape)) + full_tr = utils.AllGatherv_unknown_shape(this_tr, comm, rank, n_threads, mpi_dtype=MPI.FLOAT, axis=1, log=log).astype(np.float32) + log.debug("gathered tr") + all_gids = utils.AllGatherv_unknown_shape(gids, comm, rank, n_threads, mpi_dtype=MPI.INT, axis=1) + log.debug("gathered gids") + else: + full_tr = this_tr.astype(np.float32) + all_gids = gids + + return full_tr, all_gids + + +def filter_transfer_matrix(tr, gids, filt): + """ Zero out some cells in the transfer matrix """ + if filt is None: + return tr + if isinstance(filt, set): + filt = list(filt) + filtered_tr = tr.copy().astype(np.float32) + mask = np.isin(gids, filt, invert=True) + np.place(filtered_tr, mask, 0) + return filtered_tr + +def calc_ecp_chunked(im_dset, tr, chunksize, local_chunksize): + i = rank + + chunk_start, chunk_end = i*chunksize, (i+1)*chunksize + n_segs, n_electrodes = tr.shape + + ecp = np.empty(shape=(chunksize, n_electrodes), dtype=np.float32) + for j, (lcl_chunk_start, output_start) in enumerate(zip( + range(chunk_start, chunk_end, local_chunksize), + range(0, chunksize, local_chunksize))): + log.info("calculating local chunk #{}".format(j)) + lcl_chunk_end = min(lcl_chunk_start+local_chunksize, chunk_end) + output_end = output_start + (lcl_chunk_end - lcl_chunk_start) + im = im_dset[lcl_chunk_start:lcl_chunk_end, :] + ecp[output_start:output_end, :] = np.dot(im, tr) + + return ecp + + + + +def get_groupings(sim_jobnum, groupby, array_task): + # groups = dict mapping group name to list of GIDs in that group (or None, for all GIDs) + if groupby is None: + groups = {'all': None} + elif groupby == 'layer': + layer_gids = utils.get_layer_gids(sim_jobnum) + groups = {'L{}'.format(layer): (layer_gids.get(layer, set())) for layer in range(1, 7)} + elif groupby == 'layer_ei': + groups = utils.get_layer_ei_gids(sim_jobnum) + elif groupby == 'parts': + log.error("DO NOT USE calc_ecp.py FOR PARTS; USE calc_ecp_parts.py") + groups = {i: [] for i in range(4)} + elif groupby == '100um': + log.error("DO NOT USE calc_ecp.py FOR 100um SLICES; USE calc_ecp_100um.py") + planesize = float(groupby[:-2]) + groups = utils.get_spatial_chunk_gids(sim_jobnum, planesize) + elif groupby.endswith('um_cell'): + planesize = float(groupby[:-7]) + groups = utils.get_spatial_chunk_gids(sim_jobnum, planesize) + else: + log.info("Unrecognized groupby: {}. Not grouping") + groups = {'all': None} + + if array_task: + k = sorted(groups.keys())[array_task] + groups = {k: groups[k]} + + return groups + + +def tmp_output_file_for(jobnum, groupname, tmpdir=None): + output_dir = tmpdir or utils.get_output_dir(jobnum) + return os.path.join(output_dir, 'ecp_{}.h5'.format(groupname)) + + +def write_nwb(sim_jobnum, jobnum, n_timepts, groupnames, outfilename, block, tmpdir=None): + """ + Write data from h5 files (needed for parallel) into .nwb + and delete the files when done + """ + + nsenwb = NSENWB.from_block_name(block) + mark_track = mark[nsenwb.stim['name']] + mark_rate = 10000. + nsenwb.add_mark(mark_track, mark_rate) + + all_h5_files = [(groupname, tmp_output_file_for(jobnum, groupname, tmpdir=tmpdir)) for groupname in groupnames] + + # add raw datasets + ecog_tot = None + ecog_i_tot = None + poly_tot = None + for groupname, fn in all_h5_files: + with h5py.File(fn, 'r') as infile: + log.info("loaded {} for writing to nwb".format(fn)) + ecp_dset = infile['data'] + ecog = np.average(ecp_dset[:, :100], axis=1) # Average over 4 electrodes + ecog_i = ecp_dset[:, :100] # Store individual also + poly = ecp_dset[:, 100:] + + if len(all_h5_files) > 1: # only acquisition is 'all', equivalent to 'Raw' added below + nsenwb.add_raw(ecog[:, np.newaxis], 'ECoG') + # nsenwb.add_raw(ecog_i, device_name='ECoG_i', acq_name=str(groupname)) + nsenwb.add_raw(poly, 'Poly') + + if ecog_tot is not None: + ecog_tot += ecog + # ecog_i_tot += ecog_i + poly_tot += poly + else: + ecog_tot = ecog.copy() + # ecog_i_tot = ecog_i.copy() + poly_tot = poly.copy() + + log.info("Put group {} in nwb".format(groupname)) + + nsenwb.add_raw(ecog_tot[:, np.newaxis], 'ECoG') + # nsenwb.add_raw(ecog_i, device_name='ECoG_i', acq_name='Raw') + nsenwb.add_raw(poly_tot, 'Poly') + + nsenwb.write(outfilename) + log.info("wrote nwb to {}".format(outfilename)) + + # delete h5 files + for groupname, fn in all_h5_files: + log.info("deleting {}".format(fn)) + os.remove(fn) + + +def main(jobnum, array_task, sim_jobnum, chunksize, local_chunksize, groupby, outfile, block, electrodes_file=None, new_electrodes_file=None, tmp_output_dir=None, im_file=None): + """ + Calculate ecp for this rank's chunk, write into the outfile + + jobnum: slurm number of this job + sim_jobnum: where to find im.h5 + chunksize: size of each rank's chunk + local_chunksize: step size within this chunk + groupby: split the ECP calculation by contribution. + options: 'all', 'layer', 'layer_ei' + """ + i = rank + + log.info("Starting ECP calculation for job {}".format(sim_jobnum)) + + groups = get_groupings(sim_jobnum, groupby, array_task) + + # Args for opening h5 file + if mpi_loaded: + kwargs = {'driver': 'mpio', 'comm': MPI.COMM_WORLD} + else: + kwargs = {} + + sim_output_dir = utils.get_output_dir(sim_jobnum) + im_filename = im_file or os.path.join(sim_output_dir, 'im.h5') + log.info("Using {}".format(im_filename)) + + with h5py.File(im_filename, 'r', **kwargs) as infile: + im_dset = infile['im/data'] if 'im' in infile.keys() else infile['data'] + ordering = infile['mapping/gids'][:] + n_timepts_im, n_seg = im_dset.shape + n_timepts_tot = chunksize * n_threads + + log.info("Got dset and ordering") + + full_tr, gids = get_transfer_resistances_and_gids(sim_jobnum, ordering, electrodes_file=electrodes_file, new_electrodes_file=new_electrodes_file) + log.info("Got transfer resistances") + + for groupname, groupfilt in groups.items(): + log.info("Doing calculation for group {}".format(groupname)) + + filtered_tr = filter_transfer_matrix(full_tr, gids, groupfilt) + log.info("Filtered transfer matrix for group {}".format(groupname)) + + outfn = tmp_output_file_for(jobnum, groupname, tmpdir=tmp_output_dir) + log.info("Opening {}".format(outfn)) + with h5py.File(outfn, 'w', **kwargs) as out: + ecp = calc_ecp_chunked(im_dset, filtered_tr, chunksize, local_chunksize) + n_timepts_chunk, n_ch = ecp.shape + + out.create_dataset('data', shape=(n_timepts_tot, n_ch), dtype=np.float) + start = i*chunksize + stop = min( (i+1)*chunksize, n_timepts_tot ) + log.info("start, stop, sum(ecp) = {}, {}, {}".format(start, stop, np.sum(ecp))) + + if start < stop: + out['data'][start:stop, :] = ecp + + del filtered_tr + + log.info("Done with calculation for group {}".format(groupname)) + + if mpi_loaded: + comm.Barrier() + + if i == 0 and array_task is None: + # TODO: Compute a default value for outfile? + log.info("Rank 0 about to write nwb") + write_nwb(sim_jobnum, jobnum, n_timepts_tot, groups.keys(), outfile, block, tmpdir=tmp_output_dir) + + log.info("COMPLETED") + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--jobnum', type=str, required=True, help='slurm number of this calc_ecp job') + parser.add_argument('--array-task', type=int, required=False, default=None, + help='if passed, runs one group per array task. Must be aggregated to nwb separately.') + parser.add_argument('--sim-jobnum', type=str, required=True, help='slurm number of simulation job') + parser.add_argument('--block', type=str, required=True) + + parser.add_argument('--electrodes-file', '--electrode-file', type=str, required=False, default=None) + parser.add_argument('--new-electrodes-file', '--electrode-file', type=str, required=False, default=None) + parser.add_argument('--tmp-output-dir', type=str, required=False, default=None, + help='If passed, will write temp output files here') + parser.add_argument('--im-file', type=str, required=False, default=None, + help='If passed, will use this instead of --sim-jobnum to find im.h5') + parser.add_argument('--outfile', type=str, required=False, default='ecp.nwb') + parser.add_argument('--groupby', type=str, default=None) + parser.add_argument('--local-chunksize', type=int, default=100) + + # Parallelization flags + parser.add_argument('--chunksize', type=int, default=1000, + help="number of timepoints to calculate in each chunk") + + + args = parser.parse_args() + + main(args.jobnum, args.array_task, args.sim_jobnum, args.chunksize, args.local_chunksize, args.groupby, args.outfile, args.block, electrodes_file=args.electrodes_file, new_electrodes_file=args.new_electrodes_file, tmp_output_dir=args.tmp_output_dir, im_file=args.im_file) diff --git a/cortical-column/calc_ecp_100um.py b/cortical-column/calc_ecp_100um.py new file mode 100644 index 0000000..8f5f70c --- /dev/null +++ b/cortical-column/calc_ecp_100um.py @@ -0,0 +1,314 @@ +""" +Calculate ECP from im.h5, a file containing the membrane current for all sections at all timesteps +""" + +import math +import os +import argparse +import logging + +import pandas as pd +import numpy as np +import h5py + +import utils +from stimulus import mark +from mars.io import NSENWB + +SLICE = 100 +NSLICES = 21 + +log = logging.getLogger('calc_ecp') +log.setLevel(logging.DEBUG) +formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') +ch = logging.StreamHandler() +ch.setFormatter(formatter) +ch.setLevel(logging.DEBUG) +log.addHandler(ch) + +if h5py.get_config().mpi: + from mpi4py import MPI + comm = MPI.COMM_WORLD + rank = comm.Get_rank() + n_threads = comm.Get_size() + if n_threads > 1: + mpi_loaded = True + log.info("Using MPI") + else: + mpi_loaded = False + log.info("Not using MPI, only 1 thread") +else: + rank = 0 + comm = None + n_threads = 1 + mpi_loaded = False + log.info("Not using MPI") + +log.info('Rank = {}'.format(rank)) + +def _transfer_resistance(p0, p05, p1, nsites, pos): + sigma = 0.3 # mS/mm + + r05 = (p0 + p1) / 2 + dl = p1 - p0 + + nseg = r05.shape[1] + + tr = np.zeros((nsites, nseg)) + + for j in range(nsites): # calculate mapping for each site on the electrode + rel = np.expand_dims(pos[:, j], axis=1) # coordinates of a j-th site on the electrode + rel_05 = rel - r05 # distance between electrode and segment centers + + # compute dot product column-wise, the resulting array has as many columns as original + r2 = np.einsum('ij,ij->j', rel_05, rel_05) + + # compute dot product column-wise, the resulting array has as many columns as original + rlldl = np.einsum('ij,ij->j', rel_05, dl) + dlmag = np.linalg.norm(dl, axis=0) # length of each segment + rll = abs(rlldl / dlmag) # component of r parallel to the segment axis it must be always positive + rT2 = r2 - rll ** 2 # square of perpendicular component + up = rll + dlmag / 2 + low = rll - dlmag / 2 + num = up + np.sqrt(up ** 2 + rT2) + den = low + np.sqrt(low ** 2 + rT2) + tr[j, :] = np.log(num / den) / dlmag # units of (um) use with im_ (total seg current) + np.copyto(tr[j, :], 0, where=(dlmag == 0)) # zero out stub segments + + tr *= 1 / (4 * math.pi * sigma) + return tr + +def _transfer_resistance_for(gid, coords_dir, pos): + """ + Return a matrix whose elements are the corresponding elements from the transfer resistance + for cells whose gid's are in `filt`, zero for other cells + """ + with h5py.File(os.path.join(coords_dir, '{}.h5'.format(gid)), 'r') as coordsfile: + nsites = pos.shape[1] + nseg = coordsfile['p0'].shape[1] + return _transfer_resistance( + coordsfile['p0'][:], coordsfile['p05'][:], coordsfile['p1'][:], + nsites=nsites, + pos=pos + ).T + +def _depths_for(gid, coords_dir): + with h5py.File(os.path.join(coords_dir, '{}.h5'.format(gid)), 'r') as coordsfile: + return coordsfile['p05'][1, :].astype(np.double) + +def get_transfer_resistances_and_depths(sim_jobnum, ordering, electrodes_file=None): + # Read electrode file + sim_network_dir = utils.get_network_dir(sim_jobnum) + electrodes_file = electrodes_file or os.path.join(sim_network_dir, 'electrodes.csv') + el_df = pd.read_csv(electrodes_file, sep=' ') + el_pos = el_df[['x_pos', 'y_pos', 'z_pos']].T.values + coords_dir = os.path.join(utils.get_output_dir(sim_jobnum), 'seg_coords') + + if mpi_loaded: + # Distributed load of cell coords/transfer matrix + n_cells = len(os.listdir(coords_dir)) + n_each = int(n_cells / n_threads) + 1 + log.info("Using MPI for tr calc, with n_cells = {}, n_each = {}".format(n_cells, n_each)) + start = n_each * rank + stop = min(n_each * (rank+1), len(ordering)) + cells = ordering[start:stop] + + log.info("This rank's {} cells: {}".format(len(cells), cells)) + else: + cells = ordering + log.info("Not using MPI for tr calc") + + # np array with all cells gid and transfer matrices + + tr_by_cell = [(gid, _transfer_resistance_for(gid, coords_dir, el_pos)) for gid in cells] + this_tr = np.concatenate([cell_tr for gid, cell_tr in tr_by_cell]) + depths = np.expand_dims(np.concatenate([_depths_for(gid, coords_dir) for gid in cells]), axis=-1) + log.debug("calculated this rank's transfer matrix") + + if mpi_loaded: + log.debug("about to run AllGatherv") + log.debug("this_tr.shape = {}".format(this_tr.shape)) + full_tr = utils.AllGatherv_unknown_shape(this_tr, comm, rank, n_threads, mpi_dtype=MPI.DOUBLE, axis=1) + log.debug("gathered tr") + all_depths = utils.AllGatherv_unknown_shape(depths, comm, rank, n_threads, mpi_dtype=MPI.DOUBLE, axis=1, log=log).squeeze() + log.debug("gathered depths") + else: + full_tr = this_tr + all_depths = depths + + return full_tr, all_depths + +def calc_ecp_chunked(im_dset, filtered_tr, chunksize, local_chunksize): + i = rank + + def iter_im(): + """ + iterate over this rank's chunk in smaller chunks, + whose size are given by local_chunksize + """ + start, end = i*chunksize, (i+1)*chunksize + for idx in range(start, end, local_chunksize): + yield im_dset[idx:min(idx+local_chunksize,end), :] + + ecps = [] + for j, im in enumerate(iter_im()): + log.info("calculating local chunk #{}".format(j)) + ecps.append(np.dot(im, filtered_tr)) + ecp = np.vstack(ecps) + return ecp + + + +def tmp_output_file_for(jobnum, groupname): + output_dir = utils.get_output_dir(jobnum) + return os.path.join(output_dir, 'ecp_{}.h5'.format(groupname)) + + +def write_nwb(sim_jobnum, jobnum, n_timepts, groupnames, outfilename, block): + """ + Write data from h5 files (needed for parallel) into .nwb + and delete the files when done + """ + + nsenwb = NSENWB.from_block_name(block) + mark_track = mark[nsenwb.stim['name']] + mark_rate = 10000. + nsenwb.add_mark(mark_track, mark_rate) + + all_h5_files = [(groupname, tmp_output_file_for(jobnum, groupname)) for groupname in groupnames] + + # add raw datasets + ecog_tot = None + ecog_i_tot = None + poly_tot = None + for groupname, fn in all_h5_files: + with h5py.File(fn, 'r') as infile: + log.info("loaded {} for writing to nwb".format(fn)) + ecp_dset = infile['data'] + ecog = np.average(ecp_dset[:, :100], axis=1) # Average over 4 electrodes + ecog_i = ecp_dset[:, :100] # Store individual also + poly = ecp_dset[:, 100:] + + if len(all_h5_files) > 1: # only acquisition is 'all', equivalent to 'Raw' added below + nsenwb.add_raw(ecog[:, np.newaxis], device_name='ECoG', acq_name=str(groupname)) + nsenwb.add_raw(ecog_i, device_name='ECoG_i', acq_name=str(groupname)) + nsenwb.add_raw(poly, device_name='Poly', acq_name=str(groupname)) + + if ecog_tot is not None: + ecog_tot += ecog + ecog_i_tot += ecog_i + poly_tot += poly + else: + ecog_tot = ecog.copy() + ecog_i_tot = ecog_i.copy() + poly_tot = poly.copy() + + log.info("Put group {} in nwb".format(groupname)) + + nsenwb.add_raw(ecog_tot[:, np.newaxis], device_name='ECoG', acq_name='Raw') + nsenwb.add_raw(ecog_i, device_name='ECoG_i', acq_name='Raw') + nsenwb.add_raw(poly_tot, device_name='Poly', acq_name='Raw') + + nsenwb.write(outfilename) + log.info("wrote nwb to {}".format(outfilename)) + + # delete h5 files + for groupname, fn in all_h5_files: + log.info("deleting {}".format(fn)) + os.remove(fn) + + +def main(jobnum, array_task, sim_jobnum, chunksize, local_chunksize, outfile, block, electrodes_file=None): + """ + Calculate ecp for this rank's chunk, write into the outfile + + jobnum: slurm number of this job + sim_jobnum: where to find im.h5 + chunksize: size of each rank's chunk + local_chunksize: step size within this chunk + groupby: split the ECP calculation by contribution. + options: 'all', 'layer', 'layer_ei' + """ + i = rank + + log.info("Starting ECP calculation for job {}".format(sim_jobnum)) + + # Args for opening h5 file + if mpi_loaded: + kwargs = {'driver': 'mpio', 'comm': MPI.COMM_WORLD} + else: + kwargs = {} + + sim_output_dir = utils.get_output_dir(sim_jobnum) + im_filename = os.path.join(sim_output_dir, 'im.h5') + + with h5py.File(im_filename, 'r', **kwargs) as infile: + im_dset = infile['im/data'] if 'im' in infile.keys() else infile['data'] + ordering = infile['mapping/gids'][:] + n_timepts_im, n_seg = im_dset.shape + n_timepts_tot = chunksize * n_threads + + log.info("Got dset and ordering") + + full_tr, depths = get_transfer_resistances_and_depths(sim_jobnum, ordering, electrodes_file=electrodes_file) + log.info("Got transfer resistances") + + all_slices = [array_task] if array_task is not None else range(NSLICES) + + for slice_i in all_slices: + # slice is depths [i*100, (i+1)*100] um below surface + log.info("Doing calculation for slice {}".format(slice_i)) + + # Zero out out-of-slice segments in the transfer matrix + mask = ((2083-depths) // SLICE) == slice_i + mask = np.tile(mask, (full_tr.shape[1], 1)).T + filtered_tr = full_tr.copy() + np.place(filtered_tr, np.logical_not(mask), 0) + + outfn = tmp_output_file_for(jobnum, str(slice_i)) + with h5py.File(outfn, 'w', **kwargs) as out: + ecp = calc_ecp_chunked(im_dset, filtered_tr, chunksize, local_chunksize) + n_timepts_chunk, n_ch = ecp.shape + + out.create_dataset('data', shape=(n_timepts_tot, n_ch), dtype=np.float) + start = i*chunksize + stop = min( (i+1)*chunksize, n_timepts_tot ) + log.info("start, stop, sum(ecp) = {}, {}, {}".format(start, stop, np.sum(ecp))) + + if start < stop: + out['data'][start:stop, :] = ecp + + log.info("Done with calculation for slice {}".format(slice_i)) + + if mpi_loaded: + comm.Barrier() + + if i == 0 and array_task is None: + # TODO: Compute a default value for outfile? + log.info("Rank 0 about to write nwb") + write_nwb(sim_jobnum, jobnum, n_timepts_tot, range(NSLICES), outfile, block) + + log.info("COMPLETED") + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--jobnum', type=str, required=True, help='slurm number of this calc_ecp job') + parser.add_argument('--array-task', type=int, required=False, default=None, + help='if passed, runs one slice per array task. Must be aggregated to nwb separately.') + parser.add_argument('--sim-jobnum', type=str, required=True, help='slurm number of simulation job') + parser.add_argument('--block', type=str, required=True) + + parser.add_argument('--electrodes-file', '--electrode-file', type=str, required=False, default=None) + parser.add_argument('--output-dir', type=str, required=False, default=None) + parser.add_argument('--outfile', type=str, required=False, default='ecp.nwb') + parser.add_argument('--local-chunksize', type=int, default=100) + + # Parallelization flags + parser.add_argument('--chunksize', type=int, default=1000, + help="number of timepoints to calculate in each chunk") + + + args = parser.parse_args() + + main(args.jobnum, args.array_task, args.sim_jobnum, args.chunksize, args.local_chunksize, args.outfile, args.block) diff --git a/cortical-column/cells.json b/cortical-column/cells.json new file mode 100644 index 0000000..68daca8 --- /dev/null +++ b/cortical-column/cells.json @@ -0,0 +1,2596 @@ +{ + "L1_DAC": { + "bNAC": [ + { + "model_directory": "L1_DAC_bNAC219_1", + "model_template": "BBP:bNAC219_L1_DAC_ec2fc5f0de", + "morphology": "sm090918b1-3_idA_-_Scale_x1.000_y1.025_z1.000.asc" + }, + { + "model_directory": "L1_DAC_bNAC219_2", + "model_template": "BBP:bNAC219_L1_DAC_0d58fdf14a", + "morphology": "C270106C_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + } + ], + "cNAC": [ + { + "model_directory": "L1_DAC_cNAC187_1", + "model_template": "BBP:cNAC187_L1_DAC_1e259ec3b0", + "morphology": "sm080930a1_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L1_DAC_cNAC187_2", + "model_template": "BBP:cNAC187_L1_DAC_a4cb1c245c", + "morphology": "C270106C_-_Clone_0.asc" + } + ] + }, + "L1_DLAC": { + "cNAC": [ + { + "model_directory": "L1_DLAC_cNAC187_1", + "model_template": "BBP:cNAC187_L1_DLAC_d80e9f2875", + "morphology": "sm080722b1_-_Scale_x1.000_y0.950_z1.000.asc" + }, + { + "model_directory": "L1_DLAC_cNAC187_2", + "model_template": "BBP:cNAC187_L1_DLAC_612b4ae64f", + "morphology": "sm080904a1_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + } + ] + }, + "L1_HAC": { + "bNAC": [ + { + "model_directory": "L1_HAC_bNAC219_2", + "model_template": "BBP:bNAC219_L1_HAC_f8c9772d9d", + "morphology": "sm081119a6.asc" + }, + { + "model_directory": "L1_HAC_bNAC219_1", + "model_template": "BBP:bNAC219_L1_HAC_369e749269", + "morphology": "sm080905b1.asc" + } + ], + "cIR": [ + { + "model_directory": "L1_HAC_cIR216_2", + "model_template": "BBP:cIR216_L1_HAC_cc210b8244", + "morphology": "sm080902a3-1.asc" + }, + { + "model_directory": "L1_HAC_cIR216_1", + "model_template": "BBP:cIR216_L1_HAC_84f0f8f321", + "morphology": "sm090227a1-2_idA.asc" + } + ], + "cNAC": [ + { + "model_directory": "L1_HAC_cNAC187_1", + "model_template": "BBP:cNAC187_L1_HAC_f8c9772d9d", + "morphology": "sm081119a6.asc" + }, + { + "model_directory": "L1_HAC_cNAC187_2", + "model_template": "BBP:cNAC187_L1_HAC_cc210b8244", + "morphology": "sm080902a3-1.asc" + } + ] + }, + "L1_NGC-DA": { + "bNAC": [ + { + "model_directory": "L1_NGC-DA_bNAC219_1", + "model_template": "BBP:bNAC219_L1_NGCDA_095997ce92", + "morphology": "C060106B_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L1_NGC-DA_bNAC219_2", + "model_template": "BBP:bNAC219_L1_NGCDA_e7cec642c3", + "morphology": "sm080722b2_-_Scale_x1.000_y1.050_z1.000.asc" + } + ], + "cAC": [ + { + "model_directory": "L1_NGC-DA_cACint209_2", + "model_template": "BBP:cACint209_L1_NGCDA_d8569cb244", + "morphology": "sm100408a1_idB_-_Clone_1.asc" + }, + { + "model_directory": "L1_NGC-DA_cACint209_1", + "model_template": "BBP:cACint209_L1_NGCDA_3f6ea7fdea", + "morphology": "C060106B_-_Scale_x1.000_y0.975_z1.000.asc" + } + ], + "cNAC": [ + { + "model_directory": "L1_NGC-DA_cNAC187_1", + "model_template": "BBP:cNAC187_L1_NGCDA_c1b837d894", + "morphology": "sm080905a1_-_Clone_1.asc" + }, + { + "model_directory": "L1_NGC-DA_cNAC187_2", + "model_template": "BBP:cNAC187_L1_NGCDA_9c428321ae", + "morphology": "sm081010a5-1_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L1_NGC-DA_cSTUT189_2", + "model_template": "BBP:cSTUT189_L1_NGCDA_3d9c976fde", + "morphology": "sm100408a1_idB_-_Scale_x1.000_y0.975_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L1_NGC-DA_cSTUT189_1", + "model_template": "BBP:cSTUT189_L1_NGCDA_daa2d6b6a9", + "morphology": "C060106B_-_Scale_x1.000_y0.975_z1.000_-_Clone_1.asc" + } + ] + }, + "L1_NGC-SA": { + "cNAC": [ + { + "model_directory": "L1_NGC-SA_cNAC187_2", + "model_template": "BBP:cNAC187_L1_NGCSA_569d800dfe", + "morphology": "sm080902a3-3_-_Scale_x1.000_y0.950_z1.000.asc" + }, + { + "model_directory": "L1_NGC-SA_cNAC187_1", + "model_template": "BBP:cNAC187_L1_NGCSA_51e1d4ecd6", + "morphology": "sm080723a3-2_-_Scale_x1.000_y1.025_z1.000.asc" + } + ] + }, + "L1_SLAC": { + "bNAC": [ + { + "model_directory": "L1_SLAC_bNAC219_1", + "model_template": "BBP:bNAC219_L1_SLAC_9f043bb71a", + "morphology": "C010306C_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L1_SLAC_bNAC219_2", + "model_template": "BBP:bNAC219_L1_SLAC_d22d584760", + "morphology": "C010306G_-_Scale_x1.000_y1.025_z1.000.asc" + } + ], + "cAC": [ + { + "model_directory": "L1_SLAC_cACint209_1", + "model_template": "BBP:cACint209_L1_SLAC_9fb2ec760b", + "morphology": "C010306C_-_Scale_x1.000_y1.050_z1.000.asc" + }, + { + "model_directory": "L1_SLAC_cACint209_2", + "model_template": "BBP:cACint209_L1_SLAC_76ffc1f69e", + "morphology": "sm080529a2-2_-_Scale_x1.000_y1.025_z1.000.asc" + } + ], + "cNAC": [ + { + "model_directory": "L1_SLAC_cNAC187_1", + "model_template": "BBP:cNAC187_L1_SLAC_26e7460577", + "morphology": "C010306C_-_Scale_x1.000_y0.950_z1.000.asc" + }, + { + "model_directory": "L1_SLAC_cNAC187_2", + "model_template": "BBP:cNAC187_L1_SLAC_3759bf3d94", + "morphology": "C010306G_-_Scale_x1.000_y1.050_z1.000.asc" + } + ] + }, + "L23_BP": { + "bAC": [ + { + "model_directory": "L23_BP_bAC217_2", + "model_template": "BBP:bAC217_L23_BP_4652c9a7e1", + "morphology": "C230998A-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_26.asc" + }, + { + "model_directory": "L23_BP_bAC217_1", + "model_template": "BBP:bAC217_L23_BP_2004171a4c", + "morphology": "C230998A-I3_-_Scale_x1.000_y1.050_z1.000_-_Clone_46.asc" + } + ], + "bIR": [ + { + "model_directory": "L23_BP_bIR215_1", + "model_template": "BBP:bIR215_L23_BP_ab6ff08482", + "morphology": "C230998A-I3_-_Scale_x1.000_y1.050_z1.000_-_Clone_53.asc" + }, + { + "model_directory": "L23_BP_bIR215_2", + "model_template": "BBP:bIR215_L23_BP_a4d3f66d76", + "morphology": "C230998A-I3_-_Scale_x1.000_y0.950_z1.000_-_Clone_26.asc" + } + ], + "bNAC": [ + { + "model_directory": "L23_BP_bNAC219_1", + "model_template": "BBP:bNAC219_L23_BP_40adbb9f96", + "morphology": "C230998A-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_33.asc" + }, + { + "model_directory": "L23_BP_bNAC219_2", + "model_template": "BBP:bNAC219_L23_BP_e8c88c2686", + "morphology": "C230998A-I3_-_Scale_x1.000_y0.950_z1.000_-_Clone_47.asc" + } + ], + "cAC": [ + { + "model_directory": "L23_BP_cACint209_1", + "model_template": "BBP:cACint209_L23_BP_4c3a004bfc", + "morphology": "C230998A-I3_-_Scale_x1.000_y0.975_z1.000_-_Clone_29.asc" + }, + { + "model_directory": "L23_BP_cACint209_2", + "model_template": "BBP:cACint209_L23_BP_ca85cefc69", + "morphology": "C230998A-I3_-_Clone_9.asc" + } + ], + "cNAC": [ + { + "model_directory": "L23_BP_cNAC187_1", + "model_template": "BBP:cNAC187_L23_BP_2004171a4c", + "morphology": "C230998A-I3_-_Scale_x1.000_y1.050_z1.000_-_Clone_46.asc" + }, + { + "model_directory": "L23_BP_cNAC187_2", + "model_template": "BBP:cNAC187_L23_BP_911ebd8254", + "morphology": "C230998A-I3_-_Scale_x1.000_y1.050_z1.000_-_Clone_39.asc" + } + ], + "dSTUT": [ + { + "model_directory": "L23_BP_dSTUT214_1", + "model_template": "BBP:dSTUT214_L23_BP_5a18c05889", + "morphology": "C230998A-I3_-_Scale_x1.000_y0.975_z1.000_-_Clone_28.asc" + }, + { + "model_directory": "L23_BP_dSTUT214_2", + "model_template": "BBP:dSTUT214_L23_BP_f03ecc7752", + "morphology": "C230998A-I3_-_Clone_16.asc" + } + ] + }, + "L23_BTC": { + "bAC": [ + { + "model_directory": "L23_BTC_bAC217_1", + "model_template": "BBP:bAC217_L23_BTC_e561810e0d", + "morphology": "C190898A-I1_-_Clone_5.asc" + }, + { + "model_directory": "L23_BTC_bAC217_2", + "model_template": "BBP:bAC217_L23_BTC_65225ca4f8", + "morphology": "C200199B-I3_-_Scale_x1.000_y1.050_z1.000_-_Clone_7.asc" + } + ], + "bIR": [ + { + "model_directory": "L23_BTC_bIR215_1", + "model_template": "BBP:bIR215_L23_BTC_fcf6c1f59c", + "morphology": "mtC031100A_idB_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L23_BTC_bIR215_2", + "model_template": "BBP:bIR215_L23_BTC_e02ed2d076", + "morphology": "C200199B-I3_-_Scale_x1.000_y0.950_z1.000.asc" + } + ], + "bNAC": [ + { + "model_directory": "L23_BTC_bNAC219_2", + "model_template": "BBP:bNAC219_L23_BTC_38a5da4025", + "morphology": "C200199B-I3_-_Scale_x1.000_y0.975_z1.000_-_Clone_5.asc" + }, + { + "model_directory": "L23_BTC_bNAC219_1", + "model_template": "BBP:bNAC219_L23_BTC_07c7c10a30", + "morphology": "mtC031100A_idB_-_Scale_x1.000_y1.025_z1.000_-_Clone_2.asc" + } + ], + "cAC": [ + { + "model_directory": "L23_BTC_cACint209_2", + "model_template": "BBP:cACint209_L23_BTC_3ac7d39218", + "morphology": "C200199B-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_3.asc" + }, + { + "model_directory": "L23_BTC_cACint209_1", + "model_template": "BBP:cACint209_L23_BTC_c745595fbe", + "morphology": "mtC031100A_idB_-_Scale_x1.000_y1.050_z1.000.asc" + } + ], + "cNAC": [ + { + "model_directory": "L23_BTC_cNAC187_2", + "model_template": "BBP:cNAC187_L23_BTC_13a502998f", + "morphology": "C200199B-I3_-_Scale_x1.000_y0.950_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L23_BTC_cNAC187_1", + "model_template": "BBP:cNAC187_L23_BTC_9902cd4960", + "morphology": "C190898A-I1_-_Scale_x1.000_y0.950_z1.000_-_Clone_5.asc" + } + ] + }, + "L23_ChC": { + "cAC": [ + { + "model_directory": "L23_ChC_cACint209_2", + "model_template": "BBP:cACint209_L23_ChC_a7e068ee2e", + "morphology": "mtC050800D_idD_-_Scale_x1.000_y1.025_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L23_ChC_cACint209_1", + "model_template": "BBP:cACint209_L23_ChC_87b9dd7336", + "morphology": "C080400A3_-_Scale_x1.000_y0.950_z1.000.asc" + } + ], + "cNAC": [ + { + "model_directory": "L23_ChC_cNAC187_1", + "model_template": "BBP:cNAC187_L23_ChC_88b9ee8f5d", + "morphology": "C080400A3_-_Scale_x1.000_y1.050_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L23_ChC_cNAC187_2", + "model_template": "BBP:cNAC187_L23_ChC_85582ca6d2", + "morphology": "mtC050800D_idD_-_Scale_x1.000_y1.025_z1.000.asc" + } + ], + "dNAC": [ + { + "model_directory": "L23_ChC_dNAC222_1", + "model_template": "BBP:dNAC222_L23_ChC_97f4d271eb", + "morphology": "C080400A3_-_Scale_x1.000_y1.050_z1.000_-_Clone_3.asc" + }, + { + "model_directory": "L23_ChC_dNAC222_2", + "model_template": "BBP:dNAC222_L23_ChC_9b0e709c9c", + "morphology": "mtC050800D_idD_-_Clone_4.asc" + } + ] + }, + "L23_DBC": { + "bAC": [ + { + "model_directory": "L23_DBC_bAC217_1", + "model_template": "BBP:bAC217_L23_DBC_393cc5cca5", + "morphology": "C060400B2_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L23_DBC_bAC217_2", + "model_template": "BBP:bAC217_L23_DBC_e5ab405051", + "morphology": "C080400C2_-_Scale_x1.000_y0.950_z1.000_-_Clone_4.asc" + } + ], + "bIR": [ + { + "model_directory": "L23_DBC_bIR215_1", + "model_template": "BBP:bIR215_L23_DBC_56fd12fad5", + "morphology": "C060400B2_-_Scale_x1.000_y1.025_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L23_DBC_bIR215_2", + "model_template": "BBP:bIR215_L23_DBC_b0d0b3615e", + "morphology": "C080400C2_-_Clone_2.asc" + } + ], + "bNAC": [ + { + "model_directory": "L23_DBC_bNAC219_2", + "model_template": "BBP:bNAC219_L23_DBC_8b03af6e83", + "morphology": "C080400C2_-_Clone_0.asc" + }, + { + "model_directory": "L23_DBC_bNAC219_1", + "model_template": "BBP:bNAC219_L23_DBC_f7a3d54a01", + "morphology": "C060400B2_-_Scale_x1.000_y1.050_z1.000_-_Clone_1.asc" + } + ], + "cAC": [ + { + "model_directory": "L23_DBC_cACint209_2", + "model_template": "BBP:cACint209_L23_DBC_4041312e0d", + "morphology": "C080400C2_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L23_DBC_cACint209_1", + "model_template": "BBP:cACint209_L23_DBC_4114c4c36c", + "morphology": "C060400B2_-_Scale_x1.000_y1.050_z1.000_-_Clone_3.asc" + } + ] + }, + "L23_LBC": { + "bAC": [ + { + "model_directory": "L23_LBC_bAC217_1", + "model_template": "BBP:bAC217_L23_LBC_72e65525d3", + "morphology": "sm110125a1-3_idC_-_Clone_2.asc" + }, + { + "model_directory": "L23_LBC_bAC217_2", + "model_template": "BBP:bAC217_L23_LBC_361cffb4c6", + "morphology": "C050600B1_-_Scale_x1.000_y0.950_z1.000_-_Clone_1.asc" + } + ], + "bNAC": [ + { + "model_directory": "L23_LBC_bNAC219_2", + "model_template": "BBP:bNAC219_L23_LBC_91044b50b3", + "morphology": "C140300B-I2_-_Clone_0.asc" + }, + { + "model_directory": "L23_LBC_bNAC219_1", + "model_template": "BBP:bNAC219_L23_LBC_fe2122c75c", + "morphology": "C050398B-I4_-_Scale_x1.000_y1.025_z1.000.asc" + } + ], + "cAC": [ + { + "model_directory": "L23_LBC_cACint209_1", + "model_template": "BBP:cACint209_L23_LBC_d5fa8128ae", + "morphology": "C050398B-I4_-_Scale_x1.000_y0.950_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L23_LBC_cACint209_2", + "model_template": "BBP:cACint209_L23_LBC_c6138544ab", + "morphology": "C050600B1_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + } + ], + "cNAC": [ + { + "model_directory": "L23_LBC_cNAC187_1", + "model_template": "BBP:cNAC187_L23_LBC_df15689e81", + "morphology": "C050398B-I4_-_Clone_3.asc" + }, + { + "model_directory": "L23_LBC_cNAC187_2", + "model_template": "BBP:cNAC187_L23_LBC_95f37b59ec", + "morphology": "C250500A-I4_-_Scale_x1.000_y1.025_z1.000_-_Clone_5.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L23_LBC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L23_LBC_91044b50b3", + "morphology": "C140300B-I2_-_Clone_0.asc" + }, + { + "model_directory": "L23_LBC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L23_LBC_e6e8f83407", + "morphology": "C050398B-I4_-_Scale_x1.000_y1.050_z1.000.asc" + } + ], + "dNAC": [ + { + "model_directory": "L23_LBC_dNAC222_2", + "model_template": "BBP:dNAC222_L23_LBC_3872d55b42", + "morphology": "C140300B-I2_-_Scale_x1.000_y1.025_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L23_LBC_dNAC222_1", + "model_template": "BBP:dNAC222_L23_LBC_df15689e81", + "morphology": "C050398B-I4_-_Clone_3.asc" + } + ] + }, + "L23_MC": { + "bAC": [ + { + "model_directory": "L23_MC_bAC217_1", + "model_template": "BBP:bAC217_L23_MC_40be3bf0e8", + "morphology": "C050600B2_-_Scale_x1.000_y0.975_z1.000.asc" + }, + { + "model_directory": "L23_MC_bAC217_2", + "model_template": "BBP:bAC217_L23_MC_44b474bb8f", + "morphology": "C070600B2.asc" + } + ], + "bNAC": [ + { + "model_directory": "L23_MC_bNAC219_2", + "model_template": "BBP:bNAC219_L23_MC_44b474bb8f", + "morphology": "C070600B2.asc" + }, + { + "model_directory": "L23_MC_bNAC219_1", + "model_template": "BBP:bNAC219_L23_MC_b7a2c9d0ae", + "morphology": "C260199A-I3.asc" + } + ], + "cAC": [ + { + "model_directory": "L23_MC_cACint209_1", + "model_template": "BBP:cACint209_L23_MC_940ffcbb27", + "morphology": "C310106D.asc" + }, + { + "model_directory": "L23_MC_cACint209_2", + "model_template": "BBP:cACint209_L23_MC_3303d0ff68", + "morphology": "C061000A3.asc" + } + ], + "cNAC": [ + { + "model_directory": "L23_MC_cNAC187_2", + "model_template": "BBP:cNAC187_L23_MC_940ffcbb27", + "morphology": "C310106D.asc" + }, + { + "model_directory": "L23_MC_cNAC187_1", + "model_template": "BBP:cNAC187_L23_MC_2c0a7badf4", + "morphology": "C310897A-I1.asc" + } + ], + "dNAC": [ + { + "model_directory": "L23_MC_dNAC222_2", + "model_template": "BBP:dNAC222_L23_MC_940ffcbb27", + "morphology": "C310106D.asc" + }, + { + "model_directory": "L23_MC_dNAC222_1", + "model_template": "BBP:dNAC222_L23_MC_1490f15199", + "morphology": "C251197A-I3.asc" + } + ] + }, + "L23_NBC": { + "bAC": [ + { + "model_directory": "L23_NBC_bAC217_2", + "model_template": "BBP:bAC217_L23_NBC_dc5e34b933", + "morphology": "C040600A2_-_Scale_x1.000_y0.950_z1.000_-_Clone_7.asc" + }, + { + "model_directory": "L23_NBC_bAC217_1", + "model_template": "BBP:bAC217_L23_NBC_711b6a838e", + "morphology": "C020200-16_-_Scale_x1.000_y1.050_z1.000_-_Clone_14.asc" + } + ], + "bNAC": [ + { + "model_directory": "L23_NBC_bNAC219_1", + "model_template": "BBP:bNAC219_L23_NBC_01d2e3caa6", + "morphology": "vd100621_idB_-_Scale_x1.000_y0.950_z1.000_-_Clone_8.asc" + }, + { + "model_directory": "L23_NBC_bNAC219_2", + "model_template": "BBP:bNAC219_L23_NBC_6561f8d865", + "morphology": "C080300B2_-_Scale_x1.000_y1.025_z1.000.asc" + } + ], + "cAC": [ + { + "model_directory": "L23_NBC_cACint209_2", + "model_template": "BBP:cACint209_L23_NBC_ad562fc72b", + "morphology": "C280998A-I2_-_Scale_x1.000_y1.050_z1.000_-_Clone_8.asc" + }, + { + "model_directory": "L23_NBC_cACint209_1", + "model_template": "BBP:cACint209_L23_NBC_f831ad7a1f", + "morphology": "C290500B-I2_-_Scale_x1.000_y0.950_z1.000_-_Clone_1.asc" + } + ], + "cIR": [ + { + "model_directory": "L23_NBC_cIR216_2", + "model_template": "BBP:cIR216_L23_NBC_2ee5947bbf", + "morphology": "C040600A2_-_Scale_x1.000_y1.050_z1.000_-_Clone_18.asc" + }, + { + "model_directory": "L23_NBC_cIR216_1", + "model_template": "BBP:cIR216_L23_NBC_84b7be2a4c", + "morphology": "C020200-16_-_Clone_17.asc" + } + ], + "cNAC": [ + { + "model_directory": "L23_NBC_cNAC187_1", + "model_template": "BBP:cNAC187_L23_NBC_9d37c4b1f8", + "morphology": "C300898C-I3_-_Scale_x1.000_y0.950_z1.000_-_Clone_20.asc" + }, + { + "model_directory": "L23_NBC_cNAC187_2", + "model_template": "BBP:cNAC187_L23_NBC_7f97b8e83f", + "morphology": "C280999A-I4_-_Scale_x1.000_y0.975_z1.000_-_Clone_14.asc" + } + ], + "dNAC": [ + { + "model_directory": "L23_NBC_dNAC222_2", + "model_template": "BBP:dNAC222_L23_NBC_46256e0cca", + "morphology": "C040600A2_-_Clone_2.asc" + }, + { + "model_directory": "L23_NBC_dNAC222_1", + "model_template": "BBP:dNAC222_L23_NBC_ec4aba2351", + "morphology": "C280999A-I4_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + } + ] + }, + "L23_NGC": { + "bNAC": [ + { + "model_directory": "L23_NGC_bNAC219_2", + "model_template": "BBP:bNAC219_L23_NGC_d600988347", + "morphology": "sm100618b1-2_idA_-_Scale_x1.000_y0.975_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L23_NGC_bNAC219_1", + "model_template": "BBP:bNAC219_L23_NGC_1c20d72451", + "morphology": "C170998D-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_3.asc" + } + ], + "cAC": [ + { + "model_directory": "L23_NGC_cACint209_1", + "model_template": "BBP:cACint209_L23_NGC_be2ffb9c7d", + "morphology": "C170998D-I3_-_Scale_x1.000_y0.950_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L23_NGC_cACint209_2", + "model_template": "BBP:cACint209_L23_NGC_90d34530b4", + "morphology": "sm100618b1-2_idA_-_Clone_0.asc" + } + ], + "cNAC": [ + { + "model_directory": "L23_NGC_cNAC187_2", + "model_template": "BBP:cNAC187_L23_NGC_e831b433a9", + "morphology": "sm100618b1-2_idA_-_Scale_x1.000_y1.025_z1.000_-_Clone_3.asc" + }, + { + "model_directory": "L23_NGC_cNAC187_1", + "model_template": "BBP:cNAC187_L23_NGC_d79ffc246d", + "morphology": "C170998D-I3_-_Scale_x1.000_y1.050_z1.000_-_Clone_12.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L23_NGC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L23_NGC_565b9e8b55", + "morphology": "C170998D-I3_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L23_NGC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L23_NGC_efe076107a", + "morphology": "sm100618b1-2_idA_-_Scale_x1.000_y1.025_z1.000_-_Clone_8.asc" + } + ] + }, + "L23_PC": { + "cADpyr": [ + { + "model_directory": "L23_PC_cADpyr229_1", + "model_template": "BBP:cADpyr229_L23_PC_5ecbf9b163", + "morphology": "dend-C170897A-P3_axon-C260897C-P4_-_Clone_4.asc" + }, + { + "model_directory": "L23_PC_cADpyr229_2", + "model_template": "BBP:cADpyr229_L23_PC_8ef1aa6602", + "morphology": "dend-C170897A-P3_axon-C190898A-P2_-_Clone_3.asc" + } + ] + }, + "L23_SBC": { + "bNAC": [ + { + "model_directory": "L23_SBC_bNAC219_1", + "model_template": "BBP:bNAC219_L23_SBC_6cab0b0a69", + "morphology": "C010600C1_-_Scale_x1.000_y0.975_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L23_SBC_bNAC219_2", + "model_template": "BBP:bNAC219_L23_SBC_1361ded4e5", + "morphology": "C011098A-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_1.asc" + } + ], + "cAC": [ + { + "model_directory": "L23_SBC_cACint209_1", + "model_template": "BBP:cACint209_L23_SBC_1fa95380bf", + "morphology": "sm110127b1-3_INT_idD_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L23_SBC_cACint209_2", + "model_template": "BBP:cACint209_L23_SBC_0869c1fd12", + "morphology": "C011098A-I3_-_Scale_x1.000_y0.975_z1.000_-_Clone_1.asc" + } + ], + "dNAC": [ + { + "model_directory": "L23_SBC_dNAC222_2", + "model_template": "BBP:dNAC222_L23_SBC_48c120ddd5", + "morphology": "C011098A-I3_-_Clone_0.asc" + }, + { + "model_directory": "L23_SBC_dNAC222_1", + "model_template": "BBP:dNAC222_L23_SBC_ef99b8a177", + "morphology": "sm110127a1-3_INT_idD_-_Scale_x1.000_y0.950_z1.000.asc" + } + ] + }, + "L4_BP": { + "bAC": [ + { + "model_directory": "L4_BP_bAC217_2", + "model_template": "BBP:bAC217_L4_BP_a8b6abe396", + "morphology": "C300797C-I1_-_Scale_x1.000_y1.025_z1.000.asc" + }, + { + "model_directory": "L4_BP_bAC217_1", + "model_template": "BBP:bAC217_L4_BP_d04c4872bd", + "morphology": "C300797C-I1_-_Clone_16.asc" + } + ], + "bIR": [ + { + "model_directory": "L4_BP_bIR215_1", + "model_template": "BBP:bIR215_L4_BP_a8b6abe396", + "morphology": "C300797C-I1_-_Scale_x1.000_y1.025_z1.000.asc" + }, + { + "model_directory": "L4_BP_bIR215_2", + "model_template": "BBP:bIR215_L4_BP_7f9877b937", + "morphology": "C300797C-I1_-_Scale_x1.000_y1.050_z1.000_-_Clone_10.asc" + } + ], + "bNAC": [ + { + "model_directory": "L4_BP_bNAC219_1", + "model_template": "BBP:bNAC219_L4_BP_c99c259f39", + "morphology": "C300797C-I1_-_Clone_3.asc" + }, + { + "model_directory": "L4_BP_bNAC219_2", + "model_template": "BBP:bNAC219_L4_BP_ff2b6d7b3d", + "morphology": "C300797C-I1_-_Scale_x1.000_y0.950_z1.000_-_Clone_10.asc" + } + ], + "cAC": [ + { + "model_directory": "L4_BP_cACint209_2", + "model_template": "BBP:cACint209_L4_BP_a436dc77d5", + "morphology": "C300797C-I1_-_Scale_x1.000_y0.950_z1.000_-_Clone_9.asc" + }, + { + "model_directory": "L4_BP_cACint209_1", + "model_template": "BBP:cACint209_L4_BP_c99c259f39", + "morphology": "C300797C-I1_-_Clone_3.asc" + } + ], + "cNAC": [ + { + "model_directory": "L4_BP_cNAC187_2", + "model_template": "BBP:cNAC187_L4_BP_2a2ec4bfaa", + "morphology": "C300797C-I1_-_Clone_13.asc" + }, + { + "model_directory": "L4_BP_cNAC187_1", + "model_template": "BBP:cNAC187_L4_BP_e936f4d8ba", + "morphology": "C300797C-I1_-_Scale_x1.000_y0.975_z1.000_-_Clone_4.asc" + } + ], + "dSTUT": [ + { + "model_directory": "L4_BP_dSTUT214_1", + "model_template": "BBP:dSTUT214_L4_BP_a8b6abe396", + "morphology": "C300797C-I1_-_Scale_x1.000_y1.025_z1.000.asc" + }, + { + "model_directory": "L4_BP_dSTUT214_2", + "model_template": "BBP:dSTUT214_L4_BP_b88746aff4", + "morphology": "C300797C-I1_-_Scale_x1.000_y0.975_z1.000_-_Clone_16.asc" + } + ] + }, + "L4_BTC": { + "bAC": [ + { + "model_directory": "L4_BTC_bAC217_1", + "model_template": "BBP:bAC217_L4_BTC_ede3831900", + "morphology": "C020600C1_-_Scale_x1.000_y0.975_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L4_BTC_bAC217_2", + "model_template": "BBP:bAC217_L4_BTC_070d4f32f0", + "morphology": "C140201A1_-_Clone_6.asc" + } + ], + "bIR": [ + { + "model_directory": "L4_BTC_bIR215_1", + "model_template": "BBP:bIR215_L4_BTC_22df25e508", + "morphology": "C020600C1_-_Clone_2.asc" + }, + { + "model_directory": "L4_BTC_bIR215_2", + "model_template": "BBP:bIR215_L4_BTC_7ea9933f77", + "morphology": "C140201A1_-_Clone_1.asc" + } + ], + "bSTUT": [ + { + "model_directory": "L4_BTC_bSTUT213_1", + "model_template": "BBP:bSTUT213_L4_BTC_62f17815ed", + "morphology": "C020600C1_-_Scale_x1.000_y1.025_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L4_BTC_bSTUT213_2", + "model_template": "BBP:bSTUT213_L4_BTC_93ff2bc104", + "morphology": "rp110127_L5-2_idG_-_Scale_x1.000_y1.050_z1.000_-_Clone_1.asc" + } + ], + "cAC": [ + { + "model_directory": "L4_BTC_cACint209_1", + "model_template": "BBP:cACint209_L4_BTC_20d24e55d5", + "morphology": "C020600C1_-_Scale_x1.000_y1.025_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L4_BTC_cACint209_2", + "model_template": "BBP:cACint209_L4_BTC_87c80e7368", + "morphology": "C140201A1_-_Scale_x1.000_y1.050_z1.000_-_Clone_6.asc" + } + ], + "cNAC": [ + { + "model_directory": "L4_BTC_cNAC187_2", + "model_template": "BBP:cNAC187_L4_BTC_dbb05c9cf3", + "morphology": "C140201A1_-_Scale_x1.000_y0.975_z1.000_-_Clone_4.asc" + }, + { + "model_directory": "L4_BTC_cNAC187_1", + "model_template": "BBP:cNAC187_L4_BTC_ff1cebdea2", + "morphology": "C020600C1_-_Scale_x1.000_y0.950_z1.000_-_Clone_3.asc" + } + ], + "dNAC": [ + { + "model_directory": "L4_BTC_dNAC222_2", + "model_template": "BBP:dNAC222_L4_BTC_5612242ada", + "morphology": "C250298A-I4_-_Scale_x1.000_y0.950_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L4_BTC_dNAC222_1", + "model_template": "BBP:dNAC222_L4_BTC_2d64e36d0b", + "morphology": "C020600C1_-_Scale_x1.000_y0.950_z1.000_-_Clone_6.asc" + } + ] + }, + "L4_ChC": { + "cAC": [ + { + "model_directory": "L4_ChC_cACint209_1", + "model_template": "BBP:cACint209_L4_ChC_2d707a8bcb", + "morphology": "C091000D-I3_-_Scale_x1.000_y0.975_z1.000_-_Clone_12.asc" + }, + { + "model_directory": "L4_ChC_cACint209_2", + "model_template": "BBP:cACint209_L4_ChC_85076eeecc", + "morphology": "mtC070301B_idC_-_Scale_x1.000_y0.950_z1.000_-_Clone_4.asc" + } + ], + "cNAC": [ + { + "model_directory": "L4_ChC_cNAC187_1", + "model_template": "BBP:cNAC187_L4_ChC_22d43e8e41", + "morphology": "C091000D-I3_-_Scale_x1.000_y1.050_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L4_ChC_cNAC187_2", + "model_template": "BBP:cNAC187_L4_ChC_56a32cfcf2", + "morphology": "mtC070301B_idC_-_Scale_x1.000_y1.050_z1.000.asc" + } + ], + "dNAC": [ + { + "model_directory": "L4_ChC_dNAC222_1", + "model_template": "BBP:dNAC222_L4_ChC_5e109d198d", + "morphology": "C091000D-I3_-_Scale_x1.000_y1.050_z1.000_-_Clone_12.asc" + }, + { + "model_directory": "L4_ChC_dNAC222_2", + "model_template": "BBP:dNAC222_L4_ChC_9060a4c27e", + "morphology": "mtC070301B_idC_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + } + ] + }, + "L4_DBC": { + "bAC": [ + { + "model_directory": "L4_DBC_bAC217_1", + "model_template": "BBP:bAC217_L4_DBC_78a99c338d", + "morphology": "C140600C-I1_-_Scale_x1.000_y1.050_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L4_DBC_bAC217_2", + "model_template": "BBP:bAC217_L4_DBC_9827c5d3a7", + "morphology": "C300997A-I1_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + } + ], + "bIR": [ + { + "model_directory": "L4_DBC_bIR215_2", + "model_template": "BBP:bIR215_L4_DBC_f339de2544", + "morphology": "C300997A-I1_-_Scale_x1.000_y1.050_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L4_DBC_bIR215_1", + "model_template": "BBP:bIR215_L4_DBC_78a99c338d", + "morphology": "C140600C-I1_-_Scale_x1.000_y1.050_z1.000_-_Clone_2.asc" + } + ], + "bNAC": [ + { + "model_directory": "L4_DBC_bNAC219_2", + "model_template": "BBP:bNAC219_L4_DBC_45e771bde6", + "morphology": "C300997A-I1_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L4_DBC_bNAC219_1", + "model_template": "BBP:bNAC219_L4_DBC_beb47bee0e", + "morphology": "C140600C-I1_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + } + ], + "bSTUT": [ + { + "model_directory": "L4_DBC_bSTUT213_2", + "model_template": "BBP:bSTUT213_L4_DBC_c6dae7aa61", + "morphology": "C300997A-I1_-_Scale_x1.000_y1.050_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L4_DBC_bSTUT213_1", + "model_template": "BBP:bSTUT213_L4_DBC_23ffe29c8b", + "morphology": "C140600C-I1_-_Clone_2.asc" + } + ], + "cAC": [ + { + "model_directory": "L4_DBC_cACint209_2", + "model_template": "BBP:cACint209_L4_DBC_280e20a247", + "morphology": "C300997A-I1_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L4_DBC_cACint209_1", + "model_template": "BBP:cACint209_L4_DBC_a7aa7154d8", + "morphology": "C140600C-I1_-_Scale_x1.000_y1.025_z1.000.asc" + } + ], + "cIR": [ + { + "model_directory": "L4_DBC_cIR216_1", + "model_template": "BBP:cIR216_L4_DBC_972df9520e", + "morphology": "C140600C-I1_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L4_DBC_cIR216_2", + "model_template": "BBP:cIR216_L4_DBC_8e5844bb23", + "morphology": "C300997A-I1_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + } + ], + "cNAC": [ + { + "model_directory": "L4_DBC_cNAC187_2", + "model_template": "BBP:cNAC187_L4_DBC_c6dae7aa61", + "morphology": "C300997A-I1_-_Scale_x1.000_y1.050_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L4_DBC_cNAC187_1", + "model_template": "BBP:cNAC187_L4_DBC_23ffe29c8b", + "morphology": "C140600C-I1_-_Clone_2.asc" + } + ] + }, + "L4_LBC": { + "cAC": [ + { + "model_directory": "L4_LBC_cACint209_2", + "model_template": "BBP:cACint209_L4_LBC_66ec8fed8f", + "morphology": "C010600B1_-_Scale_x1.000_y1.025_z1.000_-_Clone_5.asc" + }, + { + "model_directory": "L4_LBC_cACint209_1", + "model_template": "BBP:cACint209_L4_LBC_baa757490e", + "morphology": "C310897A-I2_-_Scale_x1.000_y1.025_z1.000_-_Clone_1.asc" + } + ], + "cNAC": [ + { + "model_directory": "L4_LBC_cNAC187_1", + "model_template": "BBP:cNAC187_L4_LBC_990b7ac7df", + "morphology": "C010398B-I4_cor_-_Clone_0.asc" + }, + { + "model_directory": "L4_LBC_cNAC187_2", + "model_template": "BBP:cNAC187_L4_LBC_1cf329956f", + "morphology": "C310106C_-_Scale_x1.000_y0.975_z1.000_-_Clone_3.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L4_LBC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L4_LBC_11016afdad", + "morphology": "mtC080301C_idA_-_Scale_x1.000_y1.050_z1.000_-_Clone_3.asc" + }, + { + "model_directory": "L4_LBC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L4_LBC_1d4118b33e", + "morphology": "C010398B-I4_cor_-_Clone_2.asc" + } + ], + "dNAC": [ + { + "model_directory": "L4_LBC_dNAC222_1", + "model_template": "BBP:dNAC222_L4_LBC_f6a71a338d", + "morphology": "mtC080301C_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L4_LBC_dNAC222_2", + "model_template": "BBP:dNAC222_L4_LBC_f0975c96e7", + "morphology": "C240298B-I4_-_Scale_x1.000_y0.950_z1.000.asc" + } + ], + "dSTUT": [ + { + "model_directory": "L4_LBC_dSTUT214_2", + "model_template": "BBP:dSTUT214_L4_LBC_396684f644", + "morphology": "mtC080301C_idA_-_Scale_x1.000_y0.950_z1.000.asc" + }, + { + "model_directory": "L4_LBC_dSTUT214_1", + "model_template": "BBP:dSTUT214_L4_LBC_aecec7aee9", + "morphology": "C310106C_-_Clone_4.asc" + } + ] + }, + "L4_MC": { + "bAC": [ + { + "model_directory": "L4_MC_bAC217_1", + "model_template": "BBP:bAC217_L4_MC_3110386c07", + "morphology": "C190997A-I1.asc" + }, + { + "model_directory": "L4_MC_bAC217_2", + "model_template": "BBP:bAC217_L4_MC_2eb83e1eed", + "morphology": "C270999B-I4.asc" + } + ], + "bNAC": [ + { + "model_directory": "L4_MC_bNAC219_1", + "model_template": "BBP:bNAC219_L4_MC_ba3c5063e4", + "morphology": "C090997A-I2.asc" + }, + { + "model_directory": "L4_MC_bNAC219_2", + "model_template": "BBP:bNAC219_L4_MC_2eb83e1eed", + "morphology": "C270999B-I4.asc" + } + ], + "cAC": [ + { + "model_directory": "L4_MC_cACint209_2", + "model_template": "BBP:cACint209_L4_MC_f8c62d11b0", + "morphology": "C150600B-I1.asc" + }, + { + "model_directory": "L4_MC_cACint209_1", + "model_template": "BBP:cACint209_L4_MC_ba3c5063e4", + "morphology": "C090997A-I2.asc" + } + ], + "cNAC": [ + { + "model_directory": "L4_MC_cNAC187_2", + "model_template": "BBP:cNAC187_L4_MC_3110386c07", + "morphology": "C190997A-I1.asc" + }, + { + "model_directory": "L4_MC_cNAC187_1", + "model_template": "BBP:cNAC187_L4_MC_f8c62d11b0", + "morphology": "C150600B-I1.asc" + } + ], + "dNAC": [ + { + "model_directory": "L4_MC_dNAC222_2", + "model_template": "BBP:dNAC222_L4_MC_3110386c07", + "morphology": "C190997A-I1.asc" + }, + { + "model_directory": "L4_MC_dNAC222_1", + "model_template": "BBP:dNAC222_L4_MC_f8c62d11b0", + "morphology": "C150600B-I1.asc" + } + ] + }, + "L4_NBC": { + "cAC": [ + { + "model_directory": "L4_NBC_cACint209_2", + "model_template": "BBP:cACint209_L4_NBC_3552e1f34a", + "morphology": "C040600B1_-_Clone_2.asc" + }, + { + "model_directory": "L4_NBC_cACint209_1", + "model_template": "BBP:cACint209_L4_NBC_9060dda08b", + "morphology": "rp110113_L5-1_idA_-_Scale_x1.000_y1.025_z1.000_-_Clone_4.asc" + } + ], + "cIR": [ + { + "model_directory": "L4_NBC_cIR216_1", + "model_template": "BBP:cIR216_L4_NBC_f53cc303cc", + "morphology": "C010600A2_-_Scale_x1.000_y1.050_z1.000_-_Clone_3.asc" + }, + { + "model_directory": "L4_NBC_cIR216_2", + "model_template": "BBP:cIR216_L4_NBC_c28326d13b", + "morphology": "C040600B1_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + } + ], + "cNAC": [ + { + "model_directory": "L4_NBC_cNAC187_1", + "model_template": "BBP:cNAC187_L4_NBC_36cd91dc08", + "morphology": "C200897C-I1_-_Clone_1.asc" + }, + { + "model_directory": "L4_NBC_cNAC187_2", + "model_template": "BBP:cNAC187_L4_NBC_bfc793de90", + "morphology": "C040600B1_-_Clone_3.asc" + } + ], + "dNAC": [ + { + "model_directory": "L4_NBC_dNAC222_1", + "model_template": "BBP:dNAC222_L4_NBC_aa36da75a3", + "morphology": "C010600A2_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L4_NBC_dNAC222_2", + "model_template": "BBP:dNAC222_L4_NBC_0dd32b6386", + "morphology": "C040600B1_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + } + ] + }, + "L4_NGC": { + "bNAC": [ + { + "model_directory": "L4_NGC_bNAC219_2", + "model_template": "BBP:bNAC219_L4_NGC_f7ede76c77", + "morphology": "sm100618b1-2_idA_-_Scale_x1.000_y1.025_z1.000_-_Clone_10.asc" + }, + { + "model_directory": "L4_NGC_bNAC219_1", + "model_template": "BBP:bNAC219_L4_NGC_3c9a6fcd96", + "morphology": "C170998D-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_8.asc" + } + ], + "cAC": [ + { + "model_directory": "L4_NGC_cACint209_1", + "model_template": "BBP:cACint209_L4_NGC_00ae03b116", + "morphology": "C170998D-I3_-_Scale_x1.000_y1.050_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L4_NGC_cACint209_2", + "model_template": "BBP:cACint209_L4_NGC_9f0f008375", + "morphology": "sm100618b1-2_idA_-_Clone_6.asc" + } + ], + "cNAC": [ + { + "model_directory": "L4_NGC_cNAC187_1", + "model_template": "BBP:cNAC187_L4_NGC_025b2126a1", + "morphology": "C170998D-I3_-_Scale_x1.000_y0.975_z1.000_-_Clone_10.asc" + }, + { + "model_directory": "L4_NGC_cNAC187_2", + "model_template": "BBP:cNAC187_L4_NGC_cf97ea357c", + "morphology": "sm100618b1-2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L4_NGC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L4_NGC_1c20d72451", + "morphology": "C170998D-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_3.asc" + }, + { + "model_directory": "L4_NGC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L4_NGC_40d6a8f682", + "morphology": "C170998D-I3_-_Scale_x1.000_y0.975_z1.000_-_Clone_4.asc" + } + ] + }, + "L4_PC": { + "cADpyr": [ + { + "model_directory": "L4_PC_cADpyr230_2", + "model_template": "BBP:cADpyr230_L4_PC_2d5807a37b", + "morphology": "dend-C310897B-P3_axon-C220498B-P3_cor_-_Clone_1.asc" + }, + { + "model_directory": "L4_PC_cADpyr230_1", + "model_template": "BBP:cADpyr230_L4_PC_f15e35e578", + "morphology": "dend-C300797C-P4_axon-C200897C-P4_-_Scale_x1.000_y1.025_z1.000_-_Clone_11.asc" + } + ] + }, + "L4_SBC": { + "bNAC": [ + { + "model_directory": "L4_SBC_bNAC219_1", + "model_template": "BBP:bNAC219_L4_SBC_140df1eca7", + "morphology": "C060998B-I1_-_Scale_x1.000_y0.975_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L4_SBC_bNAC219_2", + "model_template": "BBP:bNAC219_L4_SBC_dbf40425f3", + "morphology": "C140898A-I1.asc" + } + ], + "cAC": [ + { + "model_directory": "L4_SBC_cACint209_2", + "model_template": "BBP:cACint209_L4_SBC_684e05d4eb", + "morphology": "C140898A-I1_-_Scale_x1.000_y1.050_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L4_SBC_cACint209_1", + "model_template": "BBP:cACint209_L4_SBC_4148f86d4f", + "morphology": "C031097B-I4_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + } + ], + "dNAC": [ + { + "model_directory": "L4_SBC_dNAC222_2", + "model_template": "BBP:dNAC222_L4_SBC_f48f4f7670", + "morphology": "C140898A-I1_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L4_SBC_dNAC222_1", + "model_template": "BBP:dNAC222_L4_SBC_dcee829578", + "morphology": "C060998B-I1_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + } + ] + }, + "L4_SP": { + "cADpyr": [ + { + "model_directory": "L4_SP_cADpyr230_1", + "model_template": "BBP:cADpyr230_L4_SP_6fe41ae9cd", + "morphology": "dend-C010398B-P3_axon-C031097B-P3_-_Clone_11.asc" + }, + { + "model_directory": "L4_SP_cADpyr230_2", + "model_template": "BBP:cADpyr230_L4_SP_0dc3a9acaf", + "morphology": "dend-C170898A-P4_axon-C180997A-P3_-_Clone_5.asc" + } + ] + }, + "L4_SS": { + "cADpyr": [ + { + "model_directory": "L4_SS_cADpyr230_2", + "model_template": "BBP:cADpyr230_L4_SS_1afeb14f17", + "morphology": "dend-C050800E2_cor_axon-C120398A-P3_-_Scale_x1.000_y1.025_z1.000_-_Clone_87.asc" + }, + { + "model_directory": "L4_SS_cADpyr230_1", + "model_template": "BBP:cADpyr230_L4_SS_9e49de205b", + "morphology": "dend-C050800E2_cor_axon-C120398A-P2_-_Scale_x1.000_y1.050_z1.000_-_Clone_71.asc" + } + ] + }, + "L5_BP": { + "bAC": [ + { + "model_directory": "L5_BP_bAC217_1", + "model_template": "BBP:bAC217_L5_BP_d0cc8d7615", + "morphology": "C240300C1_-_Scale_x1.000_y1.050_z1.000_-_Clone_17.asc" + }, + { + "model_directory": "L5_BP_bAC217_2", + "model_template": "BBP:bAC217_L5_BP_e3706556cb", + "morphology": "C240300C1_-_Scale_x1.000_y1.025_z1.000_-_Clone_32.asc" + } + ], + "bIR": [ + { + "model_directory": "L5_BP_bIR215_1", + "model_template": "BBP:bIR215_L5_BP_6687408de7", + "morphology": "C240300C1_-_Scale_x1.000_y0.975_z1.000_-_Clone_38.asc" + }, + { + "model_directory": "L5_BP_bIR215_2", + "model_template": "BBP:bIR215_L5_BP_706acf4049", + "morphology": "C240300C1_-_Clone_38.asc" + } + ], + "bNAC": [ + { + "model_directory": "L5_BP_bNAC219_2", + "model_template": "BBP:bNAC219_L5_BP_b022a66bd2", + "morphology": "C240300C1_-_Clone_15.asc" + }, + { + "model_directory": "L5_BP_bNAC219_1", + "model_template": "BBP:bNAC219_L5_BP_bc09d28ed4", + "morphology": "C240300C1_-_Scale_x1.000_y0.975_z1.000_-_Clone_54.asc" + } + ], + "cAC": [ + { + "model_directory": "L5_BP_cACint209_2", + "model_template": "BBP:cACint209_L5_BP_f600080385", + "morphology": "C240300C1_-_Scale_x1.000_y0.950_z1.000_-_Clone_4.asc" + }, + { + "model_directory": "L5_BP_cACint209_1", + "model_template": "BBP:cACint209_L5_BP_94d2820eba", + "morphology": "C240300C1_-_Scale_x1.000_y0.975_z1.000_-_Clone_49.asc" + } + ], + "cNAC": [ + { + "model_directory": "L5_BP_cNAC187_1", + "model_template": "BBP:cNAC187_L5_BP_3085e9694e", + "morphology": "C240300C1_-_Clone_48.asc" + }, + { + "model_directory": "L5_BP_cNAC187_2", + "model_template": "BBP:cNAC187_L5_BP_94e814803e", + "morphology": "C240300C1_-_Scale_x1.000_y0.950_z1.000_-_Clone_15.asc" + } + ], + "dSTUT": [ + { + "model_directory": "L5_BP_dSTUT214_1", + "model_template": "BBP:dSTUT214_L5_BP_f600080385", + "morphology": "C240300C1_-_Scale_x1.000_y0.950_z1.000_-_Clone_4.asc" + }, + { + "model_directory": "L5_BP_dSTUT214_2", + "model_template": "BBP:dSTUT214_L5_BP_55f9b731a1", + "morphology": "C240300C1_-_Scale_x1.000_y0.950_z1.000_-_Clone_24.asc" + } + ] + }, + "L5_BTC": { + "bAC": [ + { + "model_directory": "L5_BTC_bAC217_2", + "model_template": "BBP:bAC217_L5_BTC_3d68fea85d", + "morphology": "C240998A-I_-_Scale_x1.000_y1.025_z1.000_-_Clone_7.asc" + }, + { + "model_directory": "L5_BTC_bAC217_1", + "model_template": "BBP:bAC217_L5_BTC_160272643a", + "morphology": "C160998B-I_-_Scale_x1.000_y1.050_z1.000_-_Clone_5.asc" + } + ], + "cAC": [ + { + "model_directory": "L5_BTC_cACint209_2", + "model_template": "BBP:cACint209_L5_BTC_6ab22ae2e0", + "morphology": "C240998A-I_-_Scale_x1.000_y1.025_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L5_BTC_cACint209_1", + "model_template": "BBP:cACint209_L5_BTC_41f7db5b85", + "morphology": "C160998B-I_-_Scale_x1.000_y0.950_z1.000_-_Clone_1.asc" + } + ], + "cNAC": [ + { + "model_directory": "L5_BTC_cNAC187_1", + "model_template": "BBP:cNAC187_L5_BTC_0a43e2f3e5", + "morphology": "C160998B-I_-_Scale_x1.000_y0.975_z1.000_-_Clone_5.asc" + }, + { + "model_directory": "L5_BTC_cNAC187_2", + "model_template": "BBP:cNAC187_L5_BTC_18584bfae6", + "morphology": "C240998A-I_-_Scale_x1.000_y0.950_z1.000_-_Clone_1.asc" + } + ] + }, + "L5_ChC": { + "cAC": [ + { + "model_directory": "L5_ChC_cACint209_1", + "model_template": "BBP:cACint209_L5_ChC_e98f63217d", + "morphology": "C091000D-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L5_ChC_cACint209_2", + "model_template": "BBP:cACint209_L5_ChC_c38923facb", + "morphology": "mtC070301B_idC_-_Scale_x1.000_y0.975_z1.000_-_Clone_1.asc" + } + ], + "cNAC": [ + { + "model_directory": "L5_ChC_cNAC187_2", + "model_template": "BBP:cNAC187_L5_ChC_b51988187a", + "morphology": "mtC070301B_idC_-_Scale_x1.000_y1.025_z1.000_-_Clone_9.asc" + }, + { + "model_directory": "L5_ChC_cNAC187_1", + "model_template": "BBP:cNAC187_L5_ChC_8901e742c7", + "morphology": "C091000D-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + } + ], + "dNAC": [ + { + "model_directory": "L5_ChC_dNAC222_2", + "model_template": "BBP:dNAC222_L5_ChC_6493f67bad", + "morphology": "mtC070301B_idC_-_Scale_x1.000_y1.025_z1.000_-_Clone_11.asc" + }, + { + "model_directory": "L5_ChC_dNAC222_1", + "model_template": "BBP:dNAC222_L5_ChC_75c658c9b8", + "morphology": "C091000D-I3_-_Scale_x1.000_y0.950_z1.000_-_Clone_9.asc" + } + ] + }, + "L5_DBC": { + "bAC": [ + { + "model_directory": "L5_DBC_bAC217_1", + "model_template": "BBP:bAC217_L5_DBC_4765d943f4", + "morphology": "rp100428-12_idC_-_Scale_x1.000_y1.025_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L5_DBC_bAC217_2", + "model_template": "BBP:bAC217_L5_DBC_e731906688", + "morphology": "rp100428-12_idI_-_Scale_x1.000_y1.025_z1.000_-_Clone_2.asc" + } + ], + "bIR": [ + { + "model_directory": "L5_DBC_bIR215_1", + "model_template": "BBP:bIR215_L5_DBC_893b78d08e", + "morphology": "rp100428-12_idC_-_Scale_x1.000_y0.950_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L5_DBC_bIR215_2", + "model_template": "BBP:bIR215_L5_DBC_50ea904e54", + "morphology": "rp100428-12_idI_-_Scale_x1.000_y0.975_z1.000_-_Clone_1.asc" + } + ], + "bNAC": [ + { + "model_directory": "L5_DBC_bNAC219_2", + "model_template": "BBP:bNAC219_L5_DBC_ec8ca02d79", + "morphology": "rp100428-12_idI_-_Scale_x1.000_y0.950_z1.000.asc" + }, + { + "model_directory": "L5_DBC_bNAC219_1", + "model_template": "BBP:bNAC219_L5_DBC_d56fbcd5cf", + "morphology": "rp100428-12_idC_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + } + ], + "bSTUT": [ + { + "model_directory": "L5_DBC_bSTUT213_1", + "model_template": "BBP:bSTUT213_L5_DBC_ad487d347d", + "morphology": "rp100428-12_idI_-_Scale_x1.000_y0.975_z1.000.asc" + }, + { + "model_directory": "L5_DBC_bSTUT213_2", + "model_template": "BBP:bSTUT213_L5_DBC_b475d0949a", + "morphology": "rp100428-12_idI_-_Clone_2.asc" + } + ], + "cAC": [ + { + "model_directory": "L5_DBC_cACint209_2", + "model_template": "BBP:cACint209_L5_DBC_74050baf6d", + "morphology": "rp100428-12_idI_-_Scale_x1.000_y0.975_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L5_DBC_cACint209_1", + "model_template": "BBP:cACint209_L5_DBC_6a2bbf2a1b", + "morphology": "rp100428-12_idC_-_Scale_x1.000_y1.050_z1.000_-_Clone_1.asc" + } + ], + "cIR": [ + { + "model_directory": "L5_DBC_cIR216_1", + "model_template": "BBP:cIR216_L5_DBC_d8e0abdc7c", + "morphology": "rp100428-12_idI_-_Clone_1.asc" + }, + { + "model_directory": "L5_DBC_cIR216_2", + "model_template": "BBP:cIR216_L5_DBC_5f1980557e", + "morphology": "rp110125_L5-1_idF_-_Scale_x1.000_y1.050_z1.000_-_Clone_1.asc" + } + ], + "cNAC": [ + { + "model_directory": "L5_DBC_cNAC187_1", + "model_template": "BBP:cNAC187_L5_DBC_893b78d08e", + "morphology": "rp100428-12_idC_-_Scale_x1.000_y0.950_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L5_DBC_cNAC187_2", + "model_template": "BBP:cNAC187_L5_DBC_d8e0abdc7c", + "morphology": "rp100428-12_idI_-_Clone_1.asc" + } + ] + }, + "L5_LBC": { + "bAC": [ + { + "model_directory": "L5_LBC_bAC217_1", + "model_template": "BBP:bAC217_L5_LBC_c2cff91741", + "morphology": "og061123b1-3_idB_-_Scale_x1.000_y0.975_z1.000_-_Clone_4.asc" + }, + { + "model_directory": "L5_LBC_bAC217_2", + "model_template": "BBP:bAC217_L5_LBC_01750e1e18", + "morphology": "rp110201_L5-2_idA_-_Clone_10.asc" + } + ], + "cAC": [ + { + "model_directory": "L5_LBC_cACint209_1", + "model_template": "BBP:cACint209_L5_LBC_126a82ac08", + "morphology": "C080998A_-_Scale_x1.000_y0.950_z1.000_-_Clone_8.asc" + }, + { + "model_directory": "L5_LBC_cACint209_2", + "model_template": "BBP:cACint209_L5_LBC_3285d77dba", + "morphology": "rp110201_L5-2_idA_-_Clone_9.asc" + } + ], + "cIR": [ + { + "model_directory": "L5_LBC_cIR216_1", + "model_template": "BBP:cIR216_L5_LBC_8ce13ea42d", + "morphology": "C080998A_-_Scale_x1.000_y0.975_z1.000_-_Clone_4.asc" + }, + { + "model_directory": "L5_LBC_cIR216_2", + "model_template": "BBP:cIR216_L5_LBC_c5448109e7", + "morphology": "rp110419_C1_idA_-_Clone_2.asc" + } + ], + "cNAC": [ + { + "model_directory": "L5_LBC_cNAC187_2", + "model_template": "BBP:cNAC187_L5_LBC_d19674cc92", + "morphology": "rp110120_L5-2_idH_-_Scale_x1.000_y0.950_z1.000_-_Clone_10.asc" + }, + { + "model_directory": "L5_LBC_cNAC187_1", + "model_template": "BBP:cNAC187_L5_LBC_078d827ab9", + "morphology": "C080998A_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L5_LBC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L5_LBC_7e5297a36c", + "morphology": "rp110207_L5-1_idA_-_Scale_x1.000_y1.025_z1.000_-_Clone_9.asc" + }, + { + "model_directory": "L5_LBC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L5_LBC_29803173bd", + "morphology": "rp110419_C1_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_11.asc" + } + ], + "dNAC": [ + { + "model_directory": "L5_LBC_dNAC222_1", + "model_template": "BBP:dNAC222_L5_LBC_99ab75ea98", + "morphology": "rp110127_L5-3_idI_-_Scale_x1.000_y1.025_z1.000_-_Clone_11.asc" + }, + { + "model_directory": "L5_LBC_dNAC222_2", + "model_template": "BBP:dNAC222_L5_LBC_58bb1b2407", + "morphology": "rp110419_C1_idA_-_Scale_x1.000_y0.975_z1.000.asc" + } + ], + "dSTUT": [ + { + "model_directory": "L5_LBC_dSTUT214_2", + "model_template": "BBP:dSTUT214_L5_LBC_6a6d472ca8", + "morphology": "rp110207_L5-1_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L5_LBC_dSTUT214_1", + "model_template": "BBP:dSTUT214_L5_LBC_bf8ea1e366", + "morphology": "rp110127_L5-3_idI_-_Scale_x1.000_y0.950_z1.000_-_Clone_4.asc" + } + ] + }, + "L5_MC": { + "bAC": [ + { + "model_directory": "L5_MC_bAC217_1", + "model_template": "BBP:bAC217_L5_MC_cc2a170ef6", + "morphology": "C040601.asc" + }, + { + "model_directory": "L5_MC_bAC217_2", + "model_template": "BBP:bAC217_L5_MC_7eeb7cff0f", + "morphology": "C210301C1_cor.asc" + } + ], + "bIR": [ + { + "model_directory": "L5_MC_bIR215_2", + "model_template": "BBP:bIR215_L5_MC_cc2a170ef6", + "morphology": "C040601.asc" + }, + { + "model_directory": "L5_MC_bIR215_1", + "model_template": "BBP:bIR215_L5_MC_fdc7bd1d07", + "morphology": "C040426.asc" + } + ], + "bSTUT": [ + { + "model_directory": "L5_MC_bSTUT213_2", + "model_template": "BBP:bSTUT213_L5_MC_13c5267e91", + "morphology": "C040601_-_Scale_x1.000_y0.950_z1.000.asc" + }, + { + "model_directory": "L5_MC_bSTUT213_1", + "model_template": "BBP:bSTUT213_L5_MC_fdc7bd1d07", + "morphology": "C040426.asc" + } + ], + "cAC": [ + { + "model_directory": "L5_MC_cACint209_2", + "model_template": "BBP:cACint209_L5_MC_cc2a170ef6", + "morphology": "C040601.asc" + }, + { + "model_directory": "L5_MC_cACint209_1", + "model_template": "BBP:cACint209_L5_MC_fdc7bd1d07", + "morphology": "C040426.asc" + } + ], + "cNAC": [ + { + "model_directory": "L5_MC_cNAC187_1", + "model_template": "BBP:cNAC187_L5_MC_575d31ccfd", + "morphology": "rp100426-1_idD_-_Scale_x1.000_y0.975_z1.000.asc" + }, + { + "model_directory": "L5_MC_cNAC187_2", + "model_template": "BBP:cNAC187_L5_MC_9935c06ba6", + "morphology": "C040601_-_Scale_x1.000_y0.975_z1.000.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L5_MC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L5_MC_cc2a170ef6", + "morphology": "C040601.asc" + }, + { + "model_directory": "L5_MC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L5_MC_42542e071a", + "morphology": "C210301C1_cor_-_Scale_x1.000_y0.975_z1.000.asc" + } + ], + "dNAC": [ + { + "model_directory": "L5_MC_dNAC222_1", + "model_template": "BBP:dNAC222_L5_MC_9935c06ba6", + "morphology": "C040601_-_Scale_x1.000_y0.975_z1.000.asc" + }, + { + "model_directory": "L5_MC_dNAC222_2", + "model_template": "BBP:dNAC222_L5_MC_7eeb7cff0f", + "morphology": "C210301C1_cor.asc" + } + ] + }, + "L5_NBC": { + "bAC": [ + { + "model_directory": "L5_NBC_bAC217_2", + "model_template": "BBP:bAC217_L5_NBC_913c40083e", + "morphology": "C290999C-I4_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L5_NBC_bAC217_1", + "model_template": "BBP:bAC217_L5_NBC_2db880c523", + "morphology": "C080301B1_-_Scale_x1.000_y1.050_z1.000_-_Clone_2.asc" + } + ], + "bIR": [ + { + "model_directory": "L5_NBC_bIR215_2", + "model_template": "BBP:bIR215_L5_NBC_913c40083e", + "morphology": "C290999C-I4_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L5_NBC_bIR215_1", + "model_template": "BBP:bIR215_L5_NBC_809407f588", + "morphology": "C080301B1_-_Scale_x1.000_y1.025_z1.000_-_Clone_1.asc" + } + ], + "bSTUT": [ + { + "model_directory": "L5_NBC_bSTUT213_1", + "model_template": "BBP:bSTUT213_L5_NBC_bb8fc44e15", + "morphology": "C080301B1_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L5_NBC_bSTUT213_2", + "model_template": "BBP:bSTUT213_L5_NBC_650c18e6aa", + "morphology": "C290999C-I4_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + } + ], + "cAC": [ + { + "model_directory": "L5_NBC_cACint209_2", + "model_template": "BBP:cACint209_L5_NBC_3bb78a3daa", + "morphology": "rp110427_C2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L5_NBC_cACint209_1", + "model_template": "BBP:cACint209_L5_NBC_63fe8b2e25", + "morphology": "C080301B1_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + } + ], + "cIR": [ + { + "model_directory": "L5_NBC_cIR216_2", + "model_template": "BBP:cIR216_L5_NBC_650c18e6aa", + "morphology": "C290999C-I4_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L5_NBC_cIR216_1", + "model_template": "BBP:cIR216_L5_NBC_ded84149de", + "morphology": "C080301B1_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + } + ], + "cNAC": [ + { + "model_directory": "L5_NBC_cNAC187_1", + "model_template": "BBP:cNAC187_L5_NBC_ded84149de", + "morphology": "C080301B1_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L5_NBC_cNAC187_2", + "model_template": "BBP:cNAC187_L5_NBC_8d74f99eef", + "morphology": "C290999C-I4_-_Scale_x1.000_y1.050_z1.000_-_Clone_2.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L5_NBC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L5_NBC_adc0ce53be", + "morphology": "C080301B1_-_Scale_x1.000_y0.950_z1.000.asc" + }, + { + "model_directory": "L5_NBC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L5_NBC_031c89778f", + "morphology": "rp110208_L5-2_idA_-_Clone_1.asc" + } + ], + "dSTUT": [ + { + "model_directory": "L5_NBC_dSTUT214_1", + "model_template": "BBP:dSTUT214_L5_NBC_3a23cf60a6", + "morphology": "C080301B1_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L5_NBC_dSTUT214_2", + "model_template": "BBP:dSTUT214_L5_NBC_283ce5d859", + "morphology": "rp110420_C1_idA_-_Scale_x1.000_y1.025_z1.000_-_Clone_1.asc" + } + ] + }, + "L5_NGC": { + "bNAC": [ + { + "model_directory": "L5_NGC_bNAC219_1", + "model_template": "BBP:bNAC219_L5_NGC_6186b7e85e", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_42.asc" + }, + { + "model_directory": "L5_NGC_bNAC219_2", + "model_template": "BBP:bNAC219_L5_NGC_0a55b16adf", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_38.asc" + } + ], + "cAC": [ + { + "model_directory": "L5_NGC_cACint209_1", + "model_template": "BBP:cACint209_L5_NGC_82e62003c9", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_31.asc" + }, + { + "model_directory": "L5_NGC_cACint209_2", + "model_template": "BBP:cACint209_L5_NGC_9ee242e8ff", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_6.asc" + } + ], + "cNAC": [ + { + "model_directory": "L5_NGC_cNAC187_1", + "model_template": "BBP:cNAC187_L5_NGC_a85710f771", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y1.050_z1.000_-_Clone_16.asc" + }, + { + "model_directory": "L5_NGC_cNAC187_2", + "model_template": "BBP:cNAC187_L5_NGC_e39fbbf8e7", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_15.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L5_NGC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L5_NGC_d5718b222e", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_7.asc" + }, + { + "model_directory": "L5_NGC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L5_NGC_de4f4a2b62", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.975_z1.000_-_Clone_22.asc" + } + ] + }, + "L5_SBC": { + "bNAC": [ + { + "model_directory": "L5_SBC_bNAC219_1", + "model_template": "BBP:bNAC219_L5_SBC_77ab259b7f", + "morphology": "og061106a1_idA_-_Scale_x1.000_y1.050_z1.000_-_Clone_5.asc" + }, + { + "model_directory": "L5_SBC_bNAC219_2", + "model_template": "BBP:bNAC219_L5_SBC_80f2f8b43e", + "morphology": "rp110107_L5-1_idB_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + } + ], + "cAC": [ + { + "model_directory": "L5_SBC_cACint209_2", + "model_template": "BBP:cACint209_L5_SBC_3ba116236f", + "morphology": "rp110107_L5-1_idB_-_Scale_x1.000_y0.975_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L5_SBC_cACint209_1", + "model_template": "BBP:cACint209_L5_SBC_61a753bff1", + "morphology": "og061106a1_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + } + ], + "dNAC": [ + { + "model_directory": "L5_SBC_dNAC222_2", + "model_template": "BBP:dNAC222_L5_SBC_365080b27f", + "morphology": "rp110110_L5-3_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_9.asc" + }, + { + "model_directory": "L5_SBC_dNAC222_1", + "model_template": "BBP:dNAC222_L5_SBC_513d1f1596", + "morphology": "og061106a1_idA_-_Scale_x1.000_y1.025_z1.000_-_Clone_3.asc" + } + ] + }, + "L5_STPC": { + "cADpyr": [ + { + "model_directory": "L5_STPC_cADpyr232_2", + "model_template": "BBP:cADpyr232_L5_STPC_d63221b7a8", + "morphology": "dend-Fluo18_upper_axon-Fluo2_left_-_Clone_14.asc" + }, + { + "model_directory": "L5_STPC_cADpyr232_1", + "model_template": "BBP:cADpyr232_L5_STPC_d16b0be14e", + "morphology": "dend-C231296A-P3_axon-C231296A-P3_-_Clone_9.asc" + } + ] + }, + "L5_TTPC1": { + "cADpyr": [ + { + "model_directory": "L5_TTPC1_cADpyr232_1", + "model_template": "BBP:cADpyr232_L5_TTPC1_0fb1ca4724", + "morphology": "dend-C060114A2_axon-C060114A5.asc" + }, + { + "model_directory": "L5_TTPC1_cADpyr232_2", + "model_template": "BBP:cADpyr232_L5_TTPC1_fc944c2cf3", + "morphology": "dend-C060114A2_axon-C060109A2.asc" + } + ] + }, + "L5_TTPC2": { + "cADpyr": [ + { + "model_directory": "L5_TTPC2_cADpyr232_2", + "model_template": "BBP:cADpyr232_L5_TTPC2_a28017c6c7", + "morphology": "dend-C060114A4_axon-C080501B2.asc" + }, + { + "model_directory": "L5_TTPC2_cADpyr232_1", + "model_template": "BBP:cADpyr232_L5_TTPC2_8052133265", + "morphology": "dend-C060114A7_axon-C060116A3_-_Clone_2.asc" + } + ] + }, + "L5_UTPC": { + "cADpyr": [ + { + "model_directory": "L5_UTPC_cADpyr232_2", + "model_template": "BBP:cADpyr232_L5_UTPC_34f655e7f8", + "morphology": "dend-Fluo15_left_axon-Fluo15_right_-_Scale_x1.000_y0.975_z1.000_-_Clone_9.asc" + }, + { + "model_directory": "L5_UTPC_cADpyr232_1", + "model_template": "BBP:cADpyr232_L5_UTPC_5e3840b51e", + "morphology": "dend-Fluo15_left_axon-Fluo15_left_-_Scale_x1.000_y0.950_z1.000_-_Clone_30.asc" + } + ] + }, + "L6_BP": { + "bAC": [ + { + "model_directory": "L6_BP_bAC217_1", + "model_template": "BBP:bAC217_L6_BP_b41e8e0c23", + "morphology": "C240300C1_-_Scale_x1.000_y1.025_z1.000_-_Clone_19.asc" + }, + { + "model_directory": "L6_BP_bAC217_2", + "model_template": "BBP:bAC217_L6_BP_f920d1af2c", + "morphology": "C240300C1_-_Clone_58.asc" + } + ], + "bIR": [ + { + "model_directory": "L6_BP_bIR215_2", + "model_template": "BBP:bIR215_L6_BP_de7da8c370", + "morphology": "C240300C1_-_Scale_x1.000_y0.950_z1.000_-_Clone_12.asc" + }, + { + "model_directory": "L6_BP_bIR215_1", + "model_template": "BBP:bIR215_L6_BP_5e5c39b863", + "morphology": "C240300C1_-_Scale_x1.000_y0.950_z1.000_-_Clone_23.asc" + } + ], + "bNAC": [ + { + "model_directory": "L6_BP_bNAC219_2", + "model_template": "BBP:bNAC219_L6_BP_6f14cec977", + "morphology": "C240300C1_-_Clone_52.asc" + }, + { + "model_directory": "L6_BP_bNAC219_1", + "model_template": "BBP:bNAC219_L6_BP_94e814803e", + "morphology": "C240300C1_-_Scale_x1.000_y0.950_z1.000_-_Clone_15.asc" + } + ], + "cAC": [ + { + "model_directory": "L6_BP_cACint209_1", + "model_template": "BBP:cACint209_L6_BP_ce89d46a17", + "morphology": "C240300C1_-_Scale_x1.000_y1.050_z1.000_-_Clone_36.asc" + }, + { + "model_directory": "L6_BP_cACint209_2", + "model_template": "BBP:cACint209_L6_BP_a6fb2fe3a5", + "morphology": "C240300C1_-_Clone_31.asc" + } + ], + "cNAC": [ + { + "model_directory": "L6_BP_cNAC187_2", + "model_template": "BBP:cNAC187_L6_BP_46b0f41def", + "morphology": "C240300C1_-_Clone_30.asc" + }, + { + "model_directory": "L6_BP_cNAC187_1", + "model_template": "BBP:cNAC187_L6_BP_b022a66bd2", + "morphology": "C240300C1_-_Clone_15.asc" + } + ], + "dSTUT": [ + { + "model_directory": "L6_BP_dSTUT214_2", + "model_template": "BBP:dSTUT214_L6_BP_b9592b27fd", + "morphology": "C240300C1_-_Clone_57.asc" + }, + { + "model_directory": "L6_BP_dSTUT214_1", + "model_template": "BBP:dSTUT214_L6_BP_be00ceca27", + "morphology": "C240300C1_-_Scale_x1.000_y1.050_z1.000_-_Clone_12.asc" + } + ] + }, + "L6_BPC": { + "cADpyr": [ + { + "model_directory": "L6_BPC_cADpyr231_2", + "model_template": "BBP:cADpyr231_L6_BPC_4e9a9465d3", + "morphology": "dend-tkb060329a1_ch4_cl_o_db_60x_1_axon-Fluo42_right_-_Clone_0.asc" + }, + { + "model_directory": "L6_BPC_cADpyr231_1", + "model_template": "BBP:cADpyr231_L6_BPC_05f7073f5f", + "morphology": "dend-tkb061006a2_ch0_cl_h_zk_60x_0_axon-tkb060329a1_ch4_cl_o_db_60x_1.asc" + } + ] + }, + "L6_BTC": { + "bAC": [ + { + "model_directory": "L6_BTC_bAC217_2", + "model_template": "BBP:bAC217_L6_BTC_459ef88946", + "morphology": "og060523b1-2_idD_-_Scale_x1.000_y0.975_z1.000_-_Clone_11.asc" + }, + { + "model_directory": "L6_BTC_bAC217_1", + "model_template": "BBP:bAC217_L6_BTC_9e335e53f6", + "morphology": "og060523b1-2_idD_-_Scale_x1.000_y1.050_z1.000_-_Clone_1.asc" + } + ], + "cAC": [ + { + "model_directory": "L6_BTC_cACint209_2", + "model_template": "BBP:cACint209_L6_BTC_bc69dce0ae", + "morphology": "og060523b1-2_idD_-_Scale_x1.000_y0.950_z1.000_-_Clone_14.asc" + }, + { + "model_directory": "L6_BTC_cACint209_1", + "model_template": "BBP:cACint209_L6_BTC_045fb87685", + "morphology": "og060523b1-2_idD_-_Scale_x1.000_y0.975_z1.000_-_Clone_12.asc" + } + ], + "cNAC": [ + { + "model_directory": "L6_BTC_cNAC187_2", + "model_template": "BBP:cNAC187_L6_BTC_844c3bba88", + "morphology": "og060523b1-2_idD_-_Scale_x1.000_y0.950_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L6_BTC_cNAC187_1", + "model_template": "BBP:cNAC187_L6_BTC_c021ea90e3", + "morphology": "og060523b1-2_idD_-_Clone_9.asc" + } + ] + }, + "L6_ChC": { + "cAC": [ + { + "model_directory": "L6_ChC_cACint209_1", + "model_template": "BBP:cACint209_L6_ChC_9cc7bcef1d", + "morphology": "C091000D-I3_-_Scale_x1.000_y1.025_z1.000_-_Clone_11.asc" + }, + { + "model_directory": "L6_ChC_cACint209_2", + "model_template": "BBP:cACint209_L6_ChC_9060a4c27e", + "morphology": "mtC070301B_idC_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + } + ], + "cNAC": [ + { + "model_directory": "L6_ChC_cNAC187_1", + "model_template": "BBP:cNAC187_L6_ChC_a3c657441e", + "morphology": "C091000D-I3_-_Clone_3.asc" + }, + { + "model_directory": "L6_ChC_cNAC187_2", + "model_template": "BBP:cNAC187_L6_ChC_b51988187a", + "morphology": "mtC070301B_idC_-_Scale_x1.000_y1.025_z1.000_-_Clone_9.asc" + } + ], + "dNAC": [ + { + "model_directory": "L6_ChC_dNAC222_1", + "model_template": "BBP:dNAC222_L6_ChC_ac94876fe9", + "morphology": "C091000D-I3_-_Scale_x1.000_y0.950_z1.000_-_Clone_4.asc" + }, + { + "model_directory": "L6_ChC_dNAC222_2", + "model_template": "BBP:dNAC222_L6_ChC_9060a4c27e", + "morphology": "mtC070301B_idC_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + } + ] + }, + "L6_DBC": { + "bAC": [ + { + "model_directory": "L6_DBC_bAC217_1", + "model_template": "BBP:bAC217_L6_DBC_2005a958c4", + "morphology": "og060905b1-4_idA_-_Scale_x1.000_y0.950_z1.000.asc" + }, + { + "model_directory": "L6_DBC_bAC217_2", + "model_template": "BBP:bAC217_L6_DBC_3c23ead0b4", + "morphology": "rp100428-12_idC_-_Clone_2.asc" + } + ], + "bIR": [ + { + "model_directory": "L6_DBC_bIR215_2", + "model_template": "BBP:bIR215_L6_DBC_e3438da2c9", + "morphology": "rp100428-12_idC_-_Scale_x1.000_y1.025_z1.000.asc" + }, + { + "model_directory": "L6_DBC_bIR215_1", + "model_template": "BBP:bIR215_L6_DBC_84d9723b18", + "morphology": "og060905b1-4_idA_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + } + ], + "bNAC": [ + { + "model_directory": "L6_DBC_bNAC219_2", + "model_template": "BBP:bNAC219_L6_DBC_b8f064ed89", + "morphology": "rp100428-12_idC_-_Scale_x1.000_y0.950_z1.000.asc" + }, + { + "model_directory": "L6_DBC_bNAC219_1", + "model_template": "BBP:bNAC219_L6_DBC_9daccafbcb", + "morphology": "og060905b1-4_idA_-_Scale_x1.000_y1.025_z1.000.asc" + } + ], + "bSTUT": [ + { + "model_directory": "L6_DBC_bSTUT213_2", + "model_template": "BBP:bSTUT213_L6_DBC_4765d943f4", + "morphology": "rp100428-12_idC_-_Scale_x1.000_y1.025_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L6_DBC_bSTUT213_1", + "model_template": "BBP:bSTUT213_L6_DBC_ed383a5814", + "morphology": "og060905b1-4_idA_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + } + ], + "cAC": [ + { + "model_directory": "L6_DBC_cACint209_2", + "model_template": "BBP:cACint209_L6_DBC_d59edbb45e", + "morphology": "tkb071114a2_ch4_mc_n_db_100x_1_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L6_DBC_cACint209_1", + "model_template": "BBP:cACint209_L6_DBC_e432520e46", + "morphology": "og060905b1-4_idA_-_Clone_0.asc" + } + ], + "cIR": [ + { + "model_directory": "L6_DBC_cIR216_2", + "model_template": "BBP:cIR216_L6_DBC_9e6b867e51", + "morphology": "rp100428-12_idI_-_Scale_x1.000_y1.025_z1.000_-_Clone_3.asc" + }, + { + "model_directory": "L6_DBC_cIR216_1", + "model_template": "BBP:cIR216_L6_DBC_f7446db64e", + "morphology": "og060905b1-4_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_0.asc" + } + ], + "cNAC": [ + { + "model_directory": "L6_DBC_cNAC187_2", + "model_template": "BBP:cNAC187_L6_DBC_2bb1f65738", + "morphology": "rp100428-12_idC_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L6_DBC_cNAC187_1", + "model_template": "BBP:cNAC187_L6_DBC_d59edbb45e", + "morphology": "tkb071114a2_ch4_mc_n_db_100x_1_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + } + ] + }, + "L6_IPC": { + "cADpyr": [ + { + "model_directory": "L6_IPC_cADpyr231_2", + "model_template": "BBP:cADpyr231_L6_IPC_8d0f3a7d2e", + "morphology": "dend-tkb061126a2_ch1_cc1_h_zk_60x_1_axon-tkb060531a2_ch1_cc1_b_yw_60x_1_-_Scale_x1.000_y1.025_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L6_IPC_cADpyr231_1", + "model_template": "BBP:cADpyr231_L6_IPC_c95b8bde99", + "morphology": "dend-tkb060118b1_ch1_cc1_b_yw_60x_1_axon-tkb061213a2_ch1_cc1_h_zk_60x_1_-_Scale_x1.000_y1.025_z1.000_-_Clone_4.asc" + } + ] + }, + "L6_LBC": { + "bAC": [ + { + "model_directory": "L6_LBC_bAC217_2", + "model_template": "BBP:bAC217_L6_LBC_2571ecba02", + "morphology": "og060822a1-2_idB_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L6_LBC_bAC217_1", + "model_template": "BBP:bAC217_L6_LBC_5d73327936", + "morphology": "og060810a8_011807_ch5_BC_o_NR_60x_0_-_Scale_x1.000_y0.975_z1.000_-_Clone_5.asc" + } + ], + "bIR": [ + { + "model_directory": "L6_LBC_bIR215_1", + "model_template": "BBP:bIR215_L6_LBC_f0665c9d1a", + "morphology": "og060810a8_011807_ch5_BC_o_NR_60x_0_-_Scale_x1.000_y1.025_z1.000_-_Clone_3.asc" + }, + { + "model_directory": "L6_LBC_bIR215_2", + "model_template": "BBP:bIR215_L6_LBC_05f55c6541", + "morphology": "og060822a1-2_idB_-_Clone_2.asc" + } + ], + "bNAC": [ + { + "model_directory": "L6_LBC_bNAC219_2", + "model_template": "BBP:bNAC219_L6_LBC_9f176c343a", + "morphology": "og061201a1-8_idE_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L6_LBC_bNAC219_1", + "model_template": "BBP:bNAC219_L6_LBC_0491f28d21", + "morphology": "tkb061101a2_ch2_bc_h_zk_60x_1_-_Scale_x1.000_y1.050_z1.000_-_Clone_6.asc" + } + ], + "bSTUT": [ + { + "model_directory": "L6_LBC_bSTUT213_2", + "model_template": "BBP:bSTUT213_L6_LBC_b4f69c277d", + "morphology": "tkb061020a1_ch5_bc_b_yw_60x_1_-_Scale_x1.000_y0.950_z1.000_-_Clone_4.asc" + }, + { + "model_directory": "L6_LBC_bSTUT213_1", + "model_template": "BBP:bSTUT213_L6_LBC_e36a750de6", + "morphology": "tkb060127a1_ch1_bc_n_mp_100x_1_-_Scale_x1.000_y0.975_z1.000.asc" + } + ], + "cNAC": [ + { + "model_directory": "L6_LBC_cNAC187_2", + "model_template": "BBP:cNAC187_L6_LBC_ae0d738c6e", + "morphology": "og060921a_4_idB.asc" + }, + { + "model_directory": "L6_LBC_cNAC187_1", + "model_template": "BBP:cNAC187_L6_LBC_f9ea5d0925", + "morphology": "og061201a6_ch5_bc_h_zk_60x_1_-_Scale_x1.000_y0.950_z1.000_-_Clone_4.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L6_LBC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L6_LBC_530a402f3f", + "morphology": "tkb061020b1_ch1_bc_b_yw_60x_1_-_Scale_x1.000_y1.050_z1.000_-_Clone_1.asc" + }, + { + "model_directory": "L6_LBC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L6_LBC_040eb0bc59", + "morphology": "og061201a6_ch5_bc_h_zk_60x_1_-_Scale_x1.000_y0.975_z1.000_-_Clone_0.asc" + } + ] + }, + "L6_MC": { + "bAC": [ + { + "model_directory": "L6_MC_bAC217_2", + "model_template": "BBP:bAC217_L6_MC_38015c3bc0", + "morphology": "tkb060509a2_ch3_mc_n_el_100x_1_-_Scale_x1.000_y1.025_z1.000.asc" + }, + { + "model_directory": "L6_MC_bAC217_1", + "model_template": "BBP:bAC217_L6_MC_d379cda689", + "morphology": "tkb060508c1_ch3_mc_n_tb_100x_2.asc" + } + ], + "bIR": [ + { + "model_directory": "L6_MC_bIR215_1", + "model_template": "BBP:bIR215_L6_MC_6ed36072e7", + "morphology": "rp110120_L5-3_idE.asc" + }, + { + "model_directory": "L6_MC_bIR215_2", + "model_template": "BBP:bIR215_L6_MC_d379cda689", + "morphology": "tkb060508c1_ch3_mc_n_tb_100x_2.asc" + } + ], + "bNAC": [ + { + "model_directory": "L6_MC_bNAC219_2", + "model_template": "BBP:bNAC219_L6_MC_d379cda689", + "morphology": "tkb060508c1_ch3_mc_n_tb_100x_2.asc" + }, + { + "model_directory": "L6_MC_bNAC219_1", + "model_template": "BBP:bNAC219_L6_MC_5597e4d536", + "morphology": "tkb071112b1-3_idC.asc" + } + ], + "bSTUT": [ + { + "model_directory": "L6_MC_bSTUT213_2", + "model_template": "BBP:bSTUT213_L6_MC_d379cda689", + "morphology": "tkb060508c1_ch3_mc_n_tb_100x_2.asc" + }, + { + "model_directory": "L6_MC_bSTUT213_1", + "model_template": "BBP:bSTUT213_L6_MC_e8d04feaa6", + "morphology": "og060805a1_ch5_mc_n_nb_100x_1.asc" + } + ], + "cAC": [ + { + "model_directory": "L6_MC_cACint209_1", + "model_template": "BBP:cACint209_L6_MC_0686f3517c", + "morphology": "og060602a2_ch7_mc_n_nb_100x_1_-_Scale_x1.000_y1.025_z1.000.asc" + }, + { + "model_directory": "L6_MC_cACint209_2", + "model_template": "BBP:cACint209_L6_MC_df869132b9", + "morphology": "tkb061101a1_ch6_mc_h_zk_60x_1.asc" + } + ], + "cIR": [ + { + "model_directory": "L6_MC_cIR216_2", + "model_template": "BBP:cIR216_L6_MC_a405be0ec4", + "morphology": "og060602a2_ch7_mc_n_nb_100x_1.asc" + }, + { + "model_directory": "L6_MC_cIR216_1", + "model_template": "BBP:cIR216_L6_MC_dc1f55aab0", + "morphology": "C070301B2.asc" + } + ], + "cNAC": [ + { + "model_directory": "L6_MC_cNAC187_2", + "model_template": "BBP:cNAC187_L6_MC_d379cda689", + "morphology": "tkb060508c1_ch3_mc_n_tb_100x_2.asc" + }, + { + "model_directory": "L6_MC_cNAC187_1", + "model_template": "BBP:cNAC187_L6_MC_5597e4d536", + "morphology": "tkb071112b1-3_idC.asc" + } + ] + }, + "L6_NBC": { + "bAC": [ + { + "model_directory": "L6_NBC_bAC217_1", + "model_template": "BBP:bAC217_L6_NBC_35ea10d24d", + "morphology": "og060829a1-4_idE_-_Scale_x1.000_y1.050_z1.000_-_Clone_3.asc" + }, + { + "model_directory": "L6_NBC_bAC217_2", + "model_template": "BBP:bAC217_L6_NBC_3fc0dff69e", + "morphology": "og060906a1-4_idE_-_Scale_x1.000_y1.050_z1.000.asc" + } + ], + "bIR": [ + { + "model_directory": "L6_NBC_bIR215_1", + "model_template": "BBP:bIR215_L6_NBC_8c6aecf604", + "morphology": "og060829a1-4_idE_-_Scale_x1.000_y1.050_z1.000.asc" + }, + { + "model_directory": "L6_NBC_bIR215_2", + "model_template": "BBP:bIR215_L6_NBC_a104961d30", + "morphology": "tkb060508a2_ch5_bc_h_zk_60x_1_-_Scale_x1.000_y1.025_z1.000_-_Clone_2.asc" + } + ], + "bSTUT": [ + { + "model_directory": "L6_NBC_bSTUT213_1", + "model_template": "BBP:bSTUT213_L6_NBC_91e841ee63", + "morphology": "og060829a1-4_idE_-_Scale_x1.000_y0.950_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L6_NBC_bSTUT213_2", + "model_template": "BBP:bSTUT213_L6_NBC_a3ddbb0af0", + "morphology": "rp110121_L5-2_idF_-_Scale_x1.000_y0.950_z1.000_-_Clone_3.asc" + } + ], + "cAC": [ + { + "model_directory": "L6_NBC_cACint209_1", + "model_template": "BBP:cACint209_L6_NBC_0de57faa51", + "morphology": "og060829a1-4_idE_-_Scale_x1.000_y0.975_z1.000_-_Clone_2.asc" + }, + { + "model_directory": "L6_NBC_cACint209_2", + "model_template": "BBP:cACint209_L6_NBC_a3972c5d97", + "morphology": "og060906a1-4_idE_-_Scale_x1.000_y1.050_z1.000_-_Clone_5.asc" + } + ], + "cIR": [ + { + "model_directory": "L6_NBC_cIR216_2", + "model_template": "BBP:cIR216_L6_NBC_656e1c0a2d", + "morphology": "tkb060508a2_ch5_bc_h_zk_60x_1_-_Scale_x1.000_y1.050_z1.000_-_Clone_0.asc" + }, + { + "model_directory": "L6_NBC_cIR216_1", + "model_template": "BBP:cIR216_L6_NBC_38e0d4fd81", + "morphology": "og060829a1-4_idE_-_Scale_x1.000_y1.025_z1.000_-_Clone_0.asc" + } + ], + "cNAC": [ + { + "model_directory": "L6_NBC_cNAC187_2", + "model_template": "BBP:cNAC187_L6_NBC_96f68bef66", + "morphology": "rp110121_L5-2_idF_-_Scale_x1.000_y0.950_z1.000_-_Clone_6.asc" + }, + { + "model_directory": "L6_NBC_cNAC187_1", + "model_template": "BBP:cNAC187_L6_NBC_777b9bec91", + "morphology": "og060829a1-4_idE_-_Scale_x1.000_y0.950_z1.000.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L6_NBC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L6_NBC_63dc8fdbb5", + "morphology": "rp110120_L5-3_idD_-_Scale_x1.000_y1.025_z1.000_-_Clone_5.asc" + }, + { + "model_directory": "L6_NBC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L6_NBC_55825b9e30", + "morphology": "tkb050507a1_ch1_bc_b_yw_60x_1_-_Clone_6.asc" + } + ], + "dSTUT": [ + { + "model_directory": "L6_NBC_dSTUT214_2", + "model_template": "BBP:dSTUT214_L6_NBC_73114eff1a", + "morphology": "rp110120_L5-3_idD_-_Scale_x1.000_y0.950_z1.000_-_Clone_5.asc" + }, + { + "model_directory": "L6_NBC_dSTUT214_1", + "model_template": "BBP:dSTUT214_L6_NBC_750f7ba17d", + "morphology": "tkb050507a1_ch1_bc_b_yw_60x_1_-_Scale_x1.000_y0.975_z1.000_-_Clone_4.asc" + } + ] + }, + "L6_NGC": { + "bNAC": [ + { + "model_directory": "L6_NGC_bNAC219_2", + "model_template": "BBP:bNAC219_L6_NGC_982f5b1a82", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_37.asc" + }, + { + "model_directory": "L6_NGC_bNAC219_1", + "model_template": "BBP:bNAC219_L6_NGC_72634352c5", + "morphology": "rp110125_L5-2_idA_-_Clone_18.asc" + } + ], + "cAC": [ + { + "model_directory": "L6_NGC_cACint209_2", + "model_template": "BBP:cACint209_L6_NGC_48dc33e388", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.975_z1.000_-_Clone_4.asc" + }, + { + "model_directory": "L6_NGC_cACint209_1", + "model_template": "BBP:cACint209_L6_NGC_913febfa36", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.950_z1.000_-_Clone_40.asc" + } + ], + "cNAC": [ + { + "model_directory": "L6_NGC_cNAC187_1", + "model_template": "BBP:cNAC187_L6_NGC_aa5e388292", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y1.025_z1.000_-_Clone_24.asc" + }, + { + "model_directory": "L6_NGC_cNAC187_2", + "model_template": "BBP:cNAC187_L6_NGC_b77f2e2b21", + "morphology": "rp110125_L5-2_idA_-_Scale_x1.000_y0.975_z1.000_-_Clone_14.asc" + } + ], + "cSTUT": [ + { + "model_directory": "L6_NGC_cSTUT189_2", + "model_template": "BBP:cSTUT189_L6_NGC_a138b95b10", + "morphology": "rp110125_L5-2_idA_-_Clone_19.asc" + }, + { + "model_directory": "L6_NGC_cSTUT189_1", + "model_template": "BBP:cSTUT189_L6_NGC_ed011e4f05", + "morphology": "rp110125_L5-2_idA_-_Clone_34.asc" + } + ] + }, + "L6_SBC": { + "bNAC": [ + { + "model_directory": "L6_SBC_bNAC219_1", + "model_template": "BBP:bNAC219_L6_SBC_6c1acec83a", + "morphology": "rp100428-12_idK_-_Scale_x1.000_y0.975_z1.000_-_Clone_7.asc" + }, + { + "model_directory": "L6_SBC_bNAC219_2", + "model_template": "BBP:bNAC219_L6_SBC_fb9380858b", + "morphology": "rp110120_L5-4_idB_-_Scale_x1.000_y1.050_z1.000.asc" + } + ], + "cAC": [ + { + "model_directory": "L6_SBC_cACint209_2", + "model_template": "BBP:cACint209_L6_SBC_1994e395b2", + "morphology": "rp110125_L5-1_idC_-_Scale_x1.000_y1.025_z1.000_-_Clone_4.asc" + }, + { + "model_directory": "L6_SBC_cACint209_1", + "model_template": "BBP:cACint209_L6_SBC_6c406e9f09", + "morphology": "rp100428-12_idK_-_Scale_x1.000_y0.950_z1.000_-_Clone_2.asc" + } + ], + "dNAC": [ + { + "model_directory": "L6_SBC_dNAC222_2", + "model_template": "BBP:dNAC222_L6_SBC_fb9380858b", + "morphology": "rp110120_L5-4_idB_-_Scale_x1.000_y1.050_z1.000.asc" + }, + { + "model_directory": "L6_SBC_dNAC222_1", + "model_template": "BBP:dNAC222_L6_SBC_846dc20ea0", + "morphology": "rp100428-12_idK_-_Scale_x1.000_y0.975_z1.000_-_Clone_2.asc" + } + ] + }, + "L6_TPC_L1": { + "cADpyr": [ + { + "model_directory": "L6_TPC_L1_cADpyr231_1", + "model_template": "BBP:cADpyr231_L6_TPC_L1_68efb03f39", + "morphology": "dend-C301101A1_axon-tkb070125a3_ch1_cc2_b_hw_60x_1_-_Clone_4.asc" + }, + { + "model_directory": "L6_TPC_L1_cADpyr231_2", + "model_template": "BBP:cADpyr231_L6_TPC_L1_1856ba2db5", + "morphology": "dend-tkb070125a3_ch1_cc2_b_hw_60x_1_axon-tkb060510b1_ch1_cc2_n_db_60x_1_-_Clone_0.asc" + } + ] + }, + "L6_TPC_L4": { + "cADpyr": [ + { + "model_directory": "L6_TPC_L4_cADpyr231_1", + "model_template": "BBP:cADpyr231_L6_TPC_L4_3f1b0bd478", + "morphology": "dend-tkb061126a4_ch0_cc2_h_zk_60x_1_axon-tkb071119a1_ch8_cc2_n_db_100x_1_-_Clone_0.asc" + }, + { + "model_directory": "L6_TPC_L4_cADpyr231_2", + "model_template": "BBP:cADpyr231_L6_TPC_L4_0cb1e9aa6b", + "morphology": "dend-tkb061126a4_ch0_cc2_h_zk_60x_1_axon-tkb061126a4_ch0_cc2_h_zk_60x_1_-_Clone_5.asc" + } + ] + }, + "L6_UTPC": { + "cADpyr": [ + { + "model_directory": "L6_UTPC_cADpyr231_1", + "model_template": "BBP:cADpyr231_L6_UTPC_295f0e6025", + "morphology": "dend-tkb061126a3_ch0_cc2_h_zk_60x_1_axon-Fluo12_right_-_Clone_4.asc" + }, + { + "model_directory": "L6_UTPC_cADpyr231_2", + "model_template": "BBP:cADpyr231_L6_UTPC_15731e5081", + "morphology": "dend-tkb061126a3_ch0_cc2_h_zk_60x_1_axon-tkb061126a3_ch0_cc2_h_zk_60x_1_-_Clone_12.asc" + } + ] + } +} diff --git a/cortical-column/configure.py b/cortical-column/configure.py new file mode 100644 index 0000000..9a87151 --- /dev/null +++ b/cortical-column/configure.py @@ -0,0 +1,190 @@ +import sys +import os +import argparse +import json +try: + from collections.abc import OrderedDict, Mapping +except: + from collections import OrderedDict, Mapping + +import utils +from stimulus import stimulus, save_csv + +""" +1. Take base_config.json, apply defaults in ./host_config.json +and anything specified here + +Use case: append host/jobid to network and output directories +(see run.sh) + +2. Generate spike trains for the stimulus passed in +""" + +def get_cells(args): + cells = args.cells + if cells is not None and 'all' in cells: + return 'all' + if args.cellrange: + cells.extend(range(*args.cellrange)) + cells = sorted(list(set(cells))) + + return cells + + +# def validate(args): +# if args.overwrite: +# for chosen_dir in (args.base_dir, args.network_dir, args.output_dir): +# if os.path.exists(chosen_dir): +# print("directory {} already exists".format(chosen_dir)) +# print("pass --overwrite to continue") +# sys.exit(-1) + +# if args.customkeys or args.customvals: +# if len(args.customkeys) != len(args.customvals): +# print("--customkeys and --customvals must have same length") +# sys.exit(-2) + + +def echo(args): + print("network directory: {}".format(args.network_dir)) + print("output directory: {}".format(args.output_dir)) + if args.cells or args.cellrange: + cells = get_cells(args) + print("{} cells to save: {}".format(len(cells), cells)) + + +def update_two_layers(_dict, updates): + for k, v in updates.items(): + if isinstance(v, Mapping): + _dict[k].update(v) + else: + _dict[k] = v + + +def update_config( + base_config, host_config, **kwargs + # network_dir=None, + # output_dir=None, + # sections=None, + # dt=None, + # tstop=None, + # nsteps_block=None, + # no_ecp=False, +): + config = {} + config.update(base_config) + update_two_layers(config, host_config) + config['__COMMENT__'] = "Auto-generated by configure.py" + + if kwargs.get('network_dir'): + config['manifest']['$NETWORK_DIR'] = kwargs['network_dir'] + if kwargs.get('output_dir'): + config['manifest']['$OUTPUT_DIR'] = kwargs['output_dir'] + + # report_args = ('sections',) + # report_params = {arg: kwargs.get(arg) for arg in report_args if kwargs.get(arg) is not None} + # if kwargs.get('cells') is not None: + # report_params['cells'] = kwargs.get('cells') + # for report in config['reports'].values(): + # report.update(report_params) + + for arg in ('dt', 'tstop', 'nsteps_block', 'optocell'): + if kwargs.get(arg) is not None: + config['run'][arg] = kwargs.get(arg) + + if kwargs.get('no_ecp'): + config['run']['calc_ecp'] = False + + return sorted_keys_first(config, '__COMMENT__', 'manifest') + + +def sorted_keys_first(_dict, *keys_first): + """ + Return copy of `_dict` as an OrderedDict in sorted by key, + but with the given keys first + """ + return OrderedDict( + [(k, _dict[k]) for k in keys_first] + + sorted([x for x in _dict.items() if x[0] not in keys_first]) + ) + + +def generate_spikes(stim, network_dir, output_dir): + for netwk in ('thalamus', 'bkg'): + cells_file = os.path.join(network_dir, '{}_nodes.h5'.format(netwk)) + cell_models_file = os.path.join(network_dir, '{}_node_types.csv'.format(netwk)) + gids = utils.get_gids(cells_file, netwk) + save_csv( + stimulus[stim][netwk], + gids, + os.path.join(network_dir, '{}_spikes.csv'.format(netwk)) + ) + + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--config-outfile', type=str, default='config.json', + help="name of config file this script will output") + parser.add_argument('--base-config', type=str, default='base_config.json', + help="name of file containing base config options") + parser.add_argument('--host-config', type=str, default='host_config.json', + help="name of file containing host-specific config options") + parser.add_argument('--network-dir', '--network', type=str, default='network', + help="network dir the simulation will be configured to use") + parser.add_argument('--output-dir', type=str, default='output', + help="output dir the simulation will be configured to write") + parser.add_argument('--stim', '--stimulus', type=str, default='wn_simulation_v0', + help='named stimulus from mars block directory') # Might want to take in the whole block name, which has the stimulus name within + parser.add_argument('--cells', type=str, nargs='+', default=None, + help="cells to save") + parser.add_argument('--cellrange', type=int, nargs='+', default=None, + help="start end [step] for range of cell ids to save") + # parser.add_argument('--sections', type=str, nargs='+', default=None, + # help="sections to save from each cell (soma, apical, basal, etc.)") + parser.add_argument('--nsteps-block', '--block', '--blocksize', type=int, default=None) + parser.add_argument('--overwrite', action='store_true', default=False, + help="don't complain about overwriting dirs") + parser.add_argument('--dt', '--timestep', type=float, default=None) + parser.add_argument('--tstop', type=float, default=None) + parser.add_argument('--no-ecp', action='store_true', default=None) + parser.add_argument('--optocell', type=str, nargs='+', default=None, + help='[celltype][layer] groups of cells to which opto channels are added') + # parser.add_argument('--customkeys', type=str, nargs='+', default=[], + # help="jsonpath expressions locating items to write. " + + # "To be used with --customvals") + # parser.add_argument('--customvals', type=str, nargs='+', default=[], + # help="values to write. To be used with --customkeys") + args = parser.parse_args() + + echo(args) + + with open(args.base_config) as base_cfg_file: + base_config = json.load(base_cfg_file) + if os.path.exists(args.host_config): + with open(args.host_config) as host_cfg_file: + host_config = json.load(host_cfg_file) + else: + host_config = {} + + cells = get_cells(args) + + newconfig = update_config( + base_config, host_config, cells=cells, + network_dir=args.network_dir, + output_dir=args.output_dir, + # sections=args.sections, + dt=args.dt, + tstop=args.tstop, + nsteps_block=args.nsteps_block, + no_ecp=args.no_ecp, + optocell=args.optocell + ) + + with open(args.config_outfile, 'w') as outf: + json.dump(newconfig, outf, indent=4) + + generate_spikes(args.stim, args.network_dir, args.output_dir) + + + diff --git a/cortical-column/count_layer_segments.py b/cortical-column/count_layer_segments.py new file mode 100644 index 0000000..b5e23a6 --- /dev/null +++ b/cortical-column/count_layer_segments.py @@ -0,0 +1,43 @@ +"""Create an json file listing the number of segments from each layer +in each 100um disk. +""" +from __future__ import print_function +import os +import argparse +import json +from collections import defaultdict + +import h5py + +import utils + +def get_layer_slice_outfile(jobnum): + return os.path.join('runs', jobnum, 'output', 'layer_slice_counts.json') + +def main(jobnum, outfile): + outfile = outfile or get_layer_slice_outfile(jobnum) + print("Counting layer segments in each slice") + coords_dir = os.path.join(utils.get_output_dir(jobnum), 'seg_coords') + layer_slice_counts = {layer: defaultdict(int) for layer in [1, 2, 3, 4, 5, 6]} + # layer_slice_counts['JOBNUM'] = jobnum + for layer, gids in utils.get_layer_gids(jobnum).items(): + for gid in gids: + cellfile = os.path.join(coords_dir, '{}.h5'.format(gid)) + with h5py.File(cellfile, 'r') as coordsfile: + depths = coordsfile['p05'][1, :] + for slice_i in range(-2, 23): + num_in_slice = int(sum( ((2083-depths) // 100) == slice_i )) # cast to int b/c uses np.int64 on Cori, which is not json serializable + layer_slice_counts[layer][slice_i] += num_in_slice + print("Done layer {}".format(layer)) + + with open(outfile, 'w') as outf: + print(json.dumps(layer_slice_counts, sort_keys=True, indent=4), file=outf) + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--jobnum', type=str, required=True, help='slurm number of simulation job') + parser.add_argument('--outfile', type=str, required=False, default=None) + + args = parser.parse_args() + + main(args.jobnum, args.outfile) diff --git a/cortical-column/layers.py b/cortical-column/layers.py new file mode 100644 index 0000000..e82a54b --- /dev/null +++ b/cortical-column/layers.py @@ -0,0 +1,23 @@ +import numpy as np + +# Middle of each layer +layer_depths = { + 1: -82.5, + 2: -239.5, + 3: -490.5, + 4: -762, + 5: -1119.5, + 6: -1732, +} + +layer_thicknesses = { + 1: 165.0, + 2: 149.0, + 3: 353.0, + 4: 190.0, + 5: 525.0, + 6: 700.0, +} + +layer_divs = np.cumsum([-x for x in layer_thicknesses.values()]) +layer_numerals = ['I', 'II', 'III', 'IV', 'V', 'VI'] diff --git a/cortical-column/myplotters.py b/cortical-column/myplotters.py new file mode 100644 index 0000000..b351c7b --- /dev/null +++ b/cortical-column/myplotters.py @@ -0,0 +1,468 @@ +import os +import csv +import json +import itertools +from collections import defaultdict + +import h5py +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.cm as cmx +import matplotlib.colors as colors +import matplotlib.gridspec as gridspec + +import utils + +get_nodes_df = utils.get_nodes_df + +def get_ei_groups(nodes_df, groupkey='layer'): + """ + Return two dicts of layer: dataframe + (one for exc, one for inh) + """ + groupings = nodes_df.groupby(['layer', 'ei']) + igroups = {name[0]: grp for name, grp in groupings if name[1] == 'i'} + egroups = {name[0]: grp for name, grp in groupings if name[1] == 'e'} + + return egroups, igroups + + +def get_ei_cmaps(num_egroups, num_igroups, real=False): + if real: + color_norm_e = colors.Normalize(vmin=0, vmax=num_egroups+1) + scalar_map_e = cmx.ScalarMappable(norm=color_norm_e, cmap='Greys') + cmap_e = [scalar_map_e.to_rgba(i+1) for i in range(0, num_egroups+1)][1:] + + color_norm_i = colors.Normalize(vmin=0, vmax=num_igroups+1) + scalar_map_i = cmx.ScalarMappable(norm=color_norm_i, cmap='Reds') + cmap_i = [scalar_map_i.to_rgba(i+1) for i in range(0, num_igroups+1)][1:] + else: + cmap_e = ['black'] * num_egroups + cmap_i = ['r'] * num_igroups + + return cmap_e, cmap_i + +def get_layer_cmap(nlayers=6): + color_norm = colors.Normalize(vmin=0, vmax=nlayers) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + _colors = [scalar_map.to_rgba(i+1) for i in range(0, nlayers+1)] + + return { + '{}{}'.format(layer, ei): color + for ei, (layer, color) + in itertools.product(['e', 'i'], zip(range(nlayers+1), _colors)) + } + + +def get_cmap(num_egroups=6, num_igroups=6, real=False): + cmap_e, cmap_i = get_ei_cmaps(num_egroups, num_igroups, real=real) + cmap = {} + for idx, layer in enumerate(range(1, 7)): + cmap["{}{}".format(layer, 'i')] = cmap_i[idx] + for idx, layer in enumerate(range(1, 7)): + cmap["{}{}".format(layer, 'e')] = cmap_e[idx] + # point just the layer to the excitatory color + for layer in range(1, 7): + cmap[layer] = cmap['{}e'.format(layer)] + cmap[str(layer)] = cmap[layer] + return cmap + + +def iter_spike_data(cells_file, cell_models_file, spikes_file, population, groupby='layer_ei'): + """ + Return a dict mapping layer or layer_ei to dataframe containing spike times + Also return all spike times as 2nd retval for convenience + """ + nodes_df = get_nodes_df(cells_file, cell_models_file, population=population) + + # TODO: Uses utils.SpikesReader to open + spikes_h5 = h5py.File(spikes_file, 'r') + spike_gids = np.array(spikes_h5['/spikes/gids'], dtype=np.uint) + spike_times = np.array(spikes_h5['/spikes/timestamps'], dtype=np.float) + # spike_times, spike_gids = np.loadtxt(spikes_file, dtype='float32,int', unpack=True) + # spike_gids, spike_times = np.loadtxt(spikes_file, dtype='int,float32', unpack=True) + + egroups, igroups = get_ei_groups(nodes_df, 'layer') + + def insert_layer_ei(df, groups, ei): + for layer, group_df in groups.items(): + indexes = np.in1d(spike_gids, group_df.index) # 'index' within the pandas df = gid + df['{}{}'.format(layer, ei)] = {'gids': spike_gids[indexes], 'spike_times': spike_times[indexes]} + + spike_dfs = {} + insert_layer_ei(spike_dfs, egroups, 'e') + insert_layer_ei(spike_dfs, igroups, 'i') + + if groupby == 'layer': + # combine the e/i data structures + spike_dfs['1e'] = {'gids': [], 'spike_times': []} + spike_dfs = { + layer: { + 'gids': np.concatenate(list( + spike_dfs['{}{}'.format(layer, ei)]['gids'] + for ei in 'ei')), + 'spike_times': np.concatenate(list( + spike_dfs['{}{}'.format(layer, ei)]['spike_times'] + for ei in 'ei')), + } + for layer in [1, 2, 3, 4, 5, 6] + } + + return spike_dfs, spike_times + + +def get_stim_intervals(stim_intervals_file=None): + if stim_intervals_file: + try: + with open(stim_intervals_file, 'r') as infile: + stim_intervals = json.load(infile) + except IOError: + print("Could not find stim intervals file {}".format(stim_intervals_file)) + stim_intervals = [] + except ValueError: + print("Could not decode stim_intervals.json") + stim_intervals = [] + return stim_intervals + return None + +def get_ei_population_axes(ss=None): + """ + Return two axes, one for exc and one for inh + + ss - subplot_spec to put the axes on. If None, creates new top-level subplot/gridspec + """ + if ss is None: + gs = gridspec.GridSpec(2, 1) + else: + gs = gridspec.GridSpecFromSubplotSpec(2, 1, subplot_spec=ss) + + ax_i, ax_e = plt.subplot(gs[0]), plt.subplot(gs[1]) + return ax_e, ax_i + +def get_layer_ei_axes(ss=None): + """ + Return the horizontal (time) axis, and a dict mapping layer/ei to axes + + ss - subplot_spec to put the axes on. If None, creates new top-level subplot/gridspec + """ + if ss is None: + gs = gridspec.GridSpec(11, 1) + else: + gs = gridspec.GridSpecFromSubplotSpec(11, 1, subplot_spec=ss) + + cmap = get_cmap() + + axes = {} + for i, (_, _, layer_ei, _) in enumerate(utils.iter_populations()): + ax = plt.subplot(gs[i]) + ax.axes.get_xaxis().set_visible(False) + ax.text(1.09, 0.5, layer_ei, transform=ax.transAxes, color=cmap[layer_ei]) + axes[layer_ei] = ax + + axes[layer_ei].axes.get_xaxis().set_visible(True) + + return axes + + +def get_raster_axes(plot_mode, raster_ratio): + """ + Return a dict mapping layer/ei to axes, and the two population spike rate axes + """ + top_gs = gridspec.GridSpec(raster_ratio, 1) + raster_ss = top_gs[:raster_ratio-2] + + if plot_mode.lower() in('same_axes',): + ax_e = ax_i = plt.subplot(raster_ss) + raster_axes = {layer_ei: ax_e if ei == 'e' else ax_i for (_, ei, layer_ei, _) in utils.iter_populations()} + elif plot_mode.lower() in ('ei', 'ei_axes',): + ax_e, ax_i = get_ei_population_axes(ss=raster_ss) + raster_axes = {layer_ei: ax_e if ei == 'e' else ax_i for (_, ei, layer_ei, _) in utils.iter_populations()} + elif plot_mode.lower() in ('individual', 'layer',): + raster_axes = get_layer_ei_axes(ss=raster_ss) + else: + raise ValueError("plot_mode must be one of 'individual', 'ei', 'same_axes'") + + for ax in raster_axes.values(): + ax.axes.get_xaxis().set_visible(False) + + ctx_rate_axes = plt.subplot(top_gs[-2]) + ctx_rate_axes.axes.get_xaxis().set_visible(False) + bkg_rate_axes = plt.subplot(top_gs[-1]) + + return raster_axes, ctx_rate_axes, bkg_rate_axes + +def plot_spikes(cells_file, cell_models_file, spikes_file, + stim_intervals_file=None, population=None, + thal_spikes_file=None, bkg_spikes_file=None, + save_as=None, show=True, marker='o', plot_every=None, + plot_depth=False, plot_mode='same_axes', alpha=0.1, tstart=None, + tstop=None, overlay_rate=False): + + plt.figure(figsize=(6.5, 6)) + plt.subplots_adjust(right=0.8) + + axes, ctx_rate_ax, bkg_rate_ax = get_raster_axes(plot_mode=plot_mode, raster_ratio=12 if plot_mode=='individual' else 8) + cmap = get_cmap() + + nodes_df = get_nodes_df(cells_file, cell_models_file, population=population) + spike_dfs, spike_times = iter_spike_data(cells_file, cell_models_file, spikes_file, population) + + for layer_ei, spikedata in spike_dfs.items(): + # if plot_every: + # to_plot = np.random.choice(group_df.index, size=len(group_df)/plot_every) + # else: + # to_plot = group_df.index + ax = axes[layer_ei] + if not plot_depth: + ax.axes.get_yaxis().set_visible(False) + else: + if layer_ei == '6e': # always last plot + ax.axes.set_ylabel('Depth (um)') + + y = nodes_df['depth'][spikedata['gids']] if plot_depth else -np.int32(spikedata['gids']) + ax.scatter(spikedata['spike_times'], y, marker=marker, facecolors=cmap[layer_ei], + label=layer_ei, lw=0, s=5, alpha=alpha) + + + # y = nodes_df['depth'] if plot_depth else -np.int32(spike_gids) + # y = nodes_df['depth'] if plot_depth else -np.arange(len(nodes_df), dtype=np.int32) + # y_min = min(y) + # y_max = max(y) + tstart = tstart or 0 + tstop = tstop or max(spike_times) + + plot_spike_rate(ctx_rate_ax, spike_times, len(nodes_df), tstart, tstop, "Cortex", color='green') + ctx_rate_ax.legend(markerscale=2, scatterpoints=1, loc='center left', + bbox_to_anchor=(1.0, 0.5)) + + if bkg_spikes_file: + bkg_spikes_df = pd.read_csv(bkg_spikes_file, sep=' ') + bkg_spike_times = [ + float(t) for spike_times_str in bkg_spikes_df['spike-times'] + for t in spike_times_str.split(',') + ] + num_bkg_nodes = len(bkg_spikes_df['spike-times']) + plot_spike_rate(bkg_rate_ax, bkg_spike_times, num_bkg_nodes, tstart, tstop, "Bkg") + + if thal_spikes_file: + thal_spikes_df = pd.read_csv(thal_spikes_file, sep=' ') + thal_spike_times = [ + float(t) for spike_times_str in thal_spikes_df['spike-times'] + for t in spike_times_str.split(',') + ] + num_thal_nodes = len(thal_spikes_df['spike-times']) + plot_spike_rate(bkg_rate_ax, thal_spike_times, num_thal_nodes, tstart, tstop, "Thalamus") + + bkg_rate_ax.legend(markerscale=2, scatterpoints=1, loc='center left', + bbox_to_anchor=(1.0, 0.5)) + + for ax in axes.values(): + ax.set_xlim([tstart, tstop]) + + if overlay_rate: + plot_rates(cells_file, cell_models_file, spikes_file, show=False, axes=axes, double_6e=True, tstart=tstart, tstop=tstop) + + if save_as is not None: + plt.savefig(save_as) + + if show: + plt.show() + +def get_spike_rate(spikes, num_nodes, tstart, tstop, binsize=1.0): + # binsize in ms + bins = np.arange(tstart, tstop, binsize) + num_spikes, _ = np.histogram(spikes, bins=bins) + return bins, np.float64(num_spikes)/num_nodes + +def plot_spike_rate(axs, spikes, num_nodes, tstart, tstop, name_for_label, + color=None, binsize=1.0): + bins, p_spike = get_spike_rate(spikes, num_nodes, tstart, tstop, binsize=binsize) + axs.plot(bins[:-1], p_spike, color=color, label=name_for_label) + axs.set_xlabel('time (s)') + axs.set_xlim([tstart, tstop]) + # TODO: Set max appropriately for multi-plots + bin_100ms = int(50. / binsize) + # ignore first 50ms for y range + axs.set_ylim([0, max(p_spike[bin_100ms:]) * 1.1]) + + +def get_random_colors(n): + color_norm = colors.Normalize(vmin=0, vmax=(n-1)) + scalar_map = cmx.ScalarMappable(norm=color_norm, cmap='hsv') + return [scalar_map.to_rgba(i) for i in range(0, n)] + + +def plot_traces(datakey, cell_vars_h5, cells_file, cell_models_file, + max_per_layer=None, show=True, save_as=None, yticks=None, + stim_intervals_file=None, title=None, tstart=None, tstop=None): + nodes_df = get_nodes_df(cells_file, cell_models_file) + egroups, igroups = get_ei_groups(nodes_df, 'layer') + cmap_e, cmap_i = get_ei_cmaps(len(egroups), len(igroups)) + + data_h5 = h5py.File(cell_vars_h5, 'r') + membrane_trace = data_h5[datakey] + + time_ds = data_h5['/mapping/time'] + tstart = tstart or time_ds[0] + tstop = tstop or time_ds[1] + fs = time_ds[2] + # x_axis = np.linspace(tstart, tstop, fs, endpoint=True) + x_axis = np.arange(time_ds[0], time_ds[1], time_ds[2]) + time_idx = (x_axis >= tstart) & (x_axis < tstop) + + gids_ds = data_h5['/mapping/gids'] + index_ds = data_h5['/mapping/index_pointer'] + index_lookup = {gids_ds[i]: (index_ds[i], index_ds[i+1]) for i in range(len(gids_ds))} + + gs = gridspec.GridSpec(len(igroups) + len(egroups), 1) + + stim_intervals = get_stim_intervals(stim_intervals_file) + + def _plot_traces(cmap, groups, start, ei): + for i, color, (layer, group_df) in zip(range(start, start+len(groups)), cmap, groups.items()): + ax = plt.subplot(gs[i]) + + # Grab some membrane traces + indexes = np.in1d(gids_ds, group_df.index) + num_traces = sum(indexes) + if num_traces == 0: + print("skipping layer {}, no cells saved".format(layer)) + ax.remove() + continue + if max_per_layer and num_traces > max_per_layer: + idx = np.where(indexes == True)[0] + traces = np.random.choice(idx, size=max_per_layer, replace=False) + group_traces = membrane_trace[:, sorted(traces)] + else: + group_traces = membrane_trace[:, indexes] + + if max_per_layer == 1: + colors = [color] * len(group_traces.T) + else: + colors = get_random_colors(max_per_layer) + + for trace, col in zip(group_traces.T, colors): + ax.plot(x_axis[time_idx], trace[time_idx], label=layer, color=col, linewidth=0.75) + + ax.text(1.02, 0.5, "{}{}".format(layer, ei), transform=ax.transAxes, color=color) + + ax.axes.get_xaxis().set_visible(False) + + if yticks is not None: + ax.axes.set_yticks(yticks) + + for s in stim_intervals: + left, right = ax.axes.get_xlim() + bottom, top = ax.axes.get_ylim() + region = (x_axis[time_idx] > s[0]*1000) & (x_axis[time_idx] < s[1]*1000) + ax.fill_between( + x_axis[time_idx], bottom, top, + where=region, + alpha=0.1, + facecolor='blue' + ) + + + plt.gcf().set_size_inches(6.4, 8) + + _plot_traces(cmap_i, igroups, 0, 'i') + _plot_traces(cmap_e, egroups, len(igroups), 'e') + + if title: + plt.gcf().get_axes()[0].set_title(title) + + last_ax = plt.gcf().get_axes()[-1] + last_ax.axes.get_xaxis().set_visible(True) + last_ax.axes.set_xlabel('Time (ms)') + bottom = last_ax.axes.get_ylim()[0] + for s in stim_intervals: + left, right = last_ax.axes.get_xlim() + last_ax.axhline( + y=bottom-3, + xmin=(s[0]*1000-left)/(right-left), + xmax=(s[1]*1000-left)/(right-left), + linewidth=2.0 + ) + + if save_as: + plt.savefig(save_as) + + if show: + plt.show() + +def plot_potentials(cell_vars_h5, cells_file, cell_models_file, **kwargs): + plot_traces('v/data', cell_vars_h5, cells_file, cell_models_file, yticks=np.arange(-75, 25, step=25), title='Membrane Potential', **kwargs) + +def plot_calciums(cell_vars_h5, cells_file, cell_models_file, **kwargs): + plot_traces('cai/data', cell_vars_h5, cells_file, cell_models_file, title='Calcium influx', **kwargs) + +def moving_average(a, n=20): + """ + https://stackoverflow.com/a/14314054 + """ + ret = np.cumsum(a, dtype=float) + ret[n:] = ret[n:] - ret[:-n] + padding = np.zeros(shape=((n)/2,)) + return np.hstack([padding, ret[n - 1:] / n, padding]) + +def plot_rates(cells_file, cell_models_file, spikes_file, show=True, save_as=None, + tstart=None, tstop=None, axes=None, double_6e=False, full_layers=False): + # if axes: + # axes = {k: ax.twinx() for k, ax in axes.items()} + # for ax in axes.values(): + # ax.axes.get_yaxis().set_label_position('right') + # ax.axes.get_yaxis().set_ticks_position('right') + # else: + # axes = get_layer_ei_axes() + plt.figure(figsize=(10, 3)) + axes = defaultdict(plt.gca) + cmap = get_cmap(real=True) + spike_dfs, spike_times = iter_spike_data( + cells_file, cell_models_file, spikes_file, None, + groupby='layer' if full_layers else 'layer_ei' + ) + + tstart = tstart or 0 + tstop = tstop or max(spike_times) + bins = np.arange(tstart, tstop, 1.0) + for popn in sorted(spike_dfs.keys()): + spikedata = spike_dfs[popn] + ax = axes[popn] + avg_spikerate = np.mean(np.vstack( + moving_average( + np.histogram( + spikedata['spike_times'][spikedata['gids'] == gid], + bins + )[0], + n=5 # # bins (ms) to average for each point + ) * 1000 # 1/ms --> 1/s = hz + for gid in set(spikedata['gids']) + ), axis=0) + # DEBUG + offset = len(bins) - len(avg_spikerate) + if offset > 0: + avg_spikerate = np.append(avg_spikerate, [0]*offset) + # END DEBUG + # ignore first 50ms for yrange calculation + ymax = max(max(avg_spikerate[50:]), ax.get_ylim()[1]) + ax.plot(bins, avg_spikerate/max(avg_spikerate), color=cmap[popn], linewidth=1, + # label='23e' if '2' in popn else popn) + label=popn) + if popn == '6e' and double_6e: + ax.plot(avg_spikerate/max(avg_spikerate), color='white', linewidth=0.1) + ax.set_xlim([tstart, tstop]) + ax.set_ylim([0, 1]) + + # axes['6e'].axes.set_ylabel("spike\nrate") + axes['6e'].axes.set_xlabel("time (ms)") + axes['6e'].legend() + plt.tight_layout() + + if save_as: + plt.savefig(save_as) + + if show: + plt.show() + + diff --git a/cortical-column/plot_combined.py b/cortical-column/plot_combined.py new file mode 100644 index 0000000..c6b3d1c --- /dev/null +++ b/cortical-column/plot_combined.py @@ -0,0 +1,489 @@ +""" +Combined figure of spike raster, spike rates, raw ECP, spectrogram, and z-scored power spectrum +""" +import os +import glob +import argparse +import logging as log + +import h5py +from matplotlib import rcParams +rcParams['font.sans-serif'] = ['Arial'] +rcParams['font.family'] = 'sans-serif' +import matplotlib.pyplot as plt +from matplotlib.gridspec import GridSpec +import numpy as np +import pandas as pd +from pynwb import NWBHDF5IO + +import utils +from myplotters import get_cmap + +from spectrogram import Spectrogram, SpectrogramRatio +from power_spectrum import PowerSpectrum, PowerSpectrumRatio +from power_spectrum_expt_avg import plot_expt_avg, plot_expt_avg_ratio +from raw_power_spectrum import RawPowerSpectrum + +plt.rc('axes', labelsize=10) +plt.rc('xtick', labelsize=8) +plt.rc('ytick', labelsize=8) + +# activate latex text rendering +# rc('text', usetex=True) + +# WN: +# TSTART, TSTOP = 2400, 2700 +# TSTIM = 2500 + +# TONE: +# TSTART, TSTOP = 2250, 2400 +# TSTIM = 2300 +TSTART, TSTOP = 2450, 2600 +TSTIM = 2500 +TSTIMS = [i*1000+500 for i in range(1, 60)] +STIM_DUR = 50 + +TYPE = 'zscore' +SPECT_CLS = Spectrogram if TYPE == 'zscore' else SpectrogramRatio +PS_CLS = PowerSpectrum if TYPE == 'zscore' else PowerSpectrumRatio +PS_FCN = plot_expt_avg if TYPE == 'zscore' else plot_expt_avg_ratio + +def iter_spike_data(nodes_df, spikes_file, groupby=('layer', 'ei'), stim_avg=False): + """ + Return a dict mapping layer or layer_ei to a dict containing 'gids' and 'spike_times' + Also return all spike times as 2nd retval for convenience + If stim_avg = True, returns spike times % 1000 ms + """ + # Grab all gid's and spike times + with h5py.File(spikes_file, 'r') as spikes_h5: + spike_gids = np.array(spikes_h5['/spikes/gids'], dtype=np.uint) + spike_times = np.array(spikes_h5['/spikes/timestamps'], dtype=np.float) + + if stim_avg: + # TODO: TEST (this isn't working) + spike_times = spike_times % 1000 + + # Group by layer or layer/ei + groupings = nodes_df.groupby(list(groupby)) + def strify(args): + if type(args) == int: + return str(args) + if len(args) == 1: + return str(args[0]) + else: + return str(args[0]) + args[1] + + grouped = {strify(name): grp for name, grp in groupings} + + # Put the spike times and gid's into a dict + spike_dfs = {} + for groupname, group_df in grouped.items(): + indexes = np.in1d(spike_gids, group_df.index) + spike_dfs[groupname] = {'gids': spike_gids[indexes], 'spike_times': spike_times[indexes]} + + return spike_dfs, spike_times + +def moving_average(a, n=20): + """ + https://stackoverflow.com/a/14314054 + """ + ret = np.cumsum(a, dtype=float) + ret[n:] = ret[n:] - ret[:-n] + padding = np.zeros(shape=((n)//2,)) + return np.hstack([padding, ret[n - 1:] / n, padding]) + + +def get_time_to_first_spike_and_peaks(jobnum, peaks_only=False): + network_dir = utils.get_network_dir(jobnum) + output_dir = utils.get_output_dir(jobnum) + cells_file = os.path.join(network_dir, 'cortical_column_nodes.h5') + cell_models_file = os.path.join(network_dir, 'cortical_column_node_types.csv') + spikes_file = os.path.join(output_dir, 'spikes.h5') + + nodes_df = utils.get_nodes_df(cells_file, cell_models_file) + spike_dfs, spike_times = iter_spike_data(nodes_df, spikes_file, groupby=('layer',)) + all_bins = np.arange(0, 60000, 1.0) + time_to_first_spike = {layer: [] for layer in [1, 2, 3, 4, 5, 6]} + peaks = {layer: [] for layer in [1, 2, 3, 4, 5, 6]} + for layer in [1, 2, 3, 4, 5, 6]: + popn = str(layer) + spikedata = spike_dfs[popn] + + # Compute layer-avg spike rates + avg_spikerate = np.mean(np.vstack( + moving_average( + np.histogram( + spikedata['spike_times'][spikedata['gids'] == gid], + all_bins + )[0], + n=5 # # bins (ms) to average for each point + ) * 1000 # 1/ms --> 1/s = hz + for gid in set(spikedata['gids']) + ), axis=0) + + # Compute times to first spike in each neuron for each stim + gids = spikedata['gids'] + for tstim in TSTIMS: + if not peaks_only: + for gid in np.unique(gids): + this_stim_idx = np.logical_and(spikedata['spike_times'] > tstim, + spikedata['spike_times'] < tstim + STIM_DUR) + this_stim_this_gid_idx = np.logical_and(gids == gid, this_stim_idx) + if np.any(this_stim_this_gid_idx): + first_spike = np.min(spikedata['spike_times'][this_stim_this_gid_idx]) - tstim + # plt.plot(first_spike, layer, color=cmap[popn], marker='.') + time_to_first_spike[layer].append(first_spike) + + # Obtain time to peak rate within layer + peaks[layer].append(np.argmax(avg_spikerate[tstim:tstim+STIM_DUR])) + + return time_to_first_spike, peaks + +def plot_layer_timings(jobnum, ax): + _, peaks = get_time_to_first_spike_and_peaks(jobnum, peaks_only=True) + cmap = get_cmap(real=True) + for layer in [1, 2, 3, 4, 5, 6]: + popn = str(layer) + peak = np.average(peaks[layer]) + std = np.std(peaks[layer]) + ax.errorbar(peak, layer, xerr=std, capsize=3, color=cmap[popn]) + + ax.set_xlabel("Time to peak spike rate (ms)") + ax.set_ylabel("Layer") + ax.set_yticks([1, 2, 3, 4, 5, 6]) + ax.set_yticklabels(['I', 'II', 'III', 'IV', 'V', 'VI']) + + ax.set_xlim([0, 30]) + ax.set_ylim(reversed(ax.get_ylim())) + + +def plot_popn_spike_rate(ax, spikes, num_nodes, label, color): + binsize = 1.0 + bins = np.arange(0, 60000, binsize) + num_spikes, _ = np.histogram(spikes, bins=bins) + p_spike = np.float64(num_spikes) / np.float64(num_nodes) / 60.0 + window_len = 150 + p_spike_trial = np.zeros(shape=(window_len, len(TSTIMS))) + for i, tstim in enumerate(TSTIMS): + tstart = tstim - 50 + p_spike_trial[:, i] = p_spike[tstart:tstart+window_len] + plot_bins = np.arange(-50, 100, 1.0) + avg = np.average(p_spike_trial, axis=-1) + std = np.std(p_spike_trial, axis=-1) + ax.fill_between(plot_bins, avg-std, avg+std, color=color, alpha=0.2) + ax.plot(plot_bins, avg, color=color, label=label) + ax.set_xlim([-50, 100]) + ax.set_ylim([0, max(avg) * 1.1]) + +def plot_ecp(ecp_file, ax): + with NWBHDF5IO(ecp_file, 'r') as io: + nwb = io.read() + dset = nwb.acquisition['Raw'].electrical_series['ECoG'] + rate = dset.rate + window_len_samp = int(.150 * rate) + ecp = np.zeros(shape=(window_len_samp, len(TSTIMS))) + for i, tstim in enumerate(TSTIMS): + tstart = tstim - 50 + istart = int(round(tstart/1000.0*rate)) + ecp[:, i] = dset.data[istart:istart+window_len_samp, 0] + avg = np.average(ecp, axis=-1) + std = np.std(ecp, axis=1) + t = np.linspace(TSTART, TSTOP, len(ecp)) + import ipdb; ipdb.set_trace() + ax.fill_between(t, avg-std, avg+std, color='grey') + ax.plot(t, avg, linewidth=0.5, color='black') + +def plot_spikes(jobnum, raster_ax, ctx_rate_ax, bkg_rate_ax, stim_avg=False): + network_dir = utils.get_network_dir(args.jobnum) + output_dir = utils.get_output_dir(args.jobnum) + cells_file = os.path.join(network_dir, 'cortical_column_nodes.h5') + cell_models_file = os.path.join(network_dir, 'cortical_column_node_types.csv') + thal_spikes_file = os.path.join(network_dir, 'thalamus_spikes.csv') + bkg_spikes_file = os.path.join(network_dir, 'bkg_spikes.csv') + spikes_file = os.path.join(output_dir, 'spikes.h5') + + cmap = get_cmap() + + nodes_df = utils.get_nodes_df(cells_file, cell_models_file, population=None) + spike_dfs, spike_times = iter_spike_data(nodes_df, spikes_file, stim_avg=stim_avg) + + for layer_ei, spikedata in spike_dfs.items(): + spike_idxs = np.logical_and(spikedata['spike_times'] > TSTART, + spikedata['spike_times'] < TSTOP) + depths = nodes_df['depth'][spikedata['gids']][spike_idxs] - 2082 + raster_ax.scatter( + spikedata['spike_times'][spike_idxs], depths, marker='.', facecolors=cmap[layer_ei], + label=layer_ei, lw=0, s=5, alpha=0.1 if stim_avg else 0.3 + ) + ymin, ymax = min(nodes_df['depth']), max(nodes_df['depth']) + raster_ax.set_ylim([ymin-2082, ymax-2082]) + raster_ax.set_xlim([TSTART, TSTOP]) + + log.info("Done w/ raster") + + # PLOT SPIKE RATES + plot_popn_spike_rate(ctx_rate_ax, spike_times, len(nodes_df), "Cortex", "red") + log.info("Done w/ ctx pop'n spike rate") + + bkg_spikes_df = pd.read_csv(bkg_spikes_file, sep=' ') + bkg_spike_times = [ + float(t) for spike_times_str in bkg_spikes_df['spike-times'] + for t in spike_times_str.split(',') + ] + num_bkg_nodes = len(bkg_spikes_df['spike-times']) + plot_popn_spike_rate(bkg_rate_ax, bkg_spike_times, num_bkg_nodes, "Bkg", color='black') + log.info("Done w/ bkg pop'n spike rate") + + thal_spikes_df = pd.read_csv(thal_spikes_file, sep=' ') + thal_spike_times = [ + float(t) for spike_times_str in thal_spikes_df['spike-times'] + for t in spike_times_str.split(',') + ] + num_thal_nodes = len(thal_spikes_df['spike-times']) + plot_popn_spike_rate(bkg_rate_ax, thal_spike_times, num_thal_nodes, "Thalamus", color='red') + log.info("Done w/ thal pop'n spike rate") + + + +def plot_layer_spikerates(jobnum, ax): + network_dir = utils.get_network_dir(args.jobnum) + output_dir = utils.get_output_dir(args.jobnum) + cells_file = os.path.join(network_dir, 'cortical_column_nodes.h5') + cell_models_file = os.path.join(network_dir, 'cortical_column_node_types.csv') + spikes_file = os.path.join(output_dir, 'spikes.h5') + + cmap = get_cmap(real=True) + + nodes_df = utils.get_nodes_df(cells_file, cell_models_file) + spike_dfs, spike_times = iter_spike_data(nodes_df, spikes_file, groupby=('layer',)) + bins = np.arange(TSTART, TSTOP, 1.0) + # for popn in ['1i', '2i', '3i', '4i', '5i', '6i', '2e', '3e', '4e', '5e', '6e']: + for popn, numeral in zip(['1', '2', '3', '4', '5', '6'], ['I', 'II', 'III', 'IV', 'V', 'VI']): + spikedata = spike_dfs[popn] + avg_spikerate = np.mean(np.vstack( + moving_average( + np.histogram( + spikedata['spike_times'][spikedata['gids'] == gid], + bins + )[0], + n=5 # # bins (ms) to average for each point + ) * 1000 # 1/ms --> 1/s = hz + for gid in set(spikedata['gids']) + ), axis=0) + offset = len(bins) - len(avg_spikerate) + if offset > 0: + avg_spikerate = np.append(avg_spikerate, [0]*offset) + max_spikerate = max(avg_spikerate) + ax.plot(bins-TSTIM, avg_spikerate/max_spikerate*100, + color=cmap[popn], label=numeral) + ymax = max(max_spikerate, ax.get_ylim()[1]) + +power_spectrum_rats = ['R32'] # ['R32', 'R18', 'R6', 'R6'] +power_spectrum_blocks = ['R32_B7'] # ['R32_B7', 'R18_B12', 'R6_B10', 'R6_B16'] +def plot_spectrogram_power_spectrum(ecp_file, spect_ax, ps_ax): + # SIM PWR SPECTRUM + ps_plotter = PS_CLS(ecp_file, '', device='ECoG', stim_i='avg', half_width=0.005, + # ps_plotter = PowerSpectrumRatio(ecp_file, '', device='ECoG', stim_i='avg', half_width=0.005, + # nosave=True, color='red', label=r'\textit{In silico}') + nosave=True, color='red', label=r'In silico') + # ps_plotter = RawPowerSpectrum(ecp_file, '', device='ECoG', stim_i='avg', + # nosave=True, color='blue', label='Raw', half_width=.1) + plt.sca(ps_ax) + ps_plotter.set_normalize(True) + bands, _, _ = ps_plotter.plot_one(0) + + # EXPT PWR SPECTRUM + # all_spectra = [] + # for _rat, _block in zip(power_spectrum_rats, power_spectrum_blocks): + # _specfile = '/data/{}/{}_spectra.h5'.format(_rat, _block) + # with h5py.File(_specfile) as infile: + # spectra = infile['power_spectra'][:] + # n_ch = spectra.shape[1] + # for i in range(n_ch): + # spectrum = spectra[i] + # if np.any(spectrum > 3.0): + # # plt.plot(bands, spectrum/max(spectrum), color='k', alpha=0.3, linewidth=0.3) + # all_spectra.append(spectrum) + # avg_spectrum = np.average(np.stack(all_spectra), axis=0) + # std = np.std(np.stack(all_spectra), axis=0) + # plt.plot(bands, avg_spectrum/max(avg_spectrum), color='k', alpha=1, linewidth=2, label='In vivo') + PS_FCN(label='In vivo') + + ps_ax.legend(prop={'style': 'italic', 'size': 'x-small'}) + + + # SPECTROGRAM + PEAK_TIME = float(ps_plotter.max_i)/400.0 + # hw = 1.0/400 # half-width + hw = .005 + spect_plotter = SPECT_CLS(ecp_file, '', device='ECoG', nosave=True, stim_i='avg') + plt.sca(spect_ax) # hack to get my plotter to work on a given axis + spect_plotter.plot_one(0, vmax=10) + spect_ax.plot([PEAK_TIME-hw, PEAK_TIME-hw], spect_ax.get_ylim(), + linestyle='--', linewidth=0.5, color='red') + spect_ax.plot([PEAK_TIME+hw, PEAK_TIME+hw], spect_ax.get_ylim(), + linestyle='--', linewidth=0.5, color='red') + +def find_ecp_file(jobnum): + output_dir = utils.get_output_dir(args.jobnum) + ecp_files = glob.glob(os.path.join(output_dir, 'ecp*.nwb')) + if len(ecp_files) == 0: + raise ValueError('No ECP file found, specify with --ecp-file') + elif len(ecp_files) == 1: + return ecp_files[0] + else: + basic_ecp_files = [x for x in ecp_files if 'layer' not in x] + log.info( + 'Found multiple ECP files: \n{}\n'.format('\n'.join(ecp_files)) + + 'Using {}\n'.format(basic_ecp_files[0]) + + 'To choose another, use --ecp-file' + ) + return basic_ecp_files[0] + + +def make_figure(jobnum, ecp_file, render_file, outfile): + + ecp_file = ecp_file or find_ecp_file(jobnum) + + # Figure and gridspec + plt.figure(figsize=(10, 10)) + gs = GridSpec(100, 105) + + ############### + # FIRST COLUMN + ############### + + # LAYER TIMINGS + TIMING_WD = 15 + TIMING_HSTART = 44 + TIMING_HT = 18 + + timing_ax = plt.subplot(gs[TIMING_HSTART:TIMING_HSTART+TIMING_HT, :TIMING_WD]) + plot_layer_timings(jobnum, timing_ax) + log.info("Done with layer timings") + + ################# + # MIDDLE COLUMN + ################# + + MIDSTART = 28 + + ECP_HT = 10 + ECP_WD = 40 + + ecp_ax = plt.subplot(gs[:ECP_HT, MIDSTART:MIDSTART+ECP_WD]) + plot_ecp(ecp_file, ecp_ax) + ecp_ax.axes.get_xaxis().set_visible(False) + ecp_ax.axes.get_yaxis().set_visible(False) + ecp_ax.axis('off') + + + # SPIKE RASTER + RASTER_HT = 30 + RASTER_WD = ECP_WD + POPN_SPKRT_HT = 6 + + raster_ax = plt.subplot(gs[ECP_HT:ECP_HT+RASTER_HT, MIDSTART:MIDSTART+RASTER_WD]) + raster_ax.axes.set_ylabel('Depth (um)') + raster_ax.axes.get_xaxis().set_visible(False) + ctx_rate_ax = plt.subplot(gs[ECP_HT+RASTER_HT:ECP_HT+RASTER_HT+POPN_SPKRT_HT, MIDSTART:MIDSTART+RASTER_WD]) + ctx_rate_ax.axes.get_xaxis().set_visible(False) + # ctx_rate_ax.set_ylabel('Population\nspike rate') + bkg_rate_ax = plt.subplot(gs[ECP_HT+RASTER_HT+POPN_SPKRT_HT:ECP_HT+RASTER_HT+2*POPN_SPKRT_HT, MIDSTART:MIDSTART+RASTER_WD]) + bkg_rate_ax.axes.get_xaxis().set_visible(False) + # bkg_rate_ax.set_ylabel('Population\nspike rate') + + plot_spikes(jobnum, raster_ax, ctx_rate_ax, bkg_rate_ax) + + ctx_rate_ax.legend(loc='upper right', bbox_to_anchor=(1.0, 1.0), fontsize='x-small') + bkg_rate_ax.legend(loc='upper right', bbox_to_anchor=(1.0, 1.0), fontsize='x-small') + + RASTER_BOTTOM = ECP_HT + RASTER_HT + 2*POPN_SPKRT_HT + + log.info("Done w/ raster + pop'n rate plots") + + + + # LAYER SPIKE RATES + LAYER_SPKRT_HT = 10 + + layer_spkrate_ax = plt.subplot(gs[RASTER_BOTTOM:RASTER_BOTTOM+LAYER_SPKRT_HT, MIDSTART:MIDSTART+RASTER_WD]) + layer_spkrate_ax.set_ylim([0, 115]) + layer_spkrate_ax.set_ylabel('% of max\nspike rate') + layer_spkrate_ax.set_xlim([TSTART-TSTIM, TSTOP-TSTIM]) + layer_spkrate_ax.set_xlabel('Time (ms)') + + plot_layer_spikerates(jobnum, layer_spkrate_ax) + + layer_spkrate_ax.legend(loc='upper right', bbox_to_anchor=(1.0, 1.0), fontsize='xx-small', + ncol=2) + + log.info('Done w/ layer spike rates') + + + ############### + # RIGHT COLUMN + ############### + # TODO: right column as sub-gridspec? + + RIGHTSTART = MIDSTART + RASTER_WD + 10 + + # SPECTROGRAM + SPECT_TOPGAP = ECP_HT + SPECT_WD = 27 # will be square with colorbar + SPECT_HT = 22 + + # Arrow from ECP to spectrogram + ecp_spect_arrow_ax = plt.subplot(gs[:SPECT_TOPGAP, MIDSTART+RASTER_WD:MIDSTART+RASTER_WD+SPECT_WD]) + ecp_spect_arrow_ax.axis('off') + ecp_spect_arrow_ax.set_xlim([0, 1]) + ecp_spect_arrow_ax.set_ylim([0, 1]) + leftright = 0.75 + updown = 0.7 + ecp_spect_arrow_ax.plot([0, leftright], [updown, updown], color='black') + ecp_spect_arrow_ax.arrow(leftright, updown, 0, -updown, # x, y, dx, dy + head_width=0.07, length_includes_head=True, + color='black') + ecp_spect_arrow_ax.text(leftright/2, 0.75, "Freq. Decomp.", + horizontalalignment='center', + verticalalignment='bottom') + + spect_ax = plt.subplot(gs[SPECT_TOPGAP:SPECT_TOPGAP+SPECT_HT, RIGHTSTART:RIGHTSTART+SPECT_WD]) + # SIM/EXP POWER SPECTRUM + PWRSP_TOP = SPECT_TOPGAP + SPECT_HT + 8 + PWRSP_WD = 22 + PWRSP_HT = PWRSP_WD + + pwrsp_ax = plt.subplot(gs[PWRSP_TOP:PWRSP_TOP+PWRSP_HT, RIGHTSTART:RIGHTSTART+PWRSP_WD]) + plot_spectrogram_power_spectrum(ecp_file, spect_ax, pwrsp_ax) + spect_ax.set_xticks([-.05, 0, .05, .10]) + spect_ax.set_xticklabels([-50, 0, 50, 100]) + spect_ax.set_xlabel("Time (ms)") + # pwrsp_ax.set_ylabel("Ratio (norm)") + pwrsp_ax.set_ylabel("Z-score (norm)" if TYPE == 'zscore' else "Ratio (norm)") + pwrsp_ax.set_ylim([0, 1.15]) + + log.info('Done w/ spectrogram+power spectrum') + + + ############### + # Save or show + ############### + if outfile: + plt.savefig(outfile) + else: + plt.show() + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--jobnum', type=str, required=True) + parser.add_argument('--ecp-file', type=str, required=False, default=None) + parser.add_argument('--render-file', type=str, required=False, default='renders/render_100um_10pct_somadot_noshading_excfirst_alpha0.2_0.5.png') + parser.add_argument('--outfile', type=str, required=False, default=None) + parser.add_argument('--debug', action='store_true', required=False, default=False) + args = parser.parse_args() + + log.basicConfig(format='%(asctime)s %(message)s', level=log.DEBUG if args.debug else log.INFO) + + make_figure(args.jobnum, args.ecp_file, args.render_file, args.outfile) diff --git a/cortical-column/run.py b/cortical-column/run.py new file mode 100644 index 0000000..6cad87c --- /dev/null +++ b/cortical-column/run.py @@ -0,0 +1,247 @@ +# -*- coding: utf-8 -*- + +""" +This file was created by + +$ python -m bmtk.utils.sim_setup -n network --membrane_report-vars v --membrane_report-sections soma --run-time 3000.0 bionet + +and renamed from 'run_bionet.py' + +To run w/ the gui: + - Remove the MPI import + - call `h.load_file("nrngui.hoc")` + - os.system("pause)" +""" + +print("starting") +import os, sys +import glob +import h5py +from bmtk.simulator.bionet.io_tools import io +from mpi4py import MPI # needed to load NEURON with parallel +io.log_info("imported MPI") +from neuron import h +io.log_info("imported h from neuron") +import numpy as np +import pandas as pd +from bmtk.simulator import bionet +from bmtk.simulator.bionet.pyfunction_cache import add_cell_model, add_weight_function + +from myplotters import get_spike_rate + +io.log_info("done imports") + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() + +def load_BBP_templates(templates_dir): + morphology_templates = glob.glob(os.path.join(templates_dir, '*/morphology.hoc')) + biophys_templates = glob.glob(os.path.join(templates_dir, '*/biophysics.hoc')) + syn_templates = glob.glob(os.path.join(templates_dir, '*/synapses/synapses.hoc')) + hoc_templates = glob.glob(os.path.join(templates_dir, '*/template.hoc')) + + for i, template in enumerate(morphology_templates + biophys_templates + syn_templates + hoc_templates): + # if 'L5_BP_dSTUT214_5/biophysics.hoc' in template: + # if 'L5_LBC_dNAC222_4/biophysics.hoc' in template: + # if 'morpho' not in template: + # import ipdb; print ipdb.__file__; ipdb.set_trace() + # exit() + try: + h.load_file(template) + # if i == 500: + # break + except RuntimeError: + io.log_info("Tried to redefine template, ignoring") + +def init(): + io.log_info("in init()") + def distributed_weights(edge_props, src_props, trg_props): + distn = edge_props['weight_distribution'] + w0 = edge_props['syn_weight'] + sigma = edge_props['weight_sigma'] + scale = 1.0 + + if distn.lower() in ['const', 'constant', 'delta']: + return w0 + if distn.lower() == 'lognormal': + scale = w0 + w0 = 0 + + distn_fcn = getattr(np.random, distn) + + return scale * distn_fcn(w0, sigma) + + add_weight_function(distributed_weights, 'distributed_weights', overwrite=False) + + io.log_info("leaving init") + +def runtime_init(conf): + io.log_info("in runtime_init()") + h.load_file('import3d.hoc') + load_BBP_templates(conf.templates_dir) + + def BBP(cell, template_name, dynamics_params): + """Load a cell from a BlueBrain template""" + # TODO: uses `conf` from enclosing scope, which is less than ideal + SYNAPSES = 1 + NO_SYNAPSES = 0 + + cwd = os.getcwd() + os.chdir(os.path.join(conf.templates_dir, cell['model_directory'])) + + # io.log_info("loading template_name = {}".format(template_name)) + hobj = getattr(h, template_name)(NO_SYNAPSES) + # io.log_info("finished loading template_name = {}".format(template_name)) + os.chdir(cwd) + return hobj + + add_cell_model(BBP, directive='BBP', model_type='biophysical', overwrite=False) + io.log_info("leaving runtime_init()") + +def save_seg_coords(sim, conf): + gid_list = sim.net.get_local_cells().keys() + io.log_info("Save segment coordinates for cells: {}".format(gid_list)) + outdir = os.path.join(conf.output_dir, conf.output.get('seg_coords_dir', 'seg_coords')) + if rank == 0: + os.mkdir(outdir) + + comm.Barrier() + + for gid, cell in sim.net.get_local_cells().items(): + outfilename = os.path.join(outdir, '{}.h5'.format(gid)) + with h5py.File(outfilename, 'w') as outfile: + coords = cell.get_seg_coords() + outfile.create_dataset('p0', data=coords['p0']) + outfile.create_dataset('p05', data=coords['p05']) + outfile.create_dataset('p1', data=coords['p1']) + + outfile.create_dataset('d0', data=coords['d0']) + outfile.create_dataset('d1', data=coords['d1']) + outfile.create_dataset('ei', data=cell.node['ei']) + outfile.create_dataset('part_ids', data=cell.get_part_ids()) + outfile.create_dataset('m_type', data=cell.node['m_type']) + outfile.create_dataset('e_type', data=cell.node['e_type']) + outfile.create_dataset('layer', data=cell.node['layer']) + outfile.create_dataset('soma_pos', data=cell.soma_position) + +def save_master_file(sim, conf): + pop = sim.net.get_node_population('cortical_column') + num_cells = pop.n_nodes() + masterfilename = os.path.join(conf.output_dir, 'master.h5') + with h5py.File(masterfilename, 'w') as masterfile: + masterfile.create_dataset('neuro-data-format-version', data=0.3) + masterfile.create_dataset('num_cells', data=num_cells) + + # population spikerates + thal_spikes_df = pd.read_csv(conf.inputs['ext_spikes']['input_file'], sep=' ') + thal_spikes = [ + float(t) for spike_times_str in thal_spikes_df['spike-times'] + for t in spike_times_str.split(',') + ] + thal_bins, thal_spikerate = get_spike_rate( + thal_spikes, len(thal_spikes_df), 0, sim.tstop, binsize=1.0) + + bkg_spikes_df = pd.read_csv(conf.inputs['bkg_spikes']['input_file'], sep=' ') + bkg_spikes = [ + float(t) for spike_times_str in thal_spikes_df['spike-times'] + for t in spike_times_str.split(',') + ] + bkg_bins, bkg_spikerate = get_spike_rate( + bkg_spikes, len(bkg_spikes_df), 0, sim.tstop, binsize=1.0) + + assert np.all(bkg_bins == thal_bins) + masterfile.create_dataset('spikerate_bins', data=thal_bins) + masterfile.create_dataset('thal_spikerate', data=thal_spikerate) + masterfile.create_dataset('bkg_spikerate', data=bkg_spikerate) + + + # TODO: check sim._spikes and sim._spikes_table after sim runs for cortical spike data + +def create_graph(config_file): + conf = bionet.Config.from_json(config_file, validate=True) + conf.build_env() + + runtime_init(conf) + + graph = bionet.BioNetwork.from_config(conf) + + return graph, conf + +def create_sim(config_file): + graph, conf = create_graph(config_file) + sim = bionet.BioSimulator.from_config(conf, network=graph) + + return sim, conf + +def intensity(depth): + n = 1.36 + NA = 0.37 + r = 1000 + S = 10.3 + rho = r * ((n/NA)**2 - 1)**(0.5) + I_0 = 1e25 + + return I_0 * (rho**2)/((S + 1)*(depth + rho)**2) + +def run(config_file): + io.log_info("in run") + + sim, conf = create_sim(config_file) + + # Start inserting optogenetic channels + net = sim.net + gids = net.get_local_cells() + for gid in gids: + cell = net.get_cell_gid(gid) + #print('Cell type: ' + str(cell.node['layer']) + str(cell.node['ei'])) + if str(cell.node['layer']) + str(cell.node['ei']) in sim.optocell: + h('objref rho') + secs = cell.get_sections() + seg_depths = cell.get_seg_coords()['p05'][1] # Get the y of the midpoint coordinate of every segment + # Keep track of which sec we're on + curr_sec = secs[0] + num_segs = curr_sec.n3d() + seg_num = 0 + for i in range(len(secs)): + sec = secs[i] + if not sec == curr_sec: + curr_sec = sec + num_segs = curr_sec.n3d() + seg_num = 0 + if num_segs > 0: + sec_id = h.this_section(sec=sec) + h.push_section(sec_id) + offset = 1.0 /(2*num_segs) + seg_loc = float(seg_num) / num_segs + offset + #print('Inserting RhO4 channel at depth ' + str(seg_depths[i]) + ', section ' + str(sec) + ', segment ' + str(seg_num)) + h('rho = new RhO4(' + str(seg_loc) + ', sec=sec)') + light_intensity = intensity(-(seg_depths[i] - 1000)) + h.rho.phiOn = light_intensity + h.pop_section(sec_id) + seg_num += 1 + # End inserting optogenetic channels + io.log_info("created simulation") + + save_seg_coords(sim, conf) + io.log_info("saved segment coordinates") + + if rank == 0: + save_master_file(sim, conf) + io.log_info("saved master file") + + sim.run() + sim.report_load_balance() + + io.log_info("DONE SIMULATION") + + + +if __name__ == '__main__': + init() + + if __file__ != sys.argv[-1]: + run(sys.argv[-1]) + else: + run('config.json') + + bionet.nrn.quit_execution() diff --git a/cortical-column/sbatch.sh b/cortical-column/sbatch.sh new file mode 100644 index 0000000..80287fc --- /dev/null +++ b/cortical-column/sbatch.sh @@ -0,0 +1,98 @@ +#!/bin/bash -l +#SBATCH -q debug +#SBATCH --array 1-1 +#SBATCH -N 32 +#SBATCH -t 0:30:00 +#SBATCH -J cortical-column +#SBATCH -L SCRATCH,project +#SBATCH -C haswell +#SBATCH --mail-user mikelam.us@berkeley.edu +#SBATCH --mail-type BEGIN,END,FAIL +#SBATCH --output "/global/cfs/cdirs/m2043/mikelam/cortical-column/runs/slurm/%A_%a.out" +#SBATCH --error "/global/cfs/cdirs/m2043/mikelam/cortical-column/runs/slurm/%A_%a.err" + +###################### +## SETTINGS AND SHIT +###################### + +# for knl +module unload craype-hugepages2M + + +set -e + +echo +echo "Started at" `date` +echo + +# source /project/projectdirs/m2043/vbaratha/nrn-parallel/parallelnrn.env +cd $CCHOME + + +RUNDIR=$CCDATAROOT/${SLURM_ARRAY_JOB_ID}/${SLURM_ARRAY_TASK_ID} +mkdir -p $RUNDIR +# stripe_large $RUNDIR +lfs setstripe $RUNDIR --stripe-count 150 + +# OpenMP settings +export OMP_NUM_THREADS=1 +export OMP_PLACES=threads +export OMP_PROC_BIND=spread + + +TSTOP=100 + + +#################################### +## CHOOSE A NETWORK CREATION METHOD +#################################### + + +## COPY BBP +# srun --label -n 1 python BBP_build_network.py \ +# --network=$RUNDIR/network \ +# --reduce .1 \ +# --ctx-ctx-weight .6e-4 \ +# --ctx-ctx-weight-std 1e-5 \ +# --thal-ctx-weight 2.0e-4 \ +# --thal-ctx-weight-std 2e-5 \ +# --bkg-weight 2.0e-4 \ +# --num-bkg 5000 \ +# --num-thal 5000 \ +# --circuit-file individuals/pathways_P14-14/pathways_mc0_Column.h5 +# echo "Finished copying BBP network at" `date` + +## REUSE PREVIOUS RUN +RUN=40776658/1 +cp -r $CCDATAROOT/$RUN/network $RUNDIR/network +rm -f $RUNDIR/network/*_spikes.csv # use new spike trains +mkdir $RUNDIR/output +echo "reusing network from $RUN" + + +######################### +## RUN THE SIMULATION +######################### + + +srun -n 1 python configure.py \ + --base-config=base_config_ecp.json \ + --network-dir=$RUNDIR/network \ + --output-dir=$RUNDIR/output \ + --config-outfile=$RUNDIR/config.json \ + --stim wn_simulation_ampl_v1_05 \ + --timestep 0.1 \ + --tstop $TSTOP \ + --cells all \ + --nsteps-block 500 \ + --optocell '5e' + + +srun --label -n $((${SLURM_NNODES}*64)) -c 1 python run.py $RUNDIR/config.json + +#srun python count_layer_segments.py --jobnum ${SLURM_ARRAY_JOB_ID}/${SLURM_ARRAY_TASK_ID} --outfile $RUNDIR/output/layer_slice_counts.json + +echo +echo "Finished at" `date` +echo + diff --git a/cortical-column/stimulus.py b/cortical-column/stimulus.py new file mode 100644 index 0000000..53dd6e4 --- /dev/null +++ b/cortical-column/stimulus.py @@ -0,0 +1,252 @@ +""" +Stores the stimuli used in the simulation. Names should agree with block_directory.py in mars +""" + +import itertools +import csv +from collections import defaultdict + +from scipy.signal import hanning +import numpy as np + +# What this script refers to as "probabilities" or "prob"s seems like it's really spike rates + + +# GENERAL SPIKE-RELATED UTILS + +def spiketimes(probs, tmin=0.0, fs=0.001): + """ + Generate spike times according to Poisson + Put spikes at random position in the timebin they occur + + probs = 1d array whose entries are the probability of an external + cell firing at each timestep + """ + t = np.arange(tmin, len(probs)*fs, fs) + num_spikes = np.random.poisson(lam=probs*fs) + # TODO: this assumes only one spike per timebin + spike_times = t[np.where(num_spikes > 0)] + spike_times += np.random.uniform(high=fs, size=len(spike_times)).astype(np.float16) + spike_times /= fs + + # if no spikes, produce one spike after the simulation ends b/c bmtk chokes on no spikes + return spike_times if len(spike_times) != 0 else [len(t)/fs] + + + +def save_csv(probs, gids, outfile_name): + with open(outfile_name, 'w') as csv_file: + csv_writer = csv.writer(csv_file, delimiter=' ') + csv_writer.writerow(['gid', 'spike-times']) + for gid in gids: + spikes = map(str, spiketimes(probs)) + csv_writer.writerow([gid, ','.join(spikes)]) + + +# UTILS RELATED TO TIMESERIES GENERATION +# These functions return tuples of 1D numpy arrays that can be stitched +# together with the '+' operator + +def hanning_ramped(length, min_rate, max_rate, ramp=15): + h = (max_rate - min_rate) * hanning(2*ramp) + const = np.ones(length - 2*ramp) * (max_rate - min_rate) + return min_rate + np.concatenate([h[:ramp], const, h[ramp:]]) + +def wn_stim(stim_prob, quiet_prob, stim_dur=100, quiet_dur=900): + stim = hanning_ramped(stim_dur, quiet_prob, stim_prob) + quiet = np.ones(quiet_dur)*quiet_prob + return stim, quiet + +def full_wn(stim_prob, quiet_prob, n_stims, intro_len=500, stim_dur=100, quiet_dur=900): + intro = quiet_prob * np.ones(intro_len) + return np.concatenate( + (intro,) + n_stims * wn_stim(stim_prob, quiet_prob, stim_dur=stim_dur, quiet_dur=quiet_dur) + ) + +# I think "length" is milliseconds... sampling freq fs is specified as argument to spiketimes() +def baseline(prob, length): + return prob * np.ones(length) + +# TIMESERIES OF FIRING PROBABILITIES + +stimulus = {} +stimulus['wn_simulation_v0'] = { + 'bkg': full_wn(15.0, 3.0, 4), + 'thalamus': full_wn(15.0, 1.0, 4), +} + +wn_mark_track = np.zeros(shape=(45000,), dtype=np.float32) +wn_mark_track[5000:6000] = 1.0 +wn_mark_track[15000:16000] = 1.0 +wn_mark_track[25000:26000] = 1.0 +wn_mark_track[35000:36000] = 1.0 + +# TODO: When there are different mark tracks, this needs to become a real dict +mark = defaultdict(lambda: wn_mark_track) + +# stimulus['wn_simulation_ampl_v0_0'] = { +# 'bkg': full_wn(5.0, 3.0, 4), +# 'thalamus': full_wn(5.0, 1.0, 4), +# } +# stimulus['wn_simulation_ampl_v0_1'] = { +# 'bkg': full_wn(10.0, 3.0, 4), +# 'thalamus': full_wn(10.0, 1.0, 4), +# } +# stimulus['wn_simulation_ampl_v0_2'] = { +# 'bkg': full_wn(12.5, 3.0, 4), +# 'thalamus': full_wn(12.5, 1.0, 4), +# } +# stimulus['wn_simulation_ampl_v0_3'] = { +# 'bkg': full_wn(15.0, 3.0, 4), +# 'thalamus': full_wn(15.0, 1.0, 4), +# } +# stimulus['wn_simulation_ampl_v0_4'] = { +# 'bkg': full_wn(17.5, 3.0, 4), +# 'thalamus': full_wn(17.5, 1.0, 4), +# } +# stimulus['wn_simulation_ampl_v0_5'] = { +# 'bkg': full_wn(20.0, 3.0, 4), +# 'thalamus': full_wn(20.0, 1.0, 4), +# } + +stimulus['wn_simulation_v1'] = { + 'bkg': baseline(5.0, 10000), + 'thalamus': full_wn(15.0, 1.0, 5), +} + +stimulus['wn_simulation_v2'] = { + 'bkg': baseline(5.0, 60000), + 'thalamus': full_wn(25.0, 1.0, 60), +} + +stimulus['wn_simulation_v3'] = { + 'bkg': baseline(5.0, 60000), + 'thalamus': full_wn(35.0, 1.0, 60), +} + +stimulus['wn_simulation_v4'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(35.0, 1.0, 60), +} + +stimulus['short_wn_simulation_v4'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(35.0, 1.0, 60, stim_dur=50, quiet_dur=950), +} + +stimulus['wn_simulation_v5'] = { + 'bkg': baseline(7.0, 60000), + 'thalamus': full_wn(35.0, 1.0, 60), +} + +stimulus['wn_simulation_v6'] = { + 'bkg': baseline(7.0, 60000), + 'thalamus': full_wn(25.0, 1.0, 60), +} + +stimulus['long_wn_simulation_v6'] = { + 'bkg': baseline(7.0, 60000), + 'thalamus': full_wn(25.0, 1.0, 60, stim_dur=400, quiet_dur=600), +} + +stimulus['long_wn_simulation_v5'] = { + 'bkg': baseline(7.0, 60000), + 'thalamus': full_wn(35.0, 1.0, 60, stim_dur=400, quiet_dur=600), +} + +# Ampl vary v1 +stimulus['wn_simulation_ampl_v1_05'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(5.0, 1.0, 60), +} +stimulus['wn_simulation_ampl_v1_04'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(10.0, 1.0, 60), +} +stimulus['wn_simulation_ampl_v1_03'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(15.0, 1.0, 60), +} +stimulus['wn_simulation_ampl_v1_02'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(20.0, 1.0, 60), +} +stimulus['wn_simulation_ampl_v1_01'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(23.0, 1.0, 60), +} +stimulus['wn_simulation_ampl_v1_0'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(26.0, 1.0, 60), +} +stimulus['wn_simulation_ampl_v1_1'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(29.0, 1.0, 60), +} +stimulus['wn_simulation_ampl_v1_2'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(32.0, 1.0, 60), +} +# stimulus['wn_simulation_ampl_v1_3'] = { # NB don't rly need to run this one b/c already have 60s +# 'bkg': baseline(10.0, 60000), +# 'thalamus': full_wn(35.0, 1.0, 60), +# } +stimulus['wn_simulation_ampl_v1_4'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(38.0, 1.0, 60), +} +stimulus['wn_simulation_ampl_v1_5'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(41.0, 1.0, 60), +} +stimulus['wn_simulation_ampl_v1_6'] = { + 'bkg': baseline(10.0, 60000), + 'thalamus': full_wn(44.0, 1.0, 60), +} + + + + + +if __name__ == '__main__': + NTHAL = 10000 + # save_csv(stimulus['wn_simulation_v3']['bkg'], range(1, 5000), 'test_spikes_bkg.csv') + save_csv(stimulus['wn_simulation_v4']['thalamus'], range(1, NTHAL), 'test_spikes_thal.csv') + import matplotlib.pyplot as plt + import pandas as pd + + # plot the stim + tstart = 1000 + tstop = 2000 + def plot_spike_rate(axs, spikes, num_nodes, name_for_label, color=None, binsize=1.0): + # binsize in ms + bins = np.arange(tstart, tstop, binsize) + num_spikes, _ = np.histogram(spikes, bins=bins) + p_spike = np.float64(num_spikes)/num_nodes + axs.plot(bins[:-1], p_spike, color=color, label=name_for_label) + axs.set_xlabel('time (s)') + axs.set_xlim([tstart, tstop]) + # TODO: Set max appropriately for multi-plots + bin_100ms = int(100. / binsize) + # ignore first 100ms for y range + axs.set_ylim([0, max(p_spike[bin_100ms:]) * 1.1]) + # axs.set_title("{} spike prob. ({}ms bins)".format(name_for_label, int(binsize*1000))) + + plt.figure(figsize=(6, 1)) + bkg_rate_ax = plt.gca() + thal_spikes_df = pd.read_csv('test_spikes_thal.csv', sep=' ') + thal_spike_times = [ + float(t) for spike_times_str in thal_spikes_df['spike-times'] + for t in spike_times_str.split(',') + ] + num_thal_nodes = len(thal_spikes_df['spike-times']) + plot_spike_rate(bkg_rate_ax, thal_spike_times, num_thal_nodes, "Thalamus") + plt.show() + + + # plot the stim on periods and mark track + # plt.plot(stimulus['wn_simulation_v1']['thalamus'], label='stim') + # plt.plot(mark['wn_simulation_v1'], label='mark') + # plt.legend() + # plt.show() + diff --git a/cortical-column/utils.py b/cortical-column/utils.py new file mode 100644 index 0000000..842bb4f --- /dev/null +++ b/cortical-column/utils.py @@ -0,0 +1,232 @@ +import socket +import functools +import os +import copy +from collections import defaultdict + +import h5py +import pandas as pd +import numpy as np + +def iter_populations(): + """ + Yield: + + 1, i, 1i, 1i + 2, i, 2i, 23i + 2, e, 2e, 23e + 3, i, 3i, 23i + 3, e, 3e, 23e + 4, i, 4i, 4i + 4, e, 4e, 4e + 5, i, 5i, 5i + 5, e, 5e, 5e + 6, i, 6i, 6i + 6, e, 6e, 6e + """ + for layer, layername in [(1,'1'), (2,'23'), (3,'23'), + (4,'4'), (5,'5'), (6,'6')]: + yield layer, 'i', '{}{}'.format(layer, 'i'), '{}{}'.format(layername, 'i') + + if layer != 1: + yield layer, 'e', '{}{}'.format(layer, 'e'), '{}{}'.format(layername, 'e') + +EXC_M_TYPES = ('PC', 'SS', 'SP', 'STPC', 'UTPC', 'TTPC1', 'TTPC2', 'TPC_L1', 'UTPC', 'TPC_L4', 'BPC', 'IPC') + +def node_populations_by_name(graph): + """ + Return a dict that maps population names to SonataNodes objects + + graph: bmtk.BioNetwork instance + """ + return {nodepop.name: nodepop for nodepop in graph.node_populations} + +def nodes_by_layer_ei(cortex): + """ + Return a dict that maps layer number + ei to a list of nodes in that layer + eg mapping['4e'] gives a list of layer 4 excitatory cells + + cortex: bmtk SonataNodes object representing the cortical population + """ + mapping = defaultdict(list) + for node in cortex.get_nodes(): + layer_ei = "{}{}".format(node['layer'], node['ei']) + mapping[layer_ei].append(node) + return mapping + +def get_gids(cells_file, population): + cells_h5 = h5py.File(cells_file, 'r') + return cells_h5['/nodes/{}/node_id'.format(population)][:] + +def get_nodes_df(cells_file, cell_models_file, population=None): + cm_df = pd.read_csv(cell_models_file, sep=' ') + cm_df.set_index('node_type_id', inplace=True) + + cells_h5 = h5py.File(cells_file, 'r') + # TODO: Use sonata api + if population is None: + if len(cells_h5['/nodes']) > 1: + raise Exception('Multiple populations in nodes file. Please specify one to plot using population param') + else: + population = list(cells_h5['/nodes'].keys())[0] + + nodes_grp = cells_h5['/nodes'][population] + c_df = pd.DataFrame({'node_id': nodes_grp['node_id'], 'node_type_id': nodes_grp['node_type_id'], 'depth': nodes_grp['0']['positions'][:, 1]}) + # c_df = pd.read_csv(cells_file, sep=' ') + c_df.set_index('node_id', inplace=True) + nodes_df = pd.merge(left=c_df, + right=cm_df, + how='left', + left_on='node_type_id', + right_index=True) # use 'model_id' key to merge, for right table the "model_id" is an index + + return nodes_df + +def get_layer_gids(jobnum, old_dir=False): + """ + Return a dict mapping layer num to a set of gids of all cells in that layer + """ + network_dir = get_network_dir(jobnum, old_dir) + cells_file = os.path.join(network_dir, 'cortical_column_nodes.h5') + cell_models_file = os.path.join(network_dir, 'cortical_column_node_types.csv') + nodes_df = get_nodes_df(cells_file, cell_models_file) + return {name: set(int(gid) for gid in group.index) for name, group in nodes_df.groupby('layer')} + +def get_layer_ei_gids(jobnum, old_dir=False): + """ + Return a dict mapping layer num + e/i to a set of gids of all cells in that layer/ei + """ + network_dir = get_network_dir(jobnum, old_dir) + cells_file = os.path.join(network_dir, 'cortical_column_nodes.h5') + cell_models_file = os.path.join(network_dir, 'cortical_column_node_types.csv') + nodes_df = get_nodes_df(cells_file, cell_models_file) + return {'{}{}'.format(layer, ei): set(int(gid) for gid in group.index) for (layer, ei), group in nodes_df.groupby(['layer', 'ei'])} + +def get_spatial_chunk_gids(jobnum, chunksize, old_dir=False): + """ + Return a dict mapping chunk top edge to list of GIDs in that chunk + """ + network_dir = get_network_dir(jobnum, old_dir) + cells_file = os.path.join(network_dir, 'cortical_column_nodes.h5') + cell_models_file = os.path.join(network_dir, 'cortical_column_node_types.csv') + nodes_df = get_nodes_df(cells_file, cell_models_file) + + _ret = defaultdict(set) + for index, row in nodes_df.iterrows(): + _ret[int(-row['depth']/chunksize)].add(row.name) + + return _ret + +part_ids_enum = {'soma': 0, 'dend': 1, 'apic': 2, 'basal': 3, 'axon': 4} +part_names_by_id = {v:k for k, v in part_ids_enum.items()} + +def spikes_table(config_file=None, spikes_file=None): + #replaces bmtk.analyzer.spikes_table (in __init__) + if config_file: + config = _get_config(config_file) + spikes_file = config['output']['spikes_file'] + elif spikes_file: + spikes_h5 = h5py.File(spikes_file, 'r') + gids = np.array(spikes_h5['/spikes/gids'], dtype=np.uint) + times = np.array(spikes_h5['/spikes/timestamps'], dtype=np.float) + return pd.DataFrame(times, index=gids, columns=['times']) + # return pd.DataFrame(data={'gid': gids, 'spike time (ms)': times}) + else: + raise ValueError("Must pass in either config_file or spikes_file") + +DATAROOT = os.environ.get('CCDATAROOT', './runs') + +def get_rundir(jobnum, old_dir=False): + if jobnum in ('local', 'lcl'): + return '.' + if old_dir: + return os.path.join('runs', jobnum) + else: + return os.path.join(DATAROOT, jobnum) + +def get_network_dir(jobnum, old_dir=False): + if jobnum in ('local', 'lcl'): + return 'network' + return os.path.join(get_rundir(jobnum, old_dir), 'network') + +def get_output_dir(jobnum, old_dir=False): + if jobnum in ('local', 'lcl'): + return 'output' + return os.path.join(get_rundir(jobnum, old_dir), 'output') + +def get_config_file(jobnum, old_dir=False): + return os.path.join(get_rundir(jobnum, old_dir), 'config.json') + +def get_stim_intervals_file(jobnum, old_dir=False): + return os.path.join(get_network_dir(jobnum, old_dir), 'stim_intervals.json') + +# Return a decorator that runs the function only if rank == 0, +# otherwise waits for a broadcast from rank 0 +def broadcast_from_zero(rank, comm, root=0): + def decorator(func): + @functools.wraps(func) + def wrapped(*args, **kwargs): + if comm is None: + return func(*args, **kwargs) + + if rank == 0: + val = func(*args, **kwargs) + else: + val = None + comm.bcast(val, root=root) + return val + return wrapped + return decorator + +def AllGatherv_unknown_shape(data, comm, rank, n_threads, mpi_dtype, axis=1, log=None): + """ + Use MPI to compute shape of result array by asking every thread for their chunk's shape, + then perform the AllGatherv operation (concatenating along the given axis) and return the result. + """ + if log: + log.debug("IN ALLGATHERV") + + if axis != 1: + data = np.swapaxes(data, axis, 1) + + # Require row-major order for concatenation along axis 0 + data = np.require(data, requirements='C') + + dim_1_len = data.shape[1] + + if log: + log.debug(" IN ALLGATHERV data.size = {}".format(data.size)) + + # Gather size of each chunk + sizes = comm.allgather(int(data.size)) + if log: + log.debug(" IN ALLGATHERV sizes = {}".format(sizes)) + offsets = np.zeros(len(sizes), dtype=np.int) + offsets[1:] = np.cumsum(sizes)[:-1] + + comm.Barrier() + + # Create big array + tot_size = sum(sizes) + full_shape = int(tot_size/dim_1_len), dim_1_len + if log: + log.debug(" IN ALLGATHERV full_shape = {}".format(full_shape)) + log.debug(" IN ALLGATHERV data.dtype = {}".format(data.dtype)) + all_data = np.zeros(shape=full_shape, dtype=data.dtype, order='C') + + # Perform AllGatherv + comm.Allgatherv(data, [all_data, sizes, offsets, mpi_dtype]) + + if axis != 1: + all_data = np.swapaxes(all_data, axis, 1) + + return all_data + +def log_spaced_cfs(fmin, fmax, nbin=6): + """ + Center frequencies that are uniform in log space + """ + noct = np.ceil(np.log2(fmax/fmin)) + return fmin * 2**(np.arange(noct*nbin)/nbin) + +wavelet_cfs = log_spaced_cfs(2.6308, 1200.0)